--- krb5-1.4.4.orig/debian/krb5-kdc.dirs +++ krb5-1.4.4/debian/krb5-kdc.dirs @@ -0,0 +1,4 @@ +var/lib/krb5kdc +etc/krb5kdc +usr/share/doc/krb5-kdc/examples +usr/share/krb5-kdc --- krb5-1.4.4.orig/debian/libkadm55.lintian +++ krb5-1.4.4/debian/libkadm55.lintian @@ -0,0 +1 @@ +libkadm55: package-name-doesnt-match-sonames --- krb5-1.4.4.orig/debian/krb5-clients.install +++ krb5-1.4.4/debian/krb5-clients.install @@ -0,0 +1,12 @@ +usr/bin/krb5-ftp +usr/share/man/man1/krb5-ftp.1 +usr/bin/telnet.krb5 +usr/share/man/man1/telnet.krb5.1 +usr/bin/krb5-rsh +usr/share/man/man1/krb5-rsh.1 +usr/bin/krb5-rlogin +usr/share/man/man1/krb5-rlogin.1 +usr/bin/krb5-rcp +usr/share/man/man1/krb5-rcp.1 +usr/bin/v4rcp +usr/share/man/man1/v4rcp.1 --- krb5-1.4.4.orig/debian/krb5-admin-server.links +++ krb5-1.4.4/debian/krb5-admin-server.links @@ -0,0 +1 @@ +usr/share/man/man8/kadmin.8.gz usr/share/man/man8/kadmin.local.8.gz --- krb5-1.4.4.orig/debian/krb5-rsh-server.prerm +++ krb5-1.4.4/debian/krb5-rsh-server.prerm @@ -0,0 +1,9 @@ +#!/bin/sh -e +# $Id: krb5-rsh-server.prerm,v 1.1 2000/10/26 01:31:46 hartmans Exp $ + +# If netbase is not installed, then we don't need to do the remove. +if command -v update-inetd >/dev/null 2>&1; then + update-inetd --disable kshell,eklogin +fi + +#DEBHELPER# --- krb5-1.4.4.orig/debian/krb5-admin-server.templates +++ krb5-1.4.4/debian/krb5-admin-server.templates @@ -0,0 +1,22 @@ +Template: krb5-admin-server/newrealm +Type: note +_Description: Setting up a Kerberos Realm + This package contains the administrative tools necessary to run on the + Kerberos master server. However, installing this package does not + automatically set up a Kerberos realm. Doing so requires entering + passwords and as such is not well-suited for package installation. To + create the realm, run the krb5_newrealm command. You may also wish to read + /usr/share/doc/krb5-kdc/README.KDC and the administration guide found in + the krb5-doc package. + . + Don't forget to set up DNS information so your clients can find your KDC + and admin servers. Doing so is documented in the administration guide. + +Template: krb5-admin-server/kadmind +Type: boolean +Default: true +_Description: Run the Kerberos5 administration daemon (kadmind)? + Kadmind serves requests to add/modify/remove principals in the + Kerberos database. It also must be running for the kpasswd program + to be used to change passwords. Normally, this daemon runs on the + master KDC. --- krb5-1.4.4.orig/debian/krb5-clients.prerm +++ krb5-1.4.4/debian/krb5-clients.prerm @@ -0,0 +1,32 @@ +#!/bin/sh -e + + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see /usr/share/doc/packaging-manual/ + +case "$1" in + remove|upgrade|deconfigure) + update-alternatives --remove telnet /usr/bin/telnet.krb5 + for foo in rsh rlogin rcp ftp ; do + update-alternatives --remove $foo /usr/bin/krb5-$foo + done + ;; + failed-upgrade) + ;; + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# --- krb5-1.4.4.orig/debian/libkrb53.docs +++ krb5-1.4.4/debian/libkrb53.docs @@ -0,0 +1,2 @@ +README +debian/README.Debian --- krb5-1.4.4.orig/debian/krb5-rsh-server.postinst +++ krb5-1.4.4/debian/krb5-rsh-server.postinst @@ -0,0 +1,11 @@ +#!/bin/sh -e +# $Id: krb5-rsh-server.postinst,v 1.1 2000/10/26 01:31:46 hartmans Exp $ + +if [ "$1" = configure ] && [ -z "$2" ]; then + update-inetd --group Kerberos --add 'kshell\t\tstream\ttcp\tnowait\troot\t/usr/sbin/tcpd\t/usr/sbin/kshd -5ec' + update-inetd --group Kerberos --add 'eklogin\t\tstream\ttcp\tnowait\troot\t/usr/sbin/tcpd\t/usr/sbin/klogind -5ec' +else + update-inetd --enable kshell,eklogin +fi + +#DEBHELPER# --- krb5-1.4.4.orig/debian/krb5-kdc.docs +++ krb5-1.4.4/debian/krb5-kdc.docs @@ -0,0 +1,2 @@ +debian/README.KDC +debian/README.Debian --- krb5-1.4.4.orig/debian/krb5-doc.doc-base.krb425 +++ krb5-1.4.4/debian/krb5-doc.doc-base.krb425 @@ -0,0 +1,11 @@ +Document: krb425 +Title: Upgrading to Kerberos V5 from Kerberos V4 +Author: MIT +Abstract: Documents how to upgrade from Kerberos Version 4 to MIT + Kerberos Version 5, including backward compatibility for legacy V4 + clients. +Section: Apps/System + +Format: HTML +Index: /usr/share/doc/krb5-doc/krb425/index.html +Files: /usr/share/doc/krb5-doc/krb425/* --- krb5-1.4.4.orig/debian/krb5-kdc.templates +++ krb5-1.4.4/debian/krb5-kdc.templates @@ -0,0 +1,41 @@ +Template: krb5-kdc/debconf +Type: boolean +Default: true +_Description: Create Kerberos KDC Configuration with debconf? + Many sites will wish to have this script automatically create Kerberos KDC + configuration files in /etc/krb5kdc. By default an example template will + be copied into this directory with local parameters filled in. Some sites + who already have infrastructure to manage their own Kerberos configuration + will wish to disable any automatic configuration changes. + +Template: krb5-kdc/krb4-mode +Type: select +_Choices: disable, full, nopreauth, none +Default: none +_Description: Kerberos4 compatibility mode to use: + By default, Kerberos4 requests are allowed from principals that do not + require preauthentication. This allows Kerberos4 services to exist while + requiring most users to use Kerberos5 clients to get their initial + tickets. These tickets can then be converted to Kerberos4 tickets. + Alternatively, the mode can be set to full, allowing Kerberos4 to get + initial tickets even when preauthentication would normally be required, or + to disable, which will disable all Kerberos4 support. + +Template: krb5-kdc/run-krb524 +Type: boolean +_Description: Run a krb524d? + Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets + for the krb524init program. If you have Kerberos4 enabled at all, then + you probably want to run this program. Especially when Kerberos4 + compatibility is set to nopreauth, krb524d is important if you have any + Kerberos4 services. + +Template: krb5-kdc/purge_data_too +Type: boolean +Default: false +_Description: Should the data be purged as well as the package files? + By default, purging this package will not delete the KDC database in + /var/lib/krb5kdc/principal since this database cannot be recovered once + it is deleted. If you wish to delete your KDC database when this package + is purged, knowing that purging this package will then mean deleting all + of the user accounts and passwords in the KDC, enable this option. --- krb5-1.4.4.orig/debian/patch.krb4_32_64 +++ krb5-1.4.4/debian/patch.krb4_32_64 @@ -0,0 +1,489 @@ +Only in trunk.asedeno/src: configure +diff -wru3 trunk/src/lib/krb4/krb4int.h trunk.asedeno/src/lib/krb4/krb4int.h +--- trunk/src/lib/krb4/krb4int.h 2006-05-26 10:48:06.000000000 -0400 ++++ trunk.asedeno/src/lib/krb4/krb4int.h 2006-06-02 14:59:43.000000000 -0400 +@@ -90,7 +90,9 @@ + char *krb_stime(long *); + + /* tf_util.c */ +-int tf_save_cred(char *, char *, char *, C_Block, int , int, KTEXT, long); ++int tf_save_cred(char *, char *, char *, C_Block, int , int, KTEXT, KRB4_32); ++int KRB5_CALLCONV real_tf_get_cred(CREDENTIALS *c); ++ + + /* unix_glue.c */ + int krb_start_session(char *); +@@ -112,7 +114,7 @@ + void krb4int_et_fini(void); + + int krb4int_save_credentials_addr( +- char *, char *, char *, C_Block, int, int, KTEXT, long, KRB_UINT32); ++ char *, char *, char *, C_Block, int, int, KTEXT, KRB4_32, KRB_UINT32); + + int krb4int_send_to_kdc_addr(KTEXT, KTEXT, char *, + struct sockaddr *, socklen_t *); +diff -wru3 trunk/src/lib/krb4/memcache.c trunk.asedeno/src/lib/krb4/memcache.c +--- trunk/src/lib/krb4/memcache.c 2006-05-26 10:48:06.000000000 -0400 ++++ trunk.asedeno/src/lib/krb4/memcache.c 2006-06-02 14:13:07.000000000 -0400 +@@ -470,7 +470,7 @@ + int lifetime; /* Lifetime */ + int kvno; /* Key version number */ + KTEXT ticket; /* The ticket itself */ +- long issue_date; /* The issue time */ ++ KRB4_32 issue_date; /* The issue time */ + KRB_UINT32 laddr; + { + CREDENTIALS cr; +@@ -500,7 +500,7 @@ + int lifetime, + int kvno, + KTEXT ticket, +- long issue_date) ++ KRB4_32 issue_date) + { + return krb4int_save_credentials_addr(name, inst, realm, session, + lifetime, kvno, ticket, +diff -wru3 trunk/src/lib/krb4/save_creds.c trunk.asedeno/src/lib/krb4/save_creds.c +--- trunk/src/lib/krb4/save_creds.c 2006-05-26 10:48:06.000000000 -0400 ++++ trunk.asedeno/src/lib/krb4/save_creds.c 2006-06-02 14:35:53.000000000 -0400 +@@ -54,7 +54,7 @@ + int lifetime; /* Lifetime */ + int kvno; /* Key version number */ + KTEXT ticket; /* The ticket itself */ +- long issue_date; /* The issue time */ ++ KRB4_32 issue_date; /* The issue time */ + KRB_UINT32 local_addr; + { + int tf_status; /* return values of the tf_util calls */ +@@ -83,5 +83,5 @@ + { + return krb4int_save_credentials_addr(service, instance, realm, + session, lifetime, kvno, +- ticket, issue_date, 0); ++ ticket, (KRB4_32)issue_date, 0); + } +diff -wru3 trunk/src/lib/krb4/tf_util.c trunk.asedeno/src/lib/krb4/tf_util.c +--- trunk/src/lib/krb4/tf_util.c 2006-05-26 10:48:06.000000000 -0400 ++++ trunk.asedeno/src/lib/krb4/tf_util.c 2006-06-02 14:13:07.000000000 -0400 +@@ -28,6 +28,8 @@ + #include "k5-int.h" + #include "krb4int.h" + ++#include "../crypto/aes/aesopt.h" ++ + #include + #include + #include +@@ -43,6 +45,8 @@ + #include + #endif /* TKT_SHMEM */ + ++ ++ + #define TOO_BIG -1 + #define TF_LCK_RETRY ((unsigned)2) /* seconds to sleep before + * retry if ticket file is +@@ -93,6 +97,165 @@ + #endif + #endif + ++ ++#if (PLATFORM_BYTE_ORDER == AES_LITTLE_ENDIAN) ++/* This was taken from jhutz's patch for heimdal krb4. It only ++ * applies to little endian systems. Big endian systems have a ++ * less elegant solution documented below. ++ * ++ * This record is written after every real ticket, to ensure that ++ * both 32- and 64-bit readers will perceive the next real ticket ++ * as starting in the same place. This record looks like a ticket ++ * with the following properties: ++ * Field 32-bit 64-bit ++ * ============ ================= ================= ++ * sname "." "." ++ * sinst "" "" ++ * srealm ".." ".." ++ * session key 002E2E00 xxxxxxxx xxxxxxxx 00000000 ++ * lifetime 0 0 ++ * kvno 0 12 ++ * ticket 12 nulls 4 nulls ++ * issue 0 0 ++ * ++ * Our code always reads and writes the 32-bit format, but knows ++ * to skip 00000000 at the front of a record, and to completely ++ * ignore tickets for the special alignment principal. ++ */ ++static unsigned char align_rec[] = { ++ 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0x00, 0x2e, ++ 0x2e, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, ++ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00 ++}; ++ ++#else /* Big Endian */ ++ ++/* These alignment records are for big endian systems. We need more ++ * of them because the portion of the 64-bit issue_date that overlaps ++ * with the start of a ticket on 32-bit systems contains an unpredictable ++ * number of NULL bytes. Preceeding these records is a second copy of the ++ * 32-bit issue_date. The srealm for the alignment records is always one of ++ * ".." or "?.." ++ */ ++ ++/* No NULL bytes ++ * This is actually two alignment records since both 32- and 64-bit ++ * readers will agree on everything in the first record up through the ++ * issue_date size, except where sname starts. ++ * Field (1) 32-bit 64-bit ++ * ============ ================= ================= ++ * sname "????." "." ++ * sinst "" "" ++ * srealm ".." ".." ++ * session key 00000000 xxxxxxxx 00000000 xxxxxxxx ++ * lifetime 0 0 ++ * kvno 0 0 ++ * ticket 4 nulls 4 nulls ++ * issue 0 0 ++ * ++ * Field (2) 32-bit 64-bit ++ * ============ ================= ================= ++ * sname "." "." ++ * sinst "" "" ++ * srealm ".." ".." ++ * session key 002E2E00 xxxxxxxx xxxxxxxx 00000000 ++ * lifetime 0 0 ++ * kvno 0 12 ++ * ticket 12 nulls 4 nulls ++ * issue 0 0 ++ * ++ */ ++static unsigned char align_rec_0[] = { ++ 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, ++ 0x00, 0x2e, 0x2e, 0x00, 0xff, 0xff, 0xff, 0xff, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00 ++}; ++ ++/* One NULL byte ++ * Field 32-bit 64-bit ++ * ============ ================= ================= ++ * sname "x" |"xx"|"xxx" "." ++ * sinst "xx."|"x."|"." ".." ++ * srealm ".." "..." ++ * session key 2E2E2E00 xxxxxxxx xxxxxxxx 00000000 ++ * lifetime 0 0 ++ * kvno 0 12 ++ * ticket 12 nulls 4 nulls ++ * issue 0 0 ++ */ ++static unsigned char align_rec_1[] = { ++ 0x2e, 0x00, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, ++ 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00 ++}; ++ ++/* Two NULL bytes ++ * Field 32-bit 64-bit ++ * ============ ================= ================= ++ * sname "x" |"x" |"xx" ".." ++ * sinst "" |"x" |"" "" ++ * srealm "x.."|".."|".." ".." ++ * session key 002E2E00 xxxxxxxx xxxxxxxx 00000000 ++ * lifetime 0 0 ++ * kvno 0 12 ++ * ticket 12 nulls 4 nulls ++ * issue 0 0 ++ */ ++ static unsigned char align_rec_2[] = { ++ 0x2e, 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0xff, ++ 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, ++ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++ ++/* Three NULL bytes ++ * Things break here for 32-bit krb4 libraries that don't ++ * understand this alignment record. We can't really do ++ * anything about the fact that the three strings ended ++ * in the duplicate timestamp. The good news is that this ++ * only happens once every 0x1000000 seconds, once roughly ++ * every six and a half months. We'll live. ++ * ++ * Discussion on the krbdev list has suggested the ++ * issue_date be incremented by one in this case to avoid ++ * the problem. I'm leaving this here just in case. ++ * ++ * Field 32-bit 64-bit ++ * ============ ================= ================= ++ * sname "" "." ++ * sinst "" "" ++ * srealm "" ".." ++ * session key 2E00002E 2E00FFFF xxxx0000 0000xxxx ++ * lifetime 0 0 ++ * kvno 4294901760 917504 ++ * ticket 14 nulls 4 nulls ++ * issue 0 0 ++ */ ++/* ++static unsigned char align_rec_3[] = { ++ 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0xff, 0xff, ++ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ++}; ++*/ ++#endif /* (PLATFORM_BYTE_ORDER == AES_LITTLE_ENDIAN) */ ++ + /* + * fd must be initialized to something that won't ever occur as a real + * file descriptor. Since open(2) returns only non-negative numbers as +@@ -136,7 +299,7 @@ + * int lifetime + * int kvno + * KTEXT_ST ticket_st +- * long issue_date ++ * KRB4_32 issue_date + * + * Strings are stored NUL-terminated, and read back until a NUL is + * found or the indicated number of bytes have been read. (So if you +@@ -519,19 +682,43 @@ + * EOF - end of file encountered + */ + +-int KRB5_CALLCONV tf_get_cred(c) ++int KRB5_CALLCONV real_tf_get_cred(c) + CREDENTIALS *c; + { + KTEXT ticket = &c->ticket_st; /* pointer to ticket */ + int k_errno; +- long issue_date; ++ unsigned char nullbuf[3]; /* used for 64-bit issue_date tf compatibility */ + + if (fd < 0) { + if (krb_debug) + fprintf(stderr, "tf_get_cred called before tf_init.\n"); + return TKT_FIL_INI; + } +- if ((k_errno = tf_gets(c->service, SNAME_SZ)) < 2) ++ if ((k_errno = tf_gets(c->service, SNAME_SZ)) < 2) { ++ ++#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) ++ /* If we're big endian then we can have a null service name as part of ++ * an alignment record. */ ++ if (k_errno < 2) ++ switch (k_errno) { ++ case TOO_BIG: ++ tf_close(); ++ return TKT_FIL_FMT; ++ case 0: ++ return EOF; ++ } ++#else /* Little Endian */ ++ /* If we read an empty service name, it's possible that's because ++ * the file was written by someone who thinks issue_date should be ++ * 64 bits. If that is the case, there will be three more zeros, ++ * followed by the real record.*/ ++ ++ if (k_errno == 1 && ++ tf_read(nullbuf, 3) == 3 && ++ !nullbuf[0] && !nullbuf[1] && !nullbuf[2]) ++ k_errno = tf_gets(c->service, SNAME_SZ); ++ ++ if (k_errno < 2) + switch (k_errno) { + case TOO_BIG: + case 1: /* can't be just a null */ +@@ -540,6 +727,9 @@ + case 0: + return EOF; + } ++#endif /*(PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN)*/ ++ ++ } + if ((k_errno = tf_gets(c->instance, INST_SZ)) < 1) + switch (k_errno) { + case TOO_BIG: +@@ -547,7 +737,7 @@ + case 0: + return EOF; + } +- if ((k_errno = tf_gets(c->realm, REALM_SZ)) < 2) ++ if ((k_errno = tf_gets(c->realm, REALM_SZ)) < 2) { + switch (k_errno) { + case TOO_BIG: + case 1: /* can't be just a null */ +@@ -556,6 +746,8 @@ + case 0: + return EOF; + } ++ } ++ + if ( + tf_read((char *) (c->session), KEY_SZ) < 1 || + tf_read((char *) &(c->lifetime), sizeof(c->lifetime)) < 1 || +@@ -565,12 +757,74 @@ + /* don't try to read a silly amount into ticket->dat */ + ticket->length > MAX_KTXT_LEN || + tf_read((char *) (ticket->dat), ticket->length) < 1 || +- tf_read((char *) &(issue_date), sizeof(issue_date)) < 1 ++ tf_read((char *) &(c->issue_date), sizeof(c->issue_date)) < 1 + ) { + tf_close(); + return TKT_FIL_FMT; + } +- c->issue_date = issue_date; ++ ++#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) ++ /* If the issue_date is 0 and we're not dealing with an alignment ++ record, then it's likely we've run into an issue_date written by ++ a 64-bit library that is using long instead of KRB4_32. Let's get ++ the next four bytes instead. ++ */ ++ if (0 == c->issue_date) { ++ int len = strlen(c->realm); ++ if (!(2 == len && 0 == strcmp(c->realm, "..")) && ++ !(3 == len && 0 == strcmp(c->realm + 1, ".."))) { ++ if (tf_read((char *) &(c->issue_date), sizeof(c->issue_date)) < 1) { ++ tf_close(); ++ return TKT_FIL_FMT; ++ } ++ } ++ } ++ ++#endif ++ ++ return KSUCCESS; ++} ++ ++int KRB5_CALLCONV tf_get_cred(c) ++ CREDENTIALS *c; ++{ ++ int k_errno; ++ int fake; ++ ++ do { ++ fake = 0; ++ k_errno = real_tf_get_cred(c); ++ if (k_errno) ++ return k_errno; ++ ++#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) ++ /* Here we're checking to see if the realm is one of the ++ * alignment record realms, ".." or "?..", so we can skip it. ++ * If it's not, then we need to verify that the service name ++ * was not null as this should be a valid ticket. ++ */ ++ { ++ int len = strlen(c->realm); ++ if (2 == len && 0 == strcmp(c->realm, "..")) ++ fake = 1; ++ if (3 == len && 0 == strcmp(c->realm + 1, "..")) ++ fake = 1; ++ if (!fake && 0 == strlen(c->service)) { ++ tf_close(); ++ return TKT_FIL_FMT; ++ } ++ } ++#else /* Little Endian */ ++ /* Here we're checking to see if the service principal is the ++ * special alignment record principal ".@..", so we can skip it. ++ */ ++ if (strcmp(c->service, ".") == 0 && ++ strcmp(c->instance, "") == 0 && ++ strcmp(c->realm, "..") == 0) ++ fake = 1; ++#endif /* (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) */ ++ } while (fake); ++ + #ifdef TKT_SHMEM + memcpy(c->session, tmp_shm_addr, KEY_SZ); + tmp_shm_addr += KEY_SZ; +@@ -711,7 +965,7 @@ + int lifetime; /* Lifetime */ + int kvno; /* Key version number */ + KTEXT ticket; /* The ticket itself */ +- long issue_date; /* The issue time */ ++ KRB4_32 issue_date; /* The issue time */ + { + + off_t lseek(); +@@ -777,9 +1031,65 @@ + if (write(fd, (char *) (ticket->dat), count) != count) + goto bad; + /* Issue date */ +- if (write(fd, (char *) &issue_date, sizeof(long)) +- != sizeof(long)) ++ if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) ++ != sizeof(KRB4_32)) ++ goto bad; ++ /* Alignment Record */ ++#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) ++ { ++ int null_bytes = 0; ++ if (0 == (issue_date & 0xff000000)) ++ ++null_bytes; ++ if (0 == (issue_date & 0x00ff0000)) ++ ++null_bytes; ++ if (0 == (issue_date & 0x0000ff00)) ++ ++null_bytes; ++ if (0 == (issue_date & 0x000000ff)) ++ ++null_bytes; ++ ++ switch(null_bytes) { ++ case 0: ++ /* Issue date */ ++ if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) ++ != sizeof(KRB4_32)) + goto bad; ++ if (write(fd, align_rec_0, sizeof(align_rec_0)) ++ != sizeof(align_rec_0)) ++ goto bad; ++ break; ++ ++ case 1: ++ if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) ++ != sizeof(KRB4_32)) ++ goto bad; ++ if (write(fd, align_rec_1, sizeof(align_rec_1)) ++ != sizeof(align_rec_1)) ++ goto bad; ++ break; ++ ++ case 3: ++ /* Three NULLS are troublesome but rare. We'll just pretend ++ * they don't exist by decrementing the issue_date. ++ */ ++ --issue_date; ++ case 2: ++ if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) ++ != sizeof(KRB4_32)) ++ goto bad; ++ if (write(fd, align_rec_2, sizeof(align_rec_2)) ++ != sizeof(align_rec_2)) ++ goto bad; ++ break; ++ ++ default: ++ goto bad; ++ } ++ ++ } ++#else ++ if (write(fd, align_rec, sizeof(align_rec)) != sizeof(align_rec)) ++ goto bad; ++#endif + + /* Actually, we should check each write for success */ + return (KSUCCESS); --- krb5-1.4.4.orig/debian/krb5-doc.doc-base.admin +++ krb5-1.4.4/debian/krb5-doc.doc-base.admin @@ -0,0 +1,9 @@ +Document: krb5-admin +Title: Kerberos Version 5 Administrator's Guide +Author: MIT +Abstract: Administration guide for MIT Kerberos Version 5. +Section: Apps/System + +Format: HTML +Index: /usr/share/doc/krb5-doc/krb5-admin/index.html +Files: /usr/share/doc/krb5-doc/krb5-admin/* --- krb5-1.4.4.orig/debian/libkrb5-dev.install +++ krb5-1.4.4/debian/libkrb5-dev.install @@ -0,0 +1,5 @@ +usr/lib/lib*.a +usr/lib/lib*.so +usr/include/* +usr/bin/krb5-config +usr/share/man/man1/krb5-config.1 --- krb5-1.4.4.orig/debian/patch.setuid +++ krb5-1.4.4/debian/patch.setuid @@ -0,0 +1,176 @@ +=== src/appl/bsd/krcp.c +================================================================== +--- src/appl/bsd/krcp.c (revision 2463) ++++ src/appl/bsd/krcp.c (local) +@@ -620,7 +620,9 @@ + + euid = geteuid(); + if (euid == 0) { +- (void) setuid(0); ++ if (setuid(0)) { ++ perror("rcp setuid 0"); errs++; exit(errs); ++ } + if(krb5_seteuid(userid)) { + perror("rcp seteuid user"); errs++; exit(errs); + } +@@ -638,11 +640,17 @@ + continue; + rcmd_stream_init_normal(); + #ifdef HAVE_SETREUID +- (void) setreuid(0, userid); ++ if (setreuid(0, userid)) { ++ perror("rcp setreuid 0,user"); errs++; exit(errs); ++ } + sink(1, argv+argc-1); +- (void) setreuid(userid, 0); ++ if (setreuid(userid, 0)) { ++ perror("rcp setreuid user,0"); errs++; exit(errs); ++ } + #else +- (void) setuid(0); ++ if (setuid(0)) { ++ perror("rcp setuid 0"); errs++; exit(errs); ++ } + if(seteuid(userid)) { + perror("rcp seteuid user"); errs++; exit(errs); + } +=== src/appl/bsd/krshd.c +================================================================== +--- src/appl/bsd/krshd.c (revision 2463) ++++ src/appl/bsd/krshd.c (local) +@@ -1379,9 +1379,15 @@ + * If we're on a system which keeps track of login uids, then + * set the login uid. + */ +- setluid((uid_t) pwd->pw_uid); ++ if (setluid((uid_t) pwd->pw_uid) < 0) { ++ perror("setluid"); ++ _exit(1); ++ } + #endif /* HAVE_SETLUID */ +- (void) setuid((uid_t)pwd->pw_uid); ++ if (setuid((uid_t)pwd->pw_uid) < 0) { ++ perror("setuid"); ++ _exit(1); ++ } + /* if TZ is set in the parent, drag it in */ + { + char **findtz = environ; +=== src/appl/bsd/login.c +================================================================== +--- src/appl/bsd/login.c (revision 2463) ++++ src/appl/bsd/login.c (local) +@@ -1648,7 +1648,10 @@ + } + #endif /* HAVE_SETLUID */ + #ifdef _IBMR2 +- setuidx(ID_LOGIN, pwd->pw_uid); ++ if (setuidx(ID_LOGIN, pwd->pw_uid) < 0) { ++ perror("setuidx"); ++ sleepexit(1); ++ }; + #endif + + /* This call MUST succeed */ +=== src/appl/bsd/v4rcp.c +================================================================== +--- src/appl/bsd/v4rcp.c (revision 2463) ++++ src/appl/bsd/v4rcp.c (local) +@@ -436,7 +436,10 @@ + kstream_set_buffer_mode (krem, 0); + #endif /* KERBEROS && !NOENCRYPTION */ + (void) response(); +- (void) setuid(userid); ++ if (setuid(userid)) { ++ error("rcp: can't setuid(user)\n"); ++ exit(1); ++ } + source(--argc, ++argv); + exit(errs); + +@@ -452,7 +455,10 @@ + krem = kstream_create_from_fd (rem, 0, 0); + kstream_set_buffer_mode (krem, 0); + #endif /* KERBEROS && !NOENCRYPTION */ +- (void) setuid(userid); ++ if (setuid(userid)) { ++ error("rcp: can't setuid(user)\n"); ++ exit(1); ++ } + sink(--argc, ++argv); + exit(errs); + +=== src/appl/gssftp/ftpd/ftpd.c +================================================================== +--- src/appl/gssftp/ftpd/ftpd.c (revision 2463) ++++ src/appl/gssftp/ftpd/ftpd.c (local) +@@ -1360,7 +1360,9 @@ + goto bad; + sleep(tries); + } +- (void) krb5_seteuid((uid_t)pw->pw_uid); ++ if (krb5_seteuid((uid_t)pw->pw_uid)) { ++ fatal("seteuid user"); ++ } + #ifdef IP_TOS + #ifdef IPTOS_THROUGHPUT + on = IPTOS_THROUGHPUT; +@@ -1370,7 +1372,9 @@ + #endif + return (fdopen(s, fmode)); + bad: +- (void) krb5_seteuid((uid_t)pw->pw_uid); ++ if (krb5_seteuid((uid_t)pw->pw_uid)) { ++ fatal("seteuid user"); ++ } + (void) close(s); + return (NULL); + } +@@ -2179,7 +2183,9 @@ + (void) krb5_seteuid((uid_t)pw->pw_uid); + goto pasv_error; + } +- (void) krb5_seteuid((uid_t)pw->pw_uid); ++ if (krb5_seteuid((uid_t)pw->pw_uid)) { ++ fatal("seteuid user"); ++ } + len = sizeof(pasv_addr); + if (getsockname(pdata, (struct sockaddr *) &pasv_addr, &len) < 0) + goto pasv_error; +=== src/clients/ksu/main.c +================================================================== +--- src/clients/ksu/main.c (revision 2463) ++++ src/clients/ksu/main.c (local) +@@ -892,8 +892,11 @@ + const char * cc_name; + struct stat st_temp; + +- krb5_seteuid(0); +- krb5_seteuid(target_uid); ++ if (krb5_seteuid(0) < 0 || krb5_seteuid(target_uid) < 0) { ++ com_err(prog_name, errno, ++ "while returning to source uid for destroying ccache"); ++ exit(1); ++ } + + cc_name = krb5_cc_get_name(context, cc); + if ( ! stat(cc_name, &st_temp)){ +=== src/lib/krb4/kuserok.c +================================================================== +--- src/lib/krb4/kuserok.c (revision 2463) ++++ src/lib/krb4/kuserok.c (local) +@@ -159,9 +159,12 @@ + */ + if(getuid() == 0) { + uid_t old_euid = geteuid(); +- seteuid(pwd->pw_uid); ++ if (seteuid(old_euid) < 0) ++ return NOTOK; + fp = fopen(pbuf, "r"); +- seteuid(old_euid); ++ if (seteuid(old_euid) < 0) ++ return NOTOK; ++ + if ((fp) == NULL) { + return(NOTOK); + } --- krb5-1.4.4.orig/debian/krb5-admin-server.postinst +++ krb5-1.4.4/debian/krb5-admin-server.postinst @@ -0,0 +1,28 @@ +#! /bin/sh -e + + + +if [ "configure" = "$1" ] ; then + . /usr/share/debconf/confmodule || exit + db_version 2.0 + + db_get krb5-kdc/debconf + DEBCONF=$RET + + + if [ $DEBCONF = "true" ] ; then + echo \#Automatically generated--do not edit \ + >/etc/default/krb5-admin-server + echo \# Run dpkg-reconfigure krb5-admin-server to change \ + >>/etc/default/krb5-admin-server + db_get krb5-admin-server/kadmind + echo RUN_KADMIND=$RET \ + >>/etc/default/krb5-admin-server + fi + fi + +db_stop + + +#DEBHELPER# + --- krb5-1.4.4.orig/debian/krb5-clients.postinst +++ krb5-1.4.4/debian/krb5-clients.postinst @@ -0,0 +1,39 @@ +#!/bin/sh -e +if [ "configure" = "$1" ] ; then + if [ x$2 != x ] ;then + if dpkg --compare-versions $2 lt 1.2.5-3 ; then + for foo in rlogin rsh ftp; do + dpkg-divert --quiet --package krb5-clients --rename \ + --divert /usr/bin/$foo.nokrb --remove /usr/bin/$foo ||true + dpkg-divert --quiet --package krb5-clients --rename \ + --divert /usr/share/man/man1/$foo.nokrb.1.gz \ + --remove /usr/share/man/man1/$foo.1.gz ||true + done + fi + if dpkg --compare-versions $2 lt 1.2.3-2 ; then + for foo in rcp ; do + dpkg-divert --quiet --package krb5-clients --rename \ + --divert /usr/bin/$foo.nokrb --remove /usr/bin/$foo ||true + dpkg-divert --quiet --package krb5-clients --rename \ + --divert /usr/share/man/man1/$foo.nokrb.1.gz \ + --remove /usr/share/man/man1/$foo.1.gz ||true + done + fi + + fi + + update-alternatives --install /usr/bin/telnet telnet /usr/bin/telnet.krb5 105 \ + --slave /usr/share/man/man1/telnet.1.gz telnet.1.gz /usr/share/man/man1/telnet.krb5.1.gz + for foo in rsh rlogin rcp ftp ; do + update-alternatives --install /usr/bin/$foo $foo /usr/bin/krb5-$foo 105 \ + --slave /usr/share/man/man1/$foo.1.gz $foo.1.gz /usr/share/man/man1/krb5-$foo.1.gz + done + + fi + + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + --- krb5-1.4.4.orig/debian/krb5-doc.info +++ krb5-1.4.4/debian/krb5-doc.info @@ -0,0 +1,4 @@ +build/info/krb425.info +build/info/krb5-admin.info +build/info/krb5-install.info +build/info/krb5-user.info --- krb5-1.4.4.orig/debian/krb5-ftpd.prerm +++ krb5-1.4.4/debian/krb5-ftpd.prerm @@ -0,0 +1,9 @@ +#!/bin/bash -e +# $Id: krb5-ftpd.prerm,v 1.1 2000/10/26 01:31:46 hartmans Exp $ + +# If netbase is not installed, then we don't need to do the remove. +if command -v update-inetd >/dev/null 2>&1; then + update-inetd --disable ftp +fi + +#DEBHELPER# --- krb5-1.4.4.orig/debian/rules +++ krb5-1.4.4/debian/rules @@ -0,0 +1,153 @@ +#!/usr/bin/make -f +# Based on sample debian/rules that uses debhelper. +# GNU copyright 1997 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# This has to be exported to make some magic below work. +export DH_OPTIONS + +CCOPTS=-g -DUSE_PTHREAD_LOCK_ONLY_IF_LOADED +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CCOPTS += -O0 +else + CCOPTS += -O2 +endif + +LINTIAN_PACKAGES = krb5-user krb5-kdc libkadm55 libkrb53 +DUPLICATE_PACKAGES = krb5-admin-server krb5-clients krb5-ftpd krb5-kdc \ + krb5-rsh-server krb5-telnetd krb5-user libkadm55 + +# The flags to pass to dh_install specifying the upstream files to exclude. +# We use --fail-missing to be sure we catch any new upstream files, so be +# sure to update this list if upstream adds any more files we don't want. +EXCLUDE = -Xtmac.doc -Xexamples/krb5 -Xgnats/mit -Xkrb5-send-pr \ + -Xsserver -Xsim_server -Xuuserver -Xgss-server \ + -Xsclient -Xsim_client -Xuuclient -Xgss-client + +# We touch each configure and Autoconf-related file so that we do not attempt +# to use Autoconf. +configure: configure-stamp +configure-stamp: + dh_testdir + -mkdir build + find src -name configure -print | xargs touch + find src \( -name \*hin -o -name \*.h.in -o -name \*.stmp \) -print \ + | xargs touch + cd build && ../src/configure --prefix=/usr --enable-shared \ + --with-system-et --with-system-ss --enable-fakeka \ + CFLAGS="$(CCOPTS) -D_REENTRANT -DHAVE_VSNPRINTF" --localstatedir=/etc \ + --mandir=/usr/share/man --without-tcl --enable-static + touch configure-stamp + +# Build the info pages in a separate directory, since otherwise we'll +# overwrite the info pages provided upstream and then debian/rules clean won't +# get back to a virgin copy of the package. +build: build-stamp +build-stamp: configure-stamp + cd build && $(MAKE) all + -mkdir build/info + cd build/info && makeinfo ../../doc/admin.texinfo + cd build/info && makeinfo ../../doc/install.texinfo + cd build/info && makeinfo ../../doc/user-guide.texinfo + cd build/info && makeinfo ../../doc/krb425.texinfo + touch build-stamp + +clean: + dh_testdir + dh_testroot + -rm -r build + dh_clean build-stamp configure-stamp + +install: DH_OPTIONS= +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + cd build && $(MAKE) install DESTDIR=`pwd`/../debian/tmp + + install -m644 src/util/ac_check_krb5.m4 \ + debian/libkrb5-dev/usr/share/aclocal + mv debian/tmp/usr/bin/telnet debian/tmp/usr/bin/telnet.krb5 + mv debian/tmp/usr/share/man/man1/telnet.1 \ + debian/tmp/usr/share/man/man1/telnet.krb5.1 + for foo in rlogin rsh ftp rcp ; do \ + mv debian/tmp/usr/bin/$$foo debian/tmp/usr/bin/krb5-$$foo; \ + mv debian/tmp/usr/share/man/man1/$$foo.1 \ + debian/tmp/usr/share/man/man1/krb5-$$foo.1 ; \ + done + + dh_install --sourcedir=debian/tmp --fail-missing $(EXCLUDE) + + docbook-to-man debian/krb5_newrealm.sgml \ + > debian/krb5-admin-server/usr/share/man/man8/krb5_newrealm.8 + install -o root -g root -m 755 debian/krb5_newrealm \ + debian/krb5-admin-server/usr/sbin + install -o root -g root -m 644 debian/kdc.conf \ + debian/krb5-kdc/usr/share/krb5-kdc/kdc.conf.template + ln -s /usr/share/krb5-kdc/kdc.conf.template \ + debian/krb5-kdc/usr/share/doc/krb5-kdc/examples/kdc.conf + for foo in $(LINTIAN_PACKAGES) ; do \ + install -d debian/$$foo/usr/share/lintian/overrides; \ + cp debian/$$foo.lintian \ + debian/$$foo/usr/share/lintian/overrides/$$foo; \ + done + for foo in $(DUPLICATE_PACKAGES) ; do \ + install -d debian/$$foo/usr/share/lintian/overrides; \ + echo "$$foo: package-has-a-duplicate-relation" \ + >> debian/$$foo/usr/share/lintian/overrides/$$foo; \ + done + +# Build architecture-independent files here. +# Pass -i to all debhelper commands in this target to reduce clutter. +binary-indep: DH_OPTIONS=-i +binary-indep: build install + dh_testdir + dh_testroot + dh_installchangelogs doc/CHANGES + dh_installdocs + dh_installinfo + dh_link + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +# Build architecture-dependent files here. +# Pass -a to all debhelper commands in this target to reduce clutter. Strip +# libkrb53 and libkadm55 separately and save the debug information for the +# libkrb5-dbg package. This method strips the libraries in those packages +# twice, but that should be harmless and all other ways of doing this seem +# uglier. +binary-arch: DH_OPTIONS=-a +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installdebconf + dh_installinit -- defaults 18 18 + DH_OPTIONS="" dh_strip -plibkrb53 --dbg-package=libkrb5-dbg + DH_OPTIONS="" dh_strip -plibkadm55 --dbg-package=libkrb5-dbg + dh_strip + dh_link + dh_compress + dh_fixperms + chmod u+s debian/krb5-user/usr/bin/ksu + chmod 700 debian/krb5-kdc/var/lib/krb5kdc + chmod 700 debian/krb5-kdc/etc/krb5kdc + DH_OPTIONS="" dh_makeshlibs -plibkrb53 '-Vlibkrb53 (>= 1.4.2)' + DH_OPTIONS="" dh_makeshlibs -plibkadm55 + dh_installdeb + dh_shlibdeps -L libkrb53 -l`pwd`/debian/libkrb53/usr/lib + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean configure binary-indep binary-arch binary install --- krb5-1.4.4.orig/debian/control +++ krb5-1.4.4/debian/control @@ -0,0 +1,218 @@ +Source: krb5 +Section: net +Priority: standard +Build-Depends: binutils (>= 2.14.90.0.7), libncurses5-dev, docbook-to-man, debhelper (>= 5), byacc | bison, comerr-dev (>= 2.0-1.33-2), ss-dev, texinfo (> 4.1) +Standards-Version: 3.7.2 +Maintainer: Ubuntu Core Developers +XSBC-Original-Maintainer: Sam Hartman +Uploaders: Russ Allbery + +Package: libkadm55 +Section: libs +Priority: optional +Depends: ${shlibs:Depends}, libkrb53 (= ${Source-Version}) +Replaces: libkrb53 (<= 1.3) +Architecture: any +Description: MIT Kerberos administration runtime libraries + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the administration runtime libraries, used by the + kadmin protocol and the KDC. + +Package: libkrb53 +Section: libs +Architecture: any +Depends: ${shlibs:Depends} +Suggests: krb5-doc, krb5-user +Conflicts: openafs-krb5 (<< 1.3-10), ssh-krb5 (<< 3.8.1p1-10), libauthen-krb5-perl (<< 1.4-5), libapache-mod-auth-kerb (<= 4.996-5.0-rc6-2), libapache2-mod-auth-kerb (<= 4.996-5.0-rc6-2) +Description: MIT Kerberos runtime libraries + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the runtime libraries used by applications and + Kerberos clients. + +Package: krb5-user +Architecture: any +Priority: optional +Depends: ${shlibs:Depends}, libkrb53 (= ${Source-Version}), libkadm55 (= ${Source-Version}), krb5-config +Conflicts: heimdal-clients, kerberos4kth-user, suidmanager (<< 0.50), kerberos4kth-services +Description: Basic programs to authenticate using MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the basic programs to authenticate to MIT Kerberos, + change passwords, and talk to the admin server (to create and delete + principals, list principals, etc.). + +Package: krb5-clients +Architecture: any +Priority: optional +Depends: ${shlibs:Depends}, libkrb53 (= ${Source-Version}), krb5-config +Suggests: rsh-client +Conflicts: kerberos4kth-clients, kerberos4kth-services, heimdal-clients +Provides: telnet-client +Description: Secure replacements for ftp, telnet and rsh using MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains secure replacements for ftp, telnet, rsh, rlogin, + and rcp that use Kerberos for authentication. + +Package: krb5-rsh-server +Architecture: any +Priority: optional +Depends: ${shlibs:Depends}, libkrb53 (= ${Source-Version}), update-inetd, krb5-config +Provides: rsh-server +Description: Secure replacements for rshd and rlogind using MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains replacements for rshd and rlogind that use Kerberos + for authentication. + +Package: krb5-ftpd +Architecture: any +Depends: ${shlibs:Depends}, libkrb53 (= ${Source-Version}), krb5-config, update-inetd +Conflicts: ftpd +Priority: extra +Provides: ftp-server +Description: Secure FTP server supporting MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains an FTP server that uses Kerberos for + authentication. + +Package: krb5-telnetd +Architecture: any +Depends: ${shlibs:Depends}, libkrb53 (= ${Source-Version}), update-inetd, krb5-config, krb5-rsh-server +Conflicts: telnetd, telnet-server +Provides: telnet-server +Priority: extra +Description: Secure telnet server supporting MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains a replacement for telnetd that uses Kerberos for + authentication. + +Package: krb5-kdc +Architecture: any +Priority: optional +Depends: ${shlibs:Depends}, ${misc:Depends}, libkrb53 (= ${Source-Version}), update-inetd, krb5-user, lsb-base (>= 3.0-6) +Suggests: krb5-admin-server +Conflicts: kerberos4kth-kdc +Description: MIT Kerberos key server (KDC) + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the Kerberos key server (KDC). The KDC manages all + authentication credentials for a Kerberos realm, holds the master keys + for the realm, and responds to authentication requests. This package + should be installed on both master and slave KDCs. + +Package: krb5-admin-server +Architecture: any +Priority: optional +Depends: ${shlibs:Depends}, ${misc:Depends}, libkrb53 (= ${Source-Version}), krb5-kdc, lsb-base (>= 3.0-6) +Description: MIT Kerberos master server (kadmind) + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the Kerberos master server (kadmind), which handles + account creations and deletions, password changes, and other + administrative commands via the Kerberos admin protocol. It also + contains the command used by the master KDC to propagate its database to + slave KDCs. This package is generally only used on the master KDC for a + Kerberos realm. + +Package: libkrb5-dev +Section: libdevel +Architecture: any +Depends: libkrb53 (= ${Source-Version}), libkadm55 (= ${Source-Version}), comerr-dev +Conflicts: heimdal-dev +Priority: extra +Suggests: krb5-doc +Description: Headers and development libraries for MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the symlinks, headers, and development libraries + needed to compile and link programs that use the Kerberos libraries. + +Package: libkrb5-dbg +Architecture: any +Depends: libkrb53 (= ${Source-Version}), libkadm55 (= ${Source-Version}) +Priority: extra +Section: libdevel +Description: Debugging files for MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the debugging information for the MIT Kerberos + libraries. Install this package if you need to trace problems inside the + MIT Kerberos libraries with a debugger. + +Package: krb5-doc +Architecture: all +Priority: optional +Conflicts: heimdal-docs, kerberos4kth-clients +Replaces: krb5-user (<< 1.2.2-8) +Section: doc +Description: Documentation for MIT Kerberos + Kerberos is a system for authenticating users and services on a network. + Kerberos is a trusted third-party service. That means that there is a + third party (the kerberos server) that is trusted by all the entities on + the network (users and services, usually called "principals"). + . + This is the MIT reference implementation of Kerberos5. + . + This package contains the installation, administrator, and user reference + manuals for MIT Kerberos and the man pages for the MIT Kerberos + configuration files. --- krb5-1.4.4.orig/debian/krb5-admin-server.init +++ krb5-1.4.4/debian/krb5-admin-server.init @@ -0,0 +1,105 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: krb5-admin-server +# Required-Start: $local_fs $remote_fs $network $syslog +# Required-Stop: $local_fs $remote_fs $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: S 0 1 6 +# Short-Description: MIT Kerberos KDC administrative daemon +# Description: Starts, stops, or restarts the MIT Kerberos KDC +# administrative daemon (kadmind). This daemon answers +# requests from kadmin clients and allows administrators +# to create, delete, and modify principals in the KDC +# database. +### END INIT INFO + +# Author: Sam Hartman +# Author: Russ Allbery +# +# Based on the /etc/init.d/skeleton template as found in initscripts version +# 2.86.ds1-15. + +PATH=/usr/sbin:/usr/bin:/sbin:/bin +DESC="Kerberos administrative servers" +NAME=kadmind +DAEMON=/usr/sbin/$NAME +SCRIPTNAME=/etc/init.d/krb5-admin-server + +# Exit if the package is not installed. +[ -x "$DAEMON" ] || exit 0 + +# Read configuration if it is present. +[ -r /etc/default/krb5-admin-server ] && . /etc/default/krb5-admin-server + +# Get the setting of VERBOSE and other rcS variables. +[ -f /etc/default/rcS ] && . /etc/default/rcS + +# Define LSB log functions (requires lsb-base >= 3.0-6). +. /lib/lsb/init-functions + +# Return +# 0 if daemon has been started +# 1 if daemon was already running +# 2 if daemon could not be started +do_start() +{ + start-stop-daemon --start --quiet --startas $DAEMON --name $NAME --test \ + > /dev/null || return 1 + start-stop-daemon --start --quiet --startas $DAEMON --name $NAME \ + || return 2 +} + +# Return +# 0 if daemon has been stopped +# 1 if daemon was already stopped +# 2 if daemon could not be stopped +# other if a failure occurred +do_stop() +{ + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME +} + + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + + restart|force-reload) + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop + case "$?" in + 0|1) + do_start + case "$?" in + 0) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + *) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + ;; + *) + log_end_msg 1 + ;; + esac + ;; + + *) + echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: --- krb5-1.4.4.orig/debian/README.KDC +++ krb5-1.4.4/debian/README.KDC @@ -0,0 +1,44 @@ + Running a Debian Kerberos Realm + +You will want to install the krb5-kdc and krb5-admin-server on your master +KDC and at least krb5-kdc on any slave KDCs you have. You may wish to +install krb5-admin-server on slaves in case you need them to become the +master KDC in a hurry, but in this case you may want to configure +krb5-admin-server to not start unless started manually. Otherwise, +clients may change their password on a slave server, a change that will +then be overwritten silently later and may cause user confusion. (This +can only happen if the client is misconfigured to use a slave server as +the admin server, but sometimes this happens.) + +krb5-kdc adds a commented-out line for kpropd to /etc/inetd.conf. You +will want to uncomment this on slave KDCs so that they can receive updates +from the master, but leave it commented out on the master. + +You should look at the KDC configuration file (/etc/krb5kdc/kdc.conf) and +adjust the parameters appropriately. If you expect to be using a lot of +Kerberos4 services, you should either remove +preauth from the default +principal flags or select full krb4 support when prompted by debconf. +(You can run dpkg-reconfigure on krb5-kdc to see this prompt again.) If +you remove +preauth from the flags, principals will by default not require +preauthentication. This is less secure since it opens you to offline +dictionary attacks, but this level of security is what people have been +suffering with throughout the lifetime of Kerberos4. You can turn on +requires_preauth for specific high-security principals in kadmin. If you +simply select full krb4 support, then Kerberos5 clients will require +preauthentication, but all principals will be accepted for Kerberos4. +This has a similar vulnerability to dictionary attacks and cannot be +overridden by setting requires_preauth selectively. + +By default principals are created with both DES and 3DES keys. This means +that if you ever decide at some point in the future that you no longer +have any DES services, you can get the full security benefits of 3DES by +dropping it from supported_enctypes in /etc/krb5kdc/kdc.conf and from +permitted_enctypes in /etc/krb5.conf. Note however, that for some +services, like AFS and Zephyr, you may need to only create single DES +keys. You might do this by for example: + + kadmin.local -e des-cbc-crc:normal -q "ktadd afs/ATHENA.MIT.EDU" + +You will probably want to create /etc/krb5kdc/kadm5.acl to include a list +of users who are authorized to run kadmin in your realm. The kadmind +documentation provides examples. --- krb5-1.4.4.orig/debian/libkadm55.install +++ krb5-1.4.4/debian/libkadm55.install @@ -0,0 +1,3 @@ +usr/lib/libkadm5*.so.* +usr/lib/libkdb5.so.* +usr/lib/libgssrpc.so.* --- krb5-1.4.4.orig/debian/krb5-kdc.config +++ krb5-1.4.4/debian/krb5-kdc.config @@ -0,0 +1,29 @@ +#!/bin/sh + +set -e +. /usr/share/debconf/confmodule || exit +db_version 2.0 + +db_input low krb5-kdc/debconf || true +db_go + +db_get krb5-kdc/debconf +if [ $RET = "true" ] ; then + db_input medium krb5-kdc/krb4-mode || true + db_go + RET="" + db_get krb5-kdc/run-krb524 || true + if [ "x$RET" = x ] ; then + db_get krb5-kdc/krb4-mode + if [ $RET = disable ] ; then + db_set krb5-kdc/run-krb524 false + else + db_set krb5-kdc/run-krb524 true + fi + fi + db_input low krb5-kdc/run-krb524 || true + db_go +fi + +db_input medium krb5-kdc/purge_data_too || true +db_go --- krb5-1.4.4.orig/debian/po/fr.po +++ krb5-1.4.4/debian/po/fr.po @@ -0,0 +1,185 @@ +# translation of fr.po to French +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2005-04-29 07:44+0200\n" +"Last-Translator: Christian Perrier \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.9.1\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Configuration d'un royaume (« Realm ») Kerberos" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Ce paquet contient les outils d'administration utiles pour un serveur maître " +"Kerberos. Cependant, la simple installation de ce paquet ne suffit pas pour " +"mettre en service automatiquement un royaume Kerberos. Cette mise en service " +"implique la saisie de mots de passe et n'est donc pas facile à gérer lors de " +"l'installation d'un paquet. Pour créer le royaume, veuillez utiliser la " +"commande krb5_newrealm. Vous pouvez aussi consulter le fichier /usr/share/" +"doc/krb5-kdc/README.KDC et le guide d'administration fourni dans le paquet " +"krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Pensez à configurer les informations DNS afin que vos clients puissent " +"trouver votre contrôleur de domaine Kerberos et les serveurs " +"d'administration. Ces opérations sont documentées dans le guide " +"d'administration." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "Faut-il lancer le démon d'administration de Kerberos5 (kadmind) ?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind répond aux requêtes d'ajout, modification et suppression des " +"enregistrements dans la base de données Kerberos. Il doit également être " +"opérationnel pour que le programme kpasswd puisse être utilisé pour changer " +"les mots de passe. Habituellement, ce démon est en route sur le contrôleur " +"de domaine Kerberos (KDC)." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "" +"Faut-il gérer la configuration du contrôleur de domaine Kerberos avec " +"debconf ?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"De nombreux sites peuvent préférer gérer automatiquement les fichiers de " +"configuration du contrôleur de domaine Kerberos dans /etc/krb5kdc. Par " +"défaut, des fichiers d'exemple comportant des paramètres locaux seront " +"placés dans ce répertoire. Certains sites qui possèdent déjà leur " +"infrastructure de gestion de leur configuration de Kerberos souhaiteront " +"probablement désactiver toute modification automatique de la configuration." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "désactivé, complet, pas de pré-authentification, aucun" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Mode de compatibilité avec Kerberos4 à utiliser :" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Par défaut, les requêtes Kerberos4 sont autorisées pour les enregistrements " +"(« principals ») qui n'ont pas besoin de pré-authentification. Cela permet " +"que les services Kerberos4 fonctionnent mais la majorité des utilisateurs " +"doivent utiliser des clients Kerberos5 pour obtenir leurs tickets initiaux." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Faut-il lancer le démon krb524d ?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d est un démon qui permet de convertir les tickets Kerberos5 en " +"tickets Kerberos4 pour le programme krb524init. Si vous avez activé la " +"gestion de Kerberos4, il est probablement nécessaire d'utiliser ce " +"programme. Il est notamment indispensable lorsque vous utilisez le mode de " +"compatibilité Kerberos4 sans pré-authentification pour utiliser des services " +"Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "" +"Faut-il supprimer les données en même temps que les fichiers du paquet ?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Par défaut, la suppression complète (purge) de ce paquet ne supprimera pas " +"la base de données KDC dans /var/lib/krb5kdc/principal car cette base de " +"données ne peut pas être récupérée une fois supprimée. Choisissez cette " +"option si vous souhaitez supprimer la base de données KDC à la purge du " +"paquet, ce qui supprimera tous les comptes des utilisateurs ainsi que les " +"mots de passe." --- krb5-1.4.4.orig/debian/po/pt_BR.po +++ krb5-1.4.4/debian/po/pt_BR.po @@ -0,0 +1,182 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2005-05-05 14:26-0300\n" +"Last-Translator: André Luís Lopes \n" +"Language-Team: Debian-BR Project \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Configurando um Realm Kerberos" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Este pacote contém as ferramentas adminisrativas necessárias para serem " +"executadas em um servidor Kerberos mestre. Porém, a instalação deste pacote " +"não configura automaticamente um realm Kerberos. Para isso seria necessário " +"que senhas fossem informadas e isso não é muito adequado para a instalação " +"de pacotes. Para criar um realm, execute o comando krb5_newrealm. Você pode " +"também desejar ler o arquivo /usr/share/doc/krb5-kdc/README.KDC e o guia de " +"administração encontrado no pacote krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Não se esqueça de configurar a informação de DNS de forma que seus clientes " +"possam encontrar seu KDC e seus servidores administrativos. Tal configuração " +"não está documentada no guia de administração." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "Executar o daemon de administração do Kerberos5 (kadmind) ?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"O kadmind atende requisições para adicionar/modificar/remover principals na " +"base de dados do Kerberos. Ele também deve estar em execução para que o " +"programa kpasswd possa ser usado para troca de senhas. Normalmente, esse " +"daemon é executado no KDC mestre." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "Criar Configuração KDC do Kerberos com o debconf ?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Muitos sites desejarão que este script crie automaticamente os arquivos de " +"configuração de um KDC Kerberos em /etc/krb5kdc. Por padrão, um modelo de " +"exemplo será copiado nesse diretório com parâmetros locais preenchidos. " +"Alguns sites que já possuem infraestrutura para gerenciar sua própria " +"configuração Kerberos desejarão desabilitar quaisquer mudanças de " +"configuração automáticas." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "desabilitar, completa, sem-pré-autenticação, nenhuma" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Modo de compatibilidade Kerberos4 a ser usado : " + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Por padrão, requisições Kerberos4 de principals que não necessitem de pré-" +"autenticação são permitidas. Isso permite que serviços Kerberos4 existam, " +"mesmo requerendo que a maioria dos usuários usem clientes Kerberos5 para " +"obter seus tickets iniciais. Esses tickets podem então ser convertidos para " +"tickets Kerberos4. Alternativamente, o modo de compatiblidade pode ser " +"definido para o modo completo, permitindo que o Kerberos4 obtenha tickets " +"iniciais mesmo quando a pré-autenticação seria normalmente necessária. Ou a " +"compatibiliade poderia ser desabilitada, o que desabilitaria todo o suporte " +"a Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Executar um krb524d ?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Um krb524d é um daemon que converte tickets Kerberos5 para tickets Kerberos4 " +"para o programa kbr524init. Caso você possua Kerberos4 habilitado, " +"provavelmente você desejará executar esse programa. Especialmente quando o " +"modo de compatibilidade com Kerberos4 está definido como nopreauth (sem-pré-" +"autenticação), o krb524d é importante caso você possua qualquer serviço " +"Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "Os dados devem ser removidos junto com a remoção dos arquivos ?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Por padrão, a remoção deste pacote não irá remover a base de dados KDC em /" +"var/lib/krb5kdc/principal, uma vez que essa base de dados não pode ser " +"recuperada quando é removida. Caso você deseje remover sua base de dados KDC " +"quando este pacote for removido, tendo em mente que, nesse caso, remover o " +"pacote irá significar remover todas as contas de usuários e senhas no KDC, " +"habilite esta opção." --- krb5-1.4.4.orig/debian/po/templates.pot +++ krb5-1.4.4/debian/po/templates.pot @@ -0,0 +1,134 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" --- krb5-1.4.4.orig/debian/po/ru.po +++ krb5-1.4.4/debian/po/ru.po @@ -0,0 +1,171 @@ +# translation of krb5_1.4.3-8_debconf_ru.po to Russian +# This file is distributed under the same license as the PACKAGE package. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. +# Yuri Kozlov , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5_1.4.3-8\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2006-07-29 09:43+0300\n" +"Last-Translator: Yuri Kozlov \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.9.1\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "ÐаÑтройка облаÑти Kerberos" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Этот пакет Ñодержит программы админиÑтрированиÑ, необходимые Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка " +"маÑтер Ñервера Kerberos. Однако, уÑтановка данного пакета не выполнÑет " +"автоматичеÑкую наÑтройку облаÑти Kerberos. Ð”Ð»Ñ Ñтого требуетÑÑ Ð²Ð²Ð¾Ð´ паролей, " +"а Ñто не очень безопаÑно делать при уÑтановке пакета. Чтобы Ñоздать облаÑÑ‚ÑŒ, " +"запуÑтите команду krb5_newrealm. Также полезно почитать документацию в " +"файле /usr/share/doc/krb5-kdc/README.KDC и руководÑтво по админиÑтрированию " +"из пакета krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Ðе забудьте наÑтроить информацию в DNS, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы клиенты Ñмогли найти " +"ваш KDC и админиÑтративные Ñервера. Как Ñто Ñделать опиÑано в руководÑтве по " +"админиÑтрированию." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "ЗапуÑкать демон админиÑÑ‚Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Kerberos5 (kadmind)?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind обрабатывает запроÑÑ‹ на добавление/изменение/удаление пользователей " +"(principals) в базе данных Kerberos. Также он должен быть запущен Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ " +"программы kpasswd, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹. Обычно, Ñтот " +"демон запуÑкаетÑÑ Ð½Ð° маÑтер KDC." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "Создавать конфигурацию Kerberos KDC Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ debconf?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Ðа многих машинах пригодитьÑÑ Ñценарий Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ " +"конфигурационных файлов Kerberos KDC в /etc/krb5kdc. По умолчанию, пример " +"шаблона Ñ Ð½Ð°Ñтроенными локальными параметрами будет Ñкопирован в Ñтот " +"каталог. Ðа машинах, уже имеющих инфраÑтруктуру ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñвоими " +"наÑтройками Kerberos, лучше запретить любые автоматичеÑкие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ " +"конфигурации." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "выключить, полнаÑ, nopreauth, нет" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "ИÑпользуемый режим ÑовмеÑтимоÑти Ñ Kerberos4:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"По умолчанию, запроÑÑ‹ Kerberos4 разрешены от пользователей, которые не " +"требуют предварительной аутентификации. Это позволÑет ÑущеÑтвовать ÑервиÑам " +"Kerberos4, но требует от большинÑтва пользователей иÑпользовать клиента " +"Kerberos5 Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ñ‹Ñ… мандатов. Затем Ñти мандаты могут быть " +"преобразованы в мандаты Kerberos4. Или же можно задать режим полной " +"ÑовмеÑтимоÑти, при котором Kerberos4 получает начальные мандаты даже когда " +"обычно требуетÑÑ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ, или выключить, что полноÑтью " +"выключает поддержку Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "ЗапуÑкать krb524d?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d -- Ñто демон, который преобразует мандаты Kerberos5 в мандаты " +"Kerberos4 Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ krb524init. ЕÑли вы полноÑтью включили Kerberos4, то " +"вероÑтно захотите запуÑтить Ñту программу. krb524d оÑобенно важен Ð´Ð»Ñ " +"ÑервиÑов Kerberos4 когда ÑовмеÑтимоÑÑ‚ÑŒ Ñ Kerberos4 уÑтановлена в nopreauth." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "Вычищать данные при удалении файлов пакета?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"По умолчанию, вычиÑтка данного пакета не приводит к удалению базы данных KDC " +"в /var/lib/krb5kdc/principal, так как Ñта база данных не может быть " +"воÑÑтановлена поÑле удалениÑ. ЕÑли вы выберите удаление базы KDC при " +"вычиÑтке данного пакета, учтите, что вмеÑте Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ пакета также будут " +"удалены вÑе учётные запиÑи пользователей и пароли, хранÑщиеÑÑ Ð² KDC." --- krb5-1.4.4.orig/debian/po/gl.po +++ krb5-1.4.4/debian/po/gl.po @@ -0,0 +1,170 @@ +# Galician translation of krb5's debconf templates. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the krb5 package. +# Jacobo Tarrio , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2006-04-10 15:26+0200\n" +"Last-Translator: Jacobo Tarrio \n" +"Language-Team: Galicia \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Configuración dun reino Kerberos" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Este paquete contén as ferramentas administrativas necesarias para executar " +"no servidor mestre de Kerberos. Nembargantes, a instalación deste paquete " +"non configura automaticamente un reino Kerberos. Para facelo hai que " +"introducir contrasinais, e por iso non se axusta ben á instalación do " +"paquete. Para crear o reini execute o programa krb5_newrealm. Tamén é " +"importante que lea o ficheiro /usr/sare/doc/krb5-kdc/README.KDC e a guía " +"administrativa que se atopa no paquete krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Non esqueza configurar a información do DNS para que os clientes poidan " +"atopar o KDC e o servidor administrativo. O xeito de o facer documéntase na " +"guía de administración." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "¿Executar o servizo de administración de Kerberos5 (kadmind)?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind serve peticións para engadir/modificar/eliminar principais na base " +"de datos Kerberos. Tamén ten que estar a funcionar para que o programa " +"kpasswd o empregue para cambiar contrasinais. Normalmente este servizo " +"funciona no KDC mestre." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "¿Crear a configuración do KDC de Kerberos con debconf?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"En moitos sitios se ha querer que este script cree automaticamente os " +"ficheiros de configuración do KDC de Kerberos en /etc/krb5kdc. Por defecto " +"hase copiar un patrón de exemplo neste directorio cos parámetros locais " +"introducidos. Os sitios que xa teñan a infraestructura para xestionar a súa " +"propia configuración de Kerberos poden ter que desactivar os cambios " +"automáticos na configuración." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "desactivado, completo, nopreauth, ningún" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Modo de compatibilidade con Kerberos4 a empregar:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Por defecto admítense as peticións Kerberos4 desde os principais que non " +"precisan de preautenticación. Isto permite que os servizos Kerberos4 sigan a " +"existir mentres se require que a maioría dos usuarios empreguen clientes " +"Kerberos5 para obter os seus tickets iniciais. Eses tiquets logo pódense " +"converter en tickets Kerberos4. De xeito alternativo, pode poñerse o modo en " +"completo, o que permite que Kerberos4 obteña tiquets iniciais incluso cando " +"se precisaría normalmente de preautenticación, ou en desactivado, o que " +"había desactivar todo o soporte de Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "¿Executar krb524d?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d é un servizo que convirte os tiquets Kerberos5 en tiquets Kerberos4 " +"para o programa krb524init. Se ten Kerberos4 activado é probable que queira " +"executar este programa. Krb524d é importante se ten servizos Kerberos4, " +"especialmente se a compatibilidade con Kerberos4 é nopreauth." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "¿Deben purgarse os datos cos ficheiros dos paquetes?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Por defecto, ao purgar este paquete non se ha borrar a base de datos KDC de /" +"var/lib/krb5kdc/principal xa que esta base de datos non se pode recuperar " +"despois de a borrar. Se quere borrar a súa base de datos KDC cando se purgue " +"ese paquete, sabendo que ao purgar o paquete ha borrar tódalas contas de " +"usuario e contrasinais do KDC, active esta opción." --- krb5-1.4.4.orig/debian/po/POTFILES.in +++ krb5-1.4.4/debian/po/POTFILES.in @@ -0,0 +1,2 @@ +[type: gettext/rfc822deb] krb5-admin-server.templates +[type: gettext/rfc822deb] krb5-kdc.templates --- krb5-1.4.4.orig/debian/po/cs.po +++ krb5-1.4.4/debian/po/cs.po @@ -0,0 +1,173 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2005-04-30 10:45+0200\n" +"Last-Translator: Miroslav Kure \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Nastavení Kerberovy říše" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Balík obsahuje nezbytné administrativní nástroje pro bÄ›h hlavního " +"kerberovského serveru. Pouhou instalací tohoto balíku se vÅ¡ak automaticky " +"nenastaví Kerberova říše. K tomu musíte zadat hesla, což samo o sobÄ› není " +"vhodné provádÄ›t bÄ›hem instalace balíku. Pro vytvoÅ™ení říše spusÅ¥te příkaz " +"krb5_newrealm. Také je vhodné si pÅ™eÄíst /usr/share/doc/krb5-kdc/README.KDC " +"a příruÄku administrátora v balíku krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Nezapomeňte nastavit DNS, aby klienti mohli najít váš KDC a administrátorské " +"servery. VÅ¡e je popsáno v příruÄce administrátora." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "Spustit administraÄní daemon Kerbera5 (kadmind)?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind obsluhuje požadavky na pÅ™idání/zmÄ›nu/smazání záznamů v databázi " +"Kerbera. Také musí běžet, aby jste mohli mÄ›nit hesla programem kpasswd. " +"Tento daemon obvykle běží na hlavním KDC." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "VytvoÅ™it kerberovo KDC nastavení pomocí debconfu?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Mnoho správců bude chtít, aby za nÄ› debconf provedl poÄáteÄní nastavení " +"kerberova KDC v /etc/krb5kdc. StandardnÄ› se do tohoto adresáře zkopíruje " +"Å¡ablona s pÅ™edvyplnÄ›nými parametry. NÄ›které servery, které již mají svou " +"vlastní infrastrukturu pro správu Kerbera, asi tuto automatickou konfiguraci " +"nepovolí, aby se jim nepÅ™epsalo nastavení." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "zakázat, plný, nopreauth, žádný" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Režim zpÄ›tné kompatibility s Kerberem4:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"ImplicitnÄ› jsou povoleny požadavky z Kerbera4, které nevyžadují " +"pÅ™edautentizaci. To umožňuje, aby existovaly služby Kerbera4, ale vyžaduje, " +"aby vÄ›tÅ¡ina klientů používala pro získání prvotního lístku klienta Kerbera5. " +"Tyto lístky pak mohou být pÅ™emÄ›nÄ›ny na lístky Kerbera4. VolitelnÄ› můžete " +"zapnout plnou podporu, což umožní Kerberovi4 získat prvotní lístky i když by " +"normálnÄ› byla vyžadována pÅ™edautentizace. Možnost zakázat úplnÄ› zakáže " +"podporu Kerbera4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Spustit krb524d?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d je daemon, který pÅ™evádí lístky z Kerbera5 na lístky Kerbera4 pro " +"použití programem krb524init. Jestliže máte Kerbera4 povoleného, pak asi " +"budete chtít tento program spustit. ObzvláštÄ› pokud je kompatibilita s " +"Kerberem4 nastavena na 'nopreauth', je tento program důležitý." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "Mají se pÅ™i úplném odstranÄ›ní balíÄku smazat i data?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Ve výchozím nastavení se pÅ™i odstranÄ›ní balíku ze systému nesmaže KDC " +"databáze ve /var/lib/krb5kdc/principal, protože ji po smazání nemůžete " +"obnovit. Chcete-li pÅ™i odstranÄ›ní balíku smazat i svou KDC databázi, tuto " +"volbu povolte. JeÅ¡tÄ› jednou vás varujeme, že smazáním databáze smažete " +"vÅ¡echny uživatelské úÄty a vÅ¡echna hesla v KDC." --- krb5-1.4.4.orig/debian/po/nl.po +++ krb5-1.4.4/debian/po/nl.po @@ -0,0 +1,174 @@ +# Debian krb5 po-debconf translation, +# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the krb5 package. +# Vincent Zweije , 2006. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5 1.4.3-6\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2006-03-22 21:16+0100\n" +"Last-Translator: Vincent Zweije \n" +"Language-Team: Debian-Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Aanmaken van een Kerberos authoriteitsgebied (realm)" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Dit pakket bevat de administratieve hulpmiddelen die nodig zijn op de " +"Kerberos hoofd-server. De installatie van dit pakket maakt echter niet " +"automatisch een Kerberos authoriteitsgebied (realm) aan; dat zou het " +"invoeren van wachtwoorden vereisen, en pakket-installatie is daarvoor niet " +"de beste methode. Om het authoriteitsgebied aan te maken moet u het " +"programma krb5_newrealm uitvoeren. Nadere informatie is te vinden in /usr/" +"share/doc/krb5-kdc/README.KDC en in de administratiehandleiding in pakket " +"krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Vergeet niet de DNS informatie aan te maken opdat uw computers uw KDC en " +"administratieservers kunnen vinden. Hoe dit te doen staat in de " +"administratiehandleiding." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "De Kerberos5 administratie-achtergronddienst (kadmind) starten?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind handelt aanvragen af om principals in de Kerberos database toe te " +"voegen, te wijzigen of te verwijderen. Het moet ook draaien voor het " +"programma kpasswd wanneer dat moet worden gebruikt voor het wijzigen van " +"wachtwoorden. Gewoonlijk draait deze achtergronddienst op de hoofd-KDC." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "Kerberos KDC instellingen aanmaken met debconf?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Op de meeste plaatsen zal het gewenst zijn dat dit script automatisch " +"Kerberos KDC instellingsbestanden aanmaakt in /etc/krb5kdc. Standaard zal " +"een sjabloon naar deze map worden gekopieerd, waarin de locale parameters al " +"zijn ingevuld. Op plaatsen waar al infrastructuur aanwezig is om Kerberos " +"instellingen te beheren kunnen automatische instellingswijzigingen " +"waarschijnlijk beter worden uitgeschakeld." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "uitgeschakeld, volledig, nopreauth, geen" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Te gebruiken Kerberos4 compatibiliteitsmodus:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Standaard worden Kerberos4 aanvragen toegestaan van principals die geen pre-" +"authenticatie vereisen. Dit staat toe dat Kerberos4 diensten bestaan, " +"terwijl tegelijkertijd de meeste gebruikers Kerberos5 clients moeten " +"gebruiken voor hun initiële tickets. Deze Kerberos5 tickets kunnen dan in " +"Kerberos4 tickets worden omgezet. Als alternatief kan de modus op volledig " +"worden gezet, zodat Kerberos4 initiële tickets kan verkrijgen, zelfs als pre-" +"authenticatie normaal gesproken vereist zou zijn. Tenslotte kan de modus op " +"uitgeschakeld worden gezet, hetgeen alle Kerberos4 ondersteuning uitschakelt." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Een krb524d starten?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d is een achtergronddienst die Kerberos5 in Kerberos4 tickets omzet " +"voor het krb524init programma. Als u Kerberos4 op enige wijze aangeschakeld " +"hebt, dan wilt u waarschijnlijk deze achtergronddienst starten. Krb524d is " +"vooral belangrijk wanneer Kerberos4 compatibiliteit op nopreauth staat en u " +"Kerberos4 diensten hebt." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "" +"Moeten, naast de pakketbestanden, ook de gegevens worden gewist (purged)?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Standaard zal het wissen (purge) van dit pakket de KDC database in /var/lib/" +"krb5kdc/principal niet verwijderen, aangezien deze database niet kan worden " +"hersteld als deze is verwijderd. Indien u wilt dat uw KDC database wordt " +"verwijderd wanneer dit pakket wordt gewist, wetende dat het wissen van dit " +"pakket zal betekenen dat alle gebruikers en wachtwoorden verloren gaan, " +"accepteer dan deze optie." --- krb5-1.4.4.orig/debian/po/da.po +++ krb5-1.4.4/debian/po/da.po @@ -0,0 +1,177 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans# +# Developers do not need to manually edit POT or PO files. +# +# Claus Hindsgaul , 2006. +msgid "" +msgstr "" +"Project-Id-Version: krb5\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2006-01-26 21:55+0100\n" +"Last-Translator: Claus Hindsgaul \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.1\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Sætter et Kerberos-rige op" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Denne pakke indeholder de nødvendige administrationsværktøjer til kørsel på " +"Kerberos-hovedserveren. Installationen af denne pakke sætter dog ikke " +"automatisk et Kerberos-rige ('realm') op. Det kræver indtastning af " +"adgangskoder, hvilket ikke egner sig til pakkeinstallationen. For at oprette " +"riget, skal du udføre kommandoen krb5_newrealm. Du kan også læse /usr/share/" +"doc/krb5-kdc/README.KDC og administrationsguiden i pakken krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Glem ikke at sætte DNS-oplysningerne op, så dine klienter kan finde dine " +"KDC- og admin-servere. Fremgangsmåden er dokumenteret i " +"administrationsguiden." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "Skal Kerberos5-administrationsdæmonen (kadmind) køres?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind håndterer forespørgsler om at tilføje/ændre/fjerne elementer i " +"Kerberos-databasen. Den skal køre for at kpasswd-programmet kan benyttes til " +"at ændre adgangskoder. Normalt kører denne dæmon på hoved-KDC'en." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "Opret Kerberos KDC-opsætning med debconf?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Mange vil vælge at lade dette script oprette Kerberos KDC-opsætningsfiler i /" +"etc/krb5kdc automatisk. Som udgangspunkt vil en eksempel-skabelon blive " +"kopieret til denne mappe med lokale paremetre udfyldt på forhånd. Dem, der " +"allerede har infrastruktur til at håndtere deres egen Kerberos-opsætning, " +"kan vælge at deaktivere alle automatiske ænderinger i opsætningen." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "deaktivér, fuld, ejpræaut, ingen" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Kerberos4-kompatibilitetstilstand, der skal benyttes:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Som udgangspunkt tillades Kerberos4-forespørgsler fra elementer, der ikke " +"kræver præ-autentifikation. Det vil gøre det muligt at bevare Kerberos4-" +"services, mens de fleste brugere tvinges til at bruge Kerberos5-klienter til " +"at opnå deres første billetter. Disse billetter kan derefter omsættes til " +"Kerberos4-billeter. Alternativt kan man vælge fuld tilstand, som tillader " +"Kerberos4 at få de første billetter, selvom præautentifikation normalt ville " +"have været påkrævet, eller vælge at deaktivere, hvilket vil deaktivere al " +"understøttelse af Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Kør en krb524d?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d er en dæmon, der omsætter Kerberos5-billetter til Kerberos4-" +"billetter til programmet krb524init. Hvis du overhovedet har aktiveret " +"Kerberos4, skal du sikkert køre dette program. krb524d er især vigtig, hvis " +"Kerberos4-kompatibiliteten er sat til ejpræaut, og du har Kerberos4-services " +"kørende." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "Skal data slettes, når pakkens afinstalleres?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Som udgangspunkt vil KDC-databasen i /var/lib/krb5kdc/principal ikke blive " +"slettet, når pakken afinstalleres, da denne database ikke kan genskabes, når " +"den er slettet. Hvis du ønsker at slette din KDC-database, når denne pakke " +"afinstalleres, vel vidende at det betyder at alle dine brugerkonti og " +"adgangskoder i KDC'en dermed bliver slettet ved afinstallation, skal du " +"aktivere denne indstilling." --- krb5-1.4.4.orig/debian/po/de.po +++ krb5-1.4.4/debian/po/de.po @@ -0,0 +1,186 @@ +# translation of krb5_1.3.6-5_templates.po to +# translation of krb5_1.3.6-5_templates.po to +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans# +# Developers do not need to manually edit POT or PO files. +# Jens Nachtigall , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5_1.3.6-5_templates\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2005-09-30 15:19+0200\n" +"Last-Translator: Jens Nachtigall \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.9.1\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Einrichten des Kerberos-Realm" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Dieses Paket enthält die administrativen Werkzeuge, die für den Kerberos-" +"Masterserver benötigt werden. Die Installation dieses Pakets bedeutet jedoch " +"nicht, dass der Kerberos-Realm automatisch eingerichtet wird. Dazu wäre die " +"Eingabe von Passwörtern notwendig und deshalb ist dies nicht sonderlich für " +"die Paket-Installation geeignet. Um den Realm zu erstellen, führen Sie bitte " +"den Befehl »krb5_newrealm« aus. Lesen Sie eventuell auch /usr/share/doc/krb5-" +"kdc/README.KDC oder den Administrations-Leitfaden, welcher im Paket krb5-doc " +"zu finden ist." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Vergessen Sie nicht DNS einzurichten, damit Ihre Clients auch Ihre KDC- und " +"Admin-Server finden. Wie Sie dazu vorgehen müssen, steht im Administrations-" +"Leitfaden." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "Soll der Kerberos5-Administrations-Daemon (kadmind) laufen?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind beantwortet Anfragen um »Principals« in die Kerberos-Datenbank " +"einzufügen, zu verändern oder aus der Datenbank zu entfernen. Kadmind muss " +"laufen, damit das Programm kpasswd in der Lage ist, Passwörter zu verändern. " +"Normalerweise läuft dieser Daemon auf dem Master-KDC." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "Kerberos-KDC-Konfiguration mit debconf erstellen?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Viele Sites werden es bevorzugen, wenn dieses Skript automatisch die " +"Kerberos-KDC-Konfigurationsdateien in /etc/krb5kdc erstellt. Standardmäßig " +"wird eine Beispiel-Vorlage in dieses Verzeichnis kopiert und mit lokalen " +"Parametern ausgefüllt. Einige Sites, welche bereits die Infrastruktur " +"besitzen um Ihre eigene Kerberos-Konfiguration zu verwalten, werden es " +"bevorzugen, jede automatische Veränderung der Konfiguration zu deaktivieren." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "deaktivieren, total, ohne vorherige Authenfizierung, keiner" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Zu benutzender Kerberos4-Kompatibilitäts-Modus:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Standardmäßig werden Kerberos4-Anfragen von »Principals« erlaubt, die keine " +"vorherige Authenfizierung benötigen. Das ermöglicht Kerberos4-Dienste zu " +"haben, während gleichzeitig die meisten Benutzer Kerberos5-Clients verwenden " +"müssen um Ihr anfängliches Ticket zu bekommen. Diese Tickets können in " +"Kerberos4-Tickets umgewandelt werden. Alternativ kann der Modus auch auf " +"»total« gesetzt werden, wodurch Kerberos4-Clients anfängliche Tickets " +"erhalten können, auch ohne vorherige Authentifizierung, welche normalerweise " +"nötig wäre. Die Option »deaktivieren« wird die Unterstützung für Kerberos4 " +"deaktivieren." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Soll krb524d laufen?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d ist ein Daemon, der Kerberos5-Tickets für das Programm krb524init in " +"Kerberos4-Tickets umwandelt. Haben Sie Kerberos4 aktiviert, dann sollten Sie " +"wahrscheinlich diesen Dienst laufen lassen. Insbesondere wenn der Kerberos4-" +"Kompatibilitäts-Modus auf »ohne vorherige Authentifizierung« gesetzt ist, " +"ist krb524d wichtig, wenn Sie irgendwelche Kerberos4-Dienste haben." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "" +"Sollen die Daten genauso wie die Paket-Dateien restlos entfernt werden?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Standardmäßig wird während des restlosen Entfernens (»purge«) des Paketes " +"nicht die KDC-Datenbank in /var/lib/krb5kdc/principal entfernt, da diese " +"Datenbank nicht wiederhergestellt werden könnte, nachdem sie gelöscht wurde. " +"Wenn Sie wünschen die KDC-Datenbank zu löschen, sobald dieses Paket restlos " +"entfernt wird, dann stimmen Sie hier zu. Beachten Sie, dass das restlose " +"Entfernen des Pakets auch das Löschen aller Benutzer-Konten und Passwörter " +"in der KDC bedeutet." --- krb5-1.4.4.orig/debian/po/ro.po +++ krb5-1.4.4/debian/po/ro.po @@ -0,0 +1,172 @@ +# translation of po-debconf://kdebase.po to romanian +# Romanian translation of krb5. +# Copyright (C) 2006 THE krb5'S COPYRIGHT HOLDER +# This file is distributed under the same license as the krb5 package. +# +# Stan Ioan-Eugen , 2006. +msgid "" +msgstr "" +"Project-Id-Version: po-debconf://kdebase\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2006-10-11 19:28+0300\n" +"Last-Translator: stan ioan-eugen \n" +"Language-Team: romanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.2\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Se configurează un Domeniu Kerberos" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Acest pachet conÅ£ine uneltele de administrare necesare rulării pe un server " +"master Kerberos. TotuÅŸi, instalând acest pachet nu se configurează automat " +"un domeniu Kerberos. Un asemenea lucru necesită introducerea de parole " +"operaÅ£ie care nu este potrivită la instalarea pachetului. Pentru a crea " +"domeniul, executaÅ£i comanda krb5_newrealm. VeÅ£i dori probabil să citiÅ£i ÅŸi /" +"usr/share/doc/krb5-kdc/README.KDC ÅŸi ghidul de administrare din pachetul " +"krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Nu uitaÅ£i să configuraÅ£i informaÅ£iile pentru DNS astfel încât clienÅ£ii să " +"poată gasi serverele ÅŸi KDC-ul dumneavoastră. Acest lucru este documentat " +"în ghidul de administrare." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "Se rulează demonul de administrare Kerberos5 (kadmind)?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind rezolvă cereri de adăugare/modificare/îndepărtare a directorilor din " +"baza de date Kerberos. Acesta trebuie să ruleze ÅŸi pentru ca programul " +"kpasswd să poată fi folosit pentru a schimba parolele. ÃŽn mod normal, acest " +"demon ruleaza pe serverul master KDC." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "Se crează configuraÅ£ia Kerberos KDC prin intermediul debconf?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Multe situri vor dori ca acest script să creeze automat fiÅŸierele de " +"configurare Kerberos KDC în /etc/krb5kdc. Implicit un ÅŸablon va fi copiat " +"în acest director, cu parametrii locali completaÅ£i. Unele situri care au " +"deja o infrastructură pentru a administra configuraÅ£iile Kerberos vor dori " +"să dezactiveze orice modificare automată a configuraÅ£iei." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "dezactivat, complet, fără preautentificare, nici unul" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Modul de compatibilitate Kerberos4 folosit:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Implicit, cererile Kerberos4 sunt permise de la directori care nu necesită " +"preautentificare. Acest lucru permite serviciilor Kerberos4 să poată fi " +"folosit în timp ce utilizatorii trebuie să folosească clienÅ£i Kerberos5 " +"pentru a obÅ£ine tichete iniÅ£iale. Aceste tichete pot fi convertite în " +"tichete pentru Kerberos4. OpÅ£ional poate fi ales modul complet de " +"compatibilitate, permiţând Kerberos4 să obÅ£ină tichete iniÅ£iale chiar dacă " +"ar fi nevoie de preautentificare, sau se poate dezactiva modul de " +"compatibilitate, dezactivând tot suportul pentru Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Se rulează krb524d?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d este un demon care converteÅŸte tichetele Kerberos5 în tichete " +"Kerberos4 pentru programul krb524init. Dacă aveÅ£i activat Kerberos4 atunci " +"probabil că veÅ£i dori să rulaÅ£i acest program. Krb524 este important dacă " +"aveÅ£i servicii Kerberos4, în special dacă modulu de compatibilitate " +"Kerberos4 este fără preautentificare." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "Să se ÅŸteargă atât datele cât ÅŸi fiÅŸierele pachetului?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Implicit, dacă se curăţă acest pachet nu se ÅŸterge ÅŸi baza de date KDC din /" +"var/lib/krb5kdc/principal deoarece nu poate fi recuperată odată ÅŸtearsă. " +"Dacă doriÅ£i să ÅŸtergeÅ£i baza de date KDC când curăţaÅ£i pachetul, ÅŸtiind că " +"veÅ£i ÅŸterge toate conturile utilizatorilor ÅŸi parolele din KDC, activaÅ£i " +"această opÅ£iune." --- krb5-1.4.4.orig/debian/po/vi.po +++ krb5-1.4.4/debian/po/vi.po @@ -0,0 +1,165 @@ +# Vietnamese Translation for krb5. +# Copyright © 2005 Free Software Foundation, Inc. +# Clytie Siddall , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: krb5 1.3.6-4\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2005-07-24 17:42+0930\n" +"Last-Translator: Clytie Siddall \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0\n" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Äang thiết lập má»™t miá»n Kerberos" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "" +"Gói tin này chứa những công cụ quản lý cần thiết để chạy nó trong trình phục " +"vụ chính Kerberos. Tuy nhiên, cài đặt gói tin này không tá»± Ä‘á»™ng thiết lập " +"má»™t miá»n Kerberos. Hành Ä‘á»™ng ấy cần đến mật khẩu, mà không thích hợp khi cài " +"đặt gói tin. Äể tạo má»™t miá»n, hãy chạy lệnh «krb5_newrealm». Bạn cÅ©ng có thể " +"Ä‘á»c tập tin «/usr/share/doc/krb5-kdc/README.KDC» và tập tin hÆ°á»›ng dẫn quản " +"lý trong gói tin «krb5-doc»." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "" +"Äừng quên thiết lập thông tin DNS (hệ thống tên miá»n) để cho phép các khách " +"tìm KDC và trình phục vụ quản lý của bạn. Hành Ä‘á»™ng này được diá»…n tả trong " +"tập tin hÆ°á»›ng dẫn quản lý có nói trên." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "Chạy trình ná»n quản lý Kerberos5 (kadmind) không?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Trình kadmind phục vụ yêu cầu thêm/sá»­a đổi/loại bá» Ä‘iá»u chính trong cÆ¡ sở dữ " +"liệu Kerberos. Nó cÅ©ng phải Ä‘ang chạy khi dùng trình kpasswd để thay đổi mật " +"khẩu. Bình thÆ°á»ng, trình ná»n (dæmon) này chạy trong KDC chính." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "Tạo cấu hình KDC Kerberos dùng debconf không?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "" +"Nhiá»u nÆ¡i Mạng sẽ muốn cho phép tập lệnh này tá»± Ä‘á»™ng tạo tập tin cấu hình " +"KDC Kerberos trong «/etc/krb5kdc». Mặc định là má»™t mẫu thí dụ sẽ được sao " +"chép vào thÆ° mục này vá»›i các tham số địa phÆ°Æ¡ng được nhập. Má»™t số nÆ¡i Mạng " +"có haÌ£ tầng cÆ¡ sở có quản lý được cấu hình Kerberos của chúng, thì sẽ muốn vô " +"hiệu hóa thay Ä‘á»—i cấu hình tá»± Ä‘á»™ng nào." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "tắt, đầy đủ, không xác thức trÆ°á»›c, không có" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Chế Ä‘á»™ tÆ°Æ¡ng thích Kerberos cần dùng:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "" +"Mặc định là yêu cầu Kerberos được cho phép từ Ä‘iá»u chính không cần đến xác " +"thá»±c trÆ°á»›c. Làm nhÆ° thế cho phép có dịch vụ Kerberos4 còn cần đến phần lá»›n " +"ngÆ°á»i dùng sá»­ dụng trình khách Kerberos5 để lấy vé ban đầu. Sau đó, có thể " +"chuyển đổi những vé ấy sang vé loại Kerberos4. Hoặc có thể lập chế Ä‘á»™ «đầy " +"đủ», mà cho phép Kerberos4 lấy vé ban đầu, kể cả khi thÆ°á»ng cần đến xác thá»±c " +"trÆ°á»›c. Hoặc có thể lập chế Ä‘á»™ «Tắt» mà vô hiệu hóa sá»± há»— trợ Kerberos nào." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "Chạy má»™t krb524d không?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "" +"Krb524d là má»™t trình ná»n chuyển đổi vé Kerberos5 sang Kerberos4 cho trình " +"krb524init. Nếu bạn có bật Kerberos bằng cách nào, thì rất có thể là bạn nên " +"chạy trình này. Nhất là khi Ä‘á»™ tÆ°Æ¡ng thích Kerberos4 là lập «không xác thá»±c " +"trÆ°á»›c», krb524d là quan trá»ng nếu bạn có dịch vụ Kerberos nào." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "Nên tẩy dữ liệu cÅ©ng vá»›i những tập tin gói tin không?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Mặc định là tẩy gói này sẽ không xóa bá» cÆ¡ sở dữ liệu KDC trong «/var/lib/" +"krb5kdc/principal», vì không thể phục hồi cÆ¡ sở dữ liệu này má»™t khi nó bị " +"xóa bá». Nếu bạn muốn xóa bá» cÆ¡ sở dữ liệu KDC của bạn khi tẩy gói, và hiểu " +"rằng tẩy gói này sẽ cÅ©ng xóa bỠ• má»i tài khoản và mật khẩu của ngÆ°á»i dùng • " +"trong KDC, hãy hiệu lá»±c tùy chá»n này." --- krb5-1.4.4.orig/debian/po/es.po +++ krb5-1.4.4/debian/po/es.po @@ -0,0 +1,134 @@ +# +# +# +msgid "" +msgstr "" +"Project-Id-Version: krb5-es\n" +"Report-Msgid-Bugs-To: hartmans@debian.org\n" +"POT-Creation-Date: 2006-11-05 20:30-0800\n" +"PO-Revision-Date: 2006-12-13 22:20+0100\n" +"Last-Translator: Fernando Cerezal López \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "Setting up a Kerberos Realm" +msgstr "Configurar un entorno Kerberos" + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"This package contains the administrative tools necessary to run on the " +"Kerberos master server. However, installing this package does not " +"automatically set up a Kerberos realm. Doing so requires entering passwords " +"and as such is not well-suited for package installation. To create the " +"realm, run the krb5_newrealm command. You may also wish to read /usr/share/" +"doc/krb5-kdc/README.KDC and the administration guide found in the krb5-doc " +"package." +msgstr "Este paquete contiene las herramientas administrativas necesarias para ejecutar en el servidor maestro de Kerberos. Sin embargo, la instalación de este paquete no configura automáticamente un entorno Kerberos. Hacerlo requiere introducir contraseñas y esto no es muy apropiado en la instalación del paquete. Para crear el entorno, ejecute la orden «krb5_newrealm». Puede que también desee leer «usr/share/doc/krb5-kdc/README.KDC» y la guía de administración que puede encontrar en el paquete krb5-doc." + +#. Type: note +#. Description +#: ../krb5-admin-server.templates:1001 +msgid "" +"Don't forget to set up DNS information so your clients can find your KDC and " +"admin servers. Doing so is documented in the administration guide." +msgstr "No olvide configurar la información de DNS de forma que sus clientes puedan encontrar su KDC y servidores de administración. La guía de administración documenta cómo hacerlo." + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "Run the Kerberos5 administration daemon (kadmind)?" +msgstr "¿Desea ejecutar el demonio de administración de Kerberos5 (kadmind)?" + +#. Type: boolean +#. Description +#: ../krb5-admin-server.templates:2001 +msgid "" +"Kadmind serves requests to add/modify/remove principals in the Kerberos " +"database. It also must be running for the kpasswd program to be used to " +"change passwords. Normally, this daemon runs on the master KDC." +msgstr "" +"Kadmind sirve las peticiones para añadir, modificar o eliminar principales en la base de datos de Kerberos. También debe estar ejecutándose para que se pueda usar el programa «kpasswd» para cambiar contraseñas. Normalmente, este demonio se ejecuta en el KDC maestro." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "Create Kerberos KDC Configuration with debconf?" +msgstr "¿Crear la configuración del KDC de Kerberos con debconf?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:1001 +msgid "" +"Many sites will wish to have this script automatically create Kerberos KDC " +"configuration files in /etc/krb5kdc. By default an example template will be " +"copied into this directory with local parameters filled in. Some sites who " +"already have infrastructure to manage their own Kerberos configuration will " +"wish to disable any automatic configuration changes." +msgstr "Algunos sitios pueden querer que este script cree automáticamente los archivos de configuración del KDC de Kerberos en «/etc/krb5kdc». Por omisión, se copiará una plantilla de ejemplo en este directorio, rellenándolo con los parámetros locales. Algunos sitios que ya tengan una infraestructura para gestionar su propia·configuración de Kerberos querrán deshabilitar cualquier cambio automático de la configuración." + +#. Type: select +#. Choices +#: ../krb5-kdc.templates:2001 +msgid "disable, full, nopreauth, none" +msgstr "deshabilitado, completo, sinpreaut, ninguno" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "Kerberos4 compatibility mode to use:" +msgstr "Modo de compatibilidad con Kerberos4 a utilizar:" + +#. Type: select +#. Description +#: ../krb5-kdc.templates:2002 +msgid "" +"By default, Kerberos4 requests are allowed from principals that do not " +"require preauthentication. This allows Kerberos4 services to exist while " +"requiring most users to use Kerberos5 clients to get their initial tickets. " +"These tickets can then be converted to Kerberos4 tickets. Alternatively, " +"the mode can be set to full, allowing Kerberos4 to get initial tickets even " +"when preauthentication would normally be required, or to disable, which will " +"disable all Kerberos4 support." +msgstr "Por omisión, se permiten las peticiones Kerberos4 desde los principales que no necesitan preautenticación. Esto permite que los servicios de Kerberos4 existan mientras se solicita a la mayoría de los usuarios que usen clientes Kerberos5 para obtener sus «tickets» iniciales. Estos «tickets» se pueden convertir entonces a «tickets» de Kerberos4. De forma alternativa, se puede establecer el modo a completo, permitiendo a Kerberos4 obtener «tickets» iniciales incluso cuando normalmente sería necesaria la preautenticación , o a deshabilitado, lo que deshabilitará todo el soporte de Kerberos4." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "Run a krb524d?" +msgstr "¿Ejecutar un «krb524d»?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:3001 +msgid "" +"Krb524d is a daemon that converts Kerberos5 tickets into Kerberos4 tickets " +"for the krb524init program. If you have Kerberos4 enabled at all, then you " +"probably want to run this program. Especially when Kerberos4 compatibility " +"is set to nopreauth, krb524d is important if you have any Kerberos4 services." +msgstr "Krb524d es un demonio que convierte los «tickets» de Kerberos5 a «tickets» de Kerberos4 para el programa krb524init. Si tiene activado Kerberos4, entonces probablemente quiera ejecutar este programa. krb524d es importante si tiene cualquier servicio de Kerberos4, especialmente cuando al compatibilidad con Kerberos4 está establecida a «sinpreaut»." + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "Should the data be purged as well as the package files?" +msgstr "¿Deberían purgarse los datos al igual que los archivos del paquete?" + +#. Type: boolean +#. Description +#: ../krb5-kdc.templates:4001 +msgid "" +"By default, purging this package will not delete the KDC database in /var/" +"lib/krb5kdc/principal since this database cannot be recovered once it is " +"deleted. If you wish to delete your KDC database when this package is " +"purged, knowing that purging this package will then mean deleting all of the " +"user accounts and passwords in the KDC, enable this option." +msgstr "" +"Por omisión, purgar este paquete no borrará la base de datos KDC en «/var/lib/krb5kdc/principal», ya que esta base de datos no se puede recuperar una vez se halla borrado. Active esta opción si desea borrar su base de datos del KDC cuando se purgue este paquete, sabiendo que purgar este paquete significará borrar todas las cuentas de usuario y contraseñas en el KDC." + --- krb5-1.4.4.orig/debian/krb5-ftpd.postinst +++ krb5-1.4.4/debian/krb5-ftpd.postinst @@ -0,0 +1,10 @@ +#!/bin/sh -e +# $Id: krb5-ftpd.postinst,v 1.1 2000/10/26 01:31:46 hartmans Exp $ + +if [ "$1" = configure ] && [ -z "$2" ]; then + update-inetd --group Kerberos --add 'ftp\t\tstream\ttcp\tnowait\troot\t/usr/sbin/tcpd\t/usr/sbin/ftpd -a' +else + update-inetd --enable ftp +fi + +#DEBHELPER# --- krb5-1.4.4.orig/debian/changelog +++ krb5-1.4.4/debian/changelog @@ -0,0 +1,901 @@ +krb5 (1.4.4-5ubuntu3.4) feisty-security; urgency=low + + * SECURITY UPDATE: arbitrary code execution via freed pointer and memory + overflows. + * src/kdc/{kerberos_v4,dispatch,network}.c: backported upstream fixes + patched inline (MITKRB5-SA-2008-001: CVE-2008-0062, CVE-2008-0063). + * src/lib/rpc/{svc,svc_tcp}.c: upstream fixed patched inline + (MITKRB5-SA-2008-002: CVE-2008-0947) + + -- Kees Cook Tue, 18 Mar 2008 11:07:13 -0700 + +krb5 (1.4.4-5ubuntu3.3) feisty-security; urgency=low + + * SECURITY UPDATE: 32 byte stack overflow in rpcsec_gss. + * src/lib/rpc/svc_auth_gss.c: new upstream changes, patched inline. + * References + MIT-SA-2007-06 + CVE-2007-4743 + + -- Kees Cook Thu, 06 Sep 2007 15:17:40 -0700 + +krb5 (1.4.4-5ubuntu3.2) feisty-security; urgency=low + + * SECURITY UPDATE: stack overflow in rpcsec_gss. + * src/lib/rpc/svc_auth_gss.c: upstream changes patched inline. + * References + MIT-SA-2007-06 + CVE-2007-3999 + + -- Kees Cook Tue, 04 Sep 2007 11:47:32 -0700 + +krb5 (1.4.4-5ubuntu3.1) feisty-security; urgency=low + + * SECURITY UPDATE: multiple remote code execution vectors. + * src/lib/rpc/svc_auth_{gssapi,unix}.c: backported upstream fixes for + MITKRB5-SA-2007-004 (CVE-2007-2442, CVE-2007-2443). + * src/kadmin/server/server_stubs.c: backported upstream fixes for + MITKRB5-SA-2007-005 (CVE-2007-2798). + + -- Kees Cook Tue, 19 Jun 2007 15:27:34 -0700 + +krb5 (1.4.4-5ubuntu3) feisty; urgency=low + + * SECURITY UPDATE: arbitrary login via telnet, arbitrary code execution + via syslog buffer overflows, and heap corruption via GSS api. + * src/appl/telnet/telnetd/{state,sys_term}.c: MIT-SA-2007-1 fix from + upstream (CVE-2007-0956). + * src/lib/kadm5/logger.c: MIT-SA-2007-2 fix from Debian, based on + upstream fixes (CVE-2007-0957). + * src/lib/gssapi/krb5/k5unseal.c: MIT-SA-2007-3 fix from upstream + (CVE-2007-1216). + + -- Kees Cook Tue, 3 Apr 2007 15:34:58 -0700 + +krb5 (1.4.4-5ubuntu2) feisty; urgency=low + + * SECURITY UPDATE: Remote privilege escalation. + * src/lib/rpc/svc.c: + - Do not call an uninitialized pointer. + - Patch provided by upstream. + - References: + CVE-2006-6143 + http://web.mit.edu/kerberos/www/advisories/MITKRB5-SA-2006-002-rpc.txt + + -- Martin Pitt Mon, 15 Jan 2007 15:01:52 +0100 + +krb5 (1.4.4-5ubuntu1) feisty; urgency=low + + * Merge from debian unstable, remaining changes: + - Change netbase dependencies to update-inetd dependencies as + update-inetd is its own package now. + + -- Andrew Mitchell Wed, 20 Dec 2006 23:52:38 +1300 + +krb5 (1.4.4-5) unstable; urgency=low + + * Translation updates: + - New Spanish translation, thanks Fernando Cerezal. (Closes: #402986) + + -- Russ Allbery Sun, 17 Dec 2006 17:18:05 -0800 + +krb5 (1.4.4-4ubuntu1) feisty; urgency=low + + * Change netbase dependencies to update-inetd dependencies as + update-inetd is its own package now. + + -- Tollef Fog Heen Thu, 14 Dec 2006 11:28:40 +0100 + +krb5 (1.4.4-4) unstable; urgency=low + + * Remove the check for pthread_mutexattr_setrobust_np in the thread + initialization code. This was only needed on Solaris 9 and has been + removed upstream, and was causing FTBFS with glibc 2.5. Thanks, + Martin Pitt. (Closes: #396166) + * Translation updates: + - New Romanian translation, thanks stan ioan-eugen. (Closes: #395347) + + -- Russ Allbery Sun, 5 Nov 2006 21:32:17 -0800 + +krb5 (1.4.4-3) unstable; urgency=low + + * Don't require the presence of debconf during the postrm. Thanks to + Bill Allombert for the report. (Closes: #388784) + * Fix uses of hyphens instead of minus signs in the man pages. + + -- Russ Allbery Fri, 22 Sep 2006 14:57:34 -0700 + +krb5 (1.4.4-2) unstable; urgency=low + + * Patch from Alejandro R. Sedeno to allow 32-bit and 64-bit krb4 ticket + files to be used on the same system. Similar to a patch included in + MIT Kerberos 1.5 but backported because of missing byte order macros. + + -- Sam Hartman Wed, 20 Sep 2006 22:51:59 -0400 + +krb5 (1.4.4-1) unstable; urgency=low + + * New upstream release. + * Stop using --exec to start and stop services since then services will + not be stopped properly during an upgrade. (Closes: #385039) + * Rewrite the init scripts to include LSB information and to use the LSB + logging functions. krb5-kdc and krb5-admin-server now depend on + lsb-base (>= 3.0-6) for the LSB functions. + + -- Russ Allbery Fri, 1 Sep 2006 20:45:59 -0700 + +krb5 (1.4.4~beta1-1) unstable; urgency=low + + * New upstream version including several memory leak fixes + * Install upstream changelog + + -- Sam Hartman Wed, 16 Aug 2006 16:45:56 -0400 + +krb5 (1.4.3-9) unstable; urgency=high + + * Add error checking to setuid, setreuid to avoid local privilege + escalation ; fixes krb5-sa-2006-1, CVE-2006-3084, CVE-2006-3083 + * Update standards version to 3.7.2 (no changes required). + * Translation updates. + - Russian, thanks Yuri Kozlov. (Closes: #380303) + + -- Sam Hartman Sun, 6 Aug 2006 17:12:40 -0400 + +krb5 (1.4.3-8) unstable; urgency=low + + * Defer seeding of the random number generator in kadmind until after + forking and backgrounding, since otherwise blocking on /dev/random may + block system startup. (Closes: #364308) + * Update config.{guess,sub}. (Closes: #373727) + * Better fix for error handling of a zero-length keytab. Thanks, + Rainer Weikusat. + + -- Russ Allbery Sun, 16 Jul 2006 08:59:20 -0700 + +krb5 (1.4.3-7) unstable; urgency=low + + * Fix double free caused by a zero-length keytab. Thanks, Steve + Langasek. (Closes: #344295) + * Fix segfault in krb5_kuserok if the local name doesn't correspond to a + local account. (Discovered in bug #354133.) + * Build a separate libkrb5-dbg package containing the detached debugging + information for libkrb53 and libkadm55. + * Update debhelper compatibility level to V5 since the dh_strip behavior + around debug packages changes in V5 and we should use the current + interface from the beginning. + * Translation updates. + - Dutch, thanks Vincent Zweije. (Closes: #360444) + - Galician, thanks Jacobo Tarrio. (Closes: #361809) + + -- Russ Allbery Sat, 15 Apr 2006 16:22:01 -0700 + +krb5 (1.4.3-6) unstable; urgency=low + + * Assume krb5 in krb5_gss_canonicalize_name if the null mechanism is + passed in. Fixes a segfault in racoon from ipsec-tools. Thanks, + Daniel Kahn Gillmor. (Closes: #351877) + * v5passwdd is gone, so remove the debconf template, the prompts, and + the code to start and stop it from the init script. Thanks, Greg + Folkert. + * Fix incorrect option names in krb5.conf(5). Thanks, Martin v. + Loewis. (Closes: #347643) + * Translation updates. + - Danish, thanks Claus Hindsgaul. (Closes: #350041) + + -- Russ Allbery Tue, 21 Feb 2006 23:25:34 -0800 + +krb5 (1.4.3-5) unstable; urgency=medium + + * Configure with --enable-shared --enable-static so that libkrb5-dev + gets static libraries. + * Fix double free in getting credentials, Closes: #344543 + + -- Sam Hartman Sun, 25 Dec 2005 21:59:47 -0500 + +krb5 (1.4.3-4) unstable; urgency=high + + * Fix problem when libpthreads is dynamically loaded into a program + causing mutexes to sometimes be used and sometimes not be used. If + the library starts out without threads support it will never start + using threads support; doing anything else causes hangs. + + -- Sam Hartman Fri, 16 Dec 2005 18:16:53 -0500 + +krb5 (1.4.3-3) unstable; urgency=low + + * Additional internal pthread symbols have to be declared weak on Hurd. + Thanks, Michael Banck. (Closes: #341608) + * Build on GNU/kFreeBSD. Thanks, Petr Salinger. (Closes: #261712) + * Change the default KDC enctype to 3DES to match upstream (the + difference was probably a mismerge). + * Remove /etc/default/krb5-admin-server on purge. (Closes: #333161) + * Document the behavior of klogind and kshd if the user has no .k5login + file. Remove vestigial .rhosts references. (Closes: #250966) + * Document krb5-rsh-server authorization defaults in README.Debian. + * Enable kinit -a to match the man page. (Closes: #232431) + * Remove the patch to tightly bind libkrb4 to libdes425. This should no + longer be necessary with symbol versioning. + * Upstream has removed the file with questionable licensing, so the + upstream tarball is no longer repacked. Remove the get-orig-source + target in debian/rules and the notes in copyright and README.Debian. + * Add a watch file. + * Translation updates. + - German, thanks jens. (Closes: #330925) + + -- Russ Allbery Sun, 4 Dec 2005 11:37:40 -0800 + +krb5 (1.4.3-2) unstable; urgency=low + + * Conflict with libauthen-krb5-perl (<< 1.4-5) because of krb5_init_ets. + * Update uploader address. + * Conflict with libapache-mod-auth-kerb because it accesses library + internals in a way that breaks. + + -- Sam Hartman Wed, 30 Nov 2005 22:33:47 -0500 + +krb5 (1.4.3-1) experimental; urgency=low + + * New upstream release. + * Install ac_check_krb5 for use by aclocal. + + -- Sam Hartman Sat, 19 Nov 2005 16:20:56 -0500 + +krb5 (1.4.2-1) UNRELEASED; urgency=low + + * New upstream version. (Closes: #293077) + - kadmind4, v5passwdd, and v5passwd are no longer included. + - Increase the libkrb53 shlibs version dependency. Programs linked + against this version will not work with an older libkrb53. + - Rebuild should fix link problems on powerpc. (Closes: #329709) + * Re-enable optimization on m68k to stop hiding the toolchain problem. + * Don't build crypto code -O3. It uncovers too many gcc bugs. + * Fix compilation on Hurd. Thanks, Michael Banck. (Closes: #324305) + * Always initialize the output token in gss_init_sec_context, even with + an unknown mechanism. (Closes: #311977) + * rcp should fall back to /usr/bin/netkit-rcp, not /usr/bin/rpc. + * Add the missing shared library depends for libkadm55. + * Use dh_install rather than dh_movefiles and enable --fail-missing to + be sure to pick up any new upstream files. + * Avoid test -a in maintainer scripts. + * Expand and reformat the documentation and sample kdc.conf file. + * Add a doc-base file for the krb425 migration guide. + * Ignore lintian warnings about the library package names. We'll fix + them the next time upstream changes SONAMEs. + * Conflict with packages that used internal symbols not part of the + public ABI + * Use "MIT Kerberos" rather than krb5 in the krb5-doc short description. + * Remove the saved patches that have been applied upstream or are no + longer applied to the package, update the remaining patches, and move + them into debian/patches. + * Break out the other patches of interest for ease submitting them + upstream. + * Translation updates. + - Vietnamese, thanks Clytie Siddall. (Closes: #319704) + + -- Russ Allbery Thu, 22 Sep 2005 17:08:58 -0700 + +krb5 (1.3.6-5) unstable; urgency=high + + * Disable optimization on m68k to attempt to work around a gcc 4.0 bug. + + -- Russ Allbery Sun, 14 Aug 2005 22:26:00 -0700 + +krb5 (1.3.6-4) unstable; urgency=high + + [ Russ Allbery ] + * Fix a mistake in variable names that caused the package to be built + without optimization. + * Allow whitespace before comments in krb5.conf. Thanks, Jeremie + Koenig. (Closes: #314609) + * GCC 4.0 compile fixes, thanks Daniel Schepler. (Closes: #315618) + * Avoid "say yes" in debconf templates. (Closes: #306883) + * Update Czech translation, thanks Miroslav Kure. + * Update French translation, thanks Christian Perrier. (Closes: #307748) + * Update Portuguese (Brazil) translation, thanks André Luís Lopes. + * New Vietnamese translation, thanks Clytie Siddall. (Closes: #312172) + * Update standards version to 3.6.2 (no changes required). + * DAK can now handle not repeating maintainers in uploaders. + + [ Sam Hartman ] + * Fix double free in krb5_recvauth; critical because it is in the code + path for kpropd and may allow arbitrary code execution. + (CAN-2005-1689) + * krb5_unparse_name overflows allocated storage by one byte on 0 element + principal name. (CAN-2005-1175, VU#885830) + * Do not free unallocated storage in the KDC's TCP request handling + path. (CAN-2005-1174, VU#259798) + + -- Sam Hartman Tue, 12 Jul 2005 15:45:14 -0400 + +krb5 (1.3.6-3) unstable; urgency=low + + * krb5-kdc: Install a commented-out line for kpropd with update-inetd. + Add dependency on netbase for update-inetd. (Closes: #293182) + * krb5-kdc: Ask with debconf whether the user wishes to delete the KDC + database on purge, modelled after how postgresql handles the same + situation. (Closes: #289358) + * Close leak in the arcfour crypto support. Thanks, fumihiko kakuma. + (Closes: #244595) + * krb5-config should never return -I/usr/include. (Closes: #165521) + * Write manual pages for fakeka, krb524init, kadmind4, and v5passwdd. + Backport from upstream the manual pages for krb5-config and krb524d. + (Closes: #78953, #96437) + * Fix paths in manual pages to match the Debian defaults. Fix service + in the inetd.conf example in the kpropd man page to work with Debian + /etc/services. (Closes: #157736) + * Fix references to kerberos(1) in the rlogin and kinit man pages and + include kerberos.1 in krb5-doc. (Closes: #154381, #154384) + * Add more detailed information about each package to the extended + descriptions. (Closes: #135517) + * krb5-doc: Include info pages. (Closes: #292512) + * krb5-doc: Fix two minor variable name problems in the texinfo docs. + * Let dh_installdebconf set the debconf dependency. + * Update standards version to 3.6.1. + - Support noopt in DEB_BUILD_OPTIONS. + - Let debhelper take care of calling ldconfig appropriately. + - Remove calls to dh_undocumented. + - Remove lintian overrides for links to the undocumented man page. + - Install kdc.conf template in /usr/share/krb5-kdc rather than + /usr/share/krb5 (policy 10.7.3 states the directory should be named + after the package). + - Symlink the kdc.conf template to /usr/share/doc/krb5-kdc/examples + per policy 10.7.3 since it's also a useful example. + * Update debhelper compatibility level to V4. + - Remove all *.conffiles control files. They're no longer needed. + * rules generally cleaned up. Commented out and unused debhelper programs + removed as the set being run wasn't comprehensive anyway. Invocation + order now matches the debhelper examples. + * Removed (s) from copyright to make lintian happier. + * Removed unnecessary lintian override for libkrb53. + * Add lintian overrides for the duplicate dependencies on krb5 libraries. + + -- Russ Allbery Sat, 16 Apr 2005 14:12:08 -0700 + +krb5 (1.3.6-2) unstable; urgency=high + + * Package priority to standard + * Fix buffer overflow in slc_add_reply in telnet.c (CAN-2005-0469) + * Fix telnet.c env_opt_add buffer overflow (CAN-2005-0468) + * Note that both of these vulnerabilities are client-side + vulnerabilities that can be exploited only by a server. + + -- Sam Hartman Sun, 3 Apr 2005 23:49:08 -0400 + +krb5 (1.3.6-1) unstable; urgency=medium + + * New upstream version + * Changing a password afwter the size of password history has been + reduced may double free or write past end of an arry; fix + (CAN-2004-1189 / CERT VU#948033) + * Conflict between krb5-kdc and kerberos4kth-kdc; also deals with + krb5-admin-server conflict indirectly, Closes: #274763 + + -- Sam Hartman Sun, 2 Jan 2005 15:55:25 -0500 + +krb5 (1.3.5-1) unstable; urgency=low + + * New pt_br debconf translation, Cluses: #278734 + * New upstream version + * Part of the fix to #261712: allow ftpd to build on gnu/bsd + + -- Sam Hartman Fri, 26 Nov 2004 18:44:02 -0500 + +krb5 (1.3.4-4) unstable; urgency=high + + * Fix what is hopefully the last remnant of the patch to gettextize the + debconf without making the code consistent, thanks Thimo Neubauer, + Closes: #271456 + * Fix krb5_newrealm man page to better describe dependencies, thanks + Rachel Elizabeth Dillon , Closes: #269685 + + -- Sam Hartman Mon, 13 Sep 2004 11:36:38 -0400 + +krb5 (1.3.4-3) unstable; urgency=high + + * Initial Czech translations thanks to Miroslav Kure, Closes: #264366 + * Updated French debconf translation, thanks Martin Quinson, Closes: #264941 + * KDC and clients double-free on error conditions (CAN-2004-0642 VU#795632) + *krb5_rd_cred() double-frees on error conditions(CAN-2004-0643 , CERT + VU#866472 ) + * ASN.1 decoder in MIT Kerberos 5 releases krb5-1.3.4 and + earlier allows unauthenticated remote attackers to induce + infinite loop, causing denial of service, including in KDC + code (CAN-2004-0644 , CERT VU#550464) + * Fix double free in krb524d handling of encrypted ticket contents + (CAN-2004-0772) + + -- Sam Hartman Tue, 31 Aug 2004 13:04:51 -0400 + +krb5 (1.3.4-2) unstable; urgency=low + + * Fix doc-base files, Closes: #262916 + + -- Sam Hartman Wed, 4 Aug 2004 13:08:53 -0400 + +krb5 (1.3.4-1) unstable; urgency=low + + * New upstream version + * Update krb5-doc to include pointers to the right html documents, + Closes: #203321 + * Patches to find res_search on amd64 and to include new Debian ports in + shared library building, Closes: #261712 + * Install default file for krb5-admin-server, Closes: #262428 + * Patch from Russ Allbery to only prompt for a password once in krb4 + when null is passed in to krb_get_in_pw_tkt, Closes: #262192 + * New pt_br translation, thanks Andre Luis Lopes, Closes: #254115 + * New French translation, thanks Christian Perrier, closes: #253685 + + -- Sam Hartman Sat, 31 Jul 2004 12:12:44 -0400 + +krb5 (1.3.3-2) unstable; urgency=high + + * Fix buffer overflow in krb5_aname_to_localname; potential remote root + exploit in some fairly limited circumstances. You are not vulnerable + unless you have enabled aname_to_lname rules in krb5.conf (CAN-2004-0523) + * Fix kadmind template formatting, thanks Christian Perrier + + -- Sam Hartman Sat, 5 Jun 2004 16:57:44 -0400 + +krb5 (1.3.3-1) unstable; urgency=low + + * New upstream version + * Gettextize my debconf templates, thanks Martin Quinson , Closes: + #236176 + * Don't remove /etc/krb5.conf on libkrb53 purge + + -- Sam Hartman Tue, 13 Apr 2004 20:04:37 -0400 + +krb5 (1.3.2-2) unstable; urgency=low + + * Don't check for /etc/krb5kdc/kadm5.keytab, Closes: #235966 + * Fix dangling symlink, Closes: #203622 + + -- Sam Hartman Sun, 14 Mar 2004 20:46:27 -0500 + +krb5 (1.3.2-1) unstable; urgency=low + + * New Upstream Release, Closes: #223485 + * Includes upstream patch to ignore unknown address families, Closes: #206851 + * Include note that encrypted services are not enabled, Closes: #232115 + * Up shlib deps because of new features in auth context + + -- Sam Hartman Sun, 29 Feb 2004 09:36:27 -0500 + +krb5 (1.3-3) unstable; urgency=low + + * Don't clear the key schedule so krb4 callers can use it, Closes: #203566 + * Use alternatives system for rcp, Closes: #218392 + + -- Sam Hartman Tue, 3 Feb 2004 14:07:12 -0500 + +krb5 (1.3-2) unstable; urgency=low + + * Include patch to MIT Bug #1681, an incompatible change to etype_info2. + This change will break clients between 1.3 beta1 and 1.3-1 talking to + 1.3-2 KDCs, but is necessary because of a protocol bug. + + -- Sam Hartman Thu, 24 Jul 2003 13:32:33 -0400 + +krb5 (1.3-1) unstable; urgency=medium + + * New upstream version--finally 1.3 is released, Closes: #199573 + * Don't depend on com_err in libcrypto, Closes: #201005 + * Urgency is medium because the only code change is removing a single + call to com_err and this package not being in testing is blocking + other packages. The beta has been in unstable more than 10 days. + * Update shlibs again to avoid long-term references to a beta in the archive + + -- Sam Hartman Sat, 19 Jul 2003 15:19:38 -0400 + +krb5 (1.2.99-1.3.beta5-1) unstable; urgency=low + + * New upstream version + + -- Sam Hartman Sat, 5 Jul 2003 21:29:44 -0400 + +krb5 (1.2.99-1.3.beta4-1) unstable; urgency=low + + * Fix rpath on generated binaries and in krb5-config, Closes: #198124 + * Fix build-depends to require comerr-dev with correct shlibs, + Closes: #197650 + * New upstream version + * Don't generate /etc/krb5kdc/kadm5.keytab as 1.3 does not require it + except for kadmind4 + + -- Sam Hartman Fri, 20 Jun 2003 17:37:15 -0400 + +krb5 (1.2.99-1.3.beta3-4) unstable; urgency=low + + * Add replaces for libkadm55 on libkrb53 + + -- Sam Hartman Wed, 11 Jun 2003 16:41:16 -0400 + +krb5 (1.2.99-1.3.beta3-3) unstable; urgency=low + + * One more try at avoiding autoconf dependency + + -- Sam Hartman Wed, 11 Jun 2003 03:04:56 -0400 + +krb5 (1.2.99-1.3.beta3-2) unstable; urgency=low + + * Touch some more files to defeat autoheader + + -- Sam Hartman Tue, 10 Jun 2003 23:55:08 -0400 + +krb5 (1.2.99-1.3.beta3-1) unstable; urgency=low + + * Fix dh_makeshlibs call so dependencies are correct + * New upstream version + * Patch from Steve Langasek for versioned symbols; adapted to + better fit the build system and to work for all libraries + * This version builds with GCC 3.3, Closes: #195571 + * Move the rest of the administration libraries into libkadm55 to reduce + space required by libkrb53. + * libkrb53 conflicts with current openafs-krb5 because of ABI changes in + krb524 + + -- Sam Hartman Tue, 10 Jun 2003 20:56:33 -0400 + +krb5 (1.2.99-1.3.beta2-1) experimental; urgency=low + + * New upstream version + * Include a patch from upstream CVS (post beta2) to fix renewable tickets. + + -- Sam Hartman Sun, 1 Jun 2003 00:30:35 -0400 + +krb5 (1.2.99-1.3.beta1-1) experimental; urgency=low + + * New upstream pre-release + * Update copyright + * Add db_stop calls to krb5-kdc.postinst and krb5-admin-server.postinst + * Install a fakeka binary + * Install libkrb524.a even though upstream does not + * kdc defaults to no v4 support per upstream change. + + -- Sam Hartman Thu, 15 May 2003 11:37:10 -0400 + +krb5 (1.2.99-1.3.alpha3-1) experimental; urgency=low + + * New upstream pre-release + - ftp no longer segfaults on wildcards, Closes: #175495 + - Clock skew is returned on clock skew with preauth, Closes: #98855 + - Preauthentication has been reworked to improve interoperability with + older implementations and to comply with Kerberos Clarifications, + Closes: #169014 + - Typo in man page fixed, Closes: #127302 + * Remove dangling symlink, Closes: #133244 + * Depend on sufficiently new com_err and libss + * Build the crypto library -O9 as it seems to help performance a lot. + * Bump up shared library versions; all the public libraries have new + functions + + -- Sam Hartman Mon, 12 May 2003 02:22:37 -0400 + +krb5 (1.2.7-3) unstable; urgency=high + + * Patch for CERT VU#623217 and VU#442569: Cryptographic weaknesses in + Kerberos 4 + - Add -X option to krb5kdc and krb524d. By default cross-realm is + no longer supported for krb4 as it is a security hole. + - Add protection to isolate krb5 keys from krb4 especially for the + TGS key + - Remove support for the MIT extension to krb4 to use 3DES keys as it + is insecure. + * Patch to various DOS issues where the KDC assumes principal names have + certain components. Fixes CAN-2003-0072 + * VU#516825: Additional errors in XDR that may lead to denial of + service. + * Fix template bug in v5passwd template, Closes: #172565 + + -- Sam Hartman Tue, 25 Mar 2003 08:03:00 -0500 + +krb5 (1.2.7-2) unstable; urgency=low + + * Remove declaration of errno from krb.h + + -- Sam Hartman Mon, 6 Jan 2003 15:38:20 -0500 + +krb5 (1.2.7-1) unstable; urgency=high + + * New upstream version + * Still urgency high until the kadmin4 fix gets into testing + * Don't declare errno so glibc will be happy; applying upstream as well, + Closes :#168528 + * Remove pidfile argument from start-stop-daemon call for restarting + krb5kdc so it actually works, Closes: #174881 + + -- Sam Hartman Sun, 5 Jan 2003 18:00:55 -0500 + +krb5 (1.2.6-2) unstable; urgency=high + + * Security fix for buffer overflow in kadmind4 (mitsa-2002-2) + * If bison is too good for yacc compatibility then we're to good for + bison, Closes: #165655 + * Include readme.debian if we're going to reference it, Closes: #166399 + * Fix readme.debian comments to be correct + + -- Sam Hartman Sat, 26 Oct 2002 17:18:41 -0400 + +krb5 (1.2.6-1) unstable; urgency=low + + * New upstream version + * Important: upstream has introduced a new way of handling AFS tickets + within krb524d; long-term this may allow the use of ticket keys other + than DES with AFS, but short-term this will break AFS because OpenAFS + has not yet released servers that support the new mechanism. If you + run AFS servers and don't want them to break, please look at README.debian + * This includes a fix for 162794 as that is now in the upstream + * For now, libkrb5-dev is going to be priority extra. If anyone + complains I'll attempt to fight the comerr-dev dependency battle; + honestly I think comerr-dev is common enough and on enough systems + that it rates optional but the maintainer does not, Closes: #145165 + * Fix restart to restart krb524d, Closes: #162477 + + + -- Sam Hartman Sun, 6 Oct 2002 16:40:44 -0400 + +krb5 (1.2.5-3) unstable; urgency=high + + * Try to fix diversion handling for real this time, Closes: #155514 + + -- Sam Hartman Mon, 5 Aug 2002 13:40:53 -0400 + +krb5 (1.2.5-2) unstable; urgency=high + + * We are still installing a krb5.conf.template; don't as that is + kerberos-configs's job. + * The MIT KDC was not sending etype info padata; this couldcreate a + problem if you require preauth and have unusual salts; patch from + upstream CVS + * Add readme to krb5-user, Closes: #152670 + * Fix typo in alternatives handling so man page symlinks are handled + correctely, Closes: #152707 + * Include XDR encoding patch for krb5-sa-2002-01; same patch as the + woody security update + + -- Sam Hartman Sat, 3 Aug 2002 17:51:50 -0400 + +krb5 (1.2.5-1) unstable; urgency=low + + * New upstream version; not really any patches that will actually + affect Debian at all, as we pulled them into 1.2.4 packages from + upstream CVS + * Stop shipping patches that upstream has accepted and released + * Update included upstream PGP signature + * Fix diversion handling; it was fairly broken in 1.2.4. All we divert + now is rcp + * Ftp should not be diverted, closes: #146171 + * Fix overly small fixed length buffer in kuserok, closes: #145106 + + -- Sam Hartman Sun, 2 Jun 2002 19:22:39 -0400 + +krb5 (1.2.4-5) unstable; urgency=low + + * Pull up bugfix from 1.2.5 beta1 to src/lib/krb5/asn.1/asn1_get.c + * This should be the last thing we need from 1.2.5; Debian has all the + 1.2.5 changes besides the API reorg. I'm not checking an API reorg + this close to woody release. + + -- Sam Hartman Fri, 12 Apr 2002 12:16:49 -0400 + +krb5 (1.2.4-4) unstable; urgency=low + + * Suggest rather than recommend krb5-user from libkrb53, closes: #140116 + * Fix null pointer dereference in krb5 library; pull patch from 1.2.5 beta1 + + -- Sam Hartman Wed, 10 Apr 2002 14:19:49 -0400 + +krb5 (1.2.4-3) unstable; urgency=medium + + * Move from non-us to main + + -- Sam Hartman Sat, 16 Mar 2002 15:04:44 -0500 + +krb5 (1.2.4-2) unstable; urgency=low + + * Don't respect umask when writing out srvtabs; you always want them + 0600 and if you don't you can chmod later, closes: #135988 + * To work with Heimdal, accept encrypted creds in + gss_accept_sec_context, closes: #135962 + * Fix kadmin ACL bug. Targets (a cool but undocumented ACL feature) + didn't work quite right. They do now. + + -- Sam Hartman Sun, 3 Mar 2002 18:53:40 -0500 + +krb5 (1.2.4-1) unstable; urgency=low + + * Don't check address in krb5_rd_cred; upstream patch also applied to + their CVS, closes: #132226 + * Patch from Ken Raeburn to improve over-the-wire errors from KDC, + included because I happened to be testing it and it seemed to work + * New upstream release + + -- Sam Hartman Fri, 1 Mar 2002 00:44:26 -0500 + +krb5 (1.2.3-2) unstable; urgency=low + + * We want to be able to use krb4 and libssl's libcrypto in the same + program. To do this, we make libkrb4 bind libdes425 -Bsymbolic and we + allow krb_mk_priv and krb_rd_priv to take null schedule arguments. + + -- Sam Hartman Tue, 15 Jan 2002 12:17:40 -0500 + +krb5 (1.2.3-1) unstable; urgency=low + + * New upstream version, closes: #110932 + * Use alternatives for rsh, closes: #122710 + * Major version of libkadm5 bumped; we no longer conflict with heimdal there + + -- Sam hartman Thu, 10 Jan 2002 06:59:13 -0500 + +krb5 (1.2.2-8) unstable; urgency=low + + * Oops, call htons around port numbers in kprop patch + * Register with doc-base, closes: #100463 + * Move krb5.conf and kdc.conf manpages into krb5-doc; krb5-doc now + conflicts with heimdal-docs, closes: #121141 + + -- Sam Hartman Sun, 25 Nov 2001 23:47:35 -0500 + +krb5 (1.2.2-7) unstable; urgency=low + + * Forward only tickets we believe the remote side knows the enctype + of, closes: #99320 + * Start krb5-kdc and krb5-admin-server before RPC services, thanks Hein + Roehrig, closes: #88604 + * Install krb5.conf and kdc.conf man pages in krb5-user. This is not + ideal but installing them in krb5-config won't work as they are + implementation dependent, closes: #109522 + * Install kprop manpage, thanks Steve Langasek, closes: #120040 + * Fix FHS paths with kprop; store files in /var/lib/krb5kdc, thanks + again Steve, closes: #120050 + * Telnet help should open a connection to the host help not give you a + usage message, thanks Graeme Mathieson for a patch + which will be sent upstream, closes: #118730 + * Fix kprop handling of service name. If we can't find what we are + looking for in /etc/services default to the obvious correct answer; + thanks Steve, will commit upstream, closes: #120010 + + -- Sam Hartman Sat, 24 Nov 2001 22:10:16 -0500 + +krb5 (1.2.2-6) unstable; urgency=high + + * Include telnetd security patch for ring buffer issue from upstream + * Conflict with the right Heimdal libs, closes: #103872 + + -- Sam Hartman Wed, 1 Aug 2001 15:19:43 -0400 + +krb5 (1.2.2-5) unstable; urgency=low + + * Use krb5-config; remove our own krb5.conf handling.. Note this is the + krb5-config package for /etc/krb5.conf, not the krb5-config library + helper command. + * + * Conflict with kerberos4kth-services, closes: #93303 + * Update config.guess and config.sub, closes: #97585 + * Have telnetd depend on krb5-rsh-server. I suspect this will make + people grumpy and we need a better fix. Really, Kerberized rlogin is + better than telnetd from a security standpoint, so I'm OK with it for + now. Closes: #96695 + + -- Sam Hartman Wed, 16 May 2001 17:44:47 -0400 + +krb5 (1.2.2-4) unstable; urgency=low + + * Fix shared libraries to build with gcc not ld to properly include + -lgcc symbols, closes: #94407 + + -- Sam Hartman Fri, 20 Apr 2001 02:47:21 -0400 + +krb5 (1.2.2-3) unstable; urgency=high + + * Fix vulnerability with glob call. CERT claims that Linux is not + vulnerable, but I believe the krb5 implementation is. The result of + glob was copied into a fixed-sized buffer. This fixes that + closes: #93689 + * Provide ftp-server not ftpd, closes: #93531 + * Do not link kadm5clnt against kdb5. + + -- Sam Hartman Wed, 11 Apr 2001 19:50:17 -0400 + +krb5 (1.2.2-2) unstable; urgency=low + + * Work to provide an alternative for telnet and to be a telnet-client, + closes: 87914 + * libkrb5-dev depends on comerr-dev, closes: #87489 + * Make clean target remove configure-stamp + + -- Sam Hartman Mon, 5 Mar 2001 08:25:17 -0500 + +krb5 (1.2.2-1) unstable; urgency=low + + * New Upstream version, Closes: #82546 + * Depend on debconf, closes: #87490 + * Fix debconf formatting issue, closes: #84447 + * Create sample ACL file, closes: #84448 + * Fix lintian warnings and override as appropriate + * Upgrade to policy 3.5 moving stuff out of examples. + + -- Sam Hartman Fri, 2 Mar 2001 11:32:06 -0500 + +krb5 (1.2.1-9) unstable; urgency=low + + * Do not use TIOCGLTC anywhere + * Build without TCL, closes: #81977 + * Fix krb5-admin-server restart, closes: #81070 + * With the new dpkg-source, files get diffed in the wrong order for us + to prevent autoconf from getting run just by mangling things and + making sure we change every configure script. So, touch every + configure script in debian/rules. + + -- Sam Hartman Sat, 13 Jan 2001 19:27:37 -0500 + +krb5 (1.2.1-8) unstable; urgency=low + + * Use separate build directory because the source tree supports it and + it works around failures in the upstream clean target, closes: #78954 + * Make sure we modify all the configure scripts since we modify + aclocal.m4 so that time stamps don't cause autoconf to be run. + * Add bison and debhelper as build-depends, closes: #79643 + * New maintainer address + + -- Sam Hartman Sat, 23 Dec 2000 16:20:24 -0500 + +krb5 (1.2.1-7) unstable; urgency=low + + * Do not conflict with libss.a + * Upload to Debian(Closes: BUG#78499) + + -- Sam Hartman Mon, 4 Dec 2000 04:15:50 -0500 + +krb5 (1.2.1-6) unstable; urgency=low + + * Fix kpasswd manpage. + * Split out libkadm5 to avoid Heimdal conflict + + * Conflict with kerberos4kth. + * Remove runpaths from libs and executables. + + -- Sam Hartman Wed, 29 Nov 2000 12:18:22 -0500 + +krb5 (1.2.1-5) unstable; urgency=low + + * If libkrb53 was preconfigured, then krb5.conf could overide explicit + user input. + + -- Sam Hartman Sat, 25 Nov 2000 17:01:26 -0500 + +krb5 (1.2.1-4) unstable; urgency=low + + * Write init.d scripts for kdc and admin server. + * Ask what admin programs to run and what krb4 mode to use. + * Populate initial kdc.conf if needed. + * New script (krb5_newrealm) to set up a Kerberos realm + * Document KDC issues. + * Make libkrb53.config work again so libkrb53 installs + + -- Sam Hartman Sat, 18 Nov 2000 17:22:16 -0500 + +krb5 (1.2.1-3) unstable; urgency=low + + * Add KDC packages + * Install login.krb5 Sadly, it is needed to make forwarded credentials + work. This is unfortunate; it is not a good login program. + + -- Sam Hartman Wed, 8 Nov 2000 16:10:13 -0500 + +krb5 (1.2.1-2) unstable; urgency=low + + * Add copyright and README.debian + * Ship kadmin in krb5-user. + * Add services to inetd.conf + * Add support for generating krb5.conf + + -- Sam Hartman Thu, 2 Nov 2000 17:29:59 -0500 + +krb5 (1.2.1-1) unstable; urgency=low + + * Initial Release. + + -- Sam Hartman Thu, 19 Oct 2000 16:05:06 -0400 + --- krb5-1.4.4.orig/debian/krb5-ftpd.install +++ krb5-1.4.4/debian/krb5-ftpd.install @@ -0,0 +1,2 @@ +usr/sbin/ftpd +usr/share/man/man8/ftpd.8 --- krb5-1.4.4.orig/debian/libkrb53.install +++ krb5-1.4.4/debian/libkrb53.install @@ -0,0 +1,6 @@ +usr/lib/libdes425*so.* +usr/lib/libgssapi*so.* +usr/lib/libk5crypto*so.* +usr/lib/libkrb4*so.* +usr/lib/libkrb5*so.* + --- krb5-1.4.4.orig/debian/libkrb5-dev.dirs +++ krb5-1.4.4/debian/libkrb5-dev.dirs @@ -0,0 +1 @@ +usr/share/aclocal --- krb5-1.4.4.orig/debian/libkrb53.lintian +++ krb5-1.4.4/debian/libkrb53.lintian @@ -0,0 +1 @@ +libkrb53: package-name-doesnt-match-sonames --- krb5-1.4.4.orig/debian/krb5-user.docs +++ krb5-1.4.4/debian/krb5-user.docs @@ -0,0 +1 @@ +README --- krb5-1.4.4.orig/debian/krb5-doc.docs +++ krb5-1.4.4/debian/krb5-doc.docs @@ -0,0 +1,10 @@ +debian/README.KDC +README +doc/admin-guide.ps +doc/krb5-admin +doc/install-guide.ps +doc/krb5-install +doc/krb425-guide.ps +doc/krb425 +doc/user-guide.ps +doc/krb5-user --- krb5-1.4.4.orig/debian/copyright +++ krb5-1.4.4/debian/copyright @@ -0,0 +1,154 @@ +This package was debianized by Sam Hartman on +Thu, 19 Oct 2000 16:05:06 -0400. + +It was downloaded from: + + + +Upstream Maintainers: + + MIT Kerberos Team + +Copyright: + +Copyright (C) 1985-2003 by the Massachusetts Institute of Technology. + +All rights reserved. + +Export of this software from the United States of America may require +a specific license from the United States Government. It is the +responsibility of any person or organization contemplating export to +obtain such a license before exporting. + +WITHIN THAT CONSTRAINT, permission to use, copy, modify, and +distribute this software and its documentation for any purpose and +without fee is hereby granted, provided that the above copyright +notice appear in all copies and that both that copyright notice and +this permission notice appear in supporting documentation, and that +the name of M.I.T. not be used in advertising or publicity pertaining +to distribution of the software without specific, written prior +permission. Furthermore if you modify this software you must label +your software as modified software and not distribute it in such a +fashion that it might be confused with the original MIT software. +M.I.T. makes no representations about the suitability of this software +for any purpose. It is provided "as is" without express or implied +warranty. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +Individual source code files are copyright MIT, Cygnus Support, +OpenVision, Oracle, Sun Soft, FundsXpress, and others. + +Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, +and Zephyr are trademarks of the Massachusetts Institute of Technology +(MIT). No commercial use of these trademarks may be made without +prior written permission of MIT. + +"Commercial use" means use of a name in a product or other for-profit +manner. It does NOT prevent a commercial firm from referring to the +MIT trademarks in order to convey information (although in doing so, +recognition of their trademark status should be given). + +---- + +The following copyright and permission notice applies to the +OpenVision Kerberos Administration system located in kadmin/create, +kadmin/dbutil, kadmin/passwd, kadmin/server, lib/kadm5, and portions +of lib/rpc: + + Copyright, OpenVision Technologies, Inc., 1996, All Rights Reserved + + WARNING: Retrieving the OpenVision Kerberos Administration system + source code, as described below, indicates your acceptance of the + following terms. If you do not agree to the following terms, do not + retrieve the OpenVision Kerberos administration system. + + You may freely use and distribute the Source Code and Object Code + compiled from it, with or without modification, but this Source + Code is provided to you "AS IS" EXCLUSIVE OF ANY WARRANTY, + INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY OR + FITNESS FOR A PARTICULAR PURPOSE, OR ANY OTHER WARRANTY, WHETHER + EXPRESS OR IMPLIED. IN NO EVENT WILL OPENVISION HAVE ANY LIABILITY + FOR ANY LOST PROFITS, LOSS OF DATA OR COSTS OF PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES, OR FOR ANY SPECIAL, INDIRECT, OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, INCLUDING, + WITHOUT LIMITATION, THOSE RESULTING FROM THE USE OF THE SOURCE + CODE, OR THE FAILURE OF THE SOURCE CODE TO PERFORM, OR FOR ANY + OTHER REASON. + + OpenVision retains all copyrights in the donated Source Code. OpenVision + also retains copyright to derivative works of the Source Code, whether + created by OpenVision or by a third party. The OpenVision copyright + notice must be preserved if derivative works are made based on the + donated Source Code. + + OpenVision Technologies, Inc. has donated this Kerberos + Administration system to MIT for inclusion in the standard + Kerberos 5 distribution. This donation underscores our + commitment to continuing Kerberos technology development + and our gratitude for the valuable work which has been + performed by MIT and the Kerberos community. + +---- + + Portions contributed by Matt Crawford were + work performed at Fermi National Accelerator Laboratory, which is + operated by Universities Research Association, Inc., under + contract DE-AC02-76CHO3000 with the U.S. Department of Energy. + +---- + +The implementation of the Yarrow pseudo-random number generator in +src/lib/crypto/yarrow has the following copyright: + +Copyright 2000 by Zero-Knowledge Systems, Inc. + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Zero-Knowledge Systems, +Inc. not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. Zero-Knowledge Systems, Inc. makes no representations +about the suitability of this software for any purpose. It is +provided "as is" without express or implied warranty. + +ZERO-KNOWLEDGE SYSTEMS, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL ZERO-KNOWLEDGE SYSTEMS, INC. BE LIABLE FOR +ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +---- + +The implementation of the AES encryption algorithm in src/lib/crypto/aes +has the following copyright: + + Copyright (c) 2001, Dr Brian Gladman , Worcester, UK. + All rights reserved. + + LICENSE TERMS + + The free distribution and use of this software in both source and binary + form is allowed (with or without changes) provided that: + + 1. distributions of this source code include the above copyright + notice, this list of conditions and the following disclaimer; + + 2. distributions in binary form include the above copyright + notice, this list of conditions and the following disclaimer + in the documentation and/or other associated materials; + + 3. the copyright holder's name is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explcit or implied warranties + in respect of any properties, including, but not limited to, correctness + and fitness for purpose. --- krb5-1.4.4.orig/debian/krb5-kdc.lintian +++ krb5-1.4.4/debian/krb5-kdc.lintian @@ -0,0 +1 @@ +krb5-kdc: non-standard-dir-perm --- krb5-1.4.4.orig/debian/kdc.conf +++ krb5-1.4.4/debian/kdc.conf @@ -0,0 +1,16 @@ +[kdcdefaults] + kdc_ports = 750,88 + +[realms] + @MYREALM = { + database_name = /var/lib/krb5kdc/principal + admin_keytab = FILE:/etc/krb5kdc/kadm5.keytab + acl_file = /etc/krb5kdc/kadm5.acl + key_stash_file = /etc/krb5kdc/stash + kdc_ports = 750,88 + max_life = 10h 0m 0s + max_renewable_life = 7d 0h 0m 0s + master_key_type = des3-hmac-sha1 + supported_enctypes = des3-hmac-sha1:normal des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3 + default_principal_flags = +preauth + } --- krb5-1.4.4.orig/debian/krb5_newrealm +++ krb5-1.4.4/debian/krb5_newrealm @@ -0,0 +1,41 @@ +#!/bin/sh -e + +cat </etc/krb5kdc/kadm5.acl +# This file Is the access control list for krb5 administration. +# When this file is edited run /etc/init.d/krb5-admin-server restart to activate +# One common way to set up Kerberos administration is to allow any principal +# ending in /admin is given full administrative rights. +# To enable this, uncomment the following line: +# */admin * +EOF + fi +cat </dev/null || true + rm -f /etc/default/krb5-kdc 2>/dev/null || true + rm -f /etc/krb5kdc/kadm5.keytab 2>/dev/null || true + rm -f /etc/krb5kdc/kadm5.acl 2>/dev/null || true + rm -f /etc/krb5kdc/stash 2>/dev/null || true + + if [ -d /var/lib/krb5kdc ] && [ -f /usr/share/debconf/confmodule ] ; then + . /usr/share/debconf/confmodule || true + db_version 2.0 || true + db_get krb5-kdc/purge_data_too || true + if [ "$RET" = true ] ; then + rm -rf /var/lib/krb5kdc + fi + fi +fi + +#DEBHELPER# --- krb5-1.4.4.orig/debian/krb5_newrealm.sgml +++ krb5-1.4.4/debian/krb5_newrealm.sgml @@ -0,0 +1,31 @@ + + + + krb5_newrealm + 8 + + + krb5_newrealm + Create a new Kerberos Realm + + + + + + krb5_newrealm + + + + Description This script attempts to create a + Kerberos realm. It assumes that none of the realm components + exists, except for the /etc/krb5.conf file. (Normally this file + is automatically generated at package installation, but if you + skipped the configuration step, you will need to manually generate + this file before running krb5_newrealm.) + It creates the database and populates + /etc/krb5kdc/kadm5.keytab which contains keys + necessary for kadmind to run. + + + + --- krb5-1.4.4.orig/debian/krb5-kdc.postinst +++ krb5-1.4.4/debian/krb5-kdc.postinst @@ -0,0 +1,42 @@ +#! /bin/sh + +set -e +export KRB5LD_DEFAULT_REALM +if [ "configure" = "$1" ] ; then + . /usr/share/debconf/confmodule || exit + db_version 2.0 + db_get krb5-config/default_realm + KRB5LD_DEFAULT_REALM="$RET" + + db_get krb5-kdc/debconf + DEBCONF=$RET + + if [ ! -f /etc/krb5kdc/kdc.conf ] && [ $DEBCONF = "true" ] ; then + sed -e s/@MYREALM/$KRB5LD_DEFAULT_REALM/ \ + /usr/share/krb5-kdc/kdc.conf.template \ + >/etc/krb5kdc/kdc.conf + fi + + if [ $DEBCONF = "true" ] ; then + echo \#Automatically generated--do not edit \ + >/etc/default/krb5-kdc + echo \# Run dpkg-reconfigure krb5-kdc to change >>/etc/default/krb5-kdc + db_get krb5-kdc/krb4-mode + echo KRB4_MODE=$RET >>/etc/default/krb5-kdc + db_get krb5-kdc/run-krb524 + echo RUN_KRB524D=$RET \ + >>/etc/default/krb5-kdc + fi + + # Only try to add the inetd line on an initial installation. Add it + # commented out in a way that will not be automatically enabled, since + # the Kerberos administrator should do that manually when ready. + if [ -z "$2" ] || [ x"$2" = x"" ] ; then + update-inetd --add --group Kerberos '#krb5_prop\tstream\ttcp\tnowait\troot\t/usr/sbin/kpropd kpropd' + fi + fi + +db_stop + +#DEBHELPER# + --- krb5-1.4.4.orig/debian/krb5-user.install +++ krb5-1.4.4/debian/krb5-user.install @@ -0,0 +1,20 @@ +usr/bin/kdestroy +usr/share/man/man1/kdestroy.1 +usr/bin/kinit +usr/share/man/man1/kinit.1 +usr/bin/klist +usr/share/man/man1/klist.1 +usr/bin/kpasswd +usr/share/man/man1/kpasswd.1 +usr/bin/krb524init +usr/share/man/man1/krb524init.1 +usr/bin/ksu +usr/share/man/man1/ksu.1 +usr/bin/kvno +usr/share/man/man1/kvno.1 +usr/sbin/k5srvutil +usr/share/man/man8/k5srvutil.8 +usr/sbin/kadmin +usr/share/man/man8/kadmin.8 +usr/sbin/ktutil +usr/share/man/man8/ktutil.8 --- krb5-1.4.4.orig/debian/krb5-telnetd.prerm +++ krb5-1.4.4/debian/krb5-telnetd.prerm @@ -0,0 +1,9 @@ +#!/bin/bash -e +# $Id: krb5-telnetd.prerm,v 1.1 2000/10/26 01:31:46 hartmans Exp $ + +# If netbase is not installed, then we don't need to do the remove. +if command -v update-inetd >/dev/null 2>&1; then + update-inetd --disable telnet +fi + +#DEBHELPER# --- krb5-1.4.4.orig/debian/krb5-admin-server.config +++ krb5-1.4.4/debian/krb5-admin-server.config @@ -0,0 +1,11 @@ +#!/bin/sh -e + +. /usr/share/debconf/confmodule || exit + +db_version 2.0 +db_input high krb5-admin-server/newrealm || true +db_get krb5-kdc/debconf +if [ $RET = true ] ; then + db_input low krb5-admin-server/kadmind || true +fi +db_go --- krb5-1.4.4.orig/debian/krb5-admin-server.install +++ krb5-1.4.4/debian/krb5-admin-server.install @@ -0,0 +1,6 @@ +usr/sbin/kadmin.local +usr/share/man/man8/kadmin.local.8 +usr/sbin/kadmind +usr/share/man/man8/kadmind.8 +usr/sbin/kprop +usr/share/man/man8/kprop.8 --- krb5-1.4.4.orig/debian/krb5-clients.docs +++ krb5-1.4.4/debian/krb5-clients.docs @@ -0,0 +1,2 @@ +README +debian/README.Debian --- krb5-1.4.4.orig/debian/krb5-kdc.init +++ krb5-1.4.4/debian/krb5-kdc.init @@ -0,0 +1,172 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: krb5-kdc +# Required-Start: $local_fs $remote_fs $network $syslog +# Required-Stop: $local_fs $remote_fs $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: S 0 1 6 +# Short-Description: MIT Kerberos KDC +# Description: Starts, stops, or restarts the MIT Kerberos KDC. This +# daemon responds to ticket requests from Kerberos +# clients. +### END INIT INFO + +# Author: Sam Hartman +# Author: Russ Allbery +# +# Based on the /etc/init.d/skeleton template as found in initscripts version +# 2.86.ds1-15. + +PATH=/usr/sbin:/usr/bin:/sbin:/bin +DESC="Kerberos KDC" +NAME=krb5kdc +DAEMON=/usr/sbin/$NAME +DAEMON_ARGS="" +SCRIPTNAME=/etc/init.d/krb5-kdc + +# Exit if the package is not installed. +[ -x "$DAEMON" ] || exit 0 + +# Exit if no KDC database has been created. +[ -f /etc/krb5kdc/stash ] || exit 0 + +# Read configuration if it is present. +[ -r /etc/default/krb5-kdc ] && . /etc/default/krb5-kdc + +# Get the setting of VERBOSE and other rcS variables. +[ -f /etc/default/rcS ] && . /etc/default/rcS + +# Define LSB log functions (requires lsb-base >= 3.0-6). +. /lib/lsb/init-functions + +# Set options based on the Kerberos v4 mode (from /etc/default/krb5-kdc). +if [ "x$KRB4_MODE" != x ] ; then + DAEMON_ARGS="-4$KRB4_MODE $DAEMON_ARGS" +fi + +# Return +# 0 if daemon has been started +# 1 if daemon was already running +# 2 if daemon could not be started +do_start_kdc() +{ + start-stop-daemon --start --quiet --startas $DAEMON --name $NAME --test \ + > /dev/null || return 1 + start-stop-daemon --start --quiet --startas $DAEMON --name $NAME \ + -- $DAEMON_ARGS || return 2 +} + +do_start_krb524d() +{ + start-stop-daemon --start --quiet --startas /usr/sbin/krb524d \ + --name krb524d --test -- -m > /dev/null || return 1 + start-stop-daemon --start --quiet --startas /usr/sbin/krb524d \ + --name krb524d -- -m || return 2 +} + +# Return +# 0 if daemon has been stopped +# 1 if daemon was already stopped +# 2 if daemon could not be stopped +# other if a failure occurred +do_stop_kdc() +{ + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME +} + +do_stop_krb524d() +{ + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name krb524d +} + + +case "$1" in + start) + [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" + do_start_kdc + case "$?" in + 0|1) + if [ "x$RUN_KRB524D" = "xtrue" ] ; then + [ "$VERBOSE" != no ] && log_progress_msg "krb524d" + do_start_krb524d + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + else + [ "$VERBOSE" != no ] && log_end_msg 0 + fi + ;; + 2) + [ "$VERBOSE" != no ] && log_end_msg 1 + ;; + esac + ;; + + stop) + [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" + do_stop_kdc + case "$?" in + 0|1) + if [ "x$RUN_KRB524D" = "xtrue" ] ; then + [ "$VERBOSE" != no ] && log_progress_msg "krb524d" + do_stop_krb524d + case "$?" in + 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; + 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; + esac + else + [ "$VERBOSE" != no ] && log_end_msg 0 + fi + ;; + 2) + [ "$VERBOSE" != no ] && log_end_msg 1 + ;; + esac + ;; + + restart|force-reload) + log_daemon_msg "Restarting $DESC" "$NAME" + do_stop_kdc + case "$?" in + 0|1) + do_start_kdc + case "$?" in + 0) + if [ "x$RUN_KRB524D" = "xtrue" ] ; then + log_progress_msg "krb524d" + do_stop_krb524d + case "$?" in + 0|1) + do_start_krb524d + case "$?" in + 0) log_end_msg 0 ;; + *) log_end_msg 1 ;; + esac + ;; + *) + log_end_msg 1 + ;; + esac + else + log_end_msg 0 + fi + ;; + 1|2) + log_end_msg 1 + ;; + esac + ;; + *) + log_end_msg 1 + ;; + esac + ;; + + *) + echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 + exit 3 + ;; +esac + +: --- krb5-1.4.4.orig/debian/krb5-user.lintian +++ krb5-1.4.4/debian/krb5-user.lintian @@ -0,0 +1 @@ +krb5-user: setuid-binary --- krb5-1.4.4.orig/debian/krb5-kdc.install +++ krb5-1.4.4/debian/krb5-kdc.install @@ -0,0 +1,10 @@ +usr/sbin/fakeka +usr/share/man/man8/fakeka.8 +usr/sbin/kdb5_util +usr/share/man/man8/kdb5_util.8 +usr/sbin/kpropd +usr/share/man/man8/kpropd.8 +usr/sbin/krb524d +usr/share/man/man8/krb524d.8 +usr/sbin/krb5kdc +usr/share/man/man8/krb5kdc.8 --- krb5-1.4.4.orig/debian/krb5-doc.install +++ krb5-1.4.4/debian/krb5-doc.install @@ -0,0 +1,2 @@ +usr/share/man/man1/kerberos.1 +usr/share/man/man5 --- krb5-1.4.4.orig/debian/krb5-telnetd.postinst +++ krb5-1.4.4/debian/krb5-telnetd.postinst @@ -0,0 +1,10 @@ +#!/bin/sh -e +# $Id: krb5-telnetd.postinst,v 1.1 2000/10/26 01:31:46 hartmans Exp $ + +if [ "$1" = configure ] && [ -z "$2" ]; then + update-inetd --group Kerberos --add 'telnet\t\tstream\ttcp\tnowait\troot\t/usr/sbin/tcpd\t/usr/sbin/telnetd -a user' +else + update-inetd --enable telnet +fi + +#DEBHELPER# --- krb5-1.4.4.orig/debian/README.Debian +++ krb5-1.4.4/debian/README.Debian @@ -0,0 +1,110 @@ + MIT Kerberos for Debian + +Kerberos Package Roadmap + + Most systems using Kerberos should install at least krb5-user, which + contains the basic kinit, klist, and kdestroy binaries to manage user + Kerberos credentials, as well as other basic utilities. In order to + use Kerberos passwords for local authentication and obtain Kerberos + credentials automatically when logging in, install and configure + libpam-krb5. + + To log on to other systems using Kerberos authentication, most sites + will find a Kerberos-enabled sshd the most convenient. Either + the openssh-client and openssh-server packages version 1:4.2p1-2 or + later (preferrable) or openssh-krb5 (for older Debian releases) will + work. See the ssh documentation for information on enabling GSSAPI + authentication (which is how Kerberos authentication is done over the + ssh protocol). + + Some sites will instead prefer to use Kerberos-enabled versions of the + standard Unix login utilities (rsh, rlogin, telnet, ftp). The clients + are available in the krb5-clients package and the servers are available + in the krb5-rsh-server, krb5-telnetd, and krb5-ftpd packages. Please + note that the telnetd and ftpd included in those packages do not use PAM + (this is not supported upstream and may or may not ever be supported); + they only support Kerberos and will not run other PAM modules. For more + flexible login support, use Kerberos-enabled ssh instead. + + The krb5-kdc and krb5-admin-server packages are only needed and used on + Kerberos KDCs, only one set of which is needed for each independently + managed Kerberos realm. For more information on how to set up a + Kerberos realm using the Debian packages, install krb5-kdc and then read + /usr/share/doc/krb5-kdc/README.KDC. + +Documentation + + All Kerberos binaries and most configuration files have manual pages. + For the info pages and reference manual, install krb5-doc. If you need + additional information, see . + +Debian-Specific Information + + MIT distributes the Kerberos sources as a tarball and a PGP signature, + tarred up into a single .tar file. In order to create the Debian + original upstream source (.orig.tar.gz), I untarred the parent tarball, + checked the PGP signature, and used the contained tarball as the + upstream source. + + MIT Kerberos is built against the libcom_err and libss provided by the + e2fsprogs source package. It is built against the version of db + included in src/util/db2 in the Kerberos sources. In the future, + krb5-kdc may change to use db4, although doing so will make upgrades + somewhat difficult. + + None of the sample clients and servers are installed. As a general + rule, these are not useful unless you are doing development, and in such + a situation you probably want to build them from source. + + Note that by default, no unencrypted services are enabled. That means, + if you are using krb5-clients and the supporting server packages, you + need to use rlogin -x to connect to a Debian system and if you use rsh + or rcp without the -x option you will get an error that encryption is + required. In this day and age, not encrypting network traffic is a good + way to get attacked. + + If installed, krb5-rsh-server by default allows any user in the local + realm whose principal matches a local account name to log on to that + account. See the klogind and kshd man pages. If this isn't the + behavior you want, one option is to create an empty .k5login file in the + home directory of every user and then add principals to those files + where it's appropriate. One way to do this for all newly created users + is: + + touch /etc/skel/.k5login + + This will cause an empty .k5login file to be put in the home directory + of newly created users. + +krb524 AFS Conversion + + The following section is only of use to Kerberos users who also use the + AFS distributed file system. + + An alternate conversion is provided for AFS servers that support the + encrypted part of a krb5 ticket as an AFS token. If krb524d is + converting a principal whose first component is afs and if the encrypted + part of the ticket fits in 344 bytes, then it will default to simply + returning the encrypted part of the ticket as a token. If it turns out + that the AFS server does not support the ticket, then users will get an + unknown key version error and the krb524d must be configured to use v4 + tickets for this AFS service. + + The krb524d looks in the appdefaults section of krb5.conf for an + application called afs_krb5 to determine whether AFS principals support + encrypted ticket parts as tokens. The following configuration fragment + says that afs/sipb.mit.edu@ATHENA.MIT.EDU supports the new token format + but afs@ATHENA.MIT.EDU and afs/athena.mit.edu@ATHENA.MIT.EDU do not. + Note that the default is to assume afs servers support the new format. + + [appdefaults] + afs_krb5 = { + ATHENA.MIT.EDU = { + # This stanza describes principals in the ATHENA.MIT.EDU realm + afs = false + afs/athena.mit.edu = false + afs/sipb.mit.edu = true + } + } + + -- Russ Allbery , Fri Dec 2 21:05:05 2005 --- krb5-1.4.4.orig/debian/compat +++ krb5-1.4.4/debian/compat @@ -0,0 +1 @@ +5 --- krb5-1.4.4.orig/debian/watch +++ krb5-1.4.4/debian/watch @@ -0,0 +1,4 @@ +# debian/watch -- Rules for uscan to find new upstream versions. + +version=3 +http://web.mit.edu/kerberos/dist/ krb5/[\d.]+/krb5-([\d.]+)-signed.tar$ --- krb5-1.4.4.orig/debian/patches/debian-path-fixes +++ krb5-1.4.4/debian/patches/debian-path-fixes @@ -0,0 +1,145 @@ +Adjust man pages and code for Debian paths and FHS compliance. Not +suitable for submission upstream, although it would be nice if upstream +didn't put the full paths into man pages (and that part has been +submitted). + +Kerberos RT #3010 + +--- krb5-1.4.2.orig/src/appl/bsd/Makefile.in ++++ krb5-1.4.2/src/appl/bsd/Makefile.in +@@ -22,9 +22,9 @@ + OBJS= krcp.o krlogin.o krsh.o kcmd.o forward.o compat_recv.o $(SETENVOBJ) \ + login.o krshd.o krlogind.o $(V4RCPO) $(LIBOBJS) + +-UCB_RLOGIN = @UCB_RLOGIN@ +-UCB_RSH = @UCB_RSH@ +-UCB_RCP = @UCB_RCP@ ++UCB_RLOGIN = /usr/bin/netkit-rlogin ++UCB_RSH = /usr/bin/netkit-rsh ++UCB_RCP = /usr/bin/netkit-rcp + + RSH= -DKRB5_PATH_RLOGIN=\"$(CLIENT_BINDIR)/rlogin\" + BSD= -DUCB_RLOGIN=\"$(UCB_RLOGIN)\" \ +--- krb5-1.4.2.orig/src/appl/bsd/klogind.M ++++ krb5-1.4.2/src/appl/bsd/klogind.M +@@ -27,7 +27,7 @@ + the port indicated in /etc/inetd.conf. A typical /etc/inetd.conf + configuration line for \fIklogind\fP might be: + +-klogin stream tcp nowait root /usr/cygnus/sbin/klogind klogind -e5c ++klogin stream tcp nowait root /usr/sbin/klogind klogind -e5c + + When a service request is received, the following protocol is initiated: + +--- krb5-1.4.2.orig/src/appl/bsd/kshd.M ++++ krb5-1.4.2/src/appl/bsd/kshd.M +@@ -8,7 +8,7 @@ + .SH NAME + kshd \- kerberized remote shell server + .SH SYNOPSIS +-.B /usr/local/sbin/kshd ++.B kshd + [ + .B \-kr45ec + ] +@@ -30,7 +30,7 @@ + on the port indicated in /etc/inetd.conf. A typical /etc/inetd.conf + configuration line for \fIkrshd\fP might be: + +-kshell stream tcp nowait root /usr/local/sbin/kshd kshd -5c ++kshell stream tcp nowait root /usr/sbin/kshd kshd -5c + + When a service request is received, the following protocol is initiated: + +--- krb5-1.4.2.orig/src/config-files/kdc.conf.M ++++ krb5-1.4.2/src/config-files/kdc.conf.M +@@ -78,14 +78,14 @@ + .B string + specifies the location of the access control list (acl) file that + kadmin uses to determine which principals are allowed which permissions +-on the database. The default value is /usr/local/var/krb5kdc/kadm5.acl. ++on the database. The default value is /etc/krb5kdc/kadm5.acl. + + .IP admin_keytab + This + .B string + Specifies the location of the keytab file that kadmin uses to + authenticate to the database. The default value is +-/usr/local/var/krb5kdc/kadm5.keytab. ++/etc/krb5kdc/kadm5.keytab. + + .IP database_name + This +@@ -235,7 +235,7 @@ + realm names and the [capaths] section of its krb5.conf file + + .SH FILES +-/usr/local/var/krb5kdc/kdc.conf ++/etc/krb5kdc/kdc.conf + + .SH SEE ALSO + krb5.conf(5), krb5kdc(8) +--- krb5-1.4.2.orig/src/include/krb5/stock/osconf.h ++++ krb5-1.4.2/src/include/krb5/stock/osconf.h +@@ -117,10 +117,10 @@ + * krb5 slave support follows + */ + +-#define KPROP_DEFAULT_FILE "@LOCALSTATEDIR/krb5kdc/slave_datatrans" +-#define KPROPD_DEFAULT_FILE "@LOCALSTATEDIR/krb5kdc/from_master" +-#define KPROPD_DEFAULT_KDB5_UTIL "@SBINDIR/kdb5_util" +-#define KPROPD_DEFAULT_KDB5_EDIT "@SBINDIR/kdb5_edit" ++#define KPROP_DEFAULT_FILE "/var/lib/krb5kdc/slave_datatrans" ++#define KPROPD_DEFAULT_FILE "/var/lib/krb5kdc/from_master" ++#define KPROPD_DEFAULT_KDB5_UTIL "@PREFIX/sbin/kdb5_util" ++#define KPROPD_DEFAULT_KDB5_EDIT "@PREFIX/sbin/kdb5_edit" + #define KPROPD_DEFAULT_KRB_DB DEFAULT_KDB_FILE + #define KPROPD_ACL_FILE "@LOCALSTATEDIR/krb5kdc/kpropd.acl" + +--- krb5-1.4.2.orig/src/slave/kprop.M ++++ krb5-1.4.2/src/slave/kprop.M +@@ -39,7 +39,7 @@ + This is done by transmitting the dumped database file to the slave + server over an encrypted, secure channel. The dump file must be created + by kdb5_util, and is normally KPROP_DEFAULT_FILE +-(/usr/local/var/krb5kdc/slave_datatrans). ++(/var/lib/krb5kdc/slave_datatrans). + .SH OPTIONS + .TP + \fB\-r\fP \fIrealm\fP +@@ -51,7 +51,7 @@ + \fB\-f\fP \fIfile\fP + specifies the filename where the dumped principal database file is to be + found; by default the dumped database file is KPROP_DEFAULT_FILE +-(normally /usr/local/var/krb5kdc/slave_datatrans). ++(normally /var/lib/krb5kdc/slave_datatrans). + .TP + \fB\-P\fP \fIport\fP + specifies the port to use to contact the +--- krb5-1.4.2.orig/src/slave/kpropd.M ++++ krb5-1.4.2/src/slave/kpropd.M +@@ -69,7 +69,7 @@ + This is done by adding a line to the inetd.conf file which looks like + this: + +-kprop stream tcp nowait root /usr/local/sbin/kpropd kpropd ++krb5_prop stream tcp nowait root /usr/sbin/kpropd kpropd + + However, kpropd can also run as a standalone deamon, if the + .B \-S +@@ -87,13 +87,13 @@ + \fB\-f\fP \fIfile\fP + specifies the filename where the dumped principal database file is to be + stored; by default the dumped database file is KPROPD_DEFAULT_FILE +-(normally /usr/local/var/krb5kdc/from_master). ++(normally /var/lib/krb5kdc/from_master). + .TP + .B \-p + allows the user to specify the pathname to the + .IR kdb5_util (8) + program; by default the pathname used is KPROPD_DEFAULT_KDB5_UTIL +-(normally /usr/local/sbin/kdb5_util). ++(normally /usr/sbin/kdb5_util). + .TP + .B \-S + turn on standalone mode. Normally, kpropd is invoked out of --- krb5-1.4.4.orig/debian/patches/gss-canon-name +++ krb5-1.4.4/debian/patches/gss-canon-name @@ -0,0 +1,20 @@ +Assume the krb5 mechanism if no mechanism was provided. ipsec-tools +expects this behavior. Patch from Daniel Kahn Gillmor. + +Kerberos RT #3467 +Debian bug #351877 + +=== krb5/src/lib/gssapi/krb5/canon_name.c +================================================================== +--- krb5/src/lib/gssapi/krb5/canon_name.c (revision 2103) ++++ krb5/src/lib/gssapi/krb5/canon_name.c (local) +@@ -34,7 +34,8 @@ + const gss_OID mech_type, + gss_name_t *output_name) + { +- if (!g_OID_equal(gss_mech_krb5, mech_type) && ++ if ((GSS_C_NO_OID != mech_type) && ++ !g_OID_equal(gss_mech_krb5, mech_type) && + !g_OID_equal(gss_mech_krb5_old, mech_type)) { + *minor_status = 0; + return(GSS_S_BAD_MECH); --- krb5-1.4.4.orig/debian/patches/info-fixes +++ krb5-1.4.4/debian/patches/info-fixes @@ -0,0 +1,79 @@ +Add dircategory and direntry lines to the texinfo source and fix a few +variable typos. + +Kerberos RT #3014 + +--- krb5-1.4.2.orig/doc/admin.texinfo ++++ krb5-1.4.2/doc/admin.texinfo +@@ -14,6 +14,11 @@ + @parskip 6pt plus 6pt + @end iftex + ++@dircategory Kerberos ++@direntry ++* krb5-admin: (krb5-admin). Kerberos V5 Administrator's Guide ++@end direntry ++ + @include definitions.texinfo + @set EDITION 1.0 + @set UPDATED June 16, 2000 +@@ -2443,7 +2448,7 @@ + @b{Re-enter password for principal krbtgt/@value{PRIMARYREALM}@@@value{SECONDREALM}:} + @b{kadmin:} add_princ -requires_preauth krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALM} + @b{Enter password for principal krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALM}:} +-@b{Enter password for principal krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALML}:} ++@b{Enter password for principal krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALM}:} + @b{kadmin:} + @end group + @end smallexample +--- krb5-1.4.2.orig/doc/install.texinfo ++++ krb5-1.4.2/doc/install.texinfo +@@ -15,6 +15,11 @@ + @parskip 6pt plus 6pt + @end iftex + ++@dircategory Kerberos ++@direntry ++* krb5-install: (krb5-install). Kerberos V5 Installation Guide ++@end direntry ++ + @include definitions.texinfo + @set EDITION 1.1 + +--- krb5-1.4.2.orig/doc/krb425.texinfo ++++ krb5-1.4.2/doc/krb425.texinfo +@@ -15,6 +15,11 @@ + @parskip 6pt plus 6pt + @end iftex + ++@dircategory Kerberos ++@direntry ++* krb425: (krb425). Upgrading to Kerberos V5 from V4 ++@end direntry ++ + @include definitions.texinfo + @set EDITION 1.0 + @set UPDATED May 22, 2003 +--- krb5-1.4.2.orig/doc/user-guide.texinfo ++++ krb5-1.4.2/doc/user-guide.texinfo +@@ -13,6 +13,11 @@ + @parskip 6pt plus 6pt + @end iftex + ++@dircategory Kerberos ++@direntry ++* krb5-user: (krb5-user). Kerberos V5 UNIX User's Guide ++@end direntry ++ + @include definitions.texinfo + @set EDITION 1.0 + +@@ -932,7 +937,7 @@ + [ Kerberos V5 accepts you as ``@value{RANDOMUSER1}@@@value{PRIMARYDOMAIN}'' ] + [ Kerberos V5 accepted forwarded credentials ] + What you type is protected by encryption. +-Last login: Tue Jul 30 18:47:44 from @value{RANDOMHOST}.@value{SECONDDOMAIN} ++Last login: Tue Jul 30 18:47:44 from @value{RANDOMHOST1}.@value{SECONDDOMAIN} + Athena Server (sun4) Version 9.1.11 Tue Jul 30 14:40:08 EDT 2002 + + shell%} --- krb5-1.4.4.orig/debian/patches/patch.kadmin-sprintf-overflow +++ krb5-1.4.4/debian/patches/patch.kadmin-sprintf-overflow @@ -0,0 +1,92 @@ +Index: krb5-1.4.4/src/kadmin/server/server_stubs.c +=================================================================== +--- krb5-1.4.4.orig/src/kadmin/server/server_stubs.c 2007-06-19 14:58:07.000000000 -0700 ++++ krb5-1.4.4/src/kadmin/server/server_stubs.c 2007-06-19 15:25:29.000000000 -0700 +@@ -466,12 +466,13 @@ + static generic_ret ret; + char *prime_arg1, + *prime_arg2; +- char prime_arg[BUFSIZ]; + gss_buffer_desc client_name, + service_name; + OM_uint32 minor_stat; + kadm5_server_handle_t handle; + restriction_t *rp; ++ size_t tlen1, tlen2, clen, slen; ++ char *tdots1, *tdots2, *cdots, *sdots; + + xdr_free(xdr_generic_ret, &ret); + +@@ -492,7 +493,14 @@ + ret.code = KADM5_BAD_PRINCIPAL; + return &ret; + } +- sprintf(prime_arg, "%s to %s", prime_arg1, prime_arg2); ++ tlen1 = strlen(prime_arg1); ++ trunc_name(&tlen1, &tdots1); ++ tlen2 = strlen(prime_arg2); ++ trunc_name(&tlen2, &tdots2); ++ clen = client_name.length; ++ trunc_name(&clen, &cdots); ++ slen = service_name.length; ++ trunc_name(&slen, &sdots); + + ret.code = KADM5_OK; + if (! CHANGEPW_SERVICE(rqstp)) { +@@ -510,16 +518,27 @@ + } else + ret.code = KADM5_AUTH_INSUFFICIENT; + if (ret.code != KADM5_OK) { +- krb5_klog_syslog(LOG_NOTICE, LOG_UNAUTH, "kadm5_rename_principal", +- prime_arg, client_name.value, service_name.value, ++ krb5_klog_syslog(LOG_NOTICE, ++ "Unauthorized request: kadm5_rename_principal, " ++ "%.*s%s to %.*s%s, " ++ "client=%.*s%s, service=%.*s%s, addr=%s", ++ tlen1, prime_arg1, tdots1, ++ tlen2, prime_arg2, tdots2, ++ clen, client_name.value, cdots, ++ slen, service_name.value, sdots, + inet_ntoa(rqstp->rq_xprt->xp_raddr.sin_addr)); + } else { + ret.code = kadm5_rename_principal((void *)handle, arg->src, + arg->dest); +- krb5_klog_syslog(LOG_NOTICE, LOG_DONE, "kadm5_rename_principal", +- prime_arg, ((ret.code == 0) ? "success" : +- error_message(ret.code)), +- client_name.value, service_name.value, ++ krb5_klog_syslog(LOG_NOTICE, ++ "Request: kadm5_rename_principal, " ++ "%.*s%s to %.*s%s, %s, " ++ "client=%.*s%s, service=%.*s%s, addr=%s", ++ tlen1, prime_arg1, tdots1, ++ tlen2, prime_arg2, tdots2, ++ (ret.code == 0) ? "success" : error_message(ret.code), ++ clen, client_name.value, cdots, ++ slen, service_name.value, sdots, + inet_ntoa(rqstp->rq_xprt->xp_raddr.sin_addr)); + } + free_server_handle(handle); +--- krb5-1.4.4.orig/src/kadmin/server/misc.c 2007-06-19 15:43:05.000000000 -0700 ++++ krb5-1.4.4/src/kadmin/server/misc.c 2007-06-19 15:43:48.000000000 -0700 +@@ -171,3 +171,12 @@ + + return kadm5_free_principal_ent(handle->lhandle, &princ); + } ++ ++#define MAXPRINCLEN 125 ++ ++void ++trunc_name(size_t *len, char **dots) ++{ ++ *dots = *len > MAXPRINCLEN ? "..." : ""; ++ *len = *len > MAXPRINCLEN ? MAXPRINCLEN : *len; ++} +--- krb5-1.4.4.orig/src/kadmin/server/misc.h 2007-06-19 15:43:05.000000000 -0700 ++++ krb5-1.4.4/src/kadmin/server/misc.h 2007-06-19 15:43:48.000000000 -0700 +@@ -45,3 +45,5 @@ + #ifdef SVC_GETARGS + void kadm_1(struct svc_req *, SVCXPRT *); + #endif ++ ++void trunc_name(size_t *len, char **dots); --- krb5-1.4.4.orig/debian/patches/bsd-portability +++ krb5-1.4.4/debian/patches/bsd-portability @@ -0,0 +1,31 @@ +Patch for GNU/kFreeBSD portability from Petr Salinger +. + +Kerberos RT #3466 +Debian bug #261712 + +=== krb5/src/appl/telnet/telnet/sys_bsd.c +================================================================== +--- krb5/src/appl/telnet/telnet/sys_bsd.c (revision 2038) ++++ krb5/src/appl/telnet/telnet/sys_bsd.c (local) +@@ -43,6 +43,8 @@ + #include + #include + #include ++#include ++ + #ifdef HAVE_SYS_SELECT_H + #include + #endif +=== krb5/src/appl/telnet/telnetd/defs.h +================================================================== +--- krb5/src/appl/telnet/telnetd/defs.h (revision 2038) ++++ krb5/src/appl/telnet/telnetd/defs.h (local) +@@ -38,6 +38,7 @@ + */ + #include + #include ++#include + + #ifndef BSD + # define BSD 43 --- krb5-1.4.4.orig/debian/patches/kdc-errno +++ krb5-1.4.4/debian/patches/kdc-errno @@ -0,0 +1,16 @@ +This file makes repeated reference to E* constants, and therefore must +include errno.h. It's possible that errno.h is provided by one of the +other headers, but it's best practice to include it locally regardless. + +Kerberos RT #3266 + +--- krb5-1.4.2.orig/src/kdc/kerberos_v4.c ++++ krb5-1.4.2/src/kdc/kerberos_v4.c +@@ -141,6 +141,7 @@ + */ + #include "com_err.h" + #include "extern.h" /* to pick up master_princ */ ++#include + + static krb5_data *response; + --- krb5-1.4.4.orig/debian/patches/kinit-a +++ krb5-1.4.4/debian/patches/kinit-a @@ -0,0 +1,46 @@ +Enable kinit -a to match the man page. I'm not sure why this was +disabled; there doesn't seem to be any reason to leave it only available +when built with long option support. I've tested the results and the flag +works as expected. + +Kerberos RT #3030 +Debian bug #232431 + +=== krb5/src/clients/kinit/kinit.c +================================================================== +--- krb5/src/clients/kinit/kinit.c (revision 2046) ++++ krb5/src/clients/kinit/kinit.c (local) +@@ -209,7 +209,7 @@ + USAGE_BREAK_LONG + "[-p | -P" USAGE_LONG_PROXIABLE "] " + USAGE_BREAK_LONG +- "[-A" USAGE_LONG_ADDRESSES "] " ++ "[-a | -A" USAGE_LONG_ADDRESSES "] " + USAGE_BREAK + "[-v] [-R] " + "[-k [-t keytab_file]] " +@@ -256,6 +256,7 @@ + ULINE("\t", "-F not forwardable", OPTTYPE_KRB5); + ULINE("\t", "-p proxiable", OPTTYPE_KRB5); + ULINE("\t", "-P not proxiable", OPTTYPE_KRB5); ++ ULINE("\t", "-a include addresses", OPTTYPE_KRB5); + ULINE("\t", "-A do not include addresses", OPTTYPE_KRB5); + ULINE("\t", "-v validate", OPTTYPE_KRB5); + ULINE("\t", "-R renew", OPTTYPE_BOTH); +@@ -281,7 +282,7 @@ + int use_k5 = 0; + int i; + +- while ((i = GETOPT(argc, argv, "r:fpFP54AVl:s:c:kt:RS:v")) ++ while ((i = GETOPT(argc, argv, "r:fpFP54aAVl:s:c:kt:RS:v")) + != -1) { + switch (i) { + case 'V': +@@ -316,7 +317,6 @@ + opts->not_proxiable = 1; + break; + case 'a': +- /* Note: This is supported only with GETOPT_LONG */ + opts->addresses = 1; + break; + case 'A': --- krb5-1.4.4.orig/debian/patches/patch.telnet_login +++ krb5-1.4.4/debian/patches/patch.telnet_login @@ -0,0 +1,56 @@ +=== src/appl/telnet/telnetd/state.c +================================================================== +--- src/appl/telnet/telnetd/state.c (revision 2464) ++++ src/appl/telnet/telnetd/state.c (local) +@@ -1665,7 +1665,8 @@ + strcmp(varp, "RESOLV_HOST_CONF") && /* linux */ + strcmp(varp, "NLSPATH") && /* locale stuff */ + strncmp(varp, "LC_", strlen("LC_")) && /* locale stuff */ +- strcmp(varp, "IFS")) { ++ strcmp(varp, "IFS") && ++ !strchr(varp, '-')) { + return 1; + } else { + syslog(LOG_INFO, "Rejected the attempt to modify the environment variable \"%s\"", varp); +=== src/appl/telnet/telnetd/sys_term.c +================================================================== +--- src/appl/telnet/telnetd/sys_term.c (revision 2464) ++++ src/appl/telnet/telnetd/sys_term.c (local) +@@ -1287,6 +1287,16 @@ + #endif + #if defined (AUTHENTICATION) + if (auth_level >= 0 && autologin == AUTH_VALID) { ++ if (name[0] == '-') { ++ /* Authenticated and authorized to log in to an ++ account starting with '-'? Even if that ++ unlikely case comes to pass, the current login ++ program will not parse the resulting command ++ line properly. */ ++ syslog(LOG_ERR, "user name cannot start with '-'"); ++ fatal(net, "user name cannot start with '-'"); ++ exit(1); ++ } + # if !defined(NO_LOGIN_F) + #if defined(LOGIN_CAP_F) + argv = addarg(argv, "-F"); +@@ -1377,11 +1387,19 @@ + } else + #endif + if (getenv("USER")) { +- argv = addarg(argv, getenv("USER")); ++ char *user = getenv("USER"); ++ if (user[0] == '-') { ++ /* "telnet -l-x ..." */ ++ syslog(LOG_ERR, "user name cannot start with '-'"); ++ fatal(net, "user name cannot start with '-'"); ++ exit(1); ++ } ++ argv = addarg(argv, user); + #if defined(LOGIN_ARGS) && defined(NO_LOGIN_P) + { + register char **cpp; + for (cpp = environ; *cpp; cpp++) ++ if ((*cpp)[0] != '-') + argv = addarg(argv, *cpp); + } + #endif --- krb5-1.4.4.orig/debian/patches/config-comments +++ krb5-1.4.4/debian/patches/config-comments @@ -0,0 +1,21 @@ +Support comments after whitespace in configuration files. + +Kerberos RT #1988 +Debian bug #314609 + +--- krb5-1.4.2.orig/src/util/profile/prof_parse.c ++++ krb5-1.4.2/src/util/profile/prof_parse.c +@@ -84,10 +84,10 @@ + + if (*line == 0) + return 0; +- if (line[0] == ';' || line[0] == '#') +- return 0; +- strip_line(line); + cp = skip_over_blanks(line); ++ if (cp[0] == ';' || cp[0] == '#') ++ return 0; ++ strip_line(cp); + ch = *cp; + if (ch == 0) + return 0; --- krb5-1.4.4.orig/debian/patches/krb4-prompting-fix +++ krb5-1.4.4/debian/patches/krb4-prompting-fix @@ -0,0 +1,49 @@ +Only prompt for a password once in krb4 when NULL is passed to +krb_get_in_pw_tkt, rather than prompting once for each string to key +function. + +Kerberos RT #2648 + +--- krb5-1.4.2.orig/src/lib/krb4/g_in_tkt.c ++++ krb5-1.4.2/src/lib/krb4/g_in_tkt.c +@@ -406,6 +406,8 @@ + CREDENTIALS *creds; + KRB_UINT32 *laddrp; + { ++ int ok; ++ char key_string[BUFSIZ]; + KTEXT_ST cip_st; + KTEXT cip = &cip_st; /* Returned Ciphertext */ + int kerror; +@@ -420,6 +422,23 @@ + cip, &byteorder, &local_addr); + if (kerror) + return kerror; ++ ++ /* If arg is null, we have to prompt for the password. decrypt_tkt, by ++ way of the *_passwd_to_key functions, will prompt if the password is ++ NULL, but that means that each separate encryption type will prompt ++ separately. Obtain the password first so that we can try multiple ++ encryption types without re-prompting. ++ ++ Don't, however, prompt on a Windows or Macintosh environment, since ++ that's harder. Rely on our caller to do it. */ ++#if !(defined(_WIN32) || defined(USE_LOGIN_LIBRARY)) ++ if (arg == NULL) { ++ ok = des_read_pw_string(key_string, sizeof(key_string), "Password", 0); ++ if (ok != 0) ++ return ok; ++ arg = key_string; ++ } ++#endif + + /* Attempt to decrypt the reply. Loop trying password_to_key algorithms + until we succeed or we get an error other than "bad password" */ +@@ -443,6 +462,7 @@ + } + + /* stomp stomp stomp */ ++ memset(key_string, 0, sizeof(key_string)); + memset(cip->dat, 0, (size_t)cip->length); + return kerror; + } --- krb5-1.4.4.orig/debian/patches/patch.kadm5_syslog +++ krb5-1.4.4/debian/patches/patch.kadm5_syslog @@ -0,0 +1,48 @@ +=== debian/rules +================================================================== +--- debian/rules (revision 2704) ++++ debian/rules (local) +@@ -27,7 +27,7 @@ + find src \( -name \*hin -o -name \*.h.in -o -name \*.stmp \) -print |xargs touch + (cd build; ../src/configure --prefix=/usr --enable-shared \ + --with-system-et --with-system-ss --enable-fakeka \ +- CFLAGS="$(CCOPTS) -D_REENTRANT" --localstatedir=/etc \ ++ CFLAGS="$(CCOPTS) -D_REENTRANT -DHAVE_VSNPRINTF" --localstatedir=/etc \ + --mandir=/usr/share/man --without-tcl) + touch configure-stamp + +=== src/lib/kadm5/logger.c +================================================================== +--- src/lib/kadm5/logger.c (revision 2704) ++++ src/lib/kadm5/logger.c (local) +@@ -45,7 +45,7 @@ + #include + #endif /* HAVE_STDARG_H */ + +-#define KRB5_KLOG_MAX_ERRMSG_SIZE 1024 ++#define KRB5_KLOG_MAX_ERRMSG_SIZE 2048 + #ifndef MAXHOSTNAMELEN + #define MAXHOSTNAMELEN 256 + #endif /* MAXHOSTNAMELEN */ +@@ -256,7 +256,9 @@ + #endif /* HAVE_SYSLOG */ + + /* Now format the actual message */ +-#if HAVE_VSPRINTF ++#if HAVE_VSNPRINTF ++ vsnprintf(cp, sizeof(outbuf) - (cp - outbuf), actual_format, ap); ++#elif HAVE_VSPRINTF + vsprintf(cp, actual_format, ap); + #else /* HAVE_VSPRINTF */ + sprintf(cp, actual_format, ((int *) ap)[0], ((int *) ap)[1], +@@ -843,7 +845,9 @@ + syslogp = &outbuf[strlen(outbuf)]; + + /* Now format the actual message */ +-#ifdef HAVE_VSPRINTF ++#ifdef HAVE_VSNPRINTF ++ vsnprintf(syslogp, sizeof(outbuf) - (syslogp - outbuf), format, arglist); ++#elif HAVE_VSPRINTF + vsprintf(syslogp, format, arglist); + #else /* HAVE_VSPRINTF */ + sprintf(syslogp, format, ((int *) arglist)[0], ((int *) arglist)[1], --- krb5-1.4.4.orig/debian/patches/kadmind-startup +++ krb5-1.4.4/debian/patches/kadmind-startup @@ -0,0 +1,46 @@ +We want kadmind to background itself before it tries to seed the random +number generator, since /dev/random may block and if read before the +fork, it may block the whole boot process. Reported by Bernd Schubert. + +Not yet submitted upstream. + +Debian bug #364308 + +Index: krb5/src/kadmin/server/ovsec_kadmd.c +=================================================================== +--- krb5/src/kadmin/server/ovsec_kadmd.c (revision 18327) ++++ krb5/src/kadmin/server/ovsec_kadmd.c (working copy) +@@ -301,15 +301,6 @@ + + krb5_klog_init(context, "admin_server", whoami, 1); + +- krb5_klog_syslog(LOG_INFO, "Seeding random number generator"); +- ret = krb5_c_random_os_entropy(context, 1, NULL); +- if(ret) { +- krb5_klog_syslog(LOG_ERR, +- "Error getting random seed: %s, aborting", +- krb5_get_error_message (context, ret)); +- exit(1); +- } +- + if((ret = kadm5_init("kadmind", NULL, + NULL, ¶ms, + KADM5_STRUCT_VERSION, +@@ -639,6 +630,17 @@ + exit(1); + } + ++ krb5_klog_syslog(LOG_INFO, "Seeding random number generator"); ++ ret = krb5_c_random_os_entropy(context, 1, NULL); ++ if (ret) { ++ krb5_klog_syslog(LOG_ERR, "Error getting random seed: %s, aborting", ++ krb5_get_error_message(context, ret)); ++ svcauth_gssapi_unset_names(); ++ kadm5_destroy(global_server_handle); ++ krb5_klog_close(context); ++ exit(1); ++ } ++ + setup_signal_handlers(); + krb5_klog_syslog(LOG_INFO, "starting"); + kadm_svc_run(¶ms); --- krb5-1.4.4.orig/debian/patches/hurd-portability +++ krb5-1.4.4/debian/patches/hurd-portability @@ -0,0 +1,365 @@ +Patch for Hurd portability, setting MAXPATHLEN and MAXHOSTNAMELEN where +needed and declaring additional weak symbols. There's probably a better +way to do this for upstream; it needs a bit more attention towards +integration with configure. Patch from Michael Banck . + +Kerberos RT #3265 +Debian bug #324305 and #341608 + +--- krb5/src/include/k5-thread.h.orig 2005-12-01 22:12:36.000000000 +0100 ++++ krb5/src/include/k5-thread.h 2005-12-01 22:05:37.000000000 +0100 +@@ -375,6 +375,12 @@ + # pragma weak pthread_mutex_init + # pragma weak pthread_self + # pragma weak pthread_equal ++# if __GNU__ ++# pragma weak _pthread_mutex_lock ++# pragma weak _pthread_mutex_unlock ++# pragma weak _pthread_mutex_destroy ++# pragma weak _pthread_mutex_init ++# endif /* __GNU__ */ + # ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST_NP_IN_THREAD_LIB + # pragma weak pthread_mutexattr_setrobust_np + # endif + +=== krb5/src/appl/bsd/krlogind.c +================================================================== +--- krb5/src/appl/bsd/krlogind.c (revision 1833) ++++ krb5/src/appl/bsd/krlogind.c (local) +@@ -302,6 +302,10 @@ + #define MAXDNAME 256 /*per the rfc*/ + #endif + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + char lusername[UT_NAMESIZE+1]; + char rusername[UT_NAMESIZE+1]; + char *krusername = 0; +=== krb5/src/appl/bsd/krshd.c +================================================================== +--- krb5/src/appl/bsd/krshd.c (revision 1833) ++++ krb5/src/appl/bsd/krshd.c (local) +@@ -515,6 +515,11 @@ + #define NCARGS 1024 + #endif + ++#if NCARGS == INT_MAX ++#undef NCARGS ++#define NCARGS 4096 ++#endif ++ + #define NMAX 16 + + int pid; +=== krb5/src/appl/bsd/login.c +================================================================== +--- krb5/src/appl/bsd/login.c (revision 1833) ++++ krb5/src/appl/bsd/login.c (local) +@@ -132,6 +132,14 @@ + #define siglongjmp longjmp + #endif + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + #ifdef POSIX_SIGNALS + typedef struct sigaction handler; + #define handler_init(H,F) (sigemptyset(&(H).sa_mask), \ +=== krb5/src/appl/gssftp/ftp/cmds.c +================================================================== +--- krb5/src/appl/gssftp/ftp/cmds.c (revision 1833) ++++ krb5/src/appl/gssftp/ftp/cmds.c (local) +@@ -66,6 +66,10 @@ + #include + #include + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + #ifdef HAVE_GETCWD + #define getwd(x) getcwd(x,MAXPATHLEN) + #endif +=== krb5/src/appl/gssftp/ftp/ftp.c +================================================================== +--- krb5/src/appl/gssftp/ftp/ftp.c (revision 1833) ++++ krb5/src/appl/gssftp/ftp/ftp.c (local) +@@ -153,6 +153,10 @@ + #include "ftp_var.h" + #include "secure.h" + ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + #ifdef GSSAPI + void user_gss_error (OM_uint32, OM_uint32, char *); + #endif +=== krb5/src/appl/gssftp/ftp/ftp_var.h +================================================================== +--- krb5/src/appl/gssftp/ftp/ftp_var.h (revision 1833) ++++ krb5/src/appl/gssftp/ftp/ftp_var.h (local) +@@ -70,6 +70,10 @@ + #define extern + #endif + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + /* + * Options and other state info. + */ +=== krb5/src/appl/gssftp/ftpd/ftpd.c +================================================================== +--- krb5/src/appl/gssftp/ftpd/ftpd.c (revision 1833) ++++ krb5/src/appl/gssftp/ftpd/ftpd.c (local) +@@ -171,6 +171,14 @@ + #include "ftpd_var.h" + #include "secure.h" + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + extern char *crypt(); + extern char version[]; + extern char *home; /* pointer to home directory for glob */ +=== krb5/src/clients/ksu/ksu.h +================================================================== +--- krb5/src/clients/ksu/ksu.h (revision 1833) ++++ krb5/src/clients/ksu/ksu.h (local) +@@ -56,8 +56,11 @@ + #define CACHE_MODE 0600 + #define MAX_CMD 2048 /* this is temp, should use realloc instead, + as done in most of the code */ +- + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + extern int optind; + extern char * optarg; + +=== krb5/src/kadmin/ktutil/ktutil_funcs.c +================================================================== +--- krb5/src/kadmin/ktutil/ktutil_funcs.c (revision 1833) ++++ krb5/src/kadmin/ktutil/ktutil_funcs.c (local) +@@ -35,6 +35,10 @@ + #include + #include + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + /* + * Free a kt_list + */ +=== krb5/src/lib/kdb/fetch_mkey.c +================================================================== +--- krb5/src/lib/kdb/fetch_mkey.c (revision 1833) ++++ krb5/src/lib/kdb/fetch_mkey.c (local) +@@ -80,6 +80,10 @@ + #define min(a,b) (((a) < (b)) ? (a) : (b)) + #endif + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + krb5_error_code + krb5_db_fetch_mkey(context, mname, etype, fromkeyboard, twice, keyfile, + salt, key) +=== krb5/src/lib/krb4/RealmsConfig-glue.c +================================================================== +--- krb5/src/lib/krb4/RealmsConfig-glue.c (revision 1833) ++++ krb5/src/lib/krb4/RealmsConfig-glue.c (local) +@@ -45,6 +45,10 @@ + #include "krb5.h" + #undef KRB5_PRIVATE + ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + /* These two *must* be kept in sync to avoid buffer overflows. */ + #define SCNSCRATCH "%1023s" + #define SCRATCHSZ 1024 +=== krb5/src/lib/krb4/g_cnffile.c +================================================================== +--- krb5/src/lib/krb4/g_cnffile.c (revision 1833) ++++ krb5/src/lib/krb4/g_cnffile.c (local) +@@ -20,6 +20,10 @@ + #include "k5-int.h" + #include "krb4int.h" + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + krb5_context krb5__krb4_context = 0; + + static FILE* +=== krb5/src/lib/krb4/g_phost.c +================================================================== +--- krb5/src/lib/krb4/g_phost.c (revision 1833) ++++ krb5/src/lib/krb4/g_phost.c (local) +@@ -48,6 +48,10 @@ + * to the original "alias" argument is returned. + */ + ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + char * KRB5_CALLCONV + krb_get_phost(alias) + char *alias; +=== krb5/src/lib/krb4/kuserok.c +================================================================== +--- krb5/src/lib/krb4/kuserok.c (revision 1833) ++++ krb5/src/lib/krb4/kuserok.c (local) +@@ -57,6 +57,10 @@ + #define NOTOK 1 + #define MAX_USERNAME 10 + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + /* + * Given a Kerberos principal "kdata", and a local username "luser", + * determine whether user is authorized to login according to the +=== krb5/src/lib/krb4/send_to_kdc.c +================================================================== +--- krb5/src/lib/krb4/send_to_kdc.c (revision 1833) ++++ krb5/src/lib/krb4/send_to_kdc.c (local) +@@ -55,6 +55,10 @@ + static char *prog = "send_to_kdc"; + #endif + ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + /* + * send_to_kdc() sends a message to the Kerberos authentication + * server(s) in the given realm and returns the reply message. +=== krb5/src/lib/krb4/tkt_string.c +================================================================== +--- krb5/src/lib/krb4/tkt_string.c (revision 1833) ++++ krb5/src/lib/krb4/tkt_string.c (local) +@@ -44,6 +44,10 @@ + uid_t getuid(void) { return 0; } + #endif /* _WIN32 */ + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + /* + * This routine is used to generate the name of the file that holds + * the user's cache of server tickets and associated session keys. +=== krb5/src/lib/krb5/os/kuserok.c +================================================================== +--- krb5/src/lib/krb5/os/kuserok.c (revision 1833) ++++ krb5/src/lib/krb5/os/kuserok.c (local) +@@ -40,6 +40,10 @@ + + #define MAX_USERNAME 65 + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + /* + * Given a Kerberos principal "principal", and a local username "luser", + * determine whether user is authorized to login according to the +=== krb5/src/lib/krb5/os/sn2princ.c +================================================================== +--- krb5/src/lib/krb5/os/sn2princ.c (revision 1833) ++++ krb5/src/lib/krb5/os/sn2princ.c (local) +@@ -61,6 +61,10 @@ + } + + ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + krb5_error_code KRB5_CALLCONV + krb5_sname_to_principal(krb5_context context, const char *hostname, const char *sname, krb5_int32 type, krb5_principal *ret_princ) + { +=== krb5/src/tests/resolve/resolve.c +================================================================== +--- krb5/src/tests/resolve/resolve.c (revision 1833) ++++ krb5/src/tests/resolve/resolve.c (local) +@@ -70,6 +70,10 @@ + + #include + ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + int + main(argc, argv) + int argc; +=== krb5/src/util/db2/btree/bt_open.c +================================================================== +--- krb5/src/util/db2/btree/bt_open.c (revision 1833) ++++ krb5/src/util/db2/btree/bt_open.c (local) +@@ -66,6 +66,10 @@ + #define MINPSIZE 128 + #endif + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + static int byteorder __P((void)); + static int nroot __P((BTREE *)); + static int tmp __P((void)); +=== krb5/src/util/db2/hash/dbm.c +================================================================== +--- krb5/src/util/db2/hash/dbm.c (revision 1833) ++++ krb5/src/util/db2/hash/dbm.c (local) +@@ -58,6 +58,10 @@ + + #define NEED_COPY + ++#ifndef MAXPATHLEN ++# define MAXPATHLEN 4096 ++#endif ++ + /* + * + * This package provides dbm and ndbm compatible interfaces to DB. +=== krb5/src/util/pty/sane_hostname.c +================================================================== +--- krb5/src/util/pty/sane_hostname.c (revision 1833) ++++ krb5/src/util/pty/sane_hostname.c (local) +@@ -29,6 +29,10 @@ + #include "socket-utils.h" + #include "fake-addrinfo.h" + ++#ifndef MAXHOSTNAMELEN ++# define MAXHOSTNAMELEN 256 ++#endif ++ + static void + downcase (char *s) + { --- krb5-1.4.4.orig/debian/patches/krb5-config-include +++ krb5-1.4.4/debian/patches/krb5-config-include @@ -0,0 +1,19 @@ +Never pass -I/usr/include to a compiler. It does bad things. + +Kerberos RT #3011 + +--- krb5-1.4.2.orig/src/krb5-config.in ++++ krb5-1.4.2/src/krb5-config.in +@@ -166,7 +166,11 @@ + fi + + if test -n "$do_cflags"; then +- echo "-I${includedir}" ++ if test x"$includedir" != x"/usr/include" ; then ++ echo "-I${includedir}" ++ else ++ echo '' ++ fi + fi + + --- krb5-1.4.4.orig/debian/patches/MITKRB5-SA-2008-002.patch +++ krb5-1.4.4/debian/patches/MITKRB5-SA-2008-002.patch @@ -0,0 +1,72 @@ +diff -Nru /tmp/9ZL8gn8sZF/krb5-1.4.4/src/lib/rpc/svc.c /tmp/r1rtCthdby/krb5-1.4.4/src/lib/rpc/svc.c +--- /tmp/9ZL8gn8sZF/krb5-1.4.4/src/lib/rpc/svc.c 2008-03-18 11:24:50.000000000 -0700 ++++ /tmp/r1rtCthdby/krb5-1.4.4/src/lib/rpc/svc.c 2008-03-18 11:24:51.000000000 -0700 +@@ -108,15 +108,17 @@ + if (sock < FD_SETSIZE) { + xports[sock] = xprt; + FD_SET(sock, &svc_fdset); ++ if (sock > svc_maxfd) ++ svc_maxfd = sock; + } + #else + if (sock < NOFILE) { + xports[sock] = xprt; + svc_fds |= (1 << sock); ++ if (sock > svc_maxfd) ++ svc_maxfd = sock; + } + #endif /* def FD_SETSIZE */ +- if (sock > svc_maxfd) +- svc_maxfd = sock; + } + + /* +diff -Nru /tmp/9ZL8gn8sZF/krb5-1.4.4/src/lib/rpc/svc_tcp.c /tmp/r1rtCthdby/krb5-1.4.4/src/lib/rpc/svc_tcp.c +--- /tmp/9ZL8gn8sZF/krb5-1.4.4/src/lib/rpc/svc_tcp.c 2004-09-21 11:20:16.000000000 -0700 ++++ /tmp/r1rtCthdby/krb5-1.4.4/src/lib/rpc/svc_tcp.c 2008-03-18 11:24:51.000000000 -0700 +@@ -52,6 +52,14 @@ + extern errno; + */ + ++#ifndef FD_SETSIZE ++#ifdef NBBY ++#define NOFILE (sizeof(int) * NBBY) ++#else ++#define NOFILE (sizeof(int) * 8) ++#endif ++#endif ++ + /* + * Ops vector for TCP/IP based rpc service handle + */ +@@ -212,6 +220,19 @@ + register SVCXPRT *xprt; + register struct tcp_conn *cd; + ++#ifdef FD_SETSIZE ++ if (fd >= FD_SETSIZE) { ++ (void) fprintf(stderr, "svc_tcp: makefd_xprt: fd too high\n"); ++ xprt = NULL; ++ goto done; ++ } ++#else ++ if (fd >= NOFILE) { ++ (void) fprintf(stderr, "svc_tcp: makefd_xprt: fd too high\n"); ++ xprt = NULL; ++ goto done; ++ } ++#endif + xprt = (SVCXPRT *)mem_alloc(sizeof(SVCXPRT)); + if (xprt == (SVCXPRT *)NULL) { + (void) fprintf(stderr, "svc_tcp: makefd_xprt: out of memory\n"); +@@ -267,6 +288,10 @@ + * make a new transporter (re-uses xprt) + */ + xprt = makefd_xprt(sock, r->sendsize, r->recvsize); ++ if (xprt == NULL) { ++ close(sock); ++ return (FALSE); ++ } + xprt->xp_raddr = addr; + xprt->xp_addrlen = len; + xprt->xp_laddr = laddr; --- krb5-1.4.4.orig/debian/patches/debian-krlogin-alpha +++ krb5-1.4.4/debian/patches/debian-krlogin-alpha @@ -0,0 +1,13 @@ +Added with the following log entry: Fix TIOCGLTC lossage on alpha. This +probably isn't appropriate for all non-Linux platforms. + +--- krb5-1.4.2.orig/src/appl/bsd/krlogin.c ++++ krb5-1.4.2/src/appl/bsd/krlogin.c +@@ -137,6 +137,7 @@ + #include + #endif + #endif ++#undef TIOCGLTC + + #ifndef TIOCPKT_NOSTOP + /* These values are over-the-wire protocol, *not* local values */ --- krb5-1.4.4.orig/debian/patches/gc_frm_kdc-doublefree +++ krb5-1.4.4/debian/patches/gc_frm_kdc-doublefree @@ -0,0 +1,57 @@ +=== src/lib/krb5/krb/ChangeLog +================================================================== +--- src/lib/krb5/krb/ChangeLog (revision 1274) ++++ src/lib/krb5/krb/ChangeLog (local) +@@ -1,3 +1,9 @@ ++2005-11-17 Jeffrey Altman ++ ++ * gc_frm_kdc.c (krb5_get_cred_from_kdc_opt): ++ properly track the state of 'tgt' via 'free_tgt' so that ++ we can avoid double-free'ing memory when we return to ++ krb5_get_credentials(). + 2005-09-22 Tom Yu + + * mk_req_ext.c (krb5int_generate_and_save_subkey): Check for and +=== src/lib/krb5/krb/gc_frm_kdc.c +================================================================== +--- src/lib/krb5/krb/gc_frm_kdc.c (revision 1274) ++++ src/lib/krb5/krb/gc_frm_kdc.c (local) +@@ -251,7 +251,6 @@ + /* Copy back in case invalided */ + tgt = otgt; + free_otgt = 0; +- free_tgt = 1; + if (!krb5_c_valid_enctype(tgt.keyblock.enctype)) { + retval = KRB5_PROG_ETYPE_NOSUPP; + goto cleanup; +@@ -325,7 +324,6 @@ + + tgt = otgt; + free_otgt = 0; +- free_tgt = 1; + if (!krb5_c_valid_enctype(tgt.keyblock.enctype)) { + retval = KRB5_PROG_ETYPE_NOSUPP; + goto cleanup; +@@ -365,6 +363,7 @@ + } + + tgt = *ret_tgts[ntgts++]; ++ free_tgt = 0; + } + + /* got one as close as possible, now start all over */ +@@ -413,12 +412,11 @@ + krb5_free_creds(context, tgtr); + tgtr = NULL; + +- if (free_tgt) { ++ if (free_tgt) + krb5_free_cred_contents(context, &tgt); +- free_tgt = 0; +- } + + tgt = *ret_tgts[ntgts++]; ++ free_tgt = 0; + + /* we're done if it is the target */ + --- krb5-1.4.4.orig/debian/patches/patch.gssrpc-signedness +++ krb5-1.4.4/debian/patches/patch.gssrpc-signedness @@ -0,0 +1,56 @@ +Index: krb5-1.4.4/src/lib/rpc/svc_auth_gssapi.c +=================================================================== +--- krb5-1.4.4.orig/src/lib/rpc/svc_auth_gssapi.c 2007-06-19 14:50:26.000000000 -0700 ++++ krb5-1.4.4/src/lib/rpc/svc_auth_gssapi.c 2007-06-19 14:55:41.000000000 -0700 +@@ -148,6 +148,8 @@ + rqst->rq_xprt->xp_auth = &svc_auth_none; + + memset((char *) &call_res, 0, sizeof(call_res)); ++ creds.client_handle.length = 0; ++ creds.client_handle.value = NULL; + + cred = &msg->rm_call.cb_cred; + verf = &msg->rm_call.cb_verf; +Index: krb5-1.4.4/src/lib/rpc/svc_auth_unix.c +=================================================================== +--- krb5-1.4.4.orig/src/lib/rpc/svc_auth_unix.c 2007-06-19 14:51:38.000000000 -0700 ++++ krb5-1.4.4/src/lib/rpc/svc_auth_unix.c 2007-06-19 14:51:41.000000000 -0700 +@@ -64,8 +64,7 @@ + char area_machname[MAX_MACHINE_NAME+1]; + int area_gids[NGRPS]; + } *area; +- u_int auth_len; +- int str_len, gid_len; ++ u_int auth_len, str_len, gid_len; + register int i; + + rqst->rq_xprt->xp_auth = &svc_auth_none; +@@ -74,7 +73,9 @@ + aup = &area->area_aup; + aup->aup_machname = area->area_machname; + aup->aup_gids = area->area_gids; +- auth_len = (u_int)msg->rm_call.cb_cred.oa_length; ++ auth_len = msg->rm_call.cb_cred.oa_length; ++ if (auth_len > INT_MAX) ++ return AUTH_BADCRED; + xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len,XDR_DECODE); + buf = XDR_INLINE(&xdrs, (int)auth_len); + if (buf != NULL) { +@@ -84,7 +85,7 @@ + stat = AUTH_BADCRED; + goto done; + } +- memmove(aup->aup_machname, (caddr_t)buf, (u_int)str_len); ++ memmove(aup->aup_machname, buf, str_len); + aup->aup_machname[str_len] = 0; + str_len = RNDUP(str_len); + buf += str_len / BYTES_PER_XDR_UNIT; +@@ -104,7 +105,7 @@ + * timestamp, hostname len (0), uid, gid, and gids len (0). + */ + if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) { +- (void) printf("bad auth_len gid %d str %d auth %d\n", ++ (void) printf("bad auth_len gid %u str %u auth %u\n", + gid_len, str_len, auth_len); + stat = AUTH_BADCRED; + goto done; --- krb5-1.4.4.orig/debian/patches/debian-no-rpath +++ krb5-1.4.4/debian/patches/debian-no-rpath @@ -0,0 +1,19 @@ +Disable rpath in binaries and libraries to fit Debian policy. Not +suitable for upstream. + +--- krb5-1.4.2.orig/src/config/shlib.conf ++++ krb5-1.4.2/src/config/shlib.conf +@@ -341,10 +341,10 @@ + SHLIB_EXPORT_FILE_DEP=binutils.versions + # For cases where we do have dependencies on other libraries + # built in this tree... +- SHLIB_EXPFLAGS='-Wl,-R$(SHLIB_RDIRS) $(SHLIB_DIRS) $(SHLIB_EXPLIBS)' ++ SHLIB_EXPFLAGS='$(SHLIB_DIRS) $(SHLIB_EXPLIBS)' + PROFFLAGS=-pg +- RPATH_FLAG='-Wl,-rpath -Wl,' +- CC_LINK_SHARED='$(CC) $(PROG_LIBPATH) $(RPATH_FLAG)$(PROG_RPATH) $(CFLAGS) $(LDFLAGS)' ++ RPATH_FLAG='' ++ CC_LINK_SHARED='$(CC) $(PROG_LIBPATH) $(CFLAGS) $(LDFLAGS)' + CC_LINK_STATIC='$(CC) $(PROG_LIBPATH) $(CFLAGS) $(LDFLAGS)' + RUN_ENV='LD_LIBRARY_PATH=`echo $(PROG_LIBPATH) | sed -e "s/-L//g" -e "s/ /:/g"`; export LD_LIBRARY_PATH;' + --- krb5-1.4.4.orig/debian/patches/telnet-help +++ krb5-1.4.4/debian/patches/telnet-help @@ -0,0 +1,50 @@ +2001-11-24 Sam Hartman + + * commands.c main.c: telnet help should telnet to a host called + help not print an incorrect usage message; patch from Graeme + Mathieson + +Kerberos RT #3269 + +--- krb5-1.4.2.orig/src/appl/telnet/telnet/commands.c ++++ krb5-1.4.2/src/appl/telnet/telnet/commands.c +@@ -2446,8 +2446,6 @@ + cmd = *argv; + --argc; ++argv; + while (argc) { +- if (isprefix(*argv, "help") || isprefix(*argv, "?")) +- goto usage; + if (strcmp(*argv, "-l") == 0) { + --argc; ++argv; + if (argc == 0) +@@ -2472,8 +2470,7 @@ + continue; + } + usage: +- printf("usage: %s [-l user] [-a] host-name [port]\r\n", cmd); +- return 0; ++ return 2; + } + if (hostp == 0) + goto usage; +--- krb5-1.4.2.orig/src/appl/telnet/telnet/main.c ++++ krb5-1.4.2/src/appl/telnet/telnet/main.c +@@ -333,10 +333,14 @@ + + if (setjmp(toplevel) != 0) + Exit(0); +- if (tn(argp - args, args) == 1) +- return (0); +- else +- return (1); ++ { ++ int ret = tn(argp - args, args); ++ switch (ret) { ++ case 1: return 0; ++ case 2: usage(); ++ default: return 1; ++ } ++ } + } + (void)setjmp(toplevel); + for (;;) { --- krb5-1.4.4.orig/debian/patches/MITKRB5-SA-2008-001.patch +++ krb5-1.4.4/debian/patches/MITKRB5-SA-2008-001.patch @@ -0,0 +1,333 @@ +diff -Nru /tmp/9ZL8gn8sZF/krb5-1.4.4/src/kdc/dispatch.c /tmp/r1rtCthdby/krb5-1.4.4/src/kdc/dispatch.c +--- /tmp/9ZL8gn8sZF/krb5-1.4.4/src/kdc/dispatch.c 2002-09-10 20:59:27.000000000 -0700 ++++ /tmp/r1rtCthdby/krb5-1.4.4/src/kdc/dispatch.c 2008-03-18 11:24:51.000000000 -0700 +@@ -1,7 +1,7 @@ + /* + * kdc/dispatch.c + * +- * Copyright 1990 by the Massachusetts Institute of Technology. ++ * Copyright 1990, 2007 by the Massachusetts Institute of Technology. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. +@@ -108,7 +108,7 @@ + retval = KRB5KRB_AP_ERR_MSG_TYPE; + #ifndef NOCACHE + /* put the response into the lookaside buffer */ +- if (!retval) ++ if (!retval && *response != NULL) + kdc_insert_lookaside(pkt, from, *response); + #endif + +diff -Nru /tmp/9ZL8gn8sZF/krb5-1.4.4/src/kdc/kerberos_v4.c /tmp/r1rtCthdby/krb5-1.4.4/src/kdc/kerberos_v4.c +--- /tmp/9ZL8gn8sZF/krb5-1.4.4/src/kdc/kerberos_v4.c 2008-03-18 11:24:50.000000000 -0700 ++++ /tmp/r1rtCthdby/krb5-1.4.4/src/kdc/kerberos_v4.c 2008-03-18 11:24:51.000000000 -0700 +@@ -1,7 +1,7 @@ + /* + * kdc/kerberos_v4.c + * +- * Copyright 1985, 1986, 1987, 1988,1991 by the Massachusetts Institute ++ * Copyright 1985, 1986, 1987, 1988,1991,2007 by the Massachusetts Institute + * of Technology. + * All Rights Reserved. + * +@@ -86,11 +86,6 @@ + #define MSB_FIRST 0 /* 68000, IBM RT/PC */ + #define LSB_FIRST 1 /* Vax, PC8086 */ + +-int f; +- +-/* XXX several files in libkdb know about this */ +-char *progname; +- + #ifndef BACKWARD_COMPAT + static Key_schedule master_key_schedule; + static C_Block master_key; +@@ -143,10 +138,8 @@ + #include "extern.h" /* to pick up master_princ */ + #include + +-static krb5_data *response; +- +-void kerberos_v4 (struct sockaddr_in *, KTEXT); +-void kerb_err_reply (struct sockaddr_in *, KTEXT, long, char *); ++static krb5_data *kerberos_v4 (struct sockaddr_in *, KTEXT); ++static krb5_data *kerb_err_reply (struct sockaddr_in *, KTEXT, long, char *); + static int set_tgtkey (char *, krb5_kvno, krb5_boolean); + + /* Attributes converted from V5 to V4 - internal representation */ +@@ -262,12 +255,12 @@ + (void) klog(L_KRB_PERR, "V4 request too long."); + return KRB5KRB_ERR_FIELD_TOOLONG; + } ++ memset( &v4_pkt, 0, sizeof(v4_pkt)); + v4_pkt.length = pkt->length; + v4_pkt.mbz = 0; + memcpy( v4_pkt.dat, pkt->data, pkt->length); + +- kerberos_v4( &client_sockaddr, &v4_pkt); +- *resp = response; ++ *resp = kerberos_v4( &client_sockaddr, &v4_pkt); + return(retval); + } + +@@ -300,19 +293,20 @@ + } + + static +-int krb4_sendto(int s, const char *msg, int len, int flags, +- const struct sockaddr *to, int to_len) ++krb5_data *make_response(const char *msg, int len) + { ++ krb5_data *response; ++ + if ( !(response = (krb5_data *) malloc( sizeof *response))) { +- return ENOMEM; ++ return 0; + } + if ( !(response->data = (char *) malloc( len))) { + krb5_free_data(kdc_context, response); +- return ENOMEM; ++ return 0; + } + response->length = len; + memcpy( response->data, msg, len); +- return( 0); ++ return response; + } + static void + hang(void) +@@ -591,7 +585,7 @@ + *cp = 0; + } + +-void ++static krb5_data * + kerberos_v4(struct sockaddr_in *client, KTEXT pkt) + { + static KTEXT_ST rpkt_st; +@@ -604,7 +598,7 @@ + KTEXT auth = &auth_st; + AUTH_DAT ad_st; + AUTH_DAT *ad = &ad_st; +- ++ krb5_data *response = 0; + + static struct in_addr client_host; + static int msg_byte_order; +@@ -642,8 +636,7 @@ + inet_ntoa(client_host)); + /* send an error reply */ + req_name_ptr = req_inst_ptr = req_realm_ptr = ""; +- kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); +- return; ++ return kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); + } + + /* check packet version */ +@@ -653,8 +646,7 @@ + KRB_PROT_VERSION, req_version, 0); + /* send an error reply */ + req_name_ptr = req_inst_ptr = req_realm_ptr = ""; +- kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); +- return; ++ return kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); + } + msg_byte_order = req_msg_type & 1; + +@@ -712,10 +704,10 @@ + + if ((i = check_princ(req_name_ptr, req_inst_ptr, 0, + &a_name_data, &k5key, 0, &ck5life))) { +- kerb_err_reply(client, pkt, i, "check_princ failed"); ++ response = kerb_err_reply(client, pkt, i, "check_princ failed"); + a_name_data.key_low = a_name_data.key_high = 0; + krb5_free_keyblock_contents(kdc_context, &k5key); +- return; ++ return response; + } + /* don't use k5key for client */ + krb5_free_keyblock_contents(kdc_context, &k5key); +@@ -727,11 +719,11 @@ + /* this does all the checking */ + if ((i = check_princ(service, instance, lifetime, + &s_name_data, &k5key, 1, &sk5life))) { +- kerb_err_reply(client, pkt, i, "check_princ failed"); ++ response = kerb_err_reply(client, pkt, i, "check_princ failed"); + a_name_data.key_high = a_name_data.key_low = 0; + s_name_data.key_high = s_name_data.key_low = 0; + krb5_free_keyblock_contents(kdc_context, &k5key); +- return; ++ return response; + } + /* Bound requested lifetime with service and user */ + v4req_end = krb_life_to_time(kerb_time.tv_sec, req_life); +@@ -802,8 +794,7 @@ + rpkt = create_auth_reply(req_name_ptr, req_inst_ptr, + req_realm_ptr, req_time_ws, 0, a_name_data.exp_date, + a_name_data.key_version, ciph); +- krb4_sendto(f, (char *) rpkt->dat, rpkt->length, 0, +- (struct sockaddr *) client, S_AD_SZ); ++ response = make_response((char *) rpkt->dat, rpkt->length); + memset(&a_name_data, 0, sizeof(a_name_data)); + memset(&s_name_data, 0, sizeof(s_name_data)); + break; +@@ -829,9 +820,8 @@ + lt = klog(L_KRB_PERR, + "APPL request with realm length too long from %s", + inet_ntoa(client_host)); +- kerb_err_reply(client, pkt, RD_AP_INCON, +- "realm length too long"); +- return; ++ return kerb_err_reply(client, pkt, RD_AP_INCON, ++ "realm length too long"); + } + + auth->length += (int) *(pkt->dat + auth->length) + +@@ -840,9 +830,8 @@ + lt = klog(L_KRB_PERR, + "APPL request with funky tkt or req_id length from %s", + inet_ntoa(client_host)); +- kerb_err_reply(client, pkt, RD_AP_INCON, +- "funky tkt or req_id length"); +- return; ++ return kerb_err_reply(client, pkt, RD_AP_INCON, ++ "funky tkt or req_id length"); + } + + memcpy(auth->dat, pkt->dat, auth->length); +@@ -853,18 +842,16 @@ + if ((!allow_v4_crossrealm)&&strcmp(tktrlm, local_realm) != 0) { + lt = klog(L_ERR_UNK, + "Cross realm ticket from %s denied by policy,", tktrlm); +- kerb_err_reply(client, pkt, +- KERB_ERR_PRINCIPAL_UNKNOWN, lt); +- return; ++ return kerb_err_reply(client, pkt, ++ KERB_ERR_PRINCIPAL_UNKNOWN, lt); + } + if (set_tgtkey(tktrlm, kvno, 0)) { +- lt = klog(L_ERR_UNK, ++ lt = klog(L_ERR_UNK, + "FAILED set_tgtkey realm %s, kvno %d. Host: %s ", + tktrlm, kvno, inet_ntoa(client_host)); + /* no better error code */ +- kerb_err_reply(client, pkt, +- KERB_ERR_PRINCIPAL_UNKNOWN, lt); +- return; ++ return kerb_err_reply(client, pkt, ++ KERB_ERR_PRINCIPAL_UNKNOWN, lt); + } + kerno = krb_rd_req(auth, "krbtgt", tktrlm, client_host.s_addr, + ad, 0); +@@ -874,9 +861,8 @@ + "FAILED 3des set_tgtkey realm %s, kvno %d. Host: %s ", + tktrlm, kvno, inet_ntoa(client_host)); + /* no better error code */ +- kerb_err_reply(client, pkt, +- KERB_ERR_PRINCIPAL_UNKNOWN, lt); +- return; ++ return kerb_err_reply(client, pkt, ++ KERB_ERR_PRINCIPAL_UNKNOWN, lt); + } + kerno = krb_rd_req(auth, "krbtgt", tktrlm, client_host.s_addr, + ad, 0); +@@ -886,8 +872,7 @@ + klog(L_ERR_UNK, "FAILED krb_rd_req from %s: %s", + inet_ntoa(client_host), krb_get_err_text(kerno)); + req_name_ptr = req_inst_ptr = req_realm_ptr = ""; +- kerb_err_reply(client, pkt, kerno, "krb_rd_req failed"); +- return; ++ return kerb_err_reply(client, pkt, kerno, "krb_rd_req failed"); + } + ptr = (char *) pkt->dat + auth->length; + +@@ -909,22 +894,21 @@ + req_realm_ptr = ad->prealm; + + if (strcmp(ad->prealm, tktrlm)) { +- kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, +- "Can't hop realms"); +- return; ++ return kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, ++ "Can't hop realms"); + } + if (!strcmp(service, "changepw")) { +- kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, +- "Can't authorize password changed based on TGT"); +- return; ++ return kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, ++ "Can't authorize password changed based on TGT"); + } + kerno = check_princ(service, instance, req_life, + &s_name_data, &k5key, 1, &sk5life); + if (kerno) { +- kerb_err_reply(client, pkt, kerno, "check_princ failed"); ++ response = kerb_err_reply(client, pkt, kerno, ++ "check_princ failed"); + s_name_data.key_high = s_name_data.key_low = 0; + krb5_free_keyblock_contents(kdc_context, &k5key); +- return; ++ return response; + } + /* Bound requested lifetime with service and user */ + v4endtime = krb_life_to_time((KRB4_32)ad->time_sec, ad->life); +@@ -980,8 +964,7 @@ + rpkt = create_auth_reply(ad->pname, ad->pinst, + ad->prealm, time_ws, + 0, 0, 0, ciph); +- krb4_sendto(f, (char *) rpkt->dat, rpkt->length, 0, +- (struct sockaddr *) client, S_AD_SZ); ++ response = make_response((char *) rpkt->dat, rpkt->length); + memset(&s_name_data, 0, sizeof(s_name_data)); + break; + } +@@ -1006,6 +989,7 @@ + break; + } + } ++ return response; + } + + +@@ -1015,7 +999,7 @@ + * client. + */ + +-void ++static krb5_data * + kerb_err_reply(struct sockaddr_in *client, KTEXT pkt, long int err, char *string) + { + static KTEXT_ST e_pkt_st; +@@ -1026,9 +1010,7 @@ + strncat(e_msg, string, sizeof(e_msg) - 1 - 19); + cr_err_reply(e_pkt, req_name_ptr, req_inst_ptr, req_realm_ptr, + req_time_ws, err, e_msg); +- krb4_sendto(f, (char *) e_pkt->dat, e_pkt->length, 0, +- (struct sockaddr *) client, S_AD_SZ); +- ++ return make_response((char *) e_pkt->dat, e_pkt->length); + } + + static int +diff -Nru /tmp/9ZL8gn8sZF/krb5-1.4.4/src/kdc/network.c /tmp/r1rtCthdby/krb5-1.4.4/src/kdc/network.c +--- /tmp/9ZL8gn8sZF/krb5-1.4.4/src/kdc/network.c 2005-07-12 13:59:52.000000000 -0700 ++++ /tmp/r1rtCthdby/krb5-1.4.4/src/kdc/network.c 2008-03-18 11:24:51.000000000 -0700 +@@ -1,7 +1,7 @@ + /* + * kdc/network.c + * +- * Copyright 1990,2000 by the Massachusetts Institute of Technology. ++ * Copyright 1990,2000,2007 by the Massachusetts Institute of Technology. + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. +@@ -748,6 +748,8 @@ + com_err(prog, retval, "while dispatching (udp)"); + return; + } ++ if (response == NULL) ++ return; + cc = sendto(port_fd, response->data, (socklen_t) response->length, 0, + (struct sockaddr *)&saddr, saddr_len); + if (cc == -1) { --- krb5-1.4.4.orig/debian/patches/man-page-fixes-2 +++ krb5-1.4.4/debian/patches/man-page-fixes-2 @@ -0,0 +1,20 @@ +Fix some typos in a configuration variable name. + +Kerberos RT #3468 +Debian bug #347643 + +=== krb5/src/config-files/krb5.conf.M +================================================================== +--- krb5/src/config-files/krb5.conf.M (revision 2079) ++++ krb5/src/config-files/krb5.conf.M (local) +@@ -196,8 +196,8 @@ + + .IP udp_preference_limit + When sending a message to the KDC, the library will try using TCP +-before UDP if the size of the message is above "udp_preference_list". +-If the message is smaller than "udp_preference_list", then UDP will be ++before UDP if the size of the message is above "udp_preference_limit". ++If the message is smaller than "udp_preference_limit", then UDP will be + tried before TCP. Regardless of the size, both protocols will be + tried if the first attempt fails. + --- krb5-1.4.4.orig/debian/patches/cve-2007-3999 +++ krb5-1.4.4/debian/patches/cve-2007-3999 @@ -0,0 +1,27 @@ +=== svc_auth_gss.c +================================================================== +--- svc_auth_gss.c (/remote/krb5/branches/etch/krb5/src/lib/rpc) (revision 2875) ++++ svc_auth_gss.c (/k5-etch/krb5/src/lib/rpc) (local) +@@ -355,6 +355,14 @@ + memset(rpchdr, 0, sizeof(rpchdr)); + + /* XXX - Reconstruct RPC header for signing (from xdr_callmsg). */ ++ oa = &msg->rm_call.cb_cred; ++ if (oa->oa_length > MAX_AUTH_BYTES) ++ return (FALSE); ++ ++ if (sizeof(rpchdr) < (8 * BYTES_PER_XDR_UNIT + ++ RNDUP(oa->oa_length))) ++ return (FALSE); ++ + buf = (int32_t *)(void *)rpchdr; + IXDR_PUT_LONG(buf, msg->rm_xid); + IXDR_PUT_ENUM(buf, msg->rm_direction); +@@ -362,7 +370,6 @@ + IXDR_PUT_LONG(buf, msg->rm_call.cb_prog); + IXDR_PUT_LONG(buf, msg->rm_call.cb_vers); + IXDR_PUT_LONG(buf, msg->rm_call.cb_proc); +- oa = &msg->rm_call.cb_cred; + IXDR_PUT_ENUM(buf, oa->oa_flavor); + IXDR_PUT_LONG(buf, oa->oa_length); + if (oa->oa_length) { --- krb5-1.4.4.orig/debian/patches/kprop-service-name +++ krb5-1.4.4/debian/patches/kprop-service-name @@ -0,0 +1,53 @@ +2001-11-24 Sam Hartman + + * kpropd.c (do_standalone): Default to KPROP port + * kprop.c (open_connection): Default to 754 rather than an error, + Debian bug #120010 + +Kerberos RT #3268 +Debian bug #120010 + +--- krb5-1.4.2.orig/src/slave/kprop.c ++++ krb5-1.4.2/src/slave/kprop.c +@@ -346,13 +346,11 @@ + if(!port) { + sp = getservbyname(KPROP_SERVICE, "tcp"); + if (sp == 0) { +- (void) strncpy(Errmsg, KPROP_SERVICE, ErrmsgSz - 1); +- Errmsg[ErrmsgSz - 1] = '\0'; +- (void) strncat(Errmsg, "/tcp: unknown service", ErrmsgSz - 1 - strlen(Errmsg)); +- *fd = -1; +- return(0); ++ my_sin.sin_port = htons(KPROP_PORT); ++ ++ } else { ++ my_sin.sin_port = sp->s_port; + } +- my_sin.sin_port = sp->s_port; + } else + my_sin.sin_port = port; + s = socket(AF_INET, SOCK_STREAM, 0); +--- krb5-1.4.2.orig/src/slave/kprop.h ++++ krb5-1.4.2/src/slave/kprop.h +@@ -29,6 +29,7 @@ + #define KPROP_SERVICE_NAME "host" + #define TGT_SERVICE_NAME "krbtgt" + #define KPROP_SERVICE "krb5_prop" ++#define KPROP_PORT 754 + + #define KPROP_PROT_VERSION "kprop5_01" + +--- krb5-1.4.2.orig/src/slave/kpropd.c ++++ krb5-1.4.2/src/slave/kpropd.c +@@ -193,9 +193,9 @@ + sp = getservbyname(KPROP_SERVICE, "tcp"); + if (sp == NULL) { + com_err(progname, 0, "%s/tcp: unknown service", KPROP_SERVICE); +- exit(1); ++ my_sin.sin_port = htons(KPROP_PORT); + } +- my_sin.sin_port = sp->s_port; ++ else my_sin.sin_port = sp->s_port; + } else { + my_sin.sin_port = port; + } --- krb5-1.4.4.orig/debian/patches/getpwnam_r-status +++ krb5-1.4.4/debian/patches/getpwnam_r-status @@ -0,0 +1,28 @@ +Debian's getpwnam_r returns success even if the user wasn't found, but +the result pointer is set to NULL. The Kerberos source assumes that +k5_getpwnam_r will fail if the user wasn't found and dereferences OUT +without any further checks. Use a technique similar to the other cases +and change the status to -1 if OUT is NULL. + +A better approach may be to change the source to not assume success +means that OUT is non-NULL, since that appears to be the POSIX behavior. + +Kerberos RT #3490 +Debian bug #354133 (against libpam-krb5) + +=== krb5/src/include/k5-platform.h +================================================================== +--- krb5/src/include/k5-platform.h (revision 2106) ++++ krb5/src/include/k5-platform.h (local) +@@ -503,8 +503,9 @@ + #ifdef HAVE_GETPWNAM_R + # ifndef GETPWNAM_R_4_ARGS + /* POSIX */ +-# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \ +- getpwnam_r(NAME,REC,BUF,BUFSIZE,OUT) ++# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \ ++ (getpwnam_r(NAME,REC,BUF,BUFSIZE,OUT) == 0 \ ++ ? (*(OUT) == NULL ? -1 : 0) : -1) + # else + /* POSIX drafts? */ + # ifdef GETPWNAM_R_RETURNS_INT --- krb5-1.4.4.orig/debian/patches/patch.gssapi_double_free +++ krb5-1.4.4/debian/patches/patch.gssapi_double_free @@ -0,0 +1,15 @@ +--- krb5-1.4.4.orig/src/lib/gssapi/krb5/k5unseal.c ++++ krb5-1.4.4/src/lib/gssapi/krb5/k5unseal.c +@@ -457,8 +457,11 @@ + + if ((ctx->initiate && direction != 0xff) || + (!ctx->initiate && direction != 0)) { +- if (toktype == KG_TOK_SEAL_MSG) ++ if (toktype == KG_TOK_SEAL_MSG) { + xfree(token.value); ++ message_buffer->value = NULL; ++ message_buffer->length = 0; ++ } + *minor_status = G_BAD_DIRECTION; + return(GSS_S_BAD_SIG); + } --- krb5-1.4.4.orig/debian/patches/gss-initialize +++ krb5-1.4.4/debian/patches/gss-initialize @@ -0,0 +1,20 @@ +Always initialize output_token from gss_init_sec_context, even if passed +an unknown mechanism. The krb5 version already did this, but the generic +code did not. Not yet submitted upstream. + +Kerberos RT #3086 +Debian bug #311977 + +=== krb5/src/lib/gssapi/mechglue/g_init_sec_context.c +================================================================== +--- krb5/src/lib/gssapi/mechglue/g_init_sec_context.c (revision 1834) ++++ krb5/src/lib/gssapi/mechglue/g_init_sec_context.c (local) +@@ -77,6 +77,8 @@ + gss_cred_id_t input_cred_handle; + + gss_initialize(); ++ output_token->length = 0; ++ output_token->value = NULL; + + if (context_handle == NULL) + return GSS_S_NO_CONTEXT; --- krb5-1.4.4.orig/debian/patches/man-page-hyphen +++ krb5-1.4.4/debian/patches/man-page-hyphen @@ -0,0 +1,379 @@ +=== src/appl/bsd/klogind.M +================================================================== +--- src/appl/bsd/klogind.M (revision 2260) ++++ src/appl/bsd/klogind.M (local) +@@ -27,7 +27,7 @@ + the port indicated in /etc/inetd.conf. A typical /etc/inetd.conf + configuration line for \fIklogind\fP might be: + +-klogin stream tcp nowait root /usr/sbin/klogind klogind -e5c ++klogin stream tcp nowait root /usr/sbin/klogind klogind \-e5c + + When a service request is received, the following protocol is initiated: + +@@ -74,7 +74,7 @@ + + .IP \fB\-P\fP + Prompt the user for a password. +-If the -P option is passed, then the password is verified in addition ++If the \-P option is passed, then the password is verified in addition + to all other checks. + + .IP \fB\-e\fP +@@ -107,8 +107,8 @@ + ignore authenticator checksusm presented by current Kerberos clients + to protect initial connection information; it is the opposite of + \fB-c\fP. This option is provided because some older +-clients--particularly clients predating the release of Kerberos V5 +-Beta5 (May 1995)--present bogus checksums that prevent Kerberos ++clients -- particularly clients predating the release of Kerberos V5 ++Beta5 (May 1995) -- present bogus checksums that prevent Kerberos + authentication from succeeding in the default mode. + + .PP +=== src/appl/bsd/kshd.M +================================================================== +--- src/appl/bsd/kshd.M (revision 2260) ++++ src/appl/bsd/kshd.M (local) +@@ -30,7 +30,7 @@ + on the port indicated in /etc/inetd.conf. A typical /etc/inetd.conf + configuration line for \fIkrshd\fP might be: + +-kshell stream tcp nowait root /usr/sbin/kshd kshd -5c ++kshell stream tcp nowait root /usr/sbin/kshd kshd \-5c + + When a service request is received, the following protocol is initiated: + +@@ -107,8 +107,8 @@ + ignore authenticator checksusm presented by current Kerberos clients + to protect initial connection information; it is the opposite of + \fB-c\fP. This option is provided because some older +-clients--particularly clients predating the release of Kerberos V5 +-Beta5 (May 1995)--present bogus checksums that prevent Kerberos ++clients -- particularly clients predating the release of Kerberos V5 ++Beta5 (May 1995) -- present bogus checksums that prevent Kerberos + authentication from succeeding in the default mode. + + +=== src/appl/gssftp/ftp/ftp.M +================================================================== +--- src/appl/gssftp/ftp/ftp.M (revision 2260) ++++ src/appl/gssftp/ftp/ftp.M (local) +@@ -951,7 +951,7 @@ + .IR popen (3) + with the argument supplied, and reads from (writes to) stdout (stdin). + If the shell command includes spaces, the argument must be quoted; e.g. +-``" ls -lt"''. A particularly useful example of this mechanism is: ++``" ls \-lt"''. A particularly useful example of this mechanism is: + ``dir more''. + .TP + 3. +=== src/appl/gssftp/ftpd/ftpd.M +================================================================== +--- src/appl/gssftp/ftpd/ftpd.M (revision 2260) ++++ src/appl/gssftp/ftpd/ftpd.M (local) +@@ -36,7 +36,7 @@ + ftpd \- DARPA Internet File Transfer Protocol server + .SH SYNOPSIS + .B ftpd +-[\fB\-A \fP|\fB -a\fP] [\fB\-C\fP] [\fB\-c\fP] [\fB\-d\fP] [\fB-E\fP] ++[\fB\-A \fP|\fB\-a\fP] [\fB\-C\fP] [\fB\-c\fP] [\fB\-d\fP] [\fB\-E\fP] + [\fB\-l\fP] [\fB\-v\fP] [\fB\-T\fP \fImaxtimeout\fP] [\fB\-t\fP \fItimeout\fP] + [\fB\-p\fP \fIport\fP] [\fB\-U\fP \fIftpusers-file\fP] [\fB\-u\fP \fIumask\fP] + [\fB\-r\fP \fIrealm-file\fP] [\fB\-s\fP \fIsrvtab\fP] +@@ -75,7 +75,7 @@ + less secure connections, and should probably only be used when debugging. + .TP + .B \-d +-Debugging information is written to the syslog. (Identical to -v) ++Debugging information is written to the syslog. (Identical to \-v) + .TP + .B \-E + Don't allow passwords to be typed across unencrypted connections. +@@ -90,7 +90,7 @@ + syslog as well. + .TP + .B \-v +-Debugging information is written to the syslog. (Identical to -d) ++Debugging information is written to the syslog. (Identical to \-d) + .TP + \fB\-T\fP \fImaxtimeout\fP + A client may request a maximum timeout period allowed set to +@@ -203,7 +203,7 @@ + .sp -1 + .TP + LIST +-give list files in a directory (``ls -lgA'') ++give list files in a directory (``ls \-lgA'') + .sp -1 + .TP + MIC +=== src/clients/kinit/kinit.M +================================================================== +--- src/clients/kinit/kinit.M (revision 2260) ++++ src/clients/kinit/kinit.M (local) +@@ -87,7 +87,7 @@ + .in -.3i + .fi + .sp +-as in "kinit -l 90m". You cannot mix units; a value of `3h30m' will ++as in "kinit \-l 90m". You cannot mix units; a value of `3h30m' will + result in an error. + .sp + If the +=== src/clients/ksu/ksu.M +================================================================== +--- src/clients/ksu/ksu.M (revision 2260) ++++ src/clients/ksu/ksu.M (local) +@@ -175,28 +175,28 @@ + .PP + Ksu can be used to create a new security context for the + target program (either the target +-shell, or command specified via the -e option). ++shell, or command specified via the \-e option). + The target program inherits a set + of credentials from the source user. + By default, this set includes all of the credentials + in the source cache plus any + additional credentials obtained during authentication. + The source user is able to limit the credentials in this set +-by using -z or -Z option. +--z restricts the copy of tickets from the source cache ++by using \-z or \-Z option. ++\-z restricts the copy of tickets from the source cache + to the target cache to only the tickets where client == +-the target principal name. The -Z option ++the target principal name. The \-Z option + provides the target user with a fresh target cache + (no creds in the cache). Note that for security reasons, + when the source user is root and target user is non-root, +--z option is the default mode of operation. ++\-z option is the default mode of operation. + + While no authentication takes place if the source user + is root or is the same as the target user, additional + tickets can still be obtained for the target cache. +-If -n is specified and no credentials can be copied to the target ++If \-n is specified and no credentials can be copied to the target + cache, the source user is prompted for a Kerberos password +-(unless -Z specified or GET_TGT_VIA_PASSWD is undefined). If ++(unless \-Z specified or GET_TGT_VIA_PASSWD is undefined). If + successful, a TGT is obtained from the Kerberos server and + stored in the target cache. Otherwise, + if a password is not provided (user hit return) +@@ -301,7 +301,7 @@ + \fB\-D + turn on debug mode. + .TP 10 +-\fITicket granting ticket options: -l lifetime -r time -pf\fP ++\fITicket granting ticket options: \-l lifetime \-r time \-pf\fP + The ticket granting ticket options only apply to the + case where there are no appropriate tickets in + the cache to authenticate the source user. In this case +@@ -341,7 +341,7 @@ + principal. Note that the + .B \-z + option is mutually +-exclusive with the -Z option. ++exclusive with the \-Z option. + .TP 10 + \fB\-Z + Don't copy any tickets from the source cache to the +@@ -350,7 +350,7 @@ + initialized to the target principal name. Note that + .B \-Z + option is mutually +-exclusive with the -z option. ++exclusive with the \-z option. + .TP 10 + \fB\-q + suppress the printing of status messages. +@@ -365,7 +365,7 @@ + ls + .B \-lag). + +-\fIThe authorization algorithm for -e is as follows:\fP ++\fIThe authorization algorithm for \-e is as follows:\fP + + If the source user is root or source user == target user, + no authorization takes place and +@@ -418,7 +418,7 @@ + .TP 10 + \fB\-a \fIargs + specify arguments to be passed to the target shell. +-Note: that all flags and parameters following -a ++Note: that all flags and parameters following \-a + will be passed to the shell, thus all options + intended for ksu must precede + .B \-a. +@@ -449,7 +449,7 @@ + during the resolution of the default principal name, + PRINC_LOOK_AHEAD enables ksu to find principal names + in the .k5users file as described in the OPTIONS section +-(see -n option). ++(see \-n option). + .TP 10 + \fICMD_PATH\fP + specifies a list of directories containing programs +@@ -463,8 +463,8 @@ + shell is obtained from the passwd file. + .TP 10 + SAMPLE CONFIGURATION: +-KSU_OPTS = -DGET_TGT_VIA_PASSWD +--DPRINC_LOOK_AHEAD -DCMD_PATH='"/bin /usr/ucb /local/bin" ++KSU_OPTS = \-DGET_TGT_VIA_PASSWD ++\-DPRINC_LOOK_AHEAD \-DCMD_PATH='"/bin /usr/ucb /local/bin" + .TP 10 + PERMISSIONS FOR KSU + ksu should be owned by root and have the set user id bit turned on. +=== src/config-files/krb5.conf.M +================================================================== +--- src/config-files/krb5.conf.M (revision 2260) ++++ src/config-files/krb5.conf.M (local) +@@ -438,7 +438,7 @@ + In the following example, the logging messages from the KDC will go to + the console and to the system log under the facility LOG_DAEMON with + default severity of LOG_INFO; and the logging messages from the +-administrative server will be appended to the file /var/adm/kadmin.log ++administrative server will be appended to the file /var/log/kadmin.log + and sent to the device /dev/tty04. + .sp + .nf +@@ -446,7 +446,7 @@ + [logging] + kdc = CONSOLE + kdc = SYSLOG:INFO:DAEMON +- admin_server = FILE:/var/adm/kadmin.log ++ admin_server = FILE:/var/log/kadmin.log + admin_server = DEVICE=/dev/tty04 + .in -1i + .fi +=== src/kadmin/cli/kadmin.M +================================================================== +--- src/kadmin/cli/kadmin.M (revision 2260) ++++ src/kadmin/cli/kadmin.M (local) +@@ -212,7 +212,7 @@ + .TP + \fB\-policy\fP \fIpolicy\fP + policy used by this principal. If no policy is supplied, then if the +-policy "default" exists and the -clearpolicy is not also specified, ++policy "default" exists and the \-clearpolicy is not also specified, + then the policy "default" is used; otherwise, the principal + will have no policy, and a warning message will be printed. + .TP +@@ -509,7 +509,7 @@ + Key: vno 1, DES cbc mode with CRC-32, Version 4 + Attributes: + Policy: [none] +-kadmin: getprinc -terse systest ++kadmin: getprinc \-terse systest + systest@BLEEP.COM 3 86400 604800 1 + 785926535 753241234 785900000 + tlyu/admin@BLEEP.COM 786100034 0 0 +@@ -639,7 +639,7 @@ + Minimum number of password character classes: 2 + Number of old keys kept: 5 + Reference count: 17 +-kadmin: get_policy -terse admin ++kadmin: get_policy \-terse admin + admin 15552000 0 6 2 5 17 + kadmin: + .TP +@@ -712,7 +712,7 @@ + .RS + .TP + EXAMPLE: +-kadmin: ktadd -k /tmp/foo-new-keytab host/foo.mit.edu ++kadmin: ktadd \-k /tmp/foo-new-keytab host/foo.mit.edu + Entry for principal host/foo.mit.edu@ATHENA.MIT.EDU with + kvno 3, encryption type DES-CBC-CRC added to keytab + WRFILE:/tmp/foo-new-keytab +@@ -739,7 +739,7 @@ + .RS + .TP + EXAMPLE: +-kadmin: ktremove -k /usr/local/var/krb5kdc/kadmind.keytab kadmin/admin ++kadmin: ktremove \-k /usr/local/var/krb5kdc/kadmind.keytab kadmin/admin + Entry for principal kadmin/admin with kvno 3 removed + from keytab WRFILE:/usr/local/var/krb5kdc/kadmind.keytab. + kadmin: +=== src/kadmin/server/kadmind.M +================================================================== +--- src/kadmin/server/kadmind.M (revision 2260) ++++ src/kadmin/server/kadmind.M (local) +@@ -66,7 +66,7 @@ + specifies that the master database password should be fetched from the + keyboard rather than from a file on disk. Note that the server gets the + password prior to putting itself in the background; in combination with +-the -nofork option, you must place it in the background by hand. ++the \-nofork option, you must place it in the background by hand. + .TP + .B \-nofork + specifies that the server does not put itself in the background and does +=== src/kdc/fakeka.M +================================================================== +--- src/kdc/fakeka.M (revision 2260) ++++ src/kdc/fakeka.M (local) +@@ -102,7 +102,7 @@ + Handle requests for a local cell whose name matches the local realm, + accepting forwarded queries from afs1.example.com and afs2.example.com: + .IP "" 4 +-fakeka -m -f afs1.example.com -f afs2.example.com ++fakeka \-m \-f afs1.example.com \-f afs2.example.com + .PP + If the cell name doesn't match the realm name, + .B \-c +=== src/krb5-config.M +================================================================== +--- src/krb5-config.M (revision 2260) ++++ src/krb5-config.M (local) +@@ -26,37 +26,38 @@ + krb5-config \- tool for linking against MIT Kerberos libraries + .SH SYNOPSIS + .B krb5-config +-[ \fB--help\fP | \fB--all\fP | \fB--version\fP | \fB--vendor\fP | \fB--prefix\fP | +-\fB--exec-prefix\fP | \fB--cflags\fP | \fB--libs\fP libraries ] ++[ \fB\-\-help\fP | \fB\-\-all\fP | \fB\-\-version\fP | \fB\-\-vendor\fP ++| \fB\-\-prefix\fP | \fB\-\-exec\-prefix\fP | \fB\-\-cflags\fP ++| \fB\-\-libs\fP libraries ] + .br + .SH DESCRIPTION +-.I krb5-config ++.I krb5\-config + tells the application programmer what special flags to use to compile + and link programs against the installed Kerberos libraries. + .SH OPTIONS + .TP +-\fB\--help\fP ++\fB\-\-help\fP + print usage message. This is the default. + .TP +-\fB\--all\fP ++\fB\-\-all\fP + prints version, vendor, prefix and exec-prefix. + .TP +-\fB\--version\fP ++\fB\-\-version\fP + prints the version of the installed Kerberos implementation. + .TP +-\fB\--vendor\fP ++\fB\-\-vendor\fP + prints the vendor of the installed Kerberos implementation. + .TP +-\fB\--prefix\fP ++\fB\-\-prefix\fP + prints the prefix with which Kerberos was built. + .TP +-\fB\--exec-prefix\fP ++\fB\-\-exec\-prefix\fP + prints the exec-prefix with which Kerberos was built. + .TP +-\fB\--cflags\fP ++\fB\-\-cflags\fP + prints the compiler flags with which Kerberos was built. + .TP +-\fB\--libs\fP \fIlibraries\fP ++\fB\-\-libs\fP \fIlibraries\fP + list compiler options required to link with \fIlibraries\fP. Possible + values for \fIlibraries\fP are: + .sp --- krb5-1.4.4.orig/debian/patches/klogind-authz +++ krb5-1.4.4/debian/patches/klogind-authz @@ -0,0 +1,98 @@ +Better document the verification behavior of klogind and kshd when +.k5login is missing and remove the remaining traces of information about +.rhosts authentication from their man pages. + +Kerberos RT #2577 +Debian bug #250966 + +=== krb5/src/appl/bsd/klogind.M +================================================================== +--- krb5/src/appl/bsd/klogind.M (revision 2042) ++++ krb5/src/appl/bsd/klogind.M (local) +@@ -34,22 +34,26 @@ + .IP 1) + Check authentication. + .IP 2) +-Check authorization via the access-control files \fI.k5login\fP, \fI.klogin\fP +-and \fI.rhosts\fP in the user's home directory. ++Check authorization via the access-control files \fI.k5login\fP and ++\fI.klogin\fP in the user's home directory. + .IP 3) + Prompt for password if any checks fail and the \fI-p\fP option was supplied. + .PP + If the authentication succeeds, login the user by calling the accompanying + login.krb5 or /bin/login, according to the definition of +-DO_NOT_USE_K_LOGIN. ++DO_NOT_USE_K_LOGIN. + .PP + The configuration of \fIklogind\fP is done + by command line arguments passed by inetd. The options are: + .IP \fB\-5\fP 10 + Allow Kerberos V5 authentication with the \fI.k5login\fP access control + file to be trusted. If this authentication system is used by the client +-and the authorization check is passed, then the user is allowed to log +-in. ++and the authorization check is passed, then the user is allowed to log in. ++If the user has no \fI.k5login\fP file, the login will be authorized if ++the results of krb5_aname_to_localname conversion matches the account ++name. Unless special rules are configured, this will be true if and only ++if the Kerberos principal of the connecting user is in the default local ++realm and the principal portion matches the account name. + + .IP \fB\-4\fP + Allow Kerberos V4 authentication with the \fI.klogin\fP access control +@@ -107,13 +111,7 @@ + Beta5 (May 1995)--present bogus checksums that prevent Kerberos + authentication from succeeding in the default mode. + +- + .PP +-If the +-~/.rhosts check is to be used, then the program verifies that the +-client is connecting from a privileged port, before allowing login. +- +-.PP + The parent of the login process manipulates the master side of the + pseduo terminal, operating as an intermediary between the login + process and the client instance of the +=== krb5/src/appl/bsd/kshd.M +================================================================== +--- krb5/src/appl/bsd/kshd.M (revision 2042) ++++ krb5/src/appl/bsd/kshd.M (local) +@@ -37,8 +37,8 @@ + .IP 1) + Authentication is checked + .IP 2) +-Check authorization via the access-control files \fI.k5login\fP, \fI.klogin\fP +-and \fI.rhosts\fP in the user's home directory. ++Check authorization via the access-control files \fI.k5login\fP and ++\fI.klogin\fP in the user's home directory. + .IP 3) + A null byte is returned on the initial socket + and the command line is passed to the normal login +@@ -53,8 +53,13 @@ + + .IP \fB\-5\fP 10 + Allow Kerberos5 authentication with the \fI.k5login\fP access control file +-to be trusted. If this authentication system is used by the client and the +-authorization check is passed, then the user is allowed to log in. ++to be trusted. If this authentication system is used by the client and ++the authorization check is passed, then the user is allowed to log in. If ++the user has no \fI.k5login\fP file, the login will be authorized if the ++results of krb5_aname_to_localname conversion matches the account name. ++Unless special rules are configured, this will be true if and only if the ++Kerberos principal of the connecting user is in the default local realm ++and the principal portion matches the account name. + + .IP \fB\-4\fP + Allow Kerberos4 authentication with the \fI.klogin\fP access control file +@@ -108,9 +113,6 @@ + + + .PP +-If the \fB\-r\fP or \fB\-R\fP options are used, the client must +-connect from a privileged port. +-.PP + \fIKrshd\fP supports six options which may be used for testing: + + .IP \fB\-S\ keytab\fP 10 --- krb5-1.4.4.orig/debian/patches/man-page-fixes +++ krb5-1.4.4/debian/patches/man-page-fixes @@ -0,0 +1,33 @@ +Fix various nroff man page problems. + +Kerberos RT #3015 + +--- krb5-1.4.2.orig/src/appl/bsd/kshd.M ++++ krb5-1.4.2/src/appl/bsd/kshd.M +@@ -126,7 +126,7 @@ + Use the argument to find the Kerberos binaries. Normally a compiled + in argument is used. + +-.IP \fB\-D\ port \fP ++.IP \fB\-D\ port\fP + Run in standalone mode, listening on \fBport\fP. The daemon will exit + after one connection and will not background itself. + +--- krb5-1.4.2.orig/src/clients/kinit/kinit.M ++++ krb5-1.4.2/src/clients/kinit/kinit.M +@@ -45,7 +45,8 @@ + .SH DESCRIPTION + .I kinit + obtains and caches an initial ticket-granting ticket for +-.IR principal . The typical default behavior is to acquire only ++.IR principal . ++The typical default behavior is to acquire only + Kerberos 5 tickets. However, if kinit was built with both + Kerberos 4 support and with the default behavior of acquiring both + types of tickets, it will try to acquire both Kerberos 5 and Kerberos 4 +@@ -197,4 +198,4 @@ + .B keytab + file. + .SH SEE ALSO +-klist(1), kdestroy(1), krb5(3) ++klist(1), kdestroy(1), kerberos(1) --- krb5-1.4.4.orig/debian/patches/manpage-new +++ krb5-1.4.4/debian/patches/manpage-new @@ -0,0 +1,198 @@ +Document previously undocumented commands. Patch has been submitted +upstream. + +Kerberos RT #3013 + +Index: krb5/src/kdc/Makefile.in +=================================================================== +--- krb5/src/kdc/Makefile.in (revision 1789) ++++ krb5/src/kdc/Makefile.in (working copy) +@@ -88,6 +88,7 @@ + f=$(FAKEKA); \ + if test -n "$$f" ; then \ + $(INSTALL_PROGRAM) $$f ${DESTDIR}$(SERVER_BINDIR)/$$f; \ ++ $(INSTALL_DATA) $(srcdir)/fakeka.M ${DESTDIR}$(SERVER_MANDIR)/fakeka.8; \ + fi + + clean:: +Index: src/kdc/fakeka.M +=================================================================== +--- krb5/src/kdc/fakeka.M (revision 0) ++++ krb5/src/kdc/fakeka.M (revision 0) +@@ -0,0 +1,111 @@ ++.\" kdc/fakeka.M ++.\" ++.\" Copyright 2005 by the Massachusetts Institute of Technology. ++.\" ++.\" Export of this software from the United States of America may ++.\" require a specific license from the United States Government. ++.\" It is the responsibility of any person or organization contemplating ++.\" export to obtain such a license before exporting. ++.\" ++.\" WITHIN THAT CONSTRAINT, permission to use, copy, modify, and ++.\" distribute this software and its documentation for any purpose and ++.\" without fee is hereby granted, provided that the above copyright ++.\" notice appear in all copies and that both that copyright notice and ++.\" this permission notice appear in supporting documentation, and that ++.\" the name of M.I.T. not be used in advertising or publicity pertaining ++.\" to distribution of the software without specific, written prior ++.\" permission. Furthermore if you modify this software you must label ++.\" your software as modified software and not distribute it in such a ++.\" fashion that it might be confused with the original M.I.T. software. ++.\" M.I.T. makes no representations about the suitability of ++.\" this software for any purpose. It is provided "as is" without express ++.\" or implied warranty. ++.\" " ++.TH FAKEKA 8 ++.SH NAME ++fakeka \- Fake kaserver for AFS clients ++.SH SYNOPSIS ++\fBfakeka\fP [\fB\-dm\fP] [\fB\-c\fP \fIcell\fP] [\fB\-f\fP \fIforwarder\fP] ++[\fB\-l\fP \fBfacility\fP] [\fB\-p\fP \fBport\fP] [\fB\-r\fP \fIrealm\fP] ++.br ++.SH DESCRIPTION ++.I fakeka ++is a fake kaserver that speaks just enough of the AFS RX protocol to make ++klog work. It is used in conjunction with a Kerberos V5 KDC to support ++existing AFS clients, and is usually used with ka-forwarder. ++.I fakeka ++must run on the same host as your Kerberos V5 KDC, since it needs access ++to the KDC database. ka-forwarder should run on each of your AFS database ++servers, pointing to your Kerberos V5 KDCs. ++.I fakeka ++should then be running on each of the KDCs, with the AFS database servers ++listed as arguments to the ++.B -f ++option. ++.PP ++Note that principals you wish to use ++.I fakeka ++with must have either a V4-style key (des:v4) or an AFS-style key ++(des:afs3). V5 enctypes won't work. ++.SH OPTIONS ++.TP ++\fB\-c\fP \fIcell\fP ++The AFS cell for which ++.I fakeka ++will be handling requests. If not given, this defaults to the same as the ++Kerberos V5 realm (see ++.B \-r ++below). ++.TP ++.B \-d ++Enables debugging. When this flag is given, ++.I fakeka ++will run in the foreground and print debugging information to standard ++error. Overrides ++.BR \-m . ++.TP ++\fB\-f\fP \fIforwarder\fP ++Allows forwarded requests from ++.IR forwarder , ++which is generally an AFS database server running ka-forwarder. This ++option can be given multiple times (up to 10). Each system running ++ka-forwarder should be specified with the ++.B \-f ++flag or forwarded requests from that host will not be answered. (The ++forwarders append their own address to the packet. ++.TP ++\fB\-l\fP \fIfacility\fP ++Log actions via syslog with the given ++.I facility ++rather than the default of LOG_DAEMON. ++.I facility ++must be one of KERN, USER, MAIL, DAEMON, AUTH, LPR, NEWS, UUCP, CRON, ++LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, or LOCAL7. This ++option is case-sensitive. Not all of these facilities may be available, ++depending on what pre-defined syslog facilities your system provides. ++.TP ++.B \-m ++Fork and background when starting. You will usually always want to give ++this flag. ++.TP ++\fB\-p\fP \fIport\fP ++Listen on the specified port rather than the default of 7004 (which is ++what klog expects). ++.I port ++may be a number or a service name from ++.IR /etc/services . ++.TP ++\fB\-r\fP \fIrealm\fP ++The Kerberos V5 realm to which the requests are being translated. The ++default is the local default realm. ++.SH EXAMPLES ++Handle requests for a local cell whose name matches the local realm, ++accepting forwarded queries from afs1.example.com and afs2.example.com: ++.IP "" 4 ++fakeka -m -f afs1.example.com -f afs2.example.com ++.PP ++If the cell name doesn't match the realm name, ++.B \-c ++would need to be added, specifying the cell name. ++.SH SEE ALSO ++ka-forwarder(8) +Index: krb5/src/krb524/Makefile.in +=================================================================== +--- krb5/src/krb524/Makefile.in (revision 1789) ++++ krb5/src/krb524/Makefile.in (working copy) +@@ -93,6 +93,8 @@ + $(INSTALL_PROGRAM) krb524d $(DESTDIR)$(SERVER_BINDIR)/krb524d + $(INSTALL_PROGRAM) k524init $(DESTDIR)$(CLIENT_BINDIR)/krb524init + $(INSTALL_DATA) $(srcdir)/krb524d.M $(DESTDIR)$(SERVER_MANDIR)/krb524d.8 ++ $(INSTALL_DATA) $(srcdir)/k524init.M \ ++ $(DESTDIR)$(CLIENT_MANDIR)/krb524init.1 + + clean-unix:: + $(RM) $(OBJS) core *~ *.bak #* +Index: krb5/src/krb524/k524init.M +=================================================================== +--- krb5/src/krb524/k524init.M (revision 0) ++++ krb5/src/krb524/k524init.M (revision 0) +@@ -0,0 +1,47 @@ ++.\" krb524/k524init.M ++.\" ++.\" Copyright 2005 by the Massachusetts Institute of Technology. ++.\" ++.\" Export of this software from the United States of America may ++.\" require a specific license from the United States Government. ++.\" It is the responsibility of any person or organization contemplating ++.\" export to obtain such a license before exporting. ++.\" ++.\" WITHIN THAT CONSTRAINT, permission to use, copy, modify, and ++.\" distribute this software and its documentation for any purpose and ++.\" without fee is hereby granted, provided that the above copyright ++.\" notice appear in all copies and that both that copyright notice and ++.\" this permission notice appear in supporting documentation, and that ++.\" the name of M.I.T. not be used in advertising or publicity pertaining ++.\" to distribution of the software without specific, written prior ++.\" permission. Furthermore if you modify this software you must label ++.\" your software as modified software and not distribute it in such a ++.\" fashion that it might be confused with the original M.I.T. software. ++.\" M.I.T. makes no representations about the suitability of ++.\" this software for any purpose. It is provided "as is" without express ++.\" or implied warranty. ++.\" " ++.TH KRB524INIT 1 ++.SH NAME ++krb524init \- Obtain Kerberos V4 tickets from Kerberos V5 tickets ++.SH SYNOPSIS ++\fBkrb524init\fP [\fB\-n\fP] [\fB\-p\fP \fIprincipal\fP] ++.SH DESCRIPTION ++.I krb524init ++converts a V5 credential to a V4 credential by querying a remote krb524d ++server and stores it in a V4 ticket cache. The credential is ++.I principal ++or "krbtgt" at the V5 ticket cache's default principal's realm if not ++specified. ++.SH OPTIONS ++.TP ++.B \-n ++By default, the V4 ticket cache is initialized. If this option is given, ++the converted credential is instead added to the existing ticket cache. ++.TP ++\fB\-p\fP \fIprincipal\fP ++Convert ++.I principal ++rather than krbtgt. ++.SH SEE ALSO ++kinit(1), krb524d(8) --- krb5-1.4.4.orig/debian/patches/empty-keytab +++ krb5-1.4.4/debian/patches/empty-keytab @@ -0,0 +1,20 @@ +Prevent a library double-free and crash when a keytab is zero-length. +Patch from Rainer Weikusat with some modifications. + +Kerberos RT #3549 +Debian bug #344295 + +--- krb5-1.4.3.orig/src/lib/krb5/keytab/kt_file.c ++++ krb5-1.4.3/src/lib/krb5/keytab/kt_file.c +@@ -1107,7 +1107,10 @@ + } else { + /* gotta verify it instead... */ + if (!xfread(&kt_vno, sizeof(kt_vno), 1, KTFILEP(id))) { +- kerror = errno; ++ if (feof(KTFILEP(id))) ++ kerror = KRB5_KEYTAB_BADVNO; ++ else ++ kerror = errno; + (void) krb5_unlock_file(context, fileno(KTFILEP(id))); + (void) fclose(KTFILEP(id)); + return kerror; --- krb5-1.4.4.orig/debian/krb5-rsh-server.install +++ krb5-1.4.4/debian/krb5-rsh-server.install @@ -0,0 +1,6 @@ +usr/sbin/klogind +usr/share/man/man8/klogind.8 +usr/sbin/kshd +usr/share/man/man8/kshd.8 +usr/sbin/login.krb5 +usr/share/man/man8/login.krb5.8 --- krb5-1.4.4.orig/debian/krb5-doc.doc-base.user +++ krb5-1.4.4/debian/krb5-doc.doc-base.user @@ -0,0 +1,9 @@ +Document: krb5-user +Title: Kerberos Version 5 User's Guide +Author: MIT +Abstract: User's guide for MIT Kerberos Version 5. +Section: Apps/System + +Format: HTML +Index: /usr/share/doc/krb5-doc/krb5-user/index.html +Files: /usr/share/doc/krb5-doc/krb5-user/* --- krb5-1.4.4.orig/debian/krb5-kdc.prerm +++ krb5-1.4.4/debian/krb5-kdc.prerm @@ -0,0 +1,15 @@ +#! /bin/sh + +set -e +case "$1" in + remove|deconfigure) + # If netbase is not installed, we don't need to do the remove. + if command -v update-inetd >/dev/null 2>&1 ; then + update-inetd --remove '#?krb5_prop.*/usr/sbin/kpropd' + fi + ;; +esac + +#DEBHELPER# + +exit 0 --- krb5-1.4.4.orig/debian/krb5-admin-server.postrm +++ krb5-1.4.4/debian/krb5-admin-server.postrm @@ -0,0 +1,11 @@ +#! /bin/sh + +set -e + +case "$1" in +purge) + rm -f /etc/default/krb5-admin-server + ;; +esac + +#DEBHELPER# --- krb5-1.4.4.orig/src/tests/resolve/resolve.c +++ krb5-1.4.4/src/tests/resolve/resolve.c @@ -70,6 +70,10 @@ #include +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + int main(argc, argv) int argc; --- krb5-1.4.4.orig/src/kdc/dispatch.c +++ krb5-1.4.4/src/kdc/dispatch.c @@ -1,7 +1,7 @@ /* * kdc/dispatch.c * - * Copyright 1990 by the Massachusetts Institute of Technology. + * Copyright 1990, 2007 by the Massachusetts Institute of Technology. * * Export of this software from the United States of America may * require a specific license from the United States Government. @@ -108,7 +108,7 @@ retval = KRB5KRB_AP_ERR_MSG_TYPE; #ifndef NOCACHE /* put the response into the lookaside buffer */ - if (!retval) + if (!retval && *response != NULL) kdc_insert_lookaside(pkt, from, *response); #endif --- krb5-1.4.4.orig/src/kdc/network.c +++ krb5-1.4.4/src/kdc/network.c @@ -1,7 +1,7 @@ /* * kdc/network.c * - * Copyright 1990,2000 by the Massachusetts Institute of Technology. + * Copyright 1990,2000,2007 by the Massachusetts Institute of Technology. * * Export of this software from the United States of America may * require a specific license from the United States Government. @@ -748,6 +748,8 @@ com_err(prog, retval, "while dispatching (udp)"); return; } + if (response == NULL) + return; cc = sendto(port_fd, response->data, (socklen_t) response->length, 0, (struct sockaddr *)&saddr, saddr_len); if (cc == -1) { --- krb5-1.4.4.orig/src/kdc/kerberos_v4.c +++ krb5-1.4.4/src/kdc/kerberos_v4.c @@ -1,7 +1,7 @@ /* * kdc/kerberos_v4.c * - * Copyright 1985, 1986, 1987, 1988,1991 by the Massachusetts Institute + * Copyright 1985, 1986, 1987, 1988,1991,2007 by the Massachusetts Institute * of Technology. * All Rights Reserved. * @@ -86,11 +86,6 @@ #define MSB_FIRST 0 /* 68000, IBM RT/PC */ #define LSB_FIRST 1 /* Vax, PC8086 */ -int f; - -/* XXX several files in libkdb know about this */ -char *progname; - #ifndef BACKWARD_COMPAT static Key_schedule master_key_schedule; static C_Block master_key; @@ -141,11 +136,10 @@ */ #include "com_err.h" #include "extern.h" /* to pick up master_princ */ +#include -static krb5_data *response; - -void kerberos_v4 (struct sockaddr_in *, KTEXT); -void kerb_err_reply (struct sockaddr_in *, KTEXT, long, char *); +static krb5_data *kerberos_v4 (struct sockaddr_in *, KTEXT); +static krb5_data *kerb_err_reply (struct sockaddr_in *, KTEXT, long, char *); static int set_tgtkey (char *, krb5_kvno, krb5_boolean); /* Attributes converted from V5 to V4 - internal representation */ @@ -261,12 +255,12 @@ (void) klog(L_KRB_PERR, "V4 request too long."); return KRB5KRB_ERR_FIELD_TOOLONG; } + memset( &v4_pkt, 0, sizeof(v4_pkt)); v4_pkt.length = pkt->length; v4_pkt.mbz = 0; memcpy( v4_pkt.dat, pkt->data, pkt->length); - kerberos_v4( &client_sockaddr, &v4_pkt); - *resp = response; + *resp = kerberos_v4( &client_sockaddr, &v4_pkt); return(retval); } @@ -299,19 +293,20 @@ } static -int krb4_sendto(int s, const char *msg, int len, int flags, - const struct sockaddr *to, int to_len) +krb5_data *make_response(const char *msg, int len) { + krb5_data *response; + if ( !(response = (krb5_data *) malloc( sizeof *response))) { - return ENOMEM; + return 0; } if ( !(response->data = (char *) malloc( len))) { krb5_free_data(kdc_context, response); - return ENOMEM; + return 0; } response->length = len; memcpy( response->data, msg, len); - return( 0); + return response; } static void hang(void) @@ -590,7 +585,7 @@ *cp = 0; } -void +static krb5_data * kerberos_v4(struct sockaddr_in *client, KTEXT pkt) { static KTEXT_ST rpkt_st; @@ -603,7 +598,7 @@ KTEXT auth = &auth_st; AUTH_DAT ad_st; AUTH_DAT *ad = &ad_st; - + krb5_data *response = 0; static struct in_addr client_host; static int msg_byte_order; @@ -641,8 +636,7 @@ inet_ntoa(client_host)); /* send an error reply */ req_name_ptr = req_inst_ptr = req_realm_ptr = ""; - kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); - return; + return kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); } /* check packet version */ @@ -652,8 +646,7 @@ KRB_PROT_VERSION, req_version, 0); /* send an error reply */ req_name_ptr = req_inst_ptr = req_realm_ptr = ""; - kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); - return; + return kerb_err_reply(client, pkt, KERB_ERR_PKT_VER, lt); } msg_byte_order = req_msg_type & 1; @@ -711,10 +704,10 @@ if ((i = check_princ(req_name_ptr, req_inst_ptr, 0, &a_name_data, &k5key, 0, &ck5life))) { - kerb_err_reply(client, pkt, i, "check_princ failed"); + response = kerb_err_reply(client, pkt, i, "check_princ failed"); a_name_data.key_low = a_name_data.key_high = 0; krb5_free_keyblock_contents(kdc_context, &k5key); - return; + return response; } /* don't use k5key for client */ krb5_free_keyblock_contents(kdc_context, &k5key); @@ -726,11 +719,11 @@ /* this does all the checking */ if ((i = check_princ(service, instance, lifetime, &s_name_data, &k5key, 1, &sk5life))) { - kerb_err_reply(client, pkt, i, "check_princ failed"); + response = kerb_err_reply(client, pkt, i, "check_princ failed"); a_name_data.key_high = a_name_data.key_low = 0; s_name_data.key_high = s_name_data.key_low = 0; krb5_free_keyblock_contents(kdc_context, &k5key); - return; + return response; } /* Bound requested lifetime with service and user */ v4req_end = krb_life_to_time(kerb_time.tv_sec, req_life); @@ -801,8 +794,7 @@ rpkt = create_auth_reply(req_name_ptr, req_inst_ptr, req_realm_ptr, req_time_ws, 0, a_name_data.exp_date, a_name_data.key_version, ciph); - krb4_sendto(f, (char *) rpkt->dat, rpkt->length, 0, - (struct sockaddr *) client, S_AD_SZ); + response = make_response((char *) rpkt->dat, rpkt->length); memset(&a_name_data, 0, sizeof(a_name_data)); memset(&s_name_data, 0, sizeof(s_name_data)); break; @@ -828,9 +820,8 @@ lt = klog(L_KRB_PERR, "APPL request with realm length too long from %s", inet_ntoa(client_host)); - kerb_err_reply(client, pkt, RD_AP_INCON, - "realm length too long"); - return; + return kerb_err_reply(client, pkt, RD_AP_INCON, + "realm length too long"); } auth->length += (int) *(pkt->dat + auth->length) + @@ -839,9 +830,8 @@ lt = klog(L_KRB_PERR, "APPL request with funky tkt or req_id length from %s", inet_ntoa(client_host)); - kerb_err_reply(client, pkt, RD_AP_INCON, - "funky tkt or req_id length"); - return; + return kerb_err_reply(client, pkt, RD_AP_INCON, + "funky tkt or req_id length"); } memcpy(auth->dat, pkt->dat, auth->length); @@ -852,18 +842,16 @@ if ((!allow_v4_crossrealm)&&strcmp(tktrlm, local_realm) != 0) { lt = klog(L_ERR_UNK, "Cross realm ticket from %s denied by policy,", tktrlm); - kerb_err_reply(client, pkt, - KERB_ERR_PRINCIPAL_UNKNOWN, lt); - return; + return kerb_err_reply(client, pkt, + KERB_ERR_PRINCIPAL_UNKNOWN, lt); } if (set_tgtkey(tktrlm, kvno, 0)) { - lt = klog(L_ERR_UNK, + lt = klog(L_ERR_UNK, "FAILED set_tgtkey realm %s, kvno %d. Host: %s ", tktrlm, kvno, inet_ntoa(client_host)); /* no better error code */ - kerb_err_reply(client, pkt, - KERB_ERR_PRINCIPAL_UNKNOWN, lt); - return; + return kerb_err_reply(client, pkt, + KERB_ERR_PRINCIPAL_UNKNOWN, lt); } kerno = krb_rd_req(auth, "krbtgt", tktrlm, client_host.s_addr, ad, 0); @@ -873,9 +861,8 @@ "FAILED 3des set_tgtkey realm %s, kvno %d. Host: %s ", tktrlm, kvno, inet_ntoa(client_host)); /* no better error code */ - kerb_err_reply(client, pkt, - KERB_ERR_PRINCIPAL_UNKNOWN, lt); - return; + return kerb_err_reply(client, pkt, + KERB_ERR_PRINCIPAL_UNKNOWN, lt); } kerno = krb_rd_req(auth, "krbtgt", tktrlm, client_host.s_addr, ad, 0); @@ -885,8 +872,7 @@ klog(L_ERR_UNK, "FAILED krb_rd_req from %s: %s", inet_ntoa(client_host), krb_get_err_text(kerno)); req_name_ptr = req_inst_ptr = req_realm_ptr = ""; - kerb_err_reply(client, pkt, kerno, "krb_rd_req failed"); - return; + return kerb_err_reply(client, pkt, kerno, "krb_rd_req failed"); } ptr = (char *) pkt->dat + auth->length; @@ -908,22 +894,21 @@ req_realm_ptr = ad->prealm; if (strcmp(ad->prealm, tktrlm)) { - kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, - "Can't hop realms"); - return; + return kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, + "Can't hop realms"); } if (!strcmp(service, "changepw")) { - kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, - "Can't authorize password changed based on TGT"); - return; + return kerb_err_reply(client, pkt, KERB_ERR_PRINCIPAL_UNKNOWN, + "Can't authorize password changed based on TGT"); } kerno = check_princ(service, instance, req_life, &s_name_data, &k5key, 1, &sk5life); if (kerno) { - kerb_err_reply(client, pkt, kerno, "check_princ failed"); + response = kerb_err_reply(client, pkt, kerno, + "check_princ failed"); s_name_data.key_high = s_name_data.key_low = 0; krb5_free_keyblock_contents(kdc_context, &k5key); - return; + return response; } /* Bound requested lifetime with service and user */ v4endtime = krb_life_to_time((KRB4_32)ad->time_sec, ad->life); @@ -979,8 +964,7 @@ rpkt = create_auth_reply(ad->pname, ad->pinst, ad->prealm, time_ws, 0, 0, 0, ciph); - krb4_sendto(f, (char *) rpkt->dat, rpkt->length, 0, - (struct sockaddr *) client, S_AD_SZ); + response = make_response((char *) rpkt->dat, rpkt->length); memset(&s_name_data, 0, sizeof(s_name_data)); break; } @@ -1005,6 +989,7 @@ break; } } + return response; } @@ -1014,7 +999,7 @@ * client. */ -void +static krb5_data * kerb_err_reply(struct sockaddr_in *client, KTEXT pkt, long int err, char *string) { static KTEXT_ST e_pkt_st; @@ -1025,9 +1010,7 @@ strncat(e_msg, string, sizeof(e_msg) - 1 - 19); cr_err_reply(e_pkt, req_name_ptr, req_inst_ptr, req_realm_ptr, req_time_ws, err, e_msg); - krb4_sendto(f, (char *) e_pkt->dat, e_pkt->length, 0, - (struct sockaddr *) client, S_AD_SZ); - + return make_response((char *) e_pkt->dat, e_pkt->length); } static int --- krb5-1.4.4.orig/src/kdc/fakeka.M +++ krb5-1.4.4/src/kdc/fakeka.M @@ -0,0 +1,111 @@ +.\" kdc/fakeka.M +.\" +.\" Copyright 2005 by the Massachusetts Institute of Technology. +.\" +.\" Export of this software from the United States of America may +.\" require a specific license from the United States Government. +.\" It is the responsibility of any person or organization contemplating +.\" export to obtain such a license before exporting. +.\" +.\" WITHIN THAT CONSTRAINT, permission to use, copy, modify, and +.\" distribute this software and its documentation for any purpose and +.\" without fee is hereby granted, provided that the above copyright +.\" notice appear in all copies and that both that copyright notice and +.\" this permission notice appear in supporting documentation, and that +.\" the name of M.I.T. not be used in advertising or publicity pertaining +.\" to distribution of the software without specific, written prior +.\" permission. Furthermore if you modify this software you must label +.\" your software as modified software and not distribute it in such a +.\" fashion that it might be confused with the original M.I.T. software. +.\" M.I.T. makes no representations about the suitability of +.\" this software for any purpose. It is provided "as is" without express +.\" or implied warranty. +.\" " +.TH FAKEKA 8 +.SH NAME +fakeka \- Fake kaserver for AFS clients +.SH SYNOPSIS +\fBfakeka\fP [\fB\-dm\fP] [\fB\-c\fP \fIcell\fP] [\fB\-f\fP \fIforwarder\fP] +[\fB\-l\fP \fBfacility\fP] [\fB\-p\fP \fBport\fP] [\fB\-r\fP \fIrealm\fP] +.br +.SH DESCRIPTION +.I fakeka +is a fake kaserver that speaks just enough of the AFS RX protocol to make +klog work. It is used in conjunction with a Kerberos V5 KDC to support +existing AFS clients, and is usually used with ka-forwarder. +.I fakeka +must run on the same host as your Kerberos V5 KDC, since it needs access +to the KDC database. ka-forwarder should run on each of your AFS database +servers, pointing to your Kerberos V5 KDCs. +.I fakeka +should then be running on each of the KDCs, with the AFS database servers +listed as arguments to the +.B -f +option. +.PP +Note that principals you wish to use +.I fakeka +with must have either a V4-style key (des:v4) or an AFS-style key +(des:afs3). V5 enctypes won't work. +.SH OPTIONS +.TP +\fB\-c\fP \fIcell\fP +The AFS cell for which +.I fakeka +will be handling requests. If not given, this defaults to the same as the +Kerberos V5 realm (see +.B \-r +below). +.TP +.B \-d +Enables debugging. When this flag is given, +.I fakeka +will run in the foreground and print debugging information to standard +error. Overrides +.BR \-m . +.TP +\fB\-f\fP \fIforwarder\fP +Allows forwarded requests from +.IR forwarder , +which is generally an AFS database server running ka-forwarder. This +option can be given multiple times (up to 10). Each system running +ka-forwarder should be specified with the +.B \-f +flag or forwarded requests from that host will not be answered. (The +forwarders append their own address to the packet. +.TP +\fB\-l\fP \fIfacility\fP +Log actions via syslog with the given +.I facility +rather than the default of LOG_DAEMON. +.I facility +must be one of KERN, USER, MAIL, DAEMON, AUTH, LPR, NEWS, UUCP, CRON, +LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, or LOCAL7. This +option is case-sensitive. Not all of these facilities may be available, +depending on what pre-defined syslog facilities your system provides. +.TP +.B \-m +Fork and background when starting. You will usually always want to give +this flag. +.TP +\fB\-p\fP \fIport\fP +Listen on the specified port rather than the default of 7004 (which is +what klog expects). +.I port +may be a number or a service name from +.IR /etc/services . +.TP +\fB\-r\fP \fIrealm\fP +The Kerberos V5 realm to which the requests are being translated. The +default is the local default realm. +.SH EXAMPLES +Handle requests for a local cell whose name matches the local realm, +accepting forwarded queries from afs1.example.com and afs2.example.com: +.IP "" 4 +fakeka \-m \-f afs1.example.com \-f afs2.example.com +.PP +If the cell name doesn't match the realm name, +.B \-c +would need to be added, specifying the cell name. +.SH SEE ALSO +ka-forwarder(8) --- krb5-1.4.4.orig/src/kdc/Makefile.in +++ krb5-1.4.4/src/kdc/Makefile.in @@ -88,6 +88,7 @@ f=$(FAKEKA); \ if test -n "$$f" ; then \ $(INSTALL_PROGRAM) $$f ${DESTDIR}$(SERVER_BINDIR)/$$f; \ + $(INSTALL_DATA) $(srcdir)/fakeka.M ${DESTDIR}$(SERVER_MANDIR)/fakeka.8; \ fi clean:: --- krb5-1.4.4.orig/src/windows/identity/kherr/kherrmain.c +++ krb5-1.4.4/src/windows/identity/kherr/kherrmain.c @@ -1,52 +1,52 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -void -kherr_process_attach(void) { - InitializeCriticalSection(&cs_error); - tls_error = TlsAlloc(); -} - -void -kherr_process_detach(void) { - TlsFree(tls_error); - DeleteCriticalSection(&cs_error); -} - -void -kherr_thread_attach(void) { - /* We don't call attach_this_thread() here since we only - want to create a context stack for this thread if - someone wants one. */ - /* attach_this_thread(); */ -} - -void -kherr_thread_detach(void) { - detach_this_thread(); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +void +kherr_process_attach(void) { + InitializeCriticalSection(&cs_error); + tls_error = TlsAlloc(); +} + +void +kherr_process_detach(void) { + TlsFree(tls_error); + DeleteCriticalSection(&cs_error); +} + +void +kherr_thread_attach(void) { + /* We don't call attach_this_thread() here since we only + want to create a context stack for this thread if + someone wants one. */ + /* attach_this_thread(); */ +} + +void +kherr_thread_detach(void) { + detach_this_thread(); +} --- krb5-1.4.4.orig/src/windows/identity/kherr/Makefile +++ krb5-1.4.4/src/windows/identity/kherr/Makefile @@ -1,43 +1,43 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=kherr -!include <../config/Makefile.w32> - -INCFILES= \ - $(INCDIR)\kherr.h - -OBJFILES= \ - $(OBJ)\kherrmain.obj \ - $(OBJ)\kherr.obj - -LIBFILES= - -SDKLIBFILES= \ - strsafe.lib - -all: mkdirs $(INCFILES) $(OBJFILES) - -clean:: - $(RM) $(INCFILES) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=kherr +!include <../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\kherr.h + +OBJFILES= \ + $(OBJ)\kherrmain.obj \ + $(OBJ)\kherr.obj + +LIBFILES= + +SDKLIBFILES= \ + strsafe.lib + +all: mkdirs $(INCFILES) $(OBJFILES) + +clean:: + $(RM) $(INCFILES) --- krb5-1.4.4.orig/src/windows/identity/kherr/kherr.h +++ krb5-1.4.4/src/windows/identity/kherr/kherr.h @@ -1,1094 +1,1094 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHERR_H -#define __KHIMAIRA_KHERR_H - -/*! \defgroup kherr NetIDMgr Error Reporting - - Error reporting functions provide a mechanism to construct - meaningful and user friendly error reports for the user. - - Unlike most of the other NetIDMgr API's, the error reporting APIs - are lightweight and usually do not return an error value. This is - mostly because, these functions are called \b after an error - occurs. - - @{*/ -#include -#include - -/*! \name Customizable macros -@{ */ -#ifndef KHERR_FACILITY -/*! \brief The default facility when reporting errors - - When including this header file, if the KHERR_FACILITY macro is - defined to be a wide character string, then it will be used as the - default facility when for the convenience macros. All of the - calls to the convenience macros in the source file would then have - that facility. - - If left undefined, the convenience macros will leave the facility - value undefined. - */ -#define KHERR_FACILITY NULL -#endif - -#ifndef KHERR_FACILITY_ID -/*! \brief The default facility ID when reporting errors - - When including this header file, if the KHERR_FACILITY_ID macro is - defined to be non-zero, then it will be used as the default - facility identifier for the convenience macros. All of the calls - to the convenience macros in the source file would then have that - facility identifier. - - The default value of 0 means that the facility is undefined. - */ -#define KHERR_FACILITY_ID 0 -#endif - -/*! \define KHERR_HMODULE (undefined) - \brief The default module handle - - When including this header file, if the KHERR_HMODULE macro is - defined to be an identifier that holds the module handle, then the - convenience macros that specify a module handle will use it. - - A default value is not defined for KHERR_HMODULE. Any attempt to - invoke any of the convenience macros that use it should generate a - compile time error. - */ -#ifdef _WIN32 -#ifndef KHERR_HMODULE -#endif -#endif -/*@}*/ - -/*! \brief Parameter types - */ -enum kherr_parm_types { - KEPT_NONE = 0, - KEPT_INT32 = 1, - KEPT_UINT32, - KEPT_INT64, - KEPT_UINT64, - KEPT_STRINGC, /*!< String constant */ - KEPT_STRINGT, /*!< String. Will be freed using - free() when the event is freed */ - KEPT_PTR /*!< Pointer type. */ -}; - - -typedef struct tag_kherr_param { - khm_octet type; - khm_ui_8 data; -} kherr_param; - -/*! \brief Severity levels - - Larger the value, the less severe it is. -*/ -enum tag_kherr_severity { - KHERR_FATAL = 0, /*!< Fatal error.*/ - KHERR_ERROR, /*!< Non-fatal error. We'll probably - survive. See the suggested action. */ - KHERR_WARNING, /*!< Warning. Something almost broke - or soon will. See the suggested - action. */ - KHERR_INFO, /*!< Informational. Something happened - that we would like you to know - about. */ - KHERR_DEBUG_1 = 64, /*!< Verbose debug level 1 (high) - Events at this severity level are - not required to be based on - localized strings. */ - KHERR_DEBUG_2 = 65, /*!< Verbose debug level 2 (medium) - Events at this severity level are - not required to be based on - localized strings. */ - KHERR_DEBUG_3 = 66, /*!< Verbose debug level 3 (low) - Events at this severity level are - not required to be based on - localized strings. */ - KHERR_RESERVED_BANK = 127, /*!< Internal use */ - KHERR_NONE = 128 /*!< Nothing interesting has happened - so far */ -}; - -typedef enum tag_kherr_severity kherr_severity; - -/*! \brief Suggestions */ -enum tag_kherr_suggestion { - KHERR_SUGGEST_NONE = 0, /*!< No suggestions. */ - KHERR_SUGGEST_ABORT, /*!< Abort whatever it was you were - trying. It's not gonna work. */ - KHERR_SUGGEST_RETRY, /*!< Retry. It might work the second - or third time over */ - KHERR_SUGGEST_IGNORE, /*!< Ignore. It might go away. */ - KHERR_SUGGEST_INTERACT, /*!< Further user interaction is - necessary to resolve the situation. - The suggest string in the event - should be prompted to the user. */ - KHERR_SUGGEST_OTHER, /*!< Something else. */ -}; - -typedef enum tag_kherr_suggestion kherr_suggestion; - -/*! \brief An event */ -typedef struct tag_kherr_event { - khm_int32 magic; /*!< Magic number. Always set to - KHERR_EVENT_MAGIC */ - DWORD thread_id; /*!< The thread which reported this - event. */ - const wchar_t * short_desc; /*!< Short description or title - (localized) */ - const wchar_t * facility; /*!< Facility name of the reporter - (not localized) */ - const wchar_t * location; /*!< Location. Usually the function - name or such of where the event - occured (not localized) */ - const wchar_t * long_desc; /*!< A long description of what went - wrong (localized, formatted) */ - const wchar_t * suggestion; /*!< A suggested way to fix it - (localized,formatted) */ - - kherr_severity severity; - /*!< Severity level. One of the - severity levels listed in - enumeration ::kherr_severity */ - khm_int32 facility_id; /*!< Left to the application to - interpret */ - kherr_suggestion suggestion_id; - /*!< One of the suggestion ID's from - the enumeration - ::kherr_suggestion */ - - int flags; /*!< Flags. */ - - kherr_param p1; /*!< Parameter 1 for formatting */ - kherr_param p2; /*!< Parameter 2 for formatting */ - kherr_param p3; /*!< Parameter 3 for formatting */ - kherr_param p4; /*!< Parameter 4 for formatting */ - - DWORD time_ticks; /*!< Time at which event was reported - (as returned by GetTickCount(). */ - FILETIME time_ft; /*!< Time at which event was reported. - Current system time as FILETIME. */ - -#ifdef _WIN32 - HMODULE h_module; /*!< Handle to the module which should - resolve any unresolved resources - references above. */ -#endif - - LDCL(struct tag_kherr_event); -} kherr_event; - -#define KHERR_EVENT_MAGIC 0x0423e84f - -/*! \brief Flags for kherr_event - - Each set of flags that define the type of resource for one value - is mutually exclusive. - */ -enum kherr_event_flags { - KHERR_RF_CSTR_SHORT_DESC= 0x00000000, - /*!< Short description is a constant - string */ - KHERR_RF_RES_SHORT_DESC = 0x00000001, - /*!< Short description is a string - resource */ - KHERR_RF_MSG_SHORT_DESC = 0x00000002, - /*!< Short description is a message - resource */ - KHERR_RF_FREE_SHORT_DESC= 0x00000004, - /*!< Short description is an allocated - string */ - KHERR_RFMASK_SHORT_DESC = 0x00000007, - - KHERR_RF_CSTR_LONG_DESC = 0x00000000, - /*!< Long description is a constant - string */ - KHERR_RF_RES_LONG_DESC = 0x00000008, - /*!< Long description is a string - resource */ - KHERR_RF_MSG_LONG_DESC = 0x00000010, - /*!< Long description is a message - resouce */ - KHERR_RF_FREE_LONG_DESC = 0x00000020, - /*!< Long description is an allocated - string */ - KHERR_RFMASK_LONG_DESC = 0x00000038, - - KHERR_RF_CSTR_SUGGEST = 0x00000000, - /*!< Suggestion is a constant - string */ - KHERR_RF_RES_SUGGEST = 0x00000040, - /*!< Suggestion is a string - resource */ - KHERR_RF_MSG_SUGGEST = 0x00000080, - /*!< Suggestion is a message - resource */ - KHERR_RF_FREE_SUGGEST = 0x00000100, - /*!< Suggestion is an allocated - string */ - KHERR_RFMASK_SUGGEST = 0x000001C0, - - KHERR_RF_STR_RESOLVED = 0x00010000, - /*!< The string resources in the event - have been resolved. */ - KHERR_RF_CONTEXT_FOLD = 0x00020000, - /*!< The event is a representation of - a folded context. */ - - KHERR_RF_INERT = 0x00040000, - /*!< Inert event. The event has - already been dealt with and is no - longer considered significant. */ - KHERR_RF_COMMIT = 0x00080000 - /*!< Committed event. The commit - handlers for this event have already - been called. */ -}; - -/*! \brief Serial number for error contexts */ -typedef khm_ui_4 kherr_serial; - -/*! \brief An error context -*/ -typedef struct tag_kherr_context { - khm_int32 magic; /*!< Magic number. Always set to - KHERR_CONTEXT_MAGIC */ - - kherr_serial serial; /*!< Context instance serial number. - Context objects themselves may be - reused for different contexts as - they are freed and reallocated. - However every instance of a context - is guaranteed to have a unique - serial number as specified in this - field. If an external entity wants - to keep track of the context, it - should keep track of the serial - number as well as the pointer to the - context object. */ - - kherr_severity severity; - /*!< Severity level. One of the - severity levels listed below. This - is the severity level of the context - and is the maximum severity level of - all the events in the queue of - events. */ - - khm_int32 flags; /*!< Flags. Used internally. */ - khm_ui_4 refcount; /*!< Reference count. Used - internally */ - - kherr_event *desc_event; /*!< Description event. The event that - describes the error context. This - points to an event that is not in - the event queue. */ - - kherr_event *err_event; /*!< Significant event. The last one - that caused the severity level to be - what it is right now. This points - to an event that is listed in the - event queue for this context.*/ - - khm_ui_4 progress_num; /*!< Progress numerator */ - khm_ui_4 progress_denom; /*!< Progress denominator */ - - TDCL(struct tag_kherr_context); - QDCL(struct tag_kherr_event); -} kherr_context; - -#define KHERR_CONTEXT_MAGIC 0x34f3238c - -enum kherr_context_flags { - KHERR_CF_NONE = 0x00000000, - /*!< None. */ - - KHERR_CF_DIRTY = 0x00000001, - /*!< Used Internally. Denotes that - the err_event and severity may need - to be recalculated. Cannot be set - as an initial flag. */ - - KHERR_CF_OWN_PROGRESS = 0x00000002, - /*!< The context maintains its own - progress meter as opposed to one - that is derived from child - contexts. */ - - KHERR_CF_UNBOUND = 0x00000004, - /*!< Unbound context. The context - can't be used to log events. Call - kherr_push_context() to associate - the context with the global context - hierarchy. Cannot be set as an - initial flag. */ - - KHERR_CF_TRANSITIVE = 0x00000008, - /*!< Transitive. The context is - automatically made the current - context for all other threads that - handle messages sent or posted by - threads whose current error context - is this one. */ - - KHERR_CFMASK_INITIAL = 0x0000000a, - /*!< Allowed initial flags */ -}; - -/*! \brief Maximum length of a string field in characters including terminating NULL - */ -#define KHERR_MAXCCH_STRING 1024 - -/*! \brief Maximum length of a string field in bytes including terminating NULL - */ -#define KHERR_MAXCB_STRING (KHERR_MAXCCH_STRING * sizeof(wchar_t)) - -/*! \brief Context event - - \see kherr_add_ctx_handler() -*/ -enum kherr_ctx_event { - KHERR_CTX_BEGIN = 0x0001, /*!< A new context was created */ - KHERR_CTX_DESCRIBE=0x0002, /*!< A context was described */ - KHERR_CTX_END = 0x0004, /*!< A context was closed */ - KHERR_CTX_ERROR = 0x0008, /*!< A context switched to an error - state */ - KHERR_CTX_EVTCOMMIT = 0x0010 /*!< A event was committed into the - context */ -}; - -/*! \brief Context event handler - - Context event handlers are invoked when specific events occur with - respect to an error context. The ::kherr_ctx_event parameter - specifies which event occurred using one of the event values - described in the enumeration. The error context in which this - event occurred is specified by the ::kherr_context pointer. - - Note that if the handler needs to keep track of the error context - for later processing, it also needs to keep track of the \a serial - field of the error context. The same context object may be - reused, but the serial number is guaranteed to be unique. - - \see kherr_add_ctx_handler() - */ -typedef void (KHMAPI * kherr_ctx_handler)(enum kherr_ctx_event, - kherr_context *); - -/*! \brief Add a context event handler - - An application can register an event handler that gets notified of - events that pertain to error contexts. More than one handler can - be registered. The order in which the handlers are called is - undefined for any specific event. - - These event occur in the context of individual application - threads. The handler will be called from within the thread that - caused the event. Therefore it is important that the handler is - both reentrant and returns quickly. - - The events that the handler will be notified of are explained - below: - - KHERR_CTX_BEGIN: Notification that a new context was - created. A pointer to the context will be supplied to the - handler. The supplied pointer should not be used to obtain a hold - on the context, as it will prevent the context from being closed. - - KHERR_CTX_DESCRIBE: The thread called - kherr_set_desc_event() to set the description of a context. Once - again, the pointer should not be used to obtain a hold on the - context. - - KHERR_CTX_ERROR: The last event that was reported for the - context was an error event (the severity was was equal or higher - than KHERR_ERROR). The pointer may be used to obtain a hold on - the context. However, it is the application's resonsibility to - make sure that the hold is released later. Otherwise the event - will never be closed. - - KHERR_CTX_END: Closure. This event is signalled when the - last open handle to the context is closed and there is no thread - that is currently active which has this context in its error - context stack. At the time the handler is invoked, the context is - still intact. The pointer that is supplied should not be used to - obtain a handle on the context. - - KHERR_CTX_EVTCOMMIT: An event was committed into the error - context. An event is committed when another event is reported - after the event, or if the context is closed. Since the last - event that is reported can still be modified by adding new - information, the event remains open until it is no longer the last - event or the context is no longer active. When this notification - is received, the last event in the context's event queue is the - event that was committed. - - \param[in] h Context event handler, of type ::kherr_ctx_handler - - \param[in] filter A combination of ::kherr_ctx_event values - indication which notifications should be sent to the handler. - If a \a filter value of zero is provided, all of the events - will be sent to the handler. - - \param[in] serial The serial number of the error context that - should be tracked. If this is zero, all error contexts can - trigger the handler. - */ -KHMEXP void KHMAPI kherr_add_ctx_handler(kherr_ctx_handler h, - khm_int32 filter, - kherr_serial serial); - -/*! \brief Remove a context event handler - - Undoes what was done with kherr_add_ctx_handler() - - \see kherr_add_ctx_handler() - */ -KHMEXP void KHMAPI kherr_remove_ctx_handler(kherr_ctx_handler h, - kherr_serial serial); - - -/*! \brief Report an error - - Creates an event, fills in the details specified in the arguments, - and adds it to the current error context. - - If the current thread does not have an error context, no reporting - happens. However, if any of the supplied strings or parameters - are marked as allocated, they will be freed before the function - returns. - - Certain parameters that expect strings can instead be given string - resources, message resources or allocated strings in addition to - constant string. By default, the parameters are expected to be - constant strings. - - Allocated strings: The application can allocate memory for - a string. Since the application is not notified when the event is - no longer used and freed, it \b must indicate that the string is - an allocated string by setting the appropriate flag in the \a - flags parameter. When the event is no longer used, the memory - pointed to by the relevant pointer will be freed through a call to - free(). Not all string parameters take allocated strings. See - individual parameter documentation for details. - - String resources: On WIN32, string resources can be passed - in to kherr_report() using the MAKEINTRESOURCE macro. However, - the application \b must specify that the parameter is a string - resource using the appropriate flag in the \a flags parameter. - The error reporting engine will expand the string against the - module handle passed in the \a h_module parameter when the value - of the string is required. Not all string parameters take string - resources. See individual parameter documentation for details. - Strings loaded through string resources cannot be longer than - ::KHERR_MAXCCH_STRING in characters inclusive of terminating NULL. - - Message resources: On WIN32, message resources can be - passed in to kherr_report() by specifying the message ID where it - ordinarily expects a pointer to a constant string. The - application \b must indicate that the string is a message resource - by using the appropriate flag in the \a flags parameter. When the - value of the string is needed, it is expanded against the module - handle passed in the \a h_module parameter using the message ID. - Not all string parameters take message resources. See individual - parameter documentation for details. Note that the facility and - severity values associated with a message resource are ignored. - Strings loaded through message resources cannot be longer than - ::KHERR_MAXCCH_STRING in characters inclusive of terminating NULL. - - Formatted fields: Parameters that are formatted can have - can have parameter inserts like in printf(). However, specifying - inserts is different from printf() and follows the conventions - used in WIN32 API FormatMessage(). This is because for localized - strings, the order of the parameters in the string may be - different. See the documentation for FormatMessage() for details - on the format string. The same set of parameters (i.e. \a p1, \a - p2, \a p3, \a p4) is used for all formatted strings with - appropriate marshalling for 64 bit types. The size of the string - after expansion must not exceed 65536 bytes inclusive of - terminating NULL. - - \param[in] severity One of ::kherr_severity_level - \param[in] short_desc Short description or title (localized). Can - be a string resource, message resource, allocated string or - constant string. The \a flags parameter should indicate the - type of string used. - \param[in] facility Facility name of the reporter (not localized) - \param[in] location Usually the function name or such of where the - event occured (not localized) - \param[in] long_desc Long description of event (localized, - formatted). Can be a string resource, message resource, - allocated string or constant string. The \a flags parameter - should indicate the type of string used. - \param[in] suggestion Suggested action to correct situation, if - applicable (localized). Can be a string resource, message - resource, allocated string or constant string. The \a flags - parameter should indicate the type of string used. - \param[in] facility_id Identifier of facility. Application - defined. - \param[in] suggestion_id One of the suggestion identifiers from - ::kherr_suggestion_ids - \param[in] p1 First parameter. Used for formatting. - \param[in] p2 Second parameter. Used for formatting. - \param[in] p3 Third parameter. Used for formatting. - \param[in] p4 Fourth parameter. Used for formatting. - \param[in] flags Flags. See ::kherr_report_flags - \param[in] h_module Handle to a module that resolves any string or - message resources used for the \a short_description , \a - long_desc or \a suggestion parameters. This parameter is only - available on WIN32. - - \note With the exception of parameters of type KEPT_STRINGT and - parameters which are flagged for freeing using the \a flags - parameter, all other string parameters are assumed to be - pointers to constant strings. The strings are not copied and - the pointers are used as is. Also, no clean-up is performed - when the event is freed other than that implied by \a flags. - */ -KHMEXP kherr_event * KHMAPI kherr_report( - enum kherr_severity severity, - const wchar_t * short_desc, - const wchar_t * facility, - const wchar_t * location, - const wchar_t * long_desC, - const wchar_t * suggestion, - khm_int32 facility_id, - enum kherr_suggestion suggestion_id, - kherr_param p1, - kherr_param p2, - kherr_param p3, - kherr_param p4, - khm_int32 flags -#ifdef _WIN32 - ,HMODULE h_module -#endif -); - -/*! \brief Report a formatted message - - The format string \a long_desc_fmt should be a string constant and - the format specifiers follow that of \a sprintf. This creates an - event with the long description set to the expansion of the format - string against the arguments. - */ -KHMEXP kherr_event * __cdecl -kherr_reportf_ex(enum kherr_severity severity, - const wchar_t * facility, - khm_int32 facility_id, -#ifdef _WIN32 - HMODULE hModule, -#endif - const wchar_t * long_desc_fmt, - ...); -#define _reportf_ex kherr_reportf_ex - -/*! \brief Report a formatted message - - The format string \a long_desc_fmt should be a string constant and - the format specifiers follow that of \a sprintf. This creates an - event with the long description set to the expansion of the format - string against the arguments. - */ -KHMEXP kherr_event * __cdecl -kherr_reportf(const wchar_t * long_desc_fmt, - ...); -#define _reportf kherr_reportf - -/*! \brief Create a parameter out of a transient string - - A parameter is created by duplicating the string that is passed - into the function. If the string exceeds KHERR_MAXCCH_STRING, - then only the first part of the string that fits within the limit - is duplicated. - - The resulign ::kherr_param must be passed in to kherr_report(). - The event logging framework will free the duplicated string once - the data is no longer required. - */ -KHMEXP kherr_param kherr_dup_string(const wchar_t * s); - -__inline KHMEXP kherr_param -kherr_val(khm_octet ptype, khm_ui_8 pvalue) { - kherr_param p; - - p.type = ptype; - p.data = pvalue; - - return p; -} - -#define _int32(i) kherr_val(KEPT_INT32, (khm_ui_8) i) -#define _uint32(ui) kherr_val(KEPT_UINT32, (khm_ui_8) ui) -#define _int64(i) kherr_val(KEPT_INT64, (khm_ui_8) i) -#define _uint64(ui) kherr_val(KEPT_UINT64, (khm_ui_8) ui) -#define _cstr(cs) kherr_val(KEPT_STRINGC, (khm_ui_8) cs) -#define _tstr(ts) kherr_val(KEPT_STRINGT, (khm_ui_8) ts) -#define _cptr(p) kherr_val(KEPT_PTR, (khm_ui_8) p) -#define _vnull() kherr_val(KEPT_NONE, 0) -#define _dupstr(s) kherr_dup_string(s) - -/* convenience macros for calling kherr_report */ -#ifdef KHERR_HMODULE - -#define _report_cs0(severity, long_description) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), 0, KHERR_HMODULE) - -#define _report_cs1(severity, long_description, p1) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), 0, KHERR_HMODULE) - -#define _report_cs2(severity, long_description, p1, p2) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), 0, KHERR_HMODULE) - -#define _report_cs3(severity, long_description, p1, p2, p3) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), 0, KHERR_HMODULE) - -#define _report_cs4(severity, long_description, p1, p2, p3, p4) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, 0, KHERR_HMODULE) - -#else - -#define _report_cs0(severity, long_description) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), 0, NULL) - -#define _report_cs1(severity, long_description, p1) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), 0, NULL) - -#define _report_cs2(severity, long_description, p1, p2) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), 0, NULL) - -#define _report_cs3(severity, long_description, p1, p2, p3) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), 0, NULL) - -#define _report_cs4(severity, long_description, p1, p2, p3, p4) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, 0, NULL) -#endif /* !defined(KHERR_HMODULE) */ - -#ifdef _WIN32 -#define _report_sr0(severity, long_desc_id) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) - -#define _report_sr1(severity, long_desc_id, p1) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) - -#define _report_sr2(severity, long_desc_id, p1, p2) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) - -#define _report_sr3(severity, long_desc_id, p1, p2, p3) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) - -#define _report_sr4(severity, long_desc_id, p1, p2, p3, p4) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) -#endif - -#ifdef _WIN32 -#define _report_mr0(severity, long_desc_msg_id) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) - -#define _report_mr1(severity, long_desc_msg_id, p1) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) - -#define _report_mr2(severity, long_desc_msg_id, p1, p2) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) - -#define _report_mr3(severity, long_desc_msg_id, p1, p2, p3) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) - -#define _report_mr4(severity, long_desc_msg_id, p1, p2, p3, p4) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) -#endif - -#define _report_ts0(severity, long_desc_ptr) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) - -#define _report_ts1(severity, long_desc_ptr, p1) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) - -#define _report_ts2(severity, long_desc_ptr, p1, p2) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) - -#define _report_ts3(severity, long_desc_ptr, p1, p2, p3) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) - -#define _report_ts4(severity, long_desc_ptr, p1, p2, p3, p4) \ - kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, KHERR_RF_FREE_LONG_DESC, NULL) - -/*! \brief Set the suggestion and suggestion identifier for the last event - - The event that will be modified is the last event reported by the - calling thread. - */ -KHMEXP void KHMAPI kherr_suggest(wchar_t * suggestion, khm_int32 suggestion_id, khm_int32 flags); -#define _suggest_cs(cs,sid) kherr_suggest((cs), (sid), KHERR_RF_CSTR_SUGGEST) -#define _suggest_ts(ts,sid) kherr_suggest((ts), (sid), KHERR_RF_FREE_SUGGEST) -#define _suggest_sr(sr,sid) kherr_suggest(MAKEINTRESOURCE(sr), (sid), KHERR_RF_RES_SUGGEST) -#define _suggest_mr(mr,sid) kherr_suggest((wchar_t *)(DWORD_PTR)(mr), (sid), KHERR_RF_MSG_SUGGEST) - -/*! \brief Set the location string for the last event - - The event that will be modified is the last event reported by the - calling thread. - */ -KHMEXP void KHMAPI kherr_location(wchar_t * location); -#define _location(l) kherr_location(l) - -/*! \brief Set the facility string and identifier for the last event - - The event that will be modified is the last event reported by the - calling thread. - */ -KHMEXP void KHMAPI kherr_facility(wchar_t * facility, khm_int32 facility_id); -#define _facility(f,fid) kherr_facility((f),(fid)) - -/*! \brief Marks the last event as the descriptor event for the current error context - - Note that marking an event as the descriptor event has the effect - of removing the event from event queue. The event will henceforth - be used as the descriptor for the context. The only effective - fields of a descriptor event are \a short_desc, \a long_desc, \a - facility, \a facility_id and the parameters which are used for - resolving formatted strings in the aforementioned fields. - - Upon calling kherr_set_desc_event(), the event will be - automatically evaluated as if kherr_evaluate_event() was called. - - The event that will be referenced is the last event reported by - the calling thread. - */ -KHMEXP void KHMAPI kherr_set_desc_event(void); -#define _describe kherr_set_desc_event - -/*! \brief Delete the last event - - The event that will be deleted is the last event reported by the - calling thread. - */ -KHMEXP void KHMAPI kherr_del_last_event(void); -#define _del_event kherr_del_last_event - -/*! \brief Create a new context - - The created context is not bound to any thread or any context - hierarchy. Hence it cannot be used to capture any events until it - is used in a call to kherr_push_context(). - - Release the returned context pointer with a call to - kherr_release_context(). - - \param[in] flags Initial flags for the context. Combination of - ::kherr_context_flags - - \note This function is for internal use only. - */ -KHMEXP kherr_context * KHMAPI kherr_create_new_context(khm_int32 flags); - -/*! \brief Obtain a hold on a context */ -KHMEXP void KHMAPI kherr_hold_context(kherr_context * c); - -/*! \brief Release a context */ -KHMEXP void KHMAPI kherr_release_context(kherr_context * c); - -/*! \brief Push an empty context - - Creates an empty context, adds it as a child of the current - thread's error context. If the current thread does not have an - error context, then the created error context will be a root level - context. - - The new context will be the current error context for the calling - thread. - - \param[in] flags Initial flags for the context. Combination of - ::kherr_context_flags - - \see kherr_push_new_context() for more information about thread - specific context stacks. - - */ -KHMEXP void KHMAPI kherr_push_new_context(khm_int32 flags); -#define _begin_task kherr_push_new_context - -/*! \brief Push a context - - Each thread has a stack of error contexts. The topmost one is - current. The thread can push or pop contexts on to the stack - independently of the hierarchy of contexts (the only exception, as - explained below is when the context that is being pushed is - unbound). - - If the context being pushed by kherr_push_context() is unbound, - then it will be attached to the current context of the thread as a - child. Once the new context is pushed to the top of the stack, it - will become the current context for the thread. - - The calling thread must call kherr_pop_context() to remove the - context from the top of the stack. Each call to - kherr_push_new_context() or kher_push_context() must have a - corresponding kherr_pop_context() call. - - When the thread terminates, all of the contexts in the thread's - context stack will be automatically removed. - - \see kherr_pop_context() - */ -KHMEXP void KHMAPI kherr_push_context(kherr_context * c); - -/*! \brief Pop a context - - Remove the current error context from the thread's context stack. - If no other open handles exist to the error context, this causes - the error context to collapse into it's parent context or vanish - entirely unless the context contains an error. - - \see kherr_push_context() for more information about thread - specific context stacks. - */ -KHMEXP void KHMAPI kherr_pop_context(void); -#define _end_task kherr_pop_context - -/*! \brief Retrieve the current error context - - The returned pointer must be released with a call to - kherr_release_context(). -*/ -KHMEXP kherr_context * KHMAPI kherr_peek_context(void); - -/*! \brief Check if the current error context indicates an error - - \return TRUE if there is an error. FALSE otherwise. - \see kherr_analyze() - */ -KHMEXP khm_boolean KHMAPI kherr_is_error(void); - -/*! \brief Check if an error context indicates an error - - \return TRUE if there is an error. FALSE otherwise. - \see kherr_analyze() - */ -KHMEXP khm_boolean KHMAPI kherr_is_error_i(kherr_context * c); - -/*! \brief Clear the error state of the current context */ -KHMEXP void KHMAPI kherr_clear_error(void); - -/*! \brief Clear the error state of an error context */ -KHMEXP void KHMAPI kherr_clear_error_i(kherr_context * c); - -/*! \brief Set the progress meter of the current error context - - Setting \a denom to zero removes the progress meter. - */ -KHMEXP void KHMAPI kherr_set_progress(khm_ui_4 num, khm_ui_4 denom); -#define _progress(num,denom) kherr_set_progress((num),(denom)) - -/*! \brief Get the progress meter of the current error context - */ -KHMEXP void KHMAPI kherr_get_progress(khm_ui_4 * num, khm_ui_4 * denom); - -/*! \brief Get the progress meter of an error context - */ -KHMEXP void KHMAPI kherr_get_progress_i(kherr_context * c, khm_ui_4 * num, khm_ui_4 * denom); - -/*! \brief Get the first event in a context - - The returned pointer is only valid as long as there is a hold on - \a c. Once the context is released with a call to - kherr_release_context() all pointers to events in the context - become invalid. - - In addition, the last event in a context may still be "active". A - thread can still modify the last event as long as the context is - active. - - \see kherr_get_next_event(), kherr_get_prev_event(), - kherr_get_last_event() - */ -KHMEXP kherr_event * KHMAPI kherr_get_first_event(kherr_context * c); - -/*! \brief Get the next event - - Call kherr_get_first_event() to obtain the first event in a - context. Subsequent calls to kherr_get_next_event() will yield - other events in the order in which they were reported. The list - ends when kherr_get_next_event() returns NULL. - - The returned pointer is only valid as long as there is a hold on - \a c. Once the context is released with a call to - kherr_release_context() all pointers to events in the context - become invalid. - - In addition, the last event in a context may still be "active". A - thread can still modify the last event as long as the context is - active. - - \see kherr_get_first_event(), kherr_get_prev_event(), - kherr_get_last_event() - */ -KHMEXP kherr_event * KHMAPI kherr_get_next_event(kherr_event * e); - -/*! \brief Get the previous event - - Returns a pointer to the event that was reported in the context - containing \a e prior to \a e being reported. - - The returned pointer is only valid as long as there is a hold on - the error context. Once the context is released with a call to - kherr_release_context() all pointers to events in the context - become invalid. - - In addition, the last event in a context may still be "active". A - thread can still modify the last event as long as the context is - active. - - \see kherr_get_first_event(), kherr_get_next_event(), - kherr_get_last_event() - */ -KHMEXP kherr_event * KHMAPI kherr_get_prev_event(kherr_event * e); - -/*! \brief Get the last event in an error context - - Returns a pointer to the last error event that that was reported - to the context \a c. - - The returned pointer is only valid as long as there is a hold on - the error context. Once the context is released with a call to - kherr_release_context(), all pointers to events in the context - become invalid. - - In addtion, the last event in a context may still be "active". A - thread can still modify the last event as long as the context is - active. - - \see kherr_get_first_event(), kherr_get_next_event(), - kherr_get_prev_event() - */ -KHMEXP kherr_event * KHMAPI kherr_get_last_event(kherr_context * c); - -/*! \brief Get the first child context of a context - - Contexts are arranged in a hiearchy. This function returns the - first child of an error context. Use kherr_get_next_context() to - obtain the other contexts. If \a c is \a NULL, this returns the - first root level context. - - The returned pointer must be released with a call to - kherr_release_context() - */ -KHMEXP kherr_context * KHMAPI kherr_get_first_context(kherr_context * c); - -/*! \brief Get the next sibling context of a context - - The returned pointer must be released with a call to - kherr_release_context() - - \see kherr_get_first_context() - */ -KHMEXP kherr_context * KHMAPI kherr_get_next_context(kherr_context * c); - -/*! \brief Get the desciption event for the context - - The description event is the event that was denoted using - kherr_set_desc_event() as the event which describes the context. - - The returned pointer is only valid as long as there is a hold on - \a c. Once the context is released with a call to - kherr_release_context() all pointers to events in the context - becomes invalid. - */ -KHMEXP kherr_event * KHMAPI kherr_get_desc_event(kherr_context * c); - -/*! \brief Get the error event for the context - - The error event for a context is the last event that had the - highest severity level. - - The returned pointer is only valid as long as there is a hold on - \a c. Once the context is released with a call to - kherr_release_context() all pointers to events in the context - becomes invalid. - */ -KHMEXP kherr_event * KHMAPI kherr_get_err_event(kherr_context * c); - -/*! \brief Evaluate an event - - When an event is reported, all the parameters and resource - references that were passed to kherr_report() are kept as-is until - the actual string values are required by the error reporting - library. However, if the string fields are required before then, - an application can call kherr_evaluate_event() to get them. - - This function does the following: - - - Load any referenced string or message resources that are - referenced in the event's short description, long description or - suggestion. - - - Expand any inserts using the parameters that were passed in. - - - Free up allocated strings in for the descriptions or suggestion - fields and any parameters. - - - Update the string fields in the event to contain the newly - generated strings. - - */ -KHMEXP void KHMAPI kherr_evaluate_event(kherr_event * e); - -/*! \brief Evaluate the last event - - Same as kherr_evaluate_event(), but operates on the last event - logged by the current thread. - - \see kherr_evaluate_event() - */ -KHMEXP void KHMAPI kherr_evaluate_last_event(void); -#define _resolve kherr_evaluate_last_event - -/*! \defgroup kherr_fids Standard Facility IDs -@{*/ -#define KHM_FACILITY_KMM 1 -#define KHM_FACILITY_KCDB 2 -#define KHM_FACILITY_UI 3 -#define KHM_FACILITY_KRB5 64 -#define KHM_FACILITY_KRB4 65 -#define KHM_FACILITY_AFS 66 -#define KHM_FACILITY_USER 128 -/*@}*/ - -/*@}*/ - -/* In debug mode, outputs the formatted string to the debug console */ -#ifdef DEBUG -KHMEXP void kherr_debug_printf(wchar_t * fmt, ...); -#endif - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHERR_H +#define __KHIMAIRA_KHERR_H + +/*! \defgroup kherr NetIDMgr Error Reporting + + Error reporting functions provide a mechanism to construct + meaningful and user friendly error reports for the user. + + Unlike most of the other NetIDMgr API's, the error reporting APIs + are lightweight and usually do not return an error value. This is + mostly because, these functions are called \b after an error + occurs. + + @{*/ +#include +#include + +/*! \name Customizable macros +@{ */ +#ifndef KHERR_FACILITY +/*! \brief The default facility when reporting errors + + When including this header file, if the KHERR_FACILITY macro is + defined to be a wide character string, then it will be used as the + default facility when for the convenience macros. All of the + calls to the convenience macros in the source file would then have + that facility. + + If left undefined, the convenience macros will leave the facility + value undefined. + */ +#define KHERR_FACILITY NULL +#endif + +#ifndef KHERR_FACILITY_ID +/*! \brief The default facility ID when reporting errors + + When including this header file, if the KHERR_FACILITY_ID macro is + defined to be non-zero, then it will be used as the default + facility identifier for the convenience macros. All of the calls + to the convenience macros in the source file would then have that + facility identifier. + + The default value of 0 means that the facility is undefined. + */ +#define KHERR_FACILITY_ID 0 +#endif + +/*! \define KHERR_HMODULE (undefined) + \brief The default module handle + + When including this header file, if the KHERR_HMODULE macro is + defined to be an identifier that holds the module handle, then the + convenience macros that specify a module handle will use it. + + A default value is not defined for KHERR_HMODULE. Any attempt to + invoke any of the convenience macros that use it should generate a + compile time error. + */ +#ifdef _WIN32 +#ifndef KHERR_HMODULE +#endif +#endif +/*@}*/ + +/*! \brief Parameter types + */ +enum kherr_parm_types { + KEPT_NONE = 0, + KEPT_INT32 = 1, + KEPT_UINT32, + KEPT_INT64, + KEPT_UINT64, + KEPT_STRINGC, /*!< String constant */ + KEPT_STRINGT, /*!< String. Will be freed using + free() when the event is freed */ + KEPT_PTR /*!< Pointer type. */ +}; + + +typedef struct tag_kherr_param { + khm_octet type; + khm_ui_8 data; +} kherr_param; + +/*! \brief Severity levels + + Larger the value, the less severe it is. +*/ +enum tag_kherr_severity { + KHERR_FATAL = 0, /*!< Fatal error.*/ + KHERR_ERROR, /*!< Non-fatal error. We'll probably + survive. See the suggested action. */ + KHERR_WARNING, /*!< Warning. Something almost broke + or soon will. See the suggested + action. */ + KHERR_INFO, /*!< Informational. Something happened + that we would like you to know + about. */ + KHERR_DEBUG_1 = 64, /*!< Verbose debug level 1 (high) + Events at this severity level are + not required to be based on + localized strings. */ + KHERR_DEBUG_2 = 65, /*!< Verbose debug level 2 (medium) + Events at this severity level are + not required to be based on + localized strings. */ + KHERR_DEBUG_3 = 66, /*!< Verbose debug level 3 (low) + Events at this severity level are + not required to be based on + localized strings. */ + KHERR_RESERVED_BANK = 127, /*!< Internal use */ + KHERR_NONE = 128 /*!< Nothing interesting has happened + so far */ +}; + +typedef enum tag_kherr_severity kherr_severity; + +/*! \brief Suggestions */ +enum tag_kherr_suggestion { + KHERR_SUGGEST_NONE = 0, /*!< No suggestions. */ + KHERR_SUGGEST_ABORT, /*!< Abort whatever it was you were + trying. It's not gonna work. */ + KHERR_SUGGEST_RETRY, /*!< Retry. It might work the second + or third time over */ + KHERR_SUGGEST_IGNORE, /*!< Ignore. It might go away. */ + KHERR_SUGGEST_INTERACT, /*!< Further user interaction is + necessary to resolve the situation. + The suggest string in the event + should be prompted to the user. */ + KHERR_SUGGEST_OTHER, /*!< Something else. */ +}; + +typedef enum tag_kherr_suggestion kherr_suggestion; + +/*! \brief An event */ +typedef struct tag_kherr_event { + khm_int32 magic; /*!< Magic number. Always set to + KHERR_EVENT_MAGIC */ + DWORD thread_id; /*!< The thread which reported this + event. */ + const wchar_t * short_desc; /*!< Short description or title + (localized) */ + const wchar_t * facility; /*!< Facility name of the reporter + (not localized) */ + const wchar_t * location; /*!< Location. Usually the function + name or such of where the event + occured (not localized) */ + const wchar_t * long_desc; /*!< A long description of what went + wrong (localized, formatted) */ + const wchar_t * suggestion; /*!< A suggested way to fix it + (localized,formatted) */ + + kherr_severity severity; + /*!< Severity level. One of the + severity levels listed in + enumeration ::kherr_severity */ + khm_int32 facility_id; /*!< Left to the application to + interpret */ + kherr_suggestion suggestion_id; + /*!< One of the suggestion ID's from + the enumeration + ::kherr_suggestion */ + + int flags; /*!< Flags. */ + + kherr_param p1; /*!< Parameter 1 for formatting */ + kherr_param p2; /*!< Parameter 2 for formatting */ + kherr_param p3; /*!< Parameter 3 for formatting */ + kherr_param p4; /*!< Parameter 4 for formatting */ + + DWORD time_ticks; /*!< Time at which event was reported + (as returned by GetTickCount(). */ + FILETIME time_ft; /*!< Time at which event was reported. + Current system time as FILETIME. */ + +#ifdef _WIN32 + HMODULE h_module; /*!< Handle to the module which should + resolve any unresolved resources + references above. */ +#endif + + LDCL(struct tag_kherr_event); +} kherr_event; + +#define KHERR_EVENT_MAGIC 0x0423e84f + +/*! \brief Flags for kherr_event + + Each set of flags that define the type of resource for one value + is mutually exclusive. + */ +enum kherr_event_flags { + KHERR_RF_CSTR_SHORT_DESC= 0x00000000, + /*!< Short description is a constant + string */ + KHERR_RF_RES_SHORT_DESC = 0x00000001, + /*!< Short description is a string + resource */ + KHERR_RF_MSG_SHORT_DESC = 0x00000002, + /*!< Short description is a message + resource */ + KHERR_RF_FREE_SHORT_DESC= 0x00000004, + /*!< Short description is an allocated + string */ + KHERR_RFMASK_SHORT_DESC = 0x00000007, + + KHERR_RF_CSTR_LONG_DESC = 0x00000000, + /*!< Long description is a constant + string */ + KHERR_RF_RES_LONG_DESC = 0x00000008, + /*!< Long description is a string + resource */ + KHERR_RF_MSG_LONG_DESC = 0x00000010, + /*!< Long description is a message + resouce */ + KHERR_RF_FREE_LONG_DESC = 0x00000020, + /*!< Long description is an allocated + string */ + KHERR_RFMASK_LONG_DESC = 0x00000038, + + KHERR_RF_CSTR_SUGGEST = 0x00000000, + /*!< Suggestion is a constant + string */ + KHERR_RF_RES_SUGGEST = 0x00000040, + /*!< Suggestion is a string + resource */ + KHERR_RF_MSG_SUGGEST = 0x00000080, + /*!< Suggestion is a message + resource */ + KHERR_RF_FREE_SUGGEST = 0x00000100, + /*!< Suggestion is an allocated + string */ + KHERR_RFMASK_SUGGEST = 0x000001C0, + + KHERR_RF_STR_RESOLVED = 0x00010000, + /*!< The string resources in the event + have been resolved. */ + KHERR_RF_CONTEXT_FOLD = 0x00020000, + /*!< The event is a representation of + a folded context. */ + + KHERR_RF_INERT = 0x00040000, + /*!< Inert event. The event has + already been dealt with and is no + longer considered significant. */ + KHERR_RF_COMMIT = 0x00080000 + /*!< Committed event. The commit + handlers for this event have already + been called. */ +}; + +/*! \brief Serial number for error contexts */ +typedef khm_ui_4 kherr_serial; + +/*! \brief An error context +*/ +typedef struct tag_kherr_context { + khm_int32 magic; /*!< Magic number. Always set to + KHERR_CONTEXT_MAGIC */ + + kherr_serial serial; /*!< Context instance serial number. + Context objects themselves may be + reused for different contexts as + they are freed and reallocated. + However every instance of a context + is guaranteed to have a unique + serial number as specified in this + field. If an external entity wants + to keep track of the context, it + should keep track of the serial + number as well as the pointer to the + context object. */ + + kherr_severity severity; + /*!< Severity level. One of the + severity levels listed below. This + is the severity level of the context + and is the maximum severity level of + all the events in the queue of + events. */ + + khm_int32 flags; /*!< Flags. Used internally. */ + khm_ui_4 refcount; /*!< Reference count. Used + internally */ + + kherr_event *desc_event; /*!< Description event. The event that + describes the error context. This + points to an event that is not in + the event queue. */ + + kherr_event *err_event; /*!< Significant event. The last one + that caused the severity level to be + what it is right now. This points + to an event that is listed in the + event queue for this context.*/ + + khm_ui_4 progress_num; /*!< Progress numerator */ + khm_ui_4 progress_denom; /*!< Progress denominator */ + + TDCL(struct tag_kherr_context); + QDCL(struct tag_kherr_event); +} kherr_context; + +#define KHERR_CONTEXT_MAGIC 0x34f3238c + +enum kherr_context_flags { + KHERR_CF_NONE = 0x00000000, + /*!< None. */ + + KHERR_CF_DIRTY = 0x00000001, + /*!< Used Internally. Denotes that + the err_event and severity may need + to be recalculated. Cannot be set + as an initial flag. */ + + KHERR_CF_OWN_PROGRESS = 0x00000002, + /*!< The context maintains its own + progress meter as opposed to one + that is derived from child + contexts. */ + + KHERR_CF_UNBOUND = 0x00000004, + /*!< Unbound context. The context + can't be used to log events. Call + kherr_push_context() to associate + the context with the global context + hierarchy. Cannot be set as an + initial flag. */ + + KHERR_CF_TRANSITIVE = 0x00000008, + /*!< Transitive. The context is + automatically made the current + context for all other threads that + handle messages sent or posted by + threads whose current error context + is this one. */ + + KHERR_CFMASK_INITIAL = 0x0000000a, + /*!< Allowed initial flags */ +}; + +/*! \brief Maximum length of a string field in characters including terminating NULL + */ +#define KHERR_MAXCCH_STRING 1024 + +/*! \brief Maximum length of a string field in bytes including terminating NULL + */ +#define KHERR_MAXCB_STRING (KHERR_MAXCCH_STRING * sizeof(wchar_t)) + +/*! \brief Context event + + \see kherr_add_ctx_handler() +*/ +enum kherr_ctx_event { + KHERR_CTX_BEGIN = 0x0001, /*!< A new context was created */ + KHERR_CTX_DESCRIBE=0x0002, /*!< A context was described */ + KHERR_CTX_END = 0x0004, /*!< A context was closed */ + KHERR_CTX_ERROR = 0x0008, /*!< A context switched to an error + state */ + KHERR_CTX_EVTCOMMIT = 0x0010 /*!< A event was committed into the + context */ +}; + +/*! \brief Context event handler + + Context event handlers are invoked when specific events occur with + respect to an error context. The ::kherr_ctx_event parameter + specifies which event occurred using one of the event values + described in the enumeration. The error context in which this + event occurred is specified by the ::kherr_context pointer. + + Note that if the handler needs to keep track of the error context + for later processing, it also needs to keep track of the \a serial + field of the error context. The same context object may be + reused, but the serial number is guaranteed to be unique. + + \see kherr_add_ctx_handler() + */ +typedef void (KHMAPI * kherr_ctx_handler)(enum kherr_ctx_event, + kherr_context *); + +/*! \brief Add a context event handler + + An application can register an event handler that gets notified of + events that pertain to error contexts. More than one handler can + be registered. The order in which the handlers are called is + undefined for any specific event. + + These event occur in the context of individual application + threads. The handler will be called from within the thread that + caused the event. Therefore it is important that the handler is + both reentrant and returns quickly. + + The events that the handler will be notified of are explained + below: + + KHERR_CTX_BEGIN: Notification that a new context was + created. A pointer to the context will be supplied to the + handler. The supplied pointer should not be used to obtain a hold + on the context, as it will prevent the context from being closed. + + KHERR_CTX_DESCRIBE: The thread called + kherr_set_desc_event() to set the description of a context. Once + again, the pointer should not be used to obtain a hold on the + context. + + KHERR_CTX_ERROR: The last event that was reported for the + context was an error event (the severity was was equal or higher + than KHERR_ERROR). The pointer may be used to obtain a hold on + the context. However, it is the application's resonsibility to + make sure that the hold is released later. Otherwise the event + will never be closed. + + KHERR_CTX_END: Closure. This event is signalled when the + last open handle to the context is closed and there is no thread + that is currently active which has this context in its error + context stack. At the time the handler is invoked, the context is + still intact. The pointer that is supplied should not be used to + obtain a handle on the context. + + KHERR_CTX_EVTCOMMIT: An event was committed into the error + context. An event is committed when another event is reported + after the event, or if the context is closed. Since the last + event that is reported can still be modified by adding new + information, the event remains open until it is no longer the last + event or the context is no longer active. When this notification + is received, the last event in the context's event queue is the + event that was committed. + + \param[in] h Context event handler, of type ::kherr_ctx_handler + + \param[in] filter A combination of ::kherr_ctx_event values + indication which notifications should be sent to the handler. + If a \a filter value of zero is provided, all of the events + will be sent to the handler. + + \param[in] serial The serial number of the error context that + should be tracked. If this is zero, all error contexts can + trigger the handler. + */ +KHMEXP void KHMAPI kherr_add_ctx_handler(kherr_ctx_handler h, + khm_int32 filter, + kherr_serial serial); + +/*! \brief Remove a context event handler + + Undoes what was done with kherr_add_ctx_handler() + + \see kherr_add_ctx_handler() + */ +KHMEXP void KHMAPI kherr_remove_ctx_handler(kherr_ctx_handler h, + kherr_serial serial); + + +/*! \brief Report an error + + Creates an event, fills in the details specified in the arguments, + and adds it to the current error context. + + If the current thread does not have an error context, no reporting + happens. However, if any of the supplied strings or parameters + are marked as allocated, they will be freed before the function + returns. + + Certain parameters that expect strings can instead be given string + resources, message resources or allocated strings in addition to + constant string. By default, the parameters are expected to be + constant strings. + + Allocated strings: The application can allocate memory for + a string. Since the application is not notified when the event is + no longer used and freed, it \b must indicate that the string is + an allocated string by setting the appropriate flag in the \a + flags parameter. When the event is no longer used, the memory + pointed to by the relevant pointer will be freed through a call to + free(). Not all string parameters take allocated strings. See + individual parameter documentation for details. + + String resources: On WIN32, string resources can be passed + in to kherr_report() using the MAKEINTRESOURCE macro. However, + the application \b must specify that the parameter is a string + resource using the appropriate flag in the \a flags parameter. + The error reporting engine will expand the string against the + module handle passed in the \a h_module parameter when the value + of the string is required. Not all string parameters take string + resources. See individual parameter documentation for details. + Strings loaded through string resources cannot be longer than + ::KHERR_MAXCCH_STRING in characters inclusive of terminating NULL. + + Message resources: On WIN32, message resources can be + passed in to kherr_report() by specifying the message ID where it + ordinarily expects a pointer to a constant string. The + application \b must indicate that the string is a message resource + by using the appropriate flag in the \a flags parameter. When the + value of the string is needed, it is expanded against the module + handle passed in the \a h_module parameter using the message ID. + Not all string parameters take message resources. See individual + parameter documentation for details. Note that the facility and + severity values associated with a message resource are ignored. + Strings loaded through message resources cannot be longer than + ::KHERR_MAXCCH_STRING in characters inclusive of terminating NULL. + + Formatted fields: Parameters that are formatted can have + can have parameter inserts like in printf(). However, specifying + inserts is different from printf() and follows the conventions + used in WIN32 API FormatMessage(). This is because for localized + strings, the order of the parameters in the string may be + different. See the documentation for FormatMessage() for details + on the format string. The same set of parameters (i.e. \a p1, \a + p2, \a p3, \a p4) is used for all formatted strings with + appropriate marshalling for 64 bit types. The size of the string + after expansion must not exceed 65536 bytes inclusive of + terminating NULL. + + \param[in] severity One of ::kherr_severity_level + \param[in] short_desc Short description or title (localized). Can + be a string resource, message resource, allocated string or + constant string. The \a flags parameter should indicate the + type of string used. + \param[in] facility Facility name of the reporter (not localized) + \param[in] location Usually the function name or such of where the + event occured (not localized) + \param[in] long_desc Long description of event (localized, + formatted). Can be a string resource, message resource, + allocated string or constant string. The \a flags parameter + should indicate the type of string used. + \param[in] suggestion Suggested action to correct situation, if + applicable (localized). Can be a string resource, message + resource, allocated string or constant string. The \a flags + parameter should indicate the type of string used. + \param[in] facility_id Identifier of facility. Application + defined. + \param[in] suggestion_id One of the suggestion identifiers from + ::kherr_suggestion_ids + \param[in] p1 First parameter. Used for formatting. + \param[in] p2 Second parameter. Used for formatting. + \param[in] p3 Third parameter. Used for formatting. + \param[in] p4 Fourth parameter. Used for formatting. + \param[in] flags Flags. See ::kherr_report_flags + \param[in] h_module Handle to a module that resolves any string or + message resources used for the \a short_description , \a + long_desc or \a suggestion parameters. This parameter is only + available on WIN32. + + \note With the exception of parameters of type KEPT_STRINGT and + parameters which are flagged for freeing using the \a flags + parameter, all other string parameters are assumed to be + pointers to constant strings. The strings are not copied and + the pointers are used as is. Also, no clean-up is performed + when the event is freed other than that implied by \a flags. + */ +KHMEXP kherr_event * KHMAPI kherr_report( + enum kherr_severity severity, + const wchar_t * short_desc, + const wchar_t * facility, + const wchar_t * location, + const wchar_t * long_desC, + const wchar_t * suggestion, + khm_int32 facility_id, + enum kherr_suggestion suggestion_id, + kherr_param p1, + kherr_param p2, + kherr_param p3, + kherr_param p4, + khm_int32 flags +#ifdef _WIN32 + ,HMODULE h_module +#endif +); + +/*! \brief Report a formatted message + + The format string \a long_desc_fmt should be a string constant and + the format specifiers follow that of \a sprintf. This creates an + event with the long description set to the expansion of the format + string against the arguments. + */ +KHMEXP kherr_event * __cdecl +kherr_reportf_ex(enum kherr_severity severity, + const wchar_t * facility, + khm_int32 facility_id, +#ifdef _WIN32 + HMODULE hModule, +#endif + const wchar_t * long_desc_fmt, + ...); +#define _reportf_ex kherr_reportf_ex + +/*! \brief Report a formatted message + + The format string \a long_desc_fmt should be a string constant and + the format specifiers follow that of \a sprintf. This creates an + event with the long description set to the expansion of the format + string against the arguments. + */ +KHMEXP kherr_event * __cdecl +kherr_reportf(const wchar_t * long_desc_fmt, + ...); +#define _reportf kherr_reportf + +/*! \brief Create a parameter out of a transient string + + A parameter is created by duplicating the string that is passed + into the function. If the string exceeds KHERR_MAXCCH_STRING, + then only the first part of the string that fits within the limit + is duplicated. + + The resulign ::kherr_param must be passed in to kherr_report(). + The event logging framework will free the duplicated string once + the data is no longer required. + */ +KHMEXP kherr_param kherr_dup_string(const wchar_t * s); + +__inline KHMEXP kherr_param +kherr_val(khm_octet ptype, khm_ui_8 pvalue) { + kherr_param p; + + p.type = ptype; + p.data = pvalue; + + return p; +} + +#define _int32(i) kherr_val(KEPT_INT32, (khm_ui_8) i) +#define _uint32(ui) kherr_val(KEPT_UINT32, (khm_ui_8) ui) +#define _int64(i) kherr_val(KEPT_INT64, (khm_ui_8) i) +#define _uint64(ui) kherr_val(KEPT_UINT64, (khm_ui_8) ui) +#define _cstr(cs) kherr_val(KEPT_STRINGC, (khm_ui_8) cs) +#define _tstr(ts) kherr_val(KEPT_STRINGT, (khm_ui_8) ts) +#define _cptr(p) kherr_val(KEPT_PTR, (khm_ui_8) p) +#define _vnull() kherr_val(KEPT_NONE, 0) +#define _dupstr(s) kherr_dup_string(s) + +/* convenience macros for calling kherr_report */ +#ifdef KHERR_HMODULE + +#define _report_cs0(severity, long_description) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), 0, KHERR_HMODULE) + +#define _report_cs1(severity, long_description, p1) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), 0, KHERR_HMODULE) + +#define _report_cs2(severity, long_description, p1, p2) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), 0, KHERR_HMODULE) + +#define _report_cs3(severity, long_description, p1, p2, p3) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), 0, KHERR_HMODULE) + +#define _report_cs4(severity, long_description, p1, p2, p3, p4) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, 0, KHERR_HMODULE) + +#else + +#define _report_cs0(severity, long_description) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), 0, NULL) + +#define _report_cs1(severity, long_description, p1) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), 0, NULL) + +#define _report_cs2(severity, long_description, p1, p2) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), 0, NULL) + +#define _report_cs3(severity, long_description, p1, p2, p3) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), 0, NULL) + +#define _report_cs4(severity, long_description, p1, p2, p3, p4) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_description), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, 0, NULL) +#endif /* !defined(KHERR_HMODULE) */ + +#ifdef _WIN32 +#define _report_sr0(severity, long_desc_id) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) + +#define _report_sr1(severity, long_desc_id, p1) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) + +#define _report_sr2(severity, long_desc_id, p1, p2) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) + +#define _report_sr3(severity, long_desc_id, p1, p2, p3) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) + +#define _report_sr4(severity, long_desc_id, p1, p2, p3, p4) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, MAKEINTRESOURCE(long_desc_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, KHERR_RF_RES_LONG_DESC, KHERR_HMODULE) +#endif + +#ifdef _WIN32 +#define _report_mr0(severity, long_desc_msg_id) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) + +#define _report_mr1(severity, long_desc_msg_id, p1) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) + +#define _report_mr2(severity, long_desc_msg_id, p1, p2) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) + +#define _report_mr3(severity, long_desc_msg_id, p1, p2, p3) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) + +#define _report_mr4(severity, long_desc_msg_id, p1, p2, p3, p4) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (wchar_t *)(long_desc_msg_id), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, KHERR_RF_MSG_LONG_DESC, KHERR_HMODULE) +#endif + +#define _report_ts0(severity, long_desc_ptr) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, _vnull(), _vnull(), _vnull(), _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) + +#define _report_ts1(severity, long_desc_ptr, p1) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, _vnull(), _vnull(), _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) + +#define _report_ts2(severity, long_desc_ptr, p1, p2) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, p2, _vnull(), _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) + +#define _report_ts3(severity, long_desc_ptr, p1, p2, p3) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, _vnull(), KHERR_RF_FREE_LONG_DESC, NULL) + +#define _report_ts4(severity, long_desc_ptr, p1, p2, p3, p4) \ + kherr_report((severity), NULL, KHERR_FACILITY, NULL, (long_desc_ptr), NULL, KHERR_FACILITY_ID, 0, p1, p2, p3, p4, KHERR_RF_FREE_LONG_DESC, NULL) + +/*! \brief Set the suggestion and suggestion identifier for the last event + + The event that will be modified is the last event reported by the + calling thread. + */ +KHMEXP void KHMAPI kherr_suggest(wchar_t * suggestion, khm_int32 suggestion_id, khm_int32 flags); +#define _suggest_cs(cs,sid) kherr_suggest((cs), (sid), KHERR_RF_CSTR_SUGGEST) +#define _suggest_ts(ts,sid) kherr_suggest((ts), (sid), KHERR_RF_FREE_SUGGEST) +#define _suggest_sr(sr,sid) kherr_suggest(MAKEINTRESOURCE(sr), (sid), KHERR_RF_RES_SUGGEST) +#define _suggest_mr(mr,sid) kherr_suggest((wchar_t *)(DWORD_PTR)(mr), (sid), KHERR_RF_MSG_SUGGEST) + +/*! \brief Set the location string for the last event + + The event that will be modified is the last event reported by the + calling thread. + */ +KHMEXP void KHMAPI kherr_location(wchar_t * location); +#define _location(l) kherr_location(l) + +/*! \brief Set the facility string and identifier for the last event + + The event that will be modified is the last event reported by the + calling thread. + */ +KHMEXP void KHMAPI kherr_facility(wchar_t * facility, khm_int32 facility_id); +#define _facility(f,fid) kherr_facility((f),(fid)) + +/*! \brief Marks the last event as the descriptor event for the current error context + + Note that marking an event as the descriptor event has the effect + of removing the event from event queue. The event will henceforth + be used as the descriptor for the context. The only effective + fields of a descriptor event are \a short_desc, \a long_desc, \a + facility, \a facility_id and the parameters which are used for + resolving formatted strings in the aforementioned fields. + + Upon calling kherr_set_desc_event(), the event will be + automatically evaluated as if kherr_evaluate_event() was called. + + The event that will be referenced is the last event reported by + the calling thread. + */ +KHMEXP void KHMAPI kherr_set_desc_event(void); +#define _describe kherr_set_desc_event + +/*! \brief Delete the last event + + The event that will be deleted is the last event reported by the + calling thread. + */ +KHMEXP void KHMAPI kherr_del_last_event(void); +#define _del_event kherr_del_last_event + +/*! \brief Create a new context + + The created context is not bound to any thread or any context + hierarchy. Hence it cannot be used to capture any events until it + is used in a call to kherr_push_context(). + + Release the returned context pointer with a call to + kherr_release_context(). + + \param[in] flags Initial flags for the context. Combination of + ::kherr_context_flags + + \note This function is for internal use only. + */ +KHMEXP kherr_context * KHMAPI kherr_create_new_context(khm_int32 flags); + +/*! \brief Obtain a hold on a context */ +KHMEXP void KHMAPI kherr_hold_context(kherr_context * c); + +/*! \brief Release a context */ +KHMEXP void KHMAPI kherr_release_context(kherr_context * c); + +/*! \brief Push an empty context + + Creates an empty context, adds it as a child of the current + thread's error context. If the current thread does not have an + error context, then the created error context will be a root level + context. + + The new context will be the current error context for the calling + thread. + + \param[in] flags Initial flags for the context. Combination of + ::kherr_context_flags + + \see kherr_push_new_context() for more information about thread + specific context stacks. + + */ +KHMEXP void KHMAPI kherr_push_new_context(khm_int32 flags); +#define _begin_task kherr_push_new_context + +/*! \brief Push a context + + Each thread has a stack of error contexts. The topmost one is + current. The thread can push or pop contexts on to the stack + independently of the hierarchy of contexts (the only exception, as + explained below is when the context that is being pushed is + unbound). + + If the context being pushed by kherr_push_context() is unbound, + then it will be attached to the current context of the thread as a + child. Once the new context is pushed to the top of the stack, it + will become the current context for the thread. + + The calling thread must call kherr_pop_context() to remove the + context from the top of the stack. Each call to + kherr_push_new_context() or kher_push_context() must have a + corresponding kherr_pop_context() call. + + When the thread terminates, all of the contexts in the thread's + context stack will be automatically removed. + + \see kherr_pop_context() + */ +KHMEXP void KHMAPI kherr_push_context(kherr_context * c); + +/*! \brief Pop a context + + Remove the current error context from the thread's context stack. + If no other open handles exist to the error context, this causes + the error context to collapse into it's parent context or vanish + entirely unless the context contains an error. + + \see kherr_push_context() for more information about thread + specific context stacks. + */ +KHMEXP void KHMAPI kherr_pop_context(void); +#define _end_task kherr_pop_context + +/*! \brief Retrieve the current error context + + The returned pointer must be released with a call to + kherr_release_context(). +*/ +KHMEXP kherr_context * KHMAPI kherr_peek_context(void); + +/*! \brief Check if the current error context indicates an error + + \return TRUE if there is an error. FALSE otherwise. + \see kherr_analyze() + */ +KHMEXP khm_boolean KHMAPI kherr_is_error(void); + +/*! \brief Check if an error context indicates an error + + \return TRUE if there is an error. FALSE otherwise. + \see kherr_analyze() + */ +KHMEXP khm_boolean KHMAPI kherr_is_error_i(kherr_context * c); + +/*! \brief Clear the error state of the current context */ +KHMEXP void KHMAPI kherr_clear_error(void); + +/*! \brief Clear the error state of an error context */ +KHMEXP void KHMAPI kherr_clear_error_i(kherr_context * c); + +/*! \brief Set the progress meter of the current error context + + Setting \a denom to zero removes the progress meter. + */ +KHMEXP void KHMAPI kherr_set_progress(khm_ui_4 num, khm_ui_4 denom); +#define _progress(num,denom) kherr_set_progress((num),(denom)) + +/*! \brief Get the progress meter of the current error context + */ +KHMEXP void KHMAPI kherr_get_progress(khm_ui_4 * num, khm_ui_4 * denom); + +/*! \brief Get the progress meter of an error context + */ +KHMEXP void KHMAPI kherr_get_progress_i(kherr_context * c, khm_ui_4 * num, khm_ui_4 * denom); + +/*! \brief Get the first event in a context + + The returned pointer is only valid as long as there is a hold on + \a c. Once the context is released with a call to + kherr_release_context() all pointers to events in the context + become invalid. + + In addition, the last event in a context may still be "active". A + thread can still modify the last event as long as the context is + active. + + \see kherr_get_next_event(), kherr_get_prev_event(), + kherr_get_last_event() + */ +KHMEXP kherr_event * KHMAPI kherr_get_first_event(kherr_context * c); + +/*! \brief Get the next event + + Call kherr_get_first_event() to obtain the first event in a + context. Subsequent calls to kherr_get_next_event() will yield + other events in the order in which they were reported. The list + ends when kherr_get_next_event() returns NULL. + + The returned pointer is only valid as long as there is a hold on + \a c. Once the context is released with a call to + kherr_release_context() all pointers to events in the context + become invalid. + + In addition, the last event in a context may still be "active". A + thread can still modify the last event as long as the context is + active. + + \see kherr_get_first_event(), kherr_get_prev_event(), + kherr_get_last_event() + */ +KHMEXP kherr_event * KHMAPI kherr_get_next_event(kherr_event * e); + +/*! \brief Get the previous event + + Returns a pointer to the event that was reported in the context + containing \a e prior to \a e being reported. + + The returned pointer is only valid as long as there is a hold on + the error context. Once the context is released with a call to + kherr_release_context() all pointers to events in the context + become invalid. + + In addition, the last event in a context may still be "active". A + thread can still modify the last event as long as the context is + active. + + \see kherr_get_first_event(), kherr_get_next_event(), + kherr_get_last_event() + */ +KHMEXP kherr_event * KHMAPI kherr_get_prev_event(kherr_event * e); + +/*! \brief Get the last event in an error context + + Returns a pointer to the last error event that that was reported + to the context \a c. + + The returned pointer is only valid as long as there is a hold on + the error context. Once the context is released with a call to + kherr_release_context(), all pointers to events in the context + become invalid. + + In addtion, the last event in a context may still be "active". A + thread can still modify the last event as long as the context is + active. + + \see kherr_get_first_event(), kherr_get_next_event(), + kherr_get_prev_event() + */ +KHMEXP kherr_event * KHMAPI kherr_get_last_event(kherr_context * c); + +/*! \brief Get the first child context of a context + + Contexts are arranged in a hiearchy. This function returns the + first child of an error context. Use kherr_get_next_context() to + obtain the other contexts. If \a c is \a NULL, this returns the + first root level context. + + The returned pointer must be released with a call to + kherr_release_context() + */ +KHMEXP kherr_context * KHMAPI kherr_get_first_context(kherr_context * c); + +/*! \brief Get the next sibling context of a context + + The returned pointer must be released with a call to + kherr_release_context() + + \see kherr_get_first_context() + */ +KHMEXP kherr_context * KHMAPI kherr_get_next_context(kherr_context * c); + +/*! \brief Get the desciption event for the context + + The description event is the event that was denoted using + kherr_set_desc_event() as the event which describes the context. + + The returned pointer is only valid as long as there is a hold on + \a c. Once the context is released with a call to + kherr_release_context() all pointers to events in the context + becomes invalid. + */ +KHMEXP kherr_event * KHMAPI kherr_get_desc_event(kherr_context * c); + +/*! \brief Get the error event for the context + + The error event for a context is the last event that had the + highest severity level. + + The returned pointer is only valid as long as there is a hold on + \a c. Once the context is released with a call to + kherr_release_context() all pointers to events in the context + becomes invalid. + */ +KHMEXP kherr_event * KHMAPI kherr_get_err_event(kherr_context * c); + +/*! \brief Evaluate an event + + When an event is reported, all the parameters and resource + references that were passed to kherr_report() are kept as-is until + the actual string values are required by the error reporting + library. However, if the string fields are required before then, + an application can call kherr_evaluate_event() to get them. + + This function does the following: + + - Load any referenced string or message resources that are + referenced in the event's short description, long description or + suggestion. + + - Expand any inserts using the parameters that were passed in. + + - Free up allocated strings in for the descriptions or suggestion + fields and any parameters. + + - Update the string fields in the event to contain the newly + generated strings. + + */ +KHMEXP void KHMAPI kherr_evaluate_event(kherr_event * e); + +/*! \brief Evaluate the last event + + Same as kherr_evaluate_event(), but operates on the last event + logged by the current thread. + + \see kherr_evaluate_event() + */ +KHMEXP void KHMAPI kherr_evaluate_last_event(void); +#define _resolve kherr_evaluate_last_event + +/*! \defgroup kherr_fids Standard Facility IDs +@{*/ +#define KHM_FACILITY_KMM 1 +#define KHM_FACILITY_KCDB 2 +#define KHM_FACILITY_UI 3 +#define KHM_FACILITY_KRB5 64 +#define KHM_FACILITY_KRB4 65 +#define KHM_FACILITY_AFS 66 +#define KHM_FACILITY_USER 128 +/*@}*/ + +/*@}*/ + +/* In debug mode, outputs the formatted string to the debug console */ +#ifdef DEBUG +KHMEXP void kherr_debug_printf(wchar_t * fmt, ...); +#endif + +#endif --- krb5-1.4.4.orig/src/windows/identity/kherr/kherrinternal.h +++ krb5-1.4.4/src/windows/identity/kherr/kherrinternal.h @@ -1,69 +1,69 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHERRORINTERNAL_H -#define __KHIMAIRA_KHERRORINTERNAL_H - -#include -#include -#include -#include - -typedef struct tag_kherr_thread { - khm_size nc_ctx; - khm_size n_ctx; - kherr_context ** ctx; -} kherr_thread; - -#define THREAD_STACK_SIZE 8 - -typedef struct tag_kherr_handler_node { - khm_int32 filter; - kherr_ctx_handler h; - kherr_serial serial; -} kherr_handler_node; - -#define CTX_ALLOC_INCR 4 - -#define EVENT_MASK_UNRESOLVED \ - (KHERR_RF_RES_SHORT_DESC|KHERR_RF_MSG_SHORT_DESC| \ - KHERR_RF_RES_LONG_DESC|KHERR_RF_MSG_LONG_DESC| \ - KHERR_RF_RES_SUGGEST|KHERR_RF_MSG_SUGGEST) - -extern CRITICAL_SECTION cs_error; -extern DWORD tls_error; -extern kherr_context * ctx_free_list; -extern kherr_event * evt_free_list; -extern kherr_handler_node * ctx_handlers; -extern khm_size n_ctx_handlers; - -#define parm_type(p) ((p).type) -#define parm_data(p) ((p).data) - -void resolve_event_strings(kherr_event *); -void attach_this_thread(void); -void detach_this_thread(void); -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHERRORINTERNAL_H +#define __KHIMAIRA_KHERRORINTERNAL_H + +#include +#include +#include +#include + +typedef struct tag_kherr_thread { + khm_size nc_ctx; + khm_size n_ctx; + kherr_context ** ctx; +} kherr_thread; + +#define THREAD_STACK_SIZE 8 + +typedef struct tag_kherr_handler_node { + khm_int32 filter; + kherr_ctx_handler h; + kherr_serial serial; +} kherr_handler_node; + +#define CTX_ALLOC_INCR 4 + +#define EVENT_MASK_UNRESOLVED \ + (KHERR_RF_RES_SHORT_DESC|KHERR_RF_MSG_SHORT_DESC| \ + KHERR_RF_RES_LONG_DESC|KHERR_RF_MSG_LONG_DESC| \ + KHERR_RF_RES_SUGGEST|KHERR_RF_MSG_SUGGEST) + +extern CRITICAL_SECTION cs_error; +extern DWORD tls_error; +extern kherr_context * ctx_free_list; +extern kherr_event * evt_free_list; +extern kherr_handler_node * ctx_handlers; +extern khm_size n_ctx_handlers; + +#define parm_type(p) ((p).type) +#define parm_data(p) ((p).data) + +void resolve_event_strings(kherr_event *); +void attach_this_thread(void); +void detach_this_thread(void); +#endif --- krb5-1.4.4.orig/src/windows/identity/kherr/kherr.c +++ krb5-1.4.4/src/windows/identity/kherr/kherr.c @@ -1,1321 +1,1321 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -CRITICAL_SECTION cs_error; -DWORD tls_error = 0; -kherr_context * ctx_free_list = NULL; -kherr_context * ctx_root_list = NULL; -kherr_context * ctx_error_list = NULL; -kherr_event * evt_free_list = NULL; - -kherr_handler_node * ctx_handlers = NULL; -khm_size n_ctx_handlers; -khm_size nc_ctx_handlers; - -kherr_serial ctx_serial = 0; - -#ifdef DEBUG -#define DEBUG_CONTEXT - -KHMEXP void kherr_debug_printf(wchar_t * fmt, ...) { - va_list vl; - wchar_t buf[1024]; - - va_start(vl, fmt); - StringCbVPrintf(buf, sizeof(buf), fmt, vl); - OutputDebugString(buf); - va_end(vl); -} -#endif - -KHMEXP void KHMAPI kherr_add_ctx_handler(kherr_ctx_handler h, - khm_int32 filter, - kherr_serial serial) { - - khm_size idx; - - assert(h); - - EnterCriticalSection(&cs_error); - if( ctx_handlers == NULL) { - nc_ctx_handlers = CTX_ALLOC_INCR; - n_ctx_handlers = 0; - ctx_handlers = PMALLOC(sizeof(*ctx_handlers) * nc_ctx_handlers); - /* No need to initialize */ - } else if (n_ctx_handlers == nc_ctx_handlers) { - khm_size new_nc; - kherr_handler_node * new_ctxs; - - new_nc = nc_ctx_handlers + CTX_ALLOC_INCR; - new_ctxs = PMALLOC(sizeof(*new_ctxs) * new_nc); - memcpy(new_ctxs, ctx_handlers, n_ctx_handlers * sizeof(*new_ctxs)); - - PFREE(ctx_handlers); - ctx_handlers = new_ctxs; - nc_ctx_handlers = new_nc; - } - - if (filter == 0) - filter = KHERR_CTX_BEGIN | - KHERR_CTX_DESCRIBE | - KHERR_CTX_END | - KHERR_CTX_ERROR; - - /* Since commit events are the most frequent, we put those - handlers at the top of the list. When dispatching a commit - event, we stop looking at the list when we find a filter that - doesn't filter for commit events. */ - if (filter & KHERR_CTX_EVTCOMMIT) { - idx = 0; - memmove(&ctx_handlers[1], &ctx_handlers[0], - n_ctx_handlers * sizeof(ctx_handlers[0])); - } else { - idx = n_ctx_handlers; - } - - ctx_handlers[idx].h = h; - ctx_handlers[idx].filter = filter; - ctx_handlers[idx].serial = serial; - - n_ctx_handlers++; - - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_remove_ctx_handler(kherr_ctx_handler h, - kherr_serial serial) { - khm_size i; - EnterCriticalSection(&cs_error); - - for (i=0 ; i < n_ctx_handlers; i++) { - if (ctx_handlers[i].h == h && - ctx_handlers[i].serial == serial) { - break; - } - } - - if ( i < n_ctx_handlers ) { - n_ctx_handlers --; - for (; i < n_ctx_handlers; i++) { - ctx_handlers[i] = ctx_handlers[i + 1]; - } - } - - LeaveCriticalSection(&cs_error); -} - -/* Called with cs_error held */ -void notify_ctx_event(enum kherr_ctx_event e, kherr_context * c) { - khm_size i; - - kherr_ctx_handler h; - - for (i=0; iserial)) { - if (IsBadCodePtr((FARPROC) ctx_handlers[i].h)) { - ctx_handlers[i].h = NULL; - } else { - h = ctx_handlers[i].h; - (*h)(e,c); - - /* a context handler is allowed to remove itself - during a callback. It is, however, not allowed to - remove anything else. */ - if (h != ctx_handlers[i].h) - i--; - } - } else if (e == KHERR_CTX_EVTCOMMIT && - !(ctx_handlers[i].filter & KHERR_CTX_EVTCOMMIT)) { - /* All handlers that filter for commit events are at the - top of the list. If this handler wasn't filtering for - it, then there's no point in goint further down the - list. */ - break; - } - } -} - -void attach_this_thread(void) { - kherr_thread * t; - - t = (kherr_thread *) TlsGetValue(tls_error); - if (t) - return; - - t = PMALLOC(sizeof(kherr_thread) + - sizeof(kherr_context *) * THREAD_STACK_SIZE); - t->nc_ctx = THREAD_STACK_SIZE; - t->n_ctx = 0; - t->ctx = (kherr_context **) &t[1]; - - TlsSetValue(tls_error, t); -} - -void detach_this_thread(void) { - kherr_thread * t; - khm_size i; - - t = (kherr_thread *) TlsGetValue(tls_error); - if (t) { - for(i=0; i < t->n_ctx; i++) { - kherr_release_context(t->ctx[i]); - } - PFREE(t); - TlsSetValue(tls_error, 0); - } -} - -kherr_context * peek_context(void) { - kherr_thread * t; - - t = (kherr_thread *) TlsGetValue(tls_error); - if (t) { - if (t->n_ctx > 0) - return t->ctx[t->n_ctx - 1]; - else - return NULL; - } else - return NULL; -} - -void push_context(kherr_context * c) { - kherr_thread * t; - - t = (kherr_thread *) TlsGetValue(tls_error); - if (!t) { - attach_this_thread(); - t = (kherr_thread *) TlsGetValue(tls_error); - assert(t); - } - - if (t->n_ctx == t->nc_ctx) { - khm_size nc_new; - khm_size cb_new; - kherr_thread * nt; - - nc_new = t->nc_ctx + THREAD_STACK_SIZE; - cb_new = sizeof(kherr_thread) + - sizeof(kherr_context *) * nc_new; - - nt = PMALLOC(cb_new); - memcpy(nt, t, sizeof(kherr_thread) + - sizeof(kherr_context *) * t->n_ctx); - nt->ctx = (kherr_context **) &nt[1]; - nt->nc_ctx = nc_new; - - PFREE(t); - t = nt; - TlsSetValue(tls_error, t); - } - - assert(t->n_ctx < t->nc_ctx); - t->ctx[t->n_ctx++] = c; - - kherr_hold_context(c); -} - -/* returned pointer is still held */ -kherr_context * pop_context(void) { - kherr_thread * t; - kherr_context * c; - - t = (kherr_thread *) TlsGetValue(tls_error); - if (t) { - if (t->n_ctx > 0) { - c = t->ctx[--(t->n_ctx)]; - return c; - } else - return NULL; - } else { - return NULL; - } -} - -kherr_event * get_empty_event(void) { - kherr_event * e; - - EnterCriticalSection(&cs_error); - if(evt_free_list) { - LPOP(&evt_free_list, &e); - } else { - e = PMALLOC(sizeof(*e)); - } - LeaveCriticalSection(&cs_error); - ZeroMemory(e, sizeof(*e)); - e->severity = KHERR_NONE; - e->magic = KHERR_EVENT_MAGIC; - - return e; -} - -void free_event_params(kherr_event * e) { - if(parm_type(e->p1) == KEPT_STRINGT) { - assert((void *) parm_data(e->p1)); - PFREE((void*) parm_data(e->p1)); - ZeroMemory(&e->p1, sizeof(e->p1)); - } - if(parm_type(e->p2) == KEPT_STRINGT) { - assert((void *) parm_data(e->p2)); - PFREE((void*) parm_data(e->p2)); - ZeroMemory(&e->p2, sizeof(e->p2)); - } - if(parm_type(e->p3) == KEPT_STRINGT) { - assert((void *) parm_data(e->p3)); - PFREE((void*) parm_data(e->p3)); - ZeroMemory(&e->p3, sizeof(e->p3)); - } - if(parm_type(e->p4) == KEPT_STRINGT) { - assert((void *) parm_data(e->p4)); - PFREE((void*) parm_data(e->p4)); - ZeroMemory(&e->p4, sizeof(e->p4)); - } -} - -void free_event(kherr_event * e) { - - EnterCriticalSection(&cs_error); - - assert(e->magic == KHERR_EVENT_MAGIC); - -#ifdef DEBUG_CONTEXT - kherr_debug_printf(L"Freeing event 0x%x\n", e); - if (!(e->flags & KHERR_RF_STR_RESOLVED)) - resolve_event_strings(e); - if (e->short_desc) - kherr_debug_printf(L" Desc(S):[%s]\n", e->short_desc); - if (e->long_desc) - kherr_debug_printf(L" Desc(L):[%s]\n", e->long_desc); - if (e->suggestion) - kherr_debug_printf(L" Suggest:[%s]\n", e->suggestion); - if (e->facility) - kherr_debug_printf(L" Facility:[%s]\n", e->facility); -#endif - - if(e->flags & KHERR_RF_FREE_SHORT_DESC) { - assert(e->short_desc); - PFREE((void *) e->short_desc); - } - if(e->flags & KHERR_RF_FREE_LONG_DESC) { - assert(e->long_desc); - PFREE((void *) e->long_desc); - } - if(e->flags & KHERR_RF_FREE_SUGGEST) { - assert(e->suggestion); - PFREE((void *) e->suggestion); - } - - free_event_params(e); - - ZeroMemory(e, sizeof(e)); - - LPUSH(&evt_free_list, e); - LeaveCriticalSection(&cs_error); -} - -kherr_context * get_empty_context(void) { - kherr_context * c; - - EnterCriticalSection(&cs_error); - if(ctx_free_list) - LPOP(&ctx_free_list, &c); - else { - c = PMALLOC(sizeof(kherr_context)); - } - - ZeroMemory(c,sizeof(*c)); - c->severity = KHERR_NONE; - c->flags = KHERR_CF_UNBOUND; - c->magic = KHERR_CONTEXT_MAGIC; - c->serial = ++ctx_serial; - - LPUSH(&ctx_root_list, c); - - LeaveCriticalSection(&cs_error); - - return c; -} - - -/* Assumes that the context has been deleted from all relevant - lists */ -void free_context(kherr_context * c) { - kherr_context * ch; - kherr_event * e; - - assert(c->magic == KHERR_CONTEXT_MAGIC); -#ifdef DEBUG_CONTEXT - kherr_debug_printf(L"Freeing context 0x%x\n", c); -#endif - - EnterCriticalSection(&cs_error); - - if (c->desc_event) - free_event(c->desc_event); - c->desc_event = NULL; - - TPOPCHILD(c, &ch); - while(ch) { - free_context(ch); - TPOPCHILD(c, &ch); - } - QGET(c, &e); - while(e) { - free_event(e); - QGET(c, &e); - } - - c->serial = 0; - - LPUSH(&ctx_free_list,c); - LeaveCriticalSection(&cs_error); - -#ifdef DEBUG_CONTEXT - kherr_debug_printf(L"Done with context 0x%x\n", c); -#endif -} - -void add_event(kherr_context * c, kherr_event * e) -{ - kherr_event * te; - - EnterCriticalSection(&cs_error); - te = QBOTTOM(c); - if (te && !(te->flags & KHERR_RF_COMMIT)) { - notify_ctx_event(KHERR_CTX_EVTCOMMIT, c); - te->flags |= KHERR_RF_COMMIT; - } - - QPUT(c,e); - if(c->severity >= e->severity) { - if (e->severity <= KHERR_ERROR) - notify_ctx_event(KHERR_CTX_ERROR, c); - - c->severity = e->severity; - c->err_event = e; - c->flags &= ~KHERR_CF_DIRTY; - } - LeaveCriticalSection(&cs_error); -} - -void pick_err_event(kherr_context * c) -{ - kherr_event * e; - kherr_event * ce = NULL; - enum kherr_severity s; - - s = KHERR_RESERVED_BANK; - - EnterCriticalSection(&cs_error); - e = QTOP(c); - while(e) { - if(!(e->flags & KHERR_RF_INERT) && - s >= e->severity) { - ce = e; - s = e->severity; - } - e = QNEXT(e); - } - - if(ce) { - c->err_event = ce; - c->severity = ce->severity; - } else { - c->err_event = NULL; - c->severity = KHERR_NONE; - } - - c->flags &= ~KHERR_CF_DIRTY; - LeaveCriticalSection(&cs_error); -} - -static void arg_from_param(DWORD_PTR ** parm, kherr_param p) { - int t; - - if (p.type != KEPT_NONE) { - t = parm_type(p); - if (t == KEPT_INT32 || - t == KEPT_UINT32 || - t == KEPT_STRINGC || - t == KEPT_STRINGT || - t == KEPT_PTR) { - - *(*parm)++ = (DWORD_PTR) parm_data(p); - - } else if (t == KEPT_INT64 || - t == KEPT_UINT64) { - *(*parm)++ = (DWORD_PTR) parm_data(p) & 0xffffffff; - *(*parm)++ = (DWORD_PTR) (parm_data(p) >> 32) & 0xffffffff; - } else - *(*parm)++ = 0; - } -} - -/* The 'buf' parameter MUST point to a DWORD_PTR[8] array */ -static void args_from_event(DWORD_PTR * buf, kherr_event * e) { - arg_from_param(&buf, e->p1); - arg_from_param(&buf, e->p2); - arg_from_param(&buf, e->p3); - arg_from_param(&buf, e->p4); -} - -static void resolve_string_resource(kherr_event * e, - const wchar_t ** str, - khm_int32 if_flag, - khm_int32 or_flag) { - wchar_t tfmt[KHERR_MAXCCH_STRING]; - wchar_t tbuf[KHERR_MAXCCH_STRING]; - size_t chars = 0; - size_t bytes = 0; - - if(e->flags & if_flag) { - if(e->h_module != NULL) - chars = LoadString(e->h_module, (UINT)(INT_PTR) *str, - tfmt, ARRAYLENGTH(tbuf)); - if(e->h_module == NULL || chars == 0) - *str = NULL; - else { - wchar_t * s; - DWORD_PTR args[8]; - - args_from_event(args, e); - - chars = FormatMessage(FORMAT_MESSAGE_FROM_STRING | - FORMAT_MESSAGE_ARGUMENT_ARRAY, - tfmt, - 0, - 0, - tbuf, - ARRAYLENGTH(tbuf), - (va_list *) args); - - if (chars == 0) { - *str = NULL; - } else { - bytes = (chars + 1) * sizeof(wchar_t); - s = PMALLOC(bytes); - assert(s); - StringCbCopy(s, bytes, tbuf); - *str = s; - e->flags |= or_flag; - } - } - e->flags &= ~if_flag; - } -} - -static void resolve_msg_resource(kherr_event * e, - const wchar_t ** str, - khm_int32 if_flag, - khm_int32 or_flag) { - wchar_t tbuf[KHERR_MAXCCH_STRING]; - size_t chars = 0; - size_t bytes = 0; - DWORD_PTR args[8]; - - if(e->flags & if_flag) { - if(e->h_module != NULL) { - args_from_event(args, e); - - chars = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | - FORMAT_MESSAGE_ARGUMENT_ARRAY, - (LPCVOID) e->h_module, - (DWORD)(DWORD_PTR) *str, - 0, - tbuf, - ARRAYLENGTH(tbuf), - (va_list *) args); - } - - if(e->h_module == NULL || chars == 0) { - *str = NULL; - } else { - wchar_t * s; - - /* MC inserts trailing \r\n to each message unless the - message is terminated with a %0. We remove the last - line break since it is irrelevant to our handling of - the string in the UI. */ - if (tbuf[chars-1] == L'\n') - tbuf[--chars] = L'\0'; - if (tbuf[chars-1] == L'\r') - tbuf[--chars] = L'\0'; - - bytes = (chars + 1) * sizeof(wchar_t); - s = PMALLOC(bytes); - assert(s); - StringCbCopy(s, bytes, tbuf); - *str = s; - e->flags |= or_flag; - } - e->flags &= ~if_flag; - } -} - -static void resolve_string(kherr_event * e, - const wchar_t ** str, - khm_int32 mask, - khm_int32 free_if, - khm_int32 or_flag) { - - wchar_t tbuf[KHERR_MAXCCH_STRING]; - size_t chars; - size_t bytes; - DWORD_PTR args[8]; - - if (((e->flags & mask) == 0 || - (e->flags & mask) == free_if) && - *str != NULL) { - - args_from_event(args, e); - chars = FormatMessage(FORMAT_MESSAGE_FROM_STRING | - FORMAT_MESSAGE_ARGUMENT_ARRAY, - (LPCVOID) *str, - 0, - 0, - tbuf, - ARRAYLENGTH(tbuf), - (va_list *) args); - - if ((e->flags & mask) == free_if) { - PFREE((void *) *str); - } - - e->flags &= ~mask; - - if (chars == 0) { - *str = 0; - } else { - wchar_t * s; - - bytes = (chars + 1) * sizeof(wchar_t); - s = PMALLOC(bytes); - assert(s); - StringCbCopy(s, bytes, tbuf); - *str = s; - e->flags |= or_flag; - } - } - -} - -void resolve_event_strings(kherr_event * e) -{ - resolve_string(e, &e->short_desc, - KHERR_RFMASK_SHORT_DESC, - KHERR_RF_FREE_SHORT_DESC, - KHERR_RF_FREE_SHORT_DESC); - - resolve_string(e, &e->long_desc, - KHERR_RFMASK_LONG_DESC, - KHERR_RF_FREE_LONG_DESC, - KHERR_RF_FREE_LONG_DESC); - - resolve_string(e, &e->suggestion, - KHERR_RFMASK_SUGGEST, - KHERR_RF_FREE_SUGGEST, - KHERR_RF_FREE_SUGGEST); - - resolve_string_resource(e, &e->short_desc, - KHERR_RF_RES_SHORT_DESC, - KHERR_RF_FREE_SHORT_DESC); - - resolve_string_resource(e, &e->long_desc, - KHERR_RF_RES_LONG_DESC, - KHERR_RF_FREE_LONG_DESC); - - resolve_string_resource(e, &e->suggestion, - KHERR_RF_RES_SUGGEST, - KHERR_RF_FREE_SUGGEST); - - resolve_msg_resource(e, &e->short_desc, - KHERR_RF_MSG_SHORT_DESC, - KHERR_RF_FREE_SHORT_DESC); - resolve_msg_resource(e, &e->long_desc, - KHERR_RF_MSG_LONG_DESC, - KHERR_RF_FREE_LONG_DESC); - resolve_msg_resource(e, &e->suggestion, - KHERR_RF_MSG_SUGGEST, - KHERR_RF_FREE_SUGGEST); - - /* get rid of dangling reference now that we have done everything - we can with it. Since we have already dealt with all the - parameter inserts, we don't need the parameters anymore - either. */ - free_event_params(e); - - e->h_module = NULL; - e->flags |= KHERR_RF_STR_RESOLVED; -} - - -KHMEXP void KHMAPI kherr_evaluate_event(kherr_event * e) { - if (!e) - return; - - EnterCriticalSection(&cs_error); - resolve_event_strings(e); - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_evaluate_last_event(void) { - kherr_context * c; - kherr_event * e; - DWORD tid; - - c = peek_context(); - if(!c) - return; - tid = GetCurrentThreadId(); - - EnterCriticalSection(&cs_error); - e = QBOTTOM(c); - while (e != NULL && e->thread_id != tid) - e = QPREV(e); - - if(!e) - goto _exit; - - resolve_event_strings(e); - - _exit: - LeaveCriticalSection(&cs_error); -} - -KHMEXP kherr_event * __cdecl -kherr_reportf(const wchar_t * long_desc_fmt, ...) { - va_list vl; - wchar_t buf[1024]; - kherr_event * e; - - va_start(vl, long_desc_fmt); - StringCbVPrintf(buf, sizeof(buf), long_desc_fmt, vl); -#ifdef DEBUG - OutputDebugString(buf); -#endif - va_end(vl); - - e = kherr_report(KHERR_DEBUG_1, - NULL, NULL, NULL, buf, NULL, 0, - KHERR_SUGGEST_NONE, _vnull(), _vnull(), _vnull(), _vnull(), - KHERR_RF_CSTR_LONG_DESC -#ifdef _WIN32 - ,NULL -#endif - ); - if (e) { - kherr_evaluate_event(e); - } - - return e; -} - -KHMEXP kherr_event * __cdecl -kherr_reportf_ex(enum kherr_severity severity, - const wchar_t * facility, - khm_int32 facility_id, -#ifdef _WIN32 - HMODULE hModule, -#endif - const wchar_t * long_desc_fmt, ...) { - va_list vl; - wchar_t buf[1024]; - kherr_event * e; - - va_start(vl, long_desc_fmt); - StringCbVPrintf(buf, sizeof(buf), long_desc_fmt, vl); -#ifdef DEBUG - OutputDebugString(buf); -#endif - va_end(vl); - - e = kherr_report(severity, NULL, facility, NULL, buf, NULL, facility_id, - KHERR_SUGGEST_NONE, - _vnull(), - _vnull(), - _vnull(), - _vnull(), KHERR_RF_CSTR_LONG_DESC -#ifdef _WIN32 - ,hModule -#endif - ); - if (e) { - kherr_evaluate_event(e); - } - - return e; -} - -KHMEXP kherr_event * KHMAPI -kherr_report(enum kherr_severity severity, - const wchar_t * short_desc, - const wchar_t * facility, - const wchar_t * location, - const wchar_t * long_desc, - const wchar_t * suggestion, - khm_int32 facility_id, - enum kherr_suggestion suggestion_id, - kherr_param p1, - kherr_param p2, - kherr_param p3, - kherr_param p4, - khm_int32 flags -#ifdef _WIN32 - ,HMODULE h_module -#endif - ) { - kherr_context * c; - kherr_event * e; - - /*TODO: sanity check flags (ISPOW2) */ - - e = get_empty_event(); - - e->thread_id = GetCurrentThreadId(); - e->time_ticks = GetTickCount(); - GetSystemTimeAsFileTime(&e->time_ft); - - e->severity = severity; - e->short_desc = short_desc; - e->facility = facility; - e->location = location; - e->long_desc = long_desc; - e->suggestion = suggestion; - e->facility_id = facility_id; - e->suggestion_id = suggestion_id; - e->p1 = p1; - e->p2 = p2; - e->p3 = p3; - e->p4 = p4; - e->flags = flags; -#ifdef _WIN32 - e->h_module = h_module; -#endif - - EnterCriticalSection(&cs_error); - c = peek_context(); - - if(!c) { - /* the reason why we are doing it this way is because p1..p4, - the descriptions and the suggestion may contain allocations - that has to be freed. */ - free_event(e); - e = NULL; - } else { - add_event(c,e); - } - - LeaveCriticalSection(&cs_error); - - return e; -} - -KHMEXP void KHMAPI kherr_suggest(wchar_t * suggestion, - enum kherr_suggestion suggestion_id, - khm_int32 flags) { - kherr_context * c; - kherr_event * e; - DWORD tid; - - if (flags != KHERR_RF_CSTR_SUGGEST && - flags != KHERR_RF_RES_SUGGEST && - flags != KHERR_RF_MSG_SUGGEST && - flags != KHERR_RF_FREE_SUGGEST) - return; - - c = peek_context(); - if(!c) - return; - - tid = GetCurrentThreadId(); - - EnterCriticalSection(&cs_error); - e = QBOTTOM(c); - while (e != NULL && e->thread_id != tid) - e = QPREV(e); - - if(!e) - goto _exit; - - /* if strings have already been resolved in this event, we cant - add any more unresolved strings. */ - if ((flags == KHERR_RF_RES_SUGGEST || - flags == KHERR_RF_MSG_SUGGEST) && - (e->flags & KHERR_RF_STR_RESOLVED)) - goto _exit; - - e->suggestion = suggestion; - e->suggestion_id = suggestion_id; - e->flags |= flags; -_exit: - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_location(wchar_t * location) { - kherr_context * c; - kherr_event * e; - DWORD tid; - - c = peek_context(); - if(!c) - return; - tid = GetCurrentThreadId(); - - EnterCriticalSection(&cs_error); - e = QBOTTOM(c); - while (e != NULL && e->thread_id != tid) - e = QPREV(e); - - if(!e) - goto _exit; - e->location = location; -_exit: - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_facility(wchar_t * facility, - khm_int32 facility_id) { - kherr_context * c; - kherr_event * e; - DWORD tid; - - c = peek_context(); - if(!c) - return; - tid = GetCurrentThreadId(); - EnterCriticalSection(&cs_error); - e = QBOTTOM(c); - while (e != NULL && e->thread_id != tid) - e = QPREV(e); - - if(!e) - goto _exit; - e->facility = facility; - e->facility_id = facility_id; -_exit: - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_set_desc_event(void) { - kherr_context * c; - kherr_event * e; - DWORD tid; - - c = peek_context(); - if(!c) - return; - tid = GetCurrentThreadId(); - - EnterCriticalSection(&cs_error); - e = QBOTTOM(c); - while (e != NULL && e->thread_id != tid) - e = QPREV(e); - - if(!e || c->desc_event) - goto _exit; - - QDEL(c,e); - c->desc_event = e; - e->severity = KHERR_NONE; - resolve_event_strings(e); - - notify_ctx_event(KHERR_CTX_DESCRIBE, c); - -_exit: - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_del_last_event(void) { - kherr_context * c; - kherr_event * e; - DWORD tid; - - c = peek_context(); - - if(!c) - return; - - tid = GetCurrentThreadId(); - - EnterCriticalSection(&cs_error); - e = QBOTTOM(c); - while (e != NULL && e->thread_id != tid) - e = QPREV(e); - - if(e) { - QDEL(c, e); - if(c->err_event == e) { - pick_err_event(c); - } - free_event(e); - } - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_push_context(kherr_context * c) -{ - kherr_context * p; - int new_context = FALSE; - - EnterCriticalSection(&cs_error); - p = peek_context(); - if(p && (c->flags & KHERR_CF_UNBOUND)) { - LDELETE(&ctx_root_list, c); - TADDCHILD(p,c); - c->flags &= ~KHERR_CF_UNBOUND; - kherr_hold_context(p); - new_context = TRUE; - } - push_context(c); - - if (new_context) - notify_ctx_event(KHERR_CTX_BEGIN, c); - - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_push_new_context(khm_int32 flags) -{ - kherr_context * p; - kherr_context * c; - - flags &= KHERR_CFMASK_INITIAL; - - EnterCriticalSection(&cs_error); - p = peek_context(); - c = get_empty_context(); - if(p) { - LDELETE(&ctx_root_list, c); - TADDCHILD(p,c); - c->flags &= ~KHERR_CF_UNBOUND; - kherr_hold_context(p); - } - c->flags |= flags; - push_context(c); - - notify_ctx_event(KHERR_CTX_BEGIN, c); - - LeaveCriticalSection(&cs_error); -} - -kherr_param dup_parm(kherr_param p) { - if(parm_type(p) == KEPT_STRINGT) { - wchar_t * d = PWCSDUP((wchar_t *)parm_data(p)); - return kherr_val(KEPT_STRINGT, (khm_ui_8) d); - } else - return p; -} - -kherr_event * fold_context(kherr_context * c) { - kherr_event * e; - kherr_event * g; - - if (!c) - return NULL; - - EnterCriticalSection(&cs_error); - if(!c->err_event || (c->flags & KHERR_CF_DIRTY)) { - pick_err_event(c); - } - if(c->err_event) { - g = c->err_event; - e = get_empty_event(); - *e = *g; - g->short_desc = NULL; - g->long_desc = NULL; - g->suggestion = NULL; - g->flags &= - ~(KHERR_RF_FREE_SHORT_DESC | - KHERR_RF_FREE_LONG_DESC | - KHERR_RF_FREE_SUGGEST); - LINIT(e); - e->p1 = dup_parm(g->p1); - e->p2 = dup_parm(g->p2); - e->p3 = dup_parm(g->p3); - e->p4 = dup_parm(g->p4); - } else { - e = c->desc_event; - c->desc_event = NULL; - } - - if (e) - e->flags |= KHERR_RF_CONTEXT_FOLD; - - LeaveCriticalSection(&cs_error); - - return e; -} - -KHMEXP void KHMAPI kherr_hold_context(kherr_context * c) { - assert(c && c->magic == KHERR_CONTEXT_MAGIC); - EnterCriticalSection(&cs_error); - c->refcount++; - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_release_context(kherr_context * c) { - assert(c && c->magic == KHERR_CONTEXT_MAGIC); - EnterCriticalSection(&cs_error); - c->refcount--; - if (c->refcount == 0) { - kherr_event * e; - kherr_context * p; - - e = QBOTTOM(c); - if (e && !(e->flags & KHERR_RF_COMMIT)) { - notify_ctx_event(KHERR_CTX_EVTCOMMIT, c); - e->flags |= KHERR_RF_COMMIT; - } - - notify_ctx_event(KHERR_CTX_END, c); - - p = TPARENT(c); - if (p) { - e = fold_context(c); - if (e) - add_event(p, e); - - TDELCHILD(p, c); - kherr_release_context(p); - } else { - LDELETE(&ctx_root_list, c); - } - free_context(c); - } - LeaveCriticalSection(&cs_error); -} - -KHMEXP void KHMAPI kherr_pop_context(void) { - kherr_context * c; - - EnterCriticalSection(&cs_error); - c = pop_context(); - if(c) { - kherr_release_context(c); - } - LeaveCriticalSection(&cs_error); -} - -KHMEXP kherr_context * KHMAPI kherr_peek_context(void) { - kherr_context * c; - - c = peek_context(); - if (c) - kherr_hold_context(c); - - return c; -} - -KHMEXP khm_boolean KHMAPI kherr_is_error(void) { - kherr_context * c = peek_context(); - return kherr_is_error_i(c); -} - -KHMEXP khm_boolean KHMAPI kherr_is_error_i(kherr_context * c) { - if(c && c->severity <= KHERR_ERROR) - return TRUE; - else - return FALSE; -} - -KHMEXP void KHMAPI kherr_clear_error(void) { - kherr_context * c = peek_context(); - if (c) - kherr_clear_error_i(c); -} - -KHMEXP void KHMAPI kherr_clear_error_i(kherr_context * c) { - kherr_event * e; - if (c) { - EnterCriticalSection(&cs_error); - e = QTOP(c); - while(e) { - e->flags |= KHERR_RF_INERT; - e = QNEXT(e); - } - c->severity = KHERR_NONE; - c->err_event = NULL; - c->flags &= ~KHERR_CF_DIRTY; - LeaveCriticalSection(&cs_error); - } -} - -KHMEXP void KHMAPI kherr_set_progress(khm_ui_4 num, khm_ui_4 denom) { - kherr_context * c = peek_context(); - if(c) { - EnterCriticalSection(&cs_error); - c->progress_denom = denom; - c->progress_num = num; - LeaveCriticalSection(&cs_error); - } -} - -KHMEXP void KHMAPI kherr_get_progress(khm_ui_4 * num, khm_ui_4 * denom) { - kherr_context * c = peek_context(); - kherr_get_progress_i(c,num,denom); -} - -KHMEXP void KHMAPI kherr_get_progress_i(kherr_context * c, - khm_ui_4 * num, - khm_ui_4 * denom) { - if(c) { - EnterCriticalSection(&cs_error); - *num = c->progress_num; - *denom = c->progress_denom; - LeaveCriticalSection(&cs_error); - } else { - *num = 0; - *denom = 0; - } -} - -KHMEXP kherr_event * KHMAPI kherr_get_first_event(kherr_context * c) -{ - kherr_event * e; - EnterCriticalSection(&cs_error); - e = QTOP(c); - LeaveCriticalSection(&cs_error); - return e; -} - -KHMEXP kherr_event * KHMAPI kherr_get_next_event(kherr_event * e) -{ - kherr_event * ee; - - EnterCriticalSection(&cs_error); - ee = QNEXT(e); - LeaveCriticalSection(&cs_error); - return ee; -} - -KHMEXP kherr_event * KHMAPI kherr_get_prev_event(kherr_event * e) -{ - kherr_event * ee; - - EnterCriticalSection(&cs_error); - ee = QPREV(e); - LeaveCriticalSection(&cs_error); - - return ee; -} - -KHMEXP kherr_event * KHMAPI kherr_get_last_event(kherr_context * c) -{ - kherr_event * e; - EnterCriticalSection(&cs_error); - e = QBOTTOM(c); - LeaveCriticalSection(&cs_error); - return e; -} - -KHMEXP kherr_context * KHMAPI kherr_get_first_context(kherr_context * c) -{ - kherr_context * cc; - - EnterCriticalSection(&cs_error); - if (c) { - cc = TFIRSTCHILD(c); - if (cc) - kherr_hold_context(cc); - } else { - cc = ctx_root_list; - if (cc) - kherr_hold_context(cc); - } - LeaveCriticalSection(&cs_error); - return cc; -} - -KHMEXP kherr_context * KHMAPI kherr_get_next_context(kherr_context * c) -{ - kherr_context * cc; - EnterCriticalSection(&cs_error); - cc = LNEXT(c); - if (cc) - kherr_hold_context(cc); - LeaveCriticalSection(&cs_error); - return cc; -} - -KHMEXP kherr_event * KHMAPI kherr_get_err_event(kherr_context * c) -{ - kherr_event * e; - EnterCriticalSection(&cs_error); - if(!c->err_event) { - pick_err_event(c); - } - e = c->err_event; - LeaveCriticalSection(&cs_error); - return e; -} - -KHMEXP kherr_event * KHMAPI kherr_get_desc_event(kherr_context * c) -{ - kherr_event * e; - - EnterCriticalSection(&cs_error); - e = c->desc_event; - LeaveCriticalSection(&cs_error); - return e; -} - -KHMEXP kherr_param kherr_dup_string(const wchar_t * s) -{ - wchar_t * dest; - size_t cb_s; - - if (s == NULL) - return _vnull(); - - if (FAILED(StringCbLength(s, KHERR_MAXCB_STRING, &cb_s))) - cb_s = KHERR_MAXCB_STRING; - else - cb_s += sizeof(wchar_t); - - dest = PMALLOC(cb_s); - assert(dest != NULL); - dest[0] = L'\0'; - - StringCbCopy(dest, cb_s, s); - - return _tstr(dest); -} - - -#if 0 -KHMEXP kherr_param kherr_val(khm_octet ptype, khm_ui_8 pvalue) { - kherr_param p; - p.type = ptype; - p.data = pvalue; - - return p; -} -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +CRITICAL_SECTION cs_error; +DWORD tls_error = 0; +kherr_context * ctx_free_list = NULL; +kherr_context * ctx_root_list = NULL; +kherr_context * ctx_error_list = NULL; +kherr_event * evt_free_list = NULL; + +kherr_handler_node * ctx_handlers = NULL; +khm_size n_ctx_handlers; +khm_size nc_ctx_handlers; + +kherr_serial ctx_serial = 0; + +#ifdef DEBUG +#define DEBUG_CONTEXT + +KHMEXP void kherr_debug_printf(wchar_t * fmt, ...) { + va_list vl; + wchar_t buf[1024]; + + va_start(vl, fmt); + StringCbVPrintf(buf, sizeof(buf), fmt, vl); + OutputDebugString(buf); + va_end(vl); +} +#endif + +KHMEXP void KHMAPI kherr_add_ctx_handler(kherr_ctx_handler h, + khm_int32 filter, + kherr_serial serial) { + + khm_size idx; + + assert(h); + + EnterCriticalSection(&cs_error); + if( ctx_handlers == NULL) { + nc_ctx_handlers = CTX_ALLOC_INCR; + n_ctx_handlers = 0; + ctx_handlers = PMALLOC(sizeof(*ctx_handlers) * nc_ctx_handlers); + /* No need to initialize */ + } else if (n_ctx_handlers == nc_ctx_handlers) { + khm_size new_nc; + kherr_handler_node * new_ctxs; + + new_nc = nc_ctx_handlers + CTX_ALLOC_INCR; + new_ctxs = PMALLOC(sizeof(*new_ctxs) * new_nc); + memcpy(new_ctxs, ctx_handlers, n_ctx_handlers * sizeof(*new_ctxs)); + + PFREE(ctx_handlers); + ctx_handlers = new_ctxs; + nc_ctx_handlers = new_nc; + } + + if (filter == 0) + filter = KHERR_CTX_BEGIN | + KHERR_CTX_DESCRIBE | + KHERR_CTX_END | + KHERR_CTX_ERROR; + + /* Since commit events are the most frequent, we put those + handlers at the top of the list. When dispatching a commit + event, we stop looking at the list when we find a filter that + doesn't filter for commit events. */ + if (filter & KHERR_CTX_EVTCOMMIT) { + idx = 0; + memmove(&ctx_handlers[1], &ctx_handlers[0], + n_ctx_handlers * sizeof(ctx_handlers[0])); + } else { + idx = n_ctx_handlers; + } + + ctx_handlers[idx].h = h; + ctx_handlers[idx].filter = filter; + ctx_handlers[idx].serial = serial; + + n_ctx_handlers++; + + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_remove_ctx_handler(kherr_ctx_handler h, + kherr_serial serial) { + khm_size i; + EnterCriticalSection(&cs_error); + + for (i=0 ; i < n_ctx_handlers; i++) { + if (ctx_handlers[i].h == h && + ctx_handlers[i].serial == serial) { + break; + } + } + + if ( i < n_ctx_handlers ) { + n_ctx_handlers --; + for (; i < n_ctx_handlers; i++) { + ctx_handlers[i] = ctx_handlers[i + 1]; + } + } + + LeaveCriticalSection(&cs_error); +} + +/* Called with cs_error held */ +void notify_ctx_event(enum kherr_ctx_event e, kherr_context * c) { + khm_size i; + + kherr_ctx_handler h; + + for (i=0; iserial)) { + if (IsBadCodePtr((FARPROC) ctx_handlers[i].h)) { + ctx_handlers[i].h = NULL; + } else { + h = ctx_handlers[i].h; + (*h)(e,c); + + /* a context handler is allowed to remove itself + during a callback. It is, however, not allowed to + remove anything else. */ + if (h != ctx_handlers[i].h) + i--; + } + } else if (e == KHERR_CTX_EVTCOMMIT && + !(ctx_handlers[i].filter & KHERR_CTX_EVTCOMMIT)) { + /* All handlers that filter for commit events are at the + top of the list. If this handler wasn't filtering for + it, then there's no point in goint further down the + list. */ + break; + } + } +} + +void attach_this_thread(void) { + kherr_thread * t; + + t = (kherr_thread *) TlsGetValue(tls_error); + if (t) + return; + + t = PMALLOC(sizeof(kherr_thread) + + sizeof(kherr_context *) * THREAD_STACK_SIZE); + t->nc_ctx = THREAD_STACK_SIZE; + t->n_ctx = 0; + t->ctx = (kherr_context **) &t[1]; + + TlsSetValue(tls_error, t); +} + +void detach_this_thread(void) { + kherr_thread * t; + khm_size i; + + t = (kherr_thread *) TlsGetValue(tls_error); + if (t) { + for(i=0; i < t->n_ctx; i++) { + kherr_release_context(t->ctx[i]); + } + PFREE(t); + TlsSetValue(tls_error, 0); + } +} + +kherr_context * peek_context(void) { + kherr_thread * t; + + t = (kherr_thread *) TlsGetValue(tls_error); + if (t) { + if (t->n_ctx > 0) + return t->ctx[t->n_ctx - 1]; + else + return NULL; + } else + return NULL; +} + +void push_context(kherr_context * c) { + kherr_thread * t; + + t = (kherr_thread *) TlsGetValue(tls_error); + if (!t) { + attach_this_thread(); + t = (kherr_thread *) TlsGetValue(tls_error); + assert(t); + } + + if (t->n_ctx == t->nc_ctx) { + khm_size nc_new; + khm_size cb_new; + kherr_thread * nt; + + nc_new = t->nc_ctx + THREAD_STACK_SIZE; + cb_new = sizeof(kherr_thread) + + sizeof(kherr_context *) * nc_new; + + nt = PMALLOC(cb_new); + memcpy(nt, t, sizeof(kherr_thread) + + sizeof(kherr_context *) * t->n_ctx); + nt->ctx = (kherr_context **) &nt[1]; + nt->nc_ctx = nc_new; + + PFREE(t); + t = nt; + TlsSetValue(tls_error, t); + } + + assert(t->n_ctx < t->nc_ctx); + t->ctx[t->n_ctx++] = c; + + kherr_hold_context(c); +} + +/* returned pointer is still held */ +kherr_context * pop_context(void) { + kherr_thread * t; + kherr_context * c; + + t = (kherr_thread *) TlsGetValue(tls_error); + if (t) { + if (t->n_ctx > 0) { + c = t->ctx[--(t->n_ctx)]; + return c; + } else + return NULL; + } else { + return NULL; + } +} + +kherr_event * get_empty_event(void) { + kherr_event * e; + + EnterCriticalSection(&cs_error); + if(evt_free_list) { + LPOP(&evt_free_list, &e); + } else { + e = PMALLOC(sizeof(*e)); + } + LeaveCriticalSection(&cs_error); + ZeroMemory(e, sizeof(*e)); + e->severity = KHERR_NONE; + e->magic = KHERR_EVENT_MAGIC; + + return e; +} + +void free_event_params(kherr_event * e) { + if(parm_type(e->p1) == KEPT_STRINGT) { + assert((void *) parm_data(e->p1)); + PFREE((void*) parm_data(e->p1)); + ZeroMemory(&e->p1, sizeof(e->p1)); + } + if(parm_type(e->p2) == KEPT_STRINGT) { + assert((void *) parm_data(e->p2)); + PFREE((void*) parm_data(e->p2)); + ZeroMemory(&e->p2, sizeof(e->p2)); + } + if(parm_type(e->p3) == KEPT_STRINGT) { + assert((void *) parm_data(e->p3)); + PFREE((void*) parm_data(e->p3)); + ZeroMemory(&e->p3, sizeof(e->p3)); + } + if(parm_type(e->p4) == KEPT_STRINGT) { + assert((void *) parm_data(e->p4)); + PFREE((void*) parm_data(e->p4)); + ZeroMemory(&e->p4, sizeof(e->p4)); + } +} + +void free_event(kherr_event * e) { + + EnterCriticalSection(&cs_error); + + assert(e->magic == KHERR_EVENT_MAGIC); + +#ifdef DEBUG_CONTEXT + kherr_debug_printf(L"Freeing event 0x%x\n", e); + if (!(e->flags & KHERR_RF_STR_RESOLVED)) + resolve_event_strings(e); + if (e->short_desc) + kherr_debug_printf(L" Desc(S):[%s]\n", e->short_desc); + if (e->long_desc) + kherr_debug_printf(L" Desc(L):[%s]\n", e->long_desc); + if (e->suggestion) + kherr_debug_printf(L" Suggest:[%s]\n", e->suggestion); + if (e->facility) + kherr_debug_printf(L" Facility:[%s]\n", e->facility); +#endif + + if(e->flags & KHERR_RF_FREE_SHORT_DESC) { + assert(e->short_desc); + PFREE((void *) e->short_desc); + } + if(e->flags & KHERR_RF_FREE_LONG_DESC) { + assert(e->long_desc); + PFREE((void *) e->long_desc); + } + if(e->flags & KHERR_RF_FREE_SUGGEST) { + assert(e->suggestion); + PFREE((void *) e->suggestion); + } + + free_event_params(e); + + ZeroMemory(e, sizeof(e)); + + LPUSH(&evt_free_list, e); + LeaveCriticalSection(&cs_error); +} + +kherr_context * get_empty_context(void) { + kherr_context * c; + + EnterCriticalSection(&cs_error); + if(ctx_free_list) + LPOP(&ctx_free_list, &c); + else { + c = PMALLOC(sizeof(kherr_context)); + } + + ZeroMemory(c,sizeof(*c)); + c->severity = KHERR_NONE; + c->flags = KHERR_CF_UNBOUND; + c->magic = KHERR_CONTEXT_MAGIC; + c->serial = ++ctx_serial; + + LPUSH(&ctx_root_list, c); + + LeaveCriticalSection(&cs_error); + + return c; +} + + +/* Assumes that the context has been deleted from all relevant + lists */ +void free_context(kherr_context * c) { + kherr_context * ch; + kherr_event * e; + + assert(c->magic == KHERR_CONTEXT_MAGIC); +#ifdef DEBUG_CONTEXT + kherr_debug_printf(L"Freeing context 0x%x\n", c); +#endif + + EnterCriticalSection(&cs_error); + + if (c->desc_event) + free_event(c->desc_event); + c->desc_event = NULL; + + TPOPCHILD(c, &ch); + while(ch) { + free_context(ch); + TPOPCHILD(c, &ch); + } + QGET(c, &e); + while(e) { + free_event(e); + QGET(c, &e); + } + + c->serial = 0; + + LPUSH(&ctx_free_list,c); + LeaveCriticalSection(&cs_error); + +#ifdef DEBUG_CONTEXT + kherr_debug_printf(L"Done with context 0x%x\n", c); +#endif +} + +void add_event(kherr_context * c, kherr_event * e) +{ + kherr_event * te; + + EnterCriticalSection(&cs_error); + te = QBOTTOM(c); + if (te && !(te->flags & KHERR_RF_COMMIT)) { + notify_ctx_event(KHERR_CTX_EVTCOMMIT, c); + te->flags |= KHERR_RF_COMMIT; + } + + QPUT(c,e); + if(c->severity >= e->severity) { + if (e->severity <= KHERR_ERROR) + notify_ctx_event(KHERR_CTX_ERROR, c); + + c->severity = e->severity; + c->err_event = e; + c->flags &= ~KHERR_CF_DIRTY; + } + LeaveCriticalSection(&cs_error); +} + +void pick_err_event(kherr_context * c) +{ + kherr_event * e; + kherr_event * ce = NULL; + enum kherr_severity s; + + s = KHERR_RESERVED_BANK; + + EnterCriticalSection(&cs_error); + e = QTOP(c); + while(e) { + if(!(e->flags & KHERR_RF_INERT) && + s >= e->severity) { + ce = e; + s = e->severity; + } + e = QNEXT(e); + } + + if(ce) { + c->err_event = ce; + c->severity = ce->severity; + } else { + c->err_event = NULL; + c->severity = KHERR_NONE; + } + + c->flags &= ~KHERR_CF_DIRTY; + LeaveCriticalSection(&cs_error); +} + +static void arg_from_param(DWORD_PTR ** parm, kherr_param p) { + int t; + + if (p.type != KEPT_NONE) { + t = parm_type(p); + if (t == KEPT_INT32 || + t == KEPT_UINT32 || + t == KEPT_STRINGC || + t == KEPT_STRINGT || + t == KEPT_PTR) { + + *(*parm)++ = (DWORD_PTR) parm_data(p); + + } else if (t == KEPT_INT64 || + t == KEPT_UINT64) { + *(*parm)++ = (DWORD_PTR) parm_data(p) & 0xffffffff; + *(*parm)++ = (DWORD_PTR) (parm_data(p) >> 32) & 0xffffffff; + } else + *(*parm)++ = 0; + } +} + +/* The 'buf' parameter MUST point to a DWORD_PTR[8] array */ +static void args_from_event(DWORD_PTR * buf, kherr_event * e) { + arg_from_param(&buf, e->p1); + arg_from_param(&buf, e->p2); + arg_from_param(&buf, e->p3); + arg_from_param(&buf, e->p4); +} + +static void resolve_string_resource(kherr_event * e, + const wchar_t ** str, + khm_int32 if_flag, + khm_int32 or_flag) { + wchar_t tfmt[KHERR_MAXCCH_STRING]; + wchar_t tbuf[KHERR_MAXCCH_STRING]; + size_t chars = 0; + size_t bytes = 0; + + if(e->flags & if_flag) { + if(e->h_module != NULL) + chars = LoadString(e->h_module, (UINT)(INT_PTR) *str, + tfmt, ARRAYLENGTH(tbuf)); + if(e->h_module == NULL || chars == 0) + *str = NULL; + else { + wchar_t * s; + DWORD_PTR args[8]; + + args_from_event(args, e); + + chars = FormatMessage(FORMAT_MESSAGE_FROM_STRING | + FORMAT_MESSAGE_ARGUMENT_ARRAY, + tfmt, + 0, + 0, + tbuf, + ARRAYLENGTH(tbuf), + (va_list *) args); + + if (chars == 0) { + *str = NULL; + } else { + bytes = (chars + 1) * sizeof(wchar_t); + s = PMALLOC(bytes); + assert(s); + StringCbCopy(s, bytes, tbuf); + *str = s; + e->flags |= or_flag; + } + } + e->flags &= ~if_flag; + } +} + +static void resolve_msg_resource(kherr_event * e, + const wchar_t ** str, + khm_int32 if_flag, + khm_int32 or_flag) { + wchar_t tbuf[KHERR_MAXCCH_STRING]; + size_t chars = 0; + size_t bytes = 0; + DWORD_PTR args[8]; + + if(e->flags & if_flag) { + if(e->h_module != NULL) { + args_from_event(args, e); + + chars = FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | + FORMAT_MESSAGE_ARGUMENT_ARRAY, + (LPCVOID) e->h_module, + (DWORD)(DWORD_PTR) *str, + 0, + tbuf, + ARRAYLENGTH(tbuf), + (va_list *) args); + } + + if(e->h_module == NULL || chars == 0) { + *str = NULL; + } else { + wchar_t * s; + + /* MC inserts trailing \r\n to each message unless the + message is terminated with a %0. We remove the last + line break since it is irrelevant to our handling of + the string in the UI. */ + if (tbuf[chars-1] == L'\n') + tbuf[--chars] = L'\0'; + if (tbuf[chars-1] == L'\r') + tbuf[--chars] = L'\0'; + + bytes = (chars + 1) * sizeof(wchar_t); + s = PMALLOC(bytes); + assert(s); + StringCbCopy(s, bytes, tbuf); + *str = s; + e->flags |= or_flag; + } + e->flags &= ~if_flag; + } +} + +static void resolve_string(kherr_event * e, + const wchar_t ** str, + khm_int32 mask, + khm_int32 free_if, + khm_int32 or_flag) { + + wchar_t tbuf[KHERR_MAXCCH_STRING]; + size_t chars; + size_t bytes; + DWORD_PTR args[8]; + + if (((e->flags & mask) == 0 || + (e->flags & mask) == free_if) && + *str != NULL) { + + args_from_event(args, e); + chars = FormatMessage(FORMAT_MESSAGE_FROM_STRING | + FORMAT_MESSAGE_ARGUMENT_ARRAY, + (LPCVOID) *str, + 0, + 0, + tbuf, + ARRAYLENGTH(tbuf), + (va_list *) args); + + if ((e->flags & mask) == free_if) { + PFREE((void *) *str); + } + + e->flags &= ~mask; + + if (chars == 0) { + *str = 0; + } else { + wchar_t * s; + + bytes = (chars + 1) * sizeof(wchar_t); + s = PMALLOC(bytes); + assert(s); + StringCbCopy(s, bytes, tbuf); + *str = s; + e->flags |= or_flag; + } + } + +} + +void resolve_event_strings(kherr_event * e) +{ + resolve_string(e, &e->short_desc, + KHERR_RFMASK_SHORT_DESC, + KHERR_RF_FREE_SHORT_DESC, + KHERR_RF_FREE_SHORT_DESC); + + resolve_string(e, &e->long_desc, + KHERR_RFMASK_LONG_DESC, + KHERR_RF_FREE_LONG_DESC, + KHERR_RF_FREE_LONG_DESC); + + resolve_string(e, &e->suggestion, + KHERR_RFMASK_SUGGEST, + KHERR_RF_FREE_SUGGEST, + KHERR_RF_FREE_SUGGEST); + + resolve_string_resource(e, &e->short_desc, + KHERR_RF_RES_SHORT_DESC, + KHERR_RF_FREE_SHORT_DESC); + + resolve_string_resource(e, &e->long_desc, + KHERR_RF_RES_LONG_DESC, + KHERR_RF_FREE_LONG_DESC); + + resolve_string_resource(e, &e->suggestion, + KHERR_RF_RES_SUGGEST, + KHERR_RF_FREE_SUGGEST); + + resolve_msg_resource(e, &e->short_desc, + KHERR_RF_MSG_SHORT_DESC, + KHERR_RF_FREE_SHORT_DESC); + resolve_msg_resource(e, &e->long_desc, + KHERR_RF_MSG_LONG_DESC, + KHERR_RF_FREE_LONG_DESC); + resolve_msg_resource(e, &e->suggestion, + KHERR_RF_MSG_SUGGEST, + KHERR_RF_FREE_SUGGEST); + + /* get rid of dangling reference now that we have done everything + we can with it. Since we have already dealt with all the + parameter inserts, we don't need the parameters anymore + either. */ + free_event_params(e); + + e->h_module = NULL; + e->flags |= KHERR_RF_STR_RESOLVED; +} + + +KHMEXP void KHMAPI kherr_evaluate_event(kherr_event * e) { + if (!e) + return; + + EnterCriticalSection(&cs_error); + resolve_event_strings(e); + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_evaluate_last_event(void) { + kherr_context * c; + kherr_event * e; + DWORD tid; + + c = peek_context(); + if(!c) + return; + tid = GetCurrentThreadId(); + + EnterCriticalSection(&cs_error); + e = QBOTTOM(c); + while (e != NULL && e->thread_id != tid) + e = QPREV(e); + + if(!e) + goto _exit; + + resolve_event_strings(e); + + _exit: + LeaveCriticalSection(&cs_error); +} + +KHMEXP kherr_event * __cdecl +kherr_reportf(const wchar_t * long_desc_fmt, ...) { + va_list vl; + wchar_t buf[1024]; + kherr_event * e; + + va_start(vl, long_desc_fmt); + StringCbVPrintf(buf, sizeof(buf), long_desc_fmt, vl); +#ifdef DEBUG + OutputDebugString(buf); +#endif + va_end(vl); + + e = kherr_report(KHERR_DEBUG_1, + NULL, NULL, NULL, buf, NULL, 0, + KHERR_SUGGEST_NONE, _vnull(), _vnull(), _vnull(), _vnull(), + KHERR_RF_CSTR_LONG_DESC +#ifdef _WIN32 + ,NULL +#endif + ); + if (e) { + kherr_evaluate_event(e); + } + + return e; +} + +KHMEXP kherr_event * __cdecl +kherr_reportf_ex(enum kherr_severity severity, + const wchar_t * facility, + khm_int32 facility_id, +#ifdef _WIN32 + HMODULE hModule, +#endif + const wchar_t * long_desc_fmt, ...) { + va_list vl; + wchar_t buf[1024]; + kherr_event * e; + + va_start(vl, long_desc_fmt); + StringCbVPrintf(buf, sizeof(buf), long_desc_fmt, vl); +#ifdef DEBUG + OutputDebugString(buf); +#endif + va_end(vl); + + e = kherr_report(severity, NULL, facility, NULL, buf, NULL, facility_id, + KHERR_SUGGEST_NONE, + _vnull(), + _vnull(), + _vnull(), + _vnull(), KHERR_RF_CSTR_LONG_DESC +#ifdef _WIN32 + ,hModule +#endif + ); + if (e) { + kherr_evaluate_event(e); + } + + return e; +} + +KHMEXP kherr_event * KHMAPI +kherr_report(enum kherr_severity severity, + const wchar_t * short_desc, + const wchar_t * facility, + const wchar_t * location, + const wchar_t * long_desc, + const wchar_t * suggestion, + khm_int32 facility_id, + enum kherr_suggestion suggestion_id, + kherr_param p1, + kherr_param p2, + kherr_param p3, + kherr_param p4, + khm_int32 flags +#ifdef _WIN32 + ,HMODULE h_module +#endif + ) { + kherr_context * c; + kherr_event * e; + + /*TODO: sanity check flags (ISPOW2) */ + + e = get_empty_event(); + + e->thread_id = GetCurrentThreadId(); + e->time_ticks = GetTickCount(); + GetSystemTimeAsFileTime(&e->time_ft); + + e->severity = severity; + e->short_desc = short_desc; + e->facility = facility; + e->location = location; + e->long_desc = long_desc; + e->suggestion = suggestion; + e->facility_id = facility_id; + e->suggestion_id = suggestion_id; + e->p1 = p1; + e->p2 = p2; + e->p3 = p3; + e->p4 = p4; + e->flags = flags; +#ifdef _WIN32 + e->h_module = h_module; +#endif + + EnterCriticalSection(&cs_error); + c = peek_context(); + + if(!c) { + /* the reason why we are doing it this way is because p1..p4, + the descriptions and the suggestion may contain allocations + that has to be freed. */ + free_event(e); + e = NULL; + } else { + add_event(c,e); + } + + LeaveCriticalSection(&cs_error); + + return e; +} + +KHMEXP void KHMAPI kherr_suggest(wchar_t * suggestion, + enum kherr_suggestion suggestion_id, + khm_int32 flags) { + kherr_context * c; + kherr_event * e; + DWORD tid; + + if (flags != KHERR_RF_CSTR_SUGGEST && + flags != KHERR_RF_RES_SUGGEST && + flags != KHERR_RF_MSG_SUGGEST && + flags != KHERR_RF_FREE_SUGGEST) + return; + + c = peek_context(); + if(!c) + return; + + tid = GetCurrentThreadId(); + + EnterCriticalSection(&cs_error); + e = QBOTTOM(c); + while (e != NULL && e->thread_id != tid) + e = QPREV(e); + + if(!e) + goto _exit; + + /* if strings have already been resolved in this event, we cant + add any more unresolved strings. */ + if ((flags == KHERR_RF_RES_SUGGEST || + flags == KHERR_RF_MSG_SUGGEST) && + (e->flags & KHERR_RF_STR_RESOLVED)) + goto _exit; + + e->suggestion = suggestion; + e->suggestion_id = suggestion_id; + e->flags |= flags; +_exit: + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_location(wchar_t * location) { + kherr_context * c; + kherr_event * e; + DWORD tid; + + c = peek_context(); + if(!c) + return; + tid = GetCurrentThreadId(); + + EnterCriticalSection(&cs_error); + e = QBOTTOM(c); + while (e != NULL && e->thread_id != tid) + e = QPREV(e); + + if(!e) + goto _exit; + e->location = location; +_exit: + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_facility(wchar_t * facility, + khm_int32 facility_id) { + kherr_context * c; + kherr_event * e; + DWORD tid; + + c = peek_context(); + if(!c) + return; + tid = GetCurrentThreadId(); + EnterCriticalSection(&cs_error); + e = QBOTTOM(c); + while (e != NULL && e->thread_id != tid) + e = QPREV(e); + + if(!e) + goto _exit; + e->facility = facility; + e->facility_id = facility_id; +_exit: + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_set_desc_event(void) { + kherr_context * c; + kherr_event * e; + DWORD tid; + + c = peek_context(); + if(!c) + return; + tid = GetCurrentThreadId(); + + EnterCriticalSection(&cs_error); + e = QBOTTOM(c); + while (e != NULL && e->thread_id != tid) + e = QPREV(e); + + if(!e || c->desc_event) + goto _exit; + + QDEL(c,e); + c->desc_event = e; + e->severity = KHERR_NONE; + resolve_event_strings(e); + + notify_ctx_event(KHERR_CTX_DESCRIBE, c); + +_exit: + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_del_last_event(void) { + kherr_context * c; + kherr_event * e; + DWORD tid; + + c = peek_context(); + + if(!c) + return; + + tid = GetCurrentThreadId(); + + EnterCriticalSection(&cs_error); + e = QBOTTOM(c); + while (e != NULL && e->thread_id != tid) + e = QPREV(e); + + if(e) { + QDEL(c, e); + if(c->err_event == e) { + pick_err_event(c); + } + free_event(e); + } + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_push_context(kherr_context * c) +{ + kherr_context * p; + int new_context = FALSE; + + EnterCriticalSection(&cs_error); + p = peek_context(); + if(p && (c->flags & KHERR_CF_UNBOUND)) { + LDELETE(&ctx_root_list, c); + TADDCHILD(p,c); + c->flags &= ~KHERR_CF_UNBOUND; + kherr_hold_context(p); + new_context = TRUE; + } + push_context(c); + + if (new_context) + notify_ctx_event(KHERR_CTX_BEGIN, c); + + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_push_new_context(khm_int32 flags) +{ + kherr_context * p; + kherr_context * c; + + flags &= KHERR_CFMASK_INITIAL; + + EnterCriticalSection(&cs_error); + p = peek_context(); + c = get_empty_context(); + if(p) { + LDELETE(&ctx_root_list, c); + TADDCHILD(p,c); + c->flags &= ~KHERR_CF_UNBOUND; + kherr_hold_context(p); + } + c->flags |= flags; + push_context(c); + + notify_ctx_event(KHERR_CTX_BEGIN, c); + + LeaveCriticalSection(&cs_error); +} + +kherr_param dup_parm(kherr_param p) { + if(parm_type(p) == KEPT_STRINGT) { + wchar_t * d = PWCSDUP((wchar_t *)parm_data(p)); + return kherr_val(KEPT_STRINGT, (khm_ui_8) d); + } else + return p; +} + +kherr_event * fold_context(kherr_context * c) { + kherr_event * e; + kherr_event * g; + + if (!c) + return NULL; + + EnterCriticalSection(&cs_error); + if(!c->err_event || (c->flags & KHERR_CF_DIRTY)) { + pick_err_event(c); + } + if(c->err_event) { + g = c->err_event; + e = get_empty_event(); + *e = *g; + g->short_desc = NULL; + g->long_desc = NULL; + g->suggestion = NULL; + g->flags &= + ~(KHERR_RF_FREE_SHORT_DESC | + KHERR_RF_FREE_LONG_DESC | + KHERR_RF_FREE_SUGGEST); + LINIT(e); + e->p1 = dup_parm(g->p1); + e->p2 = dup_parm(g->p2); + e->p3 = dup_parm(g->p3); + e->p4 = dup_parm(g->p4); + } else { + e = c->desc_event; + c->desc_event = NULL; + } + + if (e) + e->flags |= KHERR_RF_CONTEXT_FOLD; + + LeaveCriticalSection(&cs_error); + + return e; +} + +KHMEXP void KHMAPI kherr_hold_context(kherr_context * c) { + assert(c && c->magic == KHERR_CONTEXT_MAGIC); + EnterCriticalSection(&cs_error); + c->refcount++; + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_release_context(kherr_context * c) { + assert(c && c->magic == KHERR_CONTEXT_MAGIC); + EnterCriticalSection(&cs_error); + c->refcount--; + if (c->refcount == 0) { + kherr_event * e; + kherr_context * p; + + e = QBOTTOM(c); + if (e && !(e->flags & KHERR_RF_COMMIT)) { + notify_ctx_event(KHERR_CTX_EVTCOMMIT, c); + e->flags |= KHERR_RF_COMMIT; + } + + notify_ctx_event(KHERR_CTX_END, c); + + p = TPARENT(c); + if (p) { + e = fold_context(c); + if (e) + add_event(p, e); + + TDELCHILD(p, c); + kherr_release_context(p); + } else { + LDELETE(&ctx_root_list, c); + } + free_context(c); + } + LeaveCriticalSection(&cs_error); +} + +KHMEXP void KHMAPI kherr_pop_context(void) { + kherr_context * c; + + EnterCriticalSection(&cs_error); + c = pop_context(); + if(c) { + kherr_release_context(c); + } + LeaveCriticalSection(&cs_error); +} + +KHMEXP kherr_context * KHMAPI kherr_peek_context(void) { + kherr_context * c; + + c = peek_context(); + if (c) + kherr_hold_context(c); + + return c; +} + +KHMEXP khm_boolean KHMAPI kherr_is_error(void) { + kherr_context * c = peek_context(); + return kherr_is_error_i(c); +} + +KHMEXP khm_boolean KHMAPI kherr_is_error_i(kherr_context * c) { + if(c && c->severity <= KHERR_ERROR) + return TRUE; + else + return FALSE; +} + +KHMEXP void KHMAPI kherr_clear_error(void) { + kherr_context * c = peek_context(); + if (c) + kherr_clear_error_i(c); +} + +KHMEXP void KHMAPI kherr_clear_error_i(kherr_context * c) { + kherr_event * e; + if (c) { + EnterCriticalSection(&cs_error); + e = QTOP(c); + while(e) { + e->flags |= KHERR_RF_INERT; + e = QNEXT(e); + } + c->severity = KHERR_NONE; + c->err_event = NULL; + c->flags &= ~KHERR_CF_DIRTY; + LeaveCriticalSection(&cs_error); + } +} + +KHMEXP void KHMAPI kherr_set_progress(khm_ui_4 num, khm_ui_4 denom) { + kherr_context * c = peek_context(); + if(c) { + EnterCriticalSection(&cs_error); + c->progress_denom = denom; + c->progress_num = num; + LeaveCriticalSection(&cs_error); + } +} + +KHMEXP void KHMAPI kherr_get_progress(khm_ui_4 * num, khm_ui_4 * denom) { + kherr_context * c = peek_context(); + kherr_get_progress_i(c,num,denom); +} + +KHMEXP void KHMAPI kherr_get_progress_i(kherr_context * c, + khm_ui_4 * num, + khm_ui_4 * denom) { + if(c) { + EnterCriticalSection(&cs_error); + *num = c->progress_num; + *denom = c->progress_denom; + LeaveCriticalSection(&cs_error); + } else { + *num = 0; + *denom = 0; + } +} + +KHMEXP kherr_event * KHMAPI kherr_get_first_event(kherr_context * c) +{ + kherr_event * e; + EnterCriticalSection(&cs_error); + e = QTOP(c); + LeaveCriticalSection(&cs_error); + return e; +} + +KHMEXP kherr_event * KHMAPI kherr_get_next_event(kherr_event * e) +{ + kherr_event * ee; + + EnterCriticalSection(&cs_error); + ee = QNEXT(e); + LeaveCriticalSection(&cs_error); + return ee; +} + +KHMEXP kherr_event * KHMAPI kherr_get_prev_event(kherr_event * e) +{ + kherr_event * ee; + + EnterCriticalSection(&cs_error); + ee = QPREV(e); + LeaveCriticalSection(&cs_error); + + return ee; +} + +KHMEXP kherr_event * KHMAPI kherr_get_last_event(kherr_context * c) +{ + kherr_event * e; + EnterCriticalSection(&cs_error); + e = QBOTTOM(c); + LeaveCriticalSection(&cs_error); + return e; +} + +KHMEXP kherr_context * KHMAPI kherr_get_first_context(kherr_context * c) +{ + kherr_context * cc; + + EnterCriticalSection(&cs_error); + if (c) { + cc = TFIRSTCHILD(c); + if (cc) + kherr_hold_context(cc); + } else { + cc = ctx_root_list; + if (cc) + kherr_hold_context(cc); + } + LeaveCriticalSection(&cs_error); + return cc; +} + +KHMEXP kherr_context * KHMAPI kherr_get_next_context(kherr_context * c) +{ + kherr_context * cc; + EnterCriticalSection(&cs_error); + cc = LNEXT(c); + if (cc) + kherr_hold_context(cc); + LeaveCriticalSection(&cs_error); + return cc; +} + +KHMEXP kherr_event * KHMAPI kherr_get_err_event(kherr_context * c) +{ + kherr_event * e; + EnterCriticalSection(&cs_error); + if(!c->err_event) { + pick_err_event(c); + } + e = c->err_event; + LeaveCriticalSection(&cs_error); + return e; +} + +KHMEXP kherr_event * KHMAPI kherr_get_desc_event(kherr_context * c) +{ + kherr_event * e; + + EnterCriticalSection(&cs_error); + e = c->desc_event; + LeaveCriticalSection(&cs_error); + return e; +} + +KHMEXP kherr_param kherr_dup_string(const wchar_t * s) +{ + wchar_t * dest; + size_t cb_s; + + if (s == NULL) + return _vnull(); + + if (FAILED(StringCbLength(s, KHERR_MAXCB_STRING, &cb_s))) + cb_s = KHERR_MAXCB_STRING; + else + cb_s += sizeof(wchar_t); + + dest = PMALLOC(cb_s); + assert(dest != NULL); + dest[0] = L'\0'; + + StringCbCopy(dest, cb_s, s); + + return _tstr(dest); +} + + +#if 0 +KHMEXP kherr_param kherr_val(khm_octet ptype, khm_ui_8 pvalue) { + kherr_param p; + p.type = ptype; + p.data = pvalue; + + return p; +} +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/krb4plugin.c +++ krb5-1.4.4/src/windows/identity/plugins/krb4/krb4plugin.c @@ -1,294 +1,294 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#include -#include -#include -#include - -khm_int32 credtype_id_krb4 = KCDB_CREDTYPE_INVALID; -khm_int32 credtype_id_krb5 = KCDB_CREDTYPE_INVALID; - -khm_boolean krb4_initialized = FALSE; -khm_handle krb4_credset = NULL; - -/* Kerberos IV stuff */ -khm_int32 KHMAPI -krb4_msg_system(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - switch(msg_subtype) { - case KMSG_SYSTEM_INIT: - { -#ifdef _WIN64 - return KHM_ERROR_NOT_IMPLEMENTED; -#else - kcdb_credtype ct; - wchar_t buf[KCDB_MAXCCH_SHORT_DESC]; - size_t cbsize; - khui_config_node_reg reg; - wchar_t wshort_desc[KHUI_MAXCCH_SHORT_DESC]; - wchar_t wlong_desc[KHUI_MAXCCH_LONG_DESC]; - - /* perform critical registrations and initialization - stuff */ - ZeroMemory(&ct, sizeof(ct)); - ct.id = KCDB_CREDTYPE_AUTO; - ct.name = KRB4_CREDTYPE_NAME; - - if(LoadString(hResModule, IDS_KRB4_SHORT_DESC, - buf, ARRAYLENGTH(buf))) - { - StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); - cbsize += sizeof(wchar_t); - ct.short_desc = PMALLOC(cbsize); - StringCbCopy(ct.short_desc, cbsize, buf); - } - - /* even though ideally we should be setting limits - based KCDB_MAXCB_LONG_DESC, our long description - actually fits nicely in KCDB_MAXCB_SHORT_DESC */ - if(LoadString(hResModule, IDS_KRB4_LONG_DESC, - buf, ARRAYLENGTH(buf))) - { - StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); - cbsize += sizeof(wchar_t); - ct.long_desc = PMALLOC(cbsize); - StringCbCopy(ct.long_desc, cbsize, buf); - } - - ct.icon = NULL; /* TODO: set a proper icon */ - kmq_create_subscription(krb4_cb, &ct.sub); - - rv = kcdb_credtype_register(&ct, &credtype_id_krb4); - - if(KHM_SUCCEEDED(rv)) - rv = kcdb_credset_create(&krb4_credset); - - if (KHM_SUCCEEDED(rv)) - rv = kcdb_credtype_get_id(KRB5_CREDTYPE_NAME, - &credtype_id_krb5); - - if(ct.short_desc) - PFREE(ct.short_desc); - - if(ct.long_desc) - PFREE(ct.long_desc); - - if (KHM_SUCCEEDED(rv)) { - khui_config_node idents; - - ZeroMemory(®, sizeof(reg)); - - reg.name = KRB4_CONFIG_NODE_NAME; - reg.short_desc = wshort_desc; - reg.long_desc = wlong_desc; - reg.h_module = hResModule; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_KRB4); - reg.dlg_proc = krb4_confg_proc; - reg.flags = 0; - - LoadString(hResModule, IDS_CFG_KRB4_LONG, - wlong_desc, ARRAYLENGTH(wlong_desc)); - LoadString(hResModule, IDS_CFG_KRB4_SHORT, - wshort_desc, ARRAYLENGTH(wshort_desc)); - - khui_cfg_register(NULL, ®); - - khui_cfg_open(NULL, L"KhmIdentities", &idents); - - ZeroMemory(®, sizeof(reg)); - - reg.name = KRB4_IDS_CONFIG_NODE_NAME; - reg.short_desc = wshort_desc; - reg.long_desc = wlong_desc; - reg.h_module = hResModule; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDS_KRB4); - reg.dlg_proc = krb4_ids_config_proc; - reg.flags = KHUI_CNFLAG_SUBPANEL; - - LoadString(hResModule, IDS_CFG_KRB4_SHORT, - wlong_desc, ARRAYLENGTH(wlong_desc)); - LoadString(hResModule, IDS_CFG_KRB4_SHORT, - wshort_desc, ARRAYLENGTH(wshort_desc)); - - khui_cfg_register(idents, ®); - - ZeroMemory(®, sizeof(reg)); - - reg.name = KRB4_ID_CONFIG_NODE_NAME; - reg.short_desc = wshort_desc; - reg.long_desc = wlong_desc; - reg.h_module = hResModule; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_ID_KRB4); - reg.dlg_proc = krb4_id_config_proc; - reg.flags = KHUI_CNFLAG_SUBPANEL | KHUI_CNFLAG_PLURAL; - - LoadString(hResModule, IDS_CFG_KRB4_SHORT, - wlong_desc, ARRAYLENGTH(wlong_desc)); - LoadString(hResModule, IDS_CFG_KRB4_SHORT, - wshort_desc, ARRAYLENGTH(wshort_desc)); - - khui_cfg_register(idents, ®); - - khui_cfg_release(idents); - - krb4_initialized = TRUE; - - khm_krb4_list_tickets(); - } - - /* Lookup common data types */ - if(KHM_FAILED(kcdb_type_get_id(TYPENAME_ENCTYPE, - &type_id_enctype))) { - rv = KHM_ERROR_UNKNOWN; - } - - if(KHM_FAILED(kcdb_type_get_id(TYPENAME_ADDR_LIST, - &type_id_addr_list))) { - rv = KHM_ERROR_UNKNOWN; - } - - if(KHM_FAILED(kcdb_type_get_id(TYPENAME_KRB5_FLAGS, - &type_id_krb5_flags))) { - rv = KHM_ERROR_UNKNOWN; - } - - /* Lookup common attributes */ - if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_KEY_ENCTYPE, - &attr_id_key_enctype))) { - rv = KHM_ERROR_UNKNOWN; - } - - if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_TKT_ENCTYPE, - &attr_id_tkt_enctype))) { - rv = KHM_ERROR_UNKNOWN; - } - - if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_ADDR_LIST, - &attr_id_addr_list))) { - rv = KHM_ERROR_UNKNOWN; - } - - if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_KRB5_FLAGS, - &attr_id_krb5_flags))) { - rv = KHM_ERROR_UNKNOWN; - } -#endif - } - break; - - case KMSG_SYSTEM_EXIT: -#ifdef _WIN64 - /* See above. On 64-bit platforms, we don't support Krb4 at - all. */ - return 0; -#else - if(credtype_id_krb4 >= 0) - { - /* basically just unregister the credential type */ - kcdb_credtype_unregister(credtype_id_krb4); - - kcdb_credset_delete(krb4_credset); - } - break; -#endif - } - - return rv; -} - -khm_int32 KHMAPI -krb4_msg_cred(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - switch(msg_subtype) { - case KMSG_CRED_REFRESH: - { - khm_krb4_list_tickets(); - } - break; - - case KMSG_CRED_DESTROY_CREDS: - { - khui_action_context * ctx; - khm_handle credset; - khm_size nc_root = 0; - khm_size nc_sel = 0; - - ctx = (khui_action_context *) vparam; - - /* if all krb4 tickets are selected, then we destroy all - of them. Otherwise, we do nothing. */ - - kcdb_credset_create(&credset); - - kcdb_credset_extract(credset, ctx->credset, - NULL, credtype_id_krb4); - kcdb_credset_get_size(credset, &nc_sel); - - kcdb_credset_flush(credset); - - kcdb_credset_extract(credset, NULL, - NULL, credtype_id_krb4); - kcdb_credset_get_size(credset, &nc_root); - - kcdb_credset_delete(credset); - - if (nc_root == nc_sel) { - khm_krb4_kdestroy(); - } - } - break; - - default: - if (IS_CRED_ACQ_MSG(msg_subtype)) - return krb4_msg_newcred(msg_type, msg_subtype, uparam, vparam); - } - - return rv; -} - -khm_int32 KHMAPI -krb4_cb(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) -{ - switch(msg_type) { - case KMSG_SYSTEM: - return krb4_msg_system(msg_type, msg_subtype, uparam, vparam); - case KMSG_CRED: - return krb4_msg_cred(msg_type, msg_subtype, uparam, vparam); - } - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include +#include +#include +#include + +khm_int32 credtype_id_krb4 = KCDB_CREDTYPE_INVALID; +khm_int32 credtype_id_krb5 = KCDB_CREDTYPE_INVALID; + +khm_boolean krb4_initialized = FALSE; +khm_handle krb4_credset = NULL; + +/* Kerberos IV stuff */ +khm_int32 KHMAPI +krb4_msg_system(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + switch(msg_subtype) { + case KMSG_SYSTEM_INIT: + { +#ifdef _WIN64 + return KHM_ERROR_NOT_IMPLEMENTED; +#else + kcdb_credtype ct; + wchar_t buf[KCDB_MAXCCH_SHORT_DESC]; + size_t cbsize; + khui_config_node_reg reg; + wchar_t wshort_desc[KHUI_MAXCCH_SHORT_DESC]; + wchar_t wlong_desc[KHUI_MAXCCH_LONG_DESC]; + + /* perform critical registrations and initialization + stuff */ + ZeroMemory(&ct, sizeof(ct)); + ct.id = KCDB_CREDTYPE_AUTO; + ct.name = KRB4_CREDTYPE_NAME; + + if(LoadString(hResModule, IDS_KRB4_SHORT_DESC, + buf, ARRAYLENGTH(buf))) + { + StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); + cbsize += sizeof(wchar_t); + ct.short_desc = PMALLOC(cbsize); + StringCbCopy(ct.short_desc, cbsize, buf); + } + + /* even though ideally we should be setting limits + based KCDB_MAXCB_LONG_DESC, our long description + actually fits nicely in KCDB_MAXCB_SHORT_DESC */ + if(LoadString(hResModule, IDS_KRB4_LONG_DESC, + buf, ARRAYLENGTH(buf))) + { + StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); + cbsize += sizeof(wchar_t); + ct.long_desc = PMALLOC(cbsize); + StringCbCopy(ct.long_desc, cbsize, buf); + } + + ct.icon = NULL; /* TODO: set a proper icon */ + kmq_create_subscription(krb4_cb, &ct.sub); + + rv = kcdb_credtype_register(&ct, &credtype_id_krb4); + + if(KHM_SUCCEEDED(rv)) + rv = kcdb_credset_create(&krb4_credset); + + if (KHM_SUCCEEDED(rv)) + rv = kcdb_credtype_get_id(KRB5_CREDTYPE_NAME, + &credtype_id_krb5); + + if(ct.short_desc) + PFREE(ct.short_desc); + + if(ct.long_desc) + PFREE(ct.long_desc); + + if (KHM_SUCCEEDED(rv)) { + khui_config_node idents; + + ZeroMemory(®, sizeof(reg)); + + reg.name = KRB4_CONFIG_NODE_NAME; + reg.short_desc = wshort_desc; + reg.long_desc = wlong_desc; + reg.h_module = hResModule; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_KRB4); + reg.dlg_proc = krb4_confg_proc; + reg.flags = 0; + + LoadString(hResModule, IDS_CFG_KRB4_LONG, + wlong_desc, ARRAYLENGTH(wlong_desc)); + LoadString(hResModule, IDS_CFG_KRB4_SHORT, + wshort_desc, ARRAYLENGTH(wshort_desc)); + + khui_cfg_register(NULL, ®); + + khui_cfg_open(NULL, L"KhmIdentities", &idents); + + ZeroMemory(®, sizeof(reg)); + + reg.name = KRB4_IDS_CONFIG_NODE_NAME; + reg.short_desc = wshort_desc; + reg.long_desc = wlong_desc; + reg.h_module = hResModule; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDS_KRB4); + reg.dlg_proc = krb4_ids_config_proc; + reg.flags = KHUI_CNFLAG_SUBPANEL; + + LoadString(hResModule, IDS_CFG_KRB4_SHORT, + wlong_desc, ARRAYLENGTH(wlong_desc)); + LoadString(hResModule, IDS_CFG_KRB4_SHORT, + wshort_desc, ARRAYLENGTH(wshort_desc)); + + khui_cfg_register(idents, ®); + + ZeroMemory(®, sizeof(reg)); + + reg.name = KRB4_ID_CONFIG_NODE_NAME; + reg.short_desc = wshort_desc; + reg.long_desc = wlong_desc; + reg.h_module = hResModule; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_ID_KRB4); + reg.dlg_proc = krb4_id_config_proc; + reg.flags = KHUI_CNFLAG_SUBPANEL | KHUI_CNFLAG_PLURAL; + + LoadString(hResModule, IDS_CFG_KRB4_SHORT, + wlong_desc, ARRAYLENGTH(wlong_desc)); + LoadString(hResModule, IDS_CFG_KRB4_SHORT, + wshort_desc, ARRAYLENGTH(wshort_desc)); + + khui_cfg_register(idents, ®); + + khui_cfg_release(idents); + + krb4_initialized = TRUE; + + khm_krb4_list_tickets(); + } + + /* Lookup common data types */ + if(KHM_FAILED(kcdb_type_get_id(TYPENAME_ENCTYPE, + &type_id_enctype))) { + rv = KHM_ERROR_UNKNOWN; + } + + if(KHM_FAILED(kcdb_type_get_id(TYPENAME_ADDR_LIST, + &type_id_addr_list))) { + rv = KHM_ERROR_UNKNOWN; + } + + if(KHM_FAILED(kcdb_type_get_id(TYPENAME_KRB5_FLAGS, + &type_id_krb5_flags))) { + rv = KHM_ERROR_UNKNOWN; + } + + /* Lookup common attributes */ + if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_KEY_ENCTYPE, + &attr_id_key_enctype))) { + rv = KHM_ERROR_UNKNOWN; + } + + if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_TKT_ENCTYPE, + &attr_id_tkt_enctype))) { + rv = KHM_ERROR_UNKNOWN; + } + + if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_ADDR_LIST, + &attr_id_addr_list))) { + rv = KHM_ERROR_UNKNOWN; + } + + if(KHM_FAILED(kcdb_attrib_get_id(ATTRNAME_KRB5_FLAGS, + &attr_id_krb5_flags))) { + rv = KHM_ERROR_UNKNOWN; + } +#endif + } + break; + + case KMSG_SYSTEM_EXIT: +#ifdef _WIN64 + /* See above. On 64-bit platforms, we don't support Krb4 at + all. */ + return 0; +#else + if(credtype_id_krb4 >= 0) + { + /* basically just unregister the credential type */ + kcdb_credtype_unregister(credtype_id_krb4); + + kcdb_credset_delete(krb4_credset); + } + break; +#endif + } + + return rv; +} + +khm_int32 KHMAPI +krb4_msg_cred(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + switch(msg_subtype) { + case KMSG_CRED_REFRESH: + { + khm_krb4_list_tickets(); + } + break; + + case KMSG_CRED_DESTROY_CREDS: + { + khui_action_context * ctx; + khm_handle credset; + khm_size nc_root = 0; + khm_size nc_sel = 0; + + ctx = (khui_action_context *) vparam; + + /* if all krb4 tickets are selected, then we destroy all + of them. Otherwise, we do nothing. */ + + kcdb_credset_create(&credset); + + kcdb_credset_extract(credset, ctx->credset, + NULL, credtype_id_krb4); + kcdb_credset_get_size(credset, &nc_sel); + + kcdb_credset_flush(credset); + + kcdb_credset_extract(credset, NULL, + NULL, credtype_id_krb4); + kcdb_credset_get_size(credset, &nc_root); + + kcdb_credset_delete(credset); + + if (nc_root == nc_sel) { + khm_krb4_kdestroy(); + } + } + break; + + default: + if (IS_CRED_ACQ_MSG(msg_subtype)) + return krb4_msg_newcred(msg_type, msg_subtype, uparam, vparam); + } + + return rv; +} + +khm_int32 KHMAPI +krb4_cb(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) +{ + switch(msg_type) { + case KMSG_SYSTEM: + return krb4_msg_system(msg_type, msg_subtype, uparam, vparam); + case KMSG_CRED: + return krb4_msg_cred(msg_type, msg_subtype, uparam, vparam); + } + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/errorfuncs.c +++ krb5-1.4.4/src/windows/identity/plugins/krb4/errorfuncs.c @@ -1,226 +1,226 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -#include - -extern void (__cdecl *pinitialize_krb_error_func)(); -extern void (__cdecl *pinitialize_kadm_error_table)(); - - -khm_int32 init_error_funcs() -{ - -#if 0 - /*TODO: Do something about this */ - if (plsh_LoadKrb4LeashErrorTables) - plsh_LoadKrb4LeashErrorTables(hLeashInst, 0); -#endif - return KHM_ERROR_SUCCESS; -} - -khm_int32 exit_error_funcs() -{ - return KHM_ERROR_SUCCESS; -} - -// Global Variables. -static long lsh_errno; -static char *err_context; /* error context */ -extern int (*Lcom_err)(LPSTR,long,LPSTR,...); -extern LPSTR (*Lerror_message)(long); -extern LPSTR (*Lerror_table_name)(long); - -#ifdef WIN16 -#define UNDERSCORE "_" -#else -#define UNDERSCORE -#endif - -HWND GetRootParent (HWND Child) -{ - HWND Last = NULL; - while (Child) - { - Last = Child; - Child = GetParent (Child); - } - return Last; -} - - -LPSTR err_describe(LPSTR buf, size_t len, long code) -{ - LPSTR cp, com_err_msg; - int offset; - long table_num; - char *etype; - - offset = (int) (code & 255); - table_num = code - offset; - com_err_msg = Lerror_message(code); - - switch(table_num) - { - case krb_err_base: - case kadm_err_base: - break; - default: - StringCbCopyA(buf, len, com_err_msg); - return buf; - } - - cp = buf; - if (table_num == krb_err_base) - switch(offset) - { - case KDC_NAME_EXP: /* 001 Principal expired */ - case KDC_SERVICE_EXP: /* 002 Service expired */ - case KDC_AUTH_EXP: /* 003 Auth expired */ - case KDC_PKT_VER: /* 004 Protocol version unknown */ - case KDC_P_MKEY_VER: /* 005 Wrong master key version */ - case KDC_S_MKEY_VER: /* 006 Wrong master key version */ - case KDC_BYTE_ORDER: /* 007 Byte order unknown */ - case KDC_PR_N_UNIQUE: /* 009 Principal not unique */ - case KDC_NULL_KEY: /* 010 Principal has null key */ - case KDC_GEN_ERR: /* 011 Generic error from KDC */ - case INTK_W_NOTALL : /* 061 Not ALL tickets returned */ - case INTK_PROT : /* 063 Protocol Error */ - case INTK_ERR : /* 070 Other error */ - com_err_msg = "Something weird happened... try again, and if Leash" - " continues to fail, contact Network Services as listed in the " - "About box."; - break; - case KDC_PR_UNKNOWN: /* 008 Principal unknown */ - com_err_msg = "You have entered an unknown username/instance/realm" - " combination."; - break; - case GC_TKFIL : /* 021 Can't read ticket file */ - case GC_NOTKT : /* 022 Can't find ticket or TGT */ - com_err_msg = "Something is wrong with the memory where your " - "tickets are stored. Try exiting Windows and restarting your " - "computer."; - break; - case MK_AP_TGTEXP : /* 026 TGT Expired */ - /* no extra error msg */ - break; - case RD_AP_TIME : /* 037 delta_t too big */ - com_err_msg = "Your computer's clock is out of sync with the " - "Kerberos server. Please see the help file about correcting " - "your clock."; - break; - - case RD_AP_UNDEC : /* 031 Can't decode authenticator */ - case RD_AP_EXP : /* 032 Ticket expired */ - case RD_AP_NYV : /* 033 Ticket not yet valid */ - case RD_AP_REPEAT : /* 034 Repeated request */ - case RD_AP_NOT_US : /* 035 The ticket isn't for us */ - case RD_AP_INCON : /* 036 Request is inconsistent */ - case RD_AP_BADD : /* 038 Incorrect net address */ - case RD_AP_VERSION : /* 039 protocol version mismatch */ - case RD_AP_MSG_TYPE : /* 040 invalid msg type */ - case RD_AP_MODIFIED : /* 041 message stream modified */ - case RD_AP_ORDER : /* 042 message out of order */ - case RD_AP_UNAUTHOR : /* 043 unauthorized request */ - /* no extra error msg */ - break; - case GT_PW_NULL: /* 51 Current PW is null */ - case GT_PW_BADPW: /* 52 Incorrect current password */ - case GT_PW_PROT: /* 53 Protocol Error */ - case GT_PW_KDCERR: /* 54 Error returned by KDC */ - case GT_PW_NULLTKT: /* 55 Null tkt returned by KDC */ - /* no error msg yet */ - break; - - /* Values returned by send_to_kdc */ - case SKDC_RETRY : /* 56 Retry count exceeded */ - case SKDC_CANT : /* 57 Can't send request */ - com_err_msg = "Cannot contact the kerberos server for the selected realm."; - break; - /* no error message on purpose: */ - case INTK_BADPW : /* 062 Incorrect password */ - break; - default: - /* no extra error msg */ - break; - } - else - switch(code) - { - case KADM_INSECURE_PW: - /* if( kadm_info != NULL ){ - * wsprintf(buf, "%s\n%s", com_err_msg, kadm_info); - * } else { - * wsprintf(buf, "%s\nPlease see the help file for information " - * "about secure passwords.", com_err_msg); - * } - * com_err_msg = buf; - */ - - /* The above code would be preferred since it allows site specific - * information to be delivered from the Kerberos server. However the - * message box is too small for VGA screens. - * It does work well if we only have to support 1024x768 - */ - - com_err_msg = "You have entered an insecure or weak password."; - - default: - /* no extra error msg */ - break; - } - if(com_err_msg != buf) { - StringCbCopyA(buf, len, com_err_msg); - } - cp = buf + strlen(buf); - *cp++ = '\n'; - switch(table_num) { - case krb_err_base: - etype = "Kerberos"; - break; - case kadm_err_base: - etype = "Kerberos supplemental"; - break; - default: - etype = Lerror_table_name(table_num); - break; - } - StringCbPrintfA((LPSTR) cp, len - (cp-buf), (LPSTR) "(%s error %d" -#ifdef DEBUG_COM_ERR - " (absolute error %ld)" -#endif - ")", etype, offset - //")\nPress F1 for help on this error.", etype, offset -#ifdef DEBUG_COM_ERR - , code -#endif - ); - - return (LPSTR)buf; -} - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +#include + +extern void (__cdecl *pinitialize_krb_error_func)(); +extern void (__cdecl *pinitialize_kadm_error_table)(); + + +khm_int32 init_error_funcs() +{ + +#if 0 + /*TODO: Do something about this */ + if (plsh_LoadKrb4LeashErrorTables) + plsh_LoadKrb4LeashErrorTables(hLeashInst, 0); +#endif + return KHM_ERROR_SUCCESS; +} + +khm_int32 exit_error_funcs() +{ + return KHM_ERROR_SUCCESS; +} + +// Global Variables. +static long lsh_errno; +static char *err_context; /* error context */ +extern int (*Lcom_err)(LPSTR,long,LPSTR,...); +extern LPSTR (*Lerror_message)(long); +extern LPSTR (*Lerror_table_name)(long); + +#ifdef WIN16 +#define UNDERSCORE "_" +#else +#define UNDERSCORE +#endif + +HWND GetRootParent (HWND Child) +{ + HWND Last = NULL; + while (Child) + { + Last = Child; + Child = GetParent (Child); + } + return Last; +} + + +LPSTR err_describe(LPSTR buf, size_t len, long code) +{ + LPSTR cp, com_err_msg; + int offset; + long table_num; + char *etype; + + offset = (int) (code & 255); + table_num = code - offset; + com_err_msg = Lerror_message(code); + + switch(table_num) + { + case krb_err_base: + case kadm_err_base: + break; + default: + StringCbCopyA(buf, len, com_err_msg); + return buf; + } + + cp = buf; + if (table_num == krb_err_base) + switch(offset) + { + case KDC_NAME_EXP: /* 001 Principal expired */ + case KDC_SERVICE_EXP: /* 002 Service expired */ + case KDC_AUTH_EXP: /* 003 Auth expired */ + case KDC_PKT_VER: /* 004 Protocol version unknown */ + case KDC_P_MKEY_VER: /* 005 Wrong master key version */ + case KDC_S_MKEY_VER: /* 006 Wrong master key version */ + case KDC_BYTE_ORDER: /* 007 Byte order unknown */ + case KDC_PR_N_UNIQUE: /* 009 Principal not unique */ + case KDC_NULL_KEY: /* 010 Principal has null key */ + case KDC_GEN_ERR: /* 011 Generic error from KDC */ + case INTK_W_NOTALL : /* 061 Not ALL tickets returned */ + case INTK_PROT : /* 063 Protocol Error */ + case INTK_ERR : /* 070 Other error */ + com_err_msg = "Something weird happened... try again, and if Leash" + " continues to fail, contact Network Services as listed in the " + "About box."; + break; + case KDC_PR_UNKNOWN: /* 008 Principal unknown */ + com_err_msg = "You have entered an unknown username/instance/realm" + " combination."; + break; + case GC_TKFIL : /* 021 Can't read ticket file */ + case GC_NOTKT : /* 022 Can't find ticket or TGT */ + com_err_msg = "Something is wrong with the memory where your " + "tickets are stored. Try exiting Windows and restarting your " + "computer."; + break; + case MK_AP_TGTEXP : /* 026 TGT Expired */ + /* no extra error msg */ + break; + case RD_AP_TIME : /* 037 delta_t too big */ + com_err_msg = "Your computer's clock is out of sync with the " + "Kerberos server. Please see the help file about correcting " + "your clock."; + break; + + case RD_AP_UNDEC : /* 031 Can't decode authenticator */ + case RD_AP_EXP : /* 032 Ticket expired */ + case RD_AP_NYV : /* 033 Ticket not yet valid */ + case RD_AP_REPEAT : /* 034 Repeated request */ + case RD_AP_NOT_US : /* 035 The ticket isn't for us */ + case RD_AP_INCON : /* 036 Request is inconsistent */ + case RD_AP_BADD : /* 038 Incorrect net address */ + case RD_AP_VERSION : /* 039 protocol version mismatch */ + case RD_AP_MSG_TYPE : /* 040 invalid msg type */ + case RD_AP_MODIFIED : /* 041 message stream modified */ + case RD_AP_ORDER : /* 042 message out of order */ + case RD_AP_UNAUTHOR : /* 043 unauthorized request */ + /* no extra error msg */ + break; + case GT_PW_NULL: /* 51 Current PW is null */ + case GT_PW_BADPW: /* 52 Incorrect current password */ + case GT_PW_PROT: /* 53 Protocol Error */ + case GT_PW_KDCERR: /* 54 Error returned by KDC */ + case GT_PW_NULLTKT: /* 55 Null tkt returned by KDC */ + /* no error msg yet */ + break; + + /* Values returned by send_to_kdc */ + case SKDC_RETRY : /* 56 Retry count exceeded */ + case SKDC_CANT : /* 57 Can't send request */ + com_err_msg = "Cannot contact the kerberos server for the selected realm."; + break; + /* no error message on purpose: */ + case INTK_BADPW : /* 062 Incorrect password */ + break; + default: + /* no extra error msg */ + break; + } + else + switch(code) + { + case KADM_INSECURE_PW: + /* if( kadm_info != NULL ){ + * wsprintf(buf, "%s\n%s", com_err_msg, kadm_info); + * } else { + * wsprintf(buf, "%s\nPlease see the help file for information " + * "about secure passwords.", com_err_msg); + * } + * com_err_msg = buf; + */ + + /* The above code would be preferred since it allows site specific + * information to be delivered from the Kerberos server. However the + * message box is too small for VGA screens. + * It does work well if we only have to support 1024x768 + */ + + com_err_msg = "You have entered an insecure or weak password."; + + default: + /* no extra error msg */ + break; + } + if(com_err_msg != buf) { + StringCbCopyA(buf, len, com_err_msg); + } + cp = buf + strlen(buf); + *cp++ = '\n'; + switch(table_num) { + case krb_err_base: + etype = "Kerberos"; + break; + case kadm_err_base: + etype = "Kerberos supplemental"; + break; + default: + etype = Lerror_table_name(table_num); + break; + } + StringCbPrintfA((LPSTR) cp, len - (cp-buf), (LPSTR) "(%s error %d" +#ifdef DEBUG_COM_ERR + " (absolute error %ld)" +#endif + ")", etype, offset + //")\nPress F1 for help on this error.", etype, offset +#ifdef DEBUG_COM_ERR + , code +#endif + ); + + return (LPSTR)buf; +} + --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/errorfuncs.h +++ krb5-1.4.4/src/windows/identity/plugins/krb4/errorfuncs.h @@ -1,65 +1,65 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_ERR_H -#define __KHIMAIRA_ERR_H - -/* All error handling and reporting related functions for the krb4/5 - and AFS plugins */ - -#include -#include -/* - * This is a hack needed because the real com_err.h does - * not define err_func. We need it in the case where - * we pull in the real com_err instead of the krb4 - * impostor. - */ -#ifndef _DCNS_MIT_COM_ERR_H -typedef LPSTR (*err_func)(int, long); -#endif - -#include -#include - -#define kadm_err_base ERROR_TABLE_BASE_kadm - -#include - -#ifndef KRBERR -#define KRBERR(code) (code + krb_err_base) -#endif - -LPSTR err_describe(LPSTR buf, size_t len, long code); - - -/* */ -khm_int32 init_error_funcs(); - -khm_int32 exit_error_funcs(); - - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_ERR_H +#define __KHIMAIRA_ERR_H + +/* All error handling and reporting related functions for the krb4/5 + and AFS plugins */ + +#include +#include +/* + * This is a hack needed because the real com_err.h does + * not define err_func. We need it in the case where + * we pull in the real com_err instead of the krb4 + * impostor. + */ +#ifndef _DCNS_MIT_COM_ERR_H +typedef LPSTR (*err_func)(int, long); +#endif + +#include +#include + +#define kadm_err_base ERROR_TABLE_BASE_kadm + +#include + +#ifndef KRBERR +#define KRBERR(code) (code + krb_err_base) +#endif + +LPSTR err_describe(LPSTR buf, size_t len, long code); + + +/* */ +khm_int32 init_error_funcs(); + +khm_int32 exit_error_funcs(); + + +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/krbcred.h +++ krb5-1.4.4/src/windows/identity/plugins/krb4/krbcred.h @@ -1,136 +1,136 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KRBAFSCRED_H -#define __KHIMAIRA_KRBAFSCRED_H - -#include - -#define KHERR_FACILITY L"Kerberos4" -#define KHERR_FACILITY_ID 65 -#define KHERR_HMODULE hResModule - -#include - -#include -#include -#include -#include - -#include -#include - -#define TYPENAME_ENCTYPE L"EncType" -#define TYPENAME_ADDR_LIST L"AddrList" -#define TYPENAME_KRB5_FLAGS L"Krb5Flags" - -#define ATTRNAME_KEY_ENCTYPE L"KeyEncType" -#define ATTRNAME_TKT_ENCTYPE L"TktEncType" -#define ATTRNAME_ADDR_LIST L"AddrList" -#define ATTRNAME_KRB5_FLAGS L"Krb5Flags" -#define ATTRNAME_RENEW_TILL L"RenewTill" -#define ATTRNAME_RENEW_FOR L"RenewFor" - -void init_krb(); -void exit_krb(); -KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module); -KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module); - -/* globals */ -extern kmm_module h_khModule; -extern HMODULE hResModule; -extern HINSTANCE hInstance; - -extern khm_int32 type_id_enctype; -extern khm_int32 type_id_addr_list; -extern khm_int32 type_id_krb5_flags; - -extern khm_int32 attr_id_key_enctype; -extern khm_int32 attr_id_tkt_enctype; -extern khm_int32 attr_id_addr_list; -extern khm_int32 attr_id_krb5_flags; -extern khm_int32 attr_id_renew_till; -extern khm_int32 attr_id_renew_for; - -/* Configuration spaces */ -#define CSNAME_KRB4CRED L"Krb4Cred" -#define CSNAME_PARAMS L"Parameters" - -/* plugin constants */ -#define KRB4_PLUGIN_NAME L"Krb4Cred" - -#define KRB4_PLUGIN_DEPS L"Krb5Cred\0" - -#define KRB4_CREDTYPE_NAME L"Krb4Cred" - -#define KRB5_CREDTYPE_NAME L"Krb5Cred" - -#define KRB4_CONFIG_NODE_NAME L"Krb4Config" - -#define KRB4_ID_CONFIG_NODE_NAME L"Krb4IdentConfig" -#define KRB4_IDS_CONFIG_NODE_NAME L"Krb4IdentsConfig" - -extern khm_handle csp_plugins; -extern khm_handle csp_krbcred; -extern khm_handle csp_params; - -extern kconf_schema schema_krbconfig[]; - -/* other globals */ -extern khm_int32 credtype_id_krb4; -extern khm_int32 credtype_id_krb5; - -extern khm_boolean krb4_initialized; - -extern khm_handle krb4_credset; - -/* plugin callbacks */ -khm_int32 KHMAPI -krb4_cb(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam); - -INT_PTR CALLBACK -krb4_confg_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -krb4_ids_config_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -krb4_id_config_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -khm_int32 -krb4_msg_newcred(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam); -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KRBAFSCRED_H +#define __KHIMAIRA_KRBAFSCRED_H + +#include + +#define KHERR_FACILITY L"Kerberos4" +#define KHERR_FACILITY_ID 65 +#define KHERR_HMODULE hResModule + +#include + +#include +#include +#include +#include + +#include +#include + +#define TYPENAME_ENCTYPE L"EncType" +#define TYPENAME_ADDR_LIST L"AddrList" +#define TYPENAME_KRB5_FLAGS L"Krb5Flags" + +#define ATTRNAME_KEY_ENCTYPE L"KeyEncType" +#define ATTRNAME_TKT_ENCTYPE L"TktEncType" +#define ATTRNAME_ADDR_LIST L"AddrList" +#define ATTRNAME_KRB5_FLAGS L"Krb5Flags" +#define ATTRNAME_RENEW_TILL L"RenewTill" +#define ATTRNAME_RENEW_FOR L"RenewFor" + +void init_krb(); +void exit_krb(); +KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module); +KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module); + +/* globals */ +extern kmm_module h_khModule; +extern HMODULE hResModule; +extern HINSTANCE hInstance; + +extern khm_int32 type_id_enctype; +extern khm_int32 type_id_addr_list; +extern khm_int32 type_id_krb5_flags; + +extern khm_int32 attr_id_key_enctype; +extern khm_int32 attr_id_tkt_enctype; +extern khm_int32 attr_id_addr_list; +extern khm_int32 attr_id_krb5_flags; +extern khm_int32 attr_id_renew_till; +extern khm_int32 attr_id_renew_for; + +/* Configuration spaces */ +#define CSNAME_KRB4CRED L"Krb4Cred" +#define CSNAME_PARAMS L"Parameters" + +/* plugin constants */ +#define KRB4_PLUGIN_NAME L"Krb4Cred" + +#define KRB4_PLUGIN_DEPS L"Krb5Cred\0" + +#define KRB4_CREDTYPE_NAME L"Krb4Cred" + +#define KRB5_CREDTYPE_NAME L"Krb5Cred" + +#define KRB4_CONFIG_NODE_NAME L"Krb4Config" + +#define KRB4_ID_CONFIG_NODE_NAME L"Krb4IdentConfig" +#define KRB4_IDS_CONFIG_NODE_NAME L"Krb4IdentsConfig" + +extern khm_handle csp_plugins; +extern khm_handle csp_krbcred; +extern khm_handle csp_params; + +extern kconf_schema schema_krbconfig[]; + +/* other globals */ +extern khm_int32 credtype_id_krb4; +extern khm_int32 credtype_id_krb5; + +extern khm_boolean krb4_initialized; + +extern khm_handle krb4_credset; + +/* plugin callbacks */ +khm_int32 KHMAPI +krb4_cb(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam); + +INT_PTR CALLBACK +krb4_confg_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +krb4_ids_config_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +krb4_id_config_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +khm_int32 +krb4_msg_newcred(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam); +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/krb4funcs.c +++ krb5-1.4.4/src/windows/identity/plugins/krb4/krb4funcs.c @@ -1,874 +1,874 @@ -/* -* Copyright (c) 2005 Massachusetts Institute of Technology -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, -* modify, merge, publish, distribute, sublicense, and/or sell copies -* of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -/* $Id$ */ - -/* Originally this was krb5routines.c in Leash sources. Subsequently -modified and adapted for NetIDMgr */ - -#include -#include - -#define SECURITY_WIN32 -#include -#include - -#include -#include -#include -#include - - - -int com_addr(void) -{ - long ipAddr; - char loc_addr[ADDR_SZ]; - CREDENTIALS cred; - char service[40]; - char instance[40]; - // char addr[40]; - char realm[40]; - struct in_addr LocAddr; - int k_errno; - - if (pkrb_get_cred == NULL) - return(KSUCCESS); - - k_errno = (*pkrb_get_cred)(service,instance,realm,&cred); - if (k_errno) - return KRBERR(k_errno); - - while(1) { - ipAddr = (*pLocalHostAddr)(); - LocAddr.s_addr = ipAddr; - StringCbCopyA(loc_addr, sizeof(loc_addr), inet_ntoa(LocAddr)); - if ( strcmp(cred.address,loc_addr) != 0) { - /* TODO: do something about this */ - //Leash_kdestroy (); - break; - } - break; - } // while() - return 0; -} - - -long -khm_krb4_list_tickets(void) -{ - char ptktname[MAX_PATH + 5]; - char pname[ANAME_SZ]; - char pinst[INST_SZ]; - char prealm[REALM_SZ]; - wchar_t wbuf[256]; - int k_errno = 0; - CREDENTIALS c; - int newtickets = 0; - int open = 0; - khm_handle ident = NULL; - khm_handle cred = NULL; - time_t tt; - FILETIME ft; - - kcdb_credset_flush(krb4_credset); - - // Since krb_get_tf_realm will return a ticket_file error, - // we will call tf_init and tf_close first to filter out - // things like no ticket file. Otherwise, the error that - // the user would see would be - // klist: can't find realm of ticket file: No ticket file (tf_util) - // instead of klist: No ticket file (tf_util) - if (ptf_init == NULL) - goto collect; - - com_addr(); - - // Open ticket file - if ((k_errno = (*ptf_init)((*ptkt_string)(), R_TKT_FIL))) - { - goto cleanup; - } - // Close ticket file - (void) (*ptf_close)(); - - // We must find the realm of the ticket file here before calling - // tf_init because since the realm of the ticket file is not - // really stored in the principal section of the file, the - // routine we use must itself call tf_init and tf_close. - - if ((k_errno = (*pkrb_get_tf_realm)((*ptkt_string)(), prealm)) != KSUCCESS) - { - goto cleanup; - } - - // Open ticket file - if (k_errno = (*ptf_init)((*ptkt_string)(), R_TKT_FIL)) - { - goto cleanup; - } - - StringCchCopyA(ptktname, ARRAYLENGTH(ptktname), (*ptkt_string)()); - - open = 1; - - // Get principal name and instance - if ((k_errno = (*ptf_get_pname)(pname)) || (k_errno = (*ptf_get_pinst)(pinst))) - { - goto cleanup; - } - - // You may think that this is the obvious place to get the - // realm of the ticket file, but it can't be done here as the - // routine to do this must open the ticket file. This is why - // it was done before tf_init. - StringCbPrintf(wbuf, sizeof(wbuf), L"%S%S%S%S%S", (LPSTR)pname, - (LPSTR)(pinst[0] ? "." : ""), (LPSTR)pinst, - (LPSTR)(prealm[0] ? "@" : ""), (LPSTR)prealm); - - if(KHM_FAILED(kcdb_identity_create(wbuf, KCDB_IDENT_FLAG_CREATE, &ident))) - { - goto cleanup; - } - - // Get KRB4 tickets - while ((k_errno = (*ptf_get_cred)(&c)) == KSUCCESS) - { - StringCbPrintf(wbuf, sizeof(wbuf), L"%S%S%S%S%S", - c.service, - (c.instance[0] ? "." : ""), - c.instance, - (c.realm[0] ? "@" : ""), - c.realm); - - if(KHM_FAILED(kcdb_cred_create(wbuf, ident, credtype_id_krb4, &cred))) - continue; - - tt = c.issue_date + c.lifetime * 5L * 60L; - TimetToFileTime(tt, &ft); - kcdb_cred_set_attr(cred, KCDB_ATTR_EXPIRE, &ft, sizeof(ft)); - - tt = c.issue_date; - TimetToFileTime(tt, &ft); - kcdb_cred_set_attr(cred, KCDB_ATTR_ISSUE, &ft, sizeof(ft)); - - tt = c.lifetime * 5L * 60L; - TimetToFileTimeInterval(tt, &ft); - kcdb_cred_set_attr(cred, KCDB_ATTR_LIFETIME, &ft, sizeof(ft)); - - AnsiStrToUnicode(wbuf, sizeof(wbuf), ptktname); - kcdb_cred_set_attr(cred, KCDB_ATTR_LOCATION, wbuf, KCDB_CBSIZE_AUTO); - - kcdb_credset_add_cred(krb4_credset, cred, -1); - - kcdb_cred_release(cred); - } // while - - cleanup: - if (ptf_close == NULL) - return(KSUCCESS); - - if (open) - (*ptf_close)(); //close ticket file - - if (k_errno == EOF) - k_errno = 0; - - // XXX the if statement directly below was inserted to eliminate - // an error NO_TKT_FIL on Leash startup. The error occurs from an - // error number thrown from krb_get_tf_realm. We believe this - // change does not eliminate other errors, but it may. - - if (k_errno == NO_TKT_FIL) - k_errno = 0; - - if(ident) - kcdb_identity_release(ident); - -#if 0 - /*TODO: Handle errors here */ - if (k_errno) - { - CHAR message[256]; - CHAR errBuf[256]; - LPCSTR errText; - - if (!Lerror_message) - return -1; - - errText = err_describe(errBuf, KRBERR(k_errno)); - - sprintf(message, "%s\n\n%s failed", errText, functionName); - MessageBox(NULL, message, "Kerberos Four", - MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND); - } -#endif - - collect: - kcdb_credset_collect(NULL, krb4_credset, ident, credtype_id_krb4, NULL); - - return k_errno; -} - -#define KRB_FILE "KRB.CON" -#define KRBREALM_FILE "KRBREALM.CON" -#define KRB5_FILE "KRB5.INI" - -BOOL -khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) -{ - char **configFile = NULL; - if (pkrb5_get_default_config_files(&configFile)) - { - GetWindowsDirectoryA(confname,szConfname); - confname[szConfname-1] = '\0'; - - StringCchCatA(confname, szConfname, "\\"); - StringCchCatA(confname, szConfname, KRB5_FILE); - - return FALSE; - } - - *confname = 0; - - if (configFile) - { - StringCchCopyA(confname, szConfname, *configFile); - pkrb5_free_config_files(configFile); - } - - if (!*confname) - { - GetWindowsDirectoryA(confname,szConfname); - confname[szConfname-1] = '\0'; - - StringCchCatA(confname, szConfname, "\\"); - StringCchCatA(confname, szConfname, KRB5_FILE); - } - - return FALSE; -} - -BOOL -khm_get_krb4_con_file(LPSTR confname, UINT szConfname) -{ - if (hKrb5 && !hKrb4) { - // hold krb.con where krb5.ini is located - CHAR krbConFile[MAX_PATH]=""; - LPSTR pFind; - - if (khm_krb5_get_profile_file(krbConFile, sizeof(krbConFile))) { - GetWindowsDirectoryA(krbConFile,sizeof(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - - StringCbCatA(krbConFile, sizeof(krbConFile), "\\"); - } - - pFind = strrchr(krbConFile, '\\'); - - if (pFind) { - *pFind = '\0'; - - StringCbCatA(krbConFile, sizeof(krbConFile), "\\"); - StringCbCatA(krbConFile, sizeof(krbConFile), KRB_FILE); - } else { - krbConFile[0] = '\0'; - } - - StringCchCopyA(confname, szConfname, krbConFile); - } else if (hKrb4) { - unsigned int size = szConfname; - memset(confname, '\0', szConfname); - if (!pkrb_get_krbconf2(confname, &size)) { - GetWindowsDirectoryA(confname,szConfname); - confname[szConfname-1] = '\0'; - StringCchCatA(confname, szConfname, "\\"); - StringCchCatA(confname, szConfname, KRB_FILE); - } - } - - return FALSE; -} - -int -readstring(FILE * file, char * buf, int len) -{ - int c,i; - memset(buf, '\0', sizeof(buf)); - for (i=0, c=fgetc(file); c != EOF ; c=fgetc(file), i++) - { - if (i < sizeof(buf)) { - if (c == '\n') { - buf[i] = '\0'; - return i; - } else { - buf[i] = c; - } - } else { - if (c == '\n') { - buf[len-1] = '\0'; - return(i); - } - } - } - if (c == EOF) { - if (i > 0 && i < len) { - buf[i] = '\0'; - return(i); - } else { - buf[len-1] = '\0'; - return(-1); - } - } - return(-1); -} - -/*! \internal - \brief Return a list of configured realms - - The string that is returned is a set of null terminated unicode strings, - each of which denotes one realm. The set is terminated by a zero length - null terminated string. - - The caller should free the returned string using free() - - \return The string with the list of realms or NULL if the operation fails. -*/ -wchar_t * khm_krb5_get_realm_list(void) -{ - wchar_t * rlist = NULL; - - if (pprofile_get_subsection_names && pprofile_free_list) { - const char* rootSection[] = {"realms", NULL}; - const char** rootsec = rootSection; - char **sections = NULL, **cpp = NULL, *value = NULL; - - char krb5_conf[MAX_PATH+1]; - - if (!khm_krb5_get_profile_file(krb5_conf,sizeof(krb5_conf))) { - profile_t profile; - long retval; - const char *filenames[2]; - wchar_t * d; - size_t cbsize; - size_t t; - - filenames[0] = krb5_conf; - filenames[1] = NULL; - retval = pprofile_init(filenames, &profile); - if (!retval) { - retval = pprofile_get_subsection_names(profile, rootsec, §ions); - - if (!retval) - { - /* first figure out how much space to allocate */ - cbsize = 0; - for (cpp = sections; *cpp; cpp++) - { - cbsize += sizeof(wchar_t) * (strlen(*cpp) + 1); - } - cbsize += sizeof(wchar_t); /* double null terminated */ - - rlist = PMALLOC(cbsize); - d = rlist; - for (cpp = sections; *cpp; cpp++) - { - AnsiStrToUnicode(d, cbsize, *cpp); - t = wcslen(d) + 1; - d += t; - cbsize -= sizeof(wchar_t) * t; - } - *d = L'\0'; - } - - pprofile_free_list(sections); - -#if 0 - retval = pprofile_get_string(profile, "libdefaults","noaddresses", 0, "true", &value); - if ( value ) { - disable_noaddresses = config_boolean_to_int(value); - pprofile_release_string(value); - } -#endif - pprofile_release(profile); - } - } - } else { - FILE * file; - char krb_conf[MAX_PATH+1]; - char * p; - size_t cbsize, t; - wchar_t * d; - - if (!khm_get_krb4_con_file(krb_conf,sizeof(krb_conf)) && -#if _MSC_VER >= 1400 - !fopen_s(&file, krb_conf, "rt") -#else - (file = fopen(krb_conf, "rt")) -#endif - ) - { - char lineBuf[256]; - - /*TODO: compute the actual required buffer size instead of hardcoding */ - cbsize = 16384; // arbitrary - rlist = PMALLOC(cbsize); - d = rlist; - - // Skip the default realm - readstring(file,lineBuf,sizeof(lineBuf)); - - // Read the defined realms - while (TRUE) - { - if (readstring(file,lineBuf,sizeof(lineBuf)) < 0) - break; - - if (*(lineBuf + strlen(lineBuf) - 1) == '\r') - *(lineBuf + strlen(lineBuf) - 1) = 0; - - for (p=lineBuf; *p ; p++) - { - if (isspace(*p)) { - *p = 0; - break; - } - } - - if ( strncmp(".KERBEROS.OPTION.",lineBuf,17) ) { - t = strlen(lineBuf) + 1; - if(cbsize > (1 + t*sizeof(wchar_t))) { - AnsiStrToUnicode(d, cbsize, lineBuf); - d += t; - cbsize -= t * sizeof(wchar_t); - } else - break; - } - } - - *d = L'\0'; - - fclose(file); - } - } - - return rlist; -} - -/*! \internal - \brief Get the default realm - - A string will be returned that specifies the default realm. The caller - should free the string using free(). - - Returns NULL if the operation fails. -*/ -wchar_t * khm_krb5_get_default_realm(void) -{ - wchar_t * realm; - size_t cch; - krb5_context ctx=0; - char * def = 0; - - pkrb5_init_context(&ctx); - pkrb5_get_default_realm(ctx,&def); - - if (def) { - cch = strlen(def) + 1; - realm = PMALLOC(sizeof(wchar_t) * cch); - AnsiStrToUnicode(realm, sizeof(wchar_t) * cch, def); - pkrb5_free_default_realm(ctx, def); - } else - realm = NULL; - - pkrb5_free_context(ctx); - - return realm; -} - -static -char * -make_postfix(const char * base, - const char * postfix, - char ** rcopy) -{ - size_t base_size; - size_t ret_size; - char * copy = 0; - char * ret = 0; - size_t t; - - if (FAILED(StringCbLengthA(base, STRSAFE_MAX_CCH * sizeof(char), &t))) - goto cleanup; - - base_size = t + 1; - - if (FAILED(StringCbLengthA(postfix, STRSAFE_MAX_CCH * sizeof(char), &t))) - goto cleanup; - - ret_size = base_size + t + 1; - - copy = malloc(base_size); - ret = malloc(ret_size); - - if (!copy || !ret) - goto cleanup; - - StringCbCopyNA(copy, base_size, base, base_size); - StringCbCopyNA(ret, ret_size, base, base_size); - StringCbCopyNA(ret + (base_size - 1), ret_size - (base_size - 1), - postfix, ret_size - (base_size - 1)); - - cleanup: - if (!copy || !ret) { - if (copy) - free(copy); - if (ret) - free(ret); - copy = ret = 0; - } - // INVARIANT: (ret ==> copy) && (copy ==> ret) - *rcopy = copy; - return ret; -} - - -static -long -make_temp_cache_v4(const char * postfix) -{ - static char * old_cache = 0; - - if (!pkrb_set_tkt_string || !ptkt_string || !pdest_tkt) - return 0; // XXX - is this appropriate? - - if (old_cache) { - pdest_tkt(); - pkrb_set_tkt_string(old_cache); - free(old_cache); - old_cache = 0; - } - - if (postfix) - { - char * tmp_cache = make_postfix(ptkt_string(), postfix, &old_cache); - - if (!tmp_cache) - return KFAILURE; - - pkrb_set_tkt_string(tmp_cache); - free(tmp_cache); - } - return 0; -} - -long -khm_krb4_changepwd(char * principal, - char * password, - char * newpassword, - char** error_str) -{ - long k_errno; - - if (!pkrb_set_tkt_string || !ptkt_string || !pkadm_change_your_password || - !pdest_tkt) - return KFAILURE; - - k_errno = make_temp_cache_v4("_chgpwd"); - if (k_errno) return k_errno; - k_errno = pkadm_change_your_password(principal, password, newpassword, - error_str); - make_temp_cache_v4(0); - return k_errno; -} - -struct tgt_filter_data { - khm_handle identity; - wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; -}; - -khm_int32 KHMAPI -krb4_tgt_filter(khm_handle cred, khm_int32 flags, void * rock) { - struct tgt_filter_data * pdata; - wchar_t credname[KCDB_MAXCCH_NAME]; - wchar_t * t; - khm_size cb; - khm_int32 ctype; - - pdata = (struct tgt_filter_data *) rock; - cb = sizeof(credname); - - if (KHM_FAILED(kcdb_cred_get_type(cred, &ctype)) || - ctype != credtype_id_krb4) - return 0; - - if (KHM_FAILED(kcdb_cred_get_name(cred, credname, &cb))) - return 0; - - if (wcsncmp(credname, L"krbtgt.", 7)) - return 0; - - t = wcsrchr(credname, L'@'); - if (t == NULL) - return 0; - - if (wcscmp(t+1, pdata->realm)) - return 0; - - return 1; -} - -khm_handle -khm_krb4_find_tgt(khm_handle credset, khm_handle identity) { - khm_handle result = NULL; - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t * t; - khm_size cb; - struct tgt_filter_data filter_data; - - cb = sizeof(idname); - - if (KHM_FAILED(kcdb_identity_get_name(identity, - idname, - &cb))) - return NULL; - - t = wcsrchr(idname, L'@'); - if (t == NULL) - return NULL; - - StringCbCopy(filter_data.realm, sizeof(filter_data.realm), - t + 1); - filter_data.identity = identity; - - if (KHM_FAILED(kcdb_credset_find_filtered(credset, - -1, - krb4_tgt_filter, - &filter_data, - &result, - NULL))) - return NULL; - else - return result; -} - -long -khm_convert524(khm_handle identity) -{ -#ifdef NO_KRB5 - return(0); -#else - krb5_context ctx = 0; - krb5_error_code code = 0; - int icode = 0; - krb5_principal me = 0; - krb5_principal server = 0; - krb5_creds *v5creds = 0; - krb5_creds increds; - krb5_ccache cc = 0; - CREDENTIALS * v4creds = NULL; - static int init_ets = 1; - - if (!pkrb5_init_context || - !pkrb_in_tkt || - !pkrb524_init_ets || - !pkrb524_convert_creds_kdc) - return 0; - - v4creds = (CREDENTIALS *) malloc(sizeof(CREDENTIALS)); - memset((char *) v4creds, 0, sizeof(CREDENTIALS)); - - memset((char *) &increds, 0, sizeof(increds)); - /* - From this point on, we can goto cleanup because increds is - initialized. - */ - - code = khm_krb5_initialize(identity, &ctx, &cc); - if (code) - goto cleanup; - - if ( init_ets ) { - pkrb524_init_ets(ctx); - init_ets = 0; - } - - if (code = pkrb5_cc_get_principal(ctx, cc, &me)) - goto cleanup; - - if ((code = pkrb5_build_principal(ctx, - &server, - krb5_princ_realm(ctx, me)->length, - krb5_princ_realm(ctx, me)->data, - "krbtgt", - krb5_princ_realm(ctx, me)->data, - NULL))) { - goto cleanup; - } - - increds.client = me; - increds.server = server; - increds.times.endtime = 0; - increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC; - if ((code = pkrb5_get_credentials(ctx, 0, - cc, - &increds, - &v5creds))) { - goto cleanup; - } - - if ((icode = pkrb524_convert_creds_kdc(ctx, - v5creds, - v4creds))) { - goto cleanup; - } - - /* initialize ticket cache */ - if ((icode = pkrb_in_tkt(v4creds->pname, v4creds->pinst, v4creds->realm) - != KSUCCESS)) { - goto cleanup; - } - - /* stash ticket, session key, etc. for future use */ - if ((icode = pkrb_save_credentials(v4creds->service, - v4creds->instance, - v4creds->realm, - v4creds->session, - v4creds->lifetime, - v4creds->kvno, - &(v4creds->ticket_st), - v4creds->issue_date))) { - goto cleanup; - } - - cleanup: - memset(v4creds, 0, sizeof(v4creds)); - free(v4creds); - - if (v5creds) { - pkrb5_free_creds(ctx, v5creds); - } - if (increds.client == me) - me = 0; - if (increds.server == server) - server = 0; - - if (ctx) - pkrb5_free_cred_contents(ctx, &increds); - - if (server) { - pkrb5_free_principal(ctx, server); - } - - if (me) { - pkrb5_free_principal(ctx, me); - } - - if (ctx && cc) - pkrb5_cc_close(ctx, cc); - - if (ctx) { - pkrb5_free_context(ctx); - } - - return (code || icode); -#endif /* NO_KRB5 */ -} - -long -khm_krb4_kinit(char * aname, - char * inst, - char * realm, - long lifetime, - char * password) { - - wchar_t * functionName = NULL; - wchar_t * err_context = NULL; - int rc4 = 0; - int msg = 0; - - if (pkname_parse == NULL) { - goto cleanup; - } - - err_context = L"getting realm"; - if (!*realm && (rc4 = (int)(*pkrb_get_lrealm)(realm, 1))) { - functionName = L"krb_get_lrealm()"; - msg = IDS_ERR_REALM; - goto cleanup; - } - - err_context = L"checking principal"; - if ((!*aname) || (!(rc4 = (int)(*pk_isname)(aname)))) { - functionName = L"krb_get_lrealm()"; - msg = IDS_ERR_PRINCIPAL; - goto cleanup; - } - - /* optional instance */ - if (!(rc4 = (int)(*pk_isinst)(inst))) { - functionName = L"k_isinst()"; - msg = IDS_ERR_INVINST; - goto cleanup; - } - - if (!(rc4 = (int)(*pk_isrealm)(realm))) { - functionName = L"k_isrealm()"; - msg = IDS_ERR_REALM; - goto cleanup; - } - - err_context = L"fetching ticket"; - rc4 = (*pkrb_get_pw_in_tkt)(aname, inst, realm, "krbtgt", realm, - lifetime, password); - - if (rc4) /* XXX: do we want: && (rc != NO_TKT_FIL) as well? */ { - functionName = L"krb_get_pw_in_tkt()"; - msg = IDS_ERR_PWINTKT; - goto cleanup; - } - - return 0; - - cleanup: - { - _report_sr0(KHERR_ERROR, msg); - _location(functionName); - } - return rc4; -} - - -int khm_krb4_kdestroy(void) { - int k_errno = 0; - - if (pdest_tkt != NULL) - { - k_errno = (*pdest_tkt)(); - if (k_errno && (k_errno != RET_TKFIL)) - return KRBERR(k_errno); - } - - return k_errno; -} +/* +* Copyright (c) 2005 Massachusetts Institute of Technology +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, +* modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/* $Id$ */ + +/* Originally this was krb5routines.c in Leash sources. Subsequently +modified and adapted for NetIDMgr */ + +#include +#include + +#define SECURITY_WIN32 +#include +#include + +#include +#include +#include +#include + + + +int com_addr(void) +{ + long ipAddr; + char loc_addr[ADDR_SZ]; + CREDENTIALS cred; + char service[40]; + char instance[40]; + // char addr[40]; + char realm[40]; + struct in_addr LocAddr; + int k_errno; + + if (pkrb_get_cred == NULL) + return(KSUCCESS); + + k_errno = (*pkrb_get_cred)(service,instance,realm,&cred); + if (k_errno) + return KRBERR(k_errno); + + while(1) { + ipAddr = (*pLocalHostAddr)(); + LocAddr.s_addr = ipAddr; + StringCbCopyA(loc_addr, sizeof(loc_addr), inet_ntoa(LocAddr)); + if ( strcmp(cred.address,loc_addr) != 0) { + /* TODO: do something about this */ + //Leash_kdestroy (); + break; + } + break; + } // while() + return 0; +} + + +long +khm_krb4_list_tickets(void) +{ + char ptktname[MAX_PATH + 5]; + char pname[ANAME_SZ]; + char pinst[INST_SZ]; + char prealm[REALM_SZ]; + wchar_t wbuf[256]; + int k_errno = 0; + CREDENTIALS c; + int newtickets = 0; + int open = 0; + khm_handle ident = NULL; + khm_handle cred = NULL; + time_t tt; + FILETIME ft; + + kcdb_credset_flush(krb4_credset); + + // Since krb_get_tf_realm will return a ticket_file error, + // we will call tf_init and tf_close first to filter out + // things like no ticket file. Otherwise, the error that + // the user would see would be + // klist: can't find realm of ticket file: No ticket file (tf_util) + // instead of klist: No ticket file (tf_util) + if (ptf_init == NULL) + goto collect; + + com_addr(); + + // Open ticket file + if ((k_errno = (*ptf_init)((*ptkt_string)(), R_TKT_FIL))) + { + goto cleanup; + } + // Close ticket file + (void) (*ptf_close)(); + + // We must find the realm of the ticket file here before calling + // tf_init because since the realm of the ticket file is not + // really stored in the principal section of the file, the + // routine we use must itself call tf_init and tf_close. + + if ((k_errno = (*pkrb_get_tf_realm)((*ptkt_string)(), prealm)) != KSUCCESS) + { + goto cleanup; + } + + // Open ticket file + if (k_errno = (*ptf_init)((*ptkt_string)(), R_TKT_FIL)) + { + goto cleanup; + } + + StringCchCopyA(ptktname, ARRAYLENGTH(ptktname), (*ptkt_string)()); + + open = 1; + + // Get principal name and instance + if ((k_errno = (*ptf_get_pname)(pname)) || (k_errno = (*ptf_get_pinst)(pinst))) + { + goto cleanup; + } + + // You may think that this is the obvious place to get the + // realm of the ticket file, but it can't be done here as the + // routine to do this must open the ticket file. This is why + // it was done before tf_init. + StringCbPrintf(wbuf, sizeof(wbuf), L"%S%S%S%S%S", (LPSTR)pname, + (LPSTR)(pinst[0] ? "." : ""), (LPSTR)pinst, + (LPSTR)(prealm[0] ? "@" : ""), (LPSTR)prealm); + + if(KHM_FAILED(kcdb_identity_create(wbuf, KCDB_IDENT_FLAG_CREATE, &ident))) + { + goto cleanup; + } + + // Get KRB4 tickets + while ((k_errno = (*ptf_get_cred)(&c)) == KSUCCESS) + { + StringCbPrintf(wbuf, sizeof(wbuf), L"%S%S%S%S%S", + c.service, + (c.instance[0] ? "." : ""), + c.instance, + (c.realm[0] ? "@" : ""), + c.realm); + + if(KHM_FAILED(kcdb_cred_create(wbuf, ident, credtype_id_krb4, &cred))) + continue; + + tt = c.issue_date + c.lifetime * 5L * 60L; + TimetToFileTime(tt, &ft); + kcdb_cred_set_attr(cred, KCDB_ATTR_EXPIRE, &ft, sizeof(ft)); + + tt = c.issue_date; + TimetToFileTime(tt, &ft); + kcdb_cred_set_attr(cred, KCDB_ATTR_ISSUE, &ft, sizeof(ft)); + + tt = c.lifetime * 5L * 60L; + TimetToFileTimeInterval(tt, &ft); + kcdb_cred_set_attr(cred, KCDB_ATTR_LIFETIME, &ft, sizeof(ft)); + + AnsiStrToUnicode(wbuf, sizeof(wbuf), ptktname); + kcdb_cred_set_attr(cred, KCDB_ATTR_LOCATION, wbuf, KCDB_CBSIZE_AUTO); + + kcdb_credset_add_cred(krb4_credset, cred, -1); + + kcdb_cred_release(cred); + } // while + + cleanup: + if (ptf_close == NULL) + return(KSUCCESS); + + if (open) + (*ptf_close)(); //close ticket file + + if (k_errno == EOF) + k_errno = 0; + + // XXX the if statement directly below was inserted to eliminate + // an error NO_TKT_FIL on Leash startup. The error occurs from an + // error number thrown from krb_get_tf_realm. We believe this + // change does not eliminate other errors, but it may. + + if (k_errno == NO_TKT_FIL) + k_errno = 0; + + if(ident) + kcdb_identity_release(ident); + +#if 0 + /*TODO: Handle errors here */ + if (k_errno) + { + CHAR message[256]; + CHAR errBuf[256]; + LPCSTR errText; + + if (!Lerror_message) + return -1; + + errText = err_describe(errBuf, KRBERR(k_errno)); + + sprintf(message, "%s\n\n%s failed", errText, functionName); + MessageBox(NULL, message, "Kerberos Four", + MB_OK | MB_ICONERROR | MB_TASKMODAL | MB_SETFOREGROUND); + } +#endif + + collect: + kcdb_credset_collect(NULL, krb4_credset, ident, credtype_id_krb4, NULL); + + return k_errno; +} + +#define KRB_FILE "KRB.CON" +#define KRBREALM_FILE "KRBREALM.CON" +#define KRB5_FILE "KRB5.INI" + +BOOL +khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) +{ + char **configFile = NULL; + if (pkrb5_get_default_config_files(&configFile)) + { + GetWindowsDirectoryA(confname,szConfname); + confname[szConfname-1] = '\0'; + + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); + + return FALSE; + } + + *confname = 0; + + if (configFile) + { + StringCchCopyA(confname, szConfname, *configFile); + pkrb5_free_config_files(configFile); + } + + if (!*confname) + { + GetWindowsDirectoryA(confname,szConfname); + confname[szConfname-1] = '\0'; + + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); + } + + return FALSE; +} + +BOOL +khm_get_krb4_con_file(LPSTR confname, UINT szConfname) +{ + if (hKrb5 && !hKrb4) { + // hold krb.con where krb5.ini is located + CHAR krbConFile[MAX_PATH]=""; + LPSTR pFind; + + if (khm_krb5_get_profile_file(krbConFile, sizeof(krbConFile))) { + GetWindowsDirectoryA(krbConFile,sizeof(krbConFile)); + krbConFile[MAX_PATH-1] = '\0'; + + StringCbCatA(krbConFile, sizeof(krbConFile), "\\"); + } + + pFind = strrchr(krbConFile, '\\'); + + if (pFind) { + *pFind = '\0'; + + StringCbCatA(krbConFile, sizeof(krbConFile), "\\"); + StringCbCatA(krbConFile, sizeof(krbConFile), KRB_FILE); + } else { + krbConFile[0] = '\0'; + } + + StringCchCopyA(confname, szConfname, krbConFile); + } else if (hKrb4) { + unsigned int size = szConfname; + memset(confname, '\0', szConfname); + if (!pkrb_get_krbconf2(confname, &size)) { + GetWindowsDirectoryA(confname,szConfname); + confname[szConfname-1] = '\0'; + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB_FILE); + } + } + + return FALSE; +} + +int +readstring(FILE * file, char * buf, int len) +{ + int c,i; + memset(buf, '\0', sizeof(buf)); + for (i=0, c=fgetc(file); c != EOF ; c=fgetc(file), i++) + { + if (i < sizeof(buf)) { + if (c == '\n') { + buf[i] = '\0'; + return i; + } else { + buf[i] = c; + } + } else { + if (c == '\n') { + buf[len-1] = '\0'; + return(i); + } + } + } + if (c == EOF) { + if (i > 0 && i < len) { + buf[i] = '\0'; + return(i); + } else { + buf[len-1] = '\0'; + return(-1); + } + } + return(-1); +} + +/*! \internal + \brief Return a list of configured realms + + The string that is returned is a set of null terminated unicode strings, + each of which denotes one realm. The set is terminated by a zero length + null terminated string. + + The caller should free the returned string using free() + + \return The string with the list of realms or NULL if the operation fails. +*/ +wchar_t * khm_krb5_get_realm_list(void) +{ + wchar_t * rlist = NULL; + + if (pprofile_get_subsection_names && pprofile_free_list) { + const char* rootSection[] = {"realms", NULL}; + const char** rootsec = rootSection; + char **sections = NULL, **cpp = NULL, *value = NULL; + + char krb5_conf[MAX_PATH+1]; + + if (!khm_krb5_get_profile_file(krb5_conf,sizeof(krb5_conf))) { + profile_t profile; + long retval; + const char *filenames[2]; + wchar_t * d; + size_t cbsize; + size_t t; + + filenames[0] = krb5_conf; + filenames[1] = NULL; + retval = pprofile_init(filenames, &profile); + if (!retval) { + retval = pprofile_get_subsection_names(profile, rootsec, §ions); + + if (!retval) + { + /* first figure out how much space to allocate */ + cbsize = 0; + for (cpp = sections; *cpp; cpp++) + { + cbsize += sizeof(wchar_t) * (strlen(*cpp) + 1); + } + cbsize += sizeof(wchar_t); /* double null terminated */ + + rlist = PMALLOC(cbsize); + d = rlist; + for (cpp = sections; *cpp; cpp++) + { + AnsiStrToUnicode(d, cbsize, *cpp); + t = wcslen(d) + 1; + d += t; + cbsize -= sizeof(wchar_t) * t; + } + *d = L'\0'; + } + + pprofile_free_list(sections); + +#if 0 + retval = pprofile_get_string(profile, "libdefaults","noaddresses", 0, "true", &value); + if ( value ) { + disable_noaddresses = config_boolean_to_int(value); + pprofile_release_string(value); + } +#endif + pprofile_release(profile); + } + } + } else { + FILE * file; + char krb_conf[MAX_PATH+1]; + char * p; + size_t cbsize, t; + wchar_t * d; + + if (!khm_get_krb4_con_file(krb_conf,sizeof(krb_conf)) && +#if _MSC_VER >= 1400 + !fopen_s(&file, krb_conf, "rt") +#else + (file = fopen(krb_conf, "rt")) +#endif + ) + { + char lineBuf[256]; + + /*TODO: compute the actual required buffer size instead of hardcoding */ + cbsize = 16384; // arbitrary + rlist = PMALLOC(cbsize); + d = rlist; + + // Skip the default realm + readstring(file,lineBuf,sizeof(lineBuf)); + + // Read the defined realms + while (TRUE) + { + if (readstring(file,lineBuf,sizeof(lineBuf)) < 0) + break; + + if (*(lineBuf + strlen(lineBuf) - 1) == '\r') + *(lineBuf + strlen(lineBuf) - 1) = 0; + + for (p=lineBuf; *p ; p++) + { + if (isspace(*p)) { + *p = 0; + break; + } + } + + if ( strncmp(".KERBEROS.OPTION.",lineBuf,17) ) { + t = strlen(lineBuf) + 1; + if(cbsize > (1 + t*sizeof(wchar_t))) { + AnsiStrToUnicode(d, cbsize, lineBuf); + d += t; + cbsize -= t * sizeof(wchar_t); + } else + break; + } + } + + *d = L'\0'; + + fclose(file); + } + } + + return rlist; +} + +/*! \internal + \brief Get the default realm + + A string will be returned that specifies the default realm. The caller + should free the string using free(). + + Returns NULL if the operation fails. +*/ +wchar_t * khm_krb5_get_default_realm(void) +{ + wchar_t * realm; + size_t cch; + krb5_context ctx=0; + char * def = 0; + + pkrb5_init_context(&ctx); + pkrb5_get_default_realm(ctx,&def); + + if (def) { + cch = strlen(def) + 1; + realm = PMALLOC(sizeof(wchar_t) * cch); + AnsiStrToUnicode(realm, sizeof(wchar_t) * cch, def); + pkrb5_free_default_realm(ctx, def); + } else + realm = NULL; + + pkrb5_free_context(ctx); + + return realm; +} + +static +char * +make_postfix(const char * base, + const char * postfix, + char ** rcopy) +{ + size_t base_size; + size_t ret_size; + char * copy = 0; + char * ret = 0; + size_t t; + + if (FAILED(StringCbLengthA(base, STRSAFE_MAX_CCH * sizeof(char), &t))) + goto cleanup; + + base_size = t + 1; + + if (FAILED(StringCbLengthA(postfix, STRSAFE_MAX_CCH * sizeof(char), &t))) + goto cleanup; + + ret_size = base_size + t + 1; + + copy = malloc(base_size); + ret = malloc(ret_size); + + if (!copy || !ret) + goto cleanup; + + StringCbCopyNA(copy, base_size, base, base_size); + StringCbCopyNA(ret, ret_size, base, base_size); + StringCbCopyNA(ret + (base_size - 1), ret_size - (base_size - 1), + postfix, ret_size - (base_size - 1)); + + cleanup: + if (!copy || !ret) { + if (copy) + free(copy); + if (ret) + free(ret); + copy = ret = 0; + } + // INVARIANT: (ret ==> copy) && (copy ==> ret) + *rcopy = copy; + return ret; +} + + +static +long +make_temp_cache_v4(const char * postfix) +{ + static char * old_cache = 0; + + if (!pkrb_set_tkt_string || !ptkt_string || !pdest_tkt) + return 0; // XXX - is this appropriate? + + if (old_cache) { + pdest_tkt(); + pkrb_set_tkt_string(old_cache); + free(old_cache); + old_cache = 0; + } + + if (postfix) + { + char * tmp_cache = make_postfix(ptkt_string(), postfix, &old_cache); + + if (!tmp_cache) + return KFAILURE; + + pkrb_set_tkt_string(tmp_cache); + free(tmp_cache); + } + return 0; +} + +long +khm_krb4_changepwd(char * principal, + char * password, + char * newpassword, + char** error_str) +{ + long k_errno; + + if (!pkrb_set_tkt_string || !ptkt_string || !pkadm_change_your_password || + !pdest_tkt) + return KFAILURE; + + k_errno = make_temp_cache_v4("_chgpwd"); + if (k_errno) return k_errno; + k_errno = pkadm_change_your_password(principal, password, newpassword, + error_str); + make_temp_cache_v4(0); + return k_errno; +} + +struct tgt_filter_data { + khm_handle identity; + wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; +}; + +khm_int32 KHMAPI +krb4_tgt_filter(khm_handle cred, khm_int32 flags, void * rock) { + struct tgt_filter_data * pdata; + wchar_t credname[KCDB_MAXCCH_NAME]; + wchar_t * t; + khm_size cb; + khm_int32 ctype; + + pdata = (struct tgt_filter_data *) rock; + cb = sizeof(credname); + + if (KHM_FAILED(kcdb_cred_get_type(cred, &ctype)) || + ctype != credtype_id_krb4) + return 0; + + if (KHM_FAILED(kcdb_cred_get_name(cred, credname, &cb))) + return 0; + + if (wcsncmp(credname, L"krbtgt.", 7)) + return 0; + + t = wcsrchr(credname, L'@'); + if (t == NULL) + return 0; + + if (wcscmp(t+1, pdata->realm)) + return 0; + + return 1; +} + +khm_handle +khm_krb4_find_tgt(khm_handle credset, khm_handle identity) { + khm_handle result = NULL; + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t * t; + khm_size cb; + struct tgt_filter_data filter_data; + + cb = sizeof(idname); + + if (KHM_FAILED(kcdb_identity_get_name(identity, + idname, + &cb))) + return NULL; + + t = wcsrchr(idname, L'@'); + if (t == NULL) + return NULL; + + StringCbCopy(filter_data.realm, sizeof(filter_data.realm), + t + 1); + filter_data.identity = identity; + + if (KHM_FAILED(kcdb_credset_find_filtered(credset, + -1, + krb4_tgt_filter, + &filter_data, + &result, + NULL))) + return NULL; + else + return result; +} + +long +khm_convert524(khm_handle identity) +{ +#ifdef NO_KRB5 + return(0); +#else + krb5_context ctx = 0; + krb5_error_code code = 0; + int icode = 0; + krb5_principal me = 0; + krb5_principal server = 0; + krb5_creds *v5creds = 0; + krb5_creds increds; + krb5_ccache cc = 0; + CREDENTIALS * v4creds = NULL; + static int init_ets = 1; + + if (!pkrb5_init_context || + !pkrb_in_tkt || + !pkrb524_init_ets || + !pkrb524_convert_creds_kdc) + return 0; + + v4creds = (CREDENTIALS *) malloc(sizeof(CREDENTIALS)); + memset((char *) v4creds, 0, sizeof(CREDENTIALS)); + + memset((char *) &increds, 0, sizeof(increds)); + /* + From this point on, we can goto cleanup because increds is + initialized. + */ + + code = khm_krb5_initialize(identity, &ctx, &cc); + if (code) + goto cleanup; + + if ( init_ets ) { + pkrb524_init_ets(ctx); + init_ets = 0; + } + + if (code = pkrb5_cc_get_principal(ctx, cc, &me)) + goto cleanup; + + if ((code = pkrb5_build_principal(ctx, + &server, + krb5_princ_realm(ctx, me)->length, + krb5_princ_realm(ctx, me)->data, + "krbtgt", + krb5_princ_realm(ctx, me)->data, + NULL))) { + goto cleanup; + } + + increds.client = me; + increds.server = server; + increds.times.endtime = 0; + increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC; + if ((code = pkrb5_get_credentials(ctx, 0, + cc, + &increds, + &v5creds))) { + goto cleanup; + } + + if ((icode = pkrb524_convert_creds_kdc(ctx, + v5creds, + v4creds))) { + goto cleanup; + } + + /* initialize ticket cache */ + if ((icode = pkrb_in_tkt(v4creds->pname, v4creds->pinst, v4creds->realm) + != KSUCCESS)) { + goto cleanup; + } + + /* stash ticket, session key, etc. for future use */ + if ((icode = pkrb_save_credentials(v4creds->service, + v4creds->instance, + v4creds->realm, + v4creds->session, + v4creds->lifetime, + v4creds->kvno, + &(v4creds->ticket_st), + v4creds->issue_date))) { + goto cleanup; + } + + cleanup: + memset(v4creds, 0, sizeof(v4creds)); + free(v4creds); + + if (v5creds) { + pkrb5_free_creds(ctx, v5creds); + } + if (increds.client == me) + me = 0; + if (increds.server == server) + server = 0; + + if (ctx) + pkrb5_free_cred_contents(ctx, &increds); + + if (server) { + pkrb5_free_principal(ctx, server); + } + + if (me) { + pkrb5_free_principal(ctx, me); + } + + if (ctx && cc) + pkrb5_cc_close(ctx, cc); + + if (ctx) { + pkrb5_free_context(ctx); + } + + return (code || icode); +#endif /* NO_KRB5 */ +} + +long +khm_krb4_kinit(char * aname, + char * inst, + char * realm, + long lifetime, + char * password) { + + wchar_t * functionName = NULL; + wchar_t * err_context = NULL; + int rc4 = 0; + int msg = 0; + + if (pkname_parse == NULL) { + goto cleanup; + } + + err_context = L"getting realm"; + if (!*realm && (rc4 = (int)(*pkrb_get_lrealm)(realm, 1))) { + functionName = L"krb_get_lrealm()"; + msg = IDS_ERR_REALM; + goto cleanup; + } + + err_context = L"checking principal"; + if ((!*aname) || (!(rc4 = (int)(*pk_isname)(aname)))) { + functionName = L"krb_get_lrealm()"; + msg = IDS_ERR_PRINCIPAL; + goto cleanup; + } + + /* optional instance */ + if (!(rc4 = (int)(*pk_isinst)(inst))) { + functionName = L"k_isinst()"; + msg = IDS_ERR_INVINST; + goto cleanup; + } + + if (!(rc4 = (int)(*pk_isrealm)(realm))) { + functionName = L"k_isrealm()"; + msg = IDS_ERR_REALM; + goto cleanup; + } + + err_context = L"fetching ticket"; + rc4 = (*pkrb_get_pw_in_tkt)(aname, inst, realm, "krbtgt", realm, + lifetime, password); + + if (rc4) /* XXX: do we want: && (rc != NO_TKT_FIL) as well? */ { + functionName = L"krb_get_pw_in_tkt()"; + msg = IDS_ERR_PWINTKT; + goto cleanup; + } + + return 0; + + cleanup: + { + _report_sr0(KHERR_ERROR, msg); + _location(functionName); + } + return rc4; +} + + +int khm_krb4_kdestroy(void) { + int k_errno = 0; + + if (pdest_tkt != NULL) + { + k_errno = (*pdest_tkt)(); + if (k_errno && (k_errno != RET_TKFIL)) + return KRBERR(k_errno); + } + + return k_errno; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/krb4funcs.h +++ krb5-1.4.4/src/windows/identity/plugins/krb4/krb4funcs.h @@ -1,118 +1,118 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/* Adapted from multiple Leash header files */ - -#ifndef __KHIMAIRA_KRB5FUNCS_H -#define __KHIMAIRA_KRB5FUNCS_H - -#include -#include - -#include -#define SECURITY_WIN32 -#include -#include - -#include - -#define LEASH_DEBUG_CLASS_GENERIC 0 -#define LEASH_DEBUG_CLASS_KRB4 1 -#define LEASH_DEBUG_CLASS_KRB4_APP 2 - -#define LEASH_PRIORITY_LOW 0 -#define LEASH_PRIORITY_HIGH 1 - -#define KRB5_DEFAULT_LIFE 60*60*10 /* 10 hours */ - - -long -khm_convert524(khm_handle identity); - -long -khm_krb4_kinit(char * aname, - char * inst, - char * realm, - long lifetime, - char * password); - -long -khm_krb4_list_tickets(void); - -int khm_krb4_kdestroy(void); - -khm_handle -khm_krb4_find_tgt(khm_handle credset, - khm_handle identity); - -LONG -write_registry_setting( - char* setting, - DWORD type, - void* buffer, - size_t size - ); - -LONG -read_registry_setting_user( - char* setting, - void* buffer, - size_t size - ); - -LONG -read_registry_setting( - char* setting, - void* buffer, - size_t size - ); - -BOOL -get_STRING_from_registry( - HKEY hBaseKey, - char * key, - char * value, - char * outbuf, - DWORD outlen - ); - -BOOL -get_DWORD_from_registry( - HKEY hBaseKey, - char * key, - char * value, - DWORD * result - ); - -int -config_boolean_to_int( - const char *s - ); - -wchar_t * khm_krb5_get_default_realm(void); -wchar_t * khm_krb5_get_realm_list(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/* Adapted from multiple Leash header files */ + +#ifndef __KHIMAIRA_KRB5FUNCS_H +#define __KHIMAIRA_KRB5FUNCS_H + +#include +#include + +#include +#define SECURITY_WIN32 +#include +#include + +#include + +#define LEASH_DEBUG_CLASS_GENERIC 0 +#define LEASH_DEBUG_CLASS_KRB4 1 +#define LEASH_DEBUG_CLASS_KRB4_APP 2 + +#define LEASH_PRIORITY_LOW 0 +#define LEASH_PRIORITY_HIGH 1 + +#define KRB5_DEFAULT_LIFE 60*60*10 /* 10 hours */ + + +long +khm_convert524(khm_handle identity); + +long +khm_krb4_kinit(char * aname, + char * inst, + char * realm, + long lifetime, + char * password); + +long +khm_krb4_list_tickets(void); + +int khm_krb4_kdestroy(void); + +khm_handle +khm_krb4_find_tgt(khm_handle credset, + khm_handle identity); + +LONG +write_registry_setting( + char* setting, + DWORD type, + void* buffer, + size_t size + ); + +LONG +read_registry_setting_user( + char* setting, + void* buffer, + size_t size + ); + +LONG +read_registry_setting( + char* setting, + void* buffer, + size_t size + ); + +BOOL +get_STRING_from_registry( + HKEY hBaseKey, + char * key, + char * value, + char * outbuf, + DWORD outlen + ); + +BOOL +get_DWORD_from_registry( + HKEY hBaseKey, + char * key, + char * value, + DWORD * result + ); + +int +config_boolean_to_int( + const char *s + ); + +wchar_t * khm_krb5_get_default_realm(void); +wchar_t * khm_krb5_get_realm_list(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/langres.h +++ krb5-1.4.4/src/windows/identity/plugins/krb4/langres.h @@ -1,98 +1,98 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by C:\work\pismere\athena\auth\krb5\src\windows\identity\plugins\krb4\lang\en_us\langres.rc -// -#define IDS_UNK_ADDR_FMT 101 -#define IDS_KRB5_CREDTEXT_0 102 -#define IDD_NC_KRB4 103 -#define IDS_PLUGIN_DESC 103 -#define IDS_KEY_ENCTYPE_SHORT_DESC 104 -#define IDD_CFG_KRB4 104 -#define IDS_NC_K4_SHORT 104 -#define IDS_TKT_ENCTYPE_SHORT_DESC 105 -#define IDS_ERR_REALM 105 -#define IDD_CFG_IDS_KRB4 105 -#define IDS_KEY_ENCTYPE_LONG_DESC 106 -#define IDS_ERR_PRINCIPAL 106 -#define IDD_CFG_ID_KRB4 106 -#define IDS_TKT_ENCTYPE_LONG_DESC 107 -#define IDS_ERR_INVINST 107 -#define IDI_ICON1 107 -#define IDI_PLUGIN 107 -#define IDS_ADDR_LIST_SHORT_DESC 108 -#define IDS_ERR_PWINTKT 108 -#define IDS_ADDR_LIST_LONG_DESC 109 -#define IDS_CT_DISABLED 109 -#define IDS_ETYPE_NULL 110 -#define IDS_CT_TGTFOR 110 -#define IDS_ETYPE_DES_CBC_CRC 111 -#define IDS_METHOD_AUTO 111 -#define IDS_ETYPE_DES_CBC_MD4 112 -#define IDS_METHOD_PWD 112 -#define IDS_ETYPE_DES_CBC_MD5 113 -#define IDS_METHOD_K524 113 -#define IDS_ETYPE_DES_CBC_RAW 114 -#define IDS_CFG_IDS_KRB4_SHORT 114 -#define IDS_ETYPE_DES3_CBC_SHA 115 -#define IDS_ETYPE_DES3_CBC_RAW 116 -#define IDS_ETYPE_DES_HMAC_SHA1 117 -#define IDS_ETYPE_DES3_CBC_SHA1 118 -#define IDS_ETYPE_AES128_CTS_HMAC_SHA1_96 119 -#define IDS_ETYPE_AES256_CTS_HMAC_SHA1_96 120 -#define IDS_ETYPE_ARCFOUR_HMAC 121 -#define IDS_ETYPE_ARCFOUR_HMAC_EXP 122 -#define IDS_ETYPE_UNKNOWN 123 -#define IDS_ETYPE_LOCAL_DES3_HMAC_SHA1 124 -#define IDS_ETYPE_LOCAL_RC4_MD4 125 -#define IDS_KRB5_SHORT_DESC 126 -#define IDS_KRB5_LONG_DESC 127 -#define IDS_KRB4_SHORT_DESC 128 -#define IDS_KRB4_LONG_DESC 129 -#define IDS_KRB5_FLAGS_SHORT_DESC 130 -#define IDS_RENEW_TILL_SHORT_DESC 131 -#define IDS_RENEW_TILL_LONG_DESC 132 -#define IDS_RENEW_FOR_SHORT_DESC 133 -#define IDS_RENEW_FOR_LONG_DESC 134 -#define IDS_CFG_KRB4_LONG 135 -#define IDS_CFG_KRB4_SHORT 136 -#define IDC_NCK5_RENEWABLE 1002 -#define IDC_NCK5_FORWARDABLE 1004 -#define IDC_NCK5_REALM 1005 -#define IDC_NCK5_ADD_REALMS 1006 -#define IDC_NCK5_LIFETIME_EDIT 1008 -#define IDC_NCK5_RENEW_EDIT 1009 -#define IDC_PPK5_CRENEW 1014 -#define IDC_PPK5_CFORWARD 1015 -#define IDC_PPK5_CPROXY 1016 -#define IDC_PPK5_NAME 1017 -#define IDC_PPK5_ISSUE 1018 -#define IDC_PPK5_VALID 1019 -#define IDC_PPK5_RENEW 1020 -#define IDC_CHECK2 1022 -#define IDC_CHECK4 1024 -#define IDC_PPK5_LIFETIME 1024 -#define IDC_CHECK5 1025 -#define IDC_CFG_LBL_CACHE 1025 -#define IDC_CFG_LBL_CFGFILE 1026 -#define IDC_CFG_LBL_RLMPATH 1027 -#define IDC_CFG_CACHE 1028 -#define IDC_CFG_CFGPATH 1029 -#define IDC_CFG_RLMPATH 1030 -#define IDC_CFG_CFGBROW 1031 -#define IDC_CFG_RLMBROW 1032 -#define IDC_NCK4_OBTAIN 1033 -#define IDC_NCK4_PWD 1034 -#define IDC_NCK4_K524 1035 -#define IDC_NCK4_AUTO 1036 -#define IDC_CFG_GETTIX 1037 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 108 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1039 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by C:\work\pismere\athena\auth\krb5\src\windows\identity\plugins\krb4\lang\en_us\langres.rc +// +#define IDS_UNK_ADDR_FMT 101 +#define IDS_KRB5_CREDTEXT_0 102 +#define IDD_NC_KRB4 103 +#define IDS_PLUGIN_DESC 103 +#define IDS_KEY_ENCTYPE_SHORT_DESC 104 +#define IDD_CFG_KRB4 104 +#define IDS_NC_K4_SHORT 104 +#define IDS_TKT_ENCTYPE_SHORT_DESC 105 +#define IDS_ERR_REALM 105 +#define IDD_CFG_IDS_KRB4 105 +#define IDS_KEY_ENCTYPE_LONG_DESC 106 +#define IDS_ERR_PRINCIPAL 106 +#define IDD_CFG_ID_KRB4 106 +#define IDS_TKT_ENCTYPE_LONG_DESC 107 +#define IDS_ERR_INVINST 107 +#define IDI_ICON1 107 +#define IDI_PLUGIN 107 +#define IDS_ADDR_LIST_SHORT_DESC 108 +#define IDS_ERR_PWINTKT 108 +#define IDS_ADDR_LIST_LONG_DESC 109 +#define IDS_CT_DISABLED 109 +#define IDS_ETYPE_NULL 110 +#define IDS_CT_TGTFOR 110 +#define IDS_ETYPE_DES_CBC_CRC 111 +#define IDS_METHOD_AUTO 111 +#define IDS_ETYPE_DES_CBC_MD4 112 +#define IDS_METHOD_PWD 112 +#define IDS_ETYPE_DES_CBC_MD5 113 +#define IDS_METHOD_K524 113 +#define IDS_ETYPE_DES_CBC_RAW 114 +#define IDS_CFG_IDS_KRB4_SHORT 114 +#define IDS_ETYPE_DES3_CBC_SHA 115 +#define IDS_ETYPE_DES3_CBC_RAW 116 +#define IDS_ETYPE_DES_HMAC_SHA1 117 +#define IDS_ETYPE_DES3_CBC_SHA1 118 +#define IDS_ETYPE_AES128_CTS_HMAC_SHA1_96 119 +#define IDS_ETYPE_AES256_CTS_HMAC_SHA1_96 120 +#define IDS_ETYPE_ARCFOUR_HMAC 121 +#define IDS_ETYPE_ARCFOUR_HMAC_EXP 122 +#define IDS_ETYPE_UNKNOWN 123 +#define IDS_ETYPE_LOCAL_DES3_HMAC_SHA1 124 +#define IDS_ETYPE_LOCAL_RC4_MD4 125 +#define IDS_KRB5_SHORT_DESC 126 +#define IDS_KRB5_LONG_DESC 127 +#define IDS_KRB4_SHORT_DESC 128 +#define IDS_KRB4_LONG_DESC 129 +#define IDS_KRB5_FLAGS_SHORT_DESC 130 +#define IDS_RENEW_TILL_SHORT_DESC 131 +#define IDS_RENEW_TILL_LONG_DESC 132 +#define IDS_RENEW_FOR_SHORT_DESC 133 +#define IDS_RENEW_FOR_LONG_DESC 134 +#define IDS_CFG_KRB4_LONG 135 +#define IDS_CFG_KRB4_SHORT 136 +#define IDC_NCK5_RENEWABLE 1002 +#define IDC_NCK5_FORWARDABLE 1004 +#define IDC_NCK5_REALM 1005 +#define IDC_NCK5_ADD_REALMS 1006 +#define IDC_NCK5_LIFETIME_EDIT 1008 +#define IDC_NCK5_RENEW_EDIT 1009 +#define IDC_PPK5_CRENEW 1014 +#define IDC_PPK5_CFORWARD 1015 +#define IDC_PPK5_CPROXY 1016 +#define IDC_PPK5_NAME 1017 +#define IDC_PPK5_ISSUE 1018 +#define IDC_PPK5_VALID 1019 +#define IDC_PPK5_RENEW 1020 +#define IDC_CHECK2 1022 +#define IDC_CHECK4 1024 +#define IDC_PPK5_LIFETIME 1024 +#define IDC_CHECK5 1025 +#define IDC_CFG_LBL_CACHE 1025 +#define IDC_CFG_LBL_CFGFILE 1026 +#define IDC_CFG_LBL_RLMPATH 1027 +#define IDC_CFG_CACHE 1028 +#define IDC_CFG_CFGPATH 1029 +#define IDC_CFG_RLMPATH 1030 +#define IDC_CFG_CFGBROW 1031 +#define IDC_CFG_RLMBROW 1032 +#define IDC_NCK4_OBTAIN 1033 +#define IDC_NCK4_PWD 1034 +#define IDC_NCK4_K524 1035 +#define IDC_NCK4_AUTO 1036 +#define IDC_CFG_GETTIX 1037 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 108 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1039 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb4/krb4configdlg.c +++ krb5-1.4.4/src/windows/identity/plugins/krb4/krb4configdlg.c @@ -1,367 +1,367 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#include - -typedef struct tag_k4_ids_data { - khui_config_init_data cfg; - - khm_int32 get_tix; -} k4_ids_data; - -static void -k4_ids_read_params(k4_ids_data * d) { - khm_int32 t; -#ifdef DEBUG - assert(csp_params); -#endif - - t = 1; - khc_read_int32(csp_params, L"Krb4NewCreds", &t); - d->get_tix = !!t; -} - -static void -k4_ids_write_params(HWND hw, k4_ids_data * d) { - khm_int32 nv; - khm_boolean applied = FALSE; - - if (IsDlgButtonChecked(hw, IDC_CFG_GETTIX) == BST_CHECKED) - nv = TRUE; - else - nv = FALSE; - - if (!!nv != !!d->get_tix) { - d->get_tix = !!nv; - khc_write_int32(csp_params, L"Krb4NewCreds", d->get_tix); - applied = TRUE; - } - - khui_cfg_set_flags_inst(&d->cfg, - (applied)?KHUI_CNFLAG_APPLIED:0, - KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); -} - -static void -k4_ids_check_mod(HWND hw, k4_ids_data * d) { - khm_int32 nv; - - if (IsDlgButtonChecked(hw, IDC_CFG_GETTIX) == BST_CHECKED) - nv = TRUE; - else - nv = FALSE; - - khui_cfg_set_flags_inst(&d->cfg, - (!!nv != !!d->get_tix)? KHUI_CNFLAG_MODIFIED: 0, - KHUI_CNFLAG_MODIFIED); -} - -INT_PTR CALLBACK -krb4_ids_config_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - k4_ids_data * d; - - switch(uMsg) { - case WM_INITDIALOG: - d = PMALLOC(sizeof(*d)); - ZeroMemory(d, sizeof(*d)); - - d->cfg = *((khui_config_init_data *) lParam); - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); -#pragma warning(pop) - - k4_ids_read_params(d); - - CheckDlgButton(hwnd, IDC_CFG_GETTIX, - (d->get_tix)? BST_CHECKED: BST_UNCHECKED); - - break; - - case WM_COMMAND: - d = (k4_ids_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (HIWORD(wParam) == BN_CLICKED) { - k4_ids_check_mod(hwnd, d); - } - break; - - case KHUI_WM_CFG_NOTIFY: - d = (k4_ids_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (HIWORD(wParam) == WMCFG_APPLY) { - k4_ids_write_params(hwnd, d); - } - break; - - case WM_DESTROY: - d = (k4_ids_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - PFREE(d); - break; - } - - return FALSE; -} - -INT_PTR CALLBACK -krb4_id_config_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - switch(uMsg) { - case WM_INITDIALOG: - { - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - khui_config_init_data * d; - khm_handle ident = NULL; - khm_handle csp_ident = NULL; - khm_handle csp_idk4 = NULL; - khm_int32 gettix = 0; - khm_int32 flags = 0; - khm_int32 t; - khm_boolean is_default_ident = FALSE; - - d = PMALLOC(sizeof(khui_config_init_data)); - - if (!d) - break; - - ZeroMemory(d, sizeof(*d)); - - *d = *((khui_config_init_data *) lParam); - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); -#pragma warning(pop) - - khc_read_int32(csp_params, L"Krb4NewCreds", &gettix); - if (gettix == 0) - goto set_ui; - - *idname = 0; - cb = sizeof(idname); - khui_cfg_get_name(d->ctx_node, idname, &cb); - - kcdb_identity_create(idname, 0, &ident); - - if (ident == NULL) { - gettix = 0; - goto set_ui; - } - - kcdb_identity_get_flags(ident, &flags); - - if (!(flags & KCDB_IDENT_FLAG_DEFAULT)) { - gettix = 0; - goto set_ui; - } - - is_default_ident = TRUE; - - if (KHM_FAILED(kcdb_identity_get_config(ident, 0, &csp_ident))) - goto set_ui; - - if (KHM_FAILED(khc_open_space(csp_ident, CSNAME_KRB4CRED, - 0, &csp_idk4))) - goto close_config; - - if (KHM_SUCCEEDED(khc_read_int32(csp_idk4, L"Krb4NewCreds", &t)) && - !t) - gettix = 0; - - close_config: - if (csp_ident) - khc_close_space(csp_ident); - - if (csp_idk4) - khc_close_space(csp_idk4); - - set_ui: - CheckDlgButton(hwnd, IDC_CFG_GETTIX, - (gettix)?BST_CHECKED: BST_UNCHECKED); - EnableWindow(GetDlgItem(hwnd, IDC_CFG_GETTIX), - is_default_ident); - - if (ident) - kcdb_identity_release(ident); - } - break; - - case KHUI_WM_CFG_NOTIFY: - { - khui_config_init_data * d; - - d = (khui_config_init_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (!d) - break; - - if (HIWORD(wParam) == WMCFG_APPLY) { - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb_idname = sizeof(idname); - khm_handle ident = NULL; - khm_int32 flags = 0; - khm_handle csp_ident = NULL; - khm_handle csp_idk4 = NULL; - khm_int32 gettix = 0; - khm_int32 applied = FALSE; - - khui_cfg_get_name(d->ctx_node, idname, &cb_idname); - - kcdb_identity_create(idname, 0, &ident); - - if (ident == NULL) - break; - - kcdb_identity_get_flags(ident, &flags); - - if (!(flags & KCDB_IDENT_FLAG_DEFAULT)) - goto done_apply; - - if (IsDlgButtonChecked(hwnd, IDC_CFG_GETTIX) == BST_CHECKED) - gettix = TRUE; - - if (KHM_FAILED(kcdb_identity_get_config(ident, KHM_FLAG_CREATE, - &csp_ident))) - goto done_apply; - - if (KHM_FAILED(khc_open_space(csp_ident, CSNAME_KRB4CRED, - KHM_FLAG_CREATE | KCONF_FLAG_WRITEIFMOD, - &csp_idk4))) - goto done_apply; - - khc_write_int32(csp_idk4, L"Krb4NewCreds", gettix); - - applied = TRUE; - - done_apply: - if (ident) - kcdb_identity_release(ident); - - if (csp_ident) - khc_close_space(csp_ident); - - if (csp_idk4) - khc_close_space(csp_ident); - - khui_cfg_set_flags_inst(d, - ((applied)? KHUI_CNFLAG_APPLIED: 0), - (KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED)); - } - } - break; - - case WM_DESTROY: - { - khui_config_init_data * d; - - d = (khui_config_init_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (!d) - break; - - PFREE(d); - } - break; - } - - return FALSE; -} - - -INT_PTR CALLBACK -krb4_confg_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - - switch(uMsg) { - case WM_INITDIALOG: - { - wchar_t wbuf[MAX_PATH]; - CHAR krb_path[MAX_PATH]; - CHAR krbrealm_path[MAX_PATH]; - CHAR ticketName[MAX_PATH]; - char * pticketName; - unsigned int krb_path_sz = sizeof(krb_path); - unsigned int krbrealm_path_sz = sizeof(krbrealm_path); - - // Set KRB.CON - memset(krb_path, '\0', sizeof(krb_path)); - if (!pkrb_get_krbconf2(krb_path, &krb_path_sz)) { - // Error has happened - } else { // normal find - AnsiStrToUnicode(wbuf, sizeof(wbuf), krb_path); - SetDlgItemText(hwnd, IDC_CFG_CFGPATH, wbuf); - } - - // Set KRBREALM.CON - memset(krbrealm_path, '\0', sizeof(krbrealm_path)); - if (!pkrb_get_krbrealm2(krbrealm_path, &krbrealm_path_sz)) { - // Error has happened - } else { - AnsiStrToUnicode(wbuf, sizeof(wbuf), krbrealm_path); - SetDlgItemText(hwnd, IDC_CFG_RLMPATH, wbuf); - } - - // Set TICKET.KRB file Editbox - *ticketName = 0; - pkrb_set_tkt_string(0); - - pticketName = ptkt_string(); - if (pticketName) - StringCbCopyA(ticketName, sizeof(ticketName), pticketName); - - if (!*ticketName) { - // error - } else { - AnsiStrToUnicode(wbuf, sizeof(wbuf), ticketName); - SetDlgItemText(hwnd, IDC_CFG_CACHE, wbuf); - } - } - break; - - case WM_DESTROY: - break; - } - return FALSE; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include + +typedef struct tag_k4_ids_data { + khui_config_init_data cfg; + + khm_int32 get_tix; +} k4_ids_data; + +static void +k4_ids_read_params(k4_ids_data * d) { + khm_int32 t; +#ifdef DEBUG + assert(csp_params); +#endif + + t = 1; + khc_read_int32(csp_params, L"Krb4NewCreds", &t); + d->get_tix = !!t; +} + +static void +k4_ids_write_params(HWND hw, k4_ids_data * d) { + khm_int32 nv; + khm_boolean applied = FALSE; + + if (IsDlgButtonChecked(hw, IDC_CFG_GETTIX) == BST_CHECKED) + nv = TRUE; + else + nv = FALSE; + + if (!!nv != !!d->get_tix) { + d->get_tix = !!nv; + khc_write_int32(csp_params, L"Krb4NewCreds", d->get_tix); + applied = TRUE; + } + + khui_cfg_set_flags_inst(&d->cfg, + (applied)?KHUI_CNFLAG_APPLIED:0, + KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); +} + +static void +k4_ids_check_mod(HWND hw, k4_ids_data * d) { + khm_int32 nv; + + if (IsDlgButtonChecked(hw, IDC_CFG_GETTIX) == BST_CHECKED) + nv = TRUE; + else + nv = FALSE; + + khui_cfg_set_flags_inst(&d->cfg, + (!!nv != !!d->get_tix)? KHUI_CNFLAG_MODIFIED: 0, + KHUI_CNFLAG_MODIFIED); +} + +INT_PTR CALLBACK +krb4_ids_config_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + k4_ids_data * d; + + switch(uMsg) { + case WM_INITDIALOG: + d = PMALLOC(sizeof(*d)); + ZeroMemory(d, sizeof(*d)); + + d->cfg = *((khui_config_init_data *) lParam); + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); +#pragma warning(pop) + + k4_ids_read_params(d); + + CheckDlgButton(hwnd, IDC_CFG_GETTIX, + (d->get_tix)? BST_CHECKED: BST_UNCHECKED); + + break; + + case WM_COMMAND: + d = (k4_ids_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (HIWORD(wParam) == BN_CLICKED) { + k4_ids_check_mod(hwnd, d); + } + break; + + case KHUI_WM_CFG_NOTIFY: + d = (k4_ids_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (HIWORD(wParam) == WMCFG_APPLY) { + k4_ids_write_params(hwnd, d); + } + break; + + case WM_DESTROY: + d = (k4_ids_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + PFREE(d); + break; + } + + return FALSE; +} + +INT_PTR CALLBACK +krb4_id_config_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + switch(uMsg) { + case WM_INITDIALOG: + { + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + khui_config_init_data * d; + khm_handle ident = NULL; + khm_handle csp_ident = NULL; + khm_handle csp_idk4 = NULL; + khm_int32 gettix = 0; + khm_int32 flags = 0; + khm_int32 t; + khm_boolean is_default_ident = FALSE; + + d = PMALLOC(sizeof(khui_config_init_data)); + + if (!d) + break; + + ZeroMemory(d, sizeof(*d)); + + *d = *((khui_config_init_data *) lParam); + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); +#pragma warning(pop) + + khc_read_int32(csp_params, L"Krb4NewCreds", &gettix); + if (gettix == 0) + goto set_ui; + + *idname = 0; + cb = sizeof(idname); + khui_cfg_get_name(d->ctx_node, idname, &cb); + + kcdb_identity_create(idname, 0, &ident); + + if (ident == NULL) { + gettix = 0; + goto set_ui; + } + + kcdb_identity_get_flags(ident, &flags); + + if (!(flags & KCDB_IDENT_FLAG_DEFAULT)) { + gettix = 0; + goto set_ui; + } + + is_default_ident = TRUE; + + if (KHM_FAILED(kcdb_identity_get_config(ident, 0, &csp_ident))) + goto set_ui; + + if (KHM_FAILED(khc_open_space(csp_ident, CSNAME_KRB4CRED, + 0, &csp_idk4))) + goto close_config; + + if (KHM_SUCCEEDED(khc_read_int32(csp_idk4, L"Krb4NewCreds", &t)) && + !t) + gettix = 0; + + close_config: + if (csp_ident) + khc_close_space(csp_ident); + + if (csp_idk4) + khc_close_space(csp_idk4); + + set_ui: + CheckDlgButton(hwnd, IDC_CFG_GETTIX, + (gettix)?BST_CHECKED: BST_UNCHECKED); + EnableWindow(GetDlgItem(hwnd, IDC_CFG_GETTIX), + is_default_ident); + + if (ident) + kcdb_identity_release(ident); + } + break; + + case KHUI_WM_CFG_NOTIFY: + { + khui_config_init_data * d; + + d = (khui_config_init_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (!d) + break; + + if (HIWORD(wParam) == WMCFG_APPLY) { + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb_idname = sizeof(idname); + khm_handle ident = NULL; + khm_int32 flags = 0; + khm_handle csp_ident = NULL; + khm_handle csp_idk4 = NULL; + khm_int32 gettix = 0; + khm_int32 applied = FALSE; + + khui_cfg_get_name(d->ctx_node, idname, &cb_idname); + + kcdb_identity_create(idname, 0, &ident); + + if (ident == NULL) + break; + + kcdb_identity_get_flags(ident, &flags); + + if (!(flags & KCDB_IDENT_FLAG_DEFAULT)) + goto done_apply; + + if (IsDlgButtonChecked(hwnd, IDC_CFG_GETTIX) == BST_CHECKED) + gettix = TRUE; + + if (KHM_FAILED(kcdb_identity_get_config(ident, KHM_FLAG_CREATE, + &csp_ident))) + goto done_apply; + + if (KHM_FAILED(khc_open_space(csp_ident, CSNAME_KRB4CRED, + KHM_FLAG_CREATE | KCONF_FLAG_WRITEIFMOD, + &csp_idk4))) + goto done_apply; + + khc_write_int32(csp_idk4, L"Krb4NewCreds", gettix); + + applied = TRUE; + + done_apply: + if (ident) + kcdb_identity_release(ident); + + if (csp_ident) + khc_close_space(csp_ident); + + if (csp_idk4) + khc_close_space(csp_ident); + + khui_cfg_set_flags_inst(d, + ((applied)? KHUI_CNFLAG_APPLIED: 0), + (KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED)); + } + } + break; + + case WM_DESTROY: + { + khui_config_init_data * d; + + d = (khui_config_init_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (!d) + break; + + PFREE(d); + } + break; + } + + return FALSE; +} + + +INT_PTR CALLBACK +krb4_confg_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + + switch(uMsg) { + case WM_INITDIALOG: + { + wchar_t wbuf[MAX_PATH]; + CHAR krb_path[MAX_PATH]; + CHAR krbrealm_path[MAX_PATH]; + CHAR ticketName[MAX_PATH]; + char * pticketName; + unsigned int krb_path_sz = sizeof(krb_path); + unsigned int krbrealm_path_sz = sizeof(krbrealm_path); + + // Set KRB.CON + memset(krb_path, '\0', sizeof(krb_path)); + if (!pkrb_get_krbconf2(krb_path, &krb_path_sz)) { + // Error has happened + } else { // normal find + AnsiStrToUnicode(wbuf, sizeof(wbuf), krb_path); + SetDlgItemText(hwnd, IDC_CFG_CFGPATH, wbuf); + } + + // Set KRBREALM.CON + memset(krbrealm_path, '\0', sizeof(krbrealm_path)); + if (!pkrb_get_krbrealm2(krbrealm_path, &krbrealm_path_sz)) { + // Error has happened + } else { + AnsiStrToUnicode(wbuf, sizeof(wbuf), krbrealm_path); + SetDlgItemText(hwnd, IDC_CFG_RLMPATH, wbuf); + } + + // Set TICKET.KRB file Editbox + *ticketName = 0; + pkrb_set_tkt_string(0); + + pticketName = ptkt_string(); + if (pticketName) + StringCbCopyA(ticketName, sizeof(ticketName), pticketName); + + if (!*ticketName) { + // error + } else { + AnsiStrToUnicode(wbuf, sizeof(wbuf), ticketName); + SetDlgItemText(hwnd, IDC_CFG_CACHE, wbuf); + } + } + break; + + case WM_DESTROY: + break; + } + return FALSE; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/common/krb5common.c +++ krb5-1.4.4/src/windows/identity/plugins/common/krb5common.c @@ -1,449 +1,449 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#ifdef DEBUG -#include -#endif -#include - -/**************************************/ -/* khm_krb5_error(): */ -/**************************************/ -int -khm_krb5_error(krb5_error_code rc, LPCSTR FailedFunctionName, - int FreeContextFlag, krb5_context * ctx, - krb5_ccache * cache) -{ -#ifdef NO_KRB5 - return 0; -#else - -#ifdef SHOW_MESSAGE_IN_AN_ANNOYING_WAY - char message[256]; - const char *errText; - int krb5Error = ((int)(rc & 255)); - - errText = perror_message(rc); - _snprintf(message, sizeof(message), - "%s\n(Kerberos error %ld)\n\n%s failed", - errText, - krb5Error, - FailedFunctionName); - - MessageBoxA(NULL, message, "Kerberos Five", MB_OK | MB_ICONERROR | - MB_TASKMODAL | - MB_SETFOREGROUND); -#endif - - if (FreeContextFlag == 1) - { - if (*ctx != NULL) - { - if (*cache != NULL) { - pkrb5_cc_close(*ctx, *cache); - *cache = NULL; - } - - pkrb5_free_context(*ctx); - *ctx = NULL; - } - } - - return rc; - -#endif //!NO_KRB5 -} - -int -khm_krb5_initialize(khm_handle ident, - krb5_context *ctx, - krb5_ccache *cache) -{ -#ifdef NO_KRB5 - return(0); -#else - - LPCSTR functionName; - int freeContextFlag; - krb5_error_code rc = 0; - krb5_flags flags = 0; - - if (pkrb5_init_context == NULL) - return 1; - - if (*ctx == 0 && (rc = (*pkrb5_init_context)(ctx))) { - functionName = "krb5_init_context()"; - freeContextFlag = 0; - goto on_error; - } - - if(*cache == 0) { - wchar_t wccname[MAX_PATH]; - khm_size cbwccname; - - if(ident != NULL) { - cbwccname = sizeof(wccname); - do { - char ccname[256]; - - if(KHM_FAILED(kcdb_identity_get_attrib(ident, L"Krb5CCName", - NULL, wccname, - &cbwccname))) { - cbwccname = sizeof(wccname); - if (KHM_FAILED - (khm_krb5_find_ccache_for_identity(ident, - ctx, - wccname, - &cbwccname))) { -#ifdef DEBUG_LIKE_A_MADMAN - assert(FALSE); -#endif - break; - } - } - - if(UnicodeStrToAnsi(ccname, sizeof(ccname), wccname) == 0) - break; - - if((*pkrb5_cc_resolve)(*ctx, ccname, cache)) { - functionName = "krb5_cc_resolve()"; - freeContextFlag = 1; - goto on_error; - } - } while(FALSE); - } - -#ifndef FAILOVER_TO_DEFAULT_CCACHE - rc = 1; -#endif - if (*cache == 0 -#ifdef FAILOVER_TO_DEFAULT_CCACHE - && (rc = (*pkrb5_cc_default)(*ctx, cache)) -#endif - ) { - functionName = "krb5_cc_default()"; - freeContextFlag = 1; - goto on_error; - } - } - -#ifdef KRB5_TC_NOTICKET - flags = KRB5_TC_NOTICKET; -#endif - - if ((rc = (*pkrb5_cc_set_flags)(*ctx, *cache, flags))) - { - if (rc != KRB5_FCC_NOFILE && rc != KRB5_CC_NOTFOUND) - khm_krb5_error(rc, "krb5_cc_set_flags()", 0, ctx, - cache); - else if ((rc == KRB5_FCC_NOFILE || rc == KRB5_CC_NOTFOUND) && *ctx != NULL) { - if (*cache != NULL) - (*pkrb5_cc_close)(*ctx, *cache); - } - return rc; - } - return 0; - -on_error: - return khm_krb5_error(rc, functionName, freeContextFlag, ctx, cache); -#endif //!NO_KRB5 -} - -#define TIMET_TOLERANCE (60*5) - -khm_int32 KHMAPI -khm_get_identity_expiration_time(krb5_context ctx, krb5_ccache cc, - khm_handle ident, - krb5_timestamp * pexpiration) -{ - krb5_principal principal = 0; - char * princ_name = NULL; - krb5_creds creds; - krb5_error_code code; - krb5_error_code cc_code; - krb5_cc_cursor cur; - krb5_timestamp now, expiration = 0; - - wchar_t w_ident_name[KCDB_IDENT_MAXCCH_NAME]; - char ident_name[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - - khm_int32 rv = KHM_ERROR_NOT_FOUND; - - if (!ctx || !cc || !ident || !pexpiration) - return KHM_ERROR_GENERAL; - - code = pkrb5_cc_get_principal(ctx, cc, &principal); - - if ( code ) - return KHM_ERROR_INVALID_PARAM; - - cb = sizeof(w_ident_name); - kcdb_identity_get_name(ident, w_ident_name, &cb); - UnicodeStrToAnsi(ident_name, sizeof(ident_name), w_ident_name); - - code = pkrb5_unparse_name(ctx, principal, &princ_name); - - /* compare principal to ident. */ - - if ( code || !princ_name || - strcmp(princ_name, ident_name) ) { - if (princ_name) - pkrb5_free_unparsed_name(ctx, princ_name); - pkrb5_free_principal(ctx, principal); - return KHM_ERROR_UNKNOWN; - } - - pkrb5_free_unparsed_name(ctx, princ_name); - pkrb5_free_principal(ctx, principal); - - code = pkrb5_timeofday(ctx, &now); - - if (code) - return KHM_ERROR_UNKNOWN; - - cc_code = pkrb5_cc_start_seq_get(ctx, cc, &cur); - - while (!(cc_code = pkrb5_cc_next_cred(ctx, cc, &cur, &creds))) { - krb5_data * c0 = krb5_princ_name(ctx, creds.server); - krb5_data * c1 = krb5_princ_component(ctx, creds.server, 1); - krb5_data * r = krb5_princ_realm(ctx, creds.server); - - if ( c0 && c1 && r && c1->length == r->length && - !strncmp(c1->data,r->data,r->length) && - !strncmp("krbtgt",c0->data,c0->length) ) { - - /* we have a TGT, check for the expiration time. - * if it is valid and renewable, use the renew time - */ - - if (!(creds.ticket_flags & TKT_FLG_INVALID) && - creds.times.starttime < (now + TIMET_TOLERANCE) && - (creds.times.endtime + TIMET_TOLERANCE) > now) { - expiration = creds.times.endtime; - - if ((creds.ticket_flags & TKT_FLG_RENEWABLE) && - (creds.times.renew_till > creds.times.endtime)) { - expiration = creds.times.renew_till; - } - } - } - } - - if (cc_code == KRB5_CC_END) { - cc_code = pkrb5_cc_end_seq_get(ctx, cc, &cur); - rv = KHM_ERROR_SUCCESS; - *pexpiration = expiration; - } - - return rv; -} - -khm_int32 KHMAPI -khm_krb5_find_ccache_for_identity(khm_handle ident, krb5_context *pctx, - void * buffer, khm_size * pcbbuf) -{ - krb5_context ctx = 0; - krb5_ccache cache = 0; - krb5_error_code code; - apiCB * cc_ctx = 0; - struct _infoNC ** pNCi = NULL; - int i; - khm_int32 t; - wchar_t * ms = NULL; - khm_size cb; - krb5_timestamp expiration = 0; - krb5_timestamp best_match_expiration = 0; - char best_match_ccname[256] = ""; - khm_handle csp_params = NULL; - khm_handle csp_plugins = NULL; - - if (!buffer || !pcbbuf) - return KHM_ERROR_GENERAL; - - ctx = *pctx; - - if (!pcc_initialize || - !pcc_get_NC_info || - !pcc_free_NC_info || - !pcc_shutdown) - goto _skip_cc_iter; - - code = pcc_initialize(&cc_ctx, CC_API_VER_2, NULL, NULL); - if (code) - goto _exit; - - code = pcc_get_NC_info(cc_ctx, &pNCi); - - if (code) - goto _exit; - - for(i=0; pNCi[i]; i++) { - if (pNCi[i]->vers != CC_CRED_V5) - continue; - - code = (*pkrb5_cc_resolve)(ctx, pNCi[i]->name, &cache); - if (code) - continue; - - /* need a function to check the cache for the identity - * and determine if it has valid tickets. If it has - * the right identity and valid tickets, store the - * expiration time and the cache name. If it has the - * right identity but no valid tickets, store the ccache - * name and an expiration time of zero. if it does not - * have the right identity don't save the name. - * - * Keep searching to find the best cache available. - */ - - if (KHM_SUCCEEDED(khm_get_identity_expiration_time(ctx, cache, - ident, - &expiration))) { - if ( expiration > best_match_expiration ) { - best_match_expiration = expiration; - StringCbCopyA(best_match_ccname, - sizeof(best_match_ccname), - "API:"); - StringCbCatA(best_match_ccname, - sizeof(best_match_ccname), - pNCi[i]->name); - expiration = 0; - } - } - - if(ctx != NULL && cache != NULL) - (*pkrb5_cc_close)(ctx, cache); - cache = 0; - } - - _skip_cc_iter: - - if (KHM_SUCCEEDED(kmm_get_plugins_config(0, &csp_plugins))) { - khc_open_space(csp_plugins, L"Krb5Cred\\Parameters", 0, &csp_params); - khc_close_space(csp_plugins); - csp_plugins = NULL; - } - -#ifdef DEBUG - if (csp_params == NULL) { - assert(FALSE); - } -#endif - - if (csp_params && - KHM_SUCCEEDED(khc_read_int32(csp_params, L"MsLsaList", &t)) && t) { - code = (*pkrb5_cc_resolve)(ctx, "MSLSA:", &cache); - if (code == 0 && cache) { - if (KHM_SUCCEEDED(khm_get_identity_expiration_time(ctx, cache, - ident, - &expiration))) { - if ( expiration > best_match_expiration ) { - best_match_expiration = expiration; - StringCbCopyA(best_match_ccname, sizeof(best_match_ccname), - "MSLSA:"); - expiration = 0; - } - } - } - - if (ctx != NULL && cache != NULL) - (*pkrb5_cc_close)(ctx, cache); - - cache = 0; - } - - if (csp_params && - khc_read_multi_string(csp_params, L"FileCCList", NULL, &cb) - == KHM_ERROR_TOO_LONG && - cb > sizeof(wchar_t) * 2) { - - wchar_t * t; - char ccname[MAX_PATH + 6]; - - ms = PMALLOC(cb); - -#ifdef DEBUG - assert(ms); -#endif - - khc_read_multi_string(csp_params, L"FileCCList", ms, &cb); - for(t = ms; t && *t; t = multi_string_next(t)) { - StringCchPrintfA(ccname, ARRAYLENGTH(ccname), - "FILE:%S", t); - - code = (*pkrb5_cc_resolve)(ctx, ccname, &cache); - if (code) - continue; - - if (KHM_SUCCEEDED(khm_get_identity_expiration_time(ctx, cache, - ident, - &expiration))) { - if ( expiration > best_match_expiration ) { - best_match_expiration = expiration; - StringCbCopyA(best_match_ccname, - sizeof(best_match_ccname), - ccname); - expiration = 0; - } - } - - if (ctx != NULL && cache != NULL) - (*pkrb5_cc_close)(ctx, cache); - cache = 0; - } - - PFREE(ms); - } - _exit: - if (csp_params) - khc_close_space(csp_params); - - if (pNCi) - (*pcc_free_NC_info)(cc_ctx, &pNCi); - - if (cc_ctx) - (*pcc_shutdown)(&cc_ctx); - - if (best_match_ccname[0]) { - - if (*pcbbuf = AnsiStrToUnicode((wchar_t *)buffer, - *pcbbuf, - best_match_ccname)) { - - *pcbbuf = (*pcbbuf + 1) * sizeof(wchar_t); - - return KHM_ERROR_SUCCESS; - } - - } - - return KHM_ERROR_GENERAL; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#ifdef DEBUG +#include +#endif +#include + +/**************************************/ +/* khm_krb5_error(): */ +/**************************************/ +int +khm_krb5_error(krb5_error_code rc, LPCSTR FailedFunctionName, + int FreeContextFlag, krb5_context * ctx, + krb5_ccache * cache) +{ +#ifdef NO_KRB5 + return 0; +#else + +#ifdef SHOW_MESSAGE_IN_AN_ANNOYING_WAY + char message[256]; + const char *errText; + int krb5Error = ((int)(rc & 255)); + + errText = perror_message(rc); + _snprintf(message, sizeof(message), + "%s\n(Kerberos error %ld)\n\n%s failed", + errText, + krb5Error, + FailedFunctionName); + + MessageBoxA(NULL, message, "Kerberos Five", MB_OK | MB_ICONERROR | + MB_TASKMODAL | + MB_SETFOREGROUND); +#endif + + if (FreeContextFlag == 1) + { + if (*ctx != NULL) + { + if (*cache != NULL) { + pkrb5_cc_close(*ctx, *cache); + *cache = NULL; + } + + pkrb5_free_context(*ctx); + *ctx = NULL; + } + } + + return rc; + +#endif //!NO_KRB5 +} + +int +khm_krb5_initialize(khm_handle ident, + krb5_context *ctx, + krb5_ccache *cache) +{ +#ifdef NO_KRB5 + return(0); +#else + + LPCSTR functionName; + int freeContextFlag; + krb5_error_code rc = 0; + krb5_flags flags = 0; + + if (pkrb5_init_context == NULL) + return 1; + + if (*ctx == 0 && (rc = (*pkrb5_init_context)(ctx))) { + functionName = "krb5_init_context()"; + freeContextFlag = 0; + goto on_error; + } + + if(*cache == 0) { + wchar_t wccname[MAX_PATH]; + khm_size cbwccname; + + if(ident != NULL) { + cbwccname = sizeof(wccname); + do { + char ccname[256]; + + if(KHM_FAILED(kcdb_identity_get_attrib(ident, L"Krb5CCName", + NULL, wccname, + &cbwccname))) { + cbwccname = sizeof(wccname); + if (KHM_FAILED + (khm_krb5_find_ccache_for_identity(ident, + ctx, + wccname, + &cbwccname))) { +#ifdef DEBUG_LIKE_A_MADMAN + assert(FALSE); +#endif + break; + } + } + + if(UnicodeStrToAnsi(ccname, sizeof(ccname), wccname) == 0) + break; + + if((*pkrb5_cc_resolve)(*ctx, ccname, cache)) { + functionName = "krb5_cc_resolve()"; + freeContextFlag = 1; + goto on_error; + } + } while(FALSE); + } + +#ifndef FAILOVER_TO_DEFAULT_CCACHE + rc = 1; +#endif + if (*cache == 0 +#ifdef FAILOVER_TO_DEFAULT_CCACHE + && (rc = (*pkrb5_cc_default)(*ctx, cache)) +#endif + ) { + functionName = "krb5_cc_default()"; + freeContextFlag = 1; + goto on_error; + } + } + +#ifdef KRB5_TC_NOTICKET + flags = KRB5_TC_NOTICKET; +#endif + + if ((rc = (*pkrb5_cc_set_flags)(*ctx, *cache, flags))) + { + if (rc != KRB5_FCC_NOFILE && rc != KRB5_CC_NOTFOUND) + khm_krb5_error(rc, "krb5_cc_set_flags()", 0, ctx, + cache); + else if ((rc == KRB5_FCC_NOFILE || rc == KRB5_CC_NOTFOUND) && *ctx != NULL) { + if (*cache != NULL) + (*pkrb5_cc_close)(*ctx, *cache); + } + return rc; + } + return 0; + +on_error: + return khm_krb5_error(rc, functionName, freeContextFlag, ctx, cache); +#endif //!NO_KRB5 +} + +#define TIMET_TOLERANCE (60*5) + +khm_int32 KHMAPI +khm_get_identity_expiration_time(krb5_context ctx, krb5_ccache cc, + khm_handle ident, + krb5_timestamp * pexpiration) +{ + krb5_principal principal = 0; + char * princ_name = NULL; + krb5_creds creds; + krb5_error_code code; + krb5_error_code cc_code; + krb5_cc_cursor cur; + krb5_timestamp now, expiration = 0; + + wchar_t w_ident_name[KCDB_IDENT_MAXCCH_NAME]; + char ident_name[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + + khm_int32 rv = KHM_ERROR_NOT_FOUND; + + if (!ctx || !cc || !ident || !pexpiration) + return KHM_ERROR_GENERAL; + + code = pkrb5_cc_get_principal(ctx, cc, &principal); + + if ( code ) + return KHM_ERROR_INVALID_PARAM; + + cb = sizeof(w_ident_name); + kcdb_identity_get_name(ident, w_ident_name, &cb); + UnicodeStrToAnsi(ident_name, sizeof(ident_name), w_ident_name); + + code = pkrb5_unparse_name(ctx, principal, &princ_name); + + /* compare principal to ident. */ + + if ( code || !princ_name || + strcmp(princ_name, ident_name) ) { + if (princ_name) + pkrb5_free_unparsed_name(ctx, princ_name); + pkrb5_free_principal(ctx, principal); + return KHM_ERROR_UNKNOWN; + } + + pkrb5_free_unparsed_name(ctx, princ_name); + pkrb5_free_principal(ctx, principal); + + code = pkrb5_timeofday(ctx, &now); + + if (code) + return KHM_ERROR_UNKNOWN; + + cc_code = pkrb5_cc_start_seq_get(ctx, cc, &cur); + + while (!(cc_code = pkrb5_cc_next_cred(ctx, cc, &cur, &creds))) { + krb5_data * c0 = krb5_princ_name(ctx, creds.server); + krb5_data * c1 = krb5_princ_component(ctx, creds.server, 1); + krb5_data * r = krb5_princ_realm(ctx, creds.server); + + if ( c0 && c1 && r && c1->length == r->length && + !strncmp(c1->data,r->data,r->length) && + !strncmp("krbtgt",c0->data,c0->length) ) { + + /* we have a TGT, check for the expiration time. + * if it is valid and renewable, use the renew time + */ + + if (!(creds.ticket_flags & TKT_FLG_INVALID) && + creds.times.starttime < (now + TIMET_TOLERANCE) && + (creds.times.endtime + TIMET_TOLERANCE) > now) { + expiration = creds.times.endtime; + + if ((creds.ticket_flags & TKT_FLG_RENEWABLE) && + (creds.times.renew_till > creds.times.endtime)) { + expiration = creds.times.renew_till; + } + } + } + } + + if (cc_code == KRB5_CC_END) { + cc_code = pkrb5_cc_end_seq_get(ctx, cc, &cur); + rv = KHM_ERROR_SUCCESS; + *pexpiration = expiration; + } + + return rv; +} + +khm_int32 KHMAPI +khm_krb5_find_ccache_for_identity(khm_handle ident, krb5_context *pctx, + void * buffer, khm_size * pcbbuf) +{ + krb5_context ctx = 0; + krb5_ccache cache = 0; + krb5_error_code code; + apiCB * cc_ctx = 0; + struct _infoNC ** pNCi = NULL; + int i; + khm_int32 t; + wchar_t * ms = NULL; + khm_size cb; + krb5_timestamp expiration = 0; + krb5_timestamp best_match_expiration = 0; + char best_match_ccname[256] = ""; + khm_handle csp_params = NULL; + khm_handle csp_plugins = NULL; + + if (!buffer || !pcbbuf) + return KHM_ERROR_GENERAL; + + ctx = *pctx; + + if (!pcc_initialize || + !pcc_get_NC_info || + !pcc_free_NC_info || + !pcc_shutdown) + goto _skip_cc_iter; + + code = pcc_initialize(&cc_ctx, CC_API_VER_2, NULL, NULL); + if (code) + goto _exit; + + code = pcc_get_NC_info(cc_ctx, &pNCi); + + if (code) + goto _exit; + + for(i=0; pNCi[i]; i++) { + if (pNCi[i]->vers != CC_CRED_V5) + continue; + + code = (*pkrb5_cc_resolve)(ctx, pNCi[i]->name, &cache); + if (code) + continue; + + /* need a function to check the cache for the identity + * and determine if it has valid tickets. If it has + * the right identity and valid tickets, store the + * expiration time and the cache name. If it has the + * right identity but no valid tickets, store the ccache + * name and an expiration time of zero. if it does not + * have the right identity don't save the name. + * + * Keep searching to find the best cache available. + */ + + if (KHM_SUCCEEDED(khm_get_identity_expiration_time(ctx, cache, + ident, + &expiration))) { + if ( expiration > best_match_expiration ) { + best_match_expiration = expiration; + StringCbCopyA(best_match_ccname, + sizeof(best_match_ccname), + "API:"); + StringCbCatA(best_match_ccname, + sizeof(best_match_ccname), + pNCi[i]->name); + expiration = 0; + } + } + + if(ctx != NULL && cache != NULL) + (*pkrb5_cc_close)(ctx, cache); + cache = 0; + } + + _skip_cc_iter: + + if (KHM_SUCCEEDED(kmm_get_plugins_config(0, &csp_plugins))) { + khc_open_space(csp_plugins, L"Krb5Cred\\Parameters", 0, &csp_params); + khc_close_space(csp_plugins); + csp_plugins = NULL; + } + +#ifdef DEBUG + if (csp_params == NULL) { + assert(FALSE); + } +#endif + + if (csp_params && + KHM_SUCCEEDED(khc_read_int32(csp_params, L"MsLsaList", &t)) && t) { + code = (*pkrb5_cc_resolve)(ctx, "MSLSA:", &cache); + if (code == 0 && cache) { + if (KHM_SUCCEEDED(khm_get_identity_expiration_time(ctx, cache, + ident, + &expiration))) { + if ( expiration > best_match_expiration ) { + best_match_expiration = expiration; + StringCbCopyA(best_match_ccname, sizeof(best_match_ccname), + "MSLSA:"); + expiration = 0; + } + } + } + + if (ctx != NULL && cache != NULL) + (*pkrb5_cc_close)(ctx, cache); + + cache = 0; + } + + if (csp_params && + khc_read_multi_string(csp_params, L"FileCCList", NULL, &cb) + == KHM_ERROR_TOO_LONG && + cb > sizeof(wchar_t) * 2) { + + wchar_t * t; + char ccname[MAX_PATH + 6]; + + ms = PMALLOC(cb); + +#ifdef DEBUG + assert(ms); +#endif + + khc_read_multi_string(csp_params, L"FileCCList", ms, &cb); + for(t = ms; t && *t; t = multi_string_next(t)) { + StringCchPrintfA(ccname, ARRAYLENGTH(ccname), + "FILE:%S", t); + + code = (*pkrb5_cc_resolve)(ctx, ccname, &cache); + if (code) + continue; + + if (KHM_SUCCEEDED(khm_get_identity_expiration_time(ctx, cache, + ident, + &expiration))) { + if ( expiration > best_match_expiration ) { + best_match_expiration = expiration; + StringCbCopyA(best_match_ccname, + sizeof(best_match_ccname), + ccname); + expiration = 0; + } + } + + if (ctx != NULL && cache != NULL) + (*pkrb5_cc_close)(ctx, cache); + cache = 0; + } + + PFREE(ms); + } + _exit: + if (csp_params) + khc_close_space(csp_params); + + if (pNCi) + (*pcc_free_NC_info)(cc_ctx, &pNCi); + + if (cc_ctx) + (*pcc_shutdown)(&cc_ctx); + + if (best_match_ccname[0]) { + + if (*pcbbuf = AnsiStrToUnicode((wchar_t *)buffer, + *pcbbuf, + best_match_ccname)) { + + *pcbbuf = (*pcbbuf + 1) * sizeof(wchar_t); + + return KHM_ERROR_SUCCESS; + } + + } + + return KHM_ERROR_GENERAL; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/common/dynimport.c +++ krb5-1.4.4/src/windows/identity/plugins/common/dynimport.c @@ -1,463 +1,463 @@ -/* -* Copyright (c) 2005 Massachusetts Institute of Technology -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, -* modify, merge, publish, distribute, sublicense, and/or sell copies -* of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -/* $Id$ */ - -#include -#include -#include -#include - -HINSTANCE hKrb4 = 0; -HINSTANCE hKrb5 = 0; -HINSTANCE hKrb524 = 0; -HINSTANCE hSecur32 = 0; -HINSTANCE hComErr = 0; -HINSTANCE hService = 0; -HINSTANCE hProfile = 0; -HINSTANCE hPsapi = 0; -HINSTANCE hToolHelp32 = 0; -HINSTANCE hCCAPI = 0; - -DWORD AfsAvailable = 0; - -// CCAPI -DECL_FUNC_PTR(cc_initialize); -DECL_FUNC_PTR(cc_shutdown); -DECL_FUNC_PTR(cc_get_NC_info); -DECL_FUNC_PTR(cc_free_NC_info); - -// krb4 functions -DECL_FUNC_PTR(get_krb_err_txt_entry); -DECL_FUNC_PTR(k_isinst); -DECL_FUNC_PTR(k_isname); -DECL_FUNC_PTR(k_isrealm); -DECL_FUNC_PTR(kadm_change_your_password); -DECL_FUNC_PTR(kname_parse); -DECL_FUNC_PTR(krb_get_cred); -DECL_FUNC_PTR(krb_get_krbhst); -DECL_FUNC_PTR(krb_get_lrealm); -DECL_FUNC_PTR(krb_get_pw_in_tkt); -DECL_FUNC_PTR(krb_get_tf_realm); -DECL_FUNC_PTR(krb_mk_req); -DECL_FUNC_PTR(krb_realmofhost); -DECL_FUNC_PTR(tf_init); -DECL_FUNC_PTR(tf_close); -DECL_FUNC_PTR(tf_get_cred); -DECL_FUNC_PTR(tf_get_pname); -DECL_FUNC_PTR(tf_get_pinst); -DECL_FUNC_PTR(LocalHostAddr); -DECL_FUNC_PTR(tkt_string); -DECL_FUNC_PTR(krb_set_tkt_string); -DECL_FUNC_PTR(initialize_krb_error_func); -DECL_FUNC_PTR(initialize_kadm_error_table); -DECL_FUNC_PTR(dest_tkt); -DECL_FUNC_PTR(krb_in_tkt); -DECL_FUNC_PTR(krb_save_credentials); -DECL_FUNC_PTR(krb_get_krbconf2); -DECL_FUNC_PTR(krb_get_krbrealm2); -DECL_FUNC_PTR(krb_life_to_time); - -// krb5 functions -DECL_FUNC_PTR(krb5_change_password); -DECL_FUNC_PTR(krb5_get_init_creds_opt_init); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_tkt_life); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_forwardable); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_proxiable); -DECL_FUNC_PTR(krb5_get_init_creds_opt_set_address_list); -DECL_FUNC_PTR(krb5_get_init_creds_password); -DECL_FUNC_PTR(krb5_get_prompt_types); -DECL_FUNC_PTR(krb5_build_principal_ext); -DECL_FUNC_PTR(krb5_cc_get_name); -DECL_FUNC_PTR(krb5_cc_get_type); -DECL_FUNC_PTR(krb5_cc_resolve); -DECL_FUNC_PTR(krb5_cc_default); -DECL_FUNC_PTR(krb5_cc_default_name); -DECL_FUNC_PTR(krb5_cc_set_default_name); -DECL_FUNC_PTR(krb5_cc_initialize); -DECL_FUNC_PTR(krb5_cc_destroy); -DECL_FUNC_PTR(krb5_cc_close); -DECL_FUNC_PTR(krb5_cc_store_cred); -DECL_FUNC_PTR(krb5_cc_copy_creds); -DECL_FUNC_PTR(krb5_cc_retrieve_cred); -DECL_FUNC_PTR(krb5_cc_get_principal); -DECL_FUNC_PTR(krb5_cc_start_seq_get); -DECL_FUNC_PTR(krb5_cc_next_cred); -DECL_FUNC_PTR(krb5_cc_end_seq_get); -DECL_FUNC_PTR(krb5_cc_remove_cred); -DECL_FUNC_PTR(krb5_cc_set_flags); -// DECL_FUNC_PTR(krb5_cc_get_type); -DECL_FUNC_PTR(krb5_free_context); -DECL_FUNC_PTR(krb5_free_cred_contents); -DECL_FUNC_PTR(krb5_free_principal); -DECL_FUNC_PTR(krb5_get_in_tkt_with_password); -DECL_FUNC_PTR(krb5_init_context); -DECL_FUNC_PTR(krb5_parse_name); -DECL_FUNC_PTR(krb5_timeofday); -DECL_FUNC_PTR(krb5_timestamp_to_sfstring); -DECL_FUNC_PTR(krb5_unparse_name); -DECL_FUNC_PTR(krb5_get_credentials); -DECL_FUNC_PTR(krb5_mk_req); -DECL_FUNC_PTR(krb5_sname_to_principal); -DECL_FUNC_PTR(krb5_get_credentials_renew); -DECL_FUNC_PTR(krb5_free_data); -DECL_FUNC_PTR(krb5_free_data_contents); -// DECL_FUNC_PTR(krb5_get_realm_domain); -DECL_FUNC_PTR(krb5_free_unparsed_name); -DECL_FUNC_PTR(krb5_os_localaddr); -DECL_FUNC_PTR(krb5_copy_keyblock_contents); -DECL_FUNC_PTR(krb5_copy_data); -DECL_FUNC_PTR(krb5_free_creds); -DECL_FUNC_PTR(krb5_build_principal); -DECL_FUNC_PTR(krb5_get_renewed_creds); -DECL_FUNC_PTR(krb5_get_default_config_files); -DECL_FUNC_PTR(krb5_free_config_files); -DECL_FUNC_PTR(krb5_get_default_realm); -DECL_FUNC_PTR(krb5_set_default_realm); -DECL_FUNC_PTR(krb5_free_ticket); -DECL_FUNC_PTR(krb5_decode_ticket); -DECL_FUNC_PTR(krb5_get_host_realm); -DECL_FUNC_PTR(krb5_free_host_realm); -DECL_FUNC_PTR(krb5_c_random_make_octets); -DECL_FUNC_PTR(krb5_free_addresses); -DECL_FUNC_PTR(krb5_free_default_realm); - -// Krb524 functions -DECL_FUNC_PTR(krb524_init_ets); -DECL_FUNC_PTR(krb524_convert_creds_kdc); - -// ComErr functions -DECL_FUNC_PTR(com_err); -DECL_FUNC_PTR(error_message); - -// Profile functions -DECL_FUNC_PTR(profile_init); -DECL_FUNC_PTR(profile_flush); -DECL_FUNC_PTR(profile_release); -DECL_FUNC_PTR(profile_get_subsection_names); -DECL_FUNC_PTR(profile_free_list); -DECL_FUNC_PTR(profile_get_string); -DECL_FUNC_PTR(profile_get_values); -DECL_FUNC_PTR(profile_get_relation_names); -DECL_FUNC_PTR(profile_clear_relation); -DECL_FUNC_PTR(profile_add_relation); -DECL_FUNC_PTR(profile_update_relation); -DECL_FUNC_PTR(profile_release_string); - -// Service functions -DECL_FUNC_PTR(OpenSCManagerA); -DECL_FUNC_PTR(OpenServiceA); -DECL_FUNC_PTR(QueryServiceStatus); -DECL_FUNC_PTR(CloseServiceHandle); -DECL_FUNC_PTR(LsaNtStatusToWinError); - -// LSA Functions -DECL_FUNC_PTR(LsaConnectUntrusted); -DECL_FUNC_PTR(LsaLookupAuthenticationPackage); -DECL_FUNC_PTR(LsaCallAuthenticationPackage); -DECL_FUNC_PTR(LsaFreeReturnBuffer); -DECL_FUNC_PTR(LsaGetLogonSessionData); - -// CCAPI -FUNC_INFO ccapi_fi[] = { - MAKE_FUNC_INFO(cc_initialize), - MAKE_FUNC_INFO(cc_shutdown), - MAKE_FUNC_INFO(cc_get_NC_info), - MAKE_FUNC_INFO(cc_free_NC_info), - END_FUNC_INFO -}; - -FUNC_INFO k4_fi[] = { - MAKE_FUNC_INFO(get_krb_err_txt_entry), - MAKE_FUNC_INFO(k_isinst), - MAKE_FUNC_INFO(k_isname), - MAKE_FUNC_INFO(k_isrealm), - MAKE_FUNC_INFO(kadm_change_your_password), - MAKE_FUNC_INFO(kname_parse), - MAKE_FUNC_INFO(krb_get_cred), - MAKE_FUNC_INFO(krb_get_krbhst), - MAKE_FUNC_INFO(krb_get_lrealm), - MAKE_FUNC_INFO(krb_get_pw_in_tkt), - MAKE_FUNC_INFO(krb_get_tf_realm), - MAKE_FUNC_INFO(krb_mk_req), - MAKE_FUNC_INFO(krb_realmofhost), - MAKE_FUNC_INFO(tf_init), - MAKE_FUNC_INFO(tf_close), - MAKE_FUNC_INFO(tf_get_cred), - MAKE_FUNC_INFO(tf_get_pname), - MAKE_FUNC_INFO(tf_get_pinst), - MAKE_FUNC_INFO(LocalHostAddr), - MAKE_FUNC_INFO(tkt_string), - MAKE_FUNC_INFO(krb_set_tkt_string), - MAKE_FUNC_INFO(initialize_krb_error_func), - MAKE_FUNC_INFO(initialize_kadm_error_table), - MAKE_FUNC_INFO(dest_tkt), - /* MAKE_FUNC_INFO(lsh_LoadKrb4LeashErrorTables), */// XXX - MAKE_FUNC_INFO(krb_in_tkt), - MAKE_FUNC_INFO(krb_save_credentials), - MAKE_FUNC_INFO(krb_get_krbconf2), - MAKE_FUNC_INFO(krb_get_krbrealm2), - MAKE_FUNC_INFO(krb_life_to_time), - END_FUNC_INFO -}; - -FUNC_INFO k5_fi[] = { - MAKE_FUNC_INFO(krb5_change_password), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_init), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_tkt_life), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_renew_life), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_forwardable), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_proxiable), - MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_address_list), - MAKE_FUNC_INFO(krb5_get_init_creds_password), - MAKE_FUNC_INFO(krb5_get_prompt_types), - MAKE_FUNC_INFO(krb5_build_principal_ext), - MAKE_FUNC_INFO(krb5_cc_get_name), - MAKE_FUNC_INFO(krb5_cc_get_type), - MAKE_FUNC_INFO(krb5_cc_resolve), - MAKE_FUNC_INFO(krb5_cc_default), - MAKE_FUNC_INFO(krb5_cc_default_name), - MAKE_FUNC_INFO(krb5_cc_set_default_name), - MAKE_FUNC_INFO(krb5_cc_initialize), - MAKE_FUNC_INFO(krb5_cc_destroy), - MAKE_FUNC_INFO(krb5_cc_close), - MAKE_FUNC_INFO(krb5_cc_copy_creds), - MAKE_FUNC_INFO(krb5_cc_store_cred), - MAKE_FUNC_INFO(krb5_cc_retrieve_cred), - MAKE_FUNC_INFO(krb5_cc_get_principal), - MAKE_FUNC_INFO(krb5_cc_start_seq_get), - MAKE_FUNC_INFO(krb5_cc_next_cred), - MAKE_FUNC_INFO(krb5_cc_end_seq_get), - MAKE_FUNC_INFO(krb5_cc_remove_cred), - MAKE_FUNC_INFO(krb5_cc_set_flags), - // MAKE_FUNC_INFO(krb5_cc_get_type), - MAKE_FUNC_INFO(krb5_free_context), - MAKE_FUNC_INFO(krb5_free_cred_contents), - MAKE_FUNC_INFO(krb5_free_principal), - MAKE_FUNC_INFO(krb5_get_in_tkt_with_password), - MAKE_FUNC_INFO(krb5_init_context), - MAKE_FUNC_INFO(krb5_parse_name), - MAKE_FUNC_INFO(krb5_timeofday), - MAKE_FUNC_INFO(krb5_timestamp_to_sfstring), - MAKE_FUNC_INFO(krb5_unparse_name), - MAKE_FUNC_INFO(krb5_get_credentials), - MAKE_FUNC_INFO(krb5_mk_req), - MAKE_FUNC_INFO(krb5_sname_to_principal), - MAKE_FUNC_INFO(krb5_get_credentials_renew), - MAKE_FUNC_INFO(krb5_free_data), - MAKE_FUNC_INFO(krb5_free_data_contents), - // MAKE_FUNC_INFO(krb5_get_realm_domain), - MAKE_FUNC_INFO(krb5_free_unparsed_name), - MAKE_FUNC_INFO(krb5_os_localaddr), - MAKE_FUNC_INFO(krb5_copy_keyblock_contents), - MAKE_FUNC_INFO(krb5_copy_data), - MAKE_FUNC_INFO(krb5_free_creds), - MAKE_FUNC_INFO(krb5_build_principal), - MAKE_FUNC_INFO(krb5_get_renewed_creds), - MAKE_FUNC_INFO(krb5_free_addresses), - MAKE_FUNC_INFO(krb5_get_default_config_files), - MAKE_FUNC_INFO(krb5_free_config_files), - MAKE_FUNC_INFO(krb5_get_default_realm), - MAKE_FUNC_INFO(krb5_set_default_realm), - MAKE_FUNC_INFO(krb5_free_ticket), - MAKE_FUNC_INFO(krb5_decode_ticket), - MAKE_FUNC_INFO(krb5_get_host_realm), - MAKE_FUNC_INFO(krb5_free_host_realm), - MAKE_FUNC_INFO(krb5_c_random_make_octets), - MAKE_FUNC_INFO(krb5_free_default_realm), - END_FUNC_INFO -}; - -FUNC_INFO k524_fi[] = { - MAKE_FUNC_INFO(krb524_init_ets), - MAKE_FUNC_INFO(krb524_convert_creds_kdc), - END_FUNC_INFO -}; - -FUNC_INFO profile_fi[] = { - MAKE_FUNC_INFO(profile_init), - MAKE_FUNC_INFO(profile_flush), - MAKE_FUNC_INFO(profile_release), - MAKE_FUNC_INFO(profile_get_subsection_names), - MAKE_FUNC_INFO(profile_free_list), - MAKE_FUNC_INFO(profile_get_string), - MAKE_FUNC_INFO(profile_get_values), - MAKE_FUNC_INFO(profile_get_relation_names), - MAKE_FUNC_INFO(profile_clear_relation), - MAKE_FUNC_INFO(profile_add_relation), - MAKE_FUNC_INFO(profile_update_relation), - MAKE_FUNC_INFO(profile_release_string), - END_FUNC_INFO -}; - -FUNC_INFO ce_fi[] = { - MAKE_FUNC_INFO(com_err), - MAKE_FUNC_INFO(error_message), - END_FUNC_INFO -}; - -FUNC_INFO service_fi[] = { - MAKE_FUNC_INFO(OpenSCManagerA), - MAKE_FUNC_INFO(OpenServiceA), - MAKE_FUNC_INFO(QueryServiceStatus), - MAKE_FUNC_INFO(CloseServiceHandle), - MAKE_FUNC_INFO(LsaNtStatusToWinError), - END_FUNC_INFO -}; - -FUNC_INFO lsa_fi[] = { - MAKE_FUNC_INFO(LsaConnectUntrusted), - MAKE_FUNC_INFO(LsaLookupAuthenticationPackage), - MAKE_FUNC_INFO(LsaCallAuthenticationPackage), - MAKE_FUNC_INFO(LsaFreeReturnBuffer), - MAKE_FUNC_INFO(LsaGetLogonSessionData), - END_FUNC_INFO -}; - -// psapi functions -DECL_FUNC_PTR(GetModuleFileNameExA); -DECL_FUNC_PTR(EnumProcessModules); - -FUNC_INFO psapi_fi[] = { - MAKE_FUNC_INFO(GetModuleFileNameExA), - MAKE_FUNC_INFO(EnumProcessModules), - END_FUNC_INFO -}; - -// toolhelp functions -DECL_FUNC_PTR(CreateToolhelp32Snapshot); -DECL_FUNC_PTR(Module32First); -DECL_FUNC_PTR(Module32Next); - -FUNC_INFO toolhelp_fi[] = { - MAKE_FUNC_INFO(CreateToolhelp32Snapshot), - MAKE_FUNC_INFO(Module32First), - MAKE_FUNC_INFO(Module32Next), - END_FUNC_INFO -}; - -khm_int32 init_imports(void) { - OSVERSIONINFO osvi; - int imp_rv = 1; - -#define CKRV if(!imp_rv) goto _err_ret - -#ifndef _WIN64 - imp_rv = LoadFuncs(KRB4_DLL, k4_fi, &hKrb4, 0, 1, 0, 0); - CKRV; -#endif - - imp_rv = LoadFuncs(KRB5_DLL, k5_fi, &hKrb5, 0, 1, 0, 0); - CKRV; - - imp_rv = LoadFuncs(COMERR_DLL, ce_fi, &hComErr, 0, 0, 1, 0); - CKRV; - - imp_rv = LoadFuncs(SERVICE_DLL, service_fi, &hService, 0, 1, 0, 0); - CKRV; - - imp_rv = LoadFuncs(SECUR32_DLL, lsa_fi, &hSecur32, 0, 1, 1, 1); - CKRV; - - imp_rv = LoadFuncs(KRB524_DLL, k524_fi, &hKrb524, 0, 1, 1, 1); - CKRV; - - imp_rv = LoadFuncs(PROFILE_DLL, profile_fi, &hProfile, 0, 1, 0, 0); - CKRV; - - imp_rv = LoadFuncs(CCAPI_DLL, ccapi_fi, &hCCAPI, 0, 1, 0, 0); - /* CCAPI_DLL is optional. No error check. */ - - memset(&osvi, 0, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osvi); - - // XXX: We should really use feature testing, first - // checking for CreateToolhelp32Snapshot. If that's - // not around, we try the psapi stuff. - // - // Only load LSA functions if on NT/2000/XP - if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) - { - // Windows 9x - imp_rv = LoadFuncs(TOOLHELPDLL, toolhelp_fi, &hToolHelp32, 0, 1, 0, 0); - CKRV; - - hPsapi = 0; - } - else if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) - { - // Windows NT - imp_rv = LoadFuncs(PSAPIDLL, psapi_fi, &hPsapi, 0, 1, 0, 0); - CKRV; - - hToolHelp32 = 0; - } - - AfsAvailable = TRUE; //afscompat_init(); - - return KHM_ERROR_SUCCESS; - - _err_ret: - return KHM_ERROR_NOT_FOUND; -} - -khm_int32 exit_imports(void) { - //afscompat_close(); - - if (hKrb4) - FreeLibrary(hKrb4); - if (hKrb5) - FreeLibrary(hKrb5); - if (hProfile) - FreeLibrary(hProfile); - if (hComErr) - FreeLibrary(hComErr); - if (hService) - FreeLibrary(hService); - if (hSecur32) - FreeLibrary(hSecur32); - if (hKrb524) - FreeLibrary(hKrb524); - if (hPsapi) - FreeLibrary(hPsapi); - if (hToolHelp32) - FreeLibrary(hToolHelp32); - - return KHM_ERROR_SUCCESS; -} - -int (*Lcom_err)(LPSTR,long,LPSTR,...); -LPSTR (*Lerror_message)(long); -LPSTR (*Lerror_table_name)(long); - -void Leash_load_com_err_callback(FARPROC ce, - FARPROC em, - FARPROC etn) -{ - (FARPROC)Lcom_err=ce; - (FARPROC)Lerror_message=em; - (FARPROC)Lerror_table_name=etn; -} +/* +* Copyright (c) 2005 Massachusetts Institute of Technology +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, +* modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/* $Id$ */ + +#include +#include +#include +#include + +HINSTANCE hKrb4 = 0; +HINSTANCE hKrb5 = 0; +HINSTANCE hKrb524 = 0; +HINSTANCE hSecur32 = 0; +HINSTANCE hComErr = 0; +HINSTANCE hService = 0; +HINSTANCE hProfile = 0; +HINSTANCE hPsapi = 0; +HINSTANCE hToolHelp32 = 0; +HINSTANCE hCCAPI = 0; + +DWORD AfsAvailable = 0; + +// CCAPI +DECL_FUNC_PTR(cc_initialize); +DECL_FUNC_PTR(cc_shutdown); +DECL_FUNC_PTR(cc_get_NC_info); +DECL_FUNC_PTR(cc_free_NC_info); + +// krb4 functions +DECL_FUNC_PTR(get_krb_err_txt_entry); +DECL_FUNC_PTR(k_isinst); +DECL_FUNC_PTR(k_isname); +DECL_FUNC_PTR(k_isrealm); +DECL_FUNC_PTR(kadm_change_your_password); +DECL_FUNC_PTR(kname_parse); +DECL_FUNC_PTR(krb_get_cred); +DECL_FUNC_PTR(krb_get_krbhst); +DECL_FUNC_PTR(krb_get_lrealm); +DECL_FUNC_PTR(krb_get_pw_in_tkt); +DECL_FUNC_PTR(krb_get_tf_realm); +DECL_FUNC_PTR(krb_mk_req); +DECL_FUNC_PTR(krb_realmofhost); +DECL_FUNC_PTR(tf_init); +DECL_FUNC_PTR(tf_close); +DECL_FUNC_PTR(tf_get_cred); +DECL_FUNC_PTR(tf_get_pname); +DECL_FUNC_PTR(tf_get_pinst); +DECL_FUNC_PTR(LocalHostAddr); +DECL_FUNC_PTR(tkt_string); +DECL_FUNC_PTR(krb_set_tkt_string); +DECL_FUNC_PTR(initialize_krb_error_func); +DECL_FUNC_PTR(initialize_kadm_error_table); +DECL_FUNC_PTR(dest_tkt); +DECL_FUNC_PTR(krb_in_tkt); +DECL_FUNC_PTR(krb_save_credentials); +DECL_FUNC_PTR(krb_get_krbconf2); +DECL_FUNC_PTR(krb_get_krbrealm2); +DECL_FUNC_PTR(krb_life_to_time); + +// krb5 functions +DECL_FUNC_PTR(krb5_change_password); +DECL_FUNC_PTR(krb5_get_init_creds_opt_init); +DECL_FUNC_PTR(krb5_get_init_creds_opt_set_tkt_life); +DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life); +DECL_FUNC_PTR(krb5_get_init_creds_opt_set_forwardable); +DECL_FUNC_PTR(krb5_get_init_creds_opt_set_proxiable); +DECL_FUNC_PTR(krb5_get_init_creds_opt_set_address_list); +DECL_FUNC_PTR(krb5_get_init_creds_password); +DECL_FUNC_PTR(krb5_get_prompt_types); +DECL_FUNC_PTR(krb5_build_principal_ext); +DECL_FUNC_PTR(krb5_cc_get_name); +DECL_FUNC_PTR(krb5_cc_get_type); +DECL_FUNC_PTR(krb5_cc_resolve); +DECL_FUNC_PTR(krb5_cc_default); +DECL_FUNC_PTR(krb5_cc_default_name); +DECL_FUNC_PTR(krb5_cc_set_default_name); +DECL_FUNC_PTR(krb5_cc_initialize); +DECL_FUNC_PTR(krb5_cc_destroy); +DECL_FUNC_PTR(krb5_cc_close); +DECL_FUNC_PTR(krb5_cc_store_cred); +DECL_FUNC_PTR(krb5_cc_copy_creds); +DECL_FUNC_PTR(krb5_cc_retrieve_cred); +DECL_FUNC_PTR(krb5_cc_get_principal); +DECL_FUNC_PTR(krb5_cc_start_seq_get); +DECL_FUNC_PTR(krb5_cc_next_cred); +DECL_FUNC_PTR(krb5_cc_end_seq_get); +DECL_FUNC_PTR(krb5_cc_remove_cred); +DECL_FUNC_PTR(krb5_cc_set_flags); +// DECL_FUNC_PTR(krb5_cc_get_type); +DECL_FUNC_PTR(krb5_free_context); +DECL_FUNC_PTR(krb5_free_cred_contents); +DECL_FUNC_PTR(krb5_free_principal); +DECL_FUNC_PTR(krb5_get_in_tkt_with_password); +DECL_FUNC_PTR(krb5_init_context); +DECL_FUNC_PTR(krb5_parse_name); +DECL_FUNC_PTR(krb5_timeofday); +DECL_FUNC_PTR(krb5_timestamp_to_sfstring); +DECL_FUNC_PTR(krb5_unparse_name); +DECL_FUNC_PTR(krb5_get_credentials); +DECL_FUNC_PTR(krb5_mk_req); +DECL_FUNC_PTR(krb5_sname_to_principal); +DECL_FUNC_PTR(krb5_get_credentials_renew); +DECL_FUNC_PTR(krb5_free_data); +DECL_FUNC_PTR(krb5_free_data_contents); +// DECL_FUNC_PTR(krb5_get_realm_domain); +DECL_FUNC_PTR(krb5_free_unparsed_name); +DECL_FUNC_PTR(krb5_os_localaddr); +DECL_FUNC_PTR(krb5_copy_keyblock_contents); +DECL_FUNC_PTR(krb5_copy_data); +DECL_FUNC_PTR(krb5_free_creds); +DECL_FUNC_PTR(krb5_build_principal); +DECL_FUNC_PTR(krb5_get_renewed_creds); +DECL_FUNC_PTR(krb5_get_default_config_files); +DECL_FUNC_PTR(krb5_free_config_files); +DECL_FUNC_PTR(krb5_get_default_realm); +DECL_FUNC_PTR(krb5_set_default_realm); +DECL_FUNC_PTR(krb5_free_ticket); +DECL_FUNC_PTR(krb5_decode_ticket); +DECL_FUNC_PTR(krb5_get_host_realm); +DECL_FUNC_PTR(krb5_free_host_realm); +DECL_FUNC_PTR(krb5_c_random_make_octets); +DECL_FUNC_PTR(krb5_free_addresses); +DECL_FUNC_PTR(krb5_free_default_realm); + +// Krb524 functions +DECL_FUNC_PTR(krb524_init_ets); +DECL_FUNC_PTR(krb524_convert_creds_kdc); + +// ComErr functions +DECL_FUNC_PTR(com_err); +DECL_FUNC_PTR(error_message); + +// Profile functions +DECL_FUNC_PTR(profile_init); +DECL_FUNC_PTR(profile_flush); +DECL_FUNC_PTR(profile_release); +DECL_FUNC_PTR(profile_get_subsection_names); +DECL_FUNC_PTR(profile_free_list); +DECL_FUNC_PTR(profile_get_string); +DECL_FUNC_PTR(profile_get_values); +DECL_FUNC_PTR(profile_get_relation_names); +DECL_FUNC_PTR(profile_clear_relation); +DECL_FUNC_PTR(profile_add_relation); +DECL_FUNC_PTR(profile_update_relation); +DECL_FUNC_PTR(profile_release_string); + +// Service functions +DECL_FUNC_PTR(OpenSCManagerA); +DECL_FUNC_PTR(OpenServiceA); +DECL_FUNC_PTR(QueryServiceStatus); +DECL_FUNC_PTR(CloseServiceHandle); +DECL_FUNC_PTR(LsaNtStatusToWinError); + +// LSA Functions +DECL_FUNC_PTR(LsaConnectUntrusted); +DECL_FUNC_PTR(LsaLookupAuthenticationPackage); +DECL_FUNC_PTR(LsaCallAuthenticationPackage); +DECL_FUNC_PTR(LsaFreeReturnBuffer); +DECL_FUNC_PTR(LsaGetLogonSessionData); + +// CCAPI +FUNC_INFO ccapi_fi[] = { + MAKE_FUNC_INFO(cc_initialize), + MAKE_FUNC_INFO(cc_shutdown), + MAKE_FUNC_INFO(cc_get_NC_info), + MAKE_FUNC_INFO(cc_free_NC_info), + END_FUNC_INFO +}; + +FUNC_INFO k4_fi[] = { + MAKE_FUNC_INFO(get_krb_err_txt_entry), + MAKE_FUNC_INFO(k_isinst), + MAKE_FUNC_INFO(k_isname), + MAKE_FUNC_INFO(k_isrealm), + MAKE_FUNC_INFO(kadm_change_your_password), + MAKE_FUNC_INFO(kname_parse), + MAKE_FUNC_INFO(krb_get_cred), + MAKE_FUNC_INFO(krb_get_krbhst), + MAKE_FUNC_INFO(krb_get_lrealm), + MAKE_FUNC_INFO(krb_get_pw_in_tkt), + MAKE_FUNC_INFO(krb_get_tf_realm), + MAKE_FUNC_INFO(krb_mk_req), + MAKE_FUNC_INFO(krb_realmofhost), + MAKE_FUNC_INFO(tf_init), + MAKE_FUNC_INFO(tf_close), + MAKE_FUNC_INFO(tf_get_cred), + MAKE_FUNC_INFO(tf_get_pname), + MAKE_FUNC_INFO(tf_get_pinst), + MAKE_FUNC_INFO(LocalHostAddr), + MAKE_FUNC_INFO(tkt_string), + MAKE_FUNC_INFO(krb_set_tkt_string), + MAKE_FUNC_INFO(initialize_krb_error_func), + MAKE_FUNC_INFO(initialize_kadm_error_table), + MAKE_FUNC_INFO(dest_tkt), + /* MAKE_FUNC_INFO(lsh_LoadKrb4LeashErrorTables), */// XXX + MAKE_FUNC_INFO(krb_in_tkt), + MAKE_FUNC_INFO(krb_save_credentials), + MAKE_FUNC_INFO(krb_get_krbconf2), + MAKE_FUNC_INFO(krb_get_krbrealm2), + MAKE_FUNC_INFO(krb_life_to_time), + END_FUNC_INFO +}; + +FUNC_INFO k5_fi[] = { + MAKE_FUNC_INFO(krb5_change_password), + MAKE_FUNC_INFO(krb5_get_init_creds_opt_init), + MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_tkt_life), + MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_renew_life), + MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_forwardable), + MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_proxiable), + MAKE_FUNC_INFO(krb5_get_init_creds_opt_set_address_list), + MAKE_FUNC_INFO(krb5_get_init_creds_password), + MAKE_FUNC_INFO(krb5_get_prompt_types), + MAKE_FUNC_INFO(krb5_build_principal_ext), + MAKE_FUNC_INFO(krb5_cc_get_name), + MAKE_FUNC_INFO(krb5_cc_get_type), + MAKE_FUNC_INFO(krb5_cc_resolve), + MAKE_FUNC_INFO(krb5_cc_default), + MAKE_FUNC_INFO(krb5_cc_default_name), + MAKE_FUNC_INFO(krb5_cc_set_default_name), + MAKE_FUNC_INFO(krb5_cc_initialize), + MAKE_FUNC_INFO(krb5_cc_destroy), + MAKE_FUNC_INFO(krb5_cc_close), + MAKE_FUNC_INFO(krb5_cc_copy_creds), + MAKE_FUNC_INFO(krb5_cc_store_cred), + MAKE_FUNC_INFO(krb5_cc_retrieve_cred), + MAKE_FUNC_INFO(krb5_cc_get_principal), + MAKE_FUNC_INFO(krb5_cc_start_seq_get), + MAKE_FUNC_INFO(krb5_cc_next_cred), + MAKE_FUNC_INFO(krb5_cc_end_seq_get), + MAKE_FUNC_INFO(krb5_cc_remove_cred), + MAKE_FUNC_INFO(krb5_cc_set_flags), + // MAKE_FUNC_INFO(krb5_cc_get_type), + MAKE_FUNC_INFO(krb5_free_context), + MAKE_FUNC_INFO(krb5_free_cred_contents), + MAKE_FUNC_INFO(krb5_free_principal), + MAKE_FUNC_INFO(krb5_get_in_tkt_with_password), + MAKE_FUNC_INFO(krb5_init_context), + MAKE_FUNC_INFO(krb5_parse_name), + MAKE_FUNC_INFO(krb5_timeofday), + MAKE_FUNC_INFO(krb5_timestamp_to_sfstring), + MAKE_FUNC_INFO(krb5_unparse_name), + MAKE_FUNC_INFO(krb5_get_credentials), + MAKE_FUNC_INFO(krb5_mk_req), + MAKE_FUNC_INFO(krb5_sname_to_principal), + MAKE_FUNC_INFO(krb5_get_credentials_renew), + MAKE_FUNC_INFO(krb5_free_data), + MAKE_FUNC_INFO(krb5_free_data_contents), + // MAKE_FUNC_INFO(krb5_get_realm_domain), + MAKE_FUNC_INFO(krb5_free_unparsed_name), + MAKE_FUNC_INFO(krb5_os_localaddr), + MAKE_FUNC_INFO(krb5_copy_keyblock_contents), + MAKE_FUNC_INFO(krb5_copy_data), + MAKE_FUNC_INFO(krb5_free_creds), + MAKE_FUNC_INFO(krb5_build_principal), + MAKE_FUNC_INFO(krb5_get_renewed_creds), + MAKE_FUNC_INFO(krb5_free_addresses), + MAKE_FUNC_INFO(krb5_get_default_config_files), + MAKE_FUNC_INFO(krb5_free_config_files), + MAKE_FUNC_INFO(krb5_get_default_realm), + MAKE_FUNC_INFO(krb5_set_default_realm), + MAKE_FUNC_INFO(krb5_free_ticket), + MAKE_FUNC_INFO(krb5_decode_ticket), + MAKE_FUNC_INFO(krb5_get_host_realm), + MAKE_FUNC_INFO(krb5_free_host_realm), + MAKE_FUNC_INFO(krb5_c_random_make_octets), + MAKE_FUNC_INFO(krb5_free_default_realm), + END_FUNC_INFO +}; + +FUNC_INFO k524_fi[] = { + MAKE_FUNC_INFO(krb524_init_ets), + MAKE_FUNC_INFO(krb524_convert_creds_kdc), + END_FUNC_INFO +}; + +FUNC_INFO profile_fi[] = { + MAKE_FUNC_INFO(profile_init), + MAKE_FUNC_INFO(profile_flush), + MAKE_FUNC_INFO(profile_release), + MAKE_FUNC_INFO(profile_get_subsection_names), + MAKE_FUNC_INFO(profile_free_list), + MAKE_FUNC_INFO(profile_get_string), + MAKE_FUNC_INFO(profile_get_values), + MAKE_FUNC_INFO(profile_get_relation_names), + MAKE_FUNC_INFO(profile_clear_relation), + MAKE_FUNC_INFO(profile_add_relation), + MAKE_FUNC_INFO(profile_update_relation), + MAKE_FUNC_INFO(profile_release_string), + END_FUNC_INFO +}; + +FUNC_INFO ce_fi[] = { + MAKE_FUNC_INFO(com_err), + MAKE_FUNC_INFO(error_message), + END_FUNC_INFO +}; + +FUNC_INFO service_fi[] = { + MAKE_FUNC_INFO(OpenSCManagerA), + MAKE_FUNC_INFO(OpenServiceA), + MAKE_FUNC_INFO(QueryServiceStatus), + MAKE_FUNC_INFO(CloseServiceHandle), + MAKE_FUNC_INFO(LsaNtStatusToWinError), + END_FUNC_INFO +}; + +FUNC_INFO lsa_fi[] = { + MAKE_FUNC_INFO(LsaConnectUntrusted), + MAKE_FUNC_INFO(LsaLookupAuthenticationPackage), + MAKE_FUNC_INFO(LsaCallAuthenticationPackage), + MAKE_FUNC_INFO(LsaFreeReturnBuffer), + MAKE_FUNC_INFO(LsaGetLogonSessionData), + END_FUNC_INFO +}; + +// psapi functions +DECL_FUNC_PTR(GetModuleFileNameExA); +DECL_FUNC_PTR(EnumProcessModules); + +FUNC_INFO psapi_fi[] = { + MAKE_FUNC_INFO(GetModuleFileNameExA), + MAKE_FUNC_INFO(EnumProcessModules), + END_FUNC_INFO +}; + +// toolhelp functions +DECL_FUNC_PTR(CreateToolhelp32Snapshot); +DECL_FUNC_PTR(Module32First); +DECL_FUNC_PTR(Module32Next); + +FUNC_INFO toolhelp_fi[] = { + MAKE_FUNC_INFO(CreateToolhelp32Snapshot), + MAKE_FUNC_INFO(Module32First), + MAKE_FUNC_INFO(Module32Next), + END_FUNC_INFO +}; + +khm_int32 init_imports(void) { + OSVERSIONINFO osvi; + int imp_rv = 1; + +#define CKRV if(!imp_rv) goto _err_ret + +#ifndef _WIN64 + imp_rv = LoadFuncs(KRB4_DLL, k4_fi, &hKrb4, 0, 1, 0, 0); + CKRV; +#endif + + imp_rv = LoadFuncs(KRB5_DLL, k5_fi, &hKrb5, 0, 1, 0, 0); + CKRV; + + imp_rv = LoadFuncs(COMERR_DLL, ce_fi, &hComErr, 0, 0, 1, 0); + CKRV; + + imp_rv = LoadFuncs(SERVICE_DLL, service_fi, &hService, 0, 1, 0, 0); + CKRV; + + imp_rv = LoadFuncs(SECUR32_DLL, lsa_fi, &hSecur32, 0, 1, 1, 1); + CKRV; + + imp_rv = LoadFuncs(KRB524_DLL, k524_fi, &hKrb524, 0, 1, 1, 1); + CKRV; + + imp_rv = LoadFuncs(PROFILE_DLL, profile_fi, &hProfile, 0, 1, 0, 0); + CKRV; + + imp_rv = LoadFuncs(CCAPI_DLL, ccapi_fi, &hCCAPI, 0, 1, 0, 0); + /* CCAPI_DLL is optional. No error check. */ + + memset(&osvi, 0, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); + + // XXX: We should really use feature testing, first + // checking for CreateToolhelp32Snapshot. If that's + // not around, we try the psapi stuff. + // + // Only load LSA functions if on NT/2000/XP + if(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) + { + // Windows 9x + imp_rv = LoadFuncs(TOOLHELPDLL, toolhelp_fi, &hToolHelp32, 0, 1, 0, 0); + CKRV; + + hPsapi = 0; + } + else if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + // Windows NT + imp_rv = LoadFuncs(PSAPIDLL, psapi_fi, &hPsapi, 0, 1, 0, 0); + CKRV; + + hToolHelp32 = 0; + } + + AfsAvailable = TRUE; //afscompat_init(); + + return KHM_ERROR_SUCCESS; + + _err_ret: + return KHM_ERROR_NOT_FOUND; +} + +khm_int32 exit_imports(void) { + //afscompat_close(); + + if (hKrb4) + FreeLibrary(hKrb4); + if (hKrb5) + FreeLibrary(hKrb5); + if (hProfile) + FreeLibrary(hProfile); + if (hComErr) + FreeLibrary(hComErr); + if (hService) + FreeLibrary(hService); + if (hSecur32) + FreeLibrary(hSecur32); + if (hKrb524) + FreeLibrary(hKrb524); + if (hPsapi) + FreeLibrary(hPsapi); + if (hToolHelp32) + FreeLibrary(hToolHelp32); + + return KHM_ERROR_SUCCESS; +} + +int (*Lcom_err)(LPSTR,long,LPSTR,...); +LPSTR (*Lerror_message)(long); +LPSTR (*Lerror_table_name)(long); + +void Leash_load_com_err_callback(FARPROC ce, + FARPROC em, + FARPROC etn) +{ + (FARPROC)Lcom_err=ce; + (FARPROC)Lerror_message=em; + (FARPROC)Lerror_table_name=etn; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/common/dynimport.h +++ krb5-1.4.4/src/windows/identity/plugins/common/dynimport.h @@ -1,346 +1,346 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_DYNIMPORT_H -#define __KHIMAIRA_DYNIMPORT_H - -/* Dynamic imports */ -#include -#include -#include - -extern HINSTANCE hKrb4; -extern HINSTANCE hKrb5; -extern HINSTANCE hProfile; - -/////////////////////////////////////////////////////////////////////////////// - -#define CCAPI_DLL "krbcc32.dll" -#define KRBCC32_DLL "krbcc32.dll" -#define SERVICE_DLL "advapi32.dll" -#define SECUR32_DLL "secur32.dll" -#define PROFILE_DLL "xpprof32.dll" - -////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include - -//// CCAPI -/* In order to avoid including the private CCAPI headers */ -typedef int cc_int32; - -#define CC_API_VER_1 1 -#define CC_API_VER_2 2 - -#define CCACHE_API cc_int32 - -/* -** The Official Error Codes -*/ -#define CC_NOERROR 0 -#define CC_BADNAME 1 -#define CC_NOTFOUND 2 -#define CC_END 3 -#define CC_IO 4 -#define CC_WRITE 5 -#define CC_NOMEM 6 -#define CC_FORMAT 7 -#define CC_LOCKED 8 -#define CC_BAD_API_VERSION 9 -#define CC_NO_EXIST 10 -#define CC_NOT_SUPP 11 -#define CC_BAD_PARM 12 -#define CC_ERR_CACHE_ATTACH 13 -#define CC_ERR_CACHE_RELEASE 14 -#define CC_ERR_CACHE_FULL 15 -#define CC_ERR_CRED_VERSION 16 - -enum { - CC_CRED_VUNKNOWN = 0, // For validation - CC_CRED_V4 = 1, - CC_CRED_V5 = 2, - CC_CRED_VMAX = 3 // For validation -}; - -typedef struct opaque_dll_control_block_type* apiCB; -typedef struct _infoNC { - char* name; - char* principal; - cc_int32 vers; -} infoNC; - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_initialize, - ( - apiCB** cc_ctx, // < DLL's primary control structure. - // returned here, passed everywhere else - cc_int32 api_version, // > ver supported by caller (use CC_API_VER_1) - cc_int32* api_supported, // < if ~NULL, max ver supported by DLL - const char** vendor // < if ~NULL, vendor name in read only C string - ) -); - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_shutdown, - ( - apiCB** cc_ctx // <> DLL's primary control structure. NULL after - ) -); - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_get_NC_info, - ( - apiCB* cc_ctx, // > DLL's primary control structure - struct _infoNC*** ppNCi // < (NULL before call) null terminated, - // list of a structs (free via cc_free_infoNC()) - ) -); - -TYPEDEF_FUNC( -CCACHE_API, -CALLCONV_C, -cc_free_NC_info, - ( - apiCB* cc_ctx, - struct _infoNC*** ppNCi // < free list of structs returned by - // cc_get_cache_names(). set to NULL on return - ) -); -//// \CCAPI - -extern DWORD AfsAvailable; - -// service definitions -typedef SC_HANDLE (WINAPI *FP_OpenSCManagerA)(char *, char *, DWORD); -typedef SC_HANDLE (WINAPI *FP_OpenServiceA)(SC_HANDLE, char *, DWORD); -typedef BOOL (WINAPI *FP_QueryServiceStatus)(SC_HANDLE, LPSERVICE_STATUS); -typedef BOOL (WINAPI *FP_CloseServiceHandle)(SC_HANDLE); - -////////////////////////////////////////////////////////////////////////////// - -// CCAPI -extern DECL_FUNC_PTR(cc_initialize); -extern DECL_FUNC_PTR(cc_shutdown); -extern DECL_FUNC_PTR(cc_get_NC_info); -extern DECL_FUNC_PTR(cc_free_NC_info); - -// krb4 functions -extern DECL_FUNC_PTR(get_krb_err_txt_entry); -extern DECL_FUNC_PTR(k_isinst); -extern DECL_FUNC_PTR(k_isname); -extern DECL_FUNC_PTR(k_isrealm); -extern DECL_FUNC_PTR(kadm_change_your_password); -extern DECL_FUNC_PTR(kname_parse); -extern DECL_FUNC_PTR(krb_get_cred); -extern DECL_FUNC_PTR(krb_get_krbhst); -extern DECL_FUNC_PTR(krb_get_lrealm); -extern DECL_FUNC_PTR(krb_get_pw_in_tkt); -extern DECL_FUNC_PTR(krb_get_tf_realm); -extern DECL_FUNC_PTR(krb_mk_req); -extern DECL_FUNC_PTR(krb_realmofhost); -extern DECL_FUNC_PTR(tf_init); -extern DECL_FUNC_PTR(tf_close); -extern DECL_FUNC_PTR(tf_get_cred); -extern DECL_FUNC_PTR(tf_get_pname); -extern DECL_FUNC_PTR(tf_get_pinst); -extern DECL_FUNC_PTR(LocalHostAddr); -extern DECL_FUNC_PTR(tkt_string); -extern DECL_FUNC_PTR(krb_set_tkt_string); -extern DECL_FUNC_PTR(initialize_krb_error_func); -extern DECL_FUNC_PTR(initialize_kadm_error_table); -extern DECL_FUNC_PTR(dest_tkt); -extern DECL_FUNC_PTR(lsh_LoadKrb4LeashErrorTables); // XXX -extern DECL_FUNC_PTR(krb_in_tkt); -extern DECL_FUNC_PTR(krb_save_credentials); -extern DECL_FUNC_PTR(krb_get_krbconf2); -extern DECL_FUNC_PTR(krb_get_krbrealm2); -extern DECL_FUNC_PTR(krb_life_to_time); - -// krb5 functions -extern DECL_FUNC_PTR(krb5_change_password); -extern DECL_FUNC_PTR(krb5_get_init_creds_opt_init); -extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_tkt_life); -extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life); -extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_forwardable); -extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_proxiable); -extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life); -extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_address_list); -extern DECL_FUNC_PTR(krb5_get_init_creds_password); -extern DECL_FUNC_PTR(krb5_get_prompt_types); -extern DECL_FUNC_PTR(krb5_build_principal_ext); -extern DECL_FUNC_PTR(krb5_cc_get_name); -extern DECL_FUNC_PTR(krb5_cc_get_type); -extern DECL_FUNC_PTR(krb5_cc_resolve); -extern DECL_FUNC_PTR(krb5_cc_default); -extern DECL_FUNC_PTR(krb5_cc_default_name); -extern DECL_FUNC_PTR(krb5_cc_set_default_name); -extern DECL_FUNC_PTR(krb5_cc_initialize); -extern DECL_FUNC_PTR(krb5_cc_destroy); -extern DECL_FUNC_PTR(krb5_cc_close); -extern DECL_FUNC_PTR(krb5_cc_copy_creds); -extern DECL_FUNC_PTR(krb5_cc_store_cred); -extern DECL_FUNC_PTR(krb5_cc_retrieve_cred); -extern DECL_FUNC_PTR(krb5_cc_get_principal); -extern DECL_FUNC_PTR(krb5_cc_start_seq_get); -extern DECL_FUNC_PTR(krb5_cc_next_cred); -extern DECL_FUNC_PTR(krb5_cc_end_seq_get); -extern DECL_FUNC_PTR(krb5_cc_remove_cred); -extern DECL_FUNC_PTR(krb5_cc_set_flags); -// extern DECL_FUNC_PTR(krb5_cc_get_type); -extern DECL_FUNC_PTR(krb5_free_context); -extern DECL_FUNC_PTR(krb5_free_cred_contents); -extern DECL_FUNC_PTR(krb5_free_principal); -extern DECL_FUNC_PTR(krb5_get_in_tkt_with_password); -extern DECL_FUNC_PTR(krb5_init_context); -extern DECL_FUNC_PTR(krb5_parse_name); -extern DECL_FUNC_PTR(krb5_timeofday); -extern DECL_FUNC_PTR(krb5_timestamp_to_sfstring); -extern DECL_FUNC_PTR(krb5_unparse_name); -extern DECL_FUNC_PTR(krb5_get_credentials); -extern DECL_FUNC_PTR(krb5_mk_req); -extern DECL_FUNC_PTR(krb5_sname_to_principal); -extern DECL_FUNC_PTR(krb5_get_credentials_renew); -extern DECL_FUNC_PTR(krb5_free_data); -extern DECL_FUNC_PTR(krb5_free_data_contents); -// extern DECL_FUNC_PTR(krb5_get_realm_domain); -extern DECL_FUNC_PTR(krb5_free_unparsed_name); -extern DECL_FUNC_PTR(krb5_os_localaddr); -extern DECL_FUNC_PTR(krb5_copy_keyblock_contents); -extern DECL_FUNC_PTR(krb5_copy_data); -extern DECL_FUNC_PTR(krb5_free_creds); -extern DECL_FUNC_PTR(krb5_build_principal); -extern DECL_FUNC_PTR(krb5_get_renewed_creds); -extern DECL_FUNC_PTR(krb5_free_addresses); -extern DECL_FUNC_PTR(krb5_get_default_config_files); -extern DECL_FUNC_PTR(krb5_free_config_files); -extern DECL_FUNC_PTR(krb5_get_default_realm); -extern DECL_FUNC_PTR(krb5_set_default_realm); -extern DECL_FUNC_PTR(krb5_free_ticket); -extern DECL_FUNC_PTR(krb5_decode_ticket); -extern DECL_FUNC_PTR(krb5_get_host_realm); -extern DECL_FUNC_PTR(krb5_free_host_realm); -extern DECL_FUNC_PTR(krb5_c_random_make_octets); -extern DECL_FUNC_PTR(krb5_free_default_realm); - -// Krb524 functions -extern DECL_FUNC_PTR(krb524_init_ets); -extern DECL_FUNC_PTR(krb524_convert_creds_kdc); - -// ComErr functions -extern DECL_FUNC_PTR(com_err); -extern DECL_FUNC_PTR(error_message); - -// Profile functions -extern DECL_FUNC_PTR(profile_init); -extern DECL_FUNC_PTR(profile_flush); -extern DECL_FUNC_PTR(profile_release); -extern DECL_FUNC_PTR(profile_get_subsection_names); -extern DECL_FUNC_PTR(profile_free_list); -extern DECL_FUNC_PTR(profile_get_string); -extern DECL_FUNC_PTR(profile_get_values); -extern DECL_FUNC_PTR(profile_get_relation_names); -extern DECL_FUNC_PTR(profile_clear_relation); -extern DECL_FUNC_PTR(profile_add_relation); -extern DECL_FUNC_PTR(profile_update_relation); -extern DECL_FUNC_PTR(profile_release_string); - -// Service functions -extern DECL_FUNC_PTR(OpenSCManagerA); -extern DECL_FUNC_PTR(OpenServiceA); -extern DECL_FUNC_PTR(QueryServiceStatus); -extern DECL_FUNC_PTR(CloseServiceHandle); -extern DECL_FUNC_PTR(LsaNtStatusToWinError); - -// LSA Functions -extern DECL_FUNC_PTR(LsaConnectUntrusted); -extern DECL_FUNC_PTR(LsaLookupAuthenticationPackage); -extern DECL_FUNC_PTR(LsaCallAuthenticationPackage); -extern DECL_FUNC_PTR(LsaFreeReturnBuffer); -extern DECL_FUNC_PTR(LsaGetLogonSessionData); - -// toolhelp functions -TYPEDEF_FUNC( - HANDLE, - WINAPI, - CreateToolhelp32Snapshot, - (DWORD, DWORD) - ); -TYPEDEF_FUNC( - BOOL, - WINAPI, - Module32First, - (HANDLE, LPMODULEENTRY32) - ); -TYPEDEF_FUNC( - BOOL, - WINAPI, - Module32Next, - (HANDLE, LPMODULEENTRY32) - ); - -// psapi functions -TYPEDEF_FUNC( - DWORD, - WINAPI, - GetModuleFileNameExA, - (HANDLE, HMODULE, LPSTR, DWORD) - ); - -TYPEDEF_FUNC( - BOOL, - WINAPI, - EnumProcessModules, - (HANDLE, HMODULE*, DWORD, LPDWORD) - ); - -#define pGetModuleFileNameEx pGetModuleFileNameExA -#define TOOLHELPDLL "kernel32.dll" -#define PSAPIDLL "psapi.dll" - -// psapi functions -extern DECL_FUNC_PTR(GetModuleFileNameExA); -extern DECL_FUNC_PTR(EnumProcessModules); - -// toolhelp functions -extern DECL_FUNC_PTR(CreateToolhelp32Snapshot); -extern DECL_FUNC_PTR(Module32First); -extern DECL_FUNC_PTR(Module32Next); - -khm_int32 init_imports(void); -khm_int32 exit_imports(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_DYNIMPORT_H +#define __KHIMAIRA_DYNIMPORT_H + +/* Dynamic imports */ +#include +#include +#include + +extern HINSTANCE hKrb4; +extern HINSTANCE hKrb5; +extern HINSTANCE hProfile; + +/////////////////////////////////////////////////////////////////////////////// + +#define CCAPI_DLL "krbcc32.dll" +#define KRBCC32_DLL "krbcc32.dll" +#define SERVICE_DLL "advapi32.dll" +#define SECUR32_DLL "secur32.dll" +#define PROFILE_DLL "xpprof32.dll" + +////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +//// CCAPI +/* In order to avoid including the private CCAPI headers */ +typedef int cc_int32; + +#define CC_API_VER_1 1 +#define CC_API_VER_2 2 + +#define CCACHE_API cc_int32 + +/* +** The Official Error Codes +*/ +#define CC_NOERROR 0 +#define CC_BADNAME 1 +#define CC_NOTFOUND 2 +#define CC_END 3 +#define CC_IO 4 +#define CC_WRITE 5 +#define CC_NOMEM 6 +#define CC_FORMAT 7 +#define CC_LOCKED 8 +#define CC_BAD_API_VERSION 9 +#define CC_NO_EXIST 10 +#define CC_NOT_SUPP 11 +#define CC_BAD_PARM 12 +#define CC_ERR_CACHE_ATTACH 13 +#define CC_ERR_CACHE_RELEASE 14 +#define CC_ERR_CACHE_FULL 15 +#define CC_ERR_CRED_VERSION 16 + +enum { + CC_CRED_VUNKNOWN = 0, // For validation + CC_CRED_V4 = 1, + CC_CRED_V5 = 2, + CC_CRED_VMAX = 3 // For validation +}; + +typedef struct opaque_dll_control_block_type* apiCB; +typedef struct _infoNC { + char* name; + char* principal; + cc_int32 vers; +} infoNC; + +TYPEDEF_FUNC( +CCACHE_API, +CALLCONV_C, +cc_initialize, + ( + apiCB** cc_ctx, // < DLL's primary control structure. + // returned here, passed everywhere else + cc_int32 api_version, // > ver supported by caller (use CC_API_VER_1) + cc_int32* api_supported, // < if ~NULL, max ver supported by DLL + const char** vendor // < if ~NULL, vendor name in read only C string + ) +); + +TYPEDEF_FUNC( +CCACHE_API, +CALLCONV_C, +cc_shutdown, + ( + apiCB** cc_ctx // <> DLL's primary control structure. NULL after + ) +); + +TYPEDEF_FUNC( +CCACHE_API, +CALLCONV_C, +cc_get_NC_info, + ( + apiCB* cc_ctx, // > DLL's primary control structure + struct _infoNC*** ppNCi // < (NULL before call) null terminated, + // list of a structs (free via cc_free_infoNC()) + ) +); + +TYPEDEF_FUNC( +CCACHE_API, +CALLCONV_C, +cc_free_NC_info, + ( + apiCB* cc_ctx, + struct _infoNC*** ppNCi // < free list of structs returned by + // cc_get_cache_names(). set to NULL on return + ) +); +//// \CCAPI + +extern DWORD AfsAvailable; + +// service definitions +typedef SC_HANDLE (WINAPI *FP_OpenSCManagerA)(char *, char *, DWORD); +typedef SC_HANDLE (WINAPI *FP_OpenServiceA)(SC_HANDLE, char *, DWORD); +typedef BOOL (WINAPI *FP_QueryServiceStatus)(SC_HANDLE, LPSERVICE_STATUS); +typedef BOOL (WINAPI *FP_CloseServiceHandle)(SC_HANDLE); + +////////////////////////////////////////////////////////////////////////////// + +// CCAPI +extern DECL_FUNC_PTR(cc_initialize); +extern DECL_FUNC_PTR(cc_shutdown); +extern DECL_FUNC_PTR(cc_get_NC_info); +extern DECL_FUNC_PTR(cc_free_NC_info); + +// krb4 functions +extern DECL_FUNC_PTR(get_krb_err_txt_entry); +extern DECL_FUNC_PTR(k_isinst); +extern DECL_FUNC_PTR(k_isname); +extern DECL_FUNC_PTR(k_isrealm); +extern DECL_FUNC_PTR(kadm_change_your_password); +extern DECL_FUNC_PTR(kname_parse); +extern DECL_FUNC_PTR(krb_get_cred); +extern DECL_FUNC_PTR(krb_get_krbhst); +extern DECL_FUNC_PTR(krb_get_lrealm); +extern DECL_FUNC_PTR(krb_get_pw_in_tkt); +extern DECL_FUNC_PTR(krb_get_tf_realm); +extern DECL_FUNC_PTR(krb_mk_req); +extern DECL_FUNC_PTR(krb_realmofhost); +extern DECL_FUNC_PTR(tf_init); +extern DECL_FUNC_PTR(tf_close); +extern DECL_FUNC_PTR(tf_get_cred); +extern DECL_FUNC_PTR(tf_get_pname); +extern DECL_FUNC_PTR(tf_get_pinst); +extern DECL_FUNC_PTR(LocalHostAddr); +extern DECL_FUNC_PTR(tkt_string); +extern DECL_FUNC_PTR(krb_set_tkt_string); +extern DECL_FUNC_PTR(initialize_krb_error_func); +extern DECL_FUNC_PTR(initialize_kadm_error_table); +extern DECL_FUNC_PTR(dest_tkt); +extern DECL_FUNC_PTR(lsh_LoadKrb4LeashErrorTables); // XXX +extern DECL_FUNC_PTR(krb_in_tkt); +extern DECL_FUNC_PTR(krb_save_credentials); +extern DECL_FUNC_PTR(krb_get_krbconf2); +extern DECL_FUNC_PTR(krb_get_krbrealm2); +extern DECL_FUNC_PTR(krb_life_to_time); + +// krb5 functions +extern DECL_FUNC_PTR(krb5_change_password); +extern DECL_FUNC_PTR(krb5_get_init_creds_opt_init); +extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_tkt_life); +extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life); +extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_forwardable); +extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_proxiable); +extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_renew_life); +extern DECL_FUNC_PTR(krb5_get_init_creds_opt_set_address_list); +extern DECL_FUNC_PTR(krb5_get_init_creds_password); +extern DECL_FUNC_PTR(krb5_get_prompt_types); +extern DECL_FUNC_PTR(krb5_build_principal_ext); +extern DECL_FUNC_PTR(krb5_cc_get_name); +extern DECL_FUNC_PTR(krb5_cc_get_type); +extern DECL_FUNC_PTR(krb5_cc_resolve); +extern DECL_FUNC_PTR(krb5_cc_default); +extern DECL_FUNC_PTR(krb5_cc_default_name); +extern DECL_FUNC_PTR(krb5_cc_set_default_name); +extern DECL_FUNC_PTR(krb5_cc_initialize); +extern DECL_FUNC_PTR(krb5_cc_destroy); +extern DECL_FUNC_PTR(krb5_cc_close); +extern DECL_FUNC_PTR(krb5_cc_copy_creds); +extern DECL_FUNC_PTR(krb5_cc_store_cred); +extern DECL_FUNC_PTR(krb5_cc_retrieve_cred); +extern DECL_FUNC_PTR(krb5_cc_get_principal); +extern DECL_FUNC_PTR(krb5_cc_start_seq_get); +extern DECL_FUNC_PTR(krb5_cc_next_cred); +extern DECL_FUNC_PTR(krb5_cc_end_seq_get); +extern DECL_FUNC_PTR(krb5_cc_remove_cred); +extern DECL_FUNC_PTR(krb5_cc_set_flags); +// extern DECL_FUNC_PTR(krb5_cc_get_type); +extern DECL_FUNC_PTR(krb5_free_context); +extern DECL_FUNC_PTR(krb5_free_cred_contents); +extern DECL_FUNC_PTR(krb5_free_principal); +extern DECL_FUNC_PTR(krb5_get_in_tkt_with_password); +extern DECL_FUNC_PTR(krb5_init_context); +extern DECL_FUNC_PTR(krb5_parse_name); +extern DECL_FUNC_PTR(krb5_timeofday); +extern DECL_FUNC_PTR(krb5_timestamp_to_sfstring); +extern DECL_FUNC_PTR(krb5_unparse_name); +extern DECL_FUNC_PTR(krb5_get_credentials); +extern DECL_FUNC_PTR(krb5_mk_req); +extern DECL_FUNC_PTR(krb5_sname_to_principal); +extern DECL_FUNC_PTR(krb5_get_credentials_renew); +extern DECL_FUNC_PTR(krb5_free_data); +extern DECL_FUNC_PTR(krb5_free_data_contents); +// extern DECL_FUNC_PTR(krb5_get_realm_domain); +extern DECL_FUNC_PTR(krb5_free_unparsed_name); +extern DECL_FUNC_PTR(krb5_os_localaddr); +extern DECL_FUNC_PTR(krb5_copy_keyblock_contents); +extern DECL_FUNC_PTR(krb5_copy_data); +extern DECL_FUNC_PTR(krb5_free_creds); +extern DECL_FUNC_PTR(krb5_build_principal); +extern DECL_FUNC_PTR(krb5_get_renewed_creds); +extern DECL_FUNC_PTR(krb5_free_addresses); +extern DECL_FUNC_PTR(krb5_get_default_config_files); +extern DECL_FUNC_PTR(krb5_free_config_files); +extern DECL_FUNC_PTR(krb5_get_default_realm); +extern DECL_FUNC_PTR(krb5_set_default_realm); +extern DECL_FUNC_PTR(krb5_free_ticket); +extern DECL_FUNC_PTR(krb5_decode_ticket); +extern DECL_FUNC_PTR(krb5_get_host_realm); +extern DECL_FUNC_PTR(krb5_free_host_realm); +extern DECL_FUNC_PTR(krb5_c_random_make_octets); +extern DECL_FUNC_PTR(krb5_free_default_realm); + +// Krb524 functions +extern DECL_FUNC_PTR(krb524_init_ets); +extern DECL_FUNC_PTR(krb524_convert_creds_kdc); + +// ComErr functions +extern DECL_FUNC_PTR(com_err); +extern DECL_FUNC_PTR(error_message); + +// Profile functions +extern DECL_FUNC_PTR(profile_init); +extern DECL_FUNC_PTR(profile_flush); +extern DECL_FUNC_PTR(profile_release); +extern DECL_FUNC_PTR(profile_get_subsection_names); +extern DECL_FUNC_PTR(profile_free_list); +extern DECL_FUNC_PTR(profile_get_string); +extern DECL_FUNC_PTR(profile_get_values); +extern DECL_FUNC_PTR(profile_get_relation_names); +extern DECL_FUNC_PTR(profile_clear_relation); +extern DECL_FUNC_PTR(profile_add_relation); +extern DECL_FUNC_PTR(profile_update_relation); +extern DECL_FUNC_PTR(profile_release_string); + +// Service functions +extern DECL_FUNC_PTR(OpenSCManagerA); +extern DECL_FUNC_PTR(OpenServiceA); +extern DECL_FUNC_PTR(QueryServiceStatus); +extern DECL_FUNC_PTR(CloseServiceHandle); +extern DECL_FUNC_PTR(LsaNtStatusToWinError); + +// LSA Functions +extern DECL_FUNC_PTR(LsaConnectUntrusted); +extern DECL_FUNC_PTR(LsaLookupAuthenticationPackage); +extern DECL_FUNC_PTR(LsaCallAuthenticationPackage); +extern DECL_FUNC_PTR(LsaFreeReturnBuffer); +extern DECL_FUNC_PTR(LsaGetLogonSessionData); + +// toolhelp functions +TYPEDEF_FUNC( + HANDLE, + WINAPI, + CreateToolhelp32Snapshot, + (DWORD, DWORD) + ); +TYPEDEF_FUNC( + BOOL, + WINAPI, + Module32First, + (HANDLE, LPMODULEENTRY32) + ); +TYPEDEF_FUNC( + BOOL, + WINAPI, + Module32Next, + (HANDLE, LPMODULEENTRY32) + ); + +// psapi functions +TYPEDEF_FUNC( + DWORD, + WINAPI, + GetModuleFileNameExA, + (HANDLE, HMODULE, LPSTR, DWORD) + ); + +TYPEDEF_FUNC( + BOOL, + WINAPI, + EnumProcessModules, + (HANDLE, HMODULE*, DWORD, LPDWORD) + ); + +#define pGetModuleFileNameEx pGetModuleFileNameExA +#define TOOLHELPDLL "kernel32.dll" +#define PSAPIDLL "psapi.dll" + +// psapi functions +extern DECL_FUNC_PTR(GetModuleFileNameExA); +extern DECL_FUNC_PTR(EnumProcessModules); + +// toolhelp functions +extern DECL_FUNC_PTR(CreateToolhelp32Snapshot); +extern DECL_FUNC_PTR(Module32First); +extern DECL_FUNC_PTR(Module32Next); + +khm_int32 init_imports(void); +khm_int32 exit_imports(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/common/Makefile +++ krb5-1.4.4/src/windows/identity/plugins/common/Makefile @@ -1,43 +1,43 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=plugins\common -!include <../../config/Makefile.w32> - -INCFILES= \ - $(INCDIR)\krb5common.h \ - $(INCDIR)\dynimport.h - -OBJFILES= \ - $(LIBDIR)\krb5common.obj \ - $(LIBDIR)\dynimport.obj - -all: mkdirs $(INCFILES) $(OBJFILES) - -clean:: - $(RM) $(INCFILES) - $(RM) $(OBJFILES) - -{}.c{$(LIBDIR)}.obj: - $(C2OBJ) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=plugins\common +!include <../../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\krb5common.h \ + $(INCDIR)\dynimport.h + +OBJFILES= \ + $(LIBDIR)\krb5common.obj \ + $(LIBDIR)\dynimport.obj + +all: mkdirs $(INCFILES) $(OBJFILES) + +clean:: + $(RM) $(INCFILES) + $(RM) $(OBJFILES) + +{}.c{$(LIBDIR)}.obj: + $(C2OBJ) --- krb5-1.4.4.orig/src/windows/identity/plugins/common/krb5common.h +++ krb5-1.4.4/src/windows/identity/plugins/common/krb5common.h @@ -1,56 +1,56 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/* Adapted from multiple Leash header files */ - -#ifndef __KHIMAIRA_KRB5COMMON_H -#define __KHIMAIRA_KRB5COMMON_H - -#include - -#ifndef NO_KRB5 -int khm_krb5_error(krb5_error_code rc, LPCSTR FailedFunctionName, - int FreeContextFlag, krb5_context *ctx, - krb5_ccache *cache); - -int -khm_krb5_get_error_string(krb5_error_code rc, - wchar_t * buffer, - khm_size cb_buffer); - -int khm_krb5_initialize(khm_handle ident, krb5_context *, krb5_ccache *); - -khm_int32 KHMAPI -khm_krb5_find_ccache_for_identity(khm_handle ident, krb5_context *pctx, - void * buffer, khm_size * pcbbuf); - -khm_int32 KHMAPI -khm_get_identity_expiration_time(krb5_context ctx, krb5_ccache cc, - khm_handle ident, - krb5_timestamp * pexpiration); -#endif /* NO_KRB5 */ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/* Adapted from multiple Leash header files */ + +#ifndef __KHIMAIRA_KRB5COMMON_H +#define __KHIMAIRA_KRB5COMMON_H + +#include + +#ifndef NO_KRB5 +int khm_krb5_error(krb5_error_code rc, LPCSTR FailedFunctionName, + int FreeContextFlag, krb5_context *ctx, + krb5_ccache *cache); + +int +khm_krb5_get_error_string(krb5_error_code rc, + wchar_t * buffer, + khm_size cb_buffer); + +int khm_krb5_initialize(khm_handle ident, krb5_context *, krb5_ccache *); + +khm_int32 KHMAPI +khm_krb5_find_ccache_for_identity(khm_handle ident, krb5_context *pctx, + void * buffer, khm_size * pcbbuf); + +khm_int32 KHMAPI +khm_get_identity_expiration_time(krb5_context ctx, krb5_ccache cc, + khm_handle ident, + krb5_timestamp * pexpiration); +#endif /* NO_KRB5 */ + +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/krb5identpro.c +++ krb5-1.4.4/src/windows/identity/plugins/krb5/krb5identpro.c @@ -1,1644 +1,1644 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#include -#include -#include - -#define K5_NCID_UN_LABEL (KHUI_CW_ID_MIN + 0) -#define K5_NCID_UN (KHUI_CW_ID_MIN + 1) -#define K5_NCID_REALM_LABEL (KHUI_CW_ID_MIN + 2) -#define K5_NCID_REALM (KHUI_CW_ID_MIN + 3) - -#define NC_UNCHANGE_TIMEOUT 3000 -#define NC_UNCHANGE_TIMER 2 -#define NC_REALMCHANGE_TIMEOUT NC_UNCHANGE_TIMEOUT -#define NC_REALMCHANGE_TIMER 3 - -typedef struct tag_k5_new_cred_data { - HWND hw_username_label; - HWND hw_username; - HWND hw_realm_label; - HWND hw_realm; -} k5_new_cred_data; - -/* Runs in the UI thread */ -int -k5_get_realm_from_nc(khui_new_creds * nc, - wchar_t * buf, - khm_size cch_buf) { - k5_new_cred_data * d; - - d = (k5_new_cred_data *) nc->ident_aux; - return GetWindowText(d->hw_realm, buf, (int) cch_buf); -} - -/* set the primary identity of a new credentials dialog depending on - the selection of the username and realm - - Runs in the UI thread -*/ -static void -set_identity_from_ui(khui_new_creds * nc, - k5_new_cred_data * d) { - wchar_t un[KCDB_IDENT_MAXCCH_NAME]; - wchar_t * realm; - khm_size cch; - khm_size cch_left; - khm_handle ident; - LRESULT idx = CB_ERR; - khm_int32 rv = KHM_ERROR_SUCCESS; - - cch = GetWindowTextLength(d->hw_username); - - /* we already set the max length of the edit control to be this. - shouldn't exceed it unless the edit control is confused. */ - assert(cch < KCDB_IDENT_MAXCCH_NAME - 1); - - GetWindowText(d->hw_username, un, ARRAYLENGTH(un)); - - realm = khm_get_realm_from_princ(un); - if (realm) /* realm was specified */ - goto _set_ident; - - /* the cch we got from GetWindowTextLength can not be trusted to - be exact. For caveats see MSDN for GetWindowTextLength. */ - StringCchLength(un, KCDB_IDENT_MAXCCH_NAME, &cch); - - if (cch >= KCDB_IDENT_MAXCCH_NAME - 3) { - /* has to allow space for the '@' and at least a single - character realm, and the NULL terminator. */ - rv = KHM_ERROR_TOO_LONG; - goto _set_null_ident; - } - - realm = un + cch; /* now points at terminating NULL */ - cch_left = KCDB_IDENT_MAXCCH_NAME - cch; - - *realm++ = L'@'; - *realm = L'\0'; - cch_left--; - - cch = GetWindowTextLength(d->hw_realm); - if (cch == 0 || cch >= cch_left) { - rv = KHM_ERROR_INVALID_NAME; - goto _set_null_ident; - } - - GetWindowText(d->hw_realm, realm, (int) cch_left); - - _set_ident: - if (KHM_FAILED(rv = kcdb_identity_create(un, - KCDB_IDENT_FLAG_CREATE, - &ident))) { - goto _set_null_ident; - } - - khui_cw_set_primary_id(nc, ident); - - kcdb_identity_release(ident); - return; - - _set_null_ident: - { - khui_new_creds_by_type * nct = NULL; - wchar_t cmsg[256]; - - khui_cw_find_type(nc, credtype_id_krb5, &nct); - if (nct && nct->hwnd_panel) { - - switch(rv) { - case KHM_ERROR_TOO_LONG: - LoadString(hResModule, IDS_NCERR_IDENT_TOO_LONG, - cmsg, ARRAYLENGTH(cmsg)); - break; - - case KHM_ERROR_INVALID_NAME: - LoadString(hResModule, IDS_NCERR_IDENT_INVALID, - cmsg, ARRAYLENGTH(cmsg)); - break; - - default: - LoadString(hResModule, IDS_NCERR_IDENT_UNKNOWN, - cmsg, ARRAYLENGTH(cmsg)); - } - - SendMessage(nct->hwnd_panel, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, K5_SET_CRED_MSG), - (LPARAM) cmsg); - } - - khui_cw_set_primary_id(nc, NULL); - } - return; -} - -/* runs in the UI thread */ -static BOOL -update_crossfeed(khui_new_creds * nc, - k5_new_cred_data * d, - int ctrl_id_src) { - wchar_t un[KCDB_IDENT_MAXCCH_NAME]; - wchar_t * un_realm; - wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; - khm_size cch; - khm_size cch_left; - int idx; - - cch = (khm_size) GetWindowTextLength(d->hw_username); -#ifdef DEBUG - assert(cch < KCDB_IDENT_MAXCCH_NAME); -#endif - if (cch == 0) - return FALSE; - - GetWindowText(d->hw_username, - un, - ARRAYLENGTH(un)); - - un_realm = khm_get_realm_from_princ(un); - - if (un_realm == NULL) - return FALSE; - - if (ctrl_id_src == K5_NCID_UN) { - - idx = (int)SendMessage(d->hw_realm, - CB_FINDSTRINGEXACT, - (WPARAM) -1, - (LPARAM) un_realm); - - if (idx != CB_ERR) { - wchar_t srealm[KCDB_IDENT_MAXCCH_NAME]; - - cch = SendMessage(d->hw_realm, - CB_GETLBTEXTLEN, - (WPARAM) idx, - 0); - -#ifdef DEBUG - assert(cch < ARRAYLENGTH(srealm) - 1); -#endif - SendMessage(d->hw_realm, - CB_GETLBTEXT, - (WPARAM) idx, - (LPARAM) srealm); - - if (!_wcsicmp(srealm, un_realm) && wcscmp(srealm, un_realm)) { - /* differ only by case */ - - StringCchCopy(un_realm, ARRAYLENGTH(un) - (un_realm - un), - srealm); - - SetWindowText(d->hw_username, un); - } - } - - SendMessage(d->hw_realm, - CB_SELECTSTRING, - (WPARAM) -1, - (LPARAM) un_realm); - - SetWindowText(d->hw_realm, - un_realm); - - return TRUE; - } - /* else... */ - - cch_left = KCDB_IDENT_MAXCCH_NAME - (un_realm - un); - - cch = (khm_size) GetWindowTextLength(d->hw_realm); - -#ifdef DEBUG - assert(cch < KCDB_IDENT_MAXCCH_NAME); -#endif - if (cch == 0) - return FALSE; - - GetWindowText(d->hw_realm, realm, - ARRAYLENGTH(realm)); - - idx = (int)SendMessage(d->hw_realm, - CB_FINDSTRINGEXACT, - (WPARAM) -1, - (LPARAM) realm); - - if (idx != CB_ERR) { - wchar_t srealm[KCDB_IDENT_MAXCCH_NAME]; - - SendMessage(d->hw_realm, - CB_GETLBTEXT, - (WPARAM) idx, - (LPARAM) srealm); - - if (!_wcsicmp(srealm, realm) && wcscmp(srealm, realm)) { - StringCbCopy(realm, sizeof(realm), srealm); - - SetWindowText(d->hw_realm, srealm); - } - } - - StringCchCopy(un_realm, cch_left, realm); - - SendMessage(d->hw_username, - CB_SELECTSTRING, - (WPARAM) -1, - (LPARAM) un); - - SetWindowText(d->hw_username, un); - - return TRUE; -} - -/* Handle window messages for the identity specifiers - - runs in UI thread */ -static LRESULT -handle_wnd_msg(khui_new_creds * nc, - HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - k5_new_cred_data * d; - - d = (k5_new_cred_data *) nc->ident_aux; - - switch(uMsg) { - case WM_COMMAND: - switch(wParam) { - case MAKEWPARAM(K5_NCID_UN, CBN_EDITCHANGE): - /* the username has changed. Instead of handling this - for every keystroke, set a timer that elapses some - time afterwards and then handle the event. */ - SetTimer(hwnd, NC_UNCHANGE_TIMER, - NC_UNCHANGE_TIMEOUT, NULL); - return TRUE; - - case MAKEWPARAM(K5_NCID_UN, CBN_KILLFOCUS): - case MAKEWPARAM(K5_NCID_UN, CBN_CLOSEUP): - KillTimer(hwnd, NC_UNCHANGE_TIMER); - - update_crossfeed(nc,d,K5_NCID_UN); - set_identity_from_ui(nc,d); - return TRUE; - - case MAKEWPARAM(K5_NCID_REALM,CBN_EDITCHANGE): - SetTimer(hwnd, NC_REALMCHANGE_TIMER, - NC_REALMCHANGE_TIMEOUT, NULL); - return TRUE; - - case MAKEWPARAM(K5_NCID_REALM,CBN_KILLFOCUS): - case MAKEWPARAM(K5_NCID_REALM,CBN_CLOSEUP): - KillTimer(hwnd, NC_REALMCHANGE_TIMER); - - update_crossfeed(nc,d,K5_NCID_REALM); - set_identity_from_ui(nc, d); - return TRUE; - } - break; - - case WM_TIMER: - if(wParam == NC_UNCHANGE_TIMER) { - KillTimer(hwnd, NC_UNCHANGE_TIMER); - - update_crossfeed(nc, d, K5_NCID_UN); - set_identity_from_ui(nc,d); - return TRUE; - } else if (wParam == NC_REALMCHANGE_TIMER) { - KillTimer(hwnd, NC_REALMCHANGE_TIMER); - - update_crossfeed(nc, d, K5_NCID_REALM); - set_identity_from_ui(nc, d); - return TRUE; - } - break; - } - return FALSE; -} - -/* UI Callback - - runs in UI thread */ -static LRESULT KHMAPI -ui_cb(khui_new_creds * nc, - UINT cmd, - HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - - k5_new_cred_data * d; - - d = (k5_new_cred_data *) nc->ident_aux; - - switch(cmd) { - case WMNC_IDENT_INIT: - { - wchar_t defident[KCDB_IDENT_MAXCCH_NAME]; - wchar_t wbuf[1024]; - wchar_t * ms = NULL; - wchar_t * t; - wchar_t * defrealm = NULL; - LRESULT lr; - khm_size cb_ms; - khm_size cb; - HWND hw_parent; - khm_int32 rv; - khm_handle hident; - - hw_parent = (HWND) lParam; - defident[0] = L'\0'; - -#ifdef DEBUG - assert(d == NULL); - assert(hw_parent != NULL); -#endif - - d = PMALLOC(sizeof(*d)); - assert(d); - ZeroMemory(d, sizeof(*d)); - - khui_cw_lock_nc(nc); - nc->ident_aux = (LPARAM) d; - khui_cw_unlock_nc(nc); - - LoadString(hResModule, IDS_NC_USERNAME, - wbuf, ARRAYLENGTH(wbuf)); - - d->hw_username_label = CreateWindow - (L"STATIC", - wbuf, - SS_SIMPLE | WS_CHILD | WS_VISIBLE, - 0, 0, 100, 100, /* bogus values */ - hw_parent, - (HMENU) K5_NCID_UN_LABEL, - hInstance, - NULL); - assert(d->hw_username_label != NULL); - - d->hw_username = CreateWindow - (L"COMBOBOX", - L"", - CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | - WS_CHILD | WS_VISIBLE | WS_TABSTOP, - 0, 0, 100, 100, /* bogus values */ - hw_parent, - (HMENU) K5_NCID_UN, - hInstance, - NULL); - assert(d->hw_username != NULL); - - SendMessage(d->hw_username, - CB_LIMITTEXT, - (WPARAM)(KCDB_IDENT_MAXCCH_NAME - 1), - 0); - - SendMessage(d->hw_username, - CB_SETEXTENDEDUI, - (WPARAM) TRUE, - 0); - - khui_cw_add_control_row(nc, - d->hw_username_label, - d->hw_username, - KHUI_CTRLSIZE_SMALL); - - LoadString(hResModule, IDS_NC_REALM, - wbuf, ARRAYLENGTH(wbuf)); - - d->hw_realm_label = CreateWindow - (L"STATIC", - wbuf, - SS_SIMPLE | WS_CHILD | WS_VISIBLE, - 0, 0, 100, 100, /* bogus */ - hw_parent, - (HMENU) K5_NCID_REALM_LABEL, - hInstance, - NULL); - assert(d->hw_realm_label != NULL); - - d->hw_realm = CreateWindow - (L"COMBOBOX", - L"", - CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | - WS_CHILD | WS_VISIBLE | WS_TABSTOP, - 0, 0, 100, 100, /* bogus */ - hw_parent, - (HMENU) K5_NCID_REALM, - hInstance, - NULL); - assert(d->hw_realm != NULL); - - SendMessage(d->hw_realm, - CB_LIMITTEXT, - (WPARAM) (KCDB_IDENT_MAXCCH_NAME - 1), - 0); - - SendMessage(d->hw_realm, - CB_SETEXTENDEDUI, - (WPARAM) TRUE, - 0); - - khui_cw_add_control_row(nc, - d->hw_realm_label, - d->hw_realm, - KHUI_CTRLSIZE_SMALL); - - /* add the LRU realms and principals to the dropdown - lists */ - rv = khc_read_multi_string(csp_params, - L"LRUPrincipals", - NULL, - &cb_ms); - - if (rv != KHM_ERROR_TOO_LONG || cb_ms <= sizeof(wchar_t) * 2) - goto _add_lru_realms; - - ms = PMALLOC(cb_ms); - assert(ms != NULL); - - cb = cb_ms; - rv = khc_read_multi_string(csp_params, - L"LRUPrincipals", - ms, - &cb); - - assert(KHM_SUCCEEDED(rv)); - - /* the first of these is considered the default identity - if no other default is known */ - StringCbCopy(defident, sizeof(defident), ms); - - t = ms; - while(t && *t) { - SendMessage(d->hw_username, - CB_ADDSTRING, - 0, - (LPARAM) t); - - t = multi_string_next(t); - } - - _add_lru_realms: - /* add the default realm first */ - defrealm = khm_krb5_get_default_realm(); - if (defrealm) { - SendMessage(d->hw_realm, - CB_ADDSTRING, - 0, - (LPARAM) defrealm); - } - - rv = khc_read_multi_string(csp_params, - L"LRURealms", - NULL, - &cb); - - if (rv != KHM_ERROR_TOO_LONG) - goto _done_adding_lru; - - if (ms != NULL) { - if (cb_ms < cb) { - PFREE(ms); - ms = PMALLOC(cb); - assert(ms); - cb_ms = cb; - } - } else { - ms = PMALLOC(cb); - cb_ms = cb; - } - - rv = khc_read_multi_string(csp_params, - L"LRURealms", - ms, - &cb); - - assert(KHM_SUCCEEDED(rv)); - - for (t = ms; t && *t; t = multi_string_next(t)) { - lr = SendMessage(d->hw_realm, - CB_FINDSTRINGEXACT, - (WPARAM) -1, - (LPARAM) t); - if (lr != CB_ERR) - continue; - - SendMessage(d->hw_realm, - CB_ADDSTRING, - 0, - (LPARAM) t); - } - _done_adding_lru: - - { - khm_int32 inc_realms = 0; - - if (KHM_FAILED(khc_read_int32(csp_params, - L"UseFullRealmList", - &inc_realms)) || - !inc_realms) - goto _done_adding_all_realms; - } - - if(ms) - PFREE(ms); - - ms = khm_krb5_get_realm_list(); - if(ms) { - for (t = ms; t && *t; t = multi_string_next(t)) { - lr = SendMessage(d->hw_realm, - CB_FINDSTRINGEXACT, - (WPARAM) -1, - (LPARAM) t); - if (lr != CB_ERR) - continue; - - SendMessage(d->hw_realm, - CB_ADDSTRING, - 0, - (LPARAM) t); - } - } - _done_adding_all_realms: - - /* set the current selection of the realms list */ - if (defrealm) { - SendMessage(d->hw_realm, - CB_SELECTSTRING, - (WPARAM) -1, - (LPARAM) defrealm); - } else { - SendMessage(d->hw_realm, - CB_SETCURSEL, - (WPARAM) 0, - (LPARAM) 0); - } - - if (defrealm) - PFREE(defrealm); - - if (ms) - PFREE(ms); - - /* now see about that default identity */ - if (nc->ctx.identity) { - cb = sizeof(defident); - kcdb_identity_get_name(nc->ctx.identity, - defident, - &cb); - } - - if (defident[0] == L'\0' && - KHM_SUCCEEDED(kcdb_identity_get_default(&hident))) { - cb = sizeof(defident); - kcdb_identity_get_name(hident, defident, &cb); - kcdb_identity_release(hident); - } - - if (defident[0] == L'\0') { - DWORD dw; - - dw = ARRAYLENGTH(defident); - GetUserName(defident, &dw); - } - - t = khm_get_realm_from_princ(defident); - if (t) { - /* there is a realm */ - assert(t != defident); - *--t = L'\0'; - t++; - - SendMessage(d->hw_realm, - CB_SELECTSTRING, - (WPARAM) -1, - (LPARAM) t); - - SendMessage(d->hw_realm, - WM_SETTEXT, - 0, - (LPARAM) t); - } - - if (defident[0] != L'\0') { - /* there is a username */ - SendMessage(d->hw_username, - CB_SELECTSTRING, - (WPARAM) -1, - (LPARAM) defident); - - SendMessage(d->hw_username, - WM_SETTEXT, - 0, - (LPARAM) defident); - } - - set_identity_from_ui(nc, d); - } - return TRUE; - - case WMNC_IDENT_WMSG: - return handle_wnd_msg(nc, hwnd, uMsg, wParam, lParam); - - case WMNC_IDENT_EXIT: - { -#ifdef DEBUG - assert(d != NULL); -#endif - khui_cw_lock_nc(nc); - nc->ident_aux = 0; - khui_cw_unlock_nc(nc); - - /* since we created all the windows as child windows of - the new creds window, they will be destroyed when that - window is destroyed. */ - PFREE(d); - } - return TRUE; - } - return FALSE; -} - -static khm_int32 -k5_ident_valiate_name(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - krb5_principal princ = NULL; - char princ_name[KCDB_IDENT_MAXCCH_NAME]; - kcdb_ident_name_xfer * nx; - krb5_error_code code; - - nx = (kcdb_ident_name_xfer *) vparam; - - if(UnicodeStrToAnsi(princ_name, sizeof(princ_name), - nx->name_src) == 0) { - nx->result = KHM_ERROR_INVALID_NAME; - return KHM_ERROR_SUCCESS; - } - - assert(k5_identpro_ctx != NULL); - - code = pkrb5_parse_name(k5_identpro_ctx, - princ_name, - &princ); - - if (code) { - nx->result = KHM_ERROR_INVALID_NAME; - return KHM_ERROR_SUCCESS; - } - - if (princ != NULL) - pkrb5_free_principal(k5_identpro_ctx, - princ); - - nx->result = KHM_ERROR_SUCCESS; - - return KHM_ERROR_SUCCESS; -} - -static void -k5_update_last_default_identity(khm_handle ident) { - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - - cb = sizeof(idname); - if (KHM_FAILED(kcdb_identity_get_name(ident, idname, &cb))) - return; - - assert(csp_params); - - khc_write_string(csp_params, L"LastDefaultIdent", idname); -} - -static khm_int32 -k5_ident_set_default(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - - /* Logic for setting the default identity: - - When setting identity I as the default; - - - If KRB5CCNAME is set - - If I["Krb5CCName"] == %KRB5CCNAME% - - do nothing - - Else - - Copy the contents of I["Krb5CCName"] to %KRB5CCNAME - - Set I["Krb5CCName"] to %KRB5CCNAME - - Else - - Set HKCU\Software\MIT\kerberos5,ccname to - "API:".I["Krb5CCName"] - */ - - if (uparam) { - /* an identity is being made default */ - khm_handle def_ident = (khm_handle) vparam; - wchar_t env_ccname[KRB5_MAXCCH_CCNAME]; - wchar_t id_ccname[KRB5_MAXCCH_CCNAME]; - khm_size cb; - DWORD dw; - LONG l; - -#ifdef DEBUG - assert(def_ident != NULL); -#endif - - cb = sizeof(id_ccname); - if (KHM_FAILED(kcdb_identity_get_attr(def_ident, - attr_id_krb5_ccname, - NULL, - id_ccname, - &cb))) - return KHM_ERROR_UNKNOWN; - - khm_krb5_canon_cc_name(id_ccname, sizeof(id_ccname)); - - StringCbLength(id_ccname, sizeof(id_ccname), &cb); - cb += sizeof(wchar_t); - - dw = GetEnvironmentVariable(L"KRB5CCNAME", - env_ccname, - ARRAYLENGTH(env_ccname)); - - if (dw == 0 && - GetLastError() == ERROR_ENVVAR_NOT_FOUND) { - /* KRB5CCNAME not set */ - HKEY hk_ccname; - DWORD dwType; - DWORD dwSize; - wchar_t reg_ccname[KRB5_MAXCCH_CCNAME]; - - l = RegOpenKeyEx(HKEY_CURRENT_USER, - L"Software\\MIT\\kerberos5", - 0, - KEY_READ | KEY_WRITE, - &hk_ccname); - - if (l != ERROR_SUCCESS) - l = RegCreateKeyEx(HKEY_CURRENT_USER, - L"Software\\MIT\\kerberos5", - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ | KEY_WRITE, - NULL, - &hk_ccname, - &dw); - - if (l != ERROR_SUCCESS) - return KHM_ERROR_UNKNOWN; - - dwSize = sizeof(reg_ccname); - - l = RegQueryValueEx(hk_ccname, - L"ccname", - NULL, - &dwType, - (LPBYTE) reg_ccname, - &dwSize); - - if (l != ERROR_SUCCESS || - dwType != REG_SZ || - khm_krb5_cc_name_cmp(reg_ccname, id_ccname)) { - - /* we have to write the new value in */ - - l = RegSetValueEx(hk_ccname, - L"ccname", - 0, - REG_SZ, - (BYTE *) id_ccname, - (DWORD) cb); - } - - RegCloseKey(hk_ccname); - - if (l == ERROR_SUCCESS) { - k5_update_last_default_identity(def_ident); - return KHM_ERROR_SUCCESS; - } else - return KHM_ERROR_UNKNOWN; - - } else if (dw > ARRAYLENGTH(env_ccname)) { - /* buffer was not enough */ -#ifdef DEBUG - assert(FALSE); -#else - return KHM_ERROR_UNKNOWN; -#endif - } else { - /* KRB5CCNAME is set */ - long code; - krb5_context ctx; - - /* if the %KRB5CCNAME is the same as the identity - ccache, then it is already the default. */ - if (!khm_krb5_cc_name_cmp(id_ccname, env_ccname)) { - k5_update_last_default_identity(def_ident); - return KHM_ERROR_SUCCESS; - } - - /* if not, we have to copy the contents of id_ccname - to env_ccname */ - code = pkrb5_init_context(&ctx); - if (code) - return KHM_ERROR_UNKNOWN; - - code = khm_krb5_copy_ccache_by_name(ctx, - env_ccname, - id_ccname); - - if (code == 0) { - k5_update_last_default_identity(def_ident); - khm_krb5_list_tickets(&ctx); - } - - if (ctx) - pkrb5_free_context(ctx); - - return (code == 0)?KHM_ERROR_SUCCESS:KHM_ERROR_UNKNOWN; - } - } else { - /* the default identity is being forgotten */ - - /* we don't really do anything about this case */ - } - - return KHM_ERROR_SUCCESS; -} - -static khm_int32 -k5_ident_get_ui_cb(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - khui_ident_new_creds_cb * cb; - - cb = (khui_ident_new_creds_cb *) vparam; - - *cb = ui_cb; - - return KHM_ERROR_SUCCESS; -} - -static khm_int32 -k5_ident_notify_create(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - - /* a new identity has been created. What we want to do at - this point is to check if the identity belongs to krb5 - and to see if it is the default. */ - - krb5_ccache cc = NULL; - krb5_error_code code; - krb5_principal princ = NULL; - char * princ_nameA = NULL; - wchar_t princ_nameW[KCDB_IDENT_MAXCCH_NAME]; - wchar_t id_nameW[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - khm_handle ident; - - /* if there is a default identity already, we assume we don't need - to check this one. */ - - khm_handle def_ident; - - if (KHM_SUCCEEDED(kcdb_identity_get_default(&def_ident))) { - kcdb_identity_release(def_ident); - - return KHM_ERROR_SUCCESS; - } - - ident = (khm_handle) vparam; - - assert(k5_identpro_ctx != NULL); - - code = pkrb5_cc_default(k5_identpro_ctx, &cc); - if (code) - goto _nc_cleanup; - - code = pkrb5_cc_get_principal(k5_identpro_ctx, - cc, - &princ); - if (code) - goto _nc_cleanup; - - code = pkrb5_unparse_name(k5_identpro_ctx, - princ, - &princ_nameA); - if (code) - goto _nc_cleanup; - - AnsiStrToUnicode(princ_nameW, - sizeof(princ_nameW), - princ_nameA); - - cb = sizeof(id_nameW); - - if (KHM_FAILED(kcdb_identity_get_name(ident, - id_nameW, - &cb))) - goto _nc_cleanup; - - if (!wcscmp(id_nameW, princ_nameW)) { - kcdb_identity_set_default_int(ident); - } - - _nc_cleanup: - if (princ_nameA) - pkrb5_free_unparsed_name(k5_identpro_ctx, - princ_nameA); - if (princ) - pkrb5_free_principal(k5_identpro_ctx, - princ); - if (cc) - pkrb5_cc_close(k5_identpro_ctx, cc); - - return KHM_ERROR_SUCCESS; -} - -static khm_int32 KHMAPI -k5_ident_update_apply_proc(khm_handle cred, - void * rock) { - wchar_t ccname[KRB5_MAXCCH_CCNAME]; - khm_handle tident = (khm_handle) rock; - khm_handle ident = NULL; - khm_int32 t; - khm_int32 flags; - FILETIME t_expire; - FILETIME t_cexpire; - FILETIME t_rexpire; - khm_size cb; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if (KHM_FAILED(kcdb_cred_get_type(cred, &t)) || - t != credtype_id_krb5 || - KHM_FAILED(kcdb_cred_get_identity(cred, &ident))) - return KHM_ERROR_SUCCESS; - - if (!kcdb_identity_is_equal(ident,tident)) - goto _cleanup; - - if (KHM_FAILED(kcdb_cred_get_flags(cred, &flags))) - flags = 0; - - if (flags & KCDB_CRED_FLAG_INITIAL) { - cb = sizeof(t_cexpire); - if (KHM_SUCCEEDED(kcdb_cred_get_attr(cred, - KCDB_ATTR_EXPIRE, - NULL, - &t_cexpire, - &cb))) { - cb = sizeof(t_expire); - if (KHM_FAILED(kcdb_identity_get_attr(tident, - KCDB_ATTR_EXPIRE, - NULL, - &t_expire, - &cb)) || - CompareFileTime(&t_cexpire, &t_expire) > 0) { - goto update_identity; - } - } - } - - goto _cleanup; - - update_identity: - - kcdb_identity_set_attr(tident, KCDB_ATTR_EXPIRE, - &t_cexpire, sizeof(t_cexpire)); - - cb = sizeof(ccname); - if (KHM_SUCCEEDED(kcdb_cred_get_attr(cred, KCDB_ATTR_LOCATION, - NULL, - ccname, - &cb))) { - kcdb_identity_set_attr(tident, attr_id_krb5_ccname, - ccname, cb); - } else { - kcdb_identity_set_attr(tident, attr_id_krb5_ccname, - NULL, 0); - } - - cb = sizeof(t); - if (KHM_SUCCEEDED(kcdb_cred_get_attr(cred, - attr_id_krb5_flags, - NULL, - &t, - &cb))) { - - kcdb_identity_set_attr(tident, attr_id_krb5_flags, - &t, sizeof(t)); - - cb = sizeof(t_rexpire); - if (!(t & TKT_FLG_RENEWABLE) || - KHM_FAILED(kcdb_cred_get_attr(cred, - KCDB_ATTR_RENEW_EXPIRE, - NULL, - &t_rexpire, - &cb))) { - kcdb_identity_set_attr(tident, KCDB_ATTR_RENEW_EXPIRE, - NULL, 0); - } else { - kcdb_identity_set_attr(tident, KCDB_ATTR_RENEW_EXPIRE, - &t_rexpire, sizeof(t_rexpire)); - } - } else { - kcdb_identity_set_attr(tident, attr_id_krb5_flags, - NULL, 0); - kcdb_identity_set_attr(tident, KCDB_ATTR_RENEW_EXPIRE, - NULL, 0); - } - - rv = KHM_ERROR_EXIT; - - _cleanup: - if (ident) - kcdb_identity_release(ident); - - return rv; -} - -static khm_int32 -k5_ident_update(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - - khm_handle ident; - khm_handle tident; - krb5_ccache cc = NULL; - char * ccname; - krb5_error_code code; - khm_size cb; - wchar_t wid_ccname[MAX_PATH]; - wchar_t w_ccname[MAX_PATH]; - - ident = (khm_handle) vparam; - if (ident == NULL) - return KHM_ERROR_SUCCESS; - - kcdb_credset_apply(NULL, - k5_ident_update_apply_proc, - (void *) ident); - - if (KHM_SUCCEEDED(kcdb_identity_get_default(&tident))) { - kcdb_identity_release(tident); - goto _iu_cleanup; - } - - cb = sizeof(wid_ccname); - if (KHM_FAILED(kcdb_identity_get_attr(ident, - attr_id_krb5_ccname, - NULL, - wid_ccname, - &cb))) - goto _iu_cleanup; - - if(k5_identpro_ctx == NULL) - goto _iu_cleanup; - - code = pkrb5_cc_default(k5_identpro_ctx, &cc); - if (code) - goto _iu_cleanup; - - ccname = pkrb5_cc_get_name(k5_identpro_ctx, cc); - if (ccname == NULL) - goto _iu_cleanup; - - AnsiStrToUnicode(w_ccname, sizeof(w_ccname), ccname); - - khm_krb5_canon_cc_name(w_ccname, sizeof(w_ccname)); - khm_krb5_canon_cc_name(wid_ccname, sizeof(wid_ccname)); - - if (!_wcsicmp(w_ccname, wid_ccname)) - kcdb_identity_set_default_int(ident); - - _iu_cleanup: - if (cc && k5_identpro_ctx) - pkrb5_cc_close(k5_identpro_ctx, cc); - - return KHM_ERROR_SUCCESS; -} - -static khm_boolean -k5_refresh_default_identity(krb5_context ctx) { - /* just like notify_create, except now we set the default identity - based on what we find in the configuration */ - krb5_ccache cc = NULL; - krb5_error_code code; - krb5_principal princ = NULL; - char * princ_nameA = NULL; - wchar_t princ_nameW[KCDB_IDENT_MAXCCH_NAME]; - khm_handle ident = NULL; - khm_boolean found_default = FALSE; - - assert(ctx != NULL); - - code = pkrb5_cc_default(ctx, &cc); - if (code) - goto _nc_cleanup; - - code = pkrb5_cc_get_principal(ctx, cc, &princ); - if (code) - goto _nc_cleanup; - - code = pkrb5_unparse_name(ctx, princ, &princ_nameA); - if (code) - goto _nc_cleanup; - - AnsiStrToUnicode(princ_nameW, sizeof(princ_nameW), princ_nameA); - - if (KHM_FAILED(kcdb_identity_create(princ_nameW, 0, &ident))) - goto _nc_cleanup; - - kcdb_identity_set_default_int(ident); - - found_default = TRUE; - - _nc_cleanup: - if (princ_nameA) - pkrb5_free_unparsed_name(ctx, princ_nameA); - - if (princ) - pkrb5_free_principal(ctx, princ); - - if (cc) - pkrb5_cc_close(ctx, cc); - - if (ident) - kcdb_identity_release(ident); - - return found_default; -} - -static khm_int32 -k5_ident_init(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - - khm_boolean found_default; - khm_handle ident; - - found_default = k5_refresh_default_identity(k5_identpro_ctx); - - if (!found_default) { - wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - - cb = sizeof(widname); - - assert(csp_params); - - if (KHM_SUCCEEDED(khc_read_string(csp_params, L"LastDefaultIdent", - widname, &cb))) { - ident = NULL; - kcdb_identity_create(widname, KCDB_IDENT_FLAG_CREATE, &ident); - if (ident) { - kcdb_identity_set_default_int(ident); - kcdb_identity_release(ident); - } - } - } - - return KHM_ERROR_SUCCESS; -} - -static khm_int32 -k5_ident_exit(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - /* don't really do anything */ - return KHM_ERROR_SUCCESS; -} - -/* forward dcl */ -khm_int32 KHMAPI -k5_ident_name_comp_func(const void * dl, khm_size cb_dl, - const void * dr, khm_size cb_dr); - -static khm_int32 -k5_ident_compare_name(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { - kcdb_ident_name_xfer *px; - - px = (kcdb_ident_name_xfer *) vparam; - - /* note that k5_ident_name_comp_func() ignores the size - specifiers. So we can just pass in 0's. */ - px->result = k5_ident_name_comp_func(px->name_src, 0, - px->name_alt, 0); - - return KHM_ERROR_SUCCESS; -} - -#if 0 -/* copy and paste template for ident provider messages */ -static khm_int32 -k5_ident_(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) { -} -#endif - -khm_int32 KHMAPI -k5_msg_ident(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) -{ - switch(msg_subtype) { - case KMSG_IDENT_INIT: - return k5_ident_init(msg_type, - msg_subtype, - uparam, - vparam); - - case KMSG_IDENT_EXIT: - return k5_ident_exit(msg_type, - msg_subtype, - uparam, - vparam); - - case KMSG_IDENT_VALIDATE_NAME: - return k5_ident_valiate_name(msg_type, - msg_subtype, - uparam, - vparam); - - case KMSG_IDENT_VALIDATE_IDENTITY: - /* TODO: handle KMSG_IDENT_VALIDATE_IDENTITY */ - break; - - case KMSG_IDENT_CANON_NAME: - /* TODO: handle KMSG_IDENT_CANON_NAME */ - break; - - case KMSG_IDENT_COMPARE_NAME: - return k5_ident_compare_name(msg_type, - msg_subtype, - uparam, - vparam); - - case KMSG_IDENT_SET_DEFAULT: - return k5_ident_set_default(msg_type, - msg_subtype, - uparam, - vparam); - - case KMSG_IDENT_SET_SEARCHABLE: - /* TODO: handle KMSG_IDENT_SET_SEARCHABLE */ - break; - - case KMSG_IDENT_GET_INFO: - /* TODO: handle KMSG_IDENT_GET_INFO */ - break; - - case KMSG_IDENT_UPDATE: - return k5_ident_update(msg_type, - msg_subtype, - uparam, - vparam); - - case KMSG_IDENT_ENUM_KNOWN: - /* TODO: handle KMSG_IDENT_ENUM_KNOWN */ - break; - - case KMSG_IDENT_GET_UI_CALLBACK: - return k5_ident_get_ui_cb(msg_type, - msg_subtype, - uparam, - vparam); - - case KMSG_IDENT_NOTIFY_CREATE: - return k5_ident_notify_create(msg_type, - msg_subtype, - uparam, - vparam); - } - - return KHM_ERROR_SUCCESS; -} - -/* note that we are ignoring the size specifiers. We can do that - because we are guaranteed that dl and dr point to NULL terminated - unicode strings when used with credential data buffers. We also - use the fact that we are ignoring the size specifiers when we call - this function from k5_ident_compare_name() to avoid calculating the - length of the string. */ -khm_int32 KHMAPI -k5_ident_name_comp_func(const void * dl, khm_size cb_dl, - const void * dr, khm_size cb_dr) { - wchar_t * idl = (wchar_t *) dl; - wchar_t * idr = (wchar_t *) dr; - wchar_t * rl; - wchar_t * rr; - khm_int32 r; - - rl = khm_get_realm_from_princ(idl); - rr = khm_get_realm_from_princ(idr); - - if (rl == NULL && rr == NULL) - return wcscmp(idl, idr); - else if (rl == NULL) - return 1; - else if (rr == NULL) - return -1; - - r = wcscmp(rl, rr); - if (r == 0) - return wcscmp(idl, idr); - else - return r; -} - - -/* Identity change notification thread */ - -HANDLE h_ccname_exit_event; -HANDLE h_ccname_thread; - -DWORD WINAPI k5_ccname_monitor_thread(LPVOID lpParameter) { - krb5_context ctx = 0; - - HKEY hk_ccname; - HANDLE h_notify; - HANDLE h_waits[2]; - - khm_int32 rv = KHM_ERROR_SUCCESS; - DWORD dwType; - DWORD dwSize; - DWORD dwDisp; - wchar_t reg_ccname[KRB5_MAXCCH_CCNAME]; - LONG l; - - l = RegOpenKeyEx(HKEY_CURRENT_USER, - L"Software\\MIT\\kerberos5", - 0, - KEY_READ | KEY_WRITE, - &hk_ccname); - - if (l != ERROR_SUCCESS) - l = RegCreateKeyEx(HKEY_CURRENT_USER, - L"Software\\MIT\\kerberos5", - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ | KEY_WRITE, - NULL, - &hk_ccname, - &dwDisp); - - if (l != ERROR_SUCCESS) { - rv = KHM_ERROR_UNKNOWN; - goto _exit; - } - - dwSize = sizeof(reg_ccname); - - l = RegQueryValueEx(hk_ccname, - L"ccname", - NULL, - &dwType, - (LPBYTE) reg_ccname, - &dwSize); - - if (l != ERROR_SUCCESS || - dwType != REG_SZ) { - - reg_ccname[0] = L'\0'; - } - - l = pkrb5_init_context(&ctx); - - if (l) - goto _exit_0; - - h_notify = CreateEvent(NULL, FALSE, FALSE, L"Local\\Krb5CCNameChangeNotifier"); - - if (h_notify == NULL) - goto _exit_0; - - /* begin wait loop */ - - h_waits[0] = h_ccname_exit_event; - h_waits[1] = h_notify; - - do { - DWORD dwrv; - - l = RegNotifyChangeKeyValue(hk_ccname, FALSE, - REG_NOTIFY_CHANGE_LAST_SET, - h_notify, TRUE); - - if (l != ERROR_SUCCESS) { - rv = KHM_ERROR_UNKNOWN; - break; - } - - dwrv = WaitForMultipleObjects(2, h_waits, FALSE, INFINITE); - - if (dwrv == WAIT_OBJECT_0) { - /* exit! */ - break; - - } else if (dwrv == WAIT_OBJECT_0 + 1) { - /* change notify! */ - wchar_t new_ccname[KRB5_MAXCCH_CCNAME]; - - dwSize = sizeof(new_ccname); - - l = RegQueryValueEx(hk_ccname, - L"ccname", - NULL, - &dwType, - (LPBYTE) new_ccname, - &dwSize); - - if (l != ERROR_SUCCESS || - dwType != REG_SZ) { - new_ccname[0] = L'\0'; - } - - if (_wcsicmp(new_ccname, reg_ccname)) { - k5_refresh_default_identity(ctx); - StringCbCopy(reg_ccname, sizeof(reg_ccname), new_ccname); - } - - } else { - /* something went wrong */ - rv = KHM_ERROR_UNKNOWN; - break; - } - - } while (TRUE); - - CloseHandle(h_notify); - - _exit_0: - - RegCloseKey(hk_ccname); - - if (ctx) - pkrb5_free_context(ctx); - - _exit: - ExitThread(rv); - - /* not reached */ - return rv; -} - -khm_int32 -k5_msg_system_idpro(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) { - - switch(msg_subtype) { - case KMSG_SYSTEM_INIT: - { - - pkrb5_init_context(&k5_identpro_ctx); - kcdb_identity_set_type(credtype_id_krb5); - - if (KHM_FAILED(kcdb_type_get_id(TYPENAME_KRB5_PRINC, - &type_id_krb5_princ))) { - kcdb_type dt; - kcdb_type * pstr; - - kcdb_type_get_info(KCDB_TYPE_STRING, &pstr); - - ZeroMemory(&dt, sizeof(dt)); - dt.name = TYPENAME_KRB5_PRINC; - dt.id = KCDB_TYPE_INVALID; - dt.flags = KCDB_TYPE_FLAG_CB_AUTO; - dt.cb_min = pstr->cb_min; - dt.cb_max = pstr->cb_max; - dt.toString = pstr->toString; - dt.isValid = pstr->isValid; - dt.comp = k5_ident_name_comp_func; - dt.dup = pstr->dup; - - kcdb_type_register(&dt, &type_id_krb5_princ); - - type_regd_krb5_princ = TRUE; - - kcdb_type_release_info(pstr); - } - - if (type_id_krb5_princ != -1) { - kcdb_attrib * attr; - - kcdb_attrib_get_info(KCDB_ATTR_ID_NAME, &attr); - - attr->type = type_id_krb5_princ; - - kcdb_attrib_release_info(attr); - } - - h_ccname_exit_event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (h_ccname_exit_event) { - h_ccname_thread = CreateThread(NULL, - 200 * 1024, - k5_ccname_monitor_thread, - NULL, - 0, - NULL); - } else { - h_ccname_thread = NULL; - } - } - break; - - case KMSG_SYSTEM_EXIT: - { - - if (h_ccname_thread) { - SetEvent(h_ccname_exit_event); - WaitForSingleObject(h_ccname_thread, INFINITE); - CloseHandle(h_ccname_thread); - CloseHandle(h_ccname_exit_event); - - h_ccname_exit_event = NULL; - h_ccname_thread = NULL; - } - - if (k5_identpro_ctx) { - pkrb5_free_context(k5_identpro_ctx); - k5_identpro_ctx = NULL; - } - - if (type_id_krb5_princ != -1) { - kcdb_attrib * attr; - - kcdb_attrib_get_info(KCDB_ATTR_ID_NAME, &attr); - - attr->type = KCDB_TYPE_STRING; - - kcdb_attrib_release_info(attr); - } - - /* allow a brief moment for any stale references to die */ - Sleep(100); - - if (type_regd_krb5_princ) { - kcdb_type_unregister(type_id_krb5_princ); - } - } - break; - } - - return KHM_ERROR_SUCCESS; -} - -khm_int32 KHMAPI -k5_ident_callback(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) { - switch(msg_type) { - case KMSG_SYSTEM: - return k5_msg_system_idpro(msg_type, msg_subtype, uparam, vparam); - - case KMSG_IDENT: - return k5_msg_ident(msg_type, msg_subtype, uparam, vparam); - } - - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include +#include +#include + +#define K5_NCID_UN_LABEL (KHUI_CW_ID_MIN + 0) +#define K5_NCID_UN (KHUI_CW_ID_MIN + 1) +#define K5_NCID_REALM_LABEL (KHUI_CW_ID_MIN + 2) +#define K5_NCID_REALM (KHUI_CW_ID_MIN + 3) + +#define NC_UNCHANGE_TIMEOUT 3000 +#define NC_UNCHANGE_TIMER 2 +#define NC_REALMCHANGE_TIMEOUT NC_UNCHANGE_TIMEOUT +#define NC_REALMCHANGE_TIMER 3 + +typedef struct tag_k5_new_cred_data { + HWND hw_username_label; + HWND hw_username; + HWND hw_realm_label; + HWND hw_realm; +} k5_new_cred_data; + +/* Runs in the UI thread */ +int +k5_get_realm_from_nc(khui_new_creds * nc, + wchar_t * buf, + khm_size cch_buf) { + k5_new_cred_data * d; + + d = (k5_new_cred_data *) nc->ident_aux; + return GetWindowText(d->hw_realm, buf, (int) cch_buf); +} + +/* set the primary identity of a new credentials dialog depending on + the selection of the username and realm + + Runs in the UI thread +*/ +static void +set_identity_from_ui(khui_new_creds * nc, + k5_new_cred_data * d) { + wchar_t un[KCDB_IDENT_MAXCCH_NAME]; + wchar_t * realm; + khm_size cch; + khm_size cch_left; + khm_handle ident; + LRESULT idx = CB_ERR; + khm_int32 rv = KHM_ERROR_SUCCESS; + + cch = GetWindowTextLength(d->hw_username); + + /* we already set the max length of the edit control to be this. + shouldn't exceed it unless the edit control is confused. */ + assert(cch < KCDB_IDENT_MAXCCH_NAME - 1); + + GetWindowText(d->hw_username, un, ARRAYLENGTH(un)); + + realm = khm_get_realm_from_princ(un); + if (realm) /* realm was specified */ + goto _set_ident; + + /* the cch we got from GetWindowTextLength can not be trusted to + be exact. For caveats see MSDN for GetWindowTextLength. */ + StringCchLength(un, KCDB_IDENT_MAXCCH_NAME, &cch); + + if (cch >= KCDB_IDENT_MAXCCH_NAME - 3) { + /* has to allow space for the '@' and at least a single + character realm, and the NULL terminator. */ + rv = KHM_ERROR_TOO_LONG; + goto _set_null_ident; + } + + realm = un + cch; /* now points at terminating NULL */ + cch_left = KCDB_IDENT_MAXCCH_NAME - cch; + + *realm++ = L'@'; + *realm = L'\0'; + cch_left--; + + cch = GetWindowTextLength(d->hw_realm); + if (cch == 0 || cch >= cch_left) { + rv = KHM_ERROR_INVALID_NAME; + goto _set_null_ident; + } + + GetWindowText(d->hw_realm, realm, (int) cch_left); + + _set_ident: + if (KHM_FAILED(rv = kcdb_identity_create(un, + KCDB_IDENT_FLAG_CREATE, + &ident))) { + goto _set_null_ident; + } + + khui_cw_set_primary_id(nc, ident); + + kcdb_identity_release(ident); + return; + + _set_null_ident: + { + khui_new_creds_by_type * nct = NULL; + wchar_t cmsg[256]; + + khui_cw_find_type(nc, credtype_id_krb5, &nct); + if (nct && nct->hwnd_panel) { + + switch(rv) { + case KHM_ERROR_TOO_LONG: + LoadString(hResModule, IDS_NCERR_IDENT_TOO_LONG, + cmsg, ARRAYLENGTH(cmsg)); + break; + + case KHM_ERROR_INVALID_NAME: + LoadString(hResModule, IDS_NCERR_IDENT_INVALID, + cmsg, ARRAYLENGTH(cmsg)); + break; + + default: + LoadString(hResModule, IDS_NCERR_IDENT_UNKNOWN, + cmsg, ARRAYLENGTH(cmsg)); + } + + SendMessage(nct->hwnd_panel, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, K5_SET_CRED_MSG), + (LPARAM) cmsg); + } + + khui_cw_set_primary_id(nc, NULL); + } + return; +} + +/* runs in the UI thread */ +static BOOL +update_crossfeed(khui_new_creds * nc, + k5_new_cred_data * d, + int ctrl_id_src) { + wchar_t un[KCDB_IDENT_MAXCCH_NAME]; + wchar_t * un_realm; + wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; + khm_size cch; + khm_size cch_left; + int idx; + + cch = (khm_size) GetWindowTextLength(d->hw_username); +#ifdef DEBUG + assert(cch < KCDB_IDENT_MAXCCH_NAME); +#endif + if (cch == 0) + return FALSE; + + GetWindowText(d->hw_username, + un, + ARRAYLENGTH(un)); + + un_realm = khm_get_realm_from_princ(un); + + if (un_realm == NULL) + return FALSE; + + if (ctrl_id_src == K5_NCID_UN) { + + idx = (int)SendMessage(d->hw_realm, + CB_FINDSTRINGEXACT, + (WPARAM) -1, + (LPARAM) un_realm); + + if (idx != CB_ERR) { + wchar_t srealm[KCDB_IDENT_MAXCCH_NAME]; + + cch = SendMessage(d->hw_realm, + CB_GETLBTEXTLEN, + (WPARAM) idx, + 0); + +#ifdef DEBUG + assert(cch < ARRAYLENGTH(srealm) - 1); +#endif + SendMessage(d->hw_realm, + CB_GETLBTEXT, + (WPARAM) idx, + (LPARAM) srealm); + + if (!_wcsicmp(srealm, un_realm) && wcscmp(srealm, un_realm)) { + /* differ only by case */ + + StringCchCopy(un_realm, ARRAYLENGTH(un) - (un_realm - un), + srealm); + + SetWindowText(d->hw_username, un); + } + } + + SendMessage(d->hw_realm, + CB_SELECTSTRING, + (WPARAM) -1, + (LPARAM) un_realm); + + SetWindowText(d->hw_realm, + un_realm); + + return TRUE; + } + /* else... */ + + cch_left = KCDB_IDENT_MAXCCH_NAME - (un_realm - un); + + cch = (khm_size) GetWindowTextLength(d->hw_realm); + +#ifdef DEBUG + assert(cch < KCDB_IDENT_MAXCCH_NAME); +#endif + if (cch == 0) + return FALSE; + + GetWindowText(d->hw_realm, realm, + ARRAYLENGTH(realm)); + + idx = (int)SendMessage(d->hw_realm, + CB_FINDSTRINGEXACT, + (WPARAM) -1, + (LPARAM) realm); + + if (idx != CB_ERR) { + wchar_t srealm[KCDB_IDENT_MAXCCH_NAME]; + + SendMessage(d->hw_realm, + CB_GETLBTEXT, + (WPARAM) idx, + (LPARAM) srealm); + + if (!_wcsicmp(srealm, realm) && wcscmp(srealm, realm)) { + StringCbCopy(realm, sizeof(realm), srealm); + + SetWindowText(d->hw_realm, srealm); + } + } + + StringCchCopy(un_realm, cch_left, realm); + + SendMessage(d->hw_username, + CB_SELECTSTRING, + (WPARAM) -1, + (LPARAM) un); + + SetWindowText(d->hw_username, un); + + return TRUE; +} + +/* Handle window messages for the identity specifiers + + runs in UI thread */ +static LRESULT +handle_wnd_msg(khui_new_creds * nc, + HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + k5_new_cred_data * d; + + d = (k5_new_cred_data *) nc->ident_aux; + + switch(uMsg) { + case WM_COMMAND: + switch(wParam) { + case MAKEWPARAM(K5_NCID_UN, CBN_EDITCHANGE): + /* the username has changed. Instead of handling this + for every keystroke, set a timer that elapses some + time afterwards and then handle the event. */ + SetTimer(hwnd, NC_UNCHANGE_TIMER, + NC_UNCHANGE_TIMEOUT, NULL); + return TRUE; + + case MAKEWPARAM(K5_NCID_UN, CBN_KILLFOCUS): + case MAKEWPARAM(K5_NCID_UN, CBN_CLOSEUP): + KillTimer(hwnd, NC_UNCHANGE_TIMER); + + update_crossfeed(nc,d,K5_NCID_UN); + set_identity_from_ui(nc,d); + return TRUE; + + case MAKEWPARAM(K5_NCID_REALM,CBN_EDITCHANGE): + SetTimer(hwnd, NC_REALMCHANGE_TIMER, + NC_REALMCHANGE_TIMEOUT, NULL); + return TRUE; + + case MAKEWPARAM(K5_NCID_REALM,CBN_KILLFOCUS): + case MAKEWPARAM(K5_NCID_REALM,CBN_CLOSEUP): + KillTimer(hwnd, NC_REALMCHANGE_TIMER); + + update_crossfeed(nc,d,K5_NCID_REALM); + set_identity_from_ui(nc, d); + return TRUE; + } + break; + + case WM_TIMER: + if(wParam == NC_UNCHANGE_TIMER) { + KillTimer(hwnd, NC_UNCHANGE_TIMER); + + update_crossfeed(nc, d, K5_NCID_UN); + set_identity_from_ui(nc,d); + return TRUE; + } else if (wParam == NC_REALMCHANGE_TIMER) { + KillTimer(hwnd, NC_REALMCHANGE_TIMER); + + update_crossfeed(nc, d, K5_NCID_REALM); + set_identity_from_ui(nc, d); + return TRUE; + } + break; + } + return FALSE; +} + +/* UI Callback + + runs in UI thread */ +static LRESULT KHMAPI +ui_cb(khui_new_creds * nc, + UINT cmd, + HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + + k5_new_cred_data * d; + + d = (k5_new_cred_data *) nc->ident_aux; + + switch(cmd) { + case WMNC_IDENT_INIT: + { + wchar_t defident[KCDB_IDENT_MAXCCH_NAME]; + wchar_t wbuf[1024]; + wchar_t * ms = NULL; + wchar_t * t; + wchar_t * defrealm = NULL; + LRESULT lr; + khm_size cb_ms; + khm_size cb; + HWND hw_parent; + khm_int32 rv; + khm_handle hident; + + hw_parent = (HWND) lParam; + defident[0] = L'\0'; + +#ifdef DEBUG + assert(d == NULL); + assert(hw_parent != NULL); +#endif + + d = PMALLOC(sizeof(*d)); + assert(d); + ZeroMemory(d, sizeof(*d)); + + khui_cw_lock_nc(nc); + nc->ident_aux = (LPARAM) d; + khui_cw_unlock_nc(nc); + + LoadString(hResModule, IDS_NC_USERNAME, + wbuf, ARRAYLENGTH(wbuf)); + + d->hw_username_label = CreateWindow + (L"STATIC", + wbuf, + SS_SIMPLE | WS_CHILD | WS_VISIBLE, + 0, 0, 100, 100, /* bogus values */ + hw_parent, + (HMENU) K5_NCID_UN_LABEL, + hInstance, + NULL); + assert(d->hw_username_label != NULL); + + d->hw_username = CreateWindow + (L"COMBOBOX", + L"", + CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | + WS_CHILD | WS_VISIBLE | WS_TABSTOP, + 0, 0, 100, 100, /* bogus values */ + hw_parent, + (HMENU) K5_NCID_UN, + hInstance, + NULL); + assert(d->hw_username != NULL); + + SendMessage(d->hw_username, + CB_LIMITTEXT, + (WPARAM)(KCDB_IDENT_MAXCCH_NAME - 1), + 0); + + SendMessage(d->hw_username, + CB_SETEXTENDEDUI, + (WPARAM) TRUE, + 0); + + khui_cw_add_control_row(nc, + d->hw_username_label, + d->hw_username, + KHUI_CTRLSIZE_SMALL); + + LoadString(hResModule, IDS_NC_REALM, + wbuf, ARRAYLENGTH(wbuf)); + + d->hw_realm_label = CreateWindow + (L"STATIC", + wbuf, + SS_SIMPLE | WS_CHILD | WS_VISIBLE, + 0, 0, 100, 100, /* bogus */ + hw_parent, + (HMENU) K5_NCID_REALM_LABEL, + hInstance, + NULL); + assert(d->hw_realm_label != NULL); + + d->hw_realm = CreateWindow + (L"COMBOBOX", + L"", + CBS_DROPDOWN | CBS_AUTOHSCROLL | CBS_SORT | + WS_CHILD | WS_VISIBLE | WS_TABSTOP, + 0, 0, 100, 100, /* bogus */ + hw_parent, + (HMENU) K5_NCID_REALM, + hInstance, + NULL); + assert(d->hw_realm != NULL); + + SendMessage(d->hw_realm, + CB_LIMITTEXT, + (WPARAM) (KCDB_IDENT_MAXCCH_NAME - 1), + 0); + + SendMessage(d->hw_realm, + CB_SETEXTENDEDUI, + (WPARAM) TRUE, + 0); + + khui_cw_add_control_row(nc, + d->hw_realm_label, + d->hw_realm, + KHUI_CTRLSIZE_SMALL); + + /* add the LRU realms and principals to the dropdown + lists */ + rv = khc_read_multi_string(csp_params, + L"LRUPrincipals", + NULL, + &cb_ms); + + if (rv != KHM_ERROR_TOO_LONG || cb_ms <= sizeof(wchar_t) * 2) + goto _add_lru_realms; + + ms = PMALLOC(cb_ms); + assert(ms != NULL); + + cb = cb_ms; + rv = khc_read_multi_string(csp_params, + L"LRUPrincipals", + ms, + &cb); + + assert(KHM_SUCCEEDED(rv)); + + /* the first of these is considered the default identity + if no other default is known */ + StringCbCopy(defident, sizeof(defident), ms); + + t = ms; + while(t && *t) { + SendMessage(d->hw_username, + CB_ADDSTRING, + 0, + (LPARAM) t); + + t = multi_string_next(t); + } + + _add_lru_realms: + /* add the default realm first */ + defrealm = khm_krb5_get_default_realm(); + if (defrealm) { + SendMessage(d->hw_realm, + CB_ADDSTRING, + 0, + (LPARAM) defrealm); + } + + rv = khc_read_multi_string(csp_params, + L"LRURealms", + NULL, + &cb); + + if (rv != KHM_ERROR_TOO_LONG) + goto _done_adding_lru; + + if (ms != NULL) { + if (cb_ms < cb) { + PFREE(ms); + ms = PMALLOC(cb); + assert(ms); + cb_ms = cb; + } + } else { + ms = PMALLOC(cb); + cb_ms = cb; + } + + rv = khc_read_multi_string(csp_params, + L"LRURealms", + ms, + &cb); + + assert(KHM_SUCCEEDED(rv)); + + for (t = ms; t && *t; t = multi_string_next(t)) { + lr = SendMessage(d->hw_realm, + CB_FINDSTRINGEXACT, + (WPARAM) -1, + (LPARAM) t); + if (lr != CB_ERR) + continue; + + SendMessage(d->hw_realm, + CB_ADDSTRING, + 0, + (LPARAM) t); + } + _done_adding_lru: + + { + khm_int32 inc_realms = 0; + + if (KHM_FAILED(khc_read_int32(csp_params, + L"UseFullRealmList", + &inc_realms)) || + !inc_realms) + goto _done_adding_all_realms; + } + + if(ms) + PFREE(ms); + + ms = khm_krb5_get_realm_list(); + if(ms) { + for (t = ms; t && *t; t = multi_string_next(t)) { + lr = SendMessage(d->hw_realm, + CB_FINDSTRINGEXACT, + (WPARAM) -1, + (LPARAM) t); + if (lr != CB_ERR) + continue; + + SendMessage(d->hw_realm, + CB_ADDSTRING, + 0, + (LPARAM) t); + } + } + _done_adding_all_realms: + + /* set the current selection of the realms list */ + if (defrealm) { + SendMessage(d->hw_realm, + CB_SELECTSTRING, + (WPARAM) -1, + (LPARAM) defrealm); + } else { + SendMessage(d->hw_realm, + CB_SETCURSEL, + (WPARAM) 0, + (LPARAM) 0); + } + + if (defrealm) + PFREE(defrealm); + + if (ms) + PFREE(ms); + + /* now see about that default identity */ + if (nc->ctx.identity) { + cb = sizeof(defident); + kcdb_identity_get_name(nc->ctx.identity, + defident, + &cb); + } + + if (defident[0] == L'\0' && + KHM_SUCCEEDED(kcdb_identity_get_default(&hident))) { + cb = sizeof(defident); + kcdb_identity_get_name(hident, defident, &cb); + kcdb_identity_release(hident); + } + + if (defident[0] == L'\0') { + DWORD dw; + + dw = ARRAYLENGTH(defident); + GetUserName(defident, &dw); + } + + t = khm_get_realm_from_princ(defident); + if (t) { + /* there is a realm */ + assert(t != defident); + *--t = L'\0'; + t++; + + SendMessage(d->hw_realm, + CB_SELECTSTRING, + (WPARAM) -1, + (LPARAM) t); + + SendMessage(d->hw_realm, + WM_SETTEXT, + 0, + (LPARAM) t); + } + + if (defident[0] != L'\0') { + /* there is a username */ + SendMessage(d->hw_username, + CB_SELECTSTRING, + (WPARAM) -1, + (LPARAM) defident); + + SendMessage(d->hw_username, + WM_SETTEXT, + 0, + (LPARAM) defident); + } + + set_identity_from_ui(nc, d); + } + return TRUE; + + case WMNC_IDENT_WMSG: + return handle_wnd_msg(nc, hwnd, uMsg, wParam, lParam); + + case WMNC_IDENT_EXIT: + { +#ifdef DEBUG + assert(d != NULL); +#endif + khui_cw_lock_nc(nc); + nc->ident_aux = 0; + khui_cw_unlock_nc(nc); + + /* since we created all the windows as child windows of + the new creds window, they will be destroyed when that + window is destroyed. */ + PFREE(d); + } + return TRUE; + } + return FALSE; +} + +static khm_int32 +k5_ident_valiate_name(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + krb5_principal princ = NULL; + char princ_name[KCDB_IDENT_MAXCCH_NAME]; + kcdb_ident_name_xfer * nx; + krb5_error_code code; + + nx = (kcdb_ident_name_xfer *) vparam; + + if(UnicodeStrToAnsi(princ_name, sizeof(princ_name), + nx->name_src) == 0) { + nx->result = KHM_ERROR_INVALID_NAME; + return KHM_ERROR_SUCCESS; + } + + assert(k5_identpro_ctx != NULL); + + code = pkrb5_parse_name(k5_identpro_ctx, + princ_name, + &princ); + + if (code) { + nx->result = KHM_ERROR_INVALID_NAME; + return KHM_ERROR_SUCCESS; + } + + if (princ != NULL) + pkrb5_free_principal(k5_identpro_ctx, + princ); + + nx->result = KHM_ERROR_SUCCESS; + + return KHM_ERROR_SUCCESS; +} + +static void +k5_update_last_default_identity(khm_handle ident) { + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + + cb = sizeof(idname); + if (KHM_FAILED(kcdb_identity_get_name(ident, idname, &cb))) + return; + + assert(csp_params); + + khc_write_string(csp_params, L"LastDefaultIdent", idname); +} + +static khm_int32 +k5_ident_set_default(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + + /* Logic for setting the default identity: + + When setting identity I as the default; + + - If KRB5CCNAME is set + - If I["Krb5CCName"] == %KRB5CCNAME% + - do nothing + - Else + - Copy the contents of I["Krb5CCName"] to %KRB5CCNAME + - Set I["Krb5CCName"] to %KRB5CCNAME + - Else + - Set HKCU\Software\MIT\kerberos5,ccname to + "API:".I["Krb5CCName"] + */ + + if (uparam) { + /* an identity is being made default */ + khm_handle def_ident = (khm_handle) vparam; + wchar_t env_ccname[KRB5_MAXCCH_CCNAME]; + wchar_t id_ccname[KRB5_MAXCCH_CCNAME]; + khm_size cb; + DWORD dw; + LONG l; + +#ifdef DEBUG + assert(def_ident != NULL); +#endif + + cb = sizeof(id_ccname); + if (KHM_FAILED(kcdb_identity_get_attr(def_ident, + attr_id_krb5_ccname, + NULL, + id_ccname, + &cb))) + return KHM_ERROR_UNKNOWN; + + khm_krb5_canon_cc_name(id_ccname, sizeof(id_ccname)); + + StringCbLength(id_ccname, sizeof(id_ccname), &cb); + cb += sizeof(wchar_t); + + dw = GetEnvironmentVariable(L"KRB5CCNAME", + env_ccname, + ARRAYLENGTH(env_ccname)); + + if (dw == 0 && + GetLastError() == ERROR_ENVVAR_NOT_FOUND) { + /* KRB5CCNAME not set */ + HKEY hk_ccname; + DWORD dwType; + DWORD dwSize; + wchar_t reg_ccname[KRB5_MAXCCH_CCNAME]; + + l = RegOpenKeyEx(HKEY_CURRENT_USER, + L"Software\\MIT\\kerberos5", + 0, + KEY_READ | KEY_WRITE, + &hk_ccname); + + if (l != ERROR_SUCCESS) + l = RegCreateKeyEx(HKEY_CURRENT_USER, + L"Software\\MIT\\kerberos5", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &hk_ccname, + &dw); + + if (l != ERROR_SUCCESS) + return KHM_ERROR_UNKNOWN; + + dwSize = sizeof(reg_ccname); + + l = RegQueryValueEx(hk_ccname, + L"ccname", + NULL, + &dwType, + (LPBYTE) reg_ccname, + &dwSize); + + if (l != ERROR_SUCCESS || + dwType != REG_SZ || + khm_krb5_cc_name_cmp(reg_ccname, id_ccname)) { + + /* we have to write the new value in */ + + l = RegSetValueEx(hk_ccname, + L"ccname", + 0, + REG_SZ, + (BYTE *) id_ccname, + (DWORD) cb); + } + + RegCloseKey(hk_ccname); + + if (l == ERROR_SUCCESS) { + k5_update_last_default_identity(def_ident); + return KHM_ERROR_SUCCESS; + } else + return KHM_ERROR_UNKNOWN; + + } else if (dw > ARRAYLENGTH(env_ccname)) { + /* buffer was not enough */ +#ifdef DEBUG + assert(FALSE); +#else + return KHM_ERROR_UNKNOWN; +#endif + } else { + /* KRB5CCNAME is set */ + long code; + krb5_context ctx; + + /* if the %KRB5CCNAME is the same as the identity + ccache, then it is already the default. */ + if (!khm_krb5_cc_name_cmp(id_ccname, env_ccname)) { + k5_update_last_default_identity(def_ident); + return KHM_ERROR_SUCCESS; + } + + /* if not, we have to copy the contents of id_ccname + to env_ccname */ + code = pkrb5_init_context(&ctx); + if (code) + return KHM_ERROR_UNKNOWN; + + code = khm_krb5_copy_ccache_by_name(ctx, + env_ccname, + id_ccname); + + if (code == 0) { + k5_update_last_default_identity(def_ident); + khm_krb5_list_tickets(&ctx); + } + + if (ctx) + pkrb5_free_context(ctx); + + return (code == 0)?KHM_ERROR_SUCCESS:KHM_ERROR_UNKNOWN; + } + } else { + /* the default identity is being forgotten */ + + /* we don't really do anything about this case */ + } + + return KHM_ERROR_SUCCESS; +} + +static khm_int32 +k5_ident_get_ui_cb(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + khui_ident_new_creds_cb * cb; + + cb = (khui_ident_new_creds_cb *) vparam; + + *cb = ui_cb; + + return KHM_ERROR_SUCCESS; +} + +static khm_int32 +k5_ident_notify_create(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + + /* a new identity has been created. What we want to do at + this point is to check if the identity belongs to krb5 + and to see if it is the default. */ + + krb5_ccache cc = NULL; + krb5_error_code code; + krb5_principal princ = NULL; + char * princ_nameA = NULL; + wchar_t princ_nameW[KCDB_IDENT_MAXCCH_NAME]; + wchar_t id_nameW[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + khm_handle ident; + + /* if there is a default identity already, we assume we don't need + to check this one. */ + + khm_handle def_ident; + + if (KHM_SUCCEEDED(kcdb_identity_get_default(&def_ident))) { + kcdb_identity_release(def_ident); + + return KHM_ERROR_SUCCESS; + } + + ident = (khm_handle) vparam; + + assert(k5_identpro_ctx != NULL); + + code = pkrb5_cc_default(k5_identpro_ctx, &cc); + if (code) + goto _nc_cleanup; + + code = pkrb5_cc_get_principal(k5_identpro_ctx, + cc, + &princ); + if (code) + goto _nc_cleanup; + + code = pkrb5_unparse_name(k5_identpro_ctx, + princ, + &princ_nameA); + if (code) + goto _nc_cleanup; + + AnsiStrToUnicode(princ_nameW, + sizeof(princ_nameW), + princ_nameA); + + cb = sizeof(id_nameW); + + if (KHM_FAILED(kcdb_identity_get_name(ident, + id_nameW, + &cb))) + goto _nc_cleanup; + + if (!wcscmp(id_nameW, princ_nameW)) { + kcdb_identity_set_default_int(ident); + } + + _nc_cleanup: + if (princ_nameA) + pkrb5_free_unparsed_name(k5_identpro_ctx, + princ_nameA); + if (princ) + pkrb5_free_principal(k5_identpro_ctx, + princ); + if (cc) + pkrb5_cc_close(k5_identpro_ctx, cc); + + return KHM_ERROR_SUCCESS; +} + +static khm_int32 KHMAPI +k5_ident_update_apply_proc(khm_handle cred, + void * rock) { + wchar_t ccname[KRB5_MAXCCH_CCNAME]; + khm_handle tident = (khm_handle) rock; + khm_handle ident = NULL; + khm_int32 t; + khm_int32 flags; + FILETIME t_expire; + FILETIME t_cexpire; + FILETIME t_rexpire; + khm_size cb; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if (KHM_FAILED(kcdb_cred_get_type(cred, &t)) || + t != credtype_id_krb5 || + KHM_FAILED(kcdb_cred_get_identity(cred, &ident))) + return KHM_ERROR_SUCCESS; + + if (!kcdb_identity_is_equal(ident,tident)) + goto _cleanup; + + if (KHM_FAILED(kcdb_cred_get_flags(cred, &flags))) + flags = 0; + + if (flags & KCDB_CRED_FLAG_INITIAL) { + cb = sizeof(t_cexpire); + if (KHM_SUCCEEDED(kcdb_cred_get_attr(cred, + KCDB_ATTR_EXPIRE, + NULL, + &t_cexpire, + &cb))) { + cb = sizeof(t_expire); + if (KHM_FAILED(kcdb_identity_get_attr(tident, + KCDB_ATTR_EXPIRE, + NULL, + &t_expire, + &cb)) || + CompareFileTime(&t_cexpire, &t_expire) > 0) { + goto update_identity; + } + } + } + + goto _cleanup; + + update_identity: + + kcdb_identity_set_attr(tident, KCDB_ATTR_EXPIRE, + &t_cexpire, sizeof(t_cexpire)); + + cb = sizeof(ccname); + if (KHM_SUCCEEDED(kcdb_cred_get_attr(cred, KCDB_ATTR_LOCATION, + NULL, + ccname, + &cb))) { + kcdb_identity_set_attr(tident, attr_id_krb5_ccname, + ccname, cb); + } else { + kcdb_identity_set_attr(tident, attr_id_krb5_ccname, + NULL, 0); + } + + cb = sizeof(t); + if (KHM_SUCCEEDED(kcdb_cred_get_attr(cred, + attr_id_krb5_flags, + NULL, + &t, + &cb))) { + + kcdb_identity_set_attr(tident, attr_id_krb5_flags, + &t, sizeof(t)); + + cb = sizeof(t_rexpire); + if (!(t & TKT_FLG_RENEWABLE) || + KHM_FAILED(kcdb_cred_get_attr(cred, + KCDB_ATTR_RENEW_EXPIRE, + NULL, + &t_rexpire, + &cb))) { + kcdb_identity_set_attr(tident, KCDB_ATTR_RENEW_EXPIRE, + NULL, 0); + } else { + kcdb_identity_set_attr(tident, KCDB_ATTR_RENEW_EXPIRE, + &t_rexpire, sizeof(t_rexpire)); + } + } else { + kcdb_identity_set_attr(tident, attr_id_krb5_flags, + NULL, 0); + kcdb_identity_set_attr(tident, KCDB_ATTR_RENEW_EXPIRE, + NULL, 0); + } + + rv = KHM_ERROR_EXIT; + + _cleanup: + if (ident) + kcdb_identity_release(ident); + + return rv; +} + +static khm_int32 +k5_ident_update(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + + khm_handle ident; + khm_handle tident; + krb5_ccache cc = NULL; + char * ccname; + krb5_error_code code; + khm_size cb; + wchar_t wid_ccname[MAX_PATH]; + wchar_t w_ccname[MAX_PATH]; + + ident = (khm_handle) vparam; + if (ident == NULL) + return KHM_ERROR_SUCCESS; + + kcdb_credset_apply(NULL, + k5_ident_update_apply_proc, + (void *) ident); + + if (KHM_SUCCEEDED(kcdb_identity_get_default(&tident))) { + kcdb_identity_release(tident); + goto _iu_cleanup; + } + + cb = sizeof(wid_ccname); + if (KHM_FAILED(kcdb_identity_get_attr(ident, + attr_id_krb5_ccname, + NULL, + wid_ccname, + &cb))) + goto _iu_cleanup; + + if(k5_identpro_ctx == NULL) + goto _iu_cleanup; + + code = pkrb5_cc_default(k5_identpro_ctx, &cc); + if (code) + goto _iu_cleanup; + + ccname = pkrb5_cc_get_name(k5_identpro_ctx, cc); + if (ccname == NULL) + goto _iu_cleanup; + + AnsiStrToUnicode(w_ccname, sizeof(w_ccname), ccname); + + khm_krb5_canon_cc_name(w_ccname, sizeof(w_ccname)); + khm_krb5_canon_cc_name(wid_ccname, sizeof(wid_ccname)); + + if (!_wcsicmp(w_ccname, wid_ccname)) + kcdb_identity_set_default_int(ident); + + _iu_cleanup: + if (cc && k5_identpro_ctx) + pkrb5_cc_close(k5_identpro_ctx, cc); + + return KHM_ERROR_SUCCESS; +} + +static khm_boolean +k5_refresh_default_identity(krb5_context ctx) { + /* just like notify_create, except now we set the default identity + based on what we find in the configuration */ + krb5_ccache cc = NULL; + krb5_error_code code; + krb5_principal princ = NULL; + char * princ_nameA = NULL; + wchar_t princ_nameW[KCDB_IDENT_MAXCCH_NAME]; + khm_handle ident = NULL; + khm_boolean found_default = FALSE; + + assert(ctx != NULL); + + code = pkrb5_cc_default(ctx, &cc); + if (code) + goto _nc_cleanup; + + code = pkrb5_cc_get_principal(ctx, cc, &princ); + if (code) + goto _nc_cleanup; + + code = pkrb5_unparse_name(ctx, princ, &princ_nameA); + if (code) + goto _nc_cleanup; + + AnsiStrToUnicode(princ_nameW, sizeof(princ_nameW), princ_nameA); + + if (KHM_FAILED(kcdb_identity_create(princ_nameW, 0, &ident))) + goto _nc_cleanup; + + kcdb_identity_set_default_int(ident); + + found_default = TRUE; + + _nc_cleanup: + if (princ_nameA) + pkrb5_free_unparsed_name(ctx, princ_nameA); + + if (princ) + pkrb5_free_principal(ctx, princ); + + if (cc) + pkrb5_cc_close(ctx, cc); + + if (ident) + kcdb_identity_release(ident); + + return found_default; +} + +static khm_int32 +k5_ident_init(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + + khm_boolean found_default; + khm_handle ident; + + found_default = k5_refresh_default_identity(k5_identpro_ctx); + + if (!found_default) { + wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + + cb = sizeof(widname); + + assert(csp_params); + + if (KHM_SUCCEEDED(khc_read_string(csp_params, L"LastDefaultIdent", + widname, &cb))) { + ident = NULL; + kcdb_identity_create(widname, KCDB_IDENT_FLAG_CREATE, &ident); + if (ident) { + kcdb_identity_set_default_int(ident); + kcdb_identity_release(ident); + } + } + } + + return KHM_ERROR_SUCCESS; +} + +static khm_int32 +k5_ident_exit(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + /* don't really do anything */ + return KHM_ERROR_SUCCESS; +} + +/* forward dcl */ +khm_int32 KHMAPI +k5_ident_name_comp_func(const void * dl, khm_size cb_dl, + const void * dr, khm_size cb_dr); + +static khm_int32 +k5_ident_compare_name(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { + kcdb_ident_name_xfer *px; + + px = (kcdb_ident_name_xfer *) vparam; + + /* note that k5_ident_name_comp_func() ignores the size + specifiers. So we can just pass in 0's. */ + px->result = k5_ident_name_comp_func(px->name_src, 0, + px->name_alt, 0); + + return KHM_ERROR_SUCCESS; +} + +#if 0 +/* copy and paste template for ident provider messages */ +static khm_int32 +k5_ident_(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) { +} +#endif + +khm_int32 KHMAPI +k5_msg_ident(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) +{ + switch(msg_subtype) { + case KMSG_IDENT_INIT: + return k5_ident_init(msg_type, + msg_subtype, + uparam, + vparam); + + case KMSG_IDENT_EXIT: + return k5_ident_exit(msg_type, + msg_subtype, + uparam, + vparam); + + case KMSG_IDENT_VALIDATE_NAME: + return k5_ident_valiate_name(msg_type, + msg_subtype, + uparam, + vparam); + + case KMSG_IDENT_VALIDATE_IDENTITY: + /* TODO: handle KMSG_IDENT_VALIDATE_IDENTITY */ + break; + + case KMSG_IDENT_CANON_NAME: + /* TODO: handle KMSG_IDENT_CANON_NAME */ + break; + + case KMSG_IDENT_COMPARE_NAME: + return k5_ident_compare_name(msg_type, + msg_subtype, + uparam, + vparam); + + case KMSG_IDENT_SET_DEFAULT: + return k5_ident_set_default(msg_type, + msg_subtype, + uparam, + vparam); + + case KMSG_IDENT_SET_SEARCHABLE: + /* TODO: handle KMSG_IDENT_SET_SEARCHABLE */ + break; + + case KMSG_IDENT_GET_INFO: + /* TODO: handle KMSG_IDENT_GET_INFO */ + break; + + case KMSG_IDENT_UPDATE: + return k5_ident_update(msg_type, + msg_subtype, + uparam, + vparam); + + case KMSG_IDENT_ENUM_KNOWN: + /* TODO: handle KMSG_IDENT_ENUM_KNOWN */ + break; + + case KMSG_IDENT_GET_UI_CALLBACK: + return k5_ident_get_ui_cb(msg_type, + msg_subtype, + uparam, + vparam); + + case KMSG_IDENT_NOTIFY_CREATE: + return k5_ident_notify_create(msg_type, + msg_subtype, + uparam, + vparam); + } + + return KHM_ERROR_SUCCESS; +} + +/* note that we are ignoring the size specifiers. We can do that + because we are guaranteed that dl and dr point to NULL terminated + unicode strings when used with credential data buffers. We also + use the fact that we are ignoring the size specifiers when we call + this function from k5_ident_compare_name() to avoid calculating the + length of the string. */ +khm_int32 KHMAPI +k5_ident_name_comp_func(const void * dl, khm_size cb_dl, + const void * dr, khm_size cb_dr) { + wchar_t * idl = (wchar_t *) dl; + wchar_t * idr = (wchar_t *) dr; + wchar_t * rl; + wchar_t * rr; + khm_int32 r; + + rl = khm_get_realm_from_princ(idl); + rr = khm_get_realm_from_princ(idr); + + if (rl == NULL && rr == NULL) + return wcscmp(idl, idr); + else if (rl == NULL) + return 1; + else if (rr == NULL) + return -1; + + r = wcscmp(rl, rr); + if (r == 0) + return wcscmp(idl, idr); + else + return r; +} + + +/* Identity change notification thread */ + +HANDLE h_ccname_exit_event; +HANDLE h_ccname_thread; + +DWORD WINAPI k5_ccname_monitor_thread(LPVOID lpParameter) { + krb5_context ctx = 0; + + HKEY hk_ccname; + HANDLE h_notify; + HANDLE h_waits[2]; + + khm_int32 rv = KHM_ERROR_SUCCESS; + DWORD dwType; + DWORD dwSize; + DWORD dwDisp; + wchar_t reg_ccname[KRB5_MAXCCH_CCNAME]; + LONG l; + + l = RegOpenKeyEx(HKEY_CURRENT_USER, + L"Software\\MIT\\kerberos5", + 0, + KEY_READ | KEY_WRITE, + &hk_ccname); + + if (l != ERROR_SUCCESS) + l = RegCreateKeyEx(HKEY_CURRENT_USER, + L"Software\\MIT\\kerberos5", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &hk_ccname, + &dwDisp); + + if (l != ERROR_SUCCESS) { + rv = KHM_ERROR_UNKNOWN; + goto _exit; + } + + dwSize = sizeof(reg_ccname); + + l = RegQueryValueEx(hk_ccname, + L"ccname", + NULL, + &dwType, + (LPBYTE) reg_ccname, + &dwSize); + + if (l != ERROR_SUCCESS || + dwType != REG_SZ) { + + reg_ccname[0] = L'\0'; + } + + l = pkrb5_init_context(&ctx); + + if (l) + goto _exit_0; + + h_notify = CreateEvent(NULL, FALSE, FALSE, L"Local\\Krb5CCNameChangeNotifier"); + + if (h_notify == NULL) + goto _exit_0; + + /* begin wait loop */ + + h_waits[0] = h_ccname_exit_event; + h_waits[1] = h_notify; + + do { + DWORD dwrv; + + l = RegNotifyChangeKeyValue(hk_ccname, FALSE, + REG_NOTIFY_CHANGE_LAST_SET, + h_notify, TRUE); + + if (l != ERROR_SUCCESS) { + rv = KHM_ERROR_UNKNOWN; + break; + } + + dwrv = WaitForMultipleObjects(2, h_waits, FALSE, INFINITE); + + if (dwrv == WAIT_OBJECT_0) { + /* exit! */ + break; + + } else if (dwrv == WAIT_OBJECT_0 + 1) { + /* change notify! */ + wchar_t new_ccname[KRB5_MAXCCH_CCNAME]; + + dwSize = sizeof(new_ccname); + + l = RegQueryValueEx(hk_ccname, + L"ccname", + NULL, + &dwType, + (LPBYTE) new_ccname, + &dwSize); + + if (l != ERROR_SUCCESS || + dwType != REG_SZ) { + new_ccname[0] = L'\0'; + } + + if (_wcsicmp(new_ccname, reg_ccname)) { + k5_refresh_default_identity(ctx); + StringCbCopy(reg_ccname, sizeof(reg_ccname), new_ccname); + } + + } else { + /* something went wrong */ + rv = KHM_ERROR_UNKNOWN; + break; + } + + } while (TRUE); + + CloseHandle(h_notify); + + _exit_0: + + RegCloseKey(hk_ccname); + + if (ctx) + pkrb5_free_context(ctx); + + _exit: + ExitThread(rv); + + /* not reached */ + return rv; +} + +khm_int32 +k5_msg_system_idpro(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) { + + switch(msg_subtype) { + case KMSG_SYSTEM_INIT: + { + + pkrb5_init_context(&k5_identpro_ctx); + kcdb_identity_set_type(credtype_id_krb5); + + if (KHM_FAILED(kcdb_type_get_id(TYPENAME_KRB5_PRINC, + &type_id_krb5_princ))) { + kcdb_type dt; + kcdb_type * pstr; + + kcdb_type_get_info(KCDB_TYPE_STRING, &pstr); + + ZeroMemory(&dt, sizeof(dt)); + dt.name = TYPENAME_KRB5_PRINC; + dt.id = KCDB_TYPE_INVALID; + dt.flags = KCDB_TYPE_FLAG_CB_AUTO; + dt.cb_min = pstr->cb_min; + dt.cb_max = pstr->cb_max; + dt.toString = pstr->toString; + dt.isValid = pstr->isValid; + dt.comp = k5_ident_name_comp_func; + dt.dup = pstr->dup; + + kcdb_type_register(&dt, &type_id_krb5_princ); + + type_regd_krb5_princ = TRUE; + + kcdb_type_release_info(pstr); + } + + if (type_id_krb5_princ != -1) { + kcdb_attrib * attr; + + kcdb_attrib_get_info(KCDB_ATTR_ID_NAME, &attr); + + attr->type = type_id_krb5_princ; + + kcdb_attrib_release_info(attr); + } + + h_ccname_exit_event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (h_ccname_exit_event) { + h_ccname_thread = CreateThread(NULL, + 200 * 1024, + k5_ccname_monitor_thread, + NULL, + 0, + NULL); + } else { + h_ccname_thread = NULL; + } + } + break; + + case KMSG_SYSTEM_EXIT: + { + + if (h_ccname_thread) { + SetEvent(h_ccname_exit_event); + WaitForSingleObject(h_ccname_thread, INFINITE); + CloseHandle(h_ccname_thread); + CloseHandle(h_ccname_exit_event); + + h_ccname_exit_event = NULL; + h_ccname_thread = NULL; + } + + if (k5_identpro_ctx) { + pkrb5_free_context(k5_identpro_ctx); + k5_identpro_ctx = NULL; + } + + if (type_id_krb5_princ != -1) { + kcdb_attrib * attr; + + kcdb_attrib_get_info(KCDB_ATTR_ID_NAME, &attr); + + attr->type = KCDB_TYPE_STRING; + + kcdb_attrib_release_info(attr); + } + + /* allow a brief moment for any stale references to die */ + Sleep(100); + + if (type_regd_krb5_princ) { + kcdb_type_unregister(type_id_krb5_princ); + } + } + break; + } + + return KHM_ERROR_SUCCESS; +} + +khm_int32 KHMAPI +k5_ident_callback(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) { + switch(msg_type) { + case KMSG_SYSTEM: + return k5_msg_system_idpro(msg_type, msg_subtype, uparam, vparam); + + case KMSG_IDENT: + return k5_msg_ident(msg_type, msg_subtype, uparam, vparam); + } + + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/errorfuncs.c +++ krb5-1.4.4/src/windows/identity/plugins/krb5/errorfuncs.c @@ -1,263 +1,263 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -extern void (__cdecl *pinitialize_krb_error_func)(); -extern void (__cdecl *pinitialize_kadm_error_table)(); - - -khm_int32 init_error_funcs() -{ - return KHM_ERROR_SUCCESS; -} - -khm_int32 exit_error_funcs() -{ - return KHM_ERROR_SUCCESS; -} - -#ifdef DEPRECATED_REMOVABLE -HWND GetRootParent (HWND Child) -{ - HWND Last; - while (Child) - { - Last = Child; - Child = GetParent (Child); - } - return Last; -} -#endif - -void khm_err_describe(long code, wchar_t * buf, khm_size cbbuf, - DWORD * suggestion, - kherr_suggestion * suggest_code) -{ - const char * com_err_msg; - int offset; - long table_num; - DWORD msg_id = 0; - DWORD sugg_id = 0; - kherr_suggestion sugg_code = KHERR_SUGGEST_NONE; - - if (suggestion == NULL || buf == NULL || cbbuf == 0 || suggest_code == 0) - return; - - *buf = L'\0'; - - offset = (int) (code & 255); - table_num = code - offset; - com_err_msg = perror_message(code); - - *suggestion = 0; - *suggest_code = KHERR_SUGGEST_NONE; - - switch(table_num) - { - case krb_err_base: - case kadm_err_base: - break; - default: - if (code == KRB5KRB_AP_ERR_BAD_INTEGRITY) { - *suggestion = MSG_ERR_S_INTEGRITY; - } - *suggest_code = KHERR_SUGGEST_RETRY; - AnsiStrToUnicode(buf, cbbuf, com_err_msg); - return; - } - - if (table_num == krb_err_base) - switch(offset) - { - case KDC_NAME_EXP: /* 001 Principal expired */ - case KDC_SERVICE_EXP: /* 002 Service expired */ - case KDC_AUTH_EXP: /* 003 Auth expired */ - case KDC_PKT_VER: /* 004 Protocol version unknown */ - case KDC_P_MKEY_VER: /* 005 Wrong master key version */ - case KDC_S_MKEY_VER: /* 006 Wrong master key version */ - case KDC_BYTE_ORDER: /* 007 Byte order unknown */ - case KDC_PR_N_UNIQUE: /* 009 Principal not unique */ - case KDC_NULL_KEY: /* 010 Principal has null key */ - case KDC_GEN_ERR: /* 011 Generic error from KDC */ - case INTK_W_NOTALL : /* 061 Not ALL tickets returned */ - case INTK_PROT : /* 063 Protocol Error */ - case INTK_ERR : /* 070 Other error */ - msg_id = MSG_ERR_UNKNOWN; - sugg_code = KHERR_SUGGEST_RETRY; - break; - - case KDC_PR_UNKNOWN: /* 008 Principal unknown */ - msg_id = MSG_ERR_PR_UNKNOWN; - sugg_code = KHERR_SUGGEST_RETRY; - break; - case GC_TKFIL : /* 021 Can't read ticket file */ - case GC_NOTKT : /* 022 Can't find ticket or TGT */ - msg_id = MSG_ERR_TKFIL; - sugg_id = MSG_ERR_S_TKFIL; - sugg_code = KHERR_SUGGEST_RETRY; - break; - case MK_AP_TGTEXP : /* 026 TGT Expired */ - /* no extra error msg */ - break; - - case RD_AP_TIME : /* 037 delta_t too big */ - msg_id = MSG_ERR_CLOCKSKEW; - sugg_id = MSG_ERR_S_CLOCKSKEW; - sugg_code = KHERR_SUGGEST_RETRY; - break; - - case RD_AP_UNDEC : /* 031 Can't decode - authenticator */ - case RD_AP_EXP : /* 032 Ticket expired */ - case RD_AP_NYV : /* 033 Ticket not yet valid */ - case RD_AP_REPEAT : /* 034 Repeated request */ - case RD_AP_NOT_US : /* 035 The ticket isn't for us */ - case RD_AP_INCON : /* 036 Request is inconsistent */ - case RD_AP_BADD : /* 038 Incorrect net address */ - case RD_AP_VERSION : /* 039 protocol version mismatch */ - case RD_AP_MSG_TYPE : /* 040 invalid msg type */ - case RD_AP_MODIFIED : /* 041 message stream modified */ - case RD_AP_ORDER : /* 042 message out of order */ - case RD_AP_UNAUTHOR : /* 043 unauthorized request */ - /* no extra error msg */ - sugg_code = KHERR_SUGGEST_RETRY; - break; - - case GT_PW_NULL: /* 51 Current PW is null */ - case GT_PW_BADPW: /* 52 Incorrect current password */ - case GT_PW_PROT: /* 53 Protocol Error */ - case GT_PW_KDCERR: /* 54 Error returned by KDC */ - case GT_PW_NULLTKT: /* 55 Null tkt returned by KDC */ - /* no error msg yet */ - sugg_code = KHERR_SUGGEST_RETRY; - break; - - /* Values returned by send_to_kdc */ - case SKDC_RETRY : /* 56 Retry count exceeded */ - case SKDC_CANT : /* 57 Can't send request */ - msg_id = MSG_ERR_KDC_CONTACT; - break; - /* no error message on purpose: */ - case INTK_BADPW : /* 062 Incorrect password */ - sugg_code = KHERR_SUGGEST_RETRY; - break; - default: - /* no extra error msg */ - break; - } - else - switch(code) - { - case KADM_INSECURE_PW: - /* if( kadm_info != NULL ){ - * wsprintf(buf, "%s\n%s", com_err_msg, kadm_info); - * } else { - * wsprintf(buf, "%s\nPlease see the help file for information " - * "about secure passwords.", com_err_msg); - * } - * com_err_msg = buf; - */ - - /* The above code would be preferred since it allows site - * specific information to be delivered from the Kerberos - * server. However the message box is too small for VGA - * screens. It does work well if we only have to support - * 1024x768 - */ - - msg_id = MSG_ERR_INSECURE_PW; - sugg_code = KHERR_SUGGEST_RETRY; - break; - - default: - /* no extra error msg */ - break; - } - - if (msg_id != 0) { - FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | - FORMAT_MESSAGE_IGNORE_INSERTS, - KHERR_HMODULE, - msg_id, - 0, - buf, - (int) (cbbuf / sizeof(buf[0])), - NULL); - } - - if (sugg_id != 0) { - *suggestion = sugg_id; - } - - if (sugg_code != KHERR_SUGGEST_NONE) - *suggest_code = sugg_code; -} - -#ifdef DEPRECATED_REMOVABLE -int lsh_com_err_proc (LPSTR whoami, long code, - LPSTR fmt, va_list args) -{ - int retval; - HWND hOldFocus; - char buf[1024], *cp; - WORD mbformat = MB_OK | MB_ICONEXCLAMATION; - - cp = buf; - memset(buf, '\0', sizeof(buf)); - cp[0] = '\0'; - - if (code) - { - err_describe(buf, code); - while (*cp) - cp++; - } - - if (fmt) - { - if (fmt[0] == '%' && fmt[1] == 'b') - { - fmt += 2; - mbformat = va_arg(args, WORD); - /* if the first arg is a %b, we use it for the message - box MB_??? flags. */ - } - if (code) - { - *cp++ = '\n'; - *cp++ = '\n'; - } - wvsprintfA((LPSTR)cp, fmt, args); - } - hOldFocus = GetFocus(); - retval = MessageBoxA(/*GetRootParent(hOldFocus)*/NULL, buf, whoami, - mbformat | MB_ICONHAND | MB_TASKMODAL); - SetFocus(hOldFocus); - return retval; -} -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +extern void (__cdecl *pinitialize_krb_error_func)(); +extern void (__cdecl *pinitialize_kadm_error_table)(); + + +khm_int32 init_error_funcs() +{ + return KHM_ERROR_SUCCESS; +} + +khm_int32 exit_error_funcs() +{ + return KHM_ERROR_SUCCESS; +} + +#ifdef DEPRECATED_REMOVABLE +HWND GetRootParent (HWND Child) +{ + HWND Last; + while (Child) + { + Last = Child; + Child = GetParent (Child); + } + return Last; +} +#endif + +void khm_err_describe(long code, wchar_t * buf, khm_size cbbuf, + DWORD * suggestion, + kherr_suggestion * suggest_code) +{ + const char * com_err_msg; + int offset; + long table_num; + DWORD msg_id = 0; + DWORD sugg_id = 0; + kherr_suggestion sugg_code = KHERR_SUGGEST_NONE; + + if (suggestion == NULL || buf == NULL || cbbuf == 0 || suggest_code == 0) + return; + + *buf = L'\0'; + + offset = (int) (code & 255); + table_num = code - offset; + com_err_msg = perror_message(code); + + *suggestion = 0; + *suggest_code = KHERR_SUGGEST_NONE; + + switch(table_num) + { + case krb_err_base: + case kadm_err_base: + break; + default: + if (code == KRB5KRB_AP_ERR_BAD_INTEGRITY) { + *suggestion = MSG_ERR_S_INTEGRITY; + } + *suggest_code = KHERR_SUGGEST_RETRY; + AnsiStrToUnicode(buf, cbbuf, com_err_msg); + return; + } + + if (table_num == krb_err_base) + switch(offset) + { + case KDC_NAME_EXP: /* 001 Principal expired */ + case KDC_SERVICE_EXP: /* 002 Service expired */ + case KDC_AUTH_EXP: /* 003 Auth expired */ + case KDC_PKT_VER: /* 004 Protocol version unknown */ + case KDC_P_MKEY_VER: /* 005 Wrong master key version */ + case KDC_S_MKEY_VER: /* 006 Wrong master key version */ + case KDC_BYTE_ORDER: /* 007 Byte order unknown */ + case KDC_PR_N_UNIQUE: /* 009 Principal not unique */ + case KDC_NULL_KEY: /* 010 Principal has null key */ + case KDC_GEN_ERR: /* 011 Generic error from KDC */ + case INTK_W_NOTALL : /* 061 Not ALL tickets returned */ + case INTK_PROT : /* 063 Protocol Error */ + case INTK_ERR : /* 070 Other error */ + msg_id = MSG_ERR_UNKNOWN; + sugg_code = KHERR_SUGGEST_RETRY; + break; + + case KDC_PR_UNKNOWN: /* 008 Principal unknown */ + msg_id = MSG_ERR_PR_UNKNOWN; + sugg_code = KHERR_SUGGEST_RETRY; + break; + case GC_TKFIL : /* 021 Can't read ticket file */ + case GC_NOTKT : /* 022 Can't find ticket or TGT */ + msg_id = MSG_ERR_TKFIL; + sugg_id = MSG_ERR_S_TKFIL; + sugg_code = KHERR_SUGGEST_RETRY; + break; + case MK_AP_TGTEXP : /* 026 TGT Expired */ + /* no extra error msg */ + break; + + case RD_AP_TIME : /* 037 delta_t too big */ + msg_id = MSG_ERR_CLOCKSKEW; + sugg_id = MSG_ERR_S_CLOCKSKEW; + sugg_code = KHERR_SUGGEST_RETRY; + break; + + case RD_AP_UNDEC : /* 031 Can't decode + authenticator */ + case RD_AP_EXP : /* 032 Ticket expired */ + case RD_AP_NYV : /* 033 Ticket not yet valid */ + case RD_AP_REPEAT : /* 034 Repeated request */ + case RD_AP_NOT_US : /* 035 The ticket isn't for us */ + case RD_AP_INCON : /* 036 Request is inconsistent */ + case RD_AP_BADD : /* 038 Incorrect net address */ + case RD_AP_VERSION : /* 039 protocol version mismatch */ + case RD_AP_MSG_TYPE : /* 040 invalid msg type */ + case RD_AP_MODIFIED : /* 041 message stream modified */ + case RD_AP_ORDER : /* 042 message out of order */ + case RD_AP_UNAUTHOR : /* 043 unauthorized request */ + /* no extra error msg */ + sugg_code = KHERR_SUGGEST_RETRY; + break; + + case GT_PW_NULL: /* 51 Current PW is null */ + case GT_PW_BADPW: /* 52 Incorrect current password */ + case GT_PW_PROT: /* 53 Protocol Error */ + case GT_PW_KDCERR: /* 54 Error returned by KDC */ + case GT_PW_NULLTKT: /* 55 Null tkt returned by KDC */ + /* no error msg yet */ + sugg_code = KHERR_SUGGEST_RETRY; + break; + + /* Values returned by send_to_kdc */ + case SKDC_RETRY : /* 56 Retry count exceeded */ + case SKDC_CANT : /* 57 Can't send request */ + msg_id = MSG_ERR_KDC_CONTACT; + break; + /* no error message on purpose: */ + case INTK_BADPW : /* 062 Incorrect password */ + sugg_code = KHERR_SUGGEST_RETRY; + break; + default: + /* no extra error msg */ + break; + } + else + switch(code) + { + case KADM_INSECURE_PW: + /* if( kadm_info != NULL ){ + * wsprintf(buf, "%s\n%s", com_err_msg, kadm_info); + * } else { + * wsprintf(buf, "%s\nPlease see the help file for information " + * "about secure passwords.", com_err_msg); + * } + * com_err_msg = buf; + */ + + /* The above code would be preferred since it allows site + * specific information to be delivered from the Kerberos + * server. However the message box is too small for VGA + * screens. It does work well if we only have to support + * 1024x768 + */ + + msg_id = MSG_ERR_INSECURE_PW; + sugg_code = KHERR_SUGGEST_RETRY; + break; + + default: + /* no extra error msg */ + break; + } + + if (msg_id != 0) { + FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | + FORMAT_MESSAGE_IGNORE_INSERTS, + KHERR_HMODULE, + msg_id, + 0, + buf, + (int) (cbbuf / sizeof(buf[0])), + NULL); + } + + if (sugg_id != 0) { + *suggestion = sugg_id; + } + + if (sugg_code != KHERR_SUGGEST_NONE) + *suggest_code = sugg_code; +} + +#ifdef DEPRECATED_REMOVABLE +int lsh_com_err_proc (LPSTR whoami, long code, + LPSTR fmt, va_list args) +{ + int retval; + HWND hOldFocus; + char buf[1024], *cp; + WORD mbformat = MB_OK | MB_ICONEXCLAMATION; + + cp = buf; + memset(buf, '\0', sizeof(buf)); + cp[0] = '\0'; + + if (code) + { + err_describe(buf, code); + while (*cp) + cp++; + } + + if (fmt) + { + if (fmt[0] == '%' && fmt[1] == 'b') + { + fmt += 2; + mbformat = va_arg(args, WORD); + /* if the first arg is a %b, we use it for the message + box MB_??? flags. */ + } + if (code) + { + *cp++ = '\n'; + *cp++ = '\n'; + } + wvsprintfA((LPSTR)cp, fmt, args); + } + hOldFocus = GetFocus(); + retval = MessageBoxA(/*GetRootParent(hOldFocus)*/NULL, buf, whoami, + mbformat | MB_ICONHAND | MB_TASKMODAL); + SetFocus(hOldFocus); + return retval; +} +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/krb5props.c +++ krb5-1.4.4/src/windows/identity/plugins/krb5/krb5props.c @@ -1,176 +1,176 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#include -#include -#ifdef DEBUG -#include -#endif - -/* Property page - - Runs in the context of the UI thread. - */ -INT_PTR CALLBACK krb5_pp_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam - ) -{ - switch(uMsg) { - case WM_INITDIALOG: - { - khui_property_sheet * s; - PROPSHEETPAGE * p; - wchar_t buf[512]; - wchar_t unavailable[64]; - khm_size cbsize; - khm_int32 rv; - khm_int32 tflags; - - p = (PROPSHEETPAGE *) lParam; - s = (khui_property_sheet *) p->lParam; - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) s); -#pragma warning(pop) - - LoadString(hResModule, IDS_UNAVAILABLE, - unavailable, ARRAYLENGTH(unavailable)); - - if(s->cred) { - cbsize = sizeof(buf); - kcdb_cred_get_name(s->cred, buf, &cbsize); - SetDlgItemText(hwnd, IDC_PPK5_NAME, buf); - - cbsize = sizeof(buf); - rv = kcdb_cred_get_attr_string(s->cred, - KCDB_ATTR_ISSUE, - buf, &cbsize, 0); - if (KHM_SUCCEEDED(rv)) - SetDlgItemText(hwnd, IDC_PPK5_ISSUE, buf); - else - SetDlgItemText(hwnd, IDC_PPK5_ISSUE, unavailable); - - cbsize = sizeof(buf); - rv = kcdb_cred_get_attr_string(s->cred, - KCDB_ATTR_EXPIRE, - buf, &cbsize, 0); - if (KHM_SUCCEEDED(rv)) - SetDlgItemText(hwnd, IDC_PPK5_VALID, buf); - else - SetDlgItemText(hwnd, IDC_PPK5_VALID, unavailable); - - cbsize = sizeof(buf); - rv = kcdb_cred_get_attr_string(s->cred, - KCDB_ATTR_RENEW_EXPIRE, - buf, &cbsize, 0); - if (KHM_SUCCEEDED(rv)) - SetDlgItemText(hwnd, IDC_PPK5_RENEW, buf); - else - SetDlgItemText(hwnd, IDC_PPK5_RENEW, unavailable); - - tflags = 0; - cbsize = sizeof(tflags); - rv = kcdb_cred_get_attr(s->cred, - attr_id_krb5_flags, - NULL, - &tflags, - &cbsize); - if (KHM_SUCCEEDED(rv)) { - -#define ADDBITFLAG(f,s) \ - if (tflags & f) { \ - LoadString(hResModule, s, buf, ARRAYLENGTH(buf)); \ - SendDlgItemMessage(hwnd, IDC_PPK5_FLAGS, LB_ADDSTRING, 0, (LPARAM) buf); \ - } - - ADDBITFLAG(TKT_FLG_FORWARDABLE, IDS_FLG_FORWARDABLE); - ADDBITFLAG(TKT_FLG_FORWARDED, IDS_FLG_FORWARDED); - ADDBITFLAG(TKT_FLG_PROXIABLE, IDS_FLG_PROXIABLE); - ADDBITFLAG(TKT_FLG_PROXY, IDS_FLG_PROXY); - ADDBITFLAG(TKT_FLG_MAY_POSTDATE, IDS_FLG_MAY_POSTDATE); - ADDBITFLAG(TKT_FLG_POSTDATED, IDS_FLG_POSTDATED); - ADDBITFLAG(TKT_FLG_INVALID, IDS_FLG_INVALID); - ADDBITFLAG(TKT_FLG_RENEWABLE, IDS_FLG_RENEWABLE); - ADDBITFLAG(TKT_FLG_INITIAL, IDS_FLG_INITIAL); - ADDBITFLAG(TKT_FLG_PRE_AUTH, IDS_FLG_PRE_AUTH); - ADDBITFLAG(TKT_FLG_HW_AUTH, IDS_FLG_HW_AUTH); - ADDBITFLAG(TKT_FLG_TRANSIT_POLICY_CHECKED, IDS_FLG_TRANSIT_POL); - ADDBITFLAG(TKT_FLG_OK_AS_DELEGATE, IDS_FLG_OK_DELEGATE); - ADDBITFLAG(TKT_FLG_ANONYMOUS, IDS_FLG_ANONYMOUS); - -#undef ADDBITFLAG - - } - } else { -#ifdef DEBUG - assert(FALSE); -#endif - } - } - return FALSE; - } - - return FALSE; -} - -void k5_pp_begin(khui_property_sheet * s) -{ - PROPSHEETPAGE *p; - - if(s->credtype == credtype_id_krb5 && - s->cred) { - p = PMALLOC(sizeof(*p)); - ZeroMemory(p, sizeof(*p)); - - p->dwSize = sizeof(*p); - p->dwFlags = 0; - p->hInstance = hResModule; - p->pszTemplate = MAKEINTRESOURCE(IDD_PP_KRB5C); - p->pfnDlgProc = krb5_pp_proc; - p->lParam = (LPARAM) s; - khui_ps_add_page(s, credtype_id_krb5, 0, p, NULL); - } -} - -void k5_pp_end(khui_property_sheet * s) -{ - khui_property_page * p = NULL; - - khui_ps_find_page(s, credtype_id_krb5, &p); - if(p) { - if(p->p_page) - PFREE(p->p_page); - p->p_page = NULL; - } -} - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include +#include +#ifdef DEBUG +#include +#endif + +/* Property page + + Runs in the context of the UI thread. + */ +INT_PTR CALLBACK krb5_pp_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam + ) +{ + switch(uMsg) { + case WM_INITDIALOG: + { + khui_property_sheet * s; + PROPSHEETPAGE * p; + wchar_t buf[512]; + wchar_t unavailable[64]; + khm_size cbsize; + khm_int32 rv; + khm_int32 tflags; + + p = (PROPSHEETPAGE *) lParam; + s = (khui_property_sheet *) p->lParam; + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) s); +#pragma warning(pop) + + LoadString(hResModule, IDS_UNAVAILABLE, + unavailable, ARRAYLENGTH(unavailable)); + + if(s->cred) { + cbsize = sizeof(buf); + kcdb_cred_get_name(s->cred, buf, &cbsize); + SetDlgItemText(hwnd, IDC_PPK5_NAME, buf); + + cbsize = sizeof(buf); + rv = kcdb_cred_get_attr_string(s->cred, + KCDB_ATTR_ISSUE, + buf, &cbsize, 0); + if (KHM_SUCCEEDED(rv)) + SetDlgItemText(hwnd, IDC_PPK5_ISSUE, buf); + else + SetDlgItemText(hwnd, IDC_PPK5_ISSUE, unavailable); + + cbsize = sizeof(buf); + rv = kcdb_cred_get_attr_string(s->cred, + KCDB_ATTR_EXPIRE, + buf, &cbsize, 0); + if (KHM_SUCCEEDED(rv)) + SetDlgItemText(hwnd, IDC_PPK5_VALID, buf); + else + SetDlgItemText(hwnd, IDC_PPK5_VALID, unavailable); + + cbsize = sizeof(buf); + rv = kcdb_cred_get_attr_string(s->cred, + KCDB_ATTR_RENEW_EXPIRE, + buf, &cbsize, 0); + if (KHM_SUCCEEDED(rv)) + SetDlgItemText(hwnd, IDC_PPK5_RENEW, buf); + else + SetDlgItemText(hwnd, IDC_PPK5_RENEW, unavailable); + + tflags = 0; + cbsize = sizeof(tflags); + rv = kcdb_cred_get_attr(s->cred, + attr_id_krb5_flags, + NULL, + &tflags, + &cbsize); + if (KHM_SUCCEEDED(rv)) { + +#define ADDBITFLAG(f,s) \ + if (tflags & f) { \ + LoadString(hResModule, s, buf, ARRAYLENGTH(buf)); \ + SendDlgItemMessage(hwnd, IDC_PPK5_FLAGS, LB_ADDSTRING, 0, (LPARAM) buf); \ + } + + ADDBITFLAG(TKT_FLG_FORWARDABLE, IDS_FLG_FORWARDABLE); + ADDBITFLAG(TKT_FLG_FORWARDED, IDS_FLG_FORWARDED); + ADDBITFLAG(TKT_FLG_PROXIABLE, IDS_FLG_PROXIABLE); + ADDBITFLAG(TKT_FLG_PROXY, IDS_FLG_PROXY); + ADDBITFLAG(TKT_FLG_MAY_POSTDATE, IDS_FLG_MAY_POSTDATE); + ADDBITFLAG(TKT_FLG_POSTDATED, IDS_FLG_POSTDATED); + ADDBITFLAG(TKT_FLG_INVALID, IDS_FLG_INVALID); + ADDBITFLAG(TKT_FLG_RENEWABLE, IDS_FLG_RENEWABLE); + ADDBITFLAG(TKT_FLG_INITIAL, IDS_FLG_INITIAL); + ADDBITFLAG(TKT_FLG_PRE_AUTH, IDS_FLG_PRE_AUTH); + ADDBITFLAG(TKT_FLG_HW_AUTH, IDS_FLG_HW_AUTH); + ADDBITFLAG(TKT_FLG_TRANSIT_POLICY_CHECKED, IDS_FLG_TRANSIT_POL); + ADDBITFLAG(TKT_FLG_OK_AS_DELEGATE, IDS_FLG_OK_DELEGATE); + ADDBITFLAG(TKT_FLG_ANONYMOUS, IDS_FLG_ANONYMOUS); + +#undef ADDBITFLAG + + } + } else { +#ifdef DEBUG + assert(FALSE); +#endif + } + } + return FALSE; + } + + return FALSE; +} + +void k5_pp_begin(khui_property_sheet * s) +{ + PROPSHEETPAGE *p; + + if(s->credtype == credtype_id_krb5 && + s->cred) { + p = PMALLOC(sizeof(*p)); + ZeroMemory(p, sizeof(*p)); + + p->dwSize = sizeof(*p); + p->dwFlags = 0; + p->hInstance = hResModule; + p->pszTemplate = MAKEINTRESOURCE(IDD_PP_KRB5C); + p->pfnDlgProc = krb5_pp_proc; + p->lParam = (LPARAM) s; + khui_ps_add_page(s, credtype_id_krb5, 0, p, NULL); + } +} + +void k5_pp_end(khui_property_sheet * s) +{ + khui_property_page * p = NULL; + + khui_ps_find_page(s, credtype_id_krb5, &p); + if(p) { + if(p->p_page) + PFREE(p->p_page); + p->p_page = NULL; + } +} + --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/errorfuncs.h +++ krb5-1.4.4/src/windows/identity/plugins/krb5/errorfuncs.h @@ -1,75 +1,75 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_ERR_H -#define __KHIMAIRA_ERR_H - -/* All error handling and reporting related functions for the krb4/5 - and AFS plugins */ - -#include -#include -/* - * This is a hack needed because the real com_err.h does - * not define err_func. We need it in the case where - * we pull in the real com_err instead of the krb4 - * impostor. - */ -#ifndef _DCNS_MIT_COM_ERR_H -typedef LPSTR (*err_func)(int, long); -#endif - -#include -#include - -#define kadm_err_base ERROR_TABLE_BASE_kadm - -#include - -#ifndef KRBERR -#define KRBERR(code) (code + krb_err_base) -#endif - -/*! \internal - \brief Describe an error - - \param[in] code Error code returned by Kerberos - \param[out] buf Receives the error string - \param[in] cbbuf Size of buffer pointed to by \a buf - \param[out] suggestion Message ID of suggestion - \param[out] suggest_code Suggestion ID -*/ -void khm_err_describe(long code, wchar_t * buf, khm_size cbbuf, - DWORD * suggestion, - kherr_suggestion * suggest_code); - -/* */ -khm_int32 init_error_funcs(); - -khm_int32 exit_error_funcs(); - - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_ERR_H +#define __KHIMAIRA_ERR_H + +/* All error handling and reporting related functions for the krb4/5 + and AFS plugins */ + +#include +#include +/* + * This is a hack needed because the real com_err.h does + * not define err_func. We need it in the case where + * we pull in the real com_err instead of the krb4 + * impostor. + */ +#ifndef _DCNS_MIT_COM_ERR_H +typedef LPSTR (*err_func)(int, long); +#endif + +#include +#include + +#define kadm_err_base ERROR_TABLE_BASE_kadm + +#include + +#ifndef KRBERR +#define KRBERR(code) (code + krb_err_base) +#endif + +/*! \internal + \brief Describe an error + + \param[in] code Error code returned by Kerberos + \param[out] buf Receives the error string + \param[in] cbbuf Size of buffer pointed to by \a buf + \param[out] suggestion Message ID of suggestion + \param[out] suggest_code Suggestion ID +*/ +void khm_err_describe(long code, wchar_t * buf, khm_size cbbuf, + DWORD * suggestion, + kherr_suggestion * suggest_code); + +/* */ +khm_int32 init_error_funcs(); + +khm_int32 exit_error_funcs(); + + +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/krbcred.h +++ krb5-1.4.4/src/windows/identity/plugins/krb5/krbcred.h @@ -1,232 +1,232 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KRBAFSCRED_H -#define __KHIMAIRA_KRBAFSCRED_H - -#include - -/* While we generally pull resources out of hResModule, the message - strings for all the languages are kept in the main DLL. */ -#define KHERR_HMODULE hInstance -#define KHERR_FACILITY k5_facility -#define KHERR_FACILITY_ID 64 - -#include - -#include -#include -#include -#include - -#include -#include -#include - -typedef enum tag_k5_lsa_import { - K5_LSAIMPORT_NEVER = 0, - K5_LSAIMPORT_ALWAYS = 1, - K5_LSAIMPORT_MATCH = 2, /* only when the principal name matches */ -} k5_lsa_import; - -#define TYPENAME_ENCTYPE L"EncType" -#define TYPENAME_ADDR_LIST L"AddrList" -#define TYPENAME_KRB5_FLAGS L"Krb5Flags" -#define TYPENAME_KRB5_PRINC L"Krb5Principal" -#define TYPENAME_KVNO L"Kvno" - -#define ATTRNAME_KEY_ENCTYPE L"KeyEncType" -#define ATTRNAME_TKT_ENCTYPE L"TktEncType" -#define ATTRNAME_ADDR_LIST L"AddrList" -#define ATTRNAME_KRB5_FLAGS L"Krb5Flags" -#define ATTRNAME_KRB5_CCNAME L"Krb5CCName" -#define ATTRNAME_KVNO L"Kvno" - -void init_krb(); -void exit_krb(); -KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module); -KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module); - -/* globals */ -extern kmm_module h_khModule; -extern HMODULE hResModule; -extern HINSTANCE hInstance; -extern const wchar_t * k5_facility; - -extern khm_int32 type_id_enctype; -extern khm_int32 type_id_addr_list; -extern khm_int32 type_id_krb5_flags; -extern khm_int32 type_id_krb5_princ; -extern khm_int32 type_id_kvno; - -extern BOOL type_regd_krb5_princ; - -extern khm_int32 attr_id_key_enctype; -extern khm_int32 attr_id_tkt_enctype; -extern khm_int32 attr_id_addr_list; -extern khm_int32 attr_id_krb5_flags; -extern khm_int32 attr_id_krb5_ccname; -extern khm_int32 attr_id_kvno; - -extern khm_ui_4 k5_commctl_version; - -#define IS_COMMCTL6() (k5_commctl_version >= 0x60000) - -/* Configuration spaces */ -#define CSNAME_KRB5CRED L"Krb5Cred" -#define CSNAME_PARAMS L"Parameters" -#define CSNAME_PROMPTCACHE L"PromptCache" -#define CSNAME_REALMS L"Realms" - -/* plugin constants */ -#define KRB5_PLUGIN_NAME L"Krb5Cred" -#define KRB5_IDENTPRO_NAME L"Krb5Ident" - -#define KRB5_CREDTYPE_NAME L"Krb5Cred" - -/* limits */ -/* maximum number of characters in a realm name */ -#define K5_MAXCCH_REALM 256 - -/* maximum number of characters in a host name */ -#define K5_MAXCCH_HOST 128 - -/* maximum number of KDC's per realm */ -#define K5_MAX_KDC 64 - -/* maximum number of domains that map to a realm */ -#define K5_MAX_DOMAIN_MAPPINGS 32 - -extern khm_handle csp_plugins; -extern khm_handle csp_krbcred; -extern khm_handle csp_params; - -extern kconf_schema schema_krbconfig[]; - -/* other globals */ -extern khm_int32 credtype_id_krb5; - -extern khm_boolean krb5_initialized; - -extern khm_handle krb5_credset; - -extern khm_handle k5_sub; - -extern krb5_context k5_identpro_ctx; - -extern BOOL is_k5_identpro; - -/* plugin callbacks */ -khm_int32 KHMAPI k5_msg_callback(khm_int32 msg_type, khm_int32 msg_subtype, khm_ui_4 uparam, void * vparam); -khm_int32 KHMAPI k5_ident_callback(khm_int32 msg_type, khm_int32 msg_subtype, khm_ui_4 uparam, void * vparam); - -/* kinit fiber */ -typedef struct _fiber_job_t { - int command; - - khui_new_creds * nc; - khui_new_creds_by_type * nct; - HWND dialog; - - khm_handle identity; - char * principal; - char * password; - char * ccache; - krb5_deltat lifetime; - DWORD forwardable; - DWORD proxiable; - DWORD renewable; - krb5_deltat renew_life; - DWORD addressless; - DWORD publicIP; - - int code; - int state; - int prompt_set; - - BOOL null_password; - BOOL valid_principal; -} fiber_job; - -extern fiber_job g_fjob; /* global fiber job object */ - -#define FIBER_CMD_KINIT 1 -#define FIBER_CMD_CANCEL 2 -#define FIBER_CMD_CONTINUE 3 - -#define FIBER_STATE_NONE 0 -#define FIBER_STATE_KINIT 1 - -#define K5_SET_CRED_MSG WMNC_USER - -void -k5_pp_begin(khui_property_sheet * s); - -void -k5_pp_end(khui_property_sheet * s); - -khm_int32 KHMAPI -k5_msg_cred_dialog(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam); - -khm_int32 KHMAPI -k5_msg_ident(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam); - -int -k5_get_realm_from_nc(khui_new_creds * nc, - wchar_t * buf, - khm_size cch_buf); - -void -k5_register_config_panels(void); - -void -k5_unregister_config_panels(void); - -INT_PTR CALLBACK -k5_ccconfig_dlgproc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -k5_id_tab_dlgproc(HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -k5_ids_tab_dlgproc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KRBAFSCRED_H +#define __KHIMAIRA_KRBAFSCRED_H + +#include + +/* While we generally pull resources out of hResModule, the message + strings for all the languages are kept in the main DLL. */ +#define KHERR_HMODULE hInstance +#define KHERR_FACILITY k5_facility +#define KHERR_FACILITY_ID 64 + +#include + +#include +#include +#include +#include + +#include +#include +#include + +typedef enum tag_k5_lsa_import { + K5_LSAIMPORT_NEVER = 0, + K5_LSAIMPORT_ALWAYS = 1, + K5_LSAIMPORT_MATCH = 2, /* only when the principal name matches */ +} k5_lsa_import; + +#define TYPENAME_ENCTYPE L"EncType" +#define TYPENAME_ADDR_LIST L"AddrList" +#define TYPENAME_KRB5_FLAGS L"Krb5Flags" +#define TYPENAME_KRB5_PRINC L"Krb5Principal" +#define TYPENAME_KVNO L"Kvno" + +#define ATTRNAME_KEY_ENCTYPE L"KeyEncType" +#define ATTRNAME_TKT_ENCTYPE L"TktEncType" +#define ATTRNAME_ADDR_LIST L"AddrList" +#define ATTRNAME_KRB5_FLAGS L"Krb5Flags" +#define ATTRNAME_KRB5_CCNAME L"Krb5CCName" +#define ATTRNAME_KVNO L"Kvno" + +void init_krb(); +void exit_krb(); +KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module); +KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module); + +/* globals */ +extern kmm_module h_khModule; +extern HMODULE hResModule; +extern HINSTANCE hInstance; +extern const wchar_t * k5_facility; + +extern khm_int32 type_id_enctype; +extern khm_int32 type_id_addr_list; +extern khm_int32 type_id_krb5_flags; +extern khm_int32 type_id_krb5_princ; +extern khm_int32 type_id_kvno; + +extern BOOL type_regd_krb5_princ; + +extern khm_int32 attr_id_key_enctype; +extern khm_int32 attr_id_tkt_enctype; +extern khm_int32 attr_id_addr_list; +extern khm_int32 attr_id_krb5_flags; +extern khm_int32 attr_id_krb5_ccname; +extern khm_int32 attr_id_kvno; + +extern khm_ui_4 k5_commctl_version; + +#define IS_COMMCTL6() (k5_commctl_version >= 0x60000) + +/* Configuration spaces */ +#define CSNAME_KRB5CRED L"Krb5Cred" +#define CSNAME_PARAMS L"Parameters" +#define CSNAME_PROMPTCACHE L"PromptCache" +#define CSNAME_REALMS L"Realms" + +/* plugin constants */ +#define KRB5_PLUGIN_NAME L"Krb5Cred" +#define KRB5_IDENTPRO_NAME L"Krb5Ident" + +#define KRB5_CREDTYPE_NAME L"Krb5Cred" + +/* limits */ +/* maximum number of characters in a realm name */ +#define K5_MAXCCH_REALM 256 + +/* maximum number of characters in a host name */ +#define K5_MAXCCH_HOST 128 + +/* maximum number of KDC's per realm */ +#define K5_MAX_KDC 64 + +/* maximum number of domains that map to a realm */ +#define K5_MAX_DOMAIN_MAPPINGS 32 + +extern khm_handle csp_plugins; +extern khm_handle csp_krbcred; +extern khm_handle csp_params; + +extern kconf_schema schema_krbconfig[]; + +/* other globals */ +extern khm_int32 credtype_id_krb5; + +extern khm_boolean krb5_initialized; + +extern khm_handle krb5_credset; + +extern khm_handle k5_sub; + +extern krb5_context k5_identpro_ctx; + +extern BOOL is_k5_identpro; + +/* plugin callbacks */ +khm_int32 KHMAPI k5_msg_callback(khm_int32 msg_type, khm_int32 msg_subtype, khm_ui_4 uparam, void * vparam); +khm_int32 KHMAPI k5_ident_callback(khm_int32 msg_type, khm_int32 msg_subtype, khm_ui_4 uparam, void * vparam); + +/* kinit fiber */ +typedef struct _fiber_job_t { + int command; + + khui_new_creds * nc; + khui_new_creds_by_type * nct; + HWND dialog; + + khm_handle identity; + char * principal; + char * password; + char * ccache; + krb5_deltat lifetime; + DWORD forwardable; + DWORD proxiable; + DWORD renewable; + krb5_deltat renew_life; + DWORD addressless; + DWORD publicIP; + + int code; + int state; + int prompt_set; + + BOOL null_password; + BOOL valid_principal; +} fiber_job; + +extern fiber_job g_fjob; /* global fiber job object */ + +#define FIBER_CMD_KINIT 1 +#define FIBER_CMD_CANCEL 2 +#define FIBER_CMD_CONTINUE 3 + +#define FIBER_STATE_NONE 0 +#define FIBER_STATE_KINIT 1 + +#define K5_SET_CRED_MSG WMNC_USER + +void +k5_pp_begin(khui_property_sheet * s); + +void +k5_pp_end(khui_property_sheet * s); + +khm_int32 KHMAPI +k5_msg_cred_dialog(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam); + +khm_int32 KHMAPI +k5_msg_ident(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam); + +int +k5_get_realm_from_nc(khui_new_creds * nc, + wchar_t * buf, + khm_size cch_buf); + +void +k5_register_config_panels(void); + +void +k5_unregister_config_panels(void); + +INT_PTR CALLBACK +k5_ccconfig_dlgproc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +k5_id_tab_dlgproc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +k5_ids_tab_dlgproc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/datarep.c +++ krb5-1.4.4/src/windows/identity/plugins/krb5/datarep.c @@ -1,407 +1,407 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/* Data representation and related functions */ - -#include -#include -#include -#include -#include -#include - -khm_int32 KHMAPI -enctype_toString(const void * data, khm_size cbdata, - wchar_t *destbuf, khm_size *pcbdestbuf, - khm_int32 flags) -{ - int resid = 0; - int etype; - wchar_t buf[256]; - size_t cblength; - - if(cbdata != sizeof(khm_int32)) - return KHM_ERROR_INVALID_PARAM; - - etype = *((khm_int32 *) data); - - switch(etype) { - case ENCTYPE_NULL: - resid = IDS_ETYPE_NULL; - break; - - case ENCTYPE_DES_CBC_CRC: - resid = IDS_ETYPE_DES_CBC_CRC; - break; - - case ENCTYPE_DES_CBC_MD4: - resid = IDS_ETYPE_DES_CBC_MD4; - break; - - case ENCTYPE_DES_CBC_MD5: - resid = IDS_ETYPE_DES_CBC_MD5; - break; - - case ENCTYPE_DES_CBC_RAW: - resid = IDS_ETYPE_DES_CBC_RAW; - break; - - case ENCTYPE_DES3_CBC_SHA: - resid = IDS_ETYPE_DES3_CBC_SHA; - break; - - case ENCTYPE_DES3_CBC_RAW: - resid = IDS_ETYPE_DES3_CBC_RAW; - break; - - case ENCTYPE_DES_HMAC_SHA1: - resid = IDS_ETYPE_DES_HMAC_SHA1; - break; - - case ENCTYPE_DES3_CBC_SHA1: - resid = IDS_ETYPE_DES3_CBC_SHA1; - break; - - case ENCTYPE_AES128_CTS_HMAC_SHA1_96: - resid = IDS_ETYPE_AES128_CTS_HMAC_SHA1_96; - break; - - case ENCTYPE_AES256_CTS_HMAC_SHA1_96: - resid = IDS_ETYPE_AES256_CTS_HMAC_SHA1_96; - break; - - case ENCTYPE_ARCFOUR_HMAC: - resid = IDS_ETYPE_ARCFOUR_HMAC; - break; - - case ENCTYPE_ARCFOUR_HMAC_EXP: - resid = IDS_ETYPE_ARCFOUR_HMAC_EXP; - break; - - case ENCTYPE_UNKNOWN: - resid = IDS_ETYPE_UNKNOWN; - break; - -#if 0 - case ENCTYPE_LOCAL_DES3_HMAC_SHA1: - resid = IDS_ETYPE_LOCAL_DES3_HMAC_SHA1; - break; - - case ENCTYPE_LOCAL_RC4_MD4: - resid = IDS_ETYPE_LOCAL_RC4_MD4; - break; -#endif - } - - if(resid != 0) { - LoadString(hResModule, (UINT) resid, buf, ARRAYLENGTH(buf)); - } else { - StringCbPrintf(buf, sizeof(buf), L"#%d", etype); - } - - StringCbLength(buf, ARRAYLENGTH(buf), &cblength); - cblength += sizeof(wchar_t); - - if(!destbuf || *pcbdestbuf < cblength) { - *pcbdestbuf = cblength; - return KHM_ERROR_TOO_LONG; - } else { - StringCbCopy(destbuf, *pcbdestbuf, buf); - *pcbdestbuf = cblength; - return KHM_ERROR_SUCCESS; - } -} - -khm_int32 KHMAPI -addr_list_comp(const void *d1, khm_size cb_d1, - const void *d2, khm_size cb_d2) -{ - if (cb_d1 < cb_d2) - return -1; - if (cb_d1 > cb_d2) - return 1; - return memcmp(d1, d2, cb_d1); -} - -khm_int32 KHMAPI -addr_list_toString(const void *d, khm_size cb_d, - wchar_t *buf, khm_size *pcb_buf, - khm_int32 flags) -{ - wchar_t tbuf[2048]; - wchar_t * strpos; - khm_size cbleft; - size_t t; - k5_serial_address * addrs; - - if (cb_d == 0 || d == NULL) { - tbuf[0] = L'\0'; - } else { - addrs = (k5_serial_address *) d; - - strpos = tbuf; - cbleft = sizeof(tbuf); - tbuf[0] = L'\0'; - - while (TRUE) { - if (cb_d < sizeof(*addrs) || - addrs->magic != K5_SERIAL_ADDRESS_MAGIC || - cb_d < sizeof(*addrs) + addrs->length - sizeof(khm_int32)) - break; - - if (strpos != tbuf) { - if (FAILED(StringCbCatEx(strpos, cbleft, L" ", - &strpos, &cbleft, - 0))) - break; - } - -#ifdef DEBUG - assert(*strpos == L'\0'); -#endif - - one_addr(addrs, strpos, cbleft); - - t = 0; - if (FAILED(StringCchLength(strpos, - cbleft / sizeof(wchar_t), - &t))) - break; - - strpos += t; - cbleft -= t * sizeof(wchar_t); - - t = sizeof(*addrs) + addrs->length - sizeof(khm_int32); - addrs = (k5_serial_address *) BYTEOFFSET(addrs, t); - cb_d -= t; - } - } - - StringCbLength(tbuf, sizeof(tbuf), &t); - - if (!buf || *pcb_buf < t) { - *pcb_buf = t; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buf, *pcb_buf, tbuf); - *pcb_buf = t; - - return KHM_ERROR_SUCCESS; -} - -khm_int32 KHMAPI -krb5flags_toString(const void *d, - khm_size cb_d, - wchar_t *buf, - khm_size *pcb_buf, - khm_int32 f) -{ - wchar_t sbuf[32]; - int i = 0; - khm_size cb; - khm_int32 flags; - - flags = *((khm_int32 *) d); - - if (flags & TKT_FLG_FORWARDABLE) - sbuf[i++] = L'F'; - - if (flags & TKT_FLG_FORWARDED) - sbuf[i++] = L'f'; - - if (flags & TKT_FLG_PROXIABLE) - sbuf[i++] = L'P'; - - if (flags & TKT_FLG_PROXY) - sbuf[i++] = L'p'; - - if (flags & TKT_FLG_MAY_POSTDATE) - sbuf[i++] = L'D'; - - if (flags & TKT_FLG_POSTDATED) - sbuf[i++] = L'd'; - - if (flags & TKT_FLG_INVALID) - sbuf[i++] = L'i'; - - if (flags & TKT_FLG_RENEWABLE) - sbuf[i++] = L'R'; - - if (flags & TKT_FLG_INITIAL) - sbuf[i++] = L'I'; - - if (flags & TKT_FLG_HW_AUTH) - sbuf[i++] = L'H'; - - if (flags & TKT_FLG_PRE_AUTH) - sbuf[i++] = L'A'; - - sbuf[i++] = L'\0'; - - cb = i * sizeof(wchar_t); - - if (!buf || *pcb_buf < cb) { - *pcb_buf = cb; - return KHM_ERROR_TOO_LONG; - } else { - StringCbCopy(buf, *pcb_buf, sbuf); - *pcb_buf = cb; - return KHM_ERROR_SUCCESS; - } -} - -khm_int32 KHMAPI -kvno_toString(const void * data, khm_size cbdata, - wchar_t *destbuf, khm_size *pcbdestbuf, - khm_int32 flags) -{ - int resid = 0; - int kvno; - wchar_t buf[256]; - size_t cblength; - - if (cbdata != sizeof(khm_int32)) - return KHM_ERROR_INVALID_PARAM; - - kvno = *((khm_int32 *) data); - - StringCbPrintf(buf, sizeof(buf), L"#%d", kvno); - - StringCbLength(buf, ARRAYLENGTH(buf), &cblength); - cblength += sizeof(wchar_t); - - if (!destbuf || *pcbdestbuf < cblength) { - *pcbdestbuf = cblength; - return KHM_ERROR_TOO_LONG; - } else { - StringCbCopy(destbuf, *pcbdestbuf, buf); - *pcbdestbuf = cblength; - return KHM_ERROR_SUCCESS; - } -} - -khm_int32 -serialize_krb5_addresses(krb5_address ** a, void * buf, size_t * pcbbuf) -{ - k5_serial_address * addr; - khm_size cb_req; - khm_size t; - khm_boolean overflow = FALSE; - - addr = (k5_serial_address *) buf; - cb_req = 0; - - for(; *a; a++) { - t = sizeof(k5_serial_address) + (*a)->length - sizeof(khm_int32); - cb_req += t; - if (cb_req < *pcbbuf) { - addr->magic = K5_SERIAL_ADDRESS_MAGIC; - addr->addrtype = (*a)->addrtype; - addr->length = (*a)->length; - memcpy(&addr->data, (*a)->contents, (*a)->length); - - addr = (k5_serial_address *) BYTEOFFSET(addr, t); - } else { - overflow = TRUE; - } - } - - *pcbbuf = cb_req; - - return (overflow)?KHM_ERROR_TOO_LONG: KHM_ERROR_SUCCESS; -} - -void -one_addr(k5_serial_address *a, wchar_t * buf, khm_size cbbuf) -{ - wchar_t retstr[256]; - struct hostent *h = NULL; - int no_resolve = 1; - - retstr[0] = L'\0'; - - if ((a->addrtype == ADDRTYPE_INET && a->length == 4) -#ifdef AF_INET6 - || (a->addrtype == ADDRTYPE_INET6 && a->length == 16) -#endif - ) - { - int af = AF_INET; -#ifdef AF_INET6 - if (a->addrtype == ADDRTYPE_INET6) - af = AF_INET6; -#endif - if (!no_resolve) { -#ifdef HAVE_GETIPNODEBYADDR - int err; - h = getipnodebyaddr(&a->data, a->length, af, &err); - if (h) { - StringCbPrintf(retstr, sizeof(retstr), L"%S", h->h_name); - freehostent(h); - } - else - h = gethostbyaddr(&a->data, a->length, af); - if (h) { - StringCbPrintf(retstr, sizeof(retstr), L"%S", h->h_name); - } -#endif - if (h) - goto _copy_string; - } - if (no_resolve || !h) { -#ifdef HAVE_INET_NTOP - char buf[46]; - const char *name = inet_ntop(a->addrtype, &a->data, buf, sizeof(buf)); - if (name) { - StringCbPrintf(retstr, sizeof(retstr), L"%S", name); - goto _copy_string; - } -#else - if (a->addrtype == ADDRTYPE_INET) { - khm_ui_4 addr = a->data; - StringCbPrintf(retstr, sizeof(retstr), - L"%d.%d.%d.%d", - (int) (addr & 0xff), - (int) ((addr >> 8) & 0xff), - (int) ((addr >> 16)& 0xff), - (int) ((addr >> 24)& 0xff)); - goto _copy_string; - } -#endif - } - } - - { - wchar_t tmpfmt[128]; - LoadString(hResModule, IDS_UNK_ADDR_FMT, tmpfmt, sizeof(tmpfmt)/sizeof(wchar_t)); - StringCbPrintf(retstr, sizeof(retstr), tmpfmt, a->addrtype); - } - - _copy_string: - StringCbCopy(buf, cbbuf, retstr); -} - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/* Data representation and related functions */ + +#include +#include +#include +#include +#include +#include + +khm_int32 KHMAPI +enctype_toString(const void * data, khm_size cbdata, + wchar_t *destbuf, khm_size *pcbdestbuf, + khm_int32 flags) +{ + int resid = 0; + int etype; + wchar_t buf[256]; + size_t cblength; + + if(cbdata != sizeof(khm_int32)) + return KHM_ERROR_INVALID_PARAM; + + etype = *((khm_int32 *) data); + + switch(etype) { + case ENCTYPE_NULL: + resid = IDS_ETYPE_NULL; + break; + + case ENCTYPE_DES_CBC_CRC: + resid = IDS_ETYPE_DES_CBC_CRC; + break; + + case ENCTYPE_DES_CBC_MD4: + resid = IDS_ETYPE_DES_CBC_MD4; + break; + + case ENCTYPE_DES_CBC_MD5: + resid = IDS_ETYPE_DES_CBC_MD5; + break; + + case ENCTYPE_DES_CBC_RAW: + resid = IDS_ETYPE_DES_CBC_RAW; + break; + + case ENCTYPE_DES3_CBC_SHA: + resid = IDS_ETYPE_DES3_CBC_SHA; + break; + + case ENCTYPE_DES3_CBC_RAW: + resid = IDS_ETYPE_DES3_CBC_RAW; + break; + + case ENCTYPE_DES_HMAC_SHA1: + resid = IDS_ETYPE_DES_HMAC_SHA1; + break; + + case ENCTYPE_DES3_CBC_SHA1: + resid = IDS_ETYPE_DES3_CBC_SHA1; + break; + + case ENCTYPE_AES128_CTS_HMAC_SHA1_96: + resid = IDS_ETYPE_AES128_CTS_HMAC_SHA1_96; + break; + + case ENCTYPE_AES256_CTS_HMAC_SHA1_96: + resid = IDS_ETYPE_AES256_CTS_HMAC_SHA1_96; + break; + + case ENCTYPE_ARCFOUR_HMAC: + resid = IDS_ETYPE_ARCFOUR_HMAC; + break; + + case ENCTYPE_ARCFOUR_HMAC_EXP: + resid = IDS_ETYPE_ARCFOUR_HMAC_EXP; + break; + + case ENCTYPE_UNKNOWN: + resid = IDS_ETYPE_UNKNOWN; + break; + +#if 0 + case ENCTYPE_LOCAL_DES3_HMAC_SHA1: + resid = IDS_ETYPE_LOCAL_DES3_HMAC_SHA1; + break; + + case ENCTYPE_LOCAL_RC4_MD4: + resid = IDS_ETYPE_LOCAL_RC4_MD4; + break; +#endif + } + + if(resid != 0) { + LoadString(hResModule, (UINT) resid, buf, ARRAYLENGTH(buf)); + } else { + StringCbPrintf(buf, sizeof(buf), L"#%d", etype); + } + + StringCbLength(buf, ARRAYLENGTH(buf), &cblength); + cblength += sizeof(wchar_t); + + if(!destbuf || *pcbdestbuf < cblength) { + *pcbdestbuf = cblength; + return KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(destbuf, *pcbdestbuf, buf); + *pcbdestbuf = cblength; + return KHM_ERROR_SUCCESS; + } +} + +khm_int32 KHMAPI +addr_list_comp(const void *d1, khm_size cb_d1, + const void *d2, khm_size cb_d2) +{ + if (cb_d1 < cb_d2) + return -1; + if (cb_d1 > cb_d2) + return 1; + return memcmp(d1, d2, cb_d1); +} + +khm_int32 KHMAPI +addr_list_toString(const void *d, khm_size cb_d, + wchar_t *buf, khm_size *pcb_buf, + khm_int32 flags) +{ + wchar_t tbuf[2048]; + wchar_t * strpos; + khm_size cbleft; + size_t t; + k5_serial_address * addrs; + + if (cb_d == 0 || d == NULL) { + tbuf[0] = L'\0'; + } else { + addrs = (k5_serial_address *) d; + + strpos = tbuf; + cbleft = sizeof(tbuf); + tbuf[0] = L'\0'; + + while (TRUE) { + if (cb_d < sizeof(*addrs) || + addrs->magic != K5_SERIAL_ADDRESS_MAGIC || + cb_d < sizeof(*addrs) + addrs->length - sizeof(khm_int32)) + break; + + if (strpos != tbuf) { + if (FAILED(StringCbCatEx(strpos, cbleft, L" ", + &strpos, &cbleft, + 0))) + break; + } + +#ifdef DEBUG + assert(*strpos == L'\0'); +#endif + + one_addr(addrs, strpos, cbleft); + + t = 0; + if (FAILED(StringCchLength(strpos, + cbleft / sizeof(wchar_t), + &t))) + break; + + strpos += t; + cbleft -= t * sizeof(wchar_t); + + t = sizeof(*addrs) + addrs->length - sizeof(khm_int32); + addrs = (k5_serial_address *) BYTEOFFSET(addrs, t); + cb_d -= t; + } + } + + StringCbLength(tbuf, sizeof(tbuf), &t); + + if (!buf || *pcb_buf < t) { + *pcb_buf = t; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buf, *pcb_buf, tbuf); + *pcb_buf = t; + + return KHM_ERROR_SUCCESS; +} + +khm_int32 KHMAPI +krb5flags_toString(const void *d, + khm_size cb_d, + wchar_t *buf, + khm_size *pcb_buf, + khm_int32 f) +{ + wchar_t sbuf[32]; + int i = 0; + khm_size cb; + khm_int32 flags; + + flags = *((khm_int32 *) d); + + if (flags & TKT_FLG_FORWARDABLE) + sbuf[i++] = L'F'; + + if (flags & TKT_FLG_FORWARDED) + sbuf[i++] = L'f'; + + if (flags & TKT_FLG_PROXIABLE) + sbuf[i++] = L'P'; + + if (flags & TKT_FLG_PROXY) + sbuf[i++] = L'p'; + + if (flags & TKT_FLG_MAY_POSTDATE) + sbuf[i++] = L'D'; + + if (flags & TKT_FLG_POSTDATED) + sbuf[i++] = L'd'; + + if (flags & TKT_FLG_INVALID) + sbuf[i++] = L'i'; + + if (flags & TKT_FLG_RENEWABLE) + sbuf[i++] = L'R'; + + if (flags & TKT_FLG_INITIAL) + sbuf[i++] = L'I'; + + if (flags & TKT_FLG_HW_AUTH) + sbuf[i++] = L'H'; + + if (flags & TKT_FLG_PRE_AUTH) + sbuf[i++] = L'A'; + + sbuf[i++] = L'\0'; + + cb = i * sizeof(wchar_t); + + if (!buf || *pcb_buf < cb) { + *pcb_buf = cb; + return KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(buf, *pcb_buf, sbuf); + *pcb_buf = cb; + return KHM_ERROR_SUCCESS; + } +} + +khm_int32 KHMAPI +kvno_toString(const void * data, khm_size cbdata, + wchar_t *destbuf, khm_size *pcbdestbuf, + khm_int32 flags) +{ + int resid = 0; + int kvno; + wchar_t buf[256]; + size_t cblength; + + if (cbdata != sizeof(khm_int32)) + return KHM_ERROR_INVALID_PARAM; + + kvno = *((khm_int32 *) data); + + StringCbPrintf(buf, sizeof(buf), L"#%d", kvno); + + StringCbLength(buf, ARRAYLENGTH(buf), &cblength); + cblength += sizeof(wchar_t); + + if (!destbuf || *pcbdestbuf < cblength) { + *pcbdestbuf = cblength; + return KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(destbuf, *pcbdestbuf, buf); + *pcbdestbuf = cblength; + return KHM_ERROR_SUCCESS; + } +} + +khm_int32 +serialize_krb5_addresses(krb5_address ** a, void * buf, size_t * pcbbuf) +{ + k5_serial_address * addr; + khm_size cb_req; + khm_size t; + khm_boolean overflow = FALSE; + + addr = (k5_serial_address *) buf; + cb_req = 0; + + for(; *a; a++) { + t = sizeof(k5_serial_address) + (*a)->length - sizeof(khm_int32); + cb_req += t; + if (cb_req < *pcbbuf) { + addr->magic = K5_SERIAL_ADDRESS_MAGIC; + addr->addrtype = (*a)->addrtype; + addr->length = (*a)->length; + memcpy(&addr->data, (*a)->contents, (*a)->length); + + addr = (k5_serial_address *) BYTEOFFSET(addr, t); + } else { + overflow = TRUE; + } + } + + *pcbbuf = cb_req; + + return (overflow)?KHM_ERROR_TOO_LONG: KHM_ERROR_SUCCESS; +} + +void +one_addr(k5_serial_address *a, wchar_t * buf, khm_size cbbuf) +{ + wchar_t retstr[256]; + struct hostent *h = NULL; + int no_resolve = 1; + + retstr[0] = L'\0'; + + if ((a->addrtype == ADDRTYPE_INET && a->length == 4) +#ifdef AF_INET6 + || (a->addrtype == ADDRTYPE_INET6 && a->length == 16) +#endif + ) + { + int af = AF_INET; +#ifdef AF_INET6 + if (a->addrtype == ADDRTYPE_INET6) + af = AF_INET6; +#endif + if (!no_resolve) { +#ifdef HAVE_GETIPNODEBYADDR + int err; + h = getipnodebyaddr(&a->data, a->length, af, &err); + if (h) { + StringCbPrintf(retstr, sizeof(retstr), L"%S", h->h_name); + freehostent(h); + } + else + h = gethostbyaddr(&a->data, a->length, af); + if (h) { + StringCbPrintf(retstr, sizeof(retstr), L"%S", h->h_name); + } +#endif + if (h) + goto _copy_string; + } + if (no_resolve || !h) { +#ifdef HAVE_INET_NTOP + char buf[46]; + const char *name = inet_ntop(a->addrtype, &a->data, buf, sizeof(buf)); + if (name) { + StringCbPrintf(retstr, sizeof(retstr), L"%S", name); + goto _copy_string; + } +#else + if (a->addrtype == ADDRTYPE_INET) { + khm_ui_4 addr = a->data; + StringCbPrintf(retstr, sizeof(retstr), + L"%d.%d.%d.%d", + (int) (addr & 0xff), + (int) ((addr >> 8) & 0xff), + (int) ((addr >> 16)& 0xff), + (int) ((addr >> 24)& 0xff)); + goto _copy_string; + } +#endif + } + } + + { + wchar_t tmpfmt[128]; + LoadString(hResModule, IDS_UNK_ADDR_FMT, tmpfmt, sizeof(tmpfmt)/sizeof(wchar_t)); + StringCbPrintf(retstr, sizeof(retstr), tmpfmt, a->addrtype); + } + + _copy_string: + StringCbCopy(buf, cbbuf, retstr); +} + --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/krb5plugin.c +++ krb5-1.4.4/src/windows/identity/plugins/krb5/krb5plugin.c @@ -1,246 +1,246 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#include -#include - -#ifdef DEBUG -#include -#endif - -khm_int32 credtype_id_krb5 = KCDB_CREDTYPE_INVALID; -khm_boolean krb5_initialized = FALSE; -khm_handle krb5_credset = NULL; - -khm_handle k5_sub = NULL; - -LPVOID k5_main_fiber = NULL; -LPVOID k5_kinit_fiber = NULL; - -VOID CALLBACK k5_kinit_fiber_proc(PVOID lpParameter); - -krb5_context k5_identpro_ctx = NULL; - -/* The system message handler. - - Runs in the context of the plugin thread */ -khm_int32 KHMAPI -k5_msg_system(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - switch(msg_subtype) { - case KMSG_SYSTEM_INIT: - { - kcdb_credtype ct; - wchar_t buf[KCDB_MAXCCH_SHORT_DESC]; - size_t cbsize; - - /* perform critical registrations and initialization - stuff */ - ZeroMemory(&ct, sizeof(ct)); - ct.id = KCDB_CREDTYPE_AUTO; - ct.name = KRB5_CREDTYPE_NAME; - - if(LoadString(hResModule, IDS_KRB5_SHORT_DESC, - buf, ARRAYLENGTH(buf))) { - StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); - cbsize += sizeof(wchar_t); - ct.short_desc = PMALLOC(cbsize); - StringCbCopy(ct.short_desc, cbsize, buf); - } - - /* even though ideally we should be setting limits - based KCDB_MAXCB_LONG_DESC, our long description - actually fits nicely in KCDB_MAXCB_SHORT_DESC */ - if(LoadString(hResModule, IDS_KRB5_LONG_DESC, - buf, ARRAYLENGTH(buf))) { - StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); - cbsize += sizeof(wchar_t); - ct.long_desc = PMALLOC(cbsize); - StringCbCopy(ct.long_desc, cbsize, buf); - } - - ct.icon = NULL; /* TODO: set a proper icon */ - - kmq_create_subscription(k5_msg_callback, &ct.sub); - - ct.is_equal = khm_krb5_creds_is_equal; - - rv = kcdb_credtype_register(&ct, &credtype_id_krb5); - - if(KHM_SUCCEEDED(rv)) - rv = kcdb_credset_create(&krb5_credset); - - if(ct.short_desc) - PFREE(ct.short_desc); - - if(ct.long_desc) - PFREE(ct.long_desc); - - if(KHM_SUCCEEDED(rv)) { - krb5_context ctx = NULL; - - krb5_initialized = TRUE; - - if(ctx != NULL) - pkrb5_free_context(ctx); - - /* now convert this thread to a fiber and create a - separate fiber to do kinit stuff */ - k5_main_fiber = ConvertThreadToFiber(NULL); - k5_kinit_fiber = CreateFiber(0,k5_kinit_fiber_proc,NULL); - - ZeroMemory(&g_fjob, sizeof(g_fjob)); - - kmq_create_subscription(k5_msg_callback, &k5_sub); - - k5_register_config_panels(); - - khm_krb5_list_tickets(&ctx); - } - } - break; - - case KMSG_SYSTEM_EXIT: - - k5_unregister_config_panels(); - - if(credtype_id_krb5 >= 0) { - /* basically just unregister the credential type */ - kcdb_credtype_unregister(credtype_id_krb5); - - /* kcdb knows how to deal with bad handles */ - kcdb_credset_delete(krb5_credset); - krb5_credset = NULL; - } - - if(k5_main_fiber != NULL) { - if (k5_kinit_fiber) { -#ifdef DEBUG - assert(k5_kinit_fiber != GetCurrentFiber()); -#endif -#ifdef CLEANUP_FIBERS_ON_EXIT - DeleteFiber(k5_kinit_fiber); - CloseHandle(k5_kinit_fiber); -#endif - k5_kinit_fiber = NULL; - } - - k5_main_fiber = NULL; - } - - if(k5_sub != NULL) { - kmq_delete_subscription(k5_sub); - k5_sub = NULL; - } - - break; - } - - return rv; -} - - -/* Handler for CRED type messages - - Runs in the context of the Krb5 plugin -*/ -khm_int32 KHMAPI -k5_msg_cred(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - switch(msg_subtype) { - case KMSG_CRED_REFRESH: - { - krb5_context ctx = NULL; - - khm_krb5_list_tickets(&ctx); - - if(ctx != NULL) - pkrb5_free_context(ctx); - } - break; - - case KMSG_CRED_DESTROY_CREDS: - { - khui_action_context * ctx; - - ctx = (khui_action_context *) vparam; - - if (ctx->credset) { - _begin_task(0); - _report_mr0(KHERR_INFO, MSG_ERR_CTX_DESTROY_CREDS); - _describe(); - - khm_krb5_destroy_by_credset(ctx->credset); - - _end_task(); - } - } - break; - - case KMSG_CRED_PP_BEGIN: - k5_pp_begin((khui_property_sheet *) vparam); - break; - - case KMSG_CRED_PP_END: - k5_pp_end((khui_property_sheet *) vparam); - break; - - default: - if(IS_CRED_ACQ_MSG(msg_subtype)) - return k5_msg_cred_dialog(msg_type, msg_subtype, - uparam, vparam); - } - - return rv; -} - -/* The main message handler. We don't do much here, except delegate - to other message handlers - - Runs in the context of the Krb5 plugin -*/ -khm_int32 KHMAPI -k5_msg_callback(khm_int32 msg_type, khm_int32 msg_subtype, - khm_ui_4 uparam, void * vparam) -{ - switch(msg_type) { - case KMSG_SYSTEM: - return k5_msg_system(msg_type, msg_subtype, uparam, vparam); - case KMSG_CRED: - return k5_msg_cred(msg_type, msg_subtype, uparam, vparam); - } - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +khm_int32 credtype_id_krb5 = KCDB_CREDTYPE_INVALID; +khm_boolean krb5_initialized = FALSE; +khm_handle krb5_credset = NULL; + +khm_handle k5_sub = NULL; + +LPVOID k5_main_fiber = NULL; +LPVOID k5_kinit_fiber = NULL; + +VOID CALLBACK k5_kinit_fiber_proc(PVOID lpParameter); + +krb5_context k5_identpro_ctx = NULL; + +/* The system message handler. + + Runs in the context of the plugin thread */ +khm_int32 KHMAPI +k5_msg_system(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + switch(msg_subtype) { + case KMSG_SYSTEM_INIT: + { + kcdb_credtype ct; + wchar_t buf[KCDB_MAXCCH_SHORT_DESC]; + size_t cbsize; + + /* perform critical registrations and initialization + stuff */ + ZeroMemory(&ct, sizeof(ct)); + ct.id = KCDB_CREDTYPE_AUTO; + ct.name = KRB5_CREDTYPE_NAME; + + if(LoadString(hResModule, IDS_KRB5_SHORT_DESC, + buf, ARRAYLENGTH(buf))) { + StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); + cbsize += sizeof(wchar_t); + ct.short_desc = PMALLOC(cbsize); + StringCbCopy(ct.short_desc, cbsize, buf); + } + + /* even though ideally we should be setting limits + based KCDB_MAXCB_LONG_DESC, our long description + actually fits nicely in KCDB_MAXCB_SHORT_DESC */ + if(LoadString(hResModule, IDS_KRB5_LONG_DESC, + buf, ARRAYLENGTH(buf))) { + StringCbLength(buf, KCDB_MAXCB_SHORT_DESC, &cbsize); + cbsize += sizeof(wchar_t); + ct.long_desc = PMALLOC(cbsize); + StringCbCopy(ct.long_desc, cbsize, buf); + } + + ct.icon = NULL; /* TODO: set a proper icon */ + + kmq_create_subscription(k5_msg_callback, &ct.sub); + + ct.is_equal = khm_krb5_creds_is_equal; + + rv = kcdb_credtype_register(&ct, &credtype_id_krb5); + + if(KHM_SUCCEEDED(rv)) + rv = kcdb_credset_create(&krb5_credset); + + if(ct.short_desc) + PFREE(ct.short_desc); + + if(ct.long_desc) + PFREE(ct.long_desc); + + if(KHM_SUCCEEDED(rv)) { + krb5_context ctx = NULL; + + krb5_initialized = TRUE; + + if(ctx != NULL) + pkrb5_free_context(ctx); + + /* now convert this thread to a fiber and create a + separate fiber to do kinit stuff */ + k5_main_fiber = ConvertThreadToFiber(NULL); + k5_kinit_fiber = CreateFiber(0,k5_kinit_fiber_proc,NULL); + + ZeroMemory(&g_fjob, sizeof(g_fjob)); + + kmq_create_subscription(k5_msg_callback, &k5_sub); + + k5_register_config_panels(); + + khm_krb5_list_tickets(&ctx); + } + } + break; + + case KMSG_SYSTEM_EXIT: + + k5_unregister_config_panels(); + + if(credtype_id_krb5 >= 0) { + /* basically just unregister the credential type */ + kcdb_credtype_unregister(credtype_id_krb5); + + /* kcdb knows how to deal with bad handles */ + kcdb_credset_delete(krb5_credset); + krb5_credset = NULL; + } + + if(k5_main_fiber != NULL) { + if (k5_kinit_fiber) { +#ifdef DEBUG + assert(k5_kinit_fiber != GetCurrentFiber()); +#endif +#ifdef CLEANUP_FIBERS_ON_EXIT + DeleteFiber(k5_kinit_fiber); + CloseHandle(k5_kinit_fiber); +#endif + k5_kinit_fiber = NULL; + } + + k5_main_fiber = NULL; + } + + if(k5_sub != NULL) { + kmq_delete_subscription(k5_sub); + k5_sub = NULL; + } + + break; + } + + return rv; +} + + +/* Handler for CRED type messages + + Runs in the context of the Krb5 plugin +*/ +khm_int32 KHMAPI +k5_msg_cred(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + switch(msg_subtype) { + case KMSG_CRED_REFRESH: + { + krb5_context ctx = NULL; + + khm_krb5_list_tickets(&ctx); + + if(ctx != NULL) + pkrb5_free_context(ctx); + } + break; + + case KMSG_CRED_DESTROY_CREDS: + { + khui_action_context * ctx; + + ctx = (khui_action_context *) vparam; + + if (ctx->credset) { + _begin_task(0); + _report_mr0(KHERR_INFO, MSG_ERR_CTX_DESTROY_CREDS); + _describe(); + + khm_krb5_destroy_by_credset(ctx->credset); + + _end_task(); + } + } + break; + + case KMSG_CRED_PP_BEGIN: + k5_pp_begin((khui_property_sheet *) vparam); + break; + + case KMSG_CRED_PP_END: + k5_pp_end((khui_property_sheet *) vparam); + break; + + default: + if(IS_CRED_ACQ_MSG(msg_subtype)) + return k5_msg_cred_dialog(msg_type, msg_subtype, + uparam, vparam); + } + + return rv; +} + +/* The main message handler. We don't do much here, except delegate + to other message handlers + + Runs in the context of the Krb5 plugin +*/ +khm_int32 KHMAPI +k5_msg_callback(khm_int32 msg_type, khm_int32 msg_subtype, + khm_ui_4 uparam, void * vparam) +{ + switch(msg_type) { + case KMSG_SYSTEM: + return k5_msg_system(msg_type, msg_subtype, uparam, vparam); + case KMSG_CRED: + return k5_msg_cred(msg_type, msg_subtype, uparam, vparam); + } + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/langres.h +++ krb5-1.4.4/src/windows/identity/plugins/krb5/langres.h @@ -1,214 +1,214 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by C:\work\pismere\athena\auth\krb5\src\windows\identity\plugins\krb5\lang\en_us\langres.rc -// -#define IDS_UNK_ADDR_FMT 101 -#define IDD_NC_KRB5 102 -#define IDS_KRB5_CREDTEXT_0 102 -#define IDS_KRB5_CCNAME_SHORT_DESC 103 -#define IDS_KEY_ENCTYPE_SHORT_DESC 104 -#define IDD_CONFIG 104 -#define IDS_TKT_ENCTYPE_SHORT_DESC 105 -#define IDD_CFG_REALMS 105 -#define IDS_KEY_ENCTYPE_LONG_DESC 106 -#define IDD_CFG_IDS_TAB 106 -#define IDS_TKT_ENCTYPE_LONG_DESC 107 -#define IDD_PP_KRB5C 107 -#define IDS_ADDR_LIST_SHORT_DESC 108 -#define IDD_PP_KRB5 108 -#define IDS_ADDR_LIST_LONG_DESC 109 -#define IDD_CFG_ID_TAB 109 -#define IDS_ETYPE_NULL 110 -#define IDD_NC_KRB5_PASSWORD 110 -#define IDS_ETYPE_DES_CBC_CRC 111 -#define IDD_CFG_CACHES 111 -#define IDS_ETYPE_DES_CBC_MD4 112 -#define IDI_PLUGIN 112 -#define IDS_ETYPE_DES_CBC_MD5 113 -#define IDI_DELETED 113 -#define IDS_ETYPE_DES_CBC_RAW 114 -#define IDI_NEW 114 -#define IDS_ETYPE_DES3_CBC_SHA 115 -#define IDI_NORMAL 115 -#define IDS_ETYPE_DES3_CBC_RAW 116 -#define IDI_MODIFIED 116 -#define IDS_ETYPE_DES_HMAC_SHA1 117 -#define IDS_ETYPE_DES3_CBC_SHA1 118 -#define IDS_ETYPE_AES128_CTS_HMAC_SHA1_96 119 -#define IDS_ETYPE_AES256_CTS_HMAC_SHA1_96 120 -#define IDS_ETYPE_ARCFOUR_HMAC 121 -#define IDS_ETYPE_ARCFOUR_HMAC_EXP 122 -#define IDS_ETYPE_UNKNOWN 123 -#define IDS_ETYPE_LOCAL_DES3_HMAC_SHA1 124 -#define IDS_ETYPE_LOCAL_RC4_MD4 125 -#define IDS_KRB5_SHORT_DESC 126 -#define IDS_KRB5_LONG_DESC 127 -#define IDS_KRB4_SHORT_DESC 128 -#define IDS_KRB4_LONG_DESC 129 -#define IDS_KRB5_FLAGS_SHORT_DESC 130 -#define IDS_RENEW_TILL_SHORT_DESC 131 -#define IDS_RENEW_TILL_LONG_DESC 132 -#define IDS_RENEW_FOR_SHORT_DESC 133 -#define IDS_RENEW_FOR_LONG_DESC 134 -#define IDS_KRB5_CCNAME_LONG_DESC 135 -#define IDS_NC_USERNAME 136 -#define IDS_NC_REALM 137 -#define IDS_KRB5_WARNING 138 -#define IDS_K5ERR_NAME_EXPIRED 139 -#define IDS_K5ERR_KEY_EXPIRED 140 -#define IDS_KRB5_WARN_FMT 141 -#define IDS_K5ERR_FMT 142 -#define IDS_K5CFG_SHORT_DESC 143 -#define IDS_K5CFG_LONG_DESC 144 -#define IDS_K5RLM_SHORT_DESC 145 -#define IDS_K5RLM_LONG_DESC 146 -#define IDS_K5CFG_IDS_SHORT_DESC 147 -#define IDS_K5CFG_IDS_LONG_DESC 148 -#define IDS_K5CFG_ID_SHORT_DESC 149 -#define IDS_K5CFG_ID_LONG_DESC 150 -#define IDS_PLUGIN_DESC 151 -#define IDS_NC_PWD_BANNER 152 -#define IDS_NC_PWD_PWD 153 -#define IDS_NC_PWD_NPWD 154 -#define IDS_NC_PWD_NPWD_AGAIN 155 -#define IDS_KRB5_CREDTEXT_P0 156 -#define IDS_K5CFG_IMPORT_OPTIONS 157 -#define IDS_IDENTPRO_DESC 158 -#define IDS_K5CCC_SHORT_DESC 159 -#define IDS_K5CCC_LONG_DESC 160 -#define IDS_CFG_FCTITLE 161 -#define IDS_CFG_FCN_WARNING 162 -#define IDS_CFG_FCN_W_NOTFOUND 163 -#define IDS_CFG_FCN_W_RELATIVE 164 -#define IDS_CFG_FCOPENTITLE 165 -#define IDS_UNAVAILABLE 166 -#define IDS_FLG_FORWARDABLE 167 -#define IDS_FLG_FORWARDED 168 -#define IDS_FLG_PROXIABLE 169 -#define IDS_FLG_PROXY 170 -#define IDS_FLG_MAY_POSTDATE 171 -#define IDS_FLG_POSTDATED 172 -#define IDS_FLG_INVALID 173 -#define IDS_FLG_RENEWABLE 174 -#define IDS_FLG_INITIAL 175 -#define IDS_FLG_PRE_AUTH 176 -#define IDS_FLG_HW_AUTH 177 -#define IDS_FLG_TRANSIT_POL 178 -#define IDS_FLG_OK_DELEGATE 179 -#define IDS_FLG_ANONYMOUS 180 -#define IDS_K5ERR_CANTWRITEPROFILE 181 -#define IDS_K5ERR_PROFNOWRITE 182 -#define IDS_K5ERR_PROFUSETEMP 183 -#define IDS_K5ERR_PROFSUGGEST 184 -#define IDS_CFG_RE_REALMS 185 -#define IDS_CFG_RE_KDCS 186 -#define IDS_CFG_RE_DMAPS 187 -#define IDS_CFG_RE_KDCS_R 188 -#define IDS_CFG_RE_DMAPS_R 189 -#define IDS_CFG_RE_HEAD_SVR 190 -#define IDS_CFG_RE_HEAD_ADMIN 191 -#define IDS_CFG_RE_HEAD_MASTER 192 -#define IDS_CFG_RE_HEAD_DOMAIN 193 -#define IDS_CFG_RE_NEWREALM 194 -#define IDS_YES 195 -#define IDS_NO 196 -#define IDS_CFG_RE_NEWSERVER 197 -#define IDS_CFG_RE_NEWDMAP 198 -#define IDS_KRB5_NC_NAME 199 -#define IDS_NCERR_IDENT_TOO_LONG 200 -#define IDS_NCERR_IDENT_INVALID 201 -#define IDS_NCERR_IDENT_UNKNOWN 202 -#define IDS_CFG_RE_ARNUT 203 -#define IDS_CFG_RE_ARNUM 204 -#define IDS_CFG_RE_ASNUT 205 -#define IDS_CFG_RE_ASNUM 206 -#define IDS_CFG_RE_DMNUT 207 -#define IDS_CFG_RE_DMNUM 208 -#define IDS_CFG_RE_MNR 209 -#define IDS_CFG_RE_MDR 210 -#define IDS_CFG_RE_MNK 211 -#define IDS_CFG_RE_MDK 212 -#define IDS_CFG_RE_MAK 213 -#define IDS_CFG_RE_MMK 214 -#define IDS_CFG_RE_MND 215 -#define IDS_CFG_RE_MDD 216 -#define IDS_KVNO_SHORT_DESC 217 -#define IDS_KVNO_LONG_DESC 218 -#define IDC_NCK5_RENEWABLE 1002 -#define IDC_NCK5_FORWARDABLE 1004 -#define IDC_NCK5_REALM 1005 -#define IDC_NCK5_ADD_REALMS 1006 -#define IDC_NCK5_LIFETIME_EDIT 1008 -#define IDC_NCK5_RENEW_EDIT 1009 -#define IDC_PPK5_CRENEW 1014 -#define IDC_PPK5_CFORWARD 1015 -#define IDC_PPK5_CPROXY 1016 -#define IDC_PPK5_NAME 1017 -#define IDC_PPK5_ISSUE 1018 -#define IDC_PPK5_VALID 1019 -#define IDC_PPK5_RENEW 1020 -#define IDC_CHECK2 1022 -#define IDC_CHECK4 1024 -#define IDC_PPK5_LIFETIME 1024 -#define IDC_CHECK5 1025 -#define IDC_CFG_LBL_REALM 1025 -#define IDC_CFG_DEFREALM 1026 -#define IDC_CFG_LBL_CFGFILE 1029 -#define IDC_CFG_CFGFILE 1030 -#define IDC_CFG_WINGRP 1031 -#define IDC_LBL_IMPORT 1032 -#define IDC_CFG_IMPORT 1033 -#define IDC_CFG_LBL_HOSTNAME 1034 -#define IDC_CFG_HOSTNAME 1035 -#define IDC_CFG_LBL_DOMAIN 1036 -#define IDC_CFG_DOMAIN 1037 -#define IDC_CFG_CREATECONFIG 1038 -#define IDC_CFG_BROWSE 1039 -#define IDC_CFG_CFGFILEGRP 1040 -#define IDC_CFG_CFGREALMS 1041 -#define IDC_CFG_REALMS 1044 -#define IDC_CFG_DOMAINGRP 1045 -#define IDC_CFG_SERVERSGRP 1046 -#define IDC_LIST3 1047 -#define IDC_CFG_KDC 1047 -#define IDC_LIST4 1048 -#define IDC_CFG_DMAP 1048 -#define IDC_CFG_LBL_DEFLIFE 1049 -#define IDC_CFG_DEFLIFE 1050 -#define IDC_CFG_LBL_DEFRLIFE 1051 -#define IDC_CFG_DEFRLIFE 1052 -#define IDC_CFG_LIFEGRP 1053 -#define IDC_CFG_LRNG_MIN 1054 -#define IDC_CFG_LRNG_MAX 1055 -#define IDC_CFG_RLRNG_MIN 1056 -#define IDC_CFG_RLRNG_MAX 1057 -#define IDC_CFG_CCACHE 1058 -#define IDC_CFG_FCGRP 1059 -#define IDC_CFG_FCLIST 1060 -#define IDC_CFG_FCNAME 1062 -#define IDC_CFG_ADD 1064 -#define IDC_CFG_REMOVE 1065 -#define IDC_CFG_INCAPI 1066 -#define IDC_CFG_INCMSLSA 1067 -#define IDC_PPK5_FLAGS 1072 -#define IDC_CFG_INCREALMS 1073 -#define IDC_NCK5_ADDRESS 1074 -#define IDC_IPADDRESS1 1075 -#define IDC_NCK5_PUBLICIP 1075 -#define IDC_CFG_PUBLICIP 1075 -#define IDC_CFG_RENEW 1076 -#define IDC_CHECK3 1077 -#define IDC_CFG_ADDRESSLESS 1077 -#define IDC_CFG_FORWARD 1078 -#define ID_FOO_BAR 40001 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 219 -#define _APS_NEXT_COMMAND_VALUE 40002 -#define _APS_NEXT_CONTROL_VALUE 1079 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by C:\work\pismere\athena\auth\krb5\src\windows\identity\plugins\krb5\lang\en_us\langres.rc +// +#define IDS_UNK_ADDR_FMT 101 +#define IDD_NC_KRB5 102 +#define IDS_KRB5_CREDTEXT_0 102 +#define IDS_KRB5_CCNAME_SHORT_DESC 103 +#define IDS_KEY_ENCTYPE_SHORT_DESC 104 +#define IDD_CONFIG 104 +#define IDS_TKT_ENCTYPE_SHORT_DESC 105 +#define IDD_CFG_REALMS 105 +#define IDS_KEY_ENCTYPE_LONG_DESC 106 +#define IDD_CFG_IDS_TAB 106 +#define IDS_TKT_ENCTYPE_LONG_DESC 107 +#define IDD_PP_KRB5C 107 +#define IDS_ADDR_LIST_SHORT_DESC 108 +#define IDD_PP_KRB5 108 +#define IDS_ADDR_LIST_LONG_DESC 109 +#define IDD_CFG_ID_TAB 109 +#define IDS_ETYPE_NULL 110 +#define IDD_NC_KRB5_PASSWORD 110 +#define IDS_ETYPE_DES_CBC_CRC 111 +#define IDD_CFG_CACHES 111 +#define IDS_ETYPE_DES_CBC_MD4 112 +#define IDI_PLUGIN 112 +#define IDS_ETYPE_DES_CBC_MD5 113 +#define IDI_DELETED 113 +#define IDS_ETYPE_DES_CBC_RAW 114 +#define IDI_NEW 114 +#define IDS_ETYPE_DES3_CBC_SHA 115 +#define IDI_NORMAL 115 +#define IDS_ETYPE_DES3_CBC_RAW 116 +#define IDI_MODIFIED 116 +#define IDS_ETYPE_DES_HMAC_SHA1 117 +#define IDS_ETYPE_DES3_CBC_SHA1 118 +#define IDS_ETYPE_AES128_CTS_HMAC_SHA1_96 119 +#define IDS_ETYPE_AES256_CTS_HMAC_SHA1_96 120 +#define IDS_ETYPE_ARCFOUR_HMAC 121 +#define IDS_ETYPE_ARCFOUR_HMAC_EXP 122 +#define IDS_ETYPE_UNKNOWN 123 +#define IDS_ETYPE_LOCAL_DES3_HMAC_SHA1 124 +#define IDS_ETYPE_LOCAL_RC4_MD4 125 +#define IDS_KRB5_SHORT_DESC 126 +#define IDS_KRB5_LONG_DESC 127 +#define IDS_KRB4_SHORT_DESC 128 +#define IDS_KRB4_LONG_DESC 129 +#define IDS_KRB5_FLAGS_SHORT_DESC 130 +#define IDS_RENEW_TILL_SHORT_DESC 131 +#define IDS_RENEW_TILL_LONG_DESC 132 +#define IDS_RENEW_FOR_SHORT_DESC 133 +#define IDS_RENEW_FOR_LONG_DESC 134 +#define IDS_KRB5_CCNAME_LONG_DESC 135 +#define IDS_NC_USERNAME 136 +#define IDS_NC_REALM 137 +#define IDS_KRB5_WARNING 138 +#define IDS_K5ERR_NAME_EXPIRED 139 +#define IDS_K5ERR_KEY_EXPIRED 140 +#define IDS_KRB5_WARN_FMT 141 +#define IDS_K5ERR_FMT 142 +#define IDS_K5CFG_SHORT_DESC 143 +#define IDS_K5CFG_LONG_DESC 144 +#define IDS_K5RLM_SHORT_DESC 145 +#define IDS_K5RLM_LONG_DESC 146 +#define IDS_K5CFG_IDS_SHORT_DESC 147 +#define IDS_K5CFG_IDS_LONG_DESC 148 +#define IDS_K5CFG_ID_SHORT_DESC 149 +#define IDS_K5CFG_ID_LONG_DESC 150 +#define IDS_PLUGIN_DESC 151 +#define IDS_NC_PWD_BANNER 152 +#define IDS_NC_PWD_PWD 153 +#define IDS_NC_PWD_NPWD 154 +#define IDS_NC_PWD_NPWD_AGAIN 155 +#define IDS_KRB5_CREDTEXT_P0 156 +#define IDS_K5CFG_IMPORT_OPTIONS 157 +#define IDS_IDENTPRO_DESC 158 +#define IDS_K5CCC_SHORT_DESC 159 +#define IDS_K5CCC_LONG_DESC 160 +#define IDS_CFG_FCTITLE 161 +#define IDS_CFG_FCN_WARNING 162 +#define IDS_CFG_FCN_W_NOTFOUND 163 +#define IDS_CFG_FCN_W_RELATIVE 164 +#define IDS_CFG_FCOPENTITLE 165 +#define IDS_UNAVAILABLE 166 +#define IDS_FLG_FORWARDABLE 167 +#define IDS_FLG_FORWARDED 168 +#define IDS_FLG_PROXIABLE 169 +#define IDS_FLG_PROXY 170 +#define IDS_FLG_MAY_POSTDATE 171 +#define IDS_FLG_POSTDATED 172 +#define IDS_FLG_INVALID 173 +#define IDS_FLG_RENEWABLE 174 +#define IDS_FLG_INITIAL 175 +#define IDS_FLG_PRE_AUTH 176 +#define IDS_FLG_HW_AUTH 177 +#define IDS_FLG_TRANSIT_POL 178 +#define IDS_FLG_OK_DELEGATE 179 +#define IDS_FLG_ANONYMOUS 180 +#define IDS_K5ERR_CANTWRITEPROFILE 181 +#define IDS_K5ERR_PROFNOWRITE 182 +#define IDS_K5ERR_PROFUSETEMP 183 +#define IDS_K5ERR_PROFSUGGEST 184 +#define IDS_CFG_RE_REALMS 185 +#define IDS_CFG_RE_KDCS 186 +#define IDS_CFG_RE_DMAPS 187 +#define IDS_CFG_RE_KDCS_R 188 +#define IDS_CFG_RE_DMAPS_R 189 +#define IDS_CFG_RE_HEAD_SVR 190 +#define IDS_CFG_RE_HEAD_ADMIN 191 +#define IDS_CFG_RE_HEAD_MASTER 192 +#define IDS_CFG_RE_HEAD_DOMAIN 193 +#define IDS_CFG_RE_NEWREALM 194 +#define IDS_YES 195 +#define IDS_NO 196 +#define IDS_CFG_RE_NEWSERVER 197 +#define IDS_CFG_RE_NEWDMAP 198 +#define IDS_KRB5_NC_NAME 199 +#define IDS_NCERR_IDENT_TOO_LONG 200 +#define IDS_NCERR_IDENT_INVALID 201 +#define IDS_NCERR_IDENT_UNKNOWN 202 +#define IDS_CFG_RE_ARNUT 203 +#define IDS_CFG_RE_ARNUM 204 +#define IDS_CFG_RE_ASNUT 205 +#define IDS_CFG_RE_ASNUM 206 +#define IDS_CFG_RE_DMNUT 207 +#define IDS_CFG_RE_DMNUM 208 +#define IDS_CFG_RE_MNR 209 +#define IDS_CFG_RE_MDR 210 +#define IDS_CFG_RE_MNK 211 +#define IDS_CFG_RE_MDK 212 +#define IDS_CFG_RE_MAK 213 +#define IDS_CFG_RE_MMK 214 +#define IDS_CFG_RE_MND 215 +#define IDS_CFG_RE_MDD 216 +#define IDS_KVNO_SHORT_DESC 217 +#define IDS_KVNO_LONG_DESC 218 +#define IDC_NCK5_RENEWABLE 1002 +#define IDC_NCK5_FORWARDABLE 1004 +#define IDC_NCK5_REALM 1005 +#define IDC_NCK5_ADD_REALMS 1006 +#define IDC_NCK5_LIFETIME_EDIT 1008 +#define IDC_NCK5_RENEW_EDIT 1009 +#define IDC_PPK5_CRENEW 1014 +#define IDC_PPK5_CFORWARD 1015 +#define IDC_PPK5_CPROXY 1016 +#define IDC_PPK5_NAME 1017 +#define IDC_PPK5_ISSUE 1018 +#define IDC_PPK5_VALID 1019 +#define IDC_PPK5_RENEW 1020 +#define IDC_CHECK2 1022 +#define IDC_CHECK4 1024 +#define IDC_PPK5_LIFETIME 1024 +#define IDC_CHECK5 1025 +#define IDC_CFG_LBL_REALM 1025 +#define IDC_CFG_DEFREALM 1026 +#define IDC_CFG_LBL_CFGFILE 1029 +#define IDC_CFG_CFGFILE 1030 +#define IDC_CFG_WINGRP 1031 +#define IDC_LBL_IMPORT 1032 +#define IDC_CFG_IMPORT 1033 +#define IDC_CFG_LBL_HOSTNAME 1034 +#define IDC_CFG_HOSTNAME 1035 +#define IDC_CFG_LBL_DOMAIN 1036 +#define IDC_CFG_DOMAIN 1037 +#define IDC_CFG_CREATECONFIG 1038 +#define IDC_CFG_BROWSE 1039 +#define IDC_CFG_CFGFILEGRP 1040 +#define IDC_CFG_CFGREALMS 1041 +#define IDC_CFG_REALMS 1044 +#define IDC_CFG_DOMAINGRP 1045 +#define IDC_CFG_SERVERSGRP 1046 +#define IDC_LIST3 1047 +#define IDC_CFG_KDC 1047 +#define IDC_LIST4 1048 +#define IDC_CFG_DMAP 1048 +#define IDC_CFG_LBL_DEFLIFE 1049 +#define IDC_CFG_DEFLIFE 1050 +#define IDC_CFG_LBL_DEFRLIFE 1051 +#define IDC_CFG_DEFRLIFE 1052 +#define IDC_CFG_LIFEGRP 1053 +#define IDC_CFG_LRNG_MIN 1054 +#define IDC_CFG_LRNG_MAX 1055 +#define IDC_CFG_RLRNG_MIN 1056 +#define IDC_CFG_RLRNG_MAX 1057 +#define IDC_CFG_CCACHE 1058 +#define IDC_CFG_FCGRP 1059 +#define IDC_CFG_FCLIST 1060 +#define IDC_CFG_FCNAME 1062 +#define IDC_CFG_ADD 1064 +#define IDC_CFG_REMOVE 1065 +#define IDC_CFG_INCAPI 1066 +#define IDC_CFG_INCMSLSA 1067 +#define IDC_PPK5_FLAGS 1072 +#define IDC_CFG_INCREALMS 1073 +#define IDC_NCK5_ADDRESS 1074 +#define IDC_IPADDRESS1 1075 +#define IDC_NCK5_PUBLICIP 1075 +#define IDC_CFG_PUBLICIP 1075 +#define IDC_CFG_RENEW 1076 +#define IDC_CHECK3 1077 +#define IDC_CFG_ADDRESSLESS 1077 +#define IDC_CFG_FORWARD 1078 +#define ID_FOO_BAR 40001 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 219 +#define _APS_NEXT_COMMAND_VALUE 40002 +#define _APS_NEXT_CONTROL_VALUE 1079 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/krb5newcreds.c +++ krb5-1.4.4/src/windows/identity/plugins/krb5/krb5newcreds.c @@ -1,2462 +1,2462 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#include - -#include - -#include - -extern LPVOID k5_main_fiber; -extern LPVOID k5_kinit_fiber; - -typedef struct k5_dlg_data_t { - khui_new_creds * nc; - - khui_tracker tc_lifetime; - khui_tracker tc_renew; - - BOOL dirty; /* is the data in sync with the - configuration store? */ - BOOL sync; /* is the data in sync with the kinit - request? */ - DWORD renewable; - DWORD forwardable; - DWORD proxiable; - DWORD addressless; - DWORD publicIP; - - wchar_t * cred_message; /* overrides the credential text, if - non-NULL */ -} k5_dlg_data; - - -INT_PTR -k5_handle_wm_initdialog(HWND hwnd, - WPARAM wParam, - LPARAM lParam) -{ - HWND hw; - k5_dlg_data * d; - khui_new_creds_by_type * nct; - - d = PMALLOC(sizeof(*d)); - ZeroMemory(d, sizeof(*d)); - /* lParam is a pointer to a khui_new_creds structure */ - d->nc = (khui_new_creds *) lParam; - khui_cw_find_type(d->nc, credtype_id_krb5, &nct); - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) d); -#pragma warning(pop) - - nct->aux = (LPARAM) d; - - if (d->nc->subtype == KMSG_CRED_NEW_CREDS) { - khui_tracker_initialize(&d->tc_lifetime); - khui_tracker_initialize(&d->tc_renew); - - hw = GetDlgItem(hwnd, IDC_NCK5_LIFETIME_EDIT); - khui_tracker_install(hw, &d->tc_lifetime); - - hw = GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT); - khui_tracker_install(hw, &d->tc_renew); - } - return TRUE; -} - -INT_PTR -k5_handle_wm_destroy(HWND hwnd, - WPARAM wParam, - LPARAM lParam) -{ - k5_dlg_data * d; - khui_new_creds_by_type * nct = NULL; - - d = (k5_dlg_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (!d) - return TRUE; - - khui_cw_find_type(d->nc, credtype_id_krb5, &nct); - -#ifdef DEBUG - assert(nct); -#endif - - nct->aux = 0; - - if (d->nc->subtype == KMSG_CRED_NEW_CREDS) { - khui_tracker_kill_controls(&d->tc_renew); - khui_tracker_kill_controls(&d->tc_lifetime); - } - - PFREE(d); - - return TRUE; -} - -INT_PTR -k5_handle_wmnc_notify(HWND hwnd, - WPARAM wParam, - LPARAM lParam) -{ - switch(HIWORD(wParam)) { - case WMNC_DIALOG_MOVE: - { - k5_dlg_data * d; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (d->nc->subtype == KMSG_CRED_NEW_CREDS) { - khui_tracker_reposition(&d->tc_lifetime); - khui_tracker_reposition(&d->tc_renew); - } - - return TRUE; - } - break; - - case WMNC_DIALOG_SETUP: - { - k5_dlg_data * d; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (d->nc->subtype == KMSG_CRED_PASSWORD) - return TRUE; - - /* need to update the controls with d->* */ - SendDlgItemMessage(hwnd, IDC_NCK5_RENEWABLE, - BM_SETCHECK, - (d->renewable? BST_CHECKED : BST_UNCHECKED), - 0); - EnableWindow(GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT), - !!d->renewable); - - khui_tracker_refresh(&d->tc_lifetime); - khui_tracker_refresh(&d->tc_renew); - - SendDlgItemMessage(hwnd, IDC_NCK5_FORWARDABLE, - BM_SETCHECK, - (d->forwardable ? BST_CHECKED : BST_UNCHECKED), - 0); - - SendDlgItemMessage(hwnd, IDC_NCK5_ADDRESS, - BM_SETCHECK, - (d->addressless ? BST_CHECKED : BST_UNCHECKED), - 0); - - SendDlgItemMessage(hwnd, IDC_NCK5_PUBLICIP, - IPM_SETADDRESS, - 0, d->publicIP); - - EnableWindow(GetDlgItem(hwnd, IDC_NCK5_PUBLICIP), !d->addressless); - } - break; - - case WMNC_UPDATE_CREDTEXT: - { - k5_dlg_data * d; - khui_new_creds * nc; - khui_new_creds_by_type * nct; - wchar_t sbuf[1024]; - wchar_t fbuf[256]; - wchar_t tbuf[256]; - size_t cbsize; - khm_int32 flags; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - nc = d->nc; - khui_cw_find_type(nc, credtype_id_krb5, &nct); - - if(nct == NULL) - break; - - if(nct->credtext) - PFREE(nct->credtext); - nct->credtext = NULL; - - tbuf[0] = L'\0'; - - if (nc->n_identities > 0 && - KHM_SUCCEEDED(kcdb_identity_get_flags(nc->identities[0], - &flags)) && - (flags & KCDB_IDENT_FLAG_VALID) && - nc->subtype == KMSG_CRED_NEW_CREDS) { - - if (is_k5_identpro) - k5_get_realm_from_nc(nc, tbuf, ARRAYLENGTH(tbuf)); - else - GetDlgItemText(hwnd, IDC_NCK5_REALM, tbuf, - ARRAYLENGTH(tbuf)); - - /*TODO: if additional realms were specified, then those - must be listed as well */ - LoadString(hResModule, IDS_KRB5_CREDTEXT_0, - fbuf, ARRAYLENGTH(fbuf)); - StringCbPrintf(sbuf, sizeof(sbuf), fbuf, - tbuf); - - StringCbLength(sbuf, sizeof(sbuf), &cbsize); - cbsize += sizeof(wchar_t); - - nct->credtext = PMALLOC(cbsize); - - StringCbCopy(nct->credtext, cbsize, sbuf); - } else if (nc->n_identities > 0 && - nc->subtype == KMSG_CRED_PASSWORD) { - cbsize = sizeof(tbuf); - kcdb_identity_get_name(nc->identities[0], tbuf, &cbsize); - - LoadString(hResModule, IDS_KRB5_CREDTEXT_P0, - fbuf, ARRAYLENGTH(fbuf)); - StringCbPrintf(sbuf, sizeof(sbuf), fbuf, tbuf); - - StringCbLength(sbuf, sizeof(sbuf), &cbsize); - cbsize += sizeof(wchar_t); - - nct->credtext = PMALLOC(cbsize); - - StringCbCopy(nct->credtext, cbsize, sbuf); - } else { - if (d->cred_message) { - StringCbLength(d->cred_message, KHUI_MAXCB_BANNER, - &cbsize); - cbsize += sizeof(wchar_t); - - nct->credtext = PMALLOC(cbsize); - - StringCbCopy(nct->credtext, cbsize, d->cred_message); - } - } - } - break; - - case WMNC_IDENTITY_CHANGE: - { - /* There has been a change of identity */ - k5_dlg_data * d; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - kmq_post_sub_msg(k5_sub, KMSG_CRED, - KMSG_CRED_DIALOG_NEW_IDENTITY, - 0, (void *) d->nc); - } - break; - - case WMNC_DIALOG_PREPROCESS: - { - k5_dlg_data * d; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if(!d->sync) { - kmq_post_sub_msg(k5_sub, KMSG_CRED, - KMSG_CRED_DIALOG_NEW_OPTIONS, - 0, (void *) d->nc); - - /* the above notification effectively takes all our - changes into account. The data we have is no - longer out of sync */ - d->sync = FALSE; - } - } - break; - - case K5_SET_CRED_MSG: - { - k5_dlg_data * d; - khm_size cb; - wchar_t * msg; - - d = (k5_dlg_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - msg = (wchar_t *) lParam; - - if (d->cred_message) { - PFREE(d->cred_message); - d->cred_message = NULL; - } - - if (msg && - SUCCEEDED(StringCbLength(msg, - KHUI_MAXCB_MESSAGE, - &cb))) { - cb += sizeof(wchar_t); - d->cred_message = PMALLOC(cb); -#ifdef DEBUG - assert(d->cred_message); -#endif - StringCbCopy(d->cred_message, cb, msg); - } - } - break; - } - - return 0; -} - -INT_PTR -k5_handle_wm_notify(HWND hwnd, - WPARAM wParam, - LPARAM lParam) { - LPNMHDR pnmh; - k5_dlg_data * d; - - pnmh = (LPNMHDR) lParam; - if (pnmh->idFrom == IDC_NCK5_PUBLICIP && - pnmh->code == IPN_FIELDCHANGED) { - - d = (k5_dlg_data *) (LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - - SendDlgItemMessage(hwnd, IDC_NCK5_PUBLICIP, - IPM_GETADDRESS, - 0, (LPARAM) &d->publicIP); - - d->dirty = TRUE; - d->sync = FALSE; - - return TRUE; - } - - return 0; -} - -INT_PTR -k5_handle_wm_command(HWND hwnd, - WPARAM wParam, - LPARAM lParam) -{ - int cid; - int notif; - k5_dlg_data * d; - - d = (k5_dlg_data *)(LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - - cid = LOWORD(wParam); - notif = HIWORD(wParam); - - if(notif == BN_CLICKED && cid == IDC_NCK5_RENEWABLE) { - int c; - c = (int) SendDlgItemMessage(hwnd, IDC_NCK5_RENEWABLE, - BM_GETCHECK, 0, 0); - if(c==BST_CHECKED) { - EnableWindow(GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT), TRUE); - d->renewable = TRUE; - } else { - EnableWindow(GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT), FALSE); - d->renewable = FALSE; - } - d->dirty = TRUE; - d->sync = FALSE; - } else if(notif == BN_CLICKED && cid == IDC_NCK5_FORWARDABLE) { - int c; - c = (int) SendDlgItemMessage(hwnd, IDC_NCK5_FORWARDABLE, - BM_GETCHECK, 0, 0); - if(c==BST_CHECKED) { - d->forwardable = TRUE; - } else { - d->forwardable = FALSE; - } - d->dirty = TRUE; - d->sync = FALSE; - } else if (notif == BN_CLICKED && cid == IDC_NCK5_ADDRESS) { - int c; - - c = (int) SendDlgItemMessage(hwnd, IDC_NCK5_ADDRESS, - BM_GETCHECK, 0, 0); - - if (c==BST_CHECKED) { - d->addressless = TRUE; - } else { - d->addressless = FALSE; - } - d->dirty = TRUE; - d->sync = FALSE; - - EnableWindow(GetDlgItem(hwnd, IDC_NCK5_PUBLICIP), !d->addressless); - } else if (notif == EN_CHANGE && (cid == IDC_NCK5_RENEW_EDIT || - cid == IDC_NCK5_LIFETIME_EDIT)) { - d->dirty = TRUE; - d->sync = FALSE; - } else if((notif == CBN_SELCHANGE || - notif == CBN_KILLFOCUS) && - cid == IDC_NCK5_REALM && - !is_k5_identpro) { - /* find out what the realm of the current identity - is, and if they are the same, then we don't do - anything */ - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; - wchar_t *r; - khm_size cbsize; - khm_handle ident; - int idx; - - if(d->nc->n_identities > 0) { - if(notif == CBN_SELCHANGE) { - idx = (int) SendDlgItemMessage(hwnd, IDC_NCK5_REALM, - CB_GETCURSEL, 0, 0); - SendDlgItemMessage(hwnd, IDC_NCK5_REALM, - CB_GETLBTEXT, idx, (LPARAM) realm); - } else { - GetDlgItemText(hwnd, IDC_NCK5_REALM, - realm, ARRAYLENGTH(realm)); - } - cbsize = sizeof(idname); - if(KHM_SUCCEEDED(kcdb_identity_get_name(d->nc->identities[0], - idname, &cbsize))) { - r = wcschr(idname, L'@'); - if(r && !wcscmp(realm, r+1)) - return 0; /* nothing to do */ - - if(!r) { - r = idname + wcslen(idname); - *r++ = L'@'; - *r++ = 0; - } - - /* if we get here, we have a new user */ - StringCchCopy(r+1, - ARRAYLENGTH(idname) - ((r+1) - idname), - realm); - if(KHM_SUCCEEDED(kcdb_identity_create(idname, - KCDB_IDENT_FLAG_CREATE, - &ident))) { - khui_cw_set_primary_id(d->nc, ident); - kcdb_identity_release(ident); - } - return 0; - } - } - - /* if we get here, we have a new realm, but there is no - identity */ - PostMessage(d->nc->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_UPDATE_CREDTEXT), 0); - } - - return 0; -} - - -/* Dialog procedure for the Krb5 credentials type panel. - - NOTE: Runs in the context of the UI thread -*/ -INT_PTR CALLBACK -k5_nc_dlg_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - switch(uMsg) { - case WM_INITDIALOG: - return k5_handle_wm_initdialog(hwnd, wParam, lParam); - - case WM_COMMAND: - return k5_handle_wm_command(hwnd, wParam, lParam); - - case KHUI_WM_NC_NOTIFY: - return k5_handle_wmnc_notify(hwnd, wParam, lParam); - - case WM_NOTIFY: - return k5_handle_wm_notify(hwnd, wParam, lParam); - - case WM_DESTROY: - return k5_handle_wm_destroy(hwnd, wParam, lParam); - } - return FALSE; -} - -/* forward dcl */ -krb5_error_code KRB5_CALLCONV -k5_kinit_prompter(krb5_context context, - void *data, - const char *name, - const char *banner, - int num_prompts, - krb5_prompt prompts[]); - - - -fiber_job g_fjob; /* global fiber job object */ - -static BOOL -k5_cached_kinit_prompter(void); - -static BOOL -k5_cp_check_continue(void); - -/* - Runs in the context of the krb5 plugin's slave fiber -*/ -VOID CALLBACK -k5_kinit_fiber_proc(PVOID lpParameter) -{ - while(TRUE) - { - if(g_fjob.command == FIBER_CMD_KINIT) { - g_fjob.state = FIBER_STATE_KINIT; - - g_fjob.prompt_set = 0; - - if (k5_cached_kinit_prompter()) { - SwitchToFiber(k5_main_fiber); - - if (g_fjob.command != FIBER_CMD_CONTINUE) - goto _switch_to_main; - - if (!k5_cp_check_continue()) { - g_fjob.code = KRB5KRB_AP_ERR_BAD_INTEGRITY; - goto _switch_to_main; - } - } - - g_fjob.code = - khm_krb5_kinit(0, - g_fjob.principal, - g_fjob.password, - g_fjob.ccache, - g_fjob.lifetime, - g_fjob.forwardable, - g_fjob.proxiable, - (g_fjob.renewable ? g_fjob.renew_life : 0), - g_fjob.addressless, - g_fjob.publicIP, - k5_kinit_prompter, - &g_fjob); - } - - _switch_to_main: - g_fjob.state = FIBER_STATE_NONE; - - SwitchToFiber(k5_main_fiber); - } -} - -/* return TRUE if we should go ahead with creds acquisition */ -static BOOL -k5_cp_check_continue(void) { - khm_size i; - khm_size n_p; - khui_new_creds_prompt * p; - size_t cch; - -#ifdef DEBUG - assert(g_fjob.nc); -#endif - - if (KHM_FAILED(khui_cw_get_prompt_count(g_fjob.nc, &n_p))) { -#ifdef DEBUG - assert(FALSE); -#endif - return TRUE; - } - - khui_cw_sync_prompt_values(g_fjob.nc); - - g_fjob.null_password = FALSE; - - /* we are just checking whether there was a password field that - was left empty, in which case we can't continue with the - credentials acquisition. */ - for (i=0; i < n_p; i++) { - if(KHM_FAILED(khui_cw_get_prompt(g_fjob.nc, - (int) i, - &p))) - continue; - if(p->type == KHUI_NCPROMPT_TYPE_PASSWORD) { - if (p->value == NULL || - FAILED(StringCchLength(p->value, KHUI_MAXCCH_PROMPT, - &cch)) || - cch == 0) { - g_fjob.null_password = TRUE; - return FALSE; - } else - break; - } - } - - return TRUE; -} - -/* returns true if we find cached prompts */ -static BOOL -k5_cached_kinit_prompter(void) { - BOOL rv = FALSE; - khm_handle ident; - khm_handle csp_idconfig = NULL; - khm_handle csp_k5config = NULL; - khm_handle csp_prcache = NULL; - khm_size cb; - khm_size n_cur_prompts; - khm_int32 n_prompts; - khm_int32 i; - -#ifdef DEBUG - assert(g_fjob.nc); -#endif - - ident = g_fjob.identity; - if (!ident) - return FALSE; - - /* don't need to hold ident, since it is already held in g_fjob - and it doesn't change until we return */ - - if (KHM_FAILED(kcdb_identity_get_config(ident, 0, &csp_idconfig)) || - - KHM_FAILED(khc_open_space(csp_idconfig, CSNAME_KRB5CRED, - 0, &csp_k5config)) || - - KHM_FAILED(khc_open_space(csp_k5config, CSNAME_PROMPTCACHE, - 0, &csp_prcache)) || - - KHM_FAILED(khc_read_int32(csp_prcache, L"PromptCount", - &n_prompts)) || - n_prompts == 0) - - goto _cleanup; - - /* we found a prompt cache. We take this to imply that the - principal is valid. */ - g_fjob.valid_principal = TRUE; - - /* check if there are any prompts currently showing. If there are - we check if they are the same as the ones we are going to show. - In which case we just reuse the exisitng prompts */ - if (KHM_FAILED(khui_cw_get_prompt_count(g_fjob.nc, - &n_cur_prompts)) || - n_prompts != (khm_int32) n_cur_prompts) - goto _show_new_prompts; - - for(i = 0; i < n_prompts; i++) { - wchar_t wsname[8]; - wchar_t wprompt[KHUI_MAXCCH_PROMPT]; - khm_handle csp_p = NULL; - khm_int32 p_type; - khm_int32 p_flags; - khui_new_creds_prompt * p; - - if (KHM_FAILED(khui_cw_get_prompt(g_fjob.nc, i, &p))) - break; - - StringCbPrintf(wsname, sizeof(wsname), L"%d", i); - - if (KHM_FAILED(khc_open_space(csp_prcache, wsname, 0, &csp_p))) - break; - - cb = sizeof(wprompt); - if (KHM_FAILED(khc_read_string(csp_p, L"Prompt", - wprompt, &cb))) { - khc_close_space(csp_p); - break; - } - - if (KHM_FAILED(khc_read_int32(csp_p, L"Type", &p_type))) - p_type = 0; - - if (KHM_FAILED(khc_read_int32(csp_p, L"Flags", &p_flags))) - p_flags = 0; - - if ( /* if we received a prompt string, - then it should be the same as the - one that is displayed */ - (wprompt[0] && - (p->prompt == NULL || - wcscmp(wprompt, p->prompt))) || - - /* if we didn't receive one, then - there shouldn't be one displayed. - This case really shouldn't happen - in reality, but we check anyway. */ - (!wprompt[0] && - p->prompt != NULL) || - - /* the type should match */ - (p_type != p->type) || - - /* if this prompt should be hidden, - then it must also be so */ - (p_flags != p->flags) - ) { - - khc_close_space(csp_p); - break; - - } - - - khc_close_space(csp_p); - } - - if (i == n_prompts) { - rv = TRUE; - goto _cleanup; - } - - _show_new_prompts: - - khui_cw_clear_prompts(g_fjob.nc); - - { - wchar_t wbanner[KHUI_MAXCCH_BANNER]; - wchar_t wpname[KHUI_MAXCCH_PNAME]; - - cb = sizeof(wbanner); - if (KHM_FAILED(khc_read_string(csp_prcache, L"Banner", - wbanner, &cb))) - wbanner[0] = 0; - - cb = sizeof(wpname); - if (KHM_FAILED(khc_read_string(csp_prcache, L"Name", - wpname, &cb))) - wpname[0] = 0; - - khui_cw_begin_custom_prompts(g_fjob.nc, - n_prompts, - (wbanner[0]? wbanner: NULL), - (wpname[0]? wpname: NULL)); - } - - for(i = 0; i < n_prompts; i++) { - wchar_t wsname[8]; - wchar_t wprompt[KHUI_MAXCCH_PROMPT]; - khm_handle csp_p = NULL; - khm_int32 p_type; - khm_int32 p_flags; - - StringCbPrintf(wsname, sizeof(wsname), L"%d", i); - - if (KHM_FAILED(khc_open_space(csp_prcache, wsname, 0, &csp_p))) - break; - - cb = sizeof(wprompt); - if (KHM_FAILED(khc_read_string(csp_p, L"Prompt", - wprompt, &cb))) { - khc_close_space(csp_p); - break; - } - - if (KHM_FAILED(khc_read_int32(csp_p, L"Type", &p_type))) - p_type = 0; - - if (KHM_FAILED(khc_read_int32(csp_p, L"Flags", &p_flags))) - p_flags = 0; - - khui_cw_add_prompt(g_fjob.nc, p_type, wprompt, NULL, p_flags); - - khc_close_space(csp_p); - } - - if (i < n_prompts) { - khui_cw_clear_prompts(g_fjob.nc); - } else { - rv = TRUE; - } - - _cleanup: - - if (csp_prcache) - khc_close_space(csp_prcache); - - if (csp_k5config) - khc_close_space(csp_k5config); - - if (csp_idconfig) - khc_close_space(csp_idconfig); - - return rv; -} - -/* Runs in the context of the Krb5 plugin's slave fiber */ -krb5_error_code KRB5_CALLCONV -k5_kinit_prompter(krb5_context context, - void *data, - const char *name, - const char *banner, - int num_prompts, - krb5_prompt prompts[]) -{ - int i; - khui_new_creds * nc; - krb5_prompt_type * ptypes; - khm_size ncp; - krb5_error_code code = 0; - BOOL new_prompts = TRUE; - - khm_handle csp_prcache = NULL; - - /* we got prompts? Then we assume that the principal is valid */ - g_fjob.valid_principal = TRUE; - - nc = g_fjob.nc; - - if(pkrb5_get_prompt_types) - ptypes = pkrb5_get_prompt_types(context); - else - ptypes = NULL; - - /* check if we are already showing the right prompts */ - khui_cw_get_prompt_count(nc, &ncp); - - if (num_prompts != (int) ncp) - goto _show_new_prompts; - - for (i=0; i < num_prompts; i++) { - wchar_t wprompt[KHUI_MAXCCH_PROMPT]; - khui_new_creds_prompt * p; - - if(prompts[i].prompt) { - AnsiStrToUnicode(wprompt, sizeof(wprompt), - prompts[i].prompt); - } else { - wprompt[0] = 0; - } - - if (KHM_FAILED(khui_cw_get_prompt(nc, i, &p))) - break; - - if ( /* if we received a prompt string, - then it should be the same as the - one that is displayed */ - (wprompt[0] && - (p->prompt == NULL || - wcscmp(wprompt, p->prompt))) || - /* if we didn't receive one, then - there shouldn't be one displayed. - This case really shouldn't happen - in reality, but we check anyway. */ - (!wprompt[0] && - p->prompt != NULL) || - /* the type should match */ - (ptypes && - ptypes[i] != p->type) || - (!ptypes && - p->type != 0) || - /* if this prompt should be hidden, - then it must also be so */ - (prompts[i].hidden && - !(p->flags & KHUI_NCPROMPT_FLAG_HIDDEN)) || - (!prompts[i].hidden && - (p->flags & KHUI_NCPROMPT_FLAG_HIDDEN)) - ) - break; - } - - if (i < num_prompts) - goto _show_new_prompts; - - new_prompts = FALSE; - - /* ok. looks like we are already showing the same set of prompts - that we were supposed to show. Sync up the values and go - ahead. */ - khui_cw_sync_prompt_values(nc); - goto _process_prompts; - - _show_new_prompts: - /* special case. if there are no actual input controls involved, - then we have to show an alerter window and pass through */ - if (num_prompts == 0) { - wchar_t wbanner[KHUI_MAXCCH_BANNER]; - wchar_t wname[KHUI_MAXCCH_PNAME]; - wchar_t wident[KCDB_IDENT_MAXCCH_NAME]; - wchar_t wmsg[KHUI_MAXCCH_MESSAGE]; - wchar_t wfmt[KHUI_MAXCCH_BANNER]; - khm_size cb; - - if (!banner) { - code = 0; - g_fjob.null_password = FALSE; - goto _exit; - } else { - AnsiStrToUnicode(wbanner, sizeof(wbanner), banner); - } - - if (name) { - AnsiStrToUnicode(wname, sizeof(wname), name); - } else { - LoadString(hResModule, - IDS_KRB5_WARNING, - wname, - ARRAYLENGTH(wname)); - } - - cb = sizeof(wident); - if (KHM_FAILED(kcdb_identity_get_name(g_fjob.identity, wident, &cb))) - wident[0] = L'\0'; - - LoadString(hResModule, - IDS_KRB5_WARN_FMT, - wfmt, - ARRAYLENGTH(wfmt)); - - StringCbPrintf(wmsg, sizeof(wmsg), wfmt, wident, wbanner); - - khui_alert_show_simple(wname, wmsg, KHERR_WARNING); - - code = 0; - g_fjob.null_password = FALSE; - goto _exit; - } - - /* in addition to showing new prompts, we also cache the set of - prompts. */ - if(g_fjob.prompt_set == 0) { - khm_handle csp_idconfig = NULL; - khm_handle csp_idk5 = NULL; - - kcdb_identity_get_config(g_fjob.identity, - KHM_FLAG_CREATE, - &csp_idconfig); - - if (csp_idconfig != NULL) - khc_open_space(csp_idconfig, - CSNAME_KRB5CRED, - KHM_FLAG_CREATE, - &csp_idk5); - - if (csp_idk5 != NULL) - khc_open_space(csp_idk5, - CSNAME_PROMPTCACHE, - KHM_FLAG_CREATE, - &csp_prcache); - - khc_close_space(csp_idconfig); - khc_close_space(csp_idk5); - } - - { - wchar_t wbanner[KHUI_MAXCCH_BANNER]; - wchar_t wname[KHUI_MAXCCH_PNAME]; - - if(banner) - AnsiStrToUnicode(wbanner, sizeof(wbanner), banner); - if(name) - AnsiStrToUnicode(wname, sizeof(wname), name); - - khui_cw_clear_prompts(nc); - - khui_cw_begin_custom_prompts( - nc, - num_prompts, - (banner)?wbanner:NULL, - (name)?wname:NULL); - - if (banner && csp_prcache) - khc_write_string(csp_prcache, - L"Banner", - wbanner); - else if (csp_prcache) - khc_write_string(csp_prcache, - L"Banner", - L""); - - if (name && csp_prcache) - khc_write_string(csp_prcache, - L"Name", - wname); - else if (csp_prcache) - khc_write_string(csp_prcache, - L"Name", - L""); - - if (csp_prcache) - khc_write_int32(csp_prcache, - L"PromptCount", - (khm_int32) num_prompts); - } - - for(i=0; i < num_prompts; i++) { - wchar_t wprompt[KHUI_MAXCCH_PROMPT]; - - if(prompts[i].prompt) { - AnsiStrToUnicode(wprompt, sizeof(wprompt), - prompts[i].prompt); - } else { - wprompt[0] = 0; - } - - khui_cw_add_prompt( - nc, - (ptypes?ptypes[i]:0), - wprompt, - NULL, - (prompts[i].hidden?KHUI_NCPROMPT_FLAG_HIDDEN:0)); - - if (csp_prcache) { - khm_handle csp_p = NULL; - wchar_t wnum[8]; /* should be enough for 10 - million prompts */ - - wnum[0] = 0; - StringCbPrintf(wnum, sizeof(wnum), L"%d", i); - - khc_open_space(csp_prcache, wnum, - KHM_FLAG_CREATE, &csp_p); - - if (csp_p) { - khc_write_string(csp_p, L"Prompt", wprompt); - khc_write_int32(csp_p, L"Type", (ptypes?ptypes[i]:0)); - khc_write_int32(csp_p, L"Flags", - (prompts[i].hidden? - KHUI_NCPROMPT_FLAG_HIDDEN:0)); - - khc_close_space(csp_p); - } - } - } - - if (csp_prcache) { - khc_close_space(csp_prcache); - csp_prcache = NULL; - } - - _process_prompts: - /* switch back to main thread if we showed new prompts */ - if (new_prompts) - SwitchToFiber(k5_main_fiber); - - /* we get here after the user selects an action that either - cancles the credentials acquisition operation or triggers the - actual acquisition of credentials. */ - if(g_fjob.command != FIBER_CMD_CONTINUE && - g_fjob.command != FIBER_CMD_KINIT) { - code = -2; - goto _exit; - } - - g_fjob.null_password = FALSE; - - /* otherwise, we need to get the data back from the UI and - return 0 */ - for(i=0; idata, d->length, wbuf); - if(SUCCEEDED(StringCchLengthA(d->data, d->length, &cch))) - d->length = (unsigned int) cch; - else - d->length = 0; - } else { -#ifdef DEBUG - assert(FALSE); -#endif - d->length = 0; - } - - if (ptypes && - ptypes[i] == KRB5_PROMPT_TYPE_PASSWORD && - d->length == 0) - - g_fjob.null_password = TRUE; - } - - _exit: - - g_fjob.prompt_set++; - - /* entering a NULL password is equivalent to cancelling out */ - if (g_fjob.null_password) - return -2; - else - return code; -} - -/* - - The configuration information for each identity comes from a - multitude of layers organized as follows. The ordering is - decreasing in priority. When looking up a value, the value will be - looked up in each layer in turn starting at level 0. The first - instance of the value found will be the effective value. - - 0 : \Krb5Cred - - 0.1: per user - - 0.2: per machine - - 1 : \Parameters\Realms\ - - 1.1: per user - - 1.2: per machine - - 2 : \Parameters - - 2.1: per user - - 2.2: per machine - - 2.3: schema - - */ -khm_int32 -k5_open_config_handle(khm_handle ident, - khm_int32 flags, - khm_handle * ret_csp) { - - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_handle csp_i = NULL; - khm_handle csp_ik5 = NULL; - khm_handle csp_realms = NULL; - khm_handle csp_realm = NULL; - khm_handle csp_plugins = NULL; - khm_handle csp_krbcfg = NULL; - khm_handle csp_rv = NULL; - wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; - - realm[0] = L'\0'; - - if (ident) { - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t * trealm; - khm_size cb_idname = sizeof(idname); - - rv = kcdb_identity_get_name(ident, idname, &cb_idname); - if (KHM_SUCCEEDED(rv) && - (trealm = khm_get_realm_from_princ(idname)) != NULL) { - StringCbCopy(realm, sizeof(realm), trealm); - } - } - - if (ident) { - rv = kcdb_identity_get_config(ident, flags, &csp_i); - if (KHM_FAILED(rv)) - goto done; - - rv = khc_open_space(csp_i, CSNAME_KRB5CRED, flags, &csp_ik5); - if (KHM_FAILED(rv)) - goto done; - - if (realm[0] == L'\0') - goto done_shadow_realm; - - rv = khc_open_space(csp_params, CSNAME_REALMS, flags, &csp_realms); - if (KHM_FAILED(rv)) - goto done_shadow_realm; - - rv = khc_open_space(csp_realms, realm, flags, &csp_realm); - if (KHM_FAILED(rv)) - goto done_shadow_realm; - - rv = khc_shadow_space(csp_realm, csp_params); - - done_shadow_realm: - - if (csp_realm) - rv = khc_shadow_space(csp_ik5, csp_realm); - else - rv = khc_shadow_space(csp_ik5, csp_params); - - csp_rv = csp_ik5; - - } else { - - /* No valid identity specified. We default to the parameters key. */ - rv = kmm_get_plugins_config(0, &csp_plugins); - if (KHM_FAILED(rv)) - goto done; - - rv = khc_open_space(csp_plugins, CSNAME_KRB5CRED, flags, &csp_krbcfg); - if (KHM_FAILED(rv)) - goto done; - - rv = khc_open_space(csp_krbcfg, CSNAME_PARAMS, flags, &csp_rv); - } - - done: - - *ret_csp = csp_rv; - - /* leave csp_ik5. If it's non-NULL, then it's the return value */ - /* leave csp_rv. It's the return value. */ - if (csp_i) - khc_close_space(csp_i); - if (csp_realms) - khc_close_space(csp_realms); - if (csp_realm) - khc_close_space(csp_realm); - if (csp_plugins) - khc_close_space(csp_plugins); - if (csp_krbcfg) - khc_close_space(csp_krbcfg); - - return rv; -} - -void -k5_read_dlg_params(khm_handle conf, - k5_dlg_data * d) -{ - khm_int32 i; - - khc_read_int32(conf, L"Renewable", &i); - d->renewable = i; - khc_read_int32(conf, L"Forwardable", &i); - d->forwardable = i; - khc_read_int32(conf, L"Proxiable", &i); - d->proxiable = i; - khc_read_int32(conf, L"Addressless", &i); - d->addressless = i; - khc_read_int32(conf, L"PublicIP", &i); - d->publicIP = i; - - khc_read_int32(conf, L"DefaultLifetime", &i); - d->tc_lifetime.current = i; - khc_read_int32(conf, L"MaxLifetime", &i); - d->tc_lifetime.max = i; - khc_read_int32(conf, L"MinLifetime", &i); - d->tc_lifetime.min = i; - - khc_read_int32(conf, L"DefaultRenewLifetime", &i); - d->tc_renew.current = i; - khc_read_int32(conf, L"MaxRenewLifetime", &i); - d->tc_renew.max = i; - khc_read_int32(conf, L"MinRenewLifetime", &i); - d->tc_renew.min = i; - - /* however, if this has externally supplied defaults, we have to - use them too. */ - if (d->nc && d->nc->ctx.vparam && - d->nc->ctx.cb_vparam == sizeof(NETID_DLGINFO)) { - LPNETID_DLGINFO pdlginfo; - - pdlginfo = (LPNETID_DLGINFO) d->nc->ctx.vparam; - if (pdlginfo->size == NETID_DLGINFO_V1_SZ && - pdlginfo->in.use_defaults == 0) { - d->forwardable = pdlginfo->in.forwardable; - d->addressless = pdlginfo->in.noaddresses; - d->tc_lifetime.current = pdlginfo->in.lifetime; - d->tc_renew.current = pdlginfo->in.renew_till; - - if (pdlginfo->in.renew_till == 0) - d->renewable = FALSE; - else - d->renewable = TRUE; - - d->proxiable = pdlginfo->in.proxiable; - d->publicIP = pdlginfo->in.publicip; - } - } - - /* once we read the new data, in, it is no longer considered - dirty */ - d->dirty = FALSE; -} - -void -k5_write_dlg_params(khm_handle conf, - k5_dlg_data * d) -{ - khc_write_int32(conf, L"Renewable", d->renewable); - khc_write_int32(conf, L"Forwardable", d->forwardable); - khc_write_int32(conf, L"Proxiable", d->proxiable); - khc_write_int32(conf, L"Addressless", d->addressless); - khc_write_int32(conf, L"PublicIP", d->publicIP); - - khc_write_int32(conf, L"DefaultLifetime", - (khm_int32) d->tc_lifetime.current); - khc_write_int32(conf, L"MaxLifetime", - (khm_int32) d->tc_lifetime.max); - khc_write_int32(conf, L"MinLifetime", - (khm_int32) d->tc_lifetime.min); - - khc_write_int32(conf, L"DefaultRenewLifetime", - (khm_int32) d->tc_renew.current); - khc_write_int32(conf, L"MaxRenewLifetime", - (khm_int32) d->tc_renew.max); - khc_write_int32(conf, L"MinRenewLifetime", - (khm_int32) d->tc_renew.min); - - /* as in k5_read_dlg_params, once we write the data in, the local - data is no longer dirty */ - d->dirty = FALSE; -} - -void -k5_prep_kinit_job(khui_new_creds * nc) -{ - khui_new_creds_by_type * nct; - k5_dlg_data * d; - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cbbuf; - size_t size; - khm_handle ident; - LPNETID_DLGINFO pdlginfo; - - khui_cw_find_type(nc, credtype_id_krb5, &nct); - if (!nct) - return; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); - - if (!d) - return; - - khui_cw_lock_nc(nc); - ident = nc->identities[0]; - kcdb_identity_hold(ident); - khui_cw_unlock_nc(nc); - - cbbuf = sizeof(idname); - kcdb_identity_get_name(ident, idname, &cbbuf); - StringCchLength(idname, ARRAYLENGTH(idname), &size); - size++; - - ZeroMemory(&g_fjob, sizeof(g_fjob)); - g_fjob.command = FIBER_CMD_KINIT; - g_fjob.nc = nc; - g_fjob.nct = nct; - g_fjob.dialog = nct->hwnd_panel; - g_fjob.principal = PMALLOC(size); - UnicodeStrToAnsi(g_fjob.principal, size, idname); - g_fjob.password = NULL; - g_fjob.lifetime = (krb5_deltat) d->tc_lifetime.current; - g_fjob.forwardable = d->forwardable; - g_fjob.proxiable = d->proxiable; - g_fjob.renewable = d->renewable; - g_fjob.renew_life = (krb5_deltat) d->tc_renew.current; - g_fjob.addressless = d->addressless; - g_fjob.publicIP = d->publicIP; - g_fjob.code = 0; - g_fjob.identity = ident; - g_fjob.prompt_set = 0; - g_fjob.valid_principal = FALSE; - - /* if we have external parameters, we should use them as well */ - if (nc->ctx.cb_vparam == sizeof(NETID_DLGINFO) && - (pdlginfo = nc->ctx.vparam) && - pdlginfo->size == NETID_DLGINFO_V1_SZ) { - wchar_t * t; - - if (pdlginfo->in.ccache[0] && - SUCCEEDED(StringCchLength(pdlginfo->in.ccache, - NETID_CCACHE_NAME_SZ, - &size))) { - g_fjob.ccache = PMALLOC(sizeof(char) * (size + 1)); -#ifdef DEBUG - assert(g_fjob.ccache); -#endif - UnicodeStrToAnsi(g_fjob.ccache, size + 1, - pdlginfo->in.ccache); - - /* this is the same as the output cache */ - - StringCbCopy(pdlginfo->out.ccache, sizeof(pdlginfo->out.ccache), - pdlginfo->in.ccache); - } else { - g_fjob.ccache = NULL; - - StringCbCopy(pdlginfo->out.ccache, sizeof(pdlginfo->out.ccache), - idname); - - khm_krb5_canon_cc_name(pdlginfo->out.ccache, - sizeof(pdlginfo->out.ccache)); - } - - t = khm_get_realm_from_princ(idname); - - if (t) { - StringCbCopy(pdlginfo->out.realm, - sizeof(pdlginfo->out.realm), - t); - - if ((t - idname) > 1) { - StringCchCopyN(pdlginfo->out.username, - ARRAYLENGTH(pdlginfo->out.username), - idname, - (t - idname) - 1); - } else { - StringCbCopy(pdlginfo->out.username, - sizeof(pdlginfo->out.username), - L""); - } - } else { - StringCbCopy(pdlginfo->out.username, - sizeof(pdlginfo->out.username), - idname); - StringCbCopy(pdlginfo->out.realm, - sizeof(pdlginfo->out.realm), - L""); - } - } - - /* leave identity held, since we added a reference above */ -} - -void -k5_free_kinit_job(void) -{ - if (g_fjob.principal) - PFREE(g_fjob.principal); - - if (g_fjob.password) - PFREE(g_fjob.password); - - if (g_fjob.identity) - kcdb_identity_release(g_fjob.identity); - - if (g_fjob.ccache) - PFREE(g_fjob.ccache); - - ZeroMemory(&g_fjob, sizeof(g_fjob)); -} - -static khm_int32 KHMAPI -k5_find_tgt_filter(khm_handle cred, - khm_int32 flags, - void * rock) { - khm_handle ident = (khm_handle) rock; - khm_handle cident = NULL; - khm_int32 f; - khm_int32 rv; - - if (KHM_SUCCEEDED(kcdb_cred_get_identity(cred, - &cident)) && - cident == ident && - KHM_SUCCEEDED(kcdb_cred_get_flags(cred, &f)) && - (f & KCDB_CRED_FLAG_INITIAL) && - !(f & KCDB_CRED_FLAG_EXPIRED)) - rv = 1; - else - rv = 0; - - if (cident) - kcdb_identity_release(cident); - - return rv; -} - -khm_int32 -k5_update_LRU(khm_handle identity) -{ - wchar_t * wbuf = NULL; - wchar_t * idname = NULL; - wchar_t * realm = NULL; - khm_size cb; - khm_size cb_ms; - khm_int32 rv = KHM_ERROR_SUCCESS; - - rv = kcdb_identity_get_name(identity, NULL, &cb); - assert(rv == KHM_ERROR_TOO_LONG); - - idname = PMALLOC(cb); - assert(idname); - - rv = kcdb_identity_get_name(identity, idname, &cb); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_read_multi_string(csp_params, L"LRUPrincipals", NULL, &cb_ms); - if (rv != KHM_ERROR_TOO_LONG) - cb_ms = cb + sizeof(wchar_t); - else - cb_ms += cb + sizeof(wchar_t); - - wbuf = PMALLOC(cb_ms); - assert(wbuf); - - cb = cb_ms; - - if (rv == KHM_ERROR_TOO_LONG) { - rv = khc_read_multi_string(csp_params, L"LRUPrincipals", wbuf, &cb); - assert(KHM_SUCCEEDED(rv)); - - if (multi_string_find(wbuf, idname, KHM_CASE_SENSITIVE) != NULL) { - /* it's already there. We remove it here and add it at - the top of the LRU list. */ - multi_string_delete(wbuf, idname, KHM_CASE_SENSITIVE); - } - } else { - multi_string_init(wbuf, cb_ms); - } - - cb = cb_ms; - rv = multi_string_prepend(wbuf, &cb, idname); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_multi_string(csp_params, L"LRUPrincipals", wbuf); - - realm = khm_get_realm_from_princ(idname); - if (realm == NULL || *realm == L'\0') - goto _done_with_LRU; - - cb = cb_ms; - rv = khc_read_multi_string(csp_params, L"LRURealms", wbuf, &cb); - - if (rv == KHM_ERROR_TOO_LONG) { - PFREE(wbuf); - wbuf = PMALLOC(cb); - assert(wbuf); - - cb_ms = cb; - - rv = khc_read_multi_string(csp_params, L"LRURealms", wbuf, &cb); - - assert(KHM_SUCCEEDED(rv)); - } else if (rv == KHM_ERROR_SUCCESS) { - if (multi_string_find(wbuf, realm, KHM_CASE_SENSITIVE) != NULL) { - /* remove the realm and add it at the top later. */ - multi_string_delete(wbuf, realm, KHM_CASE_SENSITIVE); - } - } else { - multi_string_init(wbuf, cb_ms); - } - - cb = cb_ms; - rv = multi_string_prepend(wbuf, &cb, realm); - - if (rv == KHM_ERROR_TOO_LONG) { - wbuf = PREALLOC(wbuf, cb); - - rv = multi_string_prepend(wbuf, &cb, realm); - - assert(KHM_SUCCEEDED(rv)); - } - - rv = khc_write_multi_string(csp_params, L"LRURealms", wbuf); - - assert(KHM_SUCCEEDED(rv)); - - _done_with_LRU: - - if (wbuf) - PFREE(wbuf); - if (idname) - PFREE(idname); - - return rv; -} - -/* Handler for CRED type messages - - Runs in the context of the Krb5 plugin -*/ -khm_int32 KHMAPI -k5_msg_cred_dialog(khm_int32 msg_type, - khm_int32 msg_subtype, - khm_ui_4 uparam, - void * vparam) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - switch(msg_subtype) { - - case KMSG_CRED_PASSWORD: - case KMSG_CRED_NEW_CREDS: - { - khui_new_creds * nc; - khui_new_creds_by_type * nct; - wchar_t wbuf[256]; - size_t cbsize; - - nc = (khui_new_creds *) vparam; - - nct = PMALLOC(sizeof(*nct)); - ZeroMemory(nct, sizeof(*nct)); - - nct->type = credtype_id_krb5; - nct->ordinal = 1; - - LoadString(hResModule, IDS_KRB5_NC_NAME, - wbuf, ARRAYLENGTH(wbuf)); - StringCbLength(wbuf, sizeof(wbuf), &cbsize); - cbsize += sizeof(wchar_t); - - nct->name = PMALLOC(cbsize); - StringCbCopy(nct->name, cbsize, wbuf); - - nct->h_module = hResModule; - nct->dlg_proc = k5_nc_dlg_proc; - if (nc->subtype == KMSG_CRED_PASSWORD) - nct->dlg_template = MAKEINTRESOURCE(IDD_NC_KRB5_PASSWORD); - else - nct->dlg_template = MAKEINTRESOURCE(IDD_NC_KRB5); - - khui_cw_add_type(nc, nct); - } - break; - - case KMSG_CRED_RENEW_CREDS: - { - khui_new_creds * nc; - khui_new_creds_by_type * nct; - - nc = (khui_new_creds *) vparam; - - nct = PMALLOC(sizeof(*nct)); - ZeroMemory(nct, sizeof(*nct)); - - nct->type = credtype_id_krb5; - - khui_cw_add_type(nc, nct); - } - break; - - case KMSG_CRED_DIALOG_PRESTART: - { - khui_new_creds * nc; - khui_new_creds_by_type * nct; - k5_dlg_data * d; - HWND hwnd; - wchar_t * realms; - wchar_t * t; - wchar_t * defrealm; - - nc = (khui_new_creds *) vparam; - - khui_cw_find_type(nc, credtype_id_krb5, &nct); - - if(!nct) - break; - - hwnd = nct->hwnd_panel; - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); - - if (!is_k5_identpro) { - - /* enumerate all realms and place in realms combo box */ - SendDlgItemMessage(hwnd, IDC_NCK5_REALM, - CB_RESETCONTENT, - 0, 0); - - realms = khm_krb5_get_realm_list(); - if(realms) { - for (t = realms; t && *t; t = multi_string_next(t)) { - SendDlgItemMessage(hwnd, IDC_NCK5_REALM, - CB_ADDSTRING, - 0, (LPARAM) t); - } - PFREE(realms); - } - - /* and set the default realm */ - defrealm = khm_krb5_get_default_realm(); - if(defrealm) { - SendDlgItemMessage(hwnd, IDC_NCK5_REALM, - CB_SELECTSTRING, - (WPARAM) -1, - (LPARAM) defrealm); - - SendDlgItemMessage(hwnd, IDC_NCK5_REALM, - WM_SETTEXT, - 0, (LPARAM) defrealm); - PFREE(defrealm); - } - } else { /* if krb5 is the identity provider */ - HWND hw_realms; - - /* in this case, the realm selection is done by the - identity provider prompts. */ - - hw_realms = GetDlgItem(hwnd, IDC_NCK5_REALM); -#ifdef DEBUG - assert(hw_realms); -#endif - EnableWindow(hw_realms, FALSE); - } - - if (nc->subtype == KMSG_CRED_NEW_CREDS) { - k5_read_dlg_params(csp_params, d); - } - - PostMessage(hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0,WMNC_DIALOG_SETUP), 0); - } - break; - - case KMSG_CRED_DIALOG_NEW_IDENTITY: - { - khui_new_creds * nc; - khui_new_creds_by_type * nct; - k5_dlg_data * d; - - nc = (khui_new_creds *) vparam; - - khui_cw_find_type(nc, credtype_id_krb5, &nct); - if (!nct) - break; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); - - /* we only load the identity specific defaults if the user - hasn't changed the options */ - khui_cw_lock_nc(nc); - - /* ?: It might be better to not load identity defaults if - the user has already changed options in the dialog. */ - if(/* !d->dirty && */ nc->n_identities > 0 && - nc->subtype == KMSG_CRED_NEW_CREDS) { - - khm_handle h_idcfg = NULL; - - do { - if (KHM_FAILED - (k5_open_config_handle(nc->identities[0], - 0, &h_idcfg))) - break; - - k5_read_dlg_params(h_idcfg, d); - - PostMessage(nct->hwnd_panel, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0,WMNC_DIALOG_SETUP), 0); - } while(FALSE); - - if(h_idcfg) - khc_close_space(h_idcfg); - } - - khui_cw_unlock_nc(nc); - } - - /* fallthrough */ - case KMSG_CRED_DIALOG_NEW_OPTIONS: - { - khui_new_creds * nc; - khui_new_creds_by_type * nct; - k5_dlg_data * d; - - nc = (khui_new_creds *) vparam; - - khui_cw_find_type(nc, credtype_id_krb5, &nct); - if (!nct) - break; - - d = (k5_dlg_data *)(LONG_PTR) - GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); - - if (nc->subtype == KMSG_CRED_PASSWORD) { - khm_size n_prompts = 0; - - khui_cw_get_prompt_count(nc, &n_prompts); - - if (nc->n_identities == 0) { - if (n_prompts) - khui_cw_clear_prompts(nc); - } else if (n_prompts != 3) { - wchar_t wbuf[KHUI_MAXCCH_BANNER]; - - khui_cw_clear_prompts(nc); - - LoadString(hResModule, IDS_NC_PWD_BANNER, - wbuf, ARRAYLENGTH(wbuf)); - khui_cw_begin_custom_prompts(nc, 3, NULL, wbuf); - - LoadString(hResModule, IDS_NC_PWD_PWD, - wbuf, ARRAYLENGTH(wbuf)); - khui_cw_add_prompt(nc, KHUI_NCPROMPT_TYPE_PASSWORD, - wbuf, NULL, KHUI_NCPROMPT_FLAG_HIDDEN); - - LoadString(hResModule, IDS_NC_PWD_NPWD, - wbuf, ARRAYLENGTH(wbuf)); - khui_cw_add_prompt(nc, KHUI_NCPROMPT_TYPE_NEW_PASSWORD, - wbuf, NULL, KHUI_NCPROMPT_FLAG_HIDDEN); - - LoadString(hResModule, IDS_NC_PWD_NPWD_AGAIN, - wbuf, ARRAYLENGTH(wbuf)); - khui_cw_add_prompt(nc, KHUI_NCPROMPT_TYPE_NEW_PASSWORD_AGAIN, - wbuf, NULL, KHUI_NCPROMPT_FLAG_HIDDEN); - } - - return KHM_ERROR_SUCCESS; - } - /* else; nc->subtype == KMSG_CRED_NEW_CREDS */ - - assert(nc->subtype == KMSG_CRED_NEW_CREDS); - - /* if the fiber is already in a kinit, cancel it */ - if(g_fjob.state == FIBER_STATE_KINIT) { - g_fjob.command = FIBER_CMD_CANCEL; - SwitchToFiber(k5_kinit_fiber); - /* we get here when the cancel operation completes */ - k5_free_kinit_job(); - } - - khui_cw_lock_nc(nc); - - if(nc->n_identities > 0) { - khm_handle ident = nc->identities[0]; - - kcdb_identity_hold(ident); - - k5_prep_kinit_job(nc); - khui_cw_unlock_nc(nc); - - SwitchToFiber(k5_kinit_fiber); - /* we get here when the fiber switches back */ - if(g_fjob.state == FIBER_STATE_NONE) { - wchar_t msg[KHUI_MAXCCH_BANNER]; - khm_size cb; - - /* we can't possibly have succeeded without a - password */ - if(g_fjob.code) { - if (is_k5_identpro) - kcdb_identity_set_flags(ident, - KCDB_IDENT_FLAG_INVALID, - KCDB_IDENT_FLAG_INVALID); - - khui_cw_clear_prompts(nc); - } - - if (d->cred_message) { - PFREE(d->cred_message); - d->cred_message = NULL; - } - - msg[0] = L'\0'; - - switch(g_fjob.code) { - case KRB5KDC_ERR_NAME_EXP: - /* principal expired */ - LoadString(hResModule, IDS_K5ERR_NAME_EXPIRED, - msg, ARRAYLENGTH(msg)); - break; - - case KRB5KDC_ERR_KEY_EXP: - /* password needs changing */ - LoadString(hResModule, IDS_K5ERR_KEY_EXPIRED, - msg, ARRAYLENGTH(msg)); - break; - - default: - { - DWORD dw_dummy; - kherr_suggestion sug_dummy; - wchar_t fmt[KHUI_MAXCCH_BANNER]; - wchar_t desc[KHUI_MAXCCH_BANNER]; - - LoadString(hResModule, IDS_K5ERR_FMT, - fmt, ARRAYLENGTH(fmt)); - - khm_err_describe(g_fjob.code, - desc, - sizeof(desc), - &dw_dummy, - &sug_dummy); - - StringCbPrintf(msg, sizeof(msg), fmt, desc); - } - } - - if (msg[0]) { - StringCbLength(msg, sizeof(msg), &cb); - cb += sizeof(wchar_t); - - d->cred_message = PMALLOC(cb); - StringCbCopy(d->cred_message, cb, msg); - } - - k5_free_kinit_job(); - - } else if(g_fjob.state == FIBER_STATE_KINIT) { - /* this is what we want. Leave the fiber there. */ - - if(is_k5_identpro) - kcdb_identity_set_flags(ident, - KCDB_IDENT_FLAG_VALID, - KCDB_IDENT_FLAG_VALID); - } else { - /* huh?? */ -#ifdef DEBUG - assert(FALSE); -#endif - } - - /* since the attributes of the identity have changed, - we should update the cred text as well */ - kcdb_identity_release(ident); - khui_cw_lock_nc(nc); - PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_UPDATE_CREDTEXT), 0); - } else { - khui_cw_unlock_nc(nc); - khui_cw_clear_prompts(nc); - khui_cw_lock_nc(nc); - } - - khui_cw_unlock_nc(nc); - } - break; - - case KMSG_CRED_PROCESS: - { - khui_new_creds * nc; - khui_new_creds_by_type * nct; - k5_dlg_data * d; - - khm_int32 r = 0; - - nc = (khui_new_creds *) vparam; - - khui_cw_find_type(nc, credtype_id_krb5, &nct); - - if(!nct) - break; - - /* reset the null_password flag, just in case */ - g_fjob.null_password = FALSE; - - if (nc->subtype == KMSG_CRED_NEW_CREDS) { - d = (k5_dlg_data *) nct->aux; - - _begin_task(0); - _report_mr0(KHERR_NONE, MSG_CTX_INITAL_CREDS); - _describe(); - - if (g_fjob.state == FIBER_STATE_KINIT) { - if(nc->result == KHUI_NC_RESULT_CANCEL) { - g_fjob.command = FIBER_CMD_CANCEL; - SwitchToFiber(k5_kinit_fiber); - - /* if we cancelled out, then we shouldn't care - about the return code. */ -#ifdef DEBUG - assert(g_fjob.state == FIBER_STATE_NONE); -#endif - g_fjob.code = 0; - - _reportf(L"Cancelling"); - } else if (nc->result == KHUI_NC_RESULT_PROCESS) { - khui_cw_sync_prompt_values(nc); - g_fjob.command = FIBER_CMD_CONTINUE; - SwitchToFiber(k5_kinit_fiber); - - /* We get back here once the fiber finishes - processing */ - } -#ifdef DEBUG - else { - assert(FALSE); - } -#endif - } else { - /* we weren't in a KINIT state */ - if (nc->result == KHUI_NC_RESULT_CANCEL) { - /* nothing to report */ - g_fjob.code = 0; - } else if (nc->result == KHUI_NC_RESULT_PROCESS) { - /* g_fjob.code should have the result of the - last kinit attempt. We should leave it - as-is */ - } -#ifdef DEBUG - else { - /* unknown result */ - assert(FALSE); - } -#endif - } - - /* special case: if there was no password entered, and - if there is a valid TGT we allow the credential - acquisition to go through */ - if (g_fjob.state == FIBER_STATE_NONE && - g_fjob.code && - g_fjob.null_password && - - (nc->n_identities == 0 || - nc->identities[0] == NULL || - KHM_SUCCEEDED(kcdb_credset_find_filtered - (NULL, - -1, - k5_find_tgt_filter, - nc->identities[0], - NULL, - NULL)))) { - _reportf(L"No password entered, but a valid TGT exists. Continuing"); - g_fjob.code = 0; - } - - if(g_fjob.code != 0) { - wchar_t tbuf[1024]; - DWORD suggestion; - kherr_suggestion suggest_code; - - khm_err_describe(g_fjob.code, tbuf, sizeof(tbuf), - &suggestion, &suggest_code); - - _report_cs0(KHERR_ERROR, tbuf); - if (suggestion != 0) - _suggest_mr(suggestion, suggest_code); - - _resolve(); - - r = KHUI_NC_RESPONSE_FAILED; - - if (suggest_code == KHERR_SUGGEST_RETRY) { - r |= KHUI_NC_RESPONSE_NOEXIT | - KHUI_NC_RESPONSE_PENDING; - } - -#ifdef DEBUG - assert(g_fjob.state == FIBER_STATE_NONE); -#endif - - if (g_fjob.valid_principal && - nc->n_identities > 0 && - nc->identities[0]) { - /* the principal was valid, so we can go ahead - and update the LRU */ - k5_update_LRU(nc->identities[0]); - } - - } else if (nc->result == KHUI_NC_RESULT_PROCESS && - g_fjob.state == FIBER_STATE_NONE) { - khm_handle csp_idcfg = NULL; - krb5_context ctx = NULL; - - _reportf(L"Tickets successfully acquired"); - - r = KHUI_NC_RESPONSE_SUCCESS | - KHUI_NC_RESPONSE_EXIT; - - /* if we successfully obtained credentials, we - should save the current settings in the - identity config space */ - - assert(nc->n_identities > 0); - assert(nc->identities[0]); - - if (KHM_SUCCEEDED - (k5_open_config_handle(nc->identities[0], - KHM_FLAG_CREATE | - KCONF_FLAG_WRITEIFMOD, - &csp_idcfg))) { - k5_write_dlg_params(csp_idcfg, d); - } - - if(csp_idcfg != NULL) - khc_close_space(csp_idcfg); - - /* We should also quickly refresh the credentials - so that the identity flags and ccache - properties reflect the current state of - affairs. This has to be done here so that - other credentials providers which depend on - Krb5 can properly find the initial creds to - obtain their respective creds. */ - - khm_krb5_list_tickets(&ctx); - - if (nc->set_default) { - _reportf(L"Setting default identity"); - kcdb_identity_set_default(nc->identities[0]); - } - - /* If there is no default identity, then make this the default */ - kcdb_identity_refresh(nc->identities[0]); - { - khm_handle tdefault = NULL; - - if (KHM_SUCCEEDED(kcdb_identity_get_default(&tdefault))) { - kcdb_identity_release(tdefault); - } else { - _reportf(L"There was no default identity. Setting default"); - kcdb_identity_set_default(nc->identities[0]); - } - } - - /* and update the LRU */ - k5_update_LRU(nc->identities[0]); - - if (ctx != NULL) - pkrb5_free_context(ctx); - } else if (g_fjob.state == FIBER_STATE_NONE) { - /* the user cancelled the operation */ - r = KHUI_NC_RESPONSE_EXIT | - KHUI_NC_RESPONSE_SUCCESS; - } - - if(g_fjob.state == FIBER_STATE_NONE) { - khui_cw_set_response(nc, credtype_id_krb5, r); - - if (r & KHUI_NC_RESPONSE_NOEXIT) { - /* if we are retrying the call, we should - restart the kinit fiber */ -#ifdef DEBUG - assert(r & KHUI_NC_RESPONSE_PENDING); -#endif - - k5_prep_kinit_job(nc); - SwitchToFiber(k5_kinit_fiber); - } else { - /* free up the fiber data fields. */ - k5_free_kinit_job(); - } - } else { - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_NOEXIT | - KHUI_NC_RESPONSE_PENDING | r); - } - - _end_task(); - } else if (nc->subtype == KMSG_CRED_RENEW_CREDS) { - - FILETIME ftidexp = {0,0}; - FILETIME ftcurrent; - khm_size cb; - - GetSystemTimeAsFileTime(&ftcurrent); - - _begin_task(0); - _report_mr0(KHERR_NONE, MSG_CTX_RENEW_CREDS); - _describe(); - - if (nc->ctx.scope == KHUI_SCOPE_IDENT || - (nc->ctx.scope == KHUI_SCOPE_CREDTYPE && - nc->ctx.cred_type == credtype_id_krb5) || - (nc->ctx.scope == KHUI_SCOPE_CRED && - nc->ctx.cred_type == credtype_id_krb5)) { - int code; - - if (nc->ctx.scope == KHUI_SCOPE_CRED && - nc->ctx.cred != NULL) { - - /* get the expiration time for the identity first. */ - cb = sizeof(ftidexp); -#ifdef DEBUG - assert(nc->ctx.identity != NULL); -#endif - kcdb_identity_get_attr(nc->ctx.identity, - KCDB_ATTR_EXPIRE, - NULL, - &ftidexp, - &cb); - - code = khm_krb5_renew_cred(nc->ctx.cred); - - } else if (nc->ctx.scope == KHUI_SCOPE_IDENT && - nc->ctx.identity != 0) { - /* get the current identity expiration time */ - cb = sizeof(ftidexp); - - kcdb_identity_get_attr(nc->ctx.identity, - KCDB_ATTR_EXPIRE, - NULL, - &ftidexp, - &cb); - - code = khm_krb5_renew_ident(nc->ctx.identity); - } else { - - _reportf(L"No identity specified. Can't renew Kerberos tickets"); - - code = 1; /* it just has to be non-zero */ - } - - if (code == 0) { - _reportf(L"Tickets successfully renewed"); - - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_EXIT | - KHUI_NC_RESPONSE_SUCCESS); - } else if (nc->ctx.identity == 0) { - - _report_mr0(KHERR_ERROR, MSG_ERR_NO_IDENTITY); - - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_EXIT | - KHUI_NC_RESPONSE_FAILED); - } else if (CompareFileTime(&ftcurrent, &ftidexp) < 0) { - wchar_t tbuf[1024]; - DWORD suggestion; - kherr_suggestion sug_id; - - /* if we failed to get new tickets, but the - identity isstill valid, then we assume that - the current tickets are still good enough - for other credential types to obtain their - credentials. */ - - khm_err_describe(code, tbuf, sizeof(tbuf), - &suggestion, &sug_id); - - _report_cs0(KHERR_WARNING, tbuf); - if (suggestion) - _suggest_mr(suggestion, sug_id); - - _resolve(); - - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_EXIT | - KHUI_NC_RESPONSE_SUCCESS); - } else { - wchar_t tbuf[1024]; - DWORD suggestion; - kherr_suggestion sug_id; - - khm_err_describe(code, tbuf, sizeof(tbuf), - &suggestion, &sug_id); - - _report_cs0(KHERR_ERROR, tbuf); - if (suggestion) - _suggest_mr(suggestion, sug_id); - - _resolve(); - - khui_cw_set_response(nc, credtype_id_krb5, - ((sug_id == KHERR_SUGGEST_RETRY)?KHUI_NC_RESPONSE_NOEXIT:KHUI_NC_RESPONSE_EXIT) | - KHUI_NC_RESPONSE_FAILED); - } - } else { - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_EXIT | - KHUI_NC_RESPONSE_SUCCESS); - } - - _end_task(); - } else if (nc->subtype == KMSG_CRED_PASSWORD && - nc->result == KHUI_NC_RESULT_PROCESS) { - - _begin_task(0); - _report_mr0(KHERR_NONE, MSG_CTX_PASSWD); - _describe(); - - khui_cw_lock_nc(nc); - - if (nc->n_identities == 0 || - nc->identities[0] == NULL) { - _report_mr0(KHERR_ERROR, MSG_PWD_NO_IDENTITY); - _suggest_mr(MSG_PWD_S_NO_IDENTITY, KHERR_SUGGEST_RETRY); - - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_FAILED | - KHUI_NC_RESPONSE_NOEXIT); - } else { - wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; - char idname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t wpwd[KHUI_MAXCCH_PASSWORD]; - char pwd[KHUI_MAXCCH_PASSWORD]; - wchar_t wnpwd[KHUI_MAXCCH_PASSWORD]; - char npwd[KHUI_MAXCCH_PASSWORD]; - wchar_t wnpwd2[KHUI_MAXCCH_PASSWORD]; - wchar_t * wresult; - char * result; - khm_size n_prompts = 0; - khm_size cb; - khm_int32 rv = KHM_ERROR_SUCCESS; - long code = 0; - khm_handle ident; - - khui_cw_get_prompt_count(nc, &n_prompts); - assert(n_prompts == 3); - - ident = nc->identities[0]; - cb = sizeof(widname); - rv = kcdb_identity_get_name(ident, widname, &cb); - if (KHM_FAILED(rv)) { -#ifdef DEBUG - assert(FALSE); -#endif - _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); - goto _pwd_exit; - } - - cb = sizeof(wpwd); - rv = khui_cw_get_prompt_value(nc, 0, wpwd, &cb); - if (KHM_FAILED(rv)) { -#ifdef DEBUG - assert(FALSE); -#endif - _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); - goto _pwd_exit; - } - - cb = sizeof(wnpwd); - rv = khui_cw_get_prompt_value(nc, 1, wnpwd, &cb); - if (KHM_FAILED(rv)) { -#ifdef DEBUG - assert(FALSE); -#endif - _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); - goto _pwd_exit; - } - - cb = sizeof(wnpwd2); - rv = khui_cw_get_prompt_value(nc, 2, wnpwd2, &cb); - if (KHM_FAILED(rv)) { -#ifdef DEBUG - assert(FALSE); -#endif - _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); - goto _pwd_exit; - } - - if (wcscmp(wnpwd, wnpwd2)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr0(KHERR_ERROR, MSG_PWD_NOT_SAME); - _suggest_mr(MSG_PWD_S_NOT_SAME, KHERR_SUGGEST_INTERACT); - goto _pwd_exit; - } - - if (!wcscmp(wpwd, wnpwd)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr0(KHERR_ERROR, MSG_PWD_SAME); - _suggest_mr(MSG_PWD_S_SAME, KHERR_SUGGEST_INTERACT); - goto _pwd_exit; - } - - UnicodeStrToAnsi(idname, sizeof(idname), widname); - UnicodeStrToAnsi(pwd, sizeof(pwd), wpwd); - UnicodeStrToAnsi(npwd, sizeof(npwd), wnpwd); - - result = NULL; - - code = khm_krb5_changepwd(idname, - pwd, - npwd, - &result); - - if (code) - rv = KHM_ERROR_UNKNOWN; - - /* result is only set when code != 0 */ - if (code && result) { - size_t len; - - StringCchLengthA(result, KHERR_MAXCCH_STRING, - &len); - wresult = PMALLOC((len + 1) * sizeof(wchar_t)); -#ifdef DEBUG - assert(wresult); -#endif - AnsiStrToUnicode(wresult, (len + 1) * sizeof(wchar_t), - result); - - _report_cs1(KHERR_ERROR, L"%1!s!", _cstr(wresult)); - _resolve(); - - PFREE(result); - PFREE(wresult); - - /* leave wresult. It will get freed when the - reported event is freed. */ - - /* we don't need to report anything more */ - code = 0; - } - - _pwd_exit: - if (KHM_FAILED(rv)) { - if (code) { - wchar_t tbuf[1024]; - DWORD suggestion; - kherr_suggestion sug_id; - - khm_err_describe(code, tbuf, sizeof(tbuf), - &suggestion, &sug_id); - _report_cs0(KHERR_ERROR, tbuf); - - if (suggestion) - _suggest_mr(suggestion, sug_id); - - _resolve(); - } - - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_NOEXIT| - KHUI_NC_RESPONSE_FAILED); - } else { - khui_cw_set_response(nc, credtype_id_krb5, - KHUI_NC_RESPONSE_SUCCESS | - KHUI_NC_RESPONSE_EXIT); - } - } - - khui_cw_unlock_nc(nc); - - _end_task(); - } /* KMSG_CRED_PASSWORD */ - } - break; - - case KMSG_CRED_END: - { - khui_new_creds * nc; - khui_new_creds_by_type * nct; - - nc = (khui_new_creds *) vparam; - khui_cw_find_type(nc, credtype_id_krb5, &nct); - - if(!nct) - break; - - khui_cw_del_type(nc, credtype_id_krb5); - - if (nct->name) - PFREE(nct->name); - if (nct->credtext) - PFREE(nct->credtext); - - PFREE(nct); - } - break; - - case KMSG_CRED_IMPORT: - { - khm_int32 t = 0; - -#ifdef DEBUG - assert(csp_params); -#endif - khc_read_int32(csp_params, L"MsLsaImport", &t); - - if (t == 1) - khm_krb5_ms2mit(TRUE); - } - break; - } - - return rv; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include + +#include + +#include + +extern LPVOID k5_main_fiber; +extern LPVOID k5_kinit_fiber; + +typedef struct k5_dlg_data_t { + khui_new_creds * nc; + + khui_tracker tc_lifetime; + khui_tracker tc_renew; + + BOOL dirty; /* is the data in sync with the + configuration store? */ + BOOL sync; /* is the data in sync with the kinit + request? */ + DWORD renewable; + DWORD forwardable; + DWORD proxiable; + DWORD addressless; + DWORD publicIP; + + wchar_t * cred_message; /* overrides the credential text, if + non-NULL */ +} k5_dlg_data; + + +INT_PTR +k5_handle_wm_initdialog(HWND hwnd, + WPARAM wParam, + LPARAM lParam) +{ + HWND hw; + k5_dlg_data * d; + khui_new_creds_by_type * nct; + + d = PMALLOC(sizeof(*d)); + ZeroMemory(d, sizeof(*d)); + /* lParam is a pointer to a khui_new_creds structure */ + d->nc = (khui_new_creds *) lParam; + khui_cw_find_type(d->nc, credtype_id_krb5, &nct); + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LPARAM) d); +#pragma warning(pop) + + nct->aux = (LPARAM) d; + + if (d->nc->subtype == KMSG_CRED_NEW_CREDS) { + khui_tracker_initialize(&d->tc_lifetime); + khui_tracker_initialize(&d->tc_renew); + + hw = GetDlgItem(hwnd, IDC_NCK5_LIFETIME_EDIT); + khui_tracker_install(hw, &d->tc_lifetime); + + hw = GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT); + khui_tracker_install(hw, &d->tc_renew); + } + return TRUE; +} + +INT_PTR +k5_handle_wm_destroy(HWND hwnd, + WPARAM wParam, + LPARAM lParam) +{ + k5_dlg_data * d; + khui_new_creds_by_type * nct = NULL; + + d = (k5_dlg_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (!d) + return TRUE; + + khui_cw_find_type(d->nc, credtype_id_krb5, &nct); + +#ifdef DEBUG + assert(nct); +#endif + + nct->aux = 0; + + if (d->nc->subtype == KMSG_CRED_NEW_CREDS) { + khui_tracker_kill_controls(&d->tc_renew); + khui_tracker_kill_controls(&d->tc_lifetime); + } + + PFREE(d); + + return TRUE; +} + +INT_PTR +k5_handle_wmnc_notify(HWND hwnd, + WPARAM wParam, + LPARAM lParam) +{ + switch(HIWORD(wParam)) { + case WMNC_DIALOG_MOVE: + { + k5_dlg_data * d; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (d->nc->subtype == KMSG_CRED_NEW_CREDS) { + khui_tracker_reposition(&d->tc_lifetime); + khui_tracker_reposition(&d->tc_renew); + } + + return TRUE; + } + break; + + case WMNC_DIALOG_SETUP: + { + k5_dlg_data * d; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (d->nc->subtype == KMSG_CRED_PASSWORD) + return TRUE; + + /* need to update the controls with d->* */ + SendDlgItemMessage(hwnd, IDC_NCK5_RENEWABLE, + BM_SETCHECK, + (d->renewable? BST_CHECKED : BST_UNCHECKED), + 0); + EnableWindow(GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT), + !!d->renewable); + + khui_tracker_refresh(&d->tc_lifetime); + khui_tracker_refresh(&d->tc_renew); + + SendDlgItemMessage(hwnd, IDC_NCK5_FORWARDABLE, + BM_SETCHECK, + (d->forwardable ? BST_CHECKED : BST_UNCHECKED), + 0); + + SendDlgItemMessage(hwnd, IDC_NCK5_ADDRESS, + BM_SETCHECK, + (d->addressless ? BST_CHECKED : BST_UNCHECKED), + 0); + + SendDlgItemMessage(hwnd, IDC_NCK5_PUBLICIP, + IPM_SETADDRESS, + 0, d->publicIP); + + EnableWindow(GetDlgItem(hwnd, IDC_NCK5_PUBLICIP), !d->addressless); + } + break; + + case WMNC_UPDATE_CREDTEXT: + { + k5_dlg_data * d; + khui_new_creds * nc; + khui_new_creds_by_type * nct; + wchar_t sbuf[1024]; + wchar_t fbuf[256]; + wchar_t tbuf[256]; + size_t cbsize; + khm_int32 flags; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + nc = d->nc; + khui_cw_find_type(nc, credtype_id_krb5, &nct); + + if(nct == NULL) + break; + + if(nct->credtext) + PFREE(nct->credtext); + nct->credtext = NULL; + + tbuf[0] = L'\0'; + + if (nc->n_identities > 0 && + KHM_SUCCEEDED(kcdb_identity_get_flags(nc->identities[0], + &flags)) && + (flags & KCDB_IDENT_FLAG_VALID) && + nc->subtype == KMSG_CRED_NEW_CREDS) { + + if (is_k5_identpro) + k5_get_realm_from_nc(nc, tbuf, ARRAYLENGTH(tbuf)); + else + GetDlgItemText(hwnd, IDC_NCK5_REALM, tbuf, + ARRAYLENGTH(tbuf)); + + /*TODO: if additional realms were specified, then those + must be listed as well */ + LoadString(hResModule, IDS_KRB5_CREDTEXT_0, + fbuf, ARRAYLENGTH(fbuf)); + StringCbPrintf(sbuf, sizeof(sbuf), fbuf, + tbuf); + + StringCbLength(sbuf, sizeof(sbuf), &cbsize); + cbsize += sizeof(wchar_t); + + nct->credtext = PMALLOC(cbsize); + + StringCbCopy(nct->credtext, cbsize, sbuf); + } else if (nc->n_identities > 0 && + nc->subtype == KMSG_CRED_PASSWORD) { + cbsize = sizeof(tbuf); + kcdb_identity_get_name(nc->identities[0], tbuf, &cbsize); + + LoadString(hResModule, IDS_KRB5_CREDTEXT_P0, + fbuf, ARRAYLENGTH(fbuf)); + StringCbPrintf(sbuf, sizeof(sbuf), fbuf, tbuf); + + StringCbLength(sbuf, sizeof(sbuf), &cbsize); + cbsize += sizeof(wchar_t); + + nct->credtext = PMALLOC(cbsize); + + StringCbCopy(nct->credtext, cbsize, sbuf); + } else { + if (d->cred_message) { + StringCbLength(d->cred_message, KHUI_MAXCB_BANNER, + &cbsize); + cbsize += sizeof(wchar_t); + + nct->credtext = PMALLOC(cbsize); + + StringCbCopy(nct->credtext, cbsize, d->cred_message); + } + } + } + break; + + case WMNC_IDENTITY_CHANGE: + { + /* There has been a change of identity */ + k5_dlg_data * d; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + kmq_post_sub_msg(k5_sub, KMSG_CRED, + KMSG_CRED_DIALOG_NEW_IDENTITY, + 0, (void *) d->nc); + } + break; + + case WMNC_DIALOG_PREPROCESS: + { + k5_dlg_data * d; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if(!d->sync) { + kmq_post_sub_msg(k5_sub, KMSG_CRED, + KMSG_CRED_DIALOG_NEW_OPTIONS, + 0, (void *) d->nc); + + /* the above notification effectively takes all our + changes into account. The data we have is no + longer out of sync */ + d->sync = FALSE; + } + } + break; + + case K5_SET_CRED_MSG: + { + k5_dlg_data * d; + khm_size cb; + wchar_t * msg; + + d = (k5_dlg_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + msg = (wchar_t *) lParam; + + if (d->cred_message) { + PFREE(d->cred_message); + d->cred_message = NULL; + } + + if (msg && + SUCCEEDED(StringCbLength(msg, + KHUI_MAXCB_MESSAGE, + &cb))) { + cb += sizeof(wchar_t); + d->cred_message = PMALLOC(cb); +#ifdef DEBUG + assert(d->cred_message); +#endif + StringCbCopy(d->cred_message, cb, msg); + } + } + break; + } + + return 0; +} + +INT_PTR +k5_handle_wm_notify(HWND hwnd, + WPARAM wParam, + LPARAM lParam) { + LPNMHDR pnmh; + k5_dlg_data * d; + + pnmh = (LPNMHDR) lParam; + if (pnmh->idFrom == IDC_NCK5_PUBLICIP && + pnmh->code == IPN_FIELDCHANGED) { + + d = (k5_dlg_data *) (LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + + SendDlgItemMessage(hwnd, IDC_NCK5_PUBLICIP, + IPM_GETADDRESS, + 0, (LPARAM) &d->publicIP); + + d->dirty = TRUE; + d->sync = FALSE; + + return TRUE; + } + + return 0; +} + +INT_PTR +k5_handle_wm_command(HWND hwnd, + WPARAM wParam, + LPARAM lParam) +{ + int cid; + int notif; + k5_dlg_data * d; + + d = (k5_dlg_data *)(LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + + cid = LOWORD(wParam); + notif = HIWORD(wParam); + + if(notif == BN_CLICKED && cid == IDC_NCK5_RENEWABLE) { + int c; + c = (int) SendDlgItemMessage(hwnd, IDC_NCK5_RENEWABLE, + BM_GETCHECK, 0, 0); + if(c==BST_CHECKED) { + EnableWindow(GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT), TRUE); + d->renewable = TRUE; + } else { + EnableWindow(GetDlgItem(hwnd, IDC_NCK5_RENEW_EDIT), FALSE); + d->renewable = FALSE; + } + d->dirty = TRUE; + d->sync = FALSE; + } else if(notif == BN_CLICKED && cid == IDC_NCK5_FORWARDABLE) { + int c; + c = (int) SendDlgItemMessage(hwnd, IDC_NCK5_FORWARDABLE, + BM_GETCHECK, 0, 0); + if(c==BST_CHECKED) { + d->forwardable = TRUE; + } else { + d->forwardable = FALSE; + } + d->dirty = TRUE; + d->sync = FALSE; + } else if (notif == BN_CLICKED && cid == IDC_NCK5_ADDRESS) { + int c; + + c = (int) SendDlgItemMessage(hwnd, IDC_NCK5_ADDRESS, + BM_GETCHECK, 0, 0); + + if (c==BST_CHECKED) { + d->addressless = TRUE; + } else { + d->addressless = FALSE; + } + d->dirty = TRUE; + d->sync = FALSE; + + EnableWindow(GetDlgItem(hwnd, IDC_NCK5_PUBLICIP), !d->addressless); + } else if (notif == EN_CHANGE && (cid == IDC_NCK5_RENEW_EDIT || + cid == IDC_NCK5_LIFETIME_EDIT)) { + d->dirty = TRUE; + d->sync = FALSE; + } else if((notif == CBN_SELCHANGE || + notif == CBN_KILLFOCUS) && + cid == IDC_NCK5_REALM && + !is_k5_identpro) { + /* find out what the realm of the current identity + is, and if they are the same, then we don't do + anything */ + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; + wchar_t *r; + khm_size cbsize; + khm_handle ident; + int idx; + + if(d->nc->n_identities > 0) { + if(notif == CBN_SELCHANGE) { + idx = (int) SendDlgItemMessage(hwnd, IDC_NCK5_REALM, + CB_GETCURSEL, 0, 0); + SendDlgItemMessage(hwnd, IDC_NCK5_REALM, + CB_GETLBTEXT, idx, (LPARAM) realm); + } else { + GetDlgItemText(hwnd, IDC_NCK5_REALM, + realm, ARRAYLENGTH(realm)); + } + cbsize = sizeof(idname); + if(KHM_SUCCEEDED(kcdb_identity_get_name(d->nc->identities[0], + idname, &cbsize))) { + r = wcschr(idname, L'@'); + if(r && !wcscmp(realm, r+1)) + return 0; /* nothing to do */ + + if(!r) { + r = idname + wcslen(idname); + *r++ = L'@'; + *r++ = 0; + } + + /* if we get here, we have a new user */ + StringCchCopy(r+1, + ARRAYLENGTH(idname) - ((r+1) - idname), + realm); + if(KHM_SUCCEEDED(kcdb_identity_create(idname, + KCDB_IDENT_FLAG_CREATE, + &ident))) { + khui_cw_set_primary_id(d->nc, ident); + kcdb_identity_release(ident); + } + return 0; + } + } + + /* if we get here, we have a new realm, but there is no + identity */ + PostMessage(d->nc->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_UPDATE_CREDTEXT), 0); + } + + return 0; +} + + +/* Dialog procedure for the Krb5 credentials type panel. + + NOTE: Runs in the context of the UI thread +*/ +INT_PTR CALLBACK +k5_nc_dlg_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch(uMsg) { + case WM_INITDIALOG: + return k5_handle_wm_initdialog(hwnd, wParam, lParam); + + case WM_COMMAND: + return k5_handle_wm_command(hwnd, wParam, lParam); + + case KHUI_WM_NC_NOTIFY: + return k5_handle_wmnc_notify(hwnd, wParam, lParam); + + case WM_NOTIFY: + return k5_handle_wm_notify(hwnd, wParam, lParam); + + case WM_DESTROY: + return k5_handle_wm_destroy(hwnd, wParam, lParam); + } + return FALSE; +} + +/* forward dcl */ +krb5_error_code KRB5_CALLCONV +k5_kinit_prompter(krb5_context context, + void *data, + const char *name, + const char *banner, + int num_prompts, + krb5_prompt prompts[]); + + + +fiber_job g_fjob; /* global fiber job object */ + +static BOOL +k5_cached_kinit_prompter(void); + +static BOOL +k5_cp_check_continue(void); + +/* + Runs in the context of the krb5 plugin's slave fiber +*/ +VOID CALLBACK +k5_kinit_fiber_proc(PVOID lpParameter) +{ + while(TRUE) + { + if(g_fjob.command == FIBER_CMD_KINIT) { + g_fjob.state = FIBER_STATE_KINIT; + + g_fjob.prompt_set = 0; + + if (k5_cached_kinit_prompter()) { + SwitchToFiber(k5_main_fiber); + + if (g_fjob.command != FIBER_CMD_CONTINUE) + goto _switch_to_main; + + if (!k5_cp_check_continue()) { + g_fjob.code = KRB5KRB_AP_ERR_BAD_INTEGRITY; + goto _switch_to_main; + } + } + + g_fjob.code = + khm_krb5_kinit(0, + g_fjob.principal, + g_fjob.password, + g_fjob.ccache, + g_fjob.lifetime, + g_fjob.forwardable, + g_fjob.proxiable, + (g_fjob.renewable ? g_fjob.renew_life : 0), + g_fjob.addressless, + g_fjob.publicIP, + k5_kinit_prompter, + &g_fjob); + } + + _switch_to_main: + g_fjob.state = FIBER_STATE_NONE; + + SwitchToFiber(k5_main_fiber); + } +} + +/* return TRUE if we should go ahead with creds acquisition */ +static BOOL +k5_cp_check_continue(void) { + khm_size i; + khm_size n_p; + khui_new_creds_prompt * p; + size_t cch; + +#ifdef DEBUG + assert(g_fjob.nc); +#endif + + if (KHM_FAILED(khui_cw_get_prompt_count(g_fjob.nc, &n_p))) { +#ifdef DEBUG + assert(FALSE); +#endif + return TRUE; + } + + khui_cw_sync_prompt_values(g_fjob.nc); + + g_fjob.null_password = FALSE; + + /* we are just checking whether there was a password field that + was left empty, in which case we can't continue with the + credentials acquisition. */ + for (i=0; i < n_p; i++) { + if(KHM_FAILED(khui_cw_get_prompt(g_fjob.nc, + (int) i, + &p))) + continue; + if(p->type == KHUI_NCPROMPT_TYPE_PASSWORD) { + if (p->value == NULL || + FAILED(StringCchLength(p->value, KHUI_MAXCCH_PROMPT, + &cch)) || + cch == 0) { + g_fjob.null_password = TRUE; + return FALSE; + } else + break; + } + } + + return TRUE; +} + +/* returns true if we find cached prompts */ +static BOOL +k5_cached_kinit_prompter(void) { + BOOL rv = FALSE; + khm_handle ident; + khm_handle csp_idconfig = NULL; + khm_handle csp_k5config = NULL; + khm_handle csp_prcache = NULL; + khm_size cb; + khm_size n_cur_prompts; + khm_int32 n_prompts; + khm_int32 i; + +#ifdef DEBUG + assert(g_fjob.nc); +#endif + + ident = g_fjob.identity; + if (!ident) + return FALSE; + + /* don't need to hold ident, since it is already held in g_fjob + and it doesn't change until we return */ + + if (KHM_FAILED(kcdb_identity_get_config(ident, 0, &csp_idconfig)) || + + KHM_FAILED(khc_open_space(csp_idconfig, CSNAME_KRB5CRED, + 0, &csp_k5config)) || + + KHM_FAILED(khc_open_space(csp_k5config, CSNAME_PROMPTCACHE, + 0, &csp_prcache)) || + + KHM_FAILED(khc_read_int32(csp_prcache, L"PromptCount", + &n_prompts)) || + n_prompts == 0) + + goto _cleanup; + + /* we found a prompt cache. We take this to imply that the + principal is valid. */ + g_fjob.valid_principal = TRUE; + + /* check if there are any prompts currently showing. If there are + we check if they are the same as the ones we are going to show. + In which case we just reuse the exisitng prompts */ + if (KHM_FAILED(khui_cw_get_prompt_count(g_fjob.nc, + &n_cur_prompts)) || + n_prompts != (khm_int32) n_cur_prompts) + goto _show_new_prompts; + + for(i = 0; i < n_prompts; i++) { + wchar_t wsname[8]; + wchar_t wprompt[KHUI_MAXCCH_PROMPT]; + khm_handle csp_p = NULL; + khm_int32 p_type; + khm_int32 p_flags; + khui_new_creds_prompt * p; + + if (KHM_FAILED(khui_cw_get_prompt(g_fjob.nc, i, &p))) + break; + + StringCbPrintf(wsname, sizeof(wsname), L"%d", i); + + if (KHM_FAILED(khc_open_space(csp_prcache, wsname, 0, &csp_p))) + break; + + cb = sizeof(wprompt); + if (KHM_FAILED(khc_read_string(csp_p, L"Prompt", + wprompt, &cb))) { + khc_close_space(csp_p); + break; + } + + if (KHM_FAILED(khc_read_int32(csp_p, L"Type", &p_type))) + p_type = 0; + + if (KHM_FAILED(khc_read_int32(csp_p, L"Flags", &p_flags))) + p_flags = 0; + + if ( /* if we received a prompt string, + then it should be the same as the + one that is displayed */ + (wprompt[0] && + (p->prompt == NULL || + wcscmp(wprompt, p->prompt))) || + + /* if we didn't receive one, then + there shouldn't be one displayed. + This case really shouldn't happen + in reality, but we check anyway. */ + (!wprompt[0] && + p->prompt != NULL) || + + /* the type should match */ + (p_type != p->type) || + + /* if this prompt should be hidden, + then it must also be so */ + (p_flags != p->flags) + ) { + + khc_close_space(csp_p); + break; + + } + + + khc_close_space(csp_p); + } + + if (i == n_prompts) { + rv = TRUE; + goto _cleanup; + } + + _show_new_prompts: + + khui_cw_clear_prompts(g_fjob.nc); + + { + wchar_t wbanner[KHUI_MAXCCH_BANNER]; + wchar_t wpname[KHUI_MAXCCH_PNAME]; + + cb = sizeof(wbanner); + if (KHM_FAILED(khc_read_string(csp_prcache, L"Banner", + wbanner, &cb))) + wbanner[0] = 0; + + cb = sizeof(wpname); + if (KHM_FAILED(khc_read_string(csp_prcache, L"Name", + wpname, &cb))) + wpname[0] = 0; + + khui_cw_begin_custom_prompts(g_fjob.nc, + n_prompts, + (wbanner[0]? wbanner: NULL), + (wpname[0]? wpname: NULL)); + } + + for(i = 0; i < n_prompts; i++) { + wchar_t wsname[8]; + wchar_t wprompt[KHUI_MAXCCH_PROMPT]; + khm_handle csp_p = NULL; + khm_int32 p_type; + khm_int32 p_flags; + + StringCbPrintf(wsname, sizeof(wsname), L"%d", i); + + if (KHM_FAILED(khc_open_space(csp_prcache, wsname, 0, &csp_p))) + break; + + cb = sizeof(wprompt); + if (KHM_FAILED(khc_read_string(csp_p, L"Prompt", + wprompt, &cb))) { + khc_close_space(csp_p); + break; + } + + if (KHM_FAILED(khc_read_int32(csp_p, L"Type", &p_type))) + p_type = 0; + + if (KHM_FAILED(khc_read_int32(csp_p, L"Flags", &p_flags))) + p_flags = 0; + + khui_cw_add_prompt(g_fjob.nc, p_type, wprompt, NULL, p_flags); + + khc_close_space(csp_p); + } + + if (i < n_prompts) { + khui_cw_clear_prompts(g_fjob.nc); + } else { + rv = TRUE; + } + + _cleanup: + + if (csp_prcache) + khc_close_space(csp_prcache); + + if (csp_k5config) + khc_close_space(csp_k5config); + + if (csp_idconfig) + khc_close_space(csp_idconfig); + + return rv; +} + +/* Runs in the context of the Krb5 plugin's slave fiber */ +krb5_error_code KRB5_CALLCONV +k5_kinit_prompter(krb5_context context, + void *data, + const char *name, + const char *banner, + int num_prompts, + krb5_prompt prompts[]) +{ + int i; + khui_new_creds * nc; + krb5_prompt_type * ptypes; + khm_size ncp; + krb5_error_code code = 0; + BOOL new_prompts = TRUE; + + khm_handle csp_prcache = NULL; + + /* we got prompts? Then we assume that the principal is valid */ + g_fjob.valid_principal = TRUE; + + nc = g_fjob.nc; + + if(pkrb5_get_prompt_types) + ptypes = pkrb5_get_prompt_types(context); + else + ptypes = NULL; + + /* check if we are already showing the right prompts */ + khui_cw_get_prompt_count(nc, &ncp); + + if (num_prompts != (int) ncp) + goto _show_new_prompts; + + for (i=0; i < num_prompts; i++) { + wchar_t wprompt[KHUI_MAXCCH_PROMPT]; + khui_new_creds_prompt * p; + + if(prompts[i].prompt) { + AnsiStrToUnicode(wprompt, sizeof(wprompt), + prompts[i].prompt); + } else { + wprompt[0] = 0; + } + + if (KHM_FAILED(khui_cw_get_prompt(nc, i, &p))) + break; + + if ( /* if we received a prompt string, + then it should be the same as the + one that is displayed */ + (wprompt[0] && + (p->prompt == NULL || + wcscmp(wprompt, p->prompt))) || + /* if we didn't receive one, then + there shouldn't be one displayed. + This case really shouldn't happen + in reality, but we check anyway. */ + (!wprompt[0] && + p->prompt != NULL) || + /* the type should match */ + (ptypes && + ptypes[i] != p->type) || + (!ptypes && + p->type != 0) || + /* if this prompt should be hidden, + then it must also be so */ + (prompts[i].hidden && + !(p->flags & KHUI_NCPROMPT_FLAG_HIDDEN)) || + (!prompts[i].hidden && + (p->flags & KHUI_NCPROMPT_FLAG_HIDDEN)) + ) + break; + } + + if (i < num_prompts) + goto _show_new_prompts; + + new_prompts = FALSE; + + /* ok. looks like we are already showing the same set of prompts + that we were supposed to show. Sync up the values and go + ahead. */ + khui_cw_sync_prompt_values(nc); + goto _process_prompts; + + _show_new_prompts: + /* special case. if there are no actual input controls involved, + then we have to show an alerter window and pass through */ + if (num_prompts == 0) { + wchar_t wbanner[KHUI_MAXCCH_BANNER]; + wchar_t wname[KHUI_MAXCCH_PNAME]; + wchar_t wident[KCDB_IDENT_MAXCCH_NAME]; + wchar_t wmsg[KHUI_MAXCCH_MESSAGE]; + wchar_t wfmt[KHUI_MAXCCH_BANNER]; + khm_size cb; + + if (!banner) { + code = 0; + g_fjob.null_password = FALSE; + goto _exit; + } else { + AnsiStrToUnicode(wbanner, sizeof(wbanner), banner); + } + + if (name) { + AnsiStrToUnicode(wname, sizeof(wname), name); + } else { + LoadString(hResModule, + IDS_KRB5_WARNING, + wname, + ARRAYLENGTH(wname)); + } + + cb = sizeof(wident); + if (KHM_FAILED(kcdb_identity_get_name(g_fjob.identity, wident, &cb))) + wident[0] = L'\0'; + + LoadString(hResModule, + IDS_KRB5_WARN_FMT, + wfmt, + ARRAYLENGTH(wfmt)); + + StringCbPrintf(wmsg, sizeof(wmsg), wfmt, wident, wbanner); + + khui_alert_show_simple(wname, wmsg, KHERR_WARNING); + + code = 0; + g_fjob.null_password = FALSE; + goto _exit; + } + + /* in addition to showing new prompts, we also cache the set of + prompts. */ + if(g_fjob.prompt_set == 0) { + khm_handle csp_idconfig = NULL; + khm_handle csp_idk5 = NULL; + + kcdb_identity_get_config(g_fjob.identity, + KHM_FLAG_CREATE, + &csp_idconfig); + + if (csp_idconfig != NULL) + khc_open_space(csp_idconfig, + CSNAME_KRB5CRED, + KHM_FLAG_CREATE, + &csp_idk5); + + if (csp_idk5 != NULL) + khc_open_space(csp_idk5, + CSNAME_PROMPTCACHE, + KHM_FLAG_CREATE, + &csp_prcache); + + khc_close_space(csp_idconfig); + khc_close_space(csp_idk5); + } + + { + wchar_t wbanner[KHUI_MAXCCH_BANNER]; + wchar_t wname[KHUI_MAXCCH_PNAME]; + + if(banner) + AnsiStrToUnicode(wbanner, sizeof(wbanner), banner); + if(name) + AnsiStrToUnicode(wname, sizeof(wname), name); + + khui_cw_clear_prompts(nc); + + khui_cw_begin_custom_prompts( + nc, + num_prompts, + (banner)?wbanner:NULL, + (name)?wname:NULL); + + if (banner && csp_prcache) + khc_write_string(csp_prcache, + L"Banner", + wbanner); + else if (csp_prcache) + khc_write_string(csp_prcache, + L"Banner", + L""); + + if (name && csp_prcache) + khc_write_string(csp_prcache, + L"Name", + wname); + else if (csp_prcache) + khc_write_string(csp_prcache, + L"Name", + L""); + + if (csp_prcache) + khc_write_int32(csp_prcache, + L"PromptCount", + (khm_int32) num_prompts); + } + + for(i=0; i < num_prompts; i++) { + wchar_t wprompt[KHUI_MAXCCH_PROMPT]; + + if(prompts[i].prompt) { + AnsiStrToUnicode(wprompt, sizeof(wprompt), + prompts[i].prompt); + } else { + wprompt[0] = 0; + } + + khui_cw_add_prompt( + nc, + (ptypes?ptypes[i]:0), + wprompt, + NULL, + (prompts[i].hidden?KHUI_NCPROMPT_FLAG_HIDDEN:0)); + + if (csp_prcache) { + khm_handle csp_p = NULL; + wchar_t wnum[8]; /* should be enough for 10 + million prompts */ + + wnum[0] = 0; + StringCbPrintf(wnum, sizeof(wnum), L"%d", i); + + khc_open_space(csp_prcache, wnum, + KHM_FLAG_CREATE, &csp_p); + + if (csp_p) { + khc_write_string(csp_p, L"Prompt", wprompt); + khc_write_int32(csp_p, L"Type", (ptypes?ptypes[i]:0)); + khc_write_int32(csp_p, L"Flags", + (prompts[i].hidden? + KHUI_NCPROMPT_FLAG_HIDDEN:0)); + + khc_close_space(csp_p); + } + } + } + + if (csp_prcache) { + khc_close_space(csp_prcache); + csp_prcache = NULL; + } + + _process_prompts: + /* switch back to main thread if we showed new prompts */ + if (new_prompts) + SwitchToFiber(k5_main_fiber); + + /* we get here after the user selects an action that either + cancles the credentials acquisition operation or triggers the + actual acquisition of credentials. */ + if(g_fjob.command != FIBER_CMD_CONTINUE && + g_fjob.command != FIBER_CMD_KINIT) { + code = -2; + goto _exit; + } + + g_fjob.null_password = FALSE; + + /* otherwise, we need to get the data back from the UI and + return 0 */ + for(i=0; idata, d->length, wbuf); + if(SUCCEEDED(StringCchLengthA(d->data, d->length, &cch))) + d->length = (unsigned int) cch; + else + d->length = 0; + } else { +#ifdef DEBUG + assert(FALSE); +#endif + d->length = 0; + } + + if (ptypes && + ptypes[i] == KRB5_PROMPT_TYPE_PASSWORD && + d->length == 0) + + g_fjob.null_password = TRUE; + } + + _exit: + + g_fjob.prompt_set++; + + /* entering a NULL password is equivalent to cancelling out */ + if (g_fjob.null_password) + return -2; + else + return code; +} + +/* + + The configuration information for each identity comes from a + multitude of layers organized as follows. The ordering is + decreasing in priority. When looking up a value, the value will be + looked up in each layer in turn starting at level 0. The first + instance of the value found will be the effective value. + + 0 : \Krb5Cred + + 0.1: per user + + 0.2: per machine + + 1 : \Parameters\Realms\ + + 1.1: per user + + 1.2: per machine + + 2 : \Parameters + + 2.1: per user + + 2.2: per machine + + 2.3: schema + + */ +khm_int32 +k5_open_config_handle(khm_handle ident, + khm_int32 flags, + khm_handle * ret_csp) { + + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_handle csp_i = NULL; + khm_handle csp_ik5 = NULL; + khm_handle csp_realms = NULL; + khm_handle csp_realm = NULL; + khm_handle csp_plugins = NULL; + khm_handle csp_krbcfg = NULL; + khm_handle csp_rv = NULL; + wchar_t realm[KCDB_IDENT_MAXCCH_NAME]; + + realm[0] = L'\0'; + + if (ident) { + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t * trealm; + khm_size cb_idname = sizeof(idname); + + rv = kcdb_identity_get_name(ident, idname, &cb_idname); + if (KHM_SUCCEEDED(rv) && + (trealm = khm_get_realm_from_princ(idname)) != NULL) { + StringCbCopy(realm, sizeof(realm), trealm); + } + } + + if (ident) { + rv = kcdb_identity_get_config(ident, flags, &csp_i); + if (KHM_FAILED(rv)) + goto done; + + rv = khc_open_space(csp_i, CSNAME_KRB5CRED, flags, &csp_ik5); + if (KHM_FAILED(rv)) + goto done; + + if (realm[0] == L'\0') + goto done_shadow_realm; + + rv = khc_open_space(csp_params, CSNAME_REALMS, flags, &csp_realms); + if (KHM_FAILED(rv)) + goto done_shadow_realm; + + rv = khc_open_space(csp_realms, realm, flags, &csp_realm); + if (KHM_FAILED(rv)) + goto done_shadow_realm; + + rv = khc_shadow_space(csp_realm, csp_params); + + done_shadow_realm: + + if (csp_realm) + rv = khc_shadow_space(csp_ik5, csp_realm); + else + rv = khc_shadow_space(csp_ik5, csp_params); + + csp_rv = csp_ik5; + + } else { + + /* No valid identity specified. We default to the parameters key. */ + rv = kmm_get_plugins_config(0, &csp_plugins); + if (KHM_FAILED(rv)) + goto done; + + rv = khc_open_space(csp_plugins, CSNAME_KRB5CRED, flags, &csp_krbcfg); + if (KHM_FAILED(rv)) + goto done; + + rv = khc_open_space(csp_krbcfg, CSNAME_PARAMS, flags, &csp_rv); + } + + done: + + *ret_csp = csp_rv; + + /* leave csp_ik5. If it's non-NULL, then it's the return value */ + /* leave csp_rv. It's the return value. */ + if (csp_i) + khc_close_space(csp_i); + if (csp_realms) + khc_close_space(csp_realms); + if (csp_realm) + khc_close_space(csp_realm); + if (csp_plugins) + khc_close_space(csp_plugins); + if (csp_krbcfg) + khc_close_space(csp_krbcfg); + + return rv; +} + +void +k5_read_dlg_params(khm_handle conf, + k5_dlg_data * d) +{ + khm_int32 i; + + khc_read_int32(conf, L"Renewable", &i); + d->renewable = i; + khc_read_int32(conf, L"Forwardable", &i); + d->forwardable = i; + khc_read_int32(conf, L"Proxiable", &i); + d->proxiable = i; + khc_read_int32(conf, L"Addressless", &i); + d->addressless = i; + khc_read_int32(conf, L"PublicIP", &i); + d->publicIP = i; + + khc_read_int32(conf, L"DefaultLifetime", &i); + d->tc_lifetime.current = i; + khc_read_int32(conf, L"MaxLifetime", &i); + d->tc_lifetime.max = i; + khc_read_int32(conf, L"MinLifetime", &i); + d->tc_lifetime.min = i; + + khc_read_int32(conf, L"DefaultRenewLifetime", &i); + d->tc_renew.current = i; + khc_read_int32(conf, L"MaxRenewLifetime", &i); + d->tc_renew.max = i; + khc_read_int32(conf, L"MinRenewLifetime", &i); + d->tc_renew.min = i; + + /* however, if this has externally supplied defaults, we have to + use them too. */ + if (d->nc && d->nc->ctx.vparam && + d->nc->ctx.cb_vparam == sizeof(NETID_DLGINFO)) { + LPNETID_DLGINFO pdlginfo; + + pdlginfo = (LPNETID_DLGINFO) d->nc->ctx.vparam; + if (pdlginfo->size == NETID_DLGINFO_V1_SZ && + pdlginfo->in.use_defaults == 0) { + d->forwardable = pdlginfo->in.forwardable; + d->addressless = pdlginfo->in.noaddresses; + d->tc_lifetime.current = pdlginfo->in.lifetime; + d->tc_renew.current = pdlginfo->in.renew_till; + + if (pdlginfo->in.renew_till == 0) + d->renewable = FALSE; + else + d->renewable = TRUE; + + d->proxiable = pdlginfo->in.proxiable; + d->publicIP = pdlginfo->in.publicip; + } + } + + /* once we read the new data, in, it is no longer considered + dirty */ + d->dirty = FALSE; +} + +void +k5_write_dlg_params(khm_handle conf, + k5_dlg_data * d) +{ + khc_write_int32(conf, L"Renewable", d->renewable); + khc_write_int32(conf, L"Forwardable", d->forwardable); + khc_write_int32(conf, L"Proxiable", d->proxiable); + khc_write_int32(conf, L"Addressless", d->addressless); + khc_write_int32(conf, L"PublicIP", d->publicIP); + + khc_write_int32(conf, L"DefaultLifetime", + (khm_int32) d->tc_lifetime.current); + khc_write_int32(conf, L"MaxLifetime", + (khm_int32) d->tc_lifetime.max); + khc_write_int32(conf, L"MinLifetime", + (khm_int32) d->tc_lifetime.min); + + khc_write_int32(conf, L"DefaultRenewLifetime", + (khm_int32) d->tc_renew.current); + khc_write_int32(conf, L"MaxRenewLifetime", + (khm_int32) d->tc_renew.max); + khc_write_int32(conf, L"MinRenewLifetime", + (khm_int32) d->tc_renew.min); + + /* as in k5_read_dlg_params, once we write the data in, the local + data is no longer dirty */ + d->dirty = FALSE; +} + +void +k5_prep_kinit_job(khui_new_creds * nc) +{ + khui_new_creds_by_type * nct; + k5_dlg_data * d; + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cbbuf; + size_t size; + khm_handle ident; + LPNETID_DLGINFO pdlginfo; + + khui_cw_find_type(nc, credtype_id_krb5, &nct); + if (!nct) + return; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); + + if (!d) + return; + + khui_cw_lock_nc(nc); + ident = nc->identities[0]; + kcdb_identity_hold(ident); + khui_cw_unlock_nc(nc); + + cbbuf = sizeof(idname); + kcdb_identity_get_name(ident, idname, &cbbuf); + StringCchLength(idname, ARRAYLENGTH(idname), &size); + size++; + + ZeroMemory(&g_fjob, sizeof(g_fjob)); + g_fjob.command = FIBER_CMD_KINIT; + g_fjob.nc = nc; + g_fjob.nct = nct; + g_fjob.dialog = nct->hwnd_panel; + g_fjob.principal = PMALLOC(size); + UnicodeStrToAnsi(g_fjob.principal, size, idname); + g_fjob.password = NULL; + g_fjob.lifetime = (krb5_deltat) d->tc_lifetime.current; + g_fjob.forwardable = d->forwardable; + g_fjob.proxiable = d->proxiable; + g_fjob.renewable = d->renewable; + g_fjob.renew_life = (krb5_deltat) d->tc_renew.current; + g_fjob.addressless = d->addressless; + g_fjob.publicIP = d->publicIP; + g_fjob.code = 0; + g_fjob.identity = ident; + g_fjob.prompt_set = 0; + g_fjob.valid_principal = FALSE; + + /* if we have external parameters, we should use them as well */ + if (nc->ctx.cb_vparam == sizeof(NETID_DLGINFO) && + (pdlginfo = nc->ctx.vparam) && + pdlginfo->size == NETID_DLGINFO_V1_SZ) { + wchar_t * t; + + if (pdlginfo->in.ccache[0] && + SUCCEEDED(StringCchLength(pdlginfo->in.ccache, + NETID_CCACHE_NAME_SZ, + &size))) { + g_fjob.ccache = PMALLOC(sizeof(char) * (size + 1)); +#ifdef DEBUG + assert(g_fjob.ccache); +#endif + UnicodeStrToAnsi(g_fjob.ccache, size + 1, + pdlginfo->in.ccache); + + /* this is the same as the output cache */ + + StringCbCopy(pdlginfo->out.ccache, sizeof(pdlginfo->out.ccache), + pdlginfo->in.ccache); + } else { + g_fjob.ccache = NULL; + + StringCbCopy(pdlginfo->out.ccache, sizeof(pdlginfo->out.ccache), + idname); + + khm_krb5_canon_cc_name(pdlginfo->out.ccache, + sizeof(pdlginfo->out.ccache)); + } + + t = khm_get_realm_from_princ(idname); + + if (t) { + StringCbCopy(pdlginfo->out.realm, + sizeof(pdlginfo->out.realm), + t); + + if ((t - idname) > 1) { + StringCchCopyN(pdlginfo->out.username, + ARRAYLENGTH(pdlginfo->out.username), + idname, + (t - idname) - 1); + } else { + StringCbCopy(pdlginfo->out.username, + sizeof(pdlginfo->out.username), + L""); + } + } else { + StringCbCopy(pdlginfo->out.username, + sizeof(pdlginfo->out.username), + idname); + StringCbCopy(pdlginfo->out.realm, + sizeof(pdlginfo->out.realm), + L""); + } + } + + /* leave identity held, since we added a reference above */ +} + +void +k5_free_kinit_job(void) +{ + if (g_fjob.principal) + PFREE(g_fjob.principal); + + if (g_fjob.password) + PFREE(g_fjob.password); + + if (g_fjob.identity) + kcdb_identity_release(g_fjob.identity); + + if (g_fjob.ccache) + PFREE(g_fjob.ccache); + + ZeroMemory(&g_fjob, sizeof(g_fjob)); +} + +static khm_int32 KHMAPI +k5_find_tgt_filter(khm_handle cred, + khm_int32 flags, + void * rock) { + khm_handle ident = (khm_handle) rock; + khm_handle cident = NULL; + khm_int32 f; + khm_int32 rv; + + if (KHM_SUCCEEDED(kcdb_cred_get_identity(cred, + &cident)) && + cident == ident && + KHM_SUCCEEDED(kcdb_cred_get_flags(cred, &f)) && + (f & KCDB_CRED_FLAG_INITIAL) && + !(f & KCDB_CRED_FLAG_EXPIRED)) + rv = 1; + else + rv = 0; + + if (cident) + kcdb_identity_release(cident); + + return rv; +} + +khm_int32 +k5_update_LRU(khm_handle identity) +{ + wchar_t * wbuf = NULL; + wchar_t * idname = NULL; + wchar_t * realm = NULL; + khm_size cb; + khm_size cb_ms; + khm_int32 rv = KHM_ERROR_SUCCESS; + + rv = kcdb_identity_get_name(identity, NULL, &cb); + assert(rv == KHM_ERROR_TOO_LONG); + + idname = PMALLOC(cb); + assert(idname); + + rv = kcdb_identity_get_name(identity, idname, &cb); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_read_multi_string(csp_params, L"LRUPrincipals", NULL, &cb_ms); + if (rv != KHM_ERROR_TOO_LONG) + cb_ms = cb + sizeof(wchar_t); + else + cb_ms += cb + sizeof(wchar_t); + + wbuf = PMALLOC(cb_ms); + assert(wbuf); + + cb = cb_ms; + + if (rv == KHM_ERROR_TOO_LONG) { + rv = khc_read_multi_string(csp_params, L"LRUPrincipals", wbuf, &cb); + assert(KHM_SUCCEEDED(rv)); + + if (multi_string_find(wbuf, idname, KHM_CASE_SENSITIVE) != NULL) { + /* it's already there. We remove it here and add it at + the top of the LRU list. */ + multi_string_delete(wbuf, idname, KHM_CASE_SENSITIVE); + } + } else { + multi_string_init(wbuf, cb_ms); + } + + cb = cb_ms; + rv = multi_string_prepend(wbuf, &cb, idname); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_multi_string(csp_params, L"LRUPrincipals", wbuf); + + realm = khm_get_realm_from_princ(idname); + if (realm == NULL || *realm == L'\0') + goto _done_with_LRU; + + cb = cb_ms; + rv = khc_read_multi_string(csp_params, L"LRURealms", wbuf, &cb); + + if (rv == KHM_ERROR_TOO_LONG) { + PFREE(wbuf); + wbuf = PMALLOC(cb); + assert(wbuf); + + cb_ms = cb; + + rv = khc_read_multi_string(csp_params, L"LRURealms", wbuf, &cb); + + assert(KHM_SUCCEEDED(rv)); + } else if (rv == KHM_ERROR_SUCCESS) { + if (multi_string_find(wbuf, realm, KHM_CASE_SENSITIVE) != NULL) { + /* remove the realm and add it at the top later. */ + multi_string_delete(wbuf, realm, KHM_CASE_SENSITIVE); + } + } else { + multi_string_init(wbuf, cb_ms); + } + + cb = cb_ms; + rv = multi_string_prepend(wbuf, &cb, realm); + + if (rv == KHM_ERROR_TOO_LONG) { + wbuf = PREALLOC(wbuf, cb); + + rv = multi_string_prepend(wbuf, &cb, realm); + + assert(KHM_SUCCEEDED(rv)); + } + + rv = khc_write_multi_string(csp_params, L"LRURealms", wbuf); + + assert(KHM_SUCCEEDED(rv)); + + _done_with_LRU: + + if (wbuf) + PFREE(wbuf); + if (idname) + PFREE(idname); + + return rv; +} + +/* Handler for CRED type messages + + Runs in the context of the Krb5 plugin +*/ +khm_int32 KHMAPI +k5_msg_cred_dialog(khm_int32 msg_type, + khm_int32 msg_subtype, + khm_ui_4 uparam, + void * vparam) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + switch(msg_subtype) { + + case KMSG_CRED_PASSWORD: + case KMSG_CRED_NEW_CREDS: + { + khui_new_creds * nc; + khui_new_creds_by_type * nct; + wchar_t wbuf[256]; + size_t cbsize; + + nc = (khui_new_creds *) vparam; + + nct = PMALLOC(sizeof(*nct)); + ZeroMemory(nct, sizeof(*nct)); + + nct->type = credtype_id_krb5; + nct->ordinal = 1; + + LoadString(hResModule, IDS_KRB5_NC_NAME, + wbuf, ARRAYLENGTH(wbuf)); + StringCbLength(wbuf, sizeof(wbuf), &cbsize); + cbsize += sizeof(wchar_t); + + nct->name = PMALLOC(cbsize); + StringCbCopy(nct->name, cbsize, wbuf); + + nct->h_module = hResModule; + nct->dlg_proc = k5_nc_dlg_proc; + if (nc->subtype == KMSG_CRED_PASSWORD) + nct->dlg_template = MAKEINTRESOURCE(IDD_NC_KRB5_PASSWORD); + else + nct->dlg_template = MAKEINTRESOURCE(IDD_NC_KRB5); + + khui_cw_add_type(nc, nct); + } + break; + + case KMSG_CRED_RENEW_CREDS: + { + khui_new_creds * nc; + khui_new_creds_by_type * nct; + + nc = (khui_new_creds *) vparam; + + nct = PMALLOC(sizeof(*nct)); + ZeroMemory(nct, sizeof(*nct)); + + nct->type = credtype_id_krb5; + + khui_cw_add_type(nc, nct); + } + break; + + case KMSG_CRED_DIALOG_PRESTART: + { + khui_new_creds * nc; + khui_new_creds_by_type * nct; + k5_dlg_data * d; + HWND hwnd; + wchar_t * realms; + wchar_t * t; + wchar_t * defrealm; + + nc = (khui_new_creds *) vparam; + + khui_cw_find_type(nc, credtype_id_krb5, &nct); + + if(!nct) + break; + + hwnd = nct->hwnd_panel; + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); + + if (!is_k5_identpro) { + + /* enumerate all realms and place in realms combo box */ + SendDlgItemMessage(hwnd, IDC_NCK5_REALM, + CB_RESETCONTENT, + 0, 0); + + realms = khm_krb5_get_realm_list(); + if(realms) { + for (t = realms; t && *t; t = multi_string_next(t)) { + SendDlgItemMessage(hwnd, IDC_NCK5_REALM, + CB_ADDSTRING, + 0, (LPARAM) t); + } + PFREE(realms); + } + + /* and set the default realm */ + defrealm = khm_krb5_get_default_realm(); + if(defrealm) { + SendDlgItemMessage(hwnd, IDC_NCK5_REALM, + CB_SELECTSTRING, + (WPARAM) -1, + (LPARAM) defrealm); + + SendDlgItemMessage(hwnd, IDC_NCK5_REALM, + WM_SETTEXT, + 0, (LPARAM) defrealm); + PFREE(defrealm); + } + } else { /* if krb5 is the identity provider */ + HWND hw_realms; + + /* in this case, the realm selection is done by the + identity provider prompts. */ + + hw_realms = GetDlgItem(hwnd, IDC_NCK5_REALM); +#ifdef DEBUG + assert(hw_realms); +#endif + EnableWindow(hw_realms, FALSE); + } + + if (nc->subtype == KMSG_CRED_NEW_CREDS) { + k5_read_dlg_params(csp_params, d); + } + + PostMessage(hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0,WMNC_DIALOG_SETUP), 0); + } + break; + + case KMSG_CRED_DIALOG_NEW_IDENTITY: + { + khui_new_creds * nc; + khui_new_creds_by_type * nct; + k5_dlg_data * d; + + nc = (khui_new_creds *) vparam; + + khui_cw_find_type(nc, credtype_id_krb5, &nct); + if (!nct) + break; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); + + /* we only load the identity specific defaults if the user + hasn't changed the options */ + khui_cw_lock_nc(nc); + + /* ?: It might be better to not load identity defaults if + the user has already changed options in the dialog. */ + if(/* !d->dirty && */ nc->n_identities > 0 && + nc->subtype == KMSG_CRED_NEW_CREDS) { + + khm_handle h_idcfg = NULL; + + do { + if (KHM_FAILED + (k5_open_config_handle(nc->identities[0], + 0, &h_idcfg))) + break; + + k5_read_dlg_params(h_idcfg, d); + + PostMessage(nct->hwnd_panel, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0,WMNC_DIALOG_SETUP), 0); + } while(FALSE); + + if(h_idcfg) + khc_close_space(h_idcfg); + } + + khui_cw_unlock_nc(nc); + } + + /* fallthrough */ + case KMSG_CRED_DIALOG_NEW_OPTIONS: + { + khui_new_creds * nc; + khui_new_creds_by_type * nct; + k5_dlg_data * d; + + nc = (khui_new_creds *) vparam; + + khui_cw_find_type(nc, credtype_id_krb5, &nct); + if (!nct) + break; + + d = (k5_dlg_data *)(LONG_PTR) + GetWindowLongPtr(nct->hwnd_panel, DWLP_USER); + + if (nc->subtype == KMSG_CRED_PASSWORD) { + khm_size n_prompts = 0; + + khui_cw_get_prompt_count(nc, &n_prompts); + + if (nc->n_identities == 0) { + if (n_prompts) + khui_cw_clear_prompts(nc); + } else if (n_prompts != 3) { + wchar_t wbuf[KHUI_MAXCCH_BANNER]; + + khui_cw_clear_prompts(nc); + + LoadString(hResModule, IDS_NC_PWD_BANNER, + wbuf, ARRAYLENGTH(wbuf)); + khui_cw_begin_custom_prompts(nc, 3, NULL, wbuf); + + LoadString(hResModule, IDS_NC_PWD_PWD, + wbuf, ARRAYLENGTH(wbuf)); + khui_cw_add_prompt(nc, KHUI_NCPROMPT_TYPE_PASSWORD, + wbuf, NULL, KHUI_NCPROMPT_FLAG_HIDDEN); + + LoadString(hResModule, IDS_NC_PWD_NPWD, + wbuf, ARRAYLENGTH(wbuf)); + khui_cw_add_prompt(nc, KHUI_NCPROMPT_TYPE_NEW_PASSWORD, + wbuf, NULL, KHUI_NCPROMPT_FLAG_HIDDEN); + + LoadString(hResModule, IDS_NC_PWD_NPWD_AGAIN, + wbuf, ARRAYLENGTH(wbuf)); + khui_cw_add_prompt(nc, KHUI_NCPROMPT_TYPE_NEW_PASSWORD_AGAIN, + wbuf, NULL, KHUI_NCPROMPT_FLAG_HIDDEN); + } + + return KHM_ERROR_SUCCESS; + } + /* else; nc->subtype == KMSG_CRED_NEW_CREDS */ + + assert(nc->subtype == KMSG_CRED_NEW_CREDS); + + /* if the fiber is already in a kinit, cancel it */ + if(g_fjob.state == FIBER_STATE_KINIT) { + g_fjob.command = FIBER_CMD_CANCEL; + SwitchToFiber(k5_kinit_fiber); + /* we get here when the cancel operation completes */ + k5_free_kinit_job(); + } + + khui_cw_lock_nc(nc); + + if(nc->n_identities > 0) { + khm_handle ident = nc->identities[0]; + + kcdb_identity_hold(ident); + + k5_prep_kinit_job(nc); + khui_cw_unlock_nc(nc); + + SwitchToFiber(k5_kinit_fiber); + /* we get here when the fiber switches back */ + if(g_fjob.state == FIBER_STATE_NONE) { + wchar_t msg[KHUI_MAXCCH_BANNER]; + khm_size cb; + + /* we can't possibly have succeeded without a + password */ + if(g_fjob.code) { + if (is_k5_identpro) + kcdb_identity_set_flags(ident, + KCDB_IDENT_FLAG_INVALID, + KCDB_IDENT_FLAG_INVALID); + + khui_cw_clear_prompts(nc); + } + + if (d->cred_message) { + PFREE(d->cred_message); + d->cred_message = NULL; + } + + msg[0] = L'\0'; + + switch(g_fjob.code) { + case KRB5KDC_ERR_NAME_EXP: + /* principal expired */ + LoadString(hResModule, IDS_K5ERR_NAME_EXPIRED, + msg, ARRAYLENGTH(msg)); + break; + + case KRB5KDC_ERR_KEY_EXP: + /* password needs changing */ + LoadString(hResModule, IDS_K5ERR_KEY_EXPIRED, + msg, ARRAYLENGTH(msg)); + break; + + default: + { + DWORD dw_dummy; + kherr_suggestion sug_dummy; + wchar_t fmt[KHUI_MAXCCH_BANNER]; + wchar_t desc[KHUI_MAXCCH_BANNER]; + + LoadString(hResModule, IDS_K5ERR_FMT, + fmt, ARRAYLENGTH(fmt)); + + khm_err_describe(g_fjob.code, + desc, + sizeof(desc), + &dw_dummy, + &sug_dummy); + + StringCbPrintf(msg, sizeof(msg), fmt, desc); + } + } + + if (msg[0]) { + StringCbLength(msg, sizeof(msg), &cb); + cb += sizeof(wchar_t); + + d->cred_message = PMALLOC(cb); + StringCbCopy(d->cred_message, cb, msg); + } + + k5_free_kinit_job(); + + } else if(g_fjob.state == FIBER_STATE_KINIT) { + /* this is what we want. Leave the fiber there. */ + + if(is_k5_identpro) + kcdb_identity_set_flags(ident, + KCDB_IDENT_FLAG_VALID, + KCDB_IDENT_FLAG_VALID); + } else { + /* huh?? */ +#ifdef DEBUG + assert(FALSE); +#endif + } + + /* since the attributes of the identity have changed, + we should update the cred text as well */ + kcdb_identity_release(ident); + khui_cw_lock_nc(nc); + PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_UPDATE_CREDTEXT), 0); + } else { + khui_cw_unlock_nc(nc); + khui_cw_clear_prompts(nc); + khui_cw_lock_nc(nc); + } + + khui_cw_unlock_nc(nc); + } + break; + + case KMSG_CRED_PROCESS: + { + khui_new_creds * nc; + khui_new_creds_by_type * nct; + k5_dlg_data * d; + + khm_int32 r = 0; + + nc = (khui_new_creds *) vparam; + + khui_cw_find_type(nc, credtype_id_krb5, &nct); + + if(!nct) + break; + + /* reset the null_password flag, just in case */ + g_fjob.null_password = FALSE; + + if (nc->subtype == KMSG_CRED_NEW_CREDS) { + d = (k5_dlg_data *) nct->aux; + + _begin_task(0); + _report_mr0(KHERR_NONE, MSG_CTX_INITAL_CREDS); + _describe(); + + if (g_fjob.state == FIBER_STATE_KINIT) { + if(nc->result == KHUI_NC_RESULT_CANCEL) { + g_fjob.command = FIBER_CMD_CANCEL; + SwitchToFiber(k5_kinit_fiber); + + /* if we cancelled out, then we shouldn't care + about the return code. */ +#ifdef DEBUG + assert(g_fjob.state == FIBER_STATE_NONE); +#endif + g_fjob.code = 0; + + _reportf(L"Cancelling"); + } else if (nc->result == KHUI_NC_RESULT_PROCESS) { + khui_cw_sync_prompt_values(nc); + g_fjob.command = FIBER_CMD_CONTINUE; + SwitchToFiber(k5_kinit_fiber); + + /* We get back here once the fiber finishes + processing */ + } +#ifdef DEBUG + else { + assert(FALSE); + } +#endif + } else { + /* we weren't in a KINIT state */ + if (nc->result == KHUI_NC_RESULT_CANCEL) { + /* nothing to report */ + g_fjob.code = 0; + } else if (nc->result == KHUI_NC_RESULT_PROCESS) { + /* g_fjob.code should have the result of the + last kinit attempt. We should leave it + as-is */ + } +#ifdef DEBUG + else { + /* unknown result */ + assert(FALSE); + } +#endif + } + + /* special case: if there was no password entered, and + if there is a valid TGT we allow the credential + acquisition to go through */ + if (g_fjob.state == FIBER_STATE_NONE && + g_fjob.code && + g_fjob.null_password && + + (nc->n_identities == 0 || + nc->identities[0] == NULL || + KHM_SUCCEEDED(kcdb_credset_find_filtered + (NULL, + -1, + k5_find_tgt_filter, + nc->identities[0], + NULL, + NULL)))) { + _reportf(L"No password entered, but a valid TGT exists. Continuing"); + g_fjob.code = 0; + } + + if(g_fjob.code != 0) { + wchar_t tbuf[1024]; + DWORD suggestion; + kherr_suggestion suggest_code; + + khm_err_describe(g_fjob.code, tbuf, sizeof(tbuf), + &suggestion, &suggest_code); + + _report_cs0(KHERR_ERROR, tbuf); + if (suggestion != 0) + _suggest_mr(suggestion, suggest_code); + + _resolve(); + + r = KHUI_NC_RESPONSE_FAILED; + + if (suggest_code == KHERR_SUGGEST_RETRY) { + r |= KHUI_NC_RESPONSE_NOEXIT | + KHUI_NC_RESPONSE_PENDING; + } + +#ifdef DEBUG + assert(g_fjob.state == FIBER_STATE_NONE); +#endif + + if (g_fjob.valid_principal && + nc->n_identities > 0 && + nc->identities[0]) { + /* the principal was valid, so we can go ahead + and update the LRU */ + k5_update_LRU(nc->identities[0]); + } + + } else if (nc->result == KHUI_NC_RESULT_PROCESS && + g_fjob.state == FIBER_STATE_NONE) { + khm_handle csp_idcfg = NULL; + krb5_context ctx = NULL; + + _reportf(L"Tickets successfully acquired"); + + r = KHUI_NC_RESPONSE_SUCCESS | + KHUI_NC_RESPONSE_EXIT; + + /* if we successfully obtained credentials, we + should save the current settings in the + identity config space */ + + assert(nc->n_identities > 0); + assert(nc->identities[0]); + + if (KHM_SUCCEEDED + (k5_open_config_handle(nc->identities[0], + KHM_FLAG_CREATE | + KCONF_FLAG_WRITEIFMOD, + &csp_idcfg))) { + k5_write_dlg_params(csp_idcfg, d); + } + + if(csp_idcfg != NULL) + khc_close_space(csp_idcfg); + + /* We should also quickly refresh the credentials + so that the identity flags and ccache + properties reflect the current state of + affairs. This has to be done here so that + other credentials providers which depend on + Krb5 can properly find the initial creds to + obtain their respective creds. */ + + khm_krb5_list_tickets(&ctx); + + if (nc->set_default) { + _reportf(L"Setting default identity"); + kcdb_identity_set_default(nc->identities[0]); + } + + /* If there is no default identity, then make this the default */ + kcdb_identity_refresh(nc->identities[0]); + { + khm_handle tdefault = NULL; + + if (KHM_SUCCEEDED(kcdb_identity_get_default(&tdefault))) { + kcdb_identity_release(tdefault); + } else { + _reportf(L"There was no default identity. Setting default"); + kcdb_identity_set_default(nc->identities[0]); + } + } + + /* and update the LRU */ + k5_update_LRU(nc->identities[0]); + + if (ctx != NULL) + pkrb5_free_context(ctx); + } else if (g_fjob.state == FIBER_STATE_NONE) { + /* the user cancelled the operation */ + r = KHUI_NC_RESPONSE_EXIT | + KHUI_NC_RESPONSE_SUCCESS; + } + + if(g_fjob.state == FIBER_STATE_NONE) { + khui_cw_set_response(nc, credtype_id_krb5, r); + + if (r & KHUI_NC_RESPONSE_NOEXIT) { + /* if we are retrying the call, we should + restart the kinit fiber */ +#ifdef DEBUG + assert(r & KHUI_NC_RESPONSE_PENDING); +#endif + + k5_prep_kinit_job(nc); + SwitchToFiber(k5_kinit_fiber); + } else { + /* free up the fiber data fields. */ + k5_free_kinit_job(); + } + } else { + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_NOEXIT | + KHUI_NC_RESPONSE_PENDING | r); + } + + _end_task(); + } else if (nc->subtype == KMSG_CRED_RENEW_CREDS) { + + FILETIME ftidexp = {0,0}; + FILETIME ftcurrent; + khm_size cb; + + GetSystemTimeAsFileTime(&ftcurrent); + + _begin_task(0); + _report_mr0(KHERR_NONE, MSG_CTX_RENEW_CREDS); + _describe(); + + if (nc->ctx.scope == KHUI_SCOPE_IDENT || + (nc->ctx.scope == KHUI_SCOPE_CREDTYPE && + nc->ctx.cred_type == credtype_id_krb5) || + (nc->ctx.scope == KHUI_SCOPE_CRED && + nc->ctx.cred_type == credtype_id_krb5)) { + int code; + + if (nc->ctx.scope == KHUI_SCOPE_CRED && + nc->ctx.cred != NULL) { + + /* get the expiration time for the identity first. */ + cb = sizeof(ftidexp); +#ifdef DEBUG + assert(nc->ctx.identity != NULL); +#endif + kcdb_identity_get_attr(nc->ctx.identity, + KCDB_ATTR_EXPIRE, + NULL, + &ftidexp, + &cb); + + code = khm_krb5_renew_cred(nc->ctx.cred); + + } else if (nc->ctx.scope == KHUI_SCOPE_IDENT && + nc->ctx.identity != 0) { + /* get the current identity expiration time */ + cb = sizeof(ftidexp); + + kcdb_identity_get_attr(nc->ctx.identity, + KCDB_ATTR_EXPIRE, + NULL, + &ftidexp, + &cb); + + code = khm_krb5_renew_ident(nc->ctx.identity); + } else { + + _reportf(L"No identity specified. Can't renew Kerberos tickets"); + + code = 1; /* it just has to be non-zero */ + } + + if (code == 0) { + _reportf(L"Tickets successfully renewed"); + + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_EXIT | + KHUI_NC_RESPONSE_SUCCESS); + } else if (nc->ctx.identity == 0) { + + _report_mr0(KHERR_ERROR, MSG_ERR_NO_IDENTITY); + + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_EXIT | + KHUI_NC_RESPONSE_FAILED); + } else if (CompareFileTime(&ftcurrent, &ftidexp) < 0) { + wchar_t tbuf[1024]; + DWORD suggestion; + kherr_suggestion sug_id; + + /* if we failed to get new tickets, but the + identity isstill valid, then we assume that + the current tickets are still good enough + for other credential types to obtain their + credentials. */ + + khm_err_describe(code, tbuf, sizeof(tbuf), + &suggestion, &sug_id); + + _report_cs0(KHERR_WARNING, tbuf); + if (suggestion) + _suggest_mr(suggestion, sug_id); + + _resolve(); + + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_EXIT | + KHUI_NC_RESPONSE_SUCCESS); + } else { + wchar_t tbuf[1024]; + DWORD suggestion; + kherr_suggestion sug_id; + + khm_err_describe(code, tbuf, sizeof(tbuf), + &suggestion, &sug_id); + + _report_cs0(KHERR_ERROR, tbuf); + if (suggestion) + _suggest_mr(suggestion, sug_id); + + _resolve(); + + khui_cw_set_response(nc, credtype_id_krb5, + ((sug_id == KHERR_SUGGEST_RETRY)?KHUI_NC_RESPONSE_NOEXIT:KHUI_NC_RESPONSE_EXIT) | + KHUI_NC_RESPONSE_FAILED); + } + } else { + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_EXIT | + KHUI_NC_RESPONSE_SUCCESS); + } + + _end_task(); + } else if (nc->subtype == KMSG_CRED_PASSWORD && + nc->result == KHUI_NC_RESULT_PROCESS) { + + _begin_task(0); + _report_mr0(KHERR_NONE, MSG_CTX_PASSWD); + _describe(); + + khui_cw_lock_nc(nc); + + if (nc->n_identities == 0 || + nc->identities[0] == NULL) { + _report_mr0(KHERR_ERROR, MSG_PWD_NO_IDENTITY); + _suggest_mr(MSG_PWD_S_NO_IDENTITY, KHERR_SUGGEST_RETRY); + + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_FAILED | + KHUI_NC_RESPONSE_NOEXIT); + } else { + wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; + char idname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t wpwd[KHUI_MAXCCH_PASSWORD]; + char pwd[KHUI_MAXCCH_PASSWORD]; + wchar_t wnpwd[KHUI_MAXCCH_PASSWORD]; + char npwd[KHUI_MAXCCH_PASSWORD]; + wchar_t wnpwd2[KHUI_MAXCCH_PASSWORD]; + wchar_t * wresult; + char * result; + khm_size n_prompts = 0; + khm_size cb; + khm_int32 rv = KHM_ERROR_SUCCESS; + long code = 0; + khm_handle ident; + + khui_cw_get_prompt_count(nc, &n_prompts); + assert(n_prompts == 3); + + ident = nc->identities[0]; + cb = sizeof(widname); + rv = kcdb_identity_get_name(ident, widname, &cb); + if (KHM_FAILED(rv)) { +#ifdef DEBUG + assert(FALSE); +#endif + _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); + goto _pwd_exit; + } + + cb = sizeof(wpwd); + rv = khui_cw_get_prompt_value(nc, 0, wpwd, &cb); + if (KHM_FAILED(rv)) { +#ifdef DEBUG + assert(FALSE); +#endif + _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); + goto _pwd_exit; + } + + cb = sizeof(wnpwd); + rv = khui_cw_get_prompt_value(nc, 1, wnpwd, &cb); + if (KHM_FAILED(rv)) { +#ifdef DEBUG + assert(FALSE); +#endif + _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); + goto _pwd_exit; + } + + cb = sizeof(wnpwd2); + rv = khui_cw_get_prompt_value(nc, 2, wnpwd2, &cb); + if (KHM_FAILED(rv)) { +#ifdef DEBUG + assert(FALSE); +#endif + _report_mr0(KHERR_ERROR, MSG_PWD_UNKNOWN); + goto _pwd_exit; + } + + if (wcscmp(wnpwd, wnpwd2)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr0(KHERR_ERROR, MSG_PWD_NOT_SAME); + _suggest_mr(MSG_PWD_S_NOT_SAME, KHERR_SUGGEST_INTERACT); + goto _pwd_exit; + } + + if (!wcscmp(wpwd, wnpwd)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr0(KHERR_ERROR, MSG_PWD_SAME); + _suggest_mr(MSG_PWD_S_SAME, KHERR_SUGGEST_INTERACT); + goto _pwd_exit; + } + + UnicodeStrToAnsi(idname, sizeof(idname), widname); + UnicodeStrToAnsi(pwd, sizeof(pwd), wpwd); + UnicodeStrToAnsi(npwd, sizeof(npwd), wnpwd); + + result = NULL; + + code = khm_krb5_changepwd(idname, + pwd, + npwd, + &result); + + if (code) + rv = KHM_ERROR_UNKNOWN; + + /* result is only set when code != 0 */ + if (code && result) { + size_t len; + + StringCchLengthA(result, KHERR_MAXCCH_STRING, + &len); + wresult = PMALLOC((len + 1) * sizeof(wchar_t)); +#ifdef DEBUG + assert(wresult); +#endif + AnsiStrToUnicode(wresult, (len + 1) * sizeof(wchar_t), + result); + + _report_cs1(KHERR_ERROR, L"%1!s!", _cstr(wresult)); + _resolve(); + + PFREE(result); + PFREE(wresult); + + /* leave wresult. It will get freed when the + reported event is freed. */ + + /* we don't need to report anything more */ + code = 0; + } + + _pwd_exit: + if (KHM_FAILED(rv)) { + if (code) { + wchar_t tbuf[1024]; + DWORD suggestion; + kherr_suggestion sug_id; + + khm_err_describe(code, tbuf, sizeof(tbuf), + &suggestion, &sug_id); + _report_cs0(KHERR_ERROR, tbuf); + + if (suggestion) + _suggest_mr(suggestion, sug_id); + + _resolve(); + } + + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_NOEXIT| + KHUI_NC_RESPONSE_FAILED); + } else { + khui_cw_set_response(nc, credtype_id_krb5, + KHUI_NC_RESPONSE_SUCCESS | + KHUI_NC_RESPONSE_EXIT); + } + } + + khui_cw_unlock_nc(nc); + + _end_task(); + } /* KMSG_CRED_PASSWORD */ + } + break; + + case KMSG_CRED_END: + { + khui_new_creds * nc; + khui_new_creds_by_type * nct; + + nc = (khui_new_creds *) vparam; + khui_cw_find_type(nc, credtype_id_krb5, &nct); + + if(!nct) + break; + + khui_cw_del_type(nc, credtype_id_krb5); + + if (nct->name) + PFREE(nct->name); + if (nct->credtext) + PFREE(nct->credtext); + + PFREE(nct); + } + break; + + case KMSG_CRED_IMPORT: + { + khm_int32 t = 0; + +#ifdef DEBUG + assert(csp_params); +#endif + khc_read_int32(csp_params, L"MsLsaImport", &t); + + if (t == 1) + khm_krb5_ms2mit(TRUE); + } + break; + } + + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/krb5funcs.c +++ krb5-1.4.4/src/windows/identity/plugins/krb5/krb5funcs.c @@ -1,2157 +1,2157 @@ -/* -* Copyright (c) 2005 Massachusetts Institute of Technology -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, -* modify, merge, publish, distribute, sublicense, and/or sell copies -* of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -/* $Id$ */ - -/* Originally this was krb5routines.c in Leash sources. Subsequently -modified and adapted for NetIDMgr */ - -#include -#include - -#define SECURITY_WIN32 -#include -#include - -#include -#include -#include -#include - -long -khm_convert524(krb5_context alt_ctx) -{ - krb5_context ctx = 0; - krb5_error_code code = 0; - int icode = 0; - krb5_principal me = 0; - krb5_principal server = 0; - krb5_creds *v5creds = 0; - krb5_creds increds; - krb5_ccache cc = 0; - CREDENTIALS * v4creds = NULL; - static int init_ets = 1; - - if (!pkrb5_init_context || - !pkrb_in_tkt || - !pkrb524_init_ets || - !pkrb524_convert_creds_kdc) - return 0; - - v4creds = (CREDENTIALS *) PMALLOC(sizeof(CREDENTIALS)); - memset((char *) v4creds, 0, sizeof(CREDENTIALS)); - - memset((char *) &increds, 0, sizeof(increds)); - /* - From this point on, we can goto cleanup because increds is - initialized. - */ - - if (alt_ctx) - { - ctx = alt_ctx; - } - else - { - code = pkrb5_init_context(&ctx); - if (code) goto cleanup; - } - - code = pkrb5_cc_default(ctx, &cc); - if (code) goto cleanup; - - if ( init_ets ) { - pkrb524_init_ets(ctx); - init_ets = 0; - } - - if (code = pkrb5_cc_get_principal(ctx, cc, &me)) - goto cleanup; - - if ((code = pkrb5_build_principal(ctx, - &server, - krb5_princ_realm(ctx, me)->length, - krb5_princ_realm(ctx, me)->data, - "krbtgt", - krb5_princ_realm(ctx, me)->data, - NULL))) - { - goto cleanup; - } - - increds.client = me; - increds.server = server; - increds.times.endtime = 0; - increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC; - if ((code = pkrb5_get_credentials(ctx, 0, - cc, - &increds, - &v5creds))) - { - goto cleanup; - } - - if ((icode = pkrb524_convert_creds_kdc(ctx, - v5creds, - v4creds))) - { - goto cleanup; - } - - /* initialize ticket cache */ - if ((icode = pkrb_in_tkt(v4creds->pname, v4creds->pinst, v4creds->realm) - != KSUCCESS)) - { - goto cleanup; - } - /* stash ticket, session key, etc. for future use */ - if ((icode = pkrb_save_credentials(v4creds->service, - v4creds->instance, - v4creds->realm, - v4creds->session, - v4creds->lifetime, - v4creds->kvno, - &(v4creds->ticket_st), - v4creds->issue_date))) - { - goto cleanup; - } - -cleanup: - memset(v4creds, 0, sizeof(v4creds)); - PFREE(v4creds); - - if (v5creds) { - pkrb5_free_creds(ctx, v5creds); - } - if (increds.client == me) - me = 0; - if (increds.server == server) - server = 0; - pkrb5_free_cred_contents(ctx, &increds); - if (server) { - pkrb5_free_principal(ctx, server); - } - if (me) { - pkrb5_free_principal(ctx, me); - } - pkrb5_cc_close(ctx, cc); - - if (ctx && (ctx != alt_ctx)) { - pkrb5_free_context(ctx); - } - return !(code || icode); -} - -#ifdef DEPRECATED_REMOVABLE -int com_addr(void) -{ - long ipAddr; - char loc_addr[ADDR_SZ]; - CREDENTIALS cred; - char service[40]; - char instance[40]; - // char addr[40]; - char realm[40]; - struct in_addr LocAddr; - int k_errno; - - if (pkrb_get_cred == NULL) - return(KSUCCESS); - - k_errno = (*pkrb_get_cred)(service,instance,realm,&cred); - if (k_errno) - return KRBERR(k_errno); - - while(1) { - ipAddr = (*pLocalHostAddr)(); - LocAddr.s_addr = ipAddr; - StringCbCopyA(loc_addr, sizeof(loc_addr), inet_ntoa(LocAddr)); - if ( strcmp(cred.address, loc_addr) != 0) { - /* TODO: do something about this */ - //Leash_kdestroy (); - break; - } - break; - } // while() - return 0; -} -#endif - -#ifndef ENCTYPE_LOCAL_RC4_MD4 -#define ENCTYPE_LOCAL_RC4_MD4 0xFFFFFF80 -#endif - -#define MAX_ADDRS 256 - -static long get_tickets_from_cache(krb5_context ctx, - krb5_ccache cache) -{ - krb5_error_code code; - krb5_principal KRBv5Principal; - krb5_flags flags = 0; - krb5_cc_cursor KRBv5Cursor; - krb5_creds KRBv5Credentials; - krb5_ticket *tkt=NULL; - char *ClientName; - char *PrincipalName; - wchar_t wbuf[256]; /* temporary conversion buffer */ - wchar_t wcc_name[KRB5_MAXCCH_CCNAME]; /* credential cache name */ - char *sServerName; - khm_handle ident = NULL; - khm_handle cred = NULL; - time_t tt; - FILETIME ft, eft; - khm_int32 ti; - -#ifdef KRB5_TC_NOTICKET - flags = KRB5_TC_NOTICKET; -#else - flags = 0; -#endif - - { - const char * cc_name; - const char * cc_type; - - cc_name = (*pkrb5_cc_get_name)(ctx, cache); - if(cc_name) { - cc_type = (*pkrb5_cc_get_type)(ctx, cache); - if (cc_type) { - StringCbPrintf(wcc_name, sizeof(wcc_name), L"%S:%S", cc_type, cc_name); - } else { - AnsiStrToUnicode(wcc_name, sizeof(wcc_name), cc_name); - khm_krb5_canon_cc_name(wcc_name, sizeof(wcc_name)); - } - } else { - cc_type = (*pkrb5_cc_get_type)(ctx, cache); - if (cc_type) { - StringCbPrintf(wcc_name, sizeof(wcc_name), L"%S:", cc_type); - } else { -#ifdef DEBUG - assert(FALSE); -#endif - StringCbCopy(wcc_name, sizeof(wcc_name), L""); - } - } - } - - if ((code = (*pkrb5_cc_set_flags)(ctx, cache, flags))) - { - if (code != KRB5_FCC_NOFILE && code != KRB5_CC_NOTFOUND) - khm_krb5_error(code, "krb5_cc_set_flags()", 0, &ctx, &cache); - - goto _exit; - } - - if ((code = (*pkrb5_cc_get_principal)(ctx, cache, &KRBv5Principal))) - { - if (code != KRB5_FCC_NOFILE && code != KRB5_CC_NOTFOUND) - khm_krb5_error(code, "krb5_cc_get_principal()", 0, &ctx, &cache); - - goto _exit; - } - - PrincipalName = NULL; - ClientName = NULL; - sServerName = NULL; - if ((code = (*pkrb5_unparse_name)(ctx, KRBv5Principal, - (char **)&PrincipalName))) - { - if (PrincipalName != NULL) - (*pkrb5_free_unparsed_name)(ctx, PrincipalName); - - (*pkrb5_free_principal)(ctx, KRBv5Principal); - - goto _exit; - } - - if (!strcspn(PrincipalName, "@" )) - { - if (PrincipalName != NULL) - (*pkrb5_free_unparsed_name)(ctx, PrincipalName); - - (*pkrb5_free_principal)(ctx, KRBv5Principal); - - goto _exit; - } - - AnsiStrToUnicode(wbuf, sizeof(wbuf), PrincipalName); - if(KHM_FAILED(kcdb_identity_create(wbuf, KCDB_IDENT_FLAG_CREATE, - &ident))) { - /* something bad happened */ - code = 1; - goto _exit; - } - - (*pkrb5_free_principal)(ctx, KRBv5Principal); - - if ((code = (*pkrb5_cc_start_seq_get)(ctx, cache, &KRBv5Cursor))) - { - goto _exit; - } - - memset(&KRBv5Credentials, '\0', sizeof(KRBv5Credentials)); - - ClientName = NULL; - sServerName = NULL; - cred = NULL; - - while (!(code = pkrb5_cc_next_cred(ctx, cache, &KRBv5Cursor, - &KRBv5Credentials))) - { - khm_handle tident = NULL; - khm_int32 cred_flags = 0; - - if(ClientName != NULL) - (*pkrb5_free_unparsed_name)(ctx, ClientName); - if(sServerName != NULL) - (*pkrb5_free_unparsed_name)(ctx, sServerName); - if(cred) - kcdb_cred_release(cred); - - ClientName = NULL; - sServerName = NULL; - cred = NULL; - - if ((*pkrb5_unparse_name)(ctx, KRBv5Credentials.client, &ClientName)) - { - (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); - khm_krb5_error(code, "krb5_free_cred_contents()", 0, &ctx, &cache); - continue; - } - - if ((*pkrb5_unparse_name)(ctx, KRBv5Credentials.server, &sServerName)) - { - (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); - khm_krb5_error(code, "krb5_free_cred_contents()", 0, &ctx, &cache); - continue; - } - - /* if the ClientName differs from PrincipalName for some - reason, we need to create a new identity */ - if(strcmp(ClientName, PrincipalName)) { - AnsiStrToUnicode(wbuf, sizeof(wbuf), ClientName); - if(KHM_FAILED(kcdb_identity_create(wbuf, KCDB_IDENT_FLAG_CREATE, - &tident))) { - (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); - continue; - } - } else { - tident = ident; - } - - AnsiStrToUnicode(wbuf, sizeof(wbuf), sServerName); - if(KHM_FAILED(kcdb_cred_create(wbuf, tident, credtype_id_krb5, - &cred))) { - (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); - continue; - } - - if (!KRBv5Credentials.times.starttime) - KRBv5Credentials.times.starttime = KRBv5Credentials.times.authtime; - - tt = KRBv5Credentials.times.starttime; - TimetToFileTime(tt, &ft); - kcdb_cred_set_attr(cred, KCDB_ATTR_ISSUE, &ft, sizeof(ft)); - - tt = KRBv5Credentials.times.endtime; - TimetToFileTime(tt, &eft); - kcdb_cred_set_attr(cred, KCDB_ATTR_EXPIRE, &eft, sizeof(eft)); - - { - FILETIME ftl; - - ftl = FtSub(&eft, &ft); - kcdb_cred_set_attr(cred, KCDB_ATTR_LIFETIME, &ftl, sizeof(ftl)); - } - - if (KRBv5Credentials.times.renew_till > 0) { - FILETIME ftl; - - tt = KRBv5Credentials.times.renew_till; - TimetToFileTime(tt, &eft); - kcdb_cred_set_attr(cred, KCDB_ATTR_RENEW_EXPIRE, &eft, - sizeof(eft)); - - - ftl = FtSub(&eft, &ft); - kcdb_cred_set_attr(cred, KCDB_ATTR_RENEW_LIFETIME, &ftl, - sizeof(ftl)); - } - - ti = KRBv5Credentials.ticket_flags; - kcdb_cred_set_attr(cred, attr_id_krb5_flags, &ti, sizeof(ti)); - - /* special flags understood by NetIDMgr */ - { - khm_int32 nflags = 0; - - if (ti & TKT_FLG_RENEWABLE) - nflags |= KCDB_CRED_FLAG_RENEWABLE; - if (ti & TKT_FLG_INITIAL) - nflags |= KCDB_CRED_FLAG_INITIAL; - else { - krb5_data * c0, *c1, *r; - - /* these are macros that do not allocate any memory */ - c0 = krb5_princ_component(ctx,KRBv5Credentials.server,0); - c1 = krb5_princ_component(ctx,KRBv5Credentials.server,1); - r = krb5_princ_realm(ctx,KRBv5Credentials.server); - - if ( c0 && c1 && r && c1->length == r->length && - !strncmp(c1->data,r->data,r->length) && - !strncmp("krbtgt",c0->data,c0->length) ) - nflags |= KCDB_CRED_FLAG_INITIAL; - } - - kcdb_cred_set_flags(cred, nflags, KCDB_CRED_FLAGMASK_EXT); - - cred_flags = nflags; - } - - if ( !pkrb5_decode_ticket(&KRBv5Credentials.ticket, &tkt)) { - ti = tkt->enc_part.enctype; - kcdb_cred_set_attr(cred, attr_id_tkt_enctype, &ti, sizeof(ti)); - ti = tkt->enc_part.kvno; - kcdb_cred_set_attr(cred, attr_id_kvno, &ti, sizeof(ti)); - pkrb5_free_ticket(ctx, tkt); - tkt = NULL; - } - - ti = KRBv5Credentials.keyblock.enctype; - kcdb_cred_set_attr(cred, attr_id_key_enctype, &ti, sizeof(ti)); - - kcdb_cred_set_attr(cred, KCDB_ATTR_LOCATION, wcc_name, - KCDB_CBSIZE_AUTO); - - if ( KRBv5Credentials.addresses && KRBv5Credentials.addresses[0] ) { - khm_int32 buffer[1024]; - void * bufp; - khm_size cb; - khm_int32 rv; - - bufp = (void *) buffer; - cb = sizeof(buffer); - - rv = serialize_krb5_addresses(KRBv5Credentials.addresses, - bufp, - &cb); - if (rv == KHM_ERROR_TOO_LONG) { - bufp = PMALLOC(cb); - rv = serialize_krb5_addresses(KRBv5Credentials.addresses, - bufp, - &cb); - } - - if (KHM_SUCCEEDED(rv)) { - kcdb_cred_set_attr(cred, attr_id_addr_list, - bufp, cb); - } - - if (bufp != (void *) buffer) - PFREE(bufp); - } - - if(cred_flags & KCDB_CRED_FLAG_INITIAL) { - FILETIME ft_issue_new; - FILETIME ft_expire_old; - FILETIME ft_expire_new; - khm_size cb; - - /* an initial ticket! If we find one, we generally set - the lifetime, and primary ccache based on this, but - only if this initial cred has a greater lifetime than - the current primary credential. */ - - tt = KRBv5Credentials.times.endtime; - TimetToFileTime(tt, &ft_expire_new); - - tt = KRBv5Credentials.times.starttime; - TimetToFileTime(tt, &ft_issue_new); - - cb = sizeof(ft_expire_old); - if(KHM_FAILED(kcdb_identity_get_attr(tident, - KCDB_ATTR_EXPIRE, - NULL, &ft_expire_old, - &cb)) - || CompareFileTime(&ft_expire_new, &ft_expire_old) > 0) { - - kcdb_identity_set_attr(tident, attr_id_krb5_ccname, - wcc_name, KCDB_CBSIZE_AUTO); - kcdb_identity_set_attr(tident, KCDB_ATTR_EXPIRE, - &ft_expire_new, - sizeof(ft_expire_new)); - kcdb_identity_set_attr(tident, KCDB_ATTR_ISSUE, - &ft_issue_new, - sizeof(ft_issue_new)); - - if (KRBv5Credentials.times.renew_till > 0) { - tt = KRBv5Credentials.times.renew_till; - TimetToFileTime(tt, &ft); - kcdb_identity_set_attr(tident, - KCDB_ATTR_RENEW_EXPIRE, - &ft, sizeof(ft)); - } else { - kcdb_identity_set_attr(tident, - KCDB_ATTR_RENEW_EXPIRE, - NULL, 0); - } - - ti = KRBv5Credentials.ticket_flags; - kcdb_identity_set_attr(tident, attr_id_krb5_flags, - &ti, sizeof(ti)); - } - } - - kcdb_credset_add_cred(krb5_credset, cred, -1); - - (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); - - if(tident != ident) - kcdb_identity_release(tident); - } - - if (PrincipalName != NULL) - (*pkrb5_free_unparsed_name)(ctx, PrincipalName); - - if (ClientName != NULL) - (*pkrb5_free_unparsed_name)(ctx, ClientName); - - if (sServerName != NULL) - (*pkrb5_free_unparsed_name)(ctx, sServerName); - - if (cred) - kcdb_cred_release(cred); - - if ((code == KRB5_CC_END) || (code == KRB5_CC_NOTFOUND)) - { - if ((code = pkrb5_cc_end_seq_get(ctx, cache, &KRBv5Cursor))) - { - goto _exit; - } - - flags = KRB5_TC_OPENCLOSE; -#ifdef KRB5_TC_NOTICKET - flags |= KRB5_TC_NOTICKET; -#endif - if ((code = pkrb5_cc_set_flags(ctx, cache, flags))) - { - goto _exit; - } - } - else - { - goto _exit; - } - -_exit: - - return code; -} - -long -khm_krb5_list_tickets(krb5_context *krbv5Context) -{ - krb5_context ctx = NULL; - krb5_ccache cache = 0; - krb5_error_code code = 0; - apiCB * cc_ctx = 0; - struct _infoNC ** pNCi = NULL; - int i; - khm_int32 t; - wchar_t * ms = NULL; - khm_size cb; - - kcdb_credset_flush(krb5_credset); - - if((*krbv5Context == 0) && (code = (*pkrb5_init_context)(krbv5Context))) { - goto _exit; - } - - ctx = (*krbv5Context); - - if (!pcc_initialize || - !pcc_get_NC_info || - !pcc_free_NC_info || - !pcc_shutdown) - goto _skip_cc_iter; - - code = pcc_initialize(&cc_ctx, CC_API_VER_2, NULL, NULL); - if (code) - goto _exit; - - code = pcc_get_NC_info(cc_ctx, &pNCi); - if (code) - goto _exit; - - for(i=0; pNCi[i]; i++) { - char ccname[KRB5_MAXCCH_CCNAME]; - - if (pNCi[i]->vers != CC_CRED_V5) - continue; - - if (FAILED(StringCchPrintfA(ccname, sizeof(ccname), "API:%s", - pNCi[i]->name))) - continue; - - code = (*pkrb5_cc_resolve)(ctx, ccname, &cache); - - if (code) - continue; - - code = get_tickets_from_cache(ctx, cache); - - if(ctx != NULL && cache != NULL) - (*pkrb5_cc_close)(ctx, cache); - - cache = 0; - } - - _skip_cc_iter: - - if (KHM_SUCCEEDED(khc_read_int32(csp_params, L"MsLsaList", &t)) && t) { - code = (*pkrb5_cc_resolve)(ctx, "MSLSA:", &cache); - - if (code == 0 && cache) { - code = get_tickets_from_cache(ctx, cache); - } - - if (ctx != NULL && cache != NULL) - (*pkrb5_cc_close)(ctx, cache); - cache = 0; - } - - if (khc_read_multi_string(csp_params, L"FileCCList", NULL, &cb) - == KHM_ERROR_TOO_LONG && - cb > sizeof(wchar_t) * 2) { - wchar_t * t; - char ccname[MAX_PATH + 6]; - - ms = PMALLOC(cb); -#ifdef DEBUG - assert(ms); -#endif - khc_read_multi_string(csp_params, L"FileCCList", ms, &cb); - - for(t = ms; t && *t; t = multi_string_next(t)) { - StringCchPrintfA(ccname, ARRAYLENGTH(ccname), - "FILE:%S", t); - - code = (*pkrb5_cc_resolve)(ctx, ccname, &cache); - - if (code) - continue; - - code = get_tickets_from_cache(ctx, cache); - - if (ctx != NULL && cache != NULL) - (*pkrb5_cc_close)(ctx, cache); - cache = 0; - } - - PFREE(ms); - } - -_exit: - if (pNCi) - (*pcc_free_NC_info)(cc_ctx, &pNCi); - if (cc_ctx) - (*pcc_shutdown)(&cc_ctx); - - kcdb_credset_collect(NULL, krb5_credset, NULL, credtype_id_krb5, NULL); - - return(code); -} - -int -khm_krb5_renew_cred(khm_handle cred) -{ - khm_handle identity = NULL; - krb5_error_code code = 0; - krb5_context ctx = 0; - krb5_ccache cc = 0; - - if (cred == NULL) { -#ifdef DEBUG - assert(FALSE); -#endif - goto _cleanup; - } - - if (KHM_FAILED(kcdb_cred_get_identity(cred, &identity))) { -#ifdef DEBUG - assert(FALSE); -#endif - goto _cleanup; - } - - code = khm_krb5_initialize(identity, &ctx, &cc); - if (code) - goto _cleanup; - - /* TODO: going here */ - - _cleanup: - - if (identity) - kcdb_identity_release(identity); - - if (cc && ctx) - pkrb5_cc_close(ctx, cc); - - if (ctx) - pkrb5_free_context(ctx); - - return code; -} - -int -khm_krb5_renew_ident(khm_handle identity) -{ - krb5_error_code code = 0; - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_principal me = 0; - krb5_principal server = 0; - krb5_creds my_creds; - krb5_data *realm = 0; - - memset(&my_creds, 0, sizeof(krb5_creds)); - - if ( !pkrb5_init_context ) - goto cleanup; - - code = khm_krb5_initialize(identity, &ctx, &cc); - if (code) - goto cleanup; - - code = pkrb5_cc_get_principal(ctx, cc, &me); - if (code) - goto cleanup; - - realm = krb5_princ_realm(ctx, me); - - code = pkrb5_build_principal_ext(ctx, &server, - realm->length,realm->data, - KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME, - realm->length,realm->data, - 0); - - if (code) - goto cleanup; - - my_creds.client = me; - my_creds.server = server; - -#ifdef KRB5_TC_NOTICKET - pkrb5_cc_set_flags(ctx, cc, 0); -#endif - code = pkrb5_get_renewed_creds(ctx, &my_creds, me, cc, NULL); -#ifdef KRB5_TC_NOTICKET - pkrb5_cc_set_flags(ctx, cc, KRB5_TC_NOTICKET); -#endif - if (code) { - if ( code != KRB5KDC_ERR_ETYPE_NOSUPP || - code != KRB5_KDC_UNREACH) - khm_krb5_error(code, "krb5_get_renewed_creds()", 0, &ctx, &cc); - goto cleanup; - } - - code = pkrb5_cc_initialize(ctx, cc, me); - if (code) goto cleanup; - - code = pkrb5_cc_store_cred(ctx, cc, &my_creds); - if (code) goto cleanup; - -cleanup: - if (my_creds.client == me) - my_creds.client = 0; - if (my_creds.server == server) - my_creds.server = 0; - - pkrb5_free_cred_contents(ctx, &my_creds); - - if (me) - pkrb5_free_principal(ctx, me); - if (server) - pkrb5_free_principal(ctx, server); - if (cc) - pkrb5_cc_close(ctx, cc); - if (ctx) - pkrb5_free_context(ctx); - return(code); -} - -int -khm_krb5_kinit(krb5_context alt_ctx, - char * principal_name, - char * password, - char * ccache, - krb5_deltat lifetime, - DWORD forwardable, - DWORD proxiable, - krb5_deltat renew_life, - DWORD addressless, - DWORD publicIP, - krb5_prompter_fct prompter, - void * p_data) -{ - krb5_error_code code = 0; - krb5_context ctx = 0; - krb5_ccache cc = 0; - krb5_principal me = 0; - char* name = 0; - krb5_creds my_creds; - krb5_get_init_creds_opt options; - krb5_address ** addrs = NULL; - int i = 0, addr_count = 0; - - if (!pkrb5_init_context) - return 0; - - _reportf(L"In khm_krb5_kinit"); - - pkrb5_get_init_creds_opt_init(&options); - memset(&my_creds, 0, sizeof(my_creds)); - - if (alt_ctx) { - ctx = alt_ctx; - } else { - code = pkrb5_init_context(&ctx); - if (code) - goto cleanup; - } - - if (ccache) { - _reportf(L"Using supplied ccache name %S", ccache); - code = pkrb5_cc_resolve(ctx, ccache, &cc); - } else { - khm_handle identity = NULL; - khm_handle csp_ident = NULL; - khm_handle csp_k5 = NULL; - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t wccname[MAX_PATH]; - char ccname[MAX_PATH]; - char * pccname = principal_name; - khm_size cb; - - idname[0] = L'\0'; - AnsiStrToUnicode(idname, sizeof(idname), principal_name); - - cb = sizeof(wccname); - - if (KHM_SUCCEEDED(kcdb_identity_create(idname, 0, &identity)) && - - KHM_SUCCEEDED(kcdb_identity_get_config(identity, 0, &csp_ident)) && - - KHM_SUCCEEDED(khc_open_space(csp_ident, CSNAME_KRB5CRED, 0, - &csp_k5)) && - - KHM_SUCCEEDED(khc_read_string(csp_k5, L"DefaultCCName", - wccname, &cb)) && - - cb > sizeof(wchar_t)) { - - _reportf(L"Using DefaultCCName [%s] from identity", wccname); - - UnicodeStrToAnsi(ccname, sizeof(ccname), wccname); - pccname = ccname; - } - - if (csp_k5) - khc_close_space(csp_k5); - if (csp_ident) - khc_close_space(csp_ident); - if (identity) - kcdb_identity_release(identity); - - code = pkrb5_cc_resolve(ctx, pccname, &cc); - } - - _reportf(L"krb5_cc_resolve returns code %d", code); - - if (code) goto cleanup; - - code = pkrb5_parse_name(ctx, principal_name, &me); - if (code) goto cleanup; - - code = pkrb5_unparse_name(ctx, me, &name); - if (code) goto cleanup; - - if (lifetime == 0) { - khc_read_int32(csp_params, L"DefaultLifetime", &lifetime); - } - - if (lifetime) - pkrb5_get_init_creds_opt_set_tkt_life(&options, lifetime); - - pkrb5_get_init_creds_opt_set_forwardable(&options, - forwardable ? 1 : 0); - pkrb5_get_init_creds_opt_set_proxiable(&options, - proxiable ? 1 : 0); - pkrb5_get_init_creds_opt_set_renew_life(&options, - renew_life); - - if (addressless) - pkrb5_get_init_creds_opt_set_address_list(&options,NULL); - else { - krb5_address ** local_addrs=NULL; - DWORD netIPAddr; - - pkrb5_os_localaddr(ctx, &local_addrs); - i = 0; - while ( local_addrs[i++] ); - addr_count = i + 1; - - addrs = (krb5_address **) PMALLOC((addr_count+1) * sizeof(krb5_address *)); - if ( !addrs ) { - pkrb5_free_addresses(ctx, local_addrs); - assert(0); - } - memset(addrs, 0, sizeof(krb5_address *) * (addr_count+1)); - i = 0; - while ( local_addrs[i] ) { - addrs[i] = (krb5_address *)PMALLOC(sizeof(krb5_address)); - if (addrs[i] == NULL) { - pkrb5_free_addresses(ctx, local_addrs); - assert(0); - } - - addrs[i]->magic = local_addrs[i]->magic; - addrs[i]->addrtype = local_addrs[i]->addrtype; - addrs[i]->length = local_addrs[i]->length; - addrs[i]->contents = (unsigned char *)PMALLOC(addrs[i]->length); - if (!addrs[i]->contents) { - pkrb5_free_addresses(ctx, local_addrs); - assert(0); - } - - memcpy(addrs[i]->contents,local_addrs[i]->contents, - local_addrs[i]->length); /* safe */ - i++; - } - pkrb5_free_addresses(ctx, local_addrs); - - if (publicIP) { - // we are going to add the public IP address specified by the user - // to the list provided by the operating system - addrs[i] = (krb5_address *)PMALLOC(sizeof(krb5_address)); - if (addrs[i] == NULL) - assert(0); - - addrs[i]->magic = KV5M_ADDRESS; - addrs[i]->addrtype = AF_INET; - addrs[i]->length = 4; - addrs[i]->contents = (unsigned char *)PMALLOC(addrs[i]->length); - if (!addrs[i]->contents) - assert(0); - - netIPAddr = htonl(publicIP); - memcpy(addrs[i]->contents,&netIPAddr,4); - } - - pkrb5_get_init_creds_opt_set_address_list(&options,addrs); - } - - code = - pkrb5_get_init_creds_password(ctx, - &my_creds, - me, - password, // password - prompter, // prompter - p_data, // prompter data - 0, // start time - 0, // service name - &options); - _reportf(L"krb5_get_init_creds_password returns code %d", code); - - if (code) goto cleanup; - - code = pkrb5_cc_initialize(ctx, cc, me); - _reportf(L"krb5_cc_initialize returns code %d", code); - if (code) goto cleanup; - - code = pkrb5_cc_store_cred(ctx, cc, &my_creds); - _reportf(L"krb5_cc_store_cred returns code %d", code); - if (code) goto cleanup; - -cleanup: - if ( addrs ) { - for ( i=0;icontents ) - PFREE(addrs[i]->contents); - PFREE(addrs[i]); - } - } - } - if (my_creds.client == me) - my_creds.client = 0; - pkrb5_free_cred_contents(ctx, &my_creds); - if (name) - pkrb5_free_unparsed_name(ctx, name); - if (me) - pkrb5_free_principal(ctx, me); - if (cc) - pkrb5_cc_close(ctx, cc); - if (ctx && (ctx != alt_ctx)) - pkrb5_free_context(ctx); - return(code); -} - -long -khm_krb5_copy_ccache_by_name(krb5_context in_ctx, - wchar_t * wscc_dest, - wchar_t * wscc_src) { - krb5_context ctx = NULL; - krb5_error_code code = 0; - khm_boolean free_ctx; - krb5_ccache cc_src = NULL; - krb5_ccache cc_dest = NULL; - krb5_principal princ_src = NULL; - char scc_dest[KRB5_MAXCCH_CCNAME]; - char scc_src[KRB5_MAXCCH_CCNAME]; - int t; - - t = UnicodeStrToAnsi(scc_dest, sizeof(scc_dest), wscc_dest); - if (t == 0) - return KHM_ERROR_TOO_LONG; - t = UnicodeStrToAnsi(scc_src, sizeof(scc_src), wscc_src); - if (t == 0) - return KHM_ERROR_TOO_LONG; - - if (in_ctx) { - ctx = in_ctx; - free_ctx = FALSE; - } else { - code = pkrb5_init_context(&ctx); - if (code) { - if (ctx) - pkrb5_free_context(ctx); - return code; - } - free_ctx = TRUE; - } - - code = pkrb5_cc_resolve(ctx, scc_dest, &cc_dest); - if (code) - goto _cleanup; - - code = pkrb5_cc_resolve(ctx, scc_src, &cc_src); - if (code) - goto _cleanup; - - code = pkrb5_cc_get_principal(ctx, cc_src, &princ_src); - if (code) - goto _cleanup; - - code = pkrb5_cc_initialize(ctx, cc_dest, princ_src); - if (code) - goto _cleanup; - - code = pkrb5_cc_copy_creds(ctx, cc_src, cc_dest); - - _cleanup: - if (princ_src) - pkrb5_free_principal(ctx, princ_src); - - if (cc_dest) - pkrb5_cc_close(ctx, cc_dest); - - if (cc_src) - pkrb5_cc_close(ctx, cc_src); - - if (free_ctx && ctx) - pkrb5_free_context(ctx); - - return code; -} - -long -khm_krb5_canon_cc_name(wchar_t * wcc_name, - size_t cb_cc_name) { - size_t cb_len; - wchar_t * colon; - - if (FAILED(StringCbLength(wcc_name, - cb_cc_name, - &cb_len))) { -#ifdef DEBUG - assert(FALSE); -#else - return KHM_ERROR_TOO_LONG; -#endif - } - - cb_len += sizeof(wchar_t); - - colon = wcschr(wcc_name, L':'); - - if (colon) { - /* if the colon is just 1 character away from the beginning, - it's a FILE: cc */ - if (colon - wcc_name == 1) { - if (cb_len + 5 * sizeof(wchar_t) > cb_cc_name) - return KHM_ERROR_TOO_LONG; - - memmove(&wcc_name[5], &wcc_name[0], cb_len); - memmove(&wcc_name[0], L"FILE:", sizeof(wchar_t) * 5); - } - - return 0; - } - - if (cb_len + 4 * sizeof(wchar_t) > cb_cc_name) - return KHM_ERROR_TOO_LONG; - - memmove(&wcc_name[4], &wcc_name[0], cb_len); - memmove(&wcc_name[0], L"API:", sizeof(wchar_t) * 4); - - return 0; -} - -int -khm_krb5_cc_name_cmp(const wchar_t * cc_name_1, - const wchar_t * cc_name_2) { - if (!wcsncmp(cc_name_1, L"API:", 4)) - cc_name_1 += 4; - - if (!wcsncmp(cc_name_2, L"API:", 4)) - cc_name_2 += 4; - - return wcscmp(cc_name_1, cc_name_2); -} - -static khm_int32 KHMAPI -khmint_location_comp_func(khm_handle cred1, - khm_handle cred2, - void * rock) { - return kcdb_creds_comp_attr(cred1, cred2, KCDB_ATTR_LOCATION); -} - -struct khmint_location_check { - khm_handle credset; - khm_handle cred; - wchar_t * ccname; - khm_boolean success; -}; - -static khm_int32 KHMAPI -khmint_find_matching_cred_func(khm_handle cred, - void * rock) { - struct khmint_location_check * lc; - - lc = (struct khmint_location_check *) rock; - - if (!kcdb_creds_is_equal(cred, lc->cred)) - return KHM_ERROR_SUCCESS; - if (kcdb_creds_comp_attr(cred, lc->cred, KCDB_ATTR_LOCATION)) - return KHM_ERROR_SUCCESS; - - /* found it */ - lc->success = TRUE; - - /* break the search */ - return !KHM_ERROR_SUCCESS; -} - -static khm_int32 KHMAPI -khmint_location_check_func(khm_handle cred, - void * rock) { - khm_int32 t; - khm_size cb; - wchar_t ccname[KRB5_MAXCCH_CCNAME]; - struct khmint_location_check * lc; - - lc = (struct khmint_location_check *) rock; - - if (KHM_FAILED(kcdb_cred_get_type(cred, &t))) - return KHM_ERROR_SUCCESS; - - if (t != credtype_id_krb5) - return KHM_ERROR_SUCCESS; - - cb = sizeof(ccname); - if (KHM_FAILED(kcdb_cred_get_attr(cred, - KCDB_ATTR_LOCATION, - NULL, - ccname, - &cb))) - return KHM_ERROR_SUCCESS; - - if(wcscmp(ccname, lc->ccname)) - return KHM_ERROR_SUCCESS; - - lc->cred = cred; - - lc->success = FALSE; - - kcdb_credset_apply(lc->credset, - khmint_find_matching_cred_func, - (void *) lc); - - if (!lc->success) - return KHM_ERROR_NOT_FOUND; - else - return KHM_ERROR_SUCCESS; -} - -static khm_int32 KHMAPI -khmint_delete_location_func(khm_handle cred, - void * rock) { - wchar_t cc_cred[KRB5_MAXCCH_CCNAME]; - struct khmint_location_check * lc; - khm_size cb; - - lc = (struct khmint_location_check *) rock; - - cb = sizeof(cc_cred); - - if (KHM_FAILED(kcdb_cred_get_attr(cred, - KCDB_ATTR_LOCATION, - NULL, - cc_cred, - &cb))) - return KHM_ERROR_SUCCESS; - - if (wcscmp(cc_cred, lc->ccname)) - return KHM_ERROR_SUCCESS; - - kcdb_credset_del_cred_ref(lc->credset, - cred); - - return KHM_ERROR_SUCCESS; -} - -int -khm_krb5_destroy_by_credset(khm_handle p_cs) -{ - khm_handle d_cs = NULL; - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_size s, cb; - krb5_context ctx; - krb5_error_code code = 0; - int i; - wchar_t ccname[KRB5_MAXCCH_CCNAME]; - struct khmint_location_check lc; - - rv = kcdb_credset_create(&d_cs); - - assert(KHM_SUCCEEDED(rv) && d_cs != NULL); - - kcdb_credset_extract(d_cs, p_cs, NULL, credtype_id_krb5); - - kcdb_credset_get_size(d_cs, &s); - - if (s == 0) { - _reportf(L"No tickets to delete"); - - kcdb_credset_delete(d_cs); - return 0; - } - - code = pkrb5_init_context(&ctx); - if (code != 0) { - rv = code; - goto _cleanup; - } - - /* we should synchronize the credential lists before we attempt to - make any assumptions on the state of the root credset */ - khm_krb5_list_tickets(&ctx); - - /* so, we need to make a decision about whether to destroy entire - ccaches or just individual credentials. Therefore we first - sort them by ccache. */ - kcdb_credset_sort(d_cs, - khmint_location_comp_func, - NULL); - - /* now, for each ccache we encounter, we check if we have all the - credentials from that ccache in the to-be-deleted list. */ - for (i=0; i < (int) s; i++) { - khm_handle cred; - - if (KHM_FAILED(kcdb_credset_get_cred(d_cs, - i, - &cred))) - continue; - - cb = sizeof(ccname); - rv = kcdb_cred_get_attr(cred, - KCDB_ATTR_LOCATION, - NULL, - ccname, - &cb); - -#ifdef DEBUG - assert(KHM_SUCCEEDED(rv)); -#endif - kcdb_cred_release(cred); - - lc.credset = d_cs; - lc.cred = NULL; - lc.ccname = ccname; - lc.success = FALSE; - - kcdb_credset_apply(NULL, - khmint_location_check_func, - (void *) &lc); - - if (lc.success) { - /* ok the destroy the ccache */ - char a_ccname[KRB5_MAXCCH_CCNAME]; - krb5_ccache cc = NULL; - - _reportf(L"Destroying ccache [%s]", ccname); - - UnicodeStrToAnsi(a_ccname, - sizeof(a_ccname), - ccname); - - code = pkrb5_cc_resolve(ctx, - a_ccname, - &cc); - if (code) - goto _delete_this_set; - - code = pkrb5_cc_destroy(ctx, cc); - - if (code) { - _reportf(L"krb5_cc_destroy returns code %d", code); - } - - _delete_this_set: - - lc.credset = d_cs; - lc.ccname = ccname; - - /* note that although we are deleting credentials off the - credential set, the size of the credential set does not - decrease since we are doing it from inside - kcdb_credset_apply(). The deleted creds will simply be - marked as deleted until kcdb_credset_purge() is - called. */ - - kcdb_credset_apply(d_cs, - khmint_delete_location_func, - (void *) &lc); - } - } - - kcdb_credset_purge(d_cs); - - /* the remainder need to be deleted one by one */ - - kcdb_credset_get_size(d_cs, &s); - - for (i=0; i < (int) s; ) { - khm_handle cred; - char a_ccname[KRB5_MAXCCH_CCNAME]; - char a_srvname[KCDB_CRED_MAXCCH_NAME]; - wchar_t srvname[KCDB_CRED_MAXCCH_NAME]; - krb5_ccache cc; - krb5_creds in_cred, out_cred; - krb5_principal princ; - khm_int32 etype; - - if (KHM_FAILED(kcdb_credset_get_cred(d_cs, - i, - &cred))) { - i++; - continue; - } - - cb = sizeof(ccname); - if (KHM_FAILED(kcdb_cred_get_attr(cred, - KCDB_ATTR_LOCATION, - NULL, - ccname, - &cb))) - goto _done_with_this_cred; - - _reportf(L"Looking at ccache [%s]", ccname); - - UnicodeStrToAnsi(a_ccname, - sizeof(a_ccname), - ccname); - - code = pkrb5_cc_resolve(ctx, - a_ccname, - &cc); - - if (code) - goto _skip_similar; - - code = pkrb5_cc_get_principal(ctx, cc, &princ); - - if (code) { - pkrb5_cc_close(ctx, cc); - goto _skip_similar; - } - - _del_this_cred: - - cb = sizeof(etype); - - if (KHM_FAILED(kcdb_cred_get_attr(cred, - attr_id_key_enctype, - NULL, - &etype, - &cb))) - goto _do_next_cred; - - cb = sizeof(srvname); - if (KHM_FAILED(kcdb_cred_get_name(cred, - srvname, - &cb))) - goto _do_next_cred; - - _reportf(L"Attempting to delete ticket %s", srvname); - - UnicodeStrToAnsi(a_srvname, sizeof(a_srvname), srvname); - - ZeroMemory(&in_cred, sizeof(in_cred)); - - code = pkrb5_parse_name(ctx, a_srvname, &in_cred.server); - if (code) - goto _do_next_cred; - in_cred.client = princ; - in_cred.keyblock.enctype = etype; - - code = pkrb5_cc_retrieve_cred(ctx, - cc, - KRB5_TC_MATCH_SRV_NAMEONLY | - KRB5_TC_SUPPORTED_KTYPES, - &in_cred, - &out_cred); - if (code) - goto _do_next_cred_0; - - code = pkrb5_cc_remove_cred(ctx, cc, - KRB5_TC_MATCH_SRV_NAMEONLY | - KRB5_TC_SUPPORTED_KTYPES | - KRB5_TC_MATCH_AUTHDATA, - &out_cred); - - pkrb5_free_cred_contents(ctx, &out_cred); - _do_next_cred_0: - pkrb5_free_principal(ctx, in_cred.server); - _do_next_cred: - - /* check if the next cred is also of the same ccache */ - kcdb_cred_release(cred); - - for (i++; i < (int) s; i++) { - if (KHM_FAILED(kcdb_credset_get_cred(d_cs, - i, - &cred))) - continue; - } - - if (i < (int) s) { - wchar_t newcc[KRB5_MAXCCH_CCNAME]; - - cb = sizeof(newcc); - if (KHM_FAILED(kcdb_cred_get_attr(cred, - KCDB_ATTR_LOCATION, - NULL, - newcc, - &cb)) || - wcscmp(newcc, ccname)) { - i--; /* we have to look at this again */ - goto _done_with_this_set; - } - goto _del_this_cred; - } - - - _done_with_this_set: - pkrb5_free_principal(ctx, princ); - - pkrb5_cc_close(ctx, cc); - - _done_with_this_cred: - kcdb_cred_release(cred); - i++; - continue; - - _skip_similar: - kcdb_cred_release(cred); - - for (++i; i < (int) s; i++) { - wchar_t newcc[KRB5_MAXCCH_CCNAME]; - - if (KHM_FAILED(kcdb_credset_get_cred(d_cs, - i, - &cred))) - continue; - - cb = sizeof(newcc); - if (KHM_FAILED(kcdb_cred_get_attr(cred, - KCDB_ATTR_LOCATION, - NULL, - &newcc, - &cb))) { - kcdb_cred_release(cred); - continue; - } - - if (wcscmp(newcc, ccname)) { - kcdb_cred_release(cred); - break; - } - } - } - - _cleanup: - - if (d_cs) - kcdb_credset_delete(&d_cs); - - return rv; -} - -int -khm_krb5_destroy_identity(khm_handle identity) -{ - krb5_context ctx; - krb5_ccache cache; - krb5_error_code rc; - - ctx = NULL; - cache = NULL; - - if (rc = khm_krb5_initialize(identity, &ctx, &cache)) - return(rc); - - rc = pkrb5_cc_destroy(ctx, cache); - - if (ctx != NULL) - pkrb5_free_context(ctx); - - return(rc); -} - -static BOOL -GetSecurityLogonSessionData(PSECURITY_LOGON_SESSION_DATA * ppSessionData) -{ - NTSTATUS Status = 0; - HANDLE TokenHandle; - TOKEN_STATISTICS Stats; - DWORD ReqLen; - BOOL Success; - - if (!ppSessionData) - return FALSE; - *ppSessionData = NULL; - - Success = OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &TokenHandle ); - if ( !Success ) - return FALSE; - - Success = GetTokenInformation( TokenHandle, TokenStatistics, &Stats, sizeof(TOKEN_STATISTICS), &ReqLen ); - CloseHandle( TokenHandle ); - if ( !Success ) - return FALSE; - - Status = pLsaGetLogonSessionData( &Stats.AuthenticationId, ppSessionData ); - if ( FAILED(Status) || !ppSessionData ) - return FALSE; - - return TRUE; -} - -// IsKerberosLogon() does not validate whether or not there are valid -// tickets in the cache. It validates whether or not it is reasonable -// to assume that if we attempted to retrieve valid tickets we could -// do so. Microsoft does not automatically renew expired tickets. -// Therefore, the cache could contain expired or invalid tickets. -// Microsoft also caches the user's password and will use it to -// retrieve new TGTs if the cache is empty and tickets are requested. - -static BOOL -IsKerberosLogon(VOID) -{ - PSECURITY_LOGON_SESSION_DATA pSessionData = NULL; - BOOL Success = FALSE; - - if ( GetSecurityLogonSessionData(&pSessionData) ) { - if ( pSessionData->AuthenticationPackage.Buffer ) { - WCHAR buffer[256]; - WCHAR *usBuffer; - int usLength; - - Success = FALSE; - usBuffer = (pSessionData->AuthenticationPackage).Buffer; - usLength = (pSessionData->AuthenticationPackage).Length; - if (usLength < 256) - { - lstrcpynW (buffer, usBuffer, usLength); - StringCbCatW (buffer, sizeof(buffer), L""); - if ( !lstrcmpW(L"Kerberos",buffer) ) - Success = TRUE; - } - } - pLsaFreeReturnBuffer(pSessionData); - } - return Success; -} - - -BOOL -khm_krb5_ms2mit(BOOL save_creds) -{ -#ifdef NO_KRB5 - return(FALSE); -#else /* NO_KRB5 */ - krb5_context kcontext = 0; - krb5_error_code code = 0; - krb5_ccache ccache=0; - krb5_ccache mslsa_ccache=0; - krb5_creds creds; - krb5_cc_cursor cursor=0; - krb5_principal princ = 0; - char *cache_name = NULL; - char *princ_name = NULL; - BOOL rc = FALSE; - - kherr_reportf(L"Begin : khm_krb5_ms2mit. save_cred=%d\n", (int) save_creds); - - if ( !pkrb5_init_context ) - goto cleanup; - - if (code = pkrb5_init_context(&kcontext)) - goto cleanup; - - kherr_reportf(L"Resolving MSLSA\n"); - - if (code = pkrb5_cc_resolve(kcontext, "MSLSA:", &mslsa_ccache)) - goto cleanup; - - if ( save_creds ) { - kherr_reportf(L"Getting principal\n"); - if (code = pkrb5_cc_get_principal(kcontext, mslsa_ccache, &princ)) - goto cleanup; - - kherr_reportf(L"Unparsing name\n"); - if (code = pkrb5_unparse_name(kcontext, princ, &princ_name)) - goto cleanup; - - kherr_reportf(L"Unparsed [%S]. Resolving target cache\n", princ_name); - /* TODO: actually look up the preferred ccache name */ - if (code = pkrb5_cc_resolve(kcontext, princ_name, &ccache)) { - kherr_reportf(L"Cannot resolve cache [%S] with code=%d. Trying default.\n", princ_name, code); - - if (code = pkrb5_cc_default(kcontext, &ccache)) { - kherr_reportf(L"Failed to resolve default ccache. Code=%d", code); - goto cleanup; - } - } - - kherr_reportf(L"Initializing ccache\n"); - if (code = pkrb5_cc_initialize(kcontext, ccache, princ)) - goto cleanup; - - kherr_reportf(L"Copying credentials\n"); - if (code = pkrb5_cc_copy_creds(kcontext, mslsa_ccache, ccache)) - goto cleanup; - - rc = TRUE; - } else { - /* Enumerate tickets from cache looking for an initial ticket */ - if ((code = pkrb5_cc_start_seq_get(kcontext, mslsa_ccache, &cursor))) - goto cleanup; - - while (!(code = pkrb5_cc_next_cred(kcontext, mslsa_ccache, - &cursor, &creds))) { - if ( creds.ticket_flags & TKT_FLG_INITIAL ) { - rc = TRUE; - pkrb5_free_cred_contents(kcontext, &creds); - break; - } - pkrb5_free_cred_contents(kcontext, &creds); - } - pkrb5_cc_end_seq_get(kcontext, mslsa_ccache, &cursor); - } - -cleanup: - kherr_reportf(L" Received code=%d", code); - - if (princ_name) - pkrb5_free_unparsed_name(kcontext, princ_name); - if (princ) - pkrb5_free_principal(kcontext, princ); - if (ccache) - pkrb5_cc_close(kcontext, ccache); - if (mslsa_ccache) - pkrb5_cc_close(kcontext, mslsa_ccache); - if (kcontext) - pkrb5_free_context(kcontext); - return(rc); -#endif /* NO_KRB5 */ -} - -#define KRB_FILE "KRB.CON" -#define KRBREALM_FILE "KRBREALM.CON" -#define KRB5_FILE "KRB5.INI" -#define KRB5_TMP_FILE "KRB5.INI.TMP" - -BOOL -khm_krb5_get_temp_profile_file(LPSTR confname, UINT szConfname) -{ - GetTempPathA(szConfname, confname); - confname[szConfname-1] = '\0'; - StringCchCatA(confname, szConfname, KRB5_TMP_FILE); - confname[szConfname-1] = '\0'; - return FALSE; -} - -BOOL -khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) -{ - char **configFile = NULL; - if (pkrb5_get_default_config_files(&configFile)) - { - GetWindowsDirectoryA(confname,szConfname); - confname[szConfname-1] = '\0'; - - StringCchCatA(confname, szConfname, "\\"); - StringCchCatA(confname, szConfname, KRB5_FILE); - - return FALSE; - } - - *confname = 0; - - if (configFile) - { - StringCchCopyA(confname, szConfname, *configFile); - pkrb5_free_config_files(configFile); - } - - if (!*confname) - { - GetWindowsDirectoryA(confname,szConfname); - confname[szConfname-1] = '\0'; - StringCchCatA(confname, szConfname, "\\"); - StringCchCatA(confname, szConfname, KRB5_FILE); - } - - return FALSE; -} - -BOOL -khm_get_krb4_con_file(LPSTR confname, UINT szConfname) -{ - if (hKrb5 && !hKrb4) { // hold krb.con where krb5.ini is located - CHAR krbConFile[MAX_PATH]=""; - LPSTR pFind; - - //strcpy(krbConFile, CLeashApp::m_krbv5_profile->first_file->filename); - if (khm_krb5_get_profile_file(krbConFile, sizeof(krbConFile))) { - GetWindowsDirectoryA(krbConFile,sizeof(krbConFile)); - krbConFile[MAX_PATH-1] = '\0'; - StringCchCatA(confname, szConfname, "\\"); - } - - pFind = strrchr(krbConFile, '\\'); - if (pFind) { - *pFind = '\0'; - StringCchCatA(krbConFile, ARRAYLENGTH(krbConFile), "\\"); - StringCchCatA(krbConFile, ARRAYLENGTH(krbConFile), KRB_FILE); - } - else - krbConFile[0] = '\0'; - - StringCchCopyA(confname, szConfname, krbConFile); - } - else if (hKrb4) { - unsigned int size = szConfname; - memset(confname, '\0', szConfname); - if (!pkrb_get_krbconf2(confname, &size)) - { // Error has happened - GetWindowsDirectoryA(confname,szConfname); - confname[szConfname-1] = '\0'; - StringCchCatA(confname, szConfname, "\\"); - StringCchCatA(confname, szConfname, KRB_FILE); - } - } - return FALSE; -} - -int -readstring(FILE * file, char * buf, int len) -{ - int c,i; - memset(buf, '\0', sizeof(buf)); - for (i=0, c=fgetc(file); c != EOF ; c=fgetc(file), i++) { - if (i < sizeof(buf)) { - if (c == '\n') { - buf[i] = '\0'; - return i; - } else { - buf[i] = c; - } - } else { - if (c == '\n') { - buf[len-1] = '\0'; - return(i); - } - } - } - if (c == EOF) { - if (i > 0 && i < len) { - buf[i] = '\0'; - return(i); - } else { - buf[len-1] = '\0'; - return(-1); - } - } - return(-1); -} - -/*! \internal - \brief Return a list of configured realms - - The string that is returned is a set of null terminated unicode - strings, each of which denotes one realm. The set is terminated - by a zero length null terminated string. - - The caller should free the returned string using free() - - \return The string with the list of realms or NULL if the - operation fails. -*/ -wchar_t * -khm_krb5_get_realm_list(void) -{ - wchar_t * rlist = NULL; - - if (pprofile_get_subsection_names && pprofile_free_list) { - const char* rootSection[] = {"realms", NULL}; - const char** rootsec = rootSection; - char **sections = NULL, **cpp = NULL, *value = NULL; - - char krb5_conf[MAX_PATH+1]; - - if (!khm_krb5_get_profile_file(krb5_conf,sizeof(krb5_conf))) { - profile_t profile; - long retval; - const char *filenames[2]; - wchar_t * d; - size_t cbsize; - size_t t; - - filenames[0] = krb5_conf; - filenames[1] = NULL; - retval = pprofile_init(filenames, &profile); - if (!retval) { - retval = pprofile_get_subsection_names(profile, rootsec, - §ions); - - if (!retval) - { - /* first figure out how much space to allocate */ - cbsize = 0; - for (cpp = sections; *cpp; cpp++) - { - cbsize += sizeof(wchar_t) * (strlen(*cpp) + 1); - } - cbsize += sizeof(wchar_t); /* double null terminated */ - - rlist = PMALLOC(cbsize); - d = rlist; - for (cpp = sections; *cpp; cpp++) - { - AnsiStrToUnicode(d, cbsize, *cpp); - t = wcslen(d) + 1; - d += t; - cbsize -= sizeof(wchar_t) * t; - } - *d = L'\0'; - } - - pprofile_free_list(sections); - -#if 0 - retval = pprofile_get_string(profile, "libdefaults","noaddresses", 0, "true", &value); - if ( value ) { - disable_noaddresses = config_boolean_to_int(value); - pprofile_release_string(value); - } -#endif - pprofile_release(profile); - } - } - } else { - FILE * file; - char krb_conf[MAX_PATH+1]; - char * p; - size_t cbsize, t; - wchar_t * d; - - if (!khm_get_krb4_con_file(krb_conf,sizeof(krb_conf)) && -#if _MSC_VER >= 1400 - !fopen_s(&file, krb_conf, "rt") -#else - (file = fopen(krb_conf, "rt")) -#endif - ) - { - char lineBuf[256]; - - /*TODO: compute the actual required buffer size instead of hardcoding */ - cbsize = 16384; // arbitrary - rlist = PMALLOC(cbsize); - d = rlist; - - // Skip the default realm - readstring(file,lineBuf,sizeof(lineBuf)); - - // Read the defined realms - while (TRUE) - { - if (readstring(file,lineBuf,sizeof(lineBuf)) < 0) - break; - - if (*(lineBuf + strlen(lineBuf) - 1) == '\r') - *(lineBuf + strlen(lineBuf) - 1) = 0; - - for (p=lineBuf; *p ; p++) - { - if (isspace(*p)) { - *p = 0; - break; - } - } - - if ( strncmp(".KERBEROS.OPTION.",lineBuf,17) ) { - t = strlen(lineBuf) + 1; - if(cbsize > (1 + t*sizeof(wchar_t))) { - AnsiStrToUnicode(d, cbsize, lineBuf); - d += t; - cbsize -= t * sizeof(wchar_t); - } else - break; - } - } - - *d = L'\0'; - - fclose(file); - } - } - - return rlist; -} - -/*! \internal - \brief Get the default realm - - A string will be returned that specifies the default realm. The - caller should free the string using free(). - - Returns NULL if the operation fails. -*/ -wchar_t * -khm_krb5_get_default_realm(void) -{ - wchar_t * realm; - size_t cch; - krb5_context ctx=0; - char * def = 0; - - pkrb5_init_context(&ctx); - pkrb5_get_default_realm(ctx,&def); - - if (def) { - cch = strlen(def) + 1; - realm = PMALLOC(sizeof(wchar_t) * cch); - AnsiStrToUnicode(realm, sizeof(wchar_t) * cch, def); - pkrb5_free_default_realm(ctx, def); - } else - realm = NULL; - - pkrb5_free_context(ctx); - - return realm; -} - -long -khm_krb5_set_default_realm(wchar_t * realm) { - krb5_context ctx=0; - char * def = 0; - long rv = 0; - char astr[K5_MAXCCH_REALM]; - - UnicodeStrToAnsi(astr, sizeof(astr), realm); - - pkrb5_init_context(&ctx); - pkrb5_get_default_realm(ctx,&def); - - if ((def && strcmp(def, astr)) || - !def) { - rv = pkrb5_set_default_realm(ctx, astr); - } - - if (def) { - pkrb5_free_default_realm(ctx, def); - } - - pkrb5_free_context(ctx); - - return rv; -} - -wchar_t * -khm_get_realm_from_princ(wchar_t * princ) { - wchar_t * t; - - if(!princ) - return NULL; - - for (t = princ; *t; t++) { - if(*t == L'\\') { /* escape */ - t++; - if(! *t) /* malformed */ - break; - } else if (*t == L'@') - break; - } - - if (*t == '@' && *(t+1) != L'\0') - return (t+1); - else - return NULL; -} - -long -khm_krb5_changepwd(char * principal, - char * password, - char * newpassword, - char** error_str) -{ - krb5_error_code rc = 0; - int result_code; - krb5_data result_code_string, result_string; - krb5_context context = 0; - krb5_principal princ = 0; - krb5_get_init_creds_opt opts; - krb5_creds creds; - - result_string.data = 0; - result_code_string.data = 0; - - if ( !pkrb5_init_context ) - goto cleanup; - - if (rc = pkrb5_init_context(&context)) { - goto cleanup; - } - - if (rc = pkrb5_parse_name(context, principal, &princ)) { - goto cleanup; - } - - pkrb5_get_init_creds_opt_init(&opts); - pkrb5_get_init_creds_opt_set_tkt_life(&opts, 5*60); - pkrb5_get_init_creds_opt_set_renew_life(&opts, 0); - pkrb5_get_init_creds_opt_set_forwardable(&opts, 0); - pkrb5_get_init_creds_opt_set_proxiable(&opts, 0); - pkrb5_get_init_creds_opt_set_address_list(&opts,NULL); - - if (rc = pkrb5_get_init_creds_password(context, &creds, princ, - password, 0, 0, 0, - "kadmin/changepw", &opts)) { - if (rc == KRB5KRB_AP_ERR_BAD_INTEGRITY) { -#if 0 - com_err(argv[0], 0, - "Password incorrect while getting initial ticket"); -#endif - } - else { -#if 0 - com_err(argv[0], ret, "getting initial ticket"); -#endif - } - goto cleanup; - } - - if (rc = pkrb5_change_password(context, &creds, newpassword, - &result_code, &result_code_string, - &result_string)) { -#if 0 - com_err(argv[0], ret, "changing password"); -#endif - goto cleanup; - } - - if (result_code) { - int len = result_code_string.length + - (result_string.length ? (sizeof(": ") - 1) : 0) + - result_string.length; - if (len && error_str) { - *error_str = PMALLOC(len + 1); - if (*error_str) - StringCchPrintfA(*error_str, len+1, - "%.*s%s%.*s", - result_code_string.length, - result_code_string.data, - result_string.length?": ":"", - result_string.length, - result_string.data); - } - rc = result_code; - goto cleanup; - } - - cleanup: - if (result_string.data) - pkrb5_free_data_contents(context, &result_string); - - if (result_code_string.data) - pkrb5_free_data_contents(context, &result_code_string); - - if (princ) - pkrb5_free_principal(context, princ); - - if (context) - pkrb5_free_context(context); - - return rc; -} - -khm_int32 KHMAPI -khm_krb5_creds_is_equal(khm_handle vcred1, khm_handle vcred2, void * dummy) { - if (kcdb_creds_comp_attr(vcred1, vcred2, KCDB_ATTR_LOCATION) || - kcdb_creds_comp_attr(vcred1, vcred2, attr_id_key_enctype) || - kcdb_creds_comp_attr(vcred1, vcred2, attr_id_tkt_enctype) || - kcdb_creds_comp_attr(vcred1, vcred2, attr_id_kvno)) - return 1; - else - return 0; -} +/* +* Copyright (c) 2005 Massachusetts Institute of Technology +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, +* modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/* $Id$ */ + +/* Originally this was krb5routines.c in Leash sources. Subsequently +modified and adapted for NetIDMgr */ + +#include +#include + +#define SECURITY_WIN32 +#include +#include + +#include +#include +#include +#include + +long +khm_convert524(krb5_context alt_ctx) +{ + krb5_context ctx = 0; + krb5_error_code code = 0; + int icode = 0; + krb5_principal me = 0; + krb5_principal server = 0; + krb5_creds *v5creds = 0; + krb5_creds increds; + krb5_ccache cc = 0; + CREDENTIALS * v4creds = NULL; + static int init_ets = 1; + + if (!pkrb5_init_context || + !pkrb_in_tkt || + !pkrb524_init_ets || + !pkrb524_convert_creds_kdc) + return 0; + + v4creds = (CREDENTIALS *) PMALLOC(sizeof(CREDENTIALS)); + memset((char *) v4creds, 0, sizeof(CREDENTIALS)); + + memset((char *) &increds, 0, sizeof(increds)); + /* + From this point on, we can goto cleanup because increds is + initialized. + */ + + if (alt_ctx) + { + ctx = alt_ctx; + } + else + { + code = pkrb5_init_context(&ctx); + if (code) goto cleanup; + } + + code = pkrb5_cc_default(ctx, &cc); + if (code) goto cleanup; + + if ( init_ets ) { + pkrb524_init_ets(ctx); + init_ets = 0; + } + + if (code = pkrb5_cc_get_principal(ctx, cc, &me)) + goto cleanup; + + if ((code = pkrb5_build_principal(ctx, + &server, + krb5_princ_realm(ctx, me)->length, + krb5_princ_realm(ctx, me)->data, + "krbtgt", + krb5_princ_realm(ctx, me)->data, + NULL))) + { + goto cleanup; + } + + increds.client = me; + increds.server = server; + increds.times.endtime = 0; + increds.keyblock.enctype = ENCTYPE_DES_CBC_CRC; + if ((code = pkrb5_get_credentials(ctx, 0, + cc, + &increds, + &v5creds))) + { + goto cleanup; + } + + if ((icode = pkrb524_convert_creds_kdc(ctx, + v5creds, + v4creds))) + { + goto cleanup; + } + + /* initialize ticket cache */ + if ((icode = pkrb_in_tkt(v4creds->pname, v4creds->pinst, v4creds->realm) + != KSUCCESS)) + { + goto cleanup; + } + /* stash ticket, session key, etc. for future use */ + if ((icode = pkrb_save_credentials(v4creds->service, + v4creds->instance, + v4creds->realm, + v4creds->session, + v4creds->lifetime, + v4creds->kvno, + &(v4creds->ticket_st), + v4creds->issue_date))) + { + goto cleanup; + } + +cleanup: + memset(v4creds, 0, sizeof(v4creds)); + PFREE(v4creds); + + if (v5creds) { + pkrb5_free_creds(ctx, v5creds); + } + if (increds.client == me) + me = 0; + if (increds.server == server) + server = 0; + pkrb5_free_cred_contents(ctx, &increds); + if (server) { + pkrb5_free_principal(ctx, server); + } + if (me) { + pkrb5_free_principal(ctx, me); + } + pkrb5_cc_close(ctx, cc); + + if (ctx && (ctx != alt_ctx)) { + pkrb5_free_context(ctx); + } + return !(code || icode); +} + +#ifdef DEPRECATED_REMOVABLE +int com_addr(void) +{ + long ipAddr; + char loc_addr[ADDR_SZ]; + CREDENTIALS cred; + char service[40]; + char instance[40]; + // char addr[40]; + char realm[40]; + struct in_addr LocAddr; + int k_errno; + + if (pkrb_get_cred == NULL) + return(KSUCCESS); + + k_errno = (*pkrb_get_cred)(service,instance,realm,&cred); + if (k_errno) + return KRBERR(k_errno); + + while(1) { + ipAddr = (*pLocalHostAddr)(); + LocAddr.s_addr = ipAddr; + StringCbCopyA(loc_addr, sizeof(loc_addr), inet_ntoa(LocAddr)); + if ( strcmp(cred.address, loc_addr) != 0) { + /* TODO: do something about this */ + //Leash_kdestroy (); + break; + } + break; + } // while() + return 0; +} +#endif + +#ifndef ENCTYPE_LOCAL_RC4_MD4 +#define ENCTYPE_LOCAL_RC4_MD4 0xFFFFFF80 +#endif + +#define MAX_ADDRS 256 + +static long get_tickets_from_cache(krb5_context ctx, + krb5_ccache cache) +{ + krb5_error_code code; + krb5_principal KRBv5Principal; + krb5_flags flags = 0; + krb5_cc_cursor KRBv5Cursor; + krb5_creds KRBv5Credentials; + krb5_ticket *tkt=NULL; + char *ClientName; + char *PrincipalName; + wchar_t wbuf[256]; /* temporary conversion buffer */ + wchar_t wcc_name[KRB5_MAXCCH_CCNAME]; /* credential cache name */ + char *sServerName; + khm_handle ident = NULL; + khm_handle cred = NULL; + time_t tt; + FILETIME ft, eft; + khm_int32 ti; + +#ifdef KRB5_TC_NOTICKET + flags = KRB5_TC_NOTICKET; +#else + flags = 0; +#endif + + { + const char * cc_name; + const char * cc_type; + + cc_name = (*pkrb5_cc_get_name)(ctx, cache); + if(cc_name) { + cc_type = (*pkrb5_cc_get_type)(ctx, cache); + if (cc_type) { + StringCbPrintf(wcc_name, sizeof(wcc_name), L"%S:%S", cc_type, cc_name); + } else { + AnsiStrToUnicode(wcc_name, sizeof(wcc_name), cc_name); + khm_krb5_canon_cc_name(wcc_name, sizeof(wcc_name)); + } + } else { + cc_type = (*pkrb5_cc_get_type)(ctx, cache); + if (cc_type) { + StringCbPrintf(wcc_name, sizeof(wcc_name), L"%S:", cc_type); + } else { +#ifdef DEBUG + assert(FALSE); +#endif + StringCbCopy(wcc_name, sizeof(wcc_name), L""); + } + } + } + + if ((code = (*pkrb5_cc_set_flags)(ctx, cache, flags))) + { + if (code != KRB5_FCC_NOFILE && code != KRB5_CC_NOTFOUND) + khm_krb5_error(code, "krb5_cc_set_flags()", 0, &ctx, &cache); + + goto _exit; + } + + if ((code = (*pkrb5_cc_get_principal)(ctx, cache, &KRBv5Principal))) + { + if (code != KRB5_FCC_NOFILE && code != KRB5_CC_NOTFOUND) + khm_krb5_error(code, "krb5_cc_get_principal()", 0, &ctx, &cache); + + goto _exit; + } + + PrincipalName = NULL; + ClientName = NULL; + sServerName = NULL; + if ((code = (*pkrb5_unparse_name)(ctx, KRBv5Principal, + (char **)&PrincipalName))) + { + if (PrincipalName != NULL) + (*pkrb5_free_unparsed_name)(ctx, PrincipalName); + + (*pkrb5_free_principal)(ctx, KRBv5Principal); + + goto _exit; + } + + if (!strcspn(PrincipalName, "@" )) + { + if (PrincipalName != NULL) + (*pkrb5_free_unparsed_name)(ctx, PrincipalName); + + (*pkrb5_free_principal)(ctx, KRBv5Principal); + + goto _exit; + } + + AnsiStrToUnicode(wbuf, sizeof(wbuf), PrincipalName); + if(KHM_FAILED(kcdb_identity_create(wbuf, KCDB_IDENT_FLAG_CREATE, + &ident))) { + /* something bad happened */ + code = 1; + goto _exit; + } + + (*pkrb5_free_principal)(ctx, KRBv5Principal); + + if ((code = (*pkrb5_cc_start_seq_get)(ctx, cache, &KRBv5Cursor))) + { + goto _exit; + } + + memset(&KRBv5Credentials, '\0', sizeof(KRBv5Credentials)); + + ClientName = NULL; + sServerName = NULL; + cred = NULL; + + while (!(code = pkrb5_cc_next_cred(ctx, cache, &KRBv5Cursor, + &KRBv5Credentials))) + { + khm_handle tident = NULL; + khm_int32 cred_flags = 0; + + if(ClientName != NULL) + (*pkrb5_free_unparsed_name)(ctx, ClientName); + if(sServerName != NULL) + (*pkrb5_free_unparsed_name)(ctx, sServerName); + if(cred) + kcdb_cred_release(cred); + + ClientName = NULL; + sServerName = NULL; + cred = NULL; + + if ((*pkrb5_unparse_name)(ctx, KRBv5Credentials.client, &ClientName)) + { + (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); + khm_krb5_error(code, "krb5_free_cred_contents()", 0, &ctx, &cache); + continue; + } + + if ((*pkrb5_unparse_name)(ctx, KRBv5Credentials.server, &sServerName)) + { + (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); + khm_krb5_error(code, "krb5_free_cred_contents()", 0, &ctx, &cache); + continue; + } + + /* if the ClientName differs from PrincipalName for some + reason, we need to create a new identity */ + if(strcmp(ClientName, PrincipalName)) { + AnsiStrToUnicode(wbuf, sizeof(wbuf), ClientName); + if(KHM_FAILED(kcdb_identity_create(wbuf, KCDB_IDENT_FLAG_CREATE, + &tident))) { + (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); + continue; + } + } else { + tident = ident; + } + + AnsiStrToUnicode(wbuf, sizeof(wbuf), sServerName); + if(KHM_FAILED(kcdb_cred_create(wbuf, tident, credtype_id_krb5, + &cred))) { + (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); + continue; + } + + if (!KRBv5Credentials.times.starttime) + KRBv5Credentials.times.starttime = KRBv5Credentials.times.authtime; + + tt = KRBv5Credentials.times.starttime; + TimetToFileTime(tt, &ft); + kcdb_cred_set_attr(cred, KCDB_ATTR_ISSUE, &ft, sizeof(ft)); + + tt = KRBv5Credentials.times.endtime; + TimetToFileTime(tt, &eft); + kcdb_cred_set_attr(cred, KCDB_ATTR_EXPIRE, &eft, sizeof(eft)); + + { + FILETIME ftl; + + ftl = FtSub(&eft, &ft); + kcdb_cred_set_attr(cred, KCDB_ATTR_LIFETIME, &ftl, sizeof(ftl)); + } + + if (KRBv5Credentials.times.renew_till > 0) { + FILETIME ftl; + + tt = KRBv5Credentials.times.renew_till; + TimetToFileTime(tt, &eft); + kcdb_cred_set_attr(cred, KCDB_ATTR_RENEW_EXPIRE, &eft, + sizeof(eft)); + + + ftl = FtSub(&eft, &ft); + kcdb_cred_set_attr(cred, KCDB_ATTR_RENEW_LIFETIME, &ftl, + sizeof(ftl)); + } + + ti = KRBv5Credentials.ticket_flags; + kcdb_cred_set_attr(cred, attr_id_krb5_flags, &ti, sizeof(ti)); + + /* special flags understood by NetIDMgr */ + { + khm_int32 nflags = 0; + + if (ti & TKT_FLG_RENEWABLE) + nflags |= KCDB_CRED_FLAG_RENEWABLE; + if (ti & TKT_FLG_INITIAL) + nflags |= KCDB_CRED_FLAG_INITIAL; + else { + krb5_data * c0, *c1, *r; + + /* these are macros that do not allocate any memory */ + c0 = krb5_princ_component(ctx,KRBv5Credentials.server,0); + c1 = krb5_princ_component(ctx,KRBv5Credentials.server,1); + r = krb5_princ_realm(ctx,KRBv5Credentials.server); + + if ( c0 && c1 && r && c1->length == r->length && + !strncmp(c1->data,r->data,r->length) && + !strncmp("krbtgt",c0->data,c0->length) ) + nflags |= KCDB_CRED_FLAG_INITIAL; + } + + kcdb_cred_set_flags(cred, nflags, KCDB_CRED_FLAGMASK_EXT); + + cred_flags = nflags; + } + + if ( !pkrb5_decode_ticket(&KRBv5Credentials.ticket, &tkt)) { + ti = tkt->enc_part.enctype; + kcdb_cred_set_attr(cred, attr_id_tkt_enctype, &ti, sizeof(ti)); + ti = tkt->enc_part.kvno; + kcdb_cred_set_attr(cred, attr_id_kvno, &ti, sizeof(ti)); + pkrb5_free_ticket(ctx, tkt); + tkt = NULL; + } + + ti = KRBv5Credentials.keyblock.enctype; + kcdb_cred_set_attr(cred, attr_id_key_enctype, &ti, sizeof(ti)); + + kcdb_cred_set_attr(cred, KCDB_ATTR_LOCATION, wcc_name, + KCDB_CBSIZE_AUTO); + + if ( KRBv5Credentials.addresses && KRBv5Credentials.addresses[0] ) { + khm_int32 buffer[1024]; + void * bufp; + khm_size cb; + khm_int32 rv; + + bufp = (void *) buffer; + cb = sizeof(buffer); + + rv = serialize_krb5_addresses(KRBv5Credentials.addresses, + bufp, + &cb); + if (rv == KHM_ERROR_TOO_LONG) { + bufp = PMALLOC(cb); + rv = serialize_krb5_addresses(KRBv5Credentials.addresses, + bufp, + &cb); + } + + if (KHM_SUCCEEDED(rv)) { + kcdb_cred_set_attr(cred, attr_id_addr_list, + bufp, cb); + } + + if (bufp != (void *) buffer) + PFREE(bufp); + } + + if(cred_flags & KCDB_CRED_FLAG_INITIAL) { + FILETIME ft_issue_new; + FILETIME ft_expire_old; + FILETIME ft_expire_new; + khm_size cb; + + /* an initial ticket! If we find one, we generally set + the lifetime, and primary ccache based on this, but + only if this initial cred has a greater lifetime than + the current primary credential. */ + + tt = KRBv5Credentials.times.endtime; + TimetToFileTime(tt, &ft_expire_new); + + tt = KRBv5Credentials.times.starttime; + TimetToFileTime(tt, &ft_issue_new); + + cb = sizeof(ft_expire_old); + if(KHM_FAILED(kcdb_identity_get_attr(tident, + KCDB_ATTR_EXPIRE, + NULL, &ft_expire_old, + &cb)) + || CompareFileTime(&ft_expire_new, &ft_expire_old) > 0) { + + kcdb_identity_set_attr(tident, attr_id_krb5_ccname, + wcc_name, KCDB_CBSIZE_AUTO); + kcdb_identity_set_attr(tident, KCDB_ATTR_EXPIRE, + &ft_expire_new, + sizeof(ft_expire_new)); + kcdb_identity_set_attr(tident, KCDB_ATTR_ISSUE, + &ft_issue_new, + sizeof(ft_issue_new)); + + if (KRBv5Credentials.times.renew_till > 0) { + tt = KRBv5Credentials.times.renew_till; + TimetToFileTime(tt, &ft); + kcdb_identity_set_attr(tident, + KCDB_ATTR_RENEW_EXPIRE, + &ft, sizeof(ft)); + } else { + kcdb_identity_set_attr(tident, + KCDB_ATTR_RENEW_EXPIRE, + NULL, 0); + } + + ti = KRBv5Credentials.ticket_flags; + kcdb_identity_set_attr(tident, attr_id_krb5_flags, + &ti, sizeof(ti)); + } + } + + kcdb_credset_add_cred(krb5_credset, cred, -1); + + (*pkrb5_free_cred_contents)(ctx, &KRBv5Credentials); + + if(tident != ident) + kcdb_identity_release(tident); + } + + if (PrincipalName != NULL) + (*pkrb5_free_unparsed_name)(ctx, PrincipalName); + + if (ClientName != NULL) + (*pkrb5_free_unparsed_name)(ctx, ClientName); + + if (sServerName != NULL) + (*pkrb5_free_unparsed_name)(ctx, sServerName); + + if (cred) + kcdb_cred_release(cred); + + if ((code == KRB5_CC_END) || (code == KRB5_CC_NOTFOUND)) + { + if ((code = pkrb5_cc_end_seq_get(ctx, cache, &KRBv5Cursor))) + { + goto _exit; + } + + flags = KRB5_TC_OPENCLOSE; +#ifdef KRB5_TC_NOTICKET + flags |= KRB5_TC_NOTICKET; +#endif + if ((code = pkrb5_cc_set_flags(ctx, cache, flags))) + { + goto _exit; + } + } + else + { + goto _exit; + } + +_exit: + + return code; +} + +long +khm_krb5_list_tickets(krb5_context *krbv5Context) +{ + krb5_context ctx = NULL; + krb5_ccache cache = 0; + krb5_error_code code = 0; + apiCB * cc_ctx = 0; + struct _infoNC ** pNCi = NULL; + int i; + khm_int32 t; + wchar_t * ms = NULL; + khm_size cb; + + kcdb_credset_flush(krb5_credset); + + if((*krbv5Context == 0) && (code = (*pkrb5_init_context)(krbv5Context))) { + goto _exit; + } + + ctx = (*krbv5Context); + + if (!pcc_initialize || + !pcc_get_NC_info || + !pcc_free_NC_info || + !pcc_shutdown) + goto _skip_cc_iter; + + code = pcc_initialize(&cc_ctx, CC_API_VER_2, NULL, NULL); + if (code) + goto _exit; + + code = pcc_get_NC_info(cc_ctx, &pNCi); + if (code) + goto _exit; + + for(i=0; pNCi[i]; i++) { + char ccname[KRB5_MAXCCH_CCNAME]; + + if (pNCi[i]->vers != CC_CRED_V5) + continue; + + if (FAILED(StringCchPrintfA(ccname, sizeof(ccname), "API:%s", + pNCi[i]->name))) + continue; + + code = (*pkrb5_cc_resolve)(ctx, ccname, &cache); + + if (code) + continue; + + code = get_tickets_from_cache(ctx, cache); + + if(ctx != NULL && cache != NULL) + (*pkrb5_cc_close)(ctx, cache); + + cache = 0; + } + + _skip_cc_iter: + + if (KHM_SUCCEEDED(khc_read_int32(csp_params, L"MsLsaList", &t)) && t) { + code = (*pkrb5_cc_resolve)(ctx, "MSLSA:", &cache); + + if (code == 0 && cache) { + code = get_tickets_from_cache(ctx, cache); + } + + if (ctx != NULL && cache != NULL) + (*pkrb5_cc_close)(ctx, cache); + cache = 0; + } + + if (khc_read_multi_string(csp_params, L"FileCCList", NULL, &cb) + == KHM_ERROR_TOO_LONG && + cb > sizeof(wchar_t) * 2) { + wchar_t * t; + char ccname[MAX_PATH + 6]; + + ms = PMALLOC(cb); +#ifdef DEBUG + assert(ms); +#endif + khc_read_multi_string(csp_params, L"FileCCList", ms, &cb); + + for(t = ms; t && *t; t = multi_string_next(t)) { + StringCchPrintfA(ccname, ARRAYLENGTH(ccname), + "FILE:%S", t); + + code = (*pkrb5_cc_resolve)(ctx, ccname, &cache); + + if (code) + continue; + + code = get_tickets_from_cache(ctx, cache); + + if (ctx != NULL && cache != NULL) + (*pkrb5_cc_close)(ctx, cache); + cache = 0; + } + + PFREE(ms); + } + +_exit: + if (pNCi) + (*pcc_free_NC_info)(cc_ctx, &pNCi); + if (cc_ctx) + (*pcc_shutdown)(&cc_ctx); + + kcdb_credset_collect(NULL, krb5_credset, NULL, credtype_id_krb5, NULL); + + return(code); +} + +int +khm_krb5_renew_cred(khm_handle cred) +{ + khm_handle identity = NULL; + krb5_error_code code = 0; + krb5_context ctx = 0; + krb5_ccache cc = 0; + + if (cred == NULL) { +#ifdef DEBUG + assert(FALSE); +#endif + goto _cleanup; + } + + if (KHM_FAILED(kcdb_cred_get_identity(cred, &identity))) { +#ifdef DEBUG + assert(FALSE); +#endif + goto _cleanup; + } + + code = khm_krb5_initialize(identity, &ctx, &cc); + if (code) + goto _cleanup; + + /* TODO: going here */ + + _cleanup: + + if (identity) + kcdb_identity_release(identity); + + if (cc && ctx) + pkrb5_cc_close(ctx, cc); + + if (ctx) + pkrb5_free_context(ctx); + + return code; +} + +int +khm_krb5_renew_ident(khm_handle identity) +{ + krb5_error_code code = 0; + krb5_context ctx = 0; + krb5_ccache cc = 0; + krb5_principal me = 0; + krb5_principal server = 0; + krb5_creds my_creds; + krb5_data *realm = 0; + + memset(&my_creds, 0, sizeof(krb5_creds)); + + if ( !pkrb5_init_context ) + goto cleanup; + + code = khm_krb5_initialize(identity, &ctx, &cc); + if (code) + goto cleanup; + + code = pkrb5_cc_get_principal(ctx, cc, &me); + if (code) + goto cleanup; + + realm = krb5_princ_realm(ctx, me); + + code = pkrb5_build_principal_ext(ctx, &server, + realm->length,realm->data, + KRB5_TGS_NAME_SIZE, KRB5_TGS_NAME, + realm->length,realm->data, + 0); + + if (code) + goto cleanup; + + my_creds.client = me; + my_creds.server = server; + +#ifdef KRB5_TC_NOTICKET + pkrb5_cc_set_flags(ctx, cc, 0); +#endif + code = pkrb5_get_renewed_creds(ctx, &my_creds, me, cc, NULL); +#ifdef KRB5_TC_NOTICKET + pkrb5_cc_set_flags(ctx, cc, KRB5_TC_NOTICKET); +#endif + if (code) { + if ( code != KRB5KDC_ERR_ETYPE_NOSUPP || + code != KRB5_KDC_UNREACH) + khm_krb5_error(code, "krb5_get_renewed_creds()", 0, &ctx, &cc); + goto cleanup; + } + + code = pkrb5_cc_initialize(ctx, cc, me); + if (code) goto cleanup; + + code = pkrb5_cc_store_cred(ctx, cc, &my_creds); + if (code) goto cleanup; + +cleanup: + if (my_creds.client == me) + my_creds.client = 0; + if (my_creds.server == server) + my_creds.server = 0; + + pkrb5_free_cred_contents(ctx, &my_creds); + + if (me) + pkrb5_free_principal(ctx, me); + if (server) + pkrb5_free_principal(ctx, server); + if (cc) + pkrb5_cc_close(ctx, cc); + if (ctx) + pkrb5_free_context(ctx); + return(code); +} + +int +khm_krb5_kinit(krb5_context alt_ctx, + char * principal_name, + char * password, + char * ccache, + krb5_deltat lifetime, + DWORD forwardable, + DWORD proxiable, + krb5_deltat renew_life, + DWORD addressless, + DWORD publicIP, + krb5_prompter_fct prompter, + void * p_data) +{ + krb5_error_code code = 0; + krb5_context ctx = 0; + krb5_ccache cc = 0; + krb5_principal me = 0; + char* name = 0; + krb5_creds my_creds; + krb5_get_init_creds_opt options; + krb5_address ** addrs = NULL; + int i = 0, addr_count = 0; + + if (!pkrb5_init_context) + return 0; + + _reportf(L"In khm_krb5_kinit"); + + pkrb5_get_init_creds_opt_init(&options); + memset(&my_creds, 0, sizeof(my_creds)); + + if (alt_ctx) { + ctx = alt_ctx; + } else { + code = pkrb5_init_context(&ctx); + if (code) + goto cleanup; + } + + if (ccache) { + _reportf(L"Using supplied ccache name %S", ccache); + code = pkrb5_cc_resolve(ctx, ccache, &cc); + } else { + khm_handle identity = NULL; + khm_handle csp_ident = NULL; + khm_handle csp_k5 = NULL; + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t wccname[MAX_PATH]; + char ccname[MAX_PATH]; + char * pccname = principal_name; + khm_size cb; + + idname[0] = L'\0'; + AnsiStrToUnicode(idname, sizeof(idname), principal_name); + + cb = sizeof(wccname); + + if (KHM_SUCCEEDED(kcdb_identity_create(idname, 0, &identity)) && + + KHM_SUCCEEDED(kcdb_identity_get_config(identity, 0, &csp_ident)) && + + KHM_SUCCEEDED(khc_open_space(csp_ident, CSNAME_KRB5CRED, 0, + &csp_k5)) && + + KHM_SUCCEEDED(khc_read_string(csp_k5, L"DefaultCCName", + wccname, &cb)) && + + cb > sizeof(wchar_t)) { + + _reportf(L"Using DefaultCCName [%s] from identity", wccname); + + UnicodeStrToAnsi(ccname, sizeof(ccname), wccname); + pccname = ccname; + } + + if (csp_k5) + khc_close_space(csp_k5); + if (csp_ident) + khc_close_space(csp_ident); + if (identity) + kcdb_identity_release(identity); + + code = pkrb5_cc_resolve(ctx, pccname, &cc); + } + + _reportf(L"krb5_cc_resolve returns code %d", code); + + if (code) goto cleanup; + + code = pkrb5_parse_name(ctx, principal_name, &me); + if (code) goto cleanup; + + code = pkrb5_unparse_name(ctx, me, &name); + if (code) goto cleanup; + + if (lifetime == 0) { + khc_read_int32(csp_params, L"DefaultLifetime", &lifetime); + } + + if (lifetime) + pkrb5_get_init_creds_opt_set_tkt_life(&options, lifetime); + + pkrb5_get_init_creds_opt_set_forwardable(&options, + forwardable ? 1 : 0); + pkrb5_get_init_creds_opt_set_proxiable(&options, + proxiable ? 1 : 0); + pkrb5_get_init_creds_opt_set_renew_life(&options, + renew_life); + + if (addressless) + pkrb5_get_init_creds_opt_set_address_list(&options,NULL); + else { + krb5_address ** local_addrs=NULL; + DWORD netIPAddr; + + pkrb5_os_localaddr(ctx, &local_addrs); + i = 0; + while ( local_addrs[i++] ); + addr_count = i + 1; + + addrs = (krb5_address **) PMALLOC((addr_count+1) * sizeof(krb5_address *)); + if ( !addrs ) { + pkrb5_free_addresses(ctx, local_addrs); + assert(0); + } + memset(addrs, 0, sizeof(krb5_address *) * (addr_count+1)); + i = 0; + while ( local_addrs[i] ) { + addrs[i] = (krb5_address *)PMALLOC(sizeof(krb5_address)); + if (addrs[i] == NULL) { + pkrb5_free_addresses(ctx, local_addrs); + assert(0); + } + + addrs[i]->magic = local_addrs[i]->magic; + addrs[i]->addrtype = local_addrs[i]->addrtype; + addrs[i]->length = local_addrs[i]->length; + addrs[i]->contents = (unsigned char *)PMALLOC(addrs[i]->length); + if (!addrs[i]->contents) { + pkrb5_free_addresses(ctx, local_addrs); + assert(0); + } + + memcpy(addrs[i]->contents,local_addrs[i]->contents, + local_addrs[i]->length); /* safe */ + i++; + } + pkrb5_free_addresses(ctx, local_addrs); + + if (publicIP) { + // we are going to add the public IP address specified by the user + // to the list provided by the operating system + addrs[i] = (krb5_address *)PMALLOC(sizeof(krb5_address)); + if (addrs[i] == NULL) + assert(0); + + addrs[i]->magic = KV5M_ADDRESS; + addrs[i]->addrtype = AF_INET; + addrs[i]->length = 4; + addrs[i]->contents = (unsigned char *)PMALLOC(addrs[i]->length); + if (!addrs[i]->contents) + assert(0); + + netIPAddr = htonl(publicIP); + memcpy(addrs[i]->contents,&netIPAddr,4); + } + + pkrb5_get_init_creds_opt_set_address_list(&options,addrs); + } + + code = + pkrb5_get_init_creds_password(ctx, + &my_creds, + me, + password, // password + prompter, // prompter + p_data, // prompter data + 0, // start time + 0, // service name + &options); + _reportf(L"krb5_get_init_creds_password returns code %d", code); + + if (code) goto cleanup; + + code = pkrb5_cc_initialize(ctx, cc, me); + _reportf(L"krb5_cc_initialize returns code %d", code); + if (code) goto cleanup; + + code = pkrb5_cc_store_cred(ctx, cc, &my_creds); + _reportf(L"krb5_cc_store_cred returns code %d", code); + if (code) goto cleanup; + +cleanup: + if ( addrs ) { + for ( i=0;icontents ) + PFREE(addrs[i]->contents); + PFREE(addrs[i]); + } + } + } + if (my_creds.client == me) + my_creds.client = 0; + pkrb5_free_cred_contents(ctx, &my_creds); + if (name) + pkrb5_free_unparsed_name(ctx, name); + if (me) + pkrb5_free_principal(ctx, me); + if (cc) + pkrb5_cc_close(ctx, cc); + if (ctx && (ctx != alt_ctx)) + pkrb5_free_context(ctx); + return(code); +} + +long +khm_krb5_copy_ccache_by_name(krb5_context in_ctx, + wchar_t * wscc_dest, + wchar_t * wscc_src) { + krb5_context ctx = NULL; + krb5_error_code code = 0; + khm_boolean free_ctx; + krb5_ccache cc_src = NULL; + krb5_ccache cc_dest = NULL; + krb5_principal princ_src = NULL; + char scc_dest[KRB5_MAXCCH_CCNAME]; + char scc_src[KRB5_MAXCCH_CCNAME]; + int t; + + t = UnicodeStrToAnsi(scc_dest, sizeof(scc_dest), wscc_dest); + if (t == 0) + return KHM_ERROR_TOO_LONG; + t = UnicodeStrToAnsi(scc_src, sizeof(scc_src), wscc_src); + if (t == 0) + return KHM_ERROR_TOO_LONG; + + if (in_ctx) { + ctx = in_ctx; + free_ctx = FALSE; + } else { + code = pkrb5_init_context(&ctx); + if (code) { + if (ctx) + pkrb5_free_context(ctx); + return code; + } + free_ctx = TRUE; + } + + code = pkrb5_cc_resolve(ctx, scc_dest, &cc_dest); + if (code) + goto _cleanup; + + code = pkrb5_cc_resolve(ctx, scc_src, &cc_src); + if (code) + goto _cleanup; + + code = pkrb5_cc_get_principal(ctx, cc_src, &princ_src); + if (code) + goto _cleanup; + + code = pkrb5_cc_initialize(ctx, cc_dest, princ_src); + if (code) + goto _cleanup; + + code = pkrb5_cc_copy_creds(ctx, cc_src, cc_dest); + + _cleanup: + if (princ_src) + pkrb5_free_principal(ctx, princ_src); + + if (cc_dest) + pkrb5_cc_close(ctx, cc_dest); + + if (cc_src) + pkrb5_cc_close(ctx, cc_src); + + if (free_ctx && ctx) + pkrb5_free_context(ctx); + + return code; +} + +long +khm_krb5_canon_cc_name(wchar_t * wcc_name, + size_t cb_cc_name) { + size_t cb_len; + wchar_t * colon; + + if (FAILED(StringCbLength(wcc_name, + cb_cc_name, + &cb_len))) { +#ifdef DEBUG + assert(FALSE); +#else + return KHM_ERROR_TOO_LONG; +#endif + } + + cb_len += sizeof(wchar_t); + + colon = wcschr(wcc_name, L':'); + + if (colon) { + /* if the colon is just 1 character away from the beginning, + it's a FILE: cc */ + if (colon - wcc_name == 1) { + if (cb_len + 5 * sizeof(wchar_t) > cb_cc_name) + return KHM_ERROR_TOO_LONG; + + memmove(&wcc_name[5], &wcc_name[0], cb_len); + memmove(&wcc_name[0], L"FILE:", sizeof(wchar_t) * 5); + } + + return 0; + } + + if (cb_len + 4 * sizeof(wchar_t) > cb_cc_name) + return KHM_ERROR_TOO_LONG; + + memmove(&wcc_name[4], &wcc_name[0], cb_len); + memmove(&wcc_name[0], L"API:", sizeof(wchar_t) * 4); + + return 0; +} + +int +khm_krb5_cc_name_cmp(const wchar_t * cc_name_1, + const wchar_t * cc_name_2) { + if (!wcsncmp(cc_name_1, L"API:", 4)) + cc_name_1 += 4; + + if (!wcsncmp(cc_name_2, L"API:", 4)) + cc_name_2 += 4; + + return wcscmp(cc_name_1, cc_name_2); +} + +static khm_int32 KHMAPI +khmint_location_comp_func(khm_handle cred1, + khm_handle cred2, + void * rock) { + return kcdb_creds_comp_attr(cred1, cred2, KCDB_ATTR_LOCATION); +} + +struct khmint_location_check { + khm_handle credset; + khm_handle cred; + wchar_t * ccname; + khm_boolean success; +}; + +static khm_int32 KHMAPI +khmint_find_matching_cred_func(khm_handle cred, + void * rock) { + struct khmint_location_check * lc; + + lc = (struct khmint_location_check *) rock; + + if (!kcdb_creds_is_equal(cred, lc->cred)) + return KHM_ERROR_SUCCESS; + if (kcdb_creds_comp_attr(cred, lc->cred, KCDB_ATTR_LOCATION)) + return KHM_ERROR_SUCCESS; + + /* found it */ + lc->success = TRUE; + + /* break the search */ + return !KHM_ERROR_SUCCESS; +} + +static khm_int32 KHMAPI +khmint_location_check_func(khm_handle cred, + void * rock) { + khm_int32 t; + khm_size cb; + wchar_t ccname[KRB5_MAXCCH_CCNAME]; + struct khmint_location_check * lc; + + lc = (struct khmint_location_check *) rock; + + if (KHM_FAILED(kcdb_cred_get_type(cred, &t))) + return KHM_ERROR_SUCCESS; + + if (t != credtype_id_krb5) + return KHM_ERROR_SUCCESS; + + cb = sizeof(ccname); + if (KHM_FAILED(kcdb_cred_get_attr(cred, + KCDB_ATTR_LOCATION, + NULL, + ccname, + &cb))) + return KHM_ERROR_SUCCESS; + + if(wcscmp(ccname, lc->ccname)) + return KHM_ERROR_SUCCESS; + + lc->cred = cred; + + lc->success = FALSE; + + kcdb_credset_apply(lc->credset, + khmint_find_matching_cred_func, + (void *) lc); + + if (!lc->success) + return KHM_ERROR_NOT_FOUND; + else + return KHM_ERROR_SUCCESS; +} + +static khm_int32 KHMAPI +khmint_delete_location_func(khm_handle cred, + void * rock) { + wchar_t cc_cred[KRB5_MAXCCH_CCNAME]; + struct khmint_location_check * lc; + khm_size cb; + + lc = (struct khmint_location_check *) rock; + + cb = sizeof(cc_cred); + + if (KHM_FAILED(kcdb_cred_get_attr(cred, + KCDB_ATTR_LOCATION, + NULL, + cc_cred, + &cb))) + return KHM_ERROR_SUCCESS; + + if (wcscmp(cc_cred, lc->ccname)) + return KHM_ERROR_SUCCESS; + + kcdb_credset_del_cred_ref(lc->credset, + cred); + + return KHM_ERROR_SUCCESS; +} + +int +khm_krb5_destroy_by_credset(khm_handle p_cs) +{ + khm_handle d_cs = NULL; + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_size s, cb; + krb5_context ctx; + krb5_error_code code = 0; + int i; + wchar_t ccname[KRB5_MAXCCH_CCNAME]; + struct khmint_location_check lc; + + rv = kcdb_credset_create(&d_cs); + + assert(KHM_SUCCEEDED(rv) && d_cs != NULL); + + kcdb_credset_extract(d_cs, p_cs, NULL, credtype_id_krb5); + + kcdb_credset_get_size(d_cs, &s); + + if (s == 0) { + _reportf(L"No tickets to delete"); + + kcdb_credset_delete(d_cs); + return 0; + } + + code = pkrb5_init_context(&ctx); + if (code != 0) { + rv = code; + goto _cleanup; + } + + /* we should synchronize the credential lists before we attempt to + make any assumptions on the state of the root credset */ + khm_krb5_list_tickets(&ctx); + + /* so, we need to make a decision about whether to destroy entire + ccaches or just individual credentials. Therefore we first + sort them by ccache. */ + kcdb_credset_sort(d_cs, + khmint_location_comp_func, + NULL); + + /* now, for each ccache we encounter, we check if we have all the + credentials from that ccache in the to-be-deleted list. */ + for (i=0; i < (int) s; i++) { + khm_handle cred; + + if (KHM_FAILED(kcdb_credset_get_cred(d_cs, + i, + &cred))) + continue; + + cb = sizeof(ccname); + rv = kcdb_cred_get_attr(cred, + KCDB_ATTR_LOCATION, + NULL, + ccname, + &cb); + +#ifdef DEBUG + assert(KHM_SUCCEEDED(rv)); +#endif + kcdb_cred_release(cred); + + lc.credset = d_cs; + lc.cred = NULL; + lc.ccname = ccname; + lc.success = FALSE; + + kcdb_credset_apply(NULL, + khmint_location_check_func, + (void *) &lc); + + if (lc.success) { + /* ok the destroy the ccache */ + char a_ccname[KRB5_MAXCCH_CCNAME]; + krb5_ccache cc = NULL; + + _reportf(L"Destroying ccache [%s]", ccname); + + UnicodeStrToAnsi(a_ccname, + sizeof(a_ccname), + ccname); + + code = pkrb5_cc_resolve(ctx, + a_ccname, + &cc); + if (code) + goto _delete_this_set; + + code = pkrb5_cc_destroy(ctx, cc); + + if (code) { + _reportf(L"krb5_cc_destroy returns code %d", code); + } + + _delete_this_set: + + lc.credset = d_cs; + lc.ccname = ccname; + + /* note that although we are deleting credentials off the + credential set, the size of the credential set does not + decrease since we are doing it from inside + kcdb_credset_apply(). The deleted creds will simply be + marked as deleted until kcdb_credset_purge() is + called. */ + + kcdb_credset_apply(d_cs, + khmint_delete_location_func, + (void *) &lc); + } + } + + kcdb_credset_purge(d_cs); + + /* the remainder need to be deleted one by one */ + + kcdb_credset_get_size(d_cs, &s); + + for (i=0; i < (int) s; ) { + khm_handle cred; + char a_ccname[KRB5_MAXCCH_CCNAME]; + char a_srvname[KCDB_CRED_MAXCCH_NAME]; + wchar_t srvname[KCDB_CRED_MAXCCH_NAME]; + krb5_ccache cc; + krb5_creds in_cred, out_cred; + krb5_principal princ; + khm_int32 etype; + + if (KHM_FAILED(kcdb_credset_get_cred(d_cs, + i, + &cred))) { + i++; + continue; + } + + cb = sizeof(ccname); + if (KHM_FAILED(kcdb_cred_get_attr(cred, + KCDB_ATTR_LOCATION, + NULL, + ccname, + &cb))) + goto _done_with_this_cred; + + _reportf(L"Looking at ccache [%s]", ccname); + + UnicodeStrToAnsi(a_ccname, + sizeof(a_ccname), + ccname); + + code = pkrb5_cc_resolve(ctx, + a_ccname, + &cc); + + if (code) + goto _skip_similar; + + code = pkrb5_cc_get_principal(ctx, cc, &princ); + + if (code) { + pkrb5_cc_close(ctx, cc); + goto _skip_similar; + } + + _del_this_cred: + + cb = sizeof(etype); + + if (KHM_FAILED(kcdb_cred_get_attr(cred, + attr_id_key_enctype, + NULL, + &etype, + &cb))) + goto _do_next_cred; + + cb = sizeof(srvname); + if (KHM_FAILED(kcdb_cred_get_name(cred, + srvname, + &cb))) + goto _do_next_cred; + + _reportf(L"Attempting to delete ticket %s", srvname); + + UnicodeStrToAnsi(a_srvname, sizeof(a_srvname), srvname); + + ZeroMemory(&in_cred, sizeof(in_cred)); + + code = pkrb5_parse_name(ctx, a_srvname, &in_cred.server); + if (code) + goto _do_next_cred; + in_cred.client = princ; + in_cred.keyblock.enctype = etype; + + code = pkrb5_cc_retrieve_cred(ctx, + cc, + KRB5_TC_MATCH_SRV_NAMEONLY | + KRB5_TC_SUPPORTED_KTYPES, + &in_cred, + &out_cred); + if (code) + goto _do_next_cred_0; + + code = pkrb5_cc_remove_cred(ctx, cc, + KRB5_TC_MATCH_SRV_NAMEONLY | + KRB5_TC_SUPPORTED_KTYPES | + KRB5_TC_MATCH_AUTHDATA, + &out_cred); + + pkrb5_free_cred_contents(ctx, &out_cred); + _do_next_cred_0: + pkrb5_free_principal(ctx, in_cred.server); + _do_next_cred: + + /* check if the next cred is also of the same ccache */ + kcdb_cred_release(cred); + + for (i++; i < (int) s; i++) { + if (KHM_FAILED(kcdb_credset_get_cred(d_cs, + i, + &cred))) + continue; + } + + if (i < (int) s) { + wchar_t newcc[KRB5_MAXCCH_CCNAME]; + + cb = sizeof(newcc); + if (KHM_FAILED(kcdb_cred_get_attr(cred, + KCDB_ATTR_LOCATION, + NULL, + newcc, + &cb)) || + wcscmp(newcc, ccname)) { + i--; /* we have to look at this again */ + goto _done_with_this_set; + } + goto _del_this_cred; + } + + + _done_with_this_set: + pkrb5_free_principal(ctx, princ); + + pkrb5_cc_close(ctx, cc); + + _done_with_this_cred: + kcdb_cred_release(cred); + i++; + continue; + + _skip_similar: + kcdb_cred_release(cred); + + for (++i; i < (int) s; i++) { + wchar_t newcc[KRB5_MAXCCH_CCNAME]; + + if (KHM_FAILED(kcdb_credset_get_cred(d_cs, + i, + &cred))) + continue; + + cb = sizeof(newcc); + if (KHM_FAILED(kcdb_cred_get_attr(cred, + KCDB_ATTR_LOCATION, + NULL, + &newcc, + &cb))) { + kcdb_cred_release(cred); + continue; + } + + if (wcscmp(newcc, ccname)) { + kcdb_cred_release(cred); + break; + } + } + } + + _cleanup: + + if (d_cs) + kcdb_credset_delete(&d_cs); + + return rv; +} + +int +khm_krb5_destroy_identity(khm_handle identity) +{ + krb5_context ctx; + krb5_ccache cache; + krb5_error_code rc; + + ctx = NULL; + cache = NULL; + + if (rc = khm_krb5_initialize(identity, &ctx, &cache)) + return(rc); + + rc = pkrb5_cc_destroy(ctx, cache); + + if (ctx != NULL) + pkrb5_free_context(ctx); + + return(rc); +} + +static BOOL +GetSecurityLogonSessionData(PSECURITY_LOGON_SESSION_DATA * ppSessionData) +{ + NTSTATUS Status = 0; + HANDLE TokenHandle; + TOKEN_STATISTICS Stats; + DWORD ReqLen; + BOOL Success; + + if (!ppSessionData) + return FALSE; + *ppSessionData = NULL; + + Success = OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &TokenHandle ); + if ( !Success ) + return FALSE; + + Success = GetTokenInformation( TokenHandle, TokenStatistics, &Stats, sizeof(TOKEN_STATISTICS), &ReqLen ); + CloseHandle( TokenHandle ); + if ( !Success ) + return FALSE; + + Status = pLsaGetLogonSessionData( &Stats.AuthenticationId, ppSessionData ); + if ( FAILED(Status) || !ppSessionData ) + return FALSE; + + return TRUE; +} + +// IsKerberosLogon() does not validate whether or not there are valid +// tickets in the cache. It validates whether or not it is reasonable +// to assume that if we attempted to retrieve valid tickets we could +// do so. Microsoft does not automatically renew expired tickets. +// Therefore, the cache could contain expired or invalid tickets. +// Microsoft also caches the user's password and will use it to +// retrieve new TGTs if the cache is empty and tickets are requested. + +static BOOL +IsKerberosLogon(VOID) +{ + PSECURITY_LOGON_SESSION_DATA pSessionData = NULL; + BOOL Success = FALSE; + + if ( GetSecurityLogonSessionData(&pSessionData) ) { + if ( pSessionData->AuthenticationPackage.Buffer ) { + WCHAR buffer[256]; + WCHAR *usBuffer; + int usLength; + + Success = FALSE; + usBuffer = (pSessionData->AuthenticationPackage).Buffer; + usLength = (pSessionData->AuthenticationPackage).Length; + if (usLength < 256) + { + lstrcpynW (buffer, usBuffer, usLength); + StringCbCatW (buffer, sizeof(buffer), L""); + if ( !lstrcmpW(L"Kerberos",buffer) ) + Success = TRUE; + } + } + pLsaFreeReturnBuffer(pSessionData); + } + return Success; +} + + +BOOL +khm_krb5_ms2mit(BOOL save_creds) +{ +#ifdef NO_KRB5 + return(FALSE); +#else /* NO_KRB5 */ + krb5_context kcontext = 0; + krb5_error_code code = 0; + krb5_ccache ccache=0; + krb5_ccache mslsa_ccache=0; + krb5_creds creds; + krb5_cc_cursor cursor=0; + krb5_principal princ = 0; + char *cache_name = NULL; + char *princ_name = NULL; + BOOL rc = FALSE; + + kherr_reportf(L"Begin : khm_krb5_ms2mit. save_cred=%d\n", (int) save_creds); + + if ( !pkrb5_init_context ) + goto cleanup; + + if (code = pkrb5_init_context(&kcontext)) + goto cleanup; + + kherr_reportf(L"Resolving MSLSA\n"); + + if (code = pkrb5_cc_resolve(kcontext, "MSLSA:", &mslsa_ccache)) + goto cleanup; + + if ( save_creds ) { + kherr_reportf(L"Getting principal\n"); + if (code = pkrb5_cc_get_principal(kcontext, mslsa_ccache, &princ)) + goto cleanup; + + kherr_reportf(L"Unparsing name\n"); + if (code = pkrb5_unparse_name(kcontext, princ, &princ_name)) + goto cleanup; + + kherr_reportf(L"Unparsed [%S]. Resolving target cache\n", princ_name); + /* TODO: actually look up the preferred ccache name */ + if (code = pkrb5_cc_resolve(kcontext, princ_name, &ccache)) { + kherr_reportf(L"Cannot resolve cache [%S] with code=%d. Trying default.\n", princ_name, code); + + if (code = pkrb5_cc_default(kcontext, &ccache)) { + kherr_reportf(L"Failed to resolve default ccache. Code=%d", code); + goto cleanup; + } + } + + kherr_reportf(L"Initializing ccache\n"); + if (code = pkrb5_cc_initialize(kcontext, ccache, princ)) + goto cleanup; + + kherr_reportf(L"Copying credentials\n"); + if (code = pkrb5_cc_copy_creds(kcontext, mslsa_ccache, ccache)) + goto cleanup; + + rc = TRUE; + } else { + /* Enumerate tickets from cache looking for an initial ticket */ + if ((code = pkrb5_cc_start_seq_get(kcontext, mslsa_ccache, &cursor))) + goto cleanup; + + while (!(code = pkrb5_cc_next_cred(kcontext, mslsa_ccache, + &cursor, &creds))) { + if ( creds.ticket_flags & TKT_FLG_INITIAL ) { + rc = TRUE; + pkrb5_free_cred_contents(kcontext, &creds); + break; + } + pkrb5_free_cred_contents(kcontext, &creds); + } + pkrb5_cc_end_seq_get(kcontext, mslsa_ccache, &cursor); + } + +cleanup: + kherr_reportf(L" Received code=%d", code); + + if (princ_name) + pkrb5_free_unparsed_name(kcontext, princ_name); + if (princ) + pkrb5_free_principal(kcontext, princ); + if (ccache) + pkrb5_cc_close(kcontext, ccache); + if (mslsa_ccache) + pkrb5_cc_close(kcontext, mslsa_ccache); + if (kcontext) + pkrb5_free_context(kcontext); + return(rc); +#endif /* NO_KRB5 */ +} + +#define KRB_FILE "KRB.CON" +#define KRBREALM_FILE "KRBREALM.CON" +#define KRB5_FILE "KRB5.INI" +#define KRB5_TMP_FILE "KRB5.INI.TMP" + +BOOL +khm_krb5_get_temp_profile_file(LPSTR confname, UINT szConfname) +{ + GetTempPathA(szConfname, confname); + confname[szConfname-1] = '\0'; + StringCchCatA(confname, szConfname, KRB5_TMP_FILE); + confname[szConfname-1] = '\0'; + return FALSE; +} + +BOOL +khm_krb5_get_profile_file(LPSTR confname, UINT szConfname) +{ + char **configFile = NULL; + if (pkrb5_get_default_config_files(&configFile)) + { + GetWindowsDirectoryA(confname,szConfname); + confname[szConfname-1] = '\0'; + + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); + + return FALSE; + } + + *confname = 0; + + if (configFile) + { + StringCchCopyA(confname, szConfname, *configFile); + pkrb5_free_config_files(configFile); + } + + if (!*confname) + { + GetWindowsDirectoryA(confname,szConfname); + confname[szConfname-1] = '\0'; + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB5_FILE); + } + + return FALSE; +} + +BOOL +khm_get_krb4_con_file(LPSTR confname, UINT szConfname) +{ + if (hKrb5 && !hKrb4) { // hold krb.con where krb5.ini is located + CHAR krbConFile[MAX_PATH]=""; + LPSTR pFind; + + //strcpy(krbConFile, CLeashApp::m_krbv5_profile->first_file->filename); + if (khm_krb5_get_profile_file(krbConFile, sizeof(krbConFile))) { + GetWindowsDirectoryA(krbConFile,sizeof(krbConFile)); + krbConFile[MAX_PATH-1] = '\0'; + StringCchCatA(confname, szConfname, "\\"); + } + + pFind = strrchr(krbConFile, '\\'); + if (pFind) { + *pFind = '\0'; + StringCchCatA(krbConFile, ARRAYLENGTH(krbConFile), "\\"); + StringCchCatA(krbConFile, ARRAYLENGTH(krbConFile), KRB_FILE); + } + else + krbConFile[0] = '\0'; + + StringCchCopyA(confname, szConfname, krbConFile); + } + else if (hKrb4) { + unsigned int size = szConfname; + memset(confname, '\0', szConfname); + if (!pkrb_get_krbconf2(confname, &size)) + { // Error has happened + GetWindowsDirectoryA(confname,szConfname); + confname[szConfname-1] = '\0'; + StringCchCatA(confname, szConfname, "\\"); + StringCchCatA(confname, szConfname, KRB_FILE); + } + } + return FALSE; +} + +int +readstring(FILE * file, char * buf, int len) +{ + int c,i; + memset(buf, '\0', sizeof(buf)); + for (i=0, c=fgetc(file); c != EOF ; c=fgetc(file), i++) { + if (i < sizeof(buf)) { + if (c == '\n') { + buf[i] = '\0'; + return i; + } else { + buf[i] = c; + } + } else { + if (c == '\n') { + buf[len-1] = '\0'; + return(i); + } + } + } + if (c == EOF) { + if (i > 0 && i < len) { + buf[i] = '\0'; + return(i); + } else { + buf[len-1] = '\0'; + return(-1); + } + } + return(-1); +} + +/*! \internal + \brief Return a list of configured realms + + The string that is returned is a set of null terminated unicode + strings, each of which denotes one realm. The set is terminated + by a zero length null terminated string. + + The caller should free the returned string using free() + + \return The string with the list of realms or NULL if the + operation fails. +*/ +wchar_t * +khm_krb5_get_realm_list(void) +{ + wchar_t * rlist = NULL; + + if (pprofile_get_subsection_names && pprofile_free_list) { + const char* rootSection[] = {"realms", NULL}; + const char** rootsec = rootSection; + char **sections = NULL, **cpp = NULL, *value = NULL; + + char krb5_conf[MAX_PATH+1]; + + if (!khm_krb5_get_profile_file(krb5_conf,sizeof(krb5_conf))) { + profile_t profile; + long retval; + const char *filenames[2]; + wchar_t * d; + size_t cbsize; + size_t t; + + filenames[0] = krb5_conf; + filenames[1] = NULL; + retval = pprofile_init(filenames, &profile); + if (!retval) { + retval = pprofile_get_subsection_names(profile, rootsec, + §ions); + + if (!retval) + { + /* first figure out how much space to allocate */ + cbsize = 0; + for (cpp = sections; *cpp; cpp++) + { + cbsize += sizeof(wchar_t) * (strlen(*cpp) + 1); + } + cbsize += sizeof(wchar_t); /* double null terminated */ + + rlist = PMALLOC(cbsize); + d = rlist; + for (cpp = sections; *cpp; cpp++) + { + AnsiStrToUnicode(d, cbsize, *cpp); + t = wcslen(d) + 1; + d += t; + cbsize -= sizeof(wchar_t) * t; + } + *d = L'\0'; + } + + pprofile_free_list(sections); + +#if 0 + retval = pprofile_get_string(profile, "libdefaults","noaddresses", 0, "true", &value); + if ( value ) { + disable_noaddresses = config_boolean_to_int(value); + pprofile_release_string(value); + } +#endif + pprofile_release(profile); + } + } + } else { + FILE * file; + char krb_conf[MAX_PATH+1]; + char * p; + size_t cbsize, t; + wchar_t * d; + + if (!khm_get_krb4_con_file(krb_conf,sizeof(krb_conf)) && +#if _MSC_VER >= 1400 + !fopen_s(&file, krb_conf, "rt") +#else + (file = fopen(krb_conf, "rt")) +#endif + ) + { + char lineBuf[256]; + + /*TODO: compute the actual required buffer size instead of hardcoding */ + cbsize = 16384; // arbitrary + rlist = PMALLOC(cbsize); + d = rlist; + + // Skip the default realm + readstring(file,lineBuf,sizeof(lineBuf)); + + // Read the defined realms + while (TRUE) + { + if (readstring(file,lineBuf,sizeof(lineBuf)) < 0) + break; + + if (*(lineBuf + strlen(lineBuf) - 1) == '\r') + *(lineBuf + strlen(lineBuf) - 1) = 0; + + for (p=lineBuf; *p ; p++) + { + if (isspace(*p)) { + *p = 0; + break; + } + } + + if ( strncmp(".KERBEROS.OPTION.",lineBuf,17) ) { + t = strlen(lineBuf) + 1; + if(cbsize > (1 + t*sizeof(wchar_t))) { + AnsiStrToUnicode(d, cbsize, lineBuf); + d += t; + cbsize -= t * sizeof(wchar_t); + } else + break; + } + } + + *d = L'\0'; + + fclose(file); + } + } + + return rlist; +} + +/*! \internal + \brief Get the default realm + + A string will be returned that specifies the default realm. The + caller should free the string using free(). + + Returns NULL if the operation fails. +*/ +wchar_t * +khm_krb5_get_default_realm(void) +{ + wchar_t * realm; + size_t cch; + krb5_context ctx=0; + char * def = 0; + + pkrb5_init_context(&ctx); + pkrb5_get_default_realm(ctx,&def); + + if (def) { + cch = strlen(def) + 1; + realm = PMALLOC(sizeof(wchar_t) * cch); + AnsiStrToUnicode(realm, sizeof(wchar_t) * cch, def); + pkrb5_free_default_realm(ctx, def); + } else + realm = NULL; + + pkrb5_free_context(ctx); + + return realm; +} + +long +khm_krb5_set_default_realm(wchar_t * realm) { + krb5_context ctx=0; + char * def = 0; + long rv = 0; + char astr[K5_MAXCCH_REALM]; + + UnicodeStrToAnsi(astr, sizeof(astr), realm); + + pkrb5_init_context(&ctx); + pkrb5_get_default_realm(ctx,&def); + + if ((def && strcmp(def, astr)) || + !def) { + rv = pkrb5_set_default_realm(ctx, astr); + } + + if (def) { + pkrb5_free_default_realm(ctx, def); + } + + pkrb5_free_context(ctx); + + return rv; +} + +wchar_t * +khm_get_realm_from_princ(wchar_t * princ) { + wchar_t * t; + + if(!princ) + return NULL; + + for (t = princ; *t; t++) { + if(*t == L'\\') { /* escape */ + t++; + if(! *t) /* malformed */ + break; + } else if (*t == L'@') + break; + } + + if (*t == '@' && *(t+1) != L'\0') + return (t+1); + else + return NULL; +} + +long +khm_krb5_changepwd(char * principal, + char * password, + char * newpassword, + char** error_str) +{ + krb5_error_code rc = 0; + int result_code; + krb5_data result_code_string, result_string; + krb5_context context = 0; + krb5_principal princ = 0; + krb5_get_init_creds_opt opts; + krb5_creds creds; + + result_string.data = 0; + result_code_string.data = 0; + + if ( !pkrb5_init_context ) + goto cleanup; + + if (rc = pkrb5_init_context(&context)) { + goto cleanup; + } + + if (rc = pkrb5_parse_name(context, principal, &princ)) { + goto cleanup; + } + + pkrb5_get_init_creds_opt_init(&opts); + pkrb5_get_init_creds_opt_set_tkt_life(&opts, 5*60); + pkrb5_get_init_creds_opt_set_renew_life(&opts, 0); + pkrb5_get_init_creds_opt_set_forwardable(&opts, 0); + pkrb5_get_init_creds_opt_set_proxiable(&opts, 0); + pkrb5_get_init_creds_opt_set_address_list(&opts,NULL); + + if (rc = pkrb5_get_init_creds_password(context, &creds, princ, + password, 0, 0, 0, + "kadmin/changepw", &opts)) { + if (rc == KRB5KRB_AP_ERR_BAD_INTEGRITY) { +#if 0 + com_err(argv[0], 0, + "Password incorrect while getting initial ticket"); +#endif + } + else { +#if 0 + com_err(argv[0], ret, "getting initial ticket"); +#endif + } + goto cleanup; + } + + if (rc = pkrb5_change_password(context, &creds, newpassword, + &result_code, &result_code_string, + &result_string)) { +#if 0 + com_err(argv[0], ret, "changing password"); +#endif + goto cleanup; + } + + if (result_code) { + int len = result_code_string.length + + (result_string.length ? (sizeof(": ") - 1) : 0) + + result_string.length; + if (len && error_str) { + *error_str = PMALLOC(len + 1); + if (*error_str) + StringCchPrintfA(*error_str, len+1, + "%.*s%s%.*s", + result_code_string.length, + result_code_string.data, + result_string.length?": ":"", + result_string.length, + result_string.data); + } + rc = result_code; + goto cleanup; + } + + cleanup: + if (result_string.data) + pkrb5_free_data_contents(context, &result_string); + + if (result_code_string.data) + pkrb5_free_data_contents(context, &result_code_string); + + if (princ) + pkrb5_free_principal(context, princ); + + if (context) + pkrb5_free_context(context); + + return rc; +} + +khm_int32 KHMAPI +khm_krb5_creds_is_equal(khm_handle vcred1, khm_handle vcred2, void * dummy) { + if (kcdb_creds_comp_attr(vcred1, vcred2, KCDB_ATTR_LOCATION) || + kcdb_creds_comp_attr(vcred1, vcred2, attr_id_key_enctype) || + kcdb_creds_comp_attr(vcred1, vcred2, attr_id_tkt_enctype) || + kcdb_creds_comp_attr(vcred1, vcred2, attr_id_kvno)) + return 1; + else + return 0; +} --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/krb5funcs.h +++ krb5-1.4.4/src/windows/identity/plugins/krb5/krb5funcs.h @@ -1,133 +1,133 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/* Adapted from multiple Leash header files */ - -#ifndef __KHIMAIRA_KRB5FUNCS_H -#define __KHIMAIRA_KRB5FUNCS_H - -#include -#include - -#include -#define SECURITY_WIN32 -#include -#include - -#include - -#define LEASH_DEBUG_CLASS_GENERIC 0 -#define LEASH_DEBUG_CLASS_KRB4 1 -#define LEASH_DEBUG_CLASS_KRB4_APP 2 - -#define LEASH_PRIORITY_LOW 0 -#define LEASH_PRIORITY_HIGH 1 - -#define KRB5_DEFAULT_LIFE 60*60*10 /* 10 hours */ - -#define KRB5_MAXCCH_CCNAME 1024 - -// Function Prototypes. - -BOOL -khm_krb5_ms2mit(BOOL); - -int -khm_krb5_kinit(krb5_context alt_ctx, - char * principal_name, - char * password, - char * ccache, - krb5_deltat lifetime, - DWORD forwardable, - DWORD proxiable, - krb5_deltat renew_life, - DWORD addressless, - DWORD publicIP, - krb5_prompter_fct prompter, - void * p_data); - -long -khm_krb5_changepwd(char * principal, - char * password, - char * newpassword, - char** error_str); - -int -khm_krb5_destroy_by_credset(khm_handle p_cs); - -int -khm_krb5_destroy_identity(khm_handle identity); - -long -khm_convert524(krb5_context ctx); - -int -khm_krb5_renew_cred(khm_handle cred); - -int -khm_krb5_renew_ident(khm_handle identity); - -wchar_t * -khm_krb5_get_default_realm(void); - -long -khm_krb5_set_default_realm(wchar_t * realm); - -wchar_t * -khm_krb5_get_realm_list(void); - -long -khm_krb5_list_tickets(krb5_context *krbv5Context); - -long -khm_krb4_list_tickets(void); - -wchar_t * -khm_get_realm_from_princ(wchar_t * princ); - -long -khm_krb5_copy_ccache_by_name(krb5_context in_ctx, - wchar_t * wscc_dest, - wchar_t * wscc_src); - -long -khm_krb5_canon_cc_name(wchar_t * wcc_name, - size_t cb_cc_name); - -int -khm_krb5_cc_name_cmp(const wchar_t * cc_name_1, - const wchar_t * cc_name_2); - -BOOL -khm_krb5_get_profile_file(LPSTR confname, UINT szConfname); - -BOOL -khm_krb5_get_temp_profile_file(LPSTR confname, UINT szConfname); - -khm_int32 KHMAPI -khm_krb5_creds_is_equal(khm_handle vcred1, khm_handle vcred2, void * dummy); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/* Adapted from multiple Leash header files */ + +#ifndef __KHIMAIRA_KRB5FUNCS_H +#define __KHIMAIRA_KRB5FUNCS_H + +#include +#include + +#include +#define SECURITY_WIN32 +#include +#include + +#include + +#define LEASH_DEBUG_CLASS_GENERIC 0 +#define LEASH_DEBUG_CLASS_KRB4 1 +#define LEASH_DEBUG_CLASS_KRB4_APP 2 + +#define LEASH_PRIORITY_LOW 0 +#define LEASH_PRIORITY_HIGH 1 + +#define KRB5_DEFAULT_LIFE 60*60*10 /* 10 hours */ + +#define KRB5_MAXCCH_CCNAME 1024 + +// Function Prototypes. + +BOOL +khm_krb5_ms2mit(BOOL); + +int +khm_krb5_kinit(krb5_context alt_ctx, + char * principal_name, + char * password, + char * ccache, + krb5_deltat lifetime, + DWORD forwardable, + DWORD proxiable, + krb5_deltat renew_life, + DWORD addressless, + DWORD publicIP, + krb5_prompter_fct prompter, + void * p_data); + +long +khm_krb5_changepwd(char * principal, + char * password, + char * newpassword, + char** error_str); + +int +khm_krb5_destroy_by_credset(khm_handle p_cs); + +int +khm_krb5_destroy_identity(khm_handle identity); + +long +khm_convert524(krb5_context ctx); + +int +khm_krb5_renew_cred(khm_handle cred); + +int +khm_krb5_renew_ident(khm_handle identity); + +wchar_t * +khm_krb5_get_default_realm(void); + +long +khm_krb5_set_default_realm(wchar_t * realm); + +wchar_t * +khm_krb5_get_realm_list(void); + +long +khm_krb5_list_tickets(krb5_context *krbv5Context); + +long +khm_krb4_list_tickets(void); + +wchar_t * +khm_get_realm_from_princ(wchar_t * princ); + +long +khm_krb5_copy_ccache_by_name(krb5_context in_ctx, + wchar_t * wscc_dest, + wchar_t * wscc_src); + +long +khm_krb5_canon_cc_name(wchar_t * wcc_name, + size_t cb_cc_name); + +int +khm_krb5_cc_name_cmp(const wchar_t * cc_name_1, + const wchar_t * cc_name_2); + +BOOL +khm_krb5_get_profile_file(LPSTR confname, UINT szConfname); + +BOOL +khm_krb5_get_temp_profile_file(LPSTR confname, UINT szConfname); + +khm_int32 KHMAPI +khm_krb5_creds_is_equal(khm_handle vcred1, khm_handle vcred2, void * dummy); + +#endif --- krb5-1.4.4.orig/src/windows/identity/plugins/krb5/datarep.h +++ krb5-1.4.4/src/windows/identity/plugins/krb5/datarep.h @@ -1,76 +1,76 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KRB_DATAREP_H -#define __KHIMAIRA_KRB_DATAREP_H - -typedef struct tag_k5_serial_address { - khm_int32 magic; /* should be K5_SERIAL_ADDRESS_MAGIC */ - khm_int32 addrtype; /* Address type. We only know what to - do with ADDRTYPE_INET and - ADDRTYPE_INET6 */ - khm_size length; /* number of bytes of data in [data]. - This should always be greater than - sizeof(khm_int32) */ - khm_int32 data; /* actually, &data is the beginning of - the data buffer that is [length] - bytes long. */ -} k5_serial_address; - -#define K5_SERIAL_ADDRESS_MAGIC 0x44ce832d - -khm_int32 KHMAPI -enctype_toString(const void * data, khm_size cbdata, - wchar_t *destbuf, khm_size *pcbdestbuf, - khm_int32 flags); - -khm_int32 KHMAPI -addr_list_comp(const void *d1, khm_size cb_d1, - const void *d2, khm_size cb_d2); - -khm_int32 KHMAPI -addr_list_toString(const void *, khm_size, wchar_t *, - khm_size *, khm_int32); - -khm_int32 KHMAPI -krb5flags_toString(const void *, khm_size, wchar_t *, - khm_size *, khm_int32); - -khm_int32 KHMAPI -kvno_toString(const void * data, khm_size cbdata, - wchar_t *destbuf, khm_size *pcbdestbuf, - khm_int32 flags); - -khm_int32 KHMAPI -renew_for_cb(khm_handle cred, khm_int32 id, void * buffer, - khm_size * pcbsize); - -khm_int32 -serialize_krb5_addresses(krb5_address ** a, void * buf, size_t * pcbbuf); - -void -one_addr(k5_serial_address *a, wchar_t * buf, khm_size cbbuf); -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KRB_DATAREP_H +#define __KHIMAIRA_KRB_DATAREP_H + +typedef struct tag_k5_serial_address { + khm_int32 magic; /* should be K5_SERIAL_ADDRESS_MAGIC */ + khm_int32 addrtype; /* Address type. We only know what to + do with ADDRTYPE_INET and + ADDRTYPE_INET6 */ + khm_size length; /* number of bytes of data in [data]. + This should always be greater than + sizeof(khm_int32) */ + khm_int32 data; /* actually, &data is the beginning of + the data buffer that is [length] + bytes long. */ +} k5_serial_address; + +#define K5_SERIAL_ADDRESS_MAGIC 0x44ce832d + +khm_int32 KHMAPI +enctype_toString(const void * data, khm_size cbdata, + wchar_t *destbuf, khm_size *pcbdestbuf, + khm_int32 flags); + +khm_int32 KHMAPI +addr_list_comp(const void *d1, khm_size cb_d1, + const void *d2, khm_size cb_d2); + +khm_int32 KHMAPI +addr_list_toString(const void *, khm_size, wchar_t *, + khm_size *, khm_int32); + +khm_int32 KHMAPI +krb5flags_toString(const void *, khm_size, wchar_t *, + khm_size *, khm_int32); + +khm_int32 KHMAPI +kvno_toString(const void * data, khm_size cbdata, + wchar_t *destbuf, khm_size *pcbdestbuf, + khm_int32 flags); + +khm_int32 KHMAPI +renew_for_cb(khm_handle cred, khm_int32 id, void * buffer, + khm_size * pcbsize); + +khm_int32 +serialize_krb5_addresses(krb5_address ** a, void * buf, size_t * pcbbuf); + +void +one_addr(k5_serial_address *a, wchar_t * buf, khm_size cbbuf); +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/credset.h +++ krb5-1.4.4/src/windows/identity/kcreddb/credset.h @@ -1,75 +1,75 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCDB_CREDSET_H -#define __KHIMAIRA_KCDB_CREDSET_H - -/* credset */ - -typedef struct kcdb_credset_credref_t { - khm_int32 version; - kcdb_cred * cred; -} kcdb_credset_credref; - -typedef struct kcdb_credset_t { - khm_int32 magic; - khm_int32 flags; - CRITICAL_SECTION cs; - - kcdb_credset_credref * clist; - khm_int32 nc_clist; /* total capacity */ - khm_int32 nclist; /* current load */ - - khm_int32 version; /* data version */ - - khm_int32 seal_count; /* number of seals applied to the - credset */ - - struct kcdb_credset_t * next; - struct kcdb_credset_t * prev; -} kcdb_credset; - -#define KCDB_CREDSET_MAGIC 0x63a84f8b - -#define KCDB_CREDSET_FLAG_ROOT 1 - -/* the credset is in the process of being enumerated */ -#define KCDB_CREDSET_FLAG_ENUM 2 - -#define kcdb_credset_is_credset(c) ((c) && ((kcdb_credset *)c)->magic == KCDB_CREDSET_MAGIC) - -#define kcdb_credset_is_sealed(c) ((c)->seal_count != 0) - -#define KCDB_CREDSET_INITIAL_SIZE 256 -#define KCDB_CREDSET_GROWTH_FACTOR 256 - -void kcdb_credset_init(void); -void kcdb_credset_exit(void); -khm_int32 kcdb_credset_update_cred_ref( - khm_handle credset, - khm_handle cred); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCDB_CREDSET_H +#define __KHIMAIRA_KCDB_CREDSET_H + +/* credset */ + +typedef struct kcdb_credset_credref_t { + khm_int32 version; + kcdb_cred * cred; +} kcdb_credset_credref; + +typedef struct kcdb_credset_t { + khm_int32 magic; + khm_int32 flags; + CRITICAL_SECTION cs; + + kcdb_credset_credref * clist; + khm_int32 nc_clist; /* total capacity */ + khm_int32 nclist; /* current load */ + + khm_int32 version; /* data version */ + + khm_int32 seal_count; /* number of seals applied to the + credset */ + + struct kcdb_credset_t * next; + struct kcdb_credset_t * prev; +} kcdb_credset; + +#define KCDB_CREDSET_MAGIC 0x63a84f8b + +#define KCDB_CREDSET_FLAG_ROOT 1 + +/* the credset is in the process of being enumerated */ +#define KCDB_CREDSET_FLAG_ENUM 2 + +#define kcdb_credset_is_credset(c) ((c) && ((kcdb_credset *)c)->magic == KCDB_CREDSET_MAGIC) + +#define kcdb_credset_is_sealed(c) ((c)->seal_count != 0) + +#define KCDB_CREDSET_INITIAL_SIZE 256 +#define KCDB_CREDSET_GROWTH_FACTOR 256 + +void kcdb_credset_init(void); +void kcdb_credset_exit(void); +khm_int32 kcdb_credset_update_cred_ref( + khm_handle credset, + khm_handle cred); + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/resource.h +++ krb5-1.4.4/src/windows/identity/kcreddb/resource.h @@ -1,27 +1,27 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by kcreddb.rc -// -#define IDS_PROJNAME 100 -#define IDR_WMDMLOGGER 101 -#define IDS_LOG_SEV_INFO 201 -#define IDS_LOG_SEV_WARN 202 -#define IDS_LOG_SEV_ERROR 203 -#define IDS_LOG_DATETIME 204 -#define IDS_LOG_SRCNAME 205 -#define IDS_DEF_LOGFILE 301 -#define IDS_DEF_MAXSIZE 302 -#define IDS_DEF_SHRINKTOSIZE 303 -#define IDS_DEF_LOGENABLED 304 -#define IDS_MUTEX_TIMEOUT 401 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 201 -#define _APS_NEXT_COMMAND_VALUE 32768 -#define _APS_NEXT_CONTROL_VALUE 201 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by kcreddb.rc +// +#define IDS_PROJNAME 100 +#define IDR_WMDMLOGGER 101 +#define IDS_LOG_SEV_INFO 201 +#define IDS_LOG_SEV_WARN 202 +#define IDS_LOG_SEV_ERROR 203 +#define IDS_LOG_DATETIME 204 +#define IDS_LOG_SRCNAME 205 +#define IDS_DEF_LOGFILE 301 +#define IDS_DEF_MAXSIZE 302 +#define IDS_DEF_SHRINKTOSIZE 303 +#define IDS_DEF_LOGENABLED 304 +#define IDS_MUTEX_TIMEOUT 401 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 201 +#define _APS_NEXT_COMMAND_VALUE 32768 +#define _APS_NEXT_CONTROL_VALUE 201 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/init.c +++ krb5-1.4.4/src/windows/identity/kcreddb/init.c @@ -1,91 +1,91 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -/* set to TRUE when the configuration is loaded */ -static int kcdb_config_loaded = 0; - -/* global state cs */ -static CRITICAL_SECTION cs_kcdb_global; - -/* forward dcl */ -void KHMAPI kcdb_msg_completion(kmq_message * m); - -void kcdb_init(void) { - /* setup the critical sections */ - InitializeCriticalSection(&cs_kcdb_global); - - kmq_set_completion_handler(KMSG_KCDB, kcdb_msg_completion); - - kcdb_credtype_init(); - kcdbint_ident_init(); - kcdb_credset_init(); - kcdb_cred_init(); - kcdb_type_init(); - kcdb_attrib_init(); -} - -void kcdb_exit(void) { - - kcdb_attrib_exit(); - kcdb_type_exit(); - kcdb_cred_exit(); - kcdb_credset_exit(); - kcdbint_ident_exit(); - kcdb_credtype_exit(); - - kmq_set_completion_handler(KMSG_KCDB, NULL); - - DeleteCriticalSection(&cs_kcdb_global); -} - -khm_handle kcdb_get_config(void) { - khm_handle space = NULL; - - EnterCriticalSection(&cs_kcdb_global); - if(!kcdb_config_loaded) { - khc_load_schema(NULL, schema_kcdbconfig); - kcdb_config_loaded = 1; - } - khc_open_space(NULL, L"KCDB", 0, &space); - LeaveCriticalSection(&cs_kcdb_global); - - return space; -} - -void KHMAPI kcdb_msg_completion(kmq_message * m) { - if(!m) - return; - if(m->subtype == KMSG_KCDB_IDENT) - kcdbint_ident_msg_completion(m); - else if(m->subtype == KMSG_KCDB_ATTRIB) - kcdb_attrib_msg_completion(m); - else if(m->subtype == KMSG_KCDB_TYPE) - kcdb_type_msg_completion(m); - else if(m->subtype == KMSG_KCDB_CREDTYPE) - kcdb_credtype_msg_completion(m); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +/* set to TRUE when the configuration is loaded */ +static int kcdb_config_loaded = 0; + +/* global state cs */ +static CRITICAL_SECTION cs_kcdb_global; + +/* forward dcl */ +void KHMAPI kcdb_msg_completion(kmq_message * m); + +void kcdb_init(void) { + /* setup the critical sections */ + InitializeCriticalSection(&cs_kcdb_global); + + kmq_set_completion_handler(KMSG_KCDB, kcdb_msg_completion); + + kcdb_credtype_init(); + kcdbint_ident_init(); + kcdb_credset_init(); + kcdb_cred_init(); + kcdb_type_init(); + kcdb_attrib_init(); +} + +void kcdb_exit(void) { + + kcdb_attrib_exit(); + kcdb_type_exit(); + kcdb_cred_exit(); + kcdb_credset_exit(); + kcdbint_ident_exit(); + kcdb_credtype_exit(); + + kmq_set_completion_handler(KMSG_KCDB, NULL); + + DeleteCriticalSection(&cs_kcdb_global); +} + +khm_handle kcdb_get_config(void) { + khm_handle space = NULL; + + EnterCriticalSection(&cs_kcdb_global); + if(!kcdb_config_loaded) { + khc_load_schema(NULL, schema_kcdbconfig); + kcdb_config_loaded = 1; + } + khc_open_space(NULL, L"KCDB", 0, &space); + LeaveCriticalSection(&cs_kcdb_global); + + return space; +} + +void KHMAPI kcdb_msg_completion(kmq_message * m) { + if(!m) + return; + if(m->subtype == KMSG_KCDB_IDENT) + kcdbint_ident_msg_completion(m); + else if(m->subtype == KMSG_KCDB_ATTRIB) + kcdb_attrib_msg_completion(m); + else if(m->subtype == KMSG_KCDB_TYPE) + kcdb_type_msg_completion(m); + else if(m->subtype == KMSG_KCDB_CREDTYPE) + kcdb_credtype_msg_completion(m); +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/identity.h +++ krb5-1.4.4/src/windows/identity/kcreddb/identity.h @@ -1,60 +1,60 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCDB_IDENTITY_H -#define __KHIMAIRA_KCDB_IDENTITY_H - -/* Identity */ - -#define KCDB_IDENT_HASHTABLE_SIZE 31 - -typedef struct kcdb_identity_t { - khm_int32 magic; - wchar_t * name; - khm_int32 flags; - khm_int32 refcount; - kcdb_buf buf; - khm_ui_4 refresh_cycle; - LDCL(struct kcdb_identity_t); -} kcdb_identity; - -#define KCDB_IDENT_MAGIC 0x31938d4f - -extern hashtable * kcdb_identities_namemap; -extern khm_int32 kcdb_n_identities; -extern kcdb_identity * kcdb_identities; /* all identities */ -extern kcdb_identity * kcdb_def_identity; /* default identity */ -extern khm_ui_4 kcdb_ident_refresh_cycle; - -void kcdbint_ident_init(void); -void kcdbint_ident_exit(void); -void kcdbint_ident_msg_completion(kmq_message * m); -void kcdbint_ident_post_message(khm_int32 op, kcdb_identity * id); - -#define kcdb_is_identity(id) ((id) && ((kcdb_identity *)(id))->magic == KCDB_IDENT_MAGIC) -#define kcdb_is_active_identity(id) (kcdb_is_identity(id) && (((kcdb_identity *)(id))->flags & KCDB_IDENT_FLAG_ACTIVE)) - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCDB_IDENTITY_H +#define __KHIMAIRA_KCDB_IDENTITY_H + +/* Identity */ + +#define KCDB_IDENT_HASHTABLE_SIZE 31 + +typedef struct kcdb_identity_t { + khm_int32 magic; + wchar_t * name; + khm_int32 flags; + khm_int32 refcount; + kcdb_buf buf; + khm_ui_4 refresh_cycle; + LDCL(struct kcdb_identity_t); +} kcdb_identity; + +#define KCDB_IDENT_MAGIC 0x31938d4f + +extern hashtable * kcdb_identities_namemap; +extern khm_int32 kcdb_n_identities; +extern kcdb_identity * kcdb_identities; /* all identities */ +extern kcdb_identity * kcdb_def_identity; /* default identity */ +extern khm_ui_4 kcdb_ident_refresh_cycle; + +void kcdbint_ident_init(void); +void kcdbint_ident_exit(void); +void kcdbint_ident_msg_completion(kmq_message * m); +void kcdbint_ident_post_message(khm_int32 op, kcdb_identity * id); + +#define kcdb_is_identity(id) ((id) && ((kcdb_identity *)(id))->magic == KCDB_IDENT_MAGIC) +#define kcdb_is_active_identity(id) (kcdb_is_identity(id) && (((kcdb_identity *)(id))->flags & KCDB_IDENT_FLAG_ACTIVE)) + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/attrib.c +++ krb5-1.4.4/src/windows/identity/kcreddb/attrib.c @@ -1,878 +1,878 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -CRITICAL_SECTION cs_attrib; -hashtable * kcdb_attrib_namemap = NULL; -kcdb_attrib_i ** kcdb_attrib_tbl = NULL; -kcdb_attrib_i ** kcdb_property_tbl = NULL; -kcdb_attrib_i * kcdb_attribs = NULL; - -void -kcdb_attrib_add_ref_func(const void * key, void * va) -{ - kcdb_attrib_hold((kcdb_attrib_i *) va); -} - -void -kcdb_attrib_del_ref_func(const void * key, void * va) -{ - kcdb_attrib_release((kcdb_attrib_i *) va); -} - -void -kcdb_attrib_msg_completion(kmq_message * m) -{ - if(m && m->vparam) { - kcdb_attrib_release((kcdb_attrib_i *) m->vparam); - } -} - -khm_int32 -kcdb_attrib_hold(kcdb_attrib_i * ai) -{ - if(!ai) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_attrib); - ai->refcount++; - LeaveCriticalSection(&cs_attrib); - return KHM_ERROR_SUCCESS; -} - -khm_int32 -kcdb_attrib_release(kcdb_attrib_i * ai) -{ - if(!ai) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_attrib); - ai->refcount--; - LeaveCriticalSection(&cs_attrib); - return KHM_ERROR_SUCCESS; -} - -void -kcdb_attrib_post_message(khm_int32 op, kcdb_attrib_i * ai) -{ - kcdb_attrib_hold(ai); - kmq_post_message(KMSG_KCDB, KMSG_KCDB_ATTRIB, op, (void *) ai); -} - -khm_int32 KHMAPI -kcdb_attr_sys_cb(khm_handle vcred, - khm_int32 attr, - void * buf, - khm_size * pcb_buf) -{ - kcdb_cred * c; - - c = (kcdb_cred *) vcred; - - switch(attr) { - case KCDB_ATTR_NAME: - return kcdb_cred_get_name(vcred, buf, pcb_buf); - - case KCDB_ATTR_ID: - if(buf && *pcb_buf >= sizeof(khm_ui_8)) { - *pcb_buf = sizeof(khm_int64); - *((khm_ui_8 *) buf) = (khm_ui_8) c->identity; - return KHM_ERROR_SUCCESS; - } else { - *pcb_buf = sizeof(khm_ui_8); - return KHM_ERROR_TOO_LONG; - } - - case KCDB_ATTR_ID_NAME: - return kcdb_identity_get_name((khm_handle) c->identity, - (wchar_t *) buf, pcb_buf); - - case KCDB_ATTR_TYPE: - if(buf && *pcb_buf >= sizeof(khm_int32)) { - *pcb_buf = sizeof(khm_int32); - *((khm_int32 *) buf) = c->type; - return KHM_ERROR_SUCCESS; - } else { - *pcb_buf = sizeof(khm_int32); - return KHM_ERROR_TOO_LONG; - } - - case KCDB_ATTR_TYPE_NAME: - return kcdb_credtype_describe(c->type, buf, - pcb_buf, KCDB_TS_SHORT); - - case KCDB_ATTR_TIMELEFT: - { - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!buf || *pcb_buf < sizeof(FILETIME)) { - *pcb_buf = sizeof(FILETIME); - rv = KHM_ERROR_TOO_LONG; - } else if(!kcdb_cred_buf_exist(c,KCDB_ATTR_EXPIRE)) { - *pcb_buf = sizeof(FILETIME); - /* setting the timeleft to _I64_MAX has the - interpretation that this credential does not - expire, which is the default behavior if the - expiration time is not known */ - *((FILETIME *) buf) = IntToFt(_I64_MAX); - } else { - FILETIME ftc; - khm_int64 iftc; - - GetSystemTimeAsFileTime(&ftc); - iftc = FtToInt(&ftc); - - *((FILETIME *) buf) = - IntToFt(FtToInt((FILETIME *) - kcdb_cred_buf_get(c,KCDB_ATTR_EXPIRE)) - - iftc); - *pcb_buf = sizeof(FILETIME); - } - - return rv; - } - - case KCDB_ATTR_RENEW_TIMELEFT: - { - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!buf || *pcb_buf < sizeof(FILETIME)) { - *pcb_buf = sizeof(FILETIME); - rv = KHM_ERROR_TOO_LONG; - } else if(!kcdb_cred_buf_exist(c,KCDB_ATTR_RENEW_EXPIRE)) { - *pcb_buf = sizeof(FILETIME); - /* setting the timeleft to _I64_MAX has the - interpretation that this credential does not - expire, which is the default behavior if the - expiration time is not known */ - *((FILETIME *) buf) = IntToFt(_I64_MAX); - } else { - FILETIME ftc; - khm_int64 i_re; - khm_int64 i_ct; - - GetSystemTimeAsFileTime(&ftc); - - i_re = FtToInt(((FILETIME *) - kcdb_cred_buf_get(c, KCDB_ATTR_RENEW_EXPIRE))); - i_ct = FtToInt(&ftc); - - if (i_re > i_ct) - *((FILETIME *) buf) = - IntToFt(i_re - i_ct); - else - *((FILETIME *) buf) = - IntToFt(0); - - *pcb_buf = sizeof(FILETIME); - } - - return rv; - } - - case KCDB_ATTR_FLAGS: - if(buf && *pcb_buf >= sizeof(khm_int32)) { - *pcb_buf = sizeof(khm_int32); - *((khm_int32 *) buf) = c->flags; - return KHM_ERROR_SUCCESS; - } else { - *pcb_buf = sizeof(khm_int32); - return KHM_ERROR_TOO_LONG; - } - - default: - return KHM_ERROR_NOT_FOUND; - } -} - -void -kcdb_attrib_init(void) -{ - kcdb_attrib attrib; - wchar_t sbuf[256]; - - InitializeCriticalSection(&cs_attrib); - kcdb_attrib_namemap = - hash_new_hashtable(KCDB_ATTRIB_HASH_SIZE, - hash_string, - hash_string_comp, - kcdb_attrib_add_ref_func, - kcdb_attrib_del_ref_func); - - kcdb_attrib_tbl = - PMALLOC(sizeof(kcdb_attrib_i *) * (KCDB_ATTR_MAX_ID + 1)); - assert(kcdb_attrib_tbl != NULL); - ZeroMemory(kcdb_attrib_tbl, - sizeof(kcdb_attrib_i *) * (KCDB_ATTR_MAX_ID + 1)); - - kcdb_property_tbl = - PMALLOC(sizeof(kcdb_attrib_i *) * KCDB_ATTR_MAX_PROPS); - assert(kcdb_property_tbl != NULL); - ZeroMemory(kcdb_property_tbl, - sizeof(kcdb_attrib_i *) * KCDB_ATTR_MAX_PROPS); - - kcdb_attribs = NULL; - - /* register standard attributes */ - - /* Name */ - attrib.id = KCDB_ATTR_NAME; - attrib.name = KCDB_ATTRNAME_NAME; - attrib.type = KCDB_TYPE_STRING; - LoadString(hinst_kcreddb, IDS_NAME, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = - KCDB_ATTR_FLAG_REQUIRED | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(wchar_t); - attrib.compute_max_cbsize = KCDB_MAXCB_NAME; - - kcdb_attrib_register(&attrib, NULL); - - /* ID */ - attrib.id = KCDB_ATTR_ID; - attrib.name = KCDB_ATTRNAME_ID; - attrib.type = KCDB_TYPE_INT64; - LoadString(hinst_kcreddb, IDS_IDENTITY, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = - KCDB_ATTR_FLAG_REQUIRED | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_SYSTEM | - KCDB_ATTR_FLAG_HIDDEN; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(khm_int32); - attrib.compute_max_cbsize = sizeof(khm_int32); - - kcdb_attrib_register(&attrib, NULL); - - /* ID Name */ - attrib.id = KCDB_ATTR_ID_NAME; - attrib.alt_id = KCDB_ATTR_ID; - attrib.name = KCDB_ATTRNAME_ID_NAME; - attrib.type = KCDB_TYPE_STRING; - LoadString(hinst_kcreddb, IDS_IDENTITY, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = - KCDB_ATTR_FLAG_REQUIRED | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_ALTVIEW | - KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(wchar_t); - attrib.compute_max_cbsize = KCDB_IDENT_MAXCB_NAME; - - kcdb_attrib_register(&attrib, NULL); - - /* Type */ - attrib.id = KCDB_ATTR_TYPE; - attrib.name = KCDB_ATTRNAME_TYPE; - attrib.type = KCDB_TYPE_INT32; - LoadString(hinst_kcreddb, IDS_TYPE, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = - KCDB_ATTR_FLAG_REQUIRED | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_SYSTEM | - KCDB_ATTR_FLAG_HIDDEN; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(khm_int32); - attrib.compute_max_cbsize = sizeof(khm_int32); - - kcdb_attrib_register(&attrib, NULL); - - /* Type Name */ - attrib.id = KCDB_ATTR_TYPE_NAME; - attrib.alt_id = KCDB_ATTR_TYPE; - attrib.name = KCDB_ATTRNAME_TYPE_NAME; - attrib.type = KCDB_TYPE_STRING; - LoadString(hinst_kcreddb, IDS_TYPE, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = - KCDB_ATTR_FLAG_REQUIRED | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_ALTVIEW | - KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(wchar_t); - attrib.compute_max_cbsize = KCDB_MAXCB_NAME; - - kcdb_attrib_register(&attrib, NULL); - - /* Parent Name */ - attrib.id = KCDB_ATTR_PARENT_NAME; - attrib.name = KCDB_ATTRNAME_PARENT_NAME; - attrib.type = KCDB_TYPE_STRING; - LoadString(hinst_kcreddb, IDS_PARENT, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM | KCDB_ATTR_FLAG_HIDDEN; - attrib.compute_cb = NULL; - attrib.compute_min_cbsize = 0; - attrib.compute_max_cbsize = 0; - - kcdb_attrib_register(&attrib, NULL); - - /* Issed On */ - attrib.id = KCDB_ATTR_ISSUE; - attrib.name = KCDB_ATTRNAME_ISSUE; - attrib.type = KCDB_TYPE_DATE; - LoadString(hinst_kcreddb, IDS_ISSUED, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = NULL; - attrib.compute_min_cbsize = 0; - attrib.compute_max_cbsize = 0; - - kcdb_attrib_register(&attrib, NULL); - - /* Expires On */ - attrib.id = KCDB_ATTR_EXPIRE; - attrib.name = KCDB_ATTRNAME_EXPIRE; - attrib.type = KCDB_TYPE_DATE; - LoadString(hinst_kcreddb, IDS_EXPIRES, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = NULL; - attrib.compute_min_cbsize = 0; - attrib.compute_max_cbsize = 0; - - kcdb_attrib_register(&attrib, NULL); - - /* Renewable Time Expires On */ - attrib.id = KCDB_ATTR_RENEW_EXPIRE; - attrib.name = KCDB_ATTRNAME_RENEW_EXPIRE; - attrib.type = KCDB_TYPE_DATE; - LoadString(hinst_kcreddb, IDS_RENEW_EXPIRES, - sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = NULL; - attrib.compute_min_cbsize = 0; - attrib.compute_max_cbsize = 0; - - kcdb_attrib_register(&attrib, NULL); - - /* Time Left */ - attrib.id = KCDB_ATTR_TIMELEFT; - attrib.alt_id = KCDB_ATTR_EXPIRE; - attrib.name = KCDB_ATTRNAME_TIMELEFT; - attrib.type = KCDB_TYPE_INTERVAL; - LoadString(hinst_kcreddb, IDS_TIMELEFT, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_ALTVIEW | - KCDB_ATTR_FLAG_VOLATILE; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(FILETIME); - attrib.compute_max_cbsize = sizeof(FILETIME); - - kcdb_attrib_register(&attrib, NULL); - - /* Renewable Time Left */ - attrib.id = KCDB_ATTR_RENEW_TIMELEFT; - attrib.alt_id = KCDB_ATTR_RENEW_EXPIRE; - attrib.name = KCDB_ATTRNAME_RENEW_TIMELEFT; - attrib.type = KCDB_TYPE_INTERVAL; - LoadString(hinst_kcreddb, - IDS_RENEW_TIMELEFT, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_ALTVIEW | - KCDB_ATTR_FLAG_VOLATILE; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(FILETIME); - attrib.compute_max_cbsize = sizeof(FILETIME); - - kcdb_attrib_register(&attrib, NULL); - - /* Location of Credential */ - attrib.id = KCDB_ATTR_LOCATION; - attrib.name = KCDB_ATTRNAME_LOCATION; - attrib.type = KCDB_TYPE_STRING; - LoadString(hinst_kcreddb, IDS_LOCATION, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = NULL; - attrib.compute_min_cbsize = 0; - attrib.compute_max_cbsize = 0; - - kcdb_attrib_register(&attrib, NULL); - - /* Lifetime */ - attrib.id = KCDB_ATTR_LIFETIME; - attrib.name = KCDB_ATTRNAME_LIFETIME; - attrib.type = KCDB_TYPE_INTERVAL; - LoadString(hinst_kcreddb, IDS_LIFETIME, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = NULL; - attrib.compute_min_cbsize = 0; - attrib.compute_max_cbsize = 0; - - kcdb_attrib_register(&attrib, NULL); - - /* Renewable Lifetime */ - attrib.id = KCDB_ATTR_RENEW_LIFETIME; - attrib.name = KCDB_ATTRNAME_RENEW_LIFETIME; - attrib.type = KCDB_TYPE_INTERVAL; - LoadString(hinst_kcreddb, - IDS_RENEW_LIFETIME, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = KCDB_ATTR_FLAG_SYSTEM; - attrib.compute_cb = NULL; - attrib.compute_min_cbsize = 0; - attrib.compute_max_cbsize = 0; - - kcdb_attrib_register(&attrib, NULL); - - /* Flags */ - attrib.id = KCDB_ATTR_FLAGS; - attrib.name = KCDB_ATTRNAME_FLAGS; - attrib.type = KCDB_TYPE_INT32; - LoadString(hinst_kcreddb, IDS_FLAGS, sbuf, ARRAYLENGTH(sbuf)); - attrib.short_desc = sbuf; - attrib.long_desc = NULL; - attrib.flags = - KCDB_ATTR_FLAG_REQUIRED | - KCDB_ATTR_FLAG_COMPUTED | - KCDB_ATTR_FLAG_SYSTEM | - KCDB_ATTR_FLAG_HIDDEN; - attrib.compute_cb = kcdb_attr_sys_cb; - attrib.compute_min_cbsize = sizeof(khm_int32); - attrib.compute_max_cbsize = sizeof(khm_int32); - - kcdb_attrib_register(&attrib, NULL); -} - -void -kcdb_attrib_exit(void) -{ - DeleteCriticalSection(&cs_attrib); - - if(kcdb_attrib_tbl) - PFREE(kcdb_attrib_tbl); - - if(kcdb_property_tbl) - PFREE(kcdb_property_tbl); -} - -KHMEXP khm_int32 KHMAPI -kcdb_attrib_get_id(wchar_t *name, khm_int32 * id) -{ - kcdb_attrib_i * ai; - - if(!name) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_attrib); - ai = hash_lookup(kcdb_attrib_namemap, (void *) name); - LeaveCriticalSection(&cs_attrib); - - if(ai) { - *id = ai->attr.id; - return KHM_ERROR_SUCCESS; - } else { - *id = KCDB_ATTR_INVALID; - return KHM_ERROR_NOT_FOUND; - } -} - -KHMEXP khm_int32 KHMAPI -kcdb_attrib_register(kcdb_attrib * attrib, khm_int32 * new_id) -{ - kcdb_attrib_i * ai; - size_t cb_name; - size_t cb_short_desc; - size_t cb_long_desc; - khm_int32 attr_id; - khm_boolean prop = FALSE; - - if(!attrib || - KHM_FAILED(kcdb_type_get_info(attrib->type, NULL)) || - !attrib->name) - return KHM_ERROR_INVALID_PARAM; - - if(FAILED(StringCbLength(attrib->name, KCDB_MAXCB_NAME, &cb_name))) - return KHM_ERROR_TOO_LONG; - cb_name += sizeof(wchar_t); - - if(attrib->short_desc) { - if(FAILED(StringCbLength(attrib->short_desc, KCDB_MAXCB_SHORT_DESC, &cb_short_desc))) - return KHM_ERROR_TOO_LONG; - cb_short_desc += sizeof(wchar_t); - } else - cb_short_desc = 0; - - if(attrib->long_desc) { - if(FAILED(StringCbLength(attrib->long_desc, KCDB_MAXCB_LONG_DESC, &cb_long_desc))) - return KHM_ERROR_TOO_LONG; - cb_long_desc += sizeof(wchar_t); - } else - cb_long_desc = 0; - - if((attrib->flags & KCDB_ATTR_FLAG_COMPUTED) && - (!attrib->compute_cb || - attrib->compute_min_cbsize <= 0 || - attrib->compute_max_cbsize < attrib->compute_min_cbsize)) - return KHM_ERROR_INVALID_PARAM; - - if ((attrib->flags & KCDB_ATTR_FLAG_ALTVIEW) && - KHM_FAILED(kcdb_attrib_get_info(attrib->alt_id, - NULL))) - return KHM_ERROR_INVALID_PARAM; - - prop = !!(attrib->flags & KCDB_ATTR_FLAG_PROPERTY); - - EnterCriticalSection(&cs_attrib); - - if(!prop && - (attrib->id < 0 || attrib->id > KCDB_ATTR_MAX_ID)) - { - if(KHM_FAILED(kcdb_attrib_next_free_id(&attr_id))) { - LeaveCriticalSection(&cs_attrib); - return KHM_ERROR_NO_RESOURCES; - } - } else if (prop && - (attrib->id < KCDB_ATTR_MIN_PROP_ID || - attrib->id > KCDB_ATTR_MAX_PROP_ID)) { - - if(KHM_FAILED(kcdb_attrib_next_free_prop_id(&attr_id))) { - LeaveCriticalSection(&cs_attrib); - return KHM_ERROR_NO_RESOURCES; - } - - } else { - attr_id = attrib->id; - } - -#ifdef DEBUG - assert(!prop || (attr_id >= KCDB_ATTR_MIN_PROP_ID && attr_id <= KCDB_ATTR_MAX_PROP_ID)); - assert(prop || (attr_id >= 0 && attr_id <= KCDB_ATTR_MAX_ID)); -#endif - - if((!prop && kcdb_attrib_tbl[attr_id]) || - (prop && kcdb_property_tbl[attr_id - KCDB_ATTR_MIN_PROP_ID])) { - - LeaveCriticalSection(&cs_attrib); - return KHM_ERROR_DUPLICATE; - - } - - ai = PMALLOC(sizeof(kcdb_attrib_i)); - ZeroMemory(ai, sizeof(kcdb_attrib_i)); - - ai->attr.type = attrib->type; - ai->attr.id = attr_id; - ai->attr.alt_id = attrib->alt_id; - ai->attr.flags = attrib->flags; - ai->attr.compute_cb = attrib->compute_cb; - ai->attr.compute_max_cbsize = attrib->compute_max_cbsize; - ai->attr.compute_min_cbsize = attrib->compute_min_cbsize; - ai->attr.name = PMALLOC(cb_name); - StringCbCopy(ai->attr.name, cb_name, attrib->name); - if(cb_short_desc) { - ai->attr.short_desc = PMALLOC(cb_short_desc); - StringCbCopy(ai->attr.short_desc, cb_short_desc, attrib->short_desc); - } - if(cb_long_desc) { - ai->attr.long_desc = PMALLOC(cb_long_desc); - StringCbCopy(ai->attr.long_desc, cb_long_desc, attrib->long_desc); - } - - LINIT(ai); - - if(!prop) - kcdb_attrib_tbl[attr_id] = ai; - else - kcdb_property_tbl[attr_id - KCDB_ATTR_MIN_PROP_ID] = ai; - - LPUSH(&kcdb_attribs, ai); - - hash_add(kcdb_attrib_namemap, (void *) ai->attr.name, ai); - - LeaveCriticalSection(&cs_attrib); - - kcdb_attrib_post_message(KCDB_OP_INSERT, ai); - - if(new_id) - *new_id = attr_id; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_attrib_get_info( - khm_int32 id, - kcdb_attrib ** attrib) -{ - kcdb_attrib_i * ai; - khm_boolean prop; - - if(id >= 0 && id <= KCDB_ATTR_MAX_ID) - prop = FALSE; - else if(id >= KCDB_ATTR_MIN_PROP_ID && id <= KCDB_ATTR_MAX_PROP_ID) - prop = TRUE; - else - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_attrib); - if(prop) - ai = kcdb_property_tbl[id - KCDB_ATTR_MIN_PROP_ID]; - else - ai = kcdb_attrib_tbl[id]; - LeaveCriticalSection(&cs_attrib); - - if(ai) { - if(attrib) { - *attrib = &(ai->attr); - kcdb_attrib_hold(ai); - } - return KHM_ERROR_SUCCESS; - } else { - if(attrib) - *attrib = NULL; - return KHM_ERROR_NOT_FOUND; - } -} - -KHMEXP khm_int32 KHMAPI kcdb_attrib_release_info(kcdb_attrib * attrib) -{ - if(attrib) - kcdb_attrib_release((kcdb_attrib_i *) attrib); - return KHM_ERROR_SUCCESS; -} - - -KHMEXP khm_int32 KHMAPI kcdb_attrib_unregister(khm_int32 id) -{ - /*TODO: implement this */ - return KHM_ERROR_NOT_IMPLEMENTED; -} - -KHMEXP khm_int32 KHMAPI kcdb_attrib_describe( - khm_int32 id, - wchar_t * buffer, - khm_size * cbsize, - khm_int32 flags) -{ - kcdb_attrib_i * ai; - size_t cb_size = 0; - khm_boolean prop = FALSE; - - if(!cbsize) - return KHM_ERROR_INVALID_PARAM; - - if(id >= 0 && id <= KCDB_ATTR_MAX_ID) - prop = FALSE; - else if(id >= KCDB_ATTR_MIN_PROP_ID && id <= KCDB_ATTR_MAX_PROP_ID) - prop = TRUE; - else - return KHM_ERROR_INVALID_PARAM; - - if(prop) - ai = kcdb_property_tbl[id - KCDB_ATTR_MIN_PROP_ID]; - else - ai = kcdb_attrib_tbl[id]; - - if(!ai) - return KHM_ERROR_NOT_FOUND; - - if((flags & KCDB_TS_SHORT) && - ai->attr.short_desc) - { - if(FAILED(StringCbLength(ai->attr.short_desc, KCDB_MAXCB_SHORT_DESC, &cb_size))) - return KHM_ERROR_UNKNOWN; - cb_size += sizeof(wchar_t); - - if(!buffer || *cbsize < cb_size) { - *cbsize = cb_size; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *cbsize, ai->attr.short_desc); - - *cbsize = cb_size; - - return KHM_ERROR_SUCCESS; - } else { - if(FAILED(StringCbLength(ai->attr.long_desc, KCDB_MAXCB_LONG_DESC, &cb_size))) - return KHM_ERROR_UNKNOWN; - cb_size += sizeof(wchar_t); - - if(!buffer || *cbsize < cb_size) { - *cbsize = cb_size; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *cbsize, ai->attr.long_desc); - - *cbsize = cb_size; - - return KHM_ERROR_SUCCESS; - } -} - -khm_int32 kcdb_attrib_next_free_prop_id(khm_int32 * id) -{ - int i; - - if(!id) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_attrib); - for(i=0;i < KCDB_ATTR_MAX_PROPS; i++) { - if(!kcdb_property_tbl[i]) - break; - } - LeaveCriticalSection(&cs_attrib); - - if(i < KCDB_ATTR_MAX_PROPS) { - *id = i + KCDB_ATTR_MIN_PROP_ID; - return KHM_ERROR_SUCCESS; - } else { - *id = KCDB_ATTR_INVALID; - return KHM_ERROR_NO_RESOURCES; - } -} - -khm_int32 kcdb_attrib_next_free_id(khm_int32 * id) -{ - int i; - - if(!id) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_attrib); - for(i=0;i<= KCDB_ATTR_MAX_ID; i++) { - if(!kcdb_attrib_tbl[i]) - break; - } - LeaveCriticalSection(&cs_attrib); - - if(i <= KCDB_ATTR_MAX_ID) { - *id = i; - return KHM_ERROR_SUCCESS; - } else { - *id = KCDB_ATTR_INVALID; - return KHM_ERROR_NO_RESOURCES; - } -} - -KHMEXP khm_int32 KHMAPI kcdb_attrib_get_count( - khm_int32 and_flags, - khm_int32 eq_flags, - khm_size * pcount) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_size count = 0; - int i; - - if(pcount == NULL) - return KHM_ERROR_INVALID_PARAM; - - eq_flags &= and_flags; - - EnterCriticalSection(&cs_attrib); - for(i = 0; i <= KCDB_ATTR_MAX_ID; i++) { - if(kcdb_attrib_tbl[i] && - (kcdb_attrib_tbl[i]->attr.flags & and_flags) == eq_flags) - count++; - } - - for(i = 0; i < KCDB_ATTR_MAX_PROPS; i++) { - if(kcdb_property_tbl[i] && - (kcdb_property_tbl[i]->attr.flags & and_flags) == eq_flags) - count++; - } - LeaveCriticalSection(&cs_attrib); - - *pcount = count; - - return rv; -} - -KHMEXP khm_int32 KHMAPI kcdb_attrib_get_ids( - khm_int32 and_flags, - khm_int32 eq_flags, - khm_int32 * plist, - khm_size * pcsize) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_size count = 0; - int i; - - if(plist == NULL || pcsize == NULL) - return KHM_ERROR_INVALID_PARAM; - - eq_flags &= and_flags; - - EnterCriticalSection(&cs_attrib); - for(i = 0; i <= KCDB_ATTR_MAX_ID; i++) { - if(kcdb_attrib_tbl[i] && - (kcdb_attrib_tbl[i]->attr.flags & and_flags) == eq_flags) { - if(count >= *pcsize) { - rv = KHM_ERROR_TOO_LONG; - count++; - } else - plist[count++] = i; - } - } - - for(i = 0; i < KCDB_ATTR_MAX_PROPS; i++) { - if(kcdb_property_tbl[i] && - (kcdb_property_tbl[i]->attr.flags & and_flags) == eq_flags) { - if(count >= *pcsize) { - rv = KHM_ERROR_TOO_LONG; - count++; - } else - plist[count++] = i + KCDB_ATTR_MIN_PROP_ID; - } - } - LeaveCriticalSection(&cs_attrib); - - *pcsize = count; - - return rv; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +CRITICAL_SECTION cs_attrib; +hashtable * kcdb_attrib_namemap = NULL; +kcdb_attrib_i ** kcdb_attrib_tbl = NULL; +kcdb_attrib_i ** kcdb_property_tbl = NULL; +kcdb_attrib_i * kcdb_attribs = NULL; + +void +kcdb_attrib_add_ref_func(const void * key, void * va) +{ + kcdb_attrib_hold((kcdb_attrib_i *) va); +} + +void +kcdb_attrib_del_ref_func(const void * key, void * va) +{ + kcdb_attrib_release((kcdb_attrib_i *) va); +} + +void +kcdb_attrib_msg_completion(kmq_message * m) +{ + if(m && m->vparam) { + kcdb_attrib_release((kcdb_attrib_i *) m->vparam); + } +} + +khm_int32 +kcdb_attrib_hold(kcdb_attrib_i * ai) +{ + if(!ai) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_attrib); + ai->refcount++; + LeaveCriticalSection(&cs_attrib); + return KHM_ERROR_SUCCESS; +} + +khm_int32 +kcdb_attrib_release(kcdb_attrib_i * ai) +{ + if(!ai) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_attrib); + ai->refcount--; + LeaveCriticalSection(&cs_attrib); + return KHM_ERROR_SUCCESS; +} + +void +kcdb_attrib_post_message(khm_int32 op, kcdb_attrib_i * ai) +{ + kcdb_attrib_hold(ai); + kmq_post_message(KMSG_KCDB, KMSG_KCDB_ATTRIB, op, (void *) ai); +} + +khm_int32 KHMAPI +kcdb_attr_sys_cb(khm_handle vcred, + khm_int32 attr, + void * buf, + khm_size * pcb_buf) +{ + kcdb_cred * c; + + c = (kcdb_cred *) vcred; + + switch(attr) { + case KCDB_ATTR_NAME: + return kcdb_cred_get_name(vcred, buf, pcb_buf); + + case KCDB_ATTR_ID: + if(buf && *pcb_buf >= sizeof(khm_ui_8)) { + *pcb_buf = sizeof(khm_int64); + *((khm_ui_8 *) buf) = (khm_ui_8) c->identity; + return KHM_ERROR_SUCCESS; + } else { + *pcb_buf = sizeof(khm_ui_8); + return KHM_ERROR_TOO_LONG; + } + + case KCDB_ATTR_ID_NAME: + return kcdb_identity_get_name((khm_handle) c->identity, + (wchar_t *) buf, pcb_buf); + + case KCDB_ATTR_TYPE: + if(buf && *pcb_buf >= sizeof(khm_int32)) { + *pcb_buf = sizeof(khm_int32); + *((khm_int32 *) buf) = c->type; + return KHM_ERROR_SUCCESS; + } else { + *pcb_buf = sizeof(khm_int32); + return KHM_ERROR_TOO_LONG; + } + + case KCDB_ATTR_TYPE_NAME: + return kcdb_credtype_describe(c->type, buf, + pcb_buf, KCDB_TS_SHORT); + + case KCDB_ATTR_TIMELEFT: + { + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!buf || *pcb_buf < sizeof(FILETIME)) { + *pcb_buf = sizeof(FILETIME); + rv = KHM_ERROR_TOO_LONG; + } else if(!kcdb_cred_buf_exist(c,KCDB_ATTR_EXPIRE)) { + *pcb_buf = sizeof(FILETIME); + /* setting the timeleft to _I64_MAX has the + interpretation that this credential does not + expire, which is the default behavior if the + expiration time is not known */ + *((FILETIME *) buf) = IntToFt(_I64_MAX); + } else { + FILETIME ftc; + khm_int64 iftc; + + GetSystemTimeAsFileTime(&ftc); + iftc = FtToInt(&ftc); + + *((FILETIME *) buf) = + IntToFt(FtToInt((FILETIME *) + kcdb_cred_buf_get(c,KCDB_ATTR_EXPIRE)) + - iftc); + *pcb_buf = sizeof(FILETIME); + } + + return rv; + } + + case KCDB_ATTR_RENEW_TIMELEFT: + { + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!buf || *pcb_buf < sizeof(FILETIME)) { + *pcb_buf = sizeof(FILETIME); + rv = KHM_ERROR_TOO_LONG; + } else if(!kcdb_cred_buf_exist(c,KCDB_ATTR_RENEW_EXPIRE)) { + *pcb_buf = sizeof(FILETIME); + /* setting the timeleft to _I64_MAX has the + interpretation that this credential does not + expire, which is the default behavior if the + expiration time is not known */ + *((FILETIME *) buf) = IntToFt(_I64_MAX); + } else { + FILETIME ftc; + khm_int64 i_re; + khm_int64 i_ct; + + GetSystemTimeAsFileTime(&ftc); + + i_re = FtToInt(((FILETIME *) + kcdb_cred_buf_get(c, KCDB_ATTR_RENEW_EXPIRE))); + i_ct = FtToInt(&ftc); + + if (i_re > i_ct) + *((FILETIME *) buf) = + IntToFt(i_re - i_ct); + else + *((FILETIME *) buf) = + IntToFt(0); + + *pcb_buf = sizeof(FILETIME); + } + + return rv; + } + + case KCDB_ATTR_FLAGS: + if(buf && *pcb_buf >= sizeof(khm_int32)) { + *pcb_buf = sizeof(khm_int32); + *((khm_int32 *) buf) = c->flags; + return KHM_ERROR_SUCCESS; + } else { + *pcb_buf = sizeof(khm_int32); + return KHM_ERROR_TOO_LONG; + } + + default: + return KHM_ERROR_NOT_FOUND; + } +} + +void +kcdb_attrib_init(void) +{ + kcdb_attrib attrib; + wchar_t sbuf[256]; + + InitializeCriticalSection(&cs_attrib); + kcdb_attrib_namemap = + hash_new_hashtable(KCDB_ATTRIB_HASH_SIZE, + hash_string, + hash_string_comp, + kcdb_attrib_add_ref_func, + kcdb_attrib_del_ref_func); + + kcdb_attrib_tbl = + PMALLOC(sizeof(kcdb_attrib_i *) * (KCDB_ATTR_MAX_ID + 1)); + assert(kcdb_attrib_tbl != NULL); + ZeroMemory(kcdb_attrib_tbl, + sizeof(kcdb_attrib_i *) * (KCDB_ATTR_MAX_ID + 1)); + + kcdb_property_tbl = + PMALLOC(sizeof(kcdb_attrib_i *) * KCDB_ATTR_MAX_PROPS); + assert(kcdb_property_tbl != NULL); + ZeroMemory(kcdb_property_tbl, + sizeof(kcdb_attrib_i *) * KCDB_ATTR_MAX_PROPS); + + kcdb_attribs = NULL; + + /* register standard attributes */ + + /* Name */ + attrib.id = KCDB_ATTR_NAME; + attrib.name = KCDB_ATTRNAME_NAME; + attrib.type = KCDB_TYPE_STRING; + LoadString(hinst_kcreddb, IDS_NAME, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = + KCDB_ATTR_FLAG_REQUIRED | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(wchar_t); + attrib.compute_max_cbsize = KCDB_MAXCB_NAME; + + kcdb_attrib_register(&attrib, NULL); + + /* ID */ + attrib.id = KCDB_ATTR_ID; + attrib.name = KCDB_ATTRNAME_ID; + attrib.type = KCDB_TYPE_INT64; + LoadString(hinst_kcreddb, IDS_IDENTITY, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = + KCDB_ATTR_FLAG_REQUIRED | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_SYSTEM | + KCDB_ATTR_FLAG_HIDDEN; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(khm_int32); + attrib.compute_max_cbsize = sizeof(khm_int32); + + kcdb_attrib_register(&attrib, NULL); + + /* ID Name */ + attrib.id = KCDB_ATTR_ID_NAME; + attrib.alt_id = KCDB_ATTR_ID; + attrib.name = KCDB_ATTRNAME_ID_NAME; + attrib.type = KCDB_TYPE_STRING; + LoadString(hinst_kcreddb, IDS_IDENTITY, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = + KCDB_ATTR_FLAG_REQUIRED | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_ALTVIEW | + KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(wchar_t); + attrib.compute_max_cbsize = KCDB_IDENT_MAXCB_NAME; + + kcdb_attrib_register(&attrib, NULL); + + /* Type */ + attrib.id = KCDB_ATTR_TYPE; + attrib.name = KCDB_ATTRNAME_TYPE; + attrib.type = KCDB_TYPE_INT32; + LoadString(hinst_kcreddb, IDS_TYPE, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = + KCDB_ATTR_FLAG_REQUIRED | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_SYSTEM | + KCDB_ATTR_FLAG_HIDDEN; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(khm_int32); + attrib.compute_max_cbsize = sizeof(khm_int32); + + kcdb_attrib_register(&attrib, NULL); + + /* Type Name */ + attrib.id = KCDB_ATTR_TYPE_NAME; + attrib.alt_id = KCDB_ATTR_TYPE; + attrib.name = KCDB_ATTRNAME_TYPE_NAME; + attrib.type = KCDB_TYPE_STRING; + LoadString(hinst_kcreddb, IDS_TYPE, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = + KCDB_ATTR_FLAG_REQUIRED | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_ALTVIEW | + KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(wchar_t); + attrib.compute_max_cbsize = KCDB_MAXCB_NAME; + + kcdb_attrib_register(&attrib, NULL); + + /* Parent Name */ + attrib.id = KCDB_ATTR_PARENT_NAME; + attrib.name = KCDB_ATTRNAME_PARENT_NAME; + attrib.type = KCDB_TYPE_STRING; + LoadString(hinst_kcreddb, IDS_PARENT, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM | KCDB_ATTR_FLAG_HIDDEN; + attrib.compute_cb = NULL; + attrib.compute_min_cbsize = 0; + attrib.compute_max_cbsize = 0; + + kcdb_attrib_register(&attrib, NULL); + + /* Issed On */ + attrib.id = KCDB_ATTR_ISSUE; + attrib.name = KCDB_ATTRNAME_ISSUE; + attrib.type = KCDB_TYPE_DATE; + LoadString(hinst_kcreddb, IDS_ISSUED, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = NULL; + attrib.compute_min_cbsize = 0; + attrib.compute_max_cbsize = 0; + + kcdb_attrib_register(&attrib, NULL); + + /* Expires On */ + attrib.id = KCDB_ATTR_EXPIRE; + attrib.name = KCDB_ATTRNAME_EXPIRE; + attrib.type = KCDB_TYPE_DATE; + LoadString(hinst_kcreddb, IDS_EXPIRES, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = NULL; + attrib.compute_min_cbsize = 0; + attrib.compute_max_cbsize = 0; + + kcdb_attrib_register(&attrib, NULL); + + /* Renewable Time Expires On */ + attrib.id = KCDB_ATTR_RENEW_EXPIRE; + attrib.name = KCDB_ATTRNAME_RENEW_EXPIRE; + attrib.type = KCDB_TYPE_DATE; + LoadString(hinst_kcreddb, IDS_RENEW_EXPIRES, + sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = NULL; + attrib.compute_min_cbsize = 0; + attrib.compute_max_cbsize = 0; + + kcdb_attrib_register(&attrib, NULL); + + /* Time Left */ + attrib.id = KCDB_ATTR_TIMELEFT; + attrib.alt_id = KCDB_ATTR_EXPIRE; + attrib.name = KCDB_ATTRNAME_TIMELEFT; + attrib.type = KCDB_TYPE_INTERVAL; + LoadString(hinst_kcreddb, IDS_TIMELEFT, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_ALTVIEW | + KCDB_ATTR_FLAG_VOLATILE; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(FILETIME); + attrib.compute_max_cbsize = sizeof(FILETIME); + + kcdb_attrib_register(&attrib, NULL); + + /* Renewable Time Left */ + attrib.id = KCDB_ATTR_RENEW_TIMELEFT; + attrib.alt_id = KCDB_ATTR_RENEW_EXPIRE; + attrib.name = KCDB_ATTRNAME_RENEW_TIMELEFT; + attrib.type = KCDB_TYPE_INTERVAL; + LoadString(hinst_kcreddb, + IDS_RENEW_TIMELEFT, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_ALTVIEW | + KCDB_ATTR_FLAG_VOLATILE; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(FILETIME); + attrib.compute_max_cbsize = sizeof(FILETIME); + + kcdb_attrib_register(&attrib, NULL); + + /* Location of Credential */ + attrib.id = KCDB_ATTR_LOCATION; + attrib.name = KCDB_ATTRNAME_LOCATION; + attrib.type = KCDB_TYPE_STRING; + LoadString(hinst_kcreddb, IDS_LOCATION, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = NULL; + attrib.compute_min_cbsize = 0; + attrib.compute_max_cbsize = 0; + + kcdb_attrib_register(&attrib, NULL); + + /* Lifetime */ + attrib.id = KCDB_ATTR_LIFETIME; + attrib.name = KCDB_ATTRNAME_LIFETIME; + attrib.type = KCDB_TYPE_INTERVAL; + LoadString(hinst_kcreddb, IDS_LIFETIME, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = NULL; + attrib.compute_min_cbsize = 0; + attrib.compute_max_cbsize = 0; + + kcdb_attrib_register(&attrib, NULL); + + /* Renewable Lifetime */ + attrib.id = KCDB_ATTR_RENEW_LIFETIME; + attrib.name = KCDB_ATTRNAME_RENEW_LIFETIME; + attrib.type = KCDB_TYPE_INTERVAL; + LoadString(hinst_kcreddb, + IDS_RENEW_LIFETIME, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = KCDB_ATTR_FLAG_SYSTEM; + attrib.compute_cb = NULL; + attrib.compute_min_cbsize = 0; + attrib.compute_max_cbsize = 0; + + kcdb_attrib_register(&attrib, NULL); + + /* Flags */ + attrib.id = KCDB_ATTR_FLAGS; + attrib.name = KCDB_ATTRNAME_FLAGS; + attrib.type = KCDB_TYPE_INT32; + LoadString(hinst_kcreddb, IDS_FLAGS, sbuf, ARRAYLENGTH(sbuf)); + attrib.short_desc = sbuf; + attrib.long_desc = NULL; + attrib.flags = + KCDB_ATTR_FLAG_REQUIRED | + KCDB_ATTR_FLAG_COMPUTED | + KCDB_ATTR_FLAG_SYSTEM | + KCDB_ATTR_FLAG_HIDDEN; + attrib.compute_cb = kcdb_attr_sys_cb; + attrib.compute_min_cbsize = sizeof(khm_int32); + attrib.compute_max_cbsize = sizeof(khm_int32); + + kcdb_attrib_register(&attrib, NULL); +} + +void +kcdb_attrib_exit(void) +{ + DeleteCriticalSection(&cs_attrib); + + if(kcdb_attrib_tbl) + PFREE(kcdb_attrib_tbl); + + if(kcdb_property_tbl) + PFREE(kcdb_property_tbl); +} + +KHMEXP khm_int32 KHMAPI +kcdb_attrib_get_id(wchar_t *name, khm_int32 * id) +{ + kcdb_attrib_i * ai; + + if(!name) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_attrib); + ai = hash_lookup(kcdb_attrib_namemap, (void *) name); + LeaveCriticalSection(&cs_attrib); + + if(ai) { + *id = ai->attr.id; + return KHM_ERROR_SUCCESS; + } else { + *id = KCDB_ATTR_INVALID; + return KHM_ERROR_NOT_FOUND; + } +} + +KHMEXP khm_int32 KHMAPI +kcdb_attrib_register(kcdb_attrib * attrib, khm_int32 * new_id) +{ + kcdb_attrib_i * ai; + size_t cb_name; + size_t cb_short_desc; + size_t cb_long_desc; + khm_int32 attr_id; + khm_boolean prop = FALSE; + + if(!attrib || + KHM_FAILED(kcdb_type_get_info(attrib->type, NULL)) || + !attrib->name) + return KHM_ERROR_INVALID_PARAM; + + if(FAILED(StringCbLength(attrib->name, KCDB_MAXCB_NAME, &cb_name))) + return KHM_ERROR_TOO_LONG; + cb_name += sizeof(wchar_t); + + if(attrib->short_desc) { + if(FAILED(StringCbLength(attrib->short_desc, KCDB_MAXCB_SHORT_DESC, &cb_short_desc))) + return KHM_ERROR_TOO_LONG; + cb_short_desc += sizeof(wchar_t); + } else + cb_short_desc = 0; + + if(attrib->long_desc) { + if(FAILED(StringCbLength(attrib->long_desc, KCDB_MAXCB_LONG_DESC, &cb_long_desc))) + return KHM_ERROR_TOO_LONG; + cb_long_desc += sizeof(wchar_t); + } else + cb_long_desc = 0; + + if((attrib->flags & KCDB_ATTR_FLAG_COMPUTED) && + (!attrib->compute_cb || + attrib->compute_min_cbsize <= 0 || + attrib->compute_max_cbsize < attrib->compute_min_cbsize)) + return KHM_ERROR_INVALID_PARAM; + + if ((attrib->flags & KCDB_ATTR_FLAG_ALTVIEW) && + KHM_FAILED(kcdb_attrib_get_info(attrib->alt_id, + NULL))) + return KHM_ERROR_INVALID_PARAM; + + prop = !!(attrib->flags & KCDB_ATTR_FLAG_PROPERTY); + + EnterCriticalSection(&cs_attrib); + + if(!prop && + (attrib->id < 0 || attrib->id > KCDB_ATTR_MAX_ID)) + { + if(KHM_FAILED(kcdb_attrib_next_free_id(&attr_id))) { + LeaveCriticalSection(&cs_attrib); + return KHM_ERROR_NO_RESOURCES; + } + } else if (prop && + (attrib->id < KCDB_ATTR_MIN_PROP_ID || + attrib->id > KCDB_ATTR_MAX_PROP_ID)) { + + if(KHM_FAILED(kcdb_attrib_next_free_prop_id(&attr_id))) { + LeaveCriticalSection(&cs_attrib); + return KHM_ERROR_NO_RESOURCES; + } + + } else { + attr_id = attrib->id; + } + +#ifdef DEBUG + assert(!prop || (attr_id >= KCDB_ATTR_MIN_PROP_ID && attr_id <= KCDB_ATTR_MAX_PROP_ID)); + assert(prop || (attr_id >= 0 && attr_id <= KCDB_ATTR_MAX_ID)); +#endif + + if((!prop && kcdb_attrib_tbl[attr_id]) || + (prop && kcdb_property_tbl[attr_id - KCDB_ATTR_MIN_PROP_ID])) { + + LeaveCriticalSection(&cs_attrib); + return KHM_ERROR_DUPLICATE; + + } + + ai = PMALLOC(sizeof(kcdb_attrib_i)); + ZeroMemory(ai, sizeof(kcdb_attrib_i)); + + ai->attr.type = attrib->type; + ai->attr.id = attr_id; + ai->attr.alt_id = attrib->alt_id; + ai->attr.flags = attrib->flags; + ai->attr.compute_cb = attrib->compute_cb; + ai->attr.compute_max_cbsize = attrib->compute_max_cbsize; + ai->attr.compute_min_cbsize = attrib->compute_min_cbsize; + ai->attr.name = PMALLOC(cb_name); + StringCbCopy(ai->attr.name, cb_name, attrib->name); + if(cb_short_desc) { + ai->attr.short_desc = PMALLOC(cb_short_desc); + StringCbCopy(ai->attr.short_desc, cb_short_desc, attrib->short_desc); + } + if(cb_long_desc) { + ai->attr.long_desc = PMALLOC(cb_long_desc); + StringCbCopy(ai->attr.long_desc, cb_long_desc, attrib->long_desc); + } + + LINIT(ai); + + if(!prop) + kcdb_attrib_tbl[attr_id] = ai; + else + kcdb_property_tbl[attr_id - KCDB_ATTR_MIN_PROP_ID] = ai; + + LPUSH(&kcdb_attribs, ai); + + hash_add(kcdb_attrib_namemap, (void *) ai->attr.name, ai); + + LeaveCriticalSection(&cs_attrib); + + kcdb_attrib_post_message(KCDB_OP_INSERT, ai); + + if(new_id) + *new_id = attr_id; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_attrib_get_info( + khm_int32 id, + kcdb_attrib ** attrib) +{ + kcdb_attrib_i * ai; + khm_boolean prop; + + if(id >= 0 && id <= KCDB_ATTR_MAX_ID) + prop = FALSE; + else if(id >= KCDB_ATTR_MIN_PROP_ID && id <= KCDB_ATTR_MAX_PROP_ID) + prop = TRUE; + else + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_attrib); + if(prop) + ai = kcdb_property_tbl[id - KCDB_ATTR_MIN_PROP_ID]; + else + ai = kcdb_attrib_tbl[id]; + LeaveCriticalSection(&cs_attrib); + + if(ai) { + if(attrib) { + *attrib = &(ai->attr); + kcdb_attrib_hold(ai); + } + return KHM_ERROR_SUCCESS; + } else { + if(attrib) + *attrib = NULL; + return KHM_ERROR_NOT_FOUND; + } +} + +KHMEXP khm_int32 KHMAPI kcdb_attrib_release_info(kcdb_attrib * attrib) +{ + if(attrib) + kcdb_attrib_release((kcdb_attrib_i *) attrib); + return KHM_ERROR_SUCCESS; +} + + +KHMEXP khm_int32 KHMAPI kcdb_attrib_unregister(khm_int32 id) +{ + /*TODO: implement this */ + return KHM_ERROR_NOT_IMPLEMENTED; +} + +KHMEXP khm_int32 KHMAPI kcdb_attrib_describe( + khm_int32 id, + wchar_t * buffer, + khm_size * cbsize, + khm_int32 flags) +{ + kcdb_attrib_i * ai; + size_t cb_size = 0; + khm_boolean prop = FALSE; + + if(!cbsize) + return KHM_ERROR_INVALID_PARAM; + + if(id >= 0 && id <= KCDB_ATTR_MAX_ID) + prop = FALSE; + else if(id >= KCDB_ATTR_MIN_PROP_ID && id <= KCDB_ATTR_MAX_PROP_ID) + prop = TRUE; + else + return KHM_ERROR_INVALID_PARAM; + + if(prop) + ai = kcdb_property_tbl[id - KCDB_ATTR_MIN_PROP_ID]; + else + ai = kcdb_attrib_tbl[id]; + + if(!ai) + return KHM_ERROR_NOT_FOUND; + + if((flags & KCDB_TS_SHORT) && + ai->attr.short_desc) + { + if(FAILED(StringCbLength(ai->attr.short_desc, KCDB_MAXCB_SHORT_DESC, &cb_size))) + return KHM_ERROR_UNKNOWN; + cb_size += sizeof(wchar_t); + + if(!buffer || *cbsize < cb_size) { + *cbsize = cb_size; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *cbsize, ai->attr.short_desc); + + *cbsize = cb_size; + + return KHM_ERROR_SUCCESS; + } else { + if(FAILED(StringCbLength(ai->attr.long_desc, KCDB_MAXCB_LONG_DESC, &cb_size))) + return KHM_ERROR_UNKNOWN; + cb_size += sizeof(wchar_t); + + if(!buffer || *cbsize < cb_size) { + *cbsize = cb_size; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *cbsize, ai->attr.long_desc); + + *cbsize = cb_size; + + return KHM_ERROR_SUCCESS; + } +} + +khm_int32 kcdb_attrib_next_free_prop_id(khm_int32 * id) +{ + int i; + + if(!id) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_attrib); + for(i=0;i < KCDB_ATTR_MAX_PROPS; i++) { + if(!kcdb_property_tbl[i]) + break; + } + LeaveCriticalSection(&cs_attrib); + + if(i < KCDB_ATTR_MAX_PROPS) { + *id = i + KCDB_ATTR_MIN_PROP_ID; + return KHM_ERROR_SUCCESS; + } else { + *id = KCDB_ATTR_INVALID; + return KHM_ERROR_NO_RESOURCES; + } +} + +khm_int32 kcdb_attrib_next_free_id(khm_int32 * id) +{ + int i; + + if(!id) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_attrib); + for(i=0;i<= KCDB_ATTR_MAX_ID; i++) { + if(!kcdb_attrib_tbl[i]) + break; + } + LeaveCriticalSection(&cs_attrib); + + if(i <= KCDB_ATTR_MAX_ID) { + *id = i; + return KHM_ERROR_SUCCESS; + } else { + *id = KCDB_ATTR_INVALID; + return KHM_ERROR_NO_RESOURCES; + } +} + +KHMEXP khm_int32 KHMAPI kcdb_attrib_get_count( + khm_int32 and_flags, + khm_int32 eq_flags, + khm_size * pcount) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_size count = 0; + int i; + + if(pcount == NULL) + return KHM_ERROR_INVALID_PARAM; + + eq_flags &= and_flags; + + EnterCriticalSection(&cs_attrib); + for(i = 0; i <= KCDB_ATTR_MAX_ID; i++) { + if(kcdb_attrib_tbl[i] && + (kcdb_attrib_tbl[i]->attr.flags & and_flags) == eq_flags) + count++; + } + + for(i = 0; i < KCDB_ATTR_MAX_PROPS; i++) { + if(kcdb_property_tbl[i] && + (kcdb_property_tbl[i]->attr.flags & and_flags) == eq_flags) + count++; + } + LeaveCriticalSection(&cs_attrib); + + *pcount = count; + + return rv; +} + +KHMEXP khm_int32 KHMAPI kcdb_attrib_get_ids( + khm_int32 and_flags, + khm_int32 eq_flags, + khm_int32 * plist, + khm_size * pcsize) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_size count = 0; + int i; + + if(plist == NULL || pcsize == NULL) + return KHM_ERROR_INVALID_PARAM; + + eq_flags &= and_flags; + + EnterCriticalSection(&cs_attrib); + for(i = 0; i <= KCDB_ATTR_MAX_ID; i++) { + if(kcdb_attrib_tbl[i] && + (kcdb_attrib_tbl[i]->attr.flags & and_flags) == eq_flags) { + if(count >= *pcsize) { + rv = KHM_ERROR_TOO_LONG; + count++; + } else + plist[count++] = i; + } + } + + for(i = 0; i < KCDB_ATTR_MAX_PROPS; i++) { + if(kcdb_property_tbl[i] && + (kcdb_property_tbl[i]->attr.flags & and_flags) == eq_flags) { + if(count >= *pcsize) { + rv = KHM_ERROR_TOO_LONG; + count++; + } else + plist[count++] = i + KCDB_ATTR_MIN_PROP_ID; + } + } + LeaveCriticalSection(&cs_attrib); + + *pcsize = count; + + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/buf.h +++ krb5-1.4.4/src/windows/identity/kcreddb/buf.h @@ -1,78 +1,78 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCDB_BUF_H -#define __KHIMAIRA_KCDB_BUF_H - -typedef struct tag_kcdb_buf_field { - khm_ui_2 id; - khm_ui_2 flags; - khm_ui_4 offset; - khm_ui_4 cbsize; -} kcdb_buf_field; - -#define KCDB_CREDF_FLAG_EMPTY 0 -#define KCDB_CREDF_FLAG_DATA 1 -#define KCDB_CREDF_FLAG_INLINE 2 -#define KCDB_CREDF_FLAG_ALLOCD 4 - -#define KCDB_BUFF_ID_INVALID 0xffff - -typedef struct tag_kcdb_buf { - void * buffer; - khm_size cb_buffer; - khm_size cb_used; - - kcdb_buf_field * fields; - khm_size n_fields; - khm_size nc_fields; -} kcdb_buf; - -#define KCDB_BUF_CBBUF_INITIAL 4096 -#define KCDB_BUF_CBBUF_GROWTH 4096 -#define KCDB_BUF_FIELDS_INITIAL 16 -#define KCDB_BUF_FIELDS_GROWTH 16 - -#define KCDB_BUF_APPEND 0x8000 - -#define KCDB_BUF_INVALID_SLOT 0xf0000000 -#define KCDB_BUF_DEFAULT 0xe0000000 - -#define KCDB_BUF_MAX_SLOTS 0x00004000 - -void kcdb_buf_new(kcdb_buf * buf, khm_size n_slots); -void kcdb_buf_delete(kcdb_buf * buf); -void kcdb_buf_alloc(kcdb_buf * buf, khm_size slot, khm_ui_2 id, khm_size cbsize); -void kcdb_buf_dup(kcdb_buf * dest, const kcdb_buf * src); -void kcdb_buf_set_value(kcdb_buf * buf, khm_size slot, khm_ui_2 id, void * src, khm_size cb_src); -int kcdb_buf_exist(kcdb_buf * buf, khm_size slot); -int kcdb_buf_val_exist(kcdb_buf * buf, khm_size slot); -void * kcdb_buf_get(kcdb_buf * buf, khm_size slot); -khm_size kcdb_buf_size(kcdb_buf * buf, khm_size slot); -void kcdb_buf_set_value_flag(kcdb_buf * buf, khm_size slot); -khm_size kcdb_buf_slot_by_id(kcdb_buf * buf, khm_ui_2 id); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCDB_BUF_H +#define __KHIMAIRA_KCDB_BUF_H + +typedef struct tag_kcdb_buf_field { + khm_ui_2 id; + khm_ui_2 flags; + khm_ui_4 offset; + khm_ui_4 cbsize; +} kcdb_buf_field; + +#define KCDB_CREDF_FLAG_EMPTY 0 +#define KCDB_CREDF_FLAG_DATA 1 +#define KCDB_CREDF_FLAG_INLINE 2 +#define KCDB_CREDF_FLAG_ALLOCD 4 + +#define KCDB_BUFF_ID_INVALID 0xffff + +typedef struct tag_kcdb_buf { + void * buffer; + khm_size cb_buffer; + khm_size cb_used; + + kcdb_buf_field * fields; + khm_size n_fields; + khm_size nc_fields; +} kcdb_buf; + +#define KCDB_BUF_CBBUF_INITIAL 4096 +#define KCDB_BUF_CBBUF_GROWTH 4096 +#define KCDB_BUF_FIELDS_INITIAL 16 +#define KCDB_BUF_FIELDS_GROWTH 16 + +#define KCDB_BUF_APPEND 0x8000 + +#define KCDB_BUF_INVALID_SLOT 0xf0000000 +#define KCDB_BUF_DEFAULT 0xe0000000 + +#define KCDB_BUF_MAX_SLOTS 0x00004000 + +void kcdb_buf_new(kcdb_buf * buf, khm_size n_slots); +void kcdb_buf_delete(kcdb_buf * buf); +void kcdb_buf_alloc(kcdb_buf * buf, khm_size slot, khm_ui_2 id, khm_size cbsize); +void kcdb_buf_dup(kcdb_buf * dest, const kcdb_buf * src); +void kcdb_buf_set_value(kcdb_buf * buf, khm_size slot, khm_ui_2 id, void * src, khm_size cb_src); +int kcdb_buf_exist(kcdb_buf * buf, khm_size slot); +int kcdb_buf_val_exist(kcdb_buf * buf, khm_size slot); +void * kcdb_buf_get(kcdb_buf * buf, khm_size slot); +khm_size kcdb_buf_size(kcdb_buf * buf, khm_size slot); +void kcdb_buf_set_value_flag(kcdb_buf * buf, khm_size slot); +khm_size kcdb_buf_slot_by_id(kcdb_buf * buf, khm_ui_2 id); + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/attrib.h +++ krb5-1.4.4/src/windows/identity/kcreddb/attrib.h @@ -1,55 +1,55 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCDB_ATTRIB_H -#define __KHIMAIRA_KCDB_ATTRIB_H - -/* Attributes */ - -typedef struct kcdb_attrib_i_t { - kcdb_attrib attr; - - khm_int32 refcount; - - struct kcdb_attrib_i_t * next; - struct kcdb_attrib_i_t * prev; -} kcdb_attrib_i; - -#define KCDB_ATTRIB_HASH_SIZE 31 - -void kcdb_attrib_init(void); -void kcdb_attrib_exit(void); -void kcdb_attrib_add_ref_func(const void * key, void * va); -void kcdb_attrib_del_ref_func(const void * key, void * va); -void kcdb_attrib_msg_completion(kmq_message * m); -khm_int32 kcdb_attrib_next_free_prop_id(khm_int32 * id); -khm_int32 kcdb_attrib_next_free_id(khm_int32 * id); -khm_int32 kcdb_attrib_hold(kcdb_attrib_i * ai); -khm_int32 kcdb_attrib_release(kcdb_attrib_i * ai); -void kcdb_attrib_post_message(khm_int32 op, kcdb_attrib_i * ai); -khm_int32 KHMAPI kcdb_attr_sys_cb(khm_handle cred, khm_int32 attr, void * buf, khm_size * pcb_buf); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCDB_ATTRIB_H +#define __KHIMAIRA_KCDB_ATTRIB_H + +/* Attributes */ + +typedef struct kcdb_attrib_i_t { + kcdb_attrib attr; + + khm_int32 refcount; + + struct kcdb_attrib_i_t * next; + struct kcdb_attrib_i_t * prev; +} kcdb_attrib_i; + +#define KCDB_ATTRIB_HASH_SIZE 31 + +void kcdb_attrib_init(void); +void kcdb_attrib_exit(void); +void kcdb_attrib_add_ref_func(const void * key, void * va); +void kcdb_attrib_del_ref_func(const void * key, void * va); +void kcdb_attrib_msg_completion(kmq_message * m); +khm_int32 kcdb_attrib_next_free_prop_id(khm_int32 * id); +khm_int32 kcdb_attrib_next_free_id(khm_int32 * id); +khm_int32 kcdb_attrib_hold(kcdb_attrib_i * ai); +khm_int32 kcdb_attrib_release(kcdb_attrib_i * ai); +void kcdb_attrib_post_message(khm_int32 op, kcdb_attrib_i * ai); +khm_int32 KHMAPI kcdb_attr_sys_cb(khm_handle cred, khm_int32 attr, void * buf, khm_size * pcb_buf); + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/Makefile +++ krb5-1.4.4/src/windows/identity/kcreddb/Makefile @@ -1,52 +1,52 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=kcreddb -!include <../config/Makefile.w32> - -INCFILES= \ - $(INCDIR)\kcreddb.h - -OBJFILES= \ - $(OBJ)\buf.obj \ - $(OBJ)\attrib.obj \ - $(OBJ)\credential.obj \ - $(OBJ)\credset.obj \ - $(OBJ)\credtype.obj \ - $(OBJ)\identity.obj \ - $(OBJ)\init.obj \ - $(OBJ)\kcreddbmain.obj \ - $(OBJ)\type.obj \ - $(OBJ)\kcdbconfig.obj - -$(OBJ)\kcdbconfig.c: kcdbconfig.csv $(CONFDIR)\csvschema.cfg - $(CCSV) $** $@ - -$(OBJ)\kcredres.res: lang\en_us\kcredres.rc - $(RC2RES) - -all: mkdirs $(INCFILES) $(OBJ)\kcredres.res $(OBJFILES) - -clean:: - $(RM) $(INCFILES) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=kcreddb +!include <../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\kcreddb.h + +OBJFILES= \ + $(OBJ)\buf.obj \ + $(OBJ)\attrib.obj \ + $(OBJ)\credential.obj \ + $(OBJ)\credset.obj \ + $(OBJ)\credtype.obj \ + $(OBJ)\identity.obj \ + $(OBJ)\init.obj \ + $(OBJ)\kcreddbmain.obj \ + $(OBJ)\type.obj \ + $(OBJ)\kcdbconfig.obj + +$(OBJ)\kcdbconfig.c: kcdbconfig.csv $(CONFDIR)\csvschema.cfg + $(CCSV) $** $@ + +$(OBJ)\kcredres.res: lang\en_us\kcredres.rc + $(RC2RES) + +all: mkdirs $(INCFILES) $(OBJ)\kcredres.res $(OBJFILES) + +clean:: + $(RM) $(INCFILES) --- krb5-1.4.4.orig/src/windows/identity/kcreddb/kcreddbmain.c +++ krb5-1.4.4/src/windows/identity/kcreddb/kcreddbmain.c @@ -1,40 +1,40 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -HINSTANCE hinst_kcreddb; - -void -kcdb_process_attach(HINSTANCE hinstDLL) { - hinst_kcreddb = hinstDLL; - kcdb_init(); -} - -void -kcdb_process_detach(void) { - kcdb_exit(); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +HINSTANCE hinst_kcreddb; + +void +kcdb_process_attach(HINSTANCE hinstDLL) { + hinst_kcreddb = hinstDLL; + kcdb_init(); +} + +void +kcdb_process_detach(void) { + kcdb_exit(); +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/credtype.c +++ krb5-1.4.4/src/windows/identity/kcreddb/credtype.c @@ -1,408 +1,408 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -CRITICAL_SECTION cs_credtype; -kcdb_credtype_i ** kcdb_credtype_tbl = NULL; -kcdb_credtype_i * kcdb_credtypes = NULL; - -void kcdb_credtype_init(void) -{ - InitializeCriticalSection(&cs_credtype); - kcdb_credtypes = NULL; - - kcdb_credtype_tbl = PMALLOC(sizeof(kcdb_credtype_i *) * (KCDB_CREDTYPE_MAX_ID+1)); - ZeroMemory(kcdb_credtype_tbl, sizeof(kcdb_credtype_i *) * (KCDB_CREDTYPE_MAX_ID+1)); -} - -void kcdb_credtype_exit(void) -{ - /*TODO:Free up the cred types */ - PFREE(kcdb_credtype_tbl); - DeleteCriticalSection(&cs_credtype); -} - -/* Called with cs_credtype held */ -void kcdb_credtype_check_and_delete(khm_int32 id) -{ - kcdb_credtype_i * ict; - ict = kcdb_credtype_tbl[id]; - if(!ict) - return; - - if((ict->flags & KCDB_CTI_FLAG_DELETED) && - !ict->refcount) - { - kcdb_credtype_tbl[id] = NULL; - LDELETE(&kcdb_credtypes, ict); - - PFREE(ict->ct.name); - if(ict->ct.short_desc) - PFREE(ict->ct.short_desc); - if(ict->ct.long_desc) - PFREE(ict->ct.long_desc); - if(ict->ct.sub) - kmq_delete_subscription(ict->ct.sub); - - PFREE(ict); - } -} - -KHMEXP khm_int32 KHMAPI -kcdb_credtype_register(kcdb_credtype * type, khm_int32 * new_id) -{ - khm_int32 id; - kcdb_credtype_i * ict; - size_t cb_name; - size_t cb_short_desc; - size_t cb_long_desc; - int i; - - if(!type) - return KHM_ERROR_INVALID_PARAM; - - if(type->id >= KCDB_CREDTYPE_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - if(type->name) { - if(FAILED(StringCbLength(type->name, KCDB_MAXCB_NAME, &cb_name))) - return KHM_ERROR_TOO_LONG; - cb_name += sizeof(wchar_t); - } else - return KHM_ERROR_INVALID_PARAM; - - if(type->short_desc) { - if(FAILED(StringCbLength(type->short_desc, KCDB_MAXCB_SHORT_DESC, &cb_short_desc))) - return KHM_ERROR_TOO_LONG; - cb_short_desc += sizeof(wchar_t); - } else - cb_short_desc = 0; - - if(type->long_desc) { - if(FAILED(StringCbLength(type->long_desc, KCDB_MAXCB_LONG_DESC, &cb_long_desc))) - return KHM_ERROR_TOO_LONG; - cb_long_desc += sizeof(wchar_t); - } else - cb_long_desc = 0; - - if(type->sub == NULL) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - - if(type->id < 0) { - if(KHM_FAILED(kcdb_credtype_get_next_free_id(&id))) { - LeaveCriticalSection(&cs_credtype); - return KHM_ERROR_NO_RESOURCES; - } - } - else - id = type->id; - - if(kcdb_credtype_tbl[id]) { - LeaveCriticalSection(&cs_credtype); - return KHM_ERROR_DUPLICATE; - } - - for(i=0;i<=KCDB_CREDTYPE_MAX_ID;i++) { - if(kcdb_credtype_tbl[i] && !wcscmp(kcdb_credtype_tbl[i]->ct.name, type->name)) { - LeaveCriticalSection(&cs_credtype); - return KHM_ERROR_DUPLICATE; - } - } - - ict = PMALLOC(sizeof(kcdb_credtype_i)); - ZeroMemory(ict, sizeof(kcdb_credtype_i)); - - ict->ct.name = PMALLOC(cb_name); - StringCbCopy(ict->ct.name, cb_name, type->name); - - if(cb_short_desc) { - ict->ct.short_desc = PMALLOC(cb_short_desc); - StringCbCopy(ict->ct.short_desc, cb_short_desc, type->short_desc); - } - - if(cb_long_desc) { - ict->ct.long_desc = PMALLOC(cb_long_desc); - StringCbCopy(ict->ct.long_desc, cb_long_desc, type->long_desc); - } - - ict->ct.id = id; - - ict->ct.icon = type->icon; - - ict->ct.sub = type->sub; - - ict->ct.is_equal = type->is_equal; - - kcdb_credtype_tbl[id] = ict; - - LPUSH(&kcdb_credtypes, ict); - - LeaveCriticalSection(&cs_credtype); - - kcdb_credtype_post_message(KCDB_OP_INSERT, &(ict->ct)); - - if (new_id) - *new_id = id; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_credtype_get_info( - khm_int32 id, - kcdb_credtype ** type) -{ - int found = 0; - - if(id < 0 || id > KCDB_CREDTYPE_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - if(kcdb_credtype_tbl[id] && - !(kcdb_credtype_tbl[id]->flags & KCDB_CTI_FLAG_DELETED)) - { - found = 1; - if(type) { - *type = &(kcdb_credtype_tbl[id]->ct); - kcdb_credtype_hold(kcdb_credtype_tbl[id]); - } - } else { - if(type) - *type = NULL; - } - LeaveCriticalSection(&cs_credtype); - - if(found) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI kcdb_credtype_release_info(kcdb_credtype * type) -{ - kcdb_credtype_i * ict; - - if(!type) - return KHM_ERROR_INVALID_PARAM; - - ict = (kcdb_credtype_i *) type; - return kcdb_credtype_release(ict); -} - -KHMEXP khm_int32 KHMAPI kcdb_credtype_unregister(khm_int32 id) -{ - kcdb_credtype_i * ict; - - if(id < 0 || id > KCDB_CREDTYPE_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - ict = kcdb_credtype_tbl[id]; - ict->flags |= KCDB_CTI_FLAG_DELETED; - kcdb_credtype_check_and_delete(id); - LeaveCriticalSection(&cs_credtype); - - //kcdb_credtype_post_message(KCDB_OP_DELETE, &(ict->ct)); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_handle KHMAPI kcdb_credtype_get_sub(khm_int32 id) -{ - kcdb_credtype_i * t; - khm_handle s; - - if(id < 0 || id > KCDB_CREDTYPE_MAX_ID) - return NULL; - - EnterCriticalSection(&cs_credtype); - t = kcdb_credtype_tbl[id]; - if(t) - s = t->ct.sub; - else - s = NULL; - LeaveCriticalSection(&cs_credtype); - - return s; -} - -KHMEXP khm_int32 KHMAPI kcdb_credtype_describe( - khm_int32 id, - wchar_t * buf, - khm_size * cbbuf, - khm_int32 flags) -{ - size_t s; - size_t maxs; - wchar_t * str; - kcdb_credtype_i * t; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!cbbuf || id < 0 || id > KCDB_CREDTYPE_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - t = kcdb_credtype_tbl[id]; - if(t) { - if(flags & KCDB_TS_SHORT) { - str = (t->ct.short_desc)?t->ct.short_desc:t->ct.name; - maxs = (t->ct.short_desc)?KCDB_MAXCB_SHORT_DESC:KCDB_MAXCB_NAME; - } else { - str = (t->ct.long_desc)?t->ct.long_desc:((t->ct.short_desc)?t->ct.short_desc:t->ct.name); - maxs = (t->ct.long_desc)?KCDB_MAXCB_LONG_DESC:((t->ct.short_desc)?KCDB_MAXCB_SHORT_DESC:KCDB_MAXCB_NAME); - } - StringCbLength(str, maxs, &s); - s += sizeof(wchar_t); - if(!buf || *cbbuf < s) { - *cbbuf = s; - rv = KHM_ERROR_TOO_LONG; - } else { - StringCbCopy(buf, *cbbuf, str); - *cbbuf = s; - } - } else { - if(buf && *cbbuf > 0) - *buf = L'\0'; - *cbbuf = 0; - rv = KHM_ERROR_NOT_FOUND; - } - LeaveCriticalSection(&cs_credtype); - - return rv; -} - - -KHMEXP khm_int32 KHMAPI kcdb_credtype_get_name( - khm_int32 id, - wchar_t * buf, - khm_size * cbbuf) -{ - size_t s; - kcdb_credtype_i * t; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!cbbuf || id < 0 || id > KCDB_CREDTYPE_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - t = kcdb_credtype_tbl[id]; - if(t) { - StringCbLength(t->ct.name, KCDB_MAXCB_NAME, &s); - s += sizeof(wchar_t); - if(!buf || *cbbuf < s) { - *cbbuf = s; - rv = KHM_ERROR_TOO_LONG; - } else { - StringCbCopy(buf, *cbbuf, t->ct.name); - *cbbuf = s; - } - } else { - *cbbuf = 0; - rv = KHM_ERROR_NOT_FOUND; - } - LeaveCriticalSection(&cs_credtype); - - return rv; -} - -KHMEXP khm_int32 KHMAPI kcdb_credtype_get_id( - wchar_t * name, - khm_int32 * id) -{ - int i; - - *id = 0; - if(!name) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - for(i=0;i <= KCDB_CREDTYPE_MAX_ID; i++) { - if(kcdb_credtype_tbl[i] && !wcscmp(name, kcdb_credtype_tbl[i]->ct.name)) - break; - } - LeaveCriticalSection(&cs_credtype); - - if(i <= KCDB_CREDTYPE_MAX_ID) { - *id = i; - return KHM_ERROR_SUCCESS; - } else - return KHM_ERROR_NOT_FOUND; -} - -khm_int32 kcdb_credtype_get_next_free_id(khm_int32 * id) -{ - int i; - - EnterCriticalSection(&cs_credtype); - for(i=0;i <= KCDB_CREDTYPE_MAX_ID; i++) { - if(!kcdb_credtype_tbl[i]) - break; - } - LeaveCriticalSection(&cs_credtype); - - if(i <= KCDB_CREDTYPE_MAX_ID) { - *id = i; - return KHM_ERROR_SUCCESS; - } else { - *id = -1; - return KHM_ERROR_NO_RESOURCES; - } -} - -khm_int32 kcdb_credtype_hold(kcdb_credtype_i * ict) { - - if(!ict) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - ict->refcount++; - LeaveCriticalSection(&cs_credtype); - return KHM_ERROR_SUCCESS; -} - -khm_int32 kcdb_credtype_release(kcdb_credtype_i * ict) { - - if(!ict) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_credtype); - ict->refcount--; - kcdb_credtype_check_and_delete(ict->ct.id); - LeaveCriticalSection(&cs_credtype); - return KHM_ERROR_SUCCESS; -} - -void kcdb_credtype_msg_completion(kmq_message * m) -{ - kcdb_credtype_release((kcdb_credtype_i *) m->vparam); -} - -void kcdb_credtype_post_message(khm_int32 op, kcdb_credtype * type) -{ - kcdb_credtype_hold((kcdb_credtype_i *) type); - kmq_post_message(KMSG_KCDB, KMSG_KCDB_CREDTYPE, op, (void *) type); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +CRITICAL_SECTION cs_credtype; +kcdb_credtype_i ** kcdb_credtype_tbl = NULL; +kcdb_credtype_i * kcdb_credtypes = NULL; + +void kcdb_credtype_init(void) +{ + InitializeCriticalSection(&cs_credtype); + kcdb_credtypes = NULL; + + kcdb_credtype_tbl = PMALLOC(sizeof(kcdb_credtype_i *) * (KCDB_CREDTYPE_MAX_ID+1)); + ZeroMemory(kcdb_credtype_tbl, sizeof(kcdb_credtype_i *) * (KCDB_CREDTYPE_MAX_ID+1)); +} + +void kcdb_credtype_exit(void) +{ + /*TODO:Free up the cred types */ + PFREE(kcdb_credtype_tbl); + DeleteCriticalSection(&cs_credtype); +} + +/* Called with cs_credtype held */ +void kcdb_credtype_check_and_delete(khm_int32 id) +{ + kcdb_credtype_i * ict; + ict = kcdb_credtype_tbl[id]; + if(!ict) + return; + + if((ict->flags & KCDB_CTI_FLAG_DELETED) && + !ict->refcount) + { + kcdb_credtype_tbl[id] = NULL; + LDELETE(&kcdb_credtypes, ict); + + PFREE(ict->ct.name); + if(ict->ct.short_desc) + PFREE(ict->ct.short_desc); + if(ict->ct.long_desc) + PFREE(ict->ct.long_desc); + if(ict->ct.sub) + kmq_delete_subscription(ict->ct.sub); + + PFREE(ict); + } +} + +KHMEXP khm_int32 KHMAPI +kcdb_credtype_register(kcdb_credtype * type, khm_int32 * new_id) +{ + khm_int32 id; + kcdb_credtype_i * ict; + size_t cb_name; + size_t cb_short_desc; + size_t cb_long_desc; + int i; + + if(!type) + return KHM_ERROR_INVALID_PARAM; + + if(type->id >= KCDB_CREDTYPE_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + if(type->name) { + if(FAILED(StringCbLength(type->name, KCDB_MAXCB_NAME, &cb_name))) + return KHM_ERROR_TOO_LONG; + cb_name += sizeof(wchar_t); + } else + return KHM_ERROR_INVALID_PARAM; + + if(type->short_desc) { + if(FAILED(StringCbLength(type->short_desc, KCDB_MAXCB_SHORT_DESC, &cb_short_desc))) + return KHM_ERROR_TOO_LONG; + cb_short_desc += sizeof(wchar_t); + } else + cb_short_desc = 0; + + if(type->long_desc) { + if(FAILED(StringCbLength(type->long_desc, KCDB_MAXCB_LONG_DESC, &cb_long_desc))) + return KHM_ERROR_TOO_LONG; + cb_long_desc += sizeof(wchar_t); + } else + cb_long_desc = 0; + + if(type->sub == NULL) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + + if(type->id < 0) { + if(KHM_FAILED(kcdb_credtype_get_next_free_id(&id))) { + LeaveCriticalSection(&cs_credtype); + return KHM_ERROR_NO_RESOURCES; + } + } + else + id = type->id; + + if(kcdb_credtype_tbl[id]) { + LeaveCriticalSection(&cs_credtype); + return KHM_ERROR_DUPLICATE; + } + + for(i=0;i<=KCDB_CREDTYPE_MAX_ID;i++) { + if(kcdb_credtype_tbl[i] && !wcscmp(kcdb_credtype_tbl[i]->ct.name, type->name)) { + LeaveCriticalSection(&cs_credtype); + return KHM_ERROR_DUPLICATE; + } + } + + ict = PMALLOC(sizeof(kcdb_credtype_i)); + ZeroMemory(ict, sizeof(kcdb_credtype_i)); + + ict->ct.name = PMALLOC(cb_name); + StringCbCopy(ict->ct.name, cb_name, type->name); + + if(cb_short_desc) { + ict->ct.short_desc = PMALLOC(cb_short_desc); + StringCbCopy(ict->ct.short_desc, cb_short_desc, type->short_desc); + } + + if(cb_long_desc) { + ict->ct.long_desc = PMALLOC(cb_long_desc); + StringCbCopy(ict->ct.long_desc, cb_long_desc, type->long_desc); + } + + ict->ct.id = id; + + ict->ct.icon = type->icon; + + ict->ct.sub = type->sub; + + ict->ct.is_equal = type->is_equal; + + kcdb_credtype_tbl[id] = ict; + + LPUSH(&kcdb_credtypes, ict); + + LeaveCriticalSection(&cs_credtype); + + kcdb_credtype_post_message(KCDB_OP_INSERT, &(ict->ct)); + + if (new_id) + *new_id = id; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_credtype_get_info( + khm_int32 id, + kcdb_credtype ** type) +{ + int found = 0; + + if(id < 0 || id > KCDB_CREDTYPE_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + if(kcdb_credtype_tbl[id] && + !(kcdb_credtype_tbl[id]->flags & KCDB_CTI_FLAG_DELETED)) + { + found = 1; + if(type) { + *type = &(kcdb_credtype_tbl[id]->ct); + kcdb_credtype_hold(kcdb_credtype_tbl[id]); + } + } else { + if(type) + *type = NULL; + } + LeaveCriticalSection(&cs_credtype); + + if(found) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI kcdb_credtype_release_info(kcdb_credtype * type) +{ + kcdb_credtype_i * ict; + + if(!type) + return KHM_ERROR_INVALID_PARAM; + + ict = (kcdb_credtype_i *) type; + return kcdb_credtype_release(ict); +} + +KHMEXP khm_int32 KHMAPI kcdb_credtype_unregister(khm_int32 id) +{ + kcdb_credtype_i * ict; + + if(id < 0 || id > KCDB_CREDTYPE_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + ict = kcdb_credtype_tbl[id]; + ict->flags |= KCDB_CTI_FLAG_DELETED; + kcdb_credtype_check_and_delete(id); + LeaveCriticalSection(&cs_credtype); + + //kcdb_credtype_post_message(KCDB_OP_DELETE, &(ict->ct)); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_handle KHMAPI kcdb_credtype_get_sub(khm_int32 id) +{ + kcdb_credtype_i * t; + khm_handle s; + + if(id < 0 || id > KCDB_CREDTYPE_MAX_ID) + return NULL; + + EnterCriticalSection(&cs_credtype); + t = kcdb_credtype_tbl[id]; + if(t) + s = t->ct.sub; + else + s = NULL; + LeaveCriticalSection(&cs_credtype); + + return s; +} + +KHMEXP khm_int32 KHMAPI kcdb_credtype_describe( + khm_int32 id, + wchar_t * buf, + khm_size * cbbuf, + khm_int32 flags) +{ + size_t s; + size_t maxs; + wchar_t * str; + kcdb_credtype_i * t; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!cbbuf || id < 0 || id > KCDB_CREDTYPE_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + t = kcdb_credtype_tbl[id]; + if(t) { + if(flags & KCDB_TS_SHORT) { + str = (t->ct.short_desc)?t->ct.short_desc:t->ct.name; + maxs = (t->ct.short_desc)?KCDB_MAXCB_SHORT_DESC:KCDB_MAXCB_NAME; + } else { + str = (t->ct.long_desc)?t->ct.long_desc:((t->ct.short_desc)?t->ct.short_desc:t->ct.name); + maxs = (t->ct.long_desc)?KCDB_MAXCB_LONG_DESC:((t->ct.short_desc)?KCDB_MAXCB_SHORT_DESC:KCDB_MAXCB_NAME); + } + StringCbLength(str, maxs, &s); + s += sizeof(wchar_t); + if(!buf || *cbbuf < s) { + *cbbuf = s; + rv = KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(buf, *cbbuf, str); + *cbbuf = s; + } + } else { + if(buf && *cbbuf > 0) + *buf = L'\0'; + *cbbuf = 0; + rv = KHM_ERROR_NOT_FOUND; + } + LeaveCriticalSection(&cs_credtype); + + return rv; +} + + +KHMEXP khm_int32 KHMAPI kcdb_credtype_get_name( + khm_int32 id, + wchar_t * buf, + khm_size * cbbuf) +{ + size_t s; + kcdb_credtype_i * t; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!cbbuf || id < 0 || id > KCDB_CREDTYPE_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + t = kcdb_credtype_tbl[id]; + if(t) { + StringCbLength(t->ct.name, KCDB_MAXCB_NAME, &s); + s += sizeof(wchar_t); + if(!buf || *cbbuf < s) { + *cbbuf = s; + rv = KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(buf, *cbbuf, t->ct.name); + *cbbuf = s; + } + } else { + *cbbuf = 0; + rv = KHM_ERROR_NOT_FOUND; + } + LeaveCriticalSection(&cs_credtype); + + return rv; +} + +KHMEXP khm_int32 KHMAPI kcdb_credtype_get_id( + wchar_t * name, + khm_int32 * id) +{ + int i; + + *id = 0; + if(!name) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + for(i=0;i <= KCDB_CREDTYPE_MAX_ID; i++) { + if(kcdb_credtype_tbl[i] && !wcscmp(name, kcdb_credtype_tbl[i]->ct.name)) + break; + } + LeaveCriticalSection(&cs_credtype); + + if(i <= KCDB_CREDTYPE_MAX_ID) { + *id = i; + return KHM_ERROR_SUCCESS; + } else + return KHM_ERROR_NOT_FOUND; +} + +khm_int32 kcdb_credtype_get_next_free_id(khm_int32 * id) +{ + int i; + + EnterCriticalSection(&cs_credtype); + for(i=0;i <= KCDB_CREDTYPE_MAX_ID; i++) { + if(!kcdb_credtype_tbl[i]) + break; + } + LeaveCriticalSection(&cs_credtype); + + if(i <= KCDB_CREDTYPE_MAX_ID) { + *id = i; + return KHM_ERROR_SUCCESS; + } else { + *id = -1; + return KHM_ERROR_NO_RESOURCES; + } +} + +khm_int32 kcdb_credtype_hold(kcdb_credtype_i * ict) { + + if(!ict) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + ict->refcount++; + LeaveCriticalSection(&cs_credtype); + return KHM_ERROR_SUCCESS; +} + +khm_int32 kcdb_credtype_release(kcdb_credtype_i * ict) { + + if(!ict) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_credtype); + ict->refcount--; + kcdb_credtype_check_and_delete(ict->ct.id); + LeaveCriticalSection(&cs_credtype); + return KHM_ERROR_SUCCESS; +} + +void kcdb_credtype_msg_completion(kmq_message * m) +{ + kcdb_credtype_release((kcdb_credtype_i *) m->vparam); +} + +void kcdb_credtype_post_message(khm_int32 op, kcdb_credtype * type) +{ + kcdb_credtype_hold((kcdb_credtype_i *) type); + kmq_post_message(KMSG_KCDB, KMSG_KCDB_CREDTYPE, op, (void *) type); +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/credtype.h +++ krb5-1.4.4/src/windows/identity/kcreddb/credtype.h @@ -1,55 +1,55 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCDB_CREDTYPE_H -#define __KHIMAIRA_KCDB_CREDTYPE_H - -/* credtype */ -typedef struct kcdb_credtype_i_t { - kcdb_credtype ct; - khm_int32 refcount; - khm_int32 flags; - - struct kcdb_credtype_i_t * next; - struct kcdb_credtype_i_t * prev; -} kcdb_credtype_i; - -#define KCDB_CTI_FLAG_DELETED 8 - -extern CRITICAL_SECTION cs_credtype; -extern kcdb_credtype_i * kcdb_credtypes; -extern kcdb_credtype_i ** kcdb_credtype_tbl; - -void kcdb_credtype_init(void); -void kcdb_credtype_exit(void); -void kcdb_credtype_check_and_delete(khm_int32 id); -khm_int32 kcdb_credtype_hold(kcdb_credtype_i * ict); -khm_int32 kcdb_credtype_release(kcdb_credtype_i * ict); -void kcdb_credtype_msg_completion(kmq_message * m); -void kcdb_credtype_post_message(khm_int32 op, kcdb_credtype * type); -khm_int32 kcdb_credtype_get_next_free_id(khm_int32 * id); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCDB_CREDTYPE_H +#define __KHIMAIRA_KCDB_CREDTYPE_H + +/* credtype */ +typedef struct kcdb_credtype_i_t { + kcdb_credtype ct; + khm_int32 refcount; + khm_int32 flags; + + struct kcdb_credtype_i_t * next; + struct kcdb_credtype_i_t * prev; +} kcdb_credtype_i; + +#define KCDB_CTI_FLAG_DELETED 8 + +extern CRITICAL_SECTION cs_credtype; +extern kcdb_credtype_i * kcdb_credtypes; +extern kcdb_credtype_i ** kcdb_credtype_tbl; + +void kcdb_credtype_init(void); +void kcdb_credtype_exit(void); +void kcdb_credtype_check_and_delete(khm_int32 id); +khm_int32 kcdb_credtype_hold(kcdb_credtype_i * ict); +khm_int32 kcdb_credtype_release(kcdb_credtype_i * ict); +void kcdb_credtype_msg_completion(kmq_message * m); +void kcdb_credtype_post_message(khm_int32 op, kcdb_credtype * type); +khm_int32 kcdb_credtype_get_next_free_id(khm_int32 * id); + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/credential.h +++ krb5-1.4.4/src/windows/identity/kcreddb/credential.h @@ -1,71 +1,71 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCDB_CREDENTIAL_H -#define __KHIMAIRA_KCDB_CREDENTIAL_H - -/* Credentials */ - -typedef struct kcdb_cred_t { - khm_int32 magic; - khm_ui_8 id; /* serial number */ - kcdb_identity * identity; - khm_int32 type; - wchar_t * name; - - khm_int32 flags; - khm_int32 refcount; - - kcdb_buf buf; - - LDCL(struct kcdb_cred_t); -} kcdb_cred; - -#define KCDB_CRED_MAGIC 0x38fb84a6 - -extern CRITICAL_SECTION cs_creds; -extern kcdb_cred * kcdb_creds; -extern RWLOCK l_creds; -extern khm_ui_8 kcdb_cred_id; - -#define kcdb_cred_val_exist(c,a) kcdb_buf_val_exist(&(c)->buf, a) -#define kcdb_cred_buf_exist(c,a) kcdb_buf_exist(&(c)->buf, a) -#define kcdb_cred_buf_get(c,a) kcdb_buf_get(&(c)->buf, a) -#define kcdb_cred_buf_size(c,a) kcdb_buf_size(&(c)->buf, a) - -#define kcdb_cred_is_cred(c) ((c) && ((kcdb_cred *) c)->magic == KCDB_CRED_MAGIC) -#define kcdb_cred_is_active_cred(c) (kcdb_cred_is_cred(c) && !(((kcdb_cred *) c)->flags & KCDB_CRED_FLAG_DELETED)) - -#define kcdb_cred_lock_read() (LockObtainRead(&l_creds)) -#define kcdb_cred_unlock_read() (LockReleaseRead(&l_creds)) -#define kcdb_cred_lock_write() (LockObtainWrite(&l_creds)) -#define kcdb_cred_unlock_write() (LockReleaseWrite(&l_creds)) - -void kcdb_cred_init(void); -void kcdb_cred_exit(void); -void kcdb_cred_check_and_delete(khm_handle vcred); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCDB_CREDENTIAL_H +#define __KHIMAIRA_KCDB_CREDENTIAL_H + +/* Credentials */ + +typedef struct kcdb_cred_t { + khm_int32 magic; + khm_ui_8 id; /* serial number */ + kcdb_identity * identity; + khm_int32 type; + wchar_t * name; + + khm_int32 flags; + khm_int32 refcount; + + kcdb_buf buf; + + LDCL(struct kcdb_cred_t); +} kcdb_cred; + +#define KCDB_CRED_MAGIC 0x38fb84a6 + +extern CRITICAL_SECTION cs_creds; +extern kcdb_cred * kcdb_creds; +extern RWLOCK l_creds; +extern khm_ui_8 kcdb_cred_id; + +#define kcdb_cred_val_exist(c,a) kcdb_buf_val_exist(&(c)->buf, a) +#define kcdb_cred_buf_exist(c,a) kcdb_buf_exist(&(c)->buf, a) +#define kcdb_cred_buf_get(c,a) kcdb_buf_get(&(c)->buf, a) +#define kcdb_cred_buf_size(c,a) kcdb_buf_size(&(c)->buf, a) + +#define kcdb_cred_is_cred(c) ((c) && ((kcdb_cred *) c)->magic == KCDB_CRED_MAGIC) +#define kcdb_cred_is_active_cred(c) (kcdb_cred_is_cred(c) && !(((kcdb_cred *) c)->flags & KCDB_CRED_FLAG_DELETED)) + +#define kcdb_cred_lock_read() (LockObtainRead(&l_creds)) +#define kcdb_cred_unlock_read() (LockReleaseRead(&l_creds)) +#define kcdb_cred_lock_write() (LockObtainWrite(&l_creds)) +#define kcdb_cred_unlock_write() (LockReleaseWrite(&l_creds)) + +void kcdb_cred_init(void); +void kcdb_cred_exit(void); +void kcdb_cred_check_and_delete(khm_handle vcred); + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/kcreddbinternal.h +++ krb5-1.4.4/src/windows/identity/kcreddb/kcreddbinternal.h @@ -1,61 +1,61 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCREDDBINTERNAL_H__ -#define __KHIMAIRA_KCREDDBINTERNAL_H__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "buf.h" -#include "identity.h" -#include "attrib.h" -#include "type.h" -#include "credential.h" -#include "credset.h" -#include "credtype.h" - -/* globals */ - -extern HINSTANCE hinst_kcreddb; - -kconf_schema schema_kcdbconfig[]; - -void kcdb_init(void); -void kcdb_exit(void); -khm_handle kcdb_get_config(void); - - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCREDDBINTERNAL_H__ +#define __KHIMAIRA_KCREDDBINTERNAL_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "buf.h" +#include "identity.h" +#include "attrib.h" +#include "type.h" +#include "credential.h" +#include "credset.h" +#include "credtype.h" + +/* globals */ + +extern HINSTANCE hinst_kcreddb; + +kconf_schema schema_kcdbconfig[]; + +void kcdb_init(void); +void kcdb_exit(void); +khm_handle kcdb_get_config(void); + + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/credential.c +++ krb5-1.4.4/src/windows/identity/kcreddb/credential.c @@ -1,1092 +1,1092 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -/* cs_creds protects the *collection* of credentials, while l_creds - protects the *contents* of individual credentials. */ -CRITICAL_SECTION cs_creds; -kcdb_cred * kcdb_creds = NULL; - -/* a read lock must be obtained when querying any existing credential. - a write lock must be obtained when modifying any existing credential. - */ -RWLOCK l_creds; - -/* serial number */ -khm_ui_8 kcdb_cred_id = 0; - -void kcdb_cred_init(void) -{ - InitializeCriticalSection(&cs_creds); - InitializeRwLock(&l_creds); - kcdb_cred_id = 0; -} - -void kcdb_cred_exit(void) -{ - /*TODO: Free the credentials */ - DeleteCriticalSection(&cs_creds); - DeleteRwLock(&l_creds); -} - -/*! \internal - - can be called by kcdb_cred_dup with a write lock on l_creds and in other - places with a read lock on l_creds. New credentials must be creatable while - holding either lock. */ -KHMEXP khm_int32 KHMAPI -kcdb_cred_create(wchar_t * name, - khm_handle identity, - khm_int32 cred_type, - khm_handle * result) -{ - kcdb_cred * cred; - size_t cb_name; - - if(!name || !result || - FAILED(StringCbLength(name, KCDB_CRED_MAXCB_NAME, &cb_name)) || - KHM_FAILED(kcdb_credtype_get_info(cred_type, NULL)) || - KHM_FAILED(kcdb_identity_hold(identity))) { - return KHM_ERROR_INVALID_PARAM; - } - - cb_name += sizeof(wchar_t); - - cred = PMALLOC(sizeof(kcdb_cred)); - ZeroMemory(cred, sizeof(kcdb_cred)); - - cred->magic = KCDB_CRED_MAGIC; - cred->identity = identity; - cred->name = PMALLOC(cb_name); - StringCbCopy(cred->name, cb_name, name); - cred->type = cred_type; - - cred->refcount = 1; /* initially held */ - - LINIT(cred); - - kcdb_buf_new(&cred->buf, KCDB_ATTR_MAX_ID + 1); - - /* Not obtaining a write lock on l_cred on purpose. - Well, because no one should be referencing this credential until - this function returns. */ - EnterCriticalSection(&cs_creds); - cred->id = kcdb_cred_id++; - LPUSH(&kcdb_creds, cred); - LeaveCriticalSection(&cs_creds); - - *result = cred; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_update(khm_handle vdest, - khm_handle vsrc) -{ - khm_int32 rv = KHM_ERROR_EQUIVALENT; - kcdb_cred * src; - kcdb_cred * dest; - kcdb_type * t; - kcdb_attrib * a; - void * srcbuf; - void * destbuf; - khm_size cbsrcbuf; - khm_size cbdestbuf; - - int i; - - kcdb_cred_lock_write(); - - if(!kcdb_cred_is_active_cred(vsrc) || - !kcdb_cred_is_active_cred(vdest)) - goto _exit; - - src = (kcdb_cred *) vsrc; - dest = (kcdb_cred *) vdest; - - for(i=0;iflags & KCDB_ATTR_FLAG_COMPUTED) || - KHM_FAILED(kcdb_type_get_info(a->type, &t))) { - kcdb_attrib_release_info(a); - continue; - } - - srcbuf = kcdb_cred_buf_get(src,i); - cbsrcbuf = kcdb_cred_buf_size(src, i); - - if(kcdb_cred_val_exist(dest, i)) { - destbuf = kcdb_cred_buf_get(dest, i); - cbdestbuf = kcdb_cred_buf_size(dest, i); - - if(!t->comp(srcbuf, cbsrcbuf, destbuf, cbdestbuf)) - goto _skip_copy; - } - - kcdb_buf_set_value(&dest->buf, i, i, srcbuf, cbsrcbuf); - rv = KHM_ERROR_SUCCESS; - - _skip_copy: - kcdb_attrib_release_info(a); - kcdb_type_release_info(t); - } else { - if (KHM_FAILED(kcdb_attrib_get_info(i, &a))) - continue; - - if (!(a->flags & KCDB_ATTR_FLAG_COMPUTED) && - (a->flags & KCDB_ATTR_FLAG_TRANSIENT) && - kcdb_cred_val_exist(dest, i)) { - kcdb_buf_set_value(&dest->buf, i, i, NULL, 0); - - rv = KHM_ERROR_SUCCESS; - } - - kcdb_attrib_release_info(a); - } - } - - if (dest->flags != src->flags) { - khm_int32 old_flags; - - old_flags = dest->flags; - - dest->flags = (src->flags & ~KCDB_CRED_FLAGMASK_ADDITIVE) | - ((src->flags | dest->flags) & KCDB_CRED_FLAGMASK_ADDITIVE); - - if (dest->flags != old_flags) - rv = KHM_ERROR_SUCCESS; - } - - _exit: - kcdb_cred_unlock_write(); - return rv; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_dup( - khm_handle vcred, - khm_handle * pnewcred) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred; - kcdb_cred * newcred; - khm_handle vnewcred; - - if(!pnewcred) - return KHM_ERROR_INVALID_PARAM; - - *pnewcred = NULL; - - kcdb_cred_lock_write(); - - if(!kcdb_cred_is_active_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - if(KHM_FAILED(kcdb_cred_create(cred->name, - cred->identity, - cred->type, - &vnewcred))) - { - code = KHM_ERROR_UNKNOWN; - goto _exit; - } - - newcred = (kcdb_cred *) vnewcred; - - newcred->flags = cred->flags; - - kcdb_buf_dup(&newcred->buf, &cred->buf); - - /* newcred is already held from the call to kcdb_cred_create */ - *pnewcred = (khm_handle) newcred; - -_exit: - kcdb_cred_unlock_write(); - return code; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_get_serial( - khm_handle vcred, - khm_ui_8 * pserial) -{ - kcdb_cred * c; - - if(!pserial) - return KHM_ERROR_INVALID_PARAM; - - kcdb_cred_lock_read(); - - if(!kcdb_cred_is_active_cred(vcred)) { - kcdb_cred_unlock_read(); - return KHM_ERROR_INVALID_PARAM; - } - - c = (kcdb_cred *) vcred; - - *pserial = c->id; - - kcdb_cred_unlock_read(); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_set_identity( - khm_handle vcred, - khm_handle id) -{ - kcdb_cred * c; - - if(!kcdb_is_identity(id)) - return KHM_ERROR_INVALID_PARAM; - - kcdb_cred_lock_write(); - if(!kcdb_cred_is_active_cred(vcred)) { - kcdb_cred_unlock_write(); - return KHM_ERROR_INVALID_PARAM; - } - - c = (kcdb_cred *) vcred; - - if(c->identity) { - kcdb_identity_release((khm_handle) c->identity); - } - kcdb_identity_hold(id); - c->identity = (kcdb_identity *) id; - - kcdb_cred_unlock_write(); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_get_type( - khm_handle vcred, - khm_int32 * type) -{ - kcdb_cred * c; - - if(!type) - return KHM_ERROR_INVALID_PARAM; - - kcdb_cred_lock_read(); - - if(!kcdb_cred_is_active_cred(vcred)) { - kcdb_cred_unlock_read(); - return KHM_ERROR_INVALID_PARAM; - } - - c = (kcdb_cred *) vcred; - - *type = c->type; - - kcdb_cred_unlock_read(); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_set_attrib( - khm_handle cred, - wchar_t * name, - void * buffer, - khm_size cbbuf) -{ - khm_int32 attr_id = -1; - - if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) - return KHM_ERROR_INVALID_PARAM; - - return kcdb_cred_set_attr( - cred, - attr_id, - buffer, - cbbuf); -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_set_attr( - khm_handle vcred, - khm_int32 attr_id, - void * buffer, - khm_size cbbuf) -{ - kcdb_cred * cred; - kcdb_type * type = NULL; - kcdb_attrib * attrib = NULL; - khm_size cbdest; - khm_int32 code = KHM_ERROR_SUCCESS; - - if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - kcdb_cred_lock_write(); - - if(!kcdb_cred_is_active_cred(vcred)) { - kcdb_cred_unlock_write(); - return KHM_ERROR_INVALID_PARAM; - } - - cred = (kcdb_cred *) vcred; - - if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { - kcdb_cred_unlock_write(); - return KHM_ERROR_INVALID_PARAM; - } - - if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) - { - kcdb_cred_unlock_write(); - kcdb_attrib_release_info(attrib); - return KHM_ERROR_INVALID_OPERATION; - } - - if (buffer == 0) { - /* we are removing the value */ - kcdb_buf_alloc(&cred->buf, attr_id, attr_id, 0); - code = KHM_ERROR_SUCCESS; - goto _exit; - } - - if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { - kcdb_cred_unlock_write(); - kcdb_attrib_release_info(attrib); - return KHM_ERROR_INVALID_PARAM; - } - - if(!(type->isValid(buffer,cbbuf))) { - code = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - - if((type->dup(buffer, cbbuf, NULL, &cbdest)) != KHM_ERROR_TOO_LONG) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - kcdb_buf_alloc(&cred->buf, attr_id, attr_id, cbdest); - if(!kcdb_cred_buf_exist(cred, attr_id)) { - code = KHM_ERROR_NO_RESOURCES; - goto _exit; - } - - if(KHM_FAILED(code = - type->dup(buffer, cbbuf, kcdb_cred_buf_get(cred,attr_id), &cbdest))) - { - kcdb_buf_alloc(&cred->buf, attr_id, attr_id, 0); - goto _exit; - } - - kcdb_buf_set_value_flag(&cred->buf, attr_id); - -_exit: - kcdb_cred_unlock_write(); - - if(attrib) - kcdb_attrib_release_info(attrib); - if(type) - kcdb_type_release_info(type); - - return code; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_get_attrib( - khm_handle cred, - wchar_t * name, - khm_int32 * attr_type, - void * buffer, - khm_size * cbbuf) -{ - khm_int32 attr_id = -1; - - if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) - return KHM_ERROR_NOT_FOUND; - - return kcdb_cred_get_attr( - cred, - attr_id, - attr_type, - buffer, - cbbuf); -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_get_attrib_string( - khm_handle cred, - wchar_t * name, - wchar_t * buffer, - khm_size * cbbuf, - khm_int32 flags) -{ - khm_int32 attr_id = -1; - - if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) - return KHM_ERROR_NOT_FOUND; - - return kcdb_cred_get_attr_string( - cred, - attr_id, - buffer, - cbbuf, - flags); -} - -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_attr(khm_handle vcred, - khm_int32 attr_id, - khm_int32 * attr_type, - void * buffer, - khm_size * pcbbuf) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred = NULL; - kcdb_attrib * attrib = NULL; - kcdb_type * type = NULL; - - if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { - return KHM_ERROR_INVALID_PARAM; - } - - if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { - kcdb_attrib_release_info(attrib); - return KHM_ERROR_UNKNOWN; - } - - if(attr_type) - *attr_type = attrib->type; - - kcdb_cred_lock_read(); - if(!kcdb_cred_is_active_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - if(!buffer && !pcbbuf) { - /* in this case the caller is only trying to determine if the - field contains data. We assume that computed fields are - always non-null. */ - code = (kcdb_cred_val_exist(cred, attr_id) || - (attrib->flags & KCDB_ATTR_FLAG_COMPUTED))?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; - goto _exit; - } - - if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { - code = attrib->compute_cb( - vcred, - attr_id, - buffer, - pcbbuf); - } else if (kcdb_cred_val_exist(cred, attr_id)) { - code = type->dup( - kcdb_cred_buf_get(cred, attr_id), - kcdb_cred_buf_size(cred, attr_id), - buffer, - pcbbuf); - } else { - code = KHM_ERROR_NOT_FOUND; - } - -_exit: - kcdb_cred_unlock_read(); - if(type) - kcdb_type_release_info(type); - if(attrib) - kcdb_attrib_release_info(attrib); - - return code; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_get_attr_string( - khm_handle vcred, - khm_int32 attr_id, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred = NULL; - kcdb_attrib * attrib = NULL; - kcdb_type * type = NULL; - - if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit_nolock; - } - - if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { - code = KHM_ERROR_UNKNOWN; - goto _exit_nolock; - } - - kcdb_cred_lock_read(); - if(!kcdb_cred_is_active_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - if(!buffer && !pcbbuf) { - /* in this case the caller is only trying to determine if the - field contains data. We assume that computed fields are - always non-null. */ - code = (kcdb_cred_val_exist(cred, attr_id) || - (attrib->flags & KCDB_ATTR_FLAG_COMPUTED))?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; - goto _exit; - } - - if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { - void * buf; - khm_size cbbuf; - - code = attrib->compute_cb(vcred, - attr_id, - NULL, - &cbbuf); - if(code == KHM_ERROR_TOO_LONG) { - wchar_t vbuf[KCDB_MAXCCH_NAME]; - - if (cbbuf < sizeof(vbuf)) - buf = vbuf; - else - buf = PMALLOC(cbbuf); - - code = attrib->compute_cb(vcred, - attr_id, - buf, - &cbbuf); - if(KHM_SUCCEEDED(code)) { - code = type->toString(buf, - cbbuf, - buffer, - pcbbuf, - flags); - } - - if (buf != vbuf) - PFREE(buf); - } - } else { - if(kcdb_cred_buf_exist(cred, attr_id)) { - code = type->toString( - kcdb_cred_buf_get(cred, attr_id), - kcdb_cred_buf_size(cred, attr_id), - buffer, - pcbbuf, - flags); - } else - code = KHM_ERROR_NOT_FOUND; - } - - _exit: - kcdb_cred_unlock_read(); - _exit_nolock: - if(type) - kcdb_type_release_info(type); - if(attrib) - kcdb_attrib_release_info(attrib); - - return code; -} - - -KHMEXP khm_int32 KHMAPI kcdb_cred_get_name( - khm_handle vcred, - wchar_t * buffer, - khm_size * cbbuf) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred = NULL; - size_t cbsize; - - if(!cbbuf) - return KHM_ERROR_INVALID_PARAM; - - kcdb_cred_lock_read(); - - if(!kcdb_cred_is_active_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - if(FAILED(StringCbLength(cred->name, KCDB_CRED_MAXCB_NAME, &cbsize))) { - code = KHM_ERROR_UNKNOWN; - goto _exit; - } - - cbsize += sizeof(wchar_t); - - if(!buffer || *cbbuf < cbsize) { - *cbbuf = cbsize; - code = KHM_ERROR_TOO_LONG; - goto _exit; - } - - StringCbCopy(buffer, *cbbuf, cred->name); - - *cbbuf = cbsize; - -_exit: - - kcdb_cred_unlock_read(); - return code; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_get_identity( - khm_handle vcred, - khm_handle * identity) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred; - - if(!identity) - return KHM_ERROR_INVALID_PARAM; - - kcdb_cred_lock_read(); - - if(!kcdb_cred_is_active_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - kcdb_identity_hold((khm_handle) cred->identity); - - *identity = cred->identity; - -_exit: - kcdb_cred_unlock_read(); - return code; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_hold(khm_handle vcred) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred; - - kcdb_cred_lock_write(); - - if(!kcdb_cred_is_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - cred->refcount++; - -_exit: - kcdb_cred_unlock_write(); - return code; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_release(khm_handle vcred) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred; - - kcdb_cred_lock_write(); - - if(!kcdb_cred_is_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - cred->refcount--; - -_exit: - kcdb_cred_unlock_write(); - - kcdb_cred_check_and_delete(vcred); - - return code; -} - -void kcdb_cred_check_and_delete(khm_handle vcred) -{ - kcdb_cred * cred; - - kcdb_cred_lock_read(); - if(!kcdb_cred_is_cred(vcred)) { - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - if(cred->refcount) - goto _exit; - - kcdb_cred_unlock_read(); - kcdb_cred_lock_write(); - if(!kcdb_cred_is_cred(vcred)) { - /* did we lose the race? */ - goto _exit2; - } - - cred->magic = 0; /* no longer a cred */ - kcdb_identity_release(cred->identity); - - EnterCriticalSection(&cs_creds); - LDELETE(&kcdb_creds, cred); - LeaveCriticalSection(&cs_creds); - - kcdb_buf_delete(&cred->buf); - PFREE(cred->name); - PFREE(cred); - - /*TODO: notifications */ - -_exit2: - kcdb_cred_unlock_write(); - return; - -_exit: - kcdb_cred_unlock_read(); -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_delete(khm_handle vcred) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred * cred; - - kcdb_cred_lock_write(); - - if(!kcdb_cred_is_active_cred(vcred)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = (kcdb_cred *) vcred; - - cred->flags |= KCDB_CRED_FLAG_DELETED; - -_exit: - kcdb_cred_unlock_write(); - - kcdb_cred_check_and_delete(vcred); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_creds_comp_attrib(khm_handle cred1, - khm_handle cred2, - wchar_t * name) -{ - khm_int32 attr_id; - - if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) - return 0; - - return kcdb_creds_comp_attr(cred1, cred2, attr_id); -} - -KHMEXP khm_int32 KHMAPI -kcdb_creds_comp_attr(khm_handle vcred1, - khm_handle vcred2, - khm_int32 attr_id) -{ - khm_int32 code = 0; - kcdb_cred * cred1; - kcdb_cred * cred2; - kcdb_attrib * attrib = NULL; - kcdb_type * type = NULL; - - if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) - return 0; - - cred1 = (kcdb_cred *) vcred1; - cred2 = (kcdb_cred *) vcred2; - - kcdb_cred_lock_read(); - if( - !kcdb_cred_is_active_cred(vcred1) || - !kcdb_cred_is_active_cred(vcred2)) - goto _exit; - - cred1 = (kcdb_cred *) vcred1; - cred2 = (kcdb_cred *) vcred2; - - if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) - goto _exit; - - if(!(attrib->flags & KCDB_ATTR_FLAG_COMPUTED)) { - int nc = 0; - - if(!kcdb_cred_val_exist(cred1, attr_id)) { - code = -1; - nc = 1; - } - if(!kcdb_cred_val_exist(cred2, attr_id)) { - code += 1; - nc = 1; - } - - if(nc) - goto _exit; - } - - if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) - goto _exit; - - if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { - khm_octet vbuf[KCDB_MAXCB_NAME * 2]; - void * buf1 = NULL; - void * buf2 = NULL; - khm_size cb1; - khm_size cb2; - - code = 0; - - if(attrib->compute_cb(vcred1, attr_id, - NULL, &cb1) != KHM_ERROR_TOO_LONG) - goto _exit_1; - - if(attrib->compute_cb(vcred2, attr_id, - NULL, &cb2) != KHM_ERROR_TOO_LONG) - goto _exit_1; - - if(cb1) { - if (cb1 < sizeof(vbuf)) - buf1 = vbuf; - else - buf1 = PMALLOC(cb1); - - if(KHM_FAILED(attrib->compute_cb(vcred1, attr_id, buf1, &cb1))) - goto _exit_1; - } - - if(cb2) { - if (cb1 + cb2 < sizeof(vbuf)) - buf2 = vbuf + cb1; - else - buf2 = PMALLOC(cb2); - - if(KHM_FAILED(attrib->compute_cb(vcred2, attr_id, buf2, &cb2))) - goto _exit_1; - } - - code = type->comp(buf1, cb1, - buf2, cb2); -_exit_1: - if(buf1 && (buf1 < (void *)vbuf || - buf1 >= (void*)(vbuf + sizeof(vbuf)))) - PFREE(buf1); - if(buf2 && (buf2 < (void *)vbuf || - buf2 >= (void *)(vbuf + sizeof(vbuf)))) - PFREE(buf2); - } else { - code = type->comp( - kcdb_cred_buf_get(cred1, attr_id), - kcdb_cred_buf_size(cred1, attr_id), - kcdb_cred_buf_get(cred2, attr_id), - kcdb_cred_buf_size(cred2, attr_id)); - } - -_exit: - kcdb_cred_unlock_read(); - if(attrib) - kcdb_attrib_release_info(attrib); - if(type) - kcdb_type_release_info(type); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_creds_is_equal(khm_handle vcred1, - khm_handle vcred2) -{ - khm_int32 code = 0; - kcdb_cred * cred1; - kcdb_cred * cred2; - - kcdb_cred_lock_read(); - if(!kcdb_cred_is_active_cred(vcred1) || - !kcdb_cred_is_active_cred(vcred2)) { - - code = FALSE; - goto _exit; - - } - - if(vcred1 == vcred2) { - - code = TRUE; - goto _exit; - - } - - cred1 = vcred1; - cred2 = vcred2; - - if(cred1->identity == cred2->identity && - cred1->type == cred2->type && - !wcscmp(cred1->name, cred2->name)) { - - kcdb_credtype * type; - - code = TRUE; - - if (KHM_SUCCEEDED(kcdb_credtype_get_info(cred1->type, &type))) { - if (type->is_equal && - (*type->is_equal)(vcred1, vcred2, NULL)) - code = 0; - - kcdb_credtype_release_info(type); - } - } - -_exit: - kcdb_cred_unlock_read(); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_flags(khm_handle vcred, - khm_int32 * pflags) -{ - khm_int32 f; - khm_int32 rv = KHM_ERROR_SUCCESS; - kcdb_cred * cred; - int release_lock = TRUE; - - if (pflags == NULL) - return KHM_ERROR_INVALID_PARAM; - - kcdb_cred_lock_read(); - if (!kcdb_cred_is_active_cred(vcred)) { - *pflags = 0; - rv = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = vcred; - f = cred->flags; - - /* Update flags if necessary */ - - if (!(f & KCDB_CRED_FLAG_EXPIRED) && - kcdb_cred_buf_exist(cred, KCDB_ATTR_EXPIRE)) { - - FILETIME ftc; - - GetSystemTimeAsFileTime(&ftc); - if (CompareFileTime(&ftc, ((FILETIME *) - kcdb_cred_buf_get(cred, KCDB_ATTR_EXPIRE))) - >= 0) - f |= KCDB_CRED_FLAG_EXPIRED; - } - -#if 0 - /* Commented out: if the credential has expired, then checking the - renewable time is not useful */ - if (!(f & KCDB_CRED_FLAG_INVALID)) { - if (f & KCDB_CRED_FLAG_RENEWABLE) { - if (kcdb_cred_buf_exist(cred, KCDB_ATTR_RENEW_EXPIRE)) { - FILETIME ftc; - - GetSystemTimeAsFileTime(&ftc); - if (CompareFileTime(&ftc, ((FILETIME *) - kcdb_cred_buf_get(cred, KCDB_ATTR_RENEW_EXPIRE))) >= 0) - f |= KCDB_CRED_FLAG_INVALID; - } - } else { - if (f & KCDB_CRED_FLAG_EXPIRED) - f |= KCDB_CRED_FLAG_INVALID; - } - } - - /* Commented out: this is a read operation. We shouldn't attempt - to lock for writing */ - if (f != cred->flags) { - kcdb_cred_unlock_read(); - kcdb_cred_lock_write(); - /* Did we lose a race? */ - if (kcdb_cred_is_active_cred(vcred)) - cred->flags = f; - else { - rv = KHM_ERROR_INVALID_PARAM; - f = 0; - } - kcdb_cred_unlock_write(); - release_lock = FALSE; - } -#endif - - *pflags = f; - - _exit: - if (release_lock) - kcdb_cred_unlock_read(); - - return rv; -} - -KHMEXP khm_int32 KHMAPI kcdb_cred_set_flags( - khm_handle vcred, - khm_int32 flags, - khm_int32 mask) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - kcdb_cred * cred; - - kcdb_cred_lock_write(); - if(!kcdb_cred_is_active_cred(vcred)) { - rv = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cred = vcred; - - flags &= ~(KCDB_CRED_FLAG_DELETED); - mask &= ~(KCDB_CRED_FLAG_DELETED); - - cred->flags = - (cred->flags & (~mask)) | - (flags & mask); - - _exit: - kcdb_cred_unlock_write(); - return rv; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +/* cs_creds protects the *collection* of credentials, while l_creds + protects the *contents* of individual credentials. */ +CRITICAL_SECTION cs_creds; +kcdb_cred * kcdb_creds = NULL; + +/* a read lock must be obtained when querying any existing credential. + a write lock must be obtained when modifying any existing credential. + */ +RWLOCK l_creds; + +/* serial number */ +khm_ui_8 kcdb_cred_id = 0; + +void kcdb_cred_init(void) +{ + InitializeCriticalSection(&cs_creds); + InitializeRwLock(&l_creds); + kcdb_cred_id = 0; +} + +void kcdb_cred_exit(void) +{ + /*TODO: Free the credentials */ + DeleteCriticalSection(&cs_creds); + DeleteRwLock(&l_creds); +} + +/*! \internal + + can be called by kcdb_cred_dup with a write lock on l_creds and in other + places with a read lock on l_creds. New credentials must be creatable while + holding either lock. */ +KHMEXP khm_int32 KHMAPI +kcdb_cred_create(wchar_t * name, + khm_handle identity, + khm_int32 cred_type, + khm_handle * result) +{ + kcdb_cred * cred; + size_t cb_name; + + if(!name || !result || + FAILED(StringCbLength(name, KCDB_CRED_MAXCB_NAME, &cb_name)) || + KHM_FAILED(kcdb_credtype_get_info(cred_type, NULL)) || + KHM_FAILED(kcdb_identity_hold(identity))) { + return KHM_ERROR_INVALID_PARAM; + } + + cb_name += sizeof(wchar_t); + + cred = PMALLOC(sizeof(kcdb_cred)); + ZeroMemory(cred, sizeof(kcdb_cred)); + + cred->magic = KCDB_CRED_MAGIC; + cred->identity = identity; + cred->name = PMALLOC(cb_name); + StringCbCopy(cred->name, cb_name, name); + cred->type = cred_type; + + cred->refcount = 1; /* initially held */ + + LINIT(cred); + + kcdb_buf_new(&cred->buf, KCDB_ATTR_MAX_ID + 1); + + /* Not obtaining a write lock on l_cred on purpose. + Well, because no one should be referencing this credential until + this function returns. */ + EnterCriticalSection(&cs_creds); + cred->id = kcdb_cred_id++; + LPUSH(&kcdb_creds, cred); + LeaveCriticalSection(&cs_creds); + + *result = cred; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_update(khm_handle vdest, + khm_handle vsrc) +{ + khm_int32 rv = KHM_ERROR_EQUIVALENT; + kcdb_cred * src; + kcdb_cred * dest; + kcdb_type * t; + kcdb_attrib * a; + void * srcbuf; + void * destbuf; + khm_size cbsrcbuf; + khm_size cbdestbuf; + + int i; + + kcdb_cred_lock_write(); + + if(!kcdb_cred_is_active_cred(vsrc) || + !kcdb_cred_is_active_cred(vdest)) + goto _exit; + + src = (kcdb_cred *) vsrc; + dest = (kcdb_cred *) vdest; + + for(i=0;iflags & KCDB_ATTR_FLAG_COMPUTED) || + KHM_FAILED(kcdb_type_get_info(a->type, &t))) { + kcdb_attrib_release_info(a); + continue; + } + + srcbuf = kcdb_cred_buf_get(src,i); + cbsrcbuf = kcdb_cred_buf_size(src, i); + + if(kcdb_cred_val_exist(dest, i)) { + destbuf = kcdb_cred_buf_get(dest, i); + cbdestbuf = kcdb_cred_buf_size(dest, i); + + if(!t->comp(srcbuf, cbsrcbuf, destbuf, cbdestbuf)) + goto _skip_copy; + } + + kcdb_buf_set_value(&dest->buf, i, i, srcbuf, cbsrcbuf); + rv = KHM_ERROR_SUCCESS; + + _skip_copy: + kcdb_attrib_release_info(a); + kcdb_type_release_info(t); + } else { + if (KHM_FAILED(kcdb_attrib_get_info(i, &a))) + continue; + + if (!(a->flags & KCDB_ATTR_FLAG_COMPUTED) && + (a->flags & KCDB_ATTR_FLAG_TRANSIENT) && + kcdb_cred_val_exist(dest, i)) { + kcdb_buf_set_value(&dest->buf, i, i, NULL, 0); + + rv = KHM_ERROR_SUCCESS; + } + + kcdb_attrib_release_info(a); + } + } + + if (dest->flags != src->flags) { + khm_int32 old_flags; + + old_flags = dest->flags; + + dest->flags = (src->flags & ~KCDB_CRED_FLAGMASK_ADDITIVE) | + ((src->flags | dest->flags) & KCDB_CRED_FLAGMASK_ADDITIVE); + + if (dest->flags != old_flags) + rv = KHM_ERROR_SUCCESS; + } + + _exit: + kcdb_cred_unlock_write(); + return rv; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_dup( + khm_handle vcred, + khm_handle * pnewcred) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred; + kcdb_cred * newcred; + khm_handle vnewcred; + + if(!pnewcred) + return KHM_ERROR_INVALID_PARAM; + + *pnewcred = NULL; + + kcdb_cred_lock_write(); + + if(!kcdb_cred_is_active_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + if(KHM_FAILED(kcdb_cred_create(cred->name, + cred->identity, + cred->type, + &vnewcred))) + { + code = KHM_ERROR_UNKNOWN; + goto _exit; + } + + newcred = (kcdb_cred *) vnewcred; + + newcred->flags = cred->flags; + + kcdb_buf_dup(&newcred->buf, &cred->buf); + + /* newcred is already held from the call to kcdb_cred_create */ + *pnewcred = (khm_handle) newcred; + +_exit: + kcdb_cred_unlock_write(); + return code; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_get_serial( + khm_handle vcred, + khm_ui_8 * pserial) +{ + kcdb_cred * c; + + if(!pserial) + return KHM_ERROR_INVALID_PARAM; + + kcdb_cred_lock_read(); + + if(!kcdb_cred_is_active_cred(vcred)) { + kcdb_cred_unlock_read(); + return KHM_ERROR_INVALID_PARAM; + } + + c = (kcdb_cred *) vcred; + + *pserial = c->id; + + kcdb_cred_unlock_read(); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_set_identity( + khm_handle vcred, + khm_handle id) +{ + kcdb_cred * c; + + if(!kcdb_is_identity(id)) + return KHM_ERROR_INVALID_PARAM; + + kcdb_cred_lock_write(); + if(!kcdb_cred_is_active_cred(vcred)) { + kcdb_cred_unlock_write(); + return KHM_ERROR_INVALID_PARAM; + } + + c = (kcdb_cred *) vcred; + + if(c->identity) { + kcdb_identity_release((khm_handle) c->identity); + } + kcdb_identity_hold(id); + c->identity = (kcdb_identity *) id; + + kcdb_cred_unlock_write(); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_get_type( + khm_handle vcred, + khm_int32 * type) +{ + kcdb_cred * c; + + if(!type) + return KHM_ERROR_INVALID_PARAM; + + kcdb_cred_lock_read(); + + if(!kcdb_cred_is_active_cred(vcred)) { + kcdb_cred_unlock_read(); + return KHM_ERROR_INVALID_PARAM; + } + + c = (kcdb_cred *) vcred; + + *type = c->type; + + kcdb_cred_unlock_read(); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_set_attrib( + khm_handle cred, + wchar_t * name, + void * buffer, + khm_size cbbuf) +{ + khm_int32 attr_id = -1; + + if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) + return KHM_ERROR_INVALID_PARAM; + + return kcdb_cred_set_attr( + cred, + attr_id, + buffer, + cbbuf); +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_set_attr( + khm_handle vcred, + khm_int32 attr_id, + void * buffer, + khm_size cbbuf) +{ + kcdb_cred * cred; + kcdb_type * type = NULL; + kcdb_attrib * attrib = NULL; + khm_size cbdest; + khm_int32 code = KHM_ERROR_SUCCESS; + + if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + kcdb_cred_lock_write(); + + if(!kcdb_cred_is_active_cred(vcred)) { + kcdb_cred_unlock_write(); + return KHM_ERROR_INVALID_PARAM; + } + + cred = (kcdb_cred *) vcred; + + if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { + kcdb_cred_unlock_write(); + return KHM_ERROR_INVALID_PARAM; + } + + if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) + { + kcdb_cred_unlock_write(); + kcdb_attrib_release_info(attrib); + return KHM_ERROR_INVALID_OPERATION; + } + + if (buffer == 0) { + /* we are removing the value */ + kcdb_buf_alloc(&cred->buf, attr_id, attr_id, 0); + code = KHM_ERROR_SUCCESS; + goto _exit; + } + + if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { + kcdb_cred_unlock_write(); + kcdb_attrib_release_info(attrib); + return KHM_ERROR_INVALID_PARAM; + } + + if(!(type->isValid(buffer,cbbuf))) { + code = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + + if((type->dup(buffer, cbbuf, NULL, &cbdest)) != KHM_ERROR_TOO_LONG) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + kcdb_buf_alloc(&cred->buf, attr_id, attr_id, cbdest); + if(!kcdb_cred_buf_exist(cred, attr_id)) { + code = KHM_ERROR_NO_RESOURCES; + goto _exit; + } + + if(KHM_FAILED(code = + type->dup(buffer, cbbuf, kcdb_cred_buf_get(cred,attr_id), &cbdest))) + { + kcdb_buf_alloc(&cred->buf, attr_id, attr_id, 0); + goto _exit; + } + + kcdb_buf_set_value_flag(&cred->buf, attr_id); + +_exit: + kcdb_cred_unlock_write(); + + if(attrib) + kcdb_attrib_release_info(attrib); + if(type) + kcdb_type_release_info(type); + + return code; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_get_attrib( + khm_handle cred, + wchar_t * name, + khm_int32 * attr_type, + void * buffer, + khm_size * cbbuf) +{ + khm_int32 attr_id = -1; + + if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) + return KHM_ERROR_NOT_FOUND; + + return kcdb_cred_get_attr( + cred, + attr_id, + attr_type, + buffer, + cbbuf); +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_get_attrib_string( + khm_handle cred, + wchar_t * name, + wchar_t * buffer, + khm_size * cbbuf, + khm_int32 flags) +{ + khm_int32 attr_id = -1; + + if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) + return KHM_ERROR_NOT_FOUND; + + return kcdb_cred_get_attr_string( + cred, + attr_id, + buffer, + cbbuf, + flags); +} + +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_attr(khm_handle vcred, + khm_int32 attr_id, + khm_int32 * attr_type, + void * buffer, + khm_size * pcbbuf) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred = NULL; + kcdb_attrib * attrib = NULL; + kcdb_type * type = NULL; + + if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { + return KHM_ERROR_INVALID_PARAM; + } + + if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { + kcdb_attrib_release_info(attrib); + return KHM_ERROR_UNKNOWN; + } + + if(attr_type) + *attr_type = attrib->type; + + kcdb_cred_lock_read(); + if(!kcdb_cred_is_active_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + if(!buffer && !pcbbuf) { + /* in this case the caller is only trying to determine if the + field contains data. We assume that computed fields are + always non-null. */ + code = (kcdb_cred_val_exist(cred, attr_id) || + (attrib->flags & KCDB_ATTR_FLAG_COMPUTED))?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; + goto _exit; + } + + if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { + code = attrib->compute_cb( + vcred, + attr_id, + buffer, + pcbbuf); + } else if (kcdb_cred_val_exist(cred, attr_id)) { + code = type->dup( + kcdb_cred_buf_get(cred, attr_id), + kcdb_cred_buf_size(cred, attr_id), + buffer, + pcbbuf); + } else { + code = KHM_ERROR_NOT_FOUND; + } + +_exit: + kcdb_cred_unlock_read(); + if(type) + kcdb_type_release_info(type); + if(attrib) + kcdb_attrib_release_info(attrib); + + return code; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_get_attr_string( + khm_handle vcred, + khm_int32 attr_id, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred = NULL; + kcdb_attrib * attrib = NULL; + kcdb_type * type = NULL; + + if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit_nolock; + } + + if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { + code = KHM_ERROR_UNKNOWN; + goto _exit_nolock; + } + + kcdb_cred_lock_read(); + if(!kcdb_cred_is_active_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + if(!buffer && !pcbbuf) { + /* in this case the caller is only trying to determine if the + field contains data. We assume that computed fields are + always non-null. */ + code = (kcdb_cred_val_exist(cred, attr_id) || + (attrib->flags & KCDB_ATTR_FLAG_COMPUTED))?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; + goto _exit; + } + + if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { + void * buf; + khm_size cbbuf; + + code = attrib->compute_cb(vcred, + attr_id, + NULL, + &cbbuf); + if(code == KHM_ERROR_TOO_LONG) { + wchar_t vbuf[KCDB_MAXCCH_NAME]; + + if (cbbuf < sizeof(vbuf)) + buf = vbuf; + else + buf = PMALLOC(cbbuf); + + code = attrib->compute_cb(vcred, + attr_id, + buf, + &cbbuf); + if(KHM_SUCCEEDED(code)) { + code = type->toString(buf, + cbbuf, + buffer, + pcbbuf, + flags); + } + + if (buf != vbuf) + PFREE(buf); + } + } else { + if(kcdb_cred_buf_exist(cred, attr_id)) { + code = type->toString( + kcdb_cred_buf_get(cred, attr_id), + kcdb_cred_buf_size(cred, attr_id), + buffer, + pcbbuf, + flags); + } else + code = KHM_ERROR_NOT_FOUND; + } + + _exit: + kcdb_cred_unlock_read(); + _exit_nolock: + if(type) + kcdb_type_release_info(type); + if(attrib) + kcdb_attrib_release_info(attrib); + + return code; +} + + +KHMEXP khm_int32 KHMAPI kcdb_cred_get_name( + khm_handle vcred, + wchar_t * buffer, + khm_size * cbbuf) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred = NULL; + size_t cbsize; + + if(!cbbuf) + return KHM_ERROR_INVALID_PARAM; + + kcdb_cred_lock_read(); + + if(!kcdb_cred_is_active_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + if(FAILED(StringCbLength(cred->name, KCDB_CRED_MAXCB_NAME, &cbsize))) { + code = KHM_ERROR_UNKNOWN; + goto _exit; + } + + cbsize += sizeof(wchar_t); + + if(!buffer || *cbbuf < cbsize) { + *cbbuf = cbsize; + code = KHM_ERROR_TOO_LONG; + goto _exit; + } + + StringCbCopy(buffer, *cbbuf, cred->name); + + *cbbuf = cbsize; + +_exit: + + kcdb_cred_unlock_read(); + return code; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_get_identity( + khm_handle vcred, + khm_handle * identity) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred; + + if(!identity) + return KHM_ERROR_INVALID_PARAM; + + kcdb_cred_lock_read(); + + if(!kcdb_cred_is_active_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + kcdb_identity_hold((khm_handle) cred->identity); + + *identity = cred->identity; + +_exit: + kcdb_cred_unlock_read(); + return code; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_hold(khm_handle vcred) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred; + + kcdb_cred_lock_write(); + + if(!kcdb_cred_is_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + cred->refcount++; + +_exit: + kcdb_cred_unlock_write(); + return code; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_release(khm_handle vcred) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred; + + kcdb_cred_lock_write(); + + if(!kcdb_cred_is_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + cred->refcount--; + +_exit: + kcdb_cred_unlock_write(); + + kcdb_cred_check_and_delete(vcred); + + return code; +} + +void kcdb_cred_check_and_delete(khm_handle vcred) +{ + kcdb_cred * cred; + + kcdb_cred_lock_read(); + if(!kcdb_cred_is_cred(vcred)) { + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + if(cred->refcount) + goto _exit; + + kcdb_cred_unlock_read(); + kcdb_cred_lock_write(); + if(!kcdb_cred_is_cred(vcred)) { + /* did we lose the race? */ + goto _exit2; + } + + cred->magic = 0; /* no longer a cred */ + kcdb_identity_release(cred->identity); + + EnterCriticalSection(&cs_creds); + LDELETE(&kcdb_creds, cred); + LeaveCriticalSection(&cs_creds); + + kcdb_buf_delete(&cred->buf); + PFREE(cred->name); + PFREE(cred); + + /*TODO: notifications */ + +_exit2: + kcdb_cred_unlock_write(); + return; + +_exit: + kcdb_cred_unlock_read(); +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_delete(khm_handle vcred) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred * cred; + + kcdb_cred_lock_write(); + + if(!kcdb_cred_is_active_cred(vcred)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = (kcdb_cred *) vcred; + + cred->flags |= KCDB_CRED_FLAG_DELETED; + +_exit: + kcdb_cred_unlock_write(); + + kcdb_cred_check_and_delete(vcred); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_creds_comp_attrib(khm_handle cred1, + khm_handle cred2, + wchar_t * name) +{ + khm_int32 attr_id; + + if(KHM_FAILED(kcdb_attrib_get_id(name, &attr_id))) + return 0; + + return kcdb_creds_comp_attr(cred1, cred2, attr_id); +} + +KHMEXP khm_int32 KHMAPI +kcdb_creds_comp_attr(khm_handle vcred1, + khm_handle vcred2, + khm_int32 attr_id) +{ + khm_int32 code = 0; + kcdb_cred * cred1; + kcdb_cred * cred2; + kcdb_attrib * attrib = NULL; + kcdb_type * type = NULL; + + if(attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) + return 0; + + cred1 = (kcdb_cred *) vcred1; + cred2 = (kcdb_cred *) vcred2; + + kcdb_cred_lock_read(); + if( + !kcdb_cred_is_active_cred(vcred1) || + !kcdb_cred_is_active_cred(vcred2)) + goto _exit; + + cred1 = (kcdb_cred *) vcred1; + cred2 = (kcdb_cred *) vcred2; + + if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) + goto _exit; + + if(!(attrib->flags & KCDB_ATTR_FLAG_COMPUTED)) { + int nc = 0; + + if(!kcdb_cred_val_exist(cred1, attr_id)) { + code = -1; + nc = 1; + } + if(!kcdb_cred_val_exist(cred2, attr_id)) { + code += 1; + nc = 1; + } + + if(nc) + goto _exit; + } + + if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) + goto _exit; + + if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { + khm_octet vbuf[KCDB_MAXCB_NAME * 2]; + void * buf1 = NULL; + void * buf2 = NULL; + khm_size cb1; + khm_size cb2; + + code = 0; + + if(attrib->compute_cb(vcred1, attr_id, + NULL, &cb1) != KHM_ERROR_TOO_LONG) + goto _exit_1; + + if(attrib->compute_cb(vcred2, attr_id, + NULL, &cb2) != KHM_ERROR_TOO_LONG) + goto _exit_1; + + if(cb1) { + if (cb1 < sizeof(vbuf)) + buf1 = vbuf; + else + buf1 = PMALLOC(cb1); + + if(KHM_FAILED(attrib->compute_cb(vcred1, attr_id, buf1, &cb1))) + goto _exit_1; + } + + if(cb2) { + if (cb1 + cb2 < sizeof(vbuf)) + buf2 = vbuf + cb1; + else + buf2 = PMALLOC(cb2); + + if(KHM_FAILED(attrib->compute_cb(vcred2, attr_id, buf2, &cb2))) + goto _exit_1; + } + + code = type->comp(buf1, cb1, + buf2, cb2); +_exit_1: + if(buf1 && (buf1 < (void *)vbuf || + buf1 >= (void*)(vbuf + sizeof(vbuf)))) + PFREE(buf1); + if(buf2 && (buf2 < (void *)vbuf || + buf2 >= (void *)(vbuf + sizeof(vbuf)))) + PFREE(buf2); + } else { + code = type->comp( + kcdb_cred_buf_get(cred1, attr_id), + kcdb_cred_buf_size(cred1, attr_id), + kcdb_cred_buf_get(cred2, attr_id), + kcdb_cred_buf_size(cred2, attr_id)); + } + +_exit: + kcdb_cred_unlock_read(); + if(attrib) + kcdb_attrib_release_info(attrib); + if(type) + kcdb_type_release_info(type); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_creds_is_equal(khm_handle vcred1, + khm_handle vcred2) +{ + khm_int32 code = 0; + kcdb_cred * cred1; + kcdb_cred * cred2; + + kcdb_cred_lock_read(); + if(!kcdb_cred_is_active_cred(vcred1) || + !kcdb_cred_is_active_cred(vcred2)) { + + code = FALSE; + goto _exit; + + } + + if(vcred1 == vcred2) { + + code = TRUE; + goto _exit; + + } + + cred1 = vcred1; + cred2 = vcred2; + + if(cred1->identity == cred2->identity && + cred1->type == cred2->type && + !wcscmp(cred1->name, cred2->name)) { + + kcdb_credtype * type; + + code = TRUE; + + if (KHM_SUCCEEDED(kcdb_credtype_get_info(cred1->type, &type))) { + if (type->is_equal && + (*type->is_equal)(vcred1, vcred2, NULL)) + code = 0; + + kcdb_credtype_release_info(type); + } + } + +_exit: + kcdb_cred_unlock_read(); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_flags(khm_handle vcred, + khm_int32 * pflags) +{ + khm_int32 f; + khm_int32 rv = KHM_ERROR_SUCCESS; + kcdb_cred * cred; + int release_lock = TRUE; + + if (pflags == NULL) + return KHM_ERROR_INVALID_PARAM; + + kcdb_cred_lock_read(); + if (!kcdb_cred_is_active_cred(vcred)) { + *pflags = 0; + rv = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = vcred; + f = cred->flags; + + /* Update flags if necessary */ + + if (!(f & KCDB_CRED_FLAG_EXPIRED) && + kcdb_cred_buf_exist(cred, KCDB_ATTR_EXPIRE)) { + + FILETIME ftc; + + GetSystemTimeAsFileTime(&ftc); + if (CompareFileTime(&ftc, ((FILETIME *) + kcdb_cred_buf_get(cred, KCDB_ATTR_EXPIRE))) + >= 0) + f |= KCDB_CRED_FLAG_EXPIRED; + } + +#if 0 + /* Commented out: if the credential has expired, then checking the + renewable time is not useful */ + if (!(f & KCDB_CRED_FLAG_INVALID)) { + if (f & KCDB_CRED_FLAG_RENEWABLE) { + if (kcdb_cred_buf_exist(cred, KCDB_ATTR_RENEW_EXPIRE)) { + FILETIME ftc; + + GetSystemTimeAsFileTime(&ftc); + if (CompareFileTime(&ftc, ((FILETIME *) + kcdb_cred_buf_get(cred, KCDB_ATTR_RENEW_EXPIRE))) >= 0) + f |= KCDB_CRED_FLAG_INVALID; + } + } else { + if (f & KCDB_CRED_FLAG_EXPIRED) + f |= KCDB_CRED_FLAG_INVALID; + } + } + + /* Commented out: this is a read operation. We shouldn't attempt + to lock for writing */ + if (f != cred->flags) { + kcdb_cred_unlock_read(); + kcdb_cred_lock_write(); + /* Did we lose a race? */ + if (kcdb_cred_is_active_cred(vcred)) + cred->flags = f; + else { + rv = KHM_ERROR_INVALID_PARAM; + f = 0; + } + kcdb_cred_unlock_write(); + release_lock = FALSE; + } +#endif + + *pflags = f; + + _exit: + if (release_lock) + kcdb_cred_unlock_read(); + + return rv; +} + +KHMEXP khm_int32 KHMAPI kcdb_cred_set_flags( + khm_handle vcred, + khm_int32 flags, + khm_int32 mask) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + kcdb_cred * cred; + + kcdb_cred_lock_write(); + if(!kcdb_cred_is_active_cred(vcred)) { + rv = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cred = vcred; + + flags &= ~(KCDB_CRED_FLAG_DELETED); + mask &= ~(KCDB_CRED_FLAG_DELETED); + + cred->flags = + (cred->flags & (~mask)) | + (flags & mask); + + _exit: + kcdb_cred_unlock_write(); + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/type.h +++ krb5-1.4.4/src/windows/identity/kcreddb/type.h @@ -1,216 +1,216 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCDB_TYPE_H -#define __KHIMAIRA_KCDB_TYPE_H - -/* Types */ - -typedef struct kcdb_type_i_t { - kcdb_type type; - - khm_int32 refcount; - - struct kcdb_type_i_t * next; - struct kcdb_type_i_t * prev; -} kcdb_type_i; - -#define KCDB_TYPE_HASH_SIZE 31 - -#define KCDB_TYPE_FLAG_DELETED 8 - -void kcdb_type_init(void); -void kcdb_type_exit(void); -void kcdb_type_add_ref(const void *key, void *vt); -void kcdb_type_del_ref(const void *key, void *vt); -void kcdb_type_msg_completion(kmq_message * m); -khm_int32 kcdb_type_hold(kcdb_type_i * t); -khm_int32 kcdb_type_release(kcdb_type_i * t); -void kcdb_type_check_and_delete(khm_int32 id); -void kcdb_type_post_message(khm_int32 op, kcdb_type_i * t); - -khm_int32 KHMAPI kcdb_type_void_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags); - -khm_boolean KHMAPI kcdb_type_void_isValid( - const void * d, - khm_size cbd); - -khm_int32 KHMAPI kcdb_type_void_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2); - -khm_int32 KHMAPI kcdb_type_void_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst); - -khm_int32 KHMAPI kcdb_type_string_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags); - -khm_boolean KHMAPI kcdb_type_string_isValid( - const void * d, - khm_size cbd); - -khm_int32 KHMAPI kcdb_type_string_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2); - -khm_int32 KHMAPI kcdb_type_string_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst); - -khm_int32 KHMAPI kcdb_type_date_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags); - -khm_boolean KHMAPI kcdb_type_date_isValid( - const void * d, - khm_size cbd); - -khm_int32 KHMAPI kcdb_type_date_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2); - -khm_int32 KHMAPI kcdb_type_date_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst); - -khm_int32 KHMAPI kcdb_type_interval_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags); - -khm_boolean KHMAPI kcdb_type_interval_isValid( - const void * d, - khm_size cbd); - -khm_int32 KHMAPI kcdb_type_interval_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2); - -khm_int32 KHMAPI kcdb_type_interval_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst); - -khm_int32 KHMAPI kcdb_type_int32_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags); - -khm_boolean KHMAPI kcdb_type_int32_isValid( - const void * d, - khm_size cbd); - -khm_int32 KHMAPI kcdb_type_int32_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2); - -khm_int32 KHMAPI kcdb_type_int32_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst); - -khm_int32 KHMAPI kcdb_type_int64_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags); - -khm_boolean KHMAPI kcdb_type_int64_isValid( - const void * d, - khm_size cbd); - -khm_int32 KHMAPI kcdb_type_int64_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2); - -khm_int32 KHMAPI kcdb_type_int64_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst); - -khm_int32 KHMAPI kcdb_type_data_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags); - -khm_boolean KHMAPI kcdb_type_data_isValid( - const void * d, - khm_size cbd); - -khm_int32 KHMAPI kcdb_type_data_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2); - -khm_int32 KHMAPI kcdb_type_data_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCDB_TYPE_H +#define __KHIMAIRA_KCDB_TYPE_H + +/* Types */ + +typedef struct kcdb_type_i_t { + kcdb_type type; + + khm_int32 refcount; + + struct kcdb_type_i_t * next; + struct kcdb_type_i_t * prev; +} kcdb_type_i; + +#define KCDB_TYPE_HASH_SIZE 31 + +#define KCDB_TYPE_FLAG_DELETED 8 + +void kcdb_type_init(void); +void kcdb_type_exit(void); +void kcdb_type_add_ref(const void *key, void *vt); +void kcdb_type_del_ref(const void *key, void *vt); +void kcdb_type_msg_completion(kmq_message * m); +khm_int32 kcdb_type_hold(kcdb_type_i * t); +khm_int32 kcdb_type_release(kcdb_type_i * t); +void kcdb_type_check_and_delete(khm_int32 id); +void kcdb_type_post_message(khm_int32 op, kcdb_type_i * t); + +khm_int32 KHMAPI kcdb_type_void_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags); + +khm_boolean KHMAPI kcdb_type_void_isValid( + const void * d, + khm_size cbd); + +khm_int32 KHMAPI kcdb_type_void_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2); + +khm_int32 KHMAPI kcdb_type_void_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst); + +khm_int32 KHMAPI kcdb_type_string_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags); + +khm_boolean KHMAPI kcdb_type_string_isValid( + const void * d, + khm_size cbd); + +khm_int32 KHMAPI kcdb_type_string_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2); + +khm_int32 KHMAPI kcdb_type_string_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst); + +khm_int32 KHMAPI kcdb_type_date_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags); + +khm_boolean KHMAPI kcdb_type_date_isValid( + const void * d, + khm_size cbd); + +khm_int32 KHMAPI kcdb_type_date_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2); + +khm_int32 KHMAPI kcdb_type_date_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst); + +khm_int32 KHMAPI kcdb_type_interval_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags); + +khm_boolean KHMAPI kcdb_type_interval_isValid( + const void * d, + khm_size cbd); + +khm_int32 KHMAPI kcdb_type_interval_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2); + +khm_int32 KHMAPI kcdb_type_interval_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst); + +khm_int32 KHMAPI kcdb_type_int32_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags); + +khm_boolean KHMAPI kcdb_type_int32_isValid( + const void * d, + khm_size cbd); + +khm_int32 KHMAPI kcdb_type_int32_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2); + +khm_int32 KHMAPI kcdb_type_int32_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst); + +khm_int32 KHMAPI kcdb_type_int64_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags); + +khm_boolean KHMAPI kcdb_type_int64_isValid( + const void * d, + khm_size cbd); + +khm_int32 KHMAPI kcdb_type_int64_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2); + +khm_int32 KHMAPI kcdb_type_int64_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst); + +khm_int32 KHMAPI kcdb_type_data_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags); + +khm_boolean KHMAPI kcdb_type_data_isValid( + const void * d, + khm_size cbd); + +khm_int32 KHMAPI kcdb_type_data_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2); + +khm_int32 KHMAPI kcdb_type_data_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst); + +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/type.c +++ krb5-1.4.4/src/windows/identity/kcreddb/type.c @@ -1,1370 +1,1370 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -CRITICAL_SECTION cs_type; -hashtable * kcdb_type_namemap; -kcdb_type_i ** kcdb_type_tbl; -kcdb_type_i * kcdb_types = NULL; - -/* Void */ - -#define GENERIC_VOID_STR L"(Void)" - -khm_int32 KHMAPI kcdb_type_void_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags) -{ - size_t cbsize; - - if(!cb_buf) - return KHM_ERROR_INVALID_PARAM; - - cbsize = sizeof(GENERIC_VOID_STR); - - if(!buffer || *cb_buf < cbsize) { - *cb_buf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *cb_buf, GENERIC_VOID_STR); - - *cb_buf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -khm_boolean KHMAPI kcdb_type_void_isValid( - const void * d, - khm_size cbd) -{ - /* void is always valid, even if d is NULL */ - return TRUE; -} - -khm_int32 KHMAPI kcdb_type_void_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2) -{ - /* voids can not be compared */ - return 0; -} - -khm_int32 KHMAPI kcdb_type_void_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst) -{ - if(!cbd_dst) - return KHM_ERROR_INVALID_PARAM; - - *cbd_dst = 0; - - /* copying a void doesn't do much */ - return KHM_ERROR_SUCCESS; -} - - -/* String */ -khm_int32 KHMAPI kcdb_type_string_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags) -{ - size_t cbsize; - wchar_t * sd; - - if(!cb_buf) - return KHM_ERROR_INVALID_PARAM; - - sd = (wchar_t *) d; - - if(FAILED(StringCbLength(sd, KCDB_TYPE_MAXCB, &cbsize))) - return KHM_ERROR_INVALID_PARAM; - - cbsize += sizeof(wchar_t); - - if(!buffer || *cb_buf < cbsize) { - *cb_buf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *cb_buf, sd); - - *cb_buf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -khm_boolean KHMAPI kcdb_type_string_isValid( - const void * d, - khm_size cbd) -{ - size_t cbsize; - - if(cbd == KCDB_CBSIZE_AUTO) - cbd = KCDB_TYPE_MAXCB; - - if(FAILED(StringCbLength((wchar_t *) d, cbd, &cbsize))) - return FALSE; - else - return TRUE; -} - -khm_int32 KHMAPI kcdb_type_string_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2) -{ - return wcscmp((const wchar_t *) d1, (const wchar_t *) d2); -} - -khm_int32 KHMAPI kcdb_type_string_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst) -{ - size_t cbsize; - - if(!cbd_dst) - return KHM_ERROR_INVALID_PARAM; - - if(cbd_src == KCDB_CBSIZE_AUTO) { - cbd_src = KCDB_TYPE_MAXCB; - } - - if(FAILED(StringCbLength((const wchar_t *) d_src, cbd_src, &cbsize))) { - return KHM_ERROR_UNKNOWN; - } - - cbsize += sizeof(wchar_t); - - if(!d_dst || *cbd_dst < cbsize) { - *cbd_dst = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy((wchar_t *) d_dst, *cbd_dst, (const wchar_t *) d_src); - *cbd_dst = cbsize; - - return KHM_ERROR_SUCCESS; -} - -/* Date and time */ - - -khm_int32 KHMAPI kcdb_type_date_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags) -{ - size_t cbsize; - size_t cchsize; - wchar_t * bufend; - SYSTEMTIME st_now; - SYSTEMTIME st_d; - SYSTEMTIME st_dl; - FILETIME *ft; - int today = 0; - - if(!cb_buf) - return KHM_ERROR_INVALID_PARAM; - - ft = (FILETIME *) d; - - GetLocalTime(&st_now); - FileTimeToSystemTime(ft, &st_d); - SystemTimeToTzSpecificLocalTime(NULL, &st_d, &st_dl); - if (st_now.wYear == st_dl.wYear && - st_now.wMonth == st_dl.wMonth && - st_now.wDay == st_dl.wDay) - today = 1; - - if(today && (flags & KCDB_TS_SHORT)) { - cbsize = 0; - } else { - cbsize = GetDateFormat( - LOCALE_USER_DEFAULT, - DATE_SHORTDATE, - &st_dl, - NULL, - NULL, - 0) * sizeof(wchar_t); - } - - cbsize += GetTimeFormat( - LOCALE_USER_DEFAULT, - 0, - &st_dl, - NULL, - NULL, - 0) * sizeof(wchar_t); - - if(!buffer || *cb_buf < cbsize) { - *cb_buf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - cchsize = cbsize / sizeof(wchar_t); - - if(!today || !(flags & KCDB_TS_SHORT)) { - size_t cch_buf_len; - - GetDateFormat( - LOCALE_USER_DEFAULT, - DATE_SHORTDATE, - &st_dl, - NULL, - buffer, - (int) cchsize); - - StringCchCat(buffer, cchsize, L" "); - - StringCchLength(buffer, cchsize, &cch_buf_len); - - bufend = buffer + cch_buf_len; - cchsize -= cch_buf_len; - } else { - bufend = buffer; - } - - GetTimeFormat( - LOCALE_USER_DEFAULT, - 0, - &st_dl, - NULL, - bufend, - (int) cchsize); - - *cb_buf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -khm_boolean KHMAPI kcdb_type_date_isValid( - const void * d, - khm_size cbd) -{ - return (d && (cbd == KCDB_CBSIZE_AUTO || cbd == sizeof(FILETIME))); -} - -khm_int32 KHMAPI kcdb_type_date_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2) -{ - return (khm_int32) CompareFileTime((CONST FILETIME *) d1, (CONST FILETIME *) d2); -} - -khm_int32 KHMAPI kcdb_type_date_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst) -{ - if(d_dst && *cbd_dst >= sizeof(FILETIME)) { - *cbd_dst = sizeof(FILETIME); - *((FILETIME *) d_dst) = *((FILETIME *) d_src); - return KHM_ERROR_SUCCESS; - } else { - *cbd_dst = sizeof(FILETIME); - return KHM_ERROR_TOO_LONG; - } -} - -/* Interval */ - -/* returns the number of milliseconds that must elapse away from the - interval specified in pft for the representation of pft to change - from whatever it is right now */ -KHMEXP long KHMAPI -FtIntervalMsToRepChange(LPFILETIME pft) -{ - __int64 ms,s,m,h,d; - __int64 ift; - long l; - - ift = FtToInt(pft); - ms = ift / 10000i64; - - if(ms < 0 || ift == _I64_MAX) - return -1; - - s = ms / 1000i64; - m = s / 60; - h = s / 3600; - d = s / (3600*24); - - if (d > 0) { - /* rep change at next hour change */ - l = (long) (ms % (3600*1000i64)); - } else if (h > 0) { - /* rep change at next minute change */ - l = (long) (ms % (60*1000i64)); - } else if (m > 5) { - /* rep change at next minute change */ - l = (long) (ms % (60*1000i64)); - } else { - /* rep change at next second change */ - l = (long) (ms % 1000); - } - - return l; -} - -KHMEXP khm_int32 KHMAPI -FtIntervalToString(LPFILETIME data, wchar_t * buffer, khm_size * cb_buf) -{ - size_t cbsize; - __int64 s,m,h,d; - __int64 ift; - wchar_t ibuf[256]; - wchar_t fbuf[256]; - wchar_t * t; - - if(!cb_buf) - return KHM_ERROR_INVALID_PARAM; - - ift = FtToInt(data); - s = ift / 10000000i64; - - m = s / 60; - h = s / 3600; - d = s / (3600*24); - - if(ift == _I64_MAX) { -#ifdef INDICATE_UNKNOWN_EXPIRY_TIMES - LoadString(hinst_kcreddb, IDS_IVL_UNKNOWN, ibuf, sizeof(ibuf)/sizeof(wchar_t)); -#else - StringCbCopy(ibuf, sizeof(ibuf), L""); -#endif - } else if(s < 0) { - LoadString(hinst_kcreddb, IDS_IVL_EXPIRED, ibuf, sizeof(ibuf)/sizeof(wchar_t)); - } else if(d > 0) { - h = (s - (d * 3600 * 24)) / 3600; - if(d == 1) { - LoadString(hinst_kcreddb, IDS_IVL_1D, ibuf, ARRAYLENGTH(ibuf)); - } else { - LoadString(hinst_kcreddb, IDS_IVL_D, fbuf, ARRAYLENGTH(fbuf)); - StringCbPrintf(ibuf, sizeof(ibuf), fbuf, d); - } - if(h > 0) { - StringCbCat(ibuf, sizeof(ibuf), L" "); - t = ibuf + wcslen(ibuf); - if(h == 1) - { - LoadString(hinst_kcreddb, IDS_IVL_1H, t, - (int) (ARRAYLENGTH(ibuf) - wcslen(ibuf))); - } else { - LoadString(hinst_kcreddb, IDS_IVL_H, fbuf, - (int) ARRAYLENGTH(fbuf)); - StringCbPrintf(t, sizeof(ibuf) - wcslen(ibuf)*sizeof(wchar_t), fbuf, h); - } - } - } else if(h > 0 || m > 5) { - m = (s - (h * 3600)) / 60; - if(h == 1) { - LoadString(hinst_kcreddb, IDS_IVL_1H, ibuf, ARRAYLENGTH(ibuf)); - } else if (h > 1) { - LoadString(hinst_kcreddb, IDS_IVL_H, fbuf, ARRAYLENGTH(fbuf)); - StringCbPrintf(ibuf, sizeof(ibuf), fbuf, h); - } else { - *ibuf = L'\0'; - } - - if(m > 0 || h == 0) { - if (h >= 1) - StringCbCat(ibuf, sizeof(ibuf), L" "); - - t = ibuf + wcslen(ibuf); - if(m == 1) - { - LoadString(hinst_kcreddb, IDS_IVL_1M, t, - (int) (ARRAYLENGTH(ibuf) - wcslen(ibuf))); - } else { - LoadString(hinst_kcreddb, IDS_IVL_M, fbuf, - (int) ARRAYLENGTH(fbuf)); - StringCbPrintf(t, sizeof(ibuf) - wcslen(ibuf)*sizeof(wchar_t), fbuf, m); - } - } - } else if(m > 0) { - s -= m * 60; - if(m == 1) { - LoadString(hinst_kcreddb, IDS_IVL_1M, ibuf, ARRAYLENGTH(ibuf)); - } else { - LoadString(hinst_kcreddb, IDS_IVL_M, fbuf, ARRAYLENGTH(fbuf)); - StringCbPrintf(ibuf, sizeof(ibuf), fbuf, m); - } - if(s > 0) { - StringCbCat(ibuf, sizeof(ibuf), L" "); - t = ibuf + wcslen(ibuf); - if(s == 1) - { - LoadString(hinst_kcreddb, IDS_IVL_1S, t, - (int) (ARRAYLENGTH(ibuf) - wcslen(ibuf))); - } else { - LoadString(hinst_kcreddb, IDS_IVL_S, fbuf, - (int) ARRAYLENGTH(fbuf)); - StringCbPrintf(t, sizeof(ibuf) - wcslen(ibuf)*sizeof(wchar_t), fbuf, s); - } - } - } else { - if(s == 1) { - LoadString(hinst_kcreddb, IDS_IVL_1S, ibuf, ARRAYLENGTH(ibuf)); - } else { - LoadString(hinst_kcreddb, IDS_IVL_S, fbuf, sizeof(fbuf)/sizeof(wchar_t)); - StringCbPrintf(ibuf, sizeof(ibuf), fbuf, s); - } - } - - StringCbLength(ibuf, sizeof(ibuf), &cbsize); - cbsize += sizeof(wchar_t); - - if(!buffer || *cb_buf < cbsize) { - *cb_buf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *cb_buf, ibuf); - *cb_buf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -khm_int32 KHMAPI -kcdb_type_interval_toString(const void * data, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags) -{ - return FtIntervalToString((LPFILETIME) data, buffer, cb_buf); -} - -khm_boolean KHMAPI kcdb_type_interval_isValid( - const void * d, - khm_size cbd) -{ - return (d && (cbd == sizeof(FILETIME) || cbd == KCDB_CBSIZE_AUTO)); -} - -khm_int32 KHMAPI kcdb_type_interval_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2) -{ - __int64 i1, i2; - - i1 = FtToInt((FILETIME *) d1); - i2 = FtToInt((FILETIME *) d2); - - if(i1 < i2) - return -1; - else if(i1 > i2) - return 1; - else - return 0; -} - -khm_int32 KHMAPI kcdb_type_interval_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst) -{ - if(d_dst && *cbd_dst >= sizeof(FILETIME)) { - *cbd_dst = sizeof(FILETIME); - *((FILETIME *) d_dst) = *((FILETIME *) d_src); - return KHM_ERROR_SUCCESS; - } else { - *cbd_dst = sizeof(FILETIME); - return KHM_ERROR_TOO_LONG; - } -} - -/* Int32 */ - -khm_int32 KHMAPI kcdb_type_int32_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags) -{ - size_t cbsize; - wchar_t ibuf[12]; - - if(!cb_buf) - return KHM_ERROR_INVALID_PARAM; - - StringCbPrintf(ibuf, sizeof(ibuf), L"%d", *((khm_int32 *) d)); - StringCbLength(ibuf, sizeof(ibuf), &cbsize); - cbsize += sizeof(wchar_t); - - if(!buffer || *cb_buf < cbsize) { - *cb_buf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy((wchar_t *) buffer, *cb_buf, ibuf); - *cb_buf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -khm_boolean KHMAPI kcdb_type_int32_isValid( - const void * d, - khm_size cbd) -{ - return (d && (cbd == KCDB_CBSIZE_AUTO || cbd == sizeof(khm_int32))); -} - -khm_int32 KHMAPI kcdb_type_int32_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2) -{ - return *((khm_int32 *) d1) - *((khm_int32 *) d2); -} - -khm_int32 KHMAPI kcdb_type_int32_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst) -{ - if(d_dst && (*cbd_dst >= sizeof(khm_int32))) { - *cbd_dst = sizeof(khm_int32); - *((khm_int32 *) d_dst) = *((khm_int32 *) d_src); - return KHM_ERROR_SUCCESS; - } else { - *cbd_dst = sizeof(khm_int32); - return KHM_ERROR_TOO_LONG; - } -} - -/* Int64 */ - -khm_int32 KHMAPI kcdb_type_int64_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags) -{ - size_t cbsize; - wchar_t ibuf[22]; - - if(!cb_buf) - return KHM_ERROR_INVALID_PARAM; - - StringCbPrintf(ibuf, sizeof(ibuf), L"%I64d", *((__int64 *) d)); - StringCbLength(ibuf, sizeof(ibuf), &cbsize); - cbsize += sizeof(wchar_t); - - if(!buffer || *cb_buf < cbsize) { - *cb_buf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy((wchar_t *) buffer, *cb_buf, ibuf); - *cb_buf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -khm_boolean KHMAPI kcdb_type_int64_isValid( - const void * d, - khm_size cbd) -{ - return (d && (cbd == KCDB_CBSIZE_AUTO || cbd == sizeof(__int64))); -} - -khm_int32 KHMAPI kcdb_type_int64_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2) -{ - __int64 r = *((__int64 *) d1) - *((__int64 *) d2); - return (r==0i64)?0:((r>0i64)?1:-1); -} - -khm_int32 KHMAPI kcdb_type_int64_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst) -{ - if(d_dst && (*cbd_dst >= sizeof(__int64))) { - *cbd_dst = sizeof(__int64); - *((__int64 *) d_dst) = *((__int64 *) d_src); - return KHM_ERROR_SUCCESS; - } else { - *cbd_dst = sizeof(__int64); - return KHM_ERROR_TOO_LONG; - } -} - -/* Data */ -#define GENERIC_DATA_STR L"(Data)" - -khm_int32 KHMAPI kcdb_type_data_toString( - const void * d, - khm_size cbd, - wchar_t * buffer, - khm_size * cb_buf, - khm_int32 flags) -{ - size_t cbsize; - - if(!cb_buf) - return KHM_ERROR_INVALID_PARAM; - - cbsize = sizeof(GENERIC_DATA_STR); - - if(!buffer || *cb_buf < cbsize) { - *cb_buf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *cb_buf, GENERIC_DATA_STR); - - *cb_buf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -khm_boolean KHMAPI kcdb_type_data_isValid( - const void * d, - khm_size cbd) -{ - /* data is always valid, even if d is NULL */ - return TRUE; -} - -khm_int32 KHMAPI kcdb_type_data_comp( - const void * d1, - khm_size cbd1, - const void * d2, - khm_size cbd2) -{ - /* datas can not be compared */ - return 0; -} - -khm_int32 KHMAPI kcdb_type_data_dup( - const void * d_src, - khm_size cbd_src, - void * d_dst, - khm_size * cbd_dst) -{ - if(!cbd_dst) - return KHM_ERROR_INVALID_PARAM; - - *cbd_dst = cbd_src; - - if(!d_dst || *cbd_dst < cbd_src) { - return KHM_ERROR_TOO_LONG; - } else { - memcpy(d_dst, d_src, cbd_src); - return KHM_ERROR_SUCCESS; - } -} - - -void kcdb_type_msg_completion(kmq_message * m) -{ - kcdb_type_release((kcdb_type_i *) m->vparam); -} - -void kcdb_type_post_message(khm_int32 op, kcdb_type_i * t) -{ - kcdb_type_hold(t); - kmq_post_message(KMSG_KCDB, KMSG_KCDB_TYPE, op, (void *) t); -} - -void kcdb_type_init(void) -{ - kcdb_type type; - - InitializeCriticalSection(&cs_type); - kcdb_type_namemap = hash_new_hashtable( - KCDB_TYPE_HASH_SIZE, - hash_string, - hash_string_comp, - kcdb_type_add_ref, - kcdb_type_del_ref); - kcdb_type_tbl = PMALLOC(sizeof(kcdb_type_i *) * (KCDB_TYPE_MAX_ID + 1)); - ZeroMemory(kcdb_type_tbl, sizeof(kcdb_type_i *) * (KCDB_TYPE_MAX_ID + 1)); - kcdb_types = NULL; - - /*TODO: register standard data types */ - - ZeroMemory(&type, sizeof(type)); - type.comp = kcdb_type_void_comp; - type.dup = kcdb_type_void_dup; - type.isValid = kcdb_type_void_isValid; - type.toString = kcdb_type_void_toString; - type.name = KCDB_TYPENAME_VOID; - type.id = KCDB_TYPE_VOID; - - kcdb_type_register(&type, NULL); - - ZeroMemory(&type, sizeof(type)); - type.comp = kcdb_type_string_comp; - type.dup = kcdb_type_string_dup; - type.isValid = kcdb_type_string_isValid; - type.toString = kcdb_type_string_toString; - type.name = KCDB_TYPENAME_STRING; - type.id = KCDB_TYPE_STRING; - type.flags = KCDB_TYPE_FLAG_CB_AUTO; - - kcdb_type_register(&type, NULL); - - ZeroMemory(&type, sizeof(type)); - type.comp = kcdb_type_date_comp; - type.dup = kcdb_type_date_dup; - type.isValid = kcdb_type_date_isValid; - type.toString = kcdb_type_date_toString; - type.name = KCDB_TYPENAME_DATE; - type.id = KCDB_TYPE_DATE; - type.cb_max = sizeof(FILETIME); - type.cb_min = sizeof(FILETIME); - type.flags = KCDB_TYPE_FLAG_CB_FIXED; - - kcdb_type_register(&type, NULL); - - ZeroMemory(&type, sizeof(type)); - type.comp = kcdb_type_interval_comp; - type.dup = kcdb_type_interval_dup; - type.isValid = kcdb_type_interval_isValid; - type.toString = kcdb_type_interval_toString; - type.name = KCDB_TYPENAME_INTERVAL; - type.id = KCDB_TYPE_INTERVAL; - type.cb_max = sizeof(FILETIME); - type.cb_min = sizeof(FILETIME); - type.flags = KCDB_TYPE_FLAG_CB_FIXED; - - kcdb_type_register(&type, NULL); - - ZeroMemory(&type, sizeof(type)); - type.comp = kcdb_type_int32_comp; - type.dup = kcdb_type_int32_dup; - type.isValid = kcdb_type_int32_isValid; - type.toString = kcdb_type_int32_toString; - type.name = KCDB_TYPENAME_INT32; - type.id = KCDB_TYPE_INT32; - type.cb_max = sizeof(khm_int32); - type.cb_min = sizeof(khm_int32); - type.flags = KCDB_TYPE_FLAG_CB_FIXED; - - kcdb_type_register(&type, NULL); - - ZeroMemory(&type, sizeof(type)); - type.comp = kcdb_type_int64_comp; - type.dup = kcdb_type_int64_dup; - type.isValid = kcdb_type_int64_isValid; - type.toString = kcdb_type_int64_toString; - type.name = KCDB_TYPENAME_INT64; - type.id = KCDB_TYPE_INT64; - type.cb_max = sizeof(__int64); - type.cb_min = sizeof(__int64); - type.flags = KCDB_TYPE_FLAG_CB_FIXED; - - kcdb_type_register(&type, NULL); - - ZeroMemory(&type, sizeof(type)); - type.comp = kcdb_type_data_comp; - type.dup = kcdb_type_data_dup; - type.isValid = kcdb_type_data_isValid; - type.toString = kcdb_type_data_toString; - type.name = KCDB_TYPENAME_DATA; - type.id = KCDB_TYPE_DATA; - - kcdb_type_register(&type, NULL); -} - -void kcdb_type_add_ref(const void *key, void *vt) -{ - kcdb_type_hold((kcdb_type_i *) vt); -} - -void kcdb_type_del_ref(const void *key, void *vt) -{ - kcdb_type_release((kcdb_type_i *) vt); -} - -khm_int32 kcdb_type_hold(kcdb_type_i * t) -{ - if(!t) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_type); - t->refcount++; - LeaveCriticalSection(&cs_type); - - return KHM_ERROR_SUCCESS; -} - -khm_int32 kcdb_type_release(kcdb_type_i * t) -{ - if(!t) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_type); - t->refcount--; - kcdb_type_check_and_delete(t->type.id); - LeaveCriticalSection(&cs_type); - - return KHM_ERROR_SUCCESS; -} - -void kcdb_type_exit(void) -{ - EnterCriticalSection(&cs_type); - PFREE(kcdb_type_tbl); - /*TODO: free up the individual types */ - LeaveCriticalSection(&cs_type); - DeleteCriticalSection(&cs_type); -} - -void kcdb_type_check_and_delete(khm_int32 id) -{ - kcdb_type_i * t; - - if(id < 0 || id > KCDB_TYPE_MAX_ID) - return; - - EnterCriticalSection(&cs_type); - t = kcdb_type_tbl[id]; - if(t && !t->refcount) { - kcdb_type_tbl[id] = NULL; - LDELETE(&kcdb_types, t); - /* must already be out of the hash-table, otherwise refcount should not - be zero */ - PFREE(t->type.name); - PFREE(t); - } - LeaveCriticalSection(&cs_type); -} - -KHMEXP khm_int32 KHMAPI kcdb_type_get_id(wchar_t *name, khm_int32 * id) -{ - kcdb_type_i * t; - size_t cbsize; - - if(FAILED(StringCbLength(name, KCDB_MAXCB_NAME, &cbsize))) { - /* also fails of name is NULL */ - return KHM_ERROR_INVALID_PARAM; - } - - EnterCriticalSection(&cs_type); - t = hash_lookup(kcdb_type_namemap, (void*) name); - LeaveCriticalSection(&cs_type); - - if(!t) { - *id = KCDB_TYPE_INVALID; - return KHM_ERROR_NOT_FOUND; - } else { - *id = t->type.id; - return KHM_ERROR_SUCCESS; - } -} - -KHMEXP khm_int32 KHMAPI kcdb_type_get_info(khm_int32 id, kcdb_type ** info) -{ - kcdb_type_i * t; - - if(id < 0 || id > KCDB_TYPE_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_type); - t = kcdb_type_tbl[id]; - - if (t) - kcdb_type_hold(t); - LeaveCriticalSection(&cs_type); - - if(info) - *info = (kcdb_type *) t; - else if (t) - kcdb_type_release(t); - - return (t)? KHM_ERROR_SUCCESS : KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI kcdb_type_release_info(kcdb_type * info) -{ - return kcdb_type_release((kcdb_type_i *) info); -} - -KHMEXP khm_int32 KHMAPI kcdb_type_get_name(khm_int32 id, wchar_t * buffer, khm_size * cbbuf) -{ - size_t cbsize; - kcdb_type_i * t; - - if(id < 0 || id > KCDB_TYPE_MAX_ID || !cbbuf) - return KHM_ERROR_INVALID_PARAM; - - t = kcdb_type_tbl[id]; - - if(!t) - return KHM_ERROR_NOT_FOUND; - - if(FAILED(StringCbLength(t->type.name, KCDB_MAXCB_NAME, &cbsize))) - return KHM_ERROR_UNKNOWN; - - cbsize += sizeof(wchar_t); - - if(!buffer || *cbbuf < cbsize) { - *cbbuf = cbsize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *cbbuf, t->type.name); - *cbbuf = cbsize; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_type_register(kcdb_type * type, khm_int32 * new_id) -{ - kcdb_type_i *t; - size_t cbsize; - khm_int32 type_id; - - if(!type || - !type->comp || - !type->dup || - !type->isValid || - !type->toString || - !type->name) - return KHM_ERROR_INVALID_PARAM; - - if((type->flags & KCDB_TYPE_FLAG_CB_MIN) && - (type->cb_min < 0 || type->cb_min > KCDB_TYPE_MAXCB)) - { - return KHM_ERROR_INVALID_PARAM; - } - - if((type->flags & KCDB_TYPE_FLAG_CB_MAX) && - (type->cb_max < 0 || type->cb_max > KCDB_TYPE_MAXCB)) - { - return KHM_ERROR_INVALID_PARAM; - } - - if((type->flags & KCDB_TYPE_FLAG_CB_MIN) && - (type->flags & KCDB_TYPE_FLAG_CB_MAX) && - (type->cb_max < type->cb_min)) - { - return KHM_ERROR_INVALID_PARAM; - } - - if(FAILED(StringCbLength(type->name, KCDB_MAXCB_NAME, &cbsize))) - return KHM_ERROR_TOO_LONG; - - cbsize += sizeof(wchar_t); - - EnterCriticalSection(&cs_type); - if(type->id == KCDB_TYPE_INVALID) { - kcdb_type_get_next_free(&type_id); - } else if(type->id < 0 || type->id > KCDB_TYPE_MAX_ID) { - LeaveCriticalSection(&cs_type); - return KHM_ERROR_INVALID_PARAM; - } else if(kcdb_type_tbl[type->id]) { - LeaveCriticalSection(&cs_type); - return KHM_ERROR_DUPLICATE; - } else { - type_id = type->id; - } - - if(type_id == KCDB_TYPE_INVALID) { - LeaveCriticalSection(&cs_type); - return KHM_ERROR_NO_RESOURCES; - } - - t = PMALLOC(sizeof(kcdb_type_i)); - ZeroMemory(t, sizeof(kcdb_type_i)); - - t->type.name = PMALLOC(cbsize); - StringCbCopy(t->type.name, cbsize, type->name); - - t->type.comp = type->comp; - t->type.dup = type->dup; - t->type.flags = type->flags; - t->type.id = type_id; - t->type.isValid = type->isValid; - t->type.toString = type->toString; - - LINIT(t); - - kcdb_type_tbl[type_id] = t; - LPUSH(&kcdb_types, t); - - hash_add(kcdb_type_namemap, (void *) t->type.name, (void *) t); - - LeaveCriticalSection(&cs_type); - - if(new_id) - *new_id = type_id; - - kcdb_type_post_message(KCDB_OP_INSERT, t); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kcdb_type_unregister(khm_int32 id) -{ - kcdb_type_i * t; - - if(id < 0 || id > KCDB_TYPE_MAX_ID) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_type); - t = kcdb_type_tbl[id]; - if(t) { - kcdb_type_post_message(KCDB_OP_DELETE, t); - /* we are going to remove t from the hash table. If no one is holding - a reference to it, then we can free it (actually, the del_ref code - will take care of that anyway). If there is a hold, then it will - get freed when they release it. - - Actually, the post_message call above pretty much guarantees that - the type has a hold on it.*/ - t->type.flags |= KCDB_TYPE_FLAG_DELETED; - hash_del(kcdb_type_namemap, t->type.name); - } - LeaveCriticalSection(&cs_type); - - if(t) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI kcdb_type_get_next_free(khm_int32 * id) -{ - int i; - - if(!id) - return KHM_ERROR_INVALID_PARAM; - - /* do a linear search because this function only gets called a few times */ - EnterCriticalSection(&cs_type); - for(i=0; i <= KCDB_TYPE_MAX_ID; i++) { - if(!kcdb_type_tbl[i]) - break; - } - LeaveCriticalSection(&cs_type); - - if(i <= KCDB_TYPE_MAX_ID) { - *id = i; - return KHM_ERROR_SUCCESS; - } else { - *id = KCDB_TYPE_INVALID; - return KHM_ERROR_NO_RESOURCES; - } -} - -/* Conversion functions */ - -KHMEXP void KHMAPI TimetToFileTime( time_t t, LPFILETIME pft ) -{ - LONGLONG ll; - - if ( sizeof(time_t) == 4 ) - ll = Int32x32To64(t, 10000000) + 116444736000000000i64; - else { - ll = t * 10000000i64 + 116444736000000000i64; - } - pft->dwLowDateTime = (DWORD) ll; - pft->dwHighDateTime = (DWORD) (ll >> 32); -} - -KHMEXP void KHMAPI TimetToFileTimeInterval(time_t t, LPFILETIME pft) -{ - LONGLONG ll; - - if ( sizeof(time_t) == 4 ) - ll = Int32x32To64(t, 10000000); - else { - ll = t * 10000000i64; - } - pft->dwLowDateTime = (DWORD) ll; - pft->dwHighDateTime = (DWORD) (ll >> 32); -} - -KHMEXP long KHMAPI FtIntervalToSeconds(LPFILETIME pft) -{ - __int64 i = FtToInt(pft); - return (long) (i / 10000000i64); -} - -KHMEXP long KHMAPI FtIntervalToMilliseconds(LPFILETIME pft) -{ - __int64 i = FtToInt(pft); - return (long) (i / 10000i64); -} - -KHMEXP khm_int64 KHMAPI FtToInt(LPFILETIME pft) { - LARGE_INTEGER ll; - ll.LowPart = pft->dwLowDateTime; - ll.HighPart = pft->dwHighDateTime; - return ll.QuadPart; -} - -KHMEXP FILETIME KHMAPI IntToFt(khm_int64 i) { - LARGE_INTEGER ll; - FILETIME ft; - - ll.QuadPart = i; - ft.dwLowDateTime = ll.LowPart; - ft.dwHighDateTime = ll.HighPart; - - return ft; -} - -KHMEXP FILETIME KHMAPI FtSub(LPFILETIME ft1, LPFILETIME ft2) { - FILETIME d; - LARGE_INTEGER l1, l2; - - l1.LowPart = ft1->dwLowDateTime; - l1.HighPart = ft1->dwHighDateTime; - l2.LowPart = ft2->dwLowDateTime; - l2.HighPart = ft2->dwHighDateTime; - - l1.QuadPart -= l2.QuadPart; - - d.dwLowDateTime = l1.LowPart; - d.dwHighDateTime = l1.HighPart; - - return d; -} - -KHMEXP FILETIME KHMAPI FtAdd(LPFILETIME ft1, LPFILETIME ft2) { - FILETIME d; - LARGE_INTEGER l1, l2; - - l1.LowPart = ft1->dwLowDateTime; - l1.HighPart = ft1->dwHighDateTime; - l2.LowPart = ft2->dwLowDateTime; - l2.HighPart = ft2->dwHighDateTime; - - l1.QuadPart += l2.QuadPart; - - d.dwLowDateTime = l1.LowPart; - d.dwHighDateTime = l1.HighPart; - - return d; -} - -KHMEXP int KHMAPI AnsiStrToUnicode( wchar_t * wstr, size_t cbwstr, const char * astr) -{ - size_t nc; - - if(cbwstr == 0) - return 0; - - nc = strlen(astr); - if(nc == MultiByteToWideChar( - CP_ACP, - 0, - astr, - (int) nc, - wstr, - (int)(cbwstr / sizeof(wchar_t) - 1))) { - wstr[nc] = L'\0'; - } else { - wstr[0] = L'\0'; - nc = 0; - } - - return (int) nc; -} - -KHMEXP int KHMAPI UnicodeStrToAnsi( char * dest, size_t cbdest, const wchar_t * src) -{ - size_t nc; - - if(cbdest == 0) - return 0; - - dest[0] = 0; - - if(FAILED(StringCchLength(src, cbdest, &nc)) || nc*sizeof(char) >= cbdest) - // note that cbdest counts the terminating NULL, while nc doesn't - return 0; - - nc = WideCharToMultiByte( - CP_ACP, - WC_NO_BEST_FIT_CHARS, - src, - (int) nc, - dest, - (int) cbdest, - NULL, - NULL); - - dest[nc] = 0; - - return (int) nc; -} - -#define MAX_IVL_SPECLIST_LEN 256 -#define MAX_IVL_UNITS 5 - -enum _ivl_indices { - IVL_SECONDS = 0, - IVL_MINUTES, - IVL_HOURS, - IVL_DAYS, - IVL_WEEKS -}; - -typedef struct ivspec_t { - wchar_t str[MAX_IVL_SPECLIST_LEN]; - __int64 mul; -} ivspec; - -static ivspec ivspecs[MAX_IVL_UNITS]; -static BOOL ivspecs_loaded = FALSE; - -int _iv_is_in_spec(wchar_t *s, int n, wchar_t * spec) -{ - /* spec strigns are comma separated */ - wchar_t *b, *e; - - b = spec; - while(*b) { - e = wcschr(b, L','); - if(!e) - e = b + wcslen(b); - - if((e - b) == n && !_wcsnicmp(b, s, n)) { - return TRUE; - } - - if(*e) - b = e+1; - else - break; - } - - return FALSE; -} - -KHMEXP khm_int32 KHMAPI IntervalStringToFt(FILETIME * pft, wchar_t * str) -{ - size_t cb; - wchar_t * b; - __int64 t; - - *pft = IntToFt(0); - - /* ideally we should synchronize this, but it doesn't hurt if two - threads do this at the same time, because we only set the ivspecs_loaded - flag when we are done */ - if(!ivspecs_loaded) { - LoadString(hinst_kcreddb, IDS_IVL_S_SPEC, ivspecs[IVL_SECONDS].str, MAX_IVL_SPECLIST_LEN); - ivspecs[IVL_SECONDS].mul = 10000000i64; - LoadString(hinst_kcreddb, IDS_IVL_M_SPEC, ivspecs[IVL_MINUTES].str, MAX_IVL_SPECLIST_LEN); - ivspecs[IVL_MINUTES].mul = ivspecs[IVL_SECONDS].mul * 60; - LoadString(hinst_kcreddb, IDS_IVL_H_SPEC, ivspecs[2].str, MAX_IVL_SPECLIST_LEN); - ivspecs[IVL_HOURS].mul = ivspecs[IVL_MINUTES].mul * 60; - LoadString(hinst_kcreddb, IDS_IVL_D_SPEC, ivspecs[3].str, MAX_IVL_SPECLIST_LEN); - ivspecs[IVL_DAYS].mul = ivspecs[IVL_HOURS].mul * 24; - LoadString(hinst_kcreddb, IDS_IVL_W_SPEC, ivspecs[4].str, MAX_IVL_SPECLIST_LEN); - ivspecs[IVL_WEEKS].mul = ivspecs[IVL_DAYS].mul * 7; - - ivspecs_loaded = TRUE; - } - - if(!str || FAILED(StringCbLength(str, MAX_IVL_SPECLIST_LEN, &cb))) - return KHM_ERROR_INVALID_PARAM; - - b = str; - t = 0; - while(*b) { - __int64 f = 1; - wchar_t *e; - int i; - - while(*b && iswspace(*b)) - b++; - - if(*b && iswdigit(*b)) { - f = _wtoi64(b); - - while(*b && iswdigit(*b)) - b++; - } - - while(*b && iswspace(*b)) - b++; - - if(!*b) /* no unit specified */ - return KHM_ERROR_INVALID_PARAM; - - e = b; - - while(*e && !iswspace(*e)) - e++; - - for(i=0; i < MAX_IVL_UNITS; i++) { - if(_iv_is_in_spec(b, (int)(e-b), ivspecs[i].str)) - break; - } - - if(i==MAX_IVL_UNITS) - return KHM_ERROR_INVALID_PARAM; - - t += f * ivspecs[i].mul; - - b = e; - } - - *pft = IntToFt(t); - - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +CRITICAL_SECTION cs_type; +hashtable * kcdb_type_namemap; +kcdb_type_i ** kcdb_type_tbl; +kcdb_type_i * kcdb_types = NULL; + +/* Void */ + +#define GENERIC_VOID_STR L"(Void)" + +khm_int32 KHMAPI kcdb_type_void_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags) +{ + size_t cbsize; + + if(!cb_buf) + return KHM_ERROR_INVALID_PARAM; + + cbsize = sizeof(GENERIC_VOID_STR); + + if(!buffer || *cb_buf < cbsize) { + *cb_buf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *cb_buf, GENERIC_VOID_STR); + + *cb_buf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +khm_boolean KHMAPI kcdb_type_void_isValid( + const void * d, + khm_size cbd) +{ + /* void is always valid, even if d is NULL */ + return TRUE; +} + +khm_int32 KHMAPI kcdb_type_void_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2) +{ + /* voids can not be compared */ + return 0; +} + +khm_int32 KHMAPI kcdb_type_void_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst) +{ + if(!cbd_dst) + return KHM_ERROR_INVALID_PARAM; + + *cbd_dst = 0; + + /* copying a void doesn't do much */ + return KHM_ERROR_SUCCESS; +} + + +/* String */ +khm_int32 KHMAPI kcdb_type_string_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags) +{ + size_t cbsize; + wchar_t * sd; + + if(!cb_buf) + return KHM_ERROR_INVALID_PARAM; + + sd = (wchar_t *) d; + + if(FAILED(StringCbLength(sd, KCDB_TYPE_MAXCB, &cbsize))) + return KHM_ERROR_INVALID_PARAM; + + cbsize += sizeof(wchar_t); + + if(!buffer || *cb_buf < cbsize) { + *cb_buf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *cb_buf, sd); + + *cb_buf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +khm_boolean KHMAPI kcdb_type_string_isValid( + const void * d, + khm_size cbd) +{ + size_t cbsize; + + if(cbd == KCDB_CBSIZE_AUTO) + cbd = KCDB_TYPE_MAXCB; + + if(FAILED(StringCbLength((wchar_t *) d, cbd, &cbsize))) + return FALSE; + else + return TRUE; +} + +khm_int32 KHMAPI kcdb_type_string_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2) +{ + return wcscmp((const wchar_t *) d1, (const wchar_t *) d2); +} + +khm_int32 KHMAPI kcdb_type_string_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst) +{ + size_t cbsize; + + if(!cbd_dst) + return KHM_ERROR_INVALID_PARAM; + + if(cbd_src == KCDB_CBSIZE_AUTO) { + cbd_src = KCDB_TYPE_MAXCB; + } + + if(FAILED(StringCbLength((const wchar_t *) d_src, cbd_src, &cbsize))) { + return KHM_ERROR_UNKNOWN; + } + + cbsize += sizeof(wchar_t); + + if(!d_dst || *cbd_dst < cbsize) { + *cbd_dst = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy((wchar_t *) d_dst, *cbd_dst, (const wchar_t *) d_src); + *cbd_dst = cbsize; + + return KHM_ERROR_SUCCESS; +} + +/* Date and time */ + + +khm_int32 KHMAPI kcdb_type_date_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags) +{ + size_t cbsize; + size_t cchsize; + wchar_t * bufend; + SYSTEMTIME st_now; + SYSTEMTIME st_d; + SYSTEMTIME st_dl; + FILETIME *ft; + int today = 0; + + if(!cb_buf) + return KHM_ERROR_INVALID_PARAM; + + ft = (FILETIME *) d; + + GetLocalTime(&st_now); + FileTimeToSystemTime(ft, &st_d); + SystemTimeToTzSpecificLocalTime(NULL, &st_d, &st_dl); + if (st_now.wYear == st_dl.wYear && + st_now.wMonth == st_dl.wMonth && + st_now.wDay == st_dl.wDay) + today = 1; + + if(today && (flags & KCDB_TS_SHORT)) { + cbsize = 0; + } else { + cbsize = GetDateFormat( + LOCALE_USER_DEFAULT, + DATE_SHORTDATE, + &st_dl, + NULL, + NULL, + 0) * sizeof(wchar_t); + } + + cbsize += GetTimeFormat( + LOCALE_USER_DEFAULT, + 0, + &st_dl, + NULL, + NULL, + 0) * sizeof(wchar_t); + + if(!buffer || *cb_buf < cbsize) { + *cb_buf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + cchsize = cbsize / sizeof(wchar_t); + + if(!today || !(flags & KCDB_TS_SHORT)) { + size_t cch_buf_len; + + GetDateFormat( + LOCALE_USER_DEFAULT, + DATE_SHORTDATE, + &st_dl, + NULL, + buffer, + (int) cchsize); + + StringCchCat(buffer, cchsize, L" "); + + StringCchLength(buffer, cchsize, &cch_buf_len); + + bufend = buffer + cch_buf_len; + cchsize -= cch_buf_len; + } else { + bufend = buffer; + } + + GetTimeFormat( + LOCALE_USER_DEFAULT, + 0, + &st_dl, + NULL, + bufend, + (int) cchsize); + + *cb_buf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +khm_boolean KHMAPI kcdb_type_date_isValid( + const void * d, + khm_size cbd) +{ + return (d && (cbd == KCDB_CBSIZE_AUTO || cbd == sizeof(FILETIME))); +} + +khm_int32 KHMAPI kcdb_type_date_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2) +{ + return (khm_int32) CompareFileTime((CONST FILETIME *) d1, (CONST FILETIME *) d2); +} + +khm_int32 KHMAPI kcdb_type_date_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst) +{ + if(d_dst && *cbd_dst >= sizeof(FILETIME)) { + *cbd_dst = sizeof(FILETIME); + *((FILETIME *) d_dst) = *((FILETIME *) d_src); + return KHM_ERROR_SUCCESS; + } else { + *cbd_dst = sizeof(FILETIME); + return KHM_ERROR_TOO_LONG; + } +} + +/* Interval */ + +/* returns the number of milliseconds that must elapse away from the + interval specified in pft for the representation of pft to change + from whatever it is right now */ +KHMEXP long KHMAPI +FtIntervalMsToRepChange(LPFILETIME pft) +{ + __int64 ms,s,m,h,d; + __int64 ift; + long l; + + ift = FtToInt(pft); + ms = ift / 10000i64; + + if(ms < 0 || ift == _I64_MAX) + return -1; + + s = ms / 1000i64; + m = s / 60; + h = s / 3600; + d = s / (3600*24); + + if (d > 0) { + /* rep change at next hour change */ + l = (long) (ms % (3600*1000i64)); + } else if (h > 0) { + /* rep change at next minute change */ + l = (long) (ms % (60*1000i64)); + } else if (m > 5) { + /* rep change at next minute change */ + l = (long) (ms % (60*1000i64)); + } else { + /* rep change at next second change */ + l = (long) (ms % 1000); + } + + return l; +} + +KHMEXP khm_int32 KHMAPI +FtIntervalToString(LPFILETIME data, wchar_t * buffer, khm_size * cb_buf) +{ + size_t cbsize; + __int64 s,m,h,d; + __int64 ift; + wchar_t ibuf[256]; + wchar_t fbuf[256]; + wchar_t * t; + + if(!cb_buf) + return KHM_ERROR_INVALID_PARAM; + + ift = FtToInt(data); + s = ift / 10000000i64; + + m = s / 60; + h = s / 3600; + d = s / (3600*24); + + if(ift == _I64_MAX) { +#ifdef INDICATE_UNKNOWN_EXPIRY_TIMES + LoadString(hinst_kcreddb, IDS_IVL_UNKNOWN, ibuf, sizeof(ibuf)/sizeof(wchar_t)); +#else + StringCbCopy(ibuf, sizeof(ibuf), L""); +#endif + } else if(s < 0) { + LoadString(hinst_kcreddb, IDS_IVL_EXPIRED, ibuf, sizeof(ibuf)/sizeof(wchar_t)); + } else if(d > 0) { + h = (s - (d * 3600 * 24)) / 3600; + if(d == 1) { + LoadString(hinst_kcreddb, IDS_IVL_1D, ibuf, ARRAYLENGTH(ibuf)); + } else { + LoadString(hinst_kcreddb, IDS_IVL_D, fbuf, ARRAYLENGTH(fbuf)); + StringCbPrintf(ibuf, sizeof(ibuf), fbuf, d); + } + if(h > 0) { + StringCbCat(ibuf, sizeof(ibuf), L" "); + t = ibuf + wcslen(ibuf); + if(h == 1) + { + LoadString(hinst_kcreddb, IDS_IVL_1H, t, + (int) (ARRAYLENGTH(ibuf) - wcslen(ibuf))); + } else { + LoadString(hinst_kcreddb, IDS_IVL_H, fbuf, + (int) ARRAYLENGTH(fbuf)); + StringCbPrintf(t, sizeof(ibuf) - wcslen(ibuf)*sizeof(wchar_t), fbuf, h); + } + } + } else if(h > 0 || m > 5) { + m = (s - (h * 3600)) / 60; + if(h == 1) { + LoadString(hinst_kcreddb, IDS_IVL_1H, ibuf, ARRAYLENGTH(ibuf)); + } else if (h > 1) { + LoadString(hinst_kcreddb, IDS_IVL_H, fbuf, ARRAYLENGTH(fbuf)); + StringCbPrintf(ibuf, sizeof(ibuf), fbuf, h); + } else { + *ibuf = L'\0'; + } + + if(m > 0 || h == 0) { + if (h >= 1) + StringCbCat(ibuf, sizeof(ibuf), L" "); + + t = ibuf + wcslen(ibuf); + if(m == 1) + { + LoadString(hinst_kcreddb, IDS_IVL_1M, t, + (int) (ARRAYLENGTH(ibuf) - wcslen(ibuf))); + } else { + LoadString(hinst_kcreddb, IDS_IVL_M, fbuf, + (int) ARRAYLENGTH(fbuf)); + StringCbPrintf(t, sizeof(ibuf) - wcslen(ibuf)*sizeof(wchar_t), fbuf, m); + } + } + } else if(m > 0) { + s -= m * 60; + if(m == 1) { + LoadString(hinst_kcreddb, IDS_IVL_1M, ibuf, ARRAYLENGTH(ibuf)); + } else { + LoadString(hinst_kcreddb, IDS_IVL_M, fbuf, ARRAYLENGTH(fbuf)); + StringCbPrintf(ibuf, sizeof(ibuf), fbuf, m); + } + if(s > 0) { + StringCbCat(ibuf, sizeof(ibuf), L" "); + t = ibuf + wcslen(ibuf); + if(s == 1) + { + LoadString(hinst_kcreddb, IDS_IVL_1S, t, + (int) (ARRAYLENGTH(ibuf) - wcslen(ibuf))); + } else { + LoadString(hinst_kcreddb, IDS_IVL_S, fbuf, + (int) ARRAYLENGTH(fbuf)); + StringCbPrintf(t, sizeof(ibuf) - wcslen(ibuf)*sizeof(wchar_t), fbuf, s); + } + } + } else { + if(s == 1) { + LoadString(hinst_kcreddb, IDS_IVL_1S, ibuf, ARRAYLENGTH(ibuf)); + } else { + LoadString(hinst_kcreddb, IDS_IVL_S, fbuf, sizeof(fbuf)/sizeof(wchar_t)); + StringCbPrintf(ibuf, sizeof(ibuf), fbuf, s); + } + } + + StringCbLength(ibuf, sizeof(ibuf), &cbsize); + cbsize += sizeof(wchar_t); + + if(!buffer || *cb_buf < cbsize) { + *cb_buf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *cb_buf, ibuf); + *cb_buf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +khm_int32 KHMAPI +kcdb_type_interval_toString(const void * data, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags) +{ + return FtIntervalToString((LPFILETIME) data, buffer, cb_buf); +} + +khm_boolean KHMAPI kcdb_type_interval_isValid( + const void * d, + khm_size cbd) +{ + return (d && (cbd == sizeof(FILETIME) || cbd == KCDB_CBSIZE_AUTO)); +} + +khm_int32 KHMAPI kcdb_type_interval_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2) +{ + __int64 i1, i2; + + i1 = FtToInt((FILETIME *) d1); + i2 = FtToInt((FILETIME *) d2); + + if(i1 < i2) + return -1; + else if(i1 > i2) + return 1; + else + return 0; +} + +khm_int32 KHMAPI kcdb_type_interval_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst) +{ + if(d_dst && *cbd_dst >= sizeof(FILETIME)) { + *cbd_dst = sizeof(FILETIME); + *((FILETIME *) d_dst) = *((FILETIME *) d_src); + return KHM_ERROR_SUCCESS; + } else { + *cbd_dst = sizeof(FILETIME); + return KHM_ERROR_TOO_LONG; + } +} + +/* Int32 */ + +khm_int32 KHMAPI kcdb_type_int32_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags) +{ + size_t cbsize; + wchar_t ibuf[12]; + + if(!cb_buf) + return KHM_ERROR_INVALID_PARAM; + + StringCbPrintf(ibuf, sizeof(ibuf), L"%d", *((khm_int32 *) d)); + StringCbLength(ibuf, sizeof(ibuf), &cbsize); + cbsize += sizeof(wchar_t); + + if(!buffer || *cb_buf < cbsize) { + *cb_buf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy((wchar_t *) buffer, *cb_buf, ibuf); + *cb_buf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +khm_boolean KHMAPI kcdb_type_int32_isValid( + const void * d, + khm_size cbd) +{ + return (d && (cbd == KCDB_CBSIZE_AUTO || cbd == sizeof(khm_int32))); +} + +khm_int32 KHMAPI kcdb_type_int32_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2) +{ + return *((khm_int32 *) d1) - *((khm_int32 *) d2); +} + +khm_int32 KHMAPI kcdb_type_int32_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst) +{ + if(d_dst && (*cbd_dst >= sizeof(khm_int32))) { + *cbd_dst = sizeof(khm_int32); + *((khm_int32 *) d_dst) = *((khm_int32 *) d_src); + return KHM_ERROR_SUCCESS; + } else { + *cbd_dst = sizeof(khm_int32); + return KHM_ERROR_TOO_LONG; + } +} + +/* Int64 */ + +khm_int32 KHMAPI kcdb_type_int64_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags) +{ + size_t cbsize; + wchar_t ibuf[22]; + + if(!cb_buf) + return KHM_ERROR_INVALID_PARAM; + + StringCbPrintf(ibuf, sizeof(ibuf), L"%I64d", *((__int64 *) d)); + StringCbLength(ibuf, sizeof(ibuf), &cbsize); + cbsize += sizeof(wchar_t); + + if(!buffer || *cb_buf < cbsize) { + *cb_buf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy((wchar_t *) buffer, *cb_buf, ibuf); + *cb_buf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +khm_boolean KHMAPI kcdb_type_int64_isValid( + const void * d, + khm_size cbd) +{ + return (d && (cbd == KCDB_CBSIZE_AUTO || cbd == sizeof(__int64))); +} + +khm_int32 KHMAPI kcdb_type_int64_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2) +{ + __int64 r = *((__int64 *) d1) - *((__int64 *) d2); + return (r==0i64)?0:((r>0i64)?1:-1); +} + +khm_int32 KHMAPI kcdb_type_int64_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst) +{ + if(d_dst && (*cbd_dst >= sizeof(__int64))) { + *cbd_dst = sizeof(__int64); + *((__int64 *) d_dst) = *((__int64 *) d_src); + return KHM_ERROR_SUCCESS; + } else { + *cbd_dst = sizeof(__int64); + return KHM_ERROR_TOO_LONG; + } +} + +/* Data */ +#define GENERIC_DATA_STR L"(Data)" + +khm_int32 KHMAPI kcdb_type_data_toString( + const void * d, + khm_size cbd, + wchar_t * buffer, + khm_size * cb_buf, + khm_int32 flags) +{ + size_t cbsize; + + if(!cb_buf) + return KHM_ERROR_INVALID_PARAM; + + cbsize = sizeof(GENERIC_DATA_STR); + + if(!buffer || *cb_buf < cbsize) { + *cb_buf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *cb_buf, GENERIC_DATA_STR); + + *cb_buf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +khm_boolean KHMAPI kcdb_type_data_isValid( + const void * d, + khm_size cbd) +{ + /* data is always valid, even if d is NULL */ + return TRUE; +} + +khm_int32 KHMAPI kcdb_type_data_comp( + const void * d1, + khm_size cbd1, + const void * d2, + khm_size cbd2) +{ + /* datas can not be compared */ + return 0; +} + +khm_int32 KHMAPI kcdb_type_data_dup( + const void * d_src, + khm_size cbd_src, + void * d_dst, + khm_size * cbd_dst) +{ + if(!cbd_dst) + return KHM_ERROR_INVALID_PARAM; + + *cbd_dst = cbd_src; + + if(!d_dst || *cbd_dst < cbd_src) { + return KHM_ERROR_TOO_LONG; + } else { + memcpy(d_dst, d_src, cbd_src); + return KHM_ERROR_SUCCESS; + } +} + + +void kcdb_type_msg_completion(kmq_message * m) +{ + kcdb_type_release((kcdb_type_i *) m->vparam); +} + +void kcdb_type_post_message(khm_int32 op, kcdb_type_i * t) +{ + kcdb_type_hold(t); + kmq_post_message(KMSG_KCDB, KMSG_KCDB_TYPE, op, (void *) t); +} + +void kcdb_type_init(void) +{ + kcdb_type type; + + InitializeCriticalSection(&cs_type); + kcdb_type_namemap = hash_new_hashtable( + KCDB_TYPE_HASH_SIZE, + hash_string, + hash_string_comp, + kcdb_type_add_ref, + kcdb_type_del_ref); + kcdb_type_tbl = PMALLOC(sizeof(kcdb_type_i *) * (KCDB_TYPE_MAX_ID + 1)); + ZeroMemory(kcdb_type_tbl, sizeof(kcdb_type_i *) * (KCDB_TYPE_MAX_ID + 1)); + kcdb_types = NULL; + + /*TODO: register standard data types */ + + ZeroMemory(&type, sizeof(type)); + type.comp = kcdb_type_void_comp; + type.dup = kcdb_type_void_dup; + type.isValid = kcdb_type_void_isValid; + type.toString = kcdb_type_void_toString; + type.name = KCDB_TYPENAME_VOID; + type.id = KCDB_TYPE_VOID; + + kcdb_type_register(&type, NULL); + + ZeroMemory(&type, sizeof(type)); + type.comp = kcdb_type_string_comp; + type.dup = kcdb_type_string_dup; + type.isValid = kcdb_type_string_isValid; + type.toString = kcdb_type_string_toString; + type.name = KCDB_TYPENAME_STRING; + type.id = KCDB_TYPE_STRING; + type.flags = KCDB_TYPE_FLAG_CB_AUTO; + + kcdb_type_register(&type, NULL); + + ZeroMemory(&type, sizeof(type)); + type.comp = kcdb_type_date_comp; + type.dup = kcdb_type_date_dup; + type.isValid = kcdb_type_date_isValid; + type.toString = kcdb_type_date_toString; + type.name = KCDB_TYPENAME_DATE; + type.id = KCDB_TYPE_DATE; + type.cb_max = sizeof(FILETIME); + type.cb_min = sizeof(FILETIME); + type.flags = KCDB_TYPE_FLAG_CB_FIXED; + + kcdb_type_register(&type, NULL); + + ZeroMemory(&type, sizeof(type)); + type.comp = kcdb_type_interval_comp; + type.dup = kcdb_type_interval_dup; + type.isValid = kcdb_type_interval_isValid; + type.toString = kcdb_type_interval_toString; + type.name = KCDB_TYPENAME_INTERVAL; + type.id = KCDB_TYPE_INTERVAL; + type.cb_max = sizeof(FILETIME); + type.cb_min = sizeof(FILETIME); + type.flags = KCDB_TYPE_FLAG_CB_FIXED; + + kcdb_type_register(&type, NULL); + + ZeroMemory(&type, sizeof(type)); + type.comp = kcdb_type_int32_comp; + type.dup = kcdb_type_int32_dup; + type.isValid = kcdb_type_int32_isValid; + type.toString = kcdb_type_int32_toString; + type.name = KCDB_TYPENAME_INT32; + type.id = KCDB_TYPE_INT32; + type.cb_max = sizeof(khm_int32); + type.cb_min = sizeof(khm_int32); + type.flags = KCDB_TYPE_FLAG_CB_FIXED; + + kcdb_type_register(&type, NULL); + + ZeroMemory(&type, sizeof(type)); + type.comp = kcdb_type_int64_comp; + type.dup = kcdb_type_int64_dup; + type.isValid = kcdb_type_int64_isValid; + type.toString = kcdb_type_int64_toString; + type.name = KCDB_TYPENAME_INT64; + type.id = KCDB_TYPE_INT64; + type.cb_max = sizeof(__int64); + type.cb_min = sizeof(__int64); + type.flags = KCDB_TYPE_FLAG_CB_FIXED; + + kcdb_type_register(&type, NULL); + + ZeroMemory(&type, sizeof(type)); + type.comp = kcdb_type_data_comp; + type.dup = kcdb_type_data_dup; + type.isValid = kcdb_type_data_isValid; + type.toString = kcdb_type_data_toString; + type.name = KCDB_TYPENAME_DATA; + type.id = KCDB_TYPE_DATA; + + kcdb_type_register(&type, NULL); +} + +void kcdb_type_add_ref(const void *key, void *vt) +{ + kcdb_type_hold((kcdb_type_i *) vt); +} + +void kcdb_type_del_ref(const void *key, void *vt) +{ + kcdb_type_release((kcdb_type_i *) vt); +} + +khm_int32 kcdb_type_hold(kcdb_type_i * t) +{ + if(!t) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_type); + t->refcount++; + LeaveCriticalSection(&cs_type); + + return KHM_ERROR_SUCCESS; +} + +khm_int32 kcdb_type_release(kcdb_type_i * t) +{ + if(!t) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_type); + t->refcount--; + kcdb_type_check_and_delete(t->type.id); + LeaveCriticalSection(&cs_type); + + return KHM_ERROR_SUCCESS; +} + +void kcdb_type_exit(void) +{ + EnterCriticalSection(&cs_type); + PFREE(kcdb_type_tbl); + /*TODO: free up the individual types */ + LeaveCriticalSection(&cs_type); + DeleteCriticalSection(&cs_type); +} + +void kcdb_type_check_and_delete(khm_int32 id) +{ + kcdb_type_i * t; + + if(id < 0 || id > KCDB_TYPE_MAX_ID) + return; + + EnterCriticalSection(&cs_type); + t = kcdb_type_tbl[id]; + if(t && !t->refcount) { + kcdb_type_tbl[id] = NULL; + LDELETE(&kcdb_types, t); + /* must already be out of the hash-table, otherwise refcount should not + be zero */ + PFREE(t->type.name); + PFREE(t); + } + LeaveCriticalSection(&cs_type); +} + +KHMEXP khm_int32 KHMAPI kcdb_type_get_id(wchar_t *name, khm_int32 * id) +{ + kcdb_type_i * t; + size_t cbsize; + + if(FAILED(StringCbLength(name, KCDB_MAXCB_NAME, &cbsize))) { + /* also fails of name is NULL */ + return KHM_ERROR_INVALID_PARAM; + } + + EnterCriticalSection(&cs_type); + t = hash_lookup(kcdb_type_namemap, (void*) name); + LeaveCriticalSection(&cs_type); + + if(!t) { + *id = KCDB_TYPE_INVALID; + return KHM_ERROR_NOT_FOUND; + } else { + *id = t->type.id; + return KHM_ERROR_SUCCESS; + } +} + +KHMEXP khm_int32 KHMAPI kcdb_type_get_info(khm_int32 id, kcdb_type ** info) +{ + kcdb_type_i * t; + + if(id < 0 || id > KCDB_TYPE_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_type); + t = kcdb_type_tbl[id]; + + if (t) + kcdb_type_hold(t); + LeaveCriticalSection(&cs_type); + + if(info) + *info = (kcdb_type *) t; + else if (t) + kcdb_type_release(t); + + return (t)? KHM_ERROR_SUCCESS : KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI kcdb_type_release_info(kcdb_type * info) +{ + return kcdb_type_release((kcdb_type_i *) info); +} + +KHMEXP khm_int32 KHMAPI kcdb_type_get_name(khm_int32 id, wchar_t * buffer, khm_size * cbbuf) +{ + size_t cbsize; + kcdb_type_i * t; + + if(id < 0 || id > KCDB_TYPE_MAX_ID || !cbbuf) + return KHM_ERROR_INVALID_PARAM; + + t = kcdb_type_tbl[id]; + + if(!t) + return KHM_ERROR_NOT_FOUND; + + if(FAILED(StringCbLength(t->type.name, KCDB_MAXCB_NAME, &cbsize))) + return KHM_ERROR_UNKNOWN; + + cbsize += sizeof(wchar_t); + + if(!buffer || *cbbuf < cbsize) { + *cbbuf = cbsize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *cbbuf, t->type.name); + *cbbuf = cbsize; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_type_register(kcdb_type * type, khm_int32 * new_id) +{ + kcdb_type_i *t; + size_t cbsize; + khm_int32 type_id; + + if(!type || + !type->comp || + !type->dup || + !type->isValid || + !type->toString || + !type->name) + return KHM_ERROR_INVALID_PARAM; + + if((type->flags & KCDB_TYPE_FLAG_CB_MIN) && + (type->cb_min < 0 || type->cb_min > KCDB_TYPE_MAXCB)) + { + return KHM_ERROR_INVALID_PARAM; + } + + if((type->flags & KCDB_TYPE_FLAG_CB_MAX) && + (type->cb_max < 0 || type->cb_max > KCDB_TYPE_MAXCB)) + { + return KHM_ERROR_INVALID_PARAM; + } + + if((type->flags & KCDB_TYPE_FLAG_CB_MIN) && + (type->flags & KCDB_TYPE_FLAG_CB_MAX) && + (type->cb_max < type->cb_min)) + { + return KHM_ERROR_INVALID_PARAM; + } + + if(FAILED(StringCbLength(type->name, KCDB_MAXCB_NAME, &cbsize))) + return KHM_ERROR_TOO_LONG; + + cbsize += sizeof(wchar_t); + + EnterCriticalSection(&cs_type); + if(type->id == KCDB_TYPE_INVALID) { + kcdb_type_get_next_free(&type_id); + } else if(type->id < 0 || type->id > KCDB_TYPE_MAX_ID) { + LeaveCriticalSection(&cs_type); + return KHM_ERROR_INVALID_PARAM; + } else if(kcdb_type_tbl[type->id]) { + LeaveCriticalSection(&cs_type); + return KHM_ERROR_DUPLICATE; + } else { + type_id = type->id; + } + + if(type_id == KCDB_TYPE_INVALID) { + LeaveCriticalSection(&cs_type); + return KHM_ERROR_NO_RESOURCES; + } + + t = PMALLOC(sizeof(kcdb_type_i)); + ZeroMemory(t, sizeof(kcdb_type_i)); + + t->type.name = PMALLOC(cbsize); + StringCbCopy(t->type.name, cbsize, type->name); + + t->type.comp = type->comp; + t->type.dup = type->dup; + t->type.flags = type->flags; + t->type.id = type_id; + t->type.isValid = type->isValid; + t->type.toString = type->toString; + + LINIT(t); + + kcdb_type_tbl[type_id] = t; + LPUSH(&kcdb_types, t); + + hash_add(kcdb_type_namemap, (void *) t->type.name, (void *) t); + + LeaveCriticalSection(&cs_type); + + if(new_id) + *new_id = type_id; + + kcdb_type_post_message(KCDB_OP_INSERT, t); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kcdb_type_unregister(khm_int32 id) +{ + kcdb_type_i * t; + + if(id < 0 || id > KCDB_TYPE_MAX_ID) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_type); + t = kcdb_type_tbl[id]; + if(t) { + kcdb_type_post_message(KCDB_OP_DELETE, t); + /* we are going to remove t from the hash table. If no one is holding + a reference to it, then we can free it (actually, the del_ref code + will take care of that anyway). If there is a hold, then it will + get freed when they release it. + + Actually, the post_message call above pretty much guarantees that + the type has a hold on it.*/ + t->type.flags |= KCDB_TYPE_FLAG_DELETED; + hash_del(kcdb_type_namemap, t->type.name); + } + LeaveCriticalSection(&cs_type); + + if(t) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI kcdb_type_get_next_free(khm_int32 * id) +{ + int i; + + if(!id) + return KHM_ERROR_INVALID_PARAM; + + /* do a linear search because this function only gets called a few times */ + EnterCriticalSection(&cs_type); + for(i=0; i <= KCDB_TYPE_MAX_ID; i++) { + if(!kcdb_type_tbl[i]) + break; + } + LeaveCriticalSection(&cs_type); + + if(i <= KCDB_TYPE_MAX_ID) { + *id = i; + return KHM_ERROR_SUCCESS; + } else { + *id = KCDB_TYPE_INVALID; + return KHM_ERROR_NO_RESOURCES; + } +} + +/* Conversion functions */ + +KHMEXP void KHMAPI TimetToFileTime( time_t t, LPFILETIME pft ) +{ + LONGLONG ll; + + if ( sizeof(time_t) == 4 ) + ll = Int32x32To64(t, 10000000) + 116444736000000000i64; + else { + ll = t * 10000000i64 + 116444736000000000i64; + } + pft->dwLowDateTime = (DWORD) ll; + pft->dwHighDateTime = (DWORD) (ll >> 32); +} + +KHMEXP void KHMAPI TimetToFileTimeInterval(time_t t, LPFILETIME pft) +{ + LONGLONG ll; + + if ( sizeof(time_t) == 4 ) + ll = Int32x32To64(t, 10000000); + else { + ll = t * 10000000i64; + } + pft->dwLowDateTime = (DWORD) ll; + pft->dwHighDateTime = (DWORD) (ll >> 32); +} + +KHMEXP long KHMAPI FtIntervalToSeconds(LPFILETIME pft) +{ + __int64 i = FtToInt(pft); + return (long) (i / 10000000i64); +} + +KHMEXP long KHMAPI FtIntervalToMilliseconds(LPFILETIME pft) +{ + __int64 i = FtToInt(pft); + return (long) (i / 10000i64); +} + +KHMEXP khm_int64 KHMAPI FtToInt(LPFILETIME pft) { + LARGE_INTEGER ll; + ll.LowPart = pft->dwLowDateTime; + ll.HighPart = pft->dwHighDateTime; + return ll.QuadPart; +} + +KHMEXP FILETIME KHMAPI IntToFt(khm_int64 i) { + LARGE_INTEGER ll; + FILETIME ft; + + ll.QuadPart = i; + ft.dwLowDateTime = ll.LowPart; + ft.dwHighDateTime = ll.HighPart; + + return ft; +} + +KHMEXP FILETIME KHMAPI FtSub(LPFILETIME ft1, LPFILETIME ft2) { + FILETIME d; + LARGE_INTEGER l1, l2; + + l1.LowPart = ft1->dwLowDateTime; + l1.HighPart = ft1->dwHighDateTime; + l2.LowPart = ft2->dwLowDateTime; + l2.HighPart = ft2->dwHighDateTime; + + l1.QuadPart -= l2.QuadPart; + + d.dwLowDateTime = l1.LowPart; + d.dwHighDateTime = l1.HighPart; + + return d; +} + +KHMEXP FILETIME KHMAPI FtAdd(LPFILETIME ft1, LPFILETIME ft2) { + FILETIME d; + LARGE_INTEGER l1, l2; + + l1.LowPart = ft1->dwLowDateTime; + l1.HighPart = ft1->dwHighDateTime; + l2.LowPart = ft2->dwLowDateTime; + l2.HighPart = ft2->dwHighDateTime; + + l1.QuadPart += l2.QuadPart; + + d.dwLowDateTime = l1.LowPart; + d.dwHighDateTime = l1.HighPart; + + return d; +} + +KHMEXP int KHMAPI AnsiStrToUnicode( wchar_t * wstr, size_t cbwstr, const char * astr) +{ + size_t nc; + + if(cbwstr == 0) + return 0; + + nc = strlen(astr); + if(nc == MultiByteToWideChar( + CP_ACP, + 0, + astr, + (int) nc, + wstr, + (int)(cbwstr / sizeof(wchar_t) - 1))) { + wstr[nc] = L'\0'; + } else { + wstr[0] = L'\0'; + nc = 0; + } + + return (int) nc; +} + +KHMEXP int KHMAPI UnicodeStrToAnsi( char * dest, size_t cbdest, const wchar_t * src) +{ + size_t nc; + + if(cbdest == 0) + return 0; + + dest[0] = 0; + + if(FAILED(StringCchLength(src, cbdest, &nc)) || nc*sizeof(char) >= cbdest) + // note that cbdest counts the terminating NULL, while nc doesn't + return 0; + + nc = WideCharToMultiByte( + CP_ACP, + WC_NO_BEST_FIT_CHARS, + src, + (int) nc, + dest, + (int) cbdest, + NULL, + NULL); + + dest[nc] = 0; + + return (int) nc; +} + +#define MAX_IVL_SPECLIST_LEN 256 +#define MAX_IVL_UNITS 5 + +enum _ivl_indices { + IVL_SECONDS = 0, + IVL_MINUTES, + IVL_HOURS, + IVL_DAYS, + IVL_WEEKS +}; + +typedef struct ivspec_t { + wchar_t str[MAX_IVL_SPECLIST_LEN]; + __int64 mul; +} ivspec; + +static ivspec ivspecs[MAX_IVL_UNITS]; +static BOOL ivspecs_loaded = FALSE; + +int _iv_is_in_spec(wchar_t *s, int n, wchar_t * spec) +{ + /* spec strigns are comma separated */ + wchar_t *b, *e; + + b = spec; + while(*b) { + e = wcschr(b, L','); + if(!e) + e = b + wcslen(b); + + if((e - b) == n && !_wcsnicmp(b, s, n)) { + return TRUE; + } + + if(*e) + b = e+1; + else + break; + } + + return FALSE; +} + +KHMEXP khm_int32 KHMAPI IntervalStringToFt(FILETIME * pft, wchar_t * str) +{ + size_t cb; + wchar_t * b; + __int64 t; + + *pft = IntToFt(0); + + /* ideally we should synchronize this, but it doesn't hurt if two + threads do this at the same time, because we only set the ivspecs_loaded + flag when we are done */ + if(!ivspecs_loaded) { + LoadString(hinst_kcreddb, IDS_IVL_S_SPEC, ivspecs[IVL_SECONDS].str, MAX_IVL_SPECLIST_LEN); + ivspecs[IVL_SECONDS].mul = 10000000i64; + LoadString(hinst_kcreddb, IDS_IVL_M_SPEC, ivspecs[IVL_MINUTES].str, MAX_IVL_SPECLIST_LEN); + ivspecs[IVL_MINUTES].mul = ivspecs[IVL_SECONDS].mul * 60; + LoadString(hinst_kcreddb, IDS_IVL_H_SPEC, ivspecs[2].str, MAX_IVL_SPECLIST_LEN); + ivspecs[IVL_HOURS].mul = ivspecs[IVL_MINUTES].mul * 60; + LoadString(hinst_kcreddb, IDS_IVL_D_SPEC, ivspecs[3].str, MAX_IVL_SPECLIST_LEN); + ivspecs[IVL_DAYS].mul = ivspecs[IVL_HOURS].mul * 24; + LoadString(hinst_kcreddb, IDS_IVL_W_SPEC, ivspecs[4].str, MAX_IVL_SPECLIST_LEN); + ivspecs[IVL_WEEKS].mul = ivspecs[IVL_DAYS].mul * 7; + + ivspecs_loaded = TRUE; + } + + if(!str || FAILED(StringCbLength(str, MAX_IVL_SPECLIST_LEN, &cb))) + return KHM_ERROR_INVALID_PARAM; + + b = str; + t = 0; + while(*b) { + __int64 f = 1; + wchar_t *e; + int i; + + while(*b && iswspace(*b)) + b++; + + if(*b && iswdigit(*b)) { + f = _wtoi64(b); + + while(*b && iswdigit(*b)) + b++; + } + + while(*b && iswspace(*b)) + b++; + + if(!*b) /* no unit specified */ + return KHM_ERROR_INVALID_PARAM; + + e = b; + + while(*e && !iswspace(*e)) + e++; + + for(i=0; i < MAX_IVL_UNITS; i++) { + if(_iv_is_in_spec(b, (int)(e-b), ivspecs[i].str)) + break; + } + + if(i==MAX_IVL_UNITS) + return KHM_ERROR_INVALID_PARAM; + + t += f * ivspecs[i].mul; + + b = e; + } + + *pft = IntToFt(t); + + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/buf.c +++ krb5-1.4.4/src/windows/identity/kcreddb/buf.c @@ -1,391 +1,391 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -void kcdb_buf_new(kcdb_buf * buf, khm_size n_fields) -{ - buf->buffer = PMALLOC(KCDB_BUF_CBBUF_INITIAL); - buf->cb_buffer = KCDB_BUF_CBBUF_INITIAL; - buf->cb_used = 0; - - if(n_fields == KCDB_BUF_DEFAULT) - n_fields = KCDB_BUF_FIELDS_INITIAL; - - assert(n_fields < KCDB_BUF_MAX_SLOTS); - - buf->n_fields = n_fields; - buf->nc_fields = UBOUNDSS(n_fields, KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH); - buf->fields = PMALLOC(sizeof(buf->fields[0]) * buf->n_fields); - ZeroMemory(buf->fields, sizeof(buf->fields[0]) * buf->n_fields); -} - -void kcdb_buf_delete(kcdb_buf * buf) -{ - buf->cb_buffer = 0; - buf->cb_used = 0; - if(buf->buffer) - PFREE(buf->buffer); - buf->buffer = NULL; - - buf->n_fields = 0; - buf->nc_fields = 0; - if(buf->fields) - PFREE(buf->fields); - buf->fields = NULL; -} - -static void kcdb_buf_assert_size(kcdb_buf * buf, khm_size cbsize) -{ - khm_size new_size; - void * new_buf; - - /* should be less than or equal to the max signed 32 bit int */ - assert(cbsize <= KHM_INT32_MAX); - if(cbsize <= buf->cb_buffer) - return; - - new_size = UBOUNDSS(cbsize, KCDB_BUF_CBBUF_INITIAL, KCDB_BUF_CBBUF_GROWTH); - - assert(new_size > buf->cb_buffer && new_size > 0); - - new_buf = PMALLOC(new_size); - assert(new_buf != NULL); - - memcpy(new_buf, buf->buffer, buf->cb_used); - PFREE(buf->buffer); - buf->buffer = new_buf; -} - -void kcdb_buf_alloc(kcdb_buf * buf, khm_size slot, khm_ui_2 id, khm_size cbsize) -{ - khm_size cbnew; - khm_ssize cbdelta; - khm_size cbold; - kcdb_buf_field * f; - - cbnew = UBOUND32(cbsize); - - assert(slot <= KCDB_BUF_APPEND); - - if(slot == KCDB_BUF_APPEND) { - slot = kcdb_buf_slot_by_id(buf, id); - if(slot == KCDB_BUF_INVALID_SLOT) - slot = buf->n_fields; - } - - assert(slot < KCDB_BUF_MAX_SLOTS); - - if((slot + 1) > buf->nc_fields) { - kcdb_buf_field * nf; - khm_size ns; - - ns = UBOUNDSS((slot + 1), KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH); - - nf = PMALLOC(sizeof(buf->fields[0]) * ns); - memcpy(nf, buf->fields, sizeof(buf->fields[0]) * buf->n_fields); - - if(ns > buf->n_fields) - memset(&(nf[buf->n_fields]), 0, sizeof(buf->fields[0]) * (ns - buf->n_fields)); - - PFREE(buf->fields); - buf->fields = nf; - buf->nc_fields = ns; - } - - if((slot + 1) > buf->n_fields) - buf->n_fields = slot + 1; - - f = &(buf->fields[slot]); - - if(f->flags & KCDB_CREDF_FLAG_ALLOCD) { - /* there's already an allocation. we have to resize it to - accomodate the new size */ - cbold = UBOUND32(f->cbsize); - /* demote before substraction */ - cbdelta = ((khm_ssize) cbnew) - (khm_ssize) cbold; - - if(cbnew > cbold) { - kcdb_buf_assert_size(buf, buf->cb_used + cbdelta); - } - - if(buf->cb_used > f->offset + cbold) { - khm_size i; - - memmove( - ((BYTE *) buf->buffer) + (f->offset + cbnew), - ((BYTE *) buf->buffer) + (f->offset + cbold), - buf->cb_used - (f->offset + cbold)); - - for(i=0; i < (int) buf->n_fields; i++) { - if(i != slot && - (buf->fields[i].flags & KCDB_CREDF_FLAG_ALLOCD) && - buf->fields[i].offset > f->offset) - { - buf->fields[i].offset = - (khm_ui_4)(((khm_ssize) buf->fields[i].offset) + cbdelta); - } - } - } - - /* demote integer before adding signed quantity */ - buf->cb_used = (khm_size)(((khm_ssize) buf->cb_used) + cbdelta); - - f->cbsize = (khm_ui_4) cbsize; - - } else { - kcdb_buf_assert_size(buf, buf->cb_used + cbnew); - f->offset = (khm_ui_4) buf->cb_used; - f->cbsize = (khm_ui_4) cbsize; - buf->cb_used += cbnew; - } - - if(cbsize == 0) { - f->flags &= ~KCDB_CREDF_FLAG_ALLOCD; - f->flags &= ~KCDB_CREDF_FLAG_DATA; - f->id = KCDB_BUFF_ID_INVALID; - } else { - f->flags |= KCDB_CREDF_FLAG_ALLOCD; - f->id = id; - } -} - -void kcdb_buf_dup(kcdb_buf * dest, const kcdb_buf * src) -{ - khm_size cb_buf; - khm_size nc_fields; - - cb_buf = UBOUNDSS(src->cb_used, KCDB_BUF_CBBUF_INITIAL, KCDB_BUF_CBBUF_GROWTH); -#if 0 - /* replaced by UBOUNDSS() above */ - (src->cb_used <= kcdb_cred_initial_size)? kcdb_cred_initial_size: - kcdb_cred_initial_size + - (((src->cb_used - (kcdb_cred_initial_size + 1)) / kcdb_cred_growth_factor + 1) * kcdb_cred_growth_factor); -#endif - - kcdb_buf_delete(dest); - - dest->cb_buffer = cb_buf; - dest->cb_used = src->cb_used; - dest->buffer = PMALLOC(cb_buf); - memcpy(dest->buffer, src->buffer, src->cb_used); - - nc_fields = UBOUNDSS(src->n_fields, KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH); - dest->nc_fields = nc_fields; - dest->n_fields = src->n_fields; - dest->fields = PMALLOC(nc_fields * sizeof(dest->fields[0])); - memcpy(dest->fields, src->fields, src->n_fields * sizeof(dest->fields[0])); - if(dest->n_fields < dest->nc_fields) - memset(&(dest->fields[dest->n_fields]), 0, (src->nc_fields - src->n_fields) * sizeof(dest->fields[0])); -} - -void kcdb_buf_set_value(kcdb_buf * buf, khm_size slot, khm_ui_2 id, void * src, khm_size cb_src) -{ - void * dest; - kcdb_buf_alloc(buf, slot, id, cb_src); - if(slot == KCDB_BUF_APPEND) { - slot = kcdb_buf_slot_by_id(buf, id); - if(slot == KCDB_BUF_INVALID_SLOT) { -#ifdef DEBUG - assert(FALSE); -#else - return; -#endif - } - } - if(kcdb_buf_exist(buf, slot)) { - dest = kcdb_buf_get(buf, slot); - memcpy(dest, src, cb_src); - - buf->fields[slot].flags |= KCDB_CREDF_FLAG_DATA; - } -} - -int kcdb_buf_exist(kcdb_buf * buf, khm_size slot) -{ - if(slot >= buf->n_fields) - return 0; - return (buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD); -} - -int kcdb_buf_val_exist(kcdb_buf * buf, khm_size slot) -{ - if(slot >= buf->n_fields) - return 0; - return (buf->fields[slot].flags & KCDB_CREDF_FLAG_DATA); -} - -void * kcdb_buf_get(kcdb_buf * buf, khm_size slot) -{ - if(slot >= buf->n_fields || - !(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD)) - return NULL; - return (((BYTE *) buf->buffer) + buf->fields[slot].offset); -} - -khm_size kcdb_buf_size(kcdb_buf * buf, khm_size slot) -{ - if(slot >= buf->n_fields || - !(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD)) - return 0; - return (buf->fields[slot].cbsize); -} - -void kcdb_buf_set_value_flag(kcdb_buf * buf, khm_size slot) -{ - if(slot >= buf->n_fields || - !(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD)) - return; - - (buf->fields[slot].flags |= KCDB_CREDF_FLAG_DATA); -} - -khm_size kcdb_buf_slot_by_id(kcdb_buf * buf, khm_ui_2 id) -{ - int i; - - for(i=0; i < (int) buf->n_fields; i++) { - if(buf->fields[i].id == id) - break; - } - - if(i < (int) buf->n_fields) - return i; - else - return KCDB_BUF_INVALID_SLOT; -} - -/* API for accessing generic buffers */ - -KHMEXP khm_int32 KHMAPI kcdb_buf_get_attr( - khm_handle record, - khm_int32 attr_id, - khm_int32 * attr_type, - void * buffer, - khm_size * pcb_buf) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_get_attr(record, attr_id, attr_type, buffer, pcb_buf); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_get_attr(record, attr_id, attr_type, buffer, pcb_buf); - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP khm_int32 KHMAPI kcdb_buf_get_attrib( - khm_handle record, - wchar_t * attr_name, - khm_int32 * attr_type, - void * buffer, - khm_size * pcb_buf) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_get_attrib(record, attr_name, attr_type, buffer, pcb_buf); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_get_attrib(record, attr_name, attr_type, buffer, pcb_buf); - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP khm_int32 KHMAPI kcdb_buf_get_attr_string( - khm_handle record, - khm_int32 attr_id, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_get_attr_string(record, attr_id, buffer, pcbbuf, flags); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_get_attr_string(record, attr_id, buffer, pcbbuf, flags); - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP khm_int32 KHMAPI kcdb_buf_get_attrib_string( - khm_handle record, - wchar_t * attr_name, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_get_attrib_string(record, attr_name, buffer, pcbbuf, flags); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_get_attrib_string(record, attr_name, buffer, pcbbuf, flags); - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP khm_int32 KHMAPI kcdb_buf_set_attr( - khm_handle record, - khm_int32 attr_id, - void * buffer, - khm_size cbbuf) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_set_attr(record, attr_id, buffer, cbbuf); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_set_attr(record, attr_id, buffer, cbbuf); - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP khm_int32 KHMAPI kcdb_buf_set_attrib( - khm_handle record, - wchar_t * attr_name, - void * buffer, - khm_size cbbuf) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_set_attrib(record, attr_name, buffer, cbbuf); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_set_attrib(record, attr_name, buffer, cbbuf); - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP khm_int32 KHMAPI kcdb_buf_hold(khm_handle record) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_hold(record); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_hold(record); - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP khm_int32 KHMAPI kcdb_buf_release(khm_handle record) -{ - if(kcdb_cred_is_active_cred(record)) - return kcdb_cred_release(record); - else if(kcdb_is_active_identity(record)) - return kcdb_identity_release(record); - else - return KHM_ERROR_INVALID_PARAM; -} - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +void kcdb_buf_new(kcdb_buf * buf, khm_size n_fields) +{ + buf->buffer = PMALLOC(KCDB_BUF_CBBUF_INITIAL); + buf->cb_buffer = KCDB_BUF_CBBUF_INITIAL; + buf->cb_used = 0; + + if(n_fields == KCDB_BUF_DEFAULT) + n_fields = KCDB_BUF_FIELDS_INITIAL; + + assert(n_fields < KCDB_BUF_MAX_SLOTS); + + buf->n_fields = n_fields; + buf->nc_fields = UBOUNDSS(n_fields, KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH); + buf->fields = PMALLOC(sizeof(buf->fields[0]) * buf->n_fields); + ZeroMemory(buf->fields, sizeof(buf->fields[0]) * buf->n_fields); +} + +void kcdb_buf_delete(kcdb_buf * buf) +{ + buf->cb_buffer = 0; + buf->cb_used = 0; + if(buf->buffer) + PFREE(buf->buffer); + buf->buffer = NULL; + + buf->n_fields = 0; + buf->nc_fields = 0; + if(buf->fields) + PFREE(buf->fields); + buf->fields = NULL; +} + +static void kcdb_buf_assert_size(kcdb_buf * buf, khm_size cbsize) +{ + khm_size new_size; + void * new_buf; + + /* should be less than or equal to the max signed 32 bit int */ + assert(cbsize <= KHM_INT32_MAX); + if(cbsize <= buf->cb_buffer) + return; + + new_size = UBOUNDSS(cbsize, KCDB_BUF_CBBUF_INITIAL, KCDB_BUF_CBBUF_GROWTH); + + assert(new_size > buf->cb_buffer && new_size > 0); + + new_buf = PMALLOC(new_size); + assert(new_buf != NULL); + + memcpy(new_buf, buf->buffer, buf->cb_used); + PFREE(buf->buffer); + buf->buffer = new_buf; +} + +void kcdb_buf_alloc(kcdb_buf * buf, khm_size slot, khm_ui_2 id, khm_size cbsize) +{ + khm_size cbnew; + khm_ssize cbdelta; + khm_size cbold; + kcdb_buf_field * f; + + cbnew = UBOUND32(cbsize); + + assert(slot <= KCDB_BUF_APPEND); + + if(slot == KCDB_BUF_APPEND) { + slot = kcdb_buf_slot_by_id(buf, id); + if(slot == KCDB_BUF_INVALID_SLOT) + slot = buf->n_fields; + } + + assert(slot < KCDB_BUF_MAX_SLOTS); + + if((slot + 1) > buf->nc_fields) { + kcdb_buf_field * nf; + khm_size ns; + + ns = UBOUNDSS((slot + 1), KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH); + + nf = PMALLOC(sizeof(buf->fields[0]) * ns); + memcpy(nf, buf->fields, sizeof(buf->fields[0]) * buf->n_fields); + + if(ns > buf->n_fields) + memset(&(nf[buf->n_fields]), 0, sizeof(buf->fields[0]) * (ns - buf->n_fields)); + + PFREE(buf->fields); + buf->fields = nf; + buf->nc_fields = ns; + } + + if((slot + 1) > buf->n_fields) + buf->n_fields = slot + 1; + + f = &(buf->fields[slot]); + + if(f->flags & KCDB_CREDF_FLAG_ALLOCD) { + /* there's already an allocation. we have to resize it to + accomodate the new size */ + cbold = UBOUND32(f->cbsize); + /* demote before substraction */ + cbdelta = ((khm_ssize) cbnew) - (khm_ssize) cbold; + + if(cbnew > cbold) { + kcdb_buf_assert_size(buf, buf->cb_used + cbdelta); + } + + if(buf->cb_used > f->offset + cbold) { + khm_size i; + + memmove( + ((BYTE *) buf->buffer) + (f->offset + cbnew), + ((BYTE *) buf->buffer) + (f->offset + cbold), + buf->cb_used - (f->offset + cbold)); + + for(i=0; i < (int) buf->n_fields; i++) { + if(i != slot && + (buf->fields[i].flags & KCDB_CREDF_FLAG_ALLOCD) && + buf->fields[i].offset > f->offset) + { + buf->fields[i].offset = + (khm_ui_4)(((khm_ssize) buf->fields[i].offset) + cbdelta); + } + } + } + + /* demote integer before adding signed quantity */ + buf->cb_used = (khm_size)(((khm_ssize) buf->cb_used) + cbdelta); + + f->cbsize = (khm_ui_4) cbsize; + + } else { + kcdb_buf_assert_size(buf, buf->cb_used + cbnew); + f->offset = (khm_ui_4) buf->cb_used; + f->cbsize = (khm_ui_4) cbsize; + buf->cb_used += cbnew; + } + + if(cbsize == 0) { + f->flags &= ~KCDB_CREDF_FLAG_ALLOCD; + f->flags &= ~KCDB_CREDF_FLAG_DATA; + f->id = KCDB_BUFF_ID_INVALID; + } else { + f->flags |= KCDB_CREDF_FLAG_ALLOCD; + f->id = id; + } +} + +void kcdb_buf_dup(kcdb_buf * dest, const kcdb_buf * src) +{ + khm_size cb_buf; + khm_size nc_fields; + + cb_buf = UBOUNDSS(src->cb_used, KCDB_BUF_CBBUF_INITIAL, KCDB_BUF_CBBUF_GROWTH); +#if 0 + /* replaced by UBOUNDSS() above */ + (src->cb_used <= kcdb_cred_initial_size)? kcdb_cred_initial_size: + kcdb_cred_initial_size + + (((src->cb_used - (kcdb_cred_initial_size + 1)) / kcdb_cred_growth_factor + 1) * kcdb_cred_growth_factor); +#endif + + kcdb_buf_delete(dest); + + dest->cb_buffer = cb_buf; + dest->cb_used = src->cb_used; + dest->buffer = PMALLOC(cb_buf); + memcpy(dest->buffer, src->buffer, src->cb_used); + + nc_fields = UBOUNDSS(src->n_fields, KCDB_BUF_FIELDS_INITIAL, KCDB_BUF_FIELDS_GROWTH); + dest->nc_fields = nc_fields; + dest->n_fields = src->n_fields; + dest->fields = PMALLOC(nc_fields * sizeof(dest->fields[0])); + memcpy(dest->fields, src->fields, src->n_fields * sizeof(dest->fields[0])); + if(dest->n_fields < dest->nc_fields) + memset(&(dest->fields[dest->n_fields]), 0, (src->nc_fields - src->n_fields) * sizeof(dest->fields[0])); +} + +void kcdb_buf_set_value(kcdb_buf * buf, khm_size slot, khm_ui_2 id, void * src, khm_size cb_src) +{ + void * dest; + kcdb_buf_alloc(buf, slot, id, cb_src); + if(slot == KCDB_BUF_APPEND) { + slot = kcdb_buf_slot_by_id(buf, id); + if(slot == KCDB_BUF_INVALID_SLOT) { +#ifdef DEBUG + assert(FALSE); +#else + return; +#endif + } + } + if(kcdb_buf_exist(buf, slot)) { + dest = kcdb_buf_get(buf, slot); + memcpy(dest, src, cb_src); + + buf->fields[slot].flags |= KCDB_CREDF_FLAG_DATA; + } +} + +int kcdb_buf_exist(kcdb_buf * buf, khm_size slot) +{ + if(slot >= buf->n_fields) + return 0; + return (buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD); +} + +int kcdb_buf_val_exist(kcdb_buf * buf, khm_size slot) +{ + if(slot >= buf->n_fields) + return 0; + return (buf->fields[slot].flags & KCDB_CREDF_FLAG_DATA); +} + +void * kcdb_buf_get(kcdb_buf * buf, khm_size slot) +{ + if(slot >= buf->n_fields || + !(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD)) + return NULL; + return (((BYTE *) buf->buffer) + buf->fields[slot].offset); +} + +khm_size kcdb_buf_size(kcdb_buf * buf, khm_size slot) +{ + if(slot >= buf->n_fields || + !(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD)) + return 0; + return (buf->fields[slot].cbsize); +} + +void kcdb_buf_set_value_flag(kcdb_buf * buf, khm_size slot) +{ + if(slot >= buf->n_fields || + !(buf->fields[slot].flags & KCDB_CREDF_FLAG_ALLOCD)) + return; + + (buf->fields[slot].flags |= KCDB_CREDF_FLAG_DATA); +} + +khm_size kcdb_buf_slot_by_id(kcdb_buf * buf, khm_ui_2 id) +{ + int i; + + for(i=0; i < (int) buf->n_fields; i++) { + if(buf->fields[i].id == id) + break; + } + + if(i < (int) buf->n_fields) + return i; + else + return KCDB_BUF_INVALID_SLOT; +} + +/* API for accessing generic buffers */ + +KHMEXP khm_int32 KHMAPI kcdb_buf_get_attr( + khm_handle record, + khm_int32 attr_id, + khm_int32 * attr_type, + void * buffer, + khm_size * pcb_buf) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_get_attr(record, attr_id, attr_type, buffer, pcb_buf); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_get_attr(record, attr_id, attr_type, buffer, pcb_buf); + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP khm_int32 KHMAPI kcdb_buf_get_attrib( + khm_handle record, + wchar_t * attr_name, + khm_int32 * attr_type, + void * buffer, + khm_size * pcb_buf) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_get_attrib(record, attr_name, attr_type, buffer, pcb_buf); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_get_attrib(record, attr_name, attr_type, buffer, pcb_buf); + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP khm_int32 KHMAPI kcdb_buf_get_attr_string( + khm_handle record, + khm_int32 attr_id, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_get_attr_string(record, attr_id, buffer, pcbbuf, flags); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_get_attr_string(record, attr_id, buffer, pcbbuf, flags); + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP khm_int32 KHMAPI kcdb_buf_get_attrib_string( + khm_handle record, + wchar_t * attr_name, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_get_attrib_string(record, attr_name, buffer, pcbbuf, flags); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_get_attrib_string(record, attr_name, buffer, pcbbuf, flags); + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP khm_int32 KHMAPI kcdb_buf_set_attr( + khm_handle record, + khm_int32 attr_id, + void * buffer, + khm_size cbbuf) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_set_attr(record, attr_id, buffer, cbbuf); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_set_attr(record, attr_id, buffer, cbbuf); + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP khm_int32 KHMAPI kcdb_buf_set_attrib( + khm_handle record, + wchar_t * attr_name, + void * buffer, + khm_size cbbuf) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_set_attrib(record, attr_name, buffer, cbbuf); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_set_attrib(record, attr_name, buffer, cbbuf); + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP khm_int32 KHMAPI kcdb_buf_hold(khm_handle record) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_hold(record); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_hold(record); + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP khm_int32 KHMAPI kcdb_buf_release(khm_handle record) +{ + if(kcdb_cred_is_active_cred(record)) + return kcdb_cred_release(record); + else if(kcdb_is_active_identity(record)) + return kcdb_identity_release(record); + else + return KHM_ERROR_INVALID_PARAM; +} + --- krb5-1.4.4.orig/src/windows/identity/kcreddb/credset.c +++ krb5-1.4.4/src/windows/identity/kcreddb/credset.c @@ -1,1164 +1,1164 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -CRITICAL_SECTION cs_credset; -kcdb_credset * kcdb_credsets = NULL; -kcdb_credset * kcdb_root_credset = NULL; - -void -kcdb_credset_init(void) -{ - khm_handle rc; - - InitializeCriticalSection(&cs_credset); - kcdb_credsets = NULL; - - kcdb_credset_create(&rc); - kcdb_root_credset = (kcdb_credset *) rc; - kcdb_root_credset->flags |= KCDB_CREDSET_FLAG_ROOT; -} - -void -kcdb_credset_exit(void) -{ - /*TODO: free the credsets */ - DeleteCriticalSection(&cs_credset); -} - -/* called on an unreleased credset, or with credset::cs held */ -void -kcdb_credset_buf_new(kcdb_credset * cs) -{ - cs->clist = PMALLOC(KCDB_CREDSET_INITIAL_SIZE * - sizeof(kcdb_credset_credref)); - ZeroMemory(cs->clist, - KCDB_CREDSET_INITIAL_SIZE * - sizeof(kcdb_credset_credref)); - cs->nc_clist = KCDB_CREDSET_INITIAL_SIZE; - cs->nclist = 0; -} - -/* called on an unreleased credset, or with credset::cs held */ -void -kcdb_credset_buf_delete(kcdb_credset * cs) -{ - PFREE(cs->clist); - cs->nc_clist = 0; - cs->nclist = 0; -} - -void -kcdb_credset_buf_assert_size(kcdb_credset * cs, khm_int32 nclist) -{ - if(cs->nc_clist < nclist) { - kcdb_credset_credref * new_clist; - - /* nclist had better be greater than KCDB_CREDSET_INITIAL_SIZE */ - nclist = KCDB_CREDSET_INITIAL_SIZE + - (((nclist - (KCDB_CREDSET_INITIAL_SIZE + 1)) / KCDB_CREDSET_GROWTH_FACTOR) + 1) * - KCDB_CREDSET_GROWTH_FACTOR; - - new_clist = PCALLOC(nclist, sizeof(kcdb_credset_credref)); - - memcpy(new_clist, cs->clist, cs->nclist * sizeof(kcdb_credset_credref)); - - PFREE(cs->clist); - - cs->clist = new_clist; - } -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_create(khm_handle * result) -{ - kcdb_credset * cs; - - cs = PMALLOC(sizeof(kcdb_credset)); - ZeroMemory(cs, sizeof(kcdb_credset)); - - cs->magic = KCDB_CREDSET_MAGIC; - InitializeCriticalSection(&(cs->cs)); - LINIT(cs); - kcdb_credset_buf_new(cs); - cs->version = 0; - cs->seal_count = 0; - - EnterCriticalSection(&cs_credset); - LPUSH(&kcdb_credsets, cs); - LeaveCriticalSection(&cs_credset); - - *result = (khm_handle) cs; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_delete(khm_handle vcredset) -{ - kcdb_credset * cs; - int i; - - if(!kcdb_credset_is_credset(vcredset)) { - return KHM_ERROR_INVALID_PARAM; - } - - cs = (kcdb_credset *) vcredset; - - EnterCriticalSection(&cs_credset); - LDELETE(&kcdb_credsets, cs); - LeaveCriticalSection(&cs_credset); - - EnterCriticalSection(&(cs->cs)); - cs->magic = 0; - - for(i=0;inclist;i++) { - if(cs->clist[i].cred) { - kcdb_cred_release((khm_handle) cs->clist[i].cred); - } - } - kcdb_credset_buf_delete(cs); - - LeaveCriticalSection(&(cs->cs)); - DeleteCriticalSection(&(cs->cs)); - - PFREE(cs); - - return KHM_ERROR_SUCCESS; -} - -/*! \internal - -Collect credentials from cs2 to cs1 which have already been selected into -cl1 and cl2. - -- Credentials in cl2 that are not in cl1 will get added to cs1 -- Credentials in cl1 that are not in cl2 will get removed from cs1 -- Credentials in cl1 and cl2 will be updated in cs1 - -cl1 and cl2 will be modified. -*/ -khm_int32 -kcdb_credset_collect_core(kcdb_credset * cs1, - kcdb_cred ** cl1, - khm_int32 ncl1, - kcdb_credset * cs2, - kcdb_cred ** cl2, - khm_int32 ncl2, - khm_int32 * delta) -{ - int i, j; - int ldelta = 0; - khm_int32 rv; - - /* find matching creds and update them */ - for(i=0; ics)); - EnterCriticalSection(&(rcs->cs)); - - /* enumerate through the root and given credential sets and select - the ones we want */ - - if(rcs->nclist > 0) - r_sel = PMALLOC(sizeof(kcdb_cred *) * rcs->nclist); - if(cs->nclist > 0) - c_sel = PMALLOC(sizeof(kcdb_cred *) * cs->nclist); - nr_sel = 0; - nc_sel = 0; - - for(i=0; inclist; i++) { - if(rcs->clist[i].cred && - (!identity || rcs->clist[i].cred->identity == identity) && - (type==KCDB_CREDTYPE_ALL || rcs->clist[i].cred->type == type)) - { - r_sel[nr_sel++] = rcs->clist[i].cred; - } - } - - for(i=0; inclist; i++) { - if(cs->clist[i].cred && - (!identity || cs->clist[i].cred->identity == identity) && - (type==KCDB_CREDTYPE_ALL || cs->clist[i].cred->type == type)) - { - c_sel[nc_sel++] = cs->clist[i].cred; - } - } - - rcs->version++; - - code = kcdb_credset_collect_core( - rcs, - r_sel, - nr_sel, - cs, - c_sel, - nc_sel, - delta); - - LeaveCriticalSection(&(rcs->cs)); - LeaveCriticalSection(&(cs->cs)); - - if(r_sel) - PFREE(r_sel); - if(c_sel) - PFREE(c_sel); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_collect_filtered(khm_handle cs_dest, - khm_handle cs_src, - kcdb_cred_filter_func filter, - void * rock, - khm_int32 * delta) -{ - kcdb_credset * cs; - kcdb_credset * rcs; - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_cred ** r_sel = NULL; - kcdb_cred ** c_sel = NULL; - int nr_sel, nc_sel; - int i; - khm_int32 cs_f = 0; - khm_int32 rcs_f = 0; - - if((cs_src && !kcdb_credset_is_credset(cs_src)) || - (cs_dest && !kcdb_credset_is_credset(cs_dest)) || - (cs_src == cs_dest)) /* works because credsets use shared - handles */ - return KHM_ERROR_INVALID_PARAM; - - if(cs_src) - cs = (kcdb_credset *) cs_src; - else { - cs = kcdb_root_credset; - cs_f = KCDB_CREDCOLL_FILTER_ROOT; - } - - if(cs_dest) - rcs = (kcdb_credset *) cs_dest; - else { - rcs = kcdb_root_credset; - rcs_f = KCDB_CREDCOLL_FILTER_ROOT; - } - - if (kcdb_credset_is_sealed(rcs)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(cs->cs)); - EnterCriticalSection(&(rcs->cs)); - -#ifdef DEBUG - assert(!(rcs->flags & KCDB_CREDSET_FLAG_ENUM)); - assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - - if(rcs->nclist) - r_sel = PMALLOC(sizeof(kcdb_cred *) * rcs->nclist); - if(cs->nclist) - c_sel = PMALLOC(sizeof(kcdb_cred *) * cs->nclist); - nr_sel = 0; - nc_sel = 0; - - rcs->flags |= KCDB_CREDSET_FLAG_ENUM; - - for(i=0; inclist; i++) { - if(rcs->clist[i].cred && - (*filter)((khm_handle)rcs->clist[i].cred, - KCDB_CREDCOLL_FILTER_DEST | rcs_f, - rock)) - { - r_sel[nr_sel++] = rcs->clist[i].cred; - } - } - - rcs->flags &= ~KCDB_CREDSET_FLAG_ENUM; - cs->flags |= KCDB_CREDSET_FLAG_ENUM; - - for(i=0; inclist; i++) { - if(cs->clist[i].cred && filter((khm_handle)rcs->clist[i].cred, KCDB_CREDCOLL_FILTER_SRC | cs_f, rock)) - { - c_sel[nc_sel++] = cs->clist[i].cred; - } - } - - cs->flags &= ~KCDB_CREDSET_FLAG_ENUM; - - rcs->version++; - - code = kcdb_credset_collect_core( - rcs, - r_sel, - nr_sel, - cs, - c_sel, - nc_sel, - delta); - - LeaveCriticalSection(&(rcs->cs)); - LeaveCriticalSection(&(cs->cs)); - - if(r_sel) - PFREE(r_sel); - if(c_sel) - PFREE(c_sel); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_flush(khm_handle vcredset) -{ - int i; - kcdb_credset * cs; - - if(!kcdb_credset_is_credset(vcredset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) vcredset; - - if (kcdb_credset_is_sealed(cs)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(cs->cs)); - -#ifdef DEBUG - assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - - for(i=0;inclist;i++) { - if(cs->clist[i].cred) { - kcdb_cred_release((khm_handle) cs->clist[i].cred); - } - } - cs->nclist = 0; - LeaveCriticalSection(&(cs->cs)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_extract(khm_handle destcredset, - khm_handle sourcecredset, - khm_handle identity, - khm_int32 type) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_credset * dest; - kcdb_credset * src; - int isRoot = 0; - khm_size srcSize = 0; - int i; - - if(!kcdb_credset_is_credset(destcredset)) - return KHM_ERROR_INVALID_PARAM; - - if(sourcecredset) { - if(!kcdb_credset_is_credset(sourcecredset)) - return KHM_ERROR_INVALID_PARAM; - } else { - sourcecredset = kcdb_root_credset; - } - - if (sourcecredset == kcdb_root_credset) - isRoot = 1; - - src = (kcdb_credset *) sourcecredset; - dest = (kcdb_credset *) destcredset; - - if (kcdb_credset_is_sealed(dest)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(src->cs)); - EnterCriticalSection(&(dest->cs)); - -#ifdef DEBUG - assert(!(dest->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - - if(KHM_FAILED(kcdb_credset_get_size(sourcecredset, &srcSize))) { - code = KHM_ERROR_UNKNOWN; - goto _exit; - } - - kcdb_cred_lock_read(); - - for(i=0; i < (int) srcSize; i++) { - kcdb_cred * c; - - c = src->clist[i].cred; - if(kcdb_cred_is_active_cred((khm_handle) c) && - (!identity || c->identity == identity) && - (type < 0 || c->type == type)) - { - if(isRoot) { - khm_handle newcred; - - kcdb_cred_unlock_read(); - kcdb_cred_dup((khm_handle) c, &newcred); - kcdb_credset_add_cred(destcredset, newcred, -1); - kcdb_cred_release(newcred); - kcdb_cred_lock_read(); - } else { - kcdb_cred_unlock_read(); - kcdb_credset_add_cred(destcredset, (khm_handle) c, -1); - kcdb_cred_lock_read(); - } - } - } - - kcdb_cred_unlock_read(); - -_exit: - LeaveCriticalSection(&(dest->cs)); - LeaveCriticalSection(&(src->cs)); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_extract_filtered(khm_handle destcredset, - khm_handle sourcecredset, - kcdb_cred_filter_func filter, - void * rock) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_credset * dest; - kcdb_credset * src; - int isRoot = 0; - khm_size srcSize = 0; - int i; - - if(!kcdb_credset_is_credset(destcredset)) - return KHM_ERROR_INVALID_PARAM; - - if(sourcecredset) { - if(!kcdb_credset_is_credset(sourcecredset)) - return KHM_ERROR_INVALID_PARAM; - } else { - sourcecredset = kcdb_root_credset; - isRoot = 1; - } - - src = (kcdb_credset *) sourcecredset; - dest = (kcdb_credset *) destcredset; - - if (kcdb_credset_is_sealed(dest)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(src->cs)); - EnterCriticalSection(&(dest->cs)); - -#ifdef DEBUG - assert(!(dest->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - - if(KHM_FAILED(kcdb_credset_get_size(sourcecredset, &srcSize))) { - code = KHM_ERROR_UNKNOWN; - goto _exit; - } - - kcdb_cred_lock_read(); - - dest->flags |= KCDB_CREDSET_FLAG_ENUM; - - for(i=0; i < (int) srcSize; i++) { - kcdb_cred * c; - - c = src->clist[i].cred; - if(kcdb_cred_is_active_cred((khm_handle) c) && - filter(c, 0, rock)) - { - if(isRoot) { - khm_handle newcred; - - kcdb_cred_unlock_read(); - kcdb_cred_dup((khm_handle) c, &newcred); - kcdb_credset_add_cred(destcredset, newcred, -1); - kcdb_cred_release(newcred); - kcdb_cred_lock_read(); - } else { - kcdb_cred_unlock_read(); - kcdb_credset_add_cred(destcredset, (khm_handle) c, -1); - kcdb_cred_lock_read(); - } - } - } - - dest->flags &= ~KCDB_CREDSET_FLAG_ENUM; - - kcdb_cred_unlock_read(); - -_exit: - LeaveCriticalSection(&(dest->cs)); - LeaveCriticalSection(&(src->cs)); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_apply(khm_handle vcredset, kcdb_cred_apply_func f, - void * rock) -{ - kcdb_credset * cs; - khm_int32 rv = KHM_ERROR_SUCCESS; - int i; - - if(vcredset != NULL && !kcdb_credset_is_credset(vcredset)) - return KHM_ERROR_INVALID_PARAM; - - if(vcredset == NULL) { - cs = kcdb_root_credset; - } else { - cs = (kcdb_credset *) vcredset; - } - - EnterCriticalSection(&cs->cs); - -#ifdef DEBUG - assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - - cs->flags |= KCDB_CREDSET_FLAG_ENUM; - - for(i=0; inclist; i++) { - if(!kcdb_cred_is_active_cred(cs->clist[i].cred)) - continue; - - if(KHM_FAILED(f((khm_handle) cs->clist[i].cred, rock))) - break; - } - - cs->flags &= ~KCDB_CREDSET_FLAG_ENUM; - - LeaveCriticalSection(&cs->cs); - - if(inclist) - rv = KHM_ERROR_EXIT; - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_get_cred(khm_handle vcredset, - khm_int32 idx, - khm_handle * cred) -{ - kcdb_credset * cs; - khm_int32 code = KHM_ERROR_SUCCESS; - - if(!kcdb_credset_is_credset(vcredset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) vcredset; - - *cred = NULL; - - EnterCriticalSection(&(cs->cs)); - if(idx < 0 || idx >= cs->nclist) - code = KHM_ERROR_OUT_OF_BOUNDS; - else if(!cs->clist[idx].cred || !kcdb_cred_is_active_cred((khm_handle) cs->clist[idx].cred)) { - code = KHM_ERROR_DELETED; - if(cs->clist[idx].cred) { - kcdb_cred_release((khm_handle) cs->clist[idx].cred); - cs->clist[idx].cred = NULL; - } - } - else { - kcdb_cred_hold((khm_handle) cs->clist[idx].cred); - *cred = cs->clist[idx].cred; - } - LeaveCriticalSection(&(cs->cs)); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_find_filtered(khm_handle credset, - khm_int32 idx_start, - kcdb_cred_filter_func f, - void * rock, - khm_handle * cred, - khm_int32 * idx) -{ - kcdb_credset * cs; - khm_int32 rv = KHM_ERROR_SUCCESS; - int i; - - if((credset && !kcdb_credset_is_credset(credset)) || !f) - return KHM_ERROR_INVALID_PARAM; - - if(credset) - cs = (kcdb_credset *) credset; - else - cs = kcdb_root_credset; - - EnterCriticalSection(&cs->cs); - - if(idx_start < 0) - i = 0; - else - i = idx_start + 1; - -#ifdef DEBUG - assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - - cs->flags |= KCDB_CREDSET_FLAG_ENUM; - - for(; i < cs->nclist; i++) { - if(kcdb_cred_is_active_cred(cs->clist[i].cred) && - (*f)((khm_handle) cs->clist[i].cred, 0, rock) != 0) - break; - } - - cs->flags &= ~KCDB_CREDSET_FLAG_ENUM; - - if(i < cs->nclist) { - if (cred) { - *cred = (khm_handle) cs->clist[i].cred; - kcdb_cred_hold(*cred); - } - - if(idx) { - *idx = i; - } - } else { - rv = KHM_ERROR_NOT_FOUND; - } - - LeaveCriticalSection(&cs->cs); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_find_cred(khm_handle vcredset, - khm_handle vcred_src, - khm_handle *cred_dest) { - kcdb_credset * cs; - khm_handle cred = NULL; - int idx; - - if (!kcdb_credset_is_credset(vcredset)) - return KHM_ERROR_INVALID_PARAM; - - if (!kcdb_cred_is_active_cred(vcred_src)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) vcredset; - - EnterCriticalSection(&cs->cs); - for (idx = 0; idx < cs->nclist; idx++) { - if (cs->clist[idx].cred && - kcdb_creds_is_equal(vcred_src, cs->clist[idx].cred)) { - cred = cs->clist[idx].cred; - break; - } - } - - if (cred) - kcdb_cred_hold(cred); - - LeaveCriticalSection(&cs->cs); - - if (cred) { - if (cred_dest) - *cred_dest = cred; - else - kcdb_cred_release(cred); - - return KHM_ERROR_SUCCESS; - } else { - return KHM_ERROR_NOT_FOUND; - } -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_del_cred(khm_handle vcredset, - khm_int32 idx) -{ - kcdb_credset * cs; - khm_int32 code = KHM_ERROR_SUCCESS; - - if(!kcdb_credset_is_credset(vcredset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) vcredset; - - if (kcdb_credset_is_sealed(cs)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(cs->cs)); - if(idx < 0 || idx >= cs->nclist) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - if(cs->clist[idx].cred) - kcdb_cred_release((khm_handle) cs->clist[idx].cred); - - if (!(cs->flags & KCDB_CREDSET_FLAG_ENUM)) { - - if(idx + 1 < cs->nclist) - memmove(&(cs->clist[idx]), - &(cs->clist[idx+1]), - sizeof(kcdb_credset_credref) * - (cs->nclist - (idx + 1))); - - cs->nclist--; - } else { - cs->clist[idx].cred = NULL; - } - -_exit: - LeaveCriticalSection(&(cs->cs)); - - return code; -} - -khm_int32 -kcdb_credset_update_cred_ref(khm_handle credset, - khm_handle cred) -{ - kcdb_credset * cs; - khm_int32 code = KHM_ERROR_SUCCESS; - int i; - - if(!kcdb_credset_is_credset(credset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) credset; - - EnterCriticalSection(&(cs->cs)); - - for(i=0; inclist; i++) { - if(cs->clist[i].cred == cred) - break; - } - - if(inclist) { - cs->clist[i].version = cs->version; - } else { - code = KHM_ERROR_NOT_FOUND; - } - - LeaveCriticalSection(&(cs->cs)); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_del_cred_ref(khm_handle credset, - khm_handle cred) -{ - kcdb_credset * cs; - khm_int32 code = KHM_ERROR_SUCCESS; - int i; - - if(!kcdb_credset_is_credset(credset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) credset; - - if (kcdb_credset_is_sealed(cs)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(cs->cs)); - - for(i=0; inclist; i++) { - if(cs->clist[i].cred == cred) - break; - } - - if(inclist) { - code = kcdb_credset_del_cred(credset, i); - } else { - code = KHM_ERROR_NOT_FOUND; - } - - LeaveCriticalSection(&(cs->cs)); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_add_cred(khm_handle credset, - khm_handle cred, - khm_int32 idx) -{ - int new_idx; - kcdb_credset * cs; - khm_int32 code = KHM_ERROR_SUCCESS; - - if(!kcdb_credset_is_credset(credset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) credset; - - if (kcdb_credset_is_sealed(cs)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(cs->cs)); - - kcdb_credset_buf_assert_size(cs, cs->nclist + 1); - - if(idx < 0 || idx > cs->nclist) - new_idx = cs->nclist; - else if(idx < cs->nclist){ -#ifdef DEBUG - assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - memmove(&(cs->clist[idx+1]), &(cs->clist[idx]), (cs->nclist - idx)*sizeof(cs->clist[0])); - new_idx = idx; - } else - new_idx = idx; - - kcdb_cred_hold(cred); - - cs->clist[new_idx].cred = (kcdb_cred *) cred; - cs->clist[new_idx].version = cs->version; - cs->nclist++; - - LeaveCriticalSection(&(cs->cs)); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_get_size(khm_handle credset, - khm_size * size) -{ - kcdb_credset * cs; - - *size = 0; - - /* we don't rely on this working, since we can't purge a sealed - credset, although we can measure its size. */ - kcdb_credset_purge(credset); - - if (credset == NULL) - cs = kcdb_root_credset; - else - cs = (kcdb_credset *) credset; - - EnterCriticalSection(&(cs->cs)); - /* while it may seem a bit redundant to get a lock, it ensures that - that the size that we return is consistent with the current state - of the credential set */ - *size = cs->nclist; - LeaveCriticalSection(&(cs->cs)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_purge(khm_handle credset) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_credset * cs; - int i,j; - - if(!kcdb_credset_is_credset(credset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) credset; - - if (kcdb_credset_is_sealed(cs)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(cs->cs)); - - /* we can't purge a credset while an enumeration operation is in - progress. */ - if (cs->flags & KCDB_CREDSET_FLAG_ENUM) { - code = KHM_ERROR_INVALID_OPERATION; - goto _exit; - } - - for(i=0,j=0; i < cs->nclist; i++) { - if(cs->clist[i].cred) { - if(!kcdb_cred_is_active_cred((khm_handle) cs->clist[i].cred)) { - kcdb_cred_release((khm_handle) cs->clist[i].cred); - } else if(i != j) { - cs->clist[j++] = cs->clist[i]; - } else - j++; - } - } - cs->nclist = j; - - _exit: - LeaveCriticalSection(&(cs->cs)); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_seal(khm_handle credset) { - kcdb_credset * cs; - - if (!kcdb_credset_is_credset(credset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) credset; - - EnterCriticalSection(&cs->cs); - cs->seal_count++; - LeaveCriticalSection(&cs->cs); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_unseal(khm_handle credset) { - kcdb_credset * cs; - khm_int32 rv; - - if (!kcdb_credset_is_credset(credset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) credset; - - EnterCriticalSection(&cs->cs); - if (cs->seal_count > 0) { - cs->seal_count--; - rv = KHM_ERROR_SUCCESS; - } else { - rv = KHM_ERROR_INVALID_OPERATION; - } - LeaveCriticalSection(&cs->cs); - - return rv; -} - - -/* wrapper for qsort and also parameter gobbling FSM. */ -int __cdecl -kcdb_creds_comp_wrapper(const void * a, const void * b) -{ - static void * rock = NULL; - static kcdb_cred_comp_func comp = NULL; - - if(!b) { - rock = (void *) a; - return 0; - } - - if(!a) { - comp = (kcdb_cred_comp_func) b; - return 0; - } - - return comp((khm_handle) ((kcdb_credset_credref *)a)->cred, - (khm_handle) ((kcdb_credset_credref *)b)->cred, - rock); -} - -KHMEXP khm_int32 KHMAPI -kcdb_credset_sort(khm_handle credset, - kcdb_cred_comp_func comp, - void * rock) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_credset * cs; - - if(!kcdb_credset_is_credset(credset)) - return KHM_ERROR_INVALID_PARAM; - - cs = (kcdb_credset *) credset; - - if (kcdb_credset_is_sealed(cs)) - return KHM_ERROR_INVALID_OPERATION; - - EnterCriticalSection(&(cs->cs)); - -#ifdef DEBUG - assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); -#endif - - kcdb_creds_comp_wrapper(rock, NULL); - kcdb_creds_comp_wrapper(NULL, (void *) comp); - - qsort(cs->clist, cs->nclist, - sizeof(kcdb_credset_credref), kcdb_creds_comp_wrapper); - - LeaveCriticalSection(&(cs->cs)); - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_cred_comp_generic(khm_handle cred1, - khm_handle cred2, - void * rock) -{ - kcdb_cred_comp_order * o = (kcdb_cred_comp_order *) rock; - int i; - khm_int32 r = 0; - khm_int32 f1, f2; - khm_int32 t1, t2; - khm_int32 pt; - - for(i=0; inFields; i++) { - if (o->fields[i].order & KCDB_CRED_COMP_INITIAL_FIRST) { - - if (o->fields[i].attrib == KCDB_ATTR_TYPE_NAME || - o->fields[i].attrib == KCDB_ATTR_TYPE) { - - kcdb_cred_get_type(cred1, &t1); - kcdb_cred_get_type(cred2, &t2); - kcdb_identity_get_type(&pt); - - if (t1 == t2) - r = 0; - else if (t1 == pt) - r = -1; - else if (t2 == pt) - r = 1; - else - r = 0; - - } else { - - kcdb_cred_get_flags(cred1, &f1); - kcdb_cred_get_flags(cred2, &f2); - - if (((f1 ^ f2) & KCDB_CRED_FLAG_INITIAL) == 0) - r = 0; - else if (f1 & KCDB_CRED_FLAG_INITIAL) - r = -1; - else - r = 1; - - } - - } else { - r = 0; - } - - if (r == 0) - r = kcdb_creds_comp_attr(cred1,cred2,o->fields[i].attrib); - - if(r != 0) { - if(o->fields[i].order & KCDB_CRED_COMP_DECREASING) - r = -r; - break; - } - } - - return r; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +CRITICAL_SECTION cs_credset; +kcdb_credset * kcdb_credsets = NULL; +kcdb_credset * kcdb_root_credset = NULL; + +void +kcdb_credset_init(void) +{ + khm_handle rc; + + InitializeCriticalSection(&cs_credset); + kcdb_credsets = NULL; + + kcdb_credset_create(&rc); + kcdb_root_credset = (kcdb_credset *) rc; + kcdb_root_credset->flags |= KCDB_CREDSET_FLAG_ROOT; +} + +void +kcdb_credset_exit(void) +{ + /*TODO: free the credsets */ + DeleteCriticalSection(&cs_credset); +} + +/* called on an unreleased credset, or with credset::cs held */ +void +kcdb_credset_buf_new(kcdb_credset * cs) +{ + cs->clist = PMALLOC(KCDB_CREDSET_INITIAL_SIZE * + sizeof(kcdb_credset_credref)); + ZeroMemory(cs->clist, + KCDB_CREDSET_INITIAL_SIZE * + sizeof(kcdb_credset_credref)); + cs->nc_clist = KCDB_CREDSET_INITIAL_SIZE; + cs->nclist = 0; +} + +/* called on an unreleased credset, or with credset::cs held */ +void +kcdb_credset_buf_delete(kcdb_credset * cs) +{ + PFREE(cs->clist); + cs->nc_clist = 0; + cs->nclist = 0; +} + +void +kcdb_credset_buf_assert_size(kcdb_credset * cs, khm_int32 nclist) +{ + if(cs->nc_clist < nclist) { + kcdb_credset_credref * new_clist; + + /* nclist had better be greater than KCDB_CREDSET_INITIAL_SIZE */ + nclist = KCDB_CREDSET_INITIAL_SIZE + + (((nclist - (KCDB_CREDSET_INITIAL_SIZE + 1)) / KCDB_CREDSET_GROWTH_FACTOR) + 1) * + KCDB_CREDSET_GROWTH_FACTOR; + + new_clist = PCALLOC(nclist, sizeof(kcdb_credset_credref)); + + memcpy(new_clist, cs->clist, cs->nclist * sizeof(kcdb_credset_credref)); + + PFREE(cs->clist); + + cs->clist = new_clist; + } +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_create(khm_handle * result) +{ + kcdb_credset * cs; + + cs = PMALLOC(sizeof(kcdb_credset)); + ZeroMemory(cs, sizeof(kcdb_credset)); + + cs->magic = KCDB_CREDSET_MAGIC; + InitializeCriticalSection(&(cs->cs)); + LINIT(cs); + kcdb_credset_buf_new(cs); + cs->version = 0; + cs->seal_count = 0; + + EnterCriticalSection(&cs_credset); + LPUSH(&kcdb_credsets, cs); + LeaveCriticalSection(&cs_credset); + + *result = (khm_handle) cs; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_delete(khm_handle vcredset) +{ + kcdb_credset * cs; + int i; + + if(!kcdb_credset_is_credset(vcredset)) { + return KHM_ERROR_INVALID_PARAM; + } + + cs = (kcdb_credset *) vcredset; + + EnterCriticalSection(&cs_credset); + LDELETE(&kcdb_credsets, cs); + LeaveCriticalSection(&cs_credset); + + EnterCriticalSection(&(cs->cs)); + cs->magic = 0; + + for(i=0;inclist;i++) { + if(cs->clist[i].cred) { + kcdb_cred_release((khm_handle) cs->clist[i].cred); + } + } + kcdb_credset_buf_delete(cs); + + LeaveCriticalSection(&(cs->cs)); + DeleteCriticalSection(&(cs->cs)); + + PFREE(cs); + + return KHM_ERROR_SUCCESS; +} + +/*! \internal + +Collect credentials from cs2 to cs1 which have already been selected into +cl1 and cl2. + +- Credentials in cl2 that are not in cl1 will get added to cs1 +- Credentials in cl1 that are not in cl2 will get removed from cs1 +- Credentials in cl1 and cl2 will be updated in cs1 + +cl1 and cl2 will be modified. +*/ +khm_int32 +kcdb_credset_collect_core(kcdb_credset * cs1, + kcdb_cred ** cl1, + khm_int32 ncl1, + kcdb_credset * cs2, + kcdb_cred ** cl2, + khm_int32 ncl2, + khm_int32 * delta) +{ + int i, j; + int ldelta = 0; + khm_int32 rv; + + /* find matching creds and update them */ + for(i=0; ics)); + EnterCriticalSection(&(rcs->cs)); + + /* enumerate through the root and given credential sets and select + the ones we want */ + + if(rcs->nclist > 0) + r_sel = PMALLOC(sizeof(kcdb_cred *) * rcs->nclist); + if(cs->nclist > 0) + c_sel = PMALLOC(sizeof(kcdb_cred *) * cs->nclist); + nr_sel = 0; + nc_sel = 0; + + for(i=0; inclist; i++) { + if(rcs->clist[i].cred && + (!identity || rcs->clist[i].cred->identity == identity) && + (type==KCDB_CREDTYPE_ALL || rcs->clist[i].cred->type == type)) + { + r_sel[nr_sel++] = rcs->clist[i].cred; + } + } + + for(i=0; inclist; i++) { + if(cs->clist[i].cred && + (!identity || cs->clist[i].cred->identity == identity) && + (type==KCDB_CREDTYPE_ALL || cs->clist[i].cred->type == type)) + { + c_sel[nc_sel++] = cs->clist[i].cred; + } + } + + rcs->version++; + + code = kcdb_credset_collect_core( + rcs, + r_sel, + nr_sel, + cs, + c_sel, + nc_sel, + delta); + + LeaveCriticalSection(&(rcs->cs)); + LeaveCriticalSection(&(cs->cs)); + + if(r_sel) + PFREE(r_sel); + if(c_sel) + PFREE(c_sel); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_collect_filtered(khm_handle cs_dest, + khm_handle cs_src, + kcdb_cred_filter_func filter, + void * rock, + khm_int32 * delta) +{ + kcdb_credset * cs; + kcdb_credset * rcs; + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_cred ** r_sel = NULL; + kcdb_cred ** c_sel = NULL; + int nr_sel, nc_sel; + int i; + khm_int32 cs_f = 0; + khm_int32 rcs_f = 0; + + if((cs_src && !kcdb_credset_is_credset(cs_src)) || + (cs_dest && !kcdb_credset_is_credset(cs_dest)) || + (cs_src == cs_dest)) /* works because credsets use shared + handles */ + return KHM_ERROR_INVALID_PARAM; + + if(cs_src) + cs = (kcdb_credset *) cs_src; + else { + cs = kcdb_root_credset; + cs_f = KCDB_CREDCOLL_FILTER_ROOT; + } + + if(cs_dest) + rcs = (kcdb_credset *) cs_dest; + else { + rcs = kcdb_root_credset; + rcs_f = KCDB_CREDCOLL_FILTER_ROOT; + } + + if (kcdb_credset_is_sealed(rcs)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(cs->cs)); + EnterCriticalSection(&(rcs->cs)); + +#ifdef DEBUG + assert(!(rcs->flags & KCDB_CREDSET_FLAG_ENUM)); + assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + + if(rcs->nclist) + r_sel = PMALLOC(sizeof(kcdb_cred *) * rcs->nclist); + if(cs->nclist) + c_sel = PMALLOC(sizeof(kcdb_cred *) * cs->nclist); + nr_sel = 0; + nc_sel = 0; + + rcs->flags |= KCDB_CREDSET_FLAG_ENUM; + + for(i=0; inclist; i++) { + if(rcs->clist[i].cred && + (*filter)((khm_handle)rcs->clist[i].cred, + KCDB_CREDCOLL_FILTER_DEST | rcs_f, + rock)) + { + r_sel[nr_sel++] = rcs->clist[i].cred; + } + } + + rcs->flags &= ~KCDB_CREDSET_FLAG_ENUM; + cs->flags |= KCDB_CREDSET_FLAG_ENUM; + + for(i=0; inclist; i++) { + if(cs->clist[i].cred && filter((khm_handle)rcs->clist[i].cred, KCDB_CREDCOLL_FILTER_SRC | cs_f, rock)) + { + c_sel[nc_sel++] = cs->clist[i].cred; + } + } + + cs->flags &= ~KCDB_CREDSET_FLAG_ENUM; + + rcs->version++; + + code = kcdb_credset_collect_core( + rcs, + r_sel, + nr_sel, + cs, + c_sel, + nc_sel, + delta); + + LeaveCriticalSection(&(rcs->cs)); + LeaveCriticalSection(&(cs->cs)); + + if(r_sel) + PFREE(r_sel); + if(c_sel) + PFREE(c_sel); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_flush(khm_handle vcredset) +{ + int i; + kcdb_credset * cs; + + if(!kcdb_credset_is_credset(vcredset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) vcredset; + + if (kcdb_credset_is_sealed(cs)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(cs->cs)); + +#ifdef DEBUG + assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + + for(i=0;inclist;i++) { + if(cs->clist[i].cred) { + kcdb_cred_release((khm_handle) cs->clist[i].cred); + } + } + cs->nclist = 0; + LeaveCriticalSection(&(cs->cs)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_extract(khm_handle destcredset, + khm_handle sourcecredset, + khm_handle identity, + khm_int32 type) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_credset * dest; + kcdb_credset * src; + int isRoot = 0; + khm_size srcSize = 0; + int i; + + if(!kcdb_credset_is_credset(destcredset)) + return KHM_ERROR_INVALID_PARAM; + + if(sourcecredset) { + if(!kcdb_credset_is_credset(sourcecredset)) + return KHM_ERROR_INVALID_PARAM; + } else { + sourcecredset = kcdb_root_credset; + } + + if (sourcecredset == kcdb_root_credset) + isRoot = 1; + + src = (kcdb_credset *) sourcecredset; + dest = (kcdb_credset *) destcredset; + + if (kcdb_credset_is_sealed(dest)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(src->cs)); + EnterCriticalSection(&(dest->cs)); + +#ifdef DEBUG + assert(!(dest->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + + if(KHM_FAILED(kcdb_credset_get_size(sourcecredset, &srcSize))) { + code = KHM_ERROR_UNKNOWN; + goto _exit; + } + + kcdb_cred_lock_read(); + + for(i=0; i < (int) srcSize; i++) { + kcdb_cred * c; + + c = src->clist[i].cred; + if(kcdb_cred_is_active_cred((khm_handle) c) && + (!identity || c->identity == identity) && + (type < 0 || c->type == type)) + { + if(isRoot) { + khm_handle newcred; + + kcdb_cred_unlock_read(); + kcdb_cred_dup((khm_handle) c, &newcred); + kcdb_credset_add_cred(destcredset, newcred, -1); + kcdb_cred_release(newcred); + kcdb_cred_lock_read(); + } else { + kcdb_cred_unlock_read(); + kcdb_credset_add_cred(destcredset, (khm_handle) c, -1); + kcdb_cred_lock_read(); + } + } + } + + kcdb_cred_unlock_read(); + +_exit: + LeaveCriticalSection(&(dest->cs)); + LeaveCriticalSection(&(src->cs)); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_extract_filtered(khm_handle destcredset, + khm_handle sourcecredset, + kcdb_cred_filter_func filter, + void * rock) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_credset * dest; + kcdb_credset * src; + int isRoot = 0; + khm_size srcSize = 0; + int i; + + if(!kcdb_credset_is_credset(destcredset)) + return KHM_ERROR_INVALID_PARAM; + + if(sourcecredset) { + if(!kcdb_credset_is_credset(sourcecredset)) + return KHM_ERROR_INVALID_PARAM; + } else { + sourcecredset = kcdb_root_credset; + isRoot = 1; + } + + src = (kcdb_credset *) sourcecredset; + dest = (kcdb_credset *) destcredset; + + if (kcdb_credset_is_sealed(dest)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(src->cs)); + EnterCriticalSection(&(dest->cs)); + +#ifdef DEBUG + assert(!(dest->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + + if(KHM_FAILED(kcdb_credset_get_size(sourcecredset, &srcSize))) { + code = KHM_ERROR_UNKNOWN; + goto _exit; + } + + kcdb_cred_lock_read(); + + dest->flags |= KCDB_CREDSET_FLAG_ENUM; + + for(i=0; i < (int) srcSize; i++) { + kcdb_cred * c; + + c = src->clist[i].cred; + if(kcdb_cred_is_active_cred((khm_handle) c) && + filter(c, 0, rock)) + { + if(isRoot) { + khm_handle newcred; + + kcdb_cred_unlock_read(); + kcdb_cred_dup((khm_handle) c, &newcred); + kcdb_credset_add_cred(destcredset, newcred, -1); + kcdb_cred_release(newcred); + kcdb_cred_lock_read(); + } else { + kcdb_cred_unlock_read(); + kcdb_credset_add_cred(destcredset, (khm_handle) c, -1); + kcdb_cred_lock_read(); + } + } + } + + dest->flags &= ~KCDB_CREDSET_FLAG_ENUM; + + kcdb_cred_unlock_read(); + +_exit: + LeaveCriticalSection(&(dest->cs)); + LeaveCriticalSection(&(src->cs)); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_apply(khm_handle vcredset, kcdb_cred_apply_func f, + void * rock) +{ + kcdb_credset * cs; + khm_int32 rv = KHM_ERROR_SUCCESS; + int i; + + if(vcredset != NULL && !kcdb_credset_is_credset(vcredset)) + return KHM_ERROR_INVALID_PARAM; + + if(vcredset == NULL) { + cs = kcdb_root_credset; + } else { + cs = (kcdb_credset *) vcredset; + } + + EnterCriticalSection(&cs->cs); + +#ifdef DEBUG + assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + + cs->flags |= KCDB_CREDSET_FLAG_ENUM; + + for(i=0; inclist; i++) { + if(!kcdb_cred_is_active_cred(cs->clist[i].cred)) + continue; + + if(KHM_FAILED(f((khm_handle) cs->clist[i].cred, rock))) + break; + } + + cs->flags &= ~KCDB_CREDSET_FLAG_ENUM; + + LeaveCriticalSection(&cs->cs); + + if(inclist) + rv = KHM_ERROR_EXIT; + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_get_cred(khm_handle vcredset, + khm_int32 idx, + khm_handle * cred) +{ + kcdb_credset * cs; + khm_int32 code = KHM_ERROR_SUCCESS; + + if(!kcdb_credset_is_credset(vcredset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) vcredset; + + *cred = NULL; + + EnterCriticalSection(&(cs->cs)); + if(idx < 0 || idx >= cs->nclist) + code = KHM_ERROR_OUT_OF_BOUNDS; + else if(!cs->clist[idx].cred || !kcdb_cred_is_active_cred((khm_handle) cs->clist[idx].cred)) { + code = KHM_ERROR_DELETED; + if(cs->clist[idx].cred) { + kcdb_cred_release((khm_handle) cs->clist[idx].cred); + cs->clist[idx].cred = NULL; + } + } + else { + kcdb_cred_hold((khm_handle) cs->clist[idx].cred); + *cred = cs->clist[idx].cred; + } + LeaveCriticalSection(&(cs->cs)); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_find_filtered(khm_handle credset, + khm_int32 idx_start, + kcdb_cred_filter_func f, + void * rock, + khm_handle * cred, + khm_int32 * idx) +{ + kcdb_credset * cs; + khm_int32 rv = KHM_ERROR_SUCCESS; + int i; + + if((credset && !kcdb_credset_is_credset(credset)) || !f) + return KHM_ERROR_INVALID_PARAM; + + if(credset) + cs = (kcdb_credset *) credset; + else + cs = kcdb_root_credset; + + EnterCriticalSection(&cs->cs); + + if(idx_start < 0) + i = 0; + else + i = idx_start + 1; + +#ifdef DEBUG + assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + + cs->flags |= KCDB_CREDSET_FLAG_ENUM; + + for(; i < cs->nclist; i++) { + if(kcdb_cred_is_active_cred(cs->clist[i].cred) && + (*f)((khm_handle) cs->clist[i].cred, 0, rock) != 0) + break; + } + + cs->flags &= ~KCDB_CREDSET_FLAG_ENUM; + + if(i < cs->nclist) { + if (cred) { + *cred = (khm_handle) cs->clist[i].cred; + kcdb_cred_hold(*cred); + } + + if(idx) { + *idx = i; + } + } else { + rv = KHM_ERROR_NOT_FOUND; + } + + LeaveCriticalSection(&cs->cs); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_find_cred(khm_handle vcredset, + khm_handle vcred_src, + khm_handle *cred_dest) { + kcdb_credset * cs; + khm_handle cred = NULL; + int idx; + + if (!kcdb_credset_is_credset(vcredset)) + return KHM_ERROR_INVALID_PARAM; + + if (!kcdb_cred_is_active_cred(vcred_src)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) vcredset; + + EnterCriticalSection(&cs->cs); + for (idx = 0; idx < cs->nclist; idx++) { + if (cs->clist[idx].cred && + kcdb_creds_is_equal(vcred_src, cs->clist[idx].cred)) { + cred = cs->clist[idx].cred; + break; + } + } + + if (cred) + kcdb_cred_hold(cred); + + LeaveCriticalSection(&cs->cs); + + if (cred) { + if (cred_dest) + *cred_dest = cred; + else + kcdb_cred_release(cred); + + return KHM_ERROR_SUCCESS; + } else { + return KHM_ERROR_NOT_FOUND; + } +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_del_cred(khm_handle vcredset, + khm_int32 idx) +{ + kcdb_credset * cs; + khm_int32 code = KHM_ERROR_SUCCESS; + + if(!kcdb_credset_is_credset(vcredset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) vcredset; + + if (kcdb_credset_is_sealed(cs)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(cs->cs)); + if(idx < 0 || idx >= cs->nclist) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + if(cs->clist[idx].cred) + kcdb_cred_release((khm_handle) cs->clist[idx].cred); + + if (!(cs->flags & KCDB_CREDSET_FLAG_ENUM)) { + + if(idx + 1 < cs->nclist) + memmove(&(cs->clist[idx]), + &(cs->clist[idx+1]), + sizeof(kcdb_credset_credref) * + (cs->nclist - (idx + 1))); + + cs->nclist--; + } else { + cs->clist[idx].cred = NULL; + } + +_exit: + LeaveCriticalSection(&(cs->cs)); + + return code; +} + +khm_int32 +kcdb_credset_update_cred_ref(khm_handle credset, + khm_handle cred) +{ + kcdb_credset * cs; + khm_int32 code = KHM_ERROR_SUCCESS; + int i; + + if(!kcdb_credset_is_credset(credset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) credset; + + EnterCriticalSection(&(cs->cs)); + + for(i=0; inclist; i++) { + if(cs->clist[i].cred == cred) + break; + } + + if(inclist) { + cs->clist[i].version = cs->version; + } else { + code = KHM_ERROR_NOT_FOUND; + } + + LeaveCriticalSection(&(cs->cs)); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_del_cred_ref(khm_handle credset, + khm_handle cred) +{ + kcdb_credset * cs; + khm_int32 code = KHM_ERROR_SUCCESS; + int i; + + if(!kcdb_credset_is_credset(credset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) credset; + + if (kcdb_credset_is_sealed(cs)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(cs->cs)); + + for(i=0; inclist; i++) { + if(cs->clist[i].cred == cred) + break; + } + + if(inclist) { + code = kcdb_credset_del_cred(credset, i); + } else { + code = KHM_ERROR_NOT_FOUND; + } + + LeaveCriticalSection(&(cs->cs)); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_add_cred(khm_handle credset, + khm_handle cred, + khm_int32 idx) +{ + int new_idx; + kcdb_credset * cs; + khm_int32 code = KHM_ERROR_SUCCESS; + + if(!kcdb_credset_is_credset(credset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) credset; + + if (kcdb_credset_is_sealed(cs)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(cs->cs)); + + kcdb_credset_buf_assert_size(cs, cs->nclist + 1); + + if(idx < 0 || idx > cs->nclist) + new_idx = cs->nclist; + else if(idx < cs->nclist){ +#ifdef DEBUG + assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + memmove(&(cs->clist[idx+1]), &(cs->clist[idx]), (cs->nclist - idx)*sizeof(cs->clist[0])); + new_idx = idx; + } else + new_idx = idx; + + kcdb_cred_hold(cred); + + cs->clist[new_idx].cred = (kcdb_cred *) cred; + cs->clist[new_idx].version = cs->version; + cs->nclist++; + + LeaveCriticalSection(&(cs->cs)); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_get_size(khm_handle credset, + khm_size * size) +{ + kcdb_credset * cs; + + *size = 0; + + /* we don't rely on this working, since we can't purge a sealed + credset, although we can measure its size. */ + kcdb_credset_purge(credset); + + if (credset == NULL) + cs = kcdb_root_credset; + else + cs = (kcdb_credset *) credset; + + EnterCriticalSection(&(cs->cs)); + /* while it may seem a bit redundant to get a lock, it ensures that + that the size that we return is consistent with the current state + of the credential set */ + *size = cs->nclist; + LeaveCriticalSection(&(cs->cs)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_purge(khm_handle credset) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_credset * cs; + int i,j; + + if(!kcdb_credset_is_credset(credset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) credset; + + if (kcdb_credset_is_sealed(cs)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(cs->cs)); + + /* we can't purge a credset while an enumeration operation is in + progress. */ + if (cs->flags & KCDB_CREDSET_FLAG_ENUM) { + code = KHM_ERROR_INVALID_OPERATION; + goto _exit; + } + + for(i=0,j=0; i < cs->nclist; i++) { + if(cs->clist[i].cred) { + if(!kcdb_cred_is_active_cred((khm_handle) cs->clist[i].cred)) { + kcdb_cred_release((khm_handle) cs->clist[i].cred); + } else if(i != j) { + cs->clist[j++] = cs->clist[i]; + } else + j++; + } + } + cs->nclist = j; + + _exit: + LeaveCriticalSection(&(cs->cs)); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_seal(khm_handle credset) { + kcdb_credset * cs; + + if (!kcdb_credset_is_credset(credset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) credset; + + EnterCriticalSection(&cs->cs); + cs->seal_count++; + LeaveCriticalSection(&cs->cs); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_unseal(khm_handle credset) { + kcdb_credset * cs; + khm_int32 rv; + + if (!kcdb_credset_is_credset(credset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) credset; + + EnterCriticalSection(&cs->cs); + if (cs->seal_count > 0) { + cs->seal_count--; + rv = KHM_ERROR_SUCCESS; + } else { + rv = KHM_ERROR_INVALID_OPERATION; + } + LeaveCriticalSection(&cs->cs); + + return rv; +} + + +/* wrapper for qsort and also parameter gobbling FSM. */ +int __cdecl +kcdb_creds_comp_wrapper(const void * a, const void * b) +{ + static void * rock = NULL; + static kcdb_cred_comp_func comp = NULL; + + if(!b) { + rock = (void *) a; + return 0; + } + + if(!a) { + comp = (kcdb_cred_comp_func) b; + return 0; + } + + return comp((khm_handle) ((kcdb_credset_credref *)a)->cred, + (khm_handle) ((kcdb_credset_credref *)b)->cred, + rock); +} + +KHMEXP khm_int32 KHMAPI +kcdb_credset_sort(khm_handle credset, + kcdb_cred_comp_func comp, + void * rock) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_credset * cs; + + if(!kcdb_credset_is_credset(credset)) + return KHM_ERROR_INVALID_PARAM; + + cs = (kcdb_credset *) credset; + + if (kcdb_credset_is_sealed(cs)) + return KHM_ERROR_INVALID_OPERATION; + + EnterCriticalSection(&(cs->cs)); + +#ifdef DEBUG + assert(!(cs->flags & KCDB_CREDSET_FLAG_ENUM)); +#endif + + kcdb_creds_comp_wrapper(rock, NULL); + kcdb_creds_comp_wrapper(NULL, (void *) comp); + + qsort(cs->clist, cs->nclist, + sizeof(kcdb_credset_credref), kcdb_creds_comp_wrapper); + + LeaveCriticalSection(&(cs->cs)); + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_cred_comp_generic(khm_handle cred1, + khm_handle cred2, + void * rock) +{ + kcdb_cred_comp_order * o = (kcdb_cred_comp_order *) rock; + int i; + khm_int32 r = 0; + khm_int32 f1, f2; + khm_int32 t1, t2; + khm_int32 pt; + + for(i=0; inFields; i++) { + if (o->fields[i].order & KCDB_CRED_COMP_INITIAL_FIRST) { + + if (o->fields[i].attrib == KCDB_ATTR_TYPE_NAME || + o->fields[i].attrib == KCDB_ATTR_TYPE) { + + kcdb_cred_get_type(cred1, &t1); + kcdb_cred_get_type(cred2, &t2); + kcdb_identity_get_type(&pt); + + if (t1 == t2) + r = 0; + else if (t1 == pt) + r = -1; + else if (t2 == pt) + r = 1; + else + r = 0; + + } else { + + kcdb_cred_get_flags(cred1, &f1); + kcdb_cred_get_flags(cred2, &f2); + + if (((f1 ^ f2) & KCDB_CRED_FLAG_INITIAL) == 0) + r = 0; + else if (f1 & KCDB_CRED_FLAG_INITIAL) + r = -1; + else + r = 1; + + } + + } else { + r = 0; + } + + if (r == 0) + r = kcdb_creds_comp_attr(cred1,cred2,o->fields[i].attrib); + + if(r != 0) { + if(o->fields[i].order & KCDB_CRED_COMP_DECREASING) + r = -r; + break; + } + } + + return r; +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/langres.h +++ krb5-1.4.4/src/windows/identity/kcreddb/langres.h @@ -1,48 +1,48 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by D:\work\pismere\athena\auth\krb5\src\windows\identity\kcreddb\lang\en_us\kcredres.rc -// -#define IDS_CREDDB 101 -#define IDS_NAME 102 -#define IDS_IDENTITY 103 -#define IDS_ISSUED 104 -#define IDS_EXPIRES 105 -#define IDS_TIMELEFT 106 -#define IDS_LOCATION 107 -#define IDS_PARENT 108 -#define IDS_TYPE 109 -#define IDS_IVL_EXPIRED 110 -#define IDS_IVL_D_H 111 -#define IDS_IVL_H_M 112 -#define IDS_IVL_M_S 113 -#define IDS_IVL_S 114 -#define IDS_IVL_UNKNOWN 115 -#define IDS_LIFETIME 116 -#define IDS_IVL_1D 117 -#define IDS_IVL_1H 118 -#define IDS_IVL_1M 119 -#define IDS_IVL_1S 120 -#define IDS_IVL_D 121 -#define IDS_IVL_H 122 -#define IDS_IVL_M 123 -#define IDS_IVL_S_SPEC 124 -#define IDS_IVL_M_SPEC 125 -#define IDS_IVL_H_SPEC 126 -#define IDS_IVL_D_SPEC 127 -#define IDS_IVl_W_SPEC 128 -#define IDS_IVL_W_SPEC 128 -#define IDS_FLAGS 129 -#define IDS_RENEW_TIMELEFT 130 -#define IDS_RENEW_EXPIRES 131 -#define IDS_RENEW_LIFETIME 132 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by D:\work\pismere\athena\auth\krb5\src\windows\identity\kcreddb\lang\en_us\kcredres.rc +// +#define IDS_CREDDB 101 +#define IDS_NAME 102 +#define IDS_IDENTITY 103 +#define IDS_ISSUED 104 +#define IDS_EXPIRES 105 +#define IDS_TIMELEFT 106 +#define IDS_LOCATION 107 +#define IDS_PARENT 108 +#define IDS_TYPE 109 +#define IDS_IVL_EXPIRED 110 +#define IDS_IVL_D_H 111 +#define IDS_IVL_H_M 112 +#define IDS_IVL_M_S 113 +#define IDS_IVL_S 114 +#define IDS_IVL_UNKNOWN 115 +#define IDS_LIFETIME 116 +#define IDS_IVL_1D 117 +#define IDS_IVL_1H 118 +#define IDS_IVL_1M 119 +#define IDS_IVL_1S 120 +#define IDS_IVL_D 121 +#define IDS_IVL_H 122 +#define IDS_IVL_M 123 +#define IDS_IVL_S_SPEC 124 +#define IDS_IVL_M_SPEC 125 +#define IDS_IVL_H_SPEC 126 +#define IDS_IVL_D_SPEC 127 +#define IDS_IVl_W_SPEC 128 +#define IDS_IVL_W_SPEC 128 +#define IDS_FLAGS 129 +#define IDS_RENEW_TIMELEFT 130 +#define IDS_RENEW_EXPIRES 131 +#define IDS_RENEW_LIFETIME 132 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif --- krb5-1.4.4.orig/src/windows/identity/kcreddb/identity.c +++ krb5-1.4.4/src/windows/identity/kcreddb/identity.c @@ -1,1598 +1,1598 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -static CRITICAL_SECTION cs_ident; -hashtable * kcdb_identities_namemap = NULL; -khm_int32 kcdb_n_identities = 0; -kcdb_identity * kcdb_identities = NULL; -kcdb_identity * kcdb_def_identity = NULL; -khm_handle kcdb_ident_sub = NULL; /* identity provider */ -khm_int32 kcdb_ident_cred_type = KCDB_CREDTYPE_INVALID; -/* primary credentials type */ -khm_ui_4 kcdb_ident_refresh_cycle = 0; -khm_boolean kcdb_checked_config = FALSE; -khm_boolean kcdb_checking_config = FALSE; - -KHMEXP khm_boolean KHMAPI -kcdb_identity_is_equal(khm_handle identity1, - khm_handle identity2) -{ - - return (identity1 == identity2); - -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_provider(khm_handle sub) -{ - EnterCriticalSection(&cs_ident); - if (sub != kcdb_ident_sub) { - if(kcdb_ident_sub != NULL) { - kmq_post_sub_msg(kcdb_ident_sub, - KMSG_IDENT, - KMSG_IDENT_EXIT, - 0, - 0); - kmq_delete_subscription(kcdb_ident_sub); - } - kcdb_ident_sub = sub; - - if (kcdb_ident_sub) - kmq_post_sub_msg(kcdb_ident_sub, - KMSG_IDENT, - KMSG_IDENT_INIT, - 0, - 0); - } - LeaveCriticalSection(&cs_ident); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_provider(khm_handle * sub) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) - rv = KHM_ERROR_SUCCESS; - else - rv = KHM_ERROR_NOT_FOUND; - if(sub != NULL) - *sub = kcdb_ident_sub; - LeaveCriticalSection(&cs_ident); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_type(khm_int32 cred_type) -{ - EnterCriticalSection(&cs_ident); - kcdb_ident_cred_type = cred_type; - LeaveCriticalSection(&cs_ident); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_type(khm_int32 * ptype) -{ - if (!ptype) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_ident); - *ptype = kcdb_ident_cred_type; - LeaveCriticalSection(&cs_ident); - - if (*ptype >= 0) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -/* message completion routine */ -void -kcdbint_ident_msg_completion(kmq_message * m) { - kcdb_identity_release(m->vparam); -} - -void -kcdbint_ident_add_ref(const void * key, void * vid) { - /* References in the hashtable are not refcounted */ - - // kcdb_identity_hold(vid); -} - -void -kcdbint_ident_del_ref(const void * key, void * vid) { - /* References in the hashtable are not refcounted */ - - // kcdb_identity_release(vid); -} - -void -kcdbint_ident_init(void) { - InitializeCriticalSection(&cs_ident); - kcdb_identities_namemap = hash_new_hashtable( - KCDB_IDENT_HASHTABLE_SIZE, - hash_string, - hash_string_comp, - kcdbint_ident_add_ref, - kcdbint_ident_del_ref); -} - -void -kcdbint_ident_exit(void) { - EnterCriticalSection(&cs_ident); - hash_del_hashtable(kcdb_identities_namemap); - LeaveCriticalSection(&cs_ident); - DeleteCriticalSection(&cs_ident); -} - -/* NOT called with cs_ident held */ -KHMEXP khm_boolean KHMAPI -kcdb_identity_is_valid_name(const wchar_t * name) -{ - khm_int32 rv; - - /* special case. Note since the string we are comparing with is - of a known length we don't need to check the length of name. */ - if (!wcscmp(name, L"_Schema")) - return FALSE; - - rv = kcdb_identpro_validate_name(name); - - if(rv == KHM_ERROR_NO_PROVIDER || - rv == KHM_ERROR_NOT_IMPLEMENTED) - return TRUE; - else - return KHM_SUCCEEDED(rv); -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_create(const wchar_t *name, - khm_int32 flags, - khm_handle * result) { - kcdb_identity * id = NULL; - kcdb_identity * id_tmp = NULL; - size_t namesize; - - if(!result || !name) - return KHM_ERROR_INVALID_PARAM; - - *result = NULL; - - /* is it there already? */ - EnterCriticalSection(&cs_ident); - id = hash_lookup(kcdb_identities_namemap, (void *) name); - if(id) - kcdb_identity_hold((khm_handle) id); - LeaveCriticalSection(&cs_ident); - - if(id) { - *result = (khm_handle) id; - return KHM_ERROR_SUCCESS; - } else if(!(flags & KCDB_IDENT_FLAG_CREATE)) { - return KHM_ERROR_NOT_FOUND; - } - - flags &= ~KCDB_IDENT_FLAG_CREATE; - - /* nope. create it */ - if((flags & ~KCDB_IDENT_FLAGMASK_RDWR) || - (flags & (KCDB_IDENT_FLAG_DEFAULT | - KCDB_IDENT_FLAG_SEARCHABLE | - KCDB_IDENT_FLAG_STICKY))) { - /* can't specify this flag in create */ - return KHM_ERROR_INVALID_PARAM; - } - - if(!kcdb_identity_is_valid_name(name)) { - return KHM_ERROR_INVALID_NAME; - } - - /* we expect the following will succeed since the above - test passed */ - StringCbLength(name, KCDB_IDENT_MAXCB_NAME, &namesize); - namesize += sizeof(wchar_t); - - id = PMALLOC(sizeof(kcdb_identity)); - ZeroMemory(id, sizeof(kcdb_identity)); - id->magic = KCDB_IDENT_MAGIC; - id->name = PMALLOC(namesize); - StringCbCopy(id->name, namesize, name); - - id->flags = (flags & KCDB_IDENT_FLAGMASK_RDWR); - id->flags |= KCDB_IDENT_FLAG_ACTIVE; - LINIT(id); - - EnterCriticalSection(&cs_ident); - id_tmp = hash_lookup(kcdb_identities_namemap, (void *) id->name); - if(id_tmp) { - /* lost a race */ - kcdb_identity_hold((khm_handle) id_tmp); - *result = (khm_handle) id_tmp; - - PFREE(id->name); - PFREE(id); - - id = NULL; - } else { - khm_handle h_cfg; - - kcdb_identity_hold((khm_handle) id); - hash_add(kcdb_identities_namemap, - (void *) id->name, - (void *) id); - LPUSH(&kcdb_identities, id); - - if(KHM_SUCCEEDED(kcdb_identity_get_config((khm_handle) id, - 0, - &h_cfg))) { - /* don't need to set the KCDB_IDENT_FLAG_CONFIG flags - since kcdb_identity_get_config() sets it for us. */ - khm_int32 sticky; - - if (KHM_SUCCEEDED(khc_read_int32(h_cfg, L"Sticky", &sticky)) && - sticky) { - id->flags |= KCDB_IDENT_FLAG_STICKY; - } - - khc_close_space(h_cfg); - } - } - LeaveCriticalSection(&cs_ident); - - if(id != NULL) { - *result = (khm_handle) id; - - kcdb_identpro_notify_create((khm_handle) id); - - kcdbint_ident_post_message(KCDB_OP_INSERT, id); - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_delete(khm_handle vid) { - kcdb_identity * id; - khm_int32 code = KHM_ERROR_SUCCESS; - - EnterCriticalSection(&cs_ident); - if(!kcdb_is_identity(vid)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - id = (kcdb_identity *) vid; - - if (kcdb_is_active_identity(vid)) { - - id->flags &= ~KCDB_IDENT_FLAG_ACTIVE; - - hash_del(kcdb_identities_namemap, (void *) id->name); - - LeaveCriticalSection(&cs_ident); - - kcdbint_ident_post_message(KCDB_OP_DELETE, id); - - /* Once everybody finishes dealing with the identity deletion, - we will get called again. */ - return KHM_ERROR_SUCCESS; - } else if (id->refcount == 0) { - /* If the identity is not active, it is not in the hashtable - either */ - LDELETE(&kcdb_identities, id); - - if (id->name) - PFREE(id->name); - PFREE(id); - } - /* else, we have an identity that is not active, but has - outstanding references. We have to wait until those references - are freed. Once they are released, kcdb_identity_delete() will - be called again. */ - -#if 0 - EnterCriticalSection(&cs_ident); - if(id->refcount == 0) { - /*TODO: free up the identity */ - } -#endif - _exit: - LeaveCriticalSection(&cs_ident); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_flags(khm_handle vid, - khm_int32 flag, - khm_int32 mask) { - kcdb_identity * id; - khm_int32 oldflags; - khm_int32 newflags; - khm_int32 delta = 0; - khm_int32 rv; - - if (mask == 0) - return KHM_ERROR_SUCCESS; - - if(!kcdb_is_active_identity(vid)) - return KHM_ERROR_INVALID_PARAM; - - id = (kcdb_identity *) vid; - - flag &= mask; - - if((mask & ~KCDB_IDENT_FLAGMASK_RDWR) || - ((flag & KCDB_IDENT_FLAG_INVALID) && (flag & KCDB_IDENT_FLAG_VALID))) - return KHM_ERROR_INVALID_PARAM; - - if((mask & KCDB_IDENT_FLAG_DEFAULT) && - (flag & KCDB_IDENT_FLAG_DEFAULT)) { - /* kcdb_identity_set_default already does checking for - redundant transitions */ - rv = kcdb_identity_set_default(vid); - - if(KHM_FAILED(rv)) - return rv; - - mask &= ~KCDB_IDENT_FLAG_DEFAULT; - flag &= ~KCDB_IDENT_FLAG_DEFAULT; - } - - EnterCriticalSection(&cs_ident); - - if(mask & KCDB_IDENT_FLAG_SEARCHABLE) { - if(!(flag & KCDB_IDENT_FLAG_SEARCHABLE)) { - if(id->flags & KCDB_IDENT_FLAG_SEARCHABLE) { - LeaveCriticalSection(&cs_ident); - rv = kcdb_identpro_set_searchable(vid, FALSE); - EnterCriticalSection(&cs_ident); - if(rv == KHM_ERROR_NO_PROVIDER || - KHM_SUCCEEDED(rv)) { - id->flags &= ~KCDB_IDENT_FLAG_SEARCHABLE; - delta |= KCDB_IDENT_FLAG_SEARCHABLE; - } - } - } else { - if(!(id->flags & KCDB_IDENT_FLAG_SEARCHABLE)) { - LeaveCriticalSection(&cs_ident); - rv = kcdb_identpro_set_searchable(vid, TRUE); - EnterCriticalSection(&cs_ident); - if(rv == KHM_ERROR_NO_PROVIDER || - KHM_SUCCEEDED(rv)) { - id->flags |= KCDB_IDENT_FLAG_SEARCHABLE; - delta |= KCDB_IDENT_FLAG_SEARCHABLE; - } - } - } - - flag &= ~KCDB_IDENT_FLAG_SEARCHABLE; - mask &= ~KCDB_IDENT_FLAG_SEARCHABLE; - } - - if (mask & KCDB_IDENT_FLAG_STICKY) { - if ((flag ^ id->flags) & KCDB_IDENT_FLAG_STICKY) { - khm_handle h_conf; - - if (KHM_SUCCEEDED(kcdb_identity_get_config(vid, - KHM_FLAG_CREATE, - &h_conf))) { - khc_write_int32(h_conf, L"Sticky", - !!(flag & KCDB_IDENT_FLAG_STICKY)); - khc_close_space(h_conf); - } - - id->flags = - ((id->flags & ~KCDB_IDENT_FLAG_STICKY) | - (flag & KCDB_IDENT_FLAG_STICKY)); - - delta |= KCDB_IDENT_FLAG_STICKY; - } - - flag &= ~KCDB_IDENT_FLAG_STICKY; - mask &= ~KCDB_IDENT_FLAG_STICKY; - } - - /* deal with every other flag */ - - oldflags = id->flags; - - id->flags = (id->flags & ~mask) | (flag & mask); - - if (flag & KCDB_IDENT_FLAG_VALID) - id->flags &= ~KCDB_IDENT_FLAG_INVALID; - if (flag & KCDB_IDENT_FLAG_INVALID) - id->flags &= ~KCDB_IDENT_FLAG_VALID; - - newflags = id->flags; - - LeaveCriticalSection(&cs_ident); - - delta |= newflags ^ oldflags; - - if((delta & KCDB_IDENT_FLAG_HIDDEN)) { - kcdbint_ident_post_message( - (newflags & KCDB_IDENT_FLAG_HIDDEN)?KCDB_OP_HIDE:KCDB_OP_UNHIDE, - vid); - } - - if((delta & KCDB_IDENT_FLAG_SEARCHABLE)) { - kcdbint_ident_post_message( - (newflags & KCDB_IDENT_FLAG_SEARCHABLE)?KCDB_OP_SETSEARCH:KCDB_OP_UNSETSEARCH, - vid); - } - - if(delta != 0) - kcdbint_ident_post_message(KCDB_OP_MODIFY, vid); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_flags(khm_handle vid, - khm_int32 * flags) { - kcdb_identity * id; - - *flags = 0; - - if(!kcdb_is_active_identity(vid)) - return KHM_ERROR_INVALID_PARAM; - - id = (kcdb_identity *) vid; - - *flags = id->flags; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_name(khm_handle vid, - wchar_t * buffer, - khm_size * pcbsize) { - size_t namesize; - kcdb_identity * id; - - if(!kcdb_is_active_identity(vid) || !pcbsize) - return KHM_ERROR_INVALID_PARAM; - - id = (kcdb_identity *) vid; - - if(FAILED(StringCbLength(id->name, KCDB_IDENT_MAXCB_NAME, &namesize))) - return KHM_ERROR_UNKNOWN; - - namesize += sizeof(wchar_t); - - if(!buffer || namesize > *pcbsize) { - *pcbsize = namesize; - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buffer, *pcbsize, id->name); - *pcbsize = namesize; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_default(khm_handle * pvid) { - khm_handle def; - - if (pvid == NULL) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_ident); - def = kcdb_def_identity; - if (def != NULL) - kcdb_identity_hold(def); - LeaveCriticalSection(&cs_ident); - - *pvid = def; - - if (def != NULL) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -static khm_int32 -kcdbint_ident_set_default(khm_handle vid, - khm_boolean invoke_identpro) { - kcdb_identity * new_def; - kcdb_identity * old_def; - khm_int32 rv; - - if (vid != NULL && !kcdb_is_active_identity(vid)) - return KHM_ERROR_INVALID_PARAM; - - new_def = (kcdb_identity *)vid; - - if (new_def != NULL && (new_def->flags & KCDB_IDENT_FLAG_DEFAULT)) - return KHM_ERROR_SUCCESS; - - if ((new_def == NULL && kcdb_def_identity == NULL) || - (new_def == kcdb_def_identity)) - return KHM_ERROR_SUCCESS; - - /* first check with the identity provider if this operation - is permitted. */ - if (invoke_identpro) { - rv = kcdb_identpro_set_default(vid); - if(rv != KHM_ERROR_NO_PROVIDER && KHM_FAILED(rv)) - return rv; - } - - EnterCriticalSection(&cs_ident); - - old_def = kcdb_def_identity; - kcdb_def_identity = new_def; - - if(old_def != new_def) { - if(old_def) { - old_def->flags &= ~KCDB_IDENT_FLAG_DEFAULT; - kcdb_identity_release((khm_handle) old_def); - } - - if(new_def) { - new_def->flags |= KCDB_IDENT_FLAG_DEFAULT; - kcdb_identity_hold((khm_handle) new_def); - } - - LeaveCriticalSection(&cs_ident); - - if (invoke_identpro) - kcdbint_ident_post_message(KCDB_OP_NEW_DEFAULT, new_def); - } else { - LeaveCriticalSection(&cs_ident); - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_default(khm_handle vid) { - return kcdbint_ident_set_default(vid, TRUE); -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_default_int(khm_handle vid) { - return kcdbint_ident_set_default(vid, FALSE); -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_config(khm_handle vid, - khm_int32 flags, - khm_handle * result) { - khm_handle hkcdb; - khm_handle hidents = NULL; - khm_handle hident = NULL; - khm_int32 rv; - kcdb_identity * id; - - if(kcdb_is_active_identity(vid)) { - id = (kcdb_identity *) vid; - } else { - return KHM_ERROR_INVALID_PARAM; - } - - hkcdb = kcdb_get_config(); - if(hkcdb) { - rv = khc_open_space(hkcdb, L"Identity", 0, &hidents); - if(KHM_FAILED(rv)) - goto _exit; - - rv = khc_open_space(hidents, - id->name, - flags | KCONF_FLAG_NOPARSENAME, - &hident); - - if(KHM_FAILED(rv)) { - EnterCriticalSection(&cs_ident); - id->flags &= ~KCDB_IDENT_FLAG_CONFIG; - LeaveCriticalSection(&cs_ident); - goto _exit; - } - - EnterCriticalSection(&cs_ident); - id->flags |= KCDB_IDENT_FLAG_CONFIG; - LeaveCriticalSection(&cs_ident); - - *result = hident; - } else - rv = KHM_ERROR_UNKNOWN; - -_exit: - if(hidents) - khc_close_space(hidents); - if(hkcdb) - khc_close_space(hkcdb); - return rv; -} - -/*! \note cs_ident must be available. */ -void -kcdbint_ident_post_message(khm_int32 op, kcdb_identity * id) { - kcdb_identity_hold(id); - kmq_post_message(KMSG_KCDB, KMSG_KCDB_IDENT, op, (void *) id); -} - -/*! \note cs_ident must be available. */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_hold(khm_handle vid) { - kcdb_identity * id; - - EnterCriticalSection(&cs_ident); - if(kcdb_is_active_identity(vid)) { - id = vid; - id->refcount++; - } else { - LeaveCriticalSection(&cs_ident); - return KHM_ERROR_INVALID_PARAM; - } - LeaveCriticalSection(&cs_ident); - return ERROR_SUCCESS; -} - -/*! \note cs_ident must be available. */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_release(khm_handle vid) { - kcdb_identity * id; - khm_int32 refcount; - - EnterCriticalSection(&cs_ident); - if(kcdb_is_identity(vid)) { - id = vid; - refcount = --id->refcount; - if(refcount == 0) { - /* We only delete identities which do not have a - configuration. */ - if (id->refcount == 0 && - !(id->flags & KCDB_IDENT_FLAG_CONFIG)) - kcdb_identity_delete(vid); - } - } else { - LeaveCriticalSection(&cs_ident); - return KHM_ERROR_INVALID_PARAM; - } - LeaveCriticalSection(&cs_ident); - return ERROR_SUCCESS; -} - -struct kcdb_idref_result { - kcdb_identity * ident; - khm_int32 flags; - khm_size count; -}; - -static khm_int32 KHMAPI -kcdbint_idref_proc(khm_handle cred, void * r) { - khm_handle vid; - struct kcdb_idref_result *result; - khm_int32 flags; - - result = (struct kcdb_idref_result *) r; - - if (KHM_SUCCEEDED(kcdb_cred_get_identity(cred, &vid))) { - if (result->ident == (kcdb_identity *) vid) { - - result->count++; - kcdb_cred_get_flags(cred, &flags); - - if (flags & KCDB_CRED_FLAG_RENEWABLE) { - result->flags |= KCDB_IDENT_FLAG_CRED_RENEW; - if (flags & KCDB_CRED_FLAG_INITIAL) { - result->flags |= KCDB_IDENT_FLAG_RENEWABLE; - } - } - - if (flags & KCDB_CRED_FLAG_EXPIRED) { - result->flags |= KCDB_IDENT_FLAG_CRED_EXP; - if (flags & KCDB_CRED_FLAG_INITIAL) { - result->flags |= KCDB_IDENT_FLAG_EXPIRED; - } - } - - if (flags & KCDB_CRED_FLAG_INITIAL) { - result->flags |= KCDB_IDENT_FLAG_VALID; - } - } - - kcdb_identity_release(vid); - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_refresh(khm_handle vid) { - kcdb_identity * ident; - khm_int32 code = KHM_ERROR_SUCCESS; - struct kcdb_idref_result result; - - EnterCriticalSection(&cs_ident); - - if (!kcdb_is_active_identity(vid)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - ident = (kcdb_identity *) vid; - - result.ident = ident; - result.flags = 0; - result.count = 0; - - LeaveCriticalSection(&cs_ident); - - kcdb_credset_apply(NULL, kcdbint_idref_proc, &result); - - if (result.count == 0) - result.flags |= KCDB_IDENT_FLAG_EMPTY; - - kcdb_identity_set_flags(vid, result.flags, - KCDB_IDENT_FLAGMASK_RDWR & - ~(KCDB_IDENT_FLAG_DEFAULT | - KCDB_IDENT_FLAG_SEARCHABLE | - KCDB_IDENT_FLAG_STICKY)); - - EnterCriticalSection(&cs_ident); - ident->refresh_cycle = kcdb_ident_refresh_cycle; - - _exit: - LeaveCriticalSection(&cs_ident); - - if (code == 0) - code = kcdb_identpro_update(vid); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_refresh_all(void) { - kcdb_identity * ident; - kcdb_identity * next; - khm_int32 code = KHM_ERROR_SUCCESS; - int hit_count; - - EnterCriticalSection(&cs_ident); - - kcdb_ident_refresh_cycle++; - - /* The do-while loop is here to account for race conditions. We - release cs_ident in the for loop, so we don't actually have a - guarantee that we traversed the whole identity list at the end. - We repeat until all the identities are uptodate. */ - - do { - hit_count = 0; - - for (ident = kcdb_identities; - ident != NULL; - ident = next) { - - next = LNEXT(ident); - - if (!kcdb_is_active_identity(ident) || - ident->refresh_cycle == kcdb_ident_refresh_cycle) - continue; - - kcdb_identity_hold((khm_handle) ident); - - LeaveCriticalSection(&cs_ident); - - kcdb_identity_refresh((khm_handle) ident); - - EnterCriticalSection(&cs_ident); - - kcdb_identity_release((khm_handle) ident); - - hit_count++; - } - - } while (hit_count > 0); - - LeaveCriticalSection(&cs_ident); - - return code; -} - -/*****************************************/ -/* Custom property functions */ - -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_attr(khm_handle vid, - khm_int32 attr_id, - void * buffer, - khm_size cbbuf) -{ - kcdb_identity * id = NULL; - kcdb_attrib * attrib = NULL; - kcdb_type * type = NULL; - khm_size slot; - khm_size cbdest; - khm_int32 code = KHM_ERROR_SUCCESS; - - EnterCriticalSection(&cs_ident); - if(!kcdb_is_active_identity(vid)) { - LeaveCriticalSection(&cs_ident); - return KHM_ERROR_INVALID_PARAM; - } - - id = (kcdb_identity *) vid; - - if(!(id->flags & KCDB_IDENT_FLAG_ATTRIBS)) { - kcdb_buf_new(&id->buf, KCDB_BUF_DEFAULT); - id->flags |= KCDB_IDENT_FLAG_ATTRIBS; - } - - if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { - LeaveCriticalSection(&cs_ident); - return KHM_ERROR_INVALID_PARAM; - } - -#if 0 - /* actually, even if an attribute is computed, we still allow - those values to be set. This is because computing values - is only for credentials. If a computed value is used as a - property in any other object, it is treated as a regular value - */ - if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) - { - LeaveCriticalSection(&cs_ident); - kcdb_attrib_release_info(attrib); - return KHM_ERROR_INVALID_OPERATION; - } -#endif - - if (buffer == NULL) { - /* we are removing a value */ - slot = kcdb_buf_slot_by_id(&id->buf, attr_id); - if (slot != KCDB_BUF_INVALID_SLOT && - kcdb_buf_exist(&id->buf, slot)) - kcdb_buf_alloc(&id->buf, slot, attr_id, 0); - code = KHM_ERROR_SUCCESS; - goto _exit; - } - - if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { - LeaveCriticalSection(&cs_ident); - kcdb_attrib_release_info(attrib); - return KHM_ERROR_INVALID_PARAM; - } - - if(!(type->isValid(buffer,cbbuf))) { - code = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - - if((type->dup(buffer, cbbuf, NULL, &cbdest)) != KHM_ERROR_TOO_LONG) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - kcdb_buf_alloc(&id->buf, KCDB_BUF_APPEND, attr_id, cbdest); - slot = kcdb_buf_slot_by_id(&id->buf, attr_id); - if(slot == KCDB_BUF_INVALID_SLOT || !kcdb_buf_exist(&id->buf, slot)) { - code = KHM_ERROR_NO_RESOURCES; - goto _exit; - } - - if(KHM_FAILED(code = - type->dup(buffer, cbbuf, kcdb_buf_get(&id->buf, slot), &cbdest))) - { - kcdb_buf_alloc(&id->buf, slot, attr_id, 0); - goto _exit; - } - - kcdb_buf_set_value_flag(&id->buf, slot); - -_exit: - LeaveCriticalSection(&cs_ident); - - if(attrib) - kcdb_attrib_release_info(attrib); - if(type) - kcdb_type_release_info(type); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_attrib(khm_handle vid, - wchar_t * attr_name, - void * buffer, - khm_size cbbuf) -{ - khm_int32 attr_id = -1; - - if(KHM_FAILED(kcdb_attrib_get_id(attr_name, &attr_id))) - return KHM_ERROR_INVALID_PARAM; - - return kcdb_identity_set_attr( - vid, - attr_id, - buffer, - cbbuf); -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attr(khm_handle vid, - khm_int32 attr_id, - khm_int32 * attr_type, - void * buffer, - khm_size * pcbbuf) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_identity * id = NULL; - kcdb_attrib * attrib = NULL; - kcdb_type * type = NULL; - khm_size slot; - - if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { - return KHM_ERROR_INVALID_PARAM; - } - - if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { - kcdb_attrib_release_info(attrib); - return KHM_ERROR_UNKNOWN; - } - - if(attr_type) - *attr_type = attrib->type; - - EnterCriticalSection(&cs_ident); - - if(!kcdb_is_active_identity(vid)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - id = (kcdb_identity *) vid; - - if(!(id->flags & KCDB_IDENT_FLAG_ATTRIBS) || - (slot = kcdb_buf_slot_by_id(&id->buf, attr_id)) == KCDB_BUF_INVALID_SLOT || - !kcdb_buf_val_exist(&id->buf, slot)) - { - code = KHM_ERROR_NOT_FOUND; - goto _exit; - } - - if(!buffer && !pcbbuf) { - /* in this case the caller is only trying to determine if the field - contains data. If we get here, then the value exists. */ - code = KHM_ERROR_SUCCESS; - goto _exit; - } - -#if 0 - if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { - /* we should never hit this case */ -#ifdef DEBUG - assert(FALSE); -#else - code = KHM_ERROR_INVALID_OPERATION; -#endif - } else { -#endif - code = type->dup( - kcdb_buf_get(&id->buf, slot), - kcdb_buf_size(&id->buf, slot), - buffer, - pcbbuf); -#if 0 - } -#endif - -_exit: - LeaveCriticalSection(&cs_ident); - if(type) - kcdb_type_release_info(type); - if(attrib) - kcdb_attrib_release_info(attrib); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attrib(khm_handle vid, - wchar_t * attr_name, - khm_int32 * attr_type, - void * buffer, - khm_size * pcbbuf) -{ - khm_int32 attr_id = -1; - - if(KHM_FAILED(kcdb_attrib_get_id(attr_name, &attr_id))) - return KHM_ERROR_NOT_FOUND; - - return kcdb_identity_get_attr(vid, - attr_id, - attr_type, - buffer, - pcbbuf); -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attr_string(khm_handle vid, - khm_int32 attr_id, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags) -{ - khm_int32 code = KHM_ERROR_SUCCESS; - kcdb_identity * id = NULL; - kcdb_attrib * attrib = NULL; - kcdb_type * type = NULL; - khm_size slot; - - if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { - return KHM_ERROR_INVALID_PARAM; - } - - if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { - kcdb_attrib_release_info(attrib); - return KHM_ERROR_UNKNOWN; - } - - EnterCriticalSection(&cs_ident); - - if(!kcdb_is_active_identity(vid)) { - code = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - id = (kcdb_identity *) vid; - - if(!(id->flags & KCDB_IDENT_FLAG_ATTRIBS) || - (slot = kcdb_buf_slot_by_id(&id->buf, attr_id)) == KCDB_BUF_INVALID_SLOT || - !kcdb_buf_val_exist(&id->buf, slot)) - { - code = KHM_ERROR_NOT_FOUND; - goto _exit; - } - - if(!buffer && !pcbbuf) { - /* in this case the caller is only trying to determine if the field - contains data. If we get here, then the value exists */ - code = KHM_ERROR_SUCCESS; - goto _exit; - } - -#if 0 - if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { -#ifdef DEBUG - assert(FALSE); -#else - code = KHM_ERROR_INVALID_OPERATION; -#endif - } else { -#endif - if(kcdb_buf_exist(&id->buf, slot)) { - code = type->toString( - kcdb_buf_get(&id->buf, slot), - kcdb_buf_size(&id->buf, slot), - buffer, - pcbbuf, - flags); - } else - code = KHM_ERROR_NOT_FOUND; -#if 0 - } -#endif - -_exit: - LeaveCriticalSection(&cs_ident); - if(type) - kcdb_type_release_info(type); - if(attrib) - kcdb_attrib_release_info(attrib); - - return code; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attrib_string( - khm_handle vid, - wchar_t * attr_name, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags) -{ - khm_int32 attr_id = -1; - - if(KHM_FAILED(kcdb_attrib_get_id(attr_name, &attr_id))) - return KHM_ERROR_NOT_FOUND; - - return kcdb_identity_get_attr_string( - vid, - attr_id, - buffer, - pcbbuf, - flags); -} - -/*****************************************/ -/* Identity provider interface functions */ - -/* NOT called with cs_ident held */ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_validate_name(const wchar_t * name) -{ - kcdb_ident_name_xfer namex; - khm_handle sub; - khm_size cch; - khm_int32 rv = KHM_ERROR_SUCCESS; - - /* we need to verify the length and the contents of the string - before calling the identity provider */ - if(FAILED(StringCchLength(name, KCDB_IDENT_MAXCCH_NAME, &cch))) - return KHM_ERROR_TOO_LONG; - - /* We can't really make an assumption about the valid characters - in an identity. So we let the identity provider decide */ -#ifdef VALIDATE_IDENTIY_CHARACTERS - if(wcsspn(name, KCDB_IDENT_VALID_CHARS) != cch) - return KHM_ERROR_INVALID_NAME; -#endif - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - ZeroMemory(&namex, sizeof(namex)); - - namex.name_src = name; - namex.result = KHM_ERROR_NOT_IMPLEMENTED; - - kmq_send_sub_msg(sub, - KMSG_IDENT, - KMSG_IDENT_VALIDATE_NAME, - 0, - (void *) &namex); - - rv = namex.result; - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_validate_identity(khm_handle identity) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_handle sub; - - if(!kcdb_is_active_identity(identity)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - rv = kmq_send_sub_msg(sub, - KMSG_IDENT, - KMSG_IDENT_VALIDATE_IDENTITY, - 0, - (void *) identity); - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_canon_name(const wchar_t * name_in, - wchar_t * name_out, - khm_size * cb_name_out) -{ - khm_handle sub; - kcdb_ident_name_xfer namex; - wchar_t name_tmp[KCDB_IDENT_MAXCCH_NAME]; - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_size cch; - - if(cb_name_out == 0 || - FAILED(StringCchLength(name_in, KCDB_IDENT_MAXCCH_NAME, &cch))) - return KHM_ERROR_INVALID_NAME; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - ZeroMemory(&namex, sizeof(namex)); - ZeroMemory(name_tmp, sizeof(name_tmp)); - - namex.name_src = name_in; - namex.name_dest = name_tmp; - namex.cb_name_dest = sizeof(name_tmp); - namex.result = KHM_ERROR_NOT_IMPLEMENTED; - - rv = kmq_send_sub_msg(sub, - KMSG_IDENT, - KMSG_IDENT_CANON_NAME, - 0, - (void *) &namex); - - if(KHM_SUCCEEDED(namex.result)) { - const wchar_t * name_result; - khm_size cb; - - if(name_in[0] != 0 && name_tmp[0] == 0) - name_result = name_tmp; - else - name_result = name_in; - - if(FAILED(StringCbLength(name_result, KCDB_IDENT_MAXCB_NAME, &cb))) - rv = KHM_ERROR_UNKNOWN; - else { - cb += sizeof(wchar_t); - if(name_out == 0 || *cb_name_out < cb) { - rv = KHM_ERROR_TOO_LONG; - *cb_name_out = cb; - } else { - StringCbCopy(name_out, *cb_name_out, name_result); - *cb_name_out = cb; - rv = KHM_ERROR_SUCCESS; - } - } - } - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_compare_name(const wchar_t * name1, - const wchar_t * name2) -{ - khm_handle sub; - kcdb_ident_name_xfer namex; - khm_int32 rv = 0; - - /* Generally in kcdb_identpro_* functions we don't emulate - any behavior if the provider is not available, but lacking - a way to make this known, we emulate here */ - rv = wcscmp(name1, name2); - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - ZeroMemory(&namex, sizeof(namex)); - namex.name_src = name1; - namex.name_alt = name2; - namex.result = rv; - - kmq_send_sub_msg(sub, - KMSG_IDENT, - KMSG_IDENT_COMPARE_NAME, - 0, - (void *) &namex); - - rv = namex.result; - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_set_default(khm_handle identity) -{ - khm_handle sub; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if((identity != NULL) && - !kcdb_is_active_identity(identity)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - rv = kmq_send_sub_msg(sub, - KMSG_IDENT, - KMSG_IDENT_SET_DEFAULT, - (identity != NULL), - (void *) identity); - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_set_searchable(khm_handle identity, - khm_boolean searchable) -{ - khm_handle sub; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!kcdb_is_active_identity(identity)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - rv = kmq_send_sub_msg( - sub, - KMSG_IDENT, - KMSG_IDENT_SET_SEARCHABLE, - searchable, - (void *) identity); - } - - return rv; -} - - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_update(khm_handle identity) -{ - khm_handle sub; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!kcdb_is_active_identity(identity)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - rv = kmq_send_sub_msg(sub, - KMSG_IDENT, - KMSG_IDENT_UPDATE, - 0, - (void *) identity); - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_notify_create(khm_handle identity) -{ - khm_handle sub; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!kcdb_is_active_identity(identity)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - rv = kmq_send_sub_msg( - sub, - KMSG_IDENT, - KMSG_IDENT_NOTIFY_CREATE, - 0, - (void *) identity); - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identpro_get_ui_cb(void * rock) -{ - khm_handle sub; - khm_int32 rv = KHM_ERROR_SUCCESS; - - EnterCriticalSection(&cs_ident); - if(kcdb_ident_sub != NULL) { - sub = kcdb_ident_sub; - } else { - sub = NULL; - rv = KHM_ERROR_NO_PROVIDER; - } - LeaveCriticalSection(&cs_ident); - - if(sub != NULL) { - rv = kmq_send_sub_msg( - sub, - KMSG_IDENT, - KMSG_IDENT_GET_UI_CALLBACK, - 0, - rock); - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kcdb_identity_enum(khm_int32 and_flags, - khm_int32 eq_flags, - wchar_t * name_buf, - khm_size * pcb_buf, - khm_size * pn_idents) -{ - kcdb_identity * id; - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_size cb_req = 0; - khm_size n_idents = 0; - size_t cb_curr; - size_t cch_curr; - size_t cch_left; - HRESULT hr; - - if ((name_buf == NULL && pcb_buf == NULL && pn_idents == NULL) || - (name_buf != NULL && pcb_buf == NULL)) - return KHM_ERROR_INVALID_PARAM; - - eq_flags &= and_flags; - - EnterCriticalSection(&cs_ident); - - if (!kcdb_checked_config) { - khm_handle h_kcdb = NULL; - khm_handle h_idents = NULL; - khm_handle h_ident = NULL; - - kcdb_checked_config = TRUE; - kcdb_checking_config = TRUE; - - h_kcdb = kcdb_get_config(); - if (!h_kcdb) - goto _config_check_cleanup; - if(KHM_FAILED(khc_open_space(h_kcdb, L"Identity", 0, &h_idents))) - goto _config_check_cleanup; - - while(KHM_SUCCEEDED(khc_enum_subspaces(h_idents, - h_ident, - &h_ident))) { - - wchar_t wname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - khm_handle t_id; - - cb = sizeof(wname); - if (KHM_FAILED(khc_get_config_space_name(h_ident, - wname, - &cb))) - continue; - - LeaveCriticalSection(&cs_ident); - - if (KHM_SUCCEEDED(kcdb_identity_create(wname, - KCDB_IDENT_FLAG_CREATE, - &t_id))) - kcdb_identity_release(t_id); - - EnterCriticalSection(&cs_ident); - } - - _config_check_cleanup: - if (h_kcdb) - khc_close_space(h_kcdb); - if (h_idents) - khc_close_space(h_idents); - - kcdb_checking_config = FALSE; - } - - for ( id = kcdb_identities; - id != NULL; - id = LNEXT(id) ) { - if (((id->flags & KCDB_IDENT_FLAG_ACTIVE) == - KCDB_IDENT_FLAG_ACTIVE) && - ((id->flags & and_flags) == eq_flags)) { - n_idents ++; - hr = StringCbLength(id->name, KCDB_IDENT_MAXCB_NAME, &cb_curr); -#ifdef DEBUG - assert(SUCCEEDED(hr)); -#endif - cb_req += cb_curr + sizeof(wchar_t); - } - } - - cb_req += sizeof(wchar_t); - - if (pn_idents != NULL) - *pn_idents = n_idents; - - if (pcb_buf != NULL && (name_buf == NULL || *pcb_buf < cb_req)) { - *pcb_buf = cb_req; - - rv = KHM_ERROR_TOO_LONG; - } else if(name_buf != NULL) { - cch_left = (*pcb_buf) / sizeof(wchar_t); - - for (id = kcdb_identities; - id != NULL; - id = LNEXT(id)) { - if (((id->flags & KCDB_IDENT_FLAG_ACTIVE) == - KCDB_IDENT_FLAG_ACTIVE) && - ((id->flags & and_flags) == eq_flags)) { - StringCchLength(id->name, KCDB_IDENT_MAXCCH_NAME, - &cch_curr); - cch_curr++; - StringCchCopy(name_buf, cch_left, id->name); - cch_left -= cch_curr; - name_buf += cch_curr; - } - } - - *name_buf = L'\0'; - *pcb_buf = cb_req; - } - - LeaveCriticalSection(&cs_ident); - - return rv; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +static CRITICAL_SECTION cs_ident; +hashtable * kcdb_identities_namemap = NULL; +khm_int32 kcdb_n_identities = 0; +kcdb_identity * kcdb_identities = NULL; +kcdb_identity * kcdb_def_identity = NULL; +khm_handle kcdb_ident_sub = NULL; /* identity provider */ +khm_int32 kcdb_ident_cred_type = KCDB_CREDTYPE_INVALID; +/* primary credentials type */ +khm_ui_4 kcdb_ident_refresh_cycle = 0; +khm_boolean kcdb_checked_config = FALSE; +khm_boolean kcdb_checking_config = FALSE; + +KHMEXP khm_boolean KHMAPI +kcdb_identity_is_equal(khm_handle identity1, + khm_handle identity2) +{ + + return (identity1 == identity2); + +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_provider(khm_handle sub) +{ + EnterCriticalSection(&cs_ident); + if (sub != kcdb_ident_sub) { + if(kcdb_ident_sub != NULL) { + kmq_post_sub_msg(kcdb_ident_sub, + KMSG_IDENT, + KMSG_IDENT_EXIT, + 0, + 0); + kmq_delete_subscription(kcdb_ident_sub); + } + kcdb_ident_sub = sub; + + if (kcdb_ident_sub) + kmq_post_sub_msg(kcdb_ident_sub, + KMSG_IDENT, + KMSG_IDENT_INIT, + 0, + 0); + } + LeaveCriticalSection(&cs_ident); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_provider(khm_handle * sub) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) + rv = KHM_ERROR_SUCCESS; + else + rv = KHM_ERROR_NOT_FOUND; + if(sub != NULL) + *sub = kcdb_ident_sub; + LeaveCriticalSection(&cs_ident); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_type(khm_int32 cred_type) +{ + EnterCriticalSection(&cs_ident); + kcdb_ident_cred_type = cred_type; + LeaveCriticalSection(&cs_ident); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_type(khm_int32 * ptype) +{ + if (!ptype) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_ident); + *ptype = kcdb_ident_cred_type; + LeaveCriticalSection(&cs_ident); + + if (*ptype >= 0) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +/* message completion routine */ +void +kcdbint_ident_msg_completion(kmq_message * m) { + kcdb_identity_release(m->vparam); +} + +void +kcdbint_ident_add_ref(const void * key, void * vid) { + /* References in the hashtable are not refcounted */ + + // kcdb_identity_hold(vid); +} + +void +kcdbint_ident_del_ref(const void * key, void * vid) { + /* References in the hashtable are not refcounted */ + + // kcdb_identity_release(vid); +} + +void +kcdbint_ident_init(void) { + InitializeCriticalSection(&cs_ident); + kcdb_identities_namemap = hash_new_hashtable( + KCDB_IDENT_HASHTABLE_SIZE, + hash_string, + hash_string_comp, + kcdbint_ident_add_ref, + kcdbint_ident_del_ref); +} + +void +kcdbint_ident_exit(void) { + EnterCriticalSection(&cs_ident); + hash_del_hashtable(kcdb_identities_namemap); + LeaveCriticalSection(&cs_ident); + DeleteCriticalSection(&cs_ident); +} + +/* NOT called with cs_ident held */ +KHMEXP khm_boolean KHMAPI +kcdb_identity_is_valid_name(const wchar_t * name) +{ + khm_int32 rv; + + /* special case. Note since the string we are comparing with is + of a known length we don't need to check the length of name. */ + if (!wcscmp(name, L"_Schema")) + return FALSE; + + rv = kcdb_identpro_validate_name(name); + + if(rv == KHM_ERROR_NO_PROVIDER || + rv == KHM_ERROR_NOT_IMPLEMENTED) + return TRUE; + else + return KHM_SUCCEEDED(rv); +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_create(const wchar_t *name, + khm_int32 flags, + khm_handle * result) { + kcdb_identity * id = NULL; + kcdb_identity * id_tmp = NULL; + size_t namesize; + + if(!result || !name) + return KHM_ERROR_INVALID_PARAM; + + *result = NULL; + + /* is it there already? */ + EnterCriticalSection(&cs_ident); + id = hash_lookup(kcdb_identities_namemap, (void *) name); + if(id) + kcdb_identity_hold((khm_handle) id); + LeaveCriticalSection(&cs_ident); + + if(id) { + *result = (khm_handle) id; + return KHM_ERROR_SUCCESS; + } else if(!(flags & KCDB_IDENT_FLAG_CREATE)) { + return KHM_ERROR_NOT_FOUND; + } + + flags &= ~KCDB_IDENT_FLAG_CREATE; + + /* nope. create it */ + if((flags & ~KCDB_IDENT_FLAGMASK_RDWR) || + (flags & (KCDB_IDENT_FLAG_DEFAULT | + KCDB_IDENT_FLAG_SEARCHABLE | + KCDB_IDENT_FLAG_STICKY))) { + /* can't specify this flag in create */ + return KHM_ERROR_INVALID_PARAM; + } + + if(!kcdb_identity_is_valid_name(name)) { + return KHM_ERROR_INVALID_NAME; + } + + /* we expect the following will succeed since the above + test passed */ + StringCbLength(name, KCDB_IDENT_MAXCB_NAME, &namesize); + namesize += sizeof(wchar_t); + + id = PMALLOC(sizeof(kcdb_identity)); + ZeroMemory(id, sizeof(kcdb_identity)); + id->magic = KCDB_IDENT_MAGIC; + id->name = PMALLOC(namesize); + StringCbCopy(id->name, namesize, name); + + id->flags = (flags & KCDB_IDENT_FLAGMASK_RDWR); + id->flags |= KCDB_IDENT_FLAG_ACTIVE; + LINIT(id); + + EnterCriticalSection(&cs_ident); + id_tmp = hash_lookup(kcdb_identities_namemap, (void *) id->name); + if(id_tmp) { + /* lost a race */ + kcdb_identity_hold((khm_handle) id_tmp); + *result = (khm_handle) id_tmp; + + PFREE(id->name); + PFREE(id); + + id = NULL; + } else { + khm_handle h_cfg; + + kcdb_identity_hold((khm_handle) id); + hash_add(kcdb_identities_namemap, + (void *) id->name, + (void *) id); + LPUSH(&kcdb_identities, id); + + if(KHM_SUCCEEDED(kcdb_identity_get_config((khm_handle) id, + 0, + &h_cfg))) { + /* don't need to set the KCDB_IDENT_FLAG_CONFIG flags + since kcdb_identity_get_config() sets it for us. */ + khm_int32 sticky; + + if (KHM_SUCCEEDED(khc_read_int32(h_cfg, L"Sticky", &sticky)) && + sticky) { + id->flags |= KCDB_IDENT_FLAG_STICKY; + } + + khc_close_space(h_cfg); + } + } + LeaveCriticalSection(&cs_ident); + + if(id != NULL) { + *result = (khm_handle) id; + + kcdb_identpro_notify_create((khm_handle) id); + + kcdbint_ident_post_message(KCDB_OP_INSERT, id); + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_delete(khm_handle vid) { + kcdb_identity * id; + khm_int32 code = KHM_ERROR_SUCCESS; + + EnterCriticalSection(&cs_ident); + if(!kcdb_is_identity(vid)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + id = (kcdb_identity *) vid; + + if (kcdb_is_active_identity(vid)) { + + id->flags &= ~KCDB_IDENT_FLAG_ACTIVE; + + hash_del(kcdb_identities_namemap, (void *) id->name); + + LeaveCriticalSection(&cs_ident); + + kcdbint_ident_post_message(KCDB_OP_DELETE, id); + + /* Once everybody finishes dealing with the identity deletion, + we will get called again. */ + return KHM_ERROR_SUCCESS; + } else if (id->refcount == 0) { + /* If the identity is not active, it is not in the hashtable + either */ + LDELETE(&kcdb_identities, id); + + if (id->name) + PFREE(id->name); + PFREE(id); + } + /* else, we have an identity that is not active, but has + outstanding references. We have to wait until those references + are freed. Once they are released, kcdb_identity_delete() will + be called again. */ + +#if 0 + EnterCriticalSection(&cs_ident); + if(id->refcount == 0) { + /*TODO: free up the identity */ + } +#endif + _exit: + LeaveCriticalSection(&cs_ident); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_flags(khm_handle vid, + khm_int32 flag, + khm_int32 mask) { + kcdb_identity * id; + khm_int32 oldflags; + khm_int32 newflags; + khm_int32 delta = 0; + khm_int32 rv; + + if (mask == 0) + return KHM_ERROR_SUCCESS; + + if(!kcdb_is_active_identity(vid)) + return KHM_ERROR_INVALID_PARAM; + + id = (kcdb_identity *) vid; + + flag &= mask; + + if((mask & ~KCDB_IDENT_FLAGMASK_RDWR) || + ((flag & KCDB_IDENT_FLAG_INVALID) && (flag & KCDB_IDENT_FLAG_VALID))) + return KHM_ERROR_INVALID_PARAM; + + if((mask & KCDB_IDENT_FLAG_DEFAULT) && + (flag & KCDB_IDENT_FLAG_DEFAULT)) { + /* kcdb_identity_set_default already does checking for + redundant transitions */ + rv = kcdb_identity_set_default(vid); + + if(KHM_FAILED(rv)) + return rv; + + mask &= ~KCDB_IDENT_FLAG_DEFAULT; + flag &= ~KCDB_IDENT_FLAG_DEFAULT; + } + + EnterCriticalSection(&cs_ident); + + if(mask & KCDB_IDENT_FLAG_SEARCHABLE) { + if(!(flag & KCDB_IDENT_FLAG_SEARCHABLE)) { + if(id->flags & KCDB_IDENT_FLAG_SEARCHABLE) { + LeaveCriticalSection(&cs_ident); + rv = kcdb_identpro_set_searchable(vid, FALSE); + EnterCriticalSection(&cs_ident); + if(rv == KHM_ERROR_NO_PROVIDER || + KHM_SUCCEEDED(rv)) { + id->flags &= ~KCDB_IDENT_FLAG_SEARCHABLE; + delta |= KCDB_IDENT_FLAG_SEARCHABLE; + } + } + } else { + if(!(id->flags & KCDB_IDENT_FLAG_SEARCHABLE)) { + LeaveCriticalSection(&cs_ident); + rv = kcdb_identpro_set_searchable(vid, TRUE); + EnterCriticalSection(&cs_ident); + if(rv == KHM_ERROR_NO_PROVIDER || + KHM_SUCCEEDED(rv)) { + id->flags |= KCDB_IDENT_FLAG_SEARCHABLE; + delta |= KCDB_IDENT_FLAG_SEARCHABLE; + } + } + } + + flag &= ~KCDB_IDENT_FLAG_SEARCHABLE; + mask &= ~KCDB_IDENT_FLAG_SEARCHABLE; + } + + if (mask & KCDB_IDENT_FLAG_STICKY) { + if ((flag ^ id->flags) & KCDB_IDENT_FLAG_STICKY) { + khm_handle h_conf; + + if (KHM_SUCCEEDED(kcdb_identity_get_config(vid, + KHM_FLAG_CREATE, + &h_conf))) { + khc_write_int32(h_conf, L"Sticky", + !!(flag & KCDB_IDENT_FLAG_STICKY)); + khc_close_space(h_conf); + } + + id->flags = + ((id->flags & ~KCDB_IDENT_FLAG_STICKY) | + (flag & KCDB_IDENT_FLAG_STICKY)); + + delta |= KCDB_IDENT_FLAG_STICKY; + } + + flag &= ~KCDB_IDENT_FLAG_STICKY; + mask &= ~KCDB_IDENT_FLAG_STICKY; + } + + /* deal with every other flag */ + + oldflags = id->flags; + + id->flags = (id->flags & ~mask) | (flag & mask); + + if (flag & KCDB_IDENT_FLAG_VALID) + id->flags &= ~KCDB_IDENT_FLAG_INVALID; + if (flag & KCDB_IDENT_FLAG_INVALID) + id->flags &= ~KCDB_IDENT_FLAG_VALID; + + newflags = id->flags; + + LeaveCriticalSection(&cs_ident); + + delta |= newflags ^ oldflags; + + if((delta & KCDB_IDENT_FLAG_HIDDEN)) { + kcdbint_ident_post_message( + (newflags & KCDB_IDENT_FLAG_HIDDEN)?KCDB_OP_HIDE:KCDB_OP_UNHIDE, + vid); + } + + if((delta & KCDB_IDENT_FLAG_SEARCHABLE)) { + kcdbint_ident_post_message( + (newflags & KCDB_IDENT_FLAG_SEARCHABLE)?KCDB_OP_SETSEARCH:KCDB_OP_UNSETSEARCH, + vid); + } + + if(delta != 0) + kcdbint_ident_post_message(KCDB_OP_MODIFY, vid); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_flags(khm_handle vid, + khm_int32 * flags) { + kcdb_identity * id; + + *flags = 0; + + if(!kcdb_is_active_identity(vid)) + return KHM_ERROR_INVALID_PARAM; + + id = (kcdb_identity *) vid; + + *flags = id->flags; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_name(khm_handle vid, + wchar_t * buffer, + khm_size * pcbsize) { + size_t namesize; + kcdb_identity * id; + + if(!kcdb_is_active_identity(vid) || !pcbsize) + return KHM_ERROR_INVALID_PARAM; + + id = (kcdb_identity *) vid; + + if(FAILED(StringCbLength(id->name, KCDB_IDENT_MAXCB_NAME, &namesize))) + return KHM_ERROR_UNKNOWN; + + namesize += sizeof(wchar_t); + + if(!buffer || namesize > *pcbsize) { + *pcbsize = namesize; + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buffer, *pcbsize, id->name); + *pcbsize = namesize; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_default(khm_handle * pvid) { + khm_handle def; + + if (pvid == NULL) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_ident); + def = kcdb_def_identity; + if (def != NULL) + kcdb_identity_hold(def); + LeaveCriticalSection(&cs_ident); + + *pvid = def; + + if (def != NULL) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +static khm_int32 +kcdbint_ident_set_default(khm_handle vid, + khm_boolean invoke_identpro) { + kcdb_identity * new_def; + kcdb_identity * old_def; + khm_int32 rv; + + if (vid != NULL && !kcdb_is_active_identity(vid)) + return KHM_ERROR_INVALID_PARAM; + + new_def = (kcdb_identity *)vid; + + if (new_def != NULL && (new_def->flags & KCDB_IDENT_FLAG_DEFAULT)) + return KHM_ERROR_SUCCESS; + + if ((new_def == NULL && kcdb_def_identity == NULL) || + (new_def == kcdb_def_identity)) + return KHM_ERROR_SUCCESS; + + /* first check with the identity provider if this operation + is permitted. */ + if (invoke_identpro) { + rv = kcdb_identpro_set_default(vid); + if(rv != KHM_ERROR_NO_PROVIDER && KHM_FAILED(rv)) + return rv; + } + + EnterCriticalSection(&cs_ident); + + old_def = kcdb_def_identity; + kcdb_def_identity = new_def; + + if(old_def != new_def) { + if(old_def) { + old_def->flags &= ~KCDB_IDENT_FLAG_DEFAULT; + kcdb_identity_release((khm_handle) old_def); + } + + if(new_def) { + new_def->flags |= KCDB_IDENT_FLAG_DEFAULT; + kcdb_identity_hold((khm_handle) new_def); + } + + LeaveCriticalSection(&cs_ident); + + if (invoke_identpro) + kcdbint_ident_post_message(KCDB_OP_NEW_DEFAULT, new_def); + } else { + LeaveCriticalSection(&cs_ident); + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_default(khm_handle vid) { + return kcdbint_ident_set_default(vid, TRUE); +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_default_int(khm_handle vid) { + return kcdbint_ident_set_default(vid, FALSE); +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_config(khm_handle vid, + khm_int32 flags, + khm_handle * result) { + khm_handle hkcdb; + khm_handle hidents = NULL; + khm_handle hident = NULL; + khm_int32 rv; + kcdb_identity * id; + + if(kcdb_is_active_identity(vid)) { + id = (kcdb_identity *) vid; + } else { + return KHM_ERROR_INVALID_PARAM; + } + + hkcdb = kcdb_get_config(); + if(hkcdb) { + rv = khc_open_space(hkcdb, L"Identity", 0, &hidents); + if(KHM_FAILED(rv)) + goto _exit; + + rv = khc_open_space(hidents, + id->name, + flags | KCONF_FLAG_NOPARSENAME, + &hident); + + if(KHM_FAILED(rv)) { + EnterCriticalSection(&cs_ident); + id->flags &= ~KCDB_IDENT_FLAG_CONFIG; + LeaveCriticalSection(&cs_ident); + goto _exit; + } + + EnterCriticalSection(&cs_ident); + id->flags |= KCDB_IDENT_FLAG_CONFIG; + LeaveCriticalSection(&cs_ident); + + *result = hident; + } else + rv = KHM_ERROR_UNKNOWN; + +_exit: + if(hidents) + khc_close_space(hidents); + if(hkcdb) + khc_close_space(hkcdb); + return rv; +} + +/*! \note cs_ident must be available. */ +void +kcdbint_ident_post_message(khm_int32 op, kcdb_identity * id) { + kcdb_identity_hold(id); + kmq_post_message(KMSG_KCDB, KMSG_KCDB_IDENT, op, (void *) id); +} + +/*! \note cs_ident must be available. */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_hold(khm_handle vid) { + kcdb_identity * id; + + EnterCriticalSection(&cs_ident); + if(kcdb_is_active_identity(vid)) { + id = vid; + id->refcount++; + } else { + LeaveCriticalSection(&cs_ident); + return KHM_ERROR_INVALID_PARAM; + } + LeaveCriticalSection(&cs_ident); + return ERROR_SUCCESS; +} + +/*! \note cs_ident must be available. */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_release(khm_handle vid) { + kcdb_identity * id; + khm_int32 refcount; + + EnterCriticalSection(&cs_ident); + if(kcdb_is_identity(vid)) { + id = vid; + refcount = --id->refcount; + if(refcount == 0) { + /* We only delete identities which do not have a + configuration. */ + if (id->refcount == 0 && + !(id->flags & KCDB_IDENT_FLAG_CONFIG)) + kcdb_identity_delete(vid); + } + } else { + LeaveCriticalSection(&cs_ident); + return KHM_ERROR_INVALID_PARAM; + } + LeaveCriticalSection(&cs_ident); + return ERROR_SUCCESS; +} + +struct kcdb_idref_result { + kcdb_identity * ident; + khm_int32 flags; + khm_size count; +}; + +static khm_int32 KHMAPI +kcdbint_idref_proc(khm_handle cred, void * r) { + khm_handle vid; + struct kcdb_idref_result *result; + khm_int32 flags; + + result = (struct kcdb_idref_result *) r; + + if (KHM_SUCCEEDED(kcdb_cred_get_identity(cred, &vid))) { + if (result->ident == (kcdb_identity *) vid) { + + result->count++; + kcdb_cred_get_flags(cred, &flags); + + if (flags & KCDB_CRED_FLAG_RENEWABLE) { + result->flags |= KCDB_IDENT_FLAG_CRED_RENEW; + if (flags & KCDB_CRED_FLAG_INITIAL) { + result->flags |= KCDB_IDENT_FLAG_RENEWABLE; + } + } + + if (flags & KCDB_CRED_FLAG_EXPIRED) { + result->flags |= KCDB_IDENT_FLAG_CRED_EXP; + if (flags & KCDB_CRED_FLAG_INITIAL) { + result->flags |= KCDB_IDENT_FLAG_EXPIRED; + } + } + + if (flags & KCDB_CRED_FLAG_INITIAL) { + result->flags |= KCDB_IDENT_FLAG_VALID; + } + } + + kcdb_identity_release(vid); + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_refresh(khm_handle vid) { + kcdb_identity * ident; + khm_int32 code = KHM_ERROR_SUCCESS; + struct kcdb_idref_result result; + + EnterCriticalSection(&cs_ident); + + if (!kcdb_is_active_identity(vid)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + ident = (kcdb_identity *) vid; + + result.ident = ident; + result.flags = 0; + result.count = 0; + + LeaveCriticalSection(&cs_ident); + + kcdb_credset_apply(NULL, kcdbint_idref_proc, &result); + + if (result.count == 0) + result.flags |= KCDB_IDENT_FLAG_EMPTY; + + kcdb_identity_set_flags(vid, result.flags, + KCDB_IDENT_FLAGMASK_RDWR & + ~(KCDB_IDENT_FLAG_DEFAULT | + KCDB_IDENT_FLAG_SEARCHABLE | + KCDB_IDENT_FLAG_STICKY)); + + EnterCriticalSection(&cs_ident); + ident->refresh_cycle = kcdb_ident_refresh_cycle; + + _exit: + LeaveCriticalSection(&cs_ident); + + if (code == 0) + code = kcdb_identpro_update(vid); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_refresh_all(void) { + kcdb_identity * ident; + kcdb_identity * next; + khm_int32 code = KHM_ERROR_SUCCESS; + int hit_count; + + EnterCriticalSection(&cs_ident); + + kcdb_ident_refresh_cycle++; + + /* The do-while loop is here to account for race conditions. We + release cs_ident in the for loop, so we don't actually have a + guarantee that we traversed the whole identity list at the end. + We repeat until all the identities are uptodate. */ + + do { + hit_count = 0; + + for (ident = kcdb_identities; + ident != NULL; + ident = next) { + + next = LNEXT(ident); + + if (!kcdb_is_active_identity(ident) || + ident->refresh_cycle == kcdb_ident_refresh_cycle) + continue; + + kcdb_identity_hold((khm_handle) ident); + + LeaveCriticalSection(&cs_ident); + + kcdb_identity_refresh((khm_handle) ident); + + EnterCriticalSection(&cs_ident); + + kcdb_identity_release((khm_handle) ident); + + hit_count++; + } + + } while (hit_count > 0); + + LeaveCriticalSection(&cs_ident); + + return code; +} + +/*****************************************/ +/* Custom property functions */ + +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_attr(khm_handle vid, + khm_int32 attr_id, + void * buffer, + khm_size cbbuf) +{ + kcdb_identity * id = NULL; + kcdb_attrib * attrib = NULL; + kcdb_type * type = NULL; + khm_size slot; + khm_size cbdest; + khm_int32 code = KHM_ERROR_SUCCESS; + + EnterCriticalSection(&cs_ident); + if(!kcdb_is_active_identity(vid)) { + LeaveCriticalSection(&cs_ident); + return KHM_ERROR_INVALID_PARAM; + } + + id = (kcdb_identity *) vid; + + if(!(id->flags & KCDB_IDENT_FLAG_ATTRIBS)) { + kcdb_buf_new(&id->buf, KCDB_BUF_DEFAULT); + id->flags |= KCDB_IDENT_FLAG_ATTRIBS; + } + + if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { + LeaveCriticalSection(&cs_ident); + return KHM_ERROR_INVALID_PARAM; + } + +#if 0 + /* actually, even if an attribute is computed, we still allow + those values to be set. This is because computing values + is only for credentials. If a computed value is used as a + property in any other object, it is treated as a regular value + */ + if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) + { + LeaveCriticalSection(&cs_ident); + kcdb_attrib_release_info(attrib); + return KHM_ERROR_INVALID_OPERATION; + } +#endif + + if (buffer == NULL) { + /* we are removing a value */ + slot = kcdb_buf_slot_by_id(&id->buf, attr_id); + if (slot != KCDB_BUF_INVALID_SLOT && + kcdb_buf_exist(&id->buf, slot)) + kcdb_buf_alloc(&id->buf, slot, attr_id, 0); + code = KHM_ERROR_SUCCESS; + goto _exit; + } + + if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { + LeaveCriticalSection(&cs_ident); + kcdb_attrib_release_info(attrib); + return KHM_ERROR_INVALID_PARAM; + } + + if(!(type->isValid(buffer,cbbuf))) { + code = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + + if((type->dup(buffer, cbbuf, NULL, &cbdest)) != KHM_ERROR_TOO_LONG) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + kcdb_buf_alloc(&id->buf, KCDB_BUF_APPEND, attr_id, cbdest); + slot = kcdb_buf_slot_by_id(&id->buf, attr_id); + if(slot == KCDB_BUF_INVALID_SLOT || !kcdb_buf_exist(&id->buf, slot)) { + code = KHM_ERROR_NO_RESOURCES; + goto _exit; + } + + if(KHM_FAILED(code = + type->dup(buffer, cbbuf, kcdb_buf_get(&id->buf, slot), &cbdest))) + { + kcdb_buf_alloc(&id->buf, slot, attr_id, 0); + goto _exit; + } + + kcdb_buf_set_value_flag(&id->buf, slot); + +_exit: + LeaveCriticalSection(&cs_ident); + + if(attrib) + kcdb_attrib_release_info(attrib); + if(type) + kcdb_type_release_info(type); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_attrib(khm_handle vid, + wchar_t * attr_name, + void * buffer, + khm_size cbbuf) +{ + khm_int32 attr_id = -1; + + if(KHM_FAILED(kcdb_attrib_get_id(attr_name, &attr_id))) + return KHM_ERROR_INVALID_PARAM; + + return kcdb_identity_set_attr( + vid, + attr_id, + buffer, + cbbuf); +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attr(khm_handle vid, + khm_int32 attr_id, + khm_int32 * attr_type, + void * buffer, + khm_size * pcbbuf) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_identity * id = NULL; + kcdb_attrib * attrib = NULL; + kcdb_type * type = NULL; + khm_size slot; + + if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { + return KHM_ERROR_INVALID_PARAM; + } + + if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { + kcdb_attrib_release_info(attrib); + return KHM_ERROR_UNKNOWN; + } + + if(attr_type) + *attr_type = attrib->type; + + EnterCriticalSection(&cs_ident); + + if(!kcdb_is_active_identity(vid)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + id = (kcdb_identity *) vid; + + if(!(id->flags & KCDB_IDENT_FLAG_ATTRIBS) || + (slot = kcdb_buf_slot_by_id(&id->buf, attr_id)) == KCDB_BUF_INVALID_SLOT || + !kcdb_buf_val_exist(&id->buf, slot)) + { + code = KHM_ERROR_NOT_FOUND; + goto _exit; + } + + if(!buffer && !pcbbuf) { + /* in this case the caller is only trying to determine if the field + contains data. If we get here, then the value exists. */ + code = KHM_ERROR_SUCCESS; + goto _exit; + } + +#if 0 + if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { + /* we should never hit this case */ +#ifdef DEBUG + assert(FALSE); +#else + code = KHM_ERROR_INVALID_OPERATION; +#endif + } else { +#endif + code = type->dup( + kcdb_buf_get(&id->buf, slot), + kcdb_buf_size(&id->buf, slot), + buffer, + pcbbuf); +#if 0 + } +#endif + +_exit: + LeaveCriticalSection(&cs_ident); + if(type) + kcdb_type_release_info(type); + if(attrib) + kcdb_attrib_release_info(attrib); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attrib(khm_handle vid, + wchar_t * attr_name, + khm_int32 * attr_type, + void * buffer, + khm_size * pcbbuf) +{ + khm_int32 attr_id = -1; + + if(KHM_FAILED(kcdb_attrib_get_id(attr_name, &attr_id))) + return KHM_ERROR_NOT_FOUND; + + return kcdb_identity_get_attr(vid, + attr_id, + attr_type, + buffer, + pcbbuf); +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attr_string(khm_handle vid, + khm_int32 attr_id, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags) +{ + khm_int32 code = KHM_ERROR_SUCCESS; + kcdb_identity * id = NULL; + kcdb_attrib * attrib = NULL; + kcdb_type * type = NULL; + khm_size slot; + + if(KHM_FAILED(kcdb_attrib_get_info(attr_id, &attrib))) { + return KHM_ERROR_INVALID_PARAM; + } + + if(KHM_FAILED(kcdb_type_get_info(attrib->type, &type))) { + kcdb_attrib_release_info(attrib); + return KHM_ERROR_UNKNOWN; + } + + EnterCriticalSection(&cs_ident); + + if(!kcdb_is_active_identity(vid)) { + code = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + id = (kcdb_identity *) vid; + + if(!(id->flags & KCDB_IDENT_FLAG_ATTRIBS) || + (slot = kcdb_buf_slot_by_id(&id->buf, attr_id)) == KCDB_BUF_INVALID_SLOT || + !kcdb_buf_val_exist(&id->buf, slot)) + { + code = KHM_ERROR_NOT_FOUND; + goto _exit; + } + + if(!buffer && !pcbbuf) { + /* in this case the caller is only trying to determine if the field + contains data. If we get here, then the value exists */ + code = KHM_ERROR_SUCCESS; + goto _exit; + } + +#if 0 + if(attrib->flags & KCDB_ATTR_FLAG_COMPUTED) { +#ifdef DEBUG + assert(FALSE); +#else + code = KHM_ERROR_INVALID_OPERATION; +#endif + } else { +#endif + if(kcdb_buf_exist(&id->buf, slot)) { + code = type->toString( + kcdb_buf_get(&id->buf, slot), + kcdb_buf_size(&id->buf, slot), + buffer, + pcbbuf, + flags); + } else + code = KHM_ERROR_NOT_FOUND; +#if 0 + } +#endif + +_exit: + LeaveCriticalSection(&cs_ident); + if(type) + kcdb_type_release_info(type); + if(attrib) + kcdb_attrib_release_info(attrib); + + return code; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attrib_string( + khm_handle vid, + wchar_t * attr_name, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags) +{ + khm_int32 attr_id = -1; + + if(KHM_FAILED(kcdb_attrib_get_id(attr_name, &attr_id))) + return KHM_ERROR_NOT_FOUND; + + return kcdb_identity_get_attr_string( + vid, + attr_id, + buffer, + pcbbuf, + flags); +} + +/*****************************************/ +/* Identity provider interface functions */ + +/* NOT called with cs_ident held */ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_validate_name(const wchar_t * name) +{ + kcdb_ident_name_xfer namex; + khm_handle sub; + khm_size cch; + khm_int32 rv = KHM_ERROR_SUCCESS; + + /* we need to verify the length and the contents of the string + before calling the identity provider */ + if(FAILED(StringCchLength(name, KCDB_IDENT_MAXCCH_NAME, &cch))) + return KHM_ERROR_TOO_LONG; + + /* We can't really make an assumption about the valid characters + in an identity. So we let the identity provider decide */ +#ifdef VALIDATE_IDENTIY_CHARACTERS + if(wcsspn(name, KCDB_IDENT_VALID_CHARS) != cch) + return KHM_ERROR_INVALID_NAME; +#endif + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + ZeroMemory(&namex, sizeof(namex)); + + namex.name_src = name; + namex.result = KHM_ERROR_NOT_IMPLEMENTED; + + kmq_send_sub_msg(sub, + KMSG_IDENT, + KMSG_IDENT_VALIDATE_NAME, + 0, + (void *) &namex); + + rv = namex.result; + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_validate_identity(khm_handle identity) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_handle sub; + + if(!kcdb_is_active_identity(identity)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + rv = kmq_send_sub_msg(sub, + KMSG_IDENT, + KMSG_IDENT_VALIDATE_IDENTITY, + 0, + (void *) identity); + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_canon_name(const wchar_t * name_in, + wchar_t * name_out, + khm_size * cb_name_out) +{ + khm_handle sub; + kcdb_ident_name_xfer namex; + wchar_t name_tmp[KCDB_IDENT_MAXCCH_NAME]; + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_size cch; + + if(cb_name_out == 0 || + FAILED(StringCchLength(name_in, KCDB_IDENT_MAXCCH_NAME, &cch))) + return KHM_ERROR_INVALID_NAME; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + ZeroMemory(&namex, sizeof(namex)); + ZeroMemory(name_tmp, sizeof(name_tmp)); + + namex.name_src = name_in; + namex.name_dest = name_tmp; + namex.cb_name_dest = sizeof(name_tmp); + namex.result = KHM_ERROR_NOT_IMPLEMENTED; + + rv = kmq_send_sub_msg(sub, + KMSG_IDENT, + KMSG_IDENT_CANON_NAME, + 0, + (void *) &namex); + + if(KHM_SUCCEEDED(namex.result)) { + const wchar_t * name_result; + khm_size cb; + + if(name_in[0] != 0 && name_tmp[0] == 0) + name_result = name_tmp; + else + name_result = name_in; + + if(FAILED(StringCbLength(name_result, KCDB_IDENT_MAXCB_NAME, &cb))) + rv = KHM_ERROR_UNKNOWN; + else { + cb += sizeof(wchar_t); + if(name_out == 0 || *cb_name_out < cb) { + rv = KHM_ERROR_TOO_LONG; + *cb_name_out = cb; + } else { + StringCbCopy(name_out, *cb_name_out, name_result); + *cb_name_out = cb; + rv = KHM_ERROR_SUCCESS; + } + } + } + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_compare_name(const wchar_t * name1, + const wchar_t * name2) +{ + khm_handle sub; + kcdb_ident_name_xfer namex; + khm_int32 rv = 0; + + /* Generally in kcdb_identpro_* functions we don't emulate + any behavior if the provider is not available, but lacking + a way to make this known, we emulate here */ + rv = wcscmp(name1, name2); + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + ZeroMemory(&namex, sizeof(namex)); + namex.name_src = name1; + namex.name_alt = name2; + namex.result = rv; + + kmq_send_sub_msg(sub, + KMSG_IDENT, + KMSG_IDENT_COMPARE_NAME, + 0, + (void *) &namex); + + rv = namex.result; + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_set_default(khm_handle identity) +{ + khm_handle sub; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if((identity != NULL) && + !kcdb_is_active_identity(identity)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + rv = kmq_send_sub_msg(sub, + KMSG_IDENT, + KMSG_IDENT_SET_DEFAULT, + (identity != NULL), + (void *) identity); + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_set_searchable(khm_handle identity, + khm_boolean searchable) +{ + khm_handle sub; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!kcdb_is_active_identity(identity)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + rv = kmq_send_sub_msg( + sub, + KMSG_IDENT, + KMSG_IDENT_SET_SEARCHABLE, + searchable, + (void *) identity); + } + + return rv; +} + + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_update(khm_handle identity) +{ + khm_handle sub; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!kcdb_is_active_identity(identity)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + rv = kmq_send_sub_msg(sub, + KMSG_IDENT, + KMSG_IDENT_UPDATE, + 0, + (void *) identity); + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_notify_create(khm_handle identity) +{ + khm_handle sub; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!kcdb_is_active_identity(identity)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + rv = kmq_send_sub_msg( + sub, + KMSG_IDENT, + KMSG_IDENT_NOTIFY_CREATE, + 0, + (void *) identity); + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identpro_get_ui_cb(void * rock) +{ + khm_handle sub; + khm_int32 rv = KHM_ERROR_SUCCESS; + + EnterCriticalSection(&cs_ident); + if(kcdb_ident_sub != NULL) { + sub = kcdb_ident_sub; + } else { + sub = NULL; + rv = KHM_ERROR_NO_PROVIDER; + } + LeaveCriticalSection(&cs_ident); + + if(sub != NULL) { + rv = kmq_send_sub_msg( + sub, + KMSG_IDENT, + KMSG_IDENT_GET_UI_CALLBACK, + 0, + rock); + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kcdb_identity_enum(khm_int32 and_flags, + khm_int32 eq_flags, + wchar_t * name_buf, + khm_size * pcb_buf, + khm_size * pn_idents) +{ + kcdb_identity * id; + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_size cb_req = 0; + khm_size n_idents = 0; + size_t cb_curr; + size_t cch_curr; + size_t cch_left; + HRESULT hr; + + if ((name_buf == NULL && pcb_buf == NULL && pn_idents == NULL) || + (name_buf != NULL && pcb_buf == NULL)) + return KHM_ERROR_INVALID_PARAM; + + eq_flags &= and_flags; + + EnterCriticalSection(&cs_ident); + + if (!kcdb_checked_config) { + khm_handle h_kcdb = NULL; + khm_handle h_idents = NULL; + khm_handle h_ident = NULL; + + kcdb_checked_config = TRUE; + kcdb_checking_config = TRUE; + + h_kcdb = kcdb_get_config(); + if (!h_kcdb) + goto _config_check_cleanup; + if(KHM_FAILED(khc_open_space(h_kcdb, L"Identity", 0, &h_idents))) + goto _config_check_cleanup; + + while(KHM_SUCCEEDED(khc_enum_subspaces(h_idents, + h_ident, + &h_ident))) { + + wchar_t wname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + khm_handle t_id; + + cb = sizeof(wname); + if (KHM_FAILED(khc_get_config_space_name(h_ident, + wname, + &cb))) + continue; + + LeaveCriticalSection(&cs_ident); + + if (KHM_SUCCEEDED(kcdb_identity_create(wname, + KCDB_IDENT_FLAG_CREATE, + &t_id))) + kcdb_identity_release(t_id); + + EnterCriticalSection(&cs_ident); + } + + _config_check_cleanup: + if (h_kcdb) + khc_close_space(h_kcdb); + if (h_idents) + khc_close_space(h_idents); + + kcdb_checking_config = FALSE; + } + + for ( id = kcdb_identities; + id != NULL; + id = LNEXT(id) ) { + if (((id->flags & KCDB_IDENT_FLAG_ACTIVE) == + KCDB_IDENT_FLAG_ACTIVE) && + ((id->flags & and_flags) == eq_flags)) { + n_idents ++; + hr = StringCbLength(id->name, KCDB_IDENT_MAXCB_NAME, &cb_curr); +#ifdef DEBUG + assert(SUCCEEDED(hr)); +#endif + cb_req += cb_curr + sizeof(wchar_t); + } + } + + cb_req += sizeof(wchar_t); + + if (pn_idents != NULL) + *pn_idents = n_idents; + + if (pcb_buf != NULL && (name_buf == NULL || *pcb_buf < cb_req)) { + *pcb_buf = cb_req; + + rv = KHM_ERROR_TOO_LONG; + } else if(name_buf != NULL) { + cch_left = (*pcb_buf) / sizeof(wchar_t); + + for (id = kcdb_identities; + id != NULL; + id = LNEXT(id)) { + if (((id->flags & KCDB_IDENT_FLAG_ACTIVE) == + KCDB_IDENT_FLAG_ACTIVE) && + ((id->flags & and_flags) == eq_flags)) { + StringCchLength(id->name, KCDB_IDENT_MAXCCH_NAME, + &cch_curr); + cch_curr++; + StringCchCopy(name_buf, cch_left, id->name); + cch_left -= cch_curr; + name_buf += cch_curr; + } + } + + *name_buf = L'\0'; + *pcb_buf = cb_req; + } + + LeaveCriticalSection(&cs_ident); + + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/kcreddb/kcreddb.h +++ krb5-1.4.4/src/windows/identity/kcreddb/kcreddb.h @@ -1,3277 +1,3277 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCREDDB_H__ -#define __KHIMAIRA_KCREDDB_H__ - -#include -#include - - -/*! \defgroup kcdb NetIDMgr Credentials Database */ -/*@{*/ - -/*! \brief Maximum length in characters of short description - - The length includes the terminating \a NULL character. - */ -#define KCDB_MAXCCH_SHORT_DESC 256 - -/*! \brief Maximum length in bytes of short description - - The length includes the terminating \a NULL character. - */ -#define KCDB_MAXCB_SHORT_DESC (sizeof(wchar_t) * KCDB_MAXCCH_SHORT_DESC) - -/*! \brief Maximum length in characters of long description - - The length includes the terminating \a NULL character. - */ -#define KCDB_MAXCCH_LONG_DESC 8192 - -/*! \brief Maximum length in characters of long description - - The length includes the terminating \a NULL character. - */ -#define KCDB_MAXCB_LONG_DESC (sizeof(wchar_t) * KCDB_MAXCCH_LONG_DESC) - -/*! \brief Maximum length in characters of name - - The length includes the terminating \a NULL character. - */ -#define KCDB_MAXCCH_NAME 256 - -/*! \brief Maximum length in bytes of short description - - The length includes the terminating \a NULL character. - */ -#define KCDB_MAXCB_NAME (sizeof(wchar_t) * KCDB_MAXCCH_NAME) - -/*! \brief Automatically determine the number of bytes required - - Can be used in most places where a count of bytes is required. - For many objects, the number of bytes that are required can be - determined through context and may be ommited. In such cases you - can use the \a KCDB_CBSIZE_AUTO value to specify that the function - is to determine the size automatically. - - \note Not all functions that take a count of bytes support the \a - KCDB_CBSIZE_AUTO value. -*/ -#define KCDB_CBSIZE_AUTO (-1) - -/*! -\defgroup kcdb_ident Identities - -Functions, macros etc. for manipulating identities. -*/ - -/*@{*/ - -/*! \brief The maximum number of characters (including terminator) that can - be specified as an identity name */ -#define KCDB_IDENT_MAXCCH_NAME 256 - -/*! \brief The maximum number of bytes that can be specified as an identity - name */ -#define KCDB_IDENT_MAXCB_NAME (sizeof(wchar_t) * KCDB_IDENT_MAXCCH_NAME) - -/*! \brief Valid characters in an identity name */ -#define KCDB_IDENT_VALID_CHARS L"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._@-/" - -/*! -\name Flags for identities */ -/*@{*/ - -/*! \brief Create the identity if it doesn't already exist. - \note Only to be used with kcdb_identity_create() */ -#define KCDB_IDENT_FLAG_CREATE 0x10000000L - -/*! \brief Has configuration information - - Indicates that the identity has persistent configuration - information associated with it. - */ -#define KCDB_IDENT_FLAG_CONFIG 0x00800000L - -/*! \brief Marks the identity as active. - - An active identity is one that is in active use within NetIDMgr. - - \note This flag is readonly and cannot be specified when creating - or modifying an identity. Once an identity is deleted, it will - no longer have this flag. */ -#define KCDB_IDENT_FLAG_ACTIVE 0x02000000L - - -/*! \brief The identity has custom attributes assigned - */ -#define KCDB_IDENT_FLAG_ATTRIBS 0x08000000L - -/*! \brief This is the default identity. - - At most one identity will have this flag set at any given time. - To set or reset the flag, use kcdb_identity_set_default() */ -#define KCDB_IDENT_FLAG_DEFAULT 0x00000001L - -/*! \brief This identity can be searched. - - The meaning of this flag is left to be interpreted by individual - plugins. */ -#define KCDB_IDENT_FLAG_SEARCHABLE 0x00000002L - -/*! \brief Hidden identity. - - The identity will not show up in the identity list window. Once - the hidden is switched off, the identity (and all associated - credentials) will re-appear in the window */ -#define KCDB_IDENT_FLAG_HIDDEN 0x00000004L - -/*! \brief Invalid identity - - For one reason or another, this identity is invalid. This flag - can be set by an identity provider to indicate that this identity - does not correspond to an actual identity because an external - entity (such as a KDC) has denied it's existence. - - The absence of this flag does not imply that the identity is - valid. The ::KCDB_IDENT_FLAG_VALID bit must be set for that to be - the case. If neither flag is set, then the status of the identity - is not known. -*/ -#define KCDB_IDENT_FLAG_INVALID 0x00000008L - -/*! \brief Valid identity - - The identity has been validated through an external entity, or - it's validity implied through the existence of credentials for the - identity. - - The absence of this flag does not imply that the identity is - invalid. The ::KCDB_IDENT_FLAG_INVALID bit must be set for that - to be the case. If neither flag is set, then the status of the - identity is not known. - */ -#define KCDB_IDENT_FLAG_VALID 0x00000010L - -/*! \brief Expired identity - - This identity has expired and can not be actively used to obtain - credentials. This determination is made based on the input of - some external entity. This flag may only be set by an identity - provider. -*/ -#define KCDB_IDENT_FLAG_EXPIRED 0x00000020L - -/*! \brief Empty identity - - The identity does not have actual credentials associated with it. - */ -#define KCDB_IDENT_FLAG_EMPTY 0x00000040L - -/*! \brief Renewable identity - - The initial credentials associated with this identity are - renewable. Thus making the whole identity renewable. - */ -#define KCDB_IDENT_FLAG_RENEWABLE 0x00000080L - -/*! \brief Required user interaction - - The identity is in a state which requires user interaction to - activate. Currently, the identity may not be in a state where it - can be used to obtain credentials. - - A typical example of this is when the primary password for an - identity has expired. - */ -#define KCDB_IDENT_FLAG_INTERACT 0x00000100L - -/*! \brief Has expired credentials - - The identity has expired credentials associated with it. - */ -#define KCDB_IDENT_FLAG_CRED_EXP 0x00000200L - -/*! \brief Has renewable credentials - - The identity has renewable credentials associated with it. If the - initial credentials of the identity are renewable, then identity - is renewable. Hence the ::KCDB_IDENT_FLAG_RENEWABLE should also - be set. - */ -#define KCDB_IDENT_FLAG_CRED_RENEW 0x00000400L - -/*! \brief Sticky identity - - Sticky identities are identities that are always visible in the - credentials display even if no credentials are associated with it. - */ -#define KCDB_IDENT_FLAG_STICKY 0x00000800L - -/*! \brief Read/write flags mask. - - A bitmask that correspond to all the read/write flags in the mask. -*/ -#define KCDB_IDENT_FLAGMASK_RDWR 0x00000fffL - -/*@}*/ - -/*! \name Identity Provider Data Structures -@{*/ - -/*! \brief Name transfer structure - - Used when the KCDB is communicating with the identity provider to - exchange string names of identities. See individual ::KMSG_IDENT - message subtypes for the usage of this structure. - */ -typedef struct tag_kcdb_ident_name_xfer { - const wchar_t * name_src; /*!< An identity name. Does not - exceed KCDB_IDENT_MAXCCH_NAME - characters including terminating - NULL. */ - const wchar_t * name_alt; /*!< An identity name. Does not - exceed KCDB_IDENT_MAXCCH_NAME - characters including terminating - NULL. */ - wchar_t * name_dest; /*!< Pointer to a buffer that is to - receive a response string. The - size of the buffer in bytes is - specified in \a cb_name_dest. */ - khm_size cb_name_dest; /*!< Size of buffer pointed to by \a - name_dest in bytes. */ - khm_int32 result; /*!< Receives a result value, which is - usually an error code defined in - kherror.h, though it is not - always. */ -} kcdb_ident_name_xfer; - -typedef struct tag_kcdb_ident_info { - khm_handle identity; - khm_int32 fields; - - FILETIME expiration; -} kcdb_ident_info; - -/*@}*/ - -/*! \name Identity provider interface functions - - These functions encapsulate safe calls to the current identity - provider. While these functions are exported, applications should - not call these functions directly. They are provided for use by - the NetIDMgr core application. -@{*/ - -/*! \brief Validate an identity name - - The name that is provided will be passed through sets of - validations. One set, which doesn't depend on the identity - provider checks whether the length of the identity name and - whether there are any invalid characters in the identity name. If - the name passes those tests, then the name is passed down to the - identity provider's name validation handler. - - \retval KHM_ERROR_SUCCESS The name is valid - \retval KHM_ERROR_TOO_LONG Too many characters in name - \retval KHM_ERROR_INVALID_NAME There were invalid characters in the name. - \retval KHM_ERROR_NO_PROVIDER There is no identity provider; - however the name passed the length and character tests. - \retval KHM_ERROR_NOT_IMPLEMENTED The identity provider doesn't - implement a name validation handler; however the name passed - the length and character tests. - - \see ::KMSG_IDENT_VALIDATE_NAME - */ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_validate_name(const wchar_t * name); - -/*! \brief Validate an identity - - The identity itself needs to be validated. This may involve - communicating with an external entity. - - \see ::KMSG_IDENT_VALIDATE_IDENTITY - */ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_validate_identity(khm_handle identity); - -/*! \brief Canonicalize the name - - - \see ::KMSG_IDENT_CANON_NAME -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_canon_name(const wchar_t * name_in, - wchar_t * name_out, - khm_size * cb_name_out); - -/*! \brief Compare two identity names - - \see ::KMSG_IDENT_COMPARE_NAME -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_compare_name(const wchar_t * name1, - const wchar_t * name2); - -/*! \brief Set the specified identity as the default - - \see ::KMSG_IDENT_SET_DEFAULT -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_set_default(khm_handle identity); - -/*! \brief Set the specified identity as searchable - - \see ::KMSG_IDENT_SET_SEARCHABLE -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_set_searchable(khm_handle identity, - khm_boolean searchable); - -/*! \brief Update the specified identity - - \see ::KMSG_IDENT_UPDATE -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_update(khm_handle identity); - -/*! \brief Obtain the UI callback - - \a rock is actually a pointer to a ::khui_ident_new_creds_cb which - is to receive the callback. - - \see ::KMSG_IDENT_GET_UI_CALLBACK - */ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_get_ui_cb(void * rock); - -/*! \brief Notify an identity provider of the creation of a new identity - - \see ::KMSG_IDENT_NOTIFY_CREATE -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identpro_notify_create(khm_handle identity); - -/*@}*/ - -/*! \brief Check if the given name is a valid identity name - - \return TRUE or FALSE to the question, is this valid? -*/ -KHMEXP khm_boolean KHMAPI -kcdb_identity_is_valid_name(const wchar_t * name); - -/*! \brief Create or open an identity. - - If the KCDB_IDENT_FLAG_CREATE flag is specified in the flags - parameter a new identity will be created if one does not already - exist with the given name. If an identity by that name already - exists, then the existing identity will be opened. The result - parameter will receive a held reference to the opened identity. - Use kcdb_identity_release() to release the handle. - - \param[in] name Name of identity to create - \param[in] flags If KCDB_IDENT_FLAG_CREATE is specified, then the - identity will be created if it doesn't already exist. - Additional flags can be set here which will be assigned to the - identity if it is created. Additional flags have no effect if - an existing identity is opened. - \param[out] result If the call is successful, this receives a held - reference to the identity. The caller should call - kcdb_identity_release() to release the identity once it is no - longer needed. - */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_create(const wchar_t *name, - khm_int32 flags, - khm_handle * result); - -/*! \brief Mark an identity for deletion. - - The identity will be marked for deletion. The - KCDB_IDENT_FLAG_ACTIVE will no longer be present for this - identity. Once all references to the identity are released, it - will be removed from memory. All associated credentials will also - be removed. */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_delete(khm_handle id); - -/*! \brief Set or unset the specified flags in the specified identity. - - Only flags that are in KCDB_IDENT_FLAGMASK_RDWR can be specifed in - the \a flags parameter or the \a mask parameter. The flags set in - the \a mask parameter of the identity will be set to the - corresponding values in the \a flags parameter. - - If ::KCDB_IDENT_FLAG_INVALID is set using this function, then the - ::KCDB_IDENT_FLAG_VALID will be automatically reset, and vice - versa. Resetting either bit does not undo this change, and will - leave the identity's validity unspecified. - - Note that setting or resetting certain flags have other semantic - side-effects: - - - ::KCDB_IDENT_FLAG_DEFAULT : Setting this is equivalent to - calling kcdb_identity_set_default() with \a id. Resetting this - is equivalent to calling kcdb_identity_set_default() with NULL. - - - ::KCDB_IDENT_FLAG_SEARCHABLE : Setting this will result in the - identity provider getting notified of the change. If the - identity provider indicates that searchable flag should not be - set or reset on the identity, then kcdb_identity_set_flags() - will return an error. - - \note kcdb_identity_set_flags() is not atomic. Even if the - function returns a failure code, some flags in the identity may - have been set. When calling kcdb_identity_set_flags() always - check the flags in the identity using kcdb_identity_get_flags() to - check which flags have been set and which have failed. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_flags(khm_handle id, - khm_int32 flags, - khm_int32 mask); - -/*! \brief Return all the flags for the identity - - The returned flags may include internal flags. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_flags(khm_handle id, - khm_int32 * flags); - -/*! \brief Return the name of the identity - - \param[out] buffer Buffer to copy the identity name into. The - maximum size of an identity name is \a KCDB_IDENT_MAXCB_NAME. - If \a buffer is \a NULL, then the required size of the buffer - is returned in \a pcbsize. - - \param[in,out] pcbsize Size of buffer in bytes. */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_name(khm_handle id, - wchar_t * buffer, - khm_size * pcbsize); - -/*! \brief Set the specified identity as the default. - - Specifying NULL effectively makes none of the identities the - default. - - \see kcdb_identity_set_flags() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_default(khm_handle id); - -/*! \brief Mark the specified identity as the default. - - This API is reserved for use by identity providers as a means of - specifying which identity is default. The difference between - kcdb_identity_set_default() and kcdb_identity_set_default_int() is - in semantics. - - - kcdb_identity_set_default() is used to request the KCDB to - designate the specified identity as the default. When - processing the request, the KCDB invokes the identity provider - to do the necessary work to make the identity the default. - - - kcdb_identity_set_default_int() is used by the identity provider - to notify the KCDB that the specified identity is the default. - This does not result in the invocation of any other semantics to - make the identity the default other than releasing the previous - defualt identity and making the specified one the default. As - an additional side effect, the notification <::KMSG_KCDB, - ::KMSG_KCDB_IDENT, ::KCDB_OP_NEW_DEFAULT> will also not be sent. - */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_default_int(khm_handle id); - -/*! \brief Get the default identity - - Obtain a held handle to the default identity if there is one. The - handle must be freed using kcdb_identity_release(). - - If there is no default identity, then the handle pointed to by \a - pvid is set to \a NULL and the function returns - KHM_ERROR_NOT_FOUND. */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_default(khm_handle * pvid); - -/*! \brief Get the configuration space for the identity. - - If the configuration space for the identity does not exist and the - flags parameter does not specify ::KHM_FLAG_CREATE, then the - function will return a failure code as specified in - ::khc_open_space(). Depending on whether or not a configuration - space was found, the ::KCDB_IDENT_FLAG_CONFIG flag will be set or - reset for the identity. - - \param[in] id Identity for which the configuraiton space is requested - - \param[in] flags Flags used when calling khc_open_space(). If \a - flags specifies KHM_FLAG_CREATE, then the configuration space - is created. - - \param[out] result The resulting handle. If the call is - successful, this receives a handle to the configuration space. - Use khc_close_space() to close the handle. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_config(khm_handle id, - khm_int32 flags, - khm_handle * result); - -/*! \brief Hold a reference to an identity. - - A reference to an identity (a handle) is only valid while it is - held. \note Once the handle is released, it can not be - revalidated by calling kcdb_identity_hold(). Doing so would lead - to unpredictable consequences. */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_hold(khm_handle id); - -/*! \brief Release a reference to an identity. - \see kcdb_identity_hold() */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_release(khm_handle id); - -/*! \brief Set the identity provider subscription - - If there was a previous subscription, that subscription will be - automatically deleted. - - \param[in] sub New identity provider subscription -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_provider(khm_handle sub); - -/*! \brief Set the primary credentials type - - The primary credentials type is designated by the identity - provider. As such, this function should only be called by an - identity provider. - */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_type(khm_int32 cred_type); - -/*! \brief Retrieve the identity provider subscription - - \param[out] sub Receives the current identity provider - subscription. Set to NULL if only the existence of an - identity provider needs to be checked. - - \retval KHM_ERROR_SUCCESS An identity provider exists. If \a sub - was not NULL, the subscription has been copied there. - - \retval KHM_ERROR_NOT_FOUND There is currently no registered - identity provider. If \a sub was not NULL, the handle it - points to has been set to NULL. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_provider(khm_handle * sub); - -/*! \brief Retrieve the identity provider credentials type - - This is the credentials type that the identity provider has - designated as the primary credentials type. - */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_type(khm_int32 * ptype); - -/*! \brief Returns TRUE if the two identities are equal - - Also returns TRUE if both identities are NULL. - */ -KHMEXP khm_boolean KHMAPI -kcdb_identity_is_equal(khm_handle identity1, - khm_handle identity2); - -/*! \brief Set an attribute in an identity by attribute id - - \param[in] buffer A pointer to a buffer containing the data to - assign to the attribute. Setting \a buffer to NULL has the - effect of removing any data that is already assigned to the - attribute. If \a buffer is non-NULL, then \a cbbuf should - specify the number of bytes in \a buffer. - - \param[in] cbbuf Number of bytes of data in \a buffer. The - individual data type handlers may copy in less than this many - bytes in to the credential. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_attr(khm_handle identity, - khm_int32 attr_id, - void * buffer, - khm_size cbbuf); - -/*! \brief Set an attribute in an identity by name - - The attribute name has to be a KCDB registered attribute or - property. - - \param[in] cbbuf Number of bytes of data in \a buffer. The - individual data type handlers may copy in less than this many - bytes in to the credential. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_set_attrib(khm_handle identity, - wchar_t * attr_name, - void * buffer, - khm_size cbbuf); - -/*! \brief Get an attribute from an identity by attribute id. - - \param[in] buffer The buffer that is to receive the attribute - value. Set this to NULL if only the required buffer size is - to be returned. - - \param[in,out] cbbuf The number of bytes available in \a buffer. - If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and - sets this to the required buffer size. - - \param[out] attr_type Receives the data type of the attribute. - Set this to NULL if the type is not required. - - \note Set both \a buffer and \a cbbuf to NULL if only the - existence of the attribute is to be checked. If the attribute - exists in this identity then the function will return - KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attr(khm_handle identity, - khm_int32 attr_id, - khm_int32 * attr_type, - void * buffer, - khm_size * pcbbuf); - -/*! \brief Get an attribute from an identity by name. - - \param[in] buffer The buffer that is to receive the attribute - value. Set this to NULL if only the required buffer size is - to be returned. - - \param[in,out] cbbuf The number of bytes available in \a buffer. - If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and - sets this to the required buffer size. - - \note Set both \a buffer and \a cbbuf to NULL if only the - existence of the attribute is to be checked. If the attribute - exists in this identity then the function will return - KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attrib(khm_handle identity, - wchar_t * attr_name, - khm_int32 * attr_type, - void * buffer, - khm_size * pcbbuf); - -/*! \brief Get the string representation of an identity attribute. - - A shortcut function which generates the string representation of - an identity attribute directly. - - \param[in] identity A handle to an identity - - \param[in] attr_id The attribute to retrieve - - \param[out] buffer A pointer to a string buffer which receives the - string form of the attribute. Set this to NULL if you only - want to determine the size of the required buffer. - - \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, - holds the size of the buffer pointed to by \a buffer, and on - exit, receives the actual number of bytes that were copied. - - \param[in] flags Flags for the string conversion. Can be set to - one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is - KCDB_TS_LONG. - - \retval KHM_ERROR_SUCCESS Success - \retval KHM_ERROR_NOT_FOUND The given attribute was either invalid - or was not defined for this identity - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_TOO_LONG Either \a buffer was NULL or the - supplied buffer was insufficient -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attr_string(khm_handle identity, - khm_int32 attr_id, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags); - -/*! \brief Get the string representation of an identity attribute by name. - - A shortcut function which generates the string representation of - an identity attribute directly. - - \param[in] identity A handle to an identity - - \param[in] attrib The name of the attribute to retrieve - - \param[out] buffer A pointer to a string buffer which receives the - string form of the attribute. Set this to NULL if you only - want to determine the size of the required buffer. - - \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, - holds the size of the buffer pointed to by \a buffer, and on - exit, receives the actual number of bytes that were copied. - - \param[in] flags Flags for the string conversion. Can be set to - one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is - KCDB_TS_LONG. - - \see kcdb_identity_get_attr_string() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_identity_get_attrib_string(khm_handle identity, - wchar_t * attr_name, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags); - -/*! \brief Enumerate identities - - Enumerates all the active identities that match the criteria - specified using \a and_flags and \a eq_flags. The condition is - applied to all active identities as follows: - - \code - (identity->flags & and_flags) == (eq_flags & and_flags) - \endcode - - Essentially, if a flag is set in \a and_flags, then that flag in - the identity should equal the setting in \a eq_flags. - - \param[in] and_flags See above - - \param[in] eq_flags See above - - \param[out] name_buf Buffer to receive the list of identity names. - Can be NULL if only the required size of the buffer or the - number of matching identities is required. The list is - returned as a multi string. - - \param[in,out] pcb_buf Number of bytes in buffer pointed to by \a - name_buf on entry. On exit, will receive the number of bytes - copied. Can be NULL only if \a name_buf is also NULL. If \a - name_buf is NULL or if \a pcb_buf indicates that the buffer is - insufficient, this will receive the number of bytes required - and the return value of the function will be - KHM_ERROR_TOO_LONG - - \param[out] pn_idents Receives the number of identities that match - the given criteria. - - \retval KHM_ERROR_SUCCESS If \a name_buf was valid, the buffer now - contains a multi string of identities that matched. If \a - pn_idents was valid, it contains the number of identities - matched. - - \retval KHM_ERROR_TOO_LONG No buffer was supplied or the supplied - buffer was insufficient. If \a pn_idents was valid, it - contains the number of identities. - - \retval KHM_ERROR_INVALID_PARAM None of the parameters \a name_buf, - \a pcb_buf and \a pn_idents were supplied, or \a pcb_buf was - NULL when \a name_buf was not. - - \note Calling this function to obtain the required size of the - buffer and then calling it with a that sized buffer is not - guaranteed to work since the list of identities may change - between the two calls. - */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_enum(khm_int32 and_flags, - khm_int32 eq_flags, - wchar_t * name_buf, - khm_size * pcb_buf, - khm_size * pn_idents); - -/*! \brief Refresh identity attributes based on root credential set - - Several flags in an identity are dependent on the credentials that - are associated with it in the root credential set. In addition, - other flags in an identity depend on external factors that need to - be verfied once in a while. This API goes through the root - credential set as well as consulting the identity provider to - update an identity. - - \see kcdb_identity_refresh() - */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_refresh(khm_handle vid); - -/*! \brief Refresh all identities - - Equivalent to calling kcdb_identity_refresh() for all active - identities. - - \see kcdb_identityt_refresh() - */ -KHMEXP khm_int32 KHMAPI -kcdb_identity_refresh_all(void); - -/* KSMG_KCDB_IDENT notifications are structured as follows: - type=KMSG_KCDB - subtype=KMSG_KCDB_IDENT - uparam=one of KCDB_OP_* - blob=handle to identity in question */ - -/*@}*/ - - -/*********************************************************************/ - - -/*! -\defgroup kcdb_creds Credential sets and individual credentials - -@{ -*/ - - -/*! \brief Credentials process function - - This function is called for each credential in a credential set - when supplied to kcdb_credset_apply(). It should return - KHM_ERROR_SUCCESS to continue the operation, or any other value to - terminate the processing. - - \see kcdb_credset_apply() -*/ -typedef khm_int32 -(KHMAPI *kcdb_cred_apply_func)(khm_handle cred, - void * rock); - -/*! \brief Credentials filter function. - - Should return non-zero if the credential passed as \a cred is to - be "accepted". The precise consequence of a non-zero return value - is determined by the individual function that this call back is - passed into. - - This function should not call any other function which may modify - \a cred. - - \see kcdb_credset_collect_filtered() - \see kcdb_credset_extract_filtered() -*/ -typedef khm_int32 -(KHMAPI *kcdb_cred_filter_func)(khm_handle cred, - khm_int32 flags, - void * rock); - -/*! \brief Credentials compare function. - - Asserts a weak ordering on the credentials that are passed in as - \a cred1 and \a cred2. It should return: - - - a negative value if \a cred1 < \a cred2 - - zero if \a cred1 == \a cred2 - - a postive value if \a cred1 > \a cred2 - \see kcdb_credset_sort() - \see ::kcdb_credtype -*/ -typedef khm_int32 -(KHMAPI *kcdb_cred_comp_func)(khm_handle cred1, - khm_handle cred2, - void * rock); - -/*! \defgroup kcdb_credset Credential sets */ -/*@{*/ - -/*! \brief Create a credential set. - - Credential sets are temporary containers for credentials. These - can be used by plug-ins to store credentials while they are being - enumerated from an external source. Once all the credentials have - been collected into the credential set, the plug-in may call - kcdb_credset_collect() to collect the credentials into the root - credential store. - - The user interface will only display credentials that are in the - root credential store. No notifications are generated for changes - to a non-root credential set. - - Use kcdb_credset_delete() to delete the credential set once it is - created. - - \see kcdb_credset_delete() - \see kcdb_credset_collect() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_create(khm_handle * result); - -/** \brief Delete a credential set - - \see kcdb_credset_create() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_delete(khm_handle credset); - -/** \brief Collect credentials from a credential set to another credential set. - - Collecting a subset of credentials from credential set \a cs_src - into credential set \a cs_dest involves the following steps: - - - Select all credentials from \a cs_src that matches the \a - identity and \a type specified in the function call and add them - to the \a cs_dest credential set if they are not there already. - Note that if neither credential set is not the root credential - store, then the credentials will be added by reference, while if - it is the root credential store, the credentials will be - duplicated, and the copies will be added to \a cs_dest. - - - If a selected credential in \a cs_src already exists in \a - cs_dest, then update the credential in \a cs_dest with the - credential fields in \a cs_src. In other words, once a - credential is found to exist in both \a cs_src and \a cs_dest, - all the non-null fields from the credential in \a cs_src will be - copied to the credential in \a cs_dest. Fields which are null - (undefined) in \a cs_src and are non-null in \a cs_dest will be - left unmodified in \a cs_dest. - - One notable exception is the credentials' flags. All flags in - \a cs_src which are not included in - ::KCDB_CRED_FLAGMASK_ADDITIVE will be copied to the - corresponding bits in the flags of \a cs_dest. However, flags - that are included in ::KCDB_CRED_FLAGMASK_ADDITIVE will be added - to the corresponding bits in \a cs_dest. - - (See notes below) - - - Remove all credentials from \a cs_dest that match the \a - identity and \a type that do not appear in \a cs_src. (see notes - below) - - For performance reasons, plugins should use kcdb_credset_collect() - to update the root credentials store instead of adding and - removing individual credentials from the root store. - - Only credentials that are associated with active identities are - affected by kcdb_credset_collect(). - - \param[in] cs_dest A handle to the destination credential set. If - this is \a NULL, then it is assumed to refer to the root - credential store. - - \param[in] cs_src A handle to the source credential set. If this - is NULL, then it is assumed to refer to the root credential - store. - - \param[in] identity A handle to an identity. Setting this to NULL - collects all identities in the credential set. - - \param[in] type A credentials type. Setting this to - KCDB_CREDTYPE_ALL collects all credential types in the set. - - \param[out] delta A bit mask that indicates the modifications that - were made to \a cs_dest as a result of the collect operation. - This is a combination of KCDB_DELTA_* values. This parameter - can be \a NULL if the value is not required. - - \warning If \a identity and \a type is set to a wildcard, all - credentials in the root store that are not in this credentials - set will be deleted. - - \note Two credentials \a A and \a B are considered equal if: - - They refer to the same identity - - Both have the same credential type - - Both have the same name - - \note This is the only supported way of modifying the root - credential store. - - \note \a cs_src and \a cs_dest can not refer to the same - credentials set. - - \note The destination credential set cannot be sealed. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_collect(khm_handle cs_dest, - khm_handle cs_src, - khm_handle identity, - khm_int32 type, - khm_int32 * delta); - -/*! \brief Credentials were added - \see kcdb_credset_collect() */ -#define KCDB_DELTA_ADD 1 - -/*! \brief Credentials were deleted - \see kcdb_credset_collect() */ -#define KCDB_DELTA_DEL 2 - -/*! \brief Credentials were modified - \see kcdb_credset_collect() */ -#define KCDB_DELTA_MODIFY 4 - -/*! \brief Indicates that the credential to be filtered is from the root store. - - \see kcdb_credset_collect_filtered() -*/ -#define KCDB_CREDCOLL_FILTER_ROOT 1 - -/*! \brief Indicates that the credential to be filtered is from the source - credential set - - \see kcdb_credset_collect_filtered() */ -#define KCDB_CREDCOLL_FILTER_SRC 2 - -/*! \brief Indicates that the credential to be filtered is from the destination - credential set - - \see kcdb_credset_collect_filtered() */ -#define KCDB_CREDCOLL_FILTER_DEST 4 - -/*! \brief Collect credentials from one credential set to another using a filter. - - Similar to kcdb_credset_collect() except instead of selecting - credentials by matching against an identity and/or type, a filter - function is called. If the filter function returns non-zero for a - credential, that credential is selected. - - Credentials in the source and destination credential sets are - passed into the filter function. Depending on whether the - credential is in the source credential set or destination - credential set, the \a flag parameter may have either \a - KCDB_CREDCOLL_FILTER_SRC or \a KCDB_CREDCOLL_FILTER_DEST bits set. - Also, if either one of the credential sets is the root credential - store, then additionally \a KCDB_CREDCOLL_FILTER_ROOT would also - be set. - - See the kcdb_credset_collect() documentation for explanations of - the \a cs_src, \a cs_dest and \a delta parameters which perform - identical functions. - - \param[in] filter The filter of type ::kcdb_cred_filter_func - \param[in] rock A custom argument to be passed to the filter function. - - \see kcdb_credset_collect() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_collect_filtered(khm_handle cs_dest, - khm_handle cs_src, - kcdb_cred_filter_func filter, - void * rock, - khm_int32 * delta); - -/*! \brief Flush all credentials from a credential set - - Deletes all the crednetials from the credential set. - - \param[in] credset A handle to a credential set. Cannot be NULL. - - \note The credential set cannot be sealed -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_flush(khm_handle credset); - -/*! \brief Extract credentials from one credential set to another - - Credentials from the source credential set are selected based on - the \a identity and \a type arguements. If a credential is - matched, then it is added to the \a destcredset. - - If the \a sourcecredset is the root credential set, the added - credentials are copies of the actual credentials in the root - credential set. Otherwise the credentials are references to the - original credentials in the \a sourcecredset . - - \param[in] destcredset Destination credential set. Must be valid. - - \param[in] sourcecredset The source credential set. If set to - NULL, extracts from the root credential set. - - \param[in] identity The identity to match in the source credential - set. If set to NULL, matches all identities. - - \param[in] type The credential type to match in the source credential set. - If set to KCDB_CREDTYPE_INVALID, matches all types. - - \note This function does not check for duplicate credentials. - - \note The destination credential set cannot be sealed. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_extract(khm_handle destcredset, - khm_handle sourcecredset, - khm_handle identity, - khm_int32 type); - -/*! \brief Extract credentials from one credential set to another using a filter. - - Similar to kcdb_credset_extract() except a filter function is used - to determine which credentials should be selected. - - \param[in] rock A custom argument to be passed in to the filter function. - - \note The destination credential set cannot be sealed. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_extract_filtered(khm_handle destcredset, - khm_handle sourcecredset, - kcdb_cred_filter_func filter, - void * rock); - -/*! \brief Retrieve a held reference to a credential in a credential set based on index. - - \param[in] idx The index of the credential to retrieve. This is a - zero based index which goes from 0 ... (size of credset - 1). - - \param[out] cred The held reference to a credential. Call - kcdb_cred_release() to release the credential. - - \retval KHM_ERROR_SUCCESS Success. \a cred has a held reference to the credential. - \retval KHM_ERROR_OUT_OF_BOUNDS The index specified in \a idx is out of bounds. - \retval KHM_ERROR_DELETED The credential at index \a idx has been marked as deleted. - - \see kcdb_cred_release() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_get_cred(khm_handle credset, - khm_int32 idx, - khm_handle * cred); - -/*! \brief Search a credential set for a specific credential - - The credential set indicated by \a credset is searched for a - credential that satisfies the predicate function \a f. Each - credential starting at \a idx_start is passed into the predicate - function until it returns a non-zero value. At this point, that - credential is passed in to the \a cred parameter, and the index of - the credential is passed into the \a idx parameter. - - \param[in] credset The credential set to search on. Specify NULL - if you want to search teh root credential set. - - \param[in] idx_start The index at which to start the search after. - The first credential passed to the predicate function will be - at \a idx_start + 1. Specify -1 to start from the beginning - of the credential set. - - \param[in] f The predicate function. The \a flags parameter of - the predicate function will always receive 0. - - \param[in] rock An opaque parameter to be passed to the predicate - function \a f. - - \param[out] cred A held reference to the credential that satisfied - the predicate function or NULL if no such credential was - found. Note that if a valid credential is returned, the - calling function must release the credential using - kcdb_cred_release(). - - \param[out] idx The index of the credential passed in \a cred. - Specify NULL if the index is not required. - - \retval KHM_ERROR_SUCCESS A credential that satisfied the - predicate function was found and was assigned to \a cred. - - \retval KHM_ERROR_NOT_FOUND No credential was found that matched - the predicate function. - - \note When querying credential sets that are shared between - threads, it is possible that another thread modifies the - credential set between successive calls to - kcdb_credset_find_filtered(). Therefore a continued sequences of - searches are not guaranteed to exhastively cover the - credential set nor to not return duplicate matches. Duplicate - matches are possible if the order of the credentials in the - set was changed. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_find_filtered(khm_handle credset, - khm_int32 idx_start, - kcdb_cred_filter_func f, - void * rock, - khm_handle * cred, - khm_int32 * idx); - -/*! \brief Find matching credential - - Searches a credential set for a credential that matches the - specified credential. For a credential to be a match, it must - have the same identity, credential type and name. - - \param[in] credset Credential set to search - - \param[in] cred_src Credetial to search on - - \param[out] cred_dest receieves the matching credential if the - search is successful. If a handle is returend, the - kcdb_cred_release() must be used to release the handle. If - the matching credential is not required, you can pass in NULL. - - \retval KHM_ERROR_SUCCESS The search was successful. A credential - was assigned to \a cred_dest - - \retval KHM_ERROR_NOT_FOUND A matching credential was not found. - */ -KHMEXP khm_int32 KHMAPI -kcdb_credset_find_cred(khm_handle credset, - khm_handle cred_src, - khm_handle *cred_dest); - - -/*! \brief Delete a credential from a credential set. - - The credential at index \a idx will be deleted. All the - credentials that are at indices \a idx + 1 and above will be moved - down to fill the gap and the size of the credential set will - decrease by one. - - Use kcdb_credset_del_cred_ref() to delete a credential by - reference. Using kcdb_credset_del_cred() is faster than - kcdb_credset_del_cred_ref(). - - If you call kcdb_credset_del_cred() or kcdb_credset_del_cred_ref() - from within kcdb_credset_apply(), the credential will only be - marked as deleted. They will not be removed. This means that the - size of the credential set will not decrease. To purge the - deleted credentials from the set, call kcdb_credset_purge() after - kcdb_credset_apply() completes. - - \note The credential set cannot be sealed. - - \see kcdb_credset_del_cred_ref() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_del_cred(khm_handle credset, - khm_int32 idx); - -/*! \brief Delete a credential from a credential set by reference. - - See kcdb_credset_del_cred() for description of what happens when a - credential is deleted from a credential set. - - \note The credential set cannot be sealed. - - \see kcdb_credset_del_cred() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_del_cred_ref(khm_handle credset, - khm_handle cred); - -/*! \brief Add a credential to a credential set. - - The credential is added by reference. In other words, no copy of - the credential is made. - - \param[in] idx Index of the new credential. This must be a value - in the range 0..(previous size of credential set) or -1. If - -1 is specifed, then the credential is appended at the end of - the set. - - \note The credential set cannot be sealed. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_add_cred(khm_handle credset, - khm_handle cred, - khm_int32 idx); - -/*! \brief Get the number of credentials in a credential set. - - Credentials in a credential set may be volatile. When - kcdb_credeset_get_size() is called, the credential set is - compacted to only include credentials that are active at the time. - However, when you are iterating through the credential set, it - might be the case that some credentials would get marked as - deleted. These credentials will remain in the credential set - until the credential set is discarded or another call to - kcdb_credset_get_size() or kdcb_credset_purge() is made. - - If the credential set is sealed, then it will not be compacted and - will include deleted credentials as well. - - \see kcdb_credset_purge() - \see kcdb_credset_get_cred() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_get_size(khm_handle credset, - khm_size * size); - -/*! \brief Removes credentials that have been marked as deleted from a credential set. - - See description of \a kcdb_credset_purge() for a description of - what happens when credntials that are contained in a credential - set are deleted by an external entity. - - \note The credential set cannot be sealed. - - \see kcdb_credset_get_size() - \see kcdb_credset_get_cred() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_purge(khm_handle credset); - -/*! \brief Applies a function to all the credentials in a credentials set - - The given function is called for each credential in a credential - set. With each iteration, the function is called with a handle to - the credential and the user defined parameter \a rock. If the - function returns anything other than KHM_ERROR_SUCCESS, the - processing stops. - - \param[in] credset The credential set to apply the function to, or - NULL if you want to apply this to the root credential set. - - \param[in] f Function to call for each credential - - \param[in] rock An opaque parameter which is to be passed to 'f' - as the second argument. - - \retval KHM_ERROR_SUCCESS All the credentials were processed. - - \retval KHM_ERROR_EXIT The supplied function signalled the - processing to be aborted. - - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_apply(khm_handle credset, - kcdb_cred_apply_func f, - void * rock); - -/*! \brief Sort the contents of a credential set. - - \param[in] rock A custom argument to be passed in to the \a comp function. - - \note The credential set cannot be sealed. - - \see kcdb_cred_comp_generic() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credset_sort(khm_handle credset, - kcdb_cred_comp_func comp, - void * rock); - -/*! \brief Seal a credential set - - Sealing a credential set makes it read-only. To unseal a - credential set, call kcdb_credset_unseal(). - - Sealing is an additive operation. kcdb_credset_seal() can be - called muliple times. However, for every call to - kcdb_credset_seal() a call to kcdb_credset_unseal() must be made - to undo the seal. The credential set will become unsealed when - all the seals are released. - - Once sealed, the credential set will not allow any operation that - might change its contents. However, a selaed credential set can - still be delted. - - \see kcdb_credset_unseal() - */ -KHMEXP khm_int32 KHMAPI -kcdb_credset_seal(khm_handle credset); - -/*! \brief Unseal a credential set - - Undoes what kcdb_credset_seal() did. This does not guarantee that - the credential set is unsealed since there may be other seals. - - \see kcdb_credset_seal() - */ -KHMEXP khm_int32 KHMAPI -kcdb_credset_unseal(khm_handle credset); - -/*! \brief Defines a sort criterion for kcdb_cred_comp_generic() - - \see kcdb_cred_comp_generic() -*/ -typedef struct tag_kcdb_cred_comp_field { - khm_int32 attrib; /*!< a valid attribute ID */ - khm_int32 order; /*!< one of KCDB_CRED_COMP_INCREASING or - KCDB_CRED_COMP_DECREASING. Optionally, - KCDB_CRED_COMP_INITIAL_FIRST may be combined - with either. */ -} kcdb_cred_comp_field; - -/*! \brief Defines the sort order for a field in ::kcdb_cred_comp_field - - Sorts lexicographically ascending by string representation of field. -*/ -#define KCDB_CRED_COMP_INCREASING 0 - -/*! \brief Defines the sort order for a field in ::kcdb_cred_comp_field - - Sorts lexicographically descending by string representation of - field. - */ -#define KCDB_CRED_COMP_DECREASING 1 - -/*! \brief Defines the sort order for a field in ::kcdb_cred_comp_field - - Any credentials which have the ::KCDB_CRED_FLAG_INITIAL will be - grouped above any that don't. - - If that does not apply, then credentials from the primary - credentials type will be sorted before others. -*/ -#define KCDB_CRED_COMP_INITIAL_FIRST 2 - -/*! \brief Defines the sort criteria for kcdb_cred_comp_generic() - - \see kcdb_cred_comp_generic() -*/ -typedef struct tag_kcdb_cred_comp_order { - khm_int32 nFields; - kcdb_cred_comp_field * fields; -} kcdb_cred_comp_order; - -/*! \brief A generic compare function for comparing credentials. - - This function can be passed as a parameter to kcdb_credset_sort(). - - The \a rock parameter to this function should be a pointer to a - ::kcdb_cred_comp_order object. The \a fields member of the - ::kcdb_cred_comp_order object should point to an array of - ::kcdb_cred_comp_field objects, each of which specifies the sort - order in decreasing order of priority. The number of - ::kcdb_cred_comp_field objects in the array should correspond to - the \a nFields member in the ::kcdb_cred_comp_order object. - - The array of ::kcdb_cred_comp_field objects define the sort - criteria, in order. The \a attrib member should be a valid - attribute ID, while the \a order member determines whether the - sort order is increasing or decreasing. The exact meaning or - increasing or decreasing depends on the data type of the - attribute. - - \param[in] rock a pointer to a ::kcdb_cred_comp_order object -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_comp_generic(khm_handle cred1, - khm_handle cred2, - void * rock); - -/*@}*/ - -/*! \defgroup kcdb_cred Credentials */ -/*@{*/ - -/*! \brief Maximum number of characters in a credential name */ -#define KCDB_CRED_MAXCCH_NAME 256 - -/*! \brief Maximum number of bytes in a credential name */ -#define KCDB_CRED_MAXCB_NAME (sizeof(wchar_t) * KCDB_CRED_MAXCCH_NAME) - -/*! \brief Marked as deleted */ -#define KCDB_CRED_FLAG_DELETED 0x00000008 - -/*! \brief Renewable */ -#define KCDB_CRED_FLAG_RENEWABLE 0x00000010 - -/*! \brief Initial - - Initial credentials form the basis of an identity. Some - properties of an initial credential, such as being renewable, are - directly inherited by the identity. An identity is also - automatically considered valid if it contains a valid initial - credential. - */ -#define KCDB_CRED_FLAG_INITIAL 0x00000020 - -/*! \brief Expired - - The credential's lifetime has ended. - */ -#define KCDB_CRED_FLAG_EXPIRED 0x00000040 - -/*! \brief Invalid - - The credential can no longer serve its intended function. This - may be because it is expired and is not renewable, or its - renewable time period has also expired, or for some other reason. - */ -#define KCDB_CRED_FLAG_INVALID 0x00000080 - -/*! \brief Credential is selected - - Indicates that the credential is selected. Note that using this - flag may be subject to race conditions. - */ -#define KCDB_CRED_FLAG_SELECTED 0x00000100 - -/*! \brief Bitmask indicating all known credential flags - */ -#define KCDB_CRED_FLAGMASK_ALL 0x0000ffff - -/*! \brief External flags - - These are flags that are provided by the credentials providers. - The other flags are internal to KCDB and should not be modified. - */ -#define KCDB_CRED_FLAGMASK_EXT (KCDB_CRED_FLAG_INITIAL | KCDB_CRED_FLAG_EXPIRED | KCDB_CRED_FLAG_INVALID | KCDB_CRED_FLAG_RENEWABLE) - -/*! \brief Bitmask indicating dditive flags - - Additive flags are special flags which are added to exiting - credentials based on new credentials when doing a collect - operation. See details on kcdb_credset_collect() - - \see kcdb_credset_collect() -*/ -#define KCDB_CRED_FLAGMASK_ADDITIVE KCDB_CRED_FLAG_SELECTED - -/*! \brief Generic credentials request - - This data structure is used as the format for a generic - credentials reqeust for a ::KMSG_KCDB_REQUEST message. A plugin - typically publishes this message so that a credentials provider - may handle it and in response, obtain the specified credential. - - While the \a identity, \a type and \a name members of the - structure are all optional, typically one would specify all three - or at least two for a credential provider to be able to provide - the credential unambigously. - - Credential providers do not need to respond to ::KMSG_KCDB_REQUEST - messages. However, if they do, they should make sure that they - are the only credential provider that is responding by setting the - \a semaphore member to a non-zero value. The \a semaphore is set - to zero when a request is initially sent out. When incrementing - the semaphore, the plugin should use a thread safe mechanism to - ensure that there are no race conditions that would allow more - than one provider to respond to the message. - */ -typedef struct tag_kcdb_cred_request { - khm_handle identity; /*!< Identity of the credential. Set - to NULL if not specified. */ - khm_int32 type; /*!< Type of the credential. Set to - KCDB_CREDTYPE_INVALID if not - specified. */ - wchar_t * name; /*!< Name of the credential. Set to - NULL if not specified. */ - - khm_handle dest_credset; /*!< If non-NULL, instructs whoever is - handling the request that the - credential thus obtained be placed - in this credential set in addition - to whereever it may place newly - acquired credentials. Note that - while this can be NULL if the new - credential does not need to be - placed in a credential set, it can - not equal the root credential - set. */ - - void * vparam; /*!< An unspecified - parameter. Specific credential types - may specify how this field is to be - used. */ - - long semaphore; /*!< Incremented by one when this - request is answered. Only one - credential provider is allowed to - answer a ::KMSG_KCDB_REQUEST - message. Initially, when the - message is sent out, this member - should be set to zero. */ -} kcdb_cred_request; - -/*! \brief Create a new credential - - \param[in] name Name of credential. \a name cannot be NULL and cannot - exceed \a KCDB_CRED_MAXCCH_NAME unicode characters including the - \a NULL terminator. - \param[in] identity A reference to an identity. - \param[in] cred_type A credentials type identifier for the credential. - \param[out] result Gets a held reference to the newly created credential. - Call kcdb_cred_release() or kcdb_cred_delete() to release the - reference. - \see kcdb_cred_release() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_create(wchar_t * name, - khm_handle identity, - khm_int32 cred_type, - khm_handle * result); - -/*! \brief Duplicate an existing credential. - - \param[out] newcred A held reference to the new credential if the call - succeeds. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_dup(khm_handle cred, - khm_handle * newcred); - -/*! \brief Updates one credential using field values from another - - All fields that exist in \a vsrc will get copied to \a vdest and will - overwrite any values that are already there in \a vdest. However any - values that exist in \a vdest taht do not exist in \a vsrc will not be - modified. - - \retval KHM_ERROR_SUCCESS vdest was successfully updated - \retval KHM_ERROR_EQUIVALENT all fields in vsrc were present and equivalent in vdest -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_update(khm_handle vdest, - khm_handle vsrc); - -/*! \brief Set an attribute in a credential by name - - \param[in] cbbuf Number of bytes of data in \a buffer. The - individual data type handlers may copy in less than this many - bytes in to the credential. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_set_attrib(khm_handle cred, - wchar_t * name, - void * buffer, - khm_size cbbuf); - -/*! \brief Set an attribute in a credential by attribute id - - \param[in] buffer A pointer to a buffer containing the data to - assign to the attribute. Setting this to NULL has the effect - of removing any data that is already assigned to the - attribute. If \a buffer is non-NULL, then \a cbbuf should - specify the number of bytes in \a buffer. - - \param[in] cbbuf Number of bytes of data in \a buffer. The - individual data type handlers may copy in less than this many - bytes in to the credential. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_set_attr(khm_handle cred, - khm_int32 attr_id, - void * buffer, - khm_size cbbuf); - -/*! \brief Get an attribute from a credential by name. - - \param[in] buffer The buffer that is to receive the attribute - value. Set this to NULL if only the required buffer size is - to be returned. - - \param[in,out] cbbuf The number of bytes available in \a buffer. - If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and - sets this to the required buffer size. - - \note Set both \a buffer and \a cbbuf to NULL if only the - existence of the attribute is to be checked. If the attribute - exists in this credential then the function will return - KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_attrib(khm_handle cred, - wchar_t * name, - khm_int32 * attr_type, - void * buffer, - khm_size * cbbuf); - -/*! \brief Get an attribute from a credential by attribute id. - - \param[in] buffer The buffer that is to receive the attribute - value. Set this to NULL if only the required buffer size is - to be returned. - - \param[in,out] cbbuf The number of bytes available in \a buffer. - If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and - sets this to the required buffer size. - - \param[out] attr_type Receives the data type of the attribute. - Set this to NULL if the type is not required. - - \note Set both \a buffer and \a cbbuf to NULL if only the - existence of the attribute is to be checked. If the attribute - exists in this credential then the function will return - KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_attr(khm_handle cred, - khm_int32 attr_id, - khm_int32 * attr_type, - void * buffer, - khm_size * cbbuf); - -/*! \brief Get the name of a credential. - - \param[in] buffer The buffer that is to receive the credential - name. Set this to NULL if only the required buffer size is to - be returned. - - \param[in,out] cbbuf The number of bytes available in \a buffer. - If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and - sets this to the required buffer size. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_name(khm_handle cred, - wchar_t * buffer, - khm_size * cbbuf); - -/*! \brief Get the string representation of a credential attribute. - - A shortcut function which generates the string representation of a - credential attribute directly. - - \param[in] vcred A handle to a credential - - \param[in] attr_id The attribute to retrieve - - \param[out] buffer A pointer to a string buffer which receives the - string form of the attribute. Set this to NULL if you only - want to determine the size of the required buffer. - - \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, - holds the size of the buffer pointed to by \a buffer, and on - exit, receives the actual number of bytes that were copied. - - \param[in] flags Flags for the string conversion. Can be set to - one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is - KCDB_TS_LONG. - - \retval KHM_ERROR_SUCCESS Success - \retval KHM_ERROR_NOT_FOUND The given attribute was either invalid - or was not defined for this credential - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_TOO_LONG Either \a buffer was NULL or the - supplied buffer was insufficient -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_attr_string(khm_handle vcred, - khm_int32 attr_id, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags); - -/*! \brief Get the string representation of a credential attribute by name. - - A shortcut function which generates the string representation of a - credential attribute directly. - - \param[in] vcred A handle to a credential - - \param[in] attrib The name of the attribute to retrieve - - \param[out] buffer A pointer to a string buffer which receives the - string form of the attribute. Set this to NULL if you only - want to determine the size of the required buffer. - - \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, - holds the size of the buffer pointed to by \a buffer, and on - exit, receives the actual number of bytes that were copied. - - \param[in] flags Flags for the string conversion. Can be set to - one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is - KCDB_TS_LONG. - - \see kcdb_cred_get_attr_string() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_attrib_string(khm_handle cred, - wchar_t * name, - wchar_t * buffer, - khm_size * cbbuf, - khm_int32 flags) ; - - -/*! \brief Get a held reference to the identity associated with a credential - - Use kcdb_identity_release() to release the reference that is - returned. - - \see kcdb_identity_relase() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_identity(khm_handle cred, - khm_handle * identity); - -/*! \brief Set the identity of a credential - - While it is ill-advised to change the identity of a credential - that has been placed in one or more credential sets, there can be - legitimate reasons for doing so. Only change the identity of a - credential that is not placed in a credential set or placed in a - credential set that is only used by a single entity. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_set_identity(khm_handle vcred, - khm_handle id); - -/*! \brief Get the serial number for the credential. - - Each credential gets assigned a serial number at the time it is - created. This will stay with the credential for its lifetime. - - \param[out] pserial Receives the serial number. Cannot be NULL. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_serial(khm_handle cred, - khm_ui_8 * pserial); - -/*! \brief Get the type of the credential. - - The returned type is a credential type. Doh. - - \param[out] type Receives the type. Cannot be NULL. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_type(khm_handle cred, - khm_int32 * type); - -/*! \brief Retrieve flags from a credential - - The flags returned will be place in the location pointed to by \a - flags. Note that the specified credential must be an active - credential for the operation to succeed. This means the - ::KCDB_CRED_FLAG_DELETED will never be retured by this function. - */ -KHMEXP khm_int32 KHMAPI -kcdb_cred_get_flags(khm_handle cred, - khm_int32 * flags); - -/*! \brief Set the flags of a credential - - The flags specified in the \a mask parameter will be set to the - values specified in the \a flags parameter. The flags that are - not included in \a mask will not be modified. - - This function can not be used to set the ::KCDB_CRED_FLAG_DELETED - flag. If this bit is specified in either \a flags or \a mask, it - will be ignored. - - \see ::KCDB_CRED_FLAGMASK_ALL - */ -KHMEXP khm_int32 KHMAPI -kcdb_cred_set_flags(khm_handle cred, - khm_int32 flags, - khm_int32 mask); - -/*! \brief Hold a reference to a credential. - - Use kcdb_cred_release() to release the reference. - - \see kcdb_cred_release() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_hold(khm_handle cred); - -/*! \brief Release a held reference to a credential. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_release(khm_handle cred); - -/*! \brief Delete a credential. - - The credential will be marked for deletion and will continue to - exist until all held references are released. If the credential - is bound to a credential set or the root credential store, it will - be removed from the respective container. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_cred_delete(khm_handle cred); - -/*! \brief Compare an attribute of two credentials by name. - - \return The return value is dependent on the type of the attribute - and indicate a weak ordering of the attribute values of the two - credentials. If one or both credentials do not contain the - attribute, the return value is 0, which signifies that no ordering - can be determined. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_creds_comp_attrib(khm_handle cred1, - khm_handle cred2, - wchar_t * name); - -/*! \brief Compare an attribute of two credentials by attribute id. - - \return The return value is dependent on the type of the attribute - and indicate a weak ordering of the attribute values of the two - credentials. If one or both credentials do not contain the - attribute, the return value is 0, which signifies that no ordering - can be determined. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_creds_comp_attr(khm_handle cred1, - khm_handle cred2, - khm_int32 attr_id); - -/*! \brief Compare two credentials for equivalence - - \return Non-zero if the two credentials are equal. Zero otherwise. - \note Two credentials are considered equal if all the following hold: - - Both refer to the same identity. - - Both have the same name. - - Both have the same type. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_creds_is_equal(khm_handle cred1, - khm_handle cred2); - -/*@}*/ -/*@}*/ - -/********************************************************************/ - -/*! \defgroup kcdb_type Credential attribute types - -@{*/ - -/*! \brief Convert a field to a string - - Provides a string representation of a field in a credential. The - data buffer can be assumed to be valid. - - On entry, \a s_buf can be NULL if only the required size of the - buffer is to be returned. \a pcb_s_buf should be non-NULL and - should point to a valid variable of type ::khm_size that will, on - entry, contain the size of the buffer pointed to by \a s_buf if \a - s_buf is not \a NULL, and on exit will contain the number of bytes - consumed in \a s_buf, or the required size of the buffer if \a - s_buf was NULL or the size of the buffer was insufficient. - - The implementation should verify the parameters that are passed in - to the function. - - The data pointed to by \a data should not be modified in any way. - - \param[in] data Valid pointer to a block of data - - \param[in] cb_data Number of bytes in data block pointed to by \a - data - - \param[out] s_buf Buffer to receive the string representation of - data. If the data type flags has KCDB_TYPE_FLAG_CB_AUTO, then - this parameter could be set to KCDB_CBSIZE_AUTO. In this - case, the function should compute the size of the input buffer - assuming that the input buffer is valid. - - \param[in,out] pcb_s_buf On entry, contains the size of the buffer - pointed to by \a s_buf, and on exit, contains the number of - bytes used by the string representation of the data including - the NULL terminator - - \param[in] flags Flags for formatting the string - - \retval KHM_ERROR_SUCCESS The string representation of the data - field was successfully copied to \a s_buf and the size of the - buffer used was copied to \a pcb_s_buf. - - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - - \retval KHM_ERROR_TOO_LONG Either \a s_buf was \a NULL or the size - indicated by \a pcb_s_buf was too small to contain the string - representation of the value. The required size of the buffer - is in \a pcb_s_buf. - - \note This documents the expected behavior of this prototype function - - \see ::kcdb_type - */ -typedef khm_int32 -(KHMAPI *kcdb_dtf_toString)(const void * data, - khm_size cb_data, - wchar_t * s_buf, - khm_size * pcb_s_buf, - khm_int32 flags); - -/*! \brief Verifies whetehr the given buffer contains valid data - - The function should examine the buffer and the size of the buffer - and determine whether or not the buffer contains valid data for - this data type. - - The data field pointed to by \a data should not be modified in any - way. - - \param[in] data A pointer to a data buffer - - \param[in] cb_data The number of bytes in the data buffer. If the - data type flags has KCDB_TYPE_FLAG_CB_AUTO, then this - parameter could be set to KCDB_CBSIZE_AUTO. In this case, the - function should compute the size of the input buffer assuming - that the input buffer is valid. - - \return TRUE if the data is valid, FALSE otherwise. - - \note This documents the expected behavior of this prototype function - - \see ::kcdb_type -*/ -typedef khm_boolean -(KHMAPI *kcdb_dtf_isValid)(const void * data, - khm_size cb_data); - -/*! \brief Compare two fields - - Compare the two data fields and return a value indicating their - relative ordering. The return value follows the same - specification as strcmp(). - - Both data buffers that are passed in can be assumed to be valid. - - None of the data buffers should be modified in any way. - - \param[in] data_l Valid pointer to first data buffer - - \param[in] cb_data_l Number of bytes in \a data_l. If the data - type flags has KCDB_TYPE_FLAG_CB_AUTO, then this parameter - could be set to KCDB_CBSIZE_AUTO. In this case, the function - should compute the size of the input buffer assuming that the - input buffer is valid. - - \param[in] data_r Valid pointer to second data buffer - - \param[in] cb_data_r Number of bytes in \a data_r. If the data - type flags has KCDB_TYPE_FLAG_CB_AUTO, then this parameter - could be set to KCDB_CBSIZE_AUTO. In this case, the function - should compute the size of the input buffer assuming that the - input buffer is valid. - - \return The return value should be - - Less than zero if \a data_l < \a data_r - - Equal to zero if \a data_l == \a data_r or if this data type can not be compared - - Greater than zero if \a data_l > \a data_r - - \note This documents the expected behavior of this prototype function - - \see ::kcdb_type -*/ -typedef khm_int32 -(KHMAPI *kcdb_dtf_comp)(const void * data_l, - khm_size cb_data_l, - const void * data_r, - khm_size cb_data_r); - -/*! \brief Duplicate a data field - - Duplicates a data field. The buffer pointed to by \a data_src - contains a valid field. The function should copy the field with - appropriate adjustments to \a data_dst. - - The \a data_dst parameter can be NULL if only the required size of - the buffer is needed. In this case, teh function should set \a - pcb_data_dst to the number of bytes required and then return - KHM_ERROR_TOO_LONG. - - \param[in] data_src Pointer to a valid data buffer - - \param[in] cb_data_src Number of bytes in \a data_src. If the data - type flags has KCDB_TYPE_FLAG_CB_AUTO, then this parameter - could be set to KCDB_CBSIZE_AUTO. In this case, the function - should compute the size of the input buffer assuming that the - input buffer is valid. - - \param[out] data_dst Poitner to destination buffer. Could be NULL - if only the required size of the destination buffer is to be - returned. - - \param[in,out] pcb_data_dst On entry specifies the number of bytes - in \a data_dst, and on exit should contain the number of bytes - copied. - - \retval KHM_ERROR_SUCCESS The data was successfully copied. The - number of bytes copied is in \a pcb_data_dst - - \retval KHM_ERROR_INVALID_PARAM One or more parameters is incorrect. - - \retval KHM_ERROR_TOO_LONG Either \a data_dst was NULL or the size - of the buffer was insufficient. The required size is in \a - pcb_data_dst - - \note This documents the expected behavior of this prototype function - - \see ::kcdb_type - */ -typedef khm_int32 -(KHMAPI *kcdb_dtf_dup)(const void * data_src, - khm_size cb_data_src, - void * data_dst, - khm_size * pcb_data_dst); - -/*! \brief A data type descriptor. - - Handles basic operation for a specific data type. - - \see \ref cred_data_types -*/ -typedef struct tag_kcdb_type { - wchar_t * name; - khm_int32 id; - khm_int32 flags; - - khm_size cb_min; - khm_size cb_max; - - kcdb_dtf_toString toString; - /*!< Provides a string representation for a value. */ - - kcdb_dtf_isValid isValid; - /*!< Returns true of the value is valid for this data type */ - - kcdb_dtf_comp comp; - /*!< Compare two values and return \a strcmp style return value */ - - kcdb_dtf_dup dup; - /*!< Duplicate a value into a secondary buffer */ -} kcdb_type; - -/*! \name Flags for kcdb_type::toString -@{*/ -/*! \brief Specify that the short form of the string representation should be returned. - - Flags for #kcdb_type::toString. The flag specifies how long the - string representation should be. The specific length of a short - or long description is not restricted and it is up to the - implementation to choose how to interpret the flags. - - Usually, KCDB_TS_SHORT is specified when the amount of space that - is available to display the string is very restricted. It may be - the case that the string is truncated to facilitate displaying in - a constrainted space. -*/ -#define KCDB_TS_SHORT 1 - -/*! \brief Specify that the long form of the string representation should be returned - - Flags for #kcdb_type::toString. The flag specifies how long the - string representation should be. The specific length of a short - or long description is not restricted and it is up to the - implementation to choose how to interpret the flags. - -*/ -#define KCDB_TS_LONG 0 -/*@}*/ - -/*! \brief The maximum number of bytes allowed for a value of any type */ -#define KCDB_TYPE_MAXCB 16384 - -/*! \name Flags for kcdb_type -@{*/ - -/*! \brief The type supports KCDB_CBSIZE_AUTO. - - Used for types where the size of the object can be determined - through context or by the object content. Such as for objects - that have a fixed size or unicode strings that have a terminator. - - This implies that ALL the object manipulation callbacks that are - defined in this type definition support the KCDB_CBSIZE_AUTO - value. -*/ -#define KCDB_TYPE_FLAG_CB_AUTO 16 - -/*! \brief The \a cb_min member is valid. - - The \a cb_min member defines the minimum number of bytes that an - object of this type will consume. - - \note If this flag is used in conjunction with \a - KCDB_TYPE_FLAG_CB_MAX then, \a cb_min must be less than or equal - to \a cb_max. -*/ -#define KCDB_TYPE_FLAG_CB_MIN 128 - -/*! \brief The \a cb_max member is valid. - - The \a cb_max member defines the maximum number of bytes that an - object of this type will consume. - - \note If this flag is used in conjunction with \a - KCDB_TYPE_FLAG_CB_MIN then, \a cb_min must be less than or - equal to \a cb_max. */ -#define KCDB_TYPE_FLAG_CB_MAX 256 - -/*! \brief Denotes that objects of this type have a fixed size. - - If this flags is specified, then the type definition must also - specify cb_min and cb_max, which must both be the same value. - - \note Implies \a KCDB_TYPE_FLAG_CB_AUTO, \a KCDB_TYPE_FLAG_CB_MIN - and \a KCDB_TYPE_FLAG_CB_MAX. Pay special attention to the - implication of \a KCDB_TYPE_FLAG_AUTO. -*/ -#define KCDB_TYPE_FLAG_CB_FIXED (KCDB_TYPE_FLAG_CB_AUTO|KCDB_TYPE_FLAG_CB_MIN|KCDB_TYPE_FLAG_CB_MAX) - -/*@}*/ - -KHMEXP khm_int32 KHMAPI -kcdb_type_get_id(wchar_t *name, khm_int32 * id); - -/*! \brief Return the type descriptor for a given type id - - \param[out] info Receives a held reference to a type descriptor. - Use kcdb_type_release_info() to release the handle. If the \a - info parameter is NULL, the function returns KHM_ERROR_SUCCESS - if \a id is a valid type id, and returns KHM_ERROR_NOT_FOUND - otherwise. - - \see kcdb_type_release_info() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_type_get_info(khm_int32 id, kcdb_type ** info); - -/*! \brief Release a reference to a type info structure - - Releases the reference to the type information obtained with a - prior call to kcdb_type_get_info(). - */ -KHMEXP khm_int32 KHMAPI -kcdb_type_release_info(kcdb_type * info); - -/*! \brief Get the name of a type - - Retrieves the non-localized name of the specified type. - */ -KHMEXP khm_int32 KHMAPI -kcdb_type_get_name(khm_int32 id, - wchar_t * buffer, - khm_size * cbbuf); - -/*! \brief Register a credentials attribute type - - The credentials type record pointed to by \a type defines a new - credential attribute type. The \a id member of \a type may be set - to KCDB_TYPE_INVALID to indicate that an attribute ID is to be - generated automatically. - - \param[in] type The type descriptor - \param[out] new_id Receives the identifier for the credential attribute type. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_type_register(kcdb_type * type, - khm_int32 * new_id); - -/*! \brief Unregister a credential attribute type - - Removes the registration for the specified credentials attribute - type. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_type_unregister(khm_int32 id); - -KHMEXP khm_int32 KHMAPI -kcdb_type_get_next_free(khm_int32 * id); - -/*! \name Conversion functions -@{*/ -/*! \brief Convert a time_t value to FILETIME -*/ -KHMEXP void KHMAPI -TimetToFileTime( time_t t, LPFILETIME pft ); - -/*! \brief Convert a time_t interval to a FILETIME interval -*/ -KHMEXP void KHMAPI -TimetToFileTimeInterval(time_t t, LPFILETIME pft); - -/*! \brief Convert a FILETIME interval to seconds -*/ -KHMEXP long KHMAPI -FtIntervalToSeconds(LPFILETIME pft); - -/*! \brief Convert a FILETIME interval to milliseconds -*/ -KHMEXP long KHMAPI -FtIntervalToMilliseconds(LPFILETIME pft); - -/*! \brief Compare two FILETIME values - - The return value is similar to the return value of strcmp(), based - on the comparison of the two FILETIME values. - */ -KHMEXP long KHMAPI -FtCompare(LPFILETIME pft1, LPFILETIME pft2); - -/*! \brief Convert a FILETIME to a 64 bit int -*/ -KHMEXP khm_int64 KHMAPI FtToInt(LPFILETIME pft); - -/*! \brief Convert a 64 bit int to a FILETIME -*/ -KHMEXP FILETIME KHMAPI IntToFt(khm_int64 i); - -/*! \brief Calculate the difference between two FILETIMEs - - Returns the value of ft1 - ft2 - */ -KHMEXP FILETIME KHMAPI FtSub(LPFILETIME ft1, LPFILETIME ft2); - -/*! \brief Calculate the sum of two FILETIMEs - - Return the value of ft1 + ft2 - */ -KHMEXP FILETIME KHMAPI FtAdd(LPFILETIME ft1, LPFILETIME ft2); - -/*! \brief Convert a FILETIME inverval to a string -*/ -KHMEXP khm_int32 KHMAPI -FtIntervalToString(LPFILETIME data, - wchar_t * buffer, - khm_size * cb_buf); - -/*! \brief Parse a string representing an interval into a FILETIME interval - - The string is a localized string which should look like the - following: - - \code - [number unit] [number unit]... - \endcode - - where \a number is an integer while \a unit is a localized - (possibly abbreviated) unit specification. The value of the - described interval is calculated as the sum of each \a number in - \a units. For example : - - \code - 1 hour 36 minutes - \endcode - - would result in an interval specification that's equivalent to 1 - hour and 36 minutes. Of course there is no restriction on the - order in which the \a number \a unit specifications are given and - the same unit may be repeated multiple times. - - \retval KHM_ERROR_INVALID_PARAM The given string was invalid or had - a token that could not be parsed. It can also mean that \a - pft was NULL or \a str was NULL. - - \retval KHM_ERROR_SUCCESS The string was successfully parsed and - the result was placed in \a pft. -*/ -KHMEXP khm_int32 KHMAPI -IntervalStringToFt(FILETIME * pft, wchar_t * str); - -/*! \brief Return number of milliseconds till next representation change - - Returns the number of milliseconds that must elapse away from the - interval specified in pft \a for the representation of pft to change - from whatever it is right now. - - Returns 0 if the representation is not expected to change. -*/ -KHMEXP long KHMAPI -FtIntervalMsToRepChange(LPFILETIME pft); - -/*! \brief Convert a safe ANSI string to a Unicode string - - The resulting string is guaranteed to be NULL terminated and - within the size limit set by \a cbwstr. - - If the whole string cannot be converted, \a wstr is set to an - empty string. - - \return the number of characters converted. This is always either - the length of the string \a astr or 0. -*/ -KHMEXP int KHMAPI -AnsiStrToUnicode( wchar_t * wstr, size_t cbwstr, const char * astr); - -/*! \brief Convert a Unicode string to ANSI - - The resulting string is guaranteed to be NULL terminated and - within the size limit set by \a cbdest. - - \return the number of characters converted. This is always either - the length of the string \a src or 0. -*/ -KHMEXP int KHMAPI -UnicodeStrToAnsi( char * dest, size_t cbdest, const wchar_t * src); -/*@}*/ - -/*! \name Standard type identifiers and names -@{*/ - -/*! Maximum identifier number */ -#define KCDB_TYPE_MAX_ID 255 - -/*! \brief Invalid type - - Used by functions that return a type identifier to indicate that - the returned type identifier is invalid. Also used to indicate - that a type identifier is not available */ -#define KCDB_TYPE_INVALID (-1) - -/*! \brief All types - - Used by filters to indicate that all types are allowed. -*/ -#define KCDB_TYPE_ALL KCDB_TYPE_INVALID - -#define KCDB_TYPE_VOID 0 -#define KCDB_TYPE_STRING 1 -#define KCDB_TYPE_DATE 2 -#define KCDB_TYPE_INTERVAL 3 -#define KCDB_TYPE_INT32 4 -#define KCDB_TYPE_INT64 5 -#define KCDB_TYPE_DATA 6 - -#define KCDB_TYPENAME_VOID L"Void" -#define KCDB_TYPENAME_STRING L"String" -#define KCDB_TYPENAME_DATE L"Date" -#define KCDB_TYPENAME_INTERVAL L"Interval" -#define KCDB_TYPENAME_INT32 L"Int32" -#define KCDB_TYPENAME_INT64 L"Int64" -#define KCDB_TYPENAME_DATA L"Data" -/*@}*/ -/*@}*/ - -/********************************************************************/ - -/*! \defgroup kcdb_credattr Credential attributes */ -/*@{*/ - -/*! \brief Prototype callback function for computed data types. - - If the flags for a particular attribute specifies that the value - is computed, then a callback function should be specified. The - callback function will be called with a handle to a credential - along with the attribute ID for the requested attribute. The - function should place the computed value in \a buffer. The size - of the buffer in bytes is specifed in \a cbsize. However, if \a - buffer is \a NULL, then the required buffer size should be placed - in \a cbsize. - */ -typedef khm_int32 -(KHMAPI *kcdb_attrib_compute_cb)(khm_handle cred, - khm_int32 id, - void * buffer, - khm_size * cbsize); - -/*! \brief Credential attribute descriptor - - \see kcdb_attrib_register() -*/ -typedef struct tag_kcdb_attrib { - wchar_t * name; /*!< Name. (Not localized, - required) */ - khm_int32 id; /*!< Identifier. When registering, - this can be set to - ::KCDB_ATTR_INVALID if a unique - identifier is to be generated. */ - khm_int32 alt_id; /*!< Alternate identifier. If the \a - flags specify - ::KCDB_ATTR_FLAG_ALTVIEW, then this - field should specify the identifier - of the canonical attribute from - which this attribute is derived. */ - khm_int32 flags; /*!< Flags. Combination of \ref - kcdb_credattr_flags "attribute - flags" */ - - khm_int32 type; /*!< Type of the attribute. Must be valid. */ - - wchar_t * short_desc; /*!< Short description. (Localized, - optional) */ - - wchar_t * long_desc; /*!< Long description. (Localized, - optional) */ - - kcdb_attrib_compute_cb compute_cb; - /*!< Callback. Required if \a flags - specify ::KCDB_ATTR_FLAG_COMPUTED. */ - - khm_size compute_min_cbsize; - /*!< Minimum number of bytes required - to store this attribute. Required - if ::KCDB_ATTR_FLAG_COMPUTED is - specified.*/ - khm_size compute_max_cbsize; - /*!< Maximum number of bytes required - to store this attribute. Required - if ::KCDB_ATTR_FLAG_COMPUTED is - specified.*/ -} kcdb_attrib; - -/*! \brief Retrieve the ID of a named attribute */ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_get_id(wchar_t *name, - khm_int32 * id); - -/*! \brief Register an attribute - - \param[out] new_id Receives the ID of the newly registered - attribute. If the \a id member of the ::kcdb_attrib object is - set to KCDB_ATTR_INVALID, then a unique ID is generated. */ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_register(kcdb_attrib * attrib, - khm_int32 * new_id); - -/*! \brief Retrieve the attribute descriptor for an attribute - - The descriptor that is returned must be released through a call to - kcdb_attrib_release_info() - - If only the validity of the attribute identifier needs to be - checked, you can pass in NULL for \a attrib. In this case, if the - identifier is valid, then the funciton will return - KHM_ERROR_SUCCESS, otherwise it will return KHM_ERROR_NOT_FOUND. - - \see kcdb_attrib_release_info() - */ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_get_info(khm_int32 id, - kcdb_attrib ** attrib); - -/*! \brief Release an attribute descriptor - - \see kcdb_attrib_get_info() - */ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_release_info(kcdb_attrib * attrib); - -/*! \brief Unregister an attribute - - Once an attribute ID has been unregistered, it may be reclaimed by - a subsequent call to kcdb_attrib_register(). -*/ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_unregister(khm_int32 id); - -/*! \brief Retrieve the description of an attribute - - \param[in] flags Specify \a KCDB_TS_SHORT to retrieve the short description. */ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_describe(khm_int32 id, - wchar_t * buffer, - khm_size * cbsize, - khm_int32 flags); - -/*! \brief Count attributes - - Counts the number of attributes that match the given criteria. - The criteria is specified against the flags of the attribute. An - attribute is a match if its flags satisfy the condition below: - - \code - (attrib.flags & and_flags) == (eq_flags & and_flags) - \endcode - - The number of attributes that match are returned in \a pcount. - */ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_get_count(khm_int32 and_flags, - khm_int32 eq_flags, - khm_size * pcount); - -/*! \brief List attribute identifiers - - Lists the identifiers of the attributes that match the given - criteria. The criteria is specified against the flags of the - attribute. An attribute is a match if the following condition is - satisfied: - - \code - (attrib.flags & and_flags) == (eq_flags & and_flags) - \endcode - - The list of attributes found are copied to the \a khm_int32 array - specified in \a plist. The number of elements available in the - buffer \a plist is specified in \a pcsize. On exit, \a pcsize - will hold the actual number of attribute identifiers copied to the - array. - - \param[in] and_flags See above - \param[in] eq_flags See above - \param[in] plist A khm_int32 array - \param[in,out] pcsize On entry, holds the number of elements - available in the array pointed to by \a plist. On exit, holds - the number of elements copied to the array. - - \retval KHM_ERROR_SUCCESS The list of attribute identifiers have - been copied. - \retval KHM_ERROR_TOO_LONG The list was too long to fit in the - supplied buffer. As many elements as possible have been - copied to the \a plist array and the required number of - elements has been written to \a pcsize. - - \note The \a pcsize parameter specifies the number of khm_int32 - elements in the array and not the number of bytes in the - array. This is different from the usual size parameters used - in the NetIDMgr API. - */ -KHMEXP khm_int32 KHMAPI -kcdb_attrib_get_ids(khm_int32 and_flags, - khm_int32 eq_flags, - khm_int32 * plist, - khm_size * pcsize); - -/*! \defgroup kcdb_credattr_flags Attribute flags */ -/*@{*/ -/*! \brief The attribute is required */ -#define KCDB_ATTR_FLAG_REQUIRED 0x00000008 - -/*! \brief The attribute is computed. - - If this flag is set, the \a compute_cb, \a compute_min_cbsize and - \a compute_max_cbsize members of the ::kcdb_attrib attribute - descriptor must be assigned valid values. -*/ -#define KCDB_ATTR_FLAG_COMPUTED 0x00000010 - -/*! \brief System attribute. - - This cannot be specified for a custom attribute. Implies that the - value of the attribute is given by the credentials database - itself. -*/ -#define KCDB_ATTR_FLAG_SYSTEM 0x00000020 - -/*! \brief Hidden - - The attribute is not meant to be displayed to the user. Setting - this flag prevents this attribute from being listed in the list of - available data fields in the UI. -*/ -#define KCDB_ATTR_FLAG_HIDDEN 0x00000040 - -/*! \brief Property - - The attribute is a property. The main difference between regular - attributes and properties are that properties are not allocated - off the credentials record. Hence, a property can not be used as - a credentials field. Other objects such as identities can hold - property sets. A property set can hold both regular attributes as - well as properties. -*/ -#define KCDB_ATTR_FLAG_PROPERTY 0x00000080 - -/*! \brief Volatile - - A volatile property is one whose value changes often, such as - ::KCDB_ATTR_TIMELEFT. Some controls will make use of additional - logic to deal with such values, or not display them at all. - */ -#define KCDB_ATTR_FLAG_VOLATILE 0x00000100 - -/*! \brief Alternate view - - The attribute is actually an alternate representation of another - attribute. The Canonical attribute name is specified in \a - alt_id. - - Sometimes a certain attribute may need to be represented in - different ways. You can register multiple attributes for each - view. However, you should also provide a canonical attribute for - whenever the canonical set of attributes of the credential is - required. - */ -#define KCDB_ATTR_FLAG_ALTVIEW 0x00000200 - -/*! \brief Transient attribute - - A transient attribute is one whose absence is meaningful. When - updating one record using another, if a transient attribute is - absent in the source but present in the destination, then the - attribute is removed from the destination. -*/ -#define KCDB_ATTR_FLAG_TRANSIENT 0x00000400 - -/*@}*/ - -/*! \defgroup kcdb_credattr_idnames Standard attribute IDs and names */ -/*@{*/ - -/*! \name Attribute related constants */ -/*@{*/ -/*! \brief Maximum valid attribute ID */ -#define KCDB_ATTR_MAX_ID 255 - -/*! \brief Minimum valid property ID */ -#define KCDB_ATTR_MIN_PROP_ID 4096 - -/*! \brief Maximum number of properties */ -#define KCDB_ATTR_MAX_PROPS 128 - -/*! \brief Maximum valid property ID */ -#define KCDB_ATTR_MAX_PROP_ID (KCDB_ATTR_MIN_PROP_ID + KCDB_ATTR_MAX_PROPS - 1) - -/*! \brief Invalid ID */ -#define KCDB_ATTR_INVALID (-1) - -/*! \brief First custom attribute ID */ -#define KCDB_ATTRID_USER 20 - -/*@}*/ - -/*!\name Attribute identifiers */ -/*@{*/ -/*! \brief Name of the credential - - - \b Type: STRING - - \b Flags: REQUIRED, COMPUTED, SYSTEM - */ -#define KCDB_ATTR_NAME 0 - -/*! \brief The identity handle for the credential - - - \b Type: INT64 - - \b Flags: REQUIRED, COMPUTED, SYSTEM, HIDDEN - - \note The handle returned in by specifying this attribute to - kcdb_cred_get_attr() or kcdb_cred_get_attrib() is not held. - While the identity is implicitly held for the duration that - the credential is held, it is not recommended to obtain a - handle to the identity using this method. Use - kcdb_cred_get_identity() instead. -*/ -#define KCDB_ATTR_ID 1 - -/*! \brief The name of the identity - - - \b Type: STRING - - \b Flags: REQUIRED, COMPUTED, SYSTEM - */ -#define KCDB_ATTR_ID_NAME 2 - -/*! \brief The type of the credential - - - \b Type: INT32 - - \b Flags: REQUIRED, COMPUTED, SYSTEM, HIDDEN -*/ -#define KCDB_ATTR_TYPE 3 - -/*! \brief Type name for the credential - - - \b Type: STRING - - \b Flags: REQUIRED, COMPUTED, SYSTEM -*/ -#define KCDB_ATTR_TYPE_NAME 4 - -/*! \brief Name of the parent credential - - - \b Type: STRING - - \b Flags: SYSTEM -*/ -#define KCDB_ATTR_PARENT_NAME 5 - -/*! \brief Issed on - - - \b Type: DATE - - \b Flags: SYSTEM -*/ -#define KCDB_ATTR_ISSUE 6 - -/*! \brief Expires on - - - \b Type: DATE - - \b Flags: SYSTEM -*/ -#define KCDB_ATTR_EXPIRE 7 - -/*! \brief Renewable period expires on - - - \b Type: DATE - - \b Flags: SYSTEM -*/ -#define KCDB_ATTR_RENEW_EXPIRE 8 - -/*! \brief Time left till expiration - - - \b Type: INTERVAL - - \b Flags: SYSTEM, COMPUTED, VOLATILE -*/ -#define KCDB_ATTR_TIMELEFT 9 - -#define KCDB_ATTR_RENEW_TIMELEFT 10 - -/*! \brief Location of the credential - - - \b Type: STRING - - \b Flags: SYSTEM -*/ -#define KCDB_ATTR_LOCATION 11 - -/*! \brief Lifetime of the credential - - - \b Type: INTERVAL - - \b Flags: SYSTEM -*/ -#define KCDB_ATTR_LIFETIME 12 - -#define KCDB_ATTR_RENEW_LIFETIME 13 - -/*! \brief Flags for the credential - - - \b Type: INT32 - - \b Flags: REQUIRED, COMPUTED, SYSTEM, HIDDEN - */ -#define KCDB_ATTR_FLAGS 14 - -/*@}*/ - -/*!\name Attribute names */ -/*@{ */ - -#define KCDB_ATTRNAME_NAME L"Name" -#define KCDB_ATTRNAME_ID L"Identity" -#define KCDB_ATTRNAME_ID_NAME L"IdentityName" -#define KCDB_ATTRNAME_TYPE L"TypeId" -#define KCDB_ATTRNAME_TYPE_NAME L"TypeName" -#define KCDB_ATTRNAME_FLAGS L"Flags" - -#define KCDB_ATTRNAME_PARENT_NAME L"Parent" -#define KCDB_ATTRNAME_ISSUE L"Issued" -#define KCDB_ATTRNAME_EXPIRE L"Expires" -#define KCDB_ATTRNAME_RENEW_EXPIRE L"RenewExpires" -#define KCDB_ATTRNAME_TIMELEFT L"TimeLeft" -#define KCDB_ATTRNAME_RENEW_TIMELEFT L"RenewTimeLeft" -#define KCDB_ATTRNAME_LOCATION L"Location" -#define KCDB_ATTRNAME_LIFETIME L"Lifetime" -#define KCDB_ATTRNAME_RENEW_LIFETIME L"RenewLifetime" - -/*@}*/ - -/*@}*/ - -/*@}*/ - -/*****************************************************************************/ - -/*! \defgroup kcdb_credtype Credential types */ -/*@{*/ - -/*! \brief Credential type descriptor */ -typedef struct tag_kcdb_credtype { - wchar_t * name; /*!< name (less than KCDB_MAXCB_NAME bytes) */ - khm_int32 id; - wchar_t * short_desc; /*!< short localized description (less - than KCDB_MAXCB_SHORT_DESC bytes) */ - wchar_t * long_desc; /*!< long localized descriptionn (less - than KCDB_MAXCB_LONG_DESC bytes) */ - khm_handle sub; /*!< Subscription for credentials type - hander. This should be a valid - subscription constructed through a - call to kmq_create_subscription() - and must handle KMSG_CRED messages - that are marked as being sent to - type specific subscriptions. - - The subscription will be - automatically deleted with a call to - kmq_delete_subscription() when the - credentials type is unregistered.*/ - - kcdb_cred_comp_func is_equal; /*!< Used as an additional clause - when comparing two credentials for - equality. The function this is - actually a comparison function, it - should return zero if the two - credentials are equal and non-zero - if they are not. The addtional \a - rock parameter is always zero. - - It can be assumed that the identity, - name and credentials type have - already been found to be equal among - the credentials and the credential - type is the type that is being - registered.*/ - -#ifdef _WIN32 - HICON icon; -#endif -} kcdb_credtype; - -/*! \brief Maximum value of a credential type identifier - - Credential type identifiers are assigned serially unless the - process registering the credential type sets a specific identity. - The maximum identifier number places a hard limit to the number of - credential types that can be registered at one time, which is - KCDB_CREDTYPE_MAX_ID + 1. - */ -#define KCDB_CREDTYPE_MAX_ID 31 - -/*! \brief Specify all credential types - - This value is used by functions which filter credentials based on - credential types. Specifying this value tells the filter to - accept all credential types. - */ -#define KCDB_CREDTYPE_ALL (-1) - -/*! \brief Automatically determine a credential type identifier - - Used with kcdb_credtype_register() to specify that the credential - type identifier should be automatically determined to avoid - collisions. - */ -#define KCDB_CREDTYPE_AUTO (-2) - -/*! \brief An invalid credential type - - Even though any non positive credential type ID is invalid - anywhere where a specific credential type ID is required, this - value is provided for explicit indication that the credential type - is invalid. Also it makes code more readable to have a constant - that shouts out INVALID. - -*/ -#define KCDB_CREDTYPE_INVALID (-3) - -/*! \brief Macro predicate for testing whether a credtype is valid - - Returns TRUE if the given credtype is valid. This is a safe - macro. -*/ -#define KCDB_CREDTYPE_IS_VALID(t) ((t) >= 0) - -/*! \brief Register a credentials type. - - The information given in the \a type parameter is used to register - a new credential type. Note that the \a name member of the \a - type should be unique among all credential types. - - You can specify ::KCDB_CREDTYPE_AUTO as the \a id member of \a - type to let kcdb_credtype_register() determine a suitable - credential type identifier. You can subsequently call - kcdb_credtype_get_id() to retrieve the generated id or pass a - valid pointer to a khm_int32 type variable as \a new_id. - - \param[in] type Credential type descriptor - - \param[out] new_id The credential type identifier that this type - was registered as. - - \retval KHM_ERROR_SUCCESS The credential type was successfully registered. - - \retval KHM_ERROR_INVALID_PARAM One or more of the parameters were invalid - - \retval KHM_ERROR_TOO_LONG One or more of the string fields in \a - type exceeded the character limit for that field. - - \retval KHM_ERROR_NO_RESOURCES When autogenerating credential type - identifiers, this value indicates that the maximum number of - credential types have been registered. No more registrations - can be accepted unless some credentials type is unregisred. - - \retval KHM_ERROR_DUPLICATE The \a name or \a id that was - specified is already in use. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credtype_register(kcdb_credtype * type, - khm_int32 * new_id); - -/*! \brief Return a held reference to a \a kcdb_credtype object describing the credential type. - - The reference points to a static internal object of type \a - kcdb_credtype. Use the kcdb_credtype_release_info() function to - release the reference. - - Also, the structure passed in as the \a type argument to - kcdb_credtype_register() is not valid as a credential type - descriptor. Use kcdb_credtype_get_info() to obtain the actual - credential type descriptor. - - \param[in] id Credentials type identifier. - - \param[out] type Receives the credentials descriptor handle. If - \a type is NULL, then no handle is returned. However, the - function will still return \a KHM_ERROR_SUCCESS if the \a id - parameter passed in is a valid credentials type identifier. - - \see kcdb_credtype_release_info() - \see kcdb_credtype_register() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_credtype_get_info(khm_int32 id, - kcdb_credtype ** type); - -/*! \brief Release a reference to a \a kcdb_credtype object - - Undoes the hold obtained on a \a kcdb_credtype object from a - previous call to kcdb_credtype_get_info(). - - \see kcdb_credtype_get_info() - */ -KHMEXP khm_int32 KHMAPI -kcdb_credtype_release_info(kcdb_credtype * type); - -/*! \brief Unregister a credentials type - - Undoes the registration performed by kcdb_credtype_register(). - - This should only be done when the credentials provider is being - unloaded. - */ -KHMEXP khm_int32 KHMAPI -kcdb_credtype_unregister(khm_int32 id); - -/*! \brief Retrieve the name of a credentials type - - Given a credentials type identifier, retrieves the name. The name - is not localized and serves as a persistent identifier of the - credentials type. - - \param[out] buf The buffer to receive the name. Could be \a NULL - if only the length of the buffer is required. - - \param[in,out] cbbuf On entry, specifies the size of the buffer - pointed to by \a buf if \a buf is not NULL. On exit, contains - the number of bytes copied to \a buf or the required size of - the buffer. - - \retval KHM_ERROR_SUCCESS The call succeeded. - - \retval KHM_ERROR_TOO_LONG Either \a buf was NULL or the supplied - buffer was not large enough. The required size is in \a cbbuf. - - \retval KHM_ERROR_INVALID_PARAM Invalid parameter. - */ -KHMEXP khm_int32 KHMAPI -kcdb_credtype_get_name(khm_int32 id, - wchar_t * buf, - khm_size * cbbuf); - -/*! \brief Retrieve the type specific subscription for a type - - Given a credentials type, this function returns the credentials - type specific subcription. It may return NULL if the subscription - is not available. - */ -KHMEXP khm_handle KHMAPI -kcdb_credtype_get_sub(khm_int32 id); - -/*! \brief Get the description of a credentials type - - Unlike the name of a credential type, the description is localized. - - \param[in] id Credentials type identifier - - \param[out] buf Receives the description. Can bet set to NULL if - only the size of the buffer is required. - - \param[in,out] cbbuf On entry, specifies the size of the buffer - pointed to by \a buf. On exit, specifies the required size of - the buffer or the number of bytes copied, depending on whether - the call succeeded or not. - - \param[in] flags Specify ::KCDB_TS_SHORT if the short version of - the description is desired if there is more than one. - - \retval KHM_ERROR_SUCCESS The call succeeded - \retval KHM_ERROR_TOO_LONG Either \a buf was NULL or the supplied buffer was insufficient. The required size is specified in \a cbbuf. - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. - */ -KHMEXP khm_int32 KHMAPI -kcdb_credtype_describe(khm_int32 id, - wchar_t * buf, - khm_size * cbbuf, - khm_int32 flags); - -/*! \brief Look up the identifier of a credentials type by name - - Given a name, looks up the identifier. - - \param[in] name Name of the credentials type - \param[out] id Receives the identifier if the call succeeds - - */ -KHMEXP khm_int32 KHMAPI -kcdb_credtype_get_id(wchar_t * name, - khm_int32 * id); - -/*@}*/ - -/*********************************************************************/ - -/*! \defgroup kcdb_buf Generic access to buffer - - Currently, credentials and identities both hold record data types. - This set of API's allow an application to access fields in the - records using a single interface. Note that credentials only - accept regular attributes while identities can hold both - attributes and properties. - - Handles to credentials and identities are implicitly also handles - to records. Thus they can be directly used as such. -*/ -/*@{*/ - -/*! \brief Get an attribute from a record by attribute id. - - \param[in] buffer The buffer that is to receive the attribute - value. Set this to NULL if only the required buffer size is - to be returned. - - \param[in,out] cbbuf The number of bytes available in \a buffer. - If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and - sets this to the required buffer size. - - \param[out] attr_type Receives the data type of the attribute. - Set this to NULL if the type is not required. - - \note Set both \a buffer and \a cbbuf to NULL if only the - existence of the attribute is to be checked. If the attribute - exists in this record then the function will return - KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_buf_get_attr(khm_handle record, - khm_int32 attr_id, - khm_int32 * attr_type, - void * buffer, - khm_size * pcb_buf); - -/*! \brief Get an attribute from a record by name. - - \param[in] buffer The buffer that is to receive the attribute - value. Set this to NULL if only the required buffer size is - to be returned. - - \param[in,out] cbbuf The number of bytes available in \a buffer. - If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and - sets this to the required buffer size. - - \note Set both \a buffer and \a cbbuf to NULL if only the - existence of the attribute is to be checked. If the attribute - exists in this record then the function will return - KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_buf_get_attrib(khm_handle record, - wchar_t * attr_name, - khm_int32 * attr_type, - void * buffer, - khm_size * pcb_buf); - -/*! \brief Get the string representation of a record attribute. - - A shortcut function which generates the string representation of a - record attribute directly. - - \param[in] record A handle to a record - - \param[in] attr_id The attribute to retrieve - - \param[out] buffer A pointer to a string buffer which receives the - string form of the attribute. Set this to NULL if you only - want to determine the size of the required buffer. - - \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, - holds the size of the buffer pointed to by \a buffer, and on - exit, receives the actual number of bytes that were copied. - - \param[in] flags Flags for the string conversion. Can be set to - one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is - KCDB_TS_LONG. - - \retval KHM_ERROR_SUCCESS Success - \retval KHM_ERROR_NOT_FOUND The given attribute was either invalid - or was not defined for this record - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_TOO_LONG Either \a buffer was NULL or the - supplied buffer was insufficient -*/ -KHMEXP khm_int32 KHMAPI -kcdb_buf_get_attr_string(khm_handle record, - khm_int32 attr_id, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags); - -/*! \brief Get the string representation of a record attribute by name. - - A shortcut function which generates the string representation of a - record attribute directly. - - \param[in] record A handle to a record - - \param[in] attrib The name of the attribute to retrieve - - \param[out] buffer A pointer to a string buffer which receives the - string form of the attribute. Set this to NULL if you only - want to determine the size of the required buffer. - - \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, - holds the size of the buffer pointed to by \a buffer, and on - exit, receives the actual number of bytes that were copied. - - \param[in] flags Flags for the string conversion. Can be set to - one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is - KCDB_TS_LONG. - - \see kcdb_cred_get_attr_string() -*/ -KHMEXP khm_int32 KHMAPI -kcdb_buf_get_attrib_string(khm_handle record, - wchar_t * attr_name, - wchar_t * buffer, - khm_size * pcbbuf, - khm_int32 flags); - -/*! \brief Set an attribute in a record by attribute id - - \param[in] cbbuf Number of bytes of data in \a buffer. The - individual data type handlers may copy in less than this many - bytes in to the record. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_buf_set_attr(khm_handle record, - khm_int32 attr_id, - void * buffer, - khm_size cbbuf); - -/*! \brief Set an attribute in a record by name - - \param[in] cbbuf Number of bytes of data in \a buffer. The - individual data type handlers may copy in less than this many - bytes in to the record. -*/ -KHMEXP khm_int32 KHMAPI -kcdb_buf_set_attrib(khm_handle record, - wchar_t * attr_name, - void * buffer, - khm_size cbbuf); - -KHMEXP khm_int32 KHMAPI -kcdb_buf_hold(khm_handle record); - -KHMEXP khm_int32 KHMAPI -kcdb_buf_release(khm_handle record); - -/*@}*/ - -/********************************************************************/ - -/* Notification operation constants */ - -#define KCDB_OP_INSERT 1 -#define KCDB_OP_DELETE 2 -#define KCDB_OP_MODIFY 3 -#define KCDB_OP_ACTIVATE 4 -#define KCDB_OP_DEACTIVATE 5 -#define KCDB_OP_HIDE 6 -#define KCDB_OP_UNHIDE 7 -#define KCDB_OP_SETSEARCH 8 -#define KCDB_OP_UNSETSEARCH 9 -#define KCDB_OP_NEW_DEFAULT 10 - -/*@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCREDDB_H__ +#define __KHIMAIRA_KCREDDB_H__ + +#include +#include + + +/*! \defgroup kcdb NetIDMgr Credentials Database */ +/*@{*/ + +/*! \brief Maximum length in characters of short description + + The length includes the terminating \a NULL character. + */ +#define KCDB_MAXCCH_SHORT_DESC 256 + +/*! \brief Maximum length in bytes of short description + + The length includes the terminating \a NULL character. + */ +#define KCDB_MAXCB_SHORT_DESC (sizeof(wchar_t) * KCDB_MAXCCH_SHORT_DESC) + +/*! \brief Maximum length in characters of long description + + The length includes the terminating \a NULL character. + */ +#define KCDB_MAXCCH_LONG_DESC 8192 + +/*! \brief Maximum length in characters of long description + + The length includes the terminating \a NULL character. + */ +#define KCDB_MAXCB_LONG_DESC (sizeof(wchar_t) * KCDB_MAXCCH_LONG_DESC) + +/*! \brief Maximum length in characters of name + + The length includes the terminating \a NULL character. + */ +#define KCDB_MAXCCH_NAME 256 + +/*! \brief Maximum length in bytes of short description + + The length includes the terminating \a NULL character. + */ +#define KCDB_MAXCB_NAME (sizeof(wchar_t) * KCDB_MAXCCH_NAME) + +/*! \brief Automatically determine the number of bytes required + + Can be used in most places where a count of bytes is required. + For many objects, the number of bytes that are required can be + determined through context and may be ommited. In such cases you + can use the \a KCDB_CBSIZE_AUTO value to specify that the function + is to determine the size automatically. + + \note Not all functions that take a count of bytes support the \a + KCDB_CBSIZE_AUTO value. +*/ +#define KCDB_CBSIZE_AUTO (-1) + +/*! +\defgroup kcdb_ident Identities + +Functions, macros etc. for manipulating identities. +*/ + +/*@{*/ + +/*! \brief The maximum number of characters (including terminator) that can + be specified as an identity name */ +#define KCDB_IDENT_MAXCCH_NAME 256 + +/*! \brief The maximum number of bytes that can be specified as an identity + name */ +#define KCDB_IDENT_MAXCB_NAME (sizeof(wchar_t) * KCDB_IDENT_MAXCCH_NAME) + +/*! \brief Valid characters in an identity name */ +#define KCDB_IDENT_VALID_CHARS L"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._@-/" + +/*! +\name Flags for identities */ +/*@{*/ + +/*! \brief Create the identity if it doesn't already exist. + \note Only to be used with kcdb_identity_create() */ +#define KCDB_IDENT_FLAG_CREATE 0x10000000L + +/*! \brief Has configuration information + + Indicates that the identity has persistent configuration + information associated with it. + */ +#define KCDB_IDENT_FLAG_CONFIG 0x00800000L + +/*! \brief Marks the identity as active. + + An active identity is one that is in active use within NetIDMgr. + + \note This flag is readonly and cannot be specified when creating + or modifying an identity. Once an identity is deleted, it will + no longer have this flag. */ +#define KCDB_IDENT_FLAG_ACTIVE 0x02000000L + + +/*! \brief The identity has custom attributes assigned + */ +#define KCDB_IDENT_FLAG_ATTRIBS 0x08000000L + +/*! \brief This is the default identity. + + At most one identity will have this flag set at any given time. + To set or reset the flag, use kcdb_identity_set_default() */ +#define KCDB_IDENT_FLAG_DEFAULT 0x00000001L + +/*! \brief This identity can be searched. + + The meaning of this flag is left to be interpreted by individual + plugins. */ +#define KCDB_IDENT_FLAG_SEARCHABLE 0x00000002L + +/*! \brief Hidden identity. + + The identity will not show up in the identity list window. Once + the hidden is switched off, the identity (and all associated + credentials) will re-appear in the window */ +#define KCDB_IDENT_FLAG_HIDDEN 0x00000004L + +/*! \brief Invalid identity + + For one reason or another, this identity is invalid. This flag + can be set by an identity provider to indicate that this identity + does not correspond to an actual identity because an external + entity (such as a KDC) has denied it's existence. + + The absence of this flag does not imply that the identity is + valid. The ::KCDB_IDENT_FLAG_VALID bit must be set for that to be + the case. If neither flag is set, then the status of the identity + is not known. +*/ +#define KCDB_IDENT_FLAG_INVALID 0x00000008L + +/*! \brief Valid identity + + The identity has been validated through an external entity, or + it's validity implied through the existence of credentials for the + identity. + + The absence of this flag does not imply that the identity is + invalid. The ::KCDB_IDENT_FLAG_INVALID bit must be set for that + to be the case. If neither flag is set, then the status of the + identity is not known. + */ +#define KCDB_IDENT_FLAG_VALID 0x00000010L + +/*! \brief Expired identity + + This identity has expired and can not be actively used to obtain + credentials. This determination is made based on the input of + some external entity. This flag may only be set by an identity + provider. +*/ +#define KCDB_IDENT_FLAG_EXPIRED 0x00000020L + +/*! \brief Empty identity + + The identity does not have actual credentials associated with it. + */ +#define KCDB_IDENT_FLAG_EMPTY 0x00000040L + +/*! \brief Renewable identity + + The initial credentials associated with this identity are + renewable. Thus making the whole identity renewable. + */ +#define KCDB_IDENT_FLAG_RENEWABLE 0x00000080L + +/*! \brief Required user interaction + + The identity is in a state which requires user interaction to + activate. Currently, the identity may not be in a state where it + can be used to obtain credentials. + + A typical example of this is when the primary password for an + identity has expired. + */ +#define KCDB_IDENT_FLAG_INTERACT 0x00000100L + +/*! \brief Has expired credentials + + The identity has expired credentials associated with it. + */ +#define KCDB_IDENT_FLAG_CRED_EXP 0x00000200L + +/*! \brief Has renewable credentials + + The identity has renewable credentials associated with it. If the + initial credentials of the identity are renewable, then identity + is renewable. Hence the ::KCDB_IDENT_FLAG_RENEWABLE should also + be set. + */ +#define KCDB_IDENT_FLAG_CRED_RENEW 0x00000400L + +/*! \brief Sticky identity + + Sticky identities are identities that are always visible in the + credentials display even if no credentials are associated with it. + */ +#define KCDB_IDENT_FLAG_STICKY 0x00000800L + +/*! \brief Read/write flags mask. + + A bitmask that correspond to all the read/write flags in the mask. +*/ +#define KCDB_IDENT_FLAGMASK_RDWR 0x00000fffL + +/*@}*/ + +/*! \name Identity Provider Data Structures +@{*/ + +/*! \brief Name transfer structure + + Used when the KCDB is communicating with the identity provider to + exchange string names of identities. See individual ::KMSG_IDENT + message subtypes for the usage of this structure. + */ +typedef struct tag_kcdb_ident_name_xfer { + const wchar_t * name_src; /*!< An identity name. Does not + exceed KCDB_IDENT_MAXCCH_NAME + characters including terminating + NULL. */ + const wchar_t * name_alt; /*!< An identity name. Does not + exceed KCDB_IDENT_MAXCCH_NAME + characters including terminating + NULL. */ + wchar_t * name_dest; /*!< Pointer to a buffer that is to + receive a response string. The + size of the buffer in bytes is + specified in \a cb_name_dest. */ + khm_size cb_name_dest; /*!< Size of buffer pointed to by \a + name_dest in bytes. */ + khm_int32 result; /*!< Receives a result value, which is + usually an error code defined in + kherror.h, though it is not + always. */ +} kcdb_ident_name_xfer; + +typedef struct tag_kcdb_ident_info { + khm_handle identity; + khm_int32 fields; + + FILETIME expiration; +} kcdb_ident_info; + +/*@}*/ + +/*! \name Identity provider interface functions + + These functions encapsulate safe calls to the current identity + provider. While these functions are exported, applications should + not call these functions directly. They are provided for use by + the NetIDMgr core application. +@{*/ + +/*! \brief Validate an identity name + + The name that is provided will be passed through sets of + validations. One set, which doesn't depend on the identity + provider checks whether the length of the identity name and + whether there are any invalid characters in the identity name. If + the name passes those tests, then the name is passed down to the + identity provider's name validation handler. + + \retval KHM_ERROR_SUCCESS The name is valid + \retval KHM_ERROR_TOO_LONG Too many characters in name + \retval KHM_ERROR_INVALID_NAME There were invalid characters in the name. + \retval KHM_ERROR_NO_PROVIDER There is no identity provider; + however the name passed the length and character tests. + \retval KHM_ERROR_NOT_IMPLEMENTED The identity provider doesn't + implement a name validation handler; however the name passed + the length and character tests. + + \see ::KMSG_IDENT_VALIDATE_NAME + */ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_validate_name(const wchar_t * name); + +/*! \brief Validate an identity + + The identity itself needs to be validated. This may involve + communicating with an external entity. + + \see ::KMSG_IDENT_VALIDATE_IDENTITY + */ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_validate_identity(khm_handle identity); + +/*! \brief Canonicalize the name + + + \see ::KMSG_IDENT_CANON_NAME +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_canon_name(const wchar_t * name_in, + wchar_t * name_out, + khm_size * cb_name_out); + +/*! \brief Compare two identity names + + \see ::KMSG_IDENT_COMPARE_NAME +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_compare_name(const wchar_t * name1, + const wchar_t * name2); + +/*! \brief Set the specified identity as the default + + \see ::KMSG_IDENT_SET_DEFAULT +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_set_default(khm_handle identity); + +/*! \brief Set the specified identity as searchable + + \see ::KMSG_IDENT_SET_SEARCHABLE +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_set_searchable(khm_handle identity, + khm_boolean searchable); + +/*! \brief Update the specified identity + + \see ::KMSG_IDENT_UPDATE +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_update(khm_handle identity); + +/*! \brief Obtain the UI callback + + \a rock is actually a pointer to a ::khui_ident_new_creds_cb which + is to receive the callback. + + \see ::KMSG_IDENT_GET_UI_CALLBACK + */ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_get_ui_cb(void * rock); + +/*! \brief Notify an identity provider of the creation of a new identity + + \see ::KMSG_IDENT_NOTIFY_CREATE +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identpro_notify_create(khm_handle identity); + +/*@}*/ + +/*! \brief Check if the given name is a valid identity name + + \return TRUE or FALSE to the question, is this valid? +*/ +KHMEXP khm_boolean KHMAPI +kcdb_identity_is_valid_name(const wchar_t * name); + +/*! \brief Create or open an identity. + + If the KCDB_IDENT_FLAG_CREATE flag is specified in the flags + parameter a new identity will be created if one does not already + exist with the given name. If an identity by that name already + exists, then the existing identity will be opened. The result + parameter will receive a held reference to the opened identity. + Use kcdb_identity_release() to release the handle. + + \param[in] name Name of identity to create + \param[in] flags If KCDB_IDENT_FLAG_CREATE is specified, then the + identity will be created if it doesn't already exist. + Additional flags can be set here which will be assigned to the + identity if it is created. Additional flags have no effect if + an existing identity is opened. + \param[out] result If the call is successful, this receives a held + reference to the identity. The caller should call + kcdb_identity_release() to release the identity once it is no + longer needed. + */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_create(const wchar_t *name, + khm_int32 flags, + khm_handle * result); + +/*! \brief Mark an identity for deletion. + + The identity will be marked for deletion. The + KCDB_IDENT_FLAG_ACTIVE will no longer be present for this + identity. Once all references to the identity are released, it + will be removed from memory. All associated credentials will also + be removed. */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_delete(khm_handle id); + +/*! \brief Set or unset the specified flags in the specified identity. + + Only flags that are in KCDB_IDENT_FLAGMASK_RDWR can be specifed in + the \a flags parameter or the \a mask parameter. The flags set in + the \a mask parameter of the identity will be set to the + corresponding values in the \a flags parameter. + + If ::KCDB_IDENT_FLAG_INVALID is set using this function, then the + ::KCDB_IDENT_FLAG_VALID will be automatically reset, and vice + versa. Resetting either bit does not undo this change, and will + leave the identity's validity unspecified. + + Note that setting or resetting certain flags have other semantic + side-effects: + + - ::KCDB_IDENT_FLAG_DEFAULT : Setting this is equivalent to + calling kcdb_identity_set_default() with \a id. Resetting this + is equivalent to calling kcdb_identity_set_default() with NULL. + + - ::KCDB_IDENT_FLAG_SEARCHABLE : Setting this will result in the + identity provider getting notified of the change. If the + identity provider indicates that searchable flag should not be + set or reset on the identity, then kcdb_identity_set_flags() + will return an error. + + \note kcdb_identity_set_flags() is not atomic. Even if the + function returns a failure code, some flags in the identity may + have been set. When calling kcdb_identity_set_flags() always + check the flags in the identity using kcdb_identity_get_flags() to + check which flags have been set and which have failed. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_flags(khm_handle id, + khm_int32 flags, + khm_int32 mask); + +/*! \brief Return all the flags for the identity + + The returned flags may include internal flags. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_flags(khm_handle id, + khm_int32 * flags); + +/*! \brief Return the name of the identity + + \param[out] buffer Buffer to copy the identity name into. The + maximum size of an identity name is \a KCDB_IDENT_MAXCB_NAME. + If \a buffer is \a NULL, then the required size of the buffer + is returned in \a pcbsize. + + \param[in,out] pcbsize Size of buffer in bytes. */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_name(khm_handle id, + wchar_t * buffer, + khm_size * pcbsize); + +/*! \brief Set the specified identity as the default. + + Specifying NULL effectively makes none of the identities the + default. + + \see kcdb_identity_set_flags() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_default(khm_handle id); + +/*! \brief Mark the specified identity as the default. + + This API is reserved for use by identity providers as a means of + specifying which identity is default. The difference between + kcdb_identity_set_default() and kcdb_identity_set_default_int() is + in semantics. + + - kcdb_identity_set_default() is used to request the KCDB to + designate the specified identity as the default. When + processing the request, the KCDB invokes the identity provider + to do the necessary work to make the identity the default. + + - kcdb_identity_set_default_int() is used by the identity provider + to notify the KCDB that the specified identity is the default. + This does not result in the invocation of any other semantics to + make the identity the default other than releasing the previous + defualt identity and making the specified one the default. As + an additional side effect, the notification <::KMSG_KCDB, + ::KMSG_KCDB_IDENT, ::KCDB_OP_NEW_DEFAULT> will also not be sent. + */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_default_int(khm_handle id); + +/*! \brief Get the default identity + + Obtain a held handle to the default identity if there is one. The + handle must be freed using kcdb_identity_release(). + + If there is no default identity, then the handle pointed to by \a + pvid is set to \a NULL and the function returns + KHM_ERROR_NOT_FOUND. */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_default(khm_handle * pvid); + +/*! \brief Get the configuration space for the identity. + + If the configuration space for the identity does not exist and the + flags parameter does not specify ::KHM_FLAG_CREATE, then the + function will return a failure code as specified in + ::khc_open_space(). Depending on whether or not a configuration + space was found, the ::KCDB_IDENT_FLAG_CONFIG flag will be set or + reset for the identity. + + \param[in] id Identity for which the configuraiton space is requested + + \param[in] flags Flags used when calling khc_open_space(). If \a + flags specifies KHM_FLAG_CREATE, then the configuration space + is created. + + \param[out] result The resulting handle. If the call is + successful, this receives a handle to the configuration space. + Use khc_close_space() to close the handle. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_config(khm_handle id, + khm_int32 flags, + khm_handle * result); + +/*! \brief Hold a reference to an identity. + + A reference to an identity (a handle) is only valid while it is + held. \note Once the handle is released, it can not be + revalidated by calling kcdb_identity_hold(). Doing so would lead + to unpredictable consequences. */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_hold(khm_handle id); + +/*! \brief Release a reference to an identity. + \see kcdb_identity_hold() */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_release(khm_handle id); + +/*! \brief Set the identity provider subscription + + If there was a previous subscription, that subscription will be + automatically deleted. + + \param[in] sub New identity provider subscription +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_provider(khm_handle sub); + +/*! \brief Set the primary credentials type + + The primary credentials type is designated by the identity + provider. As such, this function should only be called by an + identity provider. + */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_type(khm_int32 cred_type); + +/*! \brief Retrieve the identity provider subscription + + \param[out] sub Receives the current identity provider + subscription. Set to NULL if only the existence of an + identity provider needs to be checked. + + \retval KHM_ERROR_SUCCESS An identity provider exists. If \a sub + was not NULL, the subscription has been copied there. + + \retval KHM_ERROR_NOT_FOUND There is currently no registered + identity provider. If \a sub was not NULL, the handle it + points to has been set to NULL. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_provider(khm_handle * sub); + +/*! \brief Retrieve the identity provider credentials type + + This is the credentials type that the identity provider has + designated as the primary credentials type. + */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_type(khm_int32 * ptype); + +/*! \brief Returns TRUE if the two identities are equal + + Also returns TRUE if both identities are NULL. + */ +KHMEXP khm_boolean KHMAPI +kcdb_identity_is_equal(khm_handle identity1, + khm_handle identity2); + +/*! \brief Set an attribute in an identity by attribute id + + \param[in] buffer A pointer to a buffer containing the data to + assign to the attribute. Setting \a buffer to NULL has the + effect of removing any data that is already assigned to the + attribute. If \a buffer is non-NULL, then \a cbbuf should + specify the number of bytes in \a buffer. + + \param[in] cbbuf Number of bytes of data in \a buffer. The + individual data type handlers may copy in less than this many + bytes in to the credential. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_attr(khm_handle identity, + khm_int32 attr_id, + void * buffer, + khm_size cbbuf); + +/*! \brief Set an attribute in an identity by name + + The attribute name has to be a KCDB registered attribute or + property. + + \param[in] cbbuf Number of bytes of data in \a buffer. The + individual data type handlers may copy in less than this many + bytes in to the credential. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_set_attrib(khm_handle identity, + wchar_t * attr_name, + void * buffer, + khm_size cbbuf); + +/*! \brief Get an attribute from an identity by attribute id. + + \param[in] buffer The buffer that is to receive the attribute + value. Set this to NULL if only the required buffer size is + to be returned. + + \param[in,out] cbbuf The number of bytes available in \a buffer. + If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and + sets this to the required buffer size. + + \param[out] attr_type Receives the data type of the attribute. + Set this to NULL if the type is not required. + + \note Set both \a buffer and \a cbbuf to NULL if only the + existence of the attribute is to be checked. If the attribute + exists in this identity then the function will return + KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attr(khm_handle identity, + khm_int32 attr_id, + khm_int32 * attr_type, + void * buffer, + khm_size * pcbbuf); + +/*! \brief Get an attribute from an identity by name. + + \param[in] buffer The buffer that is to receive the attribute + value. Set this to NULL if only the required buffer size is + to be returned. + + \param[in,out] cbbuf The number of bytes available in \a buffer. + If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and + sets this to the required buffer size. + + \note Set both \a buffer and \a cbbuf to NULL if only the + existence of the attribute is to be checked. If the attribute + exists in this identity then the function will return + KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attrib(khm_handle identity, + wchar_t * attr_name, + khm_int32 * attr_type, + void * buffer, + khm_size * pcbbuf); + +/*! \brief Get the string representation of an identity attribute. + + A shortcut function which generates the string representation of + an identity attribute directly. + + \param[in] identity A handle to an identity + + \param[in] attr_id The attribute to retrieve + + \param[out] buffer A pointer to a string buffer which receives the + string form of the attribute. Set this to NULL if you only + want to determine the size of the required buffer. + + \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, + holds the size of the buffer pointed to by \a buffer, and on + exit, receives the actual number of bytes that were copied. + + \param[in] flags Flags for the string conversion. Can be set to + one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is + KCDB_TS_LONG. + + \retval KHM_ERROR_SUCCESS Success + \retval KHM_ERROR_NOT_FOUND The given attribute was either invalid + or was not defined for this identity + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_TOO_LONG Either \a buffer was NULL or the + supplied buffer was insufficient +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attr_string(khm_handle identity, + khm_int32 attr_id, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags); + +/*! \brief Get the string representation of an identity attribute by name. + + A shortcut function which generates the string representation of + an identity attribute directly. + + \param[in] identity A handle to an identity + + \param[in] attrib The name of the attribute to retrieve + + \param[out] buffer A pointer to a string buffer which receives the + string form of the attribute. Set this to NULL if you only + want to determine the size of the required buffer. + + \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, + holds the size of the buffer pointed to by \a buffer, and on + exit, receives the actual number of bytes that were copied. + + \param[in] flags Flags for the string conversion. Can be set to + one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is + KCDB_TS_LONG. + + \see kcdb_identity_get_attr_string() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_identity_get_attrib_string(khm_handle identity, + wchar_t * attr_name, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags); + +/*! \brief Enumerate identities + + Enumerates all the active identities that match the criteria + specified using \a and_flags and \a eq_flags. The condition is + applied to all active identities as follows: + + \code + (identity->flags & and_flags) == (eq_flags & and_flags) + \endcode + + Essentially, if a flag is set in \a and_flags, then that flag in + the identity should equal the setting in \a eq_flags. + + \param[in] and_flags See above + + \param[in] eq_flags See above + + \param[out] name_buf Buffer to receive the list of identity names. + Can be NULL if only the required size of the buffer or the + number of matching identities is required. The list is + returned as a multi string. + + \param[in,out] pcb_buf Number of bytes in buffer pointed to by \a + name_buf on entry. On exit, will receive the number of bytes + copied. Can be NULL only if \a name_buf is also NULL. If \a + name_buf is NULL or if \a pcb_buf indicates that the buffer is + insufficient, this will receive the number of bytes required + and the return value of the function will be + KHM_ERROR_TOO_LONG + + \param[out] pn_idents Receives the number of identities that match + the given criteria. + + \retval KHM_ERROR_SUCCESS If \a name_buf was valid, the buffer now + contains a multi string of identities that matched. If \a + pn_idents was valid, it contains the number of identities + matched. + + \retval KHM_ERROR_TOO_LONG No buffer was supplied or the supplied + buffer was insufficient. If \a pn_idents was valid, it + contains the number of identities. + + \retval KHM_ERROR_INVALID_PARAM None of the parameters \a name_buf, + \a pcb_buf and \a pn_idents were supplied, or \a pcb_buf was + NULL when \a name_buf was not. + + \note Calling this function to obtain the required size of the + buffer and then calling it with a that sized buffer is not + guaranteed to work since the list of identities may change + between the two calls. + */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_enum(khm_int32 and_flags, + khm_int32 eq_flags, + wchar_t * name_buf, + khm_size * pcb_buf, + khm_size * pn_idents); + +/*! \brief Refresh identity attributes based on root credential set + + Several flags in an identity are dependent on the credentials that + are associated with it in the root credential set. In addition, + other flags in an identity depend on external factors that need to + be verfied once in a while. This API goes through the root + credential set as well as consulting the identity provider to + update an identity. + + \see kcdb_identity_refresh() + */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_refresh(khm_handle vid); + +/*! \brief Refresh all identities + + Equivalent to calling kcdb_identity_refresh() for all active + identities. + + \see kcdb_identityt_refresh() + */ +KHMEXP khm_int32 KHMAPI +kcdb_identity_refresh_all(void); + +/* KSMG_KCDB_IDENT notifications are structured as follows: + type=KMSG_KCDB + subtype=KMSG_KCDB_IDENT + uparam=one of KCDB_OP_* + blob=handle to identity in question */ + +/*@}*/ + + +/*********************************************************************/ + + +/*! +\defgroup kcdb_creds Credential sets and individual credentials + +@{ +*/ + + +/*! \brief Credentials process function + + This function is called for each credential in a credential set + when supplied to kcdb_credset_apply(). It should return + KHM_ERROR_SUCCESS to continue the operation, or any other value to + terminate the processing. + + \see kcdb_credset_apply() +*/ +typedef khm_int32 +(KHMAPI *kcdb_cred_apply_func)(khm_handle cred, + void * rock); + +/*! \brief Credentials filter function. + + Should return non-zero if the credential passed as \a cred is to + be "accepted". The precise consequence of a non-zero return value + is determined by the individual function that this call back is + passed into. + + This function should not call any other function which may modify + \a cred. + + \see kcdb_credset_collect_filtered() + \see kcdb_credset_extract_filtered() +*/ +typedef khm_int32 +(KHMAPI *kcdb_cred_filter_func)(khm_handle cred, + khm_int32 flags, + void * rock); + +/*! \brief Credentials compare function. + + Asserts a weak ordering on the credentials that are passed in as + \a cred1 and \a cred2. It should return: + + - a negative value if \a cred1 < \a cred2 + - zero if \a cred1 == \a cred2 + - a postive value if \a cred1 > \a cred2 + \see kcdb_credset_sort() + \see ::kcdb_credtype +*/ +typedef khm_int32 +(KHMAPI *kcdb_cred_comp_func)(khm_handle cred1, + khm_handle cred2, + void * rock); + +/*! \defgroup kcdb_credset Credential sets */ +/*@{*/ + +/*! \brief Create a credential set. + + Credential sets are temporary containers for credentials. These + can be used by plug-ins to store credentials while they are being + enumerated from an external source. Once all the credentials have + been collected into the credential set, the plug-in may call + kcdb_credset_collect() to collect the credentials into the root + credential store. + + The user interface will only display credentials that are in the + root credential store. No notifications are generated for changes + to a non-root credential set. + + Use kcdb_credset_delete() to delete the credential set once it is + created. + + \see kcdb_credset_delete() + \see kcdb_credset_collect() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_create(khm_handle * result); + +/** \brief Delete a credential set + + \see kcdb_credset_create() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_delete(khm_handle credset); + +/** \brief Collect credentials from a credential set to another credential set. + + Collecting a subset of credentials from credential set \a cs_src + into credential set \a cs_dest involves the following steps: + + - Select all credentials from \a cs_src that matches the \a + identity and \a type specified in the function call and add them + to the \a cs_dest credential set if they are not there already. + Note that if neither credential set is not the root credential + store, then the credentials will be added by reference, while if + it is the root credential store, the credentials will be + duplicated, and the copies will be added to \a cs_dest. + + - If a selected credential in \a cs_src already exists in \a + cs_dest, then update the credential in \a cs_dest with the + credential fields in \a cs_src. In other words, once a + credential is found to exist in both \a cs_src and \a cs_dest, + all the non-null fields from the credential in \a cs_src will be + copied to the credential in \a cs_dest. Fields which are null + (undefined) in \a cs_src and are non-null in \a cs_dest will be + left unmodified in \a cs_dest. + + One notable exception is the credentials' flags. All flags in + \a cs_src which are not included in + ::KCDB_CRED_FLAGMASK_ADDITIVE will be copied to the + corresponding bits in the flags of \a cs_dest. However, flags + that are included in ::KCDB_CRED_FLAGMASK_ADDITIVE will be added + to the corresponding bits in \a cs_dest. + + (See notes below) + + - Remove all credentials from \a cs_dest that match the \a + identity and \a type that do not appear in \a cs_src. (see notes + below) + + For performance reasons, plugins should use kcdb_credset_collect() + to update the root credentials store instead of adding and + removing individual credentials from the root store. + + Only credentials that are associated with active identities are + affected by kcdb_credset_collect(). + + \param[in] cs_dest A handle to the destination credential set. If + this is \a NULL, then it is assumed to refer to the root + credential store. + + \param[in] cs_src A handle to the source credential set. If this + is NULL, then it is assumed to refer to the root credential + store. + + \param[in] identity A handle to an identity. Setting this to NULL + collects all identities in the credential set. + + \param[in] type A credentials type. Setting this to + KCDB_CREDTYPE_ALL collects all credential types in the set. + + \param[out] delta A bit mask that indicates the modifications that + were made to \a cs_dest as a result of the collect operation. + This is a combination of KCDB_DELTA_* values. This parameter + can be \a NULL if the value is not required. + + \warning If \a identity and \a type is set to a wildcard, all + credentials in the root store that are not in this credentials + set will be deleted. + + \note Two credentials \a A and \a B are considered equal if: + - They refer to the same identity + - Both have the same credential type + - Both have the same name + + \note This is the only supported way of modifying the root + credential store. + + \note \a cs_src and \a cs_dest can not refer to the same + credentials set. + + \note The destination credential set cannot be sealed. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_collect(khm_handle cs_dest, + khm_handle cs_src, + khm_handle identity, + khm_int32 type, + khm_int32 * delta); + +/*! \brief Credentials were added + \see kcdb_credset_collect() */ +#define KCDB_DELTA_ADD 1 + +/*! \brief Credentials were deleted + \see kcdb_credset_collect() */ +#define KCDB_DELTA_DEL 2 + +/*! \brief Credentials were modified + \see kcdb_credset_collect() */ +#define KCDB_DELTA_MODIFY 4 + +/*! \brief Indicates that the credential to be filtered is from the root store. + + \see kcdb_credset_collect_filtered() +*/ +#define KCDB_CREDCOLL_FILTER_ROOT 1 + +/*! \brief Indicates that the credential to be filtered is from the source + credential set + + \see kcdb_credset_collect_filtered() */ +#define KCDB_CREDCOLL_FILTER_SRC 2 + +/*! \brief Indicates that the credential to be filtered is from the destination + credential set + + \see kcdb_credset_collect_filtered() */ +#define KCDB_CREDCOLL_FILTER_DEST 4 + +/*! \brief Collect credentials from one credential set to another using a filter. + + Similar to kcdb_credset_collect() except instead of selecting + credentials by matching against an identity and/or type, a filter + function is called. If the filter function returns non-zero for a + credential, that credential is selected. + + Credentials in the source and destination credential sets are + passed into the filter function. Depending on whether the + credential is in the source credential set or destination + credential set, the \a flag parameter may have either \a + KCDB_CREDCOLL_FILTER_SRC or \a KCDB_CREDCOLL_FILTER_DEST bits set. + Also, if either one of the credential sets is the root credential + store, then additionally \a KCDB_CREDCOLL_FILTER_ROOT would also + be set. + + See the kcdb_credset_collect() documentation for explanations of + the \a cs_src, \a cs_dest and \a delta parameters which perform + identical functions. + + \param[in] filter The filter of type ::kcdb_cred_filter_func + \param[in] rock A custom argument to be passed to the filter function. + + \see kcdb_credset_collect() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_collect_filtered(khm_handle cs_dest, + khm_handle cs_src, + kcdb_cred_filter_func filter, + void * rock, + khm_int32 * delta); + +/*! \brief Flush all credentials from a credential set + + Deletes all the crednetials from the credential set. + + \param[in] credset A handle to a credential set. Cannot be NULL. + + \note The credential set cannot be sealed +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_flush(khm_handle credset); + +/*! \brief Extract credentials from one credential set to another + + Credentials from the source credential set are selected based on + the \a identity and \a type arguements. If a credential is + matched, then it is added to the \a destcredset. + + If the \a sourcecredset is the root credential set, the added + credentials are copies of the actual credentials in the root + credential set. Otherwise the credentials are references to the + original credentials in the \a sourcecredset . + + \param[in] destcredset Destination credential set. Must be valid. + + \param[in] sourcecredset The source credential set. If set to + NULL, extracts from the root credential set. + + \param[in] identity The identity to match in the source credential + set. If set to NULL, matches all identities. + + \param[in] type The credential type to match in the source credential set. + If set to KCDB_CREDTYPE_INVALID, matches all types. + + \note This function does not check for duplicate credentials. + + \note The destination credential set cannot be sealed. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_extract(khm_handle destcredset, + khm_handle sourcecredset, + khm_handle identity, + khm_int32 type); + +/*! \brief Extract credentials from one credential set to another using a filter. + + Similar to kcdb_credset_extract() except a filter function is used + to determine which credentials should be selected. + + \param[in] rock A custom argument to be passed in to the filter function. + + \note The destination credential set cannot be sealed. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_extract_filtered(khm_handle destcredset, + khm_handle sourcecredset, + kcdb_cred_filter_func filter, + void * rock); + +/*! \brief Retrieve a held reference to a credential in a credential set based on index. + + \param[in] idx The index of the credential to retrieve. This is a + zero based index which goes from 0 ... (size of credset - 1). + + \param[out] cred The held reference to a credential. Call + kcdb_cred_release() to release the credential. + + \retval KHM_ERROR_SUCCESS Success. \a cred has a held reference to the credential. + \retval KHM_ERROR_OUT_OF_BOUNDS The index specified in \a idx is out of bounds. + \retval KHM_ERROR_DELETED The credential at index \a idx has been marked as deleted. + + \see kcdb_cred_release() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_get_cred(khm_handle credset, + khm_int32 idx, + khm_handle * cred); + +/*! \brief Search a credential set for a specific credential + + The credential set indicated by \a credset is searched for a + credential that satisfies the predicate function \a f. Each + credential starting at \a idx_start is passed into the predicate + function until it returns a non-zero value. At this point, that + credential is passed in to the \a cred parameter, and the index of + the credential is passed into the \a idx parameter. + + \param[in] credset The credential set to search on. Specify NULL + if you want to search teh root credential set. + + \param[in] idx_start The index at which to start the search after. + The first credential passed to the predicate function will be + at \a idx_start + 1. Specify -1 to start from the beginning + of the credential set. + + \param[in] f The predicate function. The \a flags parameter of + the predicate function will always receive 0. + + \param[in] rock An opaque parameter to be passed to the predicate + function \a f. + + \param[out] cred A held reference to the credential that satisfied + the predicate function or NULL if no such credential was + found. Note that if a valid credential is returned, the + calling function must release the credential using + kcdb_cred_release(). + + \param[out] idx The index of the credential passed in \a cred. + Specify NULL if the index is not required. + + \retval KHM_ERROR_SUCCESS A credential that satisfied the + predicate function was found and was assigned to \a cred. + + \retval KHM_ERROR_NOT_FOUND No credential was found that matched + the predicate function. + + \note When querying credential sets that are shared between + threads, it is possible that another thread modifies the + credential set between successive calls to + kcdb_credset_find_filtered(). Therefore a continued sequences of + searches are not guaranteed to exhastively cover the + credential set nor to not return duplicate matches. Duplicate + matches are possible if the order of the credentials in the + set was changed. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_find_filtered(khm_handle credset, + khm_int32 idx_start, + kcdb_cred_filter_func f, + void * rock, + khm_handle * cred, + khm_int32 * idx); + +/*! \brief Find matching credential + + Searches a credential set for a credential that matches the + specified credential. For a credential to be a match, it must + have the same identity, credential type and name. + + \param[in] credset Credential set to search + + \param[in] cred_src Credetial to search on + + \param[out] cred_dest receieves the matching credential if the + search is successful. If a handle is returend, the + kcdb_cred_release() must be used to release the handle. If + the matching credential is not required, you can pass in NULL. + + \retval KHM_ERROR_SUCCESS The search was successful. A credential + was assigned to \a cred_dest + + \retval KHM_ERROR_NOT_FOUND A matching credential was not found. + */ +KHMEXP khm_int32 KHMAPI +kcdb_credset_find_cred(khm_handle credset, + khm_handle cred_src, + khm_handle *cred_dest); + + +/*! \brief Delete a credential from a credential set. + + The credential at index \a idx will be deleted. All the + credentials that are at indices \a idx + 1 and above will be moved + down to fill the gap and the size of the credential set will + decrease by one. + + Use kcdb_credset_del_cred_ref() to delete a credential by + reference. Using kcdb_credset_del_cred() is faster than + kcdb_credset_del_cred_ref(). + + If you call kcdb_credset_del_cred() or kcdb_credset_del_cred_ref() + from within kcdb_credset_apply(), the credential will only be + marked as deleted. They will not be removed. This means that the + size of the credential set will not decrease. To purge the + deleted credentials from the set, call kcdb_credset_purge() after + kcdb_credset_apply() completes. + + \note The credential set cannot be sealed. + + \see kcdb_credset_del_cred_ref() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_del_cred(khm_handle credset, + khm_int32 idx); + +/*! \brief Delete a credential from a credential set by reference. + + See kcdb_credset_del_cred() for description of what happens when a + credential is deleted from a credential set. + + \note The credential set cannot be sealed. + + \see kcdb_credset_del_cred() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_del_cred_ref(khm_handle credset, + khm_handle cred); + +/*! \brief Add a credential to a credential set. + + The credential is added by reference. In other words, no copy of + the credential is made. + + \param[in] idx Index of the new credential. This must be a value + in the range 0..(previous size of credential set) or -1. If + -1 is specifed, then the credential is appended at the end of + the set. + + \note The credential set cannot be sealed. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_add_cred(khm_handle credset, + khm_handle cred, + khm_int32 idx); + +/*! \brief Get the number of credentials in a credential set. + + Credentials in a credential set may be volatile. When + kcdb_credeset_get_size() is called, the credential set is + compacted to only include credentials that are active at the time. + However, when you are iterating through the credential set, it + might be the case that some credentials would get marked as + deleted. These credentials will remain in the credential set + until the credential set is discarded or another call to + kcdb_credset_get_size() or kdcb_credset_purge() is made. + + If the credential set is sealed, then it will not be compacted and + will include deleted credentials as well. + + \see kcdb_credset_purge() + \see kcdb_credset_get_cred() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_get_size(khm_handle credset, + khm_size * size); + +/*! \brief Removes credentials that have been marked as deleted from a credential set. + + See description of \a kcdb_credset_purge() for a description of + what happens when credntials that are contained in a credential + set are deleted by an external entity. + + \note The credential set cannot be sealed. + + \see kcdb_credset_get_size() + \see kcdb_credset_get_cred() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_purge(khm_handle credset); + +/*! \brief Applies a function to all the credentials in a credentials set + + The given function is called for each credential in a credential + set. With each iteration, the function is called with a handle to + the credential and the user defined parameter \a rock. If the + function returns anything other than KHM_ERROR_SUCCESS, the + processing stops. + + \param[in] credset The credential set to apply the function to, or + NULL if you want to apply this to the root credential set. + + \param[in] f Function to call for each credential + + \param[in] rock An opaque parameter which is to be passed to 'f' + as the second argument. + + \retval KHM_ERROR_SUCCESS All the credentials were processed. + + \retval KHM_ERROR_EXIT The supplied function signalled the + processing to be aborted. + + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_apply(khm_handle credset, + kcdb_cred_apply_func f, + void * rock); + +/*! \brief Sort the contents of a credential set. + + \param[in] rock A custom argument to be passed in to the \a comp function. + + \note The credential set cannot be sealed. + + \see kcdb_cred_comp_generic() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credset_sort(khm_handle credset, + kcdb_cred_comp_func comp, + void * rock); + +/*! \brief Seal a credential set + + Sealing a credential set makes it read-only. To unseal a + credential set, call kcdb_credset_unseal(). + + Sealing is an additive operation. kcdb_credset_seal() can be + called muliple times. However, for every call to + kcdb_credset_seal() a call to kcdb_credset_unseal() must be made + to undo the seal. The credential set will become unsealed when + all the seals are released. + + Once sealed, the credential set will not allow any operation that + might change its contents. However, a selaed credential set can + still be delted. + + \see kcdb_credset_unseal() + */ +KHMEXP khm_int32 KHMAPI +kcdb_credset_seal(khm_handle credset); + +/*! \brief Unseal a credential set + + Undoes what kcdb_credset_seal() did. This does not guarantee that + the credential set is unsealed since there may be other seals. + + \see kcdb_credset_seal() + */ +KHMEXP khm_int32 KHMAPI +kcdb_credset_unseal(khm_handle credset); + +/*! \brief Defines a sort criterion for kcdb_cred_comp_generic() + + \see kcdb_cred_comp_generic() +*/ +typedef struct tag_kcdb_cred_comp_field { + khm_int32 attrib; /*!< a valid attribute ID */ + khm_int32 order; /*!< one of KCDB_CRED_COMP_INCREASING or + KCDB_CRED_COMP_DECREASING. Optionally, + KCDB_CRED_COMP_INITIAL_FIRST may be combined + with either. */ +} kcdb_cred_comp_field; + +/*! \brief Defines the sort order for a field in ::kcdb_cred_comp_field + + Sorts lexicographically ascending by string representation of field. +*/ +#define KCDB_CRED_COMP_INCREASING 0 + +/*! \brief Defines the sort order for a field in ::kcdb_cred_comp_field + + Sorts lexicographically descending by string representation of + field. + */ +#define KCDB_CRED_COMP_DECREASING 1 + +/*! \brief Defines the sort order for a field in ::kcdb_cred_comp_field + + Any credentials which have the ::KCDB_CRED_FLAG_INITIAL will be + grouped above any that don't. + + If that does not apply, then credentials from the primary + credentials type will be sorted before others. +*/ +#define KCDB_CRED_COMP_INITIAL_FIRST 2 + +/*! \brief Defines the sort criteria for kcdb_cred_comp_generic() + + \see kcdb_cred_comp_generic() +*/ +typedef struct tag_kcdb_cred_comp_order { + khm_int32 nFields; + kcdb_cred_comp_field * fields; +} kcdb_cred_comp_order; + +/*! \brief A generic compare function for comparing credentials. + + This function can be passed as a parameter to kcdb_credset_sort(). + + The \a rock parameter to this function should be a pointer to a + ::kcdb_cred_comp_order object. The \a fields member of the + ::kcdb_cred_comp_order object should point to an array of + ::kcdb_cred_comp_field objects, each of which specifies the sort + order in decreasing order of priority. The number of + ::kcdb_cred_comp_field objects in the array should correspond to + the \a nFields member in the ::kcdb_cred_comp_order object. + + The array of ::kcdb_cred_comp_field objects define the sort + criteria, in order. The \a attrib member should be a valid + attribute ID, while the \a order member determines whether the + sort order is increasing or decreasing. The exact meaning or + increasing or decreasing depends on the data type of the + attribute. + + \param[in] rock a pointer to a ::kcdb_cred_comp_order object +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_comp_generic(khm_handle cred1, + khm_handle cred2, + void * rock); + +/*@}*/ + +/*! \defgroup kcdb_cred Credentials */ +/*@{*/ + +/*! \brief Maximum number of characters in a credential name */ +#define KCDB_CRED_MAXCCH_NAME 256 + +/*! \brief Maximum number of bytes in a credential name */ +#define KCDB_CRED_MAXCB_NAME (sizeof(wchar_t) * KCDB_CRED_MAXCCH_NAME) + +/*! \brief Marked as deleted */ +#define KCDB_CRED_FLAG_DELETED 0x00000008 + +/*! \brief Renewable */ +#define KCDB_CRED_FLAG_RENEWABLE 0x00000010 + +/*! \brief Initial + + Initial credentials form the basis of an identity. Some + properties of an initial credential, such as being renewable, are + directly inherited by the identity. An identity is also + automatically considered valid if it contains a valid initial + credential. + */ +#define KCDB_CRED_FLAG_INITIAL 0x00000020 + +/*! \brief Expired + + The credential's lifetime has ended. + */ +#define KCDB_CRED_FLAG_EXPIRED 0x00000040 + +/*! \brief Invalid + + The credential can no longer serve its intended function. This + may be because it is expired and is not renewable, or its + renewable time period has also expired, or for some other reason. + */ +#define KCDB_CRED_FLAG_INVALID 0x00000080 + +/*! \brief Credential is selected + + Indicates that the credential is selected. Note that using this + flag may be subject to race conditions. + */ +#define KCDB_CRED_FLAG_SELECTED 0x00000100 + +/*! \brief Bitmask indicating all known credential flags + */ +#define KCDB_CRED_FLAGMASK_ALL 0x0000ffff + +/*! \brief External flags + + These are flags that are provided by the credentials providers. + The other flags are internal to KCDB and should not be modified. + */ +#define KCDB_CRED_FLAGMASK_EXT (KCDB_CRED_FLAG_INITIAL | KCDB_CRED_FLAG_EXPIRED | KCDB_CRED_FLAG_INVALID | KCDB_CRED_FLAG_RENEWABLE) + +/*! \brief Bitmask indicating dditive flags + + Additive flags are special flags which are added to exiting + credentials based on new credentials when doing a collect + operation. See details on kcdb_credset_collect() + + \see kcdb_credset_collect() +*/ +#define KCDB_CRED_FLAGMASK_ADDITIVE KCDB_CRED_FLAG_SELECTED + +/*! \brief Generic credentials request + + This data structure is used as the format for a generic + credentials reqeust for a ::KMSG_KCDB_REQUEST message. A plugin + typically publishes this message so that a credentials provider + may handle it and in response, obtain the specified credential. + + While the \a identity, \a type and \a name members of the + structure are all optional, typically one would specify all three + or at least two for a credential provider to be able to provide + the credential unambigously. + + Credential providers do not need to respond to ::KMSG_KCDB_REQUEST + messages. However, if they do, they should make sure that they + are the only credential provider that is responding by setting the + \a semaphore member to a non-zero value. The \a semaphore is set + to zero when a request is initially sent out. When incrementing + the semaphore, the plugin should use a thread safe mechanism to + ensure that there are no race conditions that would allow more + than one provider to respond to the message. + */ +typedef struct tag_kcdb_cred_request { + khm_handle identity; /*!< Identity of the credential. Set + to NULL if not specified. */ + khm_int32 type; /*!< Type of the credential. Set to + KCDB_CREDTYPE_INVALID if not + specified. */ + wchar_t * name; /*!< Name of the credential. Set to + NULL if not specified. */ + + khm_handle dest_credset; /*!< If non-NULL, instructs whoever is + handling the request that the + credential thus obtained be placed + in this credential set in addition + to whereever it may place newly + acquired credentials. Note that + while this can be NULL if the new + credential does not need to be + placed in a credential set, it can + not equal the root credential + set. */ + + void * vparam; /*!< An unspecified + parameter. Specific credential types + may specify how this field is to be + used. */ + + long semaphore; /*!< Incremented by one when this + request is answered. Only one + credential provider is allowed to + answer a ::KMSG_KCDB_REQUEST + message. Initially, when the + message is sent out, this member + should be set to zero. */ +} kcdb_cred_request; + +/*! \brief Create a new credential + + \param[in] name Name of credential. \a name cannot be NULL and cannot + exceed \a KCDB_CRED_MAXCCH_NAME unicode characters including the + \a NULL terminator. + \param[in] identity A reference to an identity. + \param[in] cred_type A credentials type identifier for the credential. + \param[out] result Gets a held reference to the newly created credential. + Call kcdb_cred_release() or kcdb_cred_delete() to release the + reference. + \see kcdb_cred_release() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_create(wchar_t * name, + khm_handle identity, + khm_int32 cred_type, + khm_handle * result); + +/*! \brief Duplicate an existing credential. + + \param[out] newcred A held reference to the new credential if the call + succeeds. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_dup(khm_handle cred, + khm_handle * newcred); + +/*! \brief Updates one credential using field values from another + + All fields that exist in \a vsrc will get copied to \a vdest and will + overwrite any values that are already there in \a vdest. However any + values that exist in \a vdest taht do not exist in \a vsrc will not be + modified. + + \retval KHM_ERROR_SUCCESS vdest was successfully updated + \retval KHM_ERROR_EQUIVALENT all fields in vsrc were present and equivalent in vdest +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_update(khm_handle vdest, + khm_handle vsrc); + +/*! \brief Set an attribute in a credential by name + + \param[in] cbbuf Number of bytes of data in \a buffer. The + individual data type handlers may copy in less than this many + bytes in to the credential. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_set_attrib(khm_handle cred, + wchar_t * name, + void * buffer, + khm_size cbbuf); + +/*! \brief Set an attribute in a credential by attribute id + + \param[in] buffer A pointer to a buffer containing the data to + assign to the attribute. Setting this to NULL has the effect + of removing any data that is already assigned to the + attribute. If \a buffer is non-NULL, then \a cbbuf should + specify the number of bytes in \a buffer. + + \param[in] cbbuf Number of bytes of data in \a buffer. The + individual data type handlers may copy in less than this many + bytes in to the credential. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_set_attr(khm_handle cred, + khm_int32 attr_id, + void * buffer, + khm_size cbbuf); + +/*! \brief Get an attribute from a credential by name. + + \param[in] buffer The buffer that is to receive the attribute + value. Set this to NULL if only the required buffer size is + to be returned. + + \param[in,out] cbbuf The number of bytes available in \a buffer. + If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and + sets this to the required buffer size. + + \note Set both \a buffer and \a cbbuf to NULL if only the + existence of the attribute is to be checked. If the attribute + exists in this credential then the function will return + KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_attrib(khm_handle cred, + wchar_t * name, + khm_int32 * attr_type, + void * buffer, + khm_size * cbbuf); + +/*! \brief Get an attribute from a credential by attribute id. + + \param[in] buffer The buffer that is to receive the attribute + value. Set this to NULL if only the required buffer size is + to be returned. + + \param[in,out] cbbuf The number of bytes available in \a buffer. + If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and + sets this to the required buffer size. + + \param[out] attr_type Receives the data type of the attribute. + Set this to NULL if the type is not required. + + \note Set both \a buffer and \a cbbuf to NULL if only the + existence of the attribute is to be checked. If the attribute + exists in this credential then the function will return + KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_attr(khm_handle cred, + khm_int32 attr_id, + khm_int32 * attr_type, + void * buffer, + khm_size * cbbuf); + +/*! \brief Get the name of a credential. + + \param[in] buffer The buffer that is to receive the credential + name. Set this to NULL if only the required buffer size is to + be returned. + + \param[in,out] cbbuf The number of bytes available in \a buffer. + If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and + sets this to the required buffer size. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_name(khm_handle cred, + wchar_t * buffer, + khm_size * cbbuf); + +/*! \brief Get the string representation of a credential attribute. + + A shortcut function which generates the string representation of a + credential attribute directly. + + \param[in] vcred A handle to a credential + + \param[in] attr_id The attribute to retrieve + + \param[out] buffer A pointer to a string buffer which receives the + string form of the attribute. Set this to NULL if you only + want to determine the size of the required buffer. + + \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, + holds the size of the buffer pointed to by \a buffer, and on + exit, receives the actual number of bytes that were copied. + + \param[in] flags Flags for the string conversion. Can be set to + one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is + KCDB_TS_LONG. + + \retval KHM_ERROR_SUCCESS Success + \retval KHM_ERROR_NOT_FOUND The given attribute was either invalid + or was not defined for this credential + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_TOO_LONG Either \a buffer was NULL or the + supplied buffer was insufficient +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_attr_string(khm_handle vcred, + khm_int32 attr_id, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags); + +/*! \brief Get the string representation of a credential attribute by name. + + A shortcut function which generates the string representation of a + credential attribute directly. + + \param[in] vcred A handle to a credential + + \param[in] attrib The name of the attribute to retrieve + + \param[out] buffer A pointer to a string buffer which receives the + string form of the attribute. Set this to NULL if you only + want to determine the size of the required buffer. + + \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, + holds the size of the buffer pointed to by \a buffer, and on + exit, receives the actual number of bytes that were copied. + + \param[in] flags Flags for the string conversion. Can be set to + one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is + KCDB_TS_LONG. + + \see kcdb_cred_get_attr_string() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_attrib_string(khm_handle cred, + wchar_t * name, + wchar_t * buffer, + khm_size * cbbuf, + khm_int32 flags) ; + + +/*! \brief Get a held reference to the identity associated with a credential + + Use kcdb_identity_release() to release the reference that is + returned. + + \see kcdb_identity_relase() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_identity(khm_handle cred, + khm_handle * identity); + +/*! \brief Set the identity of a credential + + While it is ill-advised to change the identity of a credential + that has been placed in one or more credential sets, there can be + legitimate reasons for doing so. Only change the identity of a + credential that is not placed in a credential set or placed in a + credential set that is only used by a single entity. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_set_identity(khm_handle vcred, + khm_handle id); + +/*! \brief Get the serial number for the credential. + + Each credential gets assigned a serial number at the time it is + created. This will stay with the credential for its lifetime. + + \param[out] pserial Receives the serial number. Cannot be NULL. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_serial(khm_handle cred, + khm_ui_8 * pserial); + +/*! \brief Get the type of the credential. + + The returned type is a credential type. Doh. + + \param[out] type Receives the type. Cannot be NULL. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_type(khm_handle cred, + khm_int32 * type); + +/*! \brief Retrieve flags from a credential + + The flags returned will be place in the location pointed to by \a + flags. Note that the specified credential must be an active + credential for the operation to succeed. This means the + ::KCDB_CRED_FLAG_DELETED will never be retured by this function. + */ +KHMEXP khm_int32 KHMAPI +kcdb_cred_get_flags(khm_handle cred, + khm_int32 * flags); + +/*! \brief Set the flags of a credential + + The flags specified in the \a mask parameter will be set to the + values specified in the \a flags parameter. The flags that are + not included in \a mask will not be modified. + + This function can not be used to set the ::KCDB_CRED_FLAG_DELETED + flag. If this bit is specified in either \a flags or \a mask, it + will be ignored. + + \see ::KCDB_CRED_FLAGMASK_ALL + */ +KHMEXP khm_int32 KHMAPI +kcdb_cred_set_flags(khm_handle cred, + khm_int32 flags, + khm_int32 mask); + +/*! \brief Hold a reference to a credential. + + Use kcdb_cred_release() to release the reference. + + \see kcdb_cred_release() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_hold(khm_handle cred); + +/*! \brief Release a held reference to a credential. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_release(khm_handle cred); + +/*! \brief Delete a credential. + + The credential will be marked for deletion and will continue to + exist until all held references are released. If the credential + is bound to a credential set or the root credential store, it will + be removed from the respective container. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_cred_delete(khm_handle cred); + +/*! \brief Compare an attribute of two credentials by name. + + \return The return value is dependent on the type of the attribute + and indicate a weak ordering of the attribute values of the two + credentials. If one or both credentials do not contain the + attribute, the return value is 0, which signifies that no ordering + can be determined. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_creds_comp_attrib(khm_handle cred1, + khm_handle cred2, + wchar_t * name); + +/*! \brief Compare an attribute of two credentials by attribute id. + + \return The return value is dependent on the type of the attribute + and indicate a weak ordering of the attribute values of the two + credentials. If one or both credentials do not contain the + attribute, the return value is 0, which signifies that no ordering + can be determined. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_creds_comp_attr(khm_handle cred1, + khm_handle cred2, + khm_int32 attr_id); + +/*! \brief Compare two credentials for equivalence + + \return Non-zero if the two credentials are equal. Zero otherwise. + \note Two credentials are considered equal if all the following hold: + - Both refer to the same identity. + - Both have the same name. + - Both have the same type. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_creds_is_equal(khm_handle cred1, + khm_handle cred2); + +/*@}*/ +/*@}*/ + +/********************************************************************/ + +/*! \defgroup kcdb_type Credential attribute types + +@{*/ + +/*! \brief Convert a field to a string + + Provides a string representation of a field in a credential. The + data buffer can be assumed to be valid. + + On entry, \a s_buf can be NULL if only the required size of the + buffer is to be returned. \a pcb_s_buf should be non-NULL and + should point to a valid variable of type ::khm_size that will, on + entry, contain the size of the buffer pointed to by \a s_buf if \a + s_buf is not \a NULL, and on exit will contain the number of bytes + consumed in \a s_buf, or the required size of the buffer if \a + s_buf was NULL or the size of the buffer was insufficient. + + The implementation should verify the parameters that are passed in + to the function. + + The data pointed to by \a data should not be modified in any way. + + \param[in] data Valid pointer to a block of data + + \param[in] cb_data Number of bytes in data block pointed to by \a + data + + \param[out] s_buf Buffer to receive the string representation of + data. If the data type flags has KCDB_TYPE_FLAG_CB_AUTO, then + this parameter could be set to KCDB_CBSIZE_AUTO. In this + case, the function should compute the size of the input buffer + assuming that the input buffer is valid. + + \param[in,out] pcb_s_buf On entry, contains the size of the buffer + pointed to by \a s_buf, and on exit, contains the number of + bytes used by the string representation of the data including + the NULL terminator + + \param[in] flags Flags for formatting the string + + \retval KHM_ERROR_SUCCESS The string representation of the data + field was successfully copied to \a s_buf and the size of the + buffer used was copied to \a pcb_s_buf. + + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + + \retval KHM_ERROR_TOO_LONG Either \a s_buf was \a NULL or the size + indicated by \a pcb_s_buf was too small to contain the string + representation of the value. The required size of the buffer + is in \a pcb_s_buf. + + \note This documents the expected behavior of this prototype function + + \see ::kcdb_type + */ +typedef khm_int32 +(KHMAPI *kcdb_dtf_toString)(const void * data, + khm_size cb_data, + wchar_t * s_buf, + khm_size * pcb_s_buf, + khm_int32 flags); + +/*! \brief Verifies whetehr the given buffer contains valid data + + The function should examine the buffer and the size of the buffer + and determine whether or not the buffer contains valid data for + this data type. + + The data field pointed to by \a data should not be modified in any + way. + + \param[in] data A pointer to a data buffer + + \param[in] cb_data The number of bytes in the data buffer. If the + data type flags has KCDB_TYPE_FLAG_CB_AUTO, then this + parameter could be set to KCDB_CBSIZE_AUTO. In this case, the + function should compute the size of the input buffer assuming + that the input buffer is valid. + + \return TRUE if the data is valid, FALSE otherwise. + + \note This documents the expected behavior of this prototype function + + \see ::kcdb_type +*/ +typedef khm_boolean +(KHMAPI *kcdb_dtf_isValid)(const void * data, + khm_size cb_data); + +/*! \brief Compare two fields + + Compare the two data fields and return a value indicating their + relative ordering. The return value follows the same + specification as strcmp(). + + Both data buffers that are passed in can be assumed to be valid. + + None of the data buffers should be modified in any way. + + \param[in] data_l Valid pointer to first data buffer + + \param[in] cb_data_l Number of bytes in \a data_l. If the data + type flags has KCDB_TYPE_FLAG_CB_AUTO, then this parameter + could be set to KCDB_CBSIZE_AUTO. In this case, the function + should compute the size of the input buffer assuming that the + input buffer is valid. + + \param[in] data_r Valid pointer to second data buffer + + \param[in] cb_data_r Number of bytes in \a data_r. If the data + type flags has KCDB_TYPE_FLAG_CB_AUTO, then this parameter + could be set to KCDB_CBSIZE_AUTO. In this case, the function + should compute the size of the input buffer assuming that the + input buffer is valid. + + \return The return value should be + - Less than zero if \a data_l < \a data_r + - Equal to zero if \a data_l == \a data_r or if this data type can not be compared + - Greater than zero if \a data_l > \a data_r + + \note This documents the expected behavior of this prototype function + + \see ::kcdb_type +*/ +typedef khm_int32 +(KHMAPI *kcdb_dtf_comp)(const void * data_l, + khm_size cb_data_l, + const void * data_r, + khm_size cb_data_r); + +/*! \brief Duplicate a data field + + Duplicates a data field. The buffer pointed to by \a data_src + contains a valid field. The function should copy the field with + appropriate adjustments to \a data_dst. + + The \a data_dst parameter can be NULL if only the required size of + the buffer is needed. In this case, teh function should set \a + pcb_data_dst to the number of bytes required and then return + KHM_ERROR_TOO_LONG. + + \param[in] data_src Pointer to a valid data buffer + + \param[in] cb_data_src Number of bytes in \a data_src. If the data + type flags has KCDB_TYPE_FLAG_CB_AUTO, then this parameter + could be set to KCDB_CBSIZE_AUTO. In this case, the function + should compute the size of the input buffer assuming that the + input buffer is valid. + + \param[out] data_dst Poitner to destination buffer. Could be NULL + if only the required size of the destination buffer is to be + returned. + + \param[in,out] pcb_data_dst On entry specifies the number of bytes + in \a data_dst, and on exit should contain the number of bytes + copied. + + \retval KHM_ERROR_SUCCESS The data was successfully copied. The + number of bytes copied is in \a pcb_data_dst + + \retval KHM_ERROR_INVALID_PARAM One or more parameters is incorrect. + + \retval KHM_ERROR_TOO_LONG Either \a data_dst was NULL or the size + of the buffer was insufficient. The required size is in \a + pcb_data_dst + + \note This documents the expected behavior of this prototype function + + \see ::kcdb_type + */ +typedef khm_int32 +(KHMAPI *kcdb_dtf_dup)(const void * data_src, + khm_size cb_data_src, + void * data_dst, + khm_size * pcb_data_dst); + +/*! \brief A data type descriptor. + + Handles basic operation for a specific data type. + + \see \ref cred_data_types +*/ +typedef struct tag_kcdb_type { + wchar_t * name; + khm_int32 id; + khm_int32 flags; + + khm_size cb_min; + khm_size cb_max; + + kcdb_dtf_toString toString; + /*!< Provides a string representation for a value. */ + + kcdb_dtf_isValid isValid; + /*!< Returns true of the value is valid for this data type */ + + kcdb_dtf_comp comp; + /*!< Compare two values and return \a strcmp style return value */ + + kcdb_dtf_dup dup; + /*!< Duplicate a value into a secondary buffer */ +} kcdb_type; + +/*! \name Flags for kcdb_type::toString +@{*/ +/*! \brief Specify that the short form of the string representation should be returned. + + Flags for #kcdb_type::toString. The flag specifies how long the + string representation should be. The specific length of a short + or long description is not restricted and it is up to the + implementation to choose how to interpret the flags. + + Usually, KCDB_TS_SHORT is specified when the amount of space that + is available to display the string is very restricted. It may be + the case that the string is truncated to facilitate displaying in + a constrainted space. +*/ +#define KCDB_TS_SHORT 1 + +/*! \brief Specify that the long form of the string representation should be returned + + Flags for #kcdb_type::toString. The flag specifies how long the + string representation should be. The specific length of a short + or long description is not restricted and it is up to the + implementation to choose how to interpret the flags. + +*/ +#define KCDB_TS_LONG 0 +/*@}*/ + +/*! \brief The maximum number of bytes allowed for a value of any type */ +#define KCDB_TYPE_MAXCB 16384 + +/*! \name Flags for kcdb_type +@{*/ + +/*! \brief The type supports KCDB_CBSIZE_AUTO. + + Used for types where the size of the object can be determined + through context or by the object content. Such as for objects + that have a fixed size or unicode strings that have a terminator. + + This implies that ALL the object manipulation callbacks that are + defined in this type definition support the KCDB_CBSIZE_AUTO + value. +*/ +#define KCDB_TYPE_FLAG_CB_AUTO 16 + +/*! \brief The \a cb_min member is valid. + + The \a cb_min member defines the minimum number of bytes that an + object of this type will consume. + + \note If this flag is used in conjunction with \a + KCDB_TYPE_FLAG_CB_MAX then, \a cb_min must be less than or equal + to \a cb_max. +*/ +#define KCDB_TYPE_FLAG_CB_MIN 128 + +/*! \brief The \a cb_max member is valid. + + The \a cb_max member defines the maximum number of bytes that an + object of this type will consume. + + \note If this flag is used in conjunction with \a + KCDB_TYPE_FLAG_CB_MIN then, \a cb_min must be less than or + equal to \a cb_max. */ +#define KCDB_TYPE_FLAG_CB_MAX 256 + +/*! \brief Denotes that objects of this type have a fixed size. + + If this flags is specified, then the type definition must also + specify cb_min and cb_max, which must both be the same value. + + \note Implies \a KCDB_TYPE_FLAG_CB_AUTO, \a KCDB_TYPE_FLAG_CB_MIN + and \a KCDB_TYPE_FLAG_CB_MAX. Pay special attention to the + implication of \a KCDB_TYPE_FLAG_AUTO. +*/ +#define KCDB_TYPE_FLAG_CB_FIXED (KCDB_TYPE_FLAG_CB_AUTO|KCDB_TYPE_FLAG_CB_MIN|KCDB_TYPE_FLAG_CB_MAX) + +/*@}*/ + +KHMEXP khm_int32 KHMAPI +kcdb_type_get_id(wchar_t *name, khm_int32 * id); + +/*! \brief Return the type descriptor for a given type id + + \param[out] info Receives a held reference to a type descriptor. + Use kcdb_type_release_info() to release the handle. If the \a + info parameter is NULL, the function returns KHM_ERROR_SUCCESS + if \a id is a valid type id, and returns KHM_ERROR_NOT_FOUND + otherwise. + + \see kcdb_type_release_info() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_type_get_info(khm_int32 id, kcdb_type ** info); + +/*! \brief Release a reference to a type info structure + + Releases the reference to the type information obtained with a + prior call to kcdb_type_get_info(). + */ +KHMEXP khm_int32 KHMAPI +kcdb_type_release_info(kcdb_type * info); + +/*! \brief Get the name of a type + + Retrieves the non-localized name of the specified type. + */ +KHMEXP khm_int32 KHMAPI +kcdb_type_get_name(khm_int32 id, + wchar_t * buffer, + khm_size * cbbuf); + +/*! \brief Register a credentials attribute type + + The credentials type record pointed to by \a type defines a new + credential attribute type. The \a id member of \a type may be set + to KCDB_TYPE_INVALID to indicate that an attribute ID is to be + generated automatically. + + \param[in] type The type descriptor + \param[out] new_id Receives the identifier for the credential attribute type. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_type_register(kcdb_type * type, + khm_int32 * new_id); + +/*! \brief Unregister a credential attribute type + + Removes the registration for the specified credentials attribute + type. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_type_unregister(khm_int32 id); + +KHMEXP khm_int32 KHMAPI +kcdb_type_get_next_free(khm_int32 * id); + +/*! \name Conversion functions +@{*/ +/*! \brief Convert a time_t value to FILETIME +*/ +KHMEXP void KHMAPI +TimetToFileTime( time_t t, LPFILETIME pft ); + +/*! \brief Convert a time_t interval to a FILETIME interval +*/ +KHMEXP void KHMAPI +TimetToFileTimeInterval(time_t t, LPFILETIME pft); + +/*! \brief Convert a FILETIME interval to seconds +*/ +KHMEXP long KHMAPI +FtIntervalToSeconds(LPFILETIME pft); + +/*! \brief Convert a FILETIME interval to milliseconds +*/ +KHMEXP long KHMAPI +FtIntervalToMilliseconds(LPFILETIME pft); + +/*! \brief Compare two FILETIME values + + The return value is similar to the return value of strcmp(), based + on the comparison of the two FILETIME values. + */ +KHMEXP long KHMAPI +FtCompare(LPFILETIME pft1, LPFILETIME pft2); + +/*! \brief Convert a FILETIME to a 64 bit int +*/ +KHMEXP khm_int64 KHMAPI FtToInt(LPFILETIME pft); + +/*! \brief Convert a 64 bit int to a FILETIME +*/ +KHMEXP FILETIME KHMAPI IntToFt(khm_int64 i); + +/*! \brief Calculate the difference between two FILETIMEs + + Returns the value of ft1 - ft2 + */ +KHMEXP FILETIME KHMAPI FtSub(LPFILETIME ft1, LPFILETIME ft2); + +/*! \brief Calculate the sum of two FILETIMEs + + Return the value of ft1 + ft2 + */ +KHMEXP FILETIME KHMAPI FtAdd(LPFILETIME ft1, LPFILETIME ft2); + +/*! \brief Convert a FILETIME inverval to a string +*/ +KHMEXP khm_int32 KHMAPI +FtIntervalToString(LPFILETIME data, + wchar_t * buffer, + khm_size * cb_buf); + +/*! \brief Parse a string representing an interval into a FILETIME interval + + The string is a localized string which should look like the + following: + + \code + [number unit] [number unit]... + \endcode + + where \a number is an integer while \a unit is a localized + (possibly abbreviated) unit specification. The value of the + described interval is calculated as the sum of each \a number in + \a units. For example : + + \code + 1 hour 36 minutes + \endcode + + would result in an interval specification that's equivalent to 1 + hour and 36 minutes. Of course there is no restriction on the + order in which the \a number \a unit specifications are given and + the same unit may be repeated multiple times. + + \retval KHM_ERROR_INVALID_PARAM The given string was invalid or had + a token that could not be parsed. It can also mean that \a + pft was NULL or \a str was NULL. + + \retval KHM_ERROR_SUCCESS The string was successfully parsed and + the result was placed in \a pft. +*/ +KHMEXP khm_int32 KHMAPI +IntervalStringToFt(FILETIME * pft, wchar_t * str); + +/*! \brief Return number of milliseconds till next representation change + + Returns the number of milliseconds that must elapse away from the + interval specified in pft \a for the representation of pft to change + from whatever it is right now. + + Returns 0 if the representation is not expected to change. +*/ +KHMEXP long KHMAPI +FtIntervalMsToRepChange(LPFILETIME pft); + +/*! \brief Convert a safe ANSI string to a Unicode string + + The resulting string is guaranteed to be NULL terminated and + within the size limit set by \a cbwstr. + + If the whole string cannot be converted, \a wstr is set to an + empty string. + + \return the number of characters converted. This is always either + the length of the string \a astr or 0. +*/ +KHMEXP int KHMAPI +AnsiStrToUnicode( wchar_t * wstr, size_t cbwstr, const char * astr); + +/*! \brief Convert a Unicode string to ANSI + + The resulting string is guaranteed to be NULL terminated and + within the size limit set by \a cbdest. + + \return the number of characters converted. This is always either + the length of the string \a src or 0. +*/ +KHMEXP int KHMAPI +UnicodeStrToAnsi( char * dest, size_t cbdest, const wchar_t * src); +/*@}*/ + +/*! \name Standard type identifiers and names +@{*/ + +/*! Maximum identifier number */ +#define KCDB_TYPE_MAX_ID 255 + +/*! \brief Invalid type + + Used by functions that return a type identifier to indicate that + the returned type identifier is invalid. Also used to indicate + that a type identifier is not available */ +#define KCDB_TYPE_INVALID (-1) + +/*! \brief All types + + Used by filters to indicate that all types are allowed. +*/ +#define KCDB_TYPE_ALL KCDB_TYPE_INVALID + +#define KCDB_TYPE_VOID 0 +#define KCDB_TYPE_STRING 1 +#define KCDB_TYPE_DATE 2 +#define KCDB_TYPE_INTERVAL 3 +#define KCDB_TYPE_INT32 4 +#define KCDB_TYPE_INT64 5 +#define KCDB_TYPE_DATA 6 + +#define KCDB_TYPENAME_VOID L"Void" +#define KCDB_TYPENAME_STRING L"String" +#define KCDB_TYPENAME_DATE L"Date" +#define KCDB_TYPENAME_INTERVAL L"Interval" +#define KCDB_TYPENAME_INT32 L"Int32" +#define KCDB_TYPENAME_INT64 L"Int64" +#define KCDB_TYPENAME_DATA L"Data" +/*@}*/ +/*@}*/ + +/********************************************************************/ + +/*! \defgroup kcdb_credattr Credential attributes */ +/*@{*/ + +/*! \brief Prototype callback function for computed data types. + + If the flags for a particular attribute specifies that the value + is computed, then a callback function should be specified. The + callback function will be called with a handle to a credential + along with the attribute ID for the requested attribute. The + function should place the computed value in \a buffer. The size + of the buffer in bytes is specifed in \a cbsize. However, if \a + buffer is \a NULL, then the required buffer size should be placed + in \a cbsize. + */ +typedef khm_int32 +(KHMAPI *kcdb_attrib_compute_cb)(khm_handle cred, + khm_int32 id, + void * buffer, + khm_size * cbsize); + +/*! \brief Credential attribute descriptor + + \see kcdb_attrib_register() +*/ +typedef struct tag_kcdb_attrib { + wchar_t * name; /*!< Name. (Not localized, + required) */ + khm_int32 id; /*!< Identifier. When registering, + this can be set to + ::KCDB_ATTR_INVALID if a unique + identifier is to be generated. */ + khm_int32 alt_id; /*!< Alternate identifier. If the \a + flags specify + ::KCDB_ATTR_FLAG_ALTVIEW, then this + field should specify the identifier + of the canonical attribute from + which this attribute is derived. */ + khm_int32 flags; /*!< Flags. Combination of \ref + kcdb_credattr_flags "attribute + flags" */ + + khm_int32 type; /*!< Type of the attribute. Must be valid. */ + + wchar_t * short_desc; /*!< Short description. (Localized, + optional) */ + + wchar_t * long_desc; /*!< Long description. (Localized, + optional) */ + + kcdb_attrib_compute_cb compute_cb; + /*!< Callback. Required if \a flags + specify ::KCDB_ATTR_FLAG_COMPUTED. */ + + khm_size compute_min_cbsize; + /*!< Minimum number of bytes required + to store this attribute. Required + if ::KCDB_ATTR_FLAG_COMPUTED is + specified.*/ + khm_size compute_max_cbsize; + /*!< Maximum number of bytes required + to store this attribute. Required + if ::KCDB_ATTR_FLAG_COMPUTED is + specified.*/ +} kcdb_attrib; + +/*! \brief Retrieve the ID of a named attribute */ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_get_id(wchar_t *name, + khm_int32 * id); + +/*! \brief Register an attribute + + \param[out] new_id Receives the ID of the newly registered + attribute. If the \a id member of the ::kcdb_attrib object is + set to KCDB_ATTR_INVALID, then a unique ID is generated. */ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_register(kcdb_attrib * attrib, + khm_int32 * new_id); + +/*! \brief Retrieve the attribute descriptor for an attribute + + The descriptor that is returned must be released through a call to + kcdb_attrib_release_info() + + If only the validity of the attribute identifier needs to be + checked, you can pass in NULL for \a attrib. In this case, if the + identifier is valid, then the funciton will return + KHM_ERROR_SUCCESS, otherwise it will return KHM_ERROR_NOT_FOUND. + + \see kcdb_attrib_release_info() + */ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_get_info(khm_int32 id, + kcdb_attrib ** attrib); + +/*! \brief Release an attribute descriptor + + \see kcdb_attrib_get_info() + */ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_release_info(kcdb_attrib * attrib); + +/*! \brief Unregister an attribute + + Once an attribute ID has been unregistered, it may be reclaimed by + a subsequent call to kcdb_attrib_register(). +*/ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_unregister(khm_int32 id); + +/*! \brief Retrieve the description of an attribute + + \param[in] flags Specify \a KCDB_TS_SHORT to retrieve the short description. */ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_describe(khm_int32 id, + wchar_t * buffer, + khm_size * cbsize, + khm_int32 flags); + +/*! \brief Count attributes + + Counts the number of attributes that match the given criteria. + The criteria is specified against the flags of the attribute. An + attribute is a match if its flags satisfy the condition below: + + \code + (attrib.flags & and_flags) == (eq_flags & and_flags) + \endcode + + The number of attributes that match are returned in \a pcount. + */ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_get_count(khm_int32 and_flags, + khm_int32 eq_flags, + khm_size * pcount); + +/*! \brief List attribute identifiers + + Lists the identifiers of the attributes that match the given + criteria. The criteria is specified against the flags of the + attribute. An attribute is a match if the following condition is + satisfied: + + \code + (attrib.flags & and_flags) == (eq_flags & and_flags) + \endcode + + The list of attributes found are copied to the \a khm_int32 array + specified in \a plist. The number of elements available in the + buffer \a plist is specified in \a pcsize. On exit, \a pcsize + will hold the actual number of attribute identifiers copied to the + array. + + \param[in] and_flags See above + \param[in] eq_flags See above + \param[in] plist A khm_int32 array + \param[in,out] pcsize On entry, holds the number of elements + available in the array pointed to by \a plist. On exit, holds + the number of elements copied to the array. + + \retval KHM_ERROR_SUCCESS The list of attribute identifiers have + been copied. + \retval KHM_ERROR_TOO_LONG The list was too long to fit in the + supplied buffer. As many elements as possible have been + copied to the \a plist array and the required number of + elements has been written to \a pcsize. + + \note The \a pcsize parameter specifies the number of khm_int32 + elements in the array and not the number of bytes in the + array. This is different from the usual size parameters used + in the NetIDMgr API. + */ +KHMEXP khm_int32 KHMAPI +kcdb_attrib_get_ids(khm_int32 and_flags, + khm_int32 eq_flags, + khm_int32 * plist, + khm_size * pcsize); + +/*! \defgroup kcdb_credattr_flags Attribute flags */ +/*@{*/ +/*! \brief The attribute is required */ +#define KCDB_ATTR_FLAG_REQUIRED 0x00000008 + +/*! \brief The attribute is computed. + + If this flag is set, the \a compute_cb, \a compute_min_cbsize and + \a compute_max_cbsize members of the ::kcdb_attrib attribute + descriptor must be assigned valid values. +*/ +#define KCDB_ATTR_FLAG_COMPUTED 0x00000010 + +/*! \brief System attribute. + + This cannot be specified for a custom attribute. Implies that the + value of the attribute is given by the credentials database + itself. +*/ +#define KCDB_ATTR_FLAG_SYSTEM 0x00000020 + +/*! \brief Hidden + + The attribute is not meant to be displayed to the user. Setting + this flag prevents this attribute from being listed in the list of + available data fields in the UI. +*/ +#define KCDB_ATTR_FLAG_HIDDEN 0x00000040 + +/*! \brief Property + + The attribute is a property. The main difference between regular + attributes and properties are that properties are not allocated + off the credentials record. Hence, a property can not be used as + a credentials field. Other objects such as identities can hold + property sets. A property set can hold both regular attributes as + well as properties. +*/ +#define KCDB_ATTR_FLAG_PROPERTY 0x00000080 + +/*! \brief Volatile + + A volatile property is one whose value changes often, such as + ::KCDB_ATTR_TIMELEFT. Some controls will make use of additional + logic to deal with such values, or not display them at all. + */ +#define KCDB_ATTR_FLAG_VOLATILE 0x00000100 + +/*! \brief Alternate view + + The attribute is actually an alternate representation of another + attribute. The Canonical attribute name is specified in \a + alt_id. + + Sometimes a certain attribute may need to be represented in + different ways. You can register multiple attributes for each + view. However, you should also provide a canonical attribute for + whenever the canonical set of attributes of the credential is + required. + */ +#define KCDB_ATTR_FLAG_ALTVIEW 0x00000200 + +/*! \brief Transient attribute + + A transient attribute is one whose absence is meaningful. When + updating one record using another, if a transient attribute is + absent in the source but present in the destination, then the + attribute is removed from the destination. +*/ +#define KCDB_ATTR_FLAG_TRANSIENT 0x00000400 + +/*@}*/ + +/*! \defgroup kcdb_credattr_idnames Standard attribute IDs and names */ +/*@{*/ + +/*! \name Attribute related constants */ +/*@{*/ +/*! \brief Maximum valid attribute ID */ +#define KCDB_ATTR_MAX_ID 255 + +/*! \brief Minimum valid property ID */ +#define KCDB_ATTR_MIN_PROP_ID 4096 + +/*! \brief Maximum number of properties */ +#define KCDB_ATTR_MAX_PROPS 128 + +/*! \brief Maximum valid property ID */ +#define KCDB_ATTR_MAX_PROP_ID (KCDB_ATTR_MIN_PROP_ID + KCDB_ATTR_MAX_PROPS - 1) + +/*! \brief Invalid ID */ +#define KCDB_ATTR_INVALID (-1) + +/*! \brief First custom attribute ID */ +#define KCDB_ATTRID_USER 20 + +/*@}*/ + +/*!\name Attribute identifiers */ +/*@{*/ +/*! \brief Name of the credential + + - \b Type: STRING + - \b Flags: REQUIRED, COMPUTED, SYSTEM + */ +#define KCDB_ATTR_NAME 0 + +/*! \brief The identity handle for the credential + + - \b Type: INT64 + - \b Flags: REQUIRED, COMPUTED, SYSTEM, HIDDEN + + \note The handle returned in by specifying this attribute to + kcdb_cred_get_attr() or kcdb_cred_get_attrib() is not held. + While the identity is implicitly held for the duration that + the credential is held, it is not recommended to obtain a + handle to the identity using this method. Use + kcdb_cred_get_identity() instead. +*/ +#define KCDB_ATTR_ID 1 + +/*! \brief The name of the identity + + - \b Type: STRING + - \b Flags: REQUIRED, COMPUTED, SYSTEM + */ +#define KCDB_ATTR_ID_NAME 2 + +/*! \brief The type of the credential + + - \b Type: INT32 + - \b Flags: REQUIRED, COMPUTED, SYSTEM, HIDDEN +*/ +#define KCDB_ATTR_TYPE 3 + +/*! \brief Type name for the credential + + - \b Type: STRING + - \b Flags: REQUIRED, COMPUTED, SYSTEM +*/ +#define KCDB_ATTR_TYPE_NAME 4 + +/*! \brief Name of the parent credential + + - \b Type: STRING + - \b Flags: SYSTEM +*/ +#define KCDB_ATTR_PARENT_NAME 5 + +/*! \brief Issed on + + - \b Type: DATE + - \b Flags: SYSTEM +*/ +#define KCDB_ATTR_ISSUE 6 + +/*! \brief Expires on + + - \b Type: DATE + - \b Flags: SYSTEM +*/ +#define KCDB_ATTR_EXPIRE 7 + +/*! \brief Renewable period expires on + + - \b Type: DATE + - \b Flags: SYSTEM +*/ +#define KCDB_ATTR_RENEW_EXPIRE 8 + +/*! \brief Time left till expiration + + - \b Type: INTERVAL + - \b Flags: SYSTEM, COMPUTED, VOLATILE +*/ +#define KCDB_ATTR_TIMELEFT 9 + +#define KCDB_ATTR_RENEW_TIMELEFT 10 + +/*! \brief Location of the credential + + - \b Type: STRING + - \b Flags: SYSTEM +*/ +#define KCDB_ATTR_LOCATION 11 + +/*! \brief Lifetime of the credential + + - \b Type: INTERVAL + - \b Flags: SYSTEM +*/ +#define KCDB_ATTR_LIFETIME 12 + +#define KCDB_ATTR_RENEW_LIFETIME 13 + +/*! \brief Flags for the credential + + - \b Type: INT32 + - \b Flags: REQUIRED, COMPUTED, SYSTEM, HIDDEN + */ +#define KCDB_ATTR_FLAGS 14 + +/*@}*/ + +/*!\name Attribute names */ +/*@{ */ + +#define KCDB_ATTRNAME_NAME L"Name" +#define KCDB_ATTRNAME_ID L"Identity" +#define KCDB_ATTRNAME_ID_NAME L"IdentityName" +#define KCDB_ATTRNAME_TYPE L"TypeId" +#define KCDB_ATTRNAME_TYPE_NAME L"TypeName" +#define KCDB_ATTRNAME_FLAGS L"Flags" + +#define KCDB_ATTRNAME_PARENT_NAME L"Parent" +#define KCDB_ATTRNAME_ISSUE L"Issued" +#define KCDB_ATTRNAME_EXPIRE L"Expires" +#define KCDB_ATTRNAME_RENEW_EXPIRE L"RenewExpires" +#define KCDB_ATTRNAME_TIMELEFT L"TimeLeft" +#define KCDB_ATTRNAME_RENEW_TIMELEFT L"RenewTimeLeft" +#define KCDB_ATTRNAME_LOCATION L"Location" +#define KCDB_ATTRNAME_LIFETIME L"Lifetime" +#define KCDB_ATTRNAME_RENEW_LIFETIME L"RenewLifetime" + +/*@}*/ + +/*@}*/ + +/*@}*/ + +/*****************************************************************************/ + +/*! \defgroup kcdb_credtype Credential types */ +/*@{*/ + +/*! \brief Credential type descriptor */ +typedef struct tag_kcdb_credtype { + wchar_t * name; /*!< name (less than KCDB_MAXCB_NAME bytes) */ + khm_int32 id; + wchar_t * short_desc; /*!< short localized description (less + than KCDB_MAXCB_SHORT_DESC bytes) */ + wchar_t * long_desc; /*!< long localized descriptionn (less + than KCDB_MAXCB_LONG_DESC bytes) */ + khm_handle sub; /*!< Subscription for credentials type + hander. This should be a valid + subscription constructed through a + call to kmq_create_subscription() + and must handle KMSG_CRED messages + that are marked as being sent to + type specific subscriptions. + + The subscription will be + automatically deleted with a call to + kmq_delete_subscription() when the + credentials type is unregistered.*/ + + kcdb_cred_comp_func is_equal; /*!< Used as an additional clause + when comparing two credentials for + equality. The function this is + actually a comparison function, it + should return zero if the two + credentials are equal and non-zero + if they are not. The addtional \a + rock parameter is always zero. + + It can be assumed that the identity, + name and credentials type have + already been found to be equal among + the credentials and the credential + type is the type that is being + registered.*/ + +#ifdef _WIN32 + HICON icon; +#endif +} kcdb_credtype; + +/*! \brief Maximum value of a credential type identifier + + Credential type identifiers are assigned serially unless the + process registering the credential type sets a specific identity. + The maximum identifier number places a hard limit to the number of + credential types that can be registered at one time, which is + KCDB_CREDTYPE_MAX_ID + 1. + */ +#define KCDB_CREDTYPE_MAX_ID 31 + +/*! \brief Specify all credential types + + This value is used by functions which filter credentials based on + credential types. Specifying this value tells the filter to + accept all credential types. + */ +#define KCDB_CREDTYPE_ALL (-1) + +/*! \brief Automatically determine a credential type identifier + + Used with kcdb_credtype_register() to specify that the credential + type identifier should be automatically determined to avoid + collisions. + */ +#define KCDB_CREDTYPE_AUTO (-2) + +/*! \brief An invalid credential type + + Even though any non positive credential type ID is invalid + anywhere where a specific credential type ID is required, this + value is provided for explicit indication that the credential type + is invalid. Also it makes code more readable to have a constant + that shouts out INVALID. + +*/ +#define KCDB_CREDTYPE_INVALID (-3) + +/*! \brief Macro predicate for testing whether a credtype is valid + + Returns TRUE if the given credtype is valid. This is a safe + macro. +*/ +#define KCDB_CREDTYPE_IS_VALID(t) ((t) >= 0) + +/*! \brief Register a credentials type. + + The information given in the \a type parameter is used to register + a new credential type. Note that the \a name member of the \a + type should be unique among all credential types. + + You can specify ::KCDB_CREDTYPE_AUTO as the \a id member of \a + type to let kcdb_credtype_register() determine a suitable + credential type identifier. You can subsequently call + kcdb_credtype_get_id() to retrieve the generated id or pass a + valid pointer to a khm_int32 type variable as \a new_id. + + \param[in] type Credential type descriptor + + \param[out] new_id The credential type identifier that this type + was registered as. + + \retval KHM_ERROR_SUCCESS The credential type was successfully registered. + + \retval KHM_ERROR_INVALID_PARAM One or more of the parameters were invalid + + \retval KHM_ERROR_TOO_LONG One or more of the string fields in \a + type exceeded the character limit for that field. + + \retval KHM_ERROR_NO_RESOURCES When autogenerating credential type + identifiers, this value indicates that the maximum number of + credential types have been registered. No more registrations + can be accepted unless some credentials type is unregisred. + + \retval KHM_ERROR_DUPLICATE The \a name or \a id that was + specified is already in use. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credtype_register(kcdb_credtype * type, + khm_int32 * new_id); + +/*! \brief Return a held reference to a \a kcdb_credtype object describing the credential type. + + The reference points to a static internal object of type \a + kcdb_credtype. Use the kcdb_credtype_release_info() function to + release the reference. + + Also, the structure passed in as the \a type argument to + kcdb_credtype_register() is not valid as a credential type + descriptor. Use kcdb_credtype_get_info() to obtain the actual + credential type descriptor. + + \param[in] id Credentials type identifier. + + \param[out] type Receives the credentials descriptor handle. If + \a type is NULL, then no handle is returned. However, the + function will still return \a KHM_ERROR_SUCCESS if the \a id + parameter passed in is a valid credentials type identifier. + + \see kcdb_credtype_release_info() + \see kcdb_credtype_register() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_credtype_get_info(khm_int32 id, + kcdb_credtype ** type); + +/*! \brief Release a reference to a \a kcdb_credtype object + + Undoes the hold obtained on a \a kcdb_credtype object from a + previous call to kcdb_credtype_get_info(). + + \see kcdb_credtype_get_info() + */ +KHMEXP khm_int32 KHMAPI +kcdb_credtype_release_info(kcdb_credtype * type); + +/*! \brief Unregister a credentials type + + Undoes the registration performed by kcdb_credtype_register(). + + This should only be done when the credentials provider is being + unloaded. + */ +KHMEXP khm_int32 KHMAPI +kcdb_credtype_unregister(khm_int32 id); + +/*! \brief Retrieve the name of a credentials type + + Given a credentials type identifier, retrieves the name. The name + is not localized and serves as a persistent identifier of the + credentials type. + + \param[out] buf The buffer to receive the name. Could be \a NULL + if only the length of the buffer is required. + + \param[in,out] cbbuf On entry, specifies the size of the buffer + pointed to by \a buf if \a buf is not NULL. On exit, contains + the number of bytes copied to \a buf or the required size of + the buffer. + + \retval KHM_ERROR_SUCCESS The call succeeded. + + \retval KHM_ERROR_TOO_LONG Either \a buf was NULL or the supplied + buffer was not large enough. The required size is in \a cbbuf. + + \retval KHM_ERROR_INVALID_PARAM Invalid parameter. + */ +KHMEXP khm_int32 KHMAPI +kcdb_credtype_get_name(khm_int32 id, + wchar_t * buf, + khm_size * cbbuf); + +/*! \brief Retrieve the type specific subscription for a type + + Given a credentials type, this function returns the credentials + type specific subcription. It may return NULL if the subscription + is not available. + */ +KHMEXP khm_handle KHMAPI +kcdb_credtype_get_sub(khm_int32 id); + +/*! \brief Get the description of a credentials type + + Unlike the name of a credential type, the description is localized. + + \param[in] id Credentials type identifier + + \param[out] buf Receives the description. Can bet set to NULL if + only the size of the buffer is required. + + \param[in,out] cbbuf On entry, specifies the size of the buffer + pointed to by \a buf. On exit, specifies the required size of + the buffer or the number of bytes copied, depending on whether + the call succeeded or not. + + \param[in] flags Specify ::KCDB_TS_SHORT if the short version of + the description is desired if there is more than one. + + \retval KHM_ERROR_SUCCESS The call succeeded + \retval KHM_ERROR_TOO_LONG Either \a buf was NULL or the supplied buffer was insufficient. The required size is specified in \a cbbuf. + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. + */ +KHMEXP khm_int32 KHMAPI +kcdb_credtype_describe(khm_int32 id, + wchar_t * buf, + khm_size * cbbuf, + khm_int32 flags); + +/*! \brief Look up the identifier of a credentials type by name + + Given a name, looks up the identifier. + + \param[in] name Name of the credentials type + \param[out] id Receives the identifier if the call succeeds + + */ +KHMEXP khm_int32 KHMAPI +kcdb_credtype_get_id(wchar_t * name, + khm_int32 * id); + +/*@}*/ + +/*********************************************************************/ + +/*! \defgroup kcdb_buf Generic access to buffer + + Currently, credentials and identities both hold record data types. + This set of API's allow an application to access fields in the + records using a single interface. Note that credentials only + accept regular attributes while identities can hold both + attributes and properties. + + Handles to credentials and identities are implicitly also handles + to records. Thus they can be directly used as such. +*/ +/*@{*/ + +/*! \brief Get an attribute from a record by attribute id. + + \param[in] buffer The buffer that is to receive the attribute + value. Set this to NULL if only the required buffer size is + to be returned. + + \param[in,out] cbbuf The number of bytes available in \a buffer. + If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and + sets this to the required buffer size. + + \param[out] attr_type Receives the data type of the attribute. + Set this to NULL if the type is not required. + + \note Set both \a buffer and \a cbbuf to NULL if only the + existence of the attribute is to be checked. If the attribute + exists in this record then the function will return + KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_buf_get_attr(khm_handle record, + khm_int32 attr_id, + khm_int32 * attr_type, + void * buffer, + khm_size * pcb_buf); + +/*! \brief Get an attribute from a record by name. + + \param[in] buffer The buffer that is to receive the attribute + value. Set this to NULL if only the required buffer size is + to be returned. + + \param[in,out] cbbuf The number of bytes available in \a buffer. + If \a buffer is not sufficient, returns KHM_ERROR_TOO_LONG and + sets this to the required buffer size. + + \note Set both \a buffer and \a cbbuf to NULL if only the + existence of the attribute is to be checked. If the attribute + exists in this record then the function will return + KHM_ERROR_SUCCESS, otherwise it returns KHM_ERROR_NOT_FOUND. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_buf_get_attrib(khm_handle record, + wchar_t * attr_name, + khm_int32 * attr_type, + void * buffer, + khm_size * pcb_buf); + +/*! \brief Get the string representation of a record attribute. + + A shortcut function which generates the string representation of a + record attribute directly. + + \param[in] record A handle to a record + + \param[in] attr_id The attribute to retrieve + + \param[out] buffer A pointer to a string buffer which receives the + string form of the attribute. Set this to NULL if you only + want to determine the size of the required buffer. + + \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, + holds the size of the buffer pointed to by \a buffer, and on + exit, receives the actual number of bytes that were copied. + + \param[in] flags Flags for the string conversion. Can be set to + one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is + KCDB_TS_LONG. + + \retval KHM_ERROR_SUCCESS Success + \retval KHM_ERROR_NOT_FOUND The given attribute was either invalid + or was not defined for this record + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_TOO_LONG Either \a buffer was NULL or the + supplied buffer was insufficient +*/ +KHMEXP khm_int32 KHMAPI +kcdb_buf_get_attr_string(khm_handle record, + khm_int32 attr_id, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags); + +/*! \brief Get the string representation of a record attribute by name. + + A shortcut function which generates the string representation of a + record attribute directly. + + \param[in] record A handle to a record + + \param[in] attrib The name of the attribute to retrieve + + \param[out] buffer A pointer to a string buffer which receives the + string form of the attribute. Set this to NULL if you only + want to determine the size of the required buffer. + + \param[in,out] pcbbuf A pointer to a #khm_int32 that, on entry, + holds the size of the buffer pointed to by \a buffer, and on + exit, receives the actual number of bytes that were copied. + + \param[in] flags Flags for the string conversion. Can be set to + one of KCDB_TS_LONG or KCDB_TS_SHORT. The default is + KCDB_TS_LONG. + + \see kcdb_cred_get_attr_string() +*/ +KHMEXP khm_int32 KHMAPI +kcdb_buf_get_attrib_string(khm_handle record, + wchar_t * attr_name, + wchar_t * buffer, + khm_size * pcbbuf, + khm_int32 flags); + +/*! \brief Set an attribute in a record by attribute id + + \param[in] cbbuf Number of bytes of data in \a buffer. The + individual data type handlers may copy in less than this many + bytes in to the record. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_buf_set_attr(khm_handle record, + khm_int32 attr_id, + void * buffer, + khm_size cbbuf); + +/*! \brief Set an attribute in a record by name + + \param[in] cbbuf Number of bytes of data in \a buffer. The + individual data type handlers may copy in less than this many + bytes in to the record. +*/ +KHMEXP khm_int32 KHMAPI +kcdb_buf_set_attrib(khm_handle record, + wchar_t * attr_name, + void * buffer, + khm_size cbbuf); + +KHMEXP khm_int32 KHMAPI +kcdb_buf_hold(khm_handle record); + +KHMEXP khm_int32 KHMAPI +kcdb_buf_release(khm_handle record); + +/*@}*/ + +/********************************************************************/ + +/* Notification operation constants */ + +#define KCDB_OP_INSERT 1 +#define KCDB_OP_DELETE 2 +#define KCDB_OP_MODIFY 3 +#define KCDB_OP_ACTIVATE 4 +#define KCDB_OP_DEACTIVATE 5 +#define KCDB_OP_HIDE 6 +#define KCDB_OP_UNHIDE 7 +#define KCDB_OP_SETSEARCH 8 +#define KCDB_OP_UNSETSEARCH 9 +#define KCDB_OP_NEW_DEFAULT 10 + +/*@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khaction.h +++ krb5-1.4.4/src/windows/identity/uilib/khaction.h @@ -1,1008 +1,1008 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_ACTION_H -#define __KHIMAIRA_ACTION_H - -/*! \addtogroup khui - @{*/ -/*! \defgroup khui_actions Actions - @{*/ - -/*! \brief An action */ -typedef struct tag_khui_action { - khm_int32 cmd; /*!< action identifier */ - khm_int32 type; /*!< combination of KHUI_ACTIONTYPE_* */ - wchar_t * name; /*!< name for named actions. NULL if - not named. */ - - /* The following fields are only for use by NetIDMgr */ - khm_int16 ib_normal; /*!< (internal) normal bitmap (index) (toolbar sized icon) */ - khm_int16 ib_hot; /*!< (internal) hot bitmap (index) (toolbar sized icon) */ - khm_int16 ib_disabled; /*!< (internal) disabled bitmap (index) (toolbar sized icon) */ - - khm_int16 ib_icon; /*!< (internal) index of small (16x16) icon (for menu) (small icon) */ - khm_int16 ib_icon_dis; /*!< (internal) index of disabled (greyed) icon (small icon) */ - - khm_int16 is_caption; /*!< (internal) index of string resource for caption */ - khm_int16 is_tooltip; /*!< (internal) same for description / tooltip */ - khm_int16 ih_topic; /*!< (internal) help topic */ - - /* The following fields are specified for custom actions */ - wchar_t * caption; /*!< Caption (localized) (limited by - KHUI_MAXCCH_SHORT_DESC). The - caption is used for representing the - action in menus and toolbars. */ - wchar_t * tooltip; /*!< Tooltip (localized) (limited by - KHUI_MAXCCH_SHORT_DESC). If this is - specified, whenever the user hovers - over the menu item or toolbar button - representing the action, the tooltip - will be displayed either on a - tooltip window or in the status - bar. */ - khm_handle listener; /*!< Listener of this action. Should be - a handle to a message - subscription. When the action is - invoked, a message of type - ::KMSG_ACT and subtype - ::KMSG_ACT_ACTIVATE will be posted - to this subscriber. The \a uparam - parameter of the message will have - the identifier of the action. */ - void * data; /*!< User data for custom action. This - field is not used by the UI library. - It is reserved for plugins to store - data that is specific for this - action. The data that's passed in - in the \a userdata parameter to - khui_action_create() will be stored - here and can be retrieved by calling - khui_action_get_data(). */ - void * reserved1; /*!< Reserved. */ - void * reserved2; /*!< Reserved. */ - void * reserved3; /*!< Reserved. */ - - /* For all actions */ - int state; /*!< current state. combination of - KHUI_ACTIONSTATE_* */ -} khui_action; - -/*! \brief Unknown action type - - Unknown action type. - */ -#define KHUI_ACTIONTYPE_NONE 0 - -/*! \brief A trigger type action - - A trigger action usually triggers some event, which is what pretty - much every action does. -*/ -#define KHUI_ACTIONTYPE_TRIGGER 1 - -/*! \brief A toggle type action - - A toggle type action typically changes the CHECKED state of the - action each time it is invoked. - */ -#define KHUI_ACTIONTYPE_TOGGLE 2 - -/*! \brief The action is enabled - - This is the default if no other state is specified. Just means - not-disabled. -*/ -#define KHUI_ACTIONSTATE_ENABLED 0 - -/*! \brief The action is diabled */ -#define KHUI_ACTIONSTATE_DISABLED 1 - -/*! \brief For toggle type actions, the action is checked */ -#define KHUI_ACTIONSTATE_CHECKED 2 - -/*! \brief The action is hot - - Typically this means that the user is hovering the pointing device - over a UI element representing the action. - */ -#define KHUI_ACTIONSTATE_HOT 4 - -/*! \brief The action has been marked for deletion - - For custom actions, this means that the custom action was deleted. - The contents of the custom action fields are no longer valid. - */ -#define KHUI_ACTIONSTATE_DELETED 8 - -#ifdef NOEXPORT -#define ACTION_SIMPLE(c,cap,des,top) \ - {c,KHUI_ACTIONTYPE_TRIGGER,NULL,0,0,0,0,0,cap,des,top,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0} - -#define ACTION_FULL(cmd,type,name,inormal,ihot,idis,isml,ismld,capt,toolt,topic,state) \ - {cmd,type,name,inormal,ihot,idis,isml,ismld,capt,toolt,topic,NULL,NULL,NULL,NULL,NULL,NULL,NULL,state} - -#define ACTION_SIMPLE_IMAGE(c,inormal, ihot, idis, isml, ismld,cap, des, top) \ - {c,KHUI_ACTIONTYPE_TRIGGER,NULL,inormal,ihot,idis,isml,ismld,cap,des,top,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0} -#endif - -/*! \brief A reference to an action - - If the \a flags member has the KHUI_ACTIONREF_PACTION bit set, - then the action is referenced by the \a p_action member of the - union. Otherwise the identifier for the action is specified by \a - action member. -*/ -typedef struct tag_khui_action_ref { - int flags; /*!< A combination of KHUI_ACTIONREF_* */ - union { - khm_int32 action; /*!< The action identifier for the - action that is being referrred to. - Only valid if - ::KHUI_ACTIONREF_PACTION is not set - in \a flags. */ - khui_action * p_action; /*!< A pointer to the ::khui_action - structure that describes the action - that is being referred to. Only - valid if ::KHUI_ACTIONREF_PACTION is - set. */ - }; -} khui_action_ref; - -/*! \brief A submenu - - There should exist a menu associated with the action that is being - referred. When displaying this action in a menu, the contents of - the associated menu will appear as a submenu. - */ -#define KHUI_ACTIONREF_SUBMENU 0x01 - -/*! \brief Separator - - This is not an actual action, but represents a separator between - actions. When displaying this action in a menu or a toolbar, a - separating line will be drawn in place of this action. The \a - action and \a p_action members of the structures are unused if - this flag is set. - */ -#define KHUI_ACTIONREF_SEP 0x02 - -/*! \brief Action by reference - - The \a p_action member of the structure points to the - ::khui_action structure that describes the action. - */ -#define KHUI_ACTIONREF_PACTION 0x04 - -#ifdef NOEXPORT -/*! \brief Action should be freed - - \note This flag is reserved for internal use in the NetIDMgr - application. Do not use. - */ -#define KHUI_ACTIONREF_FREE_PACTION 0x08 - -/*! \brief Marks the end of an action sequence - - \note THis flag is reserved for internal use in the NetIDMgr - application. Do not use. - */ -#define KHUI_ACTIONREF_END 0x10 -#endif - -/*! \brief The default action - - When this bit is set in an action reference that describes a menu, - the menu item will be the default item and will be rendered - differently from other menu items. Only useful when defining - context menus. In general, it is good practice to place the - default item at the top of a menu, although the UI library does - not enforce this. This is purely meant as a rendering hint. - */ -#define KHUI_ACTIONREF_DEFAULT 0x20 - -#ifdef NOEXPORT -#define MENU_ACTION(c) {0,c} -#define MENU_DEFACTION(c) {KHUI_ACTIONREF_DEFAULT, c} -#define MENU_SUBMENU(s) {KHUI_ACTIONREF_SUBMENU,s} -#define MENU_SEP() {KHUI_ACTIONREF_SEP,KHUI_MENU_SEP} -#define MENU_END() {KHUI_ACTIONREF_END,KHUI_MENU_END} -#endif - -/*! \brief Menu definition - - Use the khui_menu_create(), khui_menu_insert_action(), - khui_menu_insert_paction(), khui_menu_get_size(), - khui_menu_get_action() functions to create and manipulate custom - menus. Do not manipulate this structure directly as doing so may - cause inconsistencies in the UI library. -*/ -typedef struct tag_khui_menu_def { - khm_int32 cmd; /*!< Action associated with menu */ - khm_int32 state; /*!< combination of KHUI_MENUSTATE_* */ - khm_size n_items; /*!< The number of actions in the \a items - list. If this is a custom menu, the - ::KHUI_MENUSTATE_ALLOCD bit will be set, - and the contents of this field will be - valid. Otherwise, the contents of this - field is ignored and the list of actions - must be terminated with a - ACTION_LIST_END action. */ - khm_size nc_items; /*!< max number of items in the buffer - alocated for items. Ignored if - ::KHUI_MENUSTATE_ALLOCD is not set in \a - state. */ - khui_action_ref *items; /*!< Action list terminated by, - ACTION_LIST_END. If \a n_items is set - to a value other than -1, the list - doesn't necessarily have to end with a - ACTION_LIST_END. When constructing a - menu using khui_menu_* functions, they - will set the size of this list in the \a - n_items member, and there will be no - ACTION_LIST_END action to terminate the - list. */ -} khui_menu_def; - -#ifdef NOEXPORT -#define CONSTMENU(c,s,i) {c,s,-1,-1,i} -#endif - -/*! \brief Unspecified menu - - Used when there is no single command associated with the entire - menu, such as for ad-hoc context menus. - */ -#define KHUI_MENU_NONE -3 - -/*! \brief Menu end indicator - - For static or constant menus this indicates that this action marks - the end of the list of actions which defined the menu. This is - invalid if used in a dynamic menu (a menu with the - ::KHUI_MENUSTATE_ALLOCD bit set). - */ -#define KHUI_MENU_END -2 - -/*! \brief Menu separator - - A separator for actions. When displaying a menu or showing a - toolbar based on a menu definition, a separator is rendered as a - bar separating the user interface elements for the actions on - either side of this. -*/ -#define KHUI_MENU_SEP -1 - -/*! \brief Constant menu - - The contents of the menu cannot be modified (individual actions in - the menu may be modified, but the order and the contents of the - menu itself cannot be modified. - - This is the default if ::KHUI_MENUSTATE_ALLOCD is not specified. - */ -#define KHUI_MENUSTATE_CONSTANT 0 - -/*! \brief Variable menu - - The menu is dnamically allocated. The list of actions contained - in the menu can be modified. -*/ -#define KHUI_MENUSTATE_ALLOCD 1 - -#ifdef NOEXPORT -/* predefined system menu */ -#define KHUI_MENUSTATE_SYSTEM 2 -#endif - -#ifdef NOEXPORT - -/*! \brief Accelerator definition */ -typedef struct tag_khui_accel_def { - int cmd; - int mod; - int key; - int scope; -} khui_accel_def; - -#define KHUI_ACCEL_SCOPE_GLOBAL 0 - -extern khui_accel_def khui_accel_global[]; -extern int khui_n_accel_global; - -extern khui_action khui_actions[]; -extern int khui_n_actions; - -extern khui_menu_def khui_all_menus[]; -extern int khui_n_all_menus; - -#endif /* NOEXPORT */ - -/* functions */ - -/*! \brief Create a new menu - - Creates a new menu. The returned data structure must be freed by - a call to khui_menu_delete(). Custom menus that are created this - way are not reference counted or maintained by the UI library. - The caller is responsible for calling khui_menu_delete() when the - data is no longer needed. - - Specifiying an action in the \a action parameter will associate - the menu with the specified action. In this case, if the action - is added to another menu with the ::KHUI_ACTIONREF_SUBMENU flag, - this menu will appear as a submenu within that menu. Only one - menu can be associated with any given action. Custom menus can - not be associated with standard actions. - */ -KHMEXP khui_menu_def * KHMAPI -khui_menu_create(khm_int32 action); - -/*! \brief Duplicate a menu - - Creates a copy of the specified menu. The returned data structure - must be freed by a call to khui_menu_delete(). Custom menus are - not reference counted or maintained by the UI library. The caller - is responsible for calling khui_menu_delete() when the data is no - longer needed. - - Note that even if the original menu was associated with an action, - the duplicate will not be. Modifying the duplicate will not - modify the original menu. Only one menu can be associated with an - action. - */ -KHMEXP khui_menu_def * KHMAPI -khui_menu_dup(khui_menu_def * src); - -/*! \brief Delete a menu - - Deletes a menu created by a call to khui_menu_create() or - khui_menu_dup(). This frees up the memory and associated - resources used by the menu definition. The pointer that is passed - in will no longer be valid. - */ -KHMEXP void KHMAPI -khui_menu_delete(khui_menu_def * d); - -/*! \brief Insert an action into a menu - - The action specified by \a cmd will be inserted in to the menu \a - d at index \a idx. - - \param[in] d The menu to insert the action into - - \param[in] idx The index at which to insert the action. The index - is zero based. If \a idx is (-1) or larger than the largest - index in the menu, the item is appended to the menu. - - \param[in] cmd The command representing the action to insert into - the menu. This should be either a standard action, a user - action created with khui_action_create(), or certain pseudo - actions. Not all pseudo actions can be placed on a menu. - - \param[in] flags Flags for the action. This is a combination of - KHUI_ACTIONREF_* constants. Currently, the only constants - that are valid for this function are: ::KHUI_ACTIONREF_SEP, - ::KHUI_ACTIONREF_SUBMENU, ::KHUI_ACTIONREF_DEFAULT. - ::KHUI_ACTIONREF_SEP will be automatically added if the - command is ::KHUI_MENU_SEP. - - \note The ::khui_menu_def structure is not thread safe. Multiple - threads modifying the same ::khui_menu_def structure may cause - thread safety issues. - */ -KHMEXP void KHMAPI -khui_menu_insert_action(khui_menu_def * d, khm_size idx, khm_int32 cmd, khm_int32 flags); - -#define khui_menu_add_action(d,c) khui_menu_insert_action((d),-1,(c),0) -#pragma deprecated(khui_menu_add_action) - -#ifdef NOEXPORT - -/*! \brief Insert an action by reference into a menu - - The action specified by \a act will be inserted into the menu \a d - at index \a idx. - - \param[in] d The menu to inser the action into. - - \param[in] idx The index at which to insert the action. The index - is zero based. If the index is (-1) or is larger than the - largest index in the menu, then the action is appended to the - menu. - - \param[in] act The action to insert. This is added by reference. - It is the callers reponsibility to ensure that the structure - pointed to by \a act is available throughout the lifetime of - the menu. - - \param[in] flags Flags for the action. This is a combination of - KHUI_ACTIONREF_* constants. Currently, the only constants - that are valid for this function are: ::KHUI_ACTIONREF_SEP, - ::KHUI_ACTIONREF_SUBMENU, ::KHUI_ACTIONREF_DEFAULT. For this - function, ::KHUI_ACTIONREF_PACTION will automatically be aded - when adding the action. ::KHUI_ACTIONREF_SEP will be - automatically added if the command is ::KHUI_MENU_SEP. - - \note The ::khui_menu_def structure is not thread safe. Multiple - threads modifying the same ::khui_menu_def structure may cause - thread safety issues. -*/ -KHMEXP void KHMAPI -khui_menu_insert_paction(khui_menu_def * d, khm_size idx, khui_action * act, khm_int32 flags); - -#define khui_menu_add_paction(d,a,f) khui_menu_insert_paction((d),-1,(a),(f)) -#pragma deprecated(khui_menu_add_paction) - -#endif - -/*! \brief Remove an action from a menu - - The action at the specified index will be removed from the menu. - */ -KHMEXP void KHMAPI -khui_menu_remove_action(khui_menu_def * d, khm_size idx); - -/*! \brief Get the number of items in the menu - - Note that the count includes menu separators. The indices of the - menu items range from 0 to one less than the value returned by - this function. - */ -KHMEXP khm_size KHMAPI -khui_menu_get_size(khui_menu_def * d); - -/*! \brief Get the menu item at a specified index - - The returned reference is only valid while the ::khui_menu_def - structure is valid. In addition, the reference becomes invalid if - the list of actions in the menu data structure is modified in any - way. - - If the specified index is out of bounds, then the function returns - NULL. - - \note The ::khui_menu_def structure is not thread safe. Multiple - threads modifying the same ::khui_menu_def structure may cause - thread safety issues. - */ -KHMEXP khui_action_ref * -khui_menu_get_action(khui_menu_def * d, khm_size idx); - -/*! \brief Action scope identifiers - - The scope identifier is a value which describes the scope of the - cursor context. See documentation on individual scope identifiers - for details. - - The role of the scope identifier is to provide a summary of the - current cursor context. Specifically, these identify several - special cases of credential selection, such as the selection of an - entire identity, a credential type or a single credential. If - none of these are applicable, then the generic scope identifier - ::KHUI_SCOPE_GROUP is set or ::KHUI_SCOPE_NONE if there is nothing - selected. - - Note that the scope typically only apply to cursor contexts and - not the selection context. Please see - \ref khui_context "UI Contexts" for more information. - - \see \ref khui_context "UI Contexts" -*/ -typedef enum tag_khui_scope { - KHUI_SCOPE_NONE, - /*!< No context. Nothing is selected. */ - - KHUI_SCOPE_IDENT, - /*!< Identity. The selection is the entire identity specified in - the \a identity field of the context. */ - - KHUI_SCOPE_CREDTYPE, - /*!< A credentials type. The selection is an entire credentials - type. If \a identity is non-NULL, then the scope is all the - credentials of type \a cred_type which belong to \a identity. - Otherwise, the selection is all credentials of type \a - cred_type. - - \note The \a identity can be non-NULL even for the case where - all credentials of type \a cred_type under \a identity is the - same scope as all credentials of type \a cred_type under all - identities. */ - - KHUI_SCOPE_GROUP, - /*!< A grouping of credentials. The scope is a group of - credentials which can not be simplified using one of the other - context identifiers. The \a headers array contains \a n_headers - elements describing the outline level that has been selected. - - \see ::khui_header - \see \ref khui_context_sel_ctx_grp "KHUI_SCOPE_GROUP description" */ - - KHUI_SCOPE_CRED - /*!< A single credential. Only a single credential was - selected. The \a cred field of the context specifies the - credential. The \a identity and \a cred_type fields specify the - identity and the credential type respectively. */ -} khui_scope; - - -/*! \brief Outline header - - Describes an outline header in the user interface. - - \see \ref khui_context_sel_ctx_grp "KHUI_SCOPE_GROUP description" - */ -typedef struct tag_khui_header { - khm_int32 attr_id; /*!< Attribute ID */ - void * data; /*!< Value of attribute */ - khm_size cb_data; /*!< Size of the value */ -} khui_header; - -/*! \brief Maximum number of outline headers - - This is the maximum number of fields that the credentials view can - be grouped by. - */ -#define KHUI_MAX_HEADERS 6 - -/*! \brief Action context - - Represents the UI context for an action. - */ -typedef struct tag_khui_action_context { - khm_int32 magic; /*!< Internal. */ - khui_scope scope; /*!< Context scope. One of ::khui_scope*/ - khm_handle identity; /*!< Identity */ - khm_int32 cred_type; /*!< Credential type ID */ - khm_handle cred; /*!< Credential */ - - khui_header headers[KHUI_MAX_HEADERS]; - /*!< The ordered set of outline - headers which define the current - cursor location. */ - - khm_size n_headers; /*!< Number of actual headers defined - above */ - - khm_handle credset; /*!< Handle to a credential set - containing the currently selected - credentials. When the context is - obtained through khui_context_get(), - this credential is returned in a - sealed state. */ - - khm_size n_sel_creds; /*!< Number of selected credentials */ - - void * int_buf; /*!< Internal. Do not use. */ - khm_size int_cb_buf; /*!< Internal. Do not use. */ - khm_size int_cb_used; /*!< Internal. Do not use. */ - - void * vparam; /*!< Optional data */ - khm_size cb_vparam; /*!< Size of optional data */ -} khui_action_context; - -/*! \brief Set the current context - - Changes the UI context to that represented by the parameters to - the function. Note that specifying a valid \a identity or \a cred - parameter will result in an automatic hold on the respective - object. The hold will stay until another call to - khui_context_set() overwrites the identity or credential handle or - a call to khui_context_reset() is made. - - While this API is available, it is only called from the main - NetIDMgr application. Plugins do not have a good reason to call - this API directly and should not do so. - - \param[in] scope The new context scope - - \param[in] identity A handle to an identity. If this is not NULL, - then it should be a valid handle to an identity. Required if - \a scope specifies ::KHUI_SCOPE_IDENT. Optional if \a scope - specifies ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. - - \param[in] cred_type A credentials type. Specify - ::KCDB_CREDTYPE_INVALID if this parameter is not given or not - relevant. Required if \a scope specifies - ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. - - \param[in] cred A handle to a credential. If this parameter is - not NULL it is expected to be a valid handle to a credential. - Required if \a scope specifies ::KHUI_SCOPE_CRED. Ignored - otherwise. - - \param[in] headers An array of headers. The \a n_headers - parameter specifies the number of elements in the array. Set - to NULL if not specified. Required if \a scope specifies - ::KHUI_SCOPE_GROUP. - - \param[in] n_headers Number of elements in \a headers. Must be - less than or equal to ::KHUI_MAX_HEADERS. Required if \a - headers is not NULL. Ignored otherwise. - - \param[in] cs_src A handle to a credential set from which the - selected credentials will be extracted. The credentials that - are selected must have the ::KCDB_CRED_FLAG_SELECTED flag set. - - \note This function should only be called from the UI thread. - */ -KHMEXP void KHMAPI -khui_context_set(khui_scope scope, - khm_handle identity, - khm_int32 cred_type, - khm_handle cred, - khui_header *headers, - khm_size n_headers, - khm_handle cs_src); - -/*! \brief Set the current context - - Changes the UI context to that represented by the parameters to - the function. Note that specifying a valid \a identity or \a cred - parameter will result in an automatic hold on the respective - object. The hold will stay until another call to - khui_context_set() overwrites the identity or credential handle or - a call to khui_context_reset() is made. - - While this API is available, it is only called from the main - NetIDMgr application. Plugins do not have a good reason to call - this API directly and should not do so. - - \param[in] scope The new context scope - - \param[in] identity A handle to an identity. If this is not NULL, - then it should be a valid handle to an identity. Required if - \a scope specifies ::KHUI_SCOPE_IDENT. Optional if \a scope - specifies ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. - - \param[in] cred_type A credentials type. Specify - ::KCDB_CREDTYPE_INVALID if this parameter is not given or not - relevant. Required if \a scope specifies - ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. - - \param[in] cred A handle to a credential. If this parameter is - not NULL it is expected to be a valid handle to a credential. - Required if \a scope specifies ::KHUI_SCOPE_CRED. Ignored - otherwise. - - \param[in] headers An array of headers. The \a n_headers - parameter specifies the number of elements in the array. Set - to NULL if not specified. Required if \a scope specifies - ::KHUI_SCOPE_GROUP. - - \param[in] n_headers Number of elements in \a headers. Must be - less than or equal to ::KHUI_MAX_HEADERS. Required if \a - headers is not NULL. Ignored otherwise. - - \param[in] cs_src A handle to a credential set from which the - selected credentials will be extracted. The credentials that - are selected must have the ::KCDB_CRED_FLAG_SELECTED flag set. - - \param[in] vparam Optional parameter blob - - \param[in] cb_vparam Size of parameter blob - - \note This function should only be called from the UI thread. - */ -KHMEXP void KHMAPI -khui_context_set_ex(khui_scope scope, - khm_handle identity, - khm_int32 cred_type, - khm_handle cred, - khui_header *headers, - khm_size n_headers, - khm_handle cs_src, - void * vparam, - khm_size cb_vparam); - -/*! \brief Set the current UI context using an existing context - - Copies the context specified in \a ctx into the active UI context. - - \param[in] ctx A pointer to a ::khui_action_context structure that - specifies the new UI context. Cannot be NULL. -*/ -KHMEXP void KHMAPI -khui_context_set_indirect(khui_action_context * ctx); - -/*! \brief Obtain the current UI context - - The parameter specified by \a ctx will receive the current UI - context. If the context contains an identity or a credential - handle, a hold will be obtained on the relevant object. Use - khui_context_release() to release the holds obtained in a prior - call to khui_context_get(). - - \note The returned context should not be modified prior to calling - khui_context_release(). -*/ -KHMEXP void KHMAPI -khui_context_get(khui_action_context * ctx); - -/*! \brief Create a new UI context - - The created context does not have any relation to the current UI - context. This function is provided for use in situations where an - application needs to provide a scope description through a - ::khui_action_context structure. - - Once the application is done with the context, it should call - khui_context_release() to release the created context. - */ -KHMEXP void KHMAPI -khui_context_create(khui_action_context * ctx, - khui_scope scope, - khm_handle identity, - khm_int32 cred_type, - khm_handle cred); - -/*! \brief Release a context obtained using khui_context_get() - - Releases all holds obtained on related objects in a prior call to - khui_context_get() and nullifies the context. - - \note The context should not have been modified between calling - khui_context_get() and khui_context_release() - */ -KHMEXP void KHMAPI -khui_context_release(khui_action_context * ctx); - -/*! \brief Reset the UI context - - Nullifies the current UI context and releases any holds obtained - on objects related to the previous context. -*/ -KHMEXP void KHMAPI -khui_context_reset(void); - -/*! \brief Refresh context data - - Setting the UI context involves other side effects such as - activation of or disabling certain actions based on the selection. - If an operation is performed which may affect the side effects, - khui_context_refresh() is called to refresh them. - - An example is when setting the default identity. The state of the - action ::KHUI_ACTION_SET_DEF_ID depends on whether the currently - selected identity is the default. However, if the currently - selected identity becomes the default after selection, then - khui_context_refresh() should be called to adjust the state of the - ::KHUI_ACTION_SET_DEF_ID action. - */ -KHMEXP void KHMAPI -khui_context_refresh(void); - -/*! \brief A filter function that filters for credentials in the cursor context - - This is a function of type ::kcdb_cred_filter_func which can be - used to filter for credentials that are included in the cursor - context. - - The \a rock parameter should be a pointer to a - ::khui_action_context structure which will be used as the filter. - - For example, the following code will extract the cursor context - credentials into the credential set \a my_credset based on the UI - context \a my context: - - \code - kcdb_credset_extract_filtered(my_credset, - NULL, - khui_context_cursor_filter, - (void *) my_context); - \endcode -*/ -KHMEXP khm_int32 KHMAPI -khui_context_cursor_filter(khm_handle cred, - khm_int32 flags, - void * rock); - -/*! \brief Get a string representation of an accelerator - - \param[in] cmd Command for which to obtain the accelerator string for - \param[out] buf Buffer to receive the accelerator string - \param[in] bufsiz Size of the buffer in bytes. Note that the size of the - buffer must be sufficient to hold at least one character and a - NULL terminator. - - \return TRUE if the operation was successful. FALSE otherwise. - */ -KHMEXP khm_boolean KHMAPI khui_get_cmd_accel_string(khm_int32 cmd, wchar_t * buf, khm_size bufsiz); - -#ifdef NOEXPORT -/*! \brief Initializes the global accelerator table - */ -KHMEXP HACCEL KHMAPI khui_create_global_accel_table(void); -#endif - -/*! \brief Find a menu by id - - Finds the menu that is associated with the specified action. - */ -KHMEXP khui_menu_def * KHMAPI khui_find_menu(khm_int32 action); - -#ifdef NOEXPORT - -/* internal */ -KHMEXP void KHMAPI -khui_set_main_window(HWND hwnd); - -#endif - -/*! \brief Trigger an action - - Triggers the specified action using the specified UI context. - - This function does not return until the specified action has been - processed. Many standard actions are asynchronous and they will - return before processing will complete. - - Pseudo actions should not be triggered using khui_action_trigger() - as they only carry meaning when invoked from specific windows or - contexts. - - \param[in] action Action. Should be one of the standard actions - or an action created by khui_action_create() - - \param[in] ctx The UI context to use for the action. If this is - NULL, the action will be triggered under the current UI context. - */ -KHMEXP void KHMAPI -khui_action_trigger(khm_int32 action, khui_action_context * ctx); - -/*! \brief Find an action by id - - \note This function should not be used by plugins. It is there - for use by the NetIDMgr application. -*/ -KHMEXP khui_action * KHMAPI khui_find_action(khm_int32 action); - -#ifdef NOEXPORT -/*! \brief Get the length of the action list */ -KHMEXP size_t KHMAPI khui_action_list_length(khui_action_ref * ref); -#endif - -/*! \brief Create a new action - - \param[in] name Name for a named action. The name must be unique - among all registered actions. (limited by KHUI_MAXCCH_NAME) - (Optional. Set to NULL if the action is not a named action.) - - \param[in] caption The localized caption for the action. This - will be shown in menus, toolbars and buttons when the action - needs to be represented. (limited by KHUI_MAXCCH_SHORT_DESC) - (Required) - - \param[in] tooltip The localized tooltip for the action. (limited - by KHUI_MAXCCH_SHORT_DESC) (Optional, set to NULL if there is - no tooltip associated with the action) - - \param[in] hsub The subscription that is notified when the action - is triggered. (Optional) The subscription can be created with - kmq_create_subscription(). The handle will be released when - it is no longer needed. Hence, the caller should not release - it. - - \param[in] type The type of the action. Currently it should be - set to either ::KHUI_ACTIONTYPE_TRIGGER or - ::KHUI_ACTIONTYPE_TOGGLE. For ::KHUI_ACTIONTYPE_TOGGLE, the - initial state will be unchecked. Use khui_check_action() - function to change the checked state of the action. - - \param[in] userdata A custom value. - - \return The identifier of the new action or zero if the action - could not be created. - - \note For named custom actions, the name of the action can not be - the same as the name of a configuration node. See - khui_cfg_register_node(). - */ -KHMEXP khm_int32 KHMAPI -khui_action_create(const wchar_t * name, - const wchar_t * caption, - const wchar_t * tooltip, - void * userdata, - khm_int32 type, - khm_handle hsub); - -/* \brief Delete a custom action - - Deletes a custom action created by a call to khui_action_create(). - Custom actions should only be deleted when unloading a plugin. - */ -KHMEXP void KHMAPI -khui_action_delete(khm_int32 action); - -/*! \brief Get the user data associated with a custom action - - This function returns the user data that was specified when the - custom action was created usng khui_action_create(). If the - custom action identifier is invalid or if the custom action does - not contain any user data, this function will return NULL. - */ -KHMEXP void * KHMAPI -khui_action_get_data(khm_int32 action); - -/*! \brief Find an action by name */ -KHMEXP khui_action * KHMAPI khui_find_named_action(const wchar_t * name); - -/*! \brief Enables or disables a group of actions - - The group of actions are specified by the menu definition. All - valid action entries in the menu are marked as enabled or disabled - according to the value of \a enable. - */ -KHMEXP void KHMAPI khui_enable_actions(khui_menu_def * d, khm_boolean enable); - -/*! \brief Enables or disables an action - - The action designated by the command \a action will either be enabled - or disabled depending on the \a enable parameter. If \a enable is - TRUE then the action is enabled. - */ -KHMEXP void KHMAPI khui_enable_action(khm_int32 action, khm_boolean enable); - -/*! \brief Check an action in an action group - - Marks the action denoted by \a action as checked and resets the - checked bit in all other actions. - - \param[in] d A menu definition. - - \param[in] action A command identifier. Setting this to -1 will - reset the checked bit in all the actions in the menu - definition. - */ -KHMEXP void KHMAPI khui_check_radio_action(khui_menu_def * d, khm_int32 action); - -/*! \brief Check an action - - For toggle typed actions, this sets or resets the check. - */ -KHMEXP void KHMAPI khui_check_action(khm_int32 cmd, khm_boolean check); - -#ifdef NOEXPORT -/*!\cond INTERNAL */ - -/*! \brief Initialize actions - - \note Only called by the NetIDMgr application - */ -KHMEXP void KHMAPI khui_init_actions(void); - -/*! \brief Exit actions - - \note Only called by the NetIDMgr application - */ -KHMEXP void KHMAPI khui_exit_actions(void); - -/*! \endcond */ -#endif - -/*@}*/ -/*@}*/ -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_ACTION_H +#define __KHIMAIRA_ACTION_H + +/*! \addtogroup khui + @{*/ +/*! \defgroup khui_actions Actions + @{*/ + +/*! \brief An action */ +typedef struct tag_khui_action { + khm_int32 cmd; /*!< action identifier */ + khm_int32 type; /*!< combination of KHUI_ACTIONTYPE_* */ + wchar_t * name; /*!< name for named actions. NULL if + not named. */ + + /* The following fields are only for use by NetIDMgr */ + khm_int16 ib_normal; /*!< (internal) normal bitmap (index) (toolbar sized icon) */ + khm_int16 ib_hot; /*!< (internal) hot bitmap (index) (toolbar sized icon) */ + khm_int16 ib_disabled; /*!< (internal) disabled bitmap (index) (toolbar sized icon) */ + + khm_int16 ib_icon; /*!< (internal) index of small (16x16) icon (for menu) (small icon) */ + khm_int16 ib_icon_dis; /*!< (internal) index of disabled (greyed) icon (small icon) */ + + khm_int16 is_caption; /*!< (internal) index of string resource for caption */ + khm_int16 is_tooltip; /*!< (internal) same for description / tooltip */ + khm_int16 ih_topic; /*!< (internal) help topic */ + + /* The following fields are specified for custom actions */ + wchar_t * caption; /*!< Caption (localized) (limited by + KHUI_MAXCCH_SHORT_DESC). The + caption is used for representing the + action in menus and toolbars. */ + wchar_t * tooltip; /*!< Tooltip (localized) (limited by + KHUI_MAXCCH_SHORT_DESC). If this is + specified, whenever the user hovers + over the menu item or toolbar button + representing the action, the tooltip + will be displayed either on a + tooltip window or in the status + bar. */ + khm_handle listener; /*!< Listener of this action. Should be + a handle to a message + subscription. When the action is + invoked, a message of type + ::KMSG_ACT and subtype + ::KMSG_ACT_ACTIVATE will be posted + to this subscriber. The \a uparam + parameter of the message will have + the identifier of the action. */ + void * data; /*!< User data for custom action. This + field is not used by the UI library. + It is reserved for plugins to store + data that is specific for this + action. The data that's passed in + in the \a userdata parameter to + khui_action_create() will be stored + here and can be retrieved by calling + khui_action_get_data(). */ + void * reserved1; /*!< Reserved. */ + void * reserved2; /*!< Reserved. */ + void * reserved3; /*!< Reserved. */ + + /* For all actions */ + int state; /*!< current state. combination of + KHUI_ACTIONSTATE_* */ +} khui_action; + +/*! \brief Unknown action type + + Unknown action type. + */ +#define KHUI_ACTIONTYPE_NONE 0 + +/*! \brief A trigger type action + + A trigger action usually triggers some event, which is what pretty + much every action does. +*/ +#define KHUI_ACTIONTYPE_TRIGGER 1 + +/*! \brief A toggle type action + + A toggle type action typically changes the CHECKED state of the + action each time it is invoked. + */ +#define KHUI_ACTIONTYPE_TOGGLE 2 + +/*! \brief The action is enabled + + This is the default if no other state is specified. Just means + not-disabled. +*/ +#define KHUI_ACTIONSTATE_ENABLED 0 + +/*! \brief The action is diabled */ +#define KHUI_ACTIONSTATE_DISABLED 1 + +/*! \brief For toggle type actions, the action is checked */ +#define KHUI_ACTIONSTATE_CHECKED 2 + +/*! \brief The action is hot + + Typically this means that the user is hovering the pointing device + over a UI element representing the action. + */ +#define KHUI_ACTIONSTATE_HOT 4 + +/*! \brief The action has been marked for deletion + + For custom actions, this means that the custom action was deleted. + The contents of the custom action fields are no longer valid. + */ +#define KHUI_ACTIONSTATE_DELETED 8 + +#ifdef NOEXPORT +#define ACTION_SIMPLE(c,cap,des,top) \ + {c,KHUI_ACTIONTYPE_TRIGGER,NULL,0,0,0,0,0,cap,des,top,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0} + +#define ACTION_FULL(cmd,type,name,inormal,ihot,idis,isml,ismld,capt,toolt,topic,state) \ + {cmd,type,name,inormal,ihot,idis,isml,ismld,capt,toolt,topic,NULL,NULL,NULL,NULL,NULL,NULL,NULL,state} + +#define ACTION_SIMPLE_IMAGE(c,inormal, ihot, idis, isml, ismld,cap, des, top) \ + {c,KHUI_ACTIONTYPE_TRIGGER,NULL,inormal,ihot,idis,isml,ismld,cap,des,top,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0} +#endif + +/*! \brief A reference to an action + + If the \a flags member has the KHUI_ACTIONREF_PACTION bit set, + then the action is referenced by the \a p_action member of the + union. Otherwise the identifier for the action is specified by \a + action member. +*/ +typedef struct tag_khui_action_ref { + int flags; /*!< A combination of KHUI_ACTIONREF_* */ + union { + khm_int32 action; /*!< The action identifier for the + action that is being referrred to. + Only valid if + ::KHUI_ACTIONREF_PACTION is not set + in \a flags. */ + khui_action * p_action; /*!< A pointer to the ::khui_action + structure that describes the action + that is being referred to. Only + valid if ::KHUI_ACTIONREF_PACTION is + set. */ + }; +} khui_action_ref; + +/*! \brief A submenu + + There should exist a menu associated with the action that is being + referred. When displaying this action in a menu, the contents of + the associated menu will appear as a submenu. + */ +#define KHUI_ACTIONREF_SUBMENU 0x01 + +/*! \brief Separator + + This is not an actual action, but represents a separator between + actions. When displaying this action in a menu or a toolbar, a + separating line will be drawn in place of this action. The \a + action and \a p_action members of the structures are unused if + this flag is set. + */ +#define KHUI_ACTIONREF_SEP 0x02 + +/*! \brief Action by reference + + The \a p_action member of the structure points to the + ::khui_action structure that describes the action. + */ +#define KHUI_ACTIONREF_PACTION 0x04 + +#ifdef NOEXPORT +/*! \brief Action should be freed + + \note This flag is reserved for internal use in the NetIDMgr + application. Do not use. + */ +#define KHUI_ACTIONREF_FREE_PACTION 0x08 + +/*! \brief Marks the end of an action sequence + + \note THis flag is reserved for internal use in the NetIDMgr + application. Do not use. + */ +#define KHUI_ACTIONREF_END 0x10 +#endif + +/*! \brief The default action + + When this bit is set in an action reference that describes a menu, + the menu item will be the default item and will be rendered + differently from other menu items. Only useful when defining + context menus. In general, it is good practice to place the + default item at the top of a menu, although the UI library does + not enforce this. This is purely meant as a rendering hint. + */ +#define KHUI_ACTIONREF_DEFAULT 0x20 + +#ifdef NOEXPORT +#define MENU_ACTION(c) {0,c} +#define MENU_DEFACTION(c) {KHUI_ACTIONREF_DEFAULT, c} +#define MENU_SUBMENU(s) {KHUI_ACTIONREF_SUBMENU,s} +#define MENU_SEP() {KHUI_ACTIONREF_SEP,KHUI_MENU_SEP} +#define MENU_END() {KHUI_ACTIONREF_END,KHUI_MENU_END} +#endif + +/*! \brief Menu definition + + Use the khui_menu_create(), khui_menu_insert_action(), + khui_menu_insert_paction(), khui_menu_get_size(), + khui_menu_get_action() functions to create and manipulate custom + menus. Do not manipulate this structure directly as doing so may + cause inconsistencies in the UI library. +*/ +typedef struct tag_khui_menu_def { + khm_int32 cmd; /*!< Action associated with menu */ + khm_int32 state; /*!< combination of KHUI_MENUSTATE_* */ + khm_size n_items; /*!< The number of actions in the \a items + list. If this is a custom menu, the + ::KHUI_MENUSTATE_ALLOCD bit will be set, + and the contents of this field will be + valid. Otherwise, the contents of this + field is ignored and the list of actions + must be terminated with a + ACTION_LIST_END action. */ + khm_size nc_items; /*!< max number of items in the buffer + alocated for items. Ignored if + ::KHUI_MENUSTATE_ALLOCD is not set in \a + state. */ + khui_action_ref *items; /*!< Action list terminated by, + ACTION_LIST_END. If \a n_items is set + to a value other than -1, the list + doesn't necessarily have to end with a + ACTION_LIST_END. When constructing a + menu using khui_menu_* functions, they + will set the size of this list in the \a + n_items member, and there will be no + ACTION_LIST_END action to terminate the + list. */ +} khui_menu_def; + +#ifdef NOEXPORT +#define CONSTMENU(c,s,i) {c,s,-1,-1,i} +#endif + +/*! \brief Unspecified menu + + Used when there is no single command associated with the entire + menu, such as for ad-hoc context menus. + */ +#define KHUI_MENU_NONE -3 + +/*! \brief Menu end indicator + + For static or constant menus this indicates that this action marks + the end of the list of actions which defined the menu. This is + invalid if used in a dynamic menu (a menu with the + ::KHUI_MENUSTATE_ALLOCD bit set). + */ +#define KHUI_MENU_END -2 + +/*! \brief Menu separator + + A separator for actions. When displaying a menu or showing a + toolbar based on a menu definition, a separator is rendered as a + bar separating the user interface elements for the actions on + either side of this. +*/ +#define KHUI_MENU_SEP -1 + +/*! \brief Constant menu + + The contents of the menu cannot be modified (individual actions in + the menu may be modified, but the order and the contents of the + menu itself cannot be modified. + + This is the default if ::KHUI_MENUSTATE_ALLOCD is not specified. + */ +#define KHUI_MENUSTATE_CONSTANT 0 + +/*! \brief Variable menu + + The menu is dnamically allocated. The list of actions contained + in the menu can be modified. +*/ +#define KHUI_MENUSTATE_ALLOCD 1 + +#ifdef NOEXPORT +/* predefined system menu */ +#define KHUI_MENUSTATE_SYSTEM 2 +#endif + +#ifdef NOEXPORT + +/*! \brief Accelerator definition */ +typedef struct tag_khui_accel_def { + int cmd; + int mod; + int key; + int scope; +} khui_accel_def; + +#define KHUI_ACCEL_SCOPE_GLOBAL 0 + +extern khui_accel_def khui_accel_global[]; +extern int khui_n_accel_global; + +extern khui_action khui_actions[]; +extern int khui_n_actions; + +extern khui_menu_def khui_all_menus[]; +extern int khui_n_all_menus; + +#endif /* NOEXPORT */ + +/* functions */ + +/*! \brief Create a new menu + + Creates a new menu. The returned data structure must be freed by + a call to khui_menu_delete(). Custom menus that are created this + way are not reference counted or maintained by the UI library. + The caller is responsible for calling khui_menu_delete() when the + data is no longer needed. + + Specifiying an action in the \a action parameter will associate + the menu with the specified action. In this case, if the action + is added to another menu with the ::KHUI_ACTIONREF_SUBMENU flag, + this menu will appear as a submenu within that menu. Only one + menu can be associated with any given action. Custom menus can + not be associated with standard actions. + */ +KHMEXP khui_menu_def * KHMAPI +khui_menu_create(khm_int32 action); + +/*! \brief Duplicate a menu + + Creates a copy of the specified menu. The returned data structure + must be freed by a call to khui_menu_delete(). Custom menus are + not reference counted or maintained by the UI library. The caller + is responsible for calling khui_menu_delete() when the data is no + longer needed. + + Note that even if the original menu was associated with an action, + the duplicate will not be. Modifying the duplicate will not + modify the original menu. Only one menu can be associated with an + action. + */ +KHMEXP khui_menu_def * KHMAPI +khui_menu_dup(khui_menu_def * src); + +/*! \brief Delete a menu + + Deletes a menu created by a call to khui_menu_create() or + khui_menu_dup(). This frees up the memory and associated + resources used by the menu definition. The pointer that is passed + in will no longer be valid. + */ +KHMEXP void KHMAPI +khui_menu_delete(khui_menu_def * d); + +/*! \brief Insert an action into a menu + + The action specified by \a cmd will be inserted in to the menu \a + d at index \a idx. + + \param[in] d The menu to insert the action into + + \param[in] idx The index at which to insert the action. The index + is zero based. If \a idx is (-1) or larger than the largest + index in the menu, the item is appended to the menu. + + \param[in] cmd The command representing the action to insert into + the menu. This should be either a standard action, a user + action created with khui_action_create(), or certain pseudo + actions. Not all pseudo actions can be placed on a menu. + + \param[in] flags Flags for the action. This is a combination of + KHUI_ACTIONREF_* constants. Currently, the only constants + that are valid for this function are: ::KHUI_ACTIONREF_SEP, + ::KHUI_ACTIONREF_SUBMENU, ::KHUI_ACTIONREF_DEFAULT. + ::KHUI_ACTIONREF_SEP will be automatically added if the + command is ::KHUI_MENU_SEP. + + \note The ::khui_menu_def structure is not thread safe. Multiple + threads modifying the same ::khui_menu_def structure may cause + thread safety issues. + */ +KHMEXP void KHMAPI +khui_menu_insert_action(khui_menu_def * d, khm_size idx, khm_int32 cmd, khm_int32 flags); + +#define khui_menu_add_action(d,c) khui_menu_insert_action((d),-1,(c),0) +#pragma deprecated(khui_menu_add_action) + +#ifdef NOEXPORT + +/*! \brief Insert an action by reference into a menu + + The action specified by \a act will be inserted into the menu \a d + at index \a idx. + + \param[in] d The menu to inser the action into. + + \param[in] idx The index at which to insert the action. The index + is zero based. If the index is (-1) or is larger than the + largest index in the menu, then the action is appended to the + menu. + + \param[in] act The action to insert. This is added by reference. + It is the callers reponsibility to ensure that the structure + pointed to by \a act is available throughout the lifetime of + the menu. + + \param[in] flags Flags for the action. This is a combination of + KHUI_ACTIONREF_* constants. Currently, the only constants + that are valid for this function are: ::KHUI_ACTIONREF_SEP, + ::KHUI_ACTIONREF_SUBMENU, ::KHUI_ACTIONREF_DEFAULT. For this + function, ::KHUI_ACTIONREF_PACTION will automatically be aded + when adding the action. ::KHUI_ACTIONREF_SEP will be + automatically added if the command is ::KHUI_MENU_SEP. + + \note The ::khui_menu_def structure is not thread safe. Multiple + threads modifying the same ::khui_menu_def structure may cause + thread safety issues. +*/ +KHMEXP void KHMAPI +khui_menu_insert_paction(khui_menu_def * d, khm_size idx, khui_action * act, khm_int32 flags); + +#define khui_menu_add_paction(d,a,f) khui_menu_insert_paction((d),-1,(a),(f)) +#pragma deprecated(khui_menu_add_paction) + +#endif + +/*! \brief Remove an action from a menu + + The action at the specified index will be removed from the menu. + */ +KHMEXP void KHMAPI +khui_menu_remove_action(khui_menu_def * d, khm_size idx); + +/*! \brief Get the number of items in the menu + + Note that the count includes menu separators. The indices of the + menu items range from 0 to one less than the value returned by + this function. + */ +KHMEXP khm_size KHMAPI +khui_menu_get_size(khui_menu_def * d); + +/*! \brief Get the menu item at a specified index + + The returned reference is only valid while the ::khui_menu_def + structure is valid. In addition, the reference becomes invalid if + the list of actions in the menu data structure is modified in any + way. + + If the specified index is out of bounds, then the function returns + NULL. + + \note The ::khui_menu_def structure is not thread safe. Multiple + threads modifying the same ::khui_menu_def structure may cause + thread safety issues. + */ +KHMEXP khui_action_ref * +khui_menu_get_action(khui_menu_def * d, khm_size idx); + +/*! \brief Action scope identifiers + + The scope identifier is a value which describes the scope of the + cursor context. See documentation on individual scope identifiers + for details. + + The role of the scope identifier is to provide a summary of the + current cursor context. Specifically, these identify several + special cases of credential selection, such as the selection of an + entire identity, a credential type or a single credential. If + none of these are applicable, then the generic scope identifier + ::KHUI_SCOPE_GROUP is set or ::KHUI_SCOPE_NONE if there is nothing + selected. + + Note that the scope typically only apply to cursor contexts and + not the selection context. Please see + \ref khui_context "UI Contexts" for more information. + + \see \ref khui_context "UI Contexts" +*/ +typedef enum tag_khui_scope { + KHUI_SCOPE_NONE, + /*!< No context. Nothing is selected. */ + + KHUI_SCOPE_IDENT, + /*!< Identity. The selection is the entire identity specified in + the \a identity field of the context. */ + + KHUI_SCOPE_CREDTYPE, + /*!< A credentials type. The selection is an entire credentials + type. If \a identity is non-NULL, then the scope is all the + credentials of type \a cred_type which belong to \a identity. + Otherwise, the selection is all credentials of type \a + cred_type. + + \note The \a identity can be non-NULL even for the case where + all credentials of type \a cred_type under \a identity is the + same scope as all credentials of type \a cred_type under all + identities. */ + + KHUI_SCOPE_GROUP, + /*!< A grouping of credentials. The scope is a group of + credentials which can not be simplified using one of the other + context identifiers. The \a headers array contains \a n_headers + elements describing the outline level that has been selected. + + \see ::khui_header + \see \ref khui_context_sel_ctx_grp "KHUI_SCOPE_GROUP description" */ + + KHUI_SCOPE_CRED + /*!< A single credential. Only a single credential was + selected. The \a cred field of the context specifies the + credential. The \a identity and \a cred_type fields specify the + identity and the credential type respectively. */ +} khui_scope; + + +/*! \brief Outline header + + Describes an outline header in the user interface. + + \see \ref khui_context_sel_ctx_grp "KHUI_SCOPE_GROUP description" + */ +typedef struct tag_khui_header { + khm_int32 attr_id; /*!< Attribute ID */ + void * data; /*!< Value of attribute */ + khm_size cb_data; /*!< Size of the value */ +} khui_header; + +/*! \brief Maximum number of outline headers + + This is the maximum number of fields that the credentials view can + be grouped by. + */ +#define KHUI_MAX_HEADERS 6 + +/*! \brief Action context + + Represents the UI context for an action. + */ +typedef struct tag_khui_action_context { + khm_int32 magic; /*!< Internal. */ + khui_scope scope; /*!< Context scope. One of ::khui_scope*/ + khm_handle identity; /*!< Identity */ + khm_int32 cred_type; /*!< Credential type ID */ + khm_handle cred; /*!< Credential */ + + khui_header headers[KHUI_MAX_HEADERS]; + /*!< The ordered set of outline + headers which define the current + cursor location. */ + + khm_size n_headers; /*!< Number of actual headers defined + above */ + + khm_handle credset; /*!< Handle to a credential set + containing the currently selected + credentials. When the context is + obtained through khui_context_get(), + this credential is returned in a + sealed state. */ + + khm_size n_sel_creds; /*!< Number of selected credentials */ + + void * int_buf; /*!< Internal. Do not use. */ + khm_size int_cb_buf; /*!< Internal. Do not use. */ + khm_size int_cb_used; /*!< Internal. Do not use. */ + + void * vparam; /*!< Optional data */ + khm_size cb_vparam; /*!< Size of optional data */ +} khui_action_context; + +/*! \brief Set the current context + + Changes the UI context to that represented by the parameters to + the function. Note that specifying a valid \a identity or \a cred + parameter will result in an automatic hold on the respective + object. The hold will stay until another call to + khui_context_set() overwrites the identity or credential handle or + a call to khui_context_reset() is made. + + While this API is available, it is only called from the main + NetIDMgr application. Plugins do not have a good reason to call + this API directly and should not do so. + + \param[in] scope The new context scope + + \param[in] identity A handle to an identity. If this is not NULL, + then it should be a valid handle to an identity. Required if + \a scope specifies ::KHUI_SCOPE_IDENT. Optional if \a scope + specifies ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. + + \param[in] cred_type A credentials type. Specify + ::KCDB_CREDTYPE_INVALID if this parameter is not given or not + relevant. Required if \a scope specifies + ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. + + \param[in] cred A handle to a credential. If this parameter is + not NULL it is expected to be a valid handle to a credential. + Required if \a scope specifies ::KHUI_SCOPE_CRED. Ignored + otherwise. + + \param[in] headers An array of headers. The \a n_headers + parameter specifies the number of elements in the array. Set + to NULL if not specified. Required if \a scope specifies + ::KHUI_SCOPE_GROUP. + + \param[in] n_headers Number of elements in \a headers. Must be + less than or equal to ::KHUI_MAX_HEADERS. Required if \a + headers is not NULL. Ignored otherwise. + + \param[in] cs_src A handle to a credential set from which the + selected credentials will be extracted. The credentials that + are selected must have the ::KCDB_CRED_FLAG_SELECTED flag set. + + \note This function should only be called from the UI thread. + */ +KHMEXP void KHMAPI +khui_context_set(khui_scope scope, + khm_handle identity, + khm_int32 cred_type, + khm_handle cred, + khui_header *headers, + khm_size n_headers, + khm_handle cs_src); + +/*! \brief Set the current context + + Changes the UI context to that represented by the parameters to + the function. Note that specifying a valid \a identity or \a cred + parameter will result in an automatic hold on the respective + object. The hold will stay until another call to + khui_context_set() overwrites the identity or credential handle or + a call to khui_context_reset() is made. + + While this API is available, it is only called from the main + NetIDMgr application. Plugins do not have a good reason to call + this API directly and should not do so. + + \param[in] scope The new context scope + + \param[in] identity A handle to an identity. If this is not NULL, + then it should be a valid handle to an identity. Required if + \a scope specifies ::KHUI_SCOPE_IDENT. Optional if \a scope + specifies ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. + + \param[in] cred_type A credentials type. Specify + ::KCDB_CREDTYPE_INVALID if this parameter is not given or not + relevant. Required if \a scope specifies + ::KHUI_SCOPE_CREDTYPE. Ignored otherwise. + + \param[in] cred A handle to a credential. If this parameter is + not NULL it is expected to be a valid handle to a credential. + Required if \a scope specifies ::KHUI_SCOPE_CRED. Ignored + otherwise. + + \param[in] headers An array of headers. The \a n_headers + parameter specifies the number of elements in the array. Set + to NULL if not specified. Required if \a scope specifies + ::KHUI_SCOPE_GROUP. + + \param[in] n_headers Number of elements in \a headers. Must be + less than or equal to ::KHUI_MAX_HEADERS. Required if \a + headers is not NULL. Ignored otherwise. + + \param[in] cs_src A handle to a credential set from which the + selected credentials will be extracted. The credentials that + are selected must have the ::KCDB_CRED_FLAG_SELECTED flag set. + + \param[in] vparam Optional parameter blob + + \param[in] cb_vparam Size of parameter blob + + \note This function should only be called from the UI thread. + */ +KHMEXP void KHMAPI +khui_context_set_ex(khui_scope scope, + khm_handle identity, + khm_int32 cred_type, + khm_handle cred, + khui_header *headers, + khm_size n_headers, + khm_handle cs_src, + void * vparam, + khm_size cb_vparam); + +/*! \brief Set the current UI context using an existing context + + Copies the context specified in \a ctx into the active UI context. + + \param[in] ctx A pointer to a ::khui_action_context structure that + specifies the new UI context. Cannot be NULL. +*/ +KHMEXP void KHMAPI +khui_context_set_indirect(khui_action_context * ctx); + +/*! \brief Obtain the current UI context + + The parameter specified by \a ctx will receive the current UI + context. If the context contains an identity or a credential + handle, a hold will be obtained on the relevant object. Use + khui_context_release() to release the holds obtained in a prior + call to khui_context_get(). + + \note The returned context should not be modified prior to calling + khui_context_release(). +*/ +KHMEXP void KHMAPI +khui_context_get(khui_action_context * ctx); + +/*! \brief Create a new UI context + + The created context does not have any relation to the current UI + context. This function is provided for use in situations where an + application needs to provide a scope description through a + ::khui_action_context structure. + + Once the application is done with the context, it should call + khui_context_release() to release the created context. + */ +KHMEXP void KHMAPI +khui_context_create(khui_action_context * ctx, + khui_scope scope, + khm_handle identity, + khm_int32 cred_type, + khm_handle cred); + +/*! \brief Release a context obtained using khui_context_get() + + Releases all holds obtained on related objects in a prior call to + khui_context_get() and nullifies the context. + + \note The context should not have been modified between calling + khui_context_get() and khui_context_release() + */ +KHMEXP void KHMAPI +khui_context_release(khui_action_context * ctx); + +/*! \brief Reset the UI context + + Nullifies the current UI context and releases any holds obtained + on objects related to the previous context. +*/ +KHMEXP void KHMAPI +khui_context_reset(void); + +/*! \brief Refresh context data + + Setting the UI context involves other side effects such as + activation of or disabling certain actions based on the selection. + If an operation is performed which may affect the side effects, + khui_context_refresh() is called to refresh them. + + An example is when setting the default identity. The state of the + action ::KHUI_ACTION_SET_DEF_ID depends on whether the currently + selected identity is the default. However, if the currently + selected identity becomes the default after selection, then + khui_context_refresh() should be called to adjust the state of the + ::KHUI_ACTION_SET_DEF_ID action. + */ +KHMEXP void KHMAPI +khui_context_refresh(void); + +/*! \brief A filter function that filters for credentials in the cursor context + + This is a function of type ::kcdb_cred_filter_func which can be + used to filter for credentials that are included in the cursor + context. + + The \a rock parameter should be a pointer to a + ::khui_action_context structure which will be used as the filter. + + For example, the following code will extract the cursor context + credentials into the credential set \a my_credset based on the UI + context \a my context: + + \code + kcdb_credset_extract_filtered(my_credset, + NULL, + khui_context_cursor_filter, + (void *) my_context); + \endcode +*/ +KHMEXP khm_int32 KHMAPI +khui_context_cursor_filter(khm_handle cred, + khm_int32 flags, + void * rock); + +/*! \brief Get a string representation of an accelerator + + \param[in] cmd Command for which to obtain the accelerator string for + \param[out] buf Buffer to receive the accelerator string + \param[in] bufsiz Size of the buffer in bytes. Note that the size of the + buffer must be sufficient to hold at least one character and a + NULL terminator. + + \return TRUE if the operation was successful. FALSE otherwise. + */ +KHMEXP khm_boolean KHMAPI khui_get_cmd_accel_string(khm_int32 cmd, wchar_t * buf, khm_size bufsiz); + +#ifdef NOEXPORT +/*! \brief Initializes the global accelerator table + */ +KHMEXP HACCEL KHMAPI khui_create_global_accel_table(void); +#endif + +/*! \brief Find a menu by id + + Finds the menu that is associated with the specified action. + */ +KHMEXP khui_menu_def * KHMAPI khui_find_menu(khm_int32 action); + +#ifdef NOEXPORT + +/* internal */ +KHMEXP void KHMAPI +khui_set_main_window(HWND hwnd); + +#endif + +/*! \brief Trigger an action + + Triggers the specified action using the specified UI context. + + This function does not return until the specified action has been + processed. Many standard actions are asynchronous and they will + return before processing will complete. + + Pseudo actions should not be triggered using khui_action_trigger() + as they only carry meaning when invoked from specific windows or + contexts. + + \param[in] action Action. Should be one of the standard actions + or an action created by khui_action_create() + + \param[in] ctx The UI context to use for the action. If this is + NULL, the action will be triggered under the current UI context. + */ +KHMEXP void KHMAPI +khui_action_trigger(khm_int32 action, khui_action_context * ctx); + +/*! \brief Find an action by id + + \note This function should not be used by plugins. It is there + for use by the NetIDMgr application. +*/ +KHMEXP khui_action * KHMAPI khui_find_action(khm_int32 action); + +#ifdef NOEXPORT +/*! \brief Get the length of the action list */ +KHMEXP size_t KHMAPI khui_action_list_length(khui_action_ref * ref); +#endif + +/*! \brief Create a new action + + \param[in] name Name for a named action. The name must be unique + among all registered actions. (limited by KHUI_MAXCCH_NAME) + (Optional. Set to NULL if the action is not a named action.) + + \param[in] caption The localized caption for the action. This + will be shown in menus, toolbars and buttons when the action + needs to be represented. (limited by KHUI_MAXCCH_SHORT_DESC) + (Required) + + \param[in] tooltip The localized tooltip for the action. (limited + by KHUI_MAXCCH_SHORT_DESC) (Optional, set to NULL if there is + no tooltip associated with the action) + + \param[in] hsub The subscription that is notified when the action + is triggered. (Optional) The subscription can be created with + kmq_create_subscription(). The handle will be released when + it is no longer needed. Hence, the caller should not release + it. + + \param[in] type The type of the action. Currently it should be + set to either ::KHUI_ACTIONTYPE_TRIGGER or + ::KHUI_ACTIONTYPE_TOGGLE. For ::KHUI_ACTIONTYPE_TOGGLE, the + initial state will be unchecked. Use khui_check_action() + function to change the checked state of the action. + + \param[in] userdata A custom value. + + \return The identifier of the new action or zero if the action + could not be created. + + \note For named custom actions, the name of the action can not be + the same as the name of a configuration node. See + khui_cfg_register_node(). + */ +KHMEXP khm_int32 KHMAPI +khui_action_create(const wchar_t * name, + const wchar_t * caption, + const wchar_t * tooltip, + void * userdata, + khm_int32 type, + khm_handle hsub); + +/* \brief Delete a custom action + + Deletes a custom action created by a call to khui_action_create(). + Custom actions should only be deleted when unloading a plugin. + */ +KHMEXP void KHMAPI +khui_action_delete(khm_int32 action); + +/*! \brief Get the user data associated with a custom action + + This function returns the user data that was specified when the + custom action was created usng khui_action_create(). If the + custom action identifier is invalid or if the custom action does + not contain any user data, this function will return NULL. + */ +KHMEXP void * KHMAPI +khui_action_get_data(khm_int32 action); + +/*! \brief Find an action by name */ +KHMEXP khui_action * KHMAPI khui_find_named_action(const wchar_t * name); + +/*! \brief Enables or disables a group of actions + + The group of actions are specified by the menu definition. All + valid action entries in the menu are marked as enabled or disabled + according to the value of \a enable. + */ +KHMEXP void KHMAPI khui_enable_actions(khui_menu_def * d, khm_boolean enable); + +/*! \brief Enables or disables an action + + The action designated by the command \a action will either be enabled + or disabled depending on the \a enable parameter. If \a enable is + TRUE then the action is enabled. + */ +KHMEXP void KHMAPI khui_enable_action(khm_int32 action, khm_boolean enable); + +/*! \brief Check an action in an action group + + Marks the action denoted by \a action as checked and resets the + checked bit in all other actions. + + \param[in] d A menu definition. + + \param[in] action A command identifier. Setting this to -1 will + reset the checked bit in all the actions in the menu + definition. + */ +KHMEXP void KHMAPI khui_check_radio_action(khui_menu_def * d, khm_int32 action); + +/*! \brief Check an action + + For toggle typed actions, this sets or resets the check. + */ +KHMEXP void KHMAPI khui_check_action(khm_int32 cmd, khm_boolean check); + +#ifdef NOEXPORT +/*!\cond INTERNAL */ + +/*! \brief Initialize actions + + \note Only called by the NetIDMgr application + */ +KHMEXP void KHMAPI khui_init_actions(void); + +/*! \brief Exit actions + + \note Only called by the NetIDMgr application + */ +KHMEXP void KHMAPI khui_exit_actions(void); + +/*! \endcond */ +#endif + +/*@}*/ +/*@}*/ +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khnewcred.h +++ krb5-1.4.4/src/windows/identity/uilib/khnewcred.h @@ -1,985 +1,985 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHNEWCRED_H -#define __KHIMAIRA_KHNEWCRED_H - -/******************************************************************** - New credentials windows -*********************************************************************/ - -/*! \addtogroup khui -@{ */ - -/*! \defgroup khui_cred Credentials acquisition - - Declarations associated with credentials acquisition. - -@{ */ - -/*! \brief Window message sent to credentials type panels - - This message is sent to the child windows. - - The format of the message is : - - uMsg : KHUI_WM_NC_NOTIFY - - HIWORD(wParam) : one of ::khui_wm_nc_notifications - - LPARAM : pointer to the ::khui_new_creds structure -*/ -#define KHUI_WM_NC_NOTIFY (WM_APP + 0x101) - -/*! \brief The first control ID that may be used by an identity provider */ -#define KHUI_CW_ID_MIN 8016 - -/*! \brief The maximum number of controls that may be created by an identity provider*/ -#define KHUI_CW_MAX_CTRLS 8 - -/*! \brief The maximum control ID that may be used by an identity provider */ -#define KHUI_CW_ID_MAX (KHUI_CW_ID_MIN + KHUI_CW_MAX_CTRLS - 1) - - -/*! \brief Credentials dialog notifications - - These notifications will be sent to the individual dialog - procedures of the credential type panels as a ::KHUI_WM_NC_NOTIFY - message. -*/ -enum khui_wm_nc_notifications { - WMNC_DIALOG_EXPAND = 1, - /*!< The dialog is getting expanded. - - This message is sent to the new creds dialog to set the dialog - to expanded mode. In expanded mode, all credentials type panels - are visible as opposed to the compressed mode where they are not - visible. The message is not sent to credentials type panels.*/ - - WMNC_DIALOG_SETUP, - /*!< Sent by NetIDMgr to the new creds window to notify it that - the dialog should create all the type configuration panels. - - Until this message is issued, none of the credentials type - panels exist. The credentials type panels will receive - WM_INITDIALOG etc as per the normal dialog creation process. */ - - WMNC_DIALOG_ACTIVATE, - /*!< Sent by NetIDMgr to the new creds window to notify it that - the dialog should do final initialization work and activate. */ - - WMNC_DIALOG_MOVE, - /*!< Sent by the new creds widnow to all the panels notifying them - that the NC window is moving. */ - - WMNC_DIALOG_SWITCH_PANEL, - /*!< Sent to the new creds window to cause it to switch to the - panel identified by LOWORD(wParam). - - Does nothing if the specified panel is already the current - panel. If the dialog is in compact mode and making the - specified panel visible requires switching to expanded mode, the - dialog will do so. */ - - WMNC_UPDATE_CREDTEXT, - /*!< Sent to all the credential type panels for a credentials - window to request them to update the credential text. - - When sent to the new credentials window, causes it to send the - WMNC_UPDATE_CREDTEXT message to all the credential type panels - and update the cred text window.*/ - - WMNC_CREDTEXT_LINK, - /*!< Sent to a panel dialog proc when a user clicks a credtext - embedded link that belongs to that panel */ - - WMNC_IDENTITY_CHANGE, - /*!< The primary identity has changed */ - - WMNC_CLEAR_PROMPTS, - /*!< Sent to the new creds window to clear any custom prompts */ - - WMNC_SET_PROMPTS, - /*!< Sent to the new creds window to set custom prompts */ - - WMNC_DIALOG_PREPROCESS, - /*!< Sent to all the credentials type panels to notify them that - the dialog is about to be processed */ - - WMNC_DIALOG_PROCESS, - /*!< Process the dialog and signal whether to exit the dialog or - not */ - - WMNC_DIALOG_PROCESS_COMPLETE, - /*!< Sent to the new creds window to indicate that the all the - threads have completed processing.*/ - - WMNC_TYPE_STATE, - /*!< Sent to the new creds window as notification that a - particular credentials type has changed state from enabled to - disabled or vice versa. The LPARAM member of the message - specifies the credentials type identifier for the changed - type */ - - WMNC_ADD_CONTROL_ROW, - /*!< Add a row of controls to a new cred dialog. This is an - internal message. */ -}; - -/*! \brief Plugins can use WMNC_NOTIFY message codes from here on up - - \see ::KHUI_WM_NC_NOTIFY - */ -#define WMNC_USER 2048 - -/*! \brief Notifications to the identity provider - - These notifications are sent through to the identity provider's UI - callback that was obtained using a ::KMSG_IDENT_GET_UI_CB message. - - The callback routine is called from the context of the UI thread - and is expected to not make any blocking calls. One of the - following commands will be passed in as the \a cmd parameter to - the callback. - */ -enum khui_wm_nc_ident_notify { - WMNC_IDENT_INIT, - /*!< Initialize an identity selector for a new credentials - dialog. The \a lParam parameter contains a handle to the - dialog window which will contain the identity selector - controls. The identity provider may make use of the \a - ident_aux field of the ::khui_new_creds structure to hold any - data pertaining to the credentials acquisition dialog.*/ - - WMNC_IDENT_WMSG, - /*!< Windows message. Presumably sent from one of the controls - that was created by the identity provider. The callback is - expected to return TRUE if it processed the message or FALSE - if it did not. The \a uMsg, \a wParam and \a lParam - parameters are set to the values passed in by Windows. */ - - WMNC_IDENT_EXIT, - /*!< Terminate a credentials acquisition dialog. Sent just before - the dialog is terminated. */ -}; - -/*! \name Standard credtext link IDs -@{*/ - -/*! \brief Switch the panel - - The \a id attribute of the link specifies the ordinal of the panel - to switch to. -*/ -#define CTLINKID_SWITCH_PANEL L"SwitchPanel" - -/*@}*/ - -/*forward dcl*/ -struct tag_khui_new_creds_by_type; -typedef struct tag_khui_new_creds_by_type khui_new_creds_by_type; -struct tag_khui_new_creds_prompt; -typedef struct tag_khui_new_creds_prompt khui_new_creds_prompt; -struct tag_khui_new_creds; -typedef struct tag_khui_new_creds khui_new_creds; - -typedef LRESULT -(KHMAPI *khui_ident_new_creds_cb)(khui_new_creds * nc, - UINT cmd, - HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -/*! \brief New credentials acquisition blob - - A pointer to an object of this type is passed in along with the - credentials acquisition messages. - - \see \ref cred_acq for more information -*/ -typedef struct tag_khui_new_creds { - khm_int32 magic; - - khm_int32 subtype; /*!< Subtype of the request that is - being handled through this object. - One of ::KMSG_CRED_INITIAL_CREDS, - ::KMSG_CRED_NEW_CREDS or - ::KMSG_CRED_RENEW_CREDS */ - - CRITICAL_SECTION cs; - - khm_boolean set_default; /*!< After a successfull credentials - acquisition, set the primary - identity as the default. */ - - khm_handle *identities; /*!< The list of identities associated - with this request. The first - identity in this list (\a - identities[0]) is the primary - identity. */ - - khm_size n_identities; /*!< Number of identities in the list - \a identities */ - - khm_size nc_identities; /*!< Internal use */ - - khui_action_context ctx; /*!< An action context specifying the - context in which the credentials - acquisition operation was - launced. */ - - khm_int32 mode; /*!< The mode of the user interface. - One of ::KHUI_NC_MODE_MINI or - ::KHUI_NC_MODE_EXPANDED. */ - - HWND hwnd; /*!< Handle to the new credentials - window. */ - - struct tag_khui_new_creds_by_type **types; - /*!< Internal use */ - khm_handle *type_subs; /*!< Internal use */ - khm_size n_types; /*!< Internal use */ - khm_size nc_types; /*!< Internal use */ - - khm_int32 result; /*!< One of ::KHUI_NC_RESULT_CANCEL or - ::KHUI_NC_RESULT_PROCESS indicating - the result of the dialog with the - user */ - - khm_int32 response; /*!< Response. See individual message - documentation for info on what to do - with this field */ - - wchar_t *password; /*!< Not set until the dialog ends */ - - /* UI stuff */ - - wchar_t *banner; /*!< Internal use */ - wchar_t *pname; /*!< Internal use */ - khm_size n_prompts; /*!< Internal use */ - khm_size nc_prompts; /*!< Internal use */ - struct tag_khui_new_creds_prompt ** prompts; /*!< Internal use */ - - khui_ident_new_creds_cb ident_cb; /*!< Internal use */ - - wchar_t *window_title; /*!< Internal use */ - - LPARAM ident_aux; /*!< Auxilliary field which is - reserved for use by the identity - provider during the course of - conducting this dialog. */ - -} khui_new_creds; - -#define KHUI_NC_MAGIC 0x84270427 - -/*!\name Result values for khui_new_creds_t::result - @{*/ -#define KHUI_NC_RESULT_PROCESS 0 -#define KHUI_NC_RESULT_CANCEL 1 -/*@}*/ - -/*!\name Mode values for khui_new_creds_t::mode - @{*/ -#define KHUI_NC_MODE_MINI 0 -#define KHUI_NC_MODE_EXPANDED 1 -/*@}*/ - -/*!\name Response values for khui_new_creds_t::response - @{*/ -/*!\brief No known response */ -#define KHUI_NC_RESPONSE_NONE 0 - -/*!\brief It is okay to exit the dialog now - - This is the default, which is why it has a value of zero. In - order to prevent the dialog from exiting, set the - KHUI_NC_RESPONSE_NOEXIT response bit. */ -#define KHUI_NC_RESPONSE_EXIT 0 - -/*!\brief It is NOT okay to exit the dialog now - - Used to indicate that further user-interaction is necessary to - process the dialog. Usually this is accompanied by setting - necessary custom prompts and notifications so the user knows why - the dialog is prompting for more information. - */ -#define KHUI_NC_RESPONSE_NOEXIT 0x00000002 - -/*!\brief The dialog was processed successfully - - Since this is the default response, the value is zero. Use one of - KHUI_NC_RESPONSE_FAILED or KHUI_NC_RESPONSE_PENDING to indicate an - error or pending status. - */ -#define KHUI_NC_RESPONSE_SUCCESS 0 - -/*!\brief The processing of the dialog failed - - Self explanatory. More information about the failure should have - been reported using the khlog API, however, this response value - indicates to other credential types that depend on this credential - type that whatever it was that this credential type was supposed - to do didn't happen. -*/ -#define KHUI_NC_RESPONSE_FAILED 0x00000008 - -/*!\brief Further interaction required - - Set along with KHUI_NC_RESPONSE_NOEXIT although it is not - required. Setting this bit will automatically add the - KHUI_NC_RESPONSE_NOEXIT. - - If this bit is set, all dependent plugins will be set on hold - until another round of processing clears the pending bit. - */ -#define KHUI_NC_RESPONSE_PENDING 0x00000010 - -/*! \brief Completed - - This is automatically set if the plugin sets a response which does - not indicate either KHUI_NC_RESPONSE_NOEXIT or - KHUI_NC_RESPONSE_PENDING, which is considered to mean that the - plugin is completed processing. - - This flag cannot be explicitly specified in a response. - */ -#define KHUI_NC_RESPONSE_COMPLETED 0x00000020 - -/*! \brief Processing - - This is an internal flag set while the credentials acquisition - process is executing. - */ -#define KHUI_NC_RESPONSE_PROCESSING 0x00010000 - -#define KHUI_NCMASK_RESPONSE (KHUI_NC_RESPONSE_EXIT|KHUI_NC_RESPONSE_NOEXIT) -#define KHUI_NCMASK_RESULT (KHUI_NC_RESPONSE_SUCCESS|KHUI_NC_RESPONSE_FAILED|KHUI_NC_RESPONSE_PENDING) -/*@}*/ - -/*!\brief Maximum number of dependencies for a credentials type */ -#define KHUI_MAX_TYPE_DEPS 8 - -/*!\brief Maximum number of credential types for a new creds window */ -#define KHUI_MAX_NCTYPES 16 - -/*!\brief Maximum number of characters in a password - - Length includes the termininating NULL -*/ -#define KHUI_MAXCCH_PASSWORD 512 - -/*! \brief Maximum number of bytes in a password - - Includes terminating NULL -*/ -#define KHUI_MAXCB_PASSWORD (KHUI_MAXCCH_PASSWORD * sizeof(wchar_t)) - -/*! \brief Maximum number of characters in a custom banner - - Length includes terminating NULL -*/ -#define KHUI_MAXCCH_BANNER 256 - - -/*! \brief Maximum number of bytes in a custom banner - - Length includes terminating NULL -*/ -#define KHUI_MAXCB_BANNER (KHUI_MAXCCH_BANNER * sizeof(wchar_t)) - -/*! \brief Maximum number of characters in a panel name - - Length includes terminating NULL -*/ -#define KHUI_MAXCCH_PNAME 256 - -/*! \brief Maximum number of bytes in a panel name - - Length includes terminating NULL -*/ -#define KHUI_MAXCB_PNAME (KHUI_MAXCCH_PNAME * sizeof(wchar_t)) - -/*! \brief A descriptor of a panel in the new credentials acquisition tab - - When processing certain credentials messages such as - ::KMSG_CRED_PASSWORD, ::KMSG_CRED_NEW_CREDS, - ::KMSG_CRED_RENEW_CREDS, a pointer to a ::khui_new_creds structure - will be passed in to the message handler. If the handler of the - message needs to add one or more credentials types as participants - of the operation, the handler will need to call khui_cw_add_type() - and specify a ::khui_new_creds_by_type structure. - - Note that the memory address passed in to the call to - khui_cw_add_type() will not be copied. Therefore, the block of - memory should remain as-is for the lifetime of the - ::khui_new_creds structure or until it is removed with a call to - khui_cw_del_type(). - - Some of the credentials messages that require specifying a - ::khui_new_creds_by_type structure require providing a - user-interface. In these cases, the fields marked for providing a - UI may be required to hold valid values. If the message does not - require providing a UI, these fields will be ignored. -*/ -typedef struct tag_khui_new_creds_by_type { - khui_new_creds * nc; /*!< Internal use. Do not set */ - khm_int32 flags; /*!< Internal use. Do not set */ - - khm_int32 type; /*!< The identifier of the credentials - type. This is a credentials type - identifier allocated with a call to - kcdb_credtype_register(). */ - - khm_int32 type_deps[KHUI_MAX_TYPE_DEPS]; - /*!< credentials types that this - credential type depends on. Each - element defines a credentials type - identifier that this type depends - on for this operation. The number - of valid values in this array - should be specified in the \a - n_type_deps field. */ - - khm_size n_type_deps; /*!< Number of dependencies listed - above. Should be between 0 and - ::KHUI_MAX_TYPE_DEPS. Specify 0 if - there are no dependencies. */ - - khm_size ordinal; /*!< The requested ordinal. The UI - would attempt to place this panel at - the reqested order in the list of - panels. Set to -1 if the order does - not matter. Once the dialog is - activated this field will be updated - to reflect the actual ordinal of the - panel. */ - - wchar_t *name; /*!< Name of the panel (localized, - optional). If NULL, the localized - name of the credentials type is - used. Only used if providing a - user-interface. */ - - HICON icon; /*!< Icon for the panel (optional). - Only used if providing a - user-interface. */ - - wchar_t *tooltip; /*!< Tooltip for the panel (localized, - optional). If NULL, no tooltip will - be assigned for the panel. Only - used if providing a - user-interface. */ - - HMODULE h_module; /*!< Handle to the module containing - the dialog resource. Only used if - providing a user-interface. */ - - LPWSTR dlg_template; /*!< The dialog resource. Only used - if providing a user-interface. */ - DLGPROC dlg_proc; /*!< The dialog procedure. Only used - if providing a user-interface. */ - - HWND hwnd_panel; /*!< The dialog window. Once the - dialog panel is created, a handle to - the panel will be assigned here. - Note that the handle is assigned - after a successful call to - CreateDialogParam and hence would - not be available when handling the - WM_INITDIALOG message from the - dialog procedure. Only used of - providing a user-interface. */ - - HWND hwnd_tc; /*!< Internal use. Do not set */ - - wchar_t *credtext; /*!< A brief description of the - current state of this cred - type. (localized, optional). Only - used if providing a - user-interface. If this field is - non-NULL, then it should point to a - NULL terminated string that does not - exceed ::KHUI_MAXCCH_LONG_DESC - characters in length including the - terminating NULL. - - \see \ref khui_htwnd for information - on how to format the string for this - field. - */ - - LPARAM aux; /*!< auxilliary field. For use by the - plug-in. */ -} khui_new_creds_by_type; - -/*!\name Flags for khui_new_creds_by_type - - Note that KHUI_NC_RESPONSE_SUCCESS, KHUI_NC_RESPONSE_FAILED, - KHUI_NC_RESPONSE_PENDING are also stored in the flags. - -@{*/ -#define KHUI_NCT_FLAG_PROCESSED 1024 -#define KHUI_NCT_FLAG_DISABLED 2048 -/*@}*/ - -/*! \brief Width of a new creds dialog panel in dialog units*/ -#define NCDLG_WIDTH 300 -/*! \brief Height of a new creds dialog panel in dialog units*/ -#define NCDLG_HEIGHT 166 - -/*! \brief Width of the button bar in dialog units */ -#define NCDLG_BBAR_WIDTH 60 -/*! \brief Height of a tab button in dialog units */ -#define NCDLG_TAB_HEIGHT 15 -/*! \brief Width of a tab button in dialog units */ -#define NCDLG_TAB_WIDTH 60 - -/*! \brief A custom prompt */ -typedef struct tag_khui_new_creds_prompt { - khm_size index; /*!< Set to the zero based index - of this prompt. */ - - khm_int32 type; /*!< one of KHUI_NCPROMPT_TYPE_* */ - wchar_t * prompt; /*!< prompt string. Cannot exceed - KHUI_MAXCCH_PROMPT */ - wchar_t * def; /*!< default value. Cannot exceed - KHUI_MAXCCH_PROMPT_VALUE */ - wchar_t * value; /*!< On completion, this is set to the - value that the user entered. Will - not exceed - KHUI_MAXCCH_PROMPT_VALUE */ - - khm_int32 flags; /*!< Combination of - KHUI_NCPROMPT_FLAG_* */ - - HWND hwnd_static; /* internal use */ - HWND hwnd_edit; /* internal use */ -} khui_new_creds_prompt; - -/*! \brief The prompt input is hidden - - The input is hidden for prompts which accept passwords. The - control which represents the input will display an asterisk or a - small circle corresponding to each character typed in, but will - not show the actual character. - */ -#define KHUI_NCPROMPT_FLAG_HIDDEN 1 - -/*! \brief Internal use */ -#define KHUI_NCPROMPT_FLAG_STOCK 2 - -/*! \brief Maximum number of characters in a prompt - - Refers to the prompt text that accompanies an input control. THe - length includes the terminating NULL. - */ -#define KHUI_MAXCCH_PROMPT 256 - -/*! \brief Maximum number of bytes in a prompt - - Refers to the prompt text that accompanies an input control. THe - length includes the terminating NULL. - */ -#define KHUI_MAXCB_PROMPT (KHUI_MAXCCH_PROMPT * sizeof(wchar_t)) - -/*! \brief Maximum number of characters that can be entered in an input control - - Refers to the input control of a prompt. The length includes the - terminating NULL. - */ -#define KHUI_MAXCCH_PROMPT_VALUE 256 - -/*! \brief Maximum number of bytes that can be entered in an input control - - Refers to the input control of a prompt. The length includes the - terminating NULL. - */ -#define KHUI_MAXCB_PROMPT_VALUE (KHUI_MAXCCH_PROMPT_VALUE * sizeof(wchar_t)) - -/* from krb5.h. Redefining here because we don't want to depend on - krb5.h for all credential types */ - -/*! \brief A password control */ -#define KHUI_NCPROMPT_TYPE_PASSWORD 1 - -/*! \brief New password control - - Used when changing the password - */ -#define KHUI_NCPROMPT_TYPE_NEW_PASSWORD 2 - -/*! \brief New password again control - - Used when changing the password - */ -#define KHUI_NCPROMPT_TYPE_NEW_PASSWORD_AGAIN 3 - -/*! \brief Preauthentication (reserved) */ -#define KHUI_NCPROMPT_TYPE_PREAUTH 4 - -/*! \brief Control sizes */ -typedef enum tag_khui_control_size { - KHUI_CTRLSIZE_SMALL, - /*!< A small control fits in about 1/5 the width of the new - credentials panel */ - KHUI_CTRLSIZE_HALF, - /*!< Half size controls fit in 1/2 the width of the new - credentials panel */ - KHUI_CTRLSIZE_FULL, - /*!< Takes up the whole width of the crednetials panel */ -} khui_control_size; - -/*! \brief Internal use */ -typedef struct tag_khui_control_row { - HWND label; - HWND input; - khui_control_size size; -} khui_control_row; - -/*! \brief Create a ::khui_new_creds object - - Creates and initializes a ::khui_new_creds object. The created - object must be destroyed using the khui_cw_destroy_cred_blob() - function. - - \note Plugins should not call this function directly. The - necessary ::khui_new_creds objects will be created by - NetIDMgr. - - \see khui_cw_destroy_cred_blob() - */ -KHMEXP khm_int32 KHMAPI -khui_cw_create_cred_blob(khui_new_creds ** c); - -/*! \brief Destroy a ::khui_new_creds object - - Destroys a ::khui_new_creds object that was fomerly created using - a call to khui_cw_create_cred_blob(). - - \note Plugins should not call this function directly. The - necessary ::khui_new_creds objects will be created by - NetIDMgr. - - \see khui_cw_create_cred_blob() -*/ -KHMEXP khm_int32 KHMAPI -khui_cw_destroy_cred_blob(khui_new_creds *c); - -/*! \brief Lock the new_creds object - - When a plugin is accessing the fields of a ::khui_new_creds - object, it must first obtain a lock on the object so that other - threads will not modify the fields at the same time. Locking the - object ensures that the fields of the object will be consistent. - - Use khui_cw_unlock_nc() to undo the lock obtained through a call - to khui_cw_lock_nc(). - - It is not necessary to lock a new credentials object when - modifying it using the NetIDMgr API. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_lock_nc(khui_new_creds * c); - -/*! \brief Unlock a new_creds object - - \see khui_cw_lock_nc() - */ -KHMEXP khm_int32 KHMAPI -khui_cw_unlock_nc(khui_new_creds * c); - -/*! \brief Add a new panel to a new credentials acquisition window - - See the description of ::khui_new_cred_panel for information on - how to populate it to describe a credentials type panel. - - Note that the structure pointed to by \a t is added by reference. - The memory pointed to by \a t is not copied. Hence, the block of - memory and any other blocks pointed to by the - ::khui_new_creds_by_type structure located there should remain - intact for the lifetime of the ::khui_new_creds structure pointed - to by \a c or until the credentials type panel is removed from the - ::khui_new_creds structure with a call to khui_cw_del_type(). - - Generally, a plug-in that calls this function should allocate a - block of memory to contain the ::khui_new_creds_by_type structure, - fill it in and then pass in the address in a call to - khui_cw_add_type() while handling a ::KMSG_CRED_PASSWORD, - ::KMSG_CRED_NEW_CREDS or ::KMSG_CRED_RENEW_CREDS message. Then - the plug-in should remove the reference with a call to - khui_cw_del_type() while processing ::KMSG_CRED_END. - - \see khui_cw_del_type() - \see \ref cred_acq_panel_spec - \see ::khui_new_cred_panel - \see ::khui_new_creds -*/ -KHMEXP khm_int32 KHMAPI -khui_cw_add_type(khui_new_creds * c, - khui_new_creds_by_type * t); - -/*! \brief Remove a panel from a new credentials acquisition window - - \see khui_cw_add_type() - */ -KHMEXP khm_int32 KHMAPI -khui_cw_del_type(khui_new_creds * c, - khm_int32 type); - -/*! \brief Find the panel belonging to a particular credentials type - - This panel would have been added to the new credentials window - using khui_cw_add_type(). - - \see khui_cw_add_type() - */ -KHMEXP khm_int32 KHMAPI -khui_cw_find_type(khui_new_creds * c, - khm_int32 type, - khui_new_creds_by_type **t); - -/*! \brief Enable/disable a particular credentials type - - Enables or disables the panel associated with a particular - credentials type. Does not preclude the credentials type from - participating in the new credentials acquisition. However, the - user will be prevented from interacting with the specific panel. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_enable_type(khui_new_creds * c, - khm_int32 type, - khm_boolean enable); - -/*! \brief Set the primary identity in a new credentials acuisition - - The primary identity dictates many of the defaults and the - semantics associated with the credentials acquision process. - Setting the primary identity also triggers the - ::WMNC_IDENTITY_CHANGE notification which will be sent to all the - credentials type panels. - - Has no effect if the primary identity is already the same as the - one specified in \a id. Specify NULL for \a id if the current - primary identity is to be cleared. - - If the primary identity is changed, then all the additional - identities associated with the new credentials acquisition dialog - will also be discarded. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_set_primary_id(khui_new_creds * c, - khm_handle id); - -/*! \brief Add an additional identity to the new credentials acquisition - - Individual plugins are free to decide how to handle additional - identities. Generally, they would attempt to obtain credentials - for the primary and additional identities, but would not consider - it an error if an additional identity failed to obtain - credentials. - - Calling this function with \a id of NULL does nothing. -*/ -KHMEXP khm_int32 KHMAPI -khui_cw_add_identity(khui_new_creds * c, - khm_handle id); - -/*! \brief Clear all custom prompts - - Removes all the custom prompts from the new credentials dialog. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_clear_prompts(khui_new_creds * c); - -/*! \brief Synchronize custom prompt values - - It is important to synchronize the values before accessing their - values. The controls associated with custom prompts update the - values in the ::khui_new_creds object periodically. However, the - values may lose sync intermittently. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_sync_prompt_values(khui_new_creds * c); - -/*! \brief Begin custom prompting - - Begins the process of defining custom prompts. Implicity removes - all the custom prompts that are currently being displayed. The \a - banner and \a name will be displayed in separate controls above - the set of new custom prompts. - - The controls associated with the prompts will not actually be - created until all the prompts have been added using - khui_cw_add_prompt(). The number of promtps that can be added - will be exactly \a n_prompts. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_begin_custom_prompts(khui_new_creds * c, - khm_size n_prompts, - wchar_t * banner, - wchar_t * name); - -/*! \brief Add a custom prompt - - After khui_cw_begin_custom_prompts() is called, the plugin should - call khui_cw_add_prompt() to add the actual prompts. The number - of prompts that can be added is the \a n_prompts value specified - in the earlier call to \a khui_cw_begin_custom_prompts(). - - Once \a n_prompts prompts have been added, the new prompts will - automatically be created and shown in the user interface. - However, if less than that prompts are added, nothing is displayed - to the user. - - \param[in] c Pointer to ::khui_new_creds structure - - \param[in] type Type of prompt. One of - ::KHUI_NCPROMPT_TYPE_PREAUTH, ::KHUI_NCPROMPT_TYPE_PASSWORD, - ::KHUI_NCPROMPT_TYPE_NEW_PASSWORD, - ::KHUI_NCPROMPT_TYPE_NEW_PASSWORD_AGAIN - - \param[in] prompt Text of the prompt. Constrained by - ::KHUI_MAXCCH_PROMPT. (Localized, required) - - \param[in] def Default value. (optional). Constrained by - ::KHUI_MAXCCH_PROMPT_VALUE. Set to NULL if not provided. - - \param[in] flags Flags. Combination of - ::KHUI_NCPROMPT_FLAG_HIDDEN - */ -KHMEXP khm_int32 KHMAPI -khui_cw_add_prompt(khui_new_creds * c, - khm_int32 type, - wchar_t * prompt, - wchar_t * def, - khm_int32 flags); - -/*! \brief Retrieve a custom prompt - - Retrieves an individual prompt. The \a idx parameter is a - zero-based index of the prompt to retrieve. The ordering is the - same as the order in which khui_cw_add_prompt() was called. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_get_prompt(khui_new_creds * c, - khm_size idx, - khui_new_creds_prompt ** prompt); - -/*! \brief Get the number of custom prompts - - Retrieves the number of custom prompts currently displayed. If - this function is called between calling - khui_cw_begin_custom_prompts() and adding all the prompts, the - number returned will be the number of prompts that is expected to - be registered (i.e. the \a n_prompts parameter passed to - khui_cw_begin_custom_prompts()). - */ -KHMEXP khm_int32 KHMAPI -khui_cw_get_prompt_count(khui_new_creds * c, - khm_size * np); - - -/*! \brief Get the value of a custom prompt - - Retrieve the value of a specific prompt. The value is the string - that was typed into the input control associated with a custom - prompt. The \a idx parameter is the zero-based index of the - prompt from which to retrieve the value from. The ordering is the - same as the order in which khui_cw_add_prompt() was called. - - It is important to call khui_cw_sync_prompt_values() before - starting to call khui_cw_get_prompt_value() so that the values - returned are up-to-date. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_get_prompt_value(khui_new_creds * c, - khm_size idx, - wchar_t * buf, - khm_size *cbbuf); - -/*! \brief Set the response for a plugin - - When handling ::KMSG_CRED_DIALOG_PROCESS from within the plugin - thread, it is important to set the response by calling this - function. The response can be used to signal whether the plugin - successfully obtained credentials or whether further interaction - is required, or the credentials acquisition failed. - - The response is a combination of : - - ::KHUI_NC_RESPONSE_PENDING - - ::KHUI_NC_RESPONSE_FAILED - - ::KHUI_NC_RESPONSE_PENDING - - ::KHUI_NC_RESPONSE_SUCCESS - - ::KHUI_NC_RESPONSE_NOEXIT - - ::KHUI_NC_RESPONSE_EXIT - */ -KHMEXP khm_int32 KHMAPI -khui_cw_set_response(khui_new_creds * c, - khm_int32 type, - khm_int32 response); - -/*! \brief Check whether a specified credential type panel succeeded - - This is called during the processing of KMSG_CRED_DIALOG_PROCESS - to determine whether a specified credential type succeeded in - obtaining credentials. The credential type that is being queried - should have also been listed as a dependency when adding the - current credentials type, otherwise the type queried may not have - been invoked yet. - - \return TRUE iff the queried type has reported that it successfully - completed the credentials acquision operation. - */ -KHMEXP khm_boolean KHMAPI -khui_cw_type_succeeded(khui_new_creds * c, - khm_int32 type); - -/*! \brief Add a row of controls to the identity specifier area - - Only for use by identity provider callbacks that wish to add an - identity selector control. A row of controls consist of a label - control and some input control. - - When the ::WMNC_IDENT_INIT message is sent to the identity - provider, it receives a handle to the dialog panel in the \a - lParam parameter which should be the parent window of both the - windows specified here. The control ID for any controls created - must fall within the ::KHUI_CW_ID_MIN and ::KHUI_CW_ID_MAX range. - - Both controls will be resized to fit in the row. - - If \a long_label is TRUE then the size of the label will be larger - than normal and will accomodate more text. - */ -KHMEXP khm_int32 KHMAPI -khui_cw_add_control_row(khui_new_creds * c, - HWND label, - HWND input, - khui_control_size size); - -/*!@}*/ /* Credentials acquisition */ -/*!@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHNEWCRED_H +#define __KHIMAIRA_KHNEWCRED_H + +/******************************************************************** + New credentials windows +*********************************************************************/ + +/*! \addtogroup khui +@{ */ + +/*! \defgroup khui_cred Credentials acquisition + + Declarations associated with credentials acquisition. + +@{ */ + +/*! \brief Window message sent to credentials type panels + + This message is sent to the child windows. + + The format of the message is : + - uMsg : KHUI_WM_NC_NOTIFY + - HIWORD(wParam) : one of ::khui_wm_nc_notifications + - LPARAM : pointer to the ::khui_new_creds structure +*/ +#define KHUI_WM_NC_NOTIFY (WM_APP + 0x101) + +/*! \brief The first control ID that may be used by an identity provider */ +#define KHUI_CW_ID_MIN 8016 + +/*! \brief The maximum number of controls that may be created by an identity provider*/ +#define KHUI_CW_MAX_CTRLS 8 + +/*! \brief The maximum control ID that may be used by an identity provider */ +#define KHUI_CW_ID_MAX (KHUI_CW_ID_MIN + KHUI_CW_MAX_CTRLS - 1) + + +/*! \brief Credentials dialog notifications + + These notifications will be sent to the individual dialog + procedures of the credential type panels as a ::KHUI_WM_NC_NOTIFY + message. +*/ +enum khui_wm_nc_notifications { + WMNC_DIALOG_EXPAND = 1, + /*!< The dialog is getting expanded. + + This message is sent to the new creds dialog to set the dialog + to expanded mode. In expanded mode, all credentials type panels + are visible as opposed to the compressed mode where they are not + visible. The message is not sent to credentials type panels.*/ + + WMNC_DIALOG_SETUP, + /*!< Sent by NetIDMgr to the new creds window to notify it that + the dialog should create all the type configuration panels. + + Until this message is issued, none of the credentials type + panels exist. The credentials type panels will receive + WM_INITDIALOG etc as per the normal dialog creation process. */ + + WMNC_DIALOG_ACTIVATE, + /*!< Sent by NetIDMgr to the new creds window to notify it that + the dialog should do final initialization work and activate. */ + + WMNC_DIALOG_MOVE, + /*!< Sent by the new creds widnow to all the panels notifying them + that the NC window is moving. */ + + WMNC_DIALOG_SWITCH_PANEL, + /*!< Sent to the new creds window to cause it to switch to the + panel identified by LOWORD(wParam). + + Does nothing if the specified panel is already the current + panel. If the dialog is in compact mode and making the + specified panel visible requires switching to expanded mode, the + dialog will do so. */ + + WMNC_UPDATE_CREDTEXT, + /*!< Sent to all the credential type panels for a credentials + window to request them to update the credential text. + + When sent to the new credentials window, causes it to send the + WMNC_UPDATE_CREDTEXT message to all the credential type panels + and update the cred text window.*/ + + WMNC_CREDTEXT_LINK, + /*!< Sent to a panel dialog proc when a user clicks a credtext + embedded link that belongs to that panel */ + + WMNC_IDENTITY_CHANGE, + /*!< The primary identity has changed */ + + WMNC_CLEAR_PROMPTS, + /*!< Sent to the new creds window to clear any custom prompts */ + + WMNC_SET_PROMPTS, + /*!< Sent to the new creds window to set custom prompts */ + + WMNC_DIALOG_PREPROCESS, + /*!< Sent to all the credentials type panels to notify them that + the dialog is about to be processed */ + + WMNC_DIALOG_PROCESS, + /*!< Process the dialog and signal whether to exit the dialog or + not */ + + WMNC_DIALOG_PROCESS_COMPLETE, + /*!< Sent to the new creds window to indicate that the all the + threads have completed processing.*/ + + WMNC_TYPE_STATE, + /*!< Sent to the new creds window as notification that a + particular credentials type has changed state from enabled to + disabled or vice versa. The LPARAM member of the message + specifies the credentials type identifier for the changed + type */ + + WMNC_ADD_CONTROL_ROW, + /*!< Add a row of controls to a new cred dialog. This is an + internal message. */ +}; + +/*! \brief Plugins can use WMNC_NOTIFY message codes from here on up + + \see ::KHUI_WM_NC_NOTIFY + */ +#define WMNC_USER 2048 + +/*! \brief Notifications to the identity provider + + These notifications are sent through to the identity provider's UI + callback that was obtained using a ::KMSG_IDENT_GET_UI_CB message. + + The callback routine is called from the context of the UI thread + and is expected to not make any blocking calls. One of the + following commands will be passed in as the \a cmd parameter to + the callback. + */ +enum khui_wm_nc_ident_notify { + WMNC_IDENT_INIT, + /*!< Initialize an identity selector for a new credentials + dialog. The \a lParam parameter contains a handle to the + dialog window which will contain the identity selector + controls. The identity provider may make use of the \a + ident_aux field of the ::khui_new_creds structure to hold any + data pertaining to the credentials acquisition dialog.*/ + + WMNC_IDENT_WMSG, + /*!< Windows message. Presumably sent from one of the controls + that was created by the identity provider. The callback is + expected to return TRUE if it processed the message or FALSE + if it did not. The \a uMsg, \a wParam and \a lParam + parameters are set to the values passed in by Windows. */ + + WMNC_IDENT_EXIT, + /*!< Terminate a credentials acquisition dialog. Sent just before + the dialog is terminated. */ +}; + +/*! \name Standard credtext link IDs +@{*/ + +/*! \brief Switch the panel + + The \a id attribute of the link specifies the ordinal of the panel + to switch to. +*/ +#define CTLINKID_SWITCH_PANEL L"SwitchPanel" + +/*@}*/ + +/*forward dcl*/ +struct tag_khui_new_creds_by_type; +typedef struct tag_khui_new_creds_by_type khui_new_creds_by_type; +struct tag_khui_new_creds_prompt; +typedef struct tag_khui_new_creds_prompt khui_new_creds_prompt; +struct tag_khui_new_creds; +typedef struct tag_khui_new_creds khui_new_creds; + +typedef LRESULT +(KHMAPI *khui_ident_new_creds_cb)(khui_new_creds * nc, + UINT cmd, + HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +/*! \brief New credentials acquisition blob + + A pointer to an object of this type is passed in along with the + credentials acquisition messages. + + \see \ref cred_acq for more information +*/ +typedef struct tag_khui_new_creds { + khm_int32 magic; + + khm_int32 subtype; /*!< Subtype of the request that is + being handled through this object. + One of ::KMSG_CRED_INITIAL_CREDS, + ::KMSG_CRED_NEW_CREDS or + ::KMSG_CRED_RENEW_CREDS */ + + CRITICAL_SECTION cs; + + khm_boolean set_default; /*!< After a successfull credentials + acquisition, set the primary + identity as the default. */ + + khm_handle *identities; /*!< The list of identities associated + with this request. The first + identity in this list (\a + identities[0]) is the primary + identity. */ + + khm_size n_identities; /*!< Number of identities in the list + \a identities */ + + khm_size nc_identities; /*!< Internal use */ + + khui_action_context ctx; /*!< An action context specifying the + context in which the credentials + acquisition operation was + launced. */ + + khm_int32 mode; /*!< The mode of the user interface. + One of ::KHUI_NC_MODE_MINI or + ::KHUI_NC_MODE_EXPANDED. */ + + HWND hwnd; /*!< Handle to the new credentials + window. */ + + struct tag_khui_new_creds_by_type **types; + /*!< Internal use */ + khm_handle *type_subs; /*!< Internal use */ + khm_size n_types; /*!< Internal use */ + khm_size nc_types; /*!< Internal use */ + + khm_int32 result; /*!< One of ::KHUI_NC_RESULT_CANCEL or + ::KHUI_NC_RESULT_PROCESS indicating + the result of the dialog with the + user */ + + khm_int32 response; /*!< Response. See individual message + documentation for info on what to do + with this field */ + + wchar_t *password; /*!< Not set until the dialog ends */ + + /* UI stuff */ + + wchar_t *banner; /*!< Internal use */ + wchar_t *pname; /*!< Internal use */ + khm_size n_prompts; /*!< Internal use */ + khm_size nc_prompts; /*!< Internal use */ + struct tag_khui_new_creds_prompt ** prompts; /*!< Internal use */ + + khui_ident_new_creds_cb ident_cb; /*!< Internal use */ + + wchar_t *window_title; /*!< Internal use */ + + LPARAM ident_aux; /*!< Auxilliary field which is + reserved for use by the identity + provider during the course of + conducting this dialog. */ + +} khui_new_creds; + +#define KHUI_NC_MAGIC 0x84270427 + +/*!\name Result values for khui_new_creds_t::result + @{*/ +#define KHUI_NC_RESULT_PROCESS 0 +#define KHUI_NC_RESULT_CANCEL 1 +/*@}*/ + +/*!\name Mode values for khui_new_creds_t::mode + @{*/ +#define KHUI_NC_MODE_MINI 0 +#define KHUI_NC_MODE_EXPANDED 1 +/*@}*/ + +/*!\name Response values for khui_new_creds_t::response + @{*/ +/*!\brief No known response */ +#define KHUI_NC_RESPONSE_NONE 0 + +/*!\brief It is okay to exit the dialog now + + This is the default, which is why it has a value of zero. In + order to prevent the dialog from exiting, set the + KHUI_NC_RESPONSE_NOEXIT response bit. */ +#define KHUI_NC_RESPONSE_EXIT 0 + +/*!\brief It is NOT okay to exit the dialog now + + Used to indicate that further user-interaction is necessary to + process the dialog. Usually this is accompanied by setting + necessary custom prompts and notifications so the user knows why + the dialog is prompting for more information. + */ +#define KHUI_NC_RESPONSE_NOEXIT 0x00000002 + +/*!\brief The dialog was processed successfully + + Since this is the default response, the value is zero. Use one of + KHUI_NC_RESPONSE_FAILED or KHUI_NC_RESPONSE_PENDING to indicate an + error or pending status. + */ +#define KHUI_NC_RESPONSE_SUCCESS 0 + +/*!\brief The processing of the dialog failed + + Self explanatory. More information about the failure should have + been reported using the khlog API, however, this response value + indicates to other credential types that depend on this credential + type that whatever it was that this credential type was supposed + to do didn't happen. +*/ +#define KHUI_NC_RESPONSE_FAILED 0x00000008 + +/*!\brief Further interaction required + + Set along with KHUI_NC_RESPONSE_NOEXIT although it is not + required. Setting this bit will automatically add the + KHUI_NC_RESPONSE_NOEXIT. + + If this bit is set, all dependent plugins will be set on hold + until another round of processing clears the pending bit. + */ +#define KHUI_NC_RESPONSE_PENDING 0x00000010 + +/*! \brief Completed + + This is automatically set if the plugin sets a response which does + not indicate either KHUI_NC_RESPONSE_NOEXIT or + KHUI_NC_RESPONSE_PENDING, which is considered to mean that the + plugin is completed processing. + + This flag cannot be explicitly specified in a response. + */ +#define KHUI_NC_RESPONSE_COMPLETED 0x00000020 + +/*! \brief Processing + + This is an internal flag set while the credentials acquisition + process is executing. + */ +#define KHUI_NC_RESPONSE_PROCESSING 0x00010000 + +#define KHUI_NCMASK_RESPONSE (KHUI_NC_RESPONSE_EXIT|KHUI_NC_RESPONSE_NOEXIT) +#define KHUI_NCMASK_RESULT (KHUI_NC_RESPONSE_SUCCESS|KHUI_NC_RESPONSE_FAILED|KHUI_NC_RESPONSE_PENDING) +/*@}*/ + +/*!\brief Maximum number of dependencies for a credentials type */ +#define KHUI_MAX_TYPE_DEPS 8 + +/*!\brief Maximum number of credential types for a new creds window */ +#define KHUI_MAX_NCTYPES 16 + +/*!\brief Maximum number of characters in a password + + Length includes the termininating NULL +*/ +#define KHUI_MAXCCH_PASSWORD 512 + +/*! \brief Maximum number of bytes in a password + + Includes terminating NULL +*/ +#define KHUI_MAXCB_PASSWORD (KHUI_MAXCCH_PASSWORD * sizeof(wchar_t)) + +/*! \brief Maximum number of characters in a custom banner + + Length includes terminating NULL +*/ +#define KHUI_MAXCCH_BANNER 256 + + +/*! \brief Maximum number of bytes in a custom banner + + Length includes terminating NULL +*/ +#define KHUI_MAXCB_BANNER (KHUI_MAXCCH_BANNER * sizeof(wchar_t)) + +/*! \brief Maximum number of characters in a panel name + + Length includes terminating NULL +*/ +#define KHUI_MAXCCH_PNAME 256 + +/*! \brief Maximum number of bytes in a panel name + + Length includes terminating NULL +*/ +#define KHUI_MAXCB_PNAME (KHUI_MAXCCH_PNAME * sizeof(wchar_t)) + +/*! \brief A descriptor of a panel in the new credentials acquisition tab + + When processing certain credentials messages such as + ::KMSG_CRED_PASSWORD, ::KMSG_CRED_NEW_CREDS, + ::KMSG_CRED_RENEW_CREDS, a pointer to a ::khui_new_creds structure + will be passed in to the message handler. If the handler of the + message needs to add one or more credentials types as participants + of the operation, the handler will need to call khui_cw_add_type() + and specify a ::khui_new_creds_by_type structure. + + Note that the memory address passed in to the call to + khui_cw_add_type() will not be copied. Therefore, the block of + memory should remain as-is for the lifetime of the + ::khui_new_creds structure or until it is removed with a call to + khui_cw_del_type(). + + Some of the credentials messages that require specifying a + ::khui_new_creds_by_type structure require providing a + user-interface. In these cases, the fields marked for providing a + UI may be required to hold valid values. If the message does not + require providing a UI, these fields will be ignored. +*/ +typedef struct tag_khui_new_creds_by_type { + khui_new_creds * nc; /*!< Internal use. Do not set */ + khm_int32 flags; /*!< Internal use. Do not set */ + + khm_int32 type; /*!< The identifier of the credentials + type. This is a credentials type + identifier allocated with a call to + kcdb_credtype_register(). */ + + khm_int32 type_deps[KHUI_MAX_TYPE_DEPS]; + /*!< credentials types that this + credential type depends on. Each + element defines a credentials type + identifier that this type depends + on for this operation. The number + of valid values in this array + should be specified in the \a + n_type_deps field. */ + + khm_size n_type_deps; /*!< Number of dependencies listed + above. Should be between 0 and + ::KHUI_MAX_TYPE_DEPS. Specify 0 if + there are no dependencies. */ + + khm_size ordinal; /*!< The requested ordinal. The UI + would attempt to place this panel at + the reqested order in the list of + panels. Set to -1 if the order does + not matter. Once the dialog is + activated this field will be updated + to reflect the actual ordinal of the + panel. */ + + wchar_t *name; /*!< Name of the panel (localized, + optional). If NULL, the localized + name of the credentials type is + used. Only used if providing a + user-interface. */ + + HICON icon; /*!< Icon for the panel (optional). + Only used if providing a + user-interface. */ + + wchar_t *tooltip; /*!< Tooltip for the panel (localized, + optional). If NULL, no tooltip will + be assigned for the panel. Only + used if providing a + user-interface. */ + + HMODULE h_module; /*!< Handle to the module containing + the dialog resource. Only used if + providing a user-interface. */ + + LPWSTR dlg_template; /*!< The dialog resource. Only used + if providing a user-interface. */ + DLGPROC dlg_proc; /*!< The dialog procedure. Only used + if providing a user-interface. */ + + HWND hwnd_panel; /*!< The dialog window. Once the + dialog panel is created, a handle to + the panel will be assigned here. + Note that the handle is assigned + after a successful call to + CreateDialogParam and hence would + not be available when handling the + WM_INITDIALOG message from the + dialog procedure. Only used of + providing a user-interface. */ + + HWND hwnd_tc; /*!< Internal use. Do not set */ + + wchar_t *credtext; /*!< A brief description of the + current state of this cred + type. (localized, optional). Only + used if providing a + user-interface. If this field is + non-NULL, then it should point to a + NULL terminated string that does not + exceed ::KHUI_MAXCCH_LONG_DESC + characters in length including the + terminating NULL. + + \see \ref khui_htwnd for information + on how to format the string for this + field. + */ + + LPARAM aux; /*!< auxilliary field. For use by the + plug-in. */ +} khui_new_creds_by_type; + +/*!\name Flags for khui_new_creds_by_type + + Note that KHUI_NC_RESPONSE_SUCCESS, KHUI_NC_RESPONSE_FAILED, + KHUI_NC_RESPONSE_PENDING are also stored in the flags. + +@{*/ +#define KHUI_NCT_FLAG_PROCESSED 1024 +#define KHUI_NCT_FLAG_DISABLED 2048 +/*@}*/ + +/*! \brief Width of a new creds dialog panel in dialog units*/ +#define NCDLG_WIDTH 300 +/*! \brief Height of a new creds dialog panel in dialog units*/ +#define NCDLG_HEIGHT 166 + +/*! \brief Width of the button bar in dialog units */ +#define NCDLG_BBAR_WIDTH 60 +/*! \brief Height of a tab button in dialog units */ +#define NCDLG_TAB_HEIGHT 15 +/*! \brief Width of a tab button in dialog units */ +#define NCDLG_TAB_WIDTH 60 + +/*! \brief A custom prompt */ +typedef struct tag_khui_new_creds_prompt { + khm_size index; /*!< Set to the zero based index + of this prompt. */ + + khm_int32 type; /*!< one of KHUI_NCPROMPT_TYPE_* */ + wchar_t * prompt; /*!< prompt string. Cannot exceed + KHUI_MAXCCH_PROMPT */ + wchar_t * def; /*!< default value. Cannot exceed + KHUI_MAXCCH_PROMPT_VALUE */ + wchar_t * value; /*!< On completion, this is set to the + value that the user entered. Will + not exceed + KHUI_MAXCCH_PROMPT_VALUE */ + + khm_int32 flags; /*!< Combination of + KHUI_NCPROMPT_FLAG_* */ + + HWND hwnd_static; /* internal use */ + HWND hwnd_edit; /* internal use */ +} khui_new_creds_prompt; + +/*! \brief The prompt input is hidden + + The input is hidden for prompts which accept passwords. The + control which represents the input will display an asterisk or a + small circle corresponding to each character typed in, but will + not show the actual character. + */ +#define KHUI_NCPROMPT_FLAG_HIDDEN 1 + +/*! \brief Internal use */ +#define KHUI_NCPROMPT_FLAG_STOCK 2 + +/*! \brief Maximum number of characters in a prompt + + Refers to the prompt text that accompanies an input control. THe + length includes the terminating NULL. + */ +#define KHUI_MAXCCH_PROMPT 256 + +/*! \brief Maximum number of bytes in a prompt + + Refers to the prompt text that accompanies an input control. THe + length includes the terminating NULL. + */ +#define KHUI_MAXCB_PROMPT (KHUI_MAXCCH_PROMPT * sizeof(wchar_t)) + +/*! \brief Maximum number of characters that can be entered in an input control + + Refers to the input control of a prompt. The length includes the + terminating NULL. + */ +#define KHUI_MAXCCH_PROMPT_VALUE 256 + +/*! \brief Maximum number of bytes that can be entered in an input control + + Refers to the input control of a prompt. The length includes the + terminating NULL. + */ +#define KHUI_MAXCB_PROMPT_VALUE (KHUI_MAXCCH_PROMPT_VALUE * sizeof(wchar_t)) + +/* from krb5.h. Redefining here because we don't want to depend on + krb5.h for all credential types */ + +/*! \brief A password control */ +#define KHUI_NCPROMPT_TYPE_PASSWORD 1 + +/*! \brief New password control + + Used when changing the password + */ +#define KHUI_NCPROMPT_TYPE_NEW_PASSWORD 2 + +/*! \brief New password again control + + Used when changing the password + */ +#define KHUI_NCPROMPT_TYPE_NEW_PASSWORD_AGAIN 3 + +/*! \brief Preauthentication (reserved) */ +#define KHUI_NCPROMPT_TYPE_PREAUTH 4 + +/*! \brief Control sizes */ +typedef enum tag_khui_control_size { + KHUI_CTRLSIZE_SMALL, + /*!< A small control fits in about 1/5 the width of the new + credentials panel */ + KHUI_CTRLSIZE_HALF, + /*!< Half size controls fit in 1/2 the width of the new + credentials panel */ + KHUI_CTRLSIZE_FULL, + /*!< Takes up the whole width of the crednetials panel */ +} khui_control_size; + +/*! \brief Internal use */ +typedef struct tag_khui_control_row { + HWND label; + HWND input; + khui_control_size size; +} khui_control_row; + +/*! \brief Create a ::khui_new_creds object + + Creates and initializes a ::khui_new_creds object. The created + object must be destroyed using the khui_cw_destroy_cred_blob() + function. + + \note Plugins should not call this function directly. The + necessary ::khui_new_creds objects will be created by + NetIDMgr. + + \see khui_cw_destroy_cred_blob() + */ +KHMEXP khm_int32 KHMAPI +khui_cw_create_cred_blob(khui_new_creds ** c); + +/*! \brief Destroy a ::khui_new_creds object + + Destroys a ::khui_new_creds object that was fomerly created using + a call to khui_cw_create_cred_blob(). + + \note Plugins should not call this function directly. The + necessary ::khui_new_creds objects will be created by + NetIDMgr. + + \see khui_cw_create_cred_blob() +*/ +KHMEXP khm_int32 KHMAPI +khui_cw_destroy_cred_blob(khui_new_creds *c); + +/*! \brief Lock the new_creds object + + When a plugin is accessing the fields of a ::khui_new_creds + object, it must first obtain a lock on the object so that other + threads will not modify the fields at the same time. Locking the + object ensures that the fields of the object will be consistent. + + Use khui_cw_unlock_nc() to undo the lock obtained through a call + to khui_cw_lock_nc(). + + It is not necessary to lock a new credentials object when + modifying it using the NetIDMgr API. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_lock_nc(khui_new_creds * c); + +/*! \brief Unlock a new_creds object + + \see khui_cw_lock_nc() + */ +KHMEXP khm_int32 KHMAPI +khui_cw_unlock_nc(khui_new_creds * c); + +/*! \brief Add a new panel to a new credentials acquisition window + + See the description of ::khui_new_cred_panel for information on + how to populate it to describe a credentials type panel. + + Note that the structure pointed to by \a t is added by reference. + The memory pointed to by \a t is not copied. Hence, the block of + memory and any other blocks pointed to by the + ::khui_new_creds_by_type structure located there should remain + intact for the lifetime of the ::khui_new_creds structure pointed + to by \a c or until the credentials type panel is removed from the + ::khui_new_creds structure with a call to khui_cw_del_type(). + + Generally, a plug-in that calls this function should allocate a + block of memory to contain the ::khui_new_creds_by_type structure, + fill it in and then pass in the address in a call to + khui_cw_add_type() while handling a ::KMSG_CRED_PASSWORD, + ::KMSG_CRED_NEW_CREDS or ::KMSG_CRED_RENEW_CREDS message. Then + the plug-in should remove the reference with a call to + khui_cw_del_type() while processing ::KMSG_CRED_END. + + \see khui_cw_del_type() + \see \ref cred_acq_panel_spec + \see ::khui_new_cred_panel + \see ::khui_new_creds +*/ +KHMEXP khm_int32 KHMAPI +khui_cw_add_type(khui_new_creds * c, + khui_new_creds_by_type * t); + +/*! \brief Remove a panel from a new credentials acquisition window + + \see khui_cw_add_type() + */ +KHMEXP khm_int32 KHMAPI +khui_cw_del_type(khui_new_creds * c, + khm_int32 type); + +/*! \brief Find the panel belonging to a particular credentials type + + This panel would have been added to the new credentials window + using khui_cw_add_type(). + + \see khui_cw_add_type() + */ +KHMEXP khm_int32 KHMAPI +khui_cw_find_type(khui_new_creds * c, + khm_int32 type, + khui_new_creds_by_type **t); + +/*! \brief Enable/disable a particular credentials type + + Enables or disables the panel associated with a particular + credentials type. Does not preclude the credentials type from + participating in the new credentials acquisition. However, the + user will be prevented from interacting with the specific panel. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_enable_type(khui_new_creds * c, + khm_int32 type, + khm_boolean enable); + +/*! \brief Set the primary identity in a new credentials acuisition + + The primary identity dictates many of the defaults and the + semantics associated with the credentials acquision process. + Setting the primary identity also triggers the + ::WMNC_IDENTITY_CHANGE notification which will be sent to all the + credentials type panels. + + Has no effect if the primary identity is already the same as the + one specified in \a id. Specify NULL for \a id if the current + primary identity is to be cleared. + + If the primary identity is changed, then all the additional + identities associated with the new credentials acquisition dialog + will also be discarded. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_set_primary_id(khui_new_creds * c, + khm_handle id); + +/*! \brief Add an additional identity to the new credentials acquisition + + Individual plugins are free to decide how to handle additional + identities. Generally, they would attempt to obtain credentials + for the primary and additional identities, but would not consider + it an error if an additional identity failed to obtain + credentials. + + Calling this function with \a id of NULL does nothing. +*/ +KHMEXP khm_int32 KHMAPI +khui_cw_add_identity(khui_new_creds * c, + khm_handle id); + +/*! \brief Clear all custom prompts + + Removes all the custom prompts from the new credentials dialog. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_clear_prompts(khui_new_creds * c); + +/*! \brief Synchronize custom prompt values + + It is important to synchronize the values before accessing their + values. The controls associated with custom prompts update the + values in the ::khui_new_creds object periodically. However, the + values may lose sync intermittently. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_sync_prompt_values(khui_new_creds * c); + +/*! \brief Begin custom prompting + + Begins the process of defining custom prompts. Implicity removes + all the custom prompts that are currently being displayed. The \a + banner and \a name will be displayed in separate controls above + the set of new custom prompts. + + The controls associated with the prompts will not actually be + created until all the prompts have been added using + khui_cw_add_prompt(). The number of promtps that can be added + will be exactly \a n_prompts. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_begin_custom_prompts(khui_new_creds * c, + khm_size n_prompts, + wchar_t * banner, + wchar_t * name); + +/*! \brief Add a custom prompt + + After khui_cw_begin_custom_prompts() is called, the plugin should + call khui_cw_add_prompt() to add the actual prompts. The number + of prompts that can be added is the \a n_prompts value specified + in the earlier call to \a khui_cw_begin_custom_prompts(). + + Once \a n_prompts prompts have been added, the new prompts will + automatically be created and shown in the user interface. + However, if less than that prompts are added, nothing is displayed + to the user. + + \param[in] c Pointer to ::khui_new_creds structure + + \param[in] type Type of prompt. One of + ::KHUI_NCPROMPT_TYPE_PREAUTH, ::KHUI_NCPROMPT_TYPE_PASSWORD, + ::KHUI_NCPROMPT_TYPE_NEW_PASSWORD, + ::KHUI_NCPROMPT_TYPE_NEW_PASSWORD_AGAIN + + \param[in] prompt Text of the prompt. Constrained by + ::KHUI_MAXCCH_PROMPT. (Localized, required) + + \param[in] def Default value. (optional). Constrained by + ::KHUI_MAXCCH_PROMPT_VALUE. Set to NULL if not provided. + + \param[in] flags Flags. Combination of + ::KHUI_NCPROMPT_FLAG_HIDDEN + */ +KHMEXP khm_int32 KHMAPI +khui_cw_add_prompt(khui_new_creds * c, + khm_int32 type, + wchar_t * prompt, + wchar_t * def, + khm_int32 flags); + +/*! \brief Retrieve a custom prompt + + Retrieves an individual prompt. The \a idx parameter is a + zero-based index of the prompt to retrieve. The ordering is the + same as the order in which khui_cw_add_prompt() was called. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_get_prompt(khui_new_creds * c, + khm_size idx, + khui_new_creds_prompt ** prompt); + +/*! \brief Get the number of custom prompts + + Retrieves the number of custom prompts currently displayed. If + this function is called between calling + khui_cw_begin_custom_prompts() and adding all the prompts, the + number returned will be the number of prompts that is expected to + be registered (i.e. the \a n_prompts parameter passed to + khui_cw_begin_custom_prompts()). + */ +KHMEXP khm_int32 KHMAPI +khui_cw_get_prompt_count(khui_new_creds * c, + khm_size * np); + + +/*! \brief Get the value of a custom prompt + + Retrieve the value of a specific prompt. The value is the string + that was typed into the input control associated with a custom + prompt. The \a idx parameter is the zero-based index of the + prompt from which to retrieve the value from. The ordering is the + same as the order in which khui_cw_add_prompt() was called. + + It is important to call khui_cw_sync_prompt_values() before + starting to call khui_cw_get_prompt_value() so that the values + returned are up-to-date. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_get_prompt_value(khui_new_creds * c, + khm_size idx, + wchar_t * buf, + khm_size *cbbuf); + +/*! \brief Set the response for a plugin + + When handling ::KMSG_CRED_DIALOG_PROCESS from within the plugin + thread, it is important to set the response by calling this + function. The response can be used to signal whether the plugin + successfully obtained credentials or whether further interaction + is required, or the credentials acquisition failed. + + The response is a combination of : + - ::KHUI_NC_RESPONSE_PENDING + - ::KHUI_NC_RESPONSE_FAILED + - ::KHUI_NC_RESPONSE_PENDING + - ::KHUI_NC_RESPONSE_SUCCESS + - ::KHUI_NC_RESPONSE_NOEXIT + - ::KHUI_NC_RESPONSE_EXIT + */ +KHMEXP khm_int32 KHMAPI +khui_cw_set_response(khui_new_creds * c, + khm_int32 type, + khm_int32 response); + +/*! \brief Check whether a specified credential type panel succeeded + + This is called during the processing of KMSG_CRED_DIALOG_PROCESS + to determine whether a specified credential type succeeded in + obtaining credentials. The credential type that is being queried + should have also been listed as a dependency when adding the + current credentials type, otherwise the type queried may not have + been invoked yet. + + \return TRUE iff the queried type has reported that it successfully + completed the credentials acquision operation. + */ +KHMEXP khm_boolean KHMAPI +khui_cw_type_succeeded(khui_new_creds * c, + khm_int32 type); + +/*! \brief Add a row of controls to the identity specifier area + + Only for use by identity provider callbacks that wish to add an + identity selector control. A row of controls consist of a label + control and some input control. + + When the ::WMNC_IDENT_INIT message is sent to the identity + provider, it receives a handle to the dialog panel in the \a + lParam parameter which should be the parent window of both the + windows specified here. The control ID for any controls created + must fall within the ::KHUI_CW_ID_MIN and ::KHUI_CW_ID_MAX range. + + Both controls will be resized to fit in the row. + + If \a long_label is TRUE then the size of the label will be larger + than normal and will accomodate more text. + */ +KHMEXP khm_int32 KHMAPI +khui_cw_add_control_row(khui_new_creds * c, + HWND label, + HWND input, + khui_control_size size); + +/*!@}*/ /* Credentials acquisition */ +/*!@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khuidefs.h +++ krb5-1.4.4/src/windows/identity/uilib/khuidefs.h @@ -1,92 +1,92 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHUIDEFS_H -#define __KHIMAIRA_KHUIDEFS_H - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/*! \internal */ -KHMEXP void KHMAPI -khm_version_init(void); - -/*! \defgroup khui User Interface - - Functions and data structures for interacting with the user - interface. - -@{*/ - -/*! \brief Get the version of the NetIDMgr library - - \param[out] libver Receives the version of the library. - - \param[out] apiver Receives the API version of the library. - Optional. Set to NULL if this value is not required. - - \note When the NetIDMgr framework loads a plugin, it checks the - version information of the plugin against the version of the - library to determine if the plugin is compatible. - */ -KHMEXP void KHMAPI -khm_get_lib_version(khm_version * libver, khm_ui_4 * apiver); - -/*! \brief Return the version of Common Control library - - Can be used to check the version of the Windows Common Control - library that is currently loaded. The return value of the - function is the packed version value obatained by the macro : - - \code - MAKELONG(vesion->dwMinorVersion, version->dwMajorVersion); - \endcode - - The \a pdvi parameter is optional. Specify NULL if this is not - required. - */ -KHMEXP khm_ui_4 KHMAPI -khm_get_commctl_version(khm_version * pdvi); - -/*!@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHUIDEFS_H +#define __KHIMAIRA_KHUIDEFS_H + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/*! \internal */ +KHMEXP void KHMAPI +khm_version_init(void); + +/*! \defgroup khui User Interface + + Functions and data structures for interacting with the user + interface. + +@{*/ + +/*! \brief Get the version of the NetIDMgr library + + \param[out] libver Receives the version of the library. + + \param[out] apiver Receives the API version of the library. + Optional. Set to NULL if this value is not required. + + \note When the NetIDMgr framework loads a plugin, it checks the + version information of the plugin against the version of the + library to determine if the plugin is compatible. + */ +KHMEXP void KHMAPI +khm_get_lib_version(khm_version * libver, khm_ui_4 * apiver); + +/*! \brief Return the version of Common Control library + + Can be used to check the version of the Windows Common Control + library that is currently loaded. The return value of the + function is the packed version value obatained by the macro : + + \code + MAKELONG(vesion->dwMinorVersion, version->dwMajorVersion); + \endcode + + The \a pdvi parameter is optional. Specify NULL if this is not + required. + */ +KHMEXP khm_ui_4 KHMAPI +khm_get_commctl_version(khm_version * pdvi); + +/*!@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khhtlink.h +++ krb5-1.4.4/src/windows/identity/uilib/khhtlink.h @@ -1,58 +1,58 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHHTLINK_H -#define __KHIMAIRA_KHHTLINK_H - -/*! \addtogroup khui -@{ */ - -/*! \defgroup khui_hyperlink Hyperlink -@{*/ - -/*! \brief A hyperlink - - When a link in a hypertext window is clicked, this structure is - passed along with the message. - - The link text fields do to point to NULL terminated strings. - Instead, the length fields should be used to extract the string. - */ -typedef struct tag_khui_htwnd_link { - RECT r; - wchar_t * id; - int id_len; - wchar_t * param; - int param_len; -} khui_htwnd_link; - -#define KHUI_MAXCCH_HTLINK_FIELD 256 -#define KHUI_MAXCB_HTLINK_FIELD (KHUI_MAXCCH_HTLINK_FIELD * sizeof(wchar_t)) - -/*!@}*/ -/*!@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHHTLINK_H +#define __KHIMAIRA_KHHTLINK_H + +/*! \addtogroup khui +@{ */ + +/*! \defgroup khui_hyperlink Hyperlink +@{*/ + +/*! \brief A hyperlink + + When a link in a hypertext window is clicked, this structure is + passed along with the message. + + The link text fields do to point to NULL terminated strings. + Instead, the length fields should be used to extract the string. + */ +typedef struct tag_khui_htwnd_link { + RECT r; + wchar_t * id; + int id_len; + wchar_t * param; + int param_len; +} khui_htwnd_link; + +#define KHUI_MAXCCH_HTLINK_FIELD 256 +#define KHUI_MAXCB_HTLINK_FIELD (KHUI_MAXCCH_HTLINK_FIELD * sizeof(wchar_t)) + +/*!@}*/ +/*!@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khprops.h +++ krb5-1.4.4/src/windows/identity/uilib/khprops.h @@ -1,207 +1,207 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHPROPS_H -#define __KHIMAIRA_KHPROPS_H - -/********************************************************************* - Property sheets -**********************************************************************/ - -/*! \addtogroup khui - -@{*/ - -/*!\defgroup khui_pp Property sheets -@{*/ - -/* forward dcl */ -struct tag_khui_property_page; - -/*! \brief A property sheet - */ -typedef struct tag_khui_property_sheet { - PROPSHEETHEADER header; /*!< property sheet header */ - khm_int32 status; /*!< status of property sheet. One of - ::KHUI_PS_STATUS_NONE, - ::KHUI_PS_STATUS_RUNNING or - ::KHUI_PS_STATUS_DONE */ - - HWND hwnd; /*!< handle to the property sheet window. - Only valid when \a status is NOT - ::KHUI_PS_STATUS_NONE */ - - HWND hwnd_page; /*!< handle to the current page in the - property sheet. Only valid when \a - status is ::KHUI_PS_STATUS_RUNNING */ - - khui_action_context ctx; /*!< Context for the property sheet. See - documentation for - ::khui_action_context */ - - khm_handle identity; /*!< Handle to the associated identity, - if applicable */ - khm_int32 credtype; /*!< Type ID of the credentials type, if - applicable */ - khm_handle cred; /*!< Handle to the associated credential, - if applicable */ - - khm_int32 n_pages; /*!< Number of property pages. - Upperbound of ::KHUI_PS_MAX_PSP */ - - QDCL(struct tag_khui_property_page); -} khui_property_sheet; - -/*! \brief The property sheet hasn't been created yet */ -#define KHUI_PS_STATUS_NONE 0 - -/*! \brief The property sheet is visible and running */ -#define KHUI_PS_STATUS_RUNNING 1 - -/*! \brief The property sheet has completed running. - - At this point, it is safe to call khui_ps_destroy_sheet() to - destroy the property sheet. -*/ -#define KHUI_PS_STATUS_DONE 2 - -/*! \brief The property sheet is in the process of being destroyed - */ -#define KHUI_PS_STATUS_DESTROY 3 - -/*! \brief Maximum number of property sheet pages in a property sheet */ -#define KHUI_PS_MAX_PSP 16 - - -/*! \brief A property sheet page - */ -typedef struct tag_khui_property_page { - HPROPSHEETPAGE h_page; - LPPROPSHEETPAGE p_page; - HWND hwnd; - khm_int32 credtype; - khm_int32 ordinal; - - LDCL(struct tag_khui_property_page); -} khui_property_page; - -/*! \brief Special pseudo credtype for identity page - */ -#define KHUI_PPCT_IDENTITY (-8) - -/*! \brief Special pseudo credtype for credential page - */ -#define KHUI_PPCT_CREDENTIAL (-9) - -/*! \brief Create a property sheet - - \note Only called by the NetIDMgr application. - */ -KHMEXP khm_int32 KHMAPI -khui_ps_create_sheet(khui_property_sheet ** sheet); - -/*! \brief Add a page to a property sheet - - Called by a plugin or the NetIDMgr application to add a page to a - property sheet. - - Pages can only be added before the property sheet is made visible - to the user. - - \param[in] sheet The property sheet to add the page to - - \param[in] credtype The credentials type ID of the owner of the - property page. This should be set to ::KCDB_CREDTYPE_INVALID - if the type is not relevant. - - \param[in] ordinal Requested ordinal. A positive integer which is - used to order the pages in a property sheet. The pages are - ordered based on ordinal first and then alphabetically by - credentials type name. If the type is unavailable, then the - ordering is undefined. Ordinals for credential type property - pages can be in the range from 0 to 127. Ordinals 128 and - above are reserved. Passing in 0 will work for credentials - providers unless they provide more than one property page per - credential, in which case the ordinal should be used to - enforce an order. - - \param[in] ppage Pointer to structure that will be passed to - CreatePropertySheetPage() to create the property page. The - structure is not managed by NetIDMgr at all, and must exist - until the status of the property sheet changes to - ::KHUI_PS_STATUS_RUNNING. The same pointer will be found in - the \a p_page member of the ::khui_property_page structure. - - \param[out] page A pointer will be returned here that will point - to the newly created khui_property_page structure. Specify - NULL if this value is not required. You can use - khui_ps_find_page() to retrieve a pointer to the structure - later. - */ -KHMEXP khm_int32 KHMAPI -khui_ps_add_page(khui_property_sheet * sheet, - khm_int32 credtype, - khm_int32 ordinal, - LPPROPSHEETPAGE ppage, - khui_property_page ** page); - -/*! \brief Retrieve a property page structure from a property sheet - */ -KHMEXP khm_int32 KHMAPI -khui_ps_find_page(khui_property_sheet * sheet, - khm_int32 credtype, - khui_property_page ** page); - -/*! \brief Display the property sheet - - \note Only called by the NetIDMgr application - */ -KHMEXP HWND KHMAPI -khui_ps_show_sheet(HWND parent, - khui_property_sheet * sheet); - -/*! \brief Check if the given message belongs to the property sheet - - \note Only called by the NetIDMgr application - */ -KHMEXP LRESULT KHMAPI -khui_ps_check_message(khui_property_sheet * sheet, - PMSG msg); - -/*! \brief Destroy a property sheet and all associated data structures. - - \note Only called by the NetIDMgr application. -*/ -KHMEXP khm_int32 KHMAPI -khui_ps_destroy_sheet(khui_property_sheet * sheet); - -KHMEXP khm_int32 KHMAPI -khui_property_wnd_set_record(HWND hwnd_pwnd, khm_handle record); - -/*!@}*/ -/*!@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHPROPS_H +#define __KHIMAIRA_KHPROPS_H + +/********************************************************************* + Property sheets +**********************************************************************/ + +/*! \addtogroup khui + +@{*/ + +/*!\defgroup khui_pp Property sheets +@{*/ + +/* forward dcl */ +struct tag_khui_property_page; + +/*! \brief A property sheet + */ +typedef struct tag_khui_property_sheet { + PROPSHEETHEADER header; /*!< property sheet header */ + khm_int32 status; /*!< status of property sheet. One of + ::KHUI_PS_STATUS_NONE, + ::KHUI_PS_STATUS_RUNNING or + ::KHUI_PS_STATUS_DONE */ + + HWND hwnd; /*!< handle to the property sheet window. + Only valid when \a status is NOT + ::KHUI_PS_STATUS_NONE */ + + HWND hwnd_page; /*!< handle to the current page in the + property sheet. Only valid when \a + status is ::KHUI_PS_STATUS_RUNNING */ + + khui_action_context ctx; /*!< Context for the property sheet. See + documentation for + ::khui_action_context */ + + khm_handle identity; /*!< Handle to the associated identity, + if applicable */ + khm_int32 credtype; /*!< Type ID of the credentials type, if + applicable */ + khm_handle cred; /*!< Handle to the associated credential, + if applicable */ + + khm_int32 n_pages; /*!< Number of property pages. + Upperbound of ::KHUI_PS_MAX_PSP */ + + QDCL(struct tag_khui_property_page); +} khui_property_sheet; + +/*! \brief The property sheet hasn't been created yet */ +#define KHUI_PS_STATUS_NONE 0 + +/*! \brief The property sheet is visible and running */ +#define KHUI_PS_STATUS_RUNNING 1 + +/*! \brief The property sheet has completed running. + + At this point, it is safe to call khui_ps_destroy_sheet() to + destroy the property sheet. +*/ +#define KHUI_PS_STATUS_DONE 2 + +/*! \brief The property sheet is in the process of being destroyed + */ +#define KHUI_PS_STATUS_DESTROY 3 + +/*! \brief Maximum number of property sheet pages in a property sheet */ +#define KHUI_PS_MAX_PSP 16 + + +/*! \brief A property sheet page + */ +typedef struct tag_khui_property_page { + HPROPSHEETPAGE h_page; + LPPROPSHEETPAGE p_page; + HWND hwnd; + khm_int32 credtype; + khm_int32 ordinal; + + LDCL(struct tag_khui_property_page); +} khui_property_page; + +/*! \brief Special pseudo credtype for identity page + */ +#define KHUI_PPCT_IDENTITY (-8) + +/*! \brief Special pseudo credtype for credential page + */ +#define KHUI_PPCT_CREDENTIAL (-9) + +/*! \brief Create a property sheet + + \note Only called by the NetIDMgr application. + */ +KHMEXP khm_int32 KHMAPI +khui_ps_create_sheet(khui_property_sheet ** sheet); + +/*! \brief Add a page to a property sheet + + Called by a plugin or the NetIDMgr application to add a page to a + property sheet. + + Pages can only be added before the property sheet is made visible + to the user. + + \param[in] sheet The property sheet to add the page to + + \param[in] credtype The credentials type ID of the owner of the + property page. This should be set to ::KCDB_CREDTYPE_INVALID + if the type is not relevant. + + \param[in] ordinal Requested ordinal. A positive integer which is + used to order the pages in a property sheet. The pages are + ordered based on ordinal first and then alphabetically by + credentials type name. If the type is unavailable, then the + ordering is undefined. Ordinals for credential type property + pages can be in the range from 0 to 127. Ordinals 128 and + above are reserved. Passing in 0 will work for credentials + providers unless they provide more than one property page per + credential, in which case the ordinal should be used to + enforce an order. + + \param[in] ppage Pointer to structure that will be passed to + CreatePropertySheetPage() to create the property page. The + structure is not managed by NetIDMgr at all, and must exist + until the status of the property sheet changes to + ::KHUI_PS_STATUS_RUNNING. The same pointer will be found in + the \a p_page member of the ::khui_property_page structure. + + \param[out] page A pointer will be returned here that will point + to the newly created khui_property_page structure. Specify + NULL if this value is not required. You can use + khui_ps_find_page() to retrieve a pointer to the structure + later. + */ +KHMEXP khm_int32 KHMAPI +khui_ps_add_page(khui_property_sheet * sheet, + khm_int32 credtype, + khm_int32 ordinal, + LPPROPSHEETPAGE ppage, + khui_property_page ** page); + +/*! \brief Retrieve a property page structure from a property sheet + */ +KHMEXP khm_int32 KHMAPI +khui_ps_find_page(khui_property_sheet * sheet, + khm_int32 credtype, + khui_property_page ** page); + +/*! \brief Display the property sheet + + \note Only called by the NetIDMgr application + */ +KHMEXP HWND KHMAPI +khui_ps_show_sheet(HWND parent, + khui_property_sheet * sheet); + +/*! \brief Check if the given message belongs to the property sheet + + \note Only called by the NetIDMgr application + */ +KHMEXP LRESULT KHMAPI +khui_ps_check_message(khui_property_sheet * sheet, + PMSG msg); + +/*! \brief Destroy a property sheet and all associated data structures. + + \note Only called by the NetIDMgr application. +*/ +KHMEXP khm_int32 KHMAPI +khui_ps_destroy_sheet(khui_property_sheet * sheet); + +KHMEXP khm_int32 KHMAPI +khui_property_wnd_set_record(HWND hwnd_pwnd, khm_handle record); + +/*!@}*/ +/*!@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khremote.h +++ krb5-1.4.4/src/windows/identity/uilib/khremote.h @@ -1,84 +1,84 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_REMOTE_H -#define __KHIMAIRA_REMOTE_H - -/*! \addtogroup khui - @{*/ -/*! \defgroup khui_remote Connecting to NetIDMgr from another process - @{*/ - -/* Leash compatibility */ -#define ID_OBTAIN_TGT_WITH_LPARAM 32810 - -#define KHUI_REQDAEMONWND_CLASS L"IDMgrRequestDaemonCls" -#define KHUI_REQDAEMONWND_NAME L"IDMgrRequestDaemon" - -#define KHUI_REQD_MAPPING_FORMAT L"Local\\NetIDMgr_DlgInfo_%lu" - -#define NETID_USERNAME_SZ 128 -#define NETID_REALM_SZ 192 -#define NETID_TITLE_SZ 256 -#define NETID_CCACHE_NAME_SZ 264 - -#define NETID_DLGTYPE_TGT 0 -#define NETID_DLGTYPE_CHPASSWD 1 -typedef struct { - DWORD size; - DWORD dlgtype; - // Tells whether dialog box is in change pwd mode or init ticket mode - struct { - WCHAR title[NETID_TITLE_SZ]; - WCHAR username[NETID_USERNAME_SZ]; - WCHAR realm[NETID_REALM_SZ]; - WCHAR ccache[NETID_CCACHE_NAME_SZ]; - DWORD use_defaults; - DWORD forwardable; - DWORD noaddresses; - DWORD lifetime; - DWORD renew_till; - DWORD proxiable; - DWORD publicip; - DWORD must_use_specified_principal; - } in; - struct { - WCHAR username[NETID_USERNAME_SZ]; - WCHAR realm[NETID_REALM_SZ]; - WCHAR ccache[NETID_CCACHE_NAME_SZ]; - } out; - // Version 1 of this structure ends here -} NETID_DLGINFO, *LPNETID_DLGINFO; - -#define NETID_DLGINFO_V1_SZ (10 * sizeof(DWORD) \ - + sizeof(WCHAR) * (NETID_TITLE_SZ + \ - 2 * NETID_USERNAME_SZ + 2 * NETID_REALM_SZ + \ - 2 * NETID_CCACHE_NAME_SZ)) - -/*!@} */ -/*!@} */ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_REMOTE_H +#define __KHIMAIRA_REMOTE_H + +/*! \addtogroup khui + @{*/ +/*! \defgroup khui_remote Connecting to NetIDMgr from another process + @{*/ + +/* Leash compatibility */ +#define ID_OBTAIN_TGT_WITH_LPARAM 32810 + +#define KHUI_REQDAEMONWND_CLASS L"IDMgrRequestDaemonCls" +#define KHUI_REQDAEMONWND_NAME L"IDMgrRequestDaemon" + +#define KHUI_REQD_MAPPING_FORMAT L"Local\\NetIDMgr_DlgInfo_%lu" + +#define NETID_USERNAME_SZ 128 +#define NETID_REALM_SZ 192 +#define NETID_TITLE_SZ 256 +#define NETID_CCACHE_NAME_SZ 264 + +#define NETID_DLGTYPE_TGT 0 +#define NETID_DLGTYPE_CHPASSWD 1 +typedef struct { + DWORD size; + DWORD dlgtype; + // Tells whether dialog box is in change pwd mode or init ticket mode + struct { + WCHAR title[NETID_TITLE_SZ]; + WCHAR username[NETID_USERNAME_SZ]; + WCHAR realm[NETID_REALM_SZ]; + WCHAR ccache[NETID_CCACHE_NAME_SZ]; + DWORD use_defaults; + DWORD forwardable; + DWORD noaddresses; + DWORD lifetime; + DWORD renew_till; + DWORD proxiable; + DWORD publicip; + DWORD must_use_specified_principal; + } in; + struct { + WCHAR username[NETID_USERNAME_SZ]; + WCHAR realm[NETID_REALM_SZ]; + WCHAR ccache[NETID_CCACHE_NAME_SZ]; + } out; + // Version 1 of this structure ends here +} NETID_DLGINFO, *LPNETID_DLGINFO; + +#define NETID_DLGINFO_V1_SZ (10 * sizeof(DWORD) \ + + sizeof(WCHAR) * (NETID_TITLE_SZ + \ + 2 * NETID_USERNAME_SZ + 2 * NETID_REALM_SZ + \ + 2 * NETID_CCACHE_NAME_SZ)) + +/*!@} */ +/*!@} */ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/configui.h +++ krb5-1.4.4/src/windows/identity/uilib/configui.h @@ -1,74 +1,74 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_CONFIGUI_H -#define __KHIMAIRA_CONFIGUI_H - -typedef struct tag_cfg_node_data { - void * key; - HWND hwnd; - LPARAM param; - khm_int32 flags; -} cfg_node_data; - -typedef struct tag_khui_config_node_i { - khm_int32 magic; - - khui_config_node_reg reg; - kmm_plugin owner; - khm_int32 id; - - HWND hwnd; - LPARAM param; - - cfg_node_data * data; - khm_size n_data; - khm_size nc_data; - - khm_int32 refcount; - khm_int32 flags; - TDCL(struct tag_khui_config_node_i); -} khui_config_node_i; - -#define KHUI_CONFIG_NODE_MAGIC 0x38f4cb52 - -#define KHUI_NODEDATA_ALLOC_INCR 8 - -#define KHUI_CN_FLAG_DELETED 0x0008 - -#define cfgui_is_valid_node_handle(v) \ -((v) && ((khui_config_node_i *) (v))->magic == KHUI_CONFIG_NODE_MAGIC) - -#define cfgui_is_valid_node(n) \ -((n)->magic == KHUI_CONFIG_NODE_MAGIC) - -#define cfgui_node_i_from_handle(v) \ -((khui_config_node_i *) v) - -#define cfgui_handle_from_node_i(n) \ -((khui_config_node) n) - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_CONFIGUI_H +#define __KHIMAIRA_CONFIGUI_H + +typedef struct tag_cfg_node_data { + void * key; + HWND hwnd; + LPARAM param; + khm_int32 flags; +} cfg_node_data; + +typedef struct tag_khui_config_node_i { + khm_int32 magic; + + khui_config_node_reg reg; + kmm_plugin owner; + khm_int32 id; + + HWND hwnd; + LPARAM param; + + cfg_node_data * data; + khm_size n_data; + khm_size nc_data; + + khm_int32 refcount; + khm_int32 flags; + TDCL(struct tag_khui_config_node_i); +} khui_config_node_i; + +#define KHUI_CONFIG_NODE_MAGIC 0x38f4cb52 + +#define KHUI_NODEDATA_ALLOC_INCR 8 + +#define KHUI_CN_FLAG_DELETED 0x0008 + +#define cfgui_is_valid_node_handle(v) \ +((v) && ((khui_config_node_i *) (v))->magic == KHUI_CONFIG_NODE_MAGIC) + +#define cfgui_is_valid_node(n) \ +((n)->magic == KHUI_CONFIG_NODE_MAGIC) + +#define cfgui_node_i_from_handle(v) \ +((khui_config_node_i *) v) + +#define cfgui_handle_from_node_i(n) \ +((khui_config_node) n) + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khrescache.h +++ krb5-1.4.4/src/windows/identity/uilib/khrescache.h @@ -1,100 +1,100 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_RESCACHE_H -#define __KHIMAIRA_RESCACHE_H - -#include - -KHMEXP void KHMAPI -khui_init_rescache(void); - -KHMEXP void KHMAPI -khui_exit_rescache(void); - -KHMEXP void KHMAPI -khui_cache_bitmap(UINT id, HBITMAP hbm); - -KHMEXP HBITMAP KHMAPI -khui_get_cached_bitmap(UINT id); - -typedef struct khui_ilist_t { - int cx; - int cy; - int n; - int ng; - int nused; - HBITMAP img; - HBITMAP mask; - int *idlist; -} khui_ilist; - -typedef struct khui_bitmap_t { - HBITMAP hbmp; - int cx; - int cy; -} khui_bitmap; - -KHMEXP void KHMAPI -khui_bitmap_from_hbmp(khui_bitmap * kbm, HBITMAP hbm); - -KHMEXP void KHMAPI -khui_delete_bitmap(khui_bitmap * kbm); - -KHMEXP void KHMAPI -khui_draw_bitmap(HDC hdc, int x, int y, khui_bitmap * kbm); - -/* image lists */ -KHMEXP khui_ilist * KHMAPI -khui_create_ilist(int cx, int cy, int n, int ng, int opt); - -KHMEXP BOOL KHMAPI -khui_delete_ilist(khui_ilist * il); - -KHMEXP int KHMAPI -khui_ilist_add_masked(khui_ilist * il, HBITMAP hbm, COLORREF cbkg); - -KHMEXP int KHMAPI -khui_ilist_add_masked_id(khui_ilist *il, HBITMAP hbm, - COLORREF cbkg, int id); - -KHMEXP int KHMAPI -khui_ilist_lookup_id(khui_ilist *il, int id); - -KHMEXP void KHMAPI -khui_ilist_draw(khui_ilist * il, int idx, HDC dc, int x, int y, int opt); - -KHMEXP void KHMAPI -khui_ilist_draw_bg(khui_ilist * il, int idx, HDC dc, int x, int y, - int opt, COLORREF bgcolor); - -#define khui_ilist_draw_id(il, id, dc, x, y, opt) \ - khui_ilist_draw((il),khui_ilist_lookup_id((il),(id)),(dc),(x),(y),(opt)) - -#define KHUI_SMICON_CX 16 -#define KHUI_SMICON_CY 16 - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_RESCACHE_H +#define __KHIMAIRA_RESCACHE_H + +#include + +KHMEXP void KHMAPI +khui_init_rescache(void); + +KHMEXP void KHMAPI +khui_exit_rescache(void); + +KHMEXP void KHMAPI +khui_cache_bitmap(UINT id, HBITMAP hbm); + +KHMEXP HBITMAP KHMAPI +khui_get_cached_bitmap(UINT id); + +typedef struct khui_ilist_t { + int cx; + int cy; + int n; + int ng; + int nused; + HBITMAP img; + HBITMAP mask; + int *idlist; +} khui_ilist; + +typedef struct khui_bitmap_t { + HBITMAP hbmp; + int cx; + int cy; +} khui_bitmap; + +KHMEXP void KHMAPI +khui_bitmap_from_hbmp(khui_bitmap * kbm, HBITMAP hbm); + +KHMEXP void KHMAPI +khui_delete_bitmap(khui_bitmap * kbm); + +KHMEXP void KHMAPI +khui_draw_bitmap(HDC hdc, int x, int y, khui_bitmap * kbm); + +/* image lists */ +KHMEXP khui_ilist * KHMAPI +khui_create_ilist(int cx, int cy, int n, int ng, int opt); + +KHMEXP BOOL KHMAPI +khui_delete_ilist(khui_ilist * il); + +KHMEXP int KHMAPI +khui_ilist_add_masked(khui_ilist * il, HBITMAP hbm, COLORREF cbkg); + +KHMEXP int KHMAPI +khui_ilist_add_masked_id(khui_ilist *il, HBITMAP hbm, + COLORREF cbkg, int id); + +KHMEXP int KHMAPI +khui_ilist_lookup_id(khui_ilist *il, int id); + +KHMEXP void KHMAPI +khui_ilist_draw(khui_ilist * il, int idx, HDC dc, int x, int y, int opt); + +KHMEXP void KHMAPI +khui_ilist_draw_bg(khui_ilist * il, int idx, HDC dc, int x, int y, + int opt, COLORREF bgcolor); + +#define khui_ilist_draw_id(il, id, dc, x, y, opt) \ + khui_ilist_draw((il),khui_ilist_lookup_id((il),(id)),(dc),(x),(y),(opt)) + +#define KHUI_SMICON_CX 16 +#define KHUI_SMICON_CY 16 + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/khconfigui.h +++ krb5-1.4.4/src/windows/identity/uilib/khconfigui.h @@ -1,616 +1,616 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHCONFIGUI_H -#define __KHIMAIRA_KHCONFIGUI_H - -/*! \addtogroup khui -@{ */ - -/*! \defgroup khui_cfg Configuration Panels - - Configuration panels are the primary means from which the user is - presented with an interface to change NetIDMgr and plugin - configuration. - -@{ */ - -/*! \brief Configuration window notification message - - This is the message that will be used to notify dialog panels. - - The format of the message is : - - uMsg : KHUI_WM_CFG_NOTIFY - - HIWORD(wParam) : one of ::khui_wm_cfg_notifications - - \note This is the same as ::KHUI_WM_NC_NOTIFY - */ -#define KHUI_WM_CFG_NOTIFY (WM_APP + 0x101) - -/*! \brief Configuration notifications - - These are sent thorugh a ::KHUI_WM_CFG_NOTIFY message. - - The format of the message is : - - uMsg : KHUI_WM_CFG_NOTIFY - - HIWORD(wParam) : one of ::khui_wm_cfg_notifications - */ -enum khui_wm_cfg_notifications { - WMCFG_SHOW_NODE = 1, - /*!< Sent to the configuration dialog to request that the panel - for the specified node be shown. The \a lParam message - parameter will contain a held ::khui_config_node handle. The - sender of the mssage is responsible for releasing the handle.*/ - - WMCFG_UPDATE_STATE = 2, - /*!< Sent to the configuration dialog to indicate that the state - flags for the specified configuration node have changed. - - - LOWORD(wParam) : new flags - - lParam : ::khui_config_node for the node*/ - - WMCFG_APPLY = 3, - /*!< Sent to all the configuration panels when the user clicks the - 'Apply' button or the 'Ok' button. The panels are responsible - for applying the configuration changes and updating their flags - using khui_cfg_set_flags(). */ - - WMCFG_SYNC_NODE_LIST = 4, - /*!< Sent from the UI library to the configuration window to - notify the window that the node list has changed. This message - is sent synchronously before the node is removed. */ -}; - -/*! \brief Registration information for a configuration node - - \see khui_cfg_register_node() -*/ -typedef struct tag_khui_config_node_reg { - const wchar_t * name; /*!< Internal identifier - (not-localized, required). The name - is required to be unique among - sibling nodes. However it is not - required to be unique globally. The - size of the name is constrained by - ::KHUI_MAXCCH_NAME*/ - - const wchar_t * short_desc; /*!< Short description (Localized, - required). This is the name which - identifies the node within a - collection of siblings. The size of - the string is constrained by - ::KHUI_MAXCCH_SHORT_DESC*/ - - const wchar_t * long_desc; /*!< Global name of the node. - (Localized, required). This - uniquely identifies the node in the - collection of all configuration - nodes. The size of the string is - constrained by - ::KHUI_MAXCCH_LONG_DESC.*/ - - HMODULE h_module; /*!< Module which contains the dialog - resource specified in \a - dlg_template */ - - LPWSTR dlg_template; /*!< Dialog template for the - configuration window */ - - DLGPROC dlg_proc; /*!< Dialog procedure */ - - khm_int32 flags; /*!< Flags. Can be a combination of - ::KHUI_CNFLAG_SORT_CHILDREN and - ::KHUI_CNFLAG_SUBPANEL*/ - -} khui_config_node_reg; - -/*! \brief Sort the child nodes by short description */ -#define KHUI_CNFLAG_SORT_CHILDREN 0x0001 - -/*! \brief Is a subpanel */ -#define KHUI_CNFLAG_SUBPANEL 0x0002 - -/*! \brief Node represents a panel that is replicated for all child nodes */ -#define KHUI_CNFLAG_PLURAL 0x0004 - -/*! \brief System node - - \note For internal use by the NetIDMgr application. Do not use. -*/ -#define KHUI_CNFLAG_SYSTEM 0x0010 - -#define KHUI_CNFLAG_MODIFIED 0x0100 -#define KHUI_CNFLAG_APPLIED 0x0200 - -#define KHUI_CNFLAGMASK_STATIC 0x00ff -#define KHUI_CNFLAGMASK_DYNAMIC 0x0f00 - -/*! \brief Maximum length of the name in characters - - The length includes the terminating NULL - */ -#define KHUI_MAXCCH_NAME 256 - -/*! \brief Maximum length of the name in bytes - - The length includes the terminating NULL - */ -#define KHUI_MAXCB_NAME (KHUI_MAXCCH_NAME * sizeof(wchar_t)) - -/*! \brief Maximum length of the long description in characters - - The length includes the terminating NULL - */ -#define KHUI_MAXCCH_LONG_DESC 1024 - -/*! \brief Maximum length of the long description in bytes - - The length includes the terminating NULL - */ -#define KHUI_MAXCB_LONG_DESC (KHUI_MAXCCH_LONG_DESC * sizeof(wchar_t)) - -/*! \brief Maximum length of the short description in chracters - - The length includes the terminating NULL - */ -#define KHUI_MAXCCH_SHORT_DESC 256 - -/*! \brief Maximum length of the short description in bytes - - The length includes the terminating NULL - */ -#define KHUI_MAXCB_SHORT_DESC (KHUI_MAXCCH_SHORT_DESC * sizeof(wchar_t)) - -/*! \brief Width of a configuration dialog in dialog units - - ::CFGDLG_WIDTH and ::CFGDLG_HEIGHT specify the dimensions of a - configuration dialog width and height in dialog units. The dialog - will be created as a child of the configuration dialog and placed - within it. - */ -#define CFGDLG_WIDTH 255 - -/*! \brief Height of a configuration dialog in dialog units - - \see ::CFGDLG_WIDTH -*/ -#define CFGDLG_HEIGHT 182 - -/*! \brief Width of a configuration tab dialog in dialog units - - ::CFGDLG_TAB_WIDTH and ::CFGDLG_TAB_HEIGHT specify the dimensions - (in dialog units) of a dialog that will be placed within a tab - control for dialogs where multiple display panels need to be - shown. - */ -#define CFGDLG_TAB_WIDTH 235 - -/*! \brief Height of configuration tab dialog in dialog units - - \see ::CFGDLG_TAB_WIDTH - */ -#define CFGDLG_TAB_HEIGHT 151 - -/*! \brief A handle to a configuration node - - \see khui_cfg_open_node(), khui_cfg_close_node() -*/ -typedef khm_handle khui_config_node; - -/*! \brief Initialization data passed in to a subpanel - - When creating a subpanel, a pointer to the following strucutred - will be passed in as the creation parameter for the dialog. -*/ -typedef struct tag_khui_config_init_data { - khui_config_node ctx_node; /*!< The node under which the current - dialog subpanel is being created. */ - - khui_config_node this_node; /*!< The node which provided the - registration information for the - creation of the subpanel. */ - - khui_config_node ref_node; /*!< The parent node of the subpanel - node. In nodes which have the - ::KHUI_CNFLAG_PLURAL, this would be - different from the \a node. This is - the node under which the subpanel - was registered. */ -} khui_config_init_data; - -/*! \brief Register a configuration node - - The caller fills the registration information in the - ::khui_config_node_reg structre. If the call succeeds, the - function will return KHM_ERROR_SUCCESS. - - \param[in] parent Parent of the node to be registered. Set to - NULL if the parent is the root node. - - \param[in] reg Registration information - - \param[out] new_id Receives the new unique identifier of the - configuration node. Pass in NULL if the new identifier is not - required. - - \retval KHM_ERROR_SUCCESS Success - \retval KHM_ERROR_INVALID_PARAM One or more parameters, or fields - of reg were invalid - \retval KHM_ERROR_DUPLICATE A node with the same name exists as a - child of the specified parent node. - - \note The name (not the short or long description) of the node can - not be the same as the name of a custom action. See - khui_action_create(). - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_register(khui_config_node parent, - const khui_config_node_reg * reg); - -/*!\brief Open a configuration node by name - - If successful, the \a result parameter will receive a handle to - the configuration node. Use khui_cfg_release() to release - the handle. - - \param[in] parent Parent node. Set to NULL to specify root node. - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_open(khui_config_node parent, - const wchar_t * name, - khui_config_node * result); - -/*! \brief Remove a configuration node - - Marks a configuration node as deleted. Once all the handles, - including the handle specified in \a node have been released, it - will be deleted. - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_remove(khui_config_node node); - -/*! \brief Hold a handle to a configuration node - - Obtains an additional hold on the handle specified by \a node. - The hold must be released with a call to \a - khui_cfg_release() - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_hold(khui_config_node node); - -/*! \brief Release a handle to a configuration node - - \see khui_cfg_hold() - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_release(khui_config_node node); - -/*! \brief Get the parent of a node - - Returns a held handle to the parent of the node, or NULL if the - current node is a top level node. The returned handle must be - released with khui_cfg_release(). - - \retval KHM_ERROR_SUCCESS The handle to the parent node is in \a result - \retval KHM_ERROR_NOT_FOUND The node is a top level node - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_parent(khui_config_node vnode, - khui_config_node * result); - -/*! \brief Get a handle to the first child node - - If the call is successful, \a result will receieve a handle to the - first child node of the specified node. The returned handle must - be released with a call to khui_cfg_release() - - If \a parent does not have any child nodes, the function will - return KHM_ERROR_NOT_FOUND and set \a result to NULL. - - \param[in] parent Parent node. Set to NULL to specify root node. - \param[out] result Receives a held handle to the first child node. - - \see khui_cfg_get_next() - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_first_child(khui_config_node parent, - khui_config_node * result); - -/*! \brief Get a handle to the first subpanel - - If the call is successful, \a result will receieve a handle to the - first subpanel node of the specified node. The returned handle - must be released with a call to khui_cfg_release() - - If \a parent does not have any subpanels, the function will return - KHM_ERROR_NOT_FOUND and set \a result to NULL. - - A subpanel node is a node which has the ::KHUI_CNFLAG_SUBPANEL - flag set. - - \param[in] parent Parent node. Set to NULL to specify root node. - \param[out] result Receives a held handle to the first subpanel node. - - \see khui_cfg_get_next() - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_first_subpanel(khui_config_node vparent, - khui_config_node * result); - -/*! \brief Get a handle to the next sibling node - - If the call is successful, \a result will receive a held handle to - the next sibling node. The returned handle must be released with - a call to khui_cfg_release(). - - If there are no more sibling nodes, then the function return - KHM_ERROR_NOT_FOUND and set \a result to NULL. - - This function can be used to traverse a list of child nodes as - well as a list of subpanel nodes. - - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_next(khui_config_node node, - khui_config_node * result); - -/*! \brief Get a handle to the next sibling node - - Similar to khui_cfg_get_next(), but implicitly releases the handle - that was supplied. Equivalent to doing : - - \code - khui_cfg_get_next(node, &next); - khui_cfg_release(node); - node = next; - \endcode - - \param[in,out] node On entry, specifies the node whose sibling - needs to be fetched. On exit, will have either NULL or a held - handle to the sibling node. The handle which was supplied to - the function is released. - - \retval KHM_ERROR_SUCCESS The next node is now in \a node - \retval KHM_ERROR_INVALID_PARAM \a node was not a valid handle - \retval KHM_ERROR_NOT_FOUND There are no more siblings. \a node - is set to NULL. - - \note Even if there are no more siblings, the handle specified in - \a node on entry is released. - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_next_release(khui_config_node * node); - -/*! \brief Get the name of a configuration node - - Gets the name (not the short description or the long description) - of the given configuration node. -*/ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_name(khui_config_node node, - wchar_t * buf, - khm_size * cb_buf); - -/*! \brief Get registration information for a node - - The registration information that is returned is a shallow copy of - the data kept by NetIDMgr. In particular, the strings that will - be returned actually point to internal buffers and should not be - modified. - - No further action is necessary to release the information. - However, the returned data ceases to be valid when \a node is - released with a call to khui_cfg_release(). - - \param[in] node Node for which information is requested. Can be NULL if requesting information about the root node. - \param[out] reg Pointer to a ::khui_config_node_reg structure. - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_reg(khui_config_node node, - khui_config_node_reg * reg); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP HWND KHMAPI -khui_cfg_get_hwnd_inst(khui_config_node node, - khui_config_node noderef); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP LPARAM KHMAPI -khui_cfg_get_param_inst(khui_config_node node, - khui_config_node noderef); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP void KHMAPI -khui_cfg_set_hwnd_inst(khui_config_node node, - khui_config_node noderef, - HWND hwnd); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP void KHMAPI -khui_cfg_set_param_inst(khui_config_node node, - khui_config_node noderef, - LPARAM param); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP HWND KHMAPI -khui_cfg_get_hwnd(khui_config_node node); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP LPARAM KHMAPI -khui_cfg_get_param(khui_config_node node); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP void KHMAPI -khui_cfg_set_hwnd(khui_config_node node, HWND hwnd); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP void KHMAPI -khui_cfg_set_param(khui_config_node node, LPARAM param); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP void KHMAPI -khui_cfg_clear_params(void); - -/*! \brief Internal use - - This function is used internally by NetIDMgr. Do not use. -*/ -KHMEXP void KHMAPI -khui_cfg_set_configui_handle(HWND hwnd); - -/*! \brief Update the state for the specified node - - \param[in] node ::khui_config_node handle for the configuration node. - - \param[in] flags New flags. Combination of ::KHUI_CNFLAG_APPLIED and ::KHUI_CNFLAG_MODIFIED - - \param[in] mask Valid bits in \a flags - - \note Should only be called from within the dialog procedure for - the configuration node. - */ -KHMEXP void KHMAPI -khui_cfg_set_flags(khui_config_node vnode, khm_int32 flags, khm_int32 mask); - -/*! \brief Retrieve the state flags for the configuration node - - \see khui_cfg_set_flags() - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_flags(khui_config_node vnode); - -/*! \brief Utility function: Initialize dialog box window data - - This function initializes the dialog box window data using the - ::khui_config_init_data that was passed into the WM_INITDIALOG - message. - - A new block of memory will be alocated to store the dialog data as - well as any extra space specified. A pointer to this memory block - will be stored in the \a DWLP_USER slot in the dialog box. - - The allocated block of memory must be freed by a call to - khui_cfg_free_dialog_data(). While handling other messages, the - dialog data can be retrieved using khui_cfg_get_dialog_data(). - - \param[in] hwnd_dlg Handle to the dialog box - - \param[in] data Pointer to the ::khui_config_init_data that was - passed in to WM_INITDIALOG (this is the value of \a lParam) - - \param[in] cb_extra Number of extra bytes to allocate, along with - the space required to store the contents of - ::khui_config_init_data. The extra space will be initialized - to zero. - - \param[out] new_data Receives a pointer to the copy of the - initialization data that was allocated. Optional. Pass in - NULL if this value is not required. - - \param[out] extra Receives a pointer to the block of extra memory - allocated as specified in \a cb_extra. If \a cb_extra is 0, - then this receives a NULL. - - \see khui_cfg_get_dialog_data(), khui_cfg_free_dialog_data() - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_init_dialog_data(HWND hwnd_dlg, - const khui_config_init_data * data, - khm_size cb_extra, - khui_config_init_data ** new_data, - void ** extra); - -/*! \brief Utility function: Retrieves dialog data - - Retrieves the dialog data previoulsy stored using - khui_cfg_init_dialog_data(). - - \param[in] hwnd_dlg Handle to the dialog box - - \param[out] data Receives a pointer to the ::khui_config_init_data - block. - - \param[out] extra Receives a pointer to the extra memory - allocated. Optional (set to NULL if this value is not needed). -*/ -KHMEXP khm_int32 KHMAPI -khui_cfg_get_dialog_data(HWND hwnd_dlg, - khui_config_init_data ** data, - void ** extra); - -/*! \brief Utility function: Free dialog data - - Deallocates the memory allcated in a previous call to - khui_cfg_init_dialog_data() - */ -KHMEXP khm_int32 KHMAPI -khui_cfg_free_dialog_data(HWND hwnd_dlg); - -/*! \brief Sets the instance flags for a subpanel - - Since there can be more than one subpanel in a configuration - panel, they shouldn't modify the flags of the configuration node - directly. Instead, they should call this function to set the - instance flags. - - The instance flags will be merged with the flags for the - configuration node automatically. - */ -KHMEXP void KHMAPI -khui_cfg_set_flags_inst(khui_config_init_data * d, - khm_int32 flags, - khm_int32 mask); - -/*!@} */ -/*!@} */ -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHCONFIGUI_H +#define __KHIMAIRA_KHCONFIGUI_H + +/*! \addtogroup khui +@{ */ + +/*! \defgroup khui_cfg Configuration Panels + + Configuration panels are the primary means from which the user is + presented with an interface to change NetIDMgr and plugin + configuration. + +@{ */ + +/*! \brief Configuration window notification message + + This is the message that will be used to notify dialog panels. + + The format of the message is : + - uMsg : KHUI_WM_CFG_NOTIFY + - HIWORD(wParam) : one of ::khui_wm_cfg_notifications + + \note This is the same as ::KHUI_WM_NC_NOTIFY + */ +#define KHUI_WM_CFG_NOTIFY (WM_APP + 0x101) + +/*! \brief Configuration notifications + + These are sent thorugh a ::KHUI_WM_CFG_NOTIFY message. + + The format of the message is : + - uMsg : KHUI_WM_CFG_NOTIFY + - HIWORD(wParam) : one of ::khui_wm_cfg_notifications + */ +enum khui_wm_cfg_notifications { + WMCFG_SHOW_NODE = 1, + /*!< Sent to the configuration dialog to request that the panel + for the specified node be shown. The \a lParam message + parameter will contain a held ::khui_config_node handle. The + sender of the mssage is responsible for releasing the handle.*/ + + WMCFG_UPDATE_STATE = 2, + /*!< Sent to the configuration dialog to indicate that the state + flags for the specified configuration node have changed. + + - LOWORD(wParam) : new flags + - lParam : ::khui_config_node for the node*/ + + WMCFG_APPLY = 3, + /*!< Sent to all the configuration panels when the user clicks the + 'Apply' button or the 'Ok' button. The panels are responsible + for applying the configuration changes and updating their flags + using khui_cfg_set_flags(). */ + + WMCFG_SYNC_NODE_LIST = 4, + /*!< Sent from the UI library to the configuration window to + notify the window that the node list has changed. This message + is sent synchronously before the node is removed. */ +}; + +/*! \brief Registration information for a configuration node + + \see khui_cfg_register_node() +*/ +typedef struct tag_khui_config_node_reg { + const wchar_t * name; /*!< Internal identifier + (not-localized, required). The name + is required to be unique among + sibling nodes. However it is not + required to be unique globally. The + size of the name is constrained by + ::KHUI_MAXCCH_NAME*/ + + const wchar_t * short_desc; /*!< Short description (Localized, + required). This is the name which + identifies the node within a + collection of siblings. The size of + the string is constrained by + ::KHUI_MAXCCH_SHORT_DESC*/ + + const wchar_t * long_desc; /*!< Global name of the node. + (Localized, required). This + uniquely identifies the node in the + collection of all configuration + nodes. The size of the string is + constrained by + ::KHUI_MAXCCH_LONG_DESC.*/ + + HMODULE h_module; /*!< Module which contains the dialog + resource specified in \a + dlg_template */ + + LPWSTR dlg_template; /*!< Dialog template for the + configuration window */ + + DLGPROC dlg_proc; /*!< Dialog procedure */ + + khm_int32 flags; /*!< Flags. Can be a combination of + ::KHUI_CNFLAG_SORT_CHILDREN and + ::KHUI_CNFLAG_SUBPANEL*/ + +} khui_config_node_reg; + +/*! \brief Sort the child nodes by short description */ +#define KHUI_CNFLAG_SORT_CHILDREN 0x0001 + +/*! \brief Is a subpanel */ +#define KHUI_CNFLAG_SUBPANEL 0x0002 + +/*! \brief Node represents a panel that is replicated for all child nodes */ +#define KHUI_CNFLAG_PLURAL 0x0004 + +/*! \brief System node + + \note For internal use by the NetIDMgr application. Do not use. +*/ +#define KHUI_CNFLAG_SYSTEM 0x0010 + +#define KHUI_CNFLAG_MODIFIED 0x0100 +#define KHUI_CNFLAG_APPLIED 0x0200 + +#define KHUI_CNFLAGMASK_STATIC 0x00ff +#define KHUI_CNFLAGMASK_DYNAMIC 0x0f00 + +/*! \brief Maximum length of the name in characters + + The length includes the terminating NULL + */ +#define KHUI_MAXCCH_NAME 256 + +/*! \brief Maximum length of the name in bytes + + The length includes the terminating NULL + */ +#define KHUI_MAXCB_NAME (KHUI_MAXCCH_NAME * sizeof(wchar_t)) + +/*! \brief Maximum length of the long description in characters + + The length includes the terminating NULL + */ +#define KHUI_MAXCCH_LONG_DESC 1024 + +/*! \brief Maximum length of the long description in bytes + + The length includes the terminating NULL + */ +#define KHUI_MAXCB_LONG_DESC (KHUI_MAXCCH_LONG_DESC * sizeof(wchar_t)) + +/*! \brief Maximum length of the short description in chracters + + The length includes the terminating NULL + */ +#define KHUI_MAXCCH_SHORT_DESC 256 + +/*! \brief Maximum length of the short description in bytes + + The length includes the terminating NULL + */ +#define KHUI_MAXCB_SHORT_DESC (KHUI_MAXCCH_SHORT_DESC * sizeof(wchar_t)) + +/*! \brief Width of a configuration dialog in dialog units + + ::CFGDLG_WIDTH and ::CFGDLG_HEIGHT specify the dimensions of a + configuration dialog width and height in dialog units. The dialog + will be created as a child of the configuration dialog and placed + within it. + */ +#define CFGDLG_WIDTH 255 + +/*! \brief Height of a configuration dialog in dialog units + + \see ::CFGDLG_WIDTH +*/ +#define CFGDLG_HEIGHT 182 + +/*! \brief Width of a configuration tab dialog in dialog units + + ::CFGDLG_TAB_WIDTH and ::CFGDLG_TAB_HEIGHT specify the dimensions + (in dialog units) of a dialog that will be placed within a tab + control for dialogs where multiple display panels need to be + shown. + */ +#define CFGDLG_TAB_WIDTH 235 + +/*! \brief Height of configuration tab dialog in dialog units + + \see ::CFGDLG_TAB_WIDTH + */ +#define CFGDLG_TAB_HEIGHT 151 + +/*! \brief A handle to a configuration node + + \see khui_cfg_open_node(), khui_cfg_close_node() +*/ +typedef khm_handle khui_config_node; + +/*! \brief Initialization data passed in to a subpanel + + When creating a subpanel, a pointer to the following strucutred + will be passed in as the creation parameter for the dialog. +*/ +typedef struct tag_khui_config_init_data { + khui_config_node ctx_node; /*!< The node under which the current + dialog subpanel is being created. */ + + khui_config_node this_node; /*!< The node which provided the + registration information for the + creation of the subpanel. */ + + khui_config_node ref_node; /*!< The parent node of the subpanel + node. In nodes which have the + ::KHUI_CNFLAG_PLURAL, this would be + different from the \a node. This is + the node under which the subpanel + was registered. */ +} khui_config_init_data; + +/*! \brief Register a configuration node + + The caller fills the registration information in the + ::khui_config_node_reg structre. If the call succeeds, the + function will return KHM_ERROR_SUCCESS. + + \param[in] parent Parent of the node to be registered. Set to + NULL if the parent is the root node. + + \param[in] reg Registration information + + \param[out] new_id Receives the new unique identifier of the + configuration node. Pass in NULL if the new identifier is not + required. + + \retval KHM_ERROR_SUCCESS Success + \retval KHM_ERROR_INVALID_PARAM One or more parameters, or fields + of reg were invalid + \retval KHM_ERROR_DUPLICATE A node with the same name exists as a + child of the specified parent node. + + \note The name (not the short or long description) of the node can + not be the same as the name of a custom action. See + khui_action_create(). + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_register(khui_config_node parent, + const khui_config_node_reg * reg); + +/*!\brief Open a configuration node by name + + If successful, the \a result parameter will receive a handle to + the configuration node. Use khui_cfg_release() to release + the handle. + + \param[in] parent Parent node. Set to NULL to specify root node. + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_open(khui_config_node parent, + const wchar_t * name, + khui_config_node * result); + +/*! \brief Remove a configuration node + + Marks a configuration node as deleted. Once all the handles, + including the handle specified in \a node have been released, it + will be deleted. + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_remove(khui_config_node node); + +/*! \brief Hold a handle to a configuration node + + Obtains an additional hold on the handle specified by \a node. + The hold must be released with a call to \a + khui_cfg_release() + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_hold(khui_config_node node); + +/*! \brief Release a handle to a configuration node + + \see khui_cfg_hold() + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_release(khui_config_node node); + +/*! \brief Get the parent of a node + + Returns a held handle to the parent of the node, or NULL if the + current node is a top level node. The returned handle must be + released with khui_cfg_release(). + + \retval KHM_ERROR_SUCCESS The handle to the parent node is in \a result + \retval KHM_ERROR_NOT_FOUND The node is a top level node + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_parent(khui_config_node vnode, + khui_config_node * result); + +/*! \brief Get a handle to the first child node + + If the call is successful, \a result will receieve a handle to the + first child node of the specified node. The returned handle must + be released with a call to khui_cfg_release() + + If \a parent does not have any child nodes, the function will + return KHM_ERROR_NOT_FOUND and set \a result to NULL. + + \param[in] parent Parent node. Set to NULL to specify root node. + \param[out] result Receives a held handle to the first child node. + + \see khui_cfg_get_next() + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_first_child(khui_config_node parent, + khui_config_node * result); + +/*! \brief Get a handle to the first subpanel + + If the call is successful, \a result will receieve a handle to the + first subpanel node of the specified node. The returned handle + must be released with a call to khui_cfg_release() + + If \a parent does not have any subpanels, the function will return + KHM_ERROR_NOT_FOUND and set \a result to NULL. + + A subpanel node is a node which has the ::KHUI_CNFLAG_SUBPANEL + flag set. + + \param[in] parent Parent node. Set to NULL to specify root node. + \param[out] result Receives a held handle to the first subpanel node. + + \see khui_cfg_get_next() + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_first_subpanel(khui_config_node vparent, + khui_config_node * result); + +/*! \brief Get a handle to the next sibling node + + If the call is successful, \a result will receive a held handle to + the next sibling node. The returned handle must be released with + a call to khui_cfg_release(). + + If there are no more sibling nodes, then the function return + KHM_ERROR_NOT_FOUND and set \a result to NULL. + + This function can be used to traverse a list of child nodes as + well as a list of subpanel nodes. + + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_next(khui_config_node node, + khui_config_node * result); + +/*! \brief Get a handle to the next sibling node + + Similar to khui_cfg_get_next(), but implicitly releases the handle + that was supplied. Equivalent to doing : + + \code + khui_cfg_get_next(node, &next); + khui_cfg_release(node); + node = next; + \endcode + + \param[in,out] node On entry, specifies the node whose sibling + needs to be fetched. On exit, will have either NULL or a held + handle to the sibling node. The handle which was supplied to + the function is released. + + \retval KHM_ERROR_SUCCESS The next node is now in \a node + \retval KHM_ERROR_INVALID_PARAM \a node was not a valid handle + \retval KHM_ERROR_NOT_FOUND There are no more siblings. \a node + is set to NULL. + + \note Even if there are no more siblings, the handle specified in + \a node on entry is released. + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_next_release(khui_config_node * node); + +/*! \brief Get the name of a configuration node + + Gets the name (not the short description or the long description) + of the given configuration node. +*/ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_name(khui_config_node node, + wchar_t * buf, + khm_size * cb_buf); + +/*! \brief Get registration information for a node + + The registration information that is returned is a shallow copy of + the data kept by NetIDMgr. In particular, the strings that will + be returned actually point to internal buffers and should not be + modified. + + No further action is necessary to release the information. + However, the returned data ceases to be valid when \a node is + released with a call to khui_cfg_release(). + + \param[in] node Node for which information is requested. Can be NULL if requesting information about the root node. + \param[out] reg Pointer to a ::khui_config_node_reg structure. + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_reg(khui_config_node node, + khui_config_node_reg * reg); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP HWND KHMAPI +khui_cfg_get_hwnd_inst(khui_config_node node, + khui_config_node noderef); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP LPARAM KHMAPI +khui_cfg_get_param_inst(khui_config_node node, + khui_config_node noderef); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP void KHMAPI +khui_cfg_set_hwnd_inst(khui_config_node node, + khui_config_node noderef, + HWND hwnd); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP void KHMAPI +khui_cfg_set_param_inst(khui_config_node node, + khui_config_node noderef, + LPARAM param); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP HWND KHMAPI +khui_cfg_get_hwnd(khui_config_node node); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP LPARAM KHMAPI +khui_cfg_get_param(khui_config_node node); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP void KHMAPI +khui_cfg_set_hwnd(khui_config_node node, HWND hwnd); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP void KHMAPI +khui_cfg_set_param(khui_config_node node, LPARAM param); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP void KHMAPI +khui_cfg_clear_params(void); + +/*! \brief Internal use + + This function is used internally by NetIDMgr. Do not use. +*/ +KHMEXP void KHMAPI +khui_cfg_set_configui_handle(HWND hwnd); + +/*! \brief Update the state for the specified node + + \param[in] node ::khui_config_node handle for the configuration node. + + \param[in] flags New flags. Combination of ::KHUI_CNFLAG_APPLIED and ::KHUI_CNFLAG_MODIFIED + + \param[in] mask Valid bits in \a flags + + \note Should only be called from within the dialog procedure for + the configuration node. + */ +KHMEXP void KHMAPI +khui_cfg_set_flags(khui_config_node vnode, khm_int32 flags, khm_int32 mask); + +/*! \brief Retrieve the state flags for the configuration node + + \see khui_cfg_set_flags() + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_flags(khui_config_node vnode); + +/*! \brief Utility function: Initialize dialog box window data + + This function initializes the dialog box window data using the + ::khui_config_init_data that was passed into the WM_INITDIALOG + message. + + A new block of memory will be alocated to store the dialog data as + well as any extra space specified. A pointer to this memory block + will be stored in the \a DWLP_USER slot in the dialog box. + + The allocated block of memory must be freed by a call to + khui_cfg_free_dialog_data(). While handling other messages, the + dialog data can be retrieved using khui_cfg_get_dialog_data(). + + \param[in] hwnd_dlg Handle to the dialog box + + \param[in] data Pointer to the ::khui_config_init_data that was + passed in to WM_INITDIALOG (this is the value of \a lParam) + + \param[in] cb_extra Number of extra bytes to allocate, along with + the space required to store the contents of + ::khui_config_init_data. The extra space will be initialized + to zero. + + \param[out] new_data Receives a pointer to the copy of the + initialization data that was allocated. Optional. Pass in + NULL if this value is not required. + + \param[out] extra Receives a pointer to the block of extra memory + allocated as specified in \a cb_extra. If \a cb_extra is 0, + then this receives a NULL. + + \see khui_cfg_get_dialog_data(), khui_cfg_free_dialog_data() + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_init_dialog_data(HWND hwnd_dlg, + const khui_config_init_data * data, + khm_size cb_extra, + khui_config_init_data ** new_data, + void ** extra); + +/*! \brief Utility function: Retrieves dialog data + + Retrieves the dialog data previoulsy stored using + khui_cfg_init_dialog_data(). + + \param[in] hwnd_dlg Handle to the dialog box + + \param[out] data Receives a pointer to the ::khui_config_init_data + block. + + \param[out] extra Receives a pointer to the extra memory + allocated. Optional (set to NULL if this value is not needed). +*/ +KHMEXP khm_int32 KHMAPI +khui_cfg_get_dialog_data(HWND hwnd_dlg, + khui_config_init_data ** data, + void ** extra); + +/*! \brief Utility function: Free dialog data + + Deallocates the memory allcated in a previous call to + khui_cfg_init_dialog_data() + */ +KHMEXP khm_int32 KHMAPI +khui_cfg_free_dialog_data(HWND hwnd_dlg); + +/*! \brief Sets the instance flags for a subpanel + + Since there can be more than one subpanel in a configuration + panel, they shouldn't modify the flags of the configuration node + directly. Instead, they should call this function to set the + instance flags. + + The instance flags will be merged with the flags for the + configuration node automatically. + */ +KHMEXP void KHMAPI +khui_cfg_set_flags_inst(khui_config_init_data * d, + khm_int32 flags, + khm_int32 mask); + +/*!@} */ +/*!@} */ +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/Makefile +++ krb5-1.4.4/src/windows/identity/uilib/Makefile @@ -1,62 +1,62 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=uilib -!include <../config/Makefile.w32> - -UIDLLOBJFILES= \ - $(OBJ)\rescache.obj \ - $(OBJ)\action.obj \ - $(OBJ)\creddlg.obj \ - $(OBJ)\alert.obj \ - $(OBJ)\propsheet.obj \ - $(OBJ)\propwnd.obj \ - $(OBJ)\uilibmain.obj \ - $(OBJ)\actiondef.obj \ - $(OBJ)\acceldef.obj \ - $(OBJ)\configui.obj \ - $(OBJ)\trackerwnd.obj \ - $(OBJ)\version.obj - -INCFILES= \ - $(INCDIR)\khuidefs.h \ - $(INCDIR)\khrescache.h \ - $(INCDIR)\khaction.h \ - $(INCDIR)\khactiondef.h \ - $(INCDIR)\khalerts.h \ - $(INCDIR)\khhtlink.h \ - $(INCDIR)\khnewcred.h \ - $(INCDIR)\khprops.h \ - $(INCDIR)\khconfigui.h \ - $(INCDIR)\khtracker.h \ - $(INCDIR)\khremote.h - -$(OBJ)\actiondef.c: actions.csv actiondef.cfg - $(CCSV) $** $@ - -$(OBJ)\acceldef.c: accel.csv acceldef.cfg - $(CCSV) $** $@ - -all: mkdirs $(INCFILES) $(UIDLLOBJFILES) - +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=uilib +!include <../config/Makefile.w32> + +UIDLLOBJFILES= \ + $(OBJ)\rescache.obj \ + $(OBJ)\action.obj \ + $(OBJ)\creddlg.obj \ + $(OBJ)\alert.obj \ + $(OBJ)\propsheet.obj \ + $(OBJ)\propwnd.obj \ + $(OBJ)\uilibmain.obj \ + $(OBJ)\actiondef.obj \ + $(OBJ)\acceldef.obj \ + $(OBJ)\configui.obj \ + $(OBJ)\trackerwnd.obj \ + $(OBJ)\version.obj + +INCFILES= \ + $(INCDIR)\khuidefs.h \ + $(INCDIR)\khrescache.h \ + $(INCDIR)\khaction.h \ + $(INCDIR)\khactiondef.h \ + $(INCDIR)\khalerts.h \ + $(INCDIR)\khhtlink.h \ + $(INCDIR)\khnewcred.h \ + $(INCDIR)\khprops.h \ + $(INCDIR)\khconfigui.h \ + $(INCDIR)\khtracker.h \ + $(INCDIR)\khremote.h + +$(OBJ)\actiondef.c: actions.csv actiondef.cfg + $(CCSV) $** $@ + +$(OBJ)\acceldef.c: accel.csv acceldef.cfg + $(CCSV) $** $@ + +all: mkdirs $(INCFILES) $(UIDLLOBJFILES) + --- krb5-1.4.4.orig/src/windows/identity/uilib/khtracker.h +++ krb5-1.4.4/src/windows/identity/uilib/khtracker.h @@ -1,114 +1,114 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_TRACKERWND_H -#define __KHIMAIRA_TRACKERWND_H - -#include - -/*! \addtogroup khui - -@{ */ - -/*!\defgroup khui_trk Duration sliders - -The duration sliders in the UI are pseudo-log-scaled. This is based -on the assumption that people don't really need 1 minute accuracy when -setting a duration that's several hours long. As a result, it is -easier to hone in on the duration that you want without having -wizardly mouse maneuvering skillz. - -Following are the duration ranges and the granularity that is offered -in each range: - - - - - - - - - - -
Range Increment
0..5m 1 min
5m..1hr 5 min
1hr..4hr 15 min
4hr..10hr 30 min
10hr..24hr 1 hr
24hr..4d 6 hr
4d.. 1 day
- -We don't really adjust for durations over 4 days. The ranges we are -concerned with don't get much larger. - -For the purpose of writing this piece of code, I have chosen the term -"tick" to refer to a period of granularity. The number of periods of -granularity (inclusive) within a certain duration interval is referred -to as the number of ticks in the interval. For example, there are 4 -ticks between the interval of 3 minutes to 10 minutes. Each occuring -at the start of 3min, 4, 5 and 10mins. And thusly the slider control -will display 4 ticks if it is displaying the interval 3-10mins. - -@{*/ - -/*! \brief Tracker data */ -typedef struct tag_khui_tracker { - WNDPROC fn_edit; - WNDPROC fn_tracker; - HWND hw_slider; - HWND hw_edit; - int lbl_y; - int lbl_lx; - int lbl_rx; - DWORD act_time; - - time_t current; /*!< Current selection */ - time_t min; /*!< Minimum (inclusive) */ - time_t max; /*!< Maximum (inclusive) */ -} khui_tracker; - -/*! \brief Install a tracker into an edit control - - Once installed, the edit control becomes a duration editor. The - tracker data structure that is supplied should remain as is for - the lifetime of the edit control. - - The tracker strucutre should have been initialized with a call to - khui_tracker_initialize() and should have valid values in the \a - min, \a max and \a current fields. - */ -KHMEXP void KHMAPI -khui_tracker_install(HWND hwnd_edit, khui_tracker * tc); - -KHMEXP void KHMAPI -khui_tracker_reposition(khui_tracker * tc); - -KHMEXP void KHMAPI -khui_tracker_initialize(khui_tracker * tc); - -KHMEXP void KHMAPI -khui_tracker_refresh(khui_tracker * tc); - -KHMEXP void KHMAPI -khui_tracker_kill_controls(khui_tracker * tc); -/*!@}*/ -/*!@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_TRACKERWND_H +#define __KHIMAIRA_TRACKERWND_H + +#include + +/*! \addtogroup khui + +@{ */ + +/*!\defgroup khui_trk Duration sliders + +The duration sliders in the UI are pseudo-log-scaled. This is based +on the assumption that people don't really need 1 minute accuracy when +setting a duration that's several hours long. As a result, it is +easier to hone in on the duration that you want without having +wizardly mouse maneuvering skillz. + +Following are the duration ranges and the granularity that is offered +in each range: + + + + + + + + + + +
Range Increment
0..5m 1 min
5m..1hr 5 min
1hr..4hr 15 min
4hr..10hr 30 min
10hr..24hr 1 hr
24hr..4d 6 hr
4d.. 1 day
+ +We don't really adjust for durations over 4 days. The ranges we are +concerned with don't get much larger. + +For the purpose of writing this piece of code, I have chosen the term +"tick" to refer to a period of granularity. The number of periods of +granularity (inclusive) within a certain duration interval is referred +to as the number of ticks in the interval. For example, there are 4 +ticks between the interval of 3 minutes to 10 minutes. Each occuring +at the start of 3min, 4, 5 and 10mins. And thusly the slider control +will display 4 ticks if it is displaying the interval 3-10mins. + +@{*/ + +/*! \brief Tracker data */ +typedef struct tag_khui_tracker { + WNDPROC fn_edit; + WNDPROC fn_tracker; + HWND hw_slider; + HWND hw_edit; + int lbl_y; + int lbl_lx; + int lbl_rx; + DWORD act_time; + + time_t current; /*!< Current selection */ + time_t min; /*!< Minimum (inclusive) */ + time_t max; /*!< Maximum (inclusive) */ +} khui_tracker; + +/*! \brief Install a tracker into an edit control + + Once installed, the edit control becomes a duration editor. The + tracker data structure that is supplied should remain as is for + the lifetime of the edit control. + + The tracker strucutre should have been initialized with a call to + khui_tracker_initialize() and should have valid values in the \a + min, \a max and \a current fields. + */ +KHMEXP void KHMAPI +khui_tracker_install(HWND hwnd_edit, khui_tracker * tc); + +KHMEXP void KHMAPI +khui_tracker_reposition(khui_tracker * tc); + +KHMEXP void KHMAPI +khui_tracker_initialize(khui_tracker * tc); + +KHMEXP void KHMAPI +khui_tracker_refresh(khui_tracker * tc); + +KHMEXP void KHMAPI +khui_tracker_kill_controls(khui_tracker * tc); +/*!@}*/ +/*!@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/alert.c +++ krb5-1.4.4/src/windows/identity/uilib/alert.c @@ -1,378 +1,378 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -#include - -/*********************************************************************** - Alerter -***********************************************************************/ - -khui_alert * kh_alerts = NULL; -CRITICAL_SECTION cs_alerts; - -void -alert_init(void) -{ - InitializeCriticalSection(&cs_alerts); -} - -void -alert_exit(void) -{ - DeleteCriticalSection(&cs_alerts); -} - -KHMEXP khm_int32 KHMAPI -khui_alert_create_empty(khui_alert ** result) -{ - khui_alert * a; - - a = PMALLOC(sizeof(*a)); - ZeroMemory(a, sizeof(*a)); - - a->magic = KHUI_ALERT_MAGIC; - - /* set defaults */ - a->severity = KHERR_INFO; - a->flags = KHUI_ALERT_FLAG_FREE_STRUCT; - - khui_alert_hold(a); - EnterCriticalSection(&cs_alerts); - LPUSH(&kh_alerts, a); - LeaveCriticalSection(&cs_alerts); - - *result = a; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_create_simple(const wchar_t * title, - const wchar_t * message, - khm_int32 severity, - khui_alert ** result) -{ - khui_alert * a; - - khui_alert_create_empty(&a); - khui_alert_set_title(a, title); - khui_alert_set_message(a, message); - khui_alert_set_severity(a, severity); - - *result = a; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_set_title(khui_alert * alert, const wchar_t * title) -{ - size_t cb = 0; - - assert(alert->magic == KHUI_ALERT_MAGIC); - - if(title) { - if(FAILED(StringCbLength(title, - KHUI_MAXCB_TITLE, - &cb))) { - return KHM_ERROR_INVALID_PARAM; - } - cb += sizeof(wchar_t); - } - - EnterCriticalSection(&cs_alerts); - if(alert->title && (alert->flags & KHUI_ALERT_FLAG_FREE_TITLE)) { - PFREE(alert->title); - alert->title = NULL; - alert->flags &= ~KHUI_ALERT_FLAG_FREE_TITLE; - } - if(title) { - alert->title = PMALLOC(cb); - StringCbCopy(alert->title, cb, title); - alert->flags |= KHUI_ALERT_FLAG_FREE_TITLE; - } - LeaveCriticalSection(&cs_alerts); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_set_flags(khui_alert * alert, khm_int32 mask, khm_int32 flags) -{ - assert(alert->magic == KHUI_ALERT_MAGIC); - - if (mask & ~KHUI_ALERT_FLAGMASK_RDWR) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_alerts); - alert->flags = - (alert->flags & ~mask) | - (flags & mask); - LeaveCriticalSection(&cs_alerts); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_set_severity(khui_alert * alert, khm_int32 severity) -{ - - assert(alert->magic == KHUI_ALERT_MAGIC); - - EnterCriticalSection(&cs_alerts); - alert->severity = severity; - LeaveCriticalSection(&cs_alerts); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_set_suggestion(khui_alert * alert, - const wchar_t * suggestion) { - size_t cb = 0; - - assert(alert->magic == KHUI_ALERT_MAGIC); - - if(suggestion) { - if(FAILED(StringCbLength(suggestion, - KHUI_MAXCB_MESSAGE - sizeof(wchar_t), - &cb))) { - return KHM_ERROR_INVALID_PARAM; - } - cb += sizeof(wchar_t); - } - - EnterCriticalSection(&cs_alerts); - if(alert->suggestion && - (alert->flags & KHUI_ALERT_FLAG_FREE_SUGGEST)) { - - PFREE(alert->suggestion); - alert->suggestion = NULL; - alert->flags &= ~KHUI_ALERT_FLAG_FREE_SUGGEST; - - } - - if(suggestion) { - alert->suggestion = PMALLOC(cb); - StringCbCopy(alert->suggestion, cb, suggestion); - alert->flags |= KHUI_ALERT_FLAG_FREE_SUGGEST; - } - LeaveCriticalSection(&cs_alerts); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_set_message(khui_alert * alert, const wchar_t * message) -{ - size_t cb = 0; - - assert(alert->magic == KHUI_ALERT_MAGIC); - - if(message) { - if(FAILED(StringCbLength(message, - KHUI_MAXCB_MESSAGE - sizeof(wchar_t), - &cb))) { - return KHM_ERROR_INVALID_PARAM; - } - cb += sizeof(wchar_t); - } - - EnterCriticalSection(&cs_alerts); - if(alert->message && - (alert->flags & KHUI_ALERT_FLAG_FREE_MESSAGE)) { - - PFREE(alert->message); - alert->flags &= ~KHUI_ALERT_FLAG_FREE_MESSAGE; - } - - alert->message = NULL; - - if(message) { - alert->message = PMALLOC(cb); - StringCbCopy(alert->message, cb, message); - alert->flags |= KHUI_ALERT_FLAG_FREE_MESSAGE; - } - LeaveCriticalSection(&cs_alerts); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_clear_commands(khui_alert * alert) -{ - assert(alert->magic == KHUI_ALERT_MAGIC); - - EnterCriticalSection(&cs_alerts); - alert->n_alert_commands = 0; - LeaveCriticalSection(&cs_alerts); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_add_command(khui_alert * alert, khm_int32 command_id) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - assert(alert->magic == KHUI_ALERT_MAGIC); - - EnterCriticalSection(&cs_alerts); - if(alert->n_alert_commands >= KHUI_MAX_ALERT_COMMANDS) - rv = KHM_ERROR_NO_RESOURCES; - else { - alert->alert_commands[alert->n_alert_commands++] = command_id; - } - LeaveCriticalSection(&cs_alerts); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_show(khui_alert * alert) -{ - assert(alert->magic == KHUI_ALERT_MAGIC); - - khui_alert_hold(alert); - /* the alert will be released when the message is processed */ - kmq_post_message(KMSG_ALERT, KMSG_ALERT_SHOW, 0, (void *) alert); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_show_modal(khui_alert * alert) -{ - khm_int32 rv; - - assert(alert->magic == KHUI_ALERT_MAGIC); - - khui_alert_hold(alert); - rv = kmq_send_message(KMSG_ALERT, KMSG_ALERT_SHOW_MODAL, 0, - (void *) alert); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_queue(khui_alert * alert) -{ - assert(alert->magic == KHUI_ALERT_MAGIC); - - khui_alert_hold(alert); - kmq_post_message(KMSG_ALERT, KMSG_ALERT_QUEUE, 0, (void *) alert); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_show_simple(const wchar_t * title, - const wchar_t * message, - khm_int32 severity) -{ - khui_alert * a = NULL; - khm_int32 rv; - - rv = khui_alert_create_simple(title, message, severity, &a); - - if(KHM_FAILED(rv)) - return rv; - - rv = khui_alert_show(a); - - khui_alert_release(a); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khui_alert_hold(khui_alert * alert) -{ - assert(alert->magic == KHUI_ALERT_MAGIC); - - EnterCriticalSection(&cs_alerts); - alert->refcount++; - LeaveCriticalSection(&cs_alerts); - return KHM_ERROR_SUCCESS; -} - -/* called with cs_alert held */ -static void -free_alert(khui_alert * alert) -{ - assert(alert->magic == KHUI_ALERT_MAGIC); - - LDELETE(&kh_alerts, alert); - - if(alert->flags & KHUI_ALERT_FLAG_FREE_TITLE) { - assert(alert->title); - PFREE(alert->title); - alert->title = NULL; - alert->flags &= ~KHUI_ALERT_FLAG_FREE_TITLE; - } - if(alert->flags & KHUI_ALERT_FLAG_FREE_MESSAGE) { - assert(alert->message); - PFREE(alert->message); - alert->message = NULL; - alert->flags &= ~KHUI_ALERT_FLAG_FREE_MESSAGE; - } - if(alert->flags & KHUI_ALERT_FLAG_FREE_SUGGEST) { - assert(alert->suggestion); - PFREE(alert->suggestion); - alert->suggestion = NULL; - alert->flags &= ~KHUI_ALERT_FLAG_FREE_SUGGEST; - } - if(alert->flags & KHUI_ALERT_FLAG_FREE_STRUCT) { - alert->flags &= ~KHUI_ALERT_FLAG_FREE_STRUCT; - alert->magic = 0; - PFREE(alert); - } -} - -KHMEXP khm_int32 KHMAPI -khui_alert_release(khui_alert * alert) -{ - assert(alert->magic == KHUI_ALERT_MAGIC); - - EnterCriticalSection(&cs_alerts); - if((--(alert->refcount)) == 0) { - free_alert(alert); - } - LeaveCriticalSection(&cs_alerts); - return KHM_ERROR_SUCCESS; -} - -KHMEXP void KHMAPI khui_alert_lock(khui_alert * alert) -{ - EnterCriticalSection(&cs_alerts); -} - -KHMEXP void KHMAPI khui_alert_unlock(khui_alert * alert) -{ - LeaveCriticalSection(&cs_alerts); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +#include + +/*********************************************************************** + Alerter +***********************************************************************/ + +khui_alert * kh_alerts = NULL; +CRITICAL_SECTION cs_alerts; + +void +alert_init(void) +{ + InitializeCriticalSection(&cs_alerts); +} + +void +alert_exit(void) +{ + DeleteCriticalSection(&cs_alerts); +} + +KHMEXP khm_int32 KHMAPI +khui_alert_create_empty(khui_alert ** result) +{ + khui_alert * a; + + a = PMALLOC(sizeof(*a)); + ZeroMemory(a, sizeof(*a)); + + a->magic = KHUI_ALERT_MAGIC; + + /* set defaults */ + a->severity = KHERR_INFO; + a->flags = KHUI_ALERT_FLAG_FREE_STRUCT; + + khui_alert_hold(a); + EnterCriticalSection(&cs_alerts); + LPUSH(&kh_alerts, a); + LeaveCriticalSection(&cs_alerts); + + *result = a; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_create_simple(const wchar_t * title, + const wchar_t * message, + khm_int32 severity, + khui_alert ** result) +{ + khui_alert * a; + + khui_alert_create_empty(&a); + khui_alert_set_title(a, title); + khui_alert_set_message(a, message); + khui_alert_set_severity(a, severity); + + *result = a; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_set_title(khui_alert * alert, const wchar_t * title) +{ + size_t cb = 0; + + assert(alert->magic == KHUI_ALERT_MAGIC); + + if(title) { + if(FAILED(StringCbLength(title, + KHUI_MAXCB_TITLE, + &cb))) { + return KHM_ERROR_INVALID_PARAM; + } + cb += sizeof(wchar_t); + } + + EnterCriticalSection(&cs_alerts); + if(alert->title && (alert->flags & KHUI_ALERT_FLAG_FREE_TITLE)) { + PFREE(alert->title); + alert->title = NULL; + alert->flags &= ~KHUI_ALERT_FLAG_FREE_TITLE; + } + if(title) { + alert->title = PMALLOC(cb); + StringCbCopy(alert->title, cb, title); + alert->flags |= KHUI_ALERT_FLAG_FREE_TITLE; + } + LeaveCriticalSection(&cs_alerts); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_set_flags(khui_alert * alert, khm_int32 mask, khm_int32 flags) +{ + assert(alert->magic == KHUI_ALERT_MAGIC); + + if (mask & ~KHUI_ALERT_FLAGMASK_RDWR) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_alerts); + alert->flags = + (alert->flags & ~mask) | + (flags & mask); + LeaveCriticalSection(&cs_alerts); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_set_severity(khui_alert * alert, khm_int32 severity) +{ + + assert(alert->magic == KHUI_ALERT_MAGIC); + + EnterCriticalSection(&cs_alerts); + alert->severity = severity; + LeaveCriticalSection(&cs_alerts); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_set_suggestion(khui_alert * alert, + const wchar_t * suggestion) { + size_t cb = 0; + + assert(alert->magic == KHUI_ALERT_MAGIC); + + if(suggestion) { + if(FAILED(StringCbLength(suggestion, + KHUI_MAXCB_MESSAGE - sizeof(wchar_t), + &cb))) { + return KHM_ERROR_INVALID_PARAM; + } + cb += sizeof(wchar_t); + } + + EnterCriticalSection(&cs_alerts); + if(alert->suggestion && + (alert->flags & KHUI_ALERT_FLAG_FREE_SUGGEST)) { + + PFREE(alert->suggestion); + alert->suggestion = NULL; + alert->flags &= ~KHUI_ALERT_FLAG_FREE_SUGGEST; + + } + + if(suggestion) { + alert->suggestion = PMALLOC(cb); + StringCbCopy(alert->suggestion, cb, suggestion); + alert->flags |= KHUI_ALERT_FLAG_FREE_SUGGEST; + } + LeaveCriticalSection(&cs_alerts); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_set_message(khui_alert * alert, const wchar_t * message) +{ + size_t cb = 0; + + assert(alert->magic == KHUI_ALERT_MAGIC); + + if(message) { + if(FAILED(StringCbLength(message, + KHUI_MAXCB_MESSAGE - sizeof(wchar_t), + &cb))) { + return KHM_ERROR_INVALID_PARAM; + } + cb += sizeof(wchar_t); + } + + EnterCriticalSection(&cs_alerts); + if(alert->message && + (alert->flags & KHUI_ALERT_FLAG_FREE_MESSAGE)) { + + PFREE(alert->message); + alert->flags &= ~KHUI_ALERT_FLAG_FREE_MESSAGE; + } + + alert->message = NULL; + + if(message) { + alert->message = PMALLOC(cb); + StringCbCopy(alert->message, cb, message); + alert->flags |= KHUI_ALERT_FLAG_FREE_MESSAGE; + } + LeaveCriticalSection(&cs_alerts); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_clear_commands(khui_alert * alert) +{ + assert(alert->magic == KHUI_ALERT_MAGIC); + + EnterCriticalSection(&cs_alerts); + alert->n_alert_commands = 0; + LeaveCriticalSection(&cs_alerts); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_add_command(khui_alert * alert, khm_int32 command_id) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + assert(alert->magic == KHUI_ALERT_MAGIC); + + EnterCriticalSection(&cs_alerts); + if(alert->n_alert_commands >= KHUI_MAX_ALERT_COMMANDS) + rv = KHM_ERROR_NO_RESOURCES; + else { + alert->alert_commands[alert->n_alert_commands++] = command_id; + } + LeaveCriticalSection(&cs_alerts); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_show(khui_alert * alert) +{ + assert(alert->magic == KHUI_ALERT_MAGIC); + + khui_alert_hold(alert); + /* the alert will be released when the message is processed */ + kmq_post_message(KMSG_ALERT, KMSG_ALERT_SHOW, 0, (void *) alert); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_show_modal(khui_alert * alert) +{ + khm_int32 rv; + + assert(alert->magic == KHUI_ALERT_MAGIC); + + khui_alert_hold(alert); + rv = kmq_send_message(KMSG_ALERT, KMSG_ALERT_SHOW_MODAL, 0, + (void *) alert); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_queue(khui_alert * alert) +{ + assert(alert->magic == KHUI_ALERT_MAGIC); + + khui_alert_hold(alert); + kmq_post_message(KMSG_ALERT, KMSG_ALERT_QUEUE, 0, (void *) alert); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_show_simple(const wchar_t * title, + const wchar_t * message, + khm_int32 severity) +{ + khui_alert * a = NULL; + khm_int32 rv; + + rv = khui_alert_create_simple(title, message, severity, &a); + + if(KHM_FAILED(rv)) + return rv; + + rv = khui_alert_show(a); + + khui_alert_release(a); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khui_alert_hold(khui_alert * alert) +{ + assert(alert->magic == KHUI_ALERT_MAGIC); + + EnterCriticalSection(&cs_alerts); + alert->refcount++; + LeaveCriticalSection(&cs_alerts); + return KHM_ERROR_SUCCESS; +} + +/* called with cs_alert held */ +static void +free_alert(khui_alert * alert) +{ + assert(alert->magic == KHUI_ALERT_MAGIC); + + LDELETE(&kh_alerts, alert); + + if(alert->flags & KHUI_ALERT_FLAG_FREE_TITLE) { + assert(alert->title); + PFREE(alert->title); + alert->title = NULL; + alert->flags &= ~KHUI_ALERT_FLAG_FREE_TITLE; + } + if(alert->flags & KHUI_ALERT_FLAG_FREE_MESSAGE) { + assert(alert->message); + PFREE(alert->message); + alert->message = NULL; + alert->flags &= ~KHUI_ALERT_FLAG_FREE_MESSAGE; + } + if(alert->flags & KHUI_ALERT_FLAG_FREE_SUGGEST) { + assert(alert->suggestion); + PFREE(alert->suggestion); + alert->suggestion = NULL; + alert->flags &= ~KHUI_ALERT_FLAG_FREE_SUGGEST; + } + if(alert->flags & KHUI_ALERT_FLAG_FREE_STRUCT) { + alert->flags &= ~KHUI_ALERT_FLAG_FREE_STRUCT; + alert->magic = 0; + PFREE(alert); + } +} + +KHMEXP khm_int32 KHMAPI +khui_alert_release(khui_alert * alert) +{ + assert(alert->magic == KHUI_ALERT_MAGIC); + + EnterCriticalSection(&cs_alerts); + if((--(alert->refcount)) == 0) { + free_alert(alert); + } + LeaveCriticalSection(&cs_alerts); + return KHM_ERROR_SUCCESS; +} + +KHMEXP void KHMAPI khui_alert_lock(khui_alert * alert) +{ + EnterCriticalSection(&cs_alerts); +} + +KHMEXP void KHMAPI khui_alert_unlock(khui_alert * alert) +{ + LeaveCriticalSection(&cs_alerts); +} --- krb5-1.4.4.orig/src/windows/identity/uilib/khalerts.h +++ krb5-1.4.4/src/windows/identity/uilib/khalerts.h @@ -1,398 +1,398 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHALERTS_H -#define __KHIMAIRA_KHALERTS_H - -/********************************************************************* - Alerter and error reporting -**********************************************************************/ - -/*! \addtogroup khui -@{ */ - -/*!\defgroup khui_alert Alerter and Error Reporting -@{*/ - -#define KHUI_MAX_ALERT_COMMANDS 4 - -/*! \brief An alert - - Describes an alert message that will be shown to the user in a - variety of ways depending on the state of the NetIDMgr - application. - */ -typedef struct tag_khui_alert { - khm_int32 magic; /*!< Magic number. Always set to - KHUI_ALERT_MAGIC */ - - khm_int32 severity; /*!< The severity of the alert. One - of KHERR_ERROR, KHERR_WARNING or - KHERR_INFO. The default is - KHERR_INFO. Do not set directly. - Use khui_alert_set_severity(). */ - - khm_int32 alert_commands[KHUI_MAX_ALERT_COMMANDS]; - /*!< The command buttons associated - with the alert. Use - khui_alert_add_command() to add a - command. The buttons will appear in - the order in which they were added. - The first button will be the - default. Each command should be a - known action identifier. */ - khm_int32 n_alert_commands; - - wchar_t * title; /*!< The title of the alert. Subject - to ::KHUI_MAXCCH_TITLE. Use - khui_alert_set_title() to set. Do - not modify directly. */ - - wchar_t * message; /*!< The main message of the alert. - Subject to ::KHUI_MAXCCH_MESSAGE. - Use khui_alert_set_message() to - set. Do not modify direcly. */ - - wchar_t * suggestion; /*!< A suggestion. Appears below - the message text. Use - khui_alert_set_suggestion() to - set. Do not modify directly. */ - -#ifdef _WIN32 - POINT target; -#endif - - khm_int32 flags; /*!< combination of - ::khui_alert_flags. Do not modify - directly. */ - - kherr_context * err_context; - /*!< If non-NULL at the time the alert - window is shown, this indicates that - the alert window should provide an - error viewer for the given error - context. */ - - kherr_event * err_event; - /*!< If non-NULL at the time the alert - window is shown, this indicates that - the alert window should provide an - error viewer for the given error - event. If an \a err_context is also - given, the error viewer for the - context will be below this error. */ - - khm_int32 response; - /*!< Once the alert is displayed to - the user, when the user clicks one - of the command buttons, the command - ID will be assigned here. */ - - int refcount; /* internal */ - - LDCL(struct tag_khui_alert); /* internal */ -} khui_alert; - -#define KHUI_ALERT_MAGIC 0x48c39ce9 - -/*! \brief Maximum number of characters in title including terminating NULL - */ -#define KHUI_MAXCCH_TITLE 256 - -/*! \brief Maximum number of bytes in title including terminating NULL - */ -#define KHUI_MAXCB_TITLE (KHUI_MAXCCH_TITLE * sizeof(wchar_t)) - -/*! \brief Maximum number of characters in message including terminating NULL - */ -#define KHUI_MAXCCH_MESSAGE 1024 - -/*! \brief Maximum number of bytes in message including terminating NULL - */ -#define KHUI_MAXCB_MESSAGE (KHUI_MAXCCH_MESSAGE * sizeof(wchar_t)) - -/*! \brief Maxumum number of characters in a suggestion including terminating NULL */ -#define KHUI_MAXCCH_SUGGESTION 1024 - -/*! \brief Maximum number of bytes in a suggestion, including terminating NULL */ -#define KHUI_MAXCB_SUGGESTION (KHUI_MAXCCH_SUGGESTION * sizeof(wchar_t)) - -/*! \brief Flags for an alert */ -enum khui_alert_flags { - KHUI_ALERT_FLAG_FREE_STRUCT =0x00000001, - /*!< Internal. Free the structure once the alert is done. */ - - KHUI_ALERT_FLAG_FREE_TITLE =0x00000002, - /*!< Internal. Free the \a title field when the alert is done.*/ - - KHUI_ALERT_FLAG_FREE_MESSAGE =0x00000004, - /*!< Internal. Free the \a message field when the alert is done. */ - - KHUI_ALERT_FLAG_FREE_SUGGEST =0x00000008, - /*!< Internal. Free the \a suggest field when the alert is done */ - - KHUI_ALERT_FLAG_DEFACTION =0x00000010, - /*!< If the message is displayed as a balloon prompt, then perform - the default action when it is clicked. The default action is - the first action added to the alert. Cannot be used if there - are no actions or if ::KHUI_ALERT_FLAG_REQUEST_WINDOW is - specified.*/ - - KHUI_ALERT_FLAG_VALID_TARGET =0x00010000, - /*!< There is a valid target for the alert */ - - KHUI_ALERT_FLAG_VALID_ERROR =0x00020000, - /*!< There is a valid error context associated with the alert */ - - KHUI_ALERT_FLAG_DISPLAY_WINDOW =0x01000000, - /*!< The alert has been displayed in a window */ - - KHUI_ALERT_FLAG_DISPLAY_BALLOON =0x02000000, - /*!< The alert has been displayed in a ballon */ - - KHUI_ALERT_FLAG_REQUEST_WINDOW =0x04000000, - /*!< The alert should be displayed in a window */ - - KHUI_ALERT_FLAG_REQUEST_BALLOON =0x08000000, - /*!< The alert should be displayed in a balloon */ - - KHUI_ALERT_FLAG_MODAL =0x10000000, - /*!< Modal alert. Do not set direclty. */ - - KHUI_ALERT_FLAGMASK_RDWR =0x0C000010, - /*!< Bit mask of flags that can be set by khui_alert_set_flags() */ -}; - -/*! \brief Create an empty alert object - - The returned result is a held pointer to a ::khui_alert object. - Use khui_alert_release() to release the object. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_create_empty(khui_alert ** result); - -/*! \brief Create a simple alert object - - The returned result is a held pointer to a ::khui_alert object. - Use khui_alert_release() to release the object. - - \param[in] title The title of the alert. (Required, Localized) - Limited by ::KHUI_MAXCCH_TITLE. - - \param[in] message The message. (Required. Localized). Limited - by ::KHUI_MAXCCH_MESSAGE. - - \param[in] severity One of ::tag_kherr_severity - - \param[out] result Receives a held pointer to a ::khui_alert - object upon successful completion. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_create_simple(const wchar_t * title, - const wchar_t * message, - khm_int32 severity, - khui_alert ** result); - -/*! \brief Set the title of an alert object - - The title is limited by ::KHUI_MAXCCH_TITLE. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_set_title(khui_alert * alert, - const wchar_t * title); - -/*! \brief Set the message of an alert object - - The message is limited by ::KHUI_MAXCCH_MESSAGE. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_set_message(khui_alert * alert, - const wchar_t * message); - -/*! \brief Set the suggestion of an alert object - - The suggestion is limited by ::KHUI_MAXCCH_SUGGESTION - */ -KHMEXP khm_int32 KHMAPI -khui_alert_set_suggestion(khui_alert * alert, - const wchar_t * suggestion); - -/*! \brief Set the severity of the alert object - - The severity value is one of ::tag_kherr_severity - */ -KHMEXP khm_int32 KHMAPI -khui_alert_set_severity(khui_alert * alert, - khm_int32 severity); - -/*! \brief Sets the flags of the alert - - The flags are as defined in ::khui_alert_flags. The bits that are - on in \a mask will be set to the corresponding values in \a flags. - Only the bits specified in ::KHUI_ALERT_FLAGMASK_RDWR can be - specified in \a mask. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_set_flags(khui_alert * alert, khm_int32 mask, khm_int32 flags); - -/*! \brief Clear all the commands from an alert object - - \see khui_alert_add_command() - */ -KHMEXP khm_int32 KHMAPI -khui_alert_clear_commands(khui_alert * alert); - -/*! \brief Add a command to an alert object - - The command ID should be a valid registered command. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_add_command(khui_alert * alert, - khm_int32 command_id); - -/*! \brief Display an alert - - The alert must have a valid \a severity, \a title and a \a message - to be displayed. Otherwise the function immediately returns with - a failure code. - - The method used to display the alert is as follows: - - - A balloon alert will be shown if one of the following is true: - - The NetIDMgr application is minimized or in the background. - - ::KHUI_ALERT_FLAG_REQUEST_BALLOON is specified in \a flags. - - Otherwise an alert window will be shown. - - If the message, title of the alert is too long to fit in a balloon - prompt, there's a suggestion or if there are custom commands then - a placeholder balloon prompt will be shown which when clicked on, - shows the actual alert in an alert window. - - An exception is when ::KHUI_ALERT_FLAG_DEFACTION is specified in - flags. In this case instead of a placeholder balloon prompt, one - will be shown with the actual title and message (truncated if - necessary). Clicking on the balloon will have the same effect as - choosing the first command in the action. - - The placeholder balloon prompt will have a title derived from the - first 63 characters of the \a title field in the alert and a - message notifying the user that they should click the balloon - prompt for more information. - - To this end, it is beneficial to limit the length of the title to - 63 characters (64 counting the terminating NULL). This limit is - enforced on Windows. Also, try to make the title descriptive. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_show(khui_alert * alert); - -/*! \brief Display a modal alert - - Similar to khui_alert_show(), but shows a modal alert dialog. The - function does not return until the user has closed the alert. - - This function always opens an alert window (never shows a - balloon). - - \note Should only be called from the UI thread. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_show_modal(khui_alert * alert); - -/*! \brief Queue an alert - - Instead of displaying the alert immediately, the alert is queued - and the status bar updated to notify the user that there is a - pending alert. Once the user activates the pending alert, it will - be displayed as if khui_alert_show() was called. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_queue(khui_alert * alert); - -/*! \brief Display a simple alert - - \see khui_alert_show() - */ -KHMEXP khm_int32 KHMAPI -khui_alert_show_simple(const wchar_t * title, - const wchar_t * message, - khm_int32 severity); - -/*! \brief Obtain a hold on the alert - - An alert structure is only considered valid for the duration that - there is a hold on it. - - Use khui_alert_release() to release the hold. - */ -KHMEXP khm_int32 KHMAPI -khui_alert_hold(khui_alert * alert); - -/*! \brief Release the hold on the alert - - Holds obtained on an alert using any of the functions that either - return a held pointer to an alert or implicitly obtains a hold on - it need to be undone through a call to khui_alert_release(). - */ -KHMEXP khm_int32 KHMAPI -khui_alert_release(khui_alert * alert); - -/*! \brief Lock an alert - - Locking an alert disallows any other thread from accessing the - alert at the same time. NetIDMgr keeps a global list of all alert - objects and the user interface may access any of them at various - points in time. Locking the alert allows a thread to modify an - alert without causing another thread to be exposed to an - inconsistent state. - - Once a thread obtains a lock on the alert, it must call - khui_alert_unlock() to unlock it. Otherwise no other thread will - be able to access the alert. - - \note Currently the alert lock is global. Locking one alert - disallows access to all other alerts as well. - - \note Calling khui_alert_lock() is only necessary if you are - modifying the ::khui_alert structure directly. Calling any of - the khui_alert_* functions to modify the alert does not - require obtaining a lock, as they perform synchronization - internally. -*/ -KHMEXP void KHMAPI -khui_alert_lock(khui_alert * alert); - -/*! \brief Unlock an alert - - \see khui_alert_lock() -*/ -KHMEXP void KHMAPI -khui_alert_unlock(khui_alert * alert); - -/*!@}*/ -/*!@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHALERTS_H +#define __KHIMAIRA_KHALERTS_H + +/********************************************************************* + Alerter and error reporting +**********************************************************************/ + +/*! \addtogroup khui +@{ */ + +/*!\defgroup khui_alert Alerter and Error Reporting +@{*/ + +#define KHUI_MAX_ALERT_COMMANDS 4 + +/*! \brief An alert + + Describes an alert message that will be shown to the user in a + variety of ways depending on the state of the NetIDMgr + application. + */ +typedef struct tag_khui_alert { + khm_int32 magic; /*!< Magic number. Always set to + KHUI_ALERT_MAGIC */ + + khm_int32 severity; /*!< The severity of the alert. One + of KHERR_ERROR, KHERR_WARNING or + KHERR_INFO. The default is + KHERR_INFO. Do not set directly. + Use khui_alert_set_severity(). */ + + khm_int32 alert_commands[KHUI_MAX_ALERT_COMMANDS]; + /*!< The command buttons associated + with the alert. Use + khui_alert_add_command() to add a + command. The buttons will appear in + the order in which they were added. + The first button will be the + default. Each command should be a + known action identifier. */ + khm_int32 n_alert_commands; + + wchar_t * title; /*!< The title of the alert. Subject + to ::KHUI_MAXCCH_TITLE. Use + khui_alert_set_title() to set. Do + not modify directly. */ + + wchar_t * message; /*!< The main message of the alert. + Subject to ::KHUI_MAXCCH_MESSAGE. + Use khui_alert_set_message() to + set. Do not modify direcly. */ + + wchar_t * suggestion; /*!< A suggestion. Appears below + the message text. Use + khui_alert_set_suggestion() to + set. Do not modify directly. */ + +#ifdef _WIN32 + POINT target; +#endif + + khm_int32 flags; /*!< combination of + ::khui_alert_flags. Do not modify + directly. */ + + kherr_context * err_context; + /*!< If non-NULL at the time the alert + window is shown, this indicates that + the alert window should provide an + error viewer for the given error + context. */ + + kherr_event * err_event; + /*!< If non-NULL at the time the alert + window is shown, this indicates that + the alert window should provide an + error viewer for the given error + event. If an \a err_context is also + given, the error viewer for the + context will be below this error. */ + + khm_int32 response; + /*!< Once the alert is displayed to + the user, when the user clicks one + of the command buttons, the command + ID will be assigned here. */ + + int refcount; /* internal */ + + LDCL(struct tag_khui_alert); /* internal */ +} khui_alert; + +#define KHUI_ALERT_MAGIC 0x48c39ce9 + +/*! \brief Maximum number of characters in title including terminating NULL + */ +#define KHUI_MAXCCH_TITLE 256 + +/*! \brief Maximum number of bytes in title including terminating NULL + */ +#define KHUI_MAXCB_TITLE (KHUI_MAXCCH_TITLE * sizeof(wchar_t)) + +/*! \brief Maximum number of characters in message including terminating NULL + */ +#define KHUI_MAXCCH_MESSAGE 1024 + +/*! \brief Maximum number of bytes in message including terminating NULL + */ +#define KHUI_MAXCB_MESSAGE (KHUI_MAXCCH_MESSAGE * sizeof(wchar_t)) + +/*! \brief Maxumum number of characters in a suggestion including terminating NULL */ +#define KHUI_MAXCCH_SUGGESTION 1024 + +/*! \brief Maximum number of bytes in a suggestion, including terminating NULL */ +#define KHUI_MAXCB_SUGGESTION (KHUI_MAXCCH_SUGGESTION * sizeof(wchar_t)) + +/*! \brief Flags for an alert */ +enum khui_alert_flags { + KHUI_ALERT_FLAG_FREE_STRUCT =0x00000001, + /*!< Internal. Free the structure once the alert is done. */ + + KHUI_ALERT_FLAG_FREE_TITLE =0x00000002, + /*!< Internal. Free the \a title field when the alert is done.*/ + + KHUI_ALERT_FLAG_FREE_MESSAGE =0x00000004, + /*!< Internal. Free the \a message field when the alert is done. */ + + KHUI_ALERT_FLAG_FREE_SUGGEST =0x00000008, + /*!< Internal. Free the \a suggest field when the alert is done */ + + KHUI_ALERT_FLAG_DEFACTION =0x00000010, + /*!< If the message is displayed as a balloon prompt, then perform + the default action when it is clicked. The default action is + the first action added to the alert. Cannot be used if there + are no actions or if ::KHUI_ALERT_FLAG_REQUEST_WINDOW is + specified.*/ + + KHUI_ALERT_FLAG_VALID_TARGET =0x00010000, + /*!< There is a valid target for the alert */ + + KHUI_ALERT_FLAG_VALID_ERROR =0x00020000, + /*!< There is a valid error context associated with the alert */ + + KHUI_ALERT_FLAG_DISPLAY_WINDOW =0x01000000, + /*!< The alert has been displayed in a window */ + + KHUI_ALERT_FLAG_DISPLAY_BALLOON =0x02000000, + /*!< The alert has been displayed in a ballon */ + + KHUI_ALERT_FLAG_REQUEST_WINDOW =0x04000000, + /*!< The alert should be displayed in a window */ + + KHUI_ALERT_FLAG_REQUEST_BALLOON =0x08000000, + /*!< The alert should be displayed in a balloon */ + + KHUI_ALERT_FLAG_MODAL =0x10000000, + /*!< Modal alert. Do not set direclty. */ + + KHUI_ALERT_FLAGMASK_RDWR =0x0C000010, + /*!< Bit mask of flags that can be set by khui_alert_set_flags() */ +}; + +/*! \brief Create an empty alert object + + The returned result is a held pointer to a ::khui_alert object. + Use khui_alert_release() to release the object. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_create_empty(khui_alert ** result); + +/*! \brief Create a simple alert object + + The returned result is a held pointer to a ::khui_alert object. + Use khui_alert_release() to release the object. + + \param[in] title The title of the alert. (Required, Localized) + Limited by ::KHUI_MAXCCH_TITLE. + + \param[in] message The message. (Required. Localized). Limited + by ::KHUI_MAXCCH_MESSAGE. + + \param[in] severity One of ::tag_kherr_severity + + \param[out] result Receives a held pointer to a ::khui_alert + object upon successful completion. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_create_simple(const wchar_t * title, + const wchar_t * message, + khm_int32 severity, + khui_alert ** result); + +/*! \brief Set the title of an alert object + + The title is limited by ::KHUI_MAXCCH_TITLE. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_set_title(khui_alert * alert, + const wchar_t * title); + +/*! \brief Set the message of an alert object + + The message is limited by ::KHUI_MAXCCH_MESSAGE. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_set_message(khui_alert * alert, + const wchar_t * message); + +/*! \brief Set the suggestion of an alert object + + The suggestion is limited by ::KHUI_MAXCCH_SUGGESTION + */ +KHMEXP khm_int32 KHMAPI +khui_alert_set_suggestion(khui_alert * alert, + const wchar_t * suggestion); + +/*! \brief Set the severity of the alert object + + The severity value is one of ::tag_kherr_severity + */ +KHMEXP khm_int32 KHMAPI +khui_alert_set_severity(khui_alert * alert, + khm_int32 severity); + +/*! \brief Sets the flags of the alert + + The flags are as defined in ::khui_alert_flags. The bits that are + on in \a mask will be set to the corresponding values in \a flags. + Only the bits specified in ::KHUI_ALERT_FLAGMASK_RDWR can be + specified in \a mask. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_set_flags(khui_alert * alert, khm_int32 mask, khm_int32 flags); + +/*! \brief Clear all the commands from an alert object + + \see khui_alert_add_command() + */ +KHMEXP khm_int32 KHMAPI +khui_alert_clear_commands(khui_alert * alert); + +/*! \brief Add a command to an alert object + + The command ID should be a valid registered command. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_add_command(khui_alert * alert, + khm_int32 command_id); + +/*! \brief Display an alert + + The alert must have a valid \a severity, \a title and a \a message + to be displayed. Otherwise the function immediately returns with + a failure code. + + The method used to display the alert is as follows: + + - A balloon alert will be shown if one of the following is true: + - The NetIDMgr application is minimized or in the background. + - ::KHUI_ALERT_FLAG_REQUEST_BALLOON is specified in \a flags. + - Otherwise an alert window will be shown. + + If the message, title of the alert is too long to fit in a balloon + prompt, there's a suggestion or if there are custom commands then + a placeholder balloon prompt will be shown which when clicked on, + shows the actual alert in an alert window. + + An exception is when ::KHUI_ALERT_FLAG_DEFACTION is specified in + flags. In this case instead of a placeholder balloon prompt, one + will be shown with the actual title and message (truncated if + necessary). Clicking on the balloon will have the same effect as + choosing the first command in the action. + + The placeholder balloon prompt will have a title derived from the + first 63 characters of the \a title field in the alert and a + message notifying the user that they should click the balloon + prompt for more information. + + To this end, it is beneficial to limit the length of the title to + 63 characters (64 counting the terminating NULL). This limit is + enforced on Windows. Also, try to make the title descriptive. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_show(khui_alert * alert); + +/*! \brief Display a modal alert + + Similar to khui_alert_show(), but shows a modal alert dialog. The + function does not return until the user has closed the alert. + + This function always opens an alert window (never shows a + balloon). + + \note Should only be called from the UI thread. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_show_modal(khui_alert * alert); + +/*! \brief Queue an alert + + Instead of displaying the alert immediately, the alert is queued + and the status bar updated to notify the user that there is a + pending alert. Once the user activates the pending alert, it will + be displayed as if khui_alert_show() was called. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_queue(khui_alert * alert); + +/*! \brief Display a simple alert + + \see khui_alert_show() + */ +KHMEXP khm_int32 KHMAPI +khui_alert_show_simple(const wchar_t * title, + const wchar_t * message, + khm_int32 severity); + +/*! \brief Obtain a hold on the alert + + An alert structure is only considered valid for the duration that + there is a hold on it. + + Use khui_alert_release() to release the hold. + */ +KHMEXP khm_int32 KHMAPI +khui_alert_hold(khui_alert * alert); + +/*! \brief Release the hold on the alert + + Holds obtained on an alert using any of the functions that either + return a held pointer to an alert or implicitly obtains a hold on + it need to be undone through a call to khui_alert_release(). + */ +KHMEXP khm_int32 KHMAPI +khui_alert_release(khui_alert * alert); + +/*! \brief Lock an alert + + Locking an alert disallows any other thread from accessing the + alert at the same time. NetIDMgr keeps a global list of all alert + objects and the user interface may access any of them at various + points in time. Locking the alert allows a thread to modify an + alert without causing another thread to be exposed to an + inconsistent state. + + Once a thread obtains a lock on the alert, it must call + khui_alert_unlock() to unlock it. Otherwise no other thread will + be able to access the alert. + + \note Currently the alert lock is global. Locking one alert + disallows access to all other alerts as well. + + \note Calling khui_alert_lock() is only necessary if you are + modifying the ::khui_alert structure directly. Calling any of + the khui_alert_* functions to modify the alert does not + require obtaining a lock, as they perform synchronization + internally. +*/ +KHMEXP void KHMAPI +khui_alert_lock(khui_alert * alert); + +/*! \brief Unlock an alert + + \see khui_alert_lock() +*/ +KHMEXP void KHMAPI +khui_alert_unlock(khui_alert * alert); + +/*!@}*/ +/*!@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/propwnd.c +++ krb5-1.4.4/src/windows/identity/uilib/propwnd.c @@ -1,37 +1,37 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - - -#define PW_WM_SET_RECORD WM_USER - -KHMEXP khm_int32 KHMAPI khui_property_wnd_set_record(HWND hwnd_pwnd, khm_handle record) -{ - SendMessage(hwnd_pwnd, PW_WM_SET_RECORD, 0, (LPARAM) record); - - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + + +#define PW_WM_SET_RECORD WM_USER + +KHMEXP khm_int32 KHMAPI khui_property_wnd_set_record(HWND hwnd_pwnd, khm_handle record) +{ + SendMessage(hwnd_pwnd, PW_WM_SET_RECORD, 0, (LPARAM) record); + + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/uilib/uilibmain.c +++ krb5-1.4.4/src/windows/identity/uilib/uilibmain.c @@ -1,44 +1,44 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -extern void alert_init(void); -extern void alert_exit(void); -extern void ps_init(void); -extern void ps_exit(void); - -void -uilib_process_attach(void) { - alert_init(); - ps_init(); -} - -void -uilib_process_detach(void) { - ps_exit(); - alert_exit(); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +extern void alert_init(void); +extern void alert_exit(void); +extern void ps_init(void); +extern void ps_exit(void); + +void +uilib_process_attach(void) { + alert_init(); + ps_init(); +} + +void +uilib_process_detach(void) { + ps_exit(); + alert_exit(); +} --- krb5-1.4.4.orig/src/windows/identity/uilib/action.c +++ krb5-1.4.4/src/windows/identity/uilib/action.c @@ -1,1469 +1,1469 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#define NOEXPORT -#include -#include -#include - -#include - -khui_action_ref khui_main_menu[] = { - MENU_SUBMENU(KHUI_MENU_FILE), - MENU_SUBMENU(KHUI_MENU_CRED), - MENU_SUBMENU(KHUI_MENU_VIEW), - MENU_SUBMENU(KHUI_MENU_OPTIONS), - MENU_SUBMENU(KHUI_MENU_HELP), - MENU_END() -}; - -khui_action_ref khui_menu_file[] = { - MENU_ACTION(KHUI_ACTION_PROPERTIES), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_EXIT), - MENU_END() -}; - -khui_action_ref khui_menu_cred[] = { - MENU_ACTION(KHUI_ACTION_NEW_CRED), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_ACTION(KHUI_ACTION_IMPORT), - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_SET_DEF_ID), -#if 0 - /* not implemented yet */ - MENU_ACTION(KHUI_ACTION_SET_SRCH_ID), -#endif - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_PASSWD_ID), - MENU_END() -}; - -khui_action_ref khui_menu_layout[] = { - MENU_ACTION(KHUI_ACTION_LAYOUT_ID), - MENU_ACTION(KHUI_ACTION_LAYOUT_TYPE), - MENU_ACTION(KHUI_ACTION_LAYOUT_LOC), - MENU_ACTION(KHUI_ACTION_LAYOUT_CUST), - MENU_END() -}; - -khui_action_ref khui_menu_toolbars[] = { - MENU_ACTION(KHUI_ACTION_TB_STANDARD), - MENU_END() -}; - -khui_action_ref khui_menu_view[] = { - MENU_SUBMENU(KHUI_MENU_COLUMNS), - MENU_SUBMENU(KHUI_MENU_LAYOUT), -#if 0 - /* not implemented yet */ - MENU_SUBMENU(KHUI_MENU_TOOLBARS), -#endif - MENU_SEP(), -#if 0 - /* not implemented yet */ - MENU_ACTION(KHUI_ACTION_DEBUG_WINDOW), - MENU_SEP(), -#endif - MENU_ACTION(KHUI_ACTION_VIEW_REFRESH), - MENU_END() -}; - -khui_action_ref khui_menu_options[] = { - MENU_ACTION(KHUI_ACTION_OPT_KHIM), - MENU_ACTION(KHUI_ACTION_OPT_APPEAR), - MENU_ACTION(KHUI_ACTION_OPT_IDENTS), - MENU_ACTION(KHUI_ACTION_OPT_NOTIF), - MENU_ACTION(KHUI_ACTION_OPT_PLUGINS), - MENU_SEP(), - MENU_END() -}; - -khui_action_ref khui_menu_help[] = { - MENU_ACTION(KHUI_ACTION_HELP_CTX), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_HELP_CONTENTS), - MENU_ACTION(KHUI_ACTION_HELP_INDEX), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_HELP_ABOUT), - MENU_END() -}; - -khui_action_ref khui_toolbar_standard[] = { - MENU_ACTION(KHUI_ACTION_NEW_CRED), - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_ACTION(KHUI_ACTION_IMPORT), - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_PASSWD_ID), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_VIEW_REFRESH), - MENU_ACTION(KHUI_PACTION_BLANK), - MENU_ACTION(KHUI_ACTION_HELP_CTX), - MENU_END() -}; - -khui_action_ref khui_menu_ident_ctx[] = { - MENU_ACTION(KHUI_ACTION_PROPERTIES), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_SET_DEF_ID), - MENU_ACTION(KHUI_ACTION_SET_SRCH_ID), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_NEW_CRED), - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_END() -}; - -khui_action_ref khui_menu_tok_ctx[] = { - MENU_ACTION(KHUI_ACTION_PROPERTIES), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_NEW_CRED), - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_END() -}; - -khui_action_ref khui_menu_ico_ctx_min[] = { - MENU_DEFACTION(KHUI_ACTION_OPEN_APP), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_NEW_CRED), - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_EXIT), - MENU_END() -}; - -khui_action_ref khui_menu_ico_ctx_normal[] = { - MENU_DEFACTION(KHUI_ACTION_CLOSE_APP), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_NEW_CRED), - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_SEP(), - MENU_ACTION(KHUI_ACTION_EXIT), - MENU_END() -}; - -khui_action_ref khui_menu_cwheader_ctx[] = { - MENU_SUBMENU(KHUI_MENU_COLUMNS), - MENU_SUBMENU(KHUI_MENU_LAYOUT), - MENU_END() -}; - -khui_action_ref khui_menu_columns[] = { - MENU_END() -}; - -khui_action_ref khui_pmenu_tok_sel[] = { - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_END() -}; - -khui_action_ref khui_pmenu_id_sel[] = { - MENU_ACTION(KHUI_ACTION_DESTROY_CRED), - MENU_ACTION(KHUI_ACTION_RENEW_CRED), - MENU_END() -}; - -/* all stock menus and toolbars */ -khui_menu_def khui_all_menus[] = { - CONSTMENU(KHUI_MENU_MAIN, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_main_menu), - CONSTMENU(KHUI_MENU_FILE, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_file), - CONSTMENU(KHUI_MENU_CRED, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_cred), - CONSTMENU(KHUI_MENU_VIEW, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_view), - CONSTMENU(KHUI_MENU_LAYOUT, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_layout), - CONSTMENU(KHUI_MENU_TOOLBARS, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_toolbars), - CONSTMENU(KHUI_MENU_OPTIONS, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_options), - CONSTMENU(KHUI_MENU_HELP, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_help), - CONSTMENU(KHUI_MENU_COLUMNS, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_columns), - - /* toolbars */ - CONSTMENU(KHUI_TOOLBAR_STANDARD, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_toolbar_standard), - - /* context menus */ - CONSTMENU(KHUI_MENU_IDENT_CTX, KHUI_MENUSTATE_CONSTANT, khui_menu_ident_ctx), - CONSTMENU(KHUI_MENU_TOK_CTX, KHUI_MENUSTATE_CONSTANT, khui_menu_tok_ctx), - CONSTMENU(KHUI_MENU_ICO_CTX_MIN, KHUI_MENUSTATE_CONSTANT, khui_menu_ico_ctx_min), - CONSTMENU(KHUI_MENU_ICO_CTX_NORMAL, KHUI_MENUSTATE_CONSTANT, khui_menu_ico_ctx_normal), - CONSTMENU(KHUI_MENU_CWHEADER_CTX, KHUI_MENUSTATE_CONSTANT, khui_menu_cwheader_ctx), - - /* pseudo menus */ - CONSTMENU(KHUI_PMENU_TOK_SEL, KHUI_MENUSTATE_CONSTANT, khui_pmenu_tok_sel), - CONSTMENU(KHUI_PMENU_ID_SEL, KHUI_MENUSTATE_CONSTANT, khui_pmenu_id_sel) -}; - -int khui_n_all_menus = sizeof(khui_all_menus) / sizeof(khui_menu_def); -khui_menu_def ** khui_cust_menus = NULL; -int khui_nc_cust_menus = 0; -int khui_n_cust_menus = 0; -CRITICAL_SECTION cs_actions; - -#define CACT_NC_ALLOC 32 - -khui_action ** khui_cust_actions = NULL; -int khui_nc_cust_actions = 0; -int khui_n_cust_actions = 0; - -HWND khui_hwnd_main; /* main window, for notifying - action launches and - dispatching messages to the - application. */ - -KHMEXP void KHMAPI -khui_init_actions(void) { - InitializeCriticalSection(&cs_actions); -} - -KHMEXP void KHMAPI -khui_exit_actions(void) { - DeleteCriticalSection(&cs_actions); -} - -KHMEXP khm_int32 KHMAPI -khui_action_create(const wchar_t * name, - const wchar_t * caption, - const wchar_t * tooltip, - void * userdata, - khm_int32 type, - khm_handle hsub) { - khui_action * act; - khm_int32 action = 0; - int i; - size_t s; - - if (!caption || - FAILED(StringCchLength(caption, KHUI_MAXCCH_SHORT_DESC, &s)) || - (tooltip && FAILED(StringCchLength(tooltip, KHUI_MAXCCH_SHORT_DESC, &s))) || - (type != KHUI_ACTIONTYPE_TRIGGER && type != KHUI_ACTIONTYPE_TOGGLE)) { - return 0; - } - - EnterCriticalSection(&cs_actions); - if (name && (act = khui_find_named_action(name))) { - /* named action already exists */ - action = act->cmd; - goto _done; - } - - for (i=0; i < khui_n_cust_actions; i++) { - if (khui_cust_actions[i] == NULL || - (khui_cust_actions[i]->state & KHUI_ACTIONSTATE_DELETED)) - break; - } - - if (i >= khui_n_cust_actions && - (khui_cust_actions == NULL || - khui_n_cust_actions + 1 > khui_nc_cust_actions)) { - - khui_nc_cust_actions = UBOUNDSS(khui_n_cust_actions + 1, - CACT_NC_ALLOC, - CACT_NC_ALLOC); -#ifdef DEBUG - assert(khui_nc_cust_actions > khui_n_cust_actions + 1); -#endif - khui_cust_actions = PREALLOC(khui_cust_actions, - sizeof(*khui_cust_actions) * khui_nc_cust_actions); -#ifdef DEBUG - assert(khui_cust_actions); -#endif - } - - if (i >= khui_n_cust_actions) { - i = khui_n_cust_actions ++; - act = PMALLOC(sizeof(khui_action)); - } else { - act = khui_cust_actions[i]; - if (act == NULL) - act = PMALLOC(sizeof(khui_action)); - } - -#ifdef DEBUG - assert(act); -#endif - - khui_cust_actions[i] = act; - - ZeroMemory(act, sizeof(*act)); - - act->cmd = KHUI_USERACTION_BASE + i; - act->type = type; - act->name = (name? PWCSDUP(name) : 0); - act->caption = PWCSDUP(caption); - act->tooltip = (tooltip? PWCSDUP(tooltip) : 0); - act->listener = hsub; - act->data = userdata; - act->state = 0; - - action = act->cmd; - - _done: - LeaveCriticalSection(&cs_actions); - - if (action) - kmq_post_message(KMSG_ACT, KMSG_ACT_NEW, action, NULL); - - return action; -} - -KHMEXP void * KHMAPI -khui_action_get_data(khm_int32 action) { - khui_action * act; - - act = khui_find_action(action); - - if (act == NULL) - return NULL; - else - return act->data; -} - -KHMEXP void KHMAPI -khui_action_delete(khm_int32 action) { - khui_action * act; - - act = khui_find_action(action); - - if (act == NULL) - return; - - /* for the moment, even when the action is deleted, we don't free - up the block of memory used by the khui_action structure. When - a new action is created, it will reuse deleted action - structures. */ - EnterCriticalSection(&cs_actions); - act->state |= KHUI_ACTIONSTATE_DELETED; - if (act->name) - PFREE(act->name); - if (act->caption) - PFREE(act->caption); - if (act->tooltip) - PFREE(act->tooltip); - if (act->listener) - kmq_delete_subscription(act->listener); - act->name = NULL; - act->caption = NULL; - act->tooltip = NULL; - act->listener = NULL; - LeaveCriticalSection(&cs_actions); - - kmq_post_message(KMSG_ACT, KMSG_ACT_DELETE, action, NULL); -} - -#define MENU_NC_ITEMS 8 - -KHMEXP khui_menu_def * KHMAPI -khui_menu_create(khm_int32 action) -{ - khui_menu_def * d; - - d = PMALLOC(sizeof(*d)); - ZeroMemory(d, sizeof(*d)); - - d->cmd = action; - d->nc_items = MENU_NC_ITEMS; - d->items = PMALLOC(sizeof(*(d->items)) * d->nc_items); - - d->state = KHUI_MENUSTATE_ALLOCD; - - if (action) { - int i; - EnterCriticalSection(&cs_actions); - - for (i=0; i < khui_n_cust_menus; i++) { - if (khui_cust_menus[i] == NULL) - break; - } - - if (i >= khui_n_cust_menus) { - - if (khui_n_cust_menus + 1 >= khui_nc_cust_menus) { - khui_nc_cust_menus = UBOUNDSS(khui_n_cust_menus + 1, - CACT_NC_ALLOC, CACT_NC_ALLOC); - khui_cust_menus = - PREALLOC(khui_cust_menus, - sizeof(khui_cust_menus[0]) * khui_nc_cust_menus); - } - - i = khui_n_cust_menus ++; - } - - khui_cust_menus[i] = d; - - LeaveCriticalSection(&cs_actions); - } - - return d; -} - -KHMEXP void KHMAPI -khui_set_main_window(HWND hwnd) { - khui_hwnd_main = hwnd; -} - -KHMEXP void KHMAPI -khui_action_trigger(khm_int32 action, khui_action_context * ctx) { - khui_action_context save; - - if (!khui_hwnd_main) - return; - - if (ctx) { - khui_context_get(&save); - - khui_context_set_indirect(ctx); - } - - SendMessage(khui_hwnd_main, WM_COMMAND, - MAKEWPARAM(action, 0), (LPARAM) 0); - - if (ctx) { - khui_context_set_indirect(&save); - } -} - -KHMEXP khui_menu_def * KHMAPI -khui_menu_dup(khui_menu_def * src) -{ - khui_menu_def * d; - size_t i; - size_t n; - - d = khui_menu_create(src->cmd); - - if (!(src->state & KHUI_MENUSTATE_ALLOCD)) - n = khui_action_list_length(src->items); - else - n = src->n_items; - - for (i=0; iitems[i].flags & KHUI_ACTIONREF_PACTION) { - khui_menu_insert_paction(d, -1, src->items[i].p_action, src->items[i].flags); - } else { - khui_menu_insert_action(d, -1, src->items[i].action, 0); - } - } - - return d; -} - -KHMEXP void KHMAPI -khui_menu_delete(khui_menu_def * d) -{ - int i; - - /* non-allocated menus are assumed to have no pointers to other - allocated blocks */ - if(!(d->state & KHUI_MENUSTATE_ALLOCD)) { - /* we shouldn't have tried to delete a constant menu */ -#ifdef DEBUG - assert(FALSE); -#endif - return; - } - - EnterCriticalSection(&cs_actions); - for (i=0; i < khui_n_cust_menus; i++) { - if (khui_cust_menus[i] == d) { - khui_cust_menus[i] = NULL; - break; - } - } - LeaveCriticalSection(&cs_actions); - - for(i=0; i< (int) d->n_items; i++) { - if(d->items[i].flags & KHUI_ACTIONREF_FREE_PACTION) - PFREE(d->items[i].p_action); - } - - if(d->items) - PFREE(d->items); - PFREE(d); -} - -static void -menu_assert_size(khui_menu_def * d, size_t n) -{ - - assert(d->state & KHUI_MENUSTATE_ALLOCD); - - if(n > (int) d->nc_items) { - khui_action_ref * ni; - - d->nc_items = UBOUNDSS(n, MENU_NC_ITEMS, MENU_NC_ITEMS); - ni = PMALLOC(sizeof(*(d->items)) * d->nc_items); - memcpy(ni, d->items, sizeof(*(d->items)) * d->n_items); - PFREE(d->items); - d->items = ni; - } -} - -static void -menu_const_to_allocd(khui_menu_def * d) -{ - khui_action_ref * olist; - khui_action_ref * nlist; - khm_size n; - - assert(!(d->state & KHUI_MENUSTATE_ALLOCD)); - - olist = d->items; - n = khui_action_list_length(d->items); - - d->nc_items = UBOUNDSS(n, MENU_NC_ITEMS, MENU_NC_ITEMS); - nlist = PMALLOC(sizeof(d->items[0]) * d->nc_items); - memcpy(nlist, olist, sizeof(d->items[0]) * n); - - d->items = nlist; - d->n_items = n; - d->state |= KHUI_MENUSTATE_ALLOCD; -} - -KHMEXP void KHMAPI -khui_menu_insert_action(khui_menu_def * d, khm_size idx, khm_int32 action, khm_int32 flags) -{ - if (!(d->state & KHUI_MENUSTATE_ALLOCD)) - menu_const_to_allocd(d); - - assert(d->state & KHUI_MENUSTATE_ALLOCD); - assert(action == KHUI_MENU_SEP || action > 0); - - if (idx < 0 || idx > d->n_items) - idx = d->n_items; - - menu_assert_size(d, d->n_items + 1); - - if (idx < d->n_items) { - memmove(&d->items[idx + 1], &d->items[idx], (d->n_items - idx) * sizeof(d->items[0])); - } - - d->items[idx].flags = flags; - d->items[idx].action = action; - if (action == KHUI_MENU_SEP) - d->items[idx].flags |= KHUI_ACTIONREF_SEP; - - d->n_items++; -} - -KHMEXP void KHMAPI -khui_menu_insert_paction(khui_menu_def * d, khm_size idx, khui_action * paction, int flags) -{ - - if (paction == NULL) - return; - - if (!(d->state & KHUI_MENUSTATE_ALLOCD)) - menu_const_to_allocd(d); - - assert(d->state & KHUI_MENUSTATE_ALLOCD); - - if (idx < 0 || idx > d->n_items) - idx = d->n_items; - - menu_assert_size(d, d->n_items + 1); - - if (idx < d->n_items) { - memmove(&d->items[idx + 1], &d->items[idx], (d->n_items - idx) * sizeof(d->items[0])); - } - - d->items[idx].flags = flags | KHUI_ACTIONREF_PACTION; - d->items[idx].p_action = paction; - - d->n_items++; -} - -KHMEXP void KHMAPI -khui_menu_remove_action(khui_menu_def * d, khm_size idx) { - - assert(d->state & KHUI_MENUSTATE_ALLOCD); - - if (idx < 0 || idx >= d->n_items) - return; - - if (idx < d->n_items - 1) { - memmove(&d->items[idx], &d->items[idx + 1], - ((d->n_items - 1) - idx) * sizeof(d->items[0])); - } - - d->n_items--; -} - -KHMEXP khm_size KHMAPI -khui_menu_get_size(khui_menu_def * d) { - - if (d->state & KHUI_MENUSTATE_ALLOCD) - return d->n_items; - else - return khui_action_list_length(d->items); -} - -KHMEXP khui_action_ref * -khui_menu_get_action(khui_menu_def * d, khm_size idx) { - - khm_size n; - - if (d->state & KHUI_MENUSTATE_ALLOCD) - n = d->n_items; - else - n = khui_action_list_length(d->items); - - if (idx < 0 || idx >= n) - return NULL; - - return &d->items[idx]; -} - -KHMEXP khui_menu_def * KHMAPI -khui_find_menu(khm_int32 id) { - khui_menu_def * d; - int i; - - if (id < KHUI_USERACTION_BASE) { - d = khui_all_menus; - for(i=0;icmd == id) { - d = khui_cust_menus[i]; - break; - } - } - LeaveCriticalSection(&cs_actions); - - return d; - } -} - -KHMEXP khui_action * KHMAPI -khui_find_action(khm_int32 id) { - khui_action * act; - int i; - - act = khui_actions; - for(i=0;i= KHUI_USERACTION_BASE && - (id - KHUI_USERACTION_BASE) < khui_n_cust_actions) { - act = khui_cust_actions[id - KHUI_USERACTION_BASE]; -#ifdef DEBUG - assert(!act || act->cmd == id); -#endif - if (act && act->state & KHUI_ACTIONSTATE_DELETED) - act = NULL; - } - LeaveCriticalSection(&cs_actions); - - return act; -} - -KHMEXP khui_action * KHMAPI -khui_find_named_action(const wchar_t * name) { - int i; - khui_action * act; - khui_action ** pact; - - if(!name) - return NULL; - - act = khui_actions; - for(i=0;iname) - continue; - - if(!wcscmp(pact[i]->name, name)) { - if (pact[i]->state & KHUI_ACTIONSTATE_DELETED) - return NULL; - else - return pact[i]; - } - } - - return NULL; -} - -KHMEXP size_t KHMAPI -khui_action_list_length(khui_action_ref * ref) { - size_t c = 0; - while(ref && ref->action != KHUI_MENU_END && - !(ref->flags & KHUI_ACTIONREF_END)) { - c++; - ref++; - } - return c; -} - -KHMEXP void KHMAPI -khui_check_radio_action(khui_menu_def * d, khm_int32 cmd) -{ - khui_action_ref * r; - khui_action * act; - - r = d->items; - while(r && r->action != KHUI_MENU_END && - (!(d->state & KHUI_MENUSTATE_ALLOCD) || (r - d->items) < (int) d->n_items)) { - if(r->flags & KHUI_ACTIONREF_PACTION) { - act = r->p_action; - } else { - act = khui_find_action(r->action); - } - - if(act) { - if(act->cmd == cmd) - act->state |= KHUI_ACTIONSTATE_CHECKED; - else - act->state &= ~KHUI_ACTIONSTATE_CHECKED; - } - r++; - } - - kmq_post_message(KMSG_ACT, KMSG_ACT_CHECK, 0, 0); -} - -KHMEXP void KHMAPI -khui_check_action(khm_int32 cmd, khm_boolean check) { - khui_action * act; - - act = khui_find_action(cmd); - if (!act) - return; - - if (check && !(act->state & KHUI_ACTIONSTATE_CHECKED)) - act->state |= KHUI_ACTIONSTATE_CHECKED; - else if (!check && (act->state & KHUI_ACTIONSTATE_CHECKED)) - act->state &= ~KHUI_ACTIONSTATE_CHECKED; - else - return; - - kmq_post_message(KMSG_ACT, KMSG_ACT_CHECK, 0, 0); -} - -KHMEXP void KHMAPI -khui_enable_actions(khui_menu_def * d, khm_boolean enable) -{ - khui_action_ref * r; - int delta = FALSE; - khui_action * act; - - r = d->items; - while(r && r->action != KHUI_MENU_END && - (!(d->state & KHUI_MENUSTATE_ALLOCD) || (r - d->items) < (int) d->n_items)) { - if(r->flags & KHUI_ACTIONREF_PACTION) { - act = r->p_action; - } else { - act = khui_find_action(r->action); - } - - if(act) { - int old_state = act->state; - - if(enable) - act->state &= ~KHUI_ACTIONSTATE_DISABLED; - else - act->state |= KHUI_ACTIONSTATE_DISABLED; - - if(old_state != act->state) - delta = TRUE; - } - r++; - } - - if(delta) { - kmq_post_message(KMSG_ACT, KMSG_ACT_ENABLE, 0, 0); - } -} - -KHMEXP void KHMAPI -khui_enable_action(khm_int32 cmd, khm_boolean enable) { - khui_action * act; - - act = khui_find_action(cmd); - if (!act) - return; - - if (enable && (act->state & KHUI_ACTIONSTATE_DISABLED)) { - act->state &= ~KHUI_ACTIONSTATE_DISABLED; - } else if (!enable && !(act->state & KHUI_ACTIONSTATE_DISABLED)) { - act->state |= KHUI_ACTIONSTATE_DISABLED; - } else - return; - - kmq_post_message(KMSG_ACT, KMSG_ACT_ENABLE, 0, 0); -} - -KHMEXP HACCEL KHMAPI -khui_create_global_accel_table(void) { - int i; - ACCEL * accels; - HACCEL ha; - - accels = PMALLOC(sizeof(ACCEL) * khui_n_accel_global); - for(i=0;imod & FALT) { - if(FAILED(StringCbCat(buf, bufsiz, L"Alt+"))) - return FALSE; - } - - - if(def->mod & FCONTROL) { - if(FAILED(StringCbCat(buf, bufsiz, L"Ctrl+"))) - return FALSE; - } - - if(def->mod & FSHIFT) { - if(FAILED(StringCbCat(buf, bufsiz, L"Shift+"))) - return FALSE; - } - - if(def->mod & FVIRTKEY) { - wchar_t mbuf[6]; - wchar_t * ap = NULL; - switch(def->key) { - case VK_TAB: - ap = L"Tab"; - break; - - case VK_ESCAPE: - ap = L"Esc"; - break; - - case VK_RETURN: - ap = L"Enter"; - break; - - case VK_F1: - ap = L"F1"; - break; - - case VK_F2: - ap = L"F2"; - break; - - case VK_F3: - ap = L"F3"; - break; - - case VK_F4: - ap = L"F4"; - break; - - case VK_F5: - ap = L"F5"; - break; - - case VK_F6: - ap = L"F6"; - break; - - case VK_F7: - ap = L"F7"; - break; - - case VK_F8: - ap = L"F8"; - break; - - case VK_F9: - ap = L"F9"; - break; - - case VK_F10: - ap = L"F10"; - break; - - case VK_DELETE: - ap = L"Del"; - break; - - default: - if((def->key >= '0' && - def->key <= '9') || - (def->key >= 'A' && - def->key <= 'Z')) { - ap = mbuf; - mbuf[0] = (wchar_t) def->key; - mbuf[1] = L'\0'; - } - } - if(ap) { - if(FAILED(StringCbCat(buf, bufsiz, ap))) - return FALSE; - } - else { - if(FAILED(StringCbCat(buf, bufsiz,L"???"))) - return FALSE; - } - - } else { - wchar_t mbuf[2]; - - mbuf[0] = def->key; - mbuf[1] = L'\0'; - - if(FAILED(StringCbCat(buf, bufsiz, mbuf))) - return FALSE; - } - - return TRUE; -} - -/******************************************/ -/* contexts */ - -#define KHUI_ACTION_CONTEXT_MAGIC 0x39c49db5 - -static khm_int32 KHMAPI -khuiint_filter_selected(khm_handle cred, - khm_int32 vflags, - void * rock) { - khm_int32 flags; - if (KHM_SUCCEEDED(kcdb_cred_get_flags(cred, &flags)) && - (flags & KCDB_CRED_FLAG_SELECTED)) - return TRUE; - else - return FALSE; -} - -static void -khuiint_context_release(khui_action_context * ctx) { - ctx->scope = KHUI_SCOPE_NONE; - if (ctx->identity) - kcdb_identity_release(ctx->identity); - ctx->identity = NULL; - ctx->cred_type = KCDB_CREDTYPE_INVALID; - if (ctx->cred) - kcdb_cred_release(ctx->cred); - ctx->cred = NULL; - ctx->n_headers = 0; - if (ctx->credset) - kcdb_credset_flush(ctx->credset); - ctx->n_sel_creds = 0; - ctx->int_cb_used = 0; - ctx->vparam = NULL; - ctx->cb_vparam = 0; -} - -static void -khuiint_copy_context(khui_action_context * ctxdest, - const khui_action_context * ctxsrc) -{ - ctxdest->scope = ctxsrc->scope; - - if (ctxsrc->scope == KHUI_SCOPE_IDENT) { - ctxdest->identity = ctxsrc->identity; - kcdb_identity_hold(ctxsrc->identity); - } else if (ctxsrc->scope == KHUI_SCOPE_CREDTYPE) { - ctxdest->identity = ctxsrc->identity; - ctxdest->cred_type = ctxsrc->cred_type; - if (ctxsrc->identity != NULL) - kcdb_identity_hold(ctxsrc->identity); - } else if (ctxsrc->scope == KHUI_SCOPE_CRED) { - kcdb_cred_get_identity(ctxsrc->cred, &ctxdest->identity); - kcdb_cred_get_type(ctxsrc->cred, &ctxdest->cred_type); - ctxdest->cred = ctxsrc->cred; - kcdb_cred_hold(ctxsrc->cred); - } else if (ctxsrc->scope == KHUI_SCOPE_GROUP) { - khm_size cb_total; - int i; - - ctxdest->n_headers = ctxsrc->n_headers; - cb_total = 0; - for (i=0; i < (int) ctxsrc->n_headers; i++) { - cb_total += UBOUND32(ctxsrc->headers[i].cb_data); - } - - if (ctxdest->int_cb_buf < cb_total) { - - if (ctxdest->int_buf) - PFREE(ctxdest->int_buf); - - ctxdest->int_cb_buf = cb_total; - ctxdest->int_buf = PMALLOC(cb_total); - } - -#ifdef DEBUG - assert(ctxdest->int_buf || cb_total == 0); -#endif - ctxdest->int_cb_used = 0; - - for (i=0; i < (int) ctxsrc->n_headers; i++) { - ctxdest->headers[i].attr_id = ctxsrc->headers[i].attr_id; - ctxdest->headers[i].cb_data = ctxsrc->headers[i].cb_data; - if (ctxsrc->headers[i].cb_data > 0) { - ctxdest->headers[i].data = - BYTEOFFSET(ctxdest->int_buf, - ctxdest->int_cb_used); - memcpy(ctxdest->headers[i].data, - ctxsrc->headers[i].data, - ctxsrc->headers[i].cb_data); - ctxdest->int_cb_used += - UBOUND32(ctxsrc->headers[i].cb_data); - } else { - ctxdest->headers[i].data = NULL; - } - } - } - - if (ctxsrc->credset) { - - if (ctxdest->credset == NULL) - kcdb_credset_create(&ctxdest->credset); -#ifdef DEBUG - assert(ctxdest->credset != NULL); -#endif - - kcdb_credset_flush(ctxdest->credset); - - kcdb_credset_extract_filtered(ctxdest->credset, - ctxsrc->credset, - khuiint_filter_selected, - NULL); - - kcdb_credset_get_size(ctxdest->credset, - &ctxdest->n_sel_creds); - } else { - if (ctxdest->credset != NULL) - kcdb_credset_flush(ctxdest->credset); - ctxdest->n_sel_creds = 0; - } - - /* For now, we simply transfer the vparam buffer into the new - context. If we are copying, we also need to modify - khui_context_release() to free the allocated buffer */ -#if 0 - if (ctxsrc->vparam && ctxsrc->cb_vparam) { - ctxdest->vparam = PMALLOC(ctxsrc->cb_vparam); -#ifdef DEBUG - assert(ctxdest->vparam); -#endif - memcpy(ctxdest->vparam, ctxsrc->vparam, ctxsrc->cb_vparam); - ctxdest->cb_vparam = ctxsrc->cb_vparam; - } else { -#endif - ctxdest->vparam = ctxsrc->vparam; - ctxdest->cb_vparam = ctxsrc->cb_vparam; -#if 0 - } -#endif -} - -static void -khuiint_context_init(khui_action_context * ctx) { - ctx->magic = KHUI_ACTION_CONTEXT_MAGIC; - ctx->scope = KHUI_SCOPE_NONE; - ctx->identity = NULL; - ctx->cred_type = KCDB_CREDTYPE_INVALID; - ctx->cred = NULL; - ZeroMemory(ctx->headers, sizeof(ctx->headers)); - ctx->n_headers = 0; - ctx->credset = NULL; - ctx->n_sel_creds = 0; - ctx->int_buf = NULL; - ctx->int_cb_buf = 0; - ctx->int_cb_used = 0; - ctx->vparam = NULL; - ctx->cb_vparam = 0; -} - -khui_action_context khui_ctx = { - KHUI_ACTION_CONTEXT_MAGIC, - KHUI_SCOPE_NONE, - NULL, - KCDB_CREDTYPE_INVALID, - NULL, - { - {KCDB_ATTR_INVALID,NULL,0}, - {KCDB_ATTR_INVALID,NULL,0}, - {KCDB_ATTR_INVALID,NULL,0}, - {KCDB_ATTR_INVALID,NULL,0}, - {KCDB_ATTR_INVALID,NULL,0}, - {KCDB_ATTR_INVALID,NULL,0} - }, - 0, - NULL, - 0, - NULL, - 0, - 0, - NULL, - 0}; - -KHMEXP void KHMAPI -khui_context_create(khui_action_context * ctx, - khui_scope scope, - khm_handle identity, - khm_int32 cred_type, - khm_handle cred) -{ - khui_action_context tctx; - - khuiint_context_init(&tctx); - khuiint_context_init(ctx); - - tctx.scope = scope; - tctx.identity = identity; - tctx.cred_type = cred_type; - tctx.cred = cred; - - khuiint_copy_context(ctx, &tctx); -} - -KHMEXP void KHMAPI -khui_context_set(khui_scope scope, - khm_handle identity, - khm_int32 cred_type, - khm_handle cred, - khui_header *headers, - khm_size n_headers, - khm_handle cs_src) { - - khui_context_set_ex(scope, - identity, - cred_type, - cred, - headers, - n_headers, - cs_src, - NULL, - 0); -} - -KHMEXP void KHMAPI -khui_context_set_ex(khui_scope scope, - khm_handle identity, - khm_int32 cred_type, - khm_handle cred, - khui_header *headers, - khm_size n_headers, - khm_handle cs_src, - void * vparam, - khm_size cb_vparam) -{ - khui_action_context tctx; - - EnterCriticalSection(&cs_actions); - - khuiint_context_release(&khui_ctx); - - khuiint_context_init(&tctx); - - tctx.scope = scope; - tctx.identity = identity; - tctx.cred_type = cred_type; - tctx.cred = cred; - if (headers) { - tctx.n_headers = n_headers; - memcpy(tctx.headers, - headers, - sizeof(*headers) * n_headers); - } else { - tctx.n_headers = 0; - } - tctx.credset = cs_src; - tctx.n_sel_creds = 0; /* ignored */ - tctx.vparam = vparam; - tctx.cb_vparam = cb_vparam; - tctx.int_buf = NULL; - tctx.int_cb_buf = 0; - tctx.int_cb_used = 0; - - khuiint_copy_context(&khui_ctx, &tctx); - - khui_context_refresh(); - - LeaveCriticalSection(&cs_actions); -} - -KHMEXP void KHMAPI -khui_context_set_indirect(khui_action_context * ctx) -{ - EnterCriticalSection(&cs_actions); - - khuiint_context_release(&khui_ctx); - - khuiint_copy_context(&khui_ctx, ctx); - - khui_context_refresh(); - - LeaveCriticalSection(&cs_actions); -} - -KHMEXP void KHMAPI -khui_context_refresh(void) { - khm_int32 flags; - - EnterCriticalSection(&cs_actions); - if (khui_ctx.identity) { - /* an identity is selected */ - - if (KHM_SUCCEEDED(kcdb_identity_get_flags(khui_ctx.identity, - &flags)) && - (flags & KCDB_IDENT_FLAG_DEFAULT)) { - khui_check_action(KHUI_ACTION_SET_DEF_ID, TRUE); - khui_enable_action(KHUI_ACTION_SET_DEF_ID, FALSE); - } else { - khui_check_action(KHUI_ACTION_SET_DEF_ID, FALSE); - khui_enable_action(KHUI_ACTION_SET_DEF_ID, TRUE); - } - - khui_enable_action(KHUI_ACTION_PASSWD_ID, TRUE); - } else { - khui_check_action(KHUI_ACTION_SET_DEF_ID, FALSE); - khui_enable_action(KHUI_ACTION_SET_DEF_ID, FALSE); - khui_enable_action(KHUI_ACTION_PASSWD_ID, FALSE); - } - - if (khui_ctx.scope != KHUI_SCOPE_NONE) { - khui_enable_action(KHUI_ACTION_PROPERTIES, TRUE); - khui_enable_action(KHUI_ACTION_DESTROY_CRED, TRUE); - khui_enable_action(KHUI_ACTION_RENEW_CRED, TRUE); - } else { - khui_enable_action(KHUI_ACTION_PROPERTIES, FALSE); - khui_enable_action(KHUI_ACTION_DESTROY_CRED, FALSE); - khui_enable_action(KHUI_ACTION_RENEW_CRED, FALSE); - } - - LeaveCriticalSection(&cs_actions); - - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); -} - -KHMEXP void KHMAPI -khui_context_get(khui_action_context * ctx) -{ - EnterCriticalSection(&cs_actions); - - khuiint_context_init(ctx); - khuiint_copy_context(ctx, &khui_ctx); - - if (ctx->credset) { - kcdb_credset_seal(ctx->credset); - } - - LeaveCriticalSection(&cs_actions); -} - -KHMEXP void KHMAPI -khui_context_release(khui_action_context * ctx) -{ -#ifdef DEBUG - assert(ctx->magic == KHUI_ACTION_CONTEXT_MAGIC); -#endif - - khuiint_context_release(ctx); - if (ctx->credset) { - kcdb_credset_unseal(ctx->credset); - kcdb_credset_delete(ctx->credset); - } - ctx->credset = NULL; - if (ctx->int_buf) - PFREE(ctx->int_buf); - ctx->int_buf = NULL; -#if 0 - if (ctx->vparam && ctx->cb_vparam > 0) { - PFREE(ctx->vparam); - ctx->vparam = NULL; - } - ctx->cb_vparam = 0; -#else - ctx->vparam = 0; - ctx->cb_vparam = 0; -#endif -} - -KHMEXP void KHMAPI -khui_context_reset(void) -{ - EnterCriticalSection(&cs_actions); - - khuiint_context_release(&khui_ctx); - - khui_context_refresh(); - - LeaveCriticalSection(&cs_actions); -} - -KHMEXP khm_int32 KHMAPI -khui_context_cursor_filter(khm_handle cred, - khm_int32 flags, - void * rock) { - khui_action_context * ctx = (khui_action_context *) rock; - khm_int32 rv; - - if (ctx->scope == KHUI_SCOPE_NONE) - return 0; - else if (ctx->scope == KHUI_SCOPE_IDENT) { - khm_handle c_ident; - - if (KHM_FAILED(kcdb_cred_get_identity(cred, &c_ident))) - return 0; - - rv = (c_ident == ctx->identity); - - kcdb_identity_release(c_ident); - - return rv; - } else if (ctx->scope == KHUI_SCOPE_CREDTYPE) { - khm_handle c_ident; - khm_int32 c_type; - - if (KHM_FAILED(kcdb_cred_get_type(cred, &c_type)) || - c_type != ctx->cred_type) - return 0; - - if (ctx->identity == NULL) - return 1; - - if (KHM_FAILED(kcdb_cred_get_identity(cred, &c_ident))) - return 0; - - rv = (c_ident == ctx->identity); - - kcdb_identity_release(c_ident); - - return rv; - } else if (ctx->scope == KHUI_SCOPE_CRED) { - return kcdb_creds_is_equal(cred, ctx->cred); - } else if (ctx->scope == KHUI_SCOPE_GROUP) { - int i; - - rv = 1; - - for (i=0; i < (int) ctx->n_headers && rv; i++) { - kcdb_attrib * pattr; - kcdb_type * ptype; - DWORD buffer[1024]; /* 4096 bytes */ - khm_size cb; - - if (kcdb_cred_get_attr(cred, ctx->headers[i].attr_id, - NULL, - NULL, - &cb) != KHM_ERROR_TOO_LONG) { - /* the header doesn't exist anyway */ - rv = (ctx->headers[i].cb_data == 0); - continue; - } -#ifdef DEBUG - assert(cb <= sizeof(buffer)); -#endif - cb = sizeof(buffer); - - if (KHM_FAILED(kcdb_cred_get_attr(cred, - ctx->headers[i].attr_id, - NULL, - (void *) buffer, - &cb))) { - rv = 0; - continue; - } - - if (KHM_FAILED(kcdb_attrib_get_info(ctx->headers[i].attr_id, - &pattr))) { - rv = 0; - continue; - } - - if (KHM_FAILED(kcdb_type_get_info(pattr->type, &ptype))) { - rv = 0; - kcdb_attrib_release_info(pattr); - continue; - } - - if ((*ptype->comp)(ctx->headers[i].data, - ctx->headers[i].cb_data, - (void *) buffer, - cb) != 0) - rv = 1; - - kcdb_type_release_info(ptype); - kcdb_attrib_release_info(pattr); - } - - return rv; - } else - return 0; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#define NOEXPORT +#include +#include +#include + +#include + +khui_action_ref khui_main_menu[] = { + MENU_SUBMENU(KHUI_MENU_FILE), + MENU_SUBMENU(KHUI_MENU_CRED), + MENU_SUBMENU(KHUI_MENU_VIEW), + MENU_SUBMENU(KHUI_MENU_OPTIONS), + MENU_SUBMENU(KHUI_MENU_HELP), + MENU_END() +}; + +khui_action_ref khui_menu_file[] = { + MENU_ACTION(KHUI_ACTION_PROPERTIES), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_EXIT), + MENU_END() +}; + +khui_action_ref khui_menu_cred[] = { + MENU_ACTION(KHUI_ACTION_NEW_CRED), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_IMPORT), + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_SET_DEF_ID), +#if 0 + /* not implemented yet */ + MENU_ACTION(KHUI_ACTION_SET_SRCH_ID), +#endif + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_PASSWD_ID), + MENU_END() +}; + +khui_action_ref khui_menu_layout[] = { + MENU_ACTION(KHUI_ACTION_LAYOUT_ID), + MENU_ACTION(KHUI_ACTION_LAYOUT_TYPE), + MENU_ACTION(KHUI_ACTION_LAYOUT_LOC), + MENU_ACTION(KHUI_ACTION_LAYOUT_CUST), + MENU_END() +}; + +khui_action_ref khui_menu_toolbars[] = { + MENU_ACTION(KHUI_ACTION_TB_STANDARD), + MENU_END() +}; + +khui_action_ref khui_menu_view[] = { + MENU_SUBMENU(KHUI_MENU_COLUMNS), + MENU_SUBMENU(KHUI_MENU_LAYOUT), +#if 0 + /* not implemented yet */ + MENU_SUBMENU(KHUI_MENU_TOOLBARS), +#endif + MENU_SEP(), +#if 0 + /* not implemented yet */ + MENU_ACTION(KHUI_ACTION_DEBUG_WINDOW), + MENU_SEP(), +#endif + MENU_ACTION(KHUI_ACTION_VIEW_REFRESH), + MENU_END() +}; + +khui_action_ref khui_menu_options[] = { + MENU_ACTION(KHUI_ACTION_OPT_KHIM), + MENU_ACTION(KHUI_ACTION_OPT_APPEAR), + MENU_ACTION(KHUI_ACTION_OPT_IDENTS), + MENU_ACTION(KHUI_ACTION_OPT_NOTIF), + MENU_ACTION(KHUI_ACTION_OPT_PLUGINS), + MENU_SEP(), + MENU_END() +}; + +khui_action_ref khui_menu_help[] = { + MENU_ACTION(KHUI_ACTION_HELP_CTX), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_HELP_CONTENTS), + MENU_ACTION(KHUI_ACTION_HELP_INDEX), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_HELP_ABOUT), + MENU_END() +}; + +khui_action_ref khui_toolbar_standard[] = { + MENU_ACTION(KHUI_ACTION_NEW_CRED), + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_IMPORT), + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_PASSWD_ID), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_VIEW_REFRESH), + MENU_ACTION(KHUI_PACTION_BLANK), + MENU_ACTION(KHUI_ACTION_HELP_CTX), + MENU_END() +}; + +khui_action_ref khui_menu_ident_ctx[] = { + MENU_ACTION(KHUI_ACTION_PROPERTIES), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_SET_DEF_ID), + MENU_ACTION(KHUI_ACTION_SET_SRCH_ID), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_NEW_CRED), + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_END() +}; + +khui_action_ref khui_menu_tok_ctx[] = { + MENU_ACTION(KHUI_ACTION_PROPERTIES), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_NEW_CRED), + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_END() +}; + +khui_action_ref khui_menu_ico_ctx_min[] = { + MENU_DEFACTION(KHUI_ACTION_OPEN_APP), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_NEW_CRED), + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_EXIT), + MENU_END() +}; + +khui_action_ref khui_menu_ico_ctx_normal[] = { + MENU_DEFACTION(KHUI_ACTION_CLOSE_APP), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_NEW_CRED), + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_SEP(), + MENU_ACTION(KHUI_ACTION_EXIT), + MENU_END() +}; + +khui_action_ref khui_menu_cwheader_ctx[] = { + MENU_SUBMENU(KHUI_MENU_COLUMNS), + MENU_SUBMENU(KHUI_MENU_LAYOUT), + MENU_END() +}; + +khui_action_ref khui_menu_columns[] = { + MENU_END() +}; + +khui_action_ref khui_pmenu_tok_sel[] = { + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_END() +}; + +khui_action_ref khui_pmenu_id_sel[] = { + MENU_ACTION(KHUI_ACTION_DESTROY_CRED), + MENU_ACTION(KHUI_ACTION_RENEW_CRED), + MENU_END() +}; + +/* all stock menus and toolbars */ +khui_menu_def khui_all_menus[] = { + CONSTMENU(KHUI_MENU_MAIN, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_main_menu), + CONSTMENU(KHUI_MENU_FILE, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_file), + CONSTMENU(KHUI_MENU_CRED, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_cred), + CONSTMENU(KHUI_MENU_VIEW, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_view), + CONSTMENU(KHUI_MENU_LAYOUT, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_layout), + CONSTMENU(KHUI_MENU_TOOLBARS, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_toolbars), + CONSTMENU(KHUI_MENU_OPTIONS, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_options), + CONSTMENU(KHUI_MENU_HELP, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_help), + CONSTMENU(KHUI_MENU_COLUMNS, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_menu_columns), + + /* toolbars */ + CONSTMENU(KHUI_TOOLBAR_STANDARD, KHUI_MENUSTATE_CONSTANT | KHUI_MENUSTATE_SYSTEM, khui_toolbar_standard), + + /* context menus */ + CONSTMENU(KHUI_MENU_IDENT_CTX, KHUI_MENUSTATE_CONSTANT, khui_menu_ident_ctx), + CONSTMENU(KHUI_MENU_TOK_CTX, KHUI_MENUSTATE_CONSTANT, khui_menu_tok_ctx), + CONSTMENU(KHUI_MENU_ICO_CTX_MIN, KHUI_MENUSTATE_CONSTANT, khui_menu_ico_ctx_min), + CONSTMENU(KHUI_MENU_ICO_CTX_NORMAL, KHUI_MENUSTATE_CONSTANT, khui_menu_ico_ctx_normal), + CONSTMENU(KHUI_MENU_CWHEADER_CTX, KHUI_MENUSTATE_CONSTANT, khui_menu_cwheader_ctx), + + /* pseudo menus */ + CONSTMENU(KHUI_PMENU_TOK_SEL, KHUI_MENUSTATE_CONSTANT, khui_pmenu_tok_sel), + CONSTMENU(KHUI_PMENU_ID_SEL, KHUI_MENUSTATE_CONSTANT, khui_pmenu_id_sel) +}; + +int khui_n_all_menus = sizeof(khui_all_menus) / sizeof(khui_menu_def); +khui_menu_def ** khui_cust_menus = NULL; +int khui_nc_cust_menus = 0; +int khui_n_cust_menus = 0; +CRITICAL_SECTION cs_actions; + +#define CACT_NC_ALLOC 32 + +khui_action ** khui_cust_actions = NULL; +int khui_nc_cust_actions = 0; +int khui_n_cust_actions = 0; + +HWND khui_hwnd_main; /* main window, for notifying + action launches and + dispatching messages to the + application. */ + +KHMEXP void KHMAPI +khui_init_actions(void) { + InitializeCriticalSection(&cs_actions); +} + +KHMEXP void KHMAPI +khui_exit_actions(void) { + DeleteCriticalSection(&cs_actions); +} + +KHMEXP khm_int32 KHMAPI +khui_action_create(const wchar_t * name, + const wchar_t * caption, + const wchar_t * tooltip, + void * userdata, + khm_int32 type, + khm_handle hsub) { + khui_action * act; + khm_int32 action = 0; + int i; + size_t s; + + if (!caption || + FAILED(StringCchLength(caption, KHUI_MAXCCH_SHORT_DESC, &s)) || + (tooltip && FAILED(StringCchLength(tooltip, KHUI_MAXCCH_SHORT_DESC, &s))) || + (type != KHUI_ACTIONTYPE_TRIGGER && type != KHUI_ACTIONTYPE_TOGGLE)) { + return 0; + } + + EnterCriticalSection(&cs_actions); + if (name && (act = khui_find_named_action(name))) { + /* named action already exists */ + action = act->cmd; + goto _done; + } + + for (i=0; i < khui_n_cust_actions; i++) { + if (khui_cust_actions[i] == NULL || + (khui_cust_actions[i]->state & KHUI_ACTIONSTATE_DELETED)) + break; + } + + if (i >= khui_n_cust_actions && + (khui_cust_actions == NULL || + khui_n_cust_actions + 1 > khui_nc_cust_actions)) { + + khui_nc_cust_actions = UBOUNDSS(khui_n_cust_actions + 1, + CACT_NC_ALLOC, + CACT_NC_ALLOC); +#ifdef DEBUG + assert(khui_nc_cust_actions > khui_n_cust_actions + 1); +#endif + khui_cust_actions = PREALLOC(khui_cust_actions, + sizeof(*khui_cust_actions) * khui_nc_cust_actions); +#ifdef DEBUG + assert(khui_cust_actions); +#endif + } + + if (i >= khui_n_cust_actions) { + i = khui_n_cust_actions ++; + act = PMALLOC(sizeof(khui_action)); + } else { + act = khui_cust_actions[i]; + if (act == NULL) + act = PMALLOC(sizeof(khui_action)); + } + +#ifdef DEBUG + assert(act); +#endif + + khui_cust_actions[i] = act; + + ZeroMemory(act, sizeof(*act)); + + act->cmd = KHUI_USERACTION_BASE + i; + act->type = type; + act->name = (name? PWCSDUP(name) : 0); + act->caption = PWCSDUP(caption); + act->tooltip = (tooltip? PWCSDUP(tooltip) : 0); + act->listener = hsub; + act->data = userdata; + act->state = 0; + + action = act->cmd; + + _done: + LeaveCriticalSection(&cs_actions); + + if (action) + kmq_post_message(KMSG_ACT, KMSG_ACT_NEW, action, NULL); + + return action; +} + +KHMEXP void * KHMAPI +khui_action_get_data(khm_int32 action) { + khui_action * act; + + act = khui_find_action(action); + + if (act == NULL) + return NULL; + else + return act->data; +} + +KHMEXP void KHMAPI +khui_action_delete(khm_int32 action) { + khui_action * act; + + act = khui_find_action(action); + + if (act == NULL) + return; + + /* for the moment, even when the action is deleted, we don't free + up the block of memory used by the khui_action structure. When + a new action is created, it will reuse deleted action + structures. */ + EnterCriticalSection(&cs_actions); + act->state |= KHUI_ACTIONSTATE_DELETED; + if (act->name) + PFREE(act->name); + if (act->caption) + PFREE(act->caption); + if (act->tooltip) + PFREE(act->tooltip); + if (act->listener) + kmq_delete_subscription(act->listener); + act->name = NULL; + act->caption = NULL; + act->tooltip = NULL; + act->listener = NULL; + LeaveCriticalSection(&cs_actions); + + kmq_post_message(KMSG_ACT, KMSG_ACT_DELETE, action, NULL); +} + +#define MENU_NC_ITEMS 8 + +KHMEXP khui_menu_def * KHMAPI +khui_menu_create(khm_int32 action) +{ + khui_menu_def * d; + + d = PMALLOC(sizeof(*d)); + ZeroMemory(d, sizeof(*d)); + + d->cmd = action; + d->nc_items = MENU_NC_ITEMS; + d->items = PMALLOC(sizeof(*(d->items)) * d->nc_items); + + d->state = KHUI_MENUSTATE_ALLOCD; + + if (action) { + int i; + EnterCriticalSection(&cs_actions); + + for (i=0; i < khui_n_cust_menus; i++) { + if (khui_cust_menus[i] == NULL) + break; + } + + if (i >= khui_n_cust_menus) { + + if (khui_n_cust_menus + 1 >= khui_nc_cust_menus) { + khui_nc_cust_menus = UBOUNDSS(khui_n_cust_menus + 1, + CACT_NC_ALLOC, CACT_NC_ALLOC); + khui_cust_menus = + PREALLOC(khui_cust_menus, + sizeof(khui_cust_menus[0]) * khui_nc_cust_menus); + } + + i = khui_n_cust_menus ++; + } + + khui_cust_menus[i] = d; + + LeaveCriticalSection(&cs_actions); + } + + return d; +} + +KHMEXP void KHMAPI +khui_set_main_window(HWND hwnd) { + khui_hwnd_main = hwnd; +} + +KHMEXP void KHMAPI +khui_action_trigger(khm_int32 action, khui_action_context * ctx) { + khui_action_context save; + + if (!khui_hwnd_main) + return; + + if (ctx) { + khui_context_get(&save); + + khui_context_set_indirect(ctx); + } + + SendMessage(khui_hwnd_main, WM_COMMAND, + MAKEWPARAM(action, 0), (LPARAM) 0); + + if (ctx) { + khui_context_set_indirect(&save); + } +} + +KHMEXP khui_menu_def * KHMAPI +khui_menu_dup(khui_menu_def * src) +{ + khui_menu_def * d; + size_t i; + size_t n; + + d = khui_menu_create(src->cmd); + + if (!(src->state & KHUI_MENUSTATE_ALLOCD)) + n = khui_action_list_length(src->items); + else + n = src->n_items; + + for (i=0; iitems[i].flags & KHUI_ACTIONREF_PACTION) { + khui_menu_insert_paction(d, -1, src->items[i].p_action, src->items[i].flags); + } else { + khui_menu_insert_action(d, -1, src->items[i].action, 0); + } + } + + return d; +} + +KHMEXP void KHMAPI +khui_menu_delete(khui_menu_def * d) +{ + int i; + + /* non-allocated menus are assumed to have no pointers to other + allocated blocks */ + if(!(d->state & KHUI_MENUSTATE_ALLOCD)) { + /* we shouldn't have tried to delete a constant menu */ +#ifdef DEBUG + assert(FALSE); +#endif + return; + } + + EnterCriticalSection(&cs_actions); + for (i=0; i < khui_n_cust_menus; i++) { + if (khui_cust_menus[i] == d) { + khui_cust_menus[i] = NULL; + break; + } + } + LeaveCriticalSection(&cs_actions); + + for(i=0; i< (int) d->n_items; i++) { + if(d->items[i].flags & KHUI_ACTIONREF_FREE_PACTION) + PFREE(d->items[i].p_action); + } + + if(d->items) + PFREE(d->items); + PFREE(d); +} + +static void +menu_assert_size(khui_menu_def * d, size_t n) +{ + + assert(d->state & KHUI_MENUSTATE_ALLOCD); + + if(n > (int) d->nc_items) { + khui_action_ref * ni; + + d->nc_items = UBOUNDSS(n, MENU_NC_ITEMS, MENU_NC_ITEMS); + ni = PMALLOC(sizeof(*(d->items)) * d->nc_items); + memcpy(ni, d->items, sizeof(*(d->items)) * d->n_items); + PFREE(d->items); + d->items = ni; + } +} + +static void +menu_const_to_allocd(khui_menu_def * d) +{ + khui_action_ref * olist; + khui_action_ref * nlist; + khm_size n; + + assert(!(d->state & KHUI_MENUSTATE_ALLOCD)); + + olist = d->items; + n = khui_action_list_length(d->items); + + d->nc_items = UBOUNDSS(n, MENU_NC_ITEMS, MENU_NC_ITEMS); + nlist = PMALLOC(sizeof(d->items[0]) * d->nc_items); + memcpy(nlist, olist, sizeof(d->items[0]) * n); + + d->items = nlist; + d->n_items = n; + d->state |= KHUI_MENUSTATE_ALLOCD; +} + +KHMEXP void KHMAPI +khui_menu_insert_action(khui_menu_def * d, khm_size idx, khm_int32 action, khm_int32 flags) +{ + if (!(d->state & KHUI_MENUSTATE_ALLOCD)) + menu_const_to_allocd(d); + + assert(d->state & KHUI_MENUSTATE_ALLOCD); + assert(action == KHUI_MENU_SEP || action > 0); + + if (idx < 0 || idx > d->n_items) + idx = d->n_items; + + menu_assert_size(d, d->n_items + 1); + + if (idx < d->n_items) { + memmove(&d->items[idx + 1], &d->items[idx], (d->n_items - idx) * sizeof(d->items[0])); + } + + d->items[idx].flags = flags; + d->items[idx].action = action; + if (action == KHUI_MENU_SEP) + d->items[idx].flags |= KHUI_ACTIONREF_SEP; + + d->n_items++; +} + +KHMEXP void KHMAPI +khui_menu_insert_paction(khui_menu_def * d, khm_size idx, khui_action * paction, int flags) +{ + + if (paction == NULL) + return; + + if (!(d->state & KHUI_MENUSTATE_ALLOCD)) + menu_const_to_allocd(d); + + assert(d->state & KHUI_MENUSTATE_ALLOCD); + + if (idx < 0 || idx > d->n_items) + idx = d->n_items; + + menu_assert_size(d, d->n_items + 1); + + if (idx < d->n_items) { + memmove(&d->items[idx + 1], &d->items[idx], (d->n_items - idx) * sizeof(d->items[0])); + } + + d->items[idx].flags = flags | KHUI_ACTIONREF_PACTION; + d->items[idx].p_action = paction; + + d->n_items++; +} + +KHMEXP void KHMAPI +khui_menu_remove_action(khui_menu_def * d, khm_size idx) { + + assert(d->state & KHUI_MENUSTATE_ALLOCD); + + if (idx < 0 || idx >= d->n_items) + return; + + if (idx < d->n_items - 1) { + memmove(&d->items[idx], &d->items[idx + 1], + ((d->n_items - 1) - idx) * sizeof(d->items[0])); + } + + d->n_items--; +} + +KHMEXP khm_size KHMAPI +khui_menu_get_size(khui_menu_def * d) { + + if (d->state & KHUI_MENUSTATE_ALLOCD) + return d->n_items; + else + return khui_action_list_length(d->items); +} + +KHMEXP khui_action_ref * +khui_menu_get_action(khui_menu_def * d, khm_size idx) { + + khm_size n; + + if (d->state & KHUI_MENUSTATE_ALLOCD) + n = d->n_items; + else + n = khui_action_list_length(d->items); + + if (idx < 0 || idx >= n) + return NULL; + + return &d->items[idx]; +} + +KHMEXP khui_menu_def * KHMAPI +khui_find_menu(khm_int32 id) { + khui_menu_def * d; + int i; + + if (id < KHUI_USERACTION_BASE) { + d = khui_all_menus; + for(i=0;icmd == id) { + d = khui_cust_menus[i]; + break; + } + } + LeaveCriticalSection(&cs_actions); + + return d; + } +} + +KHMEXP khui_action * KHMAPI +khui_find_action(khm_int32 id) { + khui_action * act; + int i; + + act = khui_actions; + for(i=0;i= KHUI_USERACTION_BASE && + (id - KHUI_USERACTION_BASE) < khui_n_cust_actions) { + act = khui_cust_actions[id - KHUI_USERACTION_BASE]; +#ifdef DEBUG + assert(!act || act->cmd == id); +#endif + if (act && act->state & KHUI_ACTIONSTATE_DELETED) + act = NULL; + } + LeaveCriticalSection(&cs_actions); + + return act; +} + +KHMEXP khui_action * KHMAPI +khui_find_named_action(const wchar_t * name) { + int i; + khui_action * act; + khui_action ** pact; + + if(!name) + return NULL; + + act = khui_actions; + for(i=0;iname) + continue; + + if(!wcscmp(pact[i]->name, name)) { + if (pact[i]->state & KHUI_ACTIONSTATE_DELETED) + return NULL; + else + return pact[i]; + } + } + + return NULL; +} + +KHMEXP size_t KHMAPI +khui_action_list_length(khui_action_ref * ref) { + size_t c = 0; + while(ref && ref->action != KHUI_MENU_END && + !(ref->flags & KHUI_ACTIONREF_END)) { + c++; + ref++; + } + return c; +} + +KHMEXP void KHMAPI +khui_check_radio_action(khui_menu_def * d, khm_int32 cmd) +{ + khui_action_ref * r; + khui_action * act; + + r = d->items; + while(r && r->action != KHUI_MENU_END && + (!(d->state & KHUI_MENUSTATE_ALLOCD) || (r - d->items) < (int) d->n_items)) { + if(r->flags & KHUI_ACTIONREF_PACTION) { + act = r->p_action; + } else { + act = khui_find_action(r->action); + } + + if(act) { + if(act->cmd == cmd) + act->state |= KHUI_ACTIONSTATE_CHECKED; + else + act->state &= ~KHUI_ACTIONSTATE_CHECKED; + } + r++; + } + + kmq_post_message(KMSG_ACT, KMSG_ACT_CHECK, 0, 0); +} + +KHMEXP void KHMAPI +khui_check_action(khm_int32 cmd, khm_boolean check) { + khui_action * act; + + act = khui_find_action(cmd); + if (!act) + return; + + if (check && !(act->state & KHUI_ACTIONSTATE_CHECKED)) + act->state |= KHUI_ACTIONSTATE_CHECKED; + else if (!check && (act->state & KHUI_ACTIONSTATE_CHECKED)) + act->state &= ~KHUI_ACTIONSTATE_CHECKED; + else + return; + + kmq_post_message(KMSG_ACT, KMSG_ACT_CHECK, 0, 0); +} + +KHMEXP void KHMAPI +khui_enable_actions(khui_menu_def * d, khm_boolean enable) +{ + khui_action_ref * r; + int delta = FALSE; + khui_action * act; + + r = d->items; + while(r && r->action != KHUI_MENU_END && + (!(d->state & KHUI_MENUSTATE_ALLOCD) || (r - d->items) < (int) d->n_items)) { + if(r->flags & KHUI_ACTIONREF_PACTION) { + act = r->p_action; + } else { + act = khui_find_action(r->action); + } + + if(act) { + int old_state = act->state; + + if(enable) + act->state &= ~KHUI_ACTIONSTATE_DISABLED; + else + act->state |= KHUI_ACTIONSTATE_DISABLED; + + if(old_state != act->state) + delta = TRUE; + } + r++; + } + + if(delta) { + kmq_post_message(KMSG_ACT, KMSG_ACT_ENABLE, 0, 0); + } +} + +KHMEXP void KHMAPI +khui_enable_action(khm_int32 cmd, khm_boolean enable) { + khui_action * act; + + act = khui_find_action(cmd); + if (!act) + return; + + if (enable && (act->state & KHUI_ACTIONSTATE_DISABLED)) { + act->state &= ~KHUI_ACTIONSTATE_DISABLED; + } else if (!enable && !(act->state & KHUI_ACTIONSTATE_DISABLED)) { + act->state |= KHUI_ACTIONSTATE_DISABLED; + } else + return; + + kmq_post_message(KMSG_ACT, KMSG_ACT_ENABLE, 0, 0); +} + +KHMEXP HACCEL KHMAPI +khui_create_global_accel_table(void) { + int i; + ACCEL * accels; + HACCEL ha; + + accels = PMALLOC(sizeof(ACCEL) * khui_n_accel_global); + for(i=0;imod & FALT) { + if(FAILED(StringCbCat(buf, bufsiz, L"Alt+"))) + return FALSE; + } + + + if(def->mod & FCONTROL) { + if(FAILED(StringCbCat(buf, bufsiz, L"Ctrl+"))) + return FALSE; + } + + if(def->mod & FSHIFT) { + if(FAILED(StringCbCat(buf, bufsiz, L"Shift+"))) + return FALSE; + } + + if(def->mod & FVIRTKEY) { + wchar_t mbuf[6]; + wchar_t * ap = NULL; + switch(def->key) { + case VK_TAB: + ap = L"Tab"; + break; + + case VK_ESCAPE: + ap = L"Esc"; + break; + + case VK_RETURN: + ap = L"Enter"; + break; + + case VK_F1: + ap = L"F1"; + break; + + case VK_F2: + ap = L"F2"; + break; + + case VK_F3: + ap = L"F3"; + break; + + case VK_F4: + ap = L"F4"; + break; + + case VK_F5: + ap = L"F5"; + break; + + case VK_F6: + ap = L"F6"; + break; + + case VK_F7: + ap = L"F7"; + break; + + case VK_F8: + ap = L"F8"; + break; + + case VK_F9: + ap = L"F9"; + break; + + case VK_F10: + ap = L"F10"; + break; + + case VK_DELETE: + ap = L"Del"; + break; + + default: + if((def->key >= '0' && + def->key <= '9') || + (def->key >= 'A' && + def->key <= 'Z')) { + ap = mbuf; + mbuf[0] = (wchar_t) def->key; + mbuf[1] = L'\0'; + } + } + if(ap) { + if(FAILED(StringCbCat(buf, bufsiz, ap))) + return FALSE; + } + else { + if(FAILED(StringCbCat(buf, bufsiz,L"???"))) + return FALSE; + } + + } else { + wchar_t mbuf[2]; + + mbuf[0] = def->key; + mbuf[1] = L'\0'; + + if(FAILED(StringCbCat(buf, bufsiz, mbuf))) + return FALSE; + } + + return TRUE; +} + +/******************************************/ +/* contexts */ + +#define KHUI_ACTION_CONTEXT_MAGIC 0x39c49db5 + +static khm_int32 KHMAPI +khuiint_filter_selected(khm_handle cred, + khm_int32 vflags, + void * rock) { + khm_int32 flags; + if (KHM_SUCCEEDED(kcdb_cred_get_flags(cred, &flags)) && + (flags & KCDB_CRED_FLAG_SELECTED)) + return TRUE; + else + return FALSE; +} + +static void +khuiint_context_release(khui_action_context * ctx) { + ctx->scope = KHUI_SCOPE_NONE; + if (ctx->identity) + kcdb_identity_release(ctx->identity); + ctx->identity = NULL; + ctx->cred_type = KCDB_CREDTYPE_INVALID; + if (ctx->cred) + kcdb_cred_release(ctx->cred); + ctx->cred = NULL; + ctx->n_headers = 0; + if (ctx->credset) + kcdb_credset_flush(ctx->credset); + ctx->n_sel_creds = 0; + ctx->int_cb_used = 0; + ctx->vparam = NULL; + ctx->cb_vparam = 0; +} + +static void +khuiint_copy_context(khui_action_context * ctxdest, + const khui_action_context * ctxsrc) +{ + ctxdest->scope = ctxsrc->scope; + + if (ctxsrc->scope == KHUI_SCOPE_IDENT) { + ctxdest->identity = ctxsrc->identity; + kcdb_identity_hold(ctxsrc->identity); + } else if (ctxsrc->scope == KHUI_SCOPE_CREDTYPE) { + ctxdest->identity = ctxsrc->identity; + ctxdest->cred_type = ctxsrc->cred_type; + if (ctxsrc->identity != NULL) + kcdb_identity_hold(ctxsrc->identity); + } else if (ctxsrc->scope == KHUI_SCOPE_CRED) { + kcdb_cred_get_identity(ctxsrc->cred, &ctxdest->identity); + kcdb_cred_get_type(ctxsrc->cred, &ctxdest->cred_type); + ctxdest->cred = ctxsrc->cred; + kcdb_cred_hold(ctxsrc->cred); + } else if (ctxsrc->scope == KHUI_SCOPE_GROUP) { + khm_size cb_total; + int i; + + ctxdest->n_headers = ctxsrc->n_headers; + cb_total = 0; + for (i=0; i < (int) ctxsrc->n_headers; i++) { + cb_total += UBOUND32(ctxsrc->headers[i].cb_data); + } + + if (ctxdest->int_cb_buf < cb_total) { + + if (ctxdest->int_buf) + PFREE(ctxdest->int_buf); + + ctxdest->int_cb_buf = cb_total; + ctxdest->int_buf = PMALLOC(cb_total); + } + +#ifdef DEBUG + assert(ctxdest->int_buf || cb_total == 0); +#endif + ctxdest->int_cb_used = 0; + + for (i=0; i < (int) ctxsrc->n_headers; i++) { + ctxdest->headers[i].attr_id = ctxsrc->headers[i].attr_id; + ctxdest->headers[i].cb_data = ctxsrc->headers[i].cb_data; + if (ctxsrc->headers[i].cb_data > 0) { + ctxdest->headers[i].data = + BYTEOFFSET(ctxdest->int_buf, + ctxdest->int_cb_used); + memcpy(ctxdest->headers[i].data, + ctxsrc->headers[i].data, + ctxsrc->headers[i].cb_data); + ctxdest->int_cb_used += + UBOUND32(ctxsrc->headers[i].cb_data); + } else { + ctxdest->headers[i].data = NULL; + } + } + } + + if (ctxsrc->credset) { + + if (ctxdest->credset == NULL) + kcdb_credset_create(&ctxdest->credset); +#ifdef DEBUG + assert(ctxdest->credset != NULL); +#endif + + kcdb_credset_flush(ctxdest->credset); + + kcdb_credset_extract_filtered(ctxdest->credset, + ctxsrc->credset, + khuiint_filter_selected, + NULL); + + kcdb_credset_get_size(ctxdest->credset, + &ctxdest->n_sel_creds); + } else { + if (ctxdest->credset != NULL) + kcdb_credset_flush(ctxdest->credset); + ctxdest->n_sel_creds = 0; + } + + /* For now, we simply transfer the vparam buffer into the new + context. If we are copying, we also need to modify + khui_context_release() to free the allocated buffer */ +#if 0 + if (ctxsrc->vparam && ctxsrc->cb_vparam) { + ctxdest->vparam = PMALLOC(ctxsrc->cb_vparam); +#ifdef DEBUG + assert(ctxdest->vparam); +#endif + memcpy(ctxdest->vparam, ctxsrc->vparam, ctxsrc->cb_vparam); + ctxdest->cb_vparam = ctxsrc->cb_vparam; + } else { +#endif + ctxdest->vparam = ctxsrc->vparam; + ctxdest->cb_vparam = ctxsrc->cb_vparam; +#if 0 + } +#endif +} + +static void +khuiint_context_init(khui_action_context * ctx) { + ctx->magic = KHUI_ACTION_CONTEXT_MAGIC; + ctx->scope = KHUI_SCOPE_NONE; + ctx->identity = NULL; + ctx->cred_type = KCDB_CREDTYPE_INVALID; + ctx->cred = NULL; + ZeroMemory(ctx->headers, sizeof(ctx->headers)); + ctx->n_headers = 0; + ctx->credset = NULL; + ctx->n_sel_creds = 0; + ctx->int_buf = NULL; + ctx->int_cb_buf = 0; + ctx->int_cb_used = 0; + ctx->vparam = NULL; + ctx->cb_vparam = 0; +} + +khui_action_context khui_ctx = { + KHUI_ACTION_CONTEXT_MAGIC, + KHUI_SCOPE_NONE, + NULL, + KCDB_CREDTYPE_INVALID, + NULL, + { + {KCDB_ATTR_INVALID,NULL,0}, + {KCDB_ATTR_INVALID,NULL,0}, + {KCDB_ATTR_INVALID,NULL,0}, + {KCDB_ATTR_INVALID,NULL,0}, + {KCDB_ATTR_INVALID,NULL,0}, + {KCDB_ATTR_INVALID,NULL,0} + }, + 0, + NULL, + 0, + NULL, + 0, + 0, + NULL, + 0}; + +KHMEXP void KHMAPI +khui_context_create(khui_action_context * ctx, + khui_scope scope, + khm_handle identity, + khm_int32 cred_type, + khm_handle cred) +{ + khui_action_context tctx; + + khuiint_context_init(&tctx); + khuiint_context_init(ctx); + + tctx.scope = scope; + tctx.identity = identity; + tctx.cred_type = cred_type; + tctx.cred = cred; + + khuiint_copy_context(ctx, &tctx); +} + +KHMEXP void KHMAPI +khui_context_set(khui_scope scope, + khm_handle identity, + khm_int32 cred_type, + khm_handle cred, + khui_header *headers, + khm_size n_headers, + khm_handle cs_src) { + + khui_context_set_ex(scope, + identity, + cred_type, + cred, + headers, + n_headers, + cs_src, + NULL, + 0); +} + +KHMEXP void KHMAPI +khui_context_set_ex(khui_scope scope, + khm_handle identity, + khm_int32 cred_type, + khm_handle cred, + khui_header *headers, + khm_size n_headers, + khm_handle cs_src, + void * vparam, + khm_size cb_vparam) +{ + khui_action_context tctx; + + EnterCriticalSection(&cs_actions); + + khuiint_context_release(&khui_ctx); + + khuiint_context_init(&tctx); + + tctx.scope = scope; + tctx.identity = identity; + tctx.cred_type = cred_type; + tctx.cred = cred; + if (headers) { + tctx.n_headers = n_headers; + memcpy(tctx.headers, + headers, + sizeof(*headers) * n_headers); + } else { + tctx.n_headers = 0; + } + tctx.credset = cs_src; + tctx.n_sel_creds = 0; /* ignored */ + tctx.vparam = vparam; + tctx.cb_vparam = cb_vparam; + tctx.int_buf = NULL; + tctx.int_cb_buf = 0; + tctx.int_cb_used = 0; + + khuiint_copy_context(&khui_ctx, &tctx); + + khui_context_refresh(); + + LeaveCriticalSection(&cs_actions); +} + +KHMEXP void KHMAPI +khui_context_set_indirect(khui_action_context * ctx) +{ + EnterCriticalSection(&cs_actions); + + khuiint_context_release(&khui_ctx); + + khuiint_copy_context(&khui_ctx, ctx); + + khui_context_refresh(); + + LeaveCriticalSection(&cs_actions); +} + +KHMEXP void KHMAPI +khui_context_refresh(void) { + khm_int32 flags; + + EnterCriticalSection(&cs_actions); + if (khui_ctx.identity) { + /* an identity is selected */ + + if (KHM_SUCCEEDED(kcdb_identity_get_flags(khui_ctx.identity, + &flags)) && + (flags & KCDB_IDENT_FLAG_DEFAULT)) { + khui_check_action(KHUI_ACTION_SET_DEF_ID, TRUE); + khui_enable_action(KHUI_ACTION_SET_DEF_ID, FALSE); + } else { + khui_check_action(KHUI_ACTION_SET_DEF_ID, FALSE); + khui_enable_action(KHUI_ACTION_SET_DEF_ID, TRUE); + } + + khui_enable_action(KHUI_ACTION_PASSWD_ID, TRUE); + } else { + khui_check_action(KHUI_ACTION_SET_DEF_ID, FALSE); + khui_enable_action(KHUI_ACTION_SET_DEF_ID, FALSE); + khui_enable_action(KHUI_ACTION_PASSWD_ID, FALSE); + } + + if (khui_ctx.scope != KHUI_SCOPE_NONE) { + khui_enable_action(KHUI_ACTION_PROPERTIES, TRUE); + khui_enable_action(KHUI_ACTION_DESTROY_CRED, TRUE); + khui_enable_action(KHUI_ACTION_RENEW_CRED, TRUE); + } else { + khui_enable_action(KHUI_ACTION_PROPERTIES, FALSE); + khui_enable_action(KHUI_ACTION_DESTROY_CRED, FALSE); + khui_enable_action(KHUI_ACTION_RENEW_CRED, FALSE); + } + + LeaveCriticalSection(&cs_actions); + + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); +} + +KHMEXP void KHMAPI +khui_context_get(khui_action_context * ctx) +{ + EnterCriticalSection(&cs_actions); + + khuiint_context_init(ctx); + khuiint_copy_context(ctx, &khui_ctx); + + if (ctx->credset) { + kcdb_credset_seal(ctx->credset); + } + + LeaveCriticalSection(&cs_actions); +} + +KHMEXP void KHMAPI +khui_context_release(khui_action_context * ctx) +{ +#ifdef DEBUG + assert(ctx->magic == KHUI_ACTION_CONTEXT_MAGIC); +#endif + + khuiint_context_release(ctx); + if (ctx->credset) { + kcdb_credset_unseal(ctx->credset); + kcdb_credset_delete(ctx->credset); + } + ctx->credset = NULL; + if (ctx->int_buf) + PFREE(ctx->int_buf); + ctx->int_buf = NULL; +#if 0 + if (ctx->vparam && ctx->cb_vparam > 0) { + PFREE(ctx->vparam); + ctx->vparam = NULL; + } + ctx->cb_vparam = 0; +#else + ctx->vparam = 0; + ctx->cb_vparam = 0; +#endif +} + +KHMEXP void KHMAPI +khui_context_reset(void) +{ + EnterCriticalSection(&cs_actions); + + khuiint_context_release(&khui_ctx); + + khui_context_refresh(); + + LeaveCriticalSection(&cs_actions); +} + +KHMEXP khm_int32 KHMAPI +khui_context_cursor_filter(khm_handle cred, + khm_int32 flags, + void * rock) { + khui_action_context * ctx = (khui_action_context *) rock; + khm_int32 rv; + + if (ctx->scope == KHUI_SCOPE_NONE) + return 0; + else if (ctx->scope == KHUI_SCOPE_IDENT) { + khm_handle c_ident; + + if (KHM_FAILED(kcdb_cred_get_identity(cred, &c_ident))) + return 0; + + rv = (c_ident == ctx->identity); + + kcdb_identity_release(c_ident); + + return rv; + } else if (ctx->scope == KHUI_SCOPE_CREDTYPE) { + khm_handle c_ident; + khm_int32 c_type; + + if (KHM_FAILED(kcdb_cred_get_type(cred, &c_type)) || + c_type != ctx->cred_type) + return 0; + + if (ctx->identity == NULL) + return 1; + + if (KHM_FAILED(kcdb_cred_get_identity(cred, &c_ident))) + return 0; + + rv = (c_ident == ctx->identity); + + kcdb_identity_release(c_ident); + + return rv; + } else if (ctx->scope == KHUI_SCOPE_CRED) { + return kcdb_creds_is_equal(cred, ctx->cred); + } else if (ctx->scope == KHUI_SCOPE_GROUP) { + int i; + + rv = 1; + + for (i=0; i < (int) ctx->n_headers && rv; i++) { + kcdb_attrib * pattr; + kcdb_type * ptype; + DWORD buffer[1024]; /* 4096 bytes */ + khm_size cb; + + if (kcdb_cred_get_attr(cred, ctx->headers[i].attr_id, + NULL, + NULL, + &cb) != KHM_ERROR_TOO_LONG) { + /* the header doesn't exist anyway */ + rv = (ctx->headers[i].cb_data == 0); + continue; + } +#ifdef DEBUG + assert(cb <= sizeof(buffer)); +#endif + cb = sizeof(buffer); + + if (KHM_FAILED(kcdb_cred_get_attr(cred, + ctx->headers[i].attr_id, + NULL, + (void *) buffer, + &cb))) { + rv = 0; + continue; + } + + if (KHM_FAILED(kcdb_attrib_get_info(ctx->headers[i].attr_id, + &pattr))) { + rv = 0; + continue; + } + + if (KHM_FAILED(kcdb_type_get_info(pattr->type, &ptype))) { + rv = 0; + kcdb_attrib_release_info(pattr); + continue; + } + + if ((*ptype->comp)(ctx->headers[i].data, + ctx->headers[i].cb_data, + (void *) buffer, + cb) != 0) + rv = 1; + + kcdb_type_release_info(ptype); + kcdb_attrib_release_info(pattr); + } + + return rv; + } else + return 0; +} --- krb5-1.4.4.orig/src/windows/identity/uilib/propsheet.c +++ krb5-1.4.4/src/windows/identity/uilib/propsheet.c @@ -1,230 +1,230 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#ifdef DEBUG -#include -#endif - -CRITICAL_SECTION cs_props; - -void -ps_init(void) { - InitializeCriticalSection(&cs_props); -} - -void -ps_exit(void) { - DeleteCriticalSection(&cs_props); -} - -KHMEXP khm_int32 KHMAPI -khui_ps_create_sheet(khui_property_sheet ** sheet) -{ - khui_property_sheet * ps; - - ps = PMALLOC(sizeof(*ps)); - ZeroMemory(ps, sizeof(*ps)); - - ps->header.dwSize = sizeof(ps->header); - ps->header.dwFlags = PSH_MODELESS | PSH_PROPTITLE; - ps->status = KHUI_PS_STATUS_NONE; - - *sheet = ps; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_ps_add_page(khui_property_sheet * sheet, - khm_int32 credtype, - khm_int32 ordinal, - LPPROPSHEETPAGE ppage, - khui_property_page ** page) -{ - khui_property_page * p; - - p = PMALLOC(sizeof(*p)); - ZeroMemory(p, sizeof(*p)); - - p->credtype = credtype; - p->ordinal = ordinal; - p->p_page = ppage; - - EnterCriticalSection(&cs_props); - QPUT(sheet, p); - sheet->n_pages++; - LeaveCriticalSection(&cs_props); - - if(page) - *page = p; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_ps_find_page(khui_property_sheet * sheet, - khm_int32 credtype, - khui_property_page ** page) -{ - khui_property_page * p; - - EnterCriticalSection(&cs_props); - p = QTOP(sheet); - - while(p) { - if(p->credtype == credtype) - break; - p = QNEXT(p); - } - LeaveCriticalSection(&cs_props); - - if(p) { - *page = p; - return KHM_ERROR_SUCCESS; - } else { - *page = NULL; - return KHM_ERROR_NOT_FOUND; - } -} - -int __cdecl -ps_order_func(const void *l, const void * r) { - khui_property_page * lp; - khui_property_page * rp; - - lp = *(khui_property_page **)l; - rp = *(khui_property_page **)r; - - if (lp->ordinal == rp->ordinal) - return lp->credtype - rp->credtype; - else - return lp->ordinal - rp->ordinal; -} - -KHMEXP HWND KHMAPI -khui_ps_show_sheet(HWND parent, khui_property_sheet * s) -{ - khui_property_page * p; - HPROPSHEETPAGE phpsp[KHUI_PS_MAX_PSP]; - khui_property_page * ppgs[KHUI_PS_MAX_PSP]; - int i; - INT_PTR prv; - HWND hw; - - EnterCriticalSection(&cs_props); - - s->header.hwndParent = parent; - s->header.nPages = s->n_pages; - - p = QTOP(s); - i = 0; - while(p) { - p->h_page = CreatePropertySheetPage(p->p_page); -#ifdef DEBUG - assert(p->h_page); -#endif - ppgs[i++] = p; - p = QNEXT(p); - } - -#ifdef DEBUG - assert(i == s->n_pages); -#endif - - qsort(ppgs, s->n_pages, sizeof(ppgs[0]), ps_order_func); - - for (i=0; i < s->n_pages; i++) { - phpsp[i] = ppgs[i]->h_page; - } - - s->header.phpage = phpsp; - - prv = PropertySheet(&s->header); - - s->header.phpage = NULL; - - if(prv <= 0) { -#ifdef DEBUG - assert(FALSE); -#endif - /*TODO: better handling for this */ - hw = NULL; - } else { - s->status = KHUI_PS_STATUS_RUNNING; - - hw = (HWND) prv; - s->hwnd = hw; - s->hwnd_page = PropSheet_GetCurrentPageHwnd(hw); - } - LeaveCriticalSection(&cs_props); - - return hw; -} - -KHMEXP LRESULT KHMAPI -khui_ps_check_message(khui_property_sheet * sheet, - PMSG pmsg) -{ - LRESULT lr; - - if(sheet->hwnd == NULL) - return FALSE; - - lr = PropSheet_IsDialogMessage(sheet->hwnd, pmsg); - if(lr) { - sheet->hwnd_page = PropSheet_GetCurrentPageHwnd(sheet->hwnd); - if(sheet->hwnd_page == NULL && - sheet->status == KHUI_PS_STATUS_RUNNING) - - sheet->status = KHUI_PS_STATUS_DONE; - } - - return lr; -} - -KHMEXP khm_int32 KHMAPI -khui_ps_destroy_sheet(khui_property_sheet * sheet) -{ - khui_property_page * p; - - EnterCriticalSection(&cs_props); - - DestroyWindow(sheet->hwnd); - sheet->hwnd = NULL; - - QGET(sheet, &p); - while(p) { - PFREE(p); - QGET(sheet, &p); - } - PFREE(sheet); - - LeaveCriticalSection(&cs_props); - - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#ifdef DEBUG +#include +#endif + +CRITICAL_SECTION cs_props; + +void +ps_init(void) { + InitializeCriticalSection(&cs_props); +} + +void +ps_exit(void) { + DeleteCriticalSection(&cs_props); +} + +KHMEXP khm_int32 KHMAPI +khui_ps_create_sheet(khui_property_sheet ** sheet) +{ + khui_property_sheet * ps; + + ps = PMALLOC(sizeof(*ps)); + ZeroMemory(ps, sizeof(*ps)); + + ps->header.dwSize = sizeof(ps->header); + ps->header.dwFlags = PSH_MODELESS | PSH_PROPTITLE; + ps->status = KHUI_PS_STATUS_NONE; + + *sheet = ps; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_ps_add_page(khui_property_sheet * sheet, + khm_int32 credtype, + khm_int32 ordinal, + LPPROPSHEETPAGE ppage, + khui_property_page ** page) +{ + khui_property_page * p; + + p = PMALLOC(sizeof(*p)); + ZeroMemory(p, sizeof(*p)); + + p->credtype = credtype; + p->ordinal = ordinal; + p->p_page = ppage; + + EnterCriticalSection(&cs_props); + QPUT(sheet, p); + sheet->n_pages++; + LeaveCriticalSection(&cs_props); + + if(page) + *page = p; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_ps_find_page(khui_property_sheet * sheet, + khm_int32 credtype, + khui_property_page ** page) +{ + khui_property_page * p; + + EnterCriticalSection(&cs_props); + p = QTOP(sheet); + + while(p) { + if(p->credtype == credtype) + break; + p = QNEXT(p); + } + LeaveCriticalSection(&cs_props); + + if(p) { + *page = p; + return KHM_ERROR_SUCCESS; + } else { + *page = NULL; + return KHM_ERROR_NOT_FOUND; + } +} + +int __cdecl +ps_order_func(const void *l, const void * r) { + khui_property_page * lp; + khui_property_page * rp; + + lp = *(khui_property_page **)l; + rp = *(khui_property_page **)r; + + if (lp->ordinal == rp->ordinal) + return lp->credtype - rp->credtype; + else + return lp->ordinal - rp->ordinal; +} + +KHMEXP HWND KHMAPI +khui_ps_show_sheet(HWND parent, khui_property_sheet * s) +{ + khui_property_page * p; + HPROPSHEETPAGE phpsp[KHUI_PS_MAX_PSP]; + khui_property_page * ppgs[KHUI_PS_MAX_PSP]; + int i; + INT_PTR prv; + HWND hw; + + EnterCriticalSection(&cs_props); + + s->header.hwndParent = parent; + s->header.nPages = s->n_pages; + + p = QTOP(s); + i = 0; + while(p) { + p->h_page = CreatePropertySheetPage(p->p_page); +#ifdef DEBUG + assert(p->h_page); +#endif + ppgs[i++] = p; + p = QNEXT(p); + } + +#ifdef DEBUG + assert(i == s->n_pages); +#endif + + qsort(ppgs, s->n_pages, sizeof(ppgs[0]), ps_order_func); + + for (i=0; i < s->n_pages; i++) { + phpsp[i] = ppgs[i]->h_page; + } + + s->header.phpage = phpsp; + + prv = PropertySheet(&s->header); + + s->header.phpage = NULL; + + if(prv <= 0) { +#ifdef DEBUG + assert(FALSE); +#endif + /*TODO: better handling for this */ + hw = NULL; + } else { + s->status = KHUI_PS_STATUS_RUNNING; + + hw = (HWND) prv; + s->hwnd = hw; + s->hwnd_page = PropSheet_GetCurrentPageHwnd(hw); + } + LeaveCriticalSection(&cs_props); + + return hw; +} + +KHMEXP LRESULT KHMAPI +khui_ps_check_message(khui_property_sheet * sheet, + PMSG pmsg) +{ + LRESULT lr; + + if(sheet->hwnd == NULL) + return FALSE; + + lr = PropSheet_IsDialogMessage(sheet->hwnd, pmsg); + if(lr) { + sheet->hwnd_page = PropSheet_GetCurrentPageHwnd(sheet->hwnd); + if(sheet->hwnd_page == NULL && + sheet->status == KHUI_PS_STATUS_RUNNING) + + sheet->status = KHUI_PS_STATUS_DONE; + } + + return lr; +} + +KHMEXP khm_int32 KHMAPI +khui_ps_destroy_sheet(khui_property_sheet * sheet) +{ + khui_property_page * p; + + EnterCriticalSection(&cs_props); + + DestroyWindow(sheet->hwnd); + sheet->hwnd = NULL; + + QGET(sheet, &p); + while(p) { + PFREE(p); + QGET(sheet, &p); + } + PFREE(sheet); + + LeaveCriticalSection(&cs_props); + + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/uilib/khactiondef.h +++ krb5-1.4.4/src/windows/identity/uilib/khactiondef.h @@ -1,160 +1,160 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_ACTIONDEF_H -#define __KHIMAIRA_ACTIONDEF_H - -/*! \ingroup khui_actions - @{*/ -/*! \defgroup khui_std_actions Standard Actions -@{ */ - -/*!\name Standard actions - @{*/ -#define KHUI_ACTION_BASE 50000 - -#define KHUI_ACTION_PROPERTIES (KHUI_ACTION_BASE + 0) -#define KHUI_ACTION_EXIT (KHUI_ACTION_BASE + 1) -#define KHUI_ACTION_SET_DEF_ID (KHUI_ACTION_BASE + 3) -#define KHUI_ACTION_SET_SRCH_ID (KHUI_ACTION_BASE + 4) -#define KHUI_ACTION_PASSWD_ID (KHUI_ACTION_BASE + 7) -#define KHUI_ACTION_NEW_CRED (KHUI_ACTION_BASE + 8) -#define KHUI_ACTION_DEBUG_WINDOW (KHUI_ACTION_BASE + 10) -#define KHUI_ACTION_VIEW_REFRESH (KHUI_ACTION_BASE + 11) -#define KHUI_ACTION_LAYOUT_ID (KHUI_ACTION_BASE + 12) -#define KHUI_ACTION_LAYOUT_TYPE (KHUI_ACTION_BASE + 13) -#define KHUI_ACTION_LAYOUT_LOC (KHUI_ACTION_BASE + 14) -#define KHUI_ACTION_TB_STANDARD (KHUI_ACTION_BASE + 15) -#define KHUI_ACTION_OPT_KHIM (KHUI_ACTION_BASE + 16) -#define KHUI_ACTION_OPT_IDENTS (KHUI_ACTION_BASE + 17) -#define KHUI_ACTION_OPT_NOTIF (KHUI_ACTION_BASE + 18) -#define KHUI_ACTION_HELP_CTX (KHUI_ACTION_BASE + 19) -#define KHUI_ACTION_HELP_CONTENTS (KHUI_ACTION_BASE + 20) -#define KHUI_ACTION_HELP_INDEX (KHUI_ACTION_BASE + 21) -#define KHUI_ACTION_HELP_ABOUT (KHUI_ACTION_BASE + 22) -#define KHUI_ACTION_DESTROY_CRED (KHUI_ACTION_BASE + 23) -#define KHUI_ACTION_RENEW_CRED (KHUI_ACTION_BASE + 24) -#define KHUI_ACTION_OPEN_APP (KHUI_ACTION_BASE + 25) -#define KHUI_ACTION_MENU_ACTIVATE (KHUI_ACTION_BASE + 26) -#define KHUI_ACTION_CLOSE_APP (KHUI_ACTION_BASE + 27) -#define KHUI_ACTION_IMPORT (KHUI_ACTION_BASE + 28) -#define KHUI_ACTION_OPT_PLUGINS (KHUI_ACTION_BASE + 29) -#define KHUI_ACTION_LAYOUT_CUST (KHUI_ACTION_BASE + 30) -#define KHUI_ACTION_OPT_APPEAR (KHUI_ACTION_BASE + 31) -#define KHUI_ACTION_LAYOUT_RELOAD (KHUI_ACTION_BASE + 32) -/*@}*/ - -/*! \name Pseudo actions - -Pseudo actions do not trigger any specific function, but acts as a -signal of some generic event which will be interpreted based on -context. - -@{*/ -#define KHUI_PACTION_BASE (KHUI_ACTION_BASE + 500) - -#define KHUI_PACTION_MENU (KHUI_PACTION_BASE + 0) -#define KHUI_PACTION_UP (KHUI_PACTION_BASE + 1) -#define KHUI_PACTION_DOWN (KHUI_PACTION_BASE + 2) -#define KHUI_PACTION_LEFT (KHUI_PACTION_BASE + 3) -#define KHUI_PACTION_RIGHT (KHUI_PACTION_BASE + 4) -#define KHUI_PACTION_ENTER (KHUI_PACTION_BASE + 5) -#define KHUI_PACTION_ESC (KHUI_PACTION_BASE + 6) -#define KHUI_PACTION_OK (KHUI_PACTION_BASE + 7) -#define KHUI_PACTION_CANCEL (KHUI_PACTION_BASE + 8) -#define KHUI_PACTION_CLOSE (KHUI_PACTION_BASE + 9) -#define KHUI_PACTION_DELETE (KHUI_PACTION_BASE + 10) -#define KHUI_PACTION_UP_EXTEND (KHUI_PACTION_BASE + 11) -#define KHUI_PACTION_UP_TOGGLE (KHUI_PACTION_BASE + 12) -#define KHUI_PACTION_DOWN_EXTEND (KHUI_PACTION_BASE + 13) -#define KHUI_PACTION_DOWN_TOGGLE (KHUI_PACTION_BASE + 14) -#define KHUI_PACTION_BLANK (KHUI_PACTION_BASE + 15) -#define KHUI_PACTION_NEXT (KHUI_PACTION_BASE + 16) -#define KHUI_PACTION_SELALL (KHUI_PACTION_BASE + 17) -#define KHUI_PACTION_YES (KHUI_PACTION_BASE + 18) -#define KHUI_PACTION_NO (KHUI_PACTION_BASE + 19) -#define KHUI_PACTION_YESALL (KHUI_PACTION_BASE + 20) -#define KHUI_PACTION_NOALL (KHUI_PACTION_BASE + 21) -#define KHUI_PACTION_REMOVE (KHUI_PACTION_BASE + 22) -#define KHUI_PACTION_KEEP (KHUI_PACTION_BASE + 23) -#define KHUI_PACTION_DISCARD (KHUI_PACTION_BASE + 24) -#define KHUI_PACTION_PGDN (KHUI_PACTION_BASE + 25) -#define KHUI_PACTION_PGUP (KHUI_PACTION_BASE + 26) -#define KHUI_PACTION_PGUP_EXTEND (KHUI_PACTION_BASE + 27) -#define KHUI_PACTION_PGDN_EXTEND (KHUI_PACTION_BASE + 28) -/*@}*/ - -/*! \name Menus - -Stock menus. - -@{*/ -#define KHUI_MENU_BASE (KHUI_ACTION_BASE + 1000) - -#define KHUI_MENU_MAIN (KHUI_MENU_BASE + 0) -#define KHUI_MENU_FILE (KHUI_MENU_BASE + 1) -#define KHUI_MENU_CRED (KHUI_MENU_BASE + 2) -#define KHUI_MENU_VIEW (KHUI_MENU_BASE + 3) -#define KHUI_MENU_OPTIONS (KHUI_MENU_BASE + 4) -#define KHUI_MENU_HELP (KHUI_MENU_BASE + 5) - -#define KHUI_MENU_LAYOUT (KHUI_MENU_BASE + 6) -#define KHUI_MENU_TOOLBARS (KHUI_MENU_BASE + 7) - -#define KHUI_MENU_IDENT_CTX (KHUI_MENU_BASE + 8) -#define KHUI_MENU_TOK_CTX (KHUI_MENU_BASE + 9) -#define KHUI_MENU_ICO_CTX_MIN (KHUI_MENU_BASE + 12) -#define KHUI_MENU_ICO_CTX_NORMAL (KHUI_MENU_BASE + 13) -#define KHUI_MENU_CWHEADER_CTX (KHUI_MENU_BASE + 14) - -#define KHUI_MENU_COLUMNS (KHUI_MENU_BASE + 15) - -#define KHUI_PMENU_TOK_SEL (KHUI_MENU_BASE + 10) -#define KHUI_PMENU_ID_SEL (KHUI_MENU_BASE + 11) - -/* Next menu: 14 */ -/*@}*/ - -/*! \name Toolbars -@{*/ -#define KHUI_TOOLBAR_BASE (KHUI_ACTION_BASE + 2000) - -#define KHUI_TOOLBAR_STANDARD (KHUI_TOOLBAR_BASE + 0) -/*@}*/ - -/*! \brief Base for user actions - - When creating new actions, the UI library will allocate command - identifiers starting with this one. -*/ -#define KHUI_USERACTION_BASE (KHUI_ACTION_BASE + 10000) - -/*! \brief Does this command represent a user action? */ -#define IS_USERACTION(cmd) ((cmd) >= KHUI_USERACTION_BASE) -/*@}*/ -/*@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_ACTIONDEF_H +#define __KHIMAIRA_ACTIONDEF_H + +/*! \ingroup khui_actions + @{*/ +/*! \defgroup khui_std_actions Standard Actions +@{ */ + +/*!\name Standard actions + @{*/ +#define KHUI_ACTION_BASE 50000 + +#define KHUI_ACTION_PROPERTIES (KHUI_ACTION_BASE + 0) +#define KHUI_ACTION_EXIT (KHUI_ACTION_BASE + 1) +#define KHUI_ACTION_SET_DEF_ID (KHUI_ACTION_BASE + 3) +#define KHUI_ACTION_SET_SRCH_ID (KHUI_ACTION_BASE + 4) +#define KHUI_ACTION_PASSWD_ID (KHUI_ACTION_BASE + 7) +#define KHUI_ACTION_NEW_CRED (KHUI_ACTION_BASE + 8) +#define KHUI_ACTION_DEBUG_WINDOW (KHUI_ACTION_BASE + 10) +#define KHUI_ACTION_VIEW_REFRESH (KHUI_ACTION_BASE + 11) +#define KHUI_ACTION_LAYOUT_ID (KHUI_ACTION_BASE + 12) +#define KHUI_ACTION_LAYOUT_TYPE (KHUI_ACTION_BASE + 13) +#define KHUI_ACTION_LAYOUT_LOC (KHUI_ACTION_BASE + 14) +#define KHUI_ACTION_TB_STANDARD (KHUI_ACTION_BASE + 15) +#define KHUI_ACTION_OPT_KHIM (KHUI_ACTION_BASE + 16) +#define KHUI_ACTION_OPT_IDENTS (KHUI_ACTION_BASE + 17) +#define KHUI_ACTION_OPT_NOTIF (KHUI_ACTION_BASE + 18) +#define KHUI_ACTION_HELP_CTX (KHUI_ACTION_BASE + 19) +#define KHUI_ACTION_HELP_CONTENTS (KHUI_ACTION_BASE + 20) +#define KHUI_ACTION_HELP_INDEX (KHUI_ACTION_BASE + 21) +#define KHUI_ACTION_HELP_ABOUT (KHUI_ACTION_BASE + 22) +#define KHUI_ACTION_DESTROY_CRED (KHUI_ACTION_BASE + 23) +#define KHUI_ACTION_RENEW_CRED (KHUI_ACTION_BASE + 24) +#define KHUI_ACTION_OPEN_APP (KHUI_ACTION_BASE + 25) +#define KHUI_ACTION_MENU_ACTIVATE (KHUI_ACTION_BASE + 26) +#define KHUI_ACTION_CLOSE_APP (KHUI_ACTION_BASE + 27) +#define KHUI_ACTION_IMPORT (KHUI_ACTION_BASE + 28) +#define KHUI_ACTION_OPT_PLUGINS (KHUI_ACTION_BASE + 29) +#define KHUI_ACTION_LAYOUT_CUST (KHUI_ACTION_BASE + 30) +#define KHUI_ACTION_OPT_APPEAR (KHUI_ACTION_BASE + 31) +#define KHUI_ACTION_LAYOUT_RELOAD (KHUI_ACTION_BASE + 32) +/*@}*/ + +/*! \name Pseudo actions + +Pseudo actions do not trigger any specific function, but acts as a +signal of some generic event which will be interpreted based on +context. + +@{*/ +#define KHUI_PACTION_BASE (KHUI_ACTION_BASE + 500) + +#define KHUI_PACTION_MENU (KHUI_PACTION_BASE + 0) +#define KHUI_PACTION_UP (KHUI_PACTION_BASE + 1) +#define KHUI_PACTION_DOWN (KHUI_PACTION_BASE + 2) +#define KHUI_PACTION_LEFT (KHUI_PACTION_BASE + 3) +#define KHUI_PACTION_RIGHT (KHUI_PACTION_BASE + 4) +#define KHUI_PACTION_ENTER (KHUI_PACTION_BASE + 5) +#define KHUI_PACTION_ESC (KHUI_PACTION_BASE + 6) +#define KHUI_PACTION_OK (KHUI_PACTION_BASE + 7) +#define KHUI_PACTION_CANCEL (KHUI_PACTION_BASE + 8) +#define KHUI_PACTION_CLOSE (KHUI_PACTION_BASE + 9) +#define KHUI_PACTION_DELETE (KHUI_PACTION_BASE + 10) +#define KHUI_PACTION_UP_EXTEND (KHUI_PACTION_BASE + 11) +#define KHUI_PACTION_UP_TOGGLE (KHUI_PACTION_BASE + 12) +#define KHUI_PACTION_DOWN_EXTEND (KHUI_PACTION_BASE + 13) +#define KHUI_PACTION_DOWN_TOGGLE (KHUI_PACTION_BASE + 14) +#define KHUI_PACTION_BLANK (KHUI_PACTION_BASE + 15) +#define KHUI_PACTION_NEXT (KHUI_PACTION_BASE + 16) +#define KHUI_PACTION_SELALL (KHUI_PACTION_BASE + 17) +#define KHUI_PACTION_YES (KHUI_PACTION_BASE + 18) +#define KHUI_PACTION_NO (KHUI_PACTION_BASE + 19) +#define KHUI_PACTION_YESALL (KHUI_PACTION_BASE + 20) +#define KHUI_PACTION_NOALL (KHUI_PACTION_BASE + 21) +#define KHUI_PACTION_REMOVE (KHUI_PACTION_BASE + 22) +#define KHUI_PACTION_KEEP (KHUI_PACTION_BASE + 23) +#define KHUI_PACTION_DISCARD (KHUI_PACTION_BASE + 24) +#define KHUI_PACTION_PGDN (KHUI_PACTION_BASE + 25) +#define KHUI_PACTION_PGUP (KHUI_PACTION_BASE + 26) +#define KHUI_PACTION_PGUP_EXTEND (KHUI_PACTION_BASE + 27) +#define KHUI_PACTION_PGDN_EXTEND (KHUI_PACTION_BASE + 28) +/*@}*/ + +/*! \name Menus + +Stock menus. + +@{*/ +#define KHUI_MENU_BASE (KHUI_ACTION_BASE + 1000) + +#define KHUI_MENU_MAIN (KHUI_MENU_BASE + 0) +#define KHUI_MENU_FILE (KHUI_MENU_BASE + 1) +#define KHUI_MENU_CRED (KHUI_MENU_BASE + 2) +#define KHUI_MENU_VIEW (KHUI_MENU_BASE + 3) +#define KHUI_MENU_OPTIONS (KHUI_MENU_BASE + 4) +#define KHUI_MENU_HELP (KHUI_MENU_BASE + 5) + +#define KHUI_MENU_LAYOUT (KHUI_MENU_BASE + 6) +#define KHUI_MENU_TOOLBARS (KHUI_MENU_BASE + 7) + +#define KHUI_MENU_IDENT_CTX (KHUI_MENU_BASE + 8) +#define KHUI_MENU_TOK_CTX (KHUI_MENU_BASE + 9) +#define KHUI_MENU_ICO_CTX_MIN (KHUI_MENU_BASE + 12) +#define KHUI_MENU_ICO_CTX_NORMAL (KHUI_MENU_BASE + 13) +#define KHUI_MENU_CWHEADER_CTX (KHUI_MENU_BASE + 14) + +#define KHUI_MENU_COLUMNS (KHUI_MENU_BASE + 15) + +#define KHUI_PMENU_TOK_SEL (KHUI_MENU_BASE + 10) +#define KHUI_PMENU_ID_SEL (KHUI_MENU_BASE + 11) + +/* Next menu: 14 */ +/*@}*/ + +/*! \name Toolbars +@{*/ +#define KHUI_TOOLBAR_BASE (KHUI_ACTION_BASE + 2000) + +#define KHUI_TOOLBAR_STANDARD (KHUI_TOOLBAR_BASE + 0) +/*@}*/ + +/*! \brief Base for user actions + + When creating new actions, the UI library will allocate command + identifiers starting with this one. +*/ +#define KHUI_USERACTION_BASE (KHUI_ACTION_BASE + 10000) + +/*! \brief Does this command represent a user action? */ +#define IS_USERACTION(cmd) ((cmd) >= KHUI_USERACTION_BASE) +/*@}*/ +/*@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/uilib/configui.c +++ krb5-1.4.4/src/windows/identity/uilib/configui.c @@ -1,1080 +1,1080 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include -#include -#include - -#include - -khm_int32 cfgui_node_serial; -LONG init_once = 0; -CRITICAL_SECTION cs_cfgui; -khui_config_node_i * cfgui_root_config; -HWND hwnd_cfgui = NULL; - -static khui_config_node_i * -cfgui_create_new_node(void) { - khui_config_node_i * node; - - node = PMALLOC(sizeof(*node)); -#ifdef DEBUG - assert(node); -#endif - ZeroMemory(node, sizeof(*node)); - node->magic = KHUI_CONFIG_NODE_MAGIC; - - EnterCriticalSection(&cs_cfgui); - node->id = ++cfgui_node_serial; - LeaveCriticalSection(&cs_cfgui); - - return node; -} - -/* called with cs_cfgui held */ -static void -cfgui_free_node(khui_config_node_i * node) { - if (!cfgui_is_valid_node(node)) - return; - - if (node->reg.name) - PFREE((void *) node->reg.name); - - if (node->reg.short_desc) - PFREE((void *) node->reg.short_desc); - - if (node->reg.long_desc) - PFREE((void *) node->reg.long_desc); - - node->magic = 0; - - if (node->owner) - kmm_release_plugin(node->owner); - - ZeroMemory(node, sizeof(*node)); - - PFREE(node); -} - - -static void -cfgui_hold_node(khui_config_node_i * node) { - EnterCriticalSection(&cs_cfgui); - node->refcount++; - LeaveCriticalSection(&cs_cfgui); -} - - -static void -cfgui_release_node(khui_config_node_i * node) { - EnterCriticalSection(&cs_cfgui); - node->refcount--; - if (node->refcount == 0 && - (node->flags & KHUI_CN_FLAG_DELETED)) { - khui_config_node_i * parent; - parent = TPARENT(node); -#ifdef DEBUG - assert(TFIRSTCHILD(node) == NULL); - assert(parent != NULL); -#endif - TDELCHILD(parent, node); - cfgui_free_node(node); - cfgui_release_node(parent); - } - LeaveCriticalSection(&cs_cfgui); -} - -static void -cfgui_init_once(void) { - if (init_once == 0 && - InterlockedIncrement(&init_once) == 1) { - InitializeCriticalSection(&cs_cfgui); - cfgui_root_config = cfgui_create_new_node(); - cfgui_node_serial = 0; - hwnd_cfgui = NULL; - } -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_register(khui_config_node vparent, - const khui_config_node_reg * reg) { - - size_t cb_name; - size_t cb_short_desc; - size_t cb_long_desc; - khui_config_node_i * node; - khui_config_node_i * parent; - khui_config_node t; - wchar_t * name; - wchar_t * short_desc; - wchar_t * long_desc; - - cfgui_init_once(); - - if (!reg || - FAILED(StringCbLength(reg->name, - KHUI_MAXCB_NAME, - &cb_name)) || - FAILED(StringCbLength(reg->short_desc, - KHUI_MAXCB_SHORT_DESC, - &cb_short_desc)) || - FAILED(StringCbLength(reg->long_desc, - KHUI_MAXCB_LONG_DESC, - &cb_long_desc)) || - (vparent && - !cfgui_is_valid_node_handle(vparent))) - return KHM_ERROR_INVALID_PARAM; - - if (KHM_SUCCEEDED(khui_cfg_open(vparent, - reg->name, - &t))) { - khui_cfg_release(t); - return KHM_ERROR_DUPLICATE; - } - - cb_name += sizeof(wchar_t); - cb_short_desc += sizeof(wchar_t); - cb_long_desc += sizeof(wchar_t); - - node = cfgui_create_new_node(); - - node->reg = *reg; - node->reg.flags &= KHUI_CNFLAGMASK_STATIC; - - name = PMALLOC(cb_name); - StringCbCopy(name, cb_name, reg->name); - short_desc = PMALLOC(cb_short_desc); - StringCbCopy(short_desc, cb_short_desc, reg->short_desc); - long_desc = PMALLOC(cb_long_desc); - StringCbCopy(long_desc, cb_long_desc, reg->long_desc); - - node->reg.name = name; - node->reg.short_desc = short_desc; - node->reg.long_desc = long_desc; - node->flags = node->reg.flags; - - if (vparent == NULL) { - parent = cfgui_root_config; - } else { - parent = cfgui_node_i_from_handle(vparent); - } - - /* plugin handles should not be obtained lightly. For the moment, - the cleanup of nodes doesn't happen until module unload and - module unload doesn't happen until all the plugin and module - handles have been freed. */ - /* node->owner = kmm_this_plugin(); */ - - EnterCriticalSection(&cs_cfgui); - TADDCHILD(parent, node); - - if (hwnd_cfgui) { - SendMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(0, WMCFG_SYNC_NODE_LIST), 0); - } - - LeaveCriticalSection(&cs_cfgui); - - /* when the root config list changes, we need to notify the UI. - this way, the Options menu can be kept in sync. */ - if (parent == cfgui_root_config) { - kmq_post_message(KMSG_ACT, KMSG_ACT_SYNC_CFG, 0, 0); - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_open(khui_config_node vparent, - const wchar_t * name, - khui_config_node * result) { - khui_config_node_i * parent; - khui_config_node_i * c; - size_t sz; - - cfgui_init_once(); - - if ((vparent && - !cfgui_is_valid_node_handle(vparent)) || - FAILED(StringCbLength(name, KHUI_MAXCCH_NAME, &sz)) || - !result) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (vparent) - parent = cfgui_node_i_from_handle(vparent); - else - parent = cfgui_root_config; - - c = TFIRSTCHILD(parent); - while(c) { - if (!(c->flags & KHUI_CN_FLAG_DELETED) && - !wcscmp(c->reg.name, name)) - break; - c = LNEXT(c); - } - - if (c) { - *result = cfgui_handle_from_node_i(c); - cfgui_hold_node(c); - } else { - *result = NULL; - } - LeaveCriticalSection(&cs_cfgui); - - if (*result) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_remove(khui_config_node vnode) { - khui_config_node_i * node; - if (!cfgui_is_valid_node_handle(vnode)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - node = cfgui_node_i_from_handle(vnode); - node->flags |= KHUI_CN_FLAG_DELETED; - - if (hwnd_cfgui) { - SendMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(0, WMCFG_SYNC_NODE_LIST), 0); - } - - LeaveCriticalSection(&cs_cfgui); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_hold(khui_config_node vnode) { - if (!cfgui_is_valid_node_handle(vnode)) - return KHM_ERROR_INVALID_PARAM; - - cfgui_hold_node(cfgui_node_i_from_handle(vnode)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_release(khui_config_node vnode) { - if (!cfgui_is_valid_node_handle(vnode)) - return KHM_ERROR_INVALID_PARAM; - - cfgui_release_node(cfgui_node_i_from_handle(vnode)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_parent(khui_config_node vnode, - khui_config_node * result) { - - khui_config_node_i * node; - khui_config_node_i * parent; - - if(!cfgui_is_valid_node_handle(vnode) || - !result) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) { - node = cfgui_node_i_from_handle(vnode); - parent = TPARENT(node); - if (parent == cfgui_root_config) - parent = NULL; - } else { - parent = NULL; - } - if (parent) { - cfgui_hold_node(parent); - } - LeaveCriticalSection(&cs_cfgui); - - *result = parent; - - if (parent) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_first_child(khui_config_node vparent, - khui_config_node * result) { - khui_config_node_i * parent; - khui_config_node_i * c; - - cfgui_init_once(); - - if((vparent && !cfgui_is_valid_node_handle(vparent)) || - !result) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vparent)) { - parent = cfgui_node_i_from_handle(vparent); - } else if (!vparent) { - parent = cfgui_root_config; - } else { - parent = NULL; - } - - if (parent) { - for(c = TFIRSTCHILD(parent); - c && (c->reg.flags & KHUI_CNFLAG_SUBPANEL); - c = LNEXT(c)); - } else { - c = NULL; - } - - if (c) - cfgui_hold_node(c); - LeaveCriticalSection(&cs_cfgui); - - *result = c; - - if (c) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_first_subpanel(khui_config_node vparent, - khui_config_node * result) { - khui_config_node_i * parent; - khui_config_node_i * c; - - cfgui_init_once(); - - if((vparent && !cfgui_is_valid_node_handle(vparent)) || - !result) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vparent)) { - parent = cfgui_node_i_from_handle(vparent); - } else if (!vparent) { - parent = cfgui_root_config; - } else { - parent = NULL; - } - - if (parent) { - for(c = TFIRSTCHILD(parent); - c && !(c->reg.flags & KHUI_CNFLAG_SUBPANEL); - c = LNEXT(c)); - } else { - c = NULL; - } - - if (c) - cfgui_hold_node(c); - LeaveCriticalSection(&cs_cfgui); - - *result = c; - - if (c) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_next(khui_config_node vnode, - khui_config_node * result) { - - khui_config_node_i * node; - khui_config_node_i * nxt_node; - - if (!cfgui_is_valid_node_handle(vnode) || - !result) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) { - node = cfgui_node_i_from_handle(vnode); - for(nxt_node = LNEXT(node); - nxt_node && - ((node->reg.flags ^ nxt_node->reg.flags) & - KHUI_CNFLAG_SUBPANEL); - nxt_node = LNEXT(nxt_node)); - if (nxt_node) - cfgui_hold_node(nxt_node); - } else { - nxt_node = NULL; - } - LeaveCriticalSection(&cs_cfgui); - - *result = cfgui_handle_from_node_i(nxt_node); - - if (nxt_node) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_next_release(khui_config_node * pvnode) { - - khui_config_node_i * node; - khui_config_node_i * nxt_node; - - if (!pvnode || - !cfgui_is_valid_node_handle(*pvnode)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(*pvnode)) { - node = cfgui_node_i_from_handle(*pvnode); - for(nxt_node = LNEXT(node); - nxt_node && - ((node->reg.flags ^ nxt_node->reg.flags) & - KHUI_CNFLAG_SUBPANEL); - nxt_node = LNEXT(nxt_node)); - if (nxt_node) - cfgui_hold_node(nxt_node); - cfgui_release_node(node); - } else { - nxt_node = NULL; - } - LeaveCriticalSection(&cs_cfgui); - - *pvnode = cfgui_handle_from_node_i(nxt_node); - - if (nxt_node) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_reg(khui_config_node vnode, - khui_config_node_reg * reg) { - - khui_config_node_i * node; - - cfgui_init_once(); - - if ((vnode && !cfgui_is_valid_node_handle(vnode)) || - !reg) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) { - node = cfgui_node_i_from_handle(vnode); - *reg = node->reg; - } else if (!vnode) { - node = cfgui_root_config; - *reg = node->reg; - } else { - node = NULL; - ZeroMemory(reg, sizeof(*reg)); - } - LeaveCriticalSection(&cs_cfgui); - - if (node) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_INVALID_PARAM; -} - -KHMEXP HWND KHMAPI -khui_cfg_get_hwnd(khui_config_node vnode) { - khui_config_node_i * node; - HWND hwnd; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return NULL; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) - hwnd = node->hwnd; - else - hwnd = NULL; - LeaveCriticalSection(&cs_cfgui); - - return hwnd; -} - -KHMEXP LPARAM KHMAPI -khui_cfg_get_param(khui_config_node vnode) { - khui_config_node_i * node; - LPARAM param; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return 0; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) - param = node->param; - else - param = 0; - LeaveCriticalSection(&cs_cfgui); - - return param; -} - -KHMEXP void KHMAPI -khui_cfg_set_hwnd(khui_config_node vnode, HWND hwnd) { - khui_config_node_i * node; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) - node->hwnd = hwnd; - LeaveCriticalSection(&cs_cfgui); -} - -KHMEXP void KHMAPI -khui_cfg_set_param(khui_config_node vnode, LPARAM param) { - khui_config_node_i * node; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) - node->param = param; - LeaveCriticalSection(&cs_cfgui); -} - -static void -clear_node_data(khui_config_node_i * node) { - node->n_data = 0; -} - -static cfg_node_data * -get_node_data(khui_config_node_i * node, - void * key, - khm_boolean create) { - khm_size i; - - for (i=0; in_data; i++) { - if (node->data[i].key == key) - return &(node->data[i]); - } - - if (!create) - return NULL; - - if (node->n_data + 1 > node->nc_data) { - cfg_node_data * newdata; - - node->nc_data = UBOUNDSS((node->n_data + 1), - KHUI_NODEDATA_ALLOC_INCR, - KHUI_NODEDATA_ALLOC_INCR); -#ifdef DEBUG - assert(node->nc_data >= node->n_data + 1); -#endif - newdata = PMALLOC(sizeof(*newdata) * node->nc_data); -#ifdef DEBUG - assert(newdata); -#endif - ZeroMemory(newdata, sizeof(*newdata) * node->nc_data); - - if (node->data && node->n_data > 0) { - memcpy(newdata, node->data, node->n_data * sizeof(*newdata)); - PFREE(node->data); - } - node->data = newdata; - } - - node->data[node->n_data].key = key; - node->data[node->n_data].hwnd = NULL; - node->data[node->n_data].param = 0; - node->data[node->n_data].flags = 0; - - node->n_data++; - - return &(node->data[node->n_data - 1]); -} - -KHMEXP HWND KHMAPI -khui_cfg_get_hwnd_inst(khui_config_node vnode, - khui_config_node noderef) { - khui_config_node_i * node; - cfg_node_data * data; - HWND hwnd; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return NULL; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) { - data = get_node_data(node, noderef, FALSE); - if (data) - hwnd = data->hwnd; - else - hwnd = NULL; - } else - hwnd = NULL; - LeaveCriticalSection(&cs_cfgui); - - return hwnd; -} - -KHMEXP LPARAM KHMAPI -khui_cfg_get_param_inst(khui_config_node vnode, - khui_config_node noderef) { - khui_config_node_i * node; - cfg_node_data * data; - LPARAM lParam; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return 0; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) { - data = get_node_data(node, noderef, FALSE); - if (data) - lParam = data->param; - else - lParam = 0; - } else - lParam = 0; - LeaveCriticalSection(&cs_cfgui); - - return lParam; -} - -KHMEXP void KHMAPI -khui_cfg_set_hwnd_inst(khui_config_node vnode, - khui_config_node noderef, - HWND hwnd) { - khui_config_node_i * node; - cfg_node_data * data; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) { - data = get_node_data(node, noderef, TRUE); - if (data) - data->hwnd = hwnd; - } - LeaveCriticalSection(&cs_cfgui); -} - -KHMEXP void KHMAPI -khui_cfg_set_param_inst(khui_config_node vnode, - khui_config_node noderef, - LPARAM param) { - khui_config_node_i * node; - cfg_node_data * data; - - cfgui_init_once(); - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) - node = cfgui_node_i_from_handle(vnode); - else if (!vnode) - node = cfgui_root_config; - else - node = NULL; - - if (node) { - data = get_node_data(node, noderef, TRUE); - if (data) - data->param = param; - } - LeaveCriticalSection(&cs_cfgui); -} - - -/* called with cs_cfgui held */ -static void -cfgui_clear_params(khui_config_node_i * node) { - khui_config_node_i * c; - - node->hwnd = NULL; - node->param = 0; - node->flags &= KHUI_CNFLAGMASK_STATIC; - clear_node_data(node); - - c = TFIRSTCHILD(node); - while(c) { - cfgui_clear_params(c); - c = LNEXT(c); - } -} - -KHMEXP void KHMAPI -khui_cfg_clear_params(void) { - - cfgui_init_once(); - - EnterCriticalSection(&cs_cfgui); - cfgui_clear_params(cfgui_root_config); - LeaveCriticalSection(&cs_cfgui); -} - -KHMEXP void KHMAPI -khui_cfg_set_configui_handle(HWND hwnd) { - EnterCriticalSection(&cs_cfgui); - hwnd_cfgui = hwnd; - LeaveCriticalSection(&cs_cfgui); -} - -KHMEXP void KHMAPI -khui_cfg_set_flags(khui_config_node vnode, - khm_int32 flags, - khm_int32 mask) { - khui_config_node_i * node; - khm_int32 newflags; - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return; - - mask &= KHUI_CNFLAGMASK_DYNAMIC; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) { - - node = cfgui_node_i_from_handle(vnode); - - newflags = - (flags & mask) | - (node->flags & ~mask); - - if (newflags != node->flags) { - node->flags = newflags; - - if (hwnd_cfgui) - PostMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM((WORD)newflags, WMCFG_UPDATE_STATE), - (LPARAM) vnode); - } - } - LeaveCriticalSection(&cs_cfgui); -} - -/* called with cs_cfgui held */ -static void -recalc_node_flags(khui_config_node vnode, khm_boolean plural) { - khui_config_node_i * node; - khui_config_node_i * parent; - khui_config_node_i * subpanel; - cfg_node_data * data; - khm_int32 flags; - -#ifdef DEBUG - assert(cfgui_is_valid_node_handle(vnode)); -#endif - - node = cfgui_node_i_from_handle(vnode); - - if (plural) - parent = TPARENT(node); - else - parent = node; -#ifdef DEBUG - assert(parent); -#endif - - flags = 0; - - for(subpanel = TFIRSTCHILD(parent); subpanel; - subpanel = LNEXT(subpanel)) { - if (!(subpanel->reg.flags & KHUI_CNFLAG_SUBPANEL) || - (plural && !(subpanel->reg.flags & KHUI_CNFLAG_PLURAL)) || - (!plural && (subpanel->reg.flags & KHUI_CNFLAG_PLURAL))) - continue; - - data = get_node_data(subpanel, - vnode, - FALSE); - - if (data) { - flags |= data->flags; - } - } - - flags &= KHUI_CNFLAGMASK_DYNAMIC; - - if ((node->flags & KHUI_CNFLAGMASK_DYNAMIC) == flags) - return; - - node->flags = (node->flags & ~KHUI_CNFLAGMASK_DYNAMIC) | flags; - - if (hwnd_cfgui) - PostMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM((WORD) node->flags, WMCFG_UPDATE_STATE), - (LPARAM) vnode); -} - -KHMEXP void KHMAPI -khui_cfg_set_flags_inst(khui_config_init_data * d, - khm_int32 flags, - khm_int32 mask) { - khui_config_node_i * node; - cfg_node_data * data; - - cfgui_init_once(); - if (!cfgui_is_valid_node_handle(d->this_node)) - return; - - mask &= KHUI_CNFLAGMASK_DYNAMIC; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(d->this_node)) - node = cfgui_node_i_from_handle(d->this_node); - else - node = NULL; - - if (node) { - data = get_node_data(node, d->ctx_node, TRUE); - if (data) { - khm_int32 new_flags; - - new_flags = (flags & mask) | - (data->flags & ~mask); - - if (new_flags != data->flags) { - data->flags = new_flags; - - if (d->ctx_node != d->ref_node) - recalc_node_flags(d->ctx_node, TRUE); - else - recalc_node_flags(d->ctx_node, FALSE); - } - } - } - LeaveCriticalSection(&cs_cfgui); -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_flags(khui_config_node vnode) { - khui_config_node_i * node; - khm_int32 flags = 0; - - if (vnode && - !cfgui_is_valid_node_handle(vnode)) - return 0; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) { - - node = cfgui_node_i_from_handle(vnode); - - flags = node->flags; - } - LeaveCriticalSection(&cs_cfgui); - - return flags; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_name(khui_config_node vnode, - wchar_t * buf, - khm_size * cb_buf) { - khui_config_node_i * node; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if (!cb_buf || - !cfgui_is_valid_node_handle(vnode)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_cfgui); - if (cfgui_is_valid_node_handle(vnode)) { - khm_size cb; - - node = cfgui_node_i_from_handle(vnode); - - StringCbLength(node->reg.name, KHUI_MAXCCH_NAME, &cb); - - if (buf == NULL || cb > *cb_buf) { - *cb_buf = cb; - rv = KHM_ERROR_TOO_LONG; - } else { - StringCbCopy(buf, *cb_buf, node->reg.name); - *cb_buf = cb; - } - } else { - rv = KHM_ERROR_INVALID_PARAM; - } - LeaveCriticalSection(&cs_cfgui); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_init_dialog_data(HWND hwnd_dlg, - const khui_config_init_data * data, - khm_size cb_extra, - khui_config_init_data ** new_data, - void ** extra) { - khm_size cb; - khui_config_init_data * d; - - cb = sizeof(khui_config_init_data) + cb_extra; - d = PMALLOC(cb); -#ifdef DEBUG - assert(d); -#endif - ZeroMemory(d, cb); - - *d = *data; - - if (d->ctx_node) - khui_cfg_hold(d->ctx_node); - if (d->this_node) - khui_cfg_hold(d->this_node); - if (d->ref_node) - khui_cfg_hold(d->ref_node); - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd_dlg, DWLP_USER, (LONG_PTR) d); -#pragma warning(pop) - - if (new_data) - *new_data = d; - if (extra) - *extra = (void *) (d + 1); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_get_dialog_data(HWND hwnd_dlg, - khui_config_init_data ** data, - void ** extra) { - khui_config_init_data * d; - - d = (khui_config_init_data *) (LONG_PTR) GetWindowLongPtr(hwnd_dlg, - DWLP_USER); -#ifdef DEBUG - assert(d); -#endif - - *data = d; - if (extra) - *extra = (void *) (d + 1); - - return (d)?KHM_ERROR_SUCCESS: KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI -khui_cfg_free_dialog_data(HWND hwnd_dlg) { - khui_config_init_data * d; - - d = (khui_config_init_data *) (LONG_PTR) GetWindowLongPtr(hwnd_dlg, - DWLP_USER); -#ifdef DEBUG - assert(d); -#endif - - if (d) { - PFREE(d); - } - - return (d)?KHM_ERROR_SUCCESS: KHM_ERROR_NOT_FOUND; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include + +#include + +khm_int32 cfgui_node_serial; +LONG init_once = 0; +CRITICAL_SECTION cs_cfgui; +khui_config_node_i * cfgui_root_config; +HWND hwnd_cfgui = NULL; + +static khui_config_node_i * +cfgui_create_new_node(void) { + khui_config_node_i * node; + + node = PMALLOC(sizeof(*node)); +#ifdef DEBUG + assert(node); +#endif + ZeroMemory(node, sizeof(*node)); + node->magic = KHUI_CONFIG_NODE_MAGIC; + + EnterCriticalSection(&cs_cfgui); + node->id = ++cfgui_node_serial; + LeaveCriticalSection(&cs_cfgui); + + return node; +} + +/* called with cs_cfgui held */ +static void +cfgui_free_node(khui_config_node_i * node) { + if (!cfgui_is_valid_node(node)) + return; + + if (node->reg.name) + PFREE((void *) node->reg.name); + + if (node->reg.short_desc) + PFREE((void *) node->reg.short_desc); + + if (node->reg.long_desc) + PFREE((void *) node->reg.long_desc); + + node->magic = 0; + + if (node->owner) + kmm_release_plugin(node->owner); + + ZeroMemory(node, sizeof(*node)); + + PFREE(node); +} + + +static void +cfgui_hold_node(khui_config_node_i * node) { + EnterCriticalSection(&cs_cfgui); + node->refcount++; + LeaveCriticalSection(&cs_cfgui); +} + + +static void +cfgui_release_node(khui_config_node_i * node) { + EnterCriticalSection(&cs_cfgui); + node->refcount--; + if (node->refcount == 0 && + (node->flags & KHUI_CN_FLAG_DELETED)) { + khui_config_node_i * parent; + parent = TPARENT(node); +#ifdef DEBUG + assert(TFIRSTCHILD(node) == NULL); + assert(parent != NULL); +#endif + TDELCHILD(parent, node); + cfgui_free_node(node); + cfgui_release_node(parent); + } + LeaveCriticalSection(&cs_cfgui); +} + +static void +cfgui_init_once(void) { + if (init_once == 0 && + InterlockedIncrement(&init_once) == 1) { + InitializeCriticalSection(&cs_cfgui); + cfgui_root_config = cfgui_create_new_node(); + cfgui_node_serial = 0; + hwnd_cfgui = NULL; + } +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_register(khui_config_node vparent, + const khui_config_node_reg * reg) { + + size_t cb_name; + size_t cb_short_desc; + size_t cb_long_desc; + khui_config_node_i * node; + khui_config_node_i * parent; + khui_config_node t; + wchar_t * name; + wchar_t * short_desc; + wchar_t * long_desc; + + cfgui_init_once(); + + if (!reg || + FAILED(StringCbLength(reg->name, + KHUI_MAXCB_NAME, + &cb_name)) || + FAILED(StringCbLength(reg->short_desc, + KHUI_MAXCB_SHORT_DESC, + &cb_short_desc)) || + FAILED(StringCbLength(reg->long_desc, + KHUI_MAXCB_LONG_DESC, + &cb_long_desc)) || + (vparent && + !cfgui_is_valid_node_handle(vparent))) + return KHM_ERROR_INVALID_PARAM; + + if (KHM_SUCCEEDED(khui_cfg_open(vparent, + reg->name, + &t))) { + khui_cfg_release(t); + return KHM_ERROR_DUPLICATE; + } + + cb_name += sizeof(wchar_t); + cb_short_desc += sizeof(wchar_t); + cb_long_desc += sizeof(wchar_t); + + node = cfgui_create_new_node(); + + node->reg = *reg; + node->reg.flags &= KHUI_CNFLAGMASK_STATIC; + + name = PMALLOC(cb_name); + StringCbCopy(name, cb_name, reg->name); + short_desc = PMALLOC(cb_short_desc); + StringCbCopy(short_desc, cb_short_desc, reg->short_desc); + long_desc = PMALLOC(cb_long_desc); + StringCbCopy(long_desc, cb_long_desc, reg->long_desc); + + node->reg.name = name; + node->reg.short_desc = short_desc; + node->reg.long_desc = long_desc; + node->flags = node->reg.flags; + + if (vparent == NULL) { + parent = cfgui_root_config; + } else { + parent = cfgui_node_i_from_handle(vparent); + } + + /* plugin handles should not be obtained lightly. For the moment, + the cleanup of nodes doesn't happen until module unload and + module unload doesn't happen until all the plugin and module + handles have been freed. */ + /* node->owner = kmm_this_plugin(); */ + + EnterCriticalSection(&cs_cfgui); + TADDCHILD(parent, node); + + if (hwnd_cfgui) { + SendMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(0, WMCFG_SYNC_NODE_LIST), 0); + } + + LeaveCriticalSection(&cs_cfgui); + + /* when the root config list changes, we need to notify the UI. + this way, the Options menu can be kept in sync. */ + if (parent == cfgui_root_config) { + kmq_post_message(KMSG_ACT, KMSG_ACT_SYNC_CFG, 0, 0); + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_open(khui_config_node vparent, + const wchar_t * name, + khui_config_node * result) { + khui_config_node_i * parent; + khui_config_node_i * c; + size_t sz; + + cfgui_init_once(); + + if ((vparent && + !cfgui_is_valid_node_handle(vparent)) || + FAILED(StringCbLength(name, KHUI_MAXCCH_NAME, &sz)) || + !result) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (vparent) + parent = cfgui_node_i_from_handle(vparent); + else + parent = cfgui_root_config; + + c = TFIRSTCHILD(parent); + while(c) { + if (!(c->flags & KHUI_CN_FLAG_DELETED) && + !wcscmp(c->reg.name, name)) + break; + c = LNEXT(c); + } + + if (c) { + *result = cfgui_handle_from_node_i(c); + cfgui_hold_node(c); + } else { + *result = NULL; + } + LeaveCriticalSection(&cs_cfgui); + + if (*result) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_remove(khui_config_node vnode) { + khui_config_node_i * node; + if (!cfgui_is_valid_node_handle(vnode)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + node = cfgui_node_i_from_handle(vnode); + node->flags |= KHUI_CN_FLAG_DELETED; + + if (hwnd_cfgui) { + SendMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(0, WMCFG_SYNC_NODE_LIST), 0); + } + + LeaveCriticalSection(&cs_cfgui); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_hold(khui_config_node vnode) { + if (!cfgui_is_valid_node_handle(vnode)) + return KHM_ERROR_INVALID_PARAM; + + cfgui_hold_node(cfgui_node_i_from_handle(vnode)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_release(khui_config_node vnode) { + if (!cfgui_is_valid_node_handle(vnode)) + return KHM_ERROR_INVALID_PARAM; + + cfgui_release_node(cfgui_node_i_from_handle(vnode)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_parent(khui_config_node vnode, + khui_config_node * result) { + + khui_config_node_i * node; + khui_config_node_i * parent; + + if(!cfgui_is_valid_node_handle(vnode) || + !result) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) { + node = cfgui_node_i_from_handle(vnode); + parent = TPARENT(node); + if (parent == cfgui_root_config) + parent = NULL; + } else { + parent = NULL; + } + if (parent) { + cfgui_hold_node(parent); + } + LeaveCriticalSection(&cs_cfgui); + + *result = parent; + + if (parent) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_first_child(khui_config_node vparent, + khui_config_node * result) { + khui_config_node_i * parent; + khui_config_node_i * c; + + cfgui_init_once(); + + if((vparent && !cfgui_is_valid_node_handle(vparent)) || + !result) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vparent)) { + parent = cfgui_node_i_from_handle(vparent); + } else if (!vparent) { + parent = cfgui_root_config; + } else { + parent = NULL; + } + + if (parent) { + for(c = TFIRSTCHILD(parent); + c && (c->reg.flags & KHUI_CNFLAG_SUBPANEL); + c = LNEXT(c)); + } else { + c = NULL; + } + + if (c) + cfgui_hold_node(c); + LeaveCriticalSection(&cs_cfgui); + + *result = c; + + if (c) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_first_subpanel(khui_config_node vparent, + khui_config_node * result) { + khui_config_node_i * parent; + khui_config_node_i * c; + + cfgui_init_once(); + + if((vparent && !cfgui_is_valid_node_handle(vparent)) || + !result) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vparent)) { + parent = cfgui_node_i_from_handle(vparent); + } else if (!vparent) { + parent = cfgui_root_config; + } else { + parent = NULL; + } + + if (parent) { + for(c = TFIRSTCHILD(parent); + c && !(c->reg.flags & KHUI_CNFLAG_SUBPANEL); + c = LNEXT(c)); + } else { + c = NULL; + } + + if (c) + cfgui_hold_node(c); + LeaveCriticalSection(&cs_cfgui); + + *result = c; + + if (c) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_next(khui_config_node vnode, + khui_config_node * result) { + + khui_config_node_i * node; + khui_config_node_i * nxt_node; + + if (!cfgui_is_valid_node_handle(vnode) || + !result) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) { + node = cfgui_node_i_from_handle(vnode); + for(nxt_node = LNEXT(node); + nxt_node && + ((node->reg.flags ^ nxt_node->reg.flags) & + KHUI_CNFLAG_SUBPANEL); + nxt_node = LNEXT(nxt_node)); + if (nxt_node) + cfgui_hold_node(nxt_node); + } else { + nxt_node = NULL; + } + LeaveCriticalSection(&cs_cfgui); + + *result = cfgui_handle_from_node_i(nxt_node); + + if (nxt_node) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_next_release(khui_config_node * pvnode) { + + khui_config_node_i * node; + khui_config_node_i * nxt_node; + + if (!pvnode || + !cfgui_is_valid_node_handle(*pvnode)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(*pvnode)) { + node = cfgui_node_i_from_handle(*pvnode); + for(nxt_node = LNEXT(node); + nxt_node && + ((node->reg.flags ^ nxt_node->reg.flags) & + KHUI_CNFLAG_SUBPANEL); + nxt_node = LNEXT(nxt_node)); + if (nxt_node) + cfgui_hold_node(nxt_node); + cfgui_release_node(node); + } else { + nxt_node = NULL; + } + LeaveCriticalSection(&cs_cfgui); + + *pvnode = cfgui_handle_from_node_i(nxt_node); + + if (nxt_node) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_reg(khui_config_node vnode, + khui_config_node_reg * reg) { + + khui_config_node_i * node; + + cfgui_init_once(); + + if ((vnode && !cfgui_is_valid_node_handle(vnode)) || + !reg) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) { + node = cfgui_node_i_from_handle(vnode); + *reg = node->reg; + } else if (!vnode) { + node = cfgui_root_config; + *reg = node->reg; + } else { + node = NULL; + ZeroMemory(reg, sizeof(*reg)); + } + LeaveCriticalSection(&cs_cfgui); + + if (node) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_INVALID_PARAM; +} + +KHMEXP HWND KHMAPI +khui_cfg_get_hwnd(khui_config_node vnode) { + khui_config_node_i * node; + HWND hwnd; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return NULL; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) + hwnd = node->hwnd; + else + hwnd = NULL; + LeaveCriticalSection(&cs_cfgui); + + return hwnd; +} + +KHMEXP LPARAM KHMAPI +khui_cfg_get_param(khui_config_node vnode) { + khui_config_node_i * node; + LPARAM param; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return 0; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) + param = node->param; + else + param = 0; + LeaveCriticalSection(&cs_cfgui); + + return param; +} + +KHMEXP void KHMAPI +khui_cfg_set_hwnd(khui_config_node vnode, HWND hwnd) { + khui_config_node_i * node; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) + node->hwnd = hwnd; + LeaveCriticalSection(&cs_cfgui); +} + +KHMEXP void KHMAPI +khui_cfg_set_param(khui_config_node vnode, LPARAM param) { + khui_config_node_i * node; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) + node->param = param; + LeaveCriticalSection(&cs_cfgui); +} + +static void +clear_node_data(khui_config_node_i * node) { + node->n_data = 0; +} + +static cfg_node_data * +get_node_data(khui_config_node_i * node, + void * key, + khm_boolean create) { + khm_size i; + + for (i=0; in_data; i++) { + if (node->data[i].key == key) + return &(node->data[i]); + } + + if (!create) + return NULL; + + if (node->n_data + 1 > node->nc_data) { + cfg_node_data * newdata; + + node->nc_data = UBOUNDSS((node->n_data + 1), + KHUI_NODEDATA_ALLOC_INCR, + KHUI_NODEDATA_ALLOC_INCR); +#ifdef DEBUG + assert(node->nc_data >= node->n_data + 1); +#endif + newdata = PMALLOC(sizeof(*newdata) * node->nc_data); +#ifdef DEBUG + assert(newdata); +#endif + ZeroMemory(newdata, sizeof(*newdata) * node->nc_data); + + if (node->data && node->n_data > 0) { + memcpy(newdata, node->data, node->n_data * sizeof(*newdata)); + PFREE(node->data); + } + node->data = newdata; + } + + node->data[node->n_data].key = key; + node->data[node->n_data].hwnd = NULL; + node->data[node->n_data].param = 0; + node->data[node->n_data].flags = 0; + + node->n_data++; + + return &(node->data[node->n_data - 1]); +} + +KHMEXP HWND KHMAPI +khui_cfg_get_hwnd_inst(khui_config_node vnode, + khui_config_node noderef) { + khui_config_node_i * node; + cfg_node_data * data; + HWND hwnd; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return NULL; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) { + data = get_node_data(node, noderef, FALSE); + if (data) + hwnd = data->hwnd; + else + hwnd = NULL; + } else + hwnd = NULL; + LeaveCriticalSection(&cs_cfgui); + + return hwnd; +} + +KHMEXP LPARAM KHMAPI +khui_cfg_get_param_inst(khui_config_node vnode, + khui_config_node noderef) { + khui_config_node_i * node; + cfg_node_data * data; + LPARAM lParam; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return 0; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) { + data = get_node_data(node, noderef, FALSE); + if (data) + lParam = data->param; + else + lParam = 0; + } else + lParam = 0; + LeaveCriticalSection(&cs_cfgui); + + return lParam; +} + +KHMEXP void KHMAPI +khui_cfg_set_hwnd_inst(khui_config_node vnode, + khui_config_node noderef, + HWND hwnd) { + khui_config_node_i * node; + cfg_node_data * data; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) { + data = get_node_data(node, noderef, TRUE); + if (data) + data->hwnd = hwnd; + } + LeaveCriticalSection(&cs_cfgui); +} + +KHMEXP void KHMAPI +khui_cfg_set_param_inst(khui_config_node vnode, + khui_config_node noderef, + LPARAM param) { + khui_config_node_i * node; + cfg_node_data * data; + + cfgui_init_once(); + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) + node = cfgui_node_i_from_handle(vnode); + else if (!vnode) + node = cfgui_root_config; + else + node = NULL; + + if (node) { + data = get_node_data(node, noderef, TRUE); + if (data) + data->param = param; + } + LeaveCriticalSection(&cs_cfgui); +} + + +/* called with cs_cfgui held */ +static void +cfgui_clear_params(khui_config_node_i * node) { + khui_config_node_i * c; + + node->hwnd = NULL; + node->param = 0; + node->flags &= KHUI_CNFLAGMASK_STATIC; + clear_node_data(node); + + c = TFIRSTCHILD(node); + while(c) { + cfgui_clear_params(c); + c = LNEXT(c); + } +} + +KHMEXP void KHMAPI +khui_cfg_clear_params(void) { + + cfgui_init_once(); + + EnterCriticalSection(&cs_cfgui); + cfgui_clear_params(cfgui_root_config); + LeaveCriticalSection(&cs_cfgui); +} + +KHMEXP void KHMAPI +khui_cfg_set_configui_handle(HWND hwnd) { + EnterCriticalSection(&cs_cfgui); + hwnd_cfgui = hwnd; + LeaveCriticalSection(&cs_cfgui); +} + +KHMEXP void KHMAPI +khui_cfg_set_flags(khui_config_node vnode, + khm_int32 flags, + khm_int32 mask) { + khui_config_node_i * node; + khm_int32 newflags; + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return; + + mask &= KHUI_CNFLAGMASK_DYNAMIC; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) { + + node = cfgui_node_i_from_handle(vnode); + + newflags = + (flags & mask) | + (node->flags & ~mask); + + if (newflags != node->flags) { + node->flags = newflags; + + if (hwnd_cfgui) + PostMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM((WORD)newflags, WMCFG_UPDATE_STATE), + (LPARAM) vnode); + } + } + LeaveCriticalSection(&cs_cfgui); +} + +/* called with cs_cfgui held */ +static void +recalc_node_flags(khui_config_node vnode, khm_boolean plural) { + khui_config_node_i * node; + khui_config_node_i * parent; + khui_config_node_i * subpanel; + cfg_node_data * data; + khm_int32 flags; + +#ifdef DEBUG + assert(cfgui_is_valid_node_handle(vnode)); +#endif + + node = cfgui_node_i_from_handle(vnode); + + if (plural) + parent = TPARENT(node); + else + parent = node; +#ifdef DEBUG + assert(parent); +#endif + + flags = 0; + + for(subpanel = TFIRSTCHILD(parent); subpanel; + subpanel = LNEXT(subpanel)) { + if (!(subpanel->reg.flags & KHUI_CNFLAG_SUBPANEL) || + (plural && !(subpanel->reg.flags & KHUI_CNFLAG_PLURAL)) || + (!plural && (subpanel->reg.flags & KHUI_CNFLAG_PLURAL))) + continue; + + data = get_node_data(subpanel, + vnode, + FALSE); + + if (data) { + flags |= data->flags; + } + } + + flags &= KHUI_CNFLAGMASK_DYNAMIC; + + if ((node->flags & KHUI_CNFLAGMASK_DYNAMIC) == flags) + return; + + node->flags = (node->flags & ~KHUI_CNFLAGMASK_DYNAMIC) | flags; + + if (hwnd_cfgui) + PostMessage(hwnd_cfgui, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM((WORD) node->flags, WMCFG_UPDATE_STATE), + (LPARAM) vnode); +} + +KHMEXP void KHMAPI +khui_cfg_set_flags_inst(khui_config_init_data * d, + khm_int32 flags, + khm_int32 mask) { + khui_config_node_i * node; + cfg_node_data * data; + + cfgui_init_once(); + if (!cfgui_is_valid_node_handle(d->this_node)) + return; + + mask &= KHUI_CNFLAGMASK_DYNAMIC; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(d->this_node)) + node = cfgui_node_i_from_handle(d->this_node); + else + node = NULL; + + if (node) { + data = get_node_data(node, d->ctx_node, TRUE); + if (data) { + khm_int32 new_flags; + + new_flags = (flags & mask) | + (data->flags & ~mask); + + if (new_flags != data->flags) { + data->flags = new_flags; + + if (d->ctx_node != d->ref_node) + recalc_node_flags(d->ctx_node, TRUE); + else + recalc_node_flags(d->ctx_node, FALSE); + } + } + } + LeaveCriticalSection(&cs_cfgui); +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_flags(khui_config_node vnode) { + khui_config_node_i * node; + khm_int32 flags = 0; + + if (vnode && + !cfgui_is_valid_node_handle(vnode)) + return 0; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) { + + node = cfgui_node_i_from_handle(vnode); + + flags = node->flags; + } + LeaveCriticalSection(&cs_cfgui); + + return flags; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_name(khui_config_node vnode, + wchar_t * buf, + khm_size * cb_buf) { + khui_config_node_i * node; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if (!cb_buf || + !cfgui_is_valid_node_handle(vnode)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_cfgui); + if (cfgui_is_valid_node_handle(vnode)) { + khm_size cb; + + node = cfgui_node_i_from_handle(vnode); + + StringCbLength(node->reg.name, KHUI_MAXCCH_NAME, &cb); + + if (buf == NULL || cb > *cb_buf) { + *cb_buf = cb; + rv = KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(buf, *cb_buf, node->reg.name); + *cb_buf = cb; + } + } else { + rv = KHM_ERROR_INVALID_PARAM; + } + LeaveCriticalSection(&cs_cfgui); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_init_dialog_data(HWND hwnd_dlg, + const khui_config_init_data * data, + khm_size cb_extra, + khui_config_init_data ** new_data, + void ** extra) { + khm_size cb; + khui_config_init_data * d; + + cb = sizeof(khui_config_init_data) + cb_extra; + d = PMALLOC(cb); +#ifdef DEBUG + assert(d); +#endif + ZeroMemory(d, cb); + + *d = *data; + + if (d->ctx_node) + khui_cfg_hold(d->ctx_node); + if (d->this_node) + khui_cfg_hold(d->this_node); + if (d->ref_node) + khui_cfg_hold(d->ref_node); + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd_dlg, DWLP_USER, (LONG_PTR) d); +#pragma warning(pop) + + if (new_data) + *new_data = d; + if (extra) + *extra = (void *) (d + 1); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_get_dialog_data(HWND hwnd_dlg, + khui_config_init_data ** data, + void ** extra) { + khui_config_init_data * d; + + d = (khui_config_init_data *) (LONG_PTR) GetWindowLongPtr(hwnd_dlg, + DWLP_USER); +#ifdef DEBUG + assert(d); +#endif + + *data = d; + if (extra) + *extra = (void *) (d + 1); + + return (d)?KHM_ERROR_SUCCESS: KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI +khui_cfg_free_dialog_data(HWND hwnd_dlg) { + khui_config_init_data * d; + + d = (khui_config_init_data *) (LONG_PTR) GetWindowLongPtr(hwnd_dlg, + DWLP_USER); +#ifdef DEBUG + assert(d); +#endif + + if (d) { + PFREE(d); + } + + return (d)?KHM_ERROR_SUCCESS: KHM_ERROR_NOT_FOUND; +} --- krb5-1.4.4.orig/src/windows/identity/uilib/creddlg.c +++ krb5-1.4.4/src/windows/identity/uilib/creddlg.c @@ -1,683 +1,683 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -#include - -#define CW_ALLOC_INCR 8 - -static void cw_free_prompts(khui_new_creds * c); - -static void cw_free_prompt(khui_new_creds_prompt * p); - -static khui_new_creds_prompt * -cw_create_prompt( - khm_size idx, - khm_int32 type, - wchar_t * prompt, - wchar_t * def, - khm_int32 flags); - -KHMEXP khm_int32 KHMAPI -khui_cw_create_cred_blob(khui_new_creds ** ppnc) -{ - khui_new_creds * c; - - c = PMALLOC(sizeof(*c)); - ZeroMemory(c, sizeof(*c)); - - c->magic = KHUI_NC_MAGIC; - InitializeCriticalSection(&c->cs); - c->result = KHUI_NC_RESULT_CANCEL; - c->mode = KHUI_NC_MODE_MINI; - - *ppnc = c; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_destroy_cred_blob(khui_new_creds *c) -{ - khm_size i; - size_t len; - EnterCriticalSection(&c->cs); - for(i=0;in_identities;i++) { - kcdb_identity_release(c->identities[i]); - } - cw_free_prompts(c); - khui_context_release(&c->ctx); - LeaveCriticalSection(&c->cs); - DeleteCriticalSection(&c->cs); - - if (c->password) { - len = wcslen(c->password); - SecureZeroMemory(c->password, sizeof(wchar_t) * len); - PFREE(c->password); - } - - if (c->identities) - PFREE(c->identities); - - if (c->types) - PFREE(c->types); - - if (c->type_subs) - PFREE(c->type_subs); - - if (c->window_title) - PFREE(c->window_title); - - PFREE(c); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_lock_nc(khui_new_creds * c) -{ - EnterCriticalSection(&c->cs); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_unlock_nc(khui_new_creds * c) -{ - LeaveCriticalSection(&c->cs); - return KHM_ERROR_SUCCESS; -} - -#define NC_N_IDENTITIES 4 - -KHMEXP khm_int32 KHMAPI -khui_cw_add_identity(khui_new_creds * c, - khm_handle id) -{ - if(id == NULL) - return KHM_ERROR_SUCCESS; /* we return success because adding - a NULL id is equivalent to adding - nothing. */ - EnterCriticalSection(&(c->cs)); - - if(c->identities == NULL) { - c->nc_identities = NC_N_IDENTITIES; - c->identities = PMALLOC(sizeof(*(c->identities)) * - c->nc_identities); - c->n_identities = 0; - } else if(c->n_identities + 1 > c->nc_identities) { - khm_handle * ni; - - c->nc_identities = UBOUNDSS(c->n_identities + 1, - NC_N_IDENTITIES, - NC_N_IDENTITIES); - ni = PMALLOC(sizeof(*(c->identities)) * c->nc_identities); - memcpy(ni, c->identities, - sizeof(*(c->identities)) * c->n_identities); - PFREE(c->identities); - c->identities = ni; - } - - kcdb_identity_hold(id); - c->identities[c->n_identities++] = id; - LeaveCriticalSection(&(c->cs)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_set_primary_id(khui_new_creds * c, - khm_handle id) -{ - khm_size i; - khm_int32 rv; - - EnterCriticalSection(&c->cs); - - /* no change */ - if((c->n_identities > 0 && c->identities[0] == id) || - (c->n_identities == 0 && id == NULL)) { - LeaveCriticalSection(&c->cs); - return KHM_ERROR_SUCCESS; - } - - for(i=0; in_identities; i++) { - kcdb_identity_release(c->identities[i]); - } - c->n_identities = 0; - - LeaveCriticalSection(&(c->cs)); - rv = khui_cw_add_identity(c,id); - if(c->hwnd != NULL) { - PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_IDENTITY_CHANGE), 0); - } - return rv; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_add_type(khui_new_creds * c, - khui_new_creds_by_type * t) -{ - EnterCriticalSection(&c->cs); - - if(c->n_types >= KHUI_MAX_NCTYPES) { - LeaveCriticalSection(&c->cs); - return KHM_ERROR_OUT_OF_BOUNDS; - } - - if(c->types == NULL) { - c->nc_types = CW_ALLOC_INCR; - c->types = PMALLOC(sizeof(*(c->types)) * c->nc_types); - c->type_subs = PMALLOC(sizeof(*(c->type_subs)) * c->nc_types); - c->n_types = 0; - } - - if(c->nc_types < c->n_types + 1) { - void * t; - khm_size n; - - n = UBOUNDSS(c->n_types + 1, CW_ALLOC_INCR, CW_ALLOC_INCR); - - t = PMALLOC(sizeof(*(c->types)) * n); - memcpy(t, (void *) c->types, sizeof(*(c->types)) * c->n_types); - PFREE(c->types); - c->types = t; - - t = PMALLOC(sizeof(*(c->type_subs)) * n); - memcpy(t, (void *) c->type_subs, sizeof(*(c->type_subs)) * c->n_types); - PFREE(c->type_subs); - c->type_subs = t; - - c->nc_types = n; - } - - c->type_subs[c->n_types] = kcdb_credtype_get_sub(t->type); - c->types[c->n_types++] = t; - t->nc = c; - LeaveCriticalSection(&c->cs); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_del_type(khui_new_creds * c, - khm_int32 type_id) -{ - khm_size i; - - EnterCriticalSection(&c->cs); - for(i=0; i < c->n_types; i++) { - if(c->types[i]->type == type_id) - break; - } - if(i >= c->n_types) { - LeaveCriticalSection(&c->cs); - return KHM_ERROR_NOT_FOUND; - } - c->n_types--; - for(;i < c->n_types; i++) { - c->types[i] = c->types[i+1]; - c->type_subs[i] = c->type_subs[i+1]; - } - LeaveCriticalSection(&c->cs); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_find_type(khui_new_creds * c, - khm_int32 type, - khui_new_creds_by_type **t) -{ - khm_size i; - - EnterCriticalSection(&c->cs); - *t = NULL; - for(i=0;in_types;i++) { - if(c->types[i]->type == type) { - *t = c->types[i]; - break; - } - } - LeaveCriticalSection(&c->cs); - - if(*t) - return KHM_ERROR_SUCCESS; - return KHM_ERROR_NOT_FOUND; -} - - -KHMEXP khm_int32 KHMAPI -khui_cw_enable_type(khui_new_creds * c, - khm_int32 type, - khm_boolean enable) -{ - khui_new_creds_by_type * t = NULL; - BOOL delta = FALSE; - - EnterCriticalSection(&c->cs); - if(KHM_SUCCEEDED(khui_cw_find_type(c, type, &t))) { - if(enable) { - delta = t->flags & KHUI_NCT_FLAG_DISABLED; - t->flags &= ~KHUI_NCT_FLAG_DISABLED; - } - else { - delta = !(t->flags & KHUI_NCT_FLAG_DISABLED); - t->flags |= KHUI_NCT_FLAG_DISABLED; - } - } - LeaveCriticalSection(&c->cs); - - if(delta) - PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, MAKEWPARAM(0,WMNC_TYPE_STATE), (LPARAM) type); - - return (t)?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_boolean KHMAPI -khui_cw_type_succeeded(khui_new_creds * c, - khm_int32 type) -{ - khui_new_creds_by_type * t; - khm_boolean s; - - EnterCriticalSection(&c->cs); - if(KHM_SUCCEEDED(khui_cw_find_type(c, type, &t))) { - s = (t->flags & KHUI_NCT_FLAG_PROCESSED) && !(t->flags & KHUI_NC_RESPONSE_FAILED); - } else { - s = FALSE; - } - LeaveCriticalSection(&c->cs); - - return s; -} - -static khui_new_creds_prompt * -cw_create_prompt(khm_size idx, - khm_int32 type, - wchar_t * prompt, - wchar_t * def, - khm_int32 flags) -{ - khui_new_creds_prompt * p; - size_t cb_prompt = 0; - size_t cb_def = 0; - - if(prompt && FAILED(StringCbLength(prompt, KHUI_MAXCB_PROMPT, &cb_prompt))) - return NULL; - if(def && FAILED(StringCbLength(def, KHUI_MAXCB_PROMPT_VALUE, &cb_def))) - return NULL; - - p = PMALLOC(sizeof(*p)); - ZeroMemory(p, sizeof(*p)); - - if(prompt) { - cb_prompt += sizeof(wchar_t); - p->prompt = PMALLOC(cb_prompt); - StringCbCopy(p->prompt, cb_prompt, prompt); - } - - if(def && cb_def > 0) { - cb_def += sizeof(wchar_t); - p->def = PMALLOC(cb_def); - StringCbCopy(p->def, cb_def, def); - } - - p->value = PMALLOC(KHUI_MAXCB_PROMPT_VALUE); - ZeroMemory(p->value, KHUI_MAXCB_PROMPT_VALUE); - - p->type = type; - p->flags = flags; - p->index = idx; - - return p; -} - -static void -cw_free_prompt(khui_new_creds_prompt * p) { - size_t cb; - - if(p->prompt) { - if(SUCCEEDED(StringCbLength(p->prompt, KHUI_MAXCB_PROMPT, &cb))) - SecureZeroMemory(p->prompt, cb); - PFREE(p->prompt); - } - - if(p->def) { - if(SUCCEEDED(StringCbLength(p->def, KHUI_MAXCB_PROMPT, &cb))) - SecureZeroMemory(p->def, cb); - PFREE(p->def); - } - - if(p->value) { - if(SUCCEEDED(StringCbLength(p->value, KHUI_MAXCB_PROMPT_VALUE, &cb))) - SecureZeroMemory(p->value, cb); - PFREE(p->value); - } - - PFREE(p); -} - -static void -cw_free_prompts(khui_new_creds * c) -{ - khm_size i; - - if(c->banner != NULL) { - PFREE(c->banner); - c->banner = NULL; - } - - if(c->pname != NULL) { - PFREE(c->pname); - c->pname = NULL; - } - - for(i=0;i < c->n_prompts; i++) { - if(c->prompts[i]) { - cw_free_prompt(c->prompts[i]); - c->prompts[i] = NULL; - } - } - - if(c->prompts != NULL) { - PFREE(c->prompts); - c->prompts = NULL; - } - - c->nc_prompts = 0; - c->n_prompts = 0; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_clear_prompts(khui_new_creds * c) -{ - SendMessage(c->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0,WMNC_CLEAR_PROMPTS), (LPARAM) c); - - EnterCriticalSection(&c->cs); - cw_free_prompts(c); - LeaveCriticalSection(&c->cs); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_begin_custom_prompts(khui_new_creds * c, - khm_size n_prompts, - wchar_t * banner, - wchar_t * pname) -{ - size_t cb; - - PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0,WMNC_CLEAR_PROMPTS), (LPARAM) c); - - EnterCriticalSection(&c->cs); -#ifdef DEBUG - assert(c->n_prompts == 0); -#endif - cw_free_prompts(c); - - if(SUCCEEDED(StringCbLength(banner, KHUI_MAXCB_BANNER, &cb)) && - cb > 0) { - cb += sizeof(wchar_t); - c->banner = PMALLOC(cb); - StringCbCopy(c->banner, cb, banner); - } else { - c->banner = NULL; - } - - if(SUCCEEDED(StringCbLength(pname, KHUI_MAXCB_PNAME, &cb)) && - cb > 0) { - - cb += sizeof(wchar_t); - c->pname = PMALLOC(cb); - StringCbCopy(c->pname, cb, pname); - - } else { - - c->pname = NULL; - - } - - if(n_prompts > 0) { - c->prompts = PMALLOC(sizeof(*(c->prompts)) * n_prompts); - ZeroMemory(c->prompts, sizeof(*(c->prompts)) * n_prompts); - c->nc_prompts = n_prompts; - c->n_prompts = 0; - - } else { - - c->prompts = NULL; - c->n_prompts = 0; - c->nc_prompts = 0; - - PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_SET_PROMPTS), (LPARAM) c); - } - - LeaveCriticalSection(&c->cs); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_add_prompt(khui_new_creds * c, - khm_int32 type, - wchar_t * prompt, - wchar_t * def, - khm_int32 flags) -{ - khui_new_creds_prompt * p; - - if(c->nc_prompts == 0 || - c->n_prompts == c->nc_prompts) - return KHM_ERROR_INVALID_OPERATION; - -#ifdef DEBUG - assert(c->prompts != NULL); -#endif - - EnterCriticalSection(&c->cs); - p = cw_create_prompt(c->n_prompts, type, prompt, def, flags); - if(p == NULL) { - LeaveCriticalSection(&c->cs); - return KHM_ERROR_INVALID_PARAM; - } - c->prompts[c->n_prompts++] = p; - LeaveCriticalSection(&c->cs); - - if(c->n_prompts == c->nc_prompts) { - PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_SET_PROMPTS), (LPARAM) c); - /* once we are done adding prompts, switch to the auth - panel */ -#if 0 - /* Actually, don't. Doing so can mean an unexpected panel - switch if fiddling on some other panel causes a change in - custom prompts. */ - SendMessage(c->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_SWITCH_PANEL), - (LPARAM) c); -#endif - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_get_prompt_count(khui_new_creds * c, - khm_size * np) { - - EnterCriticalSection(&c->cs); - *np = c->n_prompts; - LeaveCriticalSection(&c->cs); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_get_prompt(khui_new_creds * c, - khm_size idx, - khui_new_creds_prompt ** prompt) -{ - khm_int32 rv; - - EnterCriticalSection(&c->cs); - if(c->n_prompts <= idx || - c->prompts == NULL) { - - rv = KHM_ERROR_OUT_OF_BOUNDS; - *prompt = NULL; - } else { - - *prompt = c->prompts[idx]; - rv = KHM_ERROR_SUCCESS; - } - LeaveCriticalSection(&c->cs); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_sync_prompt_values(khui_new_creds * c) -{ - khm_size i; - khm_size n; - HWND hw; - wchar_t tmpbuf[KHUI_MAXCCH_PROMPT_VALUE]; - - EnterCriticalSection(&c->cs); - redo_loop: - n = c->n_prompts; - for(i=0; iprompts[i]; - if(p->hwnd_edit) { - hw = p->hwnd_edit; - LeaveCriticalSection(&c->cs); - - GetWindowText(hw, tmpbuf, ARRAYLENGTH(tmpbuf)); - - EnterCriticalSection(&c->cs); - if (n != c->n_prompts) - goto redo_loop; - SecureZeroMemory(p->value, KHUI_MAXCB_PROMPT_VALUE); - StringCchCopy(p->value, KHUI_MAXCCH_PROMPT_VALUE, - tmpbuf); - } - } - LeaveCriticalSection(&c->cs); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_get_prompt_value(khui_new_creds * c, - khm_size idx, - wchar_t * buf, - khm_size *cbbuf) -{ - khui_new_creds_prompt * p; - khm_int32 rv; - size_t cb; - - rv = khui_cw_get_prompt(c, idx, &p); - if(KHM_FAILED(rv)) - return rv; - - EnterCriticalSection(&c->cs); - - if(FAILED(StringCbLength(p->value, KHUI_MAXCB_PROMPT_VALUE, &cb))) { - *cbbuf = 0; - if(buf != NULL) - *buf = 0; - LeaveCriticalSection(&c->cs); - return KHM_ERROR_SUCCESS; - } - cb += sizeof(wchar_t); - - if(buf == NULL || *cbbuf < cb) { - *cbbuf = cb; - LeaveCriticalSection(&c->cs); - return KHM_ERROR_TOO_LONG; - } - - StringCbCopy(buf, *cbbuf, p->value); - *cbbuf = cb; - LeaveCriticalSection(&c->cs); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khui_cw_set_response(khui_new_creds * c, - khm_int32 type, - khm_int32 response) -{ - khui_new_creds_by_type * t = NULL; - EnterCriticalSection(&c->cs); - khui_cw_find_type(c, type, &t); - c->response |= response & KHUI_NCMASK_RESPONSE; - if(t) { - t->flags &= ~KHUI_NCMASK_RESULT; - t->flags |= (response & KHUI_NCMASK_RESULT); - - if (!(response & KHUI_NC_RESPONSE_NOEXIT) && - !(response & KHUI_NC_RESPONSE_PENDING)) - t->flags |= KHUI_NC_RESPONSE_COMPLETED; - } - LeaveCriticalSection(&c->cs); - return KHM_ERROR_SUCCESS; -} - -/* only called from a identity provider callback */ -KHMEXP khm_int32 KHMAPI -khui_cw_add_control_row(khui_new_creds * c, - HWND label, - HWND input, - khui_control_size size) -{ - if (c && c->hwnd) { - khui_control_row row; - - row.label = label; - row.input = input; - row.size = size; - - SendMessage(c->hwnd, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_ADD_CONTROL_ROW), - (LPARAM) &row); - - return KHM_ERROR_SUCCESS; - } else { - return KHM_ERROR_INVALID_PARAM; - } -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +#include + +#define CW_ALLOC_INCR 8 + +static void cw_free_prompts(khui_new_creds * c); + +static void cw_free_prompt(khui_new_creds_prompt * p); + +static khui_new_creds_prompt * +cw_create_prompt( + khm_size idx, + khm_int32 type, + wchar_t * prompt, + wchar_t * def, + khm_int32 flags); + +KHMEXP khm_int32 KHMAPI +khui_cw_create_cred_blob(khui_new_creds ** ppnc) +{ + khui_new_creds * c; + + c = PMALLOC(sizeof(*c)); + ZeroMemory(c, sizeof(*c)); + + c->magic = KHUI_NC_MAGIC; + InitializeCriticalSection(&c->cs); + c->result = KHUI_NC_RESULT_CANCEL; + c->mode = KHUI_NC_MODE_MINI; + + *ppnc = c; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_destroy_cred_blob(khui_new_creds *c) +{ + khm_size i; + size_t len; + EnterCriticalSection(&c->cs); + for(i=0;in_identities;i++) { + kcdb_identity_release(c->identities[i]); + } + cw_free_prompts(c); + khui_context_release(&c->ctx); + LeaveCriticalSection(&c->cs); + DeleteCriticalSection(&c->cs); + + if (c->password) { + len = wcslen(c->password); + SecureZeroMemory(c->password, sizeof(wchar_t) * len); + PFREE(c->password); + } + + if (c->identities) + PFREE(c->identities); + + if (c->types) + PFREE(c->types); + + if (c->type_subs) + PFREE(c->type_subs); + + if (c->window_title) + PFREE(c->window_title); + + PFREE(c); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_lock_nc(khui_new_creds * c) +{ + EnterCriticalSection(&c->cs); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_unlock_nc(khui_new_creds * c) +{ + LeaveCriticalSection(&c->cs); + return KHM_ERROR_SUCCESS; +} + +#define NC_N_IDENTITIES 4 + +KHMEXP khm_int32 KHMAPI +khui_cw_add_identity(khui_new_creds * c, + khm_handle id) +{ + if(id == NULL) + return KHM_ERROR_SUCCESS; /* we return success because adding + a NULL id is equivalent to adding + nothing. */ + EnterCriticalSection(&(c->cs)); + + if(c->identities == NULL) { + c->nc_identities = NC_N_IDENTITIES; + c->identities = PMALLOC(sizeof(*(c->identities)) * + c->nc_identities); + c->n_identities = 0; + } else if(c->n_identities + 1 > c->nc_identities) { + khm_handle * ni; + + c->nc_identities = UBOUNDSS(c->n_identities + 1, + NC_N_IDENTITIES, + NC_N_IDENTITIES); + ni = PMALLOC(sizeof(*(c->identities)) * c->nc_identities); + memcpy(ni, c->identities, + sizeof(*(c->identities)) * c->n_identities); + PFREE(c->identities); + c->identities = ni; + } + + kcdb_identity_hold(id); + c->identities[c->n_identities++] = id; + LeaveCriticalSection(&(c->cs)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_set_primary_id(khui_new_creds * c, + khm_handle id) +{ + khm_size i; + khm_int32 rv; + + EnterCriticalSection(&c->cs); + + /* no change */ + if((c->n_identities > 0 && c->identities[0] == id) || + (c->n_identities == 0 && id == NULL)) { + LeaveCriticalSection(&c->cs); + return KHM_ERROR_SUCCESS; + } + + for(i=0; in_identities; i++) { + kcdb_identity_release(c->identities[i]); + } + c->n_identities = 0; + + LeaveCriticalSection(&(c->cs)); + rv = khui_cw_add_identity(c,id); + if(c->hwnd != NULL) { + PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_IDENTITY_CHANGE), 0); + } + return rv; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_add_type(khui_new_creds * c, + khui_new_creds_by_type * t) +{ + EnterCriticalSection(&c->cs); + + if(c->n_types >= KHUI_MAX_NCTYPES) { + LeaveCriticalSection(&c->cs); + return KHM_ERROR_OUT_OF_BOUNDS; + } + + if(c->types == NULL) { + c->nc_types = CW_ALLOC_INCR; + c->types = PMALLOC(sizeof(*(c->types)) * c->nc_types); + c->type_subs = PMALLOC(sizeof(*(c->type_subs)) * c->nc_types); + c->n_types = 0; + } + + if(c->nc_types < c->n_types + 1) { + void * t; + khm_size n; + + n = UBOUNDSS(c->n_types + 1, CW_ALLOC_INCR, CW_ALLOC_INCR); + + t = PMALLOC(sizeof(*(c->types)) * n); + memcpy(t, (void *) c->types, sizeof(*(c->types)) * c->n_types); + PFREE(c->types); + c->types = t; + + t = PMALLOC(sizeof(*(c->type_subs)) * n); + memcpy(t, (void *) c->type_subs, sizeof(*(c->type_subs)) * c->n_types); + PFREE(c->type_subs); + c->type_subs = t; + + c->nc_types = n; + } + + c->type_subs[c->n_types] = kcdb_credtype_get_sub(t->type); + c->types[c->n_types++] = t; + t->nc = c; + LeaveCriticalSection(&c->cs); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_del_type(khui_new_creds * c, + khm_int32 type_id) +{ + khm_size i; + + EnterCriticalSection(&c->cs); + for(i=0; i < c->n_types; i++) { + if(c->types[i]->type == type_id) + break; + } + if(i >= c->n_types) { + LeaveCriticalSection(&c->cs); + return KHM_ERROR_NOT_FOUND; + } + c->n_types--; + for(;i < c->n_types; i++) { + c->types[i] = c->types[i+1]; + c->type_subs[i] = c->type_subs[i+1]; + } + LeaveCriticalSection(&c->cs); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_find_type(khui_new_creds * c, + khm_int32 type, + khui_new_creds_by_type **t) +{ + khm_size i; + + EnterCriticalSection(&c->cs); + *t = NULL; + for(i=0;in_types;i++) { + if(c->types[i]->type == type) { + *t = c->types[i]; + break; + } + } + LeaveCriticalSection(&c->cs); + + if(*t) + return KHM_ERROR_SUCCESS; + return KHM_ERROR_NOT_FOUND; +} + + +KHMEXP khm_int32 KHMAPI +khui_cw_enable_type(khui_new_creds * c, + khm_int32 type, + khm_boolean enable) +{ + khui_new_creds_by_type * t = NULL; + BOOL delta = FALSE; + + EnterCriticalSection(&c->cs); + if(KHM_SUCCEEDED(khui_cw_find_type(c, type, &t))) { + if(enable) { + delta = t->flags & KHUI_NCT_FLAG_DISABLED; + t->flags &= ~KHUI_NCT_FLAG_DISABLED; + } + else { + delta = !(t->flags & KHUI_NCT_FLAG_DISABLED); + t->flags |= KHUI_NCT_FLAG_DISABLED; + } + } + LeaveCriticalSection(&c->cs); + + if(delta) + PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, MAKEWPARAM(0,WMNC_TYPE_STATE), (LPARAM) type); + + return (t)?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_boolean KHMAPI +khui_cw_type_succeeded(khui_new_creds * c, + khm_int32 type) +{ + khui_new_creds_by_type * t; + khm_boolean s; + + EnterCriticalSection(&c->cs); + if(KHM_SUCCEEDED(khui_cw_find_type(c, type, &t))) { + s = (t->flags & KHUI_NCT_FLAG_PROCESSED) && !(t->flags & KHUI_NC_RESPONSE_FAILED); + } else { + s = FALSE; + } + LeaveCriticalSection(&c->cs); + + return s; +} + +static khui_new_creds_prompt * +cw_create_prompt(khm_size idx, + khm_int32 type, + wchar_t * prompt, + wchar_t * def, + khm_int32 flags) +{ + khui_new_creds_prompt * p; + size_t cb_prompt = 0; + size_t cb_def = 0; + + if(prompt && FAILED(StringCbLength(prompt, KHUI_MAXCB_PROMPT, &cb_prompt))) + return NULL; + if(def && FAILED(StringCbLength(def, KHUI_MAXCB_PROMPT_VALUE, &cb_def))) + return NULL; + + p = PMALLOC(sizeof(*p)); + ZeroMemory(p, sizeof(*p)); + + if(prompt) { + cb_prompt += sizeof(wchar_t); + p->prompt = PMALLOC(cb_prompt); + StringCbCopy(p->prompt, cb_prompt, prompt); + } + + if(def && cb_def > 0) { + cb_def += sizeof(wchar_t); + p->def = PMALLOC(cb_def); + StringCbCopy(p->def, cb_def, def); + } + + p->value = PMALLOC(KHUI_MAXCB_PROMPT_VALUE); + ZeroMemory(p->value, KHUI_MAXCB_PROMPT_VALUE); + + p->type = type; + p->flags = flags; + p->index = idx; + + return p; +} + +static void +cw_free_prompt(khui_new_creds_prompt * p) { + size_t cb; + + if(p->prompt) { + if(SUCCEEDED(StringCbLength(p->prompt, KHUI_MAXCB_PROMPT, &cb))) + SecureZeroMemory(p->prompt, cb); + PFREE(p->prompt); + } + + if(p->def) { + if(SUCCEEDED(StringCbLength(p->def, KHUI_MAXCB_PROMPT, &cb))) + SecureZeroMemory(p->def, cb); + PFREE(p->def); + } + + if(p->value) { + if(SUCCEEDED(StringCbLength(p->value, KHUI_MAXCB_PROMPT_VALUE, &cb))) + SecureZeroMemory(p->value, cb); + PFREE(p->value); + } + + PFREE(p); +} + +static void +cw_free_prompts(khui_new_creds * c) +{ + khm_size i; + + if(c->banner != NULL) { + PFREE(c->banner); + c->banner = NULL; + } + + if(c->pname != NULL) { + PFREE(c->pname); + c->pname = NULL; + } + + for(i=0;i < c->n_prompts; i++) { + if(c->prompts[i]) { + cw_free_prompt(c->prompts[i]); + c->prompts[i] = NULL; + } + } + + if(c->prompts != NULL) { + PFREE(c->prompts); + c->prompts = NULL; + } + + c->nc_prompts = 0; + c->n_prompts = 0; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_clear_prompts(khui_new_creds * c) +{ + SendMessage(c->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0,WMNC_CLEAR_PROMPTS), (LPARAM) c); + + EnterCriticalSection(&c->cs); + cw_free_prompts(c); + LeaveCriticalSection(&c->cs); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_begin_custom_prompts(khui_new_creds * c, + khm_size n_prompts, + wchar_t * banner, + wchar_t * pname) +{ + size_t cb; + + PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0,WMNC_CLEAR_PROMPTS), (LPARAM) c); + + EnterCriticalSection(&c->cs); +#ifdef DEBUG + assert(c->n_prompts == 0); +#endif + cw_free_prompts(c); + + if(SUCCEEDED(StringCbLength(banner, KHUI_MAXCB_BANNER, &cb)) && + cb > 0) { + cb += sizeof(wchar_t); + c->banner = PMALLOC(cb); + StringCbCopy(c->banner, cb, banner); + } else { + c->banner = NULL; + } + + if(SUCCEEDED(StringCbLength(pname, KHUI_MAXCB_PNAME, &cb)) && + cb > 0) { + + cb += sizeof(wchar_t); + c->pname = PMALLOC(cb); + StringCbCopy(c->pname, cb, pname); + + } else { + + c->pname = NULL; + + } + + if(n_prompts > 0) { + c->prompts = PMALLOC(sizeof(*(c->prompts)) * n_prompts); + ZeroMemory(c->prompts, sizeof(*(c->prompts)) * n_prompts); + c->nc_prompts = n_prompts; + c->n_prompts = 0; + + } else { + + c->prompts = NULL; + c->n_prompts = 0; + c->nc_prompts = 0; + + PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_SET_PROMPTS), (LPARAM) c); + } + + LeaveCriticalSection(&c->cs); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_add_prompt(khui_new_creds * c, + khm_int32 type, + wchar_t * prompt, + wchar_t * def, + khm_int32 flags) +{ + khui_new_creds_prompt * p; + + if(c->nc_prompts == 0 || + c->n_prompts == c->nc_prompts) + return KHM_ERROR_INVALID_OPERATION; + +#ifdef DEBUG + assert(c->prompts != NULL); +#endif + + EnterCriticalSection(&c->cs); + p = cw_create_prompt(c->n_prompts, type, prompt, def, flags); + if(p == NULL) { + LeaveCriticalSection(&c->cs); + return KHM_ERROR_INVALID_PARAM; + } + c->prompts[c->n_prompts++] = p; + LeaveCriticalSection(&c->cs); + + if(c->n_prompts == c->nc_prompts) { + PostMessage(c->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_SET_PROMPTS), (LPARAM) c); + /* once we are done adding prompts, switch to the auth + panel */ +#if 0 + /* Actually, don't. Doing so can mean an unexpected panel + switch if fiddling on some other panel causes a change in + custom prompts. */ + SendMessage(c->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_SWITCH_PANEL), + (LPARAM) c); +#endif + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_get_prompt_count(khui_new_creds * c, + khm_size * np) { + + EnterCriticalSection(&c->cs); + *np = c->n_prompts; + LeaveCriticalSection(&c->cs); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_get_prompt(khui_new_creds * c, + khm_size idx, + khui_new_creds_prompt ** prompt) +{ + khm_int32 rv; + + EnterCriticalSection(&c->cs); + if(c->n_prompts <= idx || + c->prompts == NULL) { + + rv = KHM_ERROR_OUT_OF_BOUNDS; + *prompt = NULL; + } else { + + *prompt = c->prompts[idx]; + rv = KHM_ERROR_SUCCESS; + } + LeaveCriticalSection(&c->cs); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_sync_prompt_values(khui_new_creds * c) +{ + khm_size i; + khm_size n; + HWND hw; + wchar_t tmpbuf[KHUI_MAXCCH_PROMPT_VALUE]; + + EnterCriticalSection(&c->cs); + redo_loop: + n = c->n_prompts; + for(i=0; iprompts[i]; + if(p->hwnd_edit) { + hw = p->hwnd_edit; + LeaveCriticalSection(&c->cs); + + GetWindowText(hw, tmpbuf, ARRAYLENGTH(tmpbuf)); + + EnterCriticalSection(&c->cs); + if (n != c->n_prompts) + goto redo_loop; + SecureZeroMemory(p->value, KHUI_MAXCB_PROMPT_VALUE); + StringCchCopy(p->value, KHUI_MAXCCH_PROMPT_VALUE, + tmpbuf); + } + } + LeaveCriticalSection(&c->cs); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_get_prompt_value(khui_new_creds * c, + khm_size idx, + wchar_t * buf, + khm_size *cbbuf) +{ + khui_new_creds_prompt * p; + khm_int32 rv; + size_t cb; + + rv = khui_cw_get_prompt(c, idx, &p); + if(KHM_FAILED(rv)) + return rv; + + EnterCriticalSection(&c->cs); + + if(FAILED(StringCbLength(p->value, KHUI_MAXCB_PROMPT_VALUE, &cb))) { + *cbbuf = 0; + if(buf != NULL) + *buf = 0; + LeaveCriticalSection(&c->cs); + return KHM_ERROR_SUCCESS; + } + cb += sizeof(wchar_t); + + if(buf == NULL || *cbbuf < cb) { + *cbbuf = cb; + LeaveCriticalSection(&c->cs); + return KHM_ERROR_TOO_LONG; + } + + StringCbCopy(buf, *cbbuf, p->value); + *cbbuf = cb; + LeaveCriticalSection(&c->cs); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khui_cw_set_response(khui_new_creds * c, + khm_int32 type, + khm_int32 response) +{ + khui_new_creds_by_type * t = NULL; + EnterCriticalSection(&c->cs); + khui_cw_find_type(c, type, &t); + c->response |= response & KHUI_NCMASK_RESPONSE; + if(t) { + t->flags &= ~KHUI_NCMASK_RESULT; + t->flags |= (response & KHUI_NCMASK_RESULT); + + if (!(response & KHUI_NC_RESPONSE_NOEXIT) && + !(response & KHUI_NC_RESPONSE_PENDING)) + t->flags |= KHUI_NC_RESPONSE_COMPLETED; + } + LeaveCriticalSection(&c->cs); + return KHM_ERROR_SUCCESS; +} + +/* only called from a identity provider callback */ +KHMEXP khm_int32 KHMAPI +khui_cw_add_control_row(khui_new_creds * c, + HWND label, + HWND input, + khui_control_size size) +{ + if (c && c->hwnd) { + khui_control_row row; + + row.label = label; + row.input = input; + row.size = size; + + SendMessage(c->hwnd, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_ADD_CONTROL_ROW), + (LPARAM) &row); + + return KHM_ERROR_SUCCESS; + } else { + return KHM_ERROR_INVALID_PARAM; + } +} --- krb5-1.4.4.orig/src/windows/identity/uilib/rescache.c +++ krb5-1.4.4/src/windows/identity/uilib/rescache.c @@ -1,301 +1,301 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -hashtable * h_bitmaps; - -khm_int32 -hash_id(const void *p) { -#pragma warning(push) -#pragma warning(disable: 4311) - return (khm_int32) p; -#pragma warning(pop) -} - -khm_int32 -comp_id(const void *p1, const void *p2) { -#pragma warning(push) -#pragma warning(disable: 4311) - return ((khm_int32)p1) - ((khm_int32)p2); -#pragma warning(pop) -} - -void -del_ref_object(const void *k, void * data) { - DeleteObject((HGDIOBJ) data); -} - -KHMEXP void KHMAPI -khui_init_rescache(void) { - h_bitmaps = hash_new_hashtable(127, hash_id, comp_id, NULL, - del_ref_object); -} - -KHMEXP void KHMAPI -khui_exit_rescache(void) { - hash_del_hashtable(h_bitmaps); -} - -KHMEXP void KHMAPI -khui_cache_bitmap(UINT id, HBITMAP hbm) { - hash_add(h_bitmaps, (void *)(size_t) id, (void *) hbm); -} - -KHMEXP HBITMAP KHMAPI -khui_get_cached_bitmap(UINT id) { - return (HBITMAP) hash_lookup(h_bitmaps, (void *)(size_t) id); -} - -KHMEXP khui_ilist * KHMAPI -khui_create_ilist(int cx, int cy, int n, int ng, int opt) { - BITMAPV5HEADER head; - HDC hdc; - - khui_ilist * il = PMALLOC(sizeof(khui_ilist)); - il->cx = cx; - il->cy = cy; - il->n = n; - il->ng = ng; - il->nused = 0; - hdc = GetDC(NULL); - head.bV5Size = sizeof(head); - head.bV5Width = cx * n; - head.bV5Height = cy; - head.bV5Planes = 1; - head.bV5BitCount = 24; - head.bV5Compression = BI_RGB; - head.bV5SizeImage = 0; - head.bV5XPelsPerMeter = 2835; - head.bV5YPelsPerMeter = 2835; - head.bV5ClrUsed = 0; - head.bV5ClrImportant = 0; - head.bV5AlphaMask = 0; - head.bV5CSType = LCS_WINDOWS_COLOR_SPACE; - head.bV5Intent = LCS_GM_GRAPHICS; - head.bV5ProfileData = 0; - head.bV5ProfileSize = 0; - head.bV5Reserved = 0; - il->img = CreateDIBitmap(hdc, (BITMAPINFOHEADER *) &head, 0, NULL, NULL, DIB_RGB_COLORS); - il->mask = CreateBitmap(cx * n, cy, 1, 1, NULL); - il->idlist = PMALLOC(sizeof(int) * n); - - return il; -} - -KHMEXP BOOL KHMAPI -khui_delete_ilist(khui_ilist * il) { - DeleteObject(il->img); - DeleteObject(il->mask); - PFREE(il->idlist); - PFREE(il); - - return TRUE; -} - -KHMEXP int KHMAPI -khui_ilist_add_masked_id(khui_ilist *il, - HBITMAP hbm, - COLORREF cbkg, - int id) { - int idx; - - idx = khui_ilist_add_masked(il,hbm,cbkg); - if(idx >= 0) { - il->idlist[idx] = id; - } - - return idx; -} - -KHMEXP int KHMAPI -khui_ilist_lookup_id(khui_ilist *il, int id) { - int i; - - for(i=0;inused;i++) { - if(il->idlist[i] == id) - return i; - } - - return -1; -} - -KHMEXP int KHMAPI -khui_ilist_add_masked(khui_ilist * il, HBITMAP hbm, COLORREF cbkg) { - HDC dcr,dci,dct,dcb; - HBITMAP hb_oldb, hb_oldi, hb_oldt; - int sx, i; - int x,y; - - dcr = GetDC(NULL); - dci = CreateCompatibleDC(dcr); - dct = CreateCompatibleDC(dcr); - dcb = CreateCompatibleDC(dcr); - ReleaseDC(NULL,dcr); - - i = il->nused++; - il->idlist[i] = -1; - sx = i * il->cx; - - hb_oldb = SelectObject(dcb, hbm); - hb_oldi = SelectObject(dci, il->img); - hb_oldt = SelectObject(dct, il->mask); - - SetBkColor(dct, RGB(0,0,0)); - SetTextColor(dct, RGB(255,255,255)); - - BitBlt(dci, sx, 0, il->cx, il->cy, dcb, 0, 0, SRCCOPY); - for(y=0;y < il->cy; y++) - for(x=0; xcx; x++) { - COLORREF c = GetPixel(dcb, x, y); - if(c==cbkg) { - SetPixel(dct, sx + x, y, RGB(255,255,255)); - SetPixel(dci, sx + x, y, RGB(0,0,0)); - } else { - SetPixel(dct, sx + x, y, RGB(0,0,0)); - } - } - - SelectObject(dct, hb_oldt); - SelectObject(dci, hb_oldi); - SelectObject(dcb, hb_oldb); - - DeleteDC(dcb); - DeleteDC(dct); - DeleteDC(dci); - - return i; -} - -KHMEXP void KHMAPI -khui_ilist_draw(khui_ilist * il, - int idx, - HDC dc, - int x, - int y, - int opt) { - HDC dci; - HBITMAP hb_oldi; - - if(idx < 0) - return; - - dci = CreateCompatibleDC(dc); - - hb_oldi = SelectObject(dci, il->img); - - /*BitBlt(dc, x, y, il->cx, il->cy, dci, idx*il->cx, 0, SRCCOPY); */ - MaskBlt(dc, x, y, il->cx, il->cy, dci, idx * il->cx, 0, il->mask, idx * il->cx, 0, MAKEROP4(SRCPAINT, SRCCOPY)); -/* MaskBlt(dc, x, y, il->cx, il->cy, dci, idx * il->cx, 0, il->mask, idx * il->cx, 0, MAKEROP4(SRCINVERT, SRCCOPY)); */ - - SelectObject(dci, hb_oldi); - - DeleteDC(dci); -} - -KHMEXP void KHMAPI -khui_ilist_draw_bg(khui_ilist * il, - int idx, - HDC dc, - int x, - int y, - int opt, - COLORREF bgcolor) { - HDC dcm; - HBITMAP hb_oldm, hb_mem; - HBRUSH hbr; - RECT r; - - dcm = CreateCompatibleDC(dc); - - hb_mem = CreateCompatibleBitmap(dc, il->cx, il->cy); - - hb_oldm = SelectObject(dcm, hb_mem); - - hbr = CreateSolidBrush(bgcolor); - - r.left = 0; - r.top = 0; - r.right = il->cx; - r.bottom = il->cy; - - FillRect(dcm, &r, hbr); - - khui_ilist_draw(il,idx,dcm,0,0,opt); - - BitBlt(dc,x,y,il->cx,il->cy,dcm,0,0,SRCCOPY); - - SelectObject(dcm, hb_oldm); - - DeleteObject(hb_mem); - DeleteObject(hbr); - - DeleteDC(dcm); -} - - -KHMEXP void KHMAPI -khui_bitmap_from_hbmp(khui_bitmap * kbm, HBITMAP hbm) -{ - HDC hdc; - BITMAPINFO bmi; - - hdc = CreateCompatibleDC(NULL); - - bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - - kbm->hbmp = hbm; - - if(GetDIBits(hdc, hbm, 0, 0, NULL, &bmi, DIB_RGB_COLORS)) { - kbm->cx = bmi.bmiHeader.biWidth; - kbm->cy = bmi.bmiHeader.biHeight; - } else { - kbm->cx = -1; - kbm->cy = -1; - } - - DeleteDC(hdc); -} - -KHMEXP void KHMAPI -khui_delete_bitmap(khui_bitmap * kbm) { - if (kbm->hbmp) - DeleteObject(kbm->hbmp); - kbm->hbmp = NULL; -} - -KHMEXP void KHMAPI -khui_draw_bitmap(HDC hdc, int x, int y, khui_bitmap * kbm) { - HDC hdcb = CreateCompatibleDC(hdc); - HBITMAP hbmold = SelectObject(hdcb, kbm->hbmp); - - BitBlt(hdc, x, y, kbm->cx, kbm->cy, - hdcb, 0, 0, SRCCOPY); - - SelectObject(hdcb, hbmold); - DeleteDC(hdcb); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +hashtable * h_bitmaps; + +khm_int32 +hash_id(const void *p) { +#pragma warning(push) +#pragma warning(disable: 4311) + return (khm_int32) p; +#pragma warning(pop) +} + +khm_int32 +comp_id(const void *p1, const void *p2) { +#pragma warning(push) +#pragma warning(disable: 4311) + return ((khm_int32)p1) - ((khm_int32)p2); +#pragma warning(pop) +} + +void +del_ref_object(const void *k, void * data) { + DeleteObject((HGDIOBJ) data); +} + +KHMEXP void KHMAPI +khui_init_rescache(void) { + h_bitmaps = hash_new_hashtable(127, hash_id, comp_id, NULL, + del_ref_object); +} + +KHMEXP void KHMAPI +khui_exit_rescache(void) { + hash_del_hashtable(h_bitmaps); +} + +KHMEXP void KHMAPI +khui_cache_bitmap(UINT id, HBITMAP hbm) { + hash_add(h_bitmaps, (void *)(size_t) id, (void *) hbm); +} + +KHMEXP HBITMAP KHMAPI +khui_get_cached_bitmap(UINT id) { + return (HBITMAP) hash_lookup(h_bitmaps, (void *)(size_t) id); +} + +KHMEXP khui_ilist * KHMAPI +khui_create_ilist(int cx, int cy, int n, int ng, int opt) { + BITMAPV5HEADER head; + HDC hdc; + + khui_ilist * il = PMALLOC(sizeof(khui_ilist)); + il->cx = cx; + il->cy = cy; + il->n = n; + il->ng = ng; + il->nused = 0; + hdc = GetDC(NULL); + head.bV5Size = sizeof(head); + head.bV5Width = cx * n; + head.bV5Height = cy; + head.bV5Planes = 1; + head.bV5BitCount = 24; + head.bV5Compression = BI_RGB; + head.bV5SizeImage = 0; + head.bV5XPelsPerMeter = 2835; + head.bV5YPelsPerMeter = 2835; + head.bV5ClrUsed = 0; + head.bV5ClrImportant = 0; + head.bV5AlphaMask = 0; + head.bV5CSType = LCS_WINDOWS_COLOR_SPACE; + head.bV5Intent = LCS_GM_GRAPHICS; + head.bV5ProfileData = 0; + head.bV5ProfileSize = 0; + head.bV5Reserved = 0; + il->img = CreateDIBitmap(hdc, (BITMAPINFOHEADER *) &head, 0, NULL, NULL, DIB_RGB_COLORS); + il->mask = CreateBitmap(cx * n, cy, 1, 1, NULL); + il->idlist = PMALLOC(sizeof(int) * n); + + return il; +} + +KHMEXP BOOL KHMAPI +khui_delete_ilist(khui_ilist * il) { + DeleteObject(il->img); + DeleteObject(il->mask); + PFREE(il->idlist); + PFREE(il); + + return TRUE; +} + +KHMEXP int KHMAPI +khui_ilist_add_masked_id(khui_ilist *il, + HBITMAP hbm, + COLORREF cbkg, + int id) { + int idx; + + idx = khui_ilist_add_masked(il,hbm,cbkg); + if(idx >= 0) { + il->idlist[idx] = id; + } + + return idx; +} + +KHMEXP int KHMAPI +khui_ilist_lookup_id(khui_ilist *il, int id) { + int i; + + for(i=0;inused;i++) { + if(il->idlist[i] == id) + return i; + } + + return -1; +} + +KHMEXP int KHMAPI +khui_ilist_add_masked(khui_ilist * il, HBITMAP hbm, COLORREF cbkg) { + HDC dcr,dci,dct,dcb; + HBITMAP hb_oldb, hb_oldi, hb_oldt; + int sx, i; + int x,y; + + dcr = GetDC(NULL); + dci = CreateCompatibleDC(dcr); + dct = CreateCompatibleDC(dcr); + dcb = CreateCompatibleDC(dcr); + ReleaseDC(NULL,dcr); + + i = il->nused++; + il->idlist[i] = -1; + sx = i * il->cx; + + hb_oldb = SelectObject(dcb, hbm); + hb_oldi = SelectObject(dci, il->img); + hb_oldt = SelectObject(dct, il->mask); + + SetBkColor(dct, RGB(0,0,0)); + SetTextColor(dct, RGB(255,255,255)); + + BitBlt(dci, sx, 0, il->cx, il->cy, dcb, 0, 0, SRCCOPY); + for(y=0;y < il->cy; y++) + for(x=0; xcx; x++) { + COLORREF c = GetPixel(dcb, x, y); + if(c==cbkg) { + SetPixel(dct, sx + x, y, RGB(255,255,255)); + SetPixel(dci, sx + x, y, RGB(0,0,0)); + } else { + SetPixel(dct, sx + x, y, RGB(0,0,0)); + } + } + + SelectObject(dct, hb_oldt); + SelectObject(dci, hb_oldi); + SelectObject(dcb, hb_oldb); + + DeleteDC(dcb); + DeleteDC(dct); + DeleteDC(dci); + + return i; +} + +KHMEXP void KHMAPI +khui_ilist_draw(khui_ilist * il, + int idx, + HDC dc, + int x, + int y, + int opt) { + HDC dci; + HBITMAP hb_oldi; + + if(idx < 0) + return; + + dci = CreateCompatibleDC(dc); + + hb_oldi = SelectObject(dci, il->img); + + /*BitBlt(dc, x, y, il->cx, il->cy, dci, idx*il->cx, 0, SRCCOPY); */ + MaskBlt(dc, x, y, il->cx, il->cy, dci, idx * il->cx, 0, il->mask, idx * il->cx, 0, MAKEROP4(SRCPAINT, SRCCOPY)); +/* MaskBlt(dc, x, y, il->cx, il->cy, dci, idx * il->cx, 0, il->mask, idx * il->cx, 0, MAKEROP4(SRCINVERT, SRCCOPY)); */ + + SelectObject(dci, hb_oldi); + + DeleteDC(dci); +} + +KHMEXP void KHMAPI +khui_ilist_draw_bg(khui_ilist * il, + int idx, + HDC dc, + int x, + int y, + int opt, + COLORREF bgcolor) { + HDC dcm; + HBITMAP hb_oldm, hb_mem; + HBRUSH hbr; + RECT r; + + dcm = CreateCompatibleDC(dc); + + hb_mem = CreateCompatibleBitmap(dc, il->cx, il->cy); + + hb_oldm = SelectObject(dcm, hb_mem); + + hbr = CreateSolidBrush(bgcolor); + + r.left = 0; + r.top = 0; + r.right = il->cx; + r.bottom = il->cy; + + FillRect(dcm, &r, hbr); + + khui_ilist_draw(il,idx,dcm,0,0,opt); + + BitBlt(dc,x,y,il->cx,il->cy,dcm,0,0,SRCCOPY); + + SelectObject(dcm, hb_oldm); + + DeleteObject(hb_mem); + DeleteObject(hbr); + + DeleteDC(dcm); +} + + +KHMEXP void KHMAPI +khui_bitmap_from_hbmp(khui_bitmap * kbm, HBITMAP hbm) +{ + HDC hdc; + BITMAPINFO bmi; + + hdc = CreateCompatibleDC(NULL); + + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + + kbm->hbmp = hbm; + + if(GetDIBits(hdc, hbm, 0, 0, NULL, &bmi, DIB_RGB_COLORS)) { + kbm->cx = bmi.bmiHeader.biWidth; + kbm->cy = bmi.bmiHeader.biHeight; + } else { + kbm->cx = -1; + kbm->cy = -1; + } + + DeleteDC(hdc); +} + +KHMEXP void KHMAPI +khui_delete_bitmap(khui_bitmap * kbm) { + if (kbm->hbmp) + DeleteObject(kbm->hbmp); + kbm->hbmp = NULL; +} + +KHMEXP void KHMAPI +khui_draw_bitmap(HDC hdc, int x, int y, khui_bitmap * kbm) { + HDC hdcb = CreateCompatibleDC(hdc); + HBITMAP hbmold = SelectObject(hdcb, kbm->hbmp); + + BitBlt(hdc, x, y, kbm->cx, kbm->cy, + hdcb, 0, 0, SRCCOPY); + + SelectObject(hdcb, hbmold); + DeleteDC(hdcb); +} --- krb5-1.4.4.orig/src/windows/identity/uilib/trackerwnd.c +++ krb5-1.4.4/src/windows/identity/uilib/trackerwnd.c @@ -1,474 +1,474 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -#define K5_SLIDER_WIDTH 208 -#define K5_SLIDER_HEIGHT 40 - -#define K5_SLIDER_LBL_HPAD 5 -#define K5_SLIDER_LBL_VPAD 22 - -#define KHUI_TRACKER_PROP L"KhmTrackerData" - - -/* Count the number of ticks between tmin and tmax, inclusive -*/ -int time_t_to_ticks(time_t tmin, time_t tmax) -{ - int c = 0; - time_t lo, hi; - - tmin -= tmin % 60; /* our smallest gran is 1 min */ - if(tmax % 60) - tmax += 60 - (tmax % 60); - - lo = tmin; - -#define TFORWARD(limit,gran) \ - if(lo < limit && lo < tmax) { \ - hi = min(tmax, limit); \ - c += (int)((hi - lo) / (gran)); \ - lo = hi; \ - } - - TFORWARD(300,60); - TFORWARD(3600,300); - TFORWARD(3600*4, 60*15); - TFORWARD(3600*10,60*30); - TFORWARD(3600*24,3600); - TFORWARD(3600*24*4,3600*6); - TFORWARD(((time_t)(INFINITE & INT_MAX)),3600*24); - -#undef TFORWARD - - return c; -} - -/* Compute tmax given tmin and ticks such that there are ticks ticks - between tmin and tmax - */ -time_t ticks_to_time_t(int ticks, time_t tmin) -{ - int c = 0; - tmin -= tmin % 60; /* our smallest gran is 1 min */ - -#define SFORWARD(limit,gran) \ - if(tmin < limit && ticks > 0) { \ - c = (int) min(ticks, (limit - tmin) / (gran)); \ - tmin += c * gran; \ - ticks -= c; \ - } - - SFORWARD(300,60); - SFORWARD(3600,300); - SFORWARD(3600*4,60*15); - SFORWARD(3600*10,60*30); - SFORWARD(3600*24,3600); - SFORWARD(3600*24*4,3600*6); - SFORWARD(((time_t)(INFINITE & INT_MAX)),3600*24); - -#undef SFORWARD - - return tmin; -} - -/* Prep a tracker control which works in conjunction with the - duration edit control. - - NOTE: Runs in the context of the UI thread -*/ -void -initialize_tracker(HWND hwnd, - khui_tracker * tc) -{ - RECT r; - FILETIME ft; - wchar_t wbuf[256]; - khm_size cbbuf; - - SendMessage(tc->hw_slider, TBM_SETRANGE, 0, MAKELONG(0, time_t_to_ticks(tc->min, tc->max))); - SendMessage(tc->hw_slider, TBM_SETPOS, TRUE, (LPARAM) time_t_to_ticks(tc->min, tc->current)); - - r.left = K5_SLIDER_LBL_HPAD; - r.top = K5_SLIDER_LBL_VPAD; - r.right = K5_SLIDER_WIDTH - K5_SLIDER_LBL_HPAD; - r.bottom = r.top; - - MapDialogRect(hwnd, &r); - - tc->lbl_y = r.top; - tc->lbl_lx = r.left; - tc->lbl_rx = r.right; - - TimetToFileTimeInterval(tc->current, &ft); - cbbuf = sizeof(wbuf); - FtIntervalToString(&ft, wbuf, &cbbuf); - - SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM)wbuf); -} - - -/* We instance-subclass each tracker control to provide the - functionality that we need. This is the replacement window - procedure - - NOTE: Runs in the context of the UI thread - */ -LRESULT CALLBACK -duration_tracker_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - khui_tracker * tc; - - tc = (khui_tracker *) GetProp(hwnd, KHUI_TRACKER_PROP); -#ifdef DEBUG - assert(tc != NULL); -#endif - - switch(uMsg) { - case WM_PAINT: - { - HDC hdc; - HFONT hf, hfold; - LRESULT lr; - FILETIME ft; - wchar_t buf[256]; - khm_size cbbuf; - - lr = CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam); - - /* Can't use BeginPaint here, since we already called the - window proc */ - hdc = GetWindowDC(hwnd); - - hf = (HFONT) SendMessage(tc->hw_edit, WM_GETFONT, 0, 0); - - hfold = ((HFONT) SelectObject((hdc), (HGDIOBJ)(HFONT)(hf))); - - TimetToFileTimeInterval(tc->min, &ft); - cbbuf = sizeof(buf); - FtIntervalToString(&ft, buf, &cbbuf); - - SetTextColor(hdc, RGB(0,0,0)); - SetBkMode(hdc, TRANSPARENT); - - SetTextAlign(hdc, TA_LEFT | TA_TOP | TA_NOUPDATECP); - TextOut(hdc, tc->lbl_lx, tc->lbl_y, buf, (int) wcslen(buf)); - - TimetToFileTimeInterval(tc->max, &ft); - cbbuf = sizeof(buf); - FtIntervalToString(&ft, buf, &cbbuf); - - SetTextAlign(hdc, TA_RIGHT | TA_TOP | TA_NOUPDATECP); - TextOut(hdc, tc->lbl_rx, tc->lbl_y, buf, (int) wcslen(buf)); - - ((HFONT) SelectObject((hdc), (HGDIOBJ)(HFONT)(hfold))); - - ReleaseDC(hwnd, hdc); - - return lr; - } - break; - - case WM_KILLFOCUS: - { - if((HWND)wParam != tc->hw_edit) - ShowWindow(hwnd, SW_HIDE); - } - break; - - case WM_LBUTTONUP: - case WM_MOUSEMOVE: - { - LRESULT lr; - - lr = CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam); - - if(wParam & MK_LBUTTON) { - int c = (int) SendMessage(hwnd, TBM_GETPOS, 0, 0); - time_t t = ticks_to_time_t(c, tc->min); - - if(t != tc->current) { - wchar_t buf[256]; - FILETIME ft; - khm_size cbbuf; - - tc->current = t; - //d->dirty = TRUE; - cbbuf = sizeof(buf); - TimetToFileTimeInterval(t, &ft); - FtIntervalToString(&ft, buf, &cbbuf); - SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM) buf); - } - } - return lr; - } - } - - return CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam); -} - - -/* Create the subclassed duration slider on behalf of an edit control */ -void -create_edit_sliders(HWND hwnd, - HWND hwnd_dlg, - khui_tracker * tc) -{ - RECT r; - RECT rs; - - GetWindowRect(hwnd, &r); - - rs.top = 0; - rs.left = 0; - rs.right = K5_SLIDER_WIDTH; - rs.bottom = K5_SLIDER_HEIGHT; - MapDialogRect(hwnd_dlg, &rs); - rs.right -= rs.left; - rs.bottom -= rs.top; - - tc->hw_slider = - CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, - TRACKBAR_CLASS, - L"NetIDMgrTimeTickerTrackbar", - WS_POPUP | TBS_AUTOTICKS | TBS_BOTTOM | -#if (_WIN32_IE >= 0x0501) - TBS_DOWNISLEFT | -#endif - TBS_HORZ | WS_CLIPCHILDREN, - r.left,r.bottom,rs.right,rs.bottom, - hwnd, - NULL, - (HINSTANCE)(DWORD_PTR) - GetWindowLongPtr(hwnd, GWLP_HINSTANCE), - NULL); - - SetProp(tc->hw_slider, KHUI_TRACKER_PROP, - (HANDLE) tc); - -#pragma warning(push) -#pragma warning(disable: 4244) - tc->fn_tracker = (WNDPROC)(LONG_PTR) SetWindowLongPtr(tc->hw_slider, GWLP_WNDPROC, (LONG_PTR) duration_tracker_proc); -#pragma warning(pop) -} - -/* An edit control is instance-subclassed to create an edit control - that holds a duration. Welcome to the window procedure. - - NOTE: Runs in the context of the UI thread - */ -LRESULT CALLBACK -duration_edit_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - khui_tracker * tc; - - tc = (khui_tracker *) GetProp(hwnd, KHUI_TRACKER_PROP); - -#ifdef DEBUG - assert(tc != NULL); -#endif - - switch(uMsg) { - case WM_SETFOCUS: - { - HWND p; - - p = GetParent(hwnd); - - /* we are being activated. */ - if(tc->hw_slider == NULL) { - create_edit_sliders(hwnd, p, tc); - initialize_tracker(p, tc); - } - - khui_tracker_reposition(tc); - -#ifdef SHOW_PANEL_ON_FIRST_ACTIVATE - ShowWindow(tc->hw_slider, SW_SHOWNOACTIVATE); -#endif - - tc->act_time = GetTickCount(); - } - break; - - case WM_KILLFOCUS: - { - wchar_t wbuf[256]; - FILETIME ft; - khm_size cbbuf; - - if((HWND) wParam != tc->hw_slider) - ShowWindow(tc->hw_slider, SW_HIDE); - - TimetToFileTimeInterval(tc->current, &ft); - cbbuf = sizeof(wbuf); - FtIntervalToString(&ft, wbuf, &cbbuf); - - SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM)wbuf); - } - break; - - case KHUI_WM_NC_NOTIFY: - if(HIWORD(wParam) == WMNC_DIALOG_SETUP) { - HWND p; - - p = GetParent(hwnd); - - if(tc->hw_slider == NULL) { - create_edit_sliders(hwnd,p,tc); - } - - initialize_tracker(p, tc); - } - return TRUE; - - case WM_LBUTTONUP: - if (IsWindowVisible(tc->hw_slider)) { - DWORD tm; - - tm = GetTickCount(); - if (tm - tc->act_time > 000) - ShowWindow(tc->hw_slider, SW_HIDE); - } else { - ShowWindow(tc->hw_slider, SW_SHOWNOACTIVATE); - } - break; - - /* these messages can potentially change the text in the edit - control. We intercept them and see what changed. We may - need to grab and handle them */ - case EM_REPLACESEL: - case EM_UNDO: - case WM_UNDO: - case WM_CHAR: -#if (_WIN32_WINNT >= 0x0501) - case WM_UNICHAR: -#endif - { - wchar_t buf[256]; - size_t nchars; - time_t ts; - FILETIME ft; - BOOL modified; - LRESULT lr = CallWindowProc(tc->fn_edit, hwnd, uMsg, wParam, lParam); - - modified = (BOOL) SendMessage(hwnd, EM_GETMODIFY, 0, 0); - if(modified) { - /* parse the string */ - if(nchars = (size_t) SendMessage(hwnd, WM_GETTEXT, ARRAYLENGTH(buf), (LPARAM) buf)) { - buf[nchars] = 0; - - if(KHM_SUCCEEDED(IntervalStringToFt(&ft, buf))) { - ts = FtIntervalToSeconds(&ft); - if(ts >= tc->min && ts <= tc->max) { - tc->current = ts; - //d->dirty = TRUE; - if(tc->hw_slider != NULL) - SendMessage(tc->hw_slider, TBM_SETPOS, TRUE, (LPARAM) time_t_to_ticks(tc->min, tc->current)); - } - } - } - SendMessage(hwnd, EM_SETMODIFY, FALSE, 0); - } - - return lr; - } - } - - return CallWindowProc(tc->fn_edit, hwnd, uMsg, wParam, lParam); -} - -KHMEXP void KHMAPI -khui_tracker_install(HWND hwnd_edit, khui_tracker * tc) { -#ifdef DEBUG - assert(hwnd_edit); - assert(tc); -#endif - - tc->hw_edit = hwnd_edit; - - SetProp(hwnd_edit, KHUI_TRACKER_PROP, (HANDLE) tc); - -#pragma warning(push) -#pragma warning(disable: 4244) - tc->fn_edit = (WNDPROC)(LONG_PTR) - SetWindowLongPtr(hwnd_edit, GWLP_WNDPROC, - (LONG_PTR) duration_edit_proc); -#pragma warning(pop) -} - -KHMEXP void KHMAPI -khui_tracker_reposition(khui_tracker * tc) { - RECT r; - - if(tc->hw_slider && tc->hw_edit) { - GetWindowRect(tc->hw_edit, &r); - SetWindowPos(tc->hw_slider, - NULL, - r.left, r.bottom, - 0, 0, - SWP_NOOWNERZORDER | SWP_NOSIZE | - SWP_NOZORDER | SWP_NOACTIVATE); - } -} - -KHMEXP void KHMAPI -khui_tracker_initialize(khui_tracker * tc) { - ZeroMemory(tc, sizeof(*tc)); -} - -KHMEXP void KHMAPI -khui_tracker_refresh(khui_tracker * tc) { - if (!tc->hw_edit) - return; - - SendMessage(tc->hw_edit, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0,WMNC_DIALOG_SETUP), 0); -} - -KHMEXP void KHMAPI -khui_tracker_kill_controls(khui_tracker * tc) { - if (tc->hw_slider) - DestroyWindow(tc->hw_slider); - if (tc->hw_edit) - DestroyWindow(tc->hw_edit); - tc->hw_slider = NULL; - tc->hw_edit = NULL; - tc->fn_edit = NULL; - tc->fn_tracker = NULL; -} - - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +#define K5_SLIDER_WIDTH 208 +#define K5_SLIDER_HEIGHT 40 + +#define K5_SLIDER_LBL_HPAD 5 +#define K5_SLIDER_LBL_VPAD 22 + +#define KHUI_TRACKER_PROP L"KhmTrackerData" + + +/* Count the number of ticks between tmin and tmax, inclusive +*/ +int time_t_to_ticks(time_t tmin, time_t tmax) +{ + int c = 0; + time_t lo, hi; + + tmin -= tmin % 60; /* our smallest gran is 1 min */ + if(tmax % 60) + tmax += 60 - (tmax % 60); + + lo = tmin; + +#define TFORWARD(limit,gran) \ + if(lo < limit && lo < tmax) { \ + hi = min(tmax, limit); \ + c += (int)((hi - lo) / (gran)); \ + lo = hi; \ + } + + TFORWARD(300,60); + TFORWARD(3600,300); + TFORWARD(3600*4, 60*15); + TFORWARD(3600*10,60*30); + TFORWARD(3600*24,3600); + TFORWARD(3600*24*4,3600*6); + TFORWARD(((time_t)(INFINITE & INT_MAX)),3600*24); + +#undef TFORWARD + + return c; +} + +/* Compute tmax given tmin and ticks such that there are ticks ticks + between tmin and tmax + */ +time_t ticks_to_time_t(int ticks, time_t tmin) +{ + int c = 0; + tmin -= tmin % 60; /* our smallest gran is 1 min */ + +#define SFORWARD(limit,gran) \ + if(tmin < limit && ticks > 0) { \ + c = (int) min(ticks, (limit - tmin) / (gran)); \ + tmin += c * gran; \ + ticks -= c; \ + } + + SFORWARD(300,60); + SFORWARD(3600,300); + SFORWARD(3600*4,60*15); + SFORWARD(3600*10,60*30); + SFORWARD(3600*24,3600); + SFORWARD(3600*24*4,3600*6); + SFORWARD(((time_t)(INFINITE & INT_MAX)),3600*24); + +#undef SFORWARD + + return tmin; +} + +/* Prep a tracker control which works in conjunction with the + duration edit control. + + NOTE: Runs in the context of the UI thread +*/ +void +initialize_tracker(HWND hwnd, + khui_tracker * tc) +{ + RECT r; + FILETIME ft; + wchar_t wbuf[256]; + khm_size cbbuf; + + SendMessage(tc->hw_slider, TBM_SETRANGE, 0, MAKELONG(0, time_t_to_ticks(tc->min, tc->max))); + SendMessage(tc->hw_slider, TBM_SETPOS, TRUE, (LPARAM) time_t_to_ticks(tc->min, tc->current)); + + r.left = K5_SLIDER_LBL_HPAD; + r.top = K5_SLIDER_LBL_VPAD; + r.right = K5_SLIDER_WIDTH - K5_SLIDER_LBL_HPAD; + r.bottom = r.top; + + MapDialogRect(hwnd, &r); + + tc->lbl_y = r.top; + tc->lbl_lx = r.left; + tc->lbl_rx = r.right; + + TimetToFileTimeInterval(tc->current, &ft); + cbbuf = sizeof(wbuf); + FtIntervalToString(&ft, wbuf, &cbbuf); + + SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM)wbuf); +} + + +/* We instance-subclass each tracker control to provide the + functionality that we need. This is the replacement window + procedure + + NOTE: Runs in the context of the UI thread + */ +LRESULT CALLBACK +duration_tracker_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + khui_tracker * tc; + + tc = (khui_tracker *) GetProp(hwnd, KHUI_TRACKER_PROP); +#ifdef DEBUG + assert(tc != NULL); +#endif + + switch(uMsg) { + case WM_PAINT: + { + HDC hdc; + HFONT hf, hfold; + LRESULT lr; + FILETIME ft; + wchar_t buf[256]; + khm_size cbbuf; + + lr = CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam); + + /* Can't use BeginPaint here, since we already called the + window proc */ + hdc = GetWindowDC(hwnd); + + hf = (HFONT) SendMessage(tc->hw_edit, WM_GETFONT, 0, 0); + + hfold = ((HFONT) SelectObject((hdc), (HGDIOBJ)(HFONT)(hf))); + + TimetToFileTimeInterval(tc->min, &ft); + cbbuf = sizeof(buf); + FtIntervalToString(&ft, buf, &cbbuf); + + SetTextColor(hdc, RGB(0,0,0)); + SetBkMode(hdc, TRANSPARENT); + + SetTextAlign(hdc, TA_LEFT | TA_TOP | TA_NOUPDATECP); + TextOut(hdc, tc->lbl_lx, tc->lbl_y, buf, (int) wcslen(buf)); + + TimetToFileTimeInterval(tc->max, &ft); + cbbuf = sizeof(buf); + FtIntervalToString(&ft, buf, &cbbuf); + + SetTextAlign(hdc, TA_RIGHT | TA_TOP | TA_NOUPDATECP); + TextOut(hdc, tc->lbl_rx, tc->lbl_y, buf, (int) wcslen(buf)); + + ((HFONT) SelectObject((hdc), (HGDIOBJ)(HFONT)(hfold))); + + ReleaseDC(hwnd, hdc); + + return lr; + } + break; + + case WM_KILLFOCUS: + { + if((HWND)wParam != tc->hw_edit) + ShowWindow(hwnd, SW_HIDE); + } + break; + + case WM_LBUTTONUP: + case WM_MOUSEMOVE: + { + LRESULT lr; + + lr = CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam); + + if(wParam & MK_LBUTTON) { + int c = (int) SendMessage(hwnd, TBM_GETPOS, 0, 0); + time_t t = ticks_to_time_t(c, tc->min); + + if(t != tc->current) { + wchar_t buf[256]; + FILETIME ft; + khm_size cbbuf; + + tc->current = t; + //d->dirty = TRUE; + cbbuf = sizeof(buf); + TimetToFileTimeInterval(t, &ft); + FtIntervalToString(&ft, buf, &cbbuf); + SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM) buf); + } + } + return lr; + } + } + + return CallWindowProc(tc->fn_tracker, hwnd, uMsg, wParam, lParam); +} + + +/* Create the subclassed duration slider on behalf of an edit control */ +void +create_edit_sliders(HWND hwnd, + HWND hwnd_dlg, + khui_tracker * tc) +{ + RECT r; + RECT rs; + + GetWindowRect(hwnd, &r); + + rs.top = 0; + rs.left = 0; + rs.right = K5_SLIDER_WIDTH; + rs.bottom = K5_SLIDER_HEIGHT; + MapDialogRect(hwnd_dlg, &rs); + rs.right -= rs.left; + rs.bottom -= rs.top; + + tc->hw_slider = + CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, + TRACKBAR_CLASS, + L"NetIDMgrTimeTickerTrackbar", + WS_POPUP | TBS_AUTOTICKS | TBS_BOTTOM | +#if (_WIN32_IE >= 0x0501) + TBS_DOWNISLEFT | +#endif + TBS_HORZ | WS_CLIPCHILDREN, + r.left,r.bottom,rs.right,rs.bottom, + hwnd, + NULL, + (HINSTANCE)(DWORD_PTR) + GetWindowLongPtr(hwnd, GWLP_HINSTANCE), + NULL); + + SetProp(tc->hw_slider, KHUI_TRACKER_PROP, + (HANDLE) tc); + +#pragma warning(push) +#pragma warning(disable: 4244) + tc->fn_tracker = (WNDPROC)(LONG_PTR) SetWindowLongPtr(tc->hw_slider, GWLP_WNDPROC, (LONG_PTR) duration_tracker_proc); +#pragma warning(pop) +} + +/* An edit control is instance-subclassed to create an edit control + that holds a duration. Welcome to the window procedure. + + NOTE: Runs in the context of the UI thread + */ +LRESULT CALLBACK +duration_edit_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + khui_tracker * tc; + + tc = (khui_tracker *) GetProp(hwnd, KHUI_TRACKER_PROP); + +#ifdef DEBUG + assert(tc != NULL); +#endif + + switch(uMsg) { + case WM_SETFOCUS: + { + HWND p; + + p = GetParent(hwnd); + + /* we are being activated. */ + if(tc->hw_slider == NULL) { + create_edit_sliders(hwnd, p, tc); + initialize_tracker(p, tc); + } + + khui_tracker_reposition(tc); + +#ifdef SHOW_PANEL_ON_FIRST_ACTIVATE + ShowWindow(tc->hw_slider, SW_SHOWNOACTIVATE); +#endif + + tc->act_time = GetTickCount(); + } + break; + + case WM_KILLFOCUS: + { + wchar_t wbuf[256]; + FILETIME ft; + khm_size cbbuf; + + if((HWND) wParam != tc->hw_slider) + ShowWindow(tc->hw_slider, SW_HIDE); + + TimetToFileTimeInterval(tc->current, &ft); + cbbuf = sizeof(wbuf); + FtIntervalToString(&ft, wbuf, &cbbuf); + + SendMessage(tc->hw_edit, WM_SETTEXT, 0, (LPARAM)wbuf); + } + break; + + case KHUI_WM_NC_NOTIFY: + if(HIWORD(wParam) == WMNC_DIALOG_SETUP) { + HWND p; + + p = GetParent(hwnd); + + if(tc->hw_slider == NULL) { + create_edit_sliders(hwnd,p,tc); + } + + initialize_tracker(p, tc); + } + return TRUE; + + case WM_LBUTTONUP: + if (IsWindowVisible(tc->hw_slider)) { + DWORD tm; + + tm = GetTickCount(); + if (tm - tc->act_time > 000) + ShowWindow(tc->hw_slider, SW_HIDE); + } else { + ShowWindow(tc->hw_slider, SW_SHOWNOACTIVATE); + } + break; + + /* these messages can potentially change the text in the edit + control. We intercept them and see what changed. We may + need to grab and handle them */ + case EM_REPLACESEL: + case EM_UNDO: + case WM_UNDO: + case WM_CHAR: +#if (_WIN32_WINNT >= 0x0501) + case WM_UNICHAR: +#endif + { + wchar_t buf[256]; + size_t nchars; + time_t ts; + FILETIME ft; + BOOL modified; + LRESULT lr = CallWindowProc(tc->fn_edit, hwnd, uMsg, wParam, lParam); + + modified = (BOOL) SendMessage(hwnd, EM_GETMODIFY, 0, 0); + if(modified) { + /* parse the string */ + if(nchars = (size_t) SendMessage(hwnd, WM_GETTEXT, ARRAYLENGTH(buf), (LPARAM) buf)) { + buf[nchars] = 0; + + if(KHM_SUCCEEDED(IntervalStringToFt(&ft, buf))) { + ts = FtIntervalToSeconds(&ft); + if(ts >= tc->min && ts <= tc->max) { + tc->current = ts; + //d->dirty = TRUE; + if(tc->hw_slider != NULL) + SendMessage(tc->hw_slider, TBM_SETPOS, TRUE, (LPARAM) time_t_to_ticks(tc->min, tc->current)); + } + } + } + SendMessage(hwnd, EM_SETMODIFY, FALSE, 0); + } + + return lr; + } + } + + return CallWindowProc(tc->fn_edit, hwnd, uMsg, wParam, lParam); +} + +KHMEXP void KHMAPI +khui_tracker_install(HWND hwnd_edit, khui_tracker * tc) { +#ifdef DEBUG + assert(hwnd_edit); + assert(tc); +#endif + + tc->hw_edit = hwnd_edit; + + SetProp(hwnd_edit, KHUI_TRACKER_PROP, (HANDLE) tc); + +#pragma warning(push) +#pragma warning(disable: 4244) + tc->fn_edit = (WNDPROC)(LONG_PTR) + SetWindowLongPtr(hwnd_edit, GWLP_WNDPROC, + (LONG_PTR) duration_edit_proc); +#pragma warning(pop) +} + +KHMEXP void KHMAPI +khui_tracker_reposition(khui_tracker * tc) { + RECT r; + + if(tc->hw_slider && tc->hw_edit) { + GetWindowRect(tc->hw_edit, &r); + SetWindowPos(tc->hw_slider, + NULL, + r.left, r.bottom, + 0, 0, + SWP_NOOWNERZORDER | SWP_NOSIZE | + SWP_NOZORDER | SWP_NOACTIVATE); + } +} + +KHMEXP void KHMAPI +khui_tracker_initialize(khui_tracker * tc) { + ZeroMemory(tc, sizeof(*tc)); +} + +KHMEXP void KHMAPI +khui_tracker_refresh(khui_tracker * tc) { + if (!tc->hw_edit) + return; + + SendMessage(tc->hw_edit, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0,WMNC_DIALOG_SETUP), 0); +} + +KHMEXP void KHMAPI +khui_tracker_kill_controls(khui_tracker * tc) { + if (tc->hw_slider) + DestroyWindow(tc->hw_slider); + if (tc->hw_edit) + DestroyWindow(tc->hw_edit); + tc->hw_slider = NULL; + tc->hw_edit = NULL; + tc->fn_edit = NULL; + tc->fn_tracker = NULL; +} + + --- krb5-1.4.4.orig/src/windows/identity/kmm/kmm_reg.c +++ krb5-1.4.4/src/windows/identity/kmm/kmm_reg.c @@ -1,336 +1,336 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * Copyright (c) 2006 Secure Endpoints Inc. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -KHMEXP khm_int32 KHMAPI -kmm_get_module_info(wchar_t * module_name, khm_int32 flags, - kmm_module_info * buffer, khm_size * cb_buffer) -{ - /*TODO:Implement this */ - return KHM_ERROR_NOT_IMPLEMENTED; -} - -KHMEXP khm_int32 KHMAPI -kmm_get_plugin_info(wchar_t * plugin_name, - kmm_plugin_info * buffer, khm_size * cb_buffer) -{ - /*TODO:Implement this */ - return KHM_ERROR_NOT_IMPLEMENTED; -} - -KHMEXP khm_int32 KHMAPI -kmm_get_plugins_config(khm_int32 flags, khm_handle * result) { - khm_handle csp_root; - khm_handle csp_plugins; - khm_int32 rv; - - rv = khc_open_space(KHM_INVALID_HANDLE, KMM_CSNAME_ROOT, flags, &csp_root); - - if(KHM_FAILED(rv)) - return rv; - - rv = khc_open_space(csp_root, KMM_CSNAME_PLUGINS, flags, &csp_plugins); - khc_close_space(csp_root); - - if(KHM_SUCCEEDED(rv)) - *result = csp_plugins; - else - *result = NULL; - - return rv; -} - - -KHMEXP khm_int32 KHMAPI -kmm_get_modules_config(khm_int32 flags, khm_handle * result) { - khm_handle croot; - khm_handle kmm_all_modules; - khm_int32 rv; - - rv = khc_open_space(NULL, KMM_CSNAME_ROOT, flags, &croot); - - if(KHM_FAILED(rv)) - return rv; - - rv = khc_open_space(croot, KMM_CSNAME_MODULES, flags, &kmm_all_modules); - khc_close_space(croot); - - if(KHM_SUCCEEDED(rv)) - *result = kmm_all_modules; - else - *result = NULL; - - return rv; -} - - -KHMEXP khm_int32 KHMAPI -kmm_get_plugin_config(wchar_t * plugin, khm_int32 flags, khm_handle * result) -{ - khm_handle csplugins; - khm_handle csplugin; - khm_int32 rv; - - if(!plugin || wcschr(plugin, L'/') || wcschr(plugin, L'\\')) - return KHM_ERROR_INVALID_PARAM; - - if(KHM_FAILED(kmm_get_plugins_config(flags, &csplugins))) - return KHM_ERROR_UNKNOWN; - - rv = khc_open_space(csplugins, plugin, flags, &csplugin); - *result = csplugin; - - khc_close_space(csplugins); - - return rv; -} - - -KHMEXP khm_int32 KHMAPI -kmm_get_module_config(wchar_t * module, khm_int32 flags, khm_handle * result) -{ - khm_handle csmodules; - khm_handle csmodule; - khm_int32 rv; - - if(!module || wcschr(module, L'/') || wcschr(module, L'\\')) - return KHM_ERROR_INVALID_PARAM; - - if(KHM_FAILED(kmm_get_modules_config(flags, &csmodules))) - return KHM_ERROR_UNKNOWN; - - rv = khc_open_space(csmodules, module, flags, &csmodule); - *result = csmodule; - - khc_close_space(csmodules); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_register_plugin(kmm_plugin_reg * plugin, khm_int32 config_flags) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_handle csp_plugin = NULL; - khm_handle csp_module = NULL; - size_t cch; - - /* avoid accidently creating the module key if it doesn't exist */ - config_flags &= ~KHM_FLAG_CREATE; - - if((plugin == NULL) || - (plugin->dependencies && - KHM_FAILED(multi_string_length_cch(plugin->dependencies, - KMM_MAXCCH_DEPS, &cch))) || - FAILED(StringCchLength(plugin->module, KMM_MAXCCH_NAME, &cch)) || - (plugin->description && - FAILED(StringCchLength(plugin->description, - KMM_MAXCCH_DESC, &cch))) || - FAILED(StringCchLength(plugin->name, KMM_MAXCCH_NAME, &cch))) - { - return KHM_ERROR_INVALID_PARAM; - } - - /* note that we are retaining the length of the plugin name in - chars in cch */ - cch ++; - -#define CKRV if(KHM_FAILED(rv)) goto _exit - - rv = kmm_get_plugin_config(plugin->name, - config_flags | KHM_FLAG_CREATE, &csp_plugin); - CKRV; - - /* should fail if the module key doesn't exist */ - rv = kmm_get_module_config(plugin->module, config_flags, &csp_module); - CKRV; - - /*TODO: Make sure that the module registration is in the same - config store as the one in which the plugin is going to be - registered */ - - rv = khc_write_string(csp_plugin, L"Module", plugin->module); - CKRV; - if(plugin->description) { - rv = khc_write_string(csp_plugin, L"Description", plugin->description); - CKRV; - } - - if(plugin->dependencies) { - rv = khc_write_multi_string(csp_plugin, L"Dependencies", - plugin->dependencies); - CKRV; - } - - rv = khc_write_int32(csp_plugin, L"Type", plugin->type); - CKRV; - rv = khc_write_int32(csp_plugin, L"Disabled", - !!(plugin->flags & KMM_PLUGIN_FLAG_DISABLED)); - CKRV; - - { - khm_size cb = 0; - wchar_t * pl = NULL; - size_t scb = 0; - - rv = khc_read_multi_string(csp_module, L"PluginList", NULL, &cb); - if(rv != KHM_ERROR_TOO_LONG) { - if (rv == KHM_ERROR_NOT_FOUND) { - - scb = cb = cch * sizeof(wchar_t); - pl = PMALLOC(cb); - multi_string_init(pl, cb); - rv = KHM_ERROR_SUCCESS; - - goto add_plugin_to_list; - - } else { - goto _exit; - } - } - - cb += cch * sizeof(wchar_t); - scb = cb; - - pl = PMALLOC(cb); - - rv = khc_read_multi_string(csp_module, L"PluginList", pl, &cb); - if(KHM_FAILED(rv)) { - if(pl) - PFREE(pl); - goto _exit; - } - - add_plugin_to_list: - - if(!multi_string_find(pl, plugin->name, 0)) { - multi_string_append(pl, &scb, plugin->name); - rv = khc_write_multi_string(csp_module, L"PluginList", pl); - } - - PFREE(pl); - CKRV; - } - -#undef CKRV - -_exit: - if(csp_plugin) - khc_close_space(csp_plugin); - if(csp_module) - khc_close_space(csp_module); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_register_module(kmm_module_reg * module, khm_int32 config_flags) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_handle csp_module = NULL; - size_t cch; - int i; - - if((module == NULL) || - FAILED(StringCchLength(module->name, KMM_MAXCCH_NAME, &cch)) || - (module->description && - FAILED(StringCchLength(module->description, - KMM_MAXCCH_DESC, &cch))) || - FAILED(StringCchLength(module->path, MAX_PATH, &cch)) || - (module->n_plugins > 0 && module->plugin_reg_info == NULL)) { - return KHM_ERROR_INVALID_PARAM; - } - -#define CKRV if(KHM_FAILED(rv)) goto _exit - - rv = kmm_get_module_config(module->name, config_flags | KHM_FLAG_CREATE, - &csp_module); - CKRV; - - rv = khc_write_string(csp_module, L"ImagePath", module->path); - CKRV; - - rv = khc_write_int32(csp_module, L"Disabled", 0); - CKRV; - - /* FileVersion and ProductVersion will be set when the module - is loaded for the first time */ - - for(i=0; in_plugins; i++) { - rv = kmm_register_plugin(&(module->plugin_reg_info[i]), config_flags); - CKRV; - } - -#undef CKRV -_exit: - if(csp_module) - khc_close_space(csp_module); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_unregister_plugin(wchar_t * plugin, khm_int32 config_flags) -{ - khm_handle csp_plugin = NULL; - khm_int32 rv = KHM_ERROR_SUCCESS; - - rv = kmm_get_plugin_config(plugin, config_flags, &csp_plugin); - - if (KHM_FAILED(rv)) - goto _cleanup; - - rv = khc_remove_space(csp_plugin); - - _cleanup: - - if (csp_plugin) - khc_close_space(csp_plugin); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_unregister_module(wchar_t * module, khm_int32 config_flags) -{ - khm_handle csp_module = NULL; - khm_int32 rv = KHM_ERROR_SUCCESS; - - rv = kmm_get_module_config(module, config_flags, &csp_module); - - if (KHM_FAILED(rv)) - goto _cleanup; - - rv = khc_remove_space(csp_module); - - _cleanup: - if (csp_module) - khc_close_space(csp_module); - - return rv; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * Copyright (c) 2006 Secure Endpoints Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +KHMEXP khm_int32 KHMAPI +kmm_get_module_info(wchar_t * module_name, khm_int32 flags, + kmm_module_info * buffer, khm_size * cb_buffer) +{ + /*TODO:Implement this */ + return KHM_ERROR_NOT_IMPLEMENTED; +} + +KHMEXP khm_int32 KHMAPI +kmm_get_plugin_info(wchar_t * plugin_name, + kmm_plugin_info * buffer, khm_size * cb_buffer) +{ + /*TODO:Implement this */ + return KHM_ERROR_NOT_IMPLEMENTED; +} + +KHMEXP khm_int32 KHMAPI +kmm_get_plugins_config(khm_int32 flags, khm_handle * result) { + khm_handle csp_root; + khm_handle csp_plugins; + khm_int32 rv; + + rv = khc_open_space(KHM_INVALID_HANDLE, KMM_CSNAME_ROOT, flags, &csp_root); + + if(KHM_FAILED(rv)) + return rv; + + rv = khc_open_space(csp_root, KMM_CSNAME_PLUGINS, flags, &csp_plugins); + khc_close_space(csp_root); + + if(KHM_SUCCEEDED(rv)) + *result = csp_plugins; + else + *result = NULL; + + return rv; +} + + +KHMEXP khm_int32 KHMAPI +kmm_get_modules_config(khm_int32 flags, khm_handle * result) { + khm_handle croot; + khm_handle kmm_all_modules; + khm_int32 rv; + + rv = khc_open_space(NULL, KMM_CSNAME_ROOT, flags, &croot); + + if(KHM_FAILED(rv)) + return rv; + + rv = khc_open_space(croot, KMM_CSNAME_MODULES, flags, &kmm_all_modules); + khc_close_space(croot); + + if(KHM_SUCCEEDED(rv)) + *result = kmm_all_modules; + else + *result = NULL; + + return rv; +} + + +KHMEXP khm_int32 KHMAPI +kmm_get_plugin_config(wchar_t * plugin, khm_int32 flags, khm_handle * result) +{ + khm_handle csplugins; + khm_handle csplugin; + khm_int32 rv; + + if(!plugin || wcschr(plugin, L'/') || wcschr(plugin, L'\\')) + return KHM_ERROR_INVALID_PARAM; + + if(KHM_FAILED(kmm_get_plugins_config(flags, &csplugins))) + return KHM_ERROR_UNKNOWN; + + rv = khc_open_space(csplugins, plugin, flags, &csplugin); + *result = csplugin; + + khc_close_space(csplugins); + + return rv; +} + + +KHMEXP khm_int32 KHMAPI +kmm_get_module_config(wchar_t * module, khm_int32 flags, khm_handle * result) +{ + khm_handle csmodules; + khm_handle csmodule; + khm_int32 rv; + + if(!module || wcschr(module, L'/') || wcschr(module, L'\\')) + return KHM_ERROR_INVALID_PARAM; + + if(KHM_FAILED(kmm_get_modules_config(flags, &csmodules))) + return KHM_ERROR_UNKNOWN; + + rv = khc_open_space(csmodules, module, flags, &csmodule); + *result = csmodule; + + khc_close_space(csmodules); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_register_plugin(kmm_plugin_reg * plugin, khm_int32 config_flags) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_handle csp_plugin = NULL; + khm_handle csp_module = NULL; + size_t cch; + + /* avoid accidently creating the module key if it doesn't exist */ + config_flags &= ~KHM_FLAG_CREATE; + + if((plugin == NULL) || + (plugin->dependencies && + KHM_FAILED(multi_string_length_cch(plugin->dependencies, + KMM_MAXCCH_DEPS, &cch))) || + FAILED(StringCchLength(plugin->module, KMM_MAXCCH_NAME, &cch)) || + (plugin->description && + FAILED(StringCchLength(plugin->description, + KMM_MAXCCH_DESC, &cch))) || + FAILED(StringCchLength(plugin->name, KMM_MAXCCH_NAME, &cch))) + { + return KHM_ERROR_INVALID_PARAM; + } + + /* note that we are retaining the length of the plugin name in + chars in cch */ + cch ++; + +#define CKRV if(KHM_FAILED(rv)) goto _exit + + rv = kmm_get_plugin_config(plugin->name, + config_flags | KHM_FLAG_CREATE, &csp_plugin); + CKRV; + + /* should fail if the module key doesn't exist */ + rv = kmm_get_module_config(plugin->module, config_flags, &csp_module); + CKRV; + + /*TODO: Make sure that the module registration is in the same + config store as the one in which the plugin is going to be + registered */ + + rv = khc_write_string(csp_plugin, L"Module", plugin->module); + CKRV; + if(plugin->description) { + rv = khc_write_string(csp_plugin, L"Description", plugin->description); + CKRV; + } + + if(plugin->dependencies) { + rv = khc_write_multi_string(csp_plugin, L"Dependencies", + plugin->dependencies); + CKRV; + } + + rv = khc_write_int32(csp_plugin, L"Type", plugin->type); + CKRV; + rv = khc_write_int32(csp_plugin, L"Disabled", + !!(plugin->flags & KMM_PLUGIN_FLAG_DISABLED)); + CKRV; + + { + khm_size cb = 0; + wchar_t * pl = NULL; + size_t scb = 0; + + rv = khc_read_multi_string(csp_module, L"PluginList", NULL, &cb); + if(rv != KHM_ERROR_TOO_LONG) { + if (rv == KHM_ERROR_NOT_FOUND) { + + scb = cb = cch * sizeof(wchar_t); + pl = PMALLOC(cb); + multi_string_init(pl, cb); + rv = KHM_ERROR_SUCCESS; + + goto add_plugin_to_list; + + } else { + goto _exit; + } + } + + cb += cch * sizeof(wchar_t); + scb = cb; + + pl = PMALLOC(cb); + + rv = khc_read_multi_string(csp_module, L"PluginList", pl, &cb); + if(KHM_FAILED(rv)) { + if(pl) + PFREE(pl); + goto _exit; + } + + add_plugin_to_list: + + if(!multi_string_find(pl, plugin->name, 0)) { + multi_string_append(pl, &scb, plugin->name); + rv = khc_write_multi_string(csp_module, L"PluginList", pl); + } + + PFREE(pl); + CKRV; + } + +#undef CKRV + +_exit: + if(csp_plugin) + khc_close_space(csp_plugin); + if(csp_module) + khc_close_space(csp_module); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_register_module(kmm_module_reg * module, khm_int32 config_flags) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_handle csp_module = NULL; + size_t cch; + int i; + + if((module == NULL) || + FAILED(StringCchLength(module->name, KMM_MAXCCH_NAME, &cch)) || + (module->description && + FAILED(StringCchLength(module->description, + KMM_MAXCCH_DESC, &cch))) || + FAILED(StringCchLength(module->path, MAX_PATH, &cch)) || + (module->n_plugins > 0 && module->plugin_reg_info == NULL)) { + return KHM_ERROR_INVALID_PARAM; + } + +#define CKRV if(KHM_FAILED(rv)) goto _exit + + rv = kmm_get_module_config(module->name, config_flags | KHM_FLAG_CREATE, + &csp_module); + CKRV; + + rv = khc_write_string(csp_module, L"ImagePath", module->path); + CKRV; + + rv = khc_write_int32(csp_module, L"Disabled", 0); + CKRV; + + /* FileVersion and ProductVersion will be set when the module + is loaded for the first time */ + + for(i=0; in_plugins; i++) { + rv = kmm_register_plugin(&(module->plugin_reg_info[i]), config_flags); + CKRV; + } + +#undef CKRV +_exit: + if(csp_module) + khc_close_space(csp_module); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_unregister_plugin(wchar_t * plugin, khm_int32 config_flags) +{ + khm_handle csp_plugin = NULL; + khm_int32 rv = KHM_ERROR_SUCCESS; + + rv = kmm_get_plugin_config(plugin, config_flags, &csp_plugin); + + if (KHM_FAILED(rv)) + goto _cleanup; + + rv = khc_remove_space(csp_plugin); + + _cleanup: + + if (csp_plugin) + khc_close_space(csp_plugin); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_unregister_module(wchar_t * module, khm_int32 config_flags) +{ + khm_handle csp_module = NULL; + khm_int32 rv = KHM_ERROR_SUCCESS; + + rv = kmm_get_module_config(module, config_flags, &csp_module); + + if (KHM_FAILED(rv)) + goto _cleanup; + + rv = khc_remove_space(csp_module); + + _cleanup: + if (csp_module) + khc_close_space(csp_module); + + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/kmm/kmm.c +++ krb5-1.4.4/src/windows/identity/kmm/kmm.c @@ -1,192 +1,192 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -khm_boolean kmmint_load_locale_lib(kmm_module_i * m, kmm_module_locale * l) -{ - HMODULE h; - - if(l->filename != NULL) { - wchar_t path[MAX_PATH]; - DWORD dw; - - /* construct the path name */ - assert(m->h_module != NULL); - - dw = PathIsFileSpec(l->filename); - - assert(dw); - if (!dw) - return FALSE; - - dw = GetModuleFileName(m->h_module, path, ARRAYLENGTH(path)); - assert(dw != 0); - if (dw == 0) - return FALSE; - - PathRemoveFileSpec(path); - dw = PathAppend(path, l->filename); - assert(dw); - if (!dw) - return FALSE; - - h = LoadLibrary(path); - if(!h) - return FALSE; - - EnterCriticalSection(&cs_kmm); - m->h_resource = h; - m->lcid_resource = l->language; - LeaveCriticalSection(&cs_kmm); - - return TRUE; - - } else { - /* in this case, the language resources are assumed to be in the - main module library itself. */ - - EnterCriticalSection(&cs_kmm); - m->h_resource = m->h_module; - m->lcid_resource = l->language; - LeaveCriticalSection(&cs_kmm); - - return TRUE; - } -} - - -KHMEXP khm_int32 KHMAPI kmm_set_locale_info(kmm_module module, kmm_module_locale * locales, khm_int32 n_locales) -{ - kmm_module_i * m; - LANGID lcid; - int i; - int * f; - khm_int32 rv = KHM_ERROR_SUCCESS; - - m = kmm_module_from_handle(module); - - if(!m || m->state != KMM_MODULE_STATE_INIT) - return KHM_ERROR_INVALID_OPERATION; - - if(!locales || n_locales < 0) - return KHM_ERROR_INVALID_PARAM; - - f = PMALLOC(n_locales * sizeof(int)); - if(!f) - return KHM_ERROR_UNKNOWN; - ZeroMemory(f, sizeof(int) * n_locales); - - lcid = GetUserDefaultLangID(); - - /* first search for an exact match */ - for(i=0; ih_resource; -} -#endif - -KHMEXP kmm_module KHMAPI -kmm_this_module(void) { - kmm_plugin_i * p; - kmm_module_i * m; - kmm_module vm; - - p = TlsGetValue(tls_kmm); - if (!kmm_is_plugin(p)) - return NULL; - - m = p->module; - vm = kmm_handle_from_module(m); - - kmm_hold_module(vm); - - return vm; -} - -KHMEXP kmm_plugin KHMAPI -kmm_this_plugin(void) { - kmm_plugin_i * p; - kmm_plugin vp; - - p = TlsGetValue(tls_kmm); - if (!kmm_is_plugin(p)) - return NULL; - - vp = kmm_handle_from_plugin(p); - - kmm_hold_plugin(vp); - - return vp; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +khm_boolean kmmint_load_locale_lib(kmm_module_i * m, kmm_module_locale * l) +{ + HMODULE h; + + if(l->filename != NULL) { + wchar_t path[MAX_PATH]; + DWORD dw; + + /* construct the path name */ + assert(m->h_module != NULL); + + dw = PathIsFileSpec(l->filename); + + assert(dw); + if (!dw) + return FALSE; + + dw = GetModuleFileName(m->h_module, path, ARRAYLENGTH(path)); + assert(dw != 0); + if (dw == 0) + return FALSE; + + PathRemoveFileSpec(path); + dw = PathAppend(path, l->filename); + assert(dw); + if (!dw) + return FALSE; + + h = LoadLibrary(path); + if(!h) + return FALSE; + + EnterCriticalSection(&cs_kmm); + m->h_resource = h; + m->lcid_resource = l->language; + LeaveCriticalSection(&cs_kmm); + + return TRUE; + + } else { + /* in this case, the language resources are assumed to be in the + main module library itself. */ + + EnterCriticalSection(&cs_kmm); + m->h_resource = m->h_module; + m->lcid_resource = l->language; + LeaveCriticalSection(&cs_kmm); + + return TRUE; + } +} + + +KHMEXP khm_int32 KHMAPI kmm_set_locale_info(kmm_module module, kmm_module_locale * locales, khm_int32 n_locales) +{ + kmm_module_i * m; + LANGID lcid; + int i; + int * f; + khm_int32 rv = KHM_ERROR_SUCCESS; + + m = kmm_module_from_handle(module); + + if(!m || m->state != KMM_MODULE_STATE_INIT) + return KHM_ERROR_INVALID_OPERATION; + + if(!locales || n_locales < 0) + return KHM_ERROR_INVALID_PARAM; + + f = PMALLOC(n_locales * sizeof(int)); + if(!f) + return KHM_ERROR_UNKNOWN; + ZeroMemory(f, sizeof(int) * n_locales); + + lcid = GetUserDefaultLangID(); + + /* first search for an exact match */ + for(i=0; ih_resource; +} +#endif + +KHMEXP kmm_module KHMAPI +kmm_this_module(void) { + kmm_plugin_i * p; + kmm_module_i * m; + kmm_module vm; + + p = TlsGetValue(tls_kmm); + if (!kmm_is_plugin(p)) + return NULL; + + m = p->module; + vm = kmm_handle_from_module(m); + + kmm_hold_module(vm); + + return vm; +} + +KHMEXP kmm_plugin KHMAPI +kmm_this_plugin(void) { + kmm_plugin_i * p; + kmm_plugin vp; + + p = TlsGetValue(tls_kmm); + if (!kmm_is_plugin(p)) + return NULL; + + vp = kmm_handle_from_plugin(p); + + kmm_hold_plugin(vp); + + return vp; +} --- krb5-1.4.4.orig/src/windows/identity/kmm/Makefile +++ krb5-1.4.4/src/windows/identity/kmm/Makefile @@ -1,54 +1,54 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=kmm -!include <../config/Makefile.w32> - -INCFILES= \ - $(INCDIR)\kmm.h \ - $(INCDIR)\kplugin.h - -OBJFILES= \ - $(OBJ)\kmmmain.obj \ - $(OBJ)\kmm.obj \ - $(OBJ)\kmm_plugin.obj \ - $(OBJ)\kmm_module.obj \ - $(OBJ)\kmm_reg.obj \ - $(OBJ)\kmm_registrar.obj \ - $(OBJ)\kmmconfig.obj - -MSGRESFILE=$(OBJ)\kmm_msgs.res - -$(OBJ)\kmmconfig.c: kmmconfig.csv $(CONFDIR)\csvschema.cfg - $(CCSV) $** $@ - -$(MSGRESFILE): $(OBJ)\kmm_msgs.rc - -$(OBJ)\kmm_msgs.rc: lang\kmm_msgs.mc - $(MC2RC) - -all: mkdirs $(INCFILES) $(MSGRESFILE) $(OBJFILES) - -clean:: - $(RM) $(INCFILES) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=kmm +!include <../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\kmm.h \ + $(INCDIR)\kplugin.h + +OBJFILES= \ + $(OBJ)\kmmmain.obj \ + $(OBJ)\kmm.obj \ + $(OBJ)\kmm_plugin.obj \ + $(OBJ)\kmm_module.obj \ + $(OBJ)\kmm_reg.obj \ + $(OBJ)\kmm_registrar.obj \ + $(OBJ)\kmmconfig.obj + +MSGRESFILE=$(OBJ)\kmm_msgs.res + +$(OBJ)\kmmconfig.c: kmmconfig.csv $(CONFDIR)\csvschema.cfg + $(CCSV) $** $@ + +$(MSGRESFILE): $(OBJ)\kmm_msgs.rc + +$(OBJ)\kmm_msgs.rc: lang\kmm_msgs.mc + $(MC2RC) + +all: mkdirs $(INCFILES) $(MSGRESFILE) $(OBJFILES) + +clean:: + $(RM) $(INCFILES) --- krb5-1.4.4.orig/src/windows/identity/kmm/kmmmain.c +++ krb5-1.4.4/src/windows/identity/kmm/kmmmain.c @@ -1,159 +1,159 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -kmm_module_i * kmm_all_modules = NULL; -kmm_plugin_i * kmm_listed_plugins = NULL; - -HANDLE ht_registrar = NULL; -DWORD tid_registrar = 0; -DWORD tls_kmm = 0; - -#define KMM_HASH_SIZE 31 -hashtable * hash_plugins = NULL; -hashtable * hash_modules = NULL; - -CRITICAL_SECTION cs_kmm; -HANDLE evt_startup = NULL; -HANDLE evt_exit = NULL; -int ready = 0; - -HINSTANCE kmm_hInstance; -const wchar_t * kmm_facility = L"KMM"; - -KHMEXP void KHMAPI kmm_init(void) -{ - DWORD dummy; - - EnterCriticalSection(&cs_kmm); - kmm_all_modules = NULL; - kmm_listed_plugins = NULL; - - tls_kmm = TlsAlloc(); - - hash_plugins = hash_new_hashtable( - KMM_HASH_SIZE, - hash_string, - hash_string_comp, - NULL, - NULL); - - hash_modules = hash_new_hashtable( - KMM_HASH_SIZE, - hash_string, - hash_string_comp, - NULL, - NULL); - - ht_registrar = CreateThread( - NULL, - 0, - kmmint_registrar, - NULL, - 0, - &dummy); - - _WAIT_FOR_START; - - khc_load_schema(NULL, schema_kmmconfig); - - LeaveCriticalSection(&cs_kmm); -} - -KHMEXP void KHMAPI kmm_exit(void) -{ - kmm_module_i * m; - kmm_plugin_i * p; - - EnterCriticalSection(&cs_kmm); - - p = kmm_listed_plugins; - while(p) { - kmm_plugin_i * pn; - - pn = LNEXT(p); - /* plugins that were never resolved should be kicked off the - list. Flipping the refcount will do that if no other - references exist for the plugin. The plugins that were - waiting for unresolved dependencies will automatically get - freed when the placeholders and other plugins get freed. */ - if(p->state == KMM_PLUGIN_STATE_PLACEHOLDER) { - kmm_hold_plugin(kmm_handle_from_plugin(p)); - kmm_release_plugin(kmm_handle_from_plugin(p)); - } - - p = pn; - } - - m = kmm_all_modules; - while(m) { - kmm_unload_module(kmm_handle_from_module(m)); - m = LNEXT(m); - } - - LeaveCriticalSection(&cs_kmm); - WaitForSingleObject(evt_exit, INFINITE); - EnterCriticalSection(&cs_kmm); - - kmq_post_thread_quit_message(tid_registrar, 0, NULL); - - hash_del_hashtable(hash_plugins); - hash_del_hashtable(hash_modules); - - LeaveCriticalSection(&cs_kmm); - - TlsFree(tls_kmm); - - tls_kmm = 0; -} - -void kmm_dll_init(void) -{ - InitializeCriticalSection(&cs_kmm); - evt_startup = CreateEvent(NULL, TRUE, FALSE, NULL); - evt_exit = CreateEvent(NULL, TRUE, TRUE, NULL); -} - -void kmm_dll_exit(void) -{ - DeleteCriticalSection(&cs_kmm); - if(evt_startup) - CloseHandle(evt_startup); - evt_startup = NULL; -} - -void -kmm_process_attach(HINSTANCE hinstDLL) { - kmm_hInstance = hinstDLL; - kmm_dll_init(); -} - -void -kmm_process_detach(void) { - kmm_dll_exit(); -} - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +kmm_module_i * kmm_all_modules = NULL; +kmm_plugin_i * kmm_listed_plugins = NULL; + +HANDLE ht_registrar = NULL; +DWORD tid_registrar = 0; +DWORD tls_kmm = 0; + +#define KMM_HASH_SIZE 31 +hashtable * hash_plugins = NULL; +hashtable * hash_modules = NULL; + +CRITICAL_SECTION cs_kmm; +HANDLE evt_startup = NULL; +HANDLE evt_exit = NULL; +int ready = 0; + +HINSTANCE kmm_hInstance; +const wchar_t * kmm_facility = L"KMM"; + +KHMEXP void KHMAPI kmm_init(void) +{ + DWORD dummy; + + EnterCriticalSection(&cs_kmm); + kmm_all_modules = NULL; + kmm_listed_plugins = NULL; + + tls_kmm = TlsAlloc(); + + hash_plugins = hash_new_hashtable( + KMM_HASH_SIZE, + hash_string, + hash_string_comp, + NULL, + NULL); + + hash_modules = hash_new_hashtable( + KMM_HASH_SIZE, + hash_string, + hash_string_comp, + NULL, + NULL); + + ht_registrar = CreateThread( + NULL, + 0, + kmmint_registrar, + NULL, + 0, + &dummy); + + _WAIT_FOR_START; + + khc_load_schema(NULL, schema_kmmconfig); + + LeaveCriticalSection(&cs_kmm); +} + +KHMEXP void KHMAPI kmm_exit(void) +{ + kmm_module_i * m; + kmm_plugin_i * p; + + EnterCriticalSection(&cs_kmm); + + p = kmm_listed_plugins; + while(p) { + kmm_plugin_i * pn; + + pn = LNEXT(p); + /* plugins that were never resolved should be kicked off the + list. Flipping the refcount will do that if no other + references exist for the plugin. The plugins that were + waiting for unresolved dependencies will automatically get + freed when the placeholders and other plugins get freed. */ + if(p->state == KMM_PLUGIN_STATE_PLACEHOLDER) { + kmm_hold_plugin(kmm_handle_from_plugin(p)); + kmm_release_plugin(kmm_handle_from_plugin(p)); + } + + p = pn; + } + + m = kmm_all_modules; + while(m) { + kmm_unload_module(kmm_handle_from_module(m)); + m = LNEXT(m); + } + + LeaveCriticalSection(&cs_kmm); + WaitForSingleObject(evt_exit, INFINITE); + EnterCriticalSection(&cs_kmm); + + kmq_post_thread_quit_message(tid_registrar, 0, NULL); + + hash_del_hashtable(hash_plugins); + hash_del_hashtable(hash_modules); + + LeaveCriticalSection(&cs_kmm); + + TlsFree(tls_kmm); + + tls_kmm = 0; +} + +void kmm_dll_init(void) +{ + InitializeCriticalSection(&cs_kmm); + evt_startup = CreateEvent(NULL, TRUE, FALSE, NULL); + evt_exit = CreateEvent(NULL, TRUE, TRUE, NULL); +} + +void kmm_dll_exit(void) +{ + DeleteCriticalSection(&cs_kmm); + if(evt_startup) + CloseHandle(evt_startup); + evt_startup = NULL; +} + +void +kmm_process_attach(HINSTANCE hinstDLL) { + kmm_hInstance = hinstDLL; + kmm_dll_init(); +} + +void +kmm_process_detach(void) { + kmm_dll_exit(); +} + --- krb5-1.4.4.orig/src/windows/identity/kmm/kmm_plugin.c +++ krb5-1.4.4/src/windows/identity/kmm/kmm_plugin.c @@ -1,414 +1,414 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -/* Called with no locks held to get a kmm_plugin_i structure - that matches the name. First we look in the hash table, and - if one isn't found, we create an empty one. -*/ - -kmm_plugin_i * -kmmint_get_plugin_i(wchar_t * name) -{ - kmm_plugin_i * p; - size_t cb; - - if(FAILED(StringCbLength(name, KMM_MAXCB_NAME, &cb))) - return NULL; - cb += sizeof(wchar_t); - - EnterCriticalSection(&cs_kmm); - p = (kmm_plugin_i *) hash_lookup(hash_plugins, (void *) name); - - if(p == NULL) { - p = PMALLOC(sizeof(kmm_plugin_i)); - ZeroMemory(p, sizeof(kmm_plugin_i)); - p->magic = KMM_PLUGIN_MAGIC; - p->p.name = PMALLOC(cb); - StringCbCopy(p->p.name, cb, name); - p->state = KMM_PLUGIN_STATE_NONE; - - hash_add(hash_plugins, (void *) p->p.name, (void *) p); - kmmint_list_plugin(p); - } - LeaveCriticalSection(&cs_kmm); - - return p; -} - -kmm_plugin_i * -kmmint_find_plugin_i(wchar_t * name) -{ - kmm_plugin_i * p; - size_t cb; - - if(FAILED(StringCbLength(name, KMM_MAXCB_NAME, &cb))) - return NULL; - - EnterCriticalSection(&cs_kmm); - p = (kmm_plugin_i *) hash_lookup(hash_plugins, (void *) name); - LeaveCriticalSection(&cs_kmm); - - return p; -} - -/* the plugin must be delisted before calling this */ -void -kmmint_list_plugin(kmm_plugin_i * p) -{ - EnterCriticalSection(&cs_kmm); - if((p->flags & KMM_PLUGIN_FLAG_IN_MODLIST) || - (p->flags & KMM_PLUGIN_FLAG_IN_LIST)) - { - RaiseException(2, EXCEPTION_NONCONTINUABLE, 0, NULL); - } - p->flags |= KMM_PLUGIN_FLAG_IN_LIST; - LPUSH(&kmm_listed_plugins, p); - LeaveCriticalSection(&cs_kmm); -} - -void -kmmint_delist_plugin(kmm_plugin_i * p) -{ - EnterCriticalSection(&cs_kmm); - if(p->flags & KMM_PLUGIN_FLAG_IN_LIST) { - p->flags &= ~KMM_PLUGIN_FLAG_IN_LIST; - LDELETE(&kmm_listed_plugins, p); - } - if(p->flags & KMM_PLUGIN_FLAG_IN_MODLIST) { - p->flags &= ~KMM_PLUGIN_FLAG_IN_MODLIST; - LDELETE(&(p->module->plugins), p); - } - LeaveCriticalSection(&cs_kmm); -} - -KHMEXP khm_int32 KHMAPI -kmm_hold_plugin(kmm_plugin p) -{ - kmm_plugin_i * pi; - - if(!kmm_is_plugin(p)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_kmm); - pi = kmm_plugin_from_handle(p); - pi->refcount++; - LeaveCriticalSection(&cs_kmm); - - return KHM_ERROR_SUCCESS; -} - -/* called with cs_kmm held */ -void -kmmint_free_plugin(kmm_plugin_i * pi) -{ - int i; - pi->magic = 0; - - hash_del(hash_plugins, (void *) pi->p.name); - - kmmint_delist_plugin(pi); - - for(i=0; in_dependants; i++) { - kmm_release_plugin(kmm_handle_from_plugin(pi->dependants[i])); - pi->dependants[i] = NULL; - } - - if(pi->module) { - kmm_release_module(kmm_handle_from_module(pi->module)); - } - - pi->module = NULL; - pi->p.module = NULL; - - if(pi->p.name) - PFREE(pi->p.name); - pi->p.name = NULL; - - if(pi->p.description) - PFREE(pi->p.description); - pi->p.description = NULL; - - if(pi->p.dependencies) - PFREE(pi->p.dependencies); - pi->p.dependencies = NULL; - - PFREE(pi); -} - -KHMEXP khm_int32 KHMAPI -kmm_enable_plugin(kmm_plugin p, khm_boolean enable) { - kmm_plugin_i * pi; - khm_int32 rv = KHM_ERROR_NOT_FOUND; /* default to error */ - khm_handle csp_plugin = NULL; - - EnterCriticalSection(&cs_kmm); - if (!kmm_is_plugin(p)) { - rv = KHM_ERROR_INVALID_PARAM; - goto _cleanup; - } - - pi = kmm_plugin_from_handle(p); - - if (KHM_FAILED(rv = kmm_get_plugin_config(pi->p.name, 0, &csp_plugin))) { - goto _cleanup; - } - - if (KHM_FAILED(rv = khc_write_int32(csp_plugin, L"Disabled", !enable))) { - goto _cleanup; - } - - rv = KHM_ERROR_SUCCESS; - - _cleanup: - LeaveCriticalSection(&cs_kmm); - - if (csp_plugin) - khc_close_space(csp_plugin); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_get_plugin_info_i(kmm_plugin p, kmm_plugin_info * info) { - khm_int32 rv = KHM_ERROR_SUCCESS; - kmm_plugin_i * pi; - khm_handle csp_plugin; - - if (!info) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_kmm); - if (!kmm_is_plugin(p)) { - rv = KHM_ERROR_INVALID_PARAM; - goto _cleanup; - } - - pi = kmm_plugin_from_handle(p); - - ZeroMemory(info, sizeof(*info)); - - info->reg = pi->p; - info->reg.msg_proc = NULL; - - if (KHM_FAILED(kmm_get_plugin_config(pi->p.name, KHM_PERM_READ, - &csp_plugin))) { - info->failure_count = 0; - *((khm_int64 *)&info->failure_time) = 0; - info->failure_reason = 0; - } else { - if (KHM_FAILED(khc_read_int32(csp_plugin, L"FailureCount", - &info->failure_count))) - info->failure_count = 0; - if (KHM_FAILED(khc_read_int64(csp_plugin, L"FailureTime", - (khm_int64 *) &info->failure_time))) - *((khm_int64 *) &info->failure_time) = 0; - if (KHM_FAILED(khc_read_int32(csp_plugin, L"FailureReason", - &info->failure_reason))) - info->failure_reason = 0; - - khc_close_space(csp_plugin); - } - - info->state = pi->state; - - kmm_hold_plugin(p); - info->h_plugin = p; - - info->flags = (pi->flags & KMM_PLUGIN_FLAG_DISABLED); - - _cleanup: - LeaveCriticalSection(&cs_kmm); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_release_plugin_info_i(kmm_plugin_info * info) { - khm_int32 rv; - - if (!info || !info->h_plugin) - return KHM_ERROR_INVALID_PARAM; - - rv = kmm_release_plugin(info->h_plugin); - - ZeroMemory(info, sizeof(info)); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_get_next_plugin(kmm_plugin p, kmm_plugin * p_next) { - khm_int32 rv = KHM_ERROR_SUCCESS; - kmm_plugin_i * pi; - kmm_plugin_i * pi_next = NULL; - kmm_module_i * m; - - EnterCriticalSection(&cs_kmm); - if (p == NULL) { - if (kmm_listed_plugins) - pi_next = kmm_listed_plugins; - else { - for (m = kmm_all_modules; m; m = LNEXT(m)) { - if (m->plugins) { - pi_next = m->plugins; - break; - } - } - } - } else if (kmm_is_plugin(p)) { - pi = kmm_plugin_from_handle(p); - pi_next = LNEXT(pi); - - if (!pi_next) { - /* we have either exhausted the listed plugins or we are - at the end of the module's plugin list */ - if (pi->module) { - m = LNEXT(pi->module); - } else { - m = kmm_all_modules; - } - - for(; m; m = LNEXT(m)) { - if (m->plugins) { - pi_next = m->plugins; - break; - } - } - } - } - - if (pi_next) { - *p_next = kmm_handle_from_plugin(pi_next); - kmm_hold_plugin(*p_next); - } else { - *p_next = NULL; - rv = KHM_ERROR_NOT_FOUND; - } - - LeaveCriticalSection(&cs_kmm); - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_release_plugin(kmm_plugin p) -{ - kmm_plugin_i * pi; - - if(!kmm_is_plugin(p)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_kmm); - pi = kmm_plugin_from_handle(p); - pi->refcount--; - if(pi->refcount == 0) { - kmmint_free_plugin(pi); - } - LeaveCriticalSection(&cs_kmm); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kmm_provide_plugin(kmm_module module, kmm_plugin_reg * plugin) -{ - kmm_module_i * m; - kmm_plugin_i * p; - size_t cb_name = 0; - size_t cb_desc = 0; - size_t cb_dep = 0; - - m = kmm_module_from_handle(module); - - /* can only called when handing init_module() */ - if(m->state != KMM_MODULE_STATE_INIT) - return KHM_ERROR_INVALID_OPERATION; - - if(!plugin || - FAILED(StringCbLength(plugin->name, KMM_MAXCB_NAME - sizeof(wchar_t), - &cb_name)) || - (plugin->description && - FAILED(StringCbLength(plugin->description, - KMM_MAXCB_DESC - sizeof(wchar_t), - &cb_desc))) || - (plugin->dependencies && - KHM_FAILED(multi_string_length_cb(plugin->dependencies, - KMM_MAXCB_DEPS, &cb_dep)))) { - return KHM_ERROR_INVALID_PARAM; - } - - cb_name += sizeof(wchar_t); - cb_desc += sizeof(wchar_t); - - p = kmmint_get_plugin_i(plugin->name); - - /* released below or in kmmint_init_module() */ - kmm_hold_plugin(kmm_handle_from_plugin(p)); - - if(p->state != KMM_PLUGIN_STATE_NONE && - p->state != KMM_PLUGIN_STATE_PLACEHOLDER) - { - kmm_release_plugin(kmm_handle_from_plugin(p)); - return KHM_ERROR_DUPLICATE; - } - - /* released when the plugin quits */ - kmm_hold_module(module); - - p->module = m; - p->p.flags = plugin->flags; - p->p.msg_proc = plugin->msg_proc; - p->p.type = plugin->type; - - if(plugin->description) { - p->p.description = PMALLOC(cb_desc); - StringCbCopy(p->p.description, cb_desc, plugin->description); - } else - p->p.description = NULL; - - if(plugin->dependencies) { - p->p.dependencies = PMALLOC(cb_dep); - multi_string_copy_cb(p->p.dependencies, cb_dep, plugin->dependencies); - } else - p->p.dependencies = NULL; - - p->p.module = p->module->name; - - p->p.icon = plugin->icon; - - p->state = KMM_PLUGIN_STATE_REG; - - kmmint_delist_plugin(p); - EnterCriticalSection(&cs_kmm); - LPUSH(&(m->plugins), p); - p->flags |= KMM_PLUGIN_FLAG_IN_MODLIST; - LeaveCriticalSection(&cs_kmm); - - /* leave the plugin held because it is in the module's plugin list */ - return KHM_ERROR_SUCCESS; -} - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +/* Called with no locks held to get a kmm_plugin_i structure + that matches the name. First we look in the hash table, and + if one isn't found, we create an empty one. +*/ + +kmm_plugin_i * +kmmint_get_plugin_i(wchar_t * name) +{ + kmm_plugin_i * p; + size_t cb; + + if(FAILED(StringCbLength(name, KMM_MAXCB_NAME, &cb))) + return NULL; + cb += sizeof(wchar_t); + + EnterCriticalSection(&cs_kmm); + p = (kmm_plugin_i *) hash_lookup(hash_plugins, (void *) name); + + if(p == NULL) { + p = PMALLOC(sizeof(kmm_plugin_i)); + ZeroMemory(p, sizeof(kmm_plugin_i)); + p->magic = KMM_PLUGIN_MAGIC; + p->p.name = PMALLOC(cb); + StringCbCopy(p->p.name, cb, name); + p->state = KMM_PLUGIN_STATE_NONE; + + hash_add(hash_plugins, (void *) p->p.name, (void *) p); + kmmint_list_plugin(p); + } + LeaveCriticalSection(&cs_kmm); + + return p; +} + +kmm_plugin_i * +kmmint_find_plugin_i(wchar_t * name) +{ + kmm_plugin_i * p; + size_t cb; + + if(FAILED(StringCbLength(name, KMM_MAXCB_NAME, &cb))) + return NULL; + + EnterCriticalSection(&cs_kmm); + p = (kmm_plugin_i *) hash_lookup(hash_plugins, (void *) name); + LeaveCriticalSection(&cs_kmm); + + return p; +} + +/* the plugin must be delisted before calling this */ +void +kmmint_list_plugin(kmm_plugin_i * p) +{ + EnterCriticalSection(&cs_kmm); + if((p->flags & KMM_PLUGIN_FLAG_IN_MODLIST) || + (p->flags & KMM_PLUGIN_FLAG_IN_LIST)) + { + RaiseException(2, EXCEPTION_NONCONTINUABLE, 0, NULL); + } + p->flags |= KMM_PLUGIN_FLAG_IN_LIST; + LPUSH(&kmm_listed_plugins, p); + LeaveCriticalSection(&cs_kmm); +} + +void +kmmint_delist_plugin(kmm_plugin_i * p) +{ + EnterCriticalSection(&cs_kmm); + if(p->flags & KMM_PLUGIN_FLAG_IN_LIST) { + p->flags &= ~KMM_PLUGIN_FLAG_IN_LIST; + LDELETE(&kmm_listed_plugins, p); + } + if(p->flags & KMM_PLUGIN_FLAG_IN_MODLIST) { + p->flags &= ~KMM_PLUGIN_FLAG_IN_MODLIST; + LDELETE(&(p->module->plugins), p); + } + LeaveCriticalSection(&cs_kmm); +} + +KHMEXP khm_int32 KHMAPI +kmm_hold_plugin(kmm_plugin p) +{ + kmm_plugin_i * pi; + + if(!kmm_is_plugin(p)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_kmm); + pi = kmm_plugin_from_handle(p); + pi->refcount++; + LeaveCriticalSection(&cs_kmm); + + return KHM_ERROR_SUCCESS; +} + +/* called with cs_kmm held */ +void +kmmint_free_plugin(kmm_plugin_i * pi) +{ + int i; + pi->magic = 0; + + hash_del(hash_plugins, (void *) pi->p.name); + + kmmint_delist_plugin(pi); + + for(i=0; in_dependants; i++) { + kmm_release_plugin(kmm_handle_from_plugin(pi->dependants[i])); + pi->dependants[i] = NULL; + } + + if(pi->module) { + kmm_release_module(kmm_handle_from_module(pi->module)); + } + + pi->module = NULL; + pi->p.module = NULL; + + if(pi->p.name) + PFREE(pi->p.name); + pi->p.name = NULL; + + if(pi->p.description) + PFREE(pi->p.description); + pi->p.description = NULL; + + if(pi->p.dependencies) + PFREE(pi->p.dependencies); + pi->p.dependencies = NULL; + + PFREE(pi); +} + +KHMEXP khm_int32 KHMAPI +kmm_enable_plugin(kmm_plugin p, khm_boolean enable) { + kmm_plugin_i * pi; + khm_int32 rv = KHM_ERROR_NOT_FOUND; /* default to error */ + khm_handle csp_plugin = NULL; + + EnterCriticalSection(&cs_kmm); + if (!kmm_is_plugin(p)) { + rv = KHM_ERROR_INVALID_PARAM; + goto _cleanup; + } + + pi = kmm_plugin_from_handle(p); + + if (KHM_FAILED(rv = kmm_get_plugin_config(pi->p.name, 0, &csp_plugin))) { + goto _cleanup; + } + + if (KHM_FAILED(rv = khc_write_int32(csp_plugin, L"Disabled", !enable))) { + goto _cleanup; + } + + rv = KHM_ERROR_SUCCESS; + + _cleanup: + LeaveCriticalSection(&cs_kmm); + + if (csp_plugin) + khc_close_space(csp_plugin); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_get_plugin_info_i(kmm_plugin p, kmm_plugin_info * info) { + khm_int32 rv = KHM_ERROR_SUCCESS; + kmm_plugin_i * pi; + khm_handle csp_plugin; + + if (!info) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_kmm); + if (!kmm_is_plugin(p)) { + rv = KHM_ERROR_INVALID_PARAM; + goto _cleanup; + } + + pi = kmm_plugin_from_handle(p); + + ZeroMemory(info, sizeof(*info)); + + info->reg = pi->p; + info->reg.msg_proc = NULL; + + if (KHM_FAILED(kmm_get_plugin_config(pi->p.name, KHM_PERM_READ, + &csp_plugin))) { + info->failure_count = 0; + *((khm_int64 *)&info->failure_time) = 0; + info->failure_reason = 0; + } else { + if (KHM_FAILED(khc_read_int32(csp_plugin, L"FailureCount", + &info->failure_count))) + info->failure_count = 0; + if (KHM_FAILED(khc_read_int64(csp_plugin, L"FailureTime", + (khm_int64 *) &info->failure_time))) + *((khm_int64 *) &info->failure_time) = 0; + if (KHM_FAILED(khc_read_int32(csp_plugin, L"FailureReason", + &info->failure_reason))) + info->failure_reason = 0; + + khc_close_space(csp_plugin); + } + + info->state = pi->state; + + kmm_hold_plugin(p); + info->h_plugin = p; + + info->flags = (pi->flags & KMM_PLUGIN_FLAG_DISABLED); + + _cleanup: + LeaveCriticalSection(&cs_kmm); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_release_plugin_info_i(kmm_plugin_info * info) { + khm_int32 rv; + + if (!info || !info->h_plugin) + return KHM_ERROR_INVALID_PARAM; + + rv = kmm_release_plugin(info->h_plugin); + + ZeroMemory(info, sizeof(info)); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_get_next_plugin(kmm_plugin p, kmm_plugin * p_next) { + khm_int32 rv = KHM_ERROR_SUCCESS; + kmm_plugin_i * pi; + kmm_plugin_i * pi_next = NULL; + kmm_module_i * m; + + EnterCriticalSection(&cs_kmm); + if (p == NULL) { + if (kmm_listed_plugins) + pi_next = kmm_listed_plugins; + else { + for (m = kmm_all_modules; m; m = LNEXT(m)) { + if (m->plugins) { + pi_next = m->plugins; + break; + } + } + } + } else if (kmm_is_plugin(p)) { + pi = kmm_plugin_from_handle(p); + pi_next = LNEXT(pi); + + if (!pi_next) { + /* we have either exhausted the listed plugins or we are + at the end of the module's plugin list */ + if (pi->module) { + m = LNEXT(pi->module); + } else { + m = kmm_all_modules; + } + + for(; m; m = LNEXT(m)) { + if (m->plugins) { + pi_next = m->plugins; + break; + } + } + } + } + + if (pi_next) { + *p_next = kmm_handle_from_plugin(pi_next); + kmm_hold_plugin(*p_next); + } else { + *p_next = NULL; + rv = KHM_ERROR_NOT_FOUND; + } + + LeaveCriticalSection(&cs_kmm); + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_release_plugin(kmm_plugin p) +{ + kmm_plugin_i * pi; + + if(!kmm_is_plugin(p)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_kmm); + pi = kmm_plugin_from_handle(p); + pi->refcount--; + if(pi->refcount == 0) { + kmmint_free_plugin(pi); + } + LeaveCriticalSection(&cs_kmm); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kmm_provide_plugin(kmm_module module, kmm_plugin_reg * plugin) +{ + kmm_module_i * m; + kmm_plugin_i * p; + size_t cb_name = 0; + size_t cb_desc = 0; + size_t cb_dep = 0; + + m = kmm_module_from_handle(module); + + /* can only called when handing init_module() */ + if(m->state != KMM_MODULE_STATE_INIT) + return KHM_ERROR_INVALID_OPERATION; + + if(!plugin || + FAILED(StringCbLength(plugin->name, KMM_MAXCB_NAME - sizeof(wchar_t), + &cb_name)) || + (plugin->description && + FAILED(StringCbLength(plugin->description, + KMM_MAXCB_DESC - sizeof(wchar_t), + &cb_desc))) || + (plugin->dependencies && + KHM_FAILED(multi_string_length_cb(plugin->dependencies, + KMM_MAXCB_DEPS, &cb_dep)))) { + return KHM_ERROR_INVALID_PARAM; + } + + cb_name += sizeof(wchar_t); + cb_desc += sizeof(wchar_t); + + p = kmmint_get_plugin_i(plugin->name); + + /* released below or in kmmint_init_module() */ + kmm_hold_plugin(kmm_handle_from_plugin(p)); + + if(p->state != KMM_PLUGIN_STATE_NONE && + p->state != KMM_PLUGIN_STATE_PLACEHOLDER) + { + kmm_release_plugin(kmm_handle_from_plugin(p)); + return KHM_ERROR_DUPLICATE; + } + + /* released when the plugin quits */ + kmm_hold_module(module); + + p->module = m; + p->p.flags = plugin->flags; + p->p.msg_proc = plugin->msg_proc; + p->p.type = plugin->type; + + if(plugin->description) { + p->p.description = PMALLOC(cb_desc); + StringCbCopy(p->p.description, cb_desc, plugin->description); + } else + p->p.description = NULL; + + if(plugin->dependencies) { + p->p.dependencies = PMALLOC(cb_dep); + multi_string_copy_cb(p->p.dependencies, cb_dep, plugin->dependencies); + } else + p->p.dependencies = NULL; + + p->p.module = p->module->name; + + p->p.icon = plugin->icon; + + p->state = KMM_PLUGIN_STATE_REG; + + kmmint_delist_plugin(p); + EnterCriticalSection(&cs_kmm); + LPUSH(&(m->plugins), p); + p->flags |= KMM_PLUGIN_FLAG_IN_MODLIST; + LeaveCriticalSection(&cs_kmm); + + /* leave the plugin held because it is in the module's plugin list */ + return KHM_ERROR_SUCCESS; +} + --- krb5-1.4.4.orig/src/windows/identity/kmm/kmm.h +++ krb5-1.4.4/src/windows/identity/kmm/kmm.h @@ -1,1068 +1,1068 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KMM_H -#define __KHIMAIRA_KMM_H - -#include -#include - -/*! \defgroup kmm NetIDMgr Module Manager -@{*/ - -/*! \brief A handle to a module. -*/ -typedef khm_handle kmm_module; - -/*! \brief A handle to a plugin. - */ -typedef khm_handle kmm_plugin; - -/*! \name Limits - @{*/ - -/*! \brief Maximum number of characters in a name in KMM including the terminating NULL */ -#define KMM_MAXCCH_NAME 256 - -/*! \brief Maximum number of bytes in a name in KMM including the terminating NULL */ -#define KMM_MAXCB_NAME (sizeof(wchar_t) * KMM_MAXCCH_NAME) - -/*! \brief Maximum number of characters in a description in KMM including the terminating NULL */ -#define KMM_MAXCCH_DESC 512 - -/*! \brief Maximum number of bytes in a description in KMM including the terminating NULL */ -#define KMM_MAXCB_DESC (sizeof(wchar_t) * KMM_MAXCCH_NAME) - -/*! \brief Maximum number of characters in a vendor string in KMM including the terminating NULL */ -#define KMM_MAXCCH_VENDOR 256 - -/*! \brief Maximum number of bytes in a vendor string in KMM including the terminating NULL */ -#define KMM_MAXCB_VENDOR (sizeof(wchar_t) * KMM_MAXCCH_VENDOR) - -/*! \brief Maximum number of characters in a support URI in KMM including the terminating NULL */ -#define KMM_MAXCCH_SUPPORT 256 - -/*! \brief Maximum number of bytes in a vendor string in KMM including the terminating NULL */ -#define KMM_MAXCB_SUPPORT (sizeof(wchar_t) * KMM_MAXCCH_SUPPORT) - -/*! \brief Maximum number of dependencies per plugin -*/ -#define KMM_MAX_DEPENDENCIES 8 - -/*! \brief Maximum number of dependants per plugin - */ -#define KMM_MAX_DEPENDANTS 32 - -/*! \brief Maximum number of characters a dependency string including trailing double NULL */ -#define KMM_MAXCCH_DEPS (KMM_MAXCCH_NAME * KMM_MAX_DEPENDENCIES + 1) - -/*! \brief Maximum number of bytes in a dependency string including trailing double NULL */ -#define KMM_MAXCB_DEPS (sizeof(wchar_t) * KMM_MAXCCH_DEPS) -/*@}*/ /* Limits */ - -/*! \brief Plugin registration - - \see ::khm_cred_provider -*/ -typedef struct tag_kmm_plugin_reg { - wchar_t * name; /*!< Name of the plugin. Maximum of - KMM_MAXCCH_NAME characters - including the terminating - NULL. Required. */ - - wchar_t * module; /*!< Name of module that owns the - plugin. Maximum of - KMM_MAXCCH_NAME characters - including terminating NULL. - Required. */ - - khm_int32 type; /*!< Type plugin type. One of - KHM_PITYPE_*. Required. */ - khm_int32 flags; /*!< Unused. Set to 0 */ - kmq_callback_t msg_proc; /*!< Message processor. Required. */ - wchar_t * dependencies; /*!< Dependencies. Note that this is - a multi string. (you can use the - KHC multi string functions to - manipulate multi strings or to - convert a comma separated list of - dependencies to a multi string). - Each string in the multi string - is a name of a plugin that this - plugin depends on. Optional (set - to NULL if this plugin has no - dependencies). Maximum of - KMM_MAXCCH_DEPS characters - including terminating double - NULL.*/ - - wchar_t * description; /*!< Description of the plugin. - Maximum of KMM_MAXCCH_DESC - characters including the - terminating - NULL. Localized. Optional (set to - NULL if not provided) */ -#ifdef _WIN32 - HICON icon; /*!< Icon used to represent the - plugin. Optional. (set to NULL if - not provided) */ -#endif -} kmm_plugin_reg; - -/*! \brief Plugin information -*/ -typedef struct tag_kmm_plugin_info { - kmm_plugin_reg reg; /*!< Registration info */ - - khm_int32 state; /*!< Current status of the plugin. - One of ::_kmm_plugin_states */ - - khm_int32 failure_count; /*!< Number of recorded failures in - the plugin */ - FILETIME failure_time; /*!< Time of first recorded failure */ - khm_int32 failure_reason; /*!< The reason for the first recorded - failure */ - - kmm_plugin h_plugin; /*!< Handle to plugin */ - - khm_int32 flags; /*!< Flags for the plugin. Currently - this can only specify - ::KMM_PLUGIN_FLAG_DISABLED. */ -} kmm_plugin_info; - -/*! \brief The plugin is disabled - - This flag will be set in the \a flags field of the - ::kmm_plugin_info structure for a plugin that has been marked as - disabled. If the plugin is currently running, but marked as - disabled for future sessions, then this bit will be set in \a - flags , but the \a state of the plugin will indicate that the - plugin is running. - */ -#define KMM_PLUGIN_FLAG_DISABLED 0x00000400 - -/*! \name Plugin types -@{*/ -/*! \brief A credentials provider - - \see \ref pi_pt_cred for more information. - */ -#define KHM_PITYPE_CRED 1 - -/*! \brief A identity provider - - \see \ref pi_pt_cred for more information - */ -#define KHM_PITYPE_IDENT 2 - -/*! \brief A configuration provider - - \see \ref pi_pt_conf for more information. - */ -#define KHM_PITYPE_CONFIG 3 - -/*! \brief Undefined plugin type - - The plugin doesn't provide any credential type. - */ -#define KHM_PITYPE_MISC 4 - -/*@}*/ - -/*! \brief Plugin states */ -enum _kmm_plugin_states { - KMM_PLUGIN_STATE_FAIL_INIT = -6, /*!< Failed to initialize */ - KMM_PLUGIN_STATE_FAIL_UNKNOWN = -5, /*!< Failed due to unknown - reasons */ - KMM_PLUGIN_STATE_FAIL_MAX_FAILURE = -4, /*!< The plugin has - reached the maximum number - of failures and cannot be - initialized until the - failure count is reset */ - KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED = -3, /*!< Failed because the - plugin was not registered - and automatic registration - failed. */ - KMM_PLUGIN_STATE_FAIL_DISABLED = -2,/*!< Failed because plugin was - disabled by the user. */ - KMM_PLUGIN_STATE_FAIL_LOAD = -1, /*!< The plugin failed to load - due to some unknown - reason. */ - KMM_PLUGIN_STATE_NONE = 0, /*!< Unknown state */ - KMM_PLUGIN_STATE_PLACEHOLDER, /*!< Placeholder. The plugin - hasn't been provided by - anyone yet, but the plugin - record has been created to - keep track of - dependencies. */ - KMM_PLUGIN_STATE_REG, /*!< The plugin is registered - but not initialized */ - KMM_PLUGIN_STATE_PREINIT, /*!< The plugin is in the - process of being - initialized */ - KMM_PLUGIN_STATE_HOLD, /*!< On hold. One or more - dependencies of this plugin - has not been resolved */ - KMM_PLUGIN_STATE_INIT, /*!< The plugin was initialized */ - KMM_PLUGIN_STATE_RUNNING, /*!< The plugin is running */ - KMM_PLUGIN_STATE_EXITED /*!< The plugin has been stopped. */ -}; - -/*! \brief Module registration */ -typedef struct tag_kmm_module_reg { - wchar_t * name; /*!< Identifier for the module */ - wchar_t * path; /*!< Full pathname to module - binary */ - - wchar_t * description; /*!< Description of module */ - - wchar_t * vendor; /*!< Vendor/copyright string */ - - wchar_t * support; /*!< Support URL/contact */ - - khm_int32 n_plugins; /*!< Number of plugins that are - active */ - kmm_plugin_reg * plugin_reg_info; /*!< Array of kmm_plugin_reg - records for each active - plugin */ -} kmm_module_reg; - -/*! \brief Module information record */ -typedef struct tag_kmm_module_info { - kmm_module_reg reg; /*!< Registration info */ - - khm_ui_4 language; /*!< Currently loaded langugage */ - - khm_int32 state; /*!< Current status of the - module */ - - khm_version file_version; /*!< File version for the - module */ - khm_version product_version; /*!< Product version for the - module */ - - khm_int32 failure_count; /*!< Number of times the module - has failed to load */ - FILETIME failure_time; /*!< Time of first recorded - failure */ - khm_int32 failure_reason; /*!< Reason for first failure. - One of the module status - values */ - - kmm_module h_module; /*!< Handle to the module. */ -} kmm_module_info; - -/*! \brief Module states -*/ -enum KMM_MODULE_STATES { - KMM_MODULE_STATE_FAIL_INCOMPAT=-12, /*!< The library containing - the module was not - compatible with this version - of NetIDMgr. */ - KMM_MODULE_STATE_FAIL_INV_MODULE=-11, /*!< The library containing - the module was invalid. */ - KMM_MODULE_STATE_FAIL_UNKNOWN=-10, /*!< Module could not be - loaded due to unknown - reasons. */ - KMM_MODULE_STATE_FAIL_MAX_FAILURE=-9,/*!< The module has failed - too many times already. Not - attempting to restart it - again */ - KMM_MODULE_STATE_FAIL_DUPLICATE=-8, /*!< An attempt was made to - load the same module - twice. */ - KMM_MODULE_STATE_FAIL_NOT_REGISTERED=-7, /*!< The module is not - found among the registered - module list */ - KMM_MODULE_STATE_FAIL_NO_PLUGINS=-6,/*!< The module provided no - plugins, or all the plugins - that are provided are - disabled */ - KMM_MODULE_STATE_FAIL_DISABLED=-5, /*!< Module is disabled and - cannot be loaded */ - KMM_MODULE_STATE_FAIL_LOAD=-4, /*!< The module failed to - initialize */ - KMM_MODULE_STATE_FAIL_INVALID=-3, /*!< The module was invalid. - Typically caused by the - required entrypoints not - being present */ - KMM_MODULE_STATE_FAIL_SIGNATURE=-2, /*!< The module failed to load - due to an unverifiable - signature */ - KMM_MODULE_STATE_FAIL_NOT_FOUND=-1, /*!< The module was not - found */ - KMM_MODULE_STATE_NONE=0, /*!< Unknown state. The handle - is possibly invalid */ - KMM_MODULE_STATE_PREINIT, /*!< The module is being - loaded. init_module() hasn't - been called yet */ - KMM_MODULE_STATE_INIT, /*!< In init_module() */ - KMM_MODULE_STATE_INITPLUG, /*!< Initializing plugins */ - KMM_MODULE_STATE_RUNNING, /*!< Running */ - KMM_MODULE_STATE_EXITPLUG, /*!< Currently exiting plugins */ - KMM_MODULE_STATE_EXIT, /*!< Currently exiting */ - KMM_MODULE_STATE_EXITED /*!< Exited */ -}; - -/*! \brief Start the Module Manager - - \note Only called by the NetIDMgr core. -*/ -KHMEXP void KHMAPI -kmm_init(void); - -/*! \brief Stop the Module Manager - - \note Only called by the NetIDMgr core. -*/ -KHMEXP void KHMAPI -kmm_exit(void); - -/*! \brief Return the plugin handle for the current plugin - - The returned handle represents the plugin which owns the current - thread. The returned handle must be released by calling - kmm_release_plugin(). Returns NULL if the current thread is not - owned by any plugin. - */ -KHMEXP kmm_plugin KHMAPI -kmm_this_plugin(void); - -/*! \brief Return the module handle for the current module - - The returned handle represents the module which owns the current - thread. The returned handle must be released by calling - kmm_release_module() -*/ -KHMEXP kmm_module KHMAPI -kmm_this_module(void); - -/*! \name Flags for kmm_load_module() -@{*/ -/*!\brief Load synchronously - - If this flag is set, then the function waits for the module to be - loaded. The default is to load the module asynchronously. - - When loading a module asynchronously, the kmm_load_module() - function returns KHM_ERROR_SUCCESS and exits without waiting for - the module to load. If \a result is not NULL, it will receive a - valid handle to the module. - - When loading a module synchronously, kmm_load_module() will wait - for the module to completely load. If it fails to load properly, - it will return an error code and set \a result to NULL. -*/ -#define KMM_LM_FLAG_SYNC 1 - -/*! \brief Do not load - - Indicates that the module shouldn't actually be loaded. If the - specified module name identifies a module that has already been - loaded, then the function returns a held handle to the existing - module (use kmm_release_module() to free the handle). Otherwise, - the function returns KHM_ERROR_NOT_FOUND. -*/ -#define KMM_LM_FLAG_NOLOAD 2 -/*@}*/ - -/*! \brief Load a module - - The \a modulename parameter specifies a module to load. Depending - on the configuration, not all of the plugins that are provided by - the module may be loaded. If no plugins are successfully loaded, - the module will be immediately unloaded. - - If the module is currently loaded or is being loaded, then a valid - handle to the existing module is returned. - - When called with KMM_LM_FLAG_SYNC, the function does not return - until the module and the associated plugins are all initialized, - or an error occurs. - - If the KMM_LM_FLAG_NOLOAD flag is set, then a handle to an - existing instance of the module will be returned. If the module - hasn't been loaded yet, then no handle is returned and the - function returns KHM_ERROR_NOT_FOUND. - - See the associated NetIDMgr Module Manager documentation on the - sequence of events associated with loading a module. - - \param[in] modulename Name of the module. The module should have - been registered under this name prior to the call. - \param[in] flags Combination of KMM_LM_FLAG_* - \param[out] result Receives a handle to the loaded module. If the - result is not required, set this to NULL. If \a result is not - NULL, and km_load_module() returns KHM_ERROR_SUCCESS, then - kmm_release_module() must be called to release the handle to - the module. Otherwise, \a result receives NULL. If a handle - is returned, it will be valid regardless of whether the module - fails to load or not. You can use kmm_get_module_state() to - query the progress of the loading process. See - ::KMM_LM_FLAG_SYNC. - - \retval KHM_ERROR_SUCCESS The call succeeded. If \a - KMM_LM_FLAG_SYNC was specified, this means that the module was - successfully loaded. Otherwise, it only means that the module - has been queued up for loading. Use kmm_get_module_state() to - determine if it was successfully loaded. If \a result is not - NULL, a valid handle is returned. - \retval KHM_ERROR_EXISTS The module is already loaded or has been - already queued for loading. If \a result is not NULL, a valid - handle to the existing module instance is returned. - \retval KHM_ERROR_NOT_FOUND If called with KMM_LM_FLAG_NOLOAD, - indicates that the module has not been loaded. Otherwise only - returned when called with KMM_LM_FLAG_SYNC. The module image - was not found. No handle is returned. - \retval KHM_ERROR_INVALID_SIGNATURE Only returned when called with - KMM_LM_FLAG_SYNC. The module was signed with an invalid - certificate. No handle is returned. - \retval KHM_ERROR_UNKNOWN Only returned when called with - KMM_LM_FLAG_SYNC. Some other error has occured. No handle is - returned. - - \see \ref pi_fw_pm_load - \see ::KMM_LM_FLAG_SYNC, ::KMM_LM_FLAG_NOLOAD -*/ -KHMEXP khm_int32 KHMAPI -kmm_load_module(wchar_t * modname, khm_int32 flags, kmm_module * result); - -/*! \brief Hold a handle to a module - - Use kmm_release_module() to release the hold. -*/ -KHMEXP khm_int32 KHMAPI -kmm_hold_module(kmm_module module); - -/*! \brief Release a handle to a module - - Release a held referece to a module that was returned in a call to - kmm_load_module(). -*/ -KHMEXP khm_int32 KHMAPI -kmm_release_module(kmm_module m); - -/*! \brief Query the state of a module - - When loading a module asynchronously you can query the state of - the loading process using this. The return value is a status - indicator. - - \return The return value is one of the ::KMM_MODULE_STATES - enumerations. -*/ -KHMEXP khm_int32 KHMAPI -kmm_get_module_state(kmm_module m); - -/*! \brief Unload a module - - See the associated NetIDMgr Module Manager documentation on the - sequence of events associated with unloading a module. - - \see \ref pi_fw_pm_unload -*/ -KHMEXP khm_int32 KHMAPI -kmm_unload_module(kmm_module module); - -/*! \brief Loads the default modules as specified in the configuration - - The configuration can specify the default set of modules to load. - This function dispatches the necessary message for loading these - modules and reutnrs. -*/ -KHMEXP khm_int32 KHMAPI -kmm_load_default_modules(void); - -/*! \brief Checks whether there are any pending loads - - Returns TRUE if there are modules still waiting to be loaded. -*/ -KHMEXP khm_boolean KHMAPI -kmm_load_pending(void); - -#ifdef _WIN32 - -/*! \brief Returns the Windows module handle from a handle to a NetIDMgr module. - Although it is possible to obtain the Windows module handle and - use it to call Windows API functions, it is not recommended to do - so. This is because that might cause the state of the module to - change in ways which are inconsistent from the internal data - structures that kmm maintains. - */ -KHMEXP HMODULE KHMAPI -kmm_get_hmodule(kmm_module m); -#endif - -/*! \brief Hold a plugin - - Obtains a hold on a plugin. The plugin handle will remain valid - until the hold is released with a call to kmm_release_plugin(). - No guarantees are made on the handle once the handle is released. - */ -KHMEXP khm_int32 KHMAPI -kmm_hold_plugin(kmm_plugin p); - -/*! \brief Release a plugin - - Releases a hold on a plugin obtained through a call to - kmm_hold_plugin(). The plugin handle should no longer be - considered valied once this is called. - */ -KHMEXP khm_int32 KHMAPI -kmm_release_plugin(kmm_plugin p); - -/*! \brief Provide a plugin - - This function must be called for each plugin that the module - provides. - - Note that this function returns immediately and does not - initialize the plugin. All plugins that are provided by a - module will be initialized once the init_module() function - returns. If the plugin has dependencies, it will be kept in a - held state until the plugins that it depends on are successfully - initialized. If the dependencies are not resolved (the dependent - plugins are not loaded), then plugin will not be initialized. - - If the plugin is not registered and \a plugin contains enough - information to perform the registration, then it will be - automatically registered. However, if the plugin is not - registered and cannot be registered using the provided - information, the plugin will not be initialized properly. Note - that automatic registration will always register the plugin in the - user configuration store. - - The \a name and \a msg_proc members of \a plugin are required to - have valid values. The \a icon member may optionally be - specified. The other fields can be specified if the plugin should - be automatically registered, however, the \a module field will be - ignored and will be determined by the \a module handle. - - \param[in] module Handle to this module that is providing the plugin. - \param[in] plugin A plugin descriptor. - - \retval KHM_ERROR_SUCCESS Succeeded. - \retval KHM_ERROR_INVALID_OPERATION The function was not called - during init_module() - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_DUPLICATE The plugin was already provided - - \note This can only be called when handing init_module() -*/ -KHMEXP khm_int32 KHMAPI -kmm_provide_plugin(kmm_module module, kmm_plugin_reg * plugin); - -/*! \brief Query the state of a plugin. - - \return One of ::_kmm_plugin_states -*/ -KHMEXP khm_int32 KHMAPI -kmm_get_plugin_state(wchar_t * plugin); - -/*! \defgroup kmm_reg Registration - - The functions for managing plugin and module registration. These - functions are also available as static linked libraries for use by - external applications which must register or unregister plugins or - modules. -@{*/ - -/*! \brief Obtain the configuration space for a named plugin - - Note that the named plugin does not have to actually exist. - Configuration spaces for plugins are based solely on the plugin - name and hence can be accessed regardless of whether the specific - plugin is loaded or not. - - \param[in] flags Controls the options for opening the - configuration space. If KHM_FLAG_CREATE is specified, then - the configuration space for the plugin named \a plugin wil be - created if it doesn't already exist. The \a flags parameter - is directly passed into a call to khc_open_space(). - - \param[in] plugin Name of the plugin. The name can not contain - slashes. - - \param[out] result Receives a configuration space handle. The - calling application should free the handle using - khc_close_space(). - - \see khc_open_space() - \see khc_close_space() - */ -KHMEXP khm_int32 KHMAPI -kmm_get_plugin_config(wchar_t * plugin, khm_int32 flags, khm_handle * result); - -/*! \brief Obtain the configuration space or a named module - - The named module does not have to actually exist. Configuration - spaces for modules are based on the basename of the module - (including the extension). - - \param[in] module Name of the module. - - \param[in] flags The flags used to call khc_open_space(). You can - use this to specify a particular configuration store if - needed. - - \param[out] result Receives the handle to a configuration space if - successful. Call khc_close_space() to close the handle. - - \see khc_open_space() - \see khc_close_space() -*/ -KHMEXP khm_int32 KHMAPI -kmm_get_module_config(wchar_t * module, khm_int32 flags, khm_handle * result); - -/*! \brief Retrieve a handle to the configuration space for plugins - - The configuration space for plugins is a container which holds the - configuration subspaces for all the plugins. This is the config - space which must be used to load a configuration space for a - plugin. - - \param[in] flags The flags to pass in to the call to - khc_open_space(). The flags can be used to select a specific - configuration store if needed. - - \param[out] result Receives a handle to the configuration - space. Call khc_close_space() to close the handle - - \see khc_open_space() - \see khc_close_space() - */ -KHMEXP khm_int32 KHMAPI -kmm_get_plugins_config(khm_int32 flags, khm_handle * result); - -/*! \brief Retrieve the handle to the configuration space for modules - - The configuration space for modules is a container which hold the - configuration subspaces for all the modules. Each module - registration ends up in this subspace. - - \param[in] flags The flags to pass in to the call to - khc_open_space(). The flags can be used to select a specific - configuration store if needed. - - \param[out] result Receives a handle to the configuration space. - Call khc_close_space() to close the handle. - - \see khc_open_space() - \see khc_close_space() - */ -KHMEXP khm_int32 KHMAPI -kmm_get_modules_config(khm_int32 flags, khm_handle * result); - -/*! \brief Return information about a loaded module - - The retrieves a block of information about a module. Refer to - ::kmm_module_info for information about the format of the returned - data. - - Note that the size of the required buffer is actually greater than - the size of the ::kmm_module_info structure and accomodates the - ::kmm_plugin_info structures and strings required to complete the - information block. - - Call the function with \a buffer set to NULL and \a cb_buffer - pointing at a khm_size variable to obtain the required size of the - buffer. - - \param[in] module_name Name of a module - \param[in] flags Flags indicating which types of information to - return - \param[out] buffer Points to a buffer that recieves information. - Set this to NULL if only the size of the buffer is required. - \param[in,out] On entry, contains the size of the buffer pointed - to by \a buffer if \a buffer is not NULL. On exit, contains - the required size of the buffer or the number of actual bytes - copied. - - \retval KHM_ERROR_SUCCESS The requested information was copied - \retval KHM_ERROR_INVALID_PARAM One of the parameters was invalid - \retval KHM_ERROR_TOO_LONG The buffer was not large enough or was - NULL. The number of bytes requied is in \a cb_buffer. - \retval KHM_ERROR_NOT_FOUND The specified module is not a - registered module. - */ -KHMEXP khm_int32 KHMAPI -kmm_get_module_info(wchar_t * module_name, khm_int32 flags, - kmm_module_info * buffer, khm_size * cb_buffer); - -/*! \brief Get information about a module - - Similar to kmm_get_module_info(), but uses a module handle instead - of a name, and uses internal buffers for providing string fields. - - The information that is returned should be freed using a call to - kmm_release_module_info_i(). - - \see kmm_release_module_info_i() - */ -KHMEXP khm_int32 KHMAPI -kmm_get_module_info_i(kmm_module module, kmm_module_info * info); - -/*! \brief Release module information - - Releases the information returned by a previous call to - kmm_get_module_info_i(). The contents of the ::kmm_module_info - structure should not have been modified in any way between calling - kmm_get_module_info_i() and kmm_release_module_info_i(). - */ -KHMEXP khm_int32 KHMAPI -kmm_release_module_info_i(kmm_module_info * info); - -/*! \brief Obtain information about a plugin - - Retrieve a block of information about a plugin. See - ::kmm_plugin_info for details about what information can be - returned. Note that some fields may not be available if the - module is not loaded. - - Note that the size of the required buffer is greater than the size - of the ::kmm_plugin_info structure and accounts for strings as - well. Call kmm_get_plugin_info() with \a buffer set to NULL and - \a cb_buffer set to point to a variable of type \a khm_size to - obtain the required size of the structure. - - \param[in] plugin_name Name of the plugin - \param[out] buffer The buffer to receive the plugin information. - Set to \a NULL if only the size of the buffer is required. - \param[in,out] cb_buffer On entry, points to variable that - specifies the size of the buffer pointed to by \a buffer is \a - buffer is not \a NULL. On exit, holds the number of bytes - copied or the required size of the buffer. - - \retval KHM_ERROR_SUCCESS The requested information was - successfully copied to the \a buffer - \retval KHM_ERROR_TOO_LONG The buffer was either \a NULL or - insufficient to hold the requested information. The required - size of the buffer was stored in \a cb_buffer - \retval KHM_ERROR_INVALID_PARAM One or more parameters were - invlaid. - \retval KHM_ERROR_NOT_FOUND The specified plugin was not found - among the registered plugins. -*/ -KHMEXP khm_int32 KHMAPI -kmm_get_plugin_info(wchar_t * plugin_name, - kmm_plugin_info * buffer, - khm_size * cb_buffer); - -/*! \brief Obtain information about a plugin using a plugin handle - - Similar to kmm_get_plugin_info() but uses a plugin handle instead - of a plugin name. If the call is successful, the \a info - structure will be filled with information about the plugin. The - returned info should not be modified in any way and may contain - pointers to internal buffers. - - The returned information must be released with a call to - kmm_release_plugin_info_i(). - */ -KHMEXP khm_int32 KHMAPI -kmm_get_plugin_info_i(kmm_plugin p, kmm_plugin_info * info); - -/*! \brief Release plugin information returned by kmm_get_plugin_info_i - - The information returned by kmm_get_plugin_info_i() should not be - modified in any way before calling kmm_release_plugin_info_i(). - Once the call completes, the contents of \a info will be - initialized to zero. - */ -KHMEXP khm_int32 KHMAPI -kmm_release_plugin_info_i(kmm_plugin_info * info); - -/*! \brief Enumerates plugins - - Enumerates through known plugins. This list may not include - plugins which were not loaded by NetIDMgr in this session. - - If the call is successful, a handle to the next plugin in the list - will be placed in \a p_next. The returned handle must be freed - with a call to kmm_release_plugin(). - - If the \a p parameter is set to NULL, then the first plugin handle - will be placed in \a p_next. The handles will not be returned in - any specific order. In addition, the enumeration may not include - all known plugins if the list of plugins changes during - enumeration. - */ -KHMEXP khm_int32 KHMAPI -kmm_get_next_plugin(kmm_plugin p, kmm_plugin * p_next); - -/*! \brief Enables or disables a plugin - - This function currently does not take effect immediately. However - it marks the plugin as enabled or disabled so that the next time - NetIDMgr starts, the module manager will act accordingly. - - \param[in] p Handle to the plugin - - \param[in] enable If non-zero, the plugin will be marked as - enabled. Otherwise the plugin will be marked as disabled. - */ -KHMEXP khm_int32 KHMAPI -kmm_enable_plugin(kmm_plugin p, khm_boolean enable); - -/*! \brief Register a plugin - - The \a plugin member defines the plugin to be registered. The \a - msg_proc and \a icon members of the structure are ignored. - - At the time kmm_register_plugin() is called, the module specified - by \a module member of the \a plugin parameter must have been already - registered. Otherwise the function call fails. - - If the plugin has already been registered, then all the fields in - the plugin registration will be updated to be in sync with the - information provided in the \a plugin parameter. The failure - counts and associated statistics will not be reset when the - configuration information is updated. - - If the plugin has not been registered, the a new registration - entry is created in the configuration space indicated by the \a - config_flags parameter. In addition, the plugin will be added to - the list of plugins associated with the owning module. - - Note that the module that owns the plugin must be registered in - the same configuration store as the plugin. - - \param[in] plugin Registration info for the plugin. The \a - msg_proc and \a icon members are ignored. All other fields - are required. The \a description member should be localized - to the system locale when registering a plugin in the machine - configuration store and should be localized to the user locale - when registering a plugin in the user configuration store. - \param[in] config_flags Flags for the configuration provider. - These flags are used verbatim to call khc_open_space(), hence - they may be used to pick whether or not the registration is - per machine or per user. - - \see kmm_register_module() - */ -KHMEXP khm_int32 KHMAPI -kmm_register_plugin(kmm_plugin_reg * plugin, khm_int32 config_flags); - -/*! \brief Register a module - - The \a module parameter specifies the parameters for the module - registration. - - The \a plugin_info member should point to an array of - ::kmm_plugin_info structures unless the \a n_plugins member is - zero, in which case \a plugin_info can be \a NULL. Plugins can be - registered separately using kmm_register_plugin(). - - \param[in] module Information about the module. The name and path - fields are required. The \a plugin_info field can only be \a - NULL if \a n_plugins is zero. - - \param[in] config_flags Flags used to call khc_open_space(). This - can be used to choose the configuration store in which the - module registration will be performed. - */ -KHMEXP khm_int32 KHMAPI -kmm_register_module(kmm_module_reg * module, khm_int32 config_flags); - -/*! \brief Unregister a plugin - - Registration information associated with the plugin will be - removed. In addtion, the plugin will be removed from the list of - plugins provided by the owner module. - - \param[in] plugin Names the plugin to be removed - \param[in] config_flags Flags used to call khc_open_space(). Can - be used to choose the configuraiton store that is affected by - the call. - - \note kmm_unregister_plugin() has no effect on whether the plugin - is loaded or not. The caller must make sure that the plugin - is unloaded and the associated module is either also unloaded - or in a state where the plugin can be unregistered. - */ -KHMEXP khm_int32 KHMAPI -kmm_unregister_plugin(wchar_t * plugin, khm_int32 config_flags); - -/*! \brief Unregister a module - - Registration information associated with the module as well as all - the plugins provided by the module will be removed from the - configuration store. - - \param[in] module Names the module to be removed - - \param[in] config_flags Flags used to call khc_open_space(). Can - be used to choose the configuration store affected by the - call. - - \note kmm_unregister_module() has no effect on the loaded state of - the module. The caller should make sure that the module is - unloaded and in a state where it can be unregistered. - */ -KHMEXP khm_int32 KHMAPI -kmm_unregister_module(wchar_t * module, khm_int32 config_flags); - -/*@}*/ /* kmm_reg */ - -/*! \defgroup kmm_loc Internationalization support - - See \ref pi_localization for more information about - internationalization. - -@{*/ - -/*! \brief Locale descriptor record - - See kmm_set_locale() -*/ -typedef struct tag_kmm_module_locale { - khm_ui_4 language; /*!< A language ID. On Windows, you can use the - MAKELANGID macro to generate this value. */ - wchar_t * filename; /*!< The filename corresponding to this language. - Use NULL to indicate that resources for this - language are to be found in the main module. */ - khm_int32 flags; /*!< Flags. Combination of KMM_MLOC_FLAG_* */ -} kmm_module_locale; - -#define LOCALE_DEF(language_id, filename, flags) {language_id, filename, flags} - -/*! \brief Default (fallback) locale -*/ -#define KMM_MLOC_FLAG_DEFAULT 1 - - -/*! \brief Sets the locale for a loaded module. - - The given locale records are searched in the given order until a - locale that matches the current user locale is found. If no - locales match, then the first locale with the - ::KMM_MLOC_FLAG_DEFAULT flag set will be loaded. If no locales - have that flag set, then the first locale is loaded. - - You can obtain a handle to the loaded library using - kmm_get_resource_hmodule(). This function does not return until a - matched library is loaded. - - Note that the ::kmm_module_locale structure only specifies a - module name for the resource module. This resource module must - exist in the same directory as the \a module. - - \param[in] module The module handle - \param[in] locales An array of ::kmm_module_locale objects - \param[in] n_locales The number of objects in the array pointed to by \a locales - - \retval KHM_ERROR_SUCCESS Succeeded. - \retval KHM_ERROR_NOT_FOUND A matching locale resource library was not found. - \retval KHM_ERROR_INVALID_OPERATION The function was called on a module which is currently not being initalized. - - \see \ref pi_localization - \see kmm_get_resource_hmodule() - - \note This can only be called when handing init_module() -*/ -KHMEXP khm_int32 KHMAPI -kmm_set_locale_info(kmm_module module, - kmm_module_locale * locales, - khm_int32 n_locales); - -#ifdef _WIN32 - -/*! \brief Return the Windows module handle of the resource library of a NetIDMgr module. - - NetIDMgr allows the specification of an alternate resource library - that will be used to load localized resources from. This function - returns a handle to this library. - - While you can use the convenience macros to access resources in a - localization library using the module handle, it is recommended, - for performance reasons, to use this function to obtain the handle - to the resource library and then use that handle in calls to - LoadString, LoadImage etc. directly. -*/ -KHMEXP HMODULE KHMAPI -kmm_get_resource_hmodule(kmm_module m); - -/*! \name Convenience Macros -@{*/ -/*! \brief Convenience macro for using calling LoadAccelerators using a module handle - - \param[in] module A handle to a loaded module. The corresponding resource - module will be located through a call to kmm_get_resource_hmodule() -*/ -#define kmm_LoadAccelerators(module, lpTableName) \ - (LoadAccelerators(kmm_get_resource_hmodule(module), lpTableName)) - -/*! \brief Convenience macro for using calling LoadBitmap using a module handle - - \param[in] module A handle to a loaded module. The corresponding resource - module will be located through a call to kmm_get_resource_hmodule() -*/ -#define kmm_LoadBitmap(module, lpBitmapName) \ - (LoadBitmap(kmm_get_resource_hmodule(module), lpBitmapName)) - -/*! \brief Convenience macro for using calling LoadImage using a module handle - - \param[in] module A handle to a loaded module. The corresponding resource - module will be located through a call to kmm_get_resource_hmodule() -*/ -#define kmm_LoadImage(module, lpszName, uType, cxDesired, cyDesired, fuLoad) \ - (LoadImage(kmm_get_resource_hmodule(module), lpszName, uType, cxDesired, cyDesired, fuLoad)) - -/*! \brief Convenience macro for using calling LoadCursor using a module handle - - \param[in] module A handle to a loaded module. The corresponding resource - module will be located through a call to kmm_get_resource_hmodule() -*/ -#define kmm_LoadCursor(module, lpCursorName) \ - (LoadCursor(kmm_get_resource_hmodule(module), lpCursorName)) - -/*! \brief Convenience macro for using calling LoadIcon using a module handle - - \param[in] module A handle to a loaded module. The corresponding resource - module will be located through a call to kmm_get_resource_hmodule() -*/ -#define kmm_LoadIcon(module, lpIconName) \ - (LoadIcon(kmm_get_resource_hmodule(module), lpIconName)) - -/*! \brief Convenience macro for using calling LoadMenu using a module handle - - \param[in] module A handle to a loaded module. The corresponding resource - module will be located through a call to kmm_get_resource_hmodule() -*/ -#define kmm_LoadMenu(module, lpMenuName) \ - (LoadMenu(kmm_get_resource_hmodule(module), lpMenuName)) - -/*! \brief Convenience macro for using calling LoadString using a module handle - - \param[in] module A handle to a loaded module. The corresponding resource - module will be located through a call to kmm_get_resource_hmodule() -*/ -#define kmm_LoadString(module, uID, lpBuffer, nBufferMax) \ - (LoadString(kmm_get_resource_hmodule(module), uID, lpBuffer, nBufferMax)) -/*@}*/ /* Convenience Macros */ -#endif -/*@}*/ /* group kmm_loc */ -/*@}*/ /* group kmm */ -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KMM_H +#define __KHIMAIRA_KMM_H + +#include +#include + +/*! \defgroup kmm NetIDMgr Module Manager +@{*/ + +/*! \brief A handle to a module. +*/ +typedef khm_handle kmm_module; + +/*! \brief A handle to a plugin. + */ +typedef khm_handle kmm_plugin; + +/*! \name Limits + @{*/ + +/*! \brief Maximum number of characters in a name in KMM including the terminating NULL */ +#define KMM_MAXCCH_NAME 256 + +/*! \brief Maximum number of bytes in a name in KMM including the terminating NULL */ +#define KMM_MAXCB_NAME (sizeof(wchar_t) * KMM_MAXCCH_NAME) + +/*! \brief Maximum number of characters in a description in KMM including the terminating NULL */ +#define KMM_MAXCCH_DESC 512 + +/*! \brief Maximum number of bytes in a description in KMM including the terminating NULL */ +#define KMM_MAXCB_DESC (sizeof(wchar_t) * KMM_MAXCCH_NAME) + +/*! \brief Maximum number of characters in a vendor string in KMM including the terminating NULL */ +#define KMM_MAXCCH_VENDOR 256 + +/*! \brief Maximum number of bytes in a vendor string in KMM including the terminating NULL */ +#define KMM_MAXCB_VENDOR (sizeof(wchar_t) * KMM_MAXCCH_VENDOR) + +/*! \brief Maximum number of characters in a support URI in KMM including the terminating NULL */ +#define KMM_MAXCCH_SUPPORT 256 + +/*! \brief Maximum number of bytes in a vendor string in KMM including the terminating NULL */ +#define KMM_MAXCB_SUPPORT (sizeof(wchar_t) * KMM_MAXCCH_SUPPORT) + +/*! \brief Maximum number of dependencies per plugin +*/ +#define KMM_MAX_DEPENDENCIES 8 + +/*! \brief Maximum number of dependants per plugin + */ +#define KMM_MAX_DEPENDANTS 32 + +/*! \brief Maximum number of characters a dependency string including trailing double NULL */ +#define KMM_MAXCCH_DEPS (KMM_MAXCCH_NAME * KMM_MAX_DEPENDENCIES + 1) + +/*! \brief Maximum number of bytes in a dependency string including trailing double NULL */ +#define KMM_MAXCB_DEPS (sizeof(wchar_t) * KMM_MAXCCH_DEPS) +/*@}*/ /* Limits */ + +/*! \brief Plugin registration + + \see ::khm_cred_provider +*/ +typedef struct tag_kmm_plugin_reg { + wchar_t * name; /*!< Name of the plugin. Maximum of + KMM_MAXCCH_NAME characters + including the terminating + NULL. Required. */ + + wchar_t * module; /*!< Name of module that owns the + plugin. Maximum of + KMM_MAXCCH_NAME characters + including terminating NULL. + Required. */ + + khm_int32 type; /*!< Type plugin type. One of + KHM_PITYPE_*. Required. */ + khm_int32 flags; /*!< Unused. Set to 0 */ + kmq_callback_t msg_proc; /*!< Message processor. Required. */ + wchar_t * dependencies; /*!< Dependencies. Note that this is + a multi string. (you can use the + KHC multi string functions to + manipulate multi strings or to + convert a comma separated list of + dependencies to a multi string). + Each string in the multi string + is a name of a plugin that this + plugin depends on. Optional (set + to NULL if this plugin has no + dependencies). Maximum of + KMM_MAXCCH_DEPS characters + including terminating double + NULL.*/ + + wchar_t * description; /*!< Description of the plugin. + Maximum of KMM_MAXCCH_DESC + characters including the + terminating + NULL. Localized. Optional (set to + NULL if not provided) */ +#ifdef _WIN32 + HICON icon; /*!< Icon used to represent the + plugin. Optional. (set to NULL if + not provided) */ +#endif +} kmm_plugin_reg; + +/*! \brief Plugin information +*/ +typedef struct tag_kmm_plugin_info { + kmm_plugin_reg reg; /*!< Registration info */ + + khm_int32 state; /*!< Current status of the plugin. + One of ::_kmm_plugin_states */ + + khm_int32 failure_count; /*!< Number of recorded failures in + the plugin */ + FILETIME failure_time; /*!< Time of first recorded failure */ + khm_int32 failure_reason; /*!< The reason for the first recorded + failure */ + + kmm_plugin h_plugin; /*!< Handle to plugin */ + + khm_int32 flags; /*!< Flags for the plugin. Currently + this can only specify + ::KMM_PLUGIN_FLAG_DISABLED. */ +} kmm_plugin_info; + +/*! \brief The plugin is disabled + + This flag will be set in the \a flags field of the + ::kmm_plugin_info structure for a plugin that has been marked as + disabled. If the plugin is currently running, but marked as + disabled for future sessions, then this bit will be set in \a + flags , but the \a state of the plugin will indicate that the + plugin is running. + */ +#define KMM_PLUGIN_FLAG_DISABLED 0x00000400 + +/*! \name Plugin types +@{*/ +/*! \brief A credentials provider + + \see \ref pi_pt_cred for more information. + */ +#define KHM_PITYPE_CRED 1 + +/*! \brief A identity provider + + \see \ref pi_pt_cred for more information + */ +#define KHM_PITYPE_IDENT 2 + +/*! \brief A configuration provider + + \see \ref pi_pt_conf for more information. + */ +#define KHM_PITYPE_CONFIG 3 + +/*! \brief Undefined plugin type + + The plugin doesn't provide any credential type. + */ +#define KHM_PITYPE_MISC 4 + +/*@}*/ + +/*! \brief Plugin states */ +enum _kmm_plugin_states { + KMM_PLUGIN_STATE_FAIL_INIT = -6, /*!< Failed to initialize */ + KMM_PLUGIN_STATE_FAIL_UNKNOWN = -5, /*!< Failed due to unknown + reasons */ + KMM_PLUGIN_STATE_FAIL_MAX_FAILURE = -4, /*!< The plugin has + reached the maximum number + of failures and cannot be + initialized until the + failure count is reset */ + KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED = -3, /*!< Failed because the + plugin was not registered + and automatic registration + failed. */ + KMM_PLUGIN_STATE_FAIL_DISABLED = -2,/*!< Failed because plugin was + disabled by the user. */ + KMM_PLUGIN_STATE_FAIL_LOAD = -1, /*!< The plugin failed to load + due to some unknown + reason. */ + KMM_PLUGIN_STATE_NONE = 0, /*!< Unknown state */ + KMM_PLUGIN_STATE_PLACEHOLDER, /*!< Placeholder. The plugin + hasn't been provided by + anyone yet, but the plugin + record has been created to + keep track of + dependencies. */ + KMM_PLUGIN_STATE_REG, /*!< The plugin is registered + but not initialized */ + KMM_PLUGIN_STATE_PREINIT, /*!< The plugin is in the + process of being + initialized */ + KMM_PLUGIN_STATE_HOLD, /*!< On hold. One or more + dependencies of this plugin + has not been resolved */ + KMM_PLUGIN_STATE_INIT, /*!< The plugin was initialized */ + KMM_PLUGIN_STATE_RUNNING, /*!< The plugin is running */ + KMM_PLUGIN_STATE_EXITED /*!< The plugin has been stopped. */ +}; + +/*! \brief Module registration */ +typedef struct tag_kmm_module_reg { + wchar_t * name; /*!< Identifier for the module */ + wchar_t * path; /*!< Full pathname to module + binary */ + + wchar_t * description; /*!< Description of module */ + + wchar_t * vendor; /*!< Vendor/copyright string */ + + wchar_t * support; /*!< Support URL/contact */ + + khm_int32 n_plugins; /*!< Number of plugins that are + active */ + kmm_plugin_reg * plugin_reg_info; /*!< Array of kmm_plugin_reg + records for each active + plugin */ +} kmm_module_reg; + +/*! \brief Module information record */ +typedef struct tag_kmm_module_info { + kmm_module_reg reg; /*!< Registration info */ + + khm_ui_4 language; /*!< Currently loaded langugage */ + + khm_int32 state; /*!< Current status of the + module */ + + khm_version file_version; /*!< File version for the + module */ + khm_version product_version; /*!< Product version for the + module */ + + khm_int32 failure_count; /*!< Number of times the module + has failed to load */ + FILETIME failure_time; /*!< Time of first recorded + failure */ + khm_int32 failure_reason; /*!< Reason for first failure. + One of the module status + values */ + + kmm_module h_module; /*!< Handle to the module. */ +} kmm_module_info; + +/*! \brief Module states +*/ +enum KMM_MODULE_STATES { + KMM_MODULE_STATE_FAIL_INCOMPAT=-12, /*!< The library containing + the module was not + compatible with this version + of NetIDMgr. */ + KMM_MODULE_STATE_FAIL_INV_MODULE=-11, /*!< The library containing + the module was invalid. */ + KMM_MODULE_STATE_FAIL_UNKNOWN=-10, /*!< Module could not be + loaded due to unknown + reasons. */ + KMM_MODULE_STATE_FAIL_MAX_FAILURE=-9,/*!< The module has failed + too many times already. Not + attempting to restart it + again */ + KMM_MODULE_STATE_FAIL_DUPLICATE=-8, /*!< An attempt was made to + load the same module + twice. */ + KMM_MODULE_STATE_FAIL_NOT_REGISTERED=-7, /*!< The module is not + found among the registered + module list */ + KMM_MODULE_STATE_FAIL_NO_PLUGINS=-6,/*!< The module provided no + plugins, or all the plugins + that are provided are + disabled */ + KMM_MODULE_STATE_FAIL_DISABLED=-5, /*!< Module is disabled and + cannot be loaded */ + KMM_MODULE_STATE_FAIL_LOAD=-4, /*!< The module failed to + initialize */ + KMM_MODULE_STATE_FAIL_INVALID=-3, /*!< The module was invalid. + Typically caused by the + required entrypoints not + being present */ + KMM_MODULE_STATE_FAIL_SIGNATURE=-2, /*!< The module failed to load + due to an unverifiable + signature */ + KMM_MODULE_STATE_FAIL_NOT_FOUND=-1, /*!< The module was not + found */ + KMM_MODULE_STATE_NONE=0, /*!< Unknown state. The handle + is possibly invalid */ + KMM_MODULE_STATE_PREINIT, /*!< The module is being + loaded. init_module() hasn't + been called yet */ + KMM_MODULE_STATE_INIT, /*!< In init_module() */ + KMM_MODULE_STATE_INITPLUG, /*!< Initializing plugins */ + KMM_MODULE_STATE_RUNNING, /*!< Running */ + KMM_MODULE_STATE_EXITPLUG, /*!< Currently exiting plugins */ + KMM_MODULE_STATE_EXIT, /*!< Currently exiting */ + KMM_MODULE_STATE_EXITED /*!< Exited */ +}; + +/*! \brief Start the Module Manager + + \note Only called by the NetIDMgr core. +*/ +KHMEXP void KHMAPI +kmm_init(void); + +/*! \brief Stop the Module Manager + + \note Only called by the NetIDMgr core. +*/ +KHMEXP void KHMAPI +kmm_exit(void); + +/*! \brief Return the plugin handle for the current plugin + + The returned handle represents the plugin which owns the current + thread. The returned handle must be released by calling + kmm_release_plugin(). Returns NULL if the current thread is not + owned by any plugin. + */ +KHMEXP kmm_plugin KHMAPI +kmm_this_plugin(void); + +/*! \brief Return the module handle for the current module + + The returned handle represents the module which owns the current + thread. The returned handle must be released by calling + kmm_release_module() +*/ +KHMEXP kmm_module KHMAPI +kmm_this_module(void); + +/*! \name Flags for kmm_load_module() +@{*/ +/*!\brief Load synchronously + + If this flag is set, then the function waits for the module to be + loaded. The default is to load the module asynchronously. + + When loading a module asynchronously, the kmm_load_module() + function returns KHM_ERROR_SUCCESS and exits without waiting for + the module to load. If \a result is not NULL, it will receive a + valid handle to the module. + + When loading a module synchronously, kmm_load_module() will wait + for the module to completely load. If it fails to load properly, + it will return an error code and set \a result to NULL. +*/ +#define KMM_LM_FLAG_SYNC 1 + +/*! \brief Do not load + + Indicates that the module shouldn't actually be loaded. If the + specified module name identifies a module that has already been + loaded, then the function returns a held handle to the existing + module (use kmm_release_module() to free the handle). Otherwise, + the function returns KHM_ERROR_NOT_FOUND. +*/ +#define KMM_LM_FLAG_NOLOAD 2 +/*@}*/ + +/*! \brief Load a module + + The \a modulename parameter specifies a module to load. Depending + on the configuration, not all of the plugins that are provided by + the module may be loaded. If no plugins are successfully loaded, + the module will be immediately unloaded. + + If the module is currently loaded or is being loaded, then a valid + handle to the existing module is returned. + + When called with KMM_LM_FLAG_SYNC, the function does not return + until the module and the associated plugins are all initialized, + or an error occurs. + + If the KMM_LM_FLAG_NOLOAD flag is set, then a handle to an + existing instance of the module will be returned. If the module + hasn't been loaded yet, then no handle is returned and the + function returns KHM_ERROR_NOT_FOUND. + + See the associated NetIDMgr Module Manager documentation on the + sequence of events associated with loading a module. + + \param[in] modulename Name of the module. The module should have + been registered under this name prior to the call. + \param[in] flags Combination of KMM_LM_FLAG_* + \param[out] result Receives a handle to the loaded module. If the + result is not required, set this to NULL. If \a result is not + NULL, and km_load_module() returns KHM_ERROR_SUCCESS, then + kmm_release_module() must be called to release the handle to + the module. Otherwise, \a result receives NULL. If a handle + is returned, it will be valid regardless of whether the module + fails to load or not. You can use kmm_get_module_state() to + query the progress of the loading process. See + ::KMM_LM_FLAG_SYNC. + + \retval KHM_ERROR_SUCCESS The call succeeded. If \a + KMM_LM_FLAG_SYNC was specified, this means that the module was + successfully loaded. Otherwise, it only means that the module + has been queued up for loading. Use kmm_get_module_state() to + determine if it was successfully loaded. If \a result is not + NULL, a valid handle is returned. + \retval KHM_ERROR_EXISTS The module is already loaded or has been + already queued for loading. If \a result is not NULL, a valid + handle to the existing module instance is returned. + \retval KHM_ERROR_NOT_FOUND If called with KMM_LM_FLAG_NOLOAD, + indicates that the module has not been loaded. Otherwise only + returned when called with KMM_LM_FLAG_SYNC. The module image + was not found. No handle is returned. + \retval KHM_ERROR_INVALID_SIGNATURE Only returned when called with + KMM_LM_FLAG_SYNC. The module was signed with an invalid + certificate. No handle is returned. + \retval KHM_ERROR_UNKNOWN Only returned when called with + KMM_LM_FLAG_SYNC. Some other error has occured. No handle is + returned. + + \see \ref pi_fw_pm_load + \see ::KMM_LM_FLAG_SYNC, ::KMM_LM_FLAG_NOLOAD +*/ +KHMEXP khm_int32 KHMAPI +kmm_load_module(wchar_t * modname, khm_int32 flags, kmm_module * result); + +/*! \brief Hold a handle to a module + + Use kmm_release_module() to release the hold. +*/ +KHMEXP khm_int32 KHMAPI +kmm_hold_module(kmm_module module); + +/*! \brief Release a handle to a module + + Release a held referece to a module that was returned in a call to + kmm_load_module(). +*/ +KHMEXP khm_int32 KHMAPI +kmm_release_module(kmm_module m); + +/*! \brief Query the state of a module + + When loading a module asynchronously you can query the state of + the loading process using this. The return value is a status + indicator. + + \return The return value is one of the ::KMM_MODULE_STATES + enumerations. +*/ +KHMEXP khm_int32 KHMAPI +kmm_get_module_state(kmm_module m); + +/*! \brief Unload a module + + See the associated NetIDMgr Module Manager documentation on the + sequence of events associated with unloading a module. + + \see \ref pi_fw_pm_unload +*/ +KHMEXP khm_int32 KHMAPI +kmm_unload_module(kmm_module module); + +/*! \brief Loads the default modules as specified in the configuration + + The configuration can specify the default set of modules to load. + This function dispatches the necessary message for loading these + modules and reutnrs. +*/ +KHMEXP khm_int32 KHMAPI +kmm_load_default_modules(void); + +/*! \brief Checks whether there are any pending loads + + Returns TRUE if there are modules still waiting to be loaded. +*/ +KHMEXP khm_boolean KHMAPI +kmm_load_pending(void); + +#ifdef _WIN32 + +/*! \brief Returns the Windows module handle from a handle to a NetIDMgr module. + Although it is possible to obtain the Windows module handle and + use it to call Windows API functions, it is not recommended to do + so. This is because that might cause the state of the module to + change in ways which are inconsistent from the internal data + structures that kmm maintains. + */ +KHMEXP HMODULE KHMAPI +kmm_get_hmodule(kmm_module m); +#endif + +/*! \brief Hold a plugin + + Obtains a hold on a plugin. The plugin handle will remain valid + until the hold is released with a call to kmm_release_plugin(). + No guarantees are made on the handle once the handle is released. + */ +KHMEXP khm_int32 KHMAPI +kmm_hold_plugin(kmm_plugin p); + +/*! \brief Release a plugin + + Releases a hold on a plugin obtained through a call to + kmm_hold_plugin(). The plugin handle should no longer be + considered valied once this is called. + */ +KHMEXP khm_int32 KHMAPI +kmm_release_plugin(kmm_plugin p); + +/*! \brief Provide a plugin + + This function must be called for each plugin that the module + provides. + + Note that this function returns immediately and does not + initialize the plugin. All plugins that are provided by a + module will be initialized once the init_module() function + returns. If the plugin has dependencies, it will be kept in a + held state until the plugins that it depends on are successfully + initialized. If the dependencies are not resolved (the dependent + plugins are not loaded), then plugin will not be initialized. + + If the plugin is not registered and \a plugin contains enough + information to perform the registration, then it will be + automatically registered. However, if the plugin is not + registered and cannot be registered using the provided + information, the plugin will not be initialized properly. Note + that automatic registration will always register the plugin in the + user configuration store. + + The \a name and \a msg_proc members of \a plugin are required to + have valid values. The \a icon member may optionally be + specified. The other fields can be specified if the plugin should + be automatically registered, however, the \a module field will be + ignored and will be determined by the \a module handle. + + \param[in] module Handle to this module that is providing the plugin. + \param[in] plugin A plugin descriptor. + + \retval KHM_ERROR_SUCCESS Succeeded. + \retval KHM_ERROR_INVALID_OPERATION The function was not called + during init_module() + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_DUPLICATE The plugin was already provided + + \note This can only be called when handing init_module() +*/ +KHMEXP khm_int32 KHMAPI +kmm_provide_plugin(kmm_module module, kmm_plugin_reg * plugin); + +/*! \brief Query the state of a plugin. + + \return One of ::_kmm_plugin_states +*/ +KHMEXP khm_int32 KHMAPI +kmm_get_plugin_state(wchar_t * plugin); + +/*! \defgroup kmm_reg Registration + + The functions for managing plugin and module registration. These + functions are also available as static linked libraries for use by + external applications which must register or unregister plugins or + modules. +@{*/ + +/*! \brief Obtain the configuration space for a named plugin + + Note that the named plugin does not have to actually exist. + Configuration spaces for plugins are based solely on the plugin + name and hence can be accessed regardless of whether the specific + plugin is loaded or not. + + \param[in] flags Controls the options for opening the + configuration space. If KHM_FLAG_CREATE is specified, then + the configuration space for the plugin named \a plugin wil be + created if it doesn't already exist. The \a flags parameter + is directly passed into a call to khc_open_space(). + + \param[in] plugin Name of the plugin. The name can not contain + slashes. + + \param[out] result Receives a configuration space handle. The + calling application should free the handle using + khc_close_space(). + + \see khc_open_space() + \see khc_close_space() + */ +KHMEXP khm_int32 KHMAPI +kmm_get_plugin_config(wchar_t * plugin, khm_int32 flags, khm_handle * result); + +/*! \brief Obtain the configuration space or a named module + + The named module does not have to actually exist. Configuration + spaces for modules are based on the basename of the module + (including the extension). + + \param[in] module Name of the module. + + \param[in] flags The flags used to call khc_open_space(). You can + use this to specify a particular configuration store if + needed. + + \param[out] result Receives the handle to a configuration space if + successful. Call khc_close_space() to close the handle. + + \see khc_open_space() + \see khc_close_space() +*/ +KHMEXP khm_int32 KHMAPI +kmm_get_module_config(wchar_t * module, khm_int32 flags, khm_handle * result); + +/*! \brief Retrieve a handle to the configuration space for plugins + + The configuration space for plugins is a container which holds the + configuration subspaces for all the plugins. This is the config + space which must be used to load a configuration space for a + plugin. + + \param[in] flags The flags to pass in to the call to + khc_open_space(). The flags can be used to select a specific + configuration store if needed. + + \param[out] result Receives a handle to the configuration + space. Call khc_close_space() to close the handle + + \see khc_open_space() + \see khc_close_space() + */ +KHMEXP khm_int32 KHMAPI +kmm_get_plugins_config(khm_int32 flags, khm_handle * result); + +/*! \brief Retrieve the handle to the configuration space for modules + + The configuration space for modules is a container which hold the + configuration subspaces for all the modules. Each module + registration ends up in this subspace. + + \param[in] flags The flags to pass in to the call to + khc_open_space(). The flags can be used to select a specific + configuration store if needed. + + \param[out] result Receives a handle to the configuration space. + Call khc_close_space() to close the handle. + + \see khc_open_space() + \see khc_close_space() + */ +KHMEXP khm_int32 KHMAPI +kmm_get_modules_config(khm_int32 flags, khm_handle * result); + +/*! \brief Return information about a loaded module + + The retrieves a block of information about a module. Refer to + ::kmm_module_info for information about the format of the returned + data. + + Note that the size of the required buffer is actually greater than + the size of the ::kmm_module_info structure and accomodates the + ::kmm_plugin_info structures and strings required to complete the + information block. + + Call the function with \a buffer set to NULL and \a cb_buffer + pointing at a khm_size variable to obtain the required size of the + buffer. + + \param[in] module_name Name of a module + \param[in] flags Flags indicating which types of information to + return + \param[out] buffer Points to a buffer that recieves information. + Set this to NULL if only the size of the buffer is required. + \param[in,out] On entry, contains the size of the buffer pointed + to by \a buffer if \a buffer is not NULL. On exit, contains + the required size of the buffer or the number of actual bytes + copied. + + \retval KHM_ERROR_SUCCESS The requested information was copied + \retval KHM_ERROR_INVALID_PARAM One of the parameters was invalid + \retval KHM_ERROR_TOO_LONG The buffer was not large enough or was + NULL. The number of bytes requied is in \a cb_buffer. + \retval KHM_ERROR_NOT_FOUND The specified module is not a + registered module. + */ +KHMEXP khm_int32 KHMAPI +kmm_get_module_info(wchar_t * module_name, khm_int32 flags, + kmm_module_info * buffer, khm_size * cb_buffer); + +/*! \brief Get information about a module + + Similar to kmm_get_module_info(), but uses a module handle instead + of a name, and uses internal buffers for providing string fields. + + The information that is returned should be freed using a call to + kmm_release_module_info_i(). + + \see kmm_release_module_info_i() + */ +KHMEXP khm_int32 KHMAPI +kmm_get_module_info_i(kmm_module module, kmm_module_info * info); + +/*! \brief Release module information + + Releases the information returned by a previous call to + kmm_get_module_info_i(). The contents of the ::kmm_module_info + structure should not have been modified in any way between calling + kmm_get_module_info_i() and kmm_release_module_info_i(). + */ +KHMEXP khm_int32 KHMAPI +kmm_release_module_info_i(kmm_module_info * info); + +/*! \brief Obtain information about a plugin + + Retrieve a block of information about a plugin. See + ::kmm_plugin_info for details about what information can be + returned. Note that some fields may not be available if the + module is not loaded. + + Note that the size of the required buffer is greater than the size + of the ::kmm_plugin_info structure and accounts for strings as + well. Call kmm_get_plugin_info() with \a buffer set to NULL and + \a cb_buffer set to point to a variable of type \a khm_size to + obtain the required size of the structure. + + \param[in] plugin_name Name of the plugin + \param[out] buffer The buffer to receive the plugin information. + Set to \a NULL if only the size of the buffer is required. + \param[in,out] cb_buffer On entry, points to variable that + specifies the size of the buffer pointed to by \a buffer is \a + buffer is not \a NULL. On exit, holds the number of bytes + copied or the required size of the buffer. + + \retval KHM_ERROR_SUCCESS The requested information was + successfully copied to the \a buffer + \retval KHM_ERROR_TOO_LONG The buffer was either \a NULL or + insufficient to hold the requested information. The required + size of the buffer was stored in \a cb_buffer + \retval KHM_ERROR_INVALID_PARAM One or more parameters were + invlaid. + \retval KHM_ERROR_NOT_FOUND The specified plugin was not found + among the registered plugins. +*/ +KHMEXP khm_int32 KHMAPI +kmm_get_plugin_info(wchar_t * plugin_name, + kmm_plugin_info * buffer, + khm_size * cb_buffer); + +/*! \brief Obtain information about a plugin using a plugin handle + + Similar to kmm_get_plugin_info() but uses a plugin handle instead + of a plugin name. If the call is successful, the \a info + structure will be filled with information about the plugin. The + returned info should not be modified in any way and may contain + pointers to internal buffers. + + The returned information must be released with a call to + kmm_release_plugin_info_i(). + */ +KHMEXP khm_int32 KHMAPI +kmm_get_plugin_info_i(kmm_plugin p, kmm_plugin_info * info); + +/*! \brief Release plugin information returned by kmm_get_plugin_info_i + + The information returned by kmm_get_plugin_info_i() should not be + modified in any way before calling kmm_release_plugin_info_i(). + Once the call completes, the contents of \a info will be + initialized to zero. + */ +KHMEXP khm_int32 KHMAPI +kmm_release_plugin_info_i(kmm_plugin_info * info); + +/*! \brief Enumerates plugins + + Enumerates through known plugins. This list may not include + plugins which were not loaded by NetIDMgr in this session. + + If the call is successful, a handle to the next plugin in the list + will be placed in \a p_next. The returned handle must be freed + with a call to kmm_release_plugin(). + + If the \a p parameter is set to NULL, then the first plugin handle + will be placed in \a p_next. The handles will not be returned in + any specific order. In addition, the enumeration may not include + all known plugins if the list of plugins changes during + enumeration. + */ +KHMEXP khm_int32 KHMAPI +kmm_get_next_plugin(kmm_plugin p, kmm_plugin * p_next); + +/*! \brief Enables or disables a plugin + + This function currently does not take effect immediately. However + it marks the plugin as enabled or disabled so that the next time + NetIDMgr starts, the module manager will act accordingly. + + \param[in] p Handle to the plugin + + \param[in] enable If non-zero, the plugin will be marked as + enabled. Otherwise the plugin will be marked as disabled. + */ +KHMEXP khm_int32 KHMAPI +kmm_enable_plugin(kmm_plugin p, khm_boolean enable); + +/*! \brief Register a plugin + + The \a plugin member defines the plugin to be registered. The \a + msg_proc and \a icon members of the structure are ignored. + + At the time kmm_register_plugin() is called, the module specified + by \a module member of the \a plugin parameter must have been already + registered. Otherwise the function call fails. + + If the plugin has already been registered, then all the fields in + the plugin registration will be updated to be in sync with the + information provided in the \a plugin parameter. The failure + counts and associated statistics will not be reset when the + configuration information is updated. + + If the plugin has not been registered, the a new registration + entry is created in the configuration space indicated by the \a + config_flags parameter. In addition, the plugin will be added to + the list of plugins associated with the owning module. + + Note that the module that owns the plugin must be registered in + the same configuration store as the plugin. + + \param[in] plugin Registration info for the plugin. The \a + msg_proc and \a icon members are ignored. All other fields + are required. The \a description member should be localized + to the system locale when registering a plugin in the machine + configuration store and should be localized to the user locale + when registering a plugin in the user configuration store. + \param[in] config_flags Flags for the configuration provider. + These flags are used verbatim to call khc_open_space(), hence + they may be used to pick whether or not the registration is + per machine or per user. + + \see kmm_register_module() + */ +KHMEXP khm_int32 KHMAPI +kmm_register_plugin(kmm_plugin_reg * plugin, khm_int32 config_flags); + +/*! \brief Register a module + + The \a module parameter specifies the parameters for the module + registration. + + The \a plugin_info member should point to an array of + ::kmm_plugin_info structures unless the \a n_plugins member is + zero, in which case \a plugin_info can be \a NULL. Plugins can be + registered separately using kmm_register_plugin(). + + \param[in] module Information about the module. The name and path + fields are required. The \a plugin_info field can only be \a + NULL if \a n_plugins is zero. + + \param[in] config_flags Flags used to call khc_open_space(). This + can be used to choose the configuration store in which the + module registration will be performed. + */ +KHMEXP khm_int32 KHMAPI +kmm_register_module(kmm_module_reg * module, khm_int32 config_flags); + +/*! \brief Unregister a plugin + + Registration information associated with the plugin will be + removed. In addtion, the plugin will be removed from the list of + plugins provided by the owner module. + + \param[in] plugin Names the plugin to be removed + \param[in] config_flags Flags used to call khc_open_space(). Can + be used to choose the configuraiton store that is affected by + the call. + + \note kmm_unregister_plugin() has no effect on whether the plugin + is loaded or not. The caller must make sure that the plugin + is unloaded and the associated module is either also unloaded + or in a state where the plugin can be unregistered. + */ +KHMEXP khm_int32 KHMAPI +kmm_unregister_plugin(wchar_t * plugin, khm_int32 config_flags); + +/*! \brief Unregister a module + + Registration information associated with the module as well as all + the plugins provided by the module will be removed from the + configuration store. + + \param[in] module Names the module to be removed + + \param[in] config_flags Flags used to call khc_open_space(). Can + be used to choose the configuration store affected by the + call. + + \note kmm_unregister_module() has no effect on the loaded state of + the module. The caller should make sure that the module is + unloaded and in a state where it can be unregistered. + */ +KHMEXP khm_int32 KHMAPI +kmm_unregister_module(wchar_t * module, khm_int32 config_flags); + +/*@}*/ /* kmm_reg */ + +/*! \defgroup kmm_loc Internationalization support + + See \ref pi_localization for more information about + internationalization. + +@{*/ + +/*! \brief Locale descriptor record + + See kmm_set_locale() +*/ +typedef struct tag_kmm_module_locale { + khm_ui_4 language; /*!< A language ID. On Windows, you can use the + MAKELANGID macro to generate this value. */ + wchar_t * filename; /*!< The filename corresponding to this language. + Use NULL to indicate that resources for this + language are to be found in the main module. */ + khm_int32 flags; /*!< Flags. Combination of KMM_MLOC_FLAG_* */ +} kmm_module_locale; + +#define LOCALE_DEF(language_id, filename, flags) {language_id, filename, flags} + +/*! \brief Default (fallback) locale +*/ +#define KMM_MLOC_FLAG_DEFAULT 1 + + +/*! \brief Sets the locale for a loaded module. + + The given locale records are searched in the given order until a + locale that matches the current user locale is found. If no + locales match, then the first locale with the + ::KMM_MLOC_FLAG_DEFAULT flag set will be loaded. If no locales + have that flag set, then the first locale is loaded. + + You can obtain a handle to the loaded library using + kmm_get_resource_hmodule(). This function does not return until a + matched library is loaded. + + Note that the ::kmm_module_locale structure only specifies a + module name for the resource module. This resource module must + exist in the same directory as the \a module. + + \param[in] module The module handle + \param[in] locales An array of ::kmm_module_locale objects + \param[in] n_locales The number of objects in the array pointed to by \a locales + + \retval KHM_ERROR_SUCCESS Succeeded. + \retval KHM_ERROR_NOT_FOUND A matching locale resource library was not found. + \retval KHM_ERROR_INVALID_OPERATION The function was called on a module which is currently not being initalized. + + \see \ref pi_localization + \see kmm_get_resource_hmodule() + + \note This can only be called when handing init_module() +*/ +KHMEXP khm_int32 KHMAPI +kmm_set_locale_info(kmm_module module, + kmm_module_locale * locales, + khm_int32 n_locales); + +#ifdef _WIN32 + +/*! \brief Return the Windows module handle of the resource library of a NetIDMgr module. + + NetIDMgr allows the specification of an alternate resource library + that will be used to load localized resources from. This function + returns a handle to this library. + + While you can use the convenience macros to access resources in a + localization library using the module handle, it is recommended, + for performance reasons, to use this function to obtain the handle + to the resource library and then use that handle in calls to + LoadString, LoadImage etc. directly. +*/ +KHMEXP HMODULE KHMAPI +kmm_get_resource_hmodule(kmm_module m); + +/*! \name Convenience Macros +@{*/ +/*! \brief Convenience macro for using calling LoadAccelerators using a module handle + + \param[in] module A handle to a loaded module. The corresponding resource + module will be located through a call to kmm_get_resource_hmodule() +*/ +#define kmm_LoadAccelerators(module, lpTableName) \ + (LoadAccelerators(kmm_get_resource_hmodule(module), lpTableName)) + +/*! \brief Convenience macro for using calling LoadBitmap using a module handle + + \param[in] module A handle to a loaded module. The corresponding resource + module will be located through a call to kmm_get_resource_hmodule() +*/ +#define kmm_LoadBitmap(module, lpBitmapName) \ + (LoadBitmap(kmm_get_resource_hmodule(module), lpBitmapName)) + +/*! \brief Convenience macro for using calling LoadImage using a module handle + + \param[in] module A handle to a loaded module. The corresponding resource + module will be located through a call to kmm_get_resource_hmodule() +*/ +#define kmm_LoadImage(module, lpszName, uType, cxDesired, cyDesired, fuLoad) \ + (LoadImage(kmm_get_resource_hmodule(module), lpszName, uType, cxDesired, cyDesired, fuLoad)) + +/*! \brief Convenience macro for using calling LoadCursor using a module handle + + \param[in] module A handle to a loaded module. The corresponding resource + module will be located through a call to kmm_get_resource_hmodule() +*/ +#define kmm_LoadCursor(module, lpCursorName) \ + (LoadCursor(kmm_get_resource_hmodule(module), lpCursorName)) + +/*! \brief Convenience macro for using calling LoadIcon using a module handle + + \param[in] module A handle to a loaded module. The corresponding resource + module will be located through a call to kmm_get_resource_hmodule() +*/ +#define kmm_LoadIcon(module, lpIconName) \ + (LoadIcon(kmm_get_resource_hmodule(module), lpIconName)) + +/*! \brief Convenience macro for using calling LoadMenu using a module handle + + \param[in] module A handle to a loaded module. The corresponding resource + module will be located through a call to kmm_get_resource_hmodule() +*/ +#define kmm_LoadMenu(module, lpMenuName) \ + (LoadMenu(kmm_get_resource_hmodule(module), lpMenuName)) + +/*! \brief Convenience macro for using calling LoadString using a module handle + + \param[in] module A handle to a loaded module. The corresponding resource + module will be located through a call to kmm_get_resource_hmodule() +*/ +#define kmm_LoadString(module, uID, lpBuffer, nBufferMax) \ + (LoadString(kmm_get_resource_hmodule(module), uID, lpBuffer, nBufferMax)) +/*@}*/ /* Convenience Macros */ +#endif +/*@}*/ /* group kmm_loc */ +/*@}*/ /* group kmm */ +#endif --- krb5-1.4.4.orig/src/windows/identity/kmm/kmm_registrar.c +++ krb5-1.4.4/src/windows/identity/kmm/kmm_registrar.c @@ -1,988 +1,988 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#ifdef DEBUG -#include -#endif - -static LONG pending_modules = 0; -static LONG pending_plugins = 0; -static LONG startup_signal = 0; -static BOOL load_done = FALSE; - -void -kmmint_check_completion(void) { - if (pending_modules == 0 && - pending_plugins == 0 && - InterlockedIncrement(&startup_signal) == 1) { - - load_done = TRUE; - - /* TODO: check for orphaned plugins */ - - kmq_post_message(KMSG_KMM, KMSG_KMM_I_DONE, 0, 0); - } -} - -void -kmmint_add_to_module_queue(void) { - InterlockedIncrement(&pending_modules); -} - -void -kmmint_remove_from_module_queue(void) { - - InterlockedDecrement(&pending_modules); - - kmmint_check_completion(); -} - -void -kmmint_add_to_plugin_queue(kmm_plugin_i * plugin) { - EnterCriticalSection(&cs_kmm); - if (!(plugin->flags & KMM_PLUGIN_FLAG_IN_QUEUE)) { - InterlockedIncrement(&pending_plugins); - plugin->flags |= KMM_PLUGIN_FLAG_IN_QUEUE; - } - LeaveCriticalSection(&cs_kmm); -} - -void -kmmint_remove_from_plugin_queue(kmm_plugin_i * plugin) { - EnterCriticalSection(&cs_kmm); - - if (plugin->flags & KMM_PLUGIN_FLAG_IN_QUEUE) { - InterlockedDecrement(&pending_plugins); - plugin->flags &= ~KMM_PLUGIN_FLAG_IN_QUEUE; - } - - LeaveCriticalSection(&cs_kmm); - kmmint_check_completion(); -} - -KHMEXP khm_boolean KHMAPI -kmm_load_pending(void) { - return !load_done; -} - -/*! \internal - \brief Message handler for the registrar thread. */ -khm_boolean KHMAPI kmmint_reg_cb(khm_int32 msg_type, - khm_int32 msg_sub_type, - khm_ui_4 uparam, - void *vparam) -{ - /* we should only be getting anyway */ - if(msg_type != KMSG_KMM || msg_sub_type != KMSG_KMM_I_REG) - return FALSE; - - switch(uparam) { - case KMM_REG_INIT_MODULE: - kmmint_init_module((kmm_module_i *) vparam); - kmm_release_module(kmm_handle_from_module((kmm_module_i *) vparam)); - break; - - case KMM_REG_EXIT_MODULE: - kmmint_exit_module((kmm_module_i *) vparam); - kmm_release_module(kmm_handle_from_module((kmm_module_i *) vparam)); - break; - - case KMM_REG_INIT_PLUGIN: - kmmint_init_plugin((kmm_plugin_i *) vparam); - kmm_release_plugin(kmm_handle_from_plugin((kmm_plugin_i *) vparam)); - break; - - case KMM_REG_EXIT_PLUGIN: - kmmint_exit_plugin((kmm_plugin_i *) vparam); - kmm_release_plugin(kmm_handle_from_plugin((kmm_plugin_i *) vparam)); - break; - } - return TRUE; -} - -/*! \internal - \brief The registrar thread. - - The only thing this function does is to dispatch messages to the - callback routine ( kmmint_reg_cb() ) */ -DWORD WINAPI kmmint_registrar(LPVOID lpParameter) -{ - tid_registrar = GetCurrentThreadId(); - - kmq_subscribe(KMSG_KMM, kmmint_reg_cb); - kmq_subscribe(KMSG_SYSTEM, kmmint_reg_cb); - - SetEvent(evt_startup); - - while(KHM_SUCCEEDED(kmq_dispatch(INFINITE))); - - ExitThread(0); - /* not reached */ - return 0; -} - -/*! \internal - \brief Manages a plugin message thread. - - Each plugin gets its own plugin thread which is used to dispatch - messages to the plugin. This acts as the thread function for the - plugin thread.*/ -DWORD WINAPI kmmint_plugin_broker(LPVOID lpParameter) -{ - DWORD rv = 0; - kmm_plugin_i * p = (kmm_plugin_i *) lpParameter; - - _begin_task(0); - _report_mr1(KHERR_NONE, MSG_PB_START, _cstr(p->p.name)); - _describe(); - - TlsSetValue(tls_kmm, (LPVOID) p); - - kmm_hold_plugin(kmm_handle_from_plugin(p)); - - p->tid_thread = GetCurrentThreadId(); - - if (IsBadCodePtr(p->p.msg_proc)) { - _report_mr0(KHERR_WARNING, MSG_PB_INVALID_CODE_PTR); - rv = KHM_ERROR_INVALID_PARAM; - } else { - rv = (*p->p.msg_proc)(KMSG_SYSTEM, KMSG_SYSTEM_INIT, - 0, (void *) &(p->p)); - _report_mr1(KHERR_INFO, MSG_PB_INIT_RV, _int32(rv)); - } - - /* if it fails to initialize, we exit the plugin */ - if(KHM_FAILED(rv)) { - - kherr_report(KHERR_ERROR, - (wchar_t *) MSG_PB_INIT_FAIL_S, - (wchar_t *) KHERR_FACILITY, - NULL, - (wchar_t *) MSG_PB_INIT_FAIL, - (wchar_t *) MSG_PB_INIT_FAIL_G, - KHERR_FACILITY_ID, - KHERR_SUGGEST_NONE, - _cstr(p->p.name), - _cstr(p->p.description), - _cstr(p->module->path), - _cstr(p->module->support), - KHERR_RF_MSG_SHORT_DESC | - KHERR_RF_MSG_LONG_DESC | - KHERR_RF_MSG_SUGGEST -#ifdef _WIN32 - ,KHERR_HMODULE -#endif - ); - _resolve(); - - /* exit the plugin first. Otherwise it may not uninitialize correctly */ - (*p->p.msg_proc)(KMSG_SYSTEM, KMSG_SYSTEM_EXIT, 0, (void *) &(p->p)); - - kmmint_remove_from_plugin_queue(p); - rv = 1; - _end_task(); - - p->state = KMM_PLUGIN_STATE_FAIL_INIT; - goto _exit; - } - - /* subscribe to default message classes by plugin type */ - if(p->p.type == KHM_PITYPE_CRED) { - kmq_subscribe(KMSG_SYSTEM, p->p.msg_proc); - kmq_subscribe(KMSG_KCDB, p->p.msg_proc); - kmq_subscribe(KMSG_CRED, p->p.msg_proc); - } else if(p->p.type == KHM_PITYPE_IDENT) { - khm_handle h = NULL; - - kmq_subscribe(KMSG_SYSTEM, p->p.msg_proc); - kmq_subscribe(KMSG_KCDB, p->p.msg_proc); - - kmq_create_subscription(p->p.msg_proc, &h); - kcdb_identity_set_provider(h); - /* kcdb deletes the subscription when it's done with it */ - } else if(p->p.type == KHM_PITYPE_CONFIG) { - /*TODO: subscribe to configuration provider messages here */ - } - - p->state = KMM_PLUGIN_STATE_RUNNING; - - _report_mr0(KHERR_INFO, MSG_PB_INIT_DONE); - - _end_task(); - - /* if there were any plugins that were waiting for this one to - start, we should start them too */ - EnterCriticalSection(&cs_kmm); - do { - kmm_plugin_i * pd; - int i; - - for(i=0; i < p->n_dependants; i++) { - pd = p->dependants[i]; - - pd->n_unresolved--; - - if(pd->n_unresolved == 0) { - kmmint_add_to_plugin_queue(pd); - kmm_hold_plugin(kmm_handle_from_plugin(pd)); - kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, KMM_REG_INIT_PLUGIN, (void *) pd); - } - } - } while(FALSE); - LeaveCriticalSection(&cs_kmm); - - kmmint_remove_from_plugin_queue(p); - - /* main message loop */ - while(KHM_SUCCEEDED(kmq_dispatch(INFINITE))); - - /* unsubscribe from default message classes by plugin type */ - if(p->p.type == KHM_PITYPE_CRED) { - kmq_unsubscribe(KMSG_SYSTEM, p->p.msg_proc); - kmq_unsubscribe(KMSG_KCDB, p->p.msg_proc); - kmq_unsubscribe(KMSG_CRED, p->p.msg_proc); - } else if (p->p.type == KHM_PITYPE_IDENT) { - kmq_unsubscribe(KMSG_KCDB, p->p.msg_proc); - kmq_unsubscribe(KMSG_SYSTEM, p->p.msg_proc); - kcdb_identity_set_provider(NULL); - } else if(p->p.type == KHM_PITYPE_CONFIG) { - /*TODO: unsubscribe from configuration provider messages here */ - } - - p->p.msg_proc(KMSG_SYSTEM, KMSG_SYSTEM_EXIT, 0, (void *) &(p->p)); - - _exit: - if (p->state >= 0) - p->state = KMM_PLUGIN_STATE_EXITED; - - /* the following call will automatically release the plugin */ - kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, - KMM_REG_EXIT_PLUGIN, (void *) p); - - TlsSetValue(tls_kmm, (LPVOID) 0); - - ExitThread(rv); - - /* not reached */ - return rv; -} - -/*! \internal - \brief Initialize a plugin - - \note If kmmint_init_plugin() is called on a plugin, then kmmint_exit_plugin() - \b must be called for the plugin. - - \note Should only be called from the context of the registrar thread */ -void kmmint_init_plugin(kmm_plugin_i * p) { - DWORD dummy; - khm_handle csp_plugin = NULL; - khm_handle csp_plugins = NULL; - khm_int32 t; - - /* the following will be undone in kmmint_exit_plugin() */ - kmm_hold_plugin(kmm_handle_from_plugin(p)); - - EnterCriticalSection(&cs_kmm); - if(p->state != KMM_PLUGIN_STATE_REG && - p->state != KMM_PLUGIN_STATE_HOLD) - { - LeaveCriticalSection(&cs_kmm); - goto _exit; - } - - _begin_task(0); - _report_mr1(KHERR_NONE, MSG_IP_TASK_DESC, _cstr(p->p.name)); - _describe(); - - if(p->state == KMM_PLUGIN_STATE_HOLD) { - /* if this plugin was held, then we already had a hold - from the initial attempt to start the plugin. Undo - the hold we did a few lines earlier. */ - kmm_release_plugin(kmm_handle_from_plugin(p)); - /* same for the plugin count for the module. */ - p->module->plugin_count--; - } - - p->state = KMM_PLUGIN_STATE_PREINIT; - - kmmint_delist_plugin(p); - kmmint_list_plugin(p); - - LeaveCriticalSection(&cs_kmm); - - if(KHM_FAILED(kmm_get_plugins_config(0, &csp_plugins))) { - _report_mr0(KHERR_ERROR, MSG_IP_GET_CONFIG); - - p->state = KMM_PLUGIN_STATE_FAIL_UNKNOWN; - goto _exit; - } - - if(KHM_FAILED(kmm_get_plugin_config(p->p.name, 0, &csp_plugin))) { - if(KHM_FAILED(kmm_register_plugin(&(p->p), 0))) { - _report_mr0(KHERR_ERROR, MSG_IP_NOT_REGISTERED); - - p->state = KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED; - goto _exit; - } - - if(KHM_FAILED(kmm_get_plugin_config(p->p.name, 0, &csp_plugin))) { - _report_mr0(KHERR_ERROR, MSG_IP_NOT_REGISTERED); - - p->state = KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED; - goto _exit; - } - } - - if (KHM_SUCCEEDED(khc_read_int32(csp_plugin, L"Disabled", &t)) && t) { - p->flags |= KMM_PLUGIN_FLAG_DISABLED; - p->state = KMM_PLUGIN_STATE_FAIL_DISABLED; - goto _exit; - } - -#if 0 - /*TODO: check the failure count and act accordingly */ - if(KHM_SUCCEEDED(khc_read_int32(csp_plugin, L"FailureCount", &t)) && (t > 0)) { - } -#endif - - EnterCriticalSection(&cs_kmm); - - p->n_depends = 0; - p->n_unresolved = 0; - - do { - wchar_t * deps = NULL; - wchar_t * d; - khm_size sz = 0; - - if(khc_read_multi_string(csp_plugin, L"Dependencies", - NULL, &sz) != KHM_ERROR_TOO_LONG) - break; - - deps = PMALLOC(sz); - if(KHM_FAILED(khc_read_multi_string(csp_plugin, L"Dependencies", - deps, &sz))) { - if(deps) - PFREE(deps); - break; - } - - for(d = deps; d && *d; d = multi_string_next(d)) { - kmm_plugin_i * pd; - int i; - - pd = kmmint_get_plugin_i(d); - - if(pd->state == KMM_PLUGIN_STATE_NONE) { - /* the dependant was not previously known */ - pd->state = KMM_PLUGIN_STATE_PLACEHOLDER; - } - - for(i=0; i < pd->n_dependants; i++) { - if(pd->dependants[i] == p) - break; - } - - if(i >= pd->n_dependants) { - if( pd->n_dependants >= KMM_MAX_DEPENDANTS ) { - /*TODO: handle this gracefully */ - RaiseException(1, EXCEPTION_NONCONTINUABLE, 0, NULL); - } - - /* released in kmmint_free_plugin() */ - kmm_hold_plugin(kmm_handle_from_plugin(p)); - pd->dependants[pd->n_dependants] = p; - pd->n_dependants++; - } - - p->n_depends++; - - if(pd->state != KMM_PLUGIN_STATE_RUNNING) { - p->n_unresolved++; - } - } - - if(p->n_unresolved > 0) { - p->state = KMM_PLUGIN_STATE_HOLD; - } - - PFREE(deps); - - } while(FALSE); - - p->module->plugin_count++; - - LeaveCriticalSection(&cs_kmm); - - if(p->state == KMM_PLUGIN_STATE_HOLD) { - _report_mr1(KHERR_INFO, MSG_IP_HOLD, _dupstr(p->p.name)); - - goto _exit_post; - } - - kmmint_add_to_plugin_queue(p); - - p->ht_thread = CreateThread(NULL, - 0, - kmmint_plugin_broker, - (LPVOID) p, - CREATE_SUSPENDED, - &dummy); - - p->state = KMM_PLUGIN_STATE_INIT; - - ResumeThread(p->ht_thread); - -_exit_post: - if(csp_plugin != NULL) - khc_close_space(csp_plugin); - - if(csp_plugins != NULL) - khc_close_space(csp_plugins); - - _report_mr2(KHERR_INFO, MSG_IP_STATE, - _dupstr(p->p.name), _int32(p->state)); - - _end_task(); - - return; - - /* jump here if an error condition happens before the plugin - broker thread starts and the plugin should be unloaded */ - -_exit: - if(csp_plugin != NULL) - khc_close_space(csp_plugin); - if(csp_plugins != NULL) - khc_close_space(csp_plugins); - - _report_mr2(KHERR_WARNING, MSG_IP_EXITING, - _dupstr(p->p.name), _int32(p->state)); - _end_task(); - - kmm_hold_plugin(kmm_handle_from_plugin(p)); - - kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, KMM_REG_EXIT_PLUGIN, (void *) p); -} - -/*! \internal - \brief Uninitialize a plugin - - In addition to terminating the thread, and removing p from the - linked list and hashtable, it also frees up p. - - \note Should only be called from the context of the registrar thread. */ -void kmmint_exit_plugin(kmm_plugin_i * p) { - int np; - khm_boolean release_plugin = TRUE; - - if(p->state == KMM_PLUGIN_STATE_RUNNING || - p->state == KMM_PLUGIN_STATE_INIT) { - - kmq_post_thread_quit_message(p->tid_thread, 0, NULL); - /* when we post the quit message to the plugin thread, the plugin - broker terminates the plugin and posts a EXIT_PLUGIN message, - which calls this function again. We just exit here because - the EXIT_PLUGIN message will end up calling us again momentarily */ - return; - - } - - if(p->ht_thread) { - /* wait for the thread to terminate */ - WaitForSingleObject(p->ht_thread, INFINITE); - p->ht_thread = NULL; - } - - EnterCriticalSection(&cs_kmm); - - /* undo reference count done in kmmint_init_plugin() */ - if(p->state == KMM_PLUGIN_STATE_EXITED || - p->state == KMM_PLUGIN_STATE_HOLD) { - - np = --(p->module->plugin_count); - - } else { - /* the plugin was never active. We can't base a module unload - decision on np */ - np = TRUE; - } - - /* The plugin is in an error state. We need to keep the plugin - record in tact so that the failure information is kept - around. */ - if (p->state < KMM_PLUGIN_STATE_NONE) { - release_plugin = FALSE; - } - - LeaveCriticalSection(&cs_kmm); - - if(!np) { - /* if this is the last plugin to exit, then notify the - registrar that the module should be removed as well */ - kmm_hold_module(kmm_handle_from_module(p->module)); - kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, KMM_REG_EXIT_MODULE, (void *) p->module); - } - - /* release the hold obtained in kmmint_init_plugin() */ - if (release_plugin) - kmm_release_plugin(kmm_handle_from_plugin(p)); -} - -/*! \internal - \brief Initialize a module - - \a m is not in the linked list yet. - - \note Should only be called from the context of the registrar thread. */ -void kmmint_init_module(kmm_module_i * m) { - HMODULE hm; - init_module_t p_init_module; - kmm_plugin_i * pi; - khm_int32 rv; - khm_handle csp_mod = NULL; - khm_handle csp_mods = NULL; - khm_size sz; - khm_int32 i; - - /* error condition handling */ - BOOL exit_module = FALSE; - BOOL release_module = TRUE; - BOOL record_failure = FALSE; - - /* failure handling */ - khm_int32 max_fail_count = 0; - khm_int64 fail_reset_time = 0; - - _begin_task(0); - _report_mr1(KHERR_NONE, MSG_INIT_MODULE, _cstr(m->name)); - _describe(); - - kmm_hold_module(kmm_handle_from_module(m)); - - if(KHM_FAILED(kmm_get_modules_config(0, &csp_mods))) { - _report_mr0(KHERR_ERROR, MSG_IM_GET_CONFIG); - _location(L"kmm_get_modules_config()"); - - m->state = KMM_MODULE_STATE_FAIL_UNKNOWN; - goto _exit; - } - - khc_read_int32(csp_mods, L"ModuleMaxFailureCount", &max_fail_count); - khc_read_int64(csp_mods, L"ModuleFailureCountResetTime", &fail_reset_time); - - /* If the module is not in the pre-init state, we can't - initialize it. */ - if(m->state != KMM_MODULE_STATE_PREINIT) { - _report_mr1(KHERR_INFO, MSG_IM_NOT_PREINIT, _int32(m->state)); - goto _exit; - } - - if(KHM_FAILED(kmm_get_module_config(m->name, 0, &csp_mod))) { - _report_mr0(KHERR_ERROR, MSG_IM_NOT_REGISTERED); - - m->state = KMM_MODULE_STATE_FAIL_NOT_REGISTERED; - goto _exit; - } - - if(KHM_SUCCEEDED(khc_read_int32(csp_mod, L"Disabled", &i)) && i) { - _report_mr0(KHERR_INFO, MSG_IM_DISABLED); - - m->state = KMM_MODULE_STATE_FAIL_DISABLED; - goto _exit; - } - - if(KHM_SUCCEEDED(khc_read_int32(csp_mod, L"NoUnload", &i)) && i) { - m->flags |= KMM_MODULE_FLAG_NOUNLOAD; - } - - if(KHM_SUCCEEDED(khc_read_int32(csp_mod, L"FailureCount", &i))) { - khm_int64 tm; - khm_int64 ct; - FILETIME fct; - khm_int32 last_reason = 0; - - /* reset the failure count if the failure count reset time - period has elapsed */ - tm = 0; - khc_read_int64(csp_mod, L"FailureTime", &tm); - GetSystemTimeAsFileTime(&fct); - - ct = (FtToInt(&fct) - tm) / 10000000i64; - - if(tm > 0 && - ct > fail_reset_time) { - i = 0; - khc_write_int32(csp_mod, L"FailureCount", 0); - khc_write_int64(csp_mod, L"FailureTime", 0); - } - - khc_read_int32(csp_mod, L"FailureReason", &last_reason); - - /* did we exceed the max failure count? However, we ignore - the max failure count if the reason why it didn't load the - last time was because the module wasn't found. */ - if(i > max_fail_count && - last_reason != KMM_MODULE_STATE_FAIL_NOT_FOUND) { - /* failed too many times */ - _report_mr0(KHERR_INFO, MSG_IM_MAX_FAIL); - - m->state = KMM_MODULE_STATE_FAIL_MAX_FAILURE; - goto _exit; - } - } - - if(khc_read_string(csp_mod, L"ImagePath", NULL, &sz) == - KHM_ERROR_TOO_LONG) { - if(m->path) - PFREE(m->path); - m->path = PMALLOC(sz); - khc_read_string(csp_mod, L"ImagePath", m->path, &sz); - } else { - _report_mr0(KHERR_ERROR, MSG_IM_NOT_REGISTERED); - - m->state = KMM_MODULE_STATE_FAIL_NOT_REGISTERED; - goto _exit; - } - - rv = kmmint_read_module_info(m); - - if (KHM_FAILED(rv)) { - if (rv == KHM_ERROR_INCOMPATIBLE) { - _report_mr0(KHERR_ERROR, MSG_IM_INCOMPATIBLE); - - m->state = KMM_MODULE_STATE_FAIL_INCOMPAT; - } else if (rv == KHM_ERROR_NOT_FOUND) { - _report_mr1(KHERR_ERROR, MSG_IM_NOT_FOUND, _dupstr(m->path)); - - m->state = KMM_MODULE_STATE_FAIL_NOT_FOUND; - } else { - _report_mr0(KHERR_ERROR, MSG_IM_INVALID_MODULE); - - m->state = KMM_MODULE_STATE_FAIL_INV_MODULE; - } - goto _exit; - } - - /* check again */ - if(m->state != KMM_MODULE_STATE_PREINIT) { - _report_mr0(KHERR_ERROR, MSG_IM_NOT_PREINIT); - - goto _exit; - } - - /* from this point on, we must record any failure codes */ - record_failure = TRUE; - - hm = LoadLibrary(m->path); - if(!hm) { - m->h_module = NULL; - m->state = KMM_MODULE_STATE_FAIL_NOT_FOUND; - - _report_mr1(KHERR_ERROR, MSG_IM_NOT_FOUND, _dupstr(m->path)); - - goto _exit; - } - - /* from this point on, we need to discard the module through - exit_module */ - ResetEvent(evt_exit); - - kmm_active_modules++; - - release_module = FALSE; - exit_module = TRUE; - - m->flags |= KMM_MODULE_FLAG_LOADED; - m->h_module = hm; - - /* TODO: check signatures */ - - p_init_module = (init_module_t) GetProcAddress(hm, EXP_INIT_MODULE); - - if(!p_init_module) { - _report_mr1(KHERR_ERROR, MSG_IM_NO_ENTRY, _cstr(EXP_INIT_MODULE)); - - m->state = KMM_MODULE_STATE_FAIL_INVALID; - goto _exit; - } - - m->state = KMM_MODULE_STATE_INIT; - - /* call init_module() */ - rv = (*p_init_module)(kmm_handle_from_module(m)); - - m->flags |= KMM_MODULE_FLAG_INITP; - - if(KHM_FAILED(rv)) { - _report_mr1(KHERR_ERROR, MSG_IM_INIT_FAIL, _int32(rv)); - - m->state = KMM_MODULE_STATE_FAIL_LOAD; - goto _exit; - } - - if(!m->plugins) { - _report_mr0(KHERR_ERROR, MSG_IM_NO_PLUGINS); - - m->state = KMM_MODULE_STATE_FAIL_NO_PLUGINS; - record_failure = FALSE; - goto _exit; - } - - m->state = KMM_MODULE_STATE_INITPLUG; - - do { - LPOP(&(m->plugins), &pi); - if(pi) { - pi->flags &= ~KMM_PLUGIN_FLAG_IN_MODLIST; - kmmint_init_plugin(pi); - - /* release the hold obtained in kmm_provide_plugin() */ - kmm_release_plugin(kmm_handle_from_plugin(pi)); - } - } while(pi); - - if(!m->plugin_count) { - /* We don't want to report this case. This usually means that - the plugins that were provided by the module were - disabled. */ -#ifdef REPORT_EMPTY_MODULES - _report_mr0(KHERR_ERROR, MSG_IM_NO_PLUGINS); - - m->state = KMM_MODULE_STATE_FAIL_NO_PLUGINS; -#endif - record_failure = FALSE; - goto _exit; - } - - m->state = KMM_MODULE_STATE_RUNNING; - - exit_module = FALSE; - record_failure = FALSE; - - _exit: - if(csp_mod) { - if(record_failure) { - FILETIME fct; - - i = 0; - khc_read_int32(csp_mod, L"FailureCount", &i); - i++; - khc_write_int32(csp_mod, L"FailureCount", i); - - if(i==1) { /* first fault */ - GetSystemTimeAsFileTime(&fct); - khc_write_int64(csp_mod, L"FailureTime", FtToInt(&fct)); - } - - khc_write_int32(csp_mod, L"FailureReason", m->state); - } - khc_close_space(csp_mod); - } - - if(csp_mods) - khc_close_space(csp_mods); - - _report_mr2(KHERR_INFO, MSG_IM_MOD_STATE, - _dupstr(m->name), _int32(m->state)); - - kmmint_remove_from_module_queue(); - - /* if something went wrong after init_module was called on the - module code, we need to call exit_module */ - if(exit_module) - kmmint_exit_module(m); - - if(release_module) - kmm_release_module(kmm_handle_from_module(m)); - - if (kherr_is_error()) { - kherr_context * c; - kherr_event * err_e = NULL; - kherr_event * warn_e = NULL; - kherr_event * e; - - c = kherr_peek_context(); - err_e = kherr_get_err_event(c); - for(e = kherr_get_first_event(c); - e; - e = kherr_get_next_event(e)) { - if (e != err_e && - e->severity == KHERR_WARNING) { - warn_e = e; - break; - } - } - - kherr_evaluate_event(err_e); - if (warn_e) - kherr_evaluate_event(warn_e); - - kherr_clear_error(); - - e = kherr_report(KHERR_ERROR, - (wchar_t *) MSG_IMERR_TITLE, - KHERR_FACILITY, - NULL, - err_e->long_desc, - ((warn_e)? (wchar_t *)MSG_IMERR_SUGGEST: NULL), - KHERR_FACILITY_ID, - KHERR_SUGGEST_NONE, - _cstr(m->name), - ((warn_e)? _cstr(warn_e->long_desc):_vnull()), - _vnull(),_vnull(), - KHERR_RF_MSG_SHORT_DESC | - ((warn_e)? KHERR_RF_MSG_SUGGEST: 0), - KHERR_HMODULE); - - kherr_evaluate_event(e); - - kherr_release_context(c); - } - - _end_task(); -} - - -/*! \internal - \brief Uninitializes a module - - \note Should only be called from the context of the registrar - thread */ -void kmmint_exit_module(kmm_module_i * m) { - kmm_plugin_i * p; - - /* Exiting a module happens in two stages. - - If the module state is running (there are active plugins) then - those plugins must be exited. This has to be done from the - plugin threads. The signal for the plugins to exit must be - issued from the registrar. Therefore, we post messages to the - registrar for each plugin we want to remove and exit - kmmint_exit_module(). - - When the last plugin is exited, the plugin management code - automatically signalls the registrar to remove the module. - kmmint_exit_module() gets called again. This is the second - stage, where we call exit_module() for the module and start - unloading everything. - */ - - EnterCriticalSection(&cs_kmm); - - /* get rid of any dangling uninitialized plugins */ - LPOP(&(m->plugins), &p); - while(p) { - p->flags &= ~KMM_PLUGIN_FLAG_IN_MODLIST; - kmmint_exit_plugin(p); - - /* release hold from kmm_provide_plugin() */ - kmm_release_plugin(kmm_handle_from_plugin(p)); - - LPOP(&(m->plugins), &p); - } - - if(m->state == KMM_MODULE_STATE_RUNNING) { - int np = 0; - - m->state = KMM_MODULE_STATE_EXITPLUG; - - p = kmm_listed_plugins; - - while(p) { - if(p->module == m) { - kmm_hold_plugin(kmm_handle_from_plugin(p)); - kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, - KMM_REG_EXIT_PLUGIN, (void *) p); - np++; - } - - p = LNEXT(p); - } - - if(np > 0) { - /* we have to go back and wait for the plugins to exit. - when the last plugin exits, it automatically posts - EXIT_MODULE. We can pick up from there when this - happens. */ - LeaveCriticalSection(&cs_kmm); - return; - } - } - - if(m->flags & KMM_MODULE_FLAG_INITP) { - exit_module_t p_exit_module; - - if(m->state > 0) - m->state = KMM_MODULE_STATE_EXIT; - - p_exit_module = - (exit_module_t) GetProcAddress(m->h_module, - EXP_EXIT_MODULE); - if(p_exit_module) { - LeaveCriticalSection(&cs_kmm); - (*p_exit_module)(kmm_handle_from_module(m)); - EnterCriticalSection(&cs_kmm); - } - } - - if(m->state > 0) - m->state = KMM_MODULE_STATE_EXITED; - - LeaveCriticalSection(&cs_kmm); - - if(!(m->flags & KMM_MODULE_FLAG_NOUNLOAD) && - m->h_module) { - FreeLibrary(m->h_module); - } - - if(!(m->flags & KMM_MODULE_FLAG_NOUNLOAD) && - m->h_resource && (m->h_resource != m->h_module)) { - FreeLibrary(m->h_resource); - } - - m->h_module = NULL; - m->h_resource = NULL; - m->flags = 0; - - /* release the hold obtained in kmmint_init_module() */ - kmm_release_module(kmm_handle_from_module(m)); - - /* Last but not least, now see if there are any modules left that - are running. If not, we can safely signal an exit. */ - -#ifdef DEBUG - assert(kmm_active_modules > 0); -#endif - - kmm_active_modules--; - - if (kmm_active_modules == 0) { - SetEvent(evt_exit); - } -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#ifdef DEBUG +#include +#endif + +static LONG pending_modules = 0; +static LONG pending_plugins = 0; +static LONG startup_signal = 0; +static BOOL load_done = FALSE; + +void +kmmint_check_completion(void) { + if (pending_modules == 0 && + pending_plugins == 0 && + InterlockedIncrement(&startup_signal) == 1) { + + load_done = TRUE; + + /* TODO: check for orphaned plugins */ + + kmq_post_message(KMSG_KMM, KMSG_KMM_I_DONE, 0, 0); + } +} + +void +kmmint_add_to_module_queue(void) { + InterlockedIncrement(&pending_modules); +} + +void +kmmint_remove_from_module_queue(void) { + + InterlockedDecrement(&pending_modules); + + kmmint_check_completion(); +} + +void +kmmint_add_to_plugin_queue(kmm_plugin_i * plugin) { + EnterCriticalSection(&cs_kmm); + if (!(plugin->flags & KMM_PLUGIN_FLAG_IN_QUEUE)) { + InterlockedIncrement(&pending_plugins); + plugin->flags |= KMM_PLUGIN_FLAG_IN_QUEUE; + } + LeaveCriticalSection(&cs_kmm); +} + +void +kmmint_remove_from_plugin_queue(kmm_plugin_i * plugin) { + EnterCriticalSection(&cs_kmm); + + if (plugin->flags & KMM_PLUGIN_FLAG_IN_QUEUE) { + InterlockedDecrement(&pending_plugins); + plugin->flags &= ~KMM_PLUGIN_FLAG_IN_QUEUE; + } + + LeaveCriticalSection(&cs_kmm); + kmmint_check_completion(); +} + +KHMEXP khm_boolean KHMAPI +kmm_load_pending(void) { + return !load_done; +} + +/*! \internal + \brief Message handler for the registrar thread. */ +khm_boolean KHMAPI kmmint_reg_cb(khm_int32 msg_type, + khm_int32 msg_sub_type, + khm_ui_4 uparam, + void *vparam) +{ + /* we should only be getting anyway */ + if(msg_type != KMSG_KMM || msg_sub_type != KMSG_KMM_I_REG) + return FALSE; + + switch(uparam) { + case KMM_REG_INIT_MODULE: + kmmint_init_module((kmm_module_i *) vparam); + kmm_release_module(kmm_handle_from_module((kmm_module_i *) vparam)); + break; + + case KMM_REG_EXIT_MODULE: + kmmint_exit_module((kmm_module_i *) vparam); + kmm_release_module(kmm_handle_from_module((kmm_module_i *) vparam)); + break; + + case KMM_REG_INIT_PLUGIN: + kmmint_init_plugin((kmm_plugin_i *) vparam); + kmm_release_plugin(kmm_handle_from_plugin((kmm_plugin_i *) vparam)); + break; + + case KMM_REG_EXIT_PLUGIN: + kmmint_exit_plugin((kmm_plugin_i *) vparam); + kmm_release_plugin(kmm_handle_from_plugin((kmm_plugin_i *) vparam)); + break; + } + return TRUE; +} + +/*! \internal + \brief The registrar thread. + + The only thing this function does is to dispatch messages to the + callback routine ( kmmint_reg_cb() ) */ +DWORD WINAPI kmmint_registrar(LPVOID lpParameter) +{ + tid_registrar = GetCurrentThreadId(); + + kmq_subscribe(KMSG_KMM, kmmint_reg_cb); + kmq_subscribe(KMSG_SYSTEM, kmmint_reg_cb); + + SetEvent(evt_startup); + + while(KHM_SUCCEEDED(kmq_dispatch(INFINITE))); + + ExitThread(0); + /* not reached */ + return 0; +} + +/*! \internal + \brief Manages a plugin message thread. + + Each plugin gets its own plugin thread which is used to dispatch + messages to the plugin. This acts as the thread function for the + plugin thread.*/ +DWORD WINAPI kmmint_plugin_broker(LPVOID lpParameter) +{ + DWORD rv = 0; + kmm_plugin_i * p = (kmm_plugin_i *) lpParameter; + + _begin_task(0); + _report_mr1(KHERR_NONE, MSG_PB_START, _cstr(p->p.name)); + _describe(); + + TlsSetValue(tls_kmm, (LPVOID) p); + + kmm_hold_plugin(kmm_handle_from_plugin(p)); + + p->tid_thread = GetCurrentThreadId(); + + if (IsBadCodePtr(p->p.msg_proc)) { + _report_mr0(KHERR_WARNING, MSG_PB_INVALID_CODE_PTR); + rv = KHM_ERROR_INVALID_PARAM; + } else { + rv = (*p->p.msg_proc)(KMSG_SYSTEM, KMSG_SYSTEM_INIT, + 0, (void *) &(p->p)); + _report_mr1(KHERR_INFO, MSG_PB_INIT_RV, _int32(rv)); + } + + /* if it fails to initialize, we exit the plugin */ + if(KHM_FAILED(rv)) { + + kherr_report(KHERR_ERROR, + (wchar_t *) MSG_PB_INIT_FAIL_S, + (wchar_t *) KHERR_FACILITY, + NULL, + (wchar_t *) MSG_PB_INIT_FAIL, + (wchar_t *) MSG_PB_INIT_FAIL_G, + KHERR_FACILITY_ID, + KHERR_SUGGEST_NONE, + _cstr(p->p.name), + _cstr(p->p.description), + _cstr(p->module->path), + _cstr(p->module->support), + KHERR_RF_MSG_SHORT_DESC | + KHERR_RF_MSG_LONG_DESC | + KHERR_RF_MSG_SUGGEST +#ifdef _WIN32 + ,KHERR_HMODULE +#endif + ); + _resolve(); + + /* exit the plugin first. Otherwise it may not uninitialize correctly */ + (*p->p.msg_proc)(KMSG_SYSTEM, KMSG_SYSTEM_EXIT, 0, (void *) &(p->p)); + + kmmint_remove_from_plugin_queue(p); + rv = 1; + _end_task(); + + p->state = KMM_PLUGIN_STATE_FAIL_INIT; + goto _exit; + } + + /* subscribe to default message classes by plugin type */ + if(p->p.type == KHM_PITYPE_CRED) { + kmq_subscribe(KMSG_SYSTEM, p->p.msg_proc); + kmq_subscribe(KMSG_KCDB, p->p.msg_proc); + kmq_subscribe(KMSG_CRED, p->p.msg_proc); + } else if(p->p.type == KHM_PITYPE_IDENT) { + khm_handle h = NULL; + + kmq_subscribe(KMSG_SYSTEM, p->p.msg_proc); + kmq_subscribe(KMSG_KCDB, p->p.msg_proc); + + kmq_create_subscription(p->p.msg_proc, &h); + kcdb_identity_set_provider(h); + /* kcdb deletes the subscription when it's done with it */ + } else if(p->p.type == KHM_PITYPE_CONFIG) { + /*TODO: subscribe to configuration provider messages here */ + } + + p->state = KMM_PLUGIN_STATE_RUNNING; + + _report_mr0(KHERR_INFO, MSG_PB_INIT_DONE); + + _end_task(); + + /* if there were any plugins that were waiting for this one to + start, we should start them too */ + EnterCriticalSection(&cs_kmm); + do { + kmm_plugin_i * pd; + int i; + + for(i=0; i < p->n_dependants; i++) { + pd = p->dependants[i]; + + pd->n_unresolved--; + + if(pd->n_unresolved == 0) { + kmmint_add_to_plugin_queue(pd); + kmm_hold_plugin(kmm_handle_from_plugin(pd)); + kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, KMM_REG_INIT_PLUGIN, (void *) pd); + } + } + } while(FALSE); + LeaveCriticalSection(&cs_kmm); + + kmmint_remove_from_plugin_queue(p); + + /* main message loop */ + while(KHM_SUCCEEDED(kmq_dispatch(INFINITE))); + + /* unsubscribe from default message classes by plugin type */ + if(p->p.type == KHM_PITYPE_CRED) { + kmq_unsubscribe(KMSG_SYSTEM, p->p.msg_proc); + kmq_unsubscribe(KMSG_KCDB, p->p.msg_proc); + kmq_unsubscribe(KMSG_CRED, p->p.msg_proc); + } else if (p->p.type == KHM_PITYPE_IDENT) { + kmq_unsubscribe(KMSG_KCDB, p->p.msg_proc); + kmq_unsubscribe(KMSG_SYSTEM, p->p.msg_proc); + kcdb_identity_set_provider(NULL); + } else if(p->p.type == KHM_PITYPE_CONFIG) { + /*TODO: unsubscribe from configuration provider messages here */ + } + + p->p.msg_proc(KMSG_SYSTEM, KMSG_SYSTEM_EXIT, 0, (void *) &(p->p)); + + _exit: + if (p->state >= 0) + p->state = KMM_PLUGIN_STATE_EXITED; + + /* the following call will automatically release the plugin */ + kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, + KMM_REG_EXIT_PLUGIN, (void *) p); + + TlsSetValue(tls_kmm, (LPVOID) 0); + + ExitThread(rv); + + /* not reached */ + return rv; +} + +/*! \internal + \brief Initialize a plugin + + \note If kmmint_init_plugin() is called on a plugin, then kmmint_exit_plugin() + \b must be called for the plugin. + + \note Should only be called from the context of the registrar thread */ +void kmmint_init_plugin(kmm_plugin_i * p) { + DWORD dummy; + khm_handle csp_plugin = NULL; + khm_handle csp_plugins = NULL; + khm_int32 t; + + /* the following will be undone in kmmint_exit_plugin() */ + kmm_hold_plugin(kmm_handle_from_plugin(p)); + + EnterCriticalSection(&cs_kmm); + if(p->state != KMM_PLUGIN_STATE_REG && + p->state != KMM_PLUGIN_STATE_HOLD) + { + LeaveCriticalSection(&cs_kmm); + goto _exit; + } + + _begin_task(0); + _report_mr1(KHERR_NONE, MSG_IP_TASK_DESC, _cstr(p->p.name)); + _describe(); + + if(p->state == KMM_PLUGIN_STATE_HOLD) { + /* if this plugin was held, then we already had a hold + from the initial attempt to start the plugin. Undo + the hold we did a few lines earlier. */ + kmm_release_plugin(kmm_handle_from_plugin(p)); + /* same for the plugin count for the module. */ + p->module->plugin_count--; + } + + p->state = KMM_PLUGIN_STATE_PREINIT; + + kmmint_delist_plugin(p); + kmmint_list_plugin(p); + + LeaveCriticalSection(&cs_kmm); + + if(KHM_FAILED(kmm_get_plugins_config(0, &csp_plugins))) { + _report_mr0(KHERR_ERROR, MSG_IP_GET_CONFIG); + + p->state = KMM_PLUGIN_STATE_FAIL_UNKNOWN; + goto _exit; + } + + if(KHM_FAILED(kmm_get_plugin_config(p->p.name, 0, &csp_plugin))) { + if(KHM_FAILED(kmm_register_plugin(&(p->p), 0))) { + _report_mr0(KHERR_ERROR, MSG_IP_NOT_REGISTERED); + + p->state = KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED; + goto _exit; + } + + if(KHM_FAILED(kmm_get_plugin_config(p->p.name, 0, &csp_plugin))) { + _report_mr0(KHERR_ERROR, MSG_IP_NOT_REGISTERED); + + p->state = KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED; + goto _exit; + } + } + + if (KHM_SUCCEEDED(khc_read_int32(csp_plugin, L"Disabled", &t)) && t) { + p->flags |= KMM_PLUGIN_FLAG_DISABLED; + p->state = KMM_PLUGIN_STATE_FAIL_DISABLED; + goto _exit; + } + +#if 0 + /*TODO: check the failure count and act accordingly */ + if(KHM_SUCCEEDED(khc_read_int32(csp_plugin, L"FailureCount", &t)) && (t > 0)) { + } +#endif + + EnterCriticalSection(&cs_kmm); + + p->n_depends = 0; + p->n_unresolved = 0; + + do { + wchar_t * deps = NULL; + wchar_t * d; + khm_size sz = 0; + + if(khc_read_multi_string(csp_plugin, L"Dependencies", + NULL, &sz) != KHM_ERROR_TOO_LONG) + break; + + deps = PMALLOC(sz); + if(KHM_FAILED(khc_read_multi_string(csp_plugin, L"Dependencies", + deps, &sz))) { + if(deps) + PFREE(deps); + break; + } + + for(d = deps; d && *d; d = multi_string_next(d)) { + kmm_plugin_i * pd; + int i; + + pd = kmmint_get_plugin_i(d); + + if(pd->state == KMM_PLUGIN_STATE_NONE) { + /* the dependant was not previously known */ + pd->state = KMM_PLUGIN_STATE_PLACEHOLDER; + } + + for(i=0; i < pd->n_dependants; i++) { + if(pd->dependants[i] == p) + break; + } + + if(i >= pd->n_dependants) { + if( pd->n_dependants >= KMM_MAX_DEPENDANTS ) { + /*TODO: handle this gracefully */ + RaiseException(1, EXCEPTION_NONCONTINUABLE, 0, NULL); + } + + /* released in kmmint_free_plugin() */ + kmm_hold_plugin(kmm_handle_from_plugin(p)); + pd->dependants[pd->n_dependants] = p; + pd->n_dependants++; + } + + p->n_depends++; + + if(pd->state != KMM_PLUGIN_STATE_RUNNING) { + p->n_unresolved++; + } + } + + if(p->n_unresolved > 0) { + p->state = KMM_PLUGIN_STATE_HOLD; + } + + PFREE(deps); + + } while(FALSE); + + p->module->plugin_count++; + + LeaveCriticalSection(&cs_kmm); + + if(p->state == KMM_PLUGIN_STATE_HOLD) { + _report_mr1(KHERR_INFO, MSG_IP_HOLD, _dupstr(p->p.name)); + + goto _exit_post; + } + + kmmint_add_to_plugin_queue(p); + + p->ht_thread = CreateThread(NULL, + 0, + kmmint_plugin_broker, + (LPVOID) p, + CREATE_SUSPENDED, + &dummy); + + p->state = KMM_PLUGIN_STATE_INIT; + + ResumeThread(p->ht_thread); + +_exit_post: + if(csp_plugin != NULL) + khc_close_space(csp_plugin); + + if(csp_plugins != NULL) + khc_close_space(csp_plugins); + + _report_mr2(KHERR_INFO, MSG_IP_STATE, + _dupstr(p->p.name), _int32(p->state)); + + _end_task(); + + return; + + /* jump here if an error condition happens before the plugin + broker thread starts and the plugin should be unloaded */ + +_exit: + if(csp_plugin != NULL) + khc_close_space(csp_plugin); + if(csp_plugins != NULL) + khc_close_space(csp_plugins); + + _report_mr2(KHERR_WARNING, MSG_IP_EXITING, + _dupstr(p->p.name), _int32(p->state)); + _end_task(); + + kmm_hold_plugin(kmm_handle_from_plugin(p)); + + kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, KMM_REG_EXIT_PLUGIN, (void *) p); +} + +/*! \internal + \brief Uninitialize a plugin + + In addition to terminating the thread, and removing p from the + linked list and hashtable, it also frees up p. + + \note Should only be called from the context of the registrar thread. */ +void kmmint_exit_plugin(kmm_plugin_i * p) { + int np; + khm_boolean release_plugin = TRUE; + + if(p->state == KMM_PLUGIN_STATE_RUNNING || + p->state == KMM_PLUGIN_STATE_INIT) { + + kmq_post_thread_quit_message(p->tid_thread, 0, NULL); + /* when we post the quit message to the plugin thread, the plugin + broker terminates the plugin and posts a EXIT_PLUGIN message, + which calls this function again. We just exit here because + the EXIT_PLUGIN message will end up calling us again momentarily */ + return; + + } + + if(p->ht_thread) { + /* wait for the thread to terminate */ + WaitForSingleObject(p->ht_thread, INFINITE); + p->ht_thread = NULL; + } + + EnterCriticalSection(&cs_kmm); + + /* undo reference count done in kmmint_init_plugin() */ + if(p->state == KMM_PLUGIN_STATE_EXITED || + p->state == KMM_PLUGIN_STATE_HOLD) { + + np = --(p->module->plugin_count); + + } else { + /* the plugin was never active. We can't base a module unload + decision on np */ + np = TRUE; + } + + /* The plugin is in an error state. We need to keep the plugin + record in tact so that the failure information is kept + around. */ + if (p->state < KMM_PLUGIN_STATE_NONE) { + release_plugin = FALSE; + } + + LeaveCriticalSection(&cs_kmm); + + if(!np) { + /* if this is the last plugin to exit, then notify the + registrar that the module should be removed as well */ + kmm_hold_module(kmm_handle_from_module(p->module)); + kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, KMM_REG_EXIT_MODULE, (void *) p->module); + } + + /* release the hold obtained in kmmint_init_plugin() */ + if (release_plugin) + kmm_release_plugin(kmm_handle_from_plugin(p)); +} + +/*! \internal + \brief Initialize a module + + \a m is not in the linked list yet. + + \note Should only be called from the context of the registrar thread. */ +void kmmint_init_module(kmm_module_i * m) { + HMODULE hm; + init_module_t p_init_module; + kmm_plugin_i * pi; + khm_int32 rv; + khm_handle csp_mod = NULL; + khm_handle csp_mods = NULL; + khm_size sz; + khm_int32 i; + + /* error condition handling */ + BOOL exit_module = FALSE; + BOOL release_module = TRUE; + BOOL record_failure = FALSE; + + /* failure handling */ + khm_int32 max_fail_count = 0; + khm_int64 fail_reset_time = 0; + + _begin_task(0); + _report_mr1(KHERR_NONE, MSG_INIT_MODULE, _cstr(m->name)); + _describe(); + + kmm_hold_module(kmm_handle_from_module(m)); + + if(KHM_FAILED(kmm_get_modules_config(0, &csp_mods))) { + _report_mr0(KHERR_ERROR, MSG_IM_GET_CONFIG); + _location(L"kmm_get_modules_config()"); + + m->state = KMM_MODULE_STATE_FAIL_UNKNOWN; + goto _exit; + } + + khc_read_int32(csp_mods, L"ModuleMaxFailureCount", &max_fail_count); + khc_read_int64(csp_mods, L"ModuleFailureCountResetTime", &fail_reset_time); + + /* If the module is not in the pre-init state, we can't + initialize it. */ + if(m->state != KMM_MODULE_STATE_PREINIT) { + _report_mr1(KHERR_INFO, MSG_IM_NOT_PREINIT, _int32(m->state)); + goto _exit; + } + + if(KHM_FAILED(kmm_get_module_config(m->name, 0, &csp_mod))) { + _report_mr0(KHERR_ERROR, MSG_IM_NOT_REGISTERED); + + m->state = KMM_MODULE_STATE_FAIL_NOT_REGISTERED; + goto _exit; + } + + if(KHM_SUCCEEDED(khc_read_int32(csp_mod, L"Disabled", &i)) && i) { + _report_mr0(KHERR_INFO, MSG_IM_DISABLED); + + m->state = KMM_MODULE_STATE_FAIL_DISABLED; + goto _exit; + } + + if(KHM_SUCCEEDED(khc_read_int32(csp_mod, L"NoUnload", &i)) && i) { + m->flags |= KMM_MODULE_FLAG_NOUNLOAD; + } + + if(KHM_SUCCEEDED(khc_read_int32(csp_mod, L"FailureCount", &i))) { + khm_int64 tm; + khm_int64 ct; + FILETIME fct; + khm_int32 last_reason = 0; + + /* reset the failure count if the failure count reset time + period has elapsed */ + tm = 0; + khc_read_int64(csp_mod, L"FailureTime", &tm); + GetSystemTimeAsFileTime(&fct); + + ct = (FtToInt(&fct) - tm) / 10000000i64; + + if(tm > 0 && + ct > fail_reset_time) { + i = 0; + khc_write_int32(csp_mod, L"FailureCount", 0); + khc_write_int64(csp_mod, L"FailureTime", 0); + } + + khc_read_int32(csp_mod, L"FailureReason", &last_reason); + + /* did we exceed the max failure count? However, we ignore + the max failure count if the reason why it didn't load the + last time was because the module wasn't found. */ + if(i > max_fail_count && + last_reason != KMM_MODULE_STATE_FAIL_NOT_FOUND) { + /* failed too many times */ + _report_mr0(KHERR_INFO, MSG_IM_MAX_FAIL); + + m->state = KMM_MODULE_STATE_FAIL_MAX_FAILURE; + goto _exit; + } + } + + if(khc_read_string(csp_mod, L"ImagePath", NULL, &sz) == + KHM_ERROR_TOO_LONG) { + if(m->path) + PFREE(m->path); + m->path = PMALLOC(sz); + khc_read_string(csp_mod, L"ImagePath", m->path, &sz); + } else { + _report_mr0(KHERR_ERROR, MSG_IM_NOT_REGISTERED); + + m->state = KMM_MODULE_STATE_FAIL_NOT_REGISTERED; + goto _exit; + } + + rv = kmmint_read_module_info(m); + + if (KHM_FAILED(rv)) { + if (rv == KHM_ERROR_INCOMPATIBLE) { + _report_mr0(KHERR_ERROR, MSG_IM_INCOMPATIBLE); + + m->state = KMM_MODULE_STATE_FAIL_INCOMPAT; + } else if (rv == KHM_ERROR_NOT_FOUND) { + _report_mr1(KHERR_ERROR, MSG_IM_NOT_FOUND, _dupstr(m->path)); + + m->state = KMM_MODULE_STATE_FAIL_NOT_FOUND; + } else { + _report_mr0(KHERR_ERROR, MSG_IM_INVALID_MODULE); + + m->state = KMM_MODULE_STATE_FAIL_INV_MODULE; + } + goto _exit; + } + + /* check again */ + if(m->state != KMM_MODULE_STATE_PREINIT) { + _report_mr0(KHERR_ERROR, MSG_IM_NOT_PREINIT); + + goto _exit; + } + + /* from this point on, we must record any failure codes */ + record_failure = TRUE; + + hm = LoadLibrary(m->path); + if(!hm) { + m->h_module = NULL; + m->state = KMM_MODULE_STATE_FAIL_NOT_FOUND; + + _report_mr1(KHERR_ERROR, MSG_IM_NOT_FOUND, _dupstr(m->path)); + + goto _exit; + } + + /* from this point on, we need to discard the module through + exit_module */ + ResetEvent(evt_exit); + + kmm_active_modules++; + + release_module = FALSE; + exit_module = TRUE; + + m->flags |= KMM_MODULE_FLAG_LOADED; + m->h_module = hm; + + /* TODO: check signatures */ + + p_init_module = (init_module_t) GetProcAddress(hm, EXP_INIT_MODULE); + + if(!p_init_module) { + _report_mr1(KHERR_ERROR, MSG_IM_NO_ENTRY, _cstr(EXP_INIT_MODULE)); + + m->state = KMM_MODULE_STATE_FAIL_INVALID; + goto _exit; + } + + m->state = KMM_MODULE_STATE_INIT; + + /* call init_module() */ + rv = (*p_init_module)(kmm_handle_from_module(m)); + + m->flags |= KMM_MODULE_FLAG_INITP; + + if(KHM_FAILED(rv)) { + _report_mr1(KHERR_ERROR, MSG_IM_INIT_FAIL, _int32(rv)); + + m->state = KMM_MODULE_STATE_FAIL_LOAD; + goto _exit; + } + + if(!m->plugins) { + _report_mr0(KHERR_ERROR, MSG_IM_NO_PLUGINS); + + m->state = KMM_MODULE_STATE_FAIL_NO_PLUGINS; + record_failure = FALSE; + goto _exit; + } + + m->state = KMM_MODULE_STATE_INITPLUG; + + do { + LPOP(&(m->plugins), &pi); + if(pi) { + pi->flags &= ~KMM_PLUGIN_FLAG_IN_MODLIST; + kmmint_init_plugin(pi); + + /* release the hold obtained in kmm_provide_plugin() */ + kmm_release_plugin(kmm_handle_from_plugin(pi)); + } + } while(pi); + + if(!m->plugin_count) { + /* We don't want to report this case. This usually means that + the plugins that were provided by the module were + disabled. */ +#ifdef REPORT_EMPTY_MODULES + _report_mr0(KHERR_ERROR, MSG_IM_NO_PLUGINS); + + m->state = KMM_MODULE_STATE_FAIL_NO_PLUGINS; +#endif + record_failure = FALSE; + goto _exit; + } + + m->state = KMM_MODULE_STATE_RUNNING; + + exit_module = FALSE; + record_failure = FALSE; + + _exit: + if(csp_mod) { + if(record_failure) { + FILETIME fct; + + i = 0; + khc_read_int32(csp_mod, L"FailureCount", &i); + i++; + khc_write_int32(csp_mod, L"FailureCount", i); + + if(i==1) { /* first fault */ + GetSystemTimeAsFileTime(&fct); + khc_write_int64(csp_mod, L"FailureTime", FtToInt(&fct)); + } + + khc_write_int32(csp_mod, L"FailureReason", m->state); + } + khc_close_space(csp_mod); + } + + if(csp_mods) + khc_close_space(csp_mods); + + _report_mr2(KHERR_INFO, MSG_IM_MOD_STATE, + _dupstr(m->name), _int32(m->state)); + + kmmint_remove_from_module_queue(); + + /* if something went wrong after init_module was called on the + module code, we need to call exit_module */ + if(exit_module) + kmmint_exit_module(m); + + if(release_module) + kmm_release_module(kmm_handle_from_module(m)); + + if (kherr_is_error()) { + kherr_context * c; + kherr_event * err_e = NULL; + kherr_event * warn_e = NULL; + kherr_event * e; + + c = kherr_peek_context(); + err_e = kherr_get_err_event(c); + for(e = kherr_get_first_event(c); + e; + e = kherr_get_next_event(e)) { + if (e != err_e && + e->severity == KHERR_WARNING) { + warn_e = e; + break; + } + } + + kherr_evaluate_event(err_e); + if (warn_e) + kherr_evaluate_event(warn_e); + + kherr_clear_error(); + + e = kherr_report(KHERR_ERROR, + (wchar_t *) MSG_IMERR_TITLE, + KHERR_FACILITY, + NULL, + err_e->long_desc, + ((warn_e)? (wchar_t *)MSG_IMERR_SUGGEST: NULL), + KHERR_FACILITY_ID, + KHERR_SUGGEST_NONE, + _cstr(m->name), + ((warn_e)? _cstr(warn_e->long_desc):_vnull()), + _vnull(),_vnull(), + KHERR_RF_MSG_SHORT_DESC | + ((warn_e)? KHERR_RF_MSG_SUGGEST: 0), + KHERR_HMODULE); + + kherr_evaluate_event(e); + + kherr_release_context(c); + } + + _end_task(); +} + + +/*! \internal + \brief Uninitializes a module + + \note Should only be called from the context of the registrar + thread */ +void kmmint_exit_module(kmm_module_i * m) { + kmm_plugin_i * p; + + /* Exiting a module happens in two stages. + + If the module state is running (there are active plugins) then + those plugins must be exited. This has to be done from the + plugin threads. The signal for the plugins to exit must be + issued from the registrar. Therefore, we post messages to the + registrar for each plugin we want to remove and exit + kmmint_exit_module(). + + When the last plugin is exited, the plugin management code + automatically signalls the registrar to remove the module. + kmmint_exit_module() gets called again. This is the second + stage, where we call exit_module() for the module and start + unloading everything. + */ + + EnterCriticalSection(&cs_kmm); + + /* get rid of any dangling uninitialized plugins */ + LPOP(&(m->plugins), &p); + while(p) { + p->flags &= ~KMM_PLUGIN_FLAG_IN_MODLIST; + kmmint_exit_plugin(p); + + /* release hold from kmm_provide_plugin() */ + kmm_release_plugin(kmm_handle_from_plugin(p)); + + LPOP(&(m->plugins), &p); + } + + if(m->state == KMM_MODULE_STATE_RUNNING) { + int np = 0; + + m->state = KMM_MODULE_STATE_EXITPLUG; + + p = kmm_listed_plugins; + + while(p) { + if(p->module == m) { + kmm_hold_plugin(kmm_handle_from_plugin(p)); + kmq_post_message(KMSG_KMM, KMSG_KMM_I_REG, + KMM_REG_EXIT_PLUGIN, (void *) p); + np++; + } + + p = LNEXT(p); + } + + if(np > 0) { + /* we have to go back and wait for the plugins to exit. + when the last plugin exits, it automatically posts + EXIT_MODULE. We can pick up from there when this + happens. */ + LeaveCriticalSection(&cs_kmm); + return; + } + } + + if(m->flags & KMM_MODULE_FLAG_INITP) { + exit_module_t p_exit_module; + + if(m->state > 0) + m->state = KMM_MODULE_STATE_EXIT; + + p_exit_module = + (exit_module_t) GetProcAddress(m->h_module, + EXP_EXIT_MODULE); + if(p_exit_module) { + LeaveCriticalSection(&cs_kmm); + (*p_exit_module)(kmm_handle_from_module(m)); + EnterCriticalSection(&cs_kmm); + } + } + + if(m->state > 0) + m->state = KMM_MODULE_STATE_EXITED; + + LeaveCriticalSection(&cs_kmm); + + if(!(m->flags & KMM_MODULE_FLAG_NOUNLOAD) && + m->h_module) { + FreeLibrary(m->h_module); + } + + if(!(m->flags & KMM_MODULE_FLAG_NOUNLOAD) && + m->h_resource && (m->h_resource != m->h_module)) { + FreeLibrary(m->h_resource); + } + + m->h_module = NULL; + m->h_resource = NULL; + m->flags = 0; + + /* release the hold obtained in kmmint_init_module() */ + kmm_release_module(kmm_handle_from_module(m)); + + /* Last but not least, now see if there are any modules left that + are running. If not, we can safely signal an exit. */ + +#ifdef DEBUG + assert(kmm_active_modules > 0); +#endif + + kmm_active_modules--; + + if (kmm_active_modules == 0) { + SetEvent(evt_exit); + } +} --- krb5-1.4.4.orig/src/windows/identity/kmm/kmminternal.h +++ krb5-1.4.4/src/windows/identity/kmm/kmminternal.h @@ -1,248 +1,248 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KMMINTERNAL_H -#define __KHIMAIRA_KMMINTERNAL_H - -#include -#include -#include - -#define KHERR_FACILITY kmm_facility -#define KHERR_FACILITY_ID KHM_FACILITY_KMM -#define KHERR_HMODULE ((HMODULE) kmm_hInstance) -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -struct kmm_plugin_i_t; /* forward dcl */ - -typedef struct kmm_module_i_t { - khm_int32 magic; - - wchar_t * name; - wchar_t * path; - wchar_t * description; - wchar_t * vendor; - wchar_t * support; - - khm_version file_version; - khm_version prod_version; - - HMODULE h_module; - - HMODULE h_resource; - WORD lcid_resource; - - khm_int32 flags; - khm_int32 state; - khm_int32 plugin_count; /* number of active plugins */ - - void * version_info; - - khm_int32 refcount; - - struct kmm_plugin_i_t * plugins; /* only used for registration */ - - LDCL(struct kmm_module_i_t); -} kmm_module_i; - -#define KMM_MODULE_MAGIC 0x482f4e88 - -#define kmm_is_module(m) ((m) && ((kmm_module_i *)m)->magic == KMM_MODULE_MAGIC) - -#define kmm_module_from_handle(m) ((kmm_module_i *) m) -#define kmm_handle_from_module(m) ((kmm_module) m) - -/* LoadLibrary succeeded for module */ -#define KMM_MODULE_FLAG_LOADED 0x00000001 - -/* init_module entry called */ -#define KMM_MODULE_FLAG_INITP 0x00000002 - -/* the resources have been loaded */ -#define KMM_MODULE_FLAG_RES_LOADED 0x00000008 - -/* the signature has been verified */ -#define KMM_MODULE_FLAG_SIG 0x00000010 - -/* the module is disabled by the user - (option specified in configuration) */ -#define KMM_MODULE_FLAG_DISABLED 0x00000400 - -/* the module should not be unloaded - (option specified in configuration)*/ -#define KMM_MODULE_FLAG_NOUNLOAD 0x00000800 - -typedef struct kmm_plugin_i_t { - kmm_plugin_reg p; - - khm_int32 magic; - - kmm_module_i * module; - HANDLE ht_thread; - DWORD tid_thread; - - khm_int32 state; - khm_int32 flags; - - int refcount; - - int n_depends; - int n_unresolved; - struct kmm_plugin_i_t * dependants[KMM_MAX_DEPENDANTS]; - int n_dependants; - - LDCL(struct kmm_plugin_i_t); -} kmm_plugin_i; - -#define KMM_PLUGIN_MAGIC 0x320e8fb4 - -#define kmm_is_plugin(p) ((p) && ((kmm_plugin_i *) (p))->magic == KMM_PLUGIN_MAGIC) - -#define kmm_handle_from_plugin(p) ((kmm_plugin) p) -#define kmm_plugin_from_handle(ph) ((kmm_plugin_i *) ph) - -/* the plugin has already been marked for unload */ -#define KMM_PLUGIN_FLAG_UNLOAD 0x00000001 - -/* the plugin is in the kmm_listed_plugins list */ -#define KMM_PLUGIN_FLAG_IN_LIST 0x00000002 - -/* the plugin is in the module's plugin list */ -#define KMM_PLUGIN_FLAG_IN_MODLIST 0x00000004 - -#define KMM_PLUGIN_FLAG_IN_QUEUE 0x00000010 - -/* the plugin is disabled by the user - (option specified in configuration) */ -/* (this is defined in kmm.h) - - #define KMM_PLUGIN_FLAG_DISABLED 0x0400 - -*/ - -enum kmm_registrar_uparam_t { - KMM_REG_INIT_MODULE, - KMM_REG_EXIT_MODULE, - KMM_REG_INIT_PLUGIN, - KMM_REG_EXIT_PLUGIN -}; - -extern kmm_module_i * kmm_all_modules; -extern khm_size kmm_active_modules; -extern kmm_plugin_i * kmm_listed_plugins; -extern HANDLE ht_registrar; -extern DWORD tid_registrar; -extern DWORD tls_kmm; - -extern hashtable * hash_plugins; -extern hashtable * hash_modules; - -extern CRITICAL_SECTION cs_kmm; -extern int ready; -extern HANDLE evt_startup; -extern HANDLE evt_exit; -extern const wchar_t * kmm_facility; - -extern HINSTANCE kmm_hInstance; - -extern kconf_schema schema_kmmconfig[]; - -/* Registrar */ - -khm_boolean KHMAPI -kmmint_reg_cb(khm_int32 msg_type, - khm_int32 msg_sub_type, - khm_ui_4 uparam, - void *vparam); - -DWORD WINAPI kmmint_registrar(LPVOID lpParameter); - -DWORD WINAPI kmmint_plugin_broker(LPVOID lpParameter); - -void kmmint_init_plugin(kmm_plugin_i * p); -void kmmint_exit_plugin(kmm_plugin_i * p); -void kmmint_init_module(kmm_module_i * m); -void kmmint_exit_module(kmm_module_i * m); - -/* Modules */ -kmm_module_i * -kmmint_get_module_i(wchar_t * name); - -kmm_module_i * -kmmint_find_module_i(wchar_t * name); - -void -kmmint_free_module(kmm_module_i * m); - -khm_int32 -kmmint_read_module_info(kmm_module_i * m); - -/* Plugins */ -kmm_plugin_i * -kmmint_get_plugin_i(wchar_t * name); - -kmm_plugin_i * -kmmint_find_plugin_i(wchar_t * name); - -void -kmmint_free_plugin(kmm_plugin_i * pi); - -void -kmmint_list_plugin(kmm_plugin_i * p); - -void -kmmint_delist_plugin(kmm_plugin_i * p); - -khm_boolean -kmmint_load_locale_lib(kmm_module_i * m, kmm_module_locale * l); - -#define KMM_CSNAME_ROOT L"PluginManager" -#define KMM_CSNAME_PLUGINS L"Plugins" -#define KMM_CSNAME_MODULES L"Modules" -#define KMM_VALNAME_LOADLIST L"LoadList" - -void -kmmint_add_to_module_queue(void); - -void -kmmint_remove_from_module_queue(void); - -#define _WAIT_FOR_START \ - do { \ - if(ready) break; \ - WaitForSingleObject(evt_startup, INFINITE); \ - } while(0) - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KMMINTERNAL_H +#define __KHIMAIRA_KMMINTERNAL_H + +#include +#include +#include + +#define KHERR_FACILITY kmm_facility +#define KHERR_FACILITY_ID KHM_FACILITY_KMM +#define KHERR_HMODULE ((HMODULE) kmm_hInstance) +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +struct kmm_plugin_i_t; /* forward dcl */ + +typedef struct kmm_module_i_t { + khm_int32 magic; + + wchar_t * name; + wchar_t * path; + wchar_t * description; + wchar_t * vendor; + wchar_t * support; + + khm_version file_version; + khm_version prod_version; + + HMODULE h_module; + + HMODULE h_resource; + WORD lcid_resource; + + khm_int32 flags; + khm_int32 state; + khm_int32 plugin_count; /* number of active plugins */ + + void * version_info; + + khm_int32 refcount; + + struct kmm_plugin_i_t * plugins; /* only used for registration */ + + LDCL(struct kmm_module_i_t); +} kmm_module_i; + +#define KMM_MODULE_MAGIC 0x482f4e88 + +#define kmm_is_module(m) ((m) && ((kmm_module_i *)m)->magic == KMM_MODULE_MAGIC) + +#define kmm_module_from_handle(m) ((kmm_module_i *) m) +#define kmm_handle_from_module(m) ((kmm_module) m) + +/* LoadLibrary succeeded for module */ +#define KMM_MODULE_FLAG_LOADED 0x00000001 + +/* init_module entry called */ +#define KMM_MODULE_FLAG_INITP 0x00000002 + +/* the resources have been loaded */ +#define KMM_MODULE_FLAG_RES_LOADED 0x00000008 + +/* the signature has been verified */ +#define KMM_MODULE_FLAG_SIG 0x00000010 + +/* the module is disabled by the user + (option specified in configuration) */ +#define KMM_MODULE_FLAG_DISABLED 0x00000400 + +/* the module should not be unloaded + (option specified in configuration)*/ +#define KMM_MODULE_FLAG_NOUNLOAD 0x00000800 + +typedef struct kmm_plugin_i_t { + kmm_plugin_reg p; + + khm_int32 magic; + + kmm_module_i * module; + HANDLE ht_thread; + DWORD tid_thread; + + khm_int32 state; + khm_int32 flags; + + int refcount; + + int n_depends; + int n_unresolved; + struct kmm_plugin_i_t * dependants[KMM_MAX_DEPENDANTS]; + int n_dependants; + + LDCL(struct kmm_plugin_i_t); +} kmm_plugin_i; + +#define KMM_PLUGIN_MAGIC 0x320e8fb4 + +#define kmm_is_plugin(p) ((p) && ((kmm_plugin_i *) (p))->magic == KMM_PLUGIN_MAGIC) + +#define kmm_handle_from_plugin(p) ((kmm_plugin) p) +#define kmm_plugin_from_handle(ph) ((kmm_plugin_i *) ph) + +/* the plugin has already been marked for unload */ +#define KMM_PLUGIN_FLAG_UNLOAD 0x00000001 + +/* the plugin is in the kmm_listed_plugins list */ +#define KMM_PLUGIN_FLAG_IN_LIST 0x00000002 + +/* the plugin is in the module's plugin list */ +#define KMM_PLUGIN_FLAG_IN_MODLIST 0x00000004 + +#define KMM_PLUGIN_FLAG_IN_QUEUE 0x00000010 + +/* the plugin is disabled by the user + (option specified in configuration) */ +/* (this is defined in kmm.h) + + #define KMM_PLUGIN_FLAG_DISABLED 0x0400 + +*/ + +enum kmm_registrar_uparam_t { + KMM_REG_INIT_MODULE, + KMM_REG_EXIT_MODULE, + KMM_REG_INIT_PLUGIN, + KMM_REG_EXIT_PLUGIN +}; + +extern kmm_module_i * kmm_all_modules; +extern khm_size kmm_active_modules; +extern kmm_plugin_i * kmm_listed_plugins; +extern HANDLE ht_registrar; +extern DWORD tid_registrar; +extern DWORD tls_kmm; + +extern hashtable * hash_plugins; +extern hashtable * hash_modules; + +extern CRITICAL_SECTION cs_kmm; +extern int ready; +extern HANDLE evt_startup; +extern HANDLE evt_exit; +extern const wchar_t * kmm_facility; + +extern HINSTANCE kmm_hInstance; + +extern kconf_schema schema_kmmconfig[]; + +/* Registrar */ + +khm_boolean KHMAPI +kmmint_reg_cb(khm_int32 msg_type, + khm_int32 msg_sub_type, + khm_ui_4 uparam, + void *vparam); + +DWORD WINAPI kmmint_registrar(LPVOID lpParameter); + +DWORD WINAPI kmmint_plugin_broker(LPVOID lpParameter); + +void kmmint_init_plugin(kmm_plugin_i * p); +void kmmint_exit_plugin(kmm_plugin_i * p); +void kmmint_init_module(kmm_module_i * m); +void kmmint_exit_module(kmm_module_i * m); + +/* Modules */ +kmm_module_i * +kmmint_get_module_i(wchar_t * name); + +kmm_module_i * +kmmint_find_module_i(wchar_t * name); + +void +kmmint_free_module(kmm_module_i * m); + +khm_int32 +kmmint_read_module_info(kmm_module_i * m); + +/* Plugins */ +kmm_plugin_i * +kmmint_get_plugin_i(wchar_t * name); + +kmm_plugin_i * +kmmint_find_plugin_i(wchar_t * name); + +void +kmmint_free_plugin(kmm_plugin_i * pi); + +void +kmmint_list_plugin(kmm_plugin_i * p); + +void +kmmint_delist_plugin(kmm_plugin_i * p); + +khm_boolean +kmmint_load_locale_lib(kmm_module_i * m, kmm_module_locale * l); + +#define KMM_CSNAME_ROOT L"PluginManager" +#define KMM_CSNAME_PLUGINS L"Plugins" +#define KMM_CSNAME_MODULES L"Modules" +#define KMM_VALNAME_LOADLIST L"LoadList" + +void +kmmint_add_to_module_queue(void); + +void +kmmint_remove_from_module_queue(void); + +#define _WAIT_FOR_START \ + do { \ + if(ready) break; \ + WaitForSingleObject(evt_startup, INFINITE); \ + } while(0) + +#endif --- krb5-1.4.4.orig/src/windows/identity/kmm/kmm_module.c +++ krb5-1.4.4/src/windows/identity/kmm/kmm_module.c @@ -1,676 +1,676 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -/* should only be accessed from the registrar thread */ -khm_size kmm_active_modules = 0; - -kmm_module_i * kmmint_get_module_i(wchar_t * name) -{ - kmm_module_i * m; - size_t sz; - - if(FAILED(StringCbLength(name, KMM_MAXCB_NAME, &sz))) - return NULL; - sz += sizeof(wchar_t); - - EnterCriticalSection(&cs_kmm); - m = (kmm_module_i *) hash_lookup(hash_modules, (void *) name); - - if(m == NULL) { - m = PMALLOC(sizeof(kmm_module_i)); - ZeroMemory(m, sizeof(kmm_module_i)); - - m->magic = KMM_MODULE_MAGIC; - m->name = PMALLOC(sz); - StringCbCopy(m->name, sz, name); - m->state = KMM_MODULE_STATE_NONE; - - hash_add(hash_modules, (void *) m->name, (void *) m); - LPUSH(&kmm_all_modules, m); - } - LeaveCriticalSection(&cs_kmm); - - return m; -} - -kmm_module_i * kmmint_find_module_i(wchar_t * name) -{ - kmm_module_i * m; - - EnterCriticalSection(&cs_kmm); - m = (kmm_module_i *) hash_lookup(hash_modules, (void *) name); - LeaveCriticalSection(&cs_kmm); - - return m; -} - -/* called with cs_kmm held */ -void kmmint_free_module(kmm_module_i * m) -{ - m->magic = 0; - - hash_del(hash_modules, m->name); - LDELETE(&kmm_all_modules, m); - - if (m->name) - PFREE(m->name); - - if (m->description) - PFREE(m->description); - - if (m->path) - PFREE(m->path); - - if (m->vendor) - PFREE(m->vendor); - - if (m->support) - PFREE(m->support); - - if (m->version_info) - PFREE(m->version_info); - - PFREE(m); -} - -KHMEXP khm_int32 KHMAPI kmm_hold_module(kmm_module module) -{ - if(!kmm_is_module(module)) - return KHM_ERROR_INVALID_PARAM; - EnterCriticalSection(&cs_kmm); - kmm_module_from_handle(module)->refcount++; - LeaveCriticalSection(&cs_kmm); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kmm_release_module(kmm_module vm) -{ - kmm_module_i * m; - - if(!kmm_is_module(vm)) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_kmm); - m = kmm_module_from_handle(vm); - if(! --(m->refcount)) - { - /* note that a 0 ref count means that there are no active - plugins */ - kmmint_free_module(m); - } - LeaveCriticalSection(&cs_kmm); - return KHM_ERROR_SUCCESS; -} - -khm_int32 -kmmint_check_api_version(DWORD v) { - /* for now, we allow API versions in the range - KH_VERSION_API_MINCOMPAT through KH_VERSION_API, inclusive. In - the future when we are swamped with so much time that we don't - know what to do with it, we can actually parse the - apiversion.txt file and create a compatibility table which we - can check against the functions used by the module and decide - whether or not it is compatible. */ - - if (v < KH_VERSION_API_MINCOMPAT || - v > KH_VERSION_API) - return KHM_ERROR_INCOMPATIBLE; - else - return KHM_ERROR_SUCCESS; -} - -struct lang_code { - WORD language; - WORD codepage; -}; - -khm_int32 -kmmint_read_module_info(kmm_module_i * m) { - /* the only fields we can count on at this point are m->name and - m->path */ - DWORD t; - size_t cb; - WORD lang; - khm_int32 rv = KHM_ERROR_SUCCESS; - struct lang_code *languages; - int n_languages; - int i; - wchar_t resname[256]; /* the resource names are a lot shorter */ - wchar_t * r; - VS_FIXEDFILEINFO *vff; - - assert(m->name); - assert(m->path); - - t = TRUE; - cb = GetFileVersionInfoSize(m->path, - &t); - /* if successful, cb gets the size in bytes of the version info - structure and sets t to zero */ - if (t) { - return KHM_ERROR_NOT_FOUND; - } else if (cb == 0) { - _report_mr1(KHERR_WARNING, MSG_RMI_NOT_FOUND, _dupstr(m->path)); - return KHM_ERROR_INVALID_PARAM; - } - - if (m->version_info) { - PFREE(m->version_info); - m->version_info = NULL; - } - - m->version_info = PMALLOC(cb); -#ifdef DEBUG - assert(m->version_info); -#endif - - if(!GetFileVersionInfo(m->path, - t, (DWORD) cb, m->version_info)) { - rv = KHM_ERROR_NOT_FOUND; - _report_mr1(KHERR_WARNING, MSG_RMI_NOT_FOUND, _dupstr(m->path)); - _location(L"GetFileVersionInfo"); - goto _cleanup; - } - - if(!VerQueryValue(m->version_info, - L"\\VarFileInfo\\Translation", - (LPVOID*) &languages, - &cb)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_NO_TRANS, _dupstr(m->path)); - _location(L"VerQueryValue"); - goto _cleanup; - } - - n_languages = (int) (cb / sizeof(*languages)); - - /* Try searching for the user's default language first */ - lang = GetUserDefaultLangID(); - for (i = 0; i < n_languages; i++) { - if(languages[i].language == lang) - break; - } - - /* If not, try the system default */ - if (i >= n_languages) { - lang = GetSystemDefaultLangID(); - for (i=0; i= n_languages) { - lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); - for (i=0; i= n_languages) { - lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); - for (i=0; i= n_languages) { - i = 0; - } - - if (i >= n_languages) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr0(KHERR_WARNING, MSG_RMI_NO_LOCAL); - goto _cleanup; - } - - /* check module name */ - StringCbPrintf(resname, sizeof(resname), - L"\\StringFileInfo\\%04x%04x\\" TEXT(NIMV_MODULE), - languages[i].language, - languages[i].codepage); - - if (!VerQueryValue(m->version_info, - resname, (LPVOID *) &r, &cb)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, - _cstr(TEXT(NIMV_MODULE))); - goto _cleanup; - } - - if (cb > KMM_MAXCB_NAME || - FAILED(StringCbLength(r, KMM_MAXCB_NAME, &cb))) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, - _cstr(TEXT(NIMV_MODULE))); - goto _cleanup; - } - - if (wcscmp(r, m->name)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr2(KHERR_WARNING, MSG_RMI_MOD_MISMATCH, - _dupstr(r), _dupstr(m->name)); - goto _cleanup; - } - - /* check API version */ - StringCbPrintf(resname, sizeof(resname), - L"\\StringFileInfo\\%04x%04x\\" TEXT(NIMV_APIVER), - languages[i].language, - languages[i].codepage); - - if (!VerQueryValue(m->version_info, - resname, (LPVOID *) &r, &cb)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, - _cstr(TEXT(NIMV_APIVER))); - goto _cleanup; - } - - if (cb > KMM_MAXCB_NAME || - FAILED(StringCbLength(r, KMM_MAXCB_NAME, &cb))) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, - _cstr(TEXT(NIMV_APIVER))); - goto _cleanup; - } - - t = wcstol(r, NULL, 10); - - rv = kmmint_check_api_version(t); - - if (KHM_FAILED(rv)) { - _report_mr2(KHERR_WARNING, MSG_RMI_API_MISMATCH, - _int32(t), _int32(KH_VERSION_API)); - goto _cleanup; - } - - /* Looks good. Now load the description, copyright, support URI - and file versions */ - if (m->description) { - PFREE(m->description); - m->description = NULL; - } - - StringCbPrintf(resname, sizeof(resname), - L"\\StringFileInfo\\%04x%04x\\FileDescription", - languages[i].language, - languages[i].codepage); - - if (!VerQueryValue(m->version_info, - resname, (LPVOID *) &r, &cb)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, - _cstr(L"FileDescription")); - goto _cleanup; - } - - if (cb > KMM_MAXCB_DESC || - FAILED(StringCbLength(r, KMM_MAXCB_DESC, &cb))) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, - _cstr(L"FileDescription")); - goto _cleanup; - } - - cb += sizeof(wchar_t); - - m->description = PMALLOC(cb); -#ifdef DEBUG - assert(m->description); -#endif - StringCbCopy(m->description, cb, r); - - /* on to the support URI */ - if (m->support) { - PFREE(m->support); - m->support = NULL; - } - - StringCbPrintf(resname, sizeof(resname), - L"\\StringFileInfo\\%04x%04x\\" TEXT(NIMV_SUPPORT), - languages[i].language, - languages[i].codepage); - - if (!VerQueryValue(m->version_info, - resname, (LPVOID *) &r, &cb)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, - _cstr(TEXT(NIMV_SUPPORT))); - goto _cleanup; - } - - if (cb > KMM_MAXCB_SUPPORT || - FAILED(StringCbLength(r, KMM_MAXCB_SUPPORT, &cb))) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, - _cstr(TEXT(NIMV_SUPPORT))); - goto _cleanup; - } - - cb += sizeof(wchar_t); - - m->support = PMALLOC(cb); -#ifdef DEBUG - assert(m->support); -#endif - StringCbCopy(m->support, cb, r); - - /* the vendor/copyright */ - if (m->vendor) { - PFREE(m->vendor); - m->vendor = NULL; - } - - StringCbPrintf(resname, sizeof(resname), - L"\\StringFileInfo\\%04x%04x\\LegalCopyright", - languages[i].language, - languages[i].codepage); - - if (!VerQueryValue(m->version_info, - resname, (LPVOID *) &r, &cb)) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, - _cstr(L"LegalCopyright")); - goto _cleanup; - } - - if (cb > KMM_MAXCB_SUPPORT || - FAILED(StringCbLength(r, KMM_MAXCB_SUPPORT, &cb))) { - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, - _cstr(L"LegalCopyright")); - goto _cleanup; - } - - cb += sizeof(wchar_t); - - m->vendor = PMALLOC(cb); -#ifdef DEBUG - assert(m->vendor); -#endif - StringCbCopy(m->vendor, cb, r); - - if (!VerQueryValue(m->version_info, - L"\\", - (LPVOID *) &vff, - &cb) || - cb != sizeof(*vff)) { - - rv = KHM_ERROR_INVALID_PARAM; - _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, - _cstr(L"Fixed Version Info")); - goto _cleanup; - } - - m->file_version.major = HIWORD(vff->dwFileVersionMS); - m->file_version.minor = LOWORD(vff->dwFileVersionMS); - m->file_version.patch = HIWORD(vff->dwFileVersionLS); - m->file_version.aux = LOWORD(vff->dwFileVersionLS); - - m->prod_version.major = HIWORD(vff->dwProductVersionMS); - m->prod_version.minor = LOWORD(vff->dwProductVersionMS); - m->prod_version.patch = HIWORD(vff->dwProductVersionLS); - m->prod_version.aux = LOWORD(vff->dwProductVersionLS); - - rv = KHM_ERROR_SUCCESS; - - _cleanup: - if (KHM_FAILED(rv)) { - if (m->version_info) { - PFREE(m->version_info); - m->version_info = NULL; - } - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI kmm_load_module(wchar_t * modname, - khm_int32 flags, - kmm_module * result) -{ - kmm_module_i * m = NULL; - kmm_module_i * mi; - size_t cbsize; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(FAILED(StringCbLength(modname, KMM_MAXCB_NAME, &cbsize))) - return KHM_ERROR_INVALID_PARAM; - cbsize += sizeof(wchar_t); - - EnterCriticalSection(&cs_kmm); - mi = kmmint_find_module_i(modname); - - if(mi != NULL) { - kmm_hold_module(kmm_handle_from_module(mi)); - /* check if the module has either failed to load either or if - it has been terminated. If so, we try once again to load the - module. */ - if(!(flags & KMM_LM_FLAG_NOLOAD) && - (mi->state < 0 || mi->state == KMM_MODULE_STATE_EXITED)) - { - mi->state = KMM_MODULE_STATE_PREINIT; - } - } - LeaveCriticalSection(&cs_kmm); - - if(flags & KMM_LM_FLAG_NOLOAD) { - if(result) - *result = mi; - else if(mi) - kmm_release_module(kmm_handle_from_module(mi)); - - return (mi)? KHM_ERROR_SUCCESS: KHM_ERROR_NOT_FOUND; - } - - if(mi) { - m = mi; - } else { - m = kmmint_get_module_i(modname); - m->state = KMM_MODULE_STATE_PREINIT; - kmm_hold_module(kmm_handle_from_module(m)); - } - - /* the module is already running or is already being - worked on by the registrar */ - if(m->state != KMM_MODULE_STATE_PREINIT) { - if(result) - *result = kmm_handle_from_module(m); - else - kmm_release_module(kmm_handle_from_module(m)); - - return KHM_ERROR_EXISTS; - } - - kmmint_add_to_module_queue(); - - if(flags & KMM_LM_FLAG_SYNC) { - kmm_hold_module(kmm_handle_from_module(m)); - kmq_send_message(KMSG_KMM, - KMSG_KMM_I_REG, - KMM_REG_INIT_MODULE, - (void*) m); - if(m->state <= 0) { - /* failed to load ? */ - if(m->state == KMM_MODULE_STATE_FAIL_NOT_FOUND) - rv = KHM_ERROR_NOT_FOUND; - else if(m->state == KMM_MODULE_STATE_FAIL_SIGNATURE) - rv = KHM_ERROR_INVALID_SIGNATURE; - else - rv = KHM_ERROR_UNKNOWN; - - kmm_release_module(kmm_handle_from_module(m)); - if(result) - *result = NULL; - } else { - if(result) - *result = kmm_handle_from_module(m); - else - kmm_release_module(kmm_handle_from_module(m)); - } - } else { - kmm_hold_module(kmm_handle_from_module(m)); - kmq_post_message(KMSG_KMM, - KMSG_KMM_I_REG, - KMM_REG_INIT_MODULE, - (void*) m); - if(result) - *result = kmm_handle_from_module(m); - else - kmm_release_module(kmm_handle_from_module(m)); - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_get_module_state(kmm_module m) -{ - if(!kmm_is_module(m)) - return KMM_MODULE_STATE_NONE; - else - return kmm_module_from_handle(m)->state; -} - -KHMEXP khm_int32 KHMAPI -kmm_get_module_info_i(kmm_module vm, kmm_module_info * info) { - kmm_module_i * m; - khm_int32 rv; - - EnterCriticalSection(&cs_kmm); - if (!kmm_is_module(vm) || !info) - rv = KHM_ERROR_INVALID_PARAM; - else { - m = kmm_module_from_handle(vm); - - ZeroMemory(info, sizeof(*info)); - - info->reg.name = m->name; - info->reg.path = m->path; - info->reg.vendor = m->vendor; - - info->reg.n_plugins = m->plugin_count; - - info->state = m->state; - - info->h_module = vm; - - info->file_version = m->file_version; - info->product_version = m->prod_version; - kmm_hold_module(vm); - - rv = KHM_ERROR_SUCCESS; - } - LeaveCriticalSection(&cs_kmm); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -kmm_release_module_info_i(kmm_module_info * info) { - if (info->h_module) - kmm_release_module(info->h_module); - - ZeroMemory(info, sizeof(*info)); - - return KHM_ERROR_SUCCESS; -} - - -KHMEXP khm_int32 KHMAPI -kmm_unload_module(kmm_module module) { - - if(!kmm_is_module(module)) - return KHM_ERROR_INVALID_PARAM; - - kmm_hold_module(module); - kmq_post_message(KMSG_KMM, - KMSG_KMM_I_REG, - KMM_REG_EXIT_MODULE, - (void *) kmm_module_from_handle(module)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kmm_load_default_modules(void) { - khm_handle csm = NULL; - khm_handle cs_mod = NULL; - khm_int32 rv; - wchar_t buf[KMM_MAXCCH_NAME]; - khm_size s; - - rv = kmm_get_modules_config(0, &csm); - if(KHM_FAILED(rv)) - return rv; - - _begin_task(KHERR_CF_TRANSITIVE); - _report_mr0(KHERR_NONE, MSG_LOAD_DEFAULT); - _describe(); - - kmmint_add_to_module_queue(); - - while(KHM_SUCCEEDED(khc_enum_subspaces(csm, cs_mod, &cs_mod))) { - - s = sizeof(buf); - if (KHM_FAILED(khc_get_config_space_name(cs_mod, buf, &s))) - continue; - - /* check for schema subspace. This is not an actual module. */ - if (!wcscmp(buf, L"_Schema")) - continue; - - kmm_load_module(buf, 0, NULL); - } - - kmmint_remove_from_module_queue(); - - if(csm) - khc_close_space(csm); - - _end_task(); - - return rv; -} - -#ifdef _WIN32 -KHMEXP HMODULE KHMAPI -kmm_get_hmodule(kmm_module m) -{ - if(!kmm_is_module(m)) - return NULL; - else - return kmm_module_from_handle(m)->h_module; -} -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +/* should only be accessed from the registrar thread */ +khm_size kmm_active_modules = 0; + +kmm_module_i * kmmint_get_module_i(wchar_t * name) +{ + kmm_module_i * m; + size_t sz; + + if(FAILED(StringCbLength(name, KMM_MAXCB_NAME, &sz))) + return NULL; + sz += sizeof(wchar_t); + + EnterCriticalSection(&cs_kmm); + m = (kmm_module_i *) hash_lookup(hash_modules, (void *) name); + + if(m == NULL) { + m = PMALLOC(sizeof(kmm_module_i)); + ZeroMemory(m, sizeof(kmm_module_i)); + + m->magic = KMM_MODULE_MAGIC; + m->name = PMALLOC(sz); + StringCbCopy(m->name, sz, name); + m->state = KMM_MODULE_STATE_NONE; + + hash_add(hash_modules, (void *) m->name, (void *) m); + LPUSH(&kmm_all_modules, m); + } + LeaveCriticalSection(&cs_kmm); + + return m; +} + +kmm_module_i * kmmint_find_module_i(wchar_t * name) +{ + kmm_module_i * m; + + EnterCriticalSection(&cs_kmm); + m = (kmm_module_i *) hash_lookup(hash_modules, (void *) name); + LeaveCriticalSection(&cs_kmm); + + return m; +} + +/* called with cs_kmm held */ +void kmmint_free_module(kmm_module_i * m) +{ + m->magic = 0; + + hash_del(hash_modules, m->name); + LDELETE(&kmm_all_modules, m); + + if (m->name) + PFREE(m->name); + + if (m->description) + PFREE(m->description); + + if (m->path) + PFREE(m->path); + + if (m->vendor) + PFREE(m->vendor); + + if (m->support) + PFREE(m->support); + + if (m->version_info) + PFREE(m->version_info); + + PFREE(m); +} + +KHMEXP khm_int32 KHMAPI kmm_hold_module(kmm_module module) +{ + if(!kmm_is_module(module)) + return KHM_ERROR_INVALID_PARAM; + EnterCriticalSection(&cs_kmm); + kmm_module_from_handle(module)->refcount++; + LeaveCriticalSection(&cs_kmm); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kmm_release_module(kmm_module vm) +{ + kmm_module_i * m; + + if(!kmm_is_module(vm)) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_kmm); + m = kmm_module_from_handle(vm); + if(! --(m->refcount)) + { + /* note that a 0 ref count means that there are no active + plugins */ + kmmint_free_module(m); + } + LeaveCriticalSection(&cs_kmm); + return KHM_ERROR_SUCCESS; +} + +khm_int32 +kmmint_check_api_version(DWORD v) { + /* for now, we allow API versions in the range + KH_VERSION_API_MINCOMPAT through KH_VERSION_API, inclusive. In + the future when we are swamped with so much time that we don't + know what to do with it, we can actually parse the + apiversion.txt file and create a compatibility table which we + can check against the functions used by the module and decide + whether or not it is compatible. */ + + if (v < KH_VERSION_API_MINCOMPAT || + v > KH_VERSION_API) + return KHM_ERROR_INCOMPATIBLE; + else + return KHM_ERROR_SUCCESS; +} + +struct lang_code { + WORD language; + WORD codepage; +}; + +khm_int32 +kmmint_read_module_info(kmm_module_i * m) { + /* the only fields we can count on at this point are m->name and + m->path */ + DWORD t; + size_t cb; + WORD lang; + khm_int32 rv = KHM_ERROR_SUCCESS; + struct lang_code *languages; + int n_languages; + int i; + wchar_t resname[256]; /* the resource names are a lot shorter */ + wchar_t * r; + VS_FIXEDFILEINFO *vff; + + assert(m->name); + assert(m->path); + + t = TRUE; + cb = GetFileVersionInfoSize(m->path, + &t); + /* if successful, cb gets the size in bytes of the version info + structure and sets t to zero */ + if (t) { + return KHM_ERROR_NOT_FOUND; + } else if (cb == 0) { + _report_mr1(KHERR_WARNING, MSG_RMI_NOT_FOUND, _dupstr(m->path)); + return KHM_ERROR_INVALID_PARAM; + } + + if (m->version_info) { + PFREE(m->version_info); + m->version_info = NULL; + } + + m->version_info = PMALLOC(cb); +#ifdef DEBUG + assert(m->version_info); +#endif + + if(!GetFileVersionInfo(m->path, + t, (DWORD) cb, m->version_info)) { + rv = KHM_ERROR_NOT_FOUND; + _report_mr1(KHERR_WARNING, MSG_RMI_NOT_FOUND, _dupstr(m->path)); + _location(L"GetFileVersionInfo"); + goto _cleanup; + } + + if(!VerQueryValue(m->version_info, + L"\\VarFileInfo\\Translation", + (LPVOID*) &languages, + &cb)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_NO_TRANS, _dupstr(m->path)); + _location(L"VerQueryValue"); + goto _cleanup; + } + + n_languages = (int) (cb / sizeof(*languages)); + + /* Try searching for the user's default language first */ + lang = GetUserDefaultLangID(); + for (i = 0; i < n_languages; i++) { + if(languages[i].language == lang) + break; + } + + /* If not, try the system default */ + if (i >= n_languages) { + lang = GetSystemDefaultLangID(); + for (i=0; i= n_languages) { + lang = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); + for (i=0; i= n_languages) { + lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); + for (i=0; i= n_languages) { + i = 0; + } + + if (i >= n_languages) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr0(KHERR_WARNING, MSG_RMI_NO_LOCAL); + goto _cleanup; + } + + /* check module name */ + StringCbPrintf(resname, sizeof(resname), + L"\\StringFileInfo\\%04x%04x\\" TEXT(NIMV_MODULE), + languages[i].language, + languages[i].codepage); + + if (!VerQueryValue(m->version_info, + resname, (LPVOID *) &r, &cb)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, + _cstr(TEXT(NIMV_MODULE))); + goto _cleanup; + } + + if (cb > KMM_MAXCB_NAME || + FAILED(StringCbLength(r, KMM_MAXCB_NAME, &cb))) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, + _cstr(TEXT(NIMV_MODULE))); + goto _cleanup; + } + + if (wcscmp(r, m->name)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr2(KHERR_WARNING, MSG_RMI_MOD_MISMATCH, + _dupstr(r), _dupstr(m->name)); + goto _cleanup; + } + + /* check API version */ + StringCbPrintf(resname, sizeof(resname), + L"\\StringFileInfo\\%04x%04x\\" TEXT(NIMV_APIVER), + languages[i].language, + languages[i].codepage); + + if (!VerQueryValue(m->version_info, + resname, (LPVOID *) &r, &cb)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, + _cstr(TEXT(NIMV_APIVER))); + goto _cleanup; + } + + if (cb > KMM_MAXCB_NAME || + FAILED(StringCbLength(r, KMM_MAXCB_NAME, &cb))) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, + _cstr(TEXT(NIMV_APIVER))); + goto _cleanup; + } + + t = wcstol(r, NULL, 10); + + rv = kmmint_check_api_version(t); + + if (KHM_FAILED(rv)) { + _report_mr2(KHERR_WARNING, MSG_RMI_API_MISMATCH, + _int32(t), _int32(KH_VERSION_API)); + goto _cleanup; + } + + /* Looks good. Now load the description, copyright, support URI + and file versions */ + if (m->description) { + PFREE(m->description); + m->description = NULL; + } + + StringCbPrintf(resname, sizeof(resname), + L"\\StringFileInfo\\%04x%04x\\FileDescription", + languages[i].language, + languages[i].codepage); + + if (!VerQueryValue(m->version_info, + resname, (LPVOID *) &r, &cb)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, + _cstr(L"FileDescription")); + goto _cleanup; + } + + if (cb > KMM_MAXCB_DESC || + FAILED(StringCbLength(r, KMM_MAXCB_DESC, &cb))) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, + _cstr(L"FileDescription")); + goto _cleanup; + } + + cb += sizeof(wchar_t); + + m->description = PMALLOC(cb); +#ifdef DEBUG + assert(m->description); +#endif + StringCbCopy(m->description, cb, r); + + /* on to the support URI */ + if (m->support) { + PFREE(m->support); + m->support = NULL; + } + + StringCbPrintf(resname, sizeof(resname), + L"\\StringFileInfo\\%04x%04x\\" TEXT(NIMV_SUPPORT), + languages[i].language, + languages[i].codepage); + + if (!VerQueryValue(m->version_info, + resname, (LPVOID *) &r, &cb)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, + _cstr(TEXT(NIMV_SUPPORT))); + goto _cleanup; + } + + if (cb > KMM_MAXCB_SUPPORT || + FAILED(StringCbLength(r, KMM_MAXCB_SUPPORT, &cb))) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, + _cstr(TEXT(NIMV_SUPPORT))); + goto _cleanup; + } + + cb += sizeof(wchar_t); + + m->support = PMALLOC(cb); +#ifdef DEBUG + assert(m->support); +#endif + StringCbCopy(m->support, cb, r); + + /* the vendor/copyright */ + if (m->vendor) { + PFREE(m->vendor); + m->vendor = NULL; + } + + StringCbPrintf(resname, sizeof(resname), + L"\\StringFileInfo\\%04x%04x\\LegalCopyright", + languages[i].language, + languages[i].codepage); + + if (!VerQueryValue(m->version_info, + resname, (LPVOID *) &r, &cb)) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, + _cstr(L"LegalCopyright")); + goto _cleanup; + } + + if (cb > KMM_MAXCB_SUPPORT || + FAILED(StringCbLength(r, KMM_MAXCB_SUPPORT, &cb))) { + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_TOO_LONG, + _cstr(L"LegalCopyright")); + goto _cleanup; + } + + cb += sizeof(wchar_t); + + m->vendor = PMALLOC(cb); +#ifdef DEBUG + assert(m->vendor); +#endif + StringCbCopy(m->vendor, cb, r); + + if (!VerQueryValue(m->version_info, + L"\\", + (LPVOID *) &vff, + &cb) || + cb != sizeof(*vff)) { + + rv = KHM_ERROR_INVALID_PARAM; + _report_mr1(KHERR_WARNING, MSG_RMI_RES_MISSING, + _cstr(L"Fixed Version Info")); + goto _cleanup; + } + + m->file_version.major = HIWORD(vff->dwFileVersionMS); + m->file_version.minor = LOWORD(vff->dwFileVersionMS); + m->file_version.patch = HIWORD(vff->dwFileVersionLS); + m->file_version.aux = LOWORD(vff->dwFileVersionLS); + + m->prod_version.major = HIWORD(vff->dwProductVersionMS); + m->prod_version.minor = LOWORD(vff->dwProductVersionMS); + m->prod_version.patch = HIWORD(vff->dwProductVersionLS); + m->prod_version.aux = LOWORD(vff->dwProductVersionLS); + + rv = KHM_ERROR_SUCCESS; + + _cleanup: + if (KHM_FAILED(rv)) { + if (m->version_info) { + PFREE(m->version_info); + m->version_info = NULL; + } + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI kmm_load_module(wchar_t * modname, + khm_int32 flags, + kmm_module * result) +{ + kmm_module_i * m = NULL; + kmm_module_i * mi; + size_t cbsize; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(FAILED(StringCbLength(modname, KMM_MAXCB_NAME, &cbsize))) + return KHM_ERROR_INVALID_PARAM; + cbsize += sizeof(wchar_t); + + EnterCriticalSection(&cs_kmm); + mi = kmmint_find_module_i(modname); + + if(mi != NULL) { + kmm_hold_module(kmm_handle_from_module(mi)); + /* check if the module has either failed to load either or if + it has been terminated. If so, we try once again to load the + module. */ + if(!(flags & KMM_LM_FLAG_NOLOAD) && + (mi->state < 0 || mi->state == KMM_MODULE_STATE_EXITED)) + { + mi->state = KMM_MODULE_STATE_PREINIT; + } + } + LeaveCriticalSection(&cs_kmm); + + if(flags & KMM_LM_FLAG_NOLOAD) { + if(result) + *result = mi; + else if(mi) + kmm_release_module(kmm_handle_from_module(mi)); + + return (mi)? KHM_ERROR_SUCCESS: KHM_ERROR_NOT_FOUND; + } + + if(mi) { + m = mi; + } else { + m = kmmint_get_module_i(modname); + m->state = KMM_MODULE_STATE_PREINIT; + kmm_hold_module(kmm_handle_from_module(m)); + } + + /* the module is already running or is already being + worked on by the registrar */ + if(m->state != KMM_MODULE_STATE_PREINIT) { + if(result) + *result = kmm_handle_from_module(m); + else + kmm_release_module(kmm_handle_from_module(m)); + + return KHM_ERROR_EXISTS; + } + + kmmint_add_to_module_queue(); + + if(flags & KMM_LM_FLAG_SYNC) { + kmm_hold_module(kmm_handle_from_module(m)); + kmq_send_message(KMSG_KMM, + KMSG_KMM_I_REG, + KMM_REG_INIT_MODULE, + (void*) m); + if(m->state <= 0) { + /* failed to load ? */ + if(m->state == KMM_MODULE_STATE_FAIL_NOT_FOUND) + rv = KHM_ERROR_NOT_FOUND; + else if(m->state == KMM_MODULE_STATE_FAIL_SIGNATURE) + rv = KHM_ERROR_INVALID_SIGNATURE; + else + rv = KHM_ERROR_UNKNOWN; + + kmm_release_module(kmm_handle_from_module(m)); + if(result) + *result = NULL; + } else { + if(result) + *result = kmm_handle_from_module(m); + else + kmm_release_module(kmm_handle_from_module(m)); + } + } else { + kmm_hold_module(kmm_handle_from_module(m)); + kmq_post_message(KMSG_KMM, + KMSG_KMM_I_REG, + KMM_REG_INIT_MODULE, + (void*) m); + if(result) + *result = kmm_handle_from_module(m); + else + kmm_release_module(kmm_handle_from_module(m)); + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_get_module_state(kmm_module m) +{ + if(!kmm_is_module(m)) + return KMM_MODULE_STATE_NONE; + else + return kmm_module_from_handle(m)->state; +} + +KHMEXP khm_int32 KHMAPI +kmm_get_module_info_i(kmm_module vm, kmm_module_info * info) { + kmm_module_i * m; + khm_int32 rv; + + EnterCriticalSection(&cs_kmm); + if (!kmm_is_module(vm) || !info) + rv = KHM_ERROR_INVALID_PARAM; + else { + m = kmm_module_from_handle(vm); + + ZeroMemory(info, sizeof(*info)); + + info->reg.name = m->name; + info->reg.path = m->path; + info->reg.vendor = m->vendor; + + info->reg.n_plugins = m->plugin_count; + + info->state = m->state; + + info->h_module = vm; + + info->file_version = m->file_version; + info->product_version = m->prod_version; + kmm_hold_module(vm); + + rv = KHM_ERROR_SUCCESS; + } + LeaveCriticalSection(&cs_kmm); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +kmm_release_module_info_i(kmm_module_info * info) { + if (info->h_module) + kmm_release_module(info->h_module); + + ZeroMemory(info, sizeof(*info)); + + return KHM_ERROR_SUCCESS; +} + + +KHMEXP khm_int32 KHMAPI +kmm_unload_module(kmm_module module) { + + if(!kmm_is_module(module)) + return KHM_ERROR_INVALID_PARAM; + + kmm_hold_module(module); + kmq_post_message(KMSG_KMM, + KMSG_KMM_I_REG, + KMM_REG_EXIT_MODULE, + (void *) kmm_module_from_handle(module)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kmm_load_default_modules(void) { + khm_handle csm = NULL; + khm_handle cs_mod = NULL; + khm_int32 rv; + wchar_t buf[KMM_MAXCCH_NAME]; + khm_size s; + + rv = kmm_get_modules_config(0, &csm); + if(KHM_FAILED(rv)) + return rv; + + _begin_task(KHERR_CF_TRANSITIVE); + _report_mr0(KHERR_NONE, MSG_LOAD_DEFAULT); + _describe(); + + kmmint_add_to_module_queue(); + + while(KHM_SUCCEEDED(khc_enum_subspaces(csm, cs_mod, &cs_mod))) { + + s = sizeof(buf); + if (KHM_FAILED(khc_get_config_space_name(cs_mod, buf, &s))) + continue; + + /* check for schema subspace. This is not an actual module. */ + if (!wcscmp(buf, L"_Schema")) + continue; + + kmm_load_module(buf, 0, NULL); + } + + kmmint_remove_from_module_queue(); + + if(csm) + khc_close_space(csm); + + _end_task(); + + return rv; +} + +#ifdef _WIN32 +KHMEXP HMODULE KHMAPI +kmm_get_hmodule(kmm_module m) +{ + if(!kmm_is_module(m)) + return NULL; + else + return kmm_module_from_handle(m)->h_module; +} +#endif --- krb5-1.4.4.orig/src/windows/identity/kmm/kplugin.h +++ krb5-1.4.4/src/windows/identity/kmm/kplugin.h @@ -1,146 +1,146 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KPLUGIN_H -#define __KHIMAIRA_KPLUGIN_H - -#include -#include - -/*! \addtogroup kmm -@{*/ -/*! \defgroup kplugin NetIDMgr Plugin Callbacks - -See the following related documentation pages for more information -about NetIDMgr plugins. - -These are prototypes of functions that must be implemented by a NetIDMgr -plugin. - -- \ref plugins -@{*/ - -/*! \brief Initialize the module - - This is the first callback function to be called in a module. - Perform all the required intialization when this is called. As - mentioned in \ref plugins, you should not attempt to call any - NetIDMgr API function from DLLMain or other initialization code - other than this one. - - You should use this call back to register the plugins that will be - implemented in this module and to notify the plugin manager of any - resource libraries that this module will use. - - Call: - - kmm_set_locale() : to set the notify the plugin manager of the - locale specifc resource libraries that are used by this module. - - kmm_provide_plugin() : to register each plugin that is - implemented in this module. - - This function is called in the context of the current user, from - the plug-in manager thread. This same thread is used by the - plug-in manager to load and initialize all the modules for a - session. - - The name of the callback must be init_module(). The calling - convention is KHMAPI, which is currently __stdcall. - - If this function does not register any plugins, the plugin manager - will immediately call exit_module() and unload the module even if - the init_module() function completes successfully. - - \return Return the following values to indicate whether the module - successfully initialized or not. - - KHM_ERROR_SUCCESS : Succeeded. The module manager will call - init_plugin() for each of the registered plugins for the - module. - - any other error code: Signals that the module did not - successfully initialize. The plugin manager will - immediately call exit_module() and then unload the module. - - \note This callback is required. -*/ -KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module); - -/*! \brief Type for init_module() */ -typedef khm_int32 (KHMAPI *init_module_t)(kmm_module); - -#if defined(_WIN64) -#define EXP_INIT_MODULE "init_module" -#elif defined(_WIN32) -#define EXP_INIT_MODULE "_init_module@4" -#else -#error EXP_INIT_MODULE not defined for platform -#endif - -/*! \brief Plugin procedure - - This is the message processor for a plugin. See \ref pi_fw_pnm_p - for more information. - - Essentially, this is a message subscriber for KMQ messages. -*/ -KHMEXP khm_int32 KHMAPI _plugin_proc(khm_int32 msg_type, khm_int32 msg_subtype, khm_ui_4 uparam, void * vparam); - -/*! \brief Type for init_plugin() */ -typedef kmq_callback_t _plugin_proc_t; - -/*! \brief Exit a module - - This is the last callback function that the NetIDMgr module - manager calls before unloading the module. When this function is - called, all of the plugins for the module have already been - stopped. However, any localization libraries that were loaded as - a result of init_module() calling kmm_set_locale_info() will still - be loaded. These localization libraries will be unloaded - immediately after this callback returns. - - Use this callback to perform any required cleanup tasks. However, - it is advisable that each plugin perform its own cleanup tasks, - since each plugin may be stopped independently of others. - - \return The return value of this function is ignored. - - \note This callback is not required. -*/ -KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module); - -/*! \brief Type for exit_module() */ -typedef khm_int32 (KHMAPI *exit_module_t)(kmm_module); - -#if defined(_WIN64) -#define EXP_EXIT_MODULE "exit_module" -#elif defined(_WIN32) -#define EXP_EXIT_MODULE "_exit_module@4" -#else -#error EXP_EXIT_MODULE not defined for platform -#endif - -/*@}*/ -/*@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KPLUGIN_H +#define __KHIMAIRA_KPLUGIN_H + +#include +#include + +/*! \addtogroup kmm +@{*/ +/*! \defgroup kplugin NetIDMgr Plugin Callbacks + +See the following related documentation pages for more information +about NetIDMgr plugins. + +These are prototypes of functions that must be implemented by a NetIDMgr +plugin. + +- \ref plugins +@{*/ + +/*! \brief Initialize the module + + This is the first callback function to be called in a module. + Perform all the required intialization when this is called. As + mentioned in \ref plugins, you should not attempt to call any + NetIDMgr API function from DLLMain or other initialization code + other than this one. + + You should use this call back to register the plugins that will be + implemented in this module and to notify the plugin manager of any + resource libraries that this module will use. + + Call: + - kmm_set_locale() : to set the notify the plugin manager of the + locale specifc resource libraries that are used by this module. + - kmm_provide_plugin() : to register each plugin that is + implemented in this module. + + This function is called in the context of the current user, from + the plug-in manager thread. This same thread is used by the + plug-in manager to load and initialize all the modules for a + session. + + The name of the callback must be init_module(). The calling + convention is KHMAPI, which is currently __stdcall. + + If this function does not register any plugins, the plugin manager + will immediately call exit_module() and unload the module even if + the init_module() function completes successfully. + + \return Return the following values to indicate whether the module + successfully initialized or not. + - KHM_ERROR_SUCCESS : Succeeded. The module manager will call + init_plugin() for each of the registered plugins for the + module. + - any other error code: Signals that the module did not + successfully initialize. The plugin manager will + immediately call exit_module() and then unload the module. + + \note This callback is required. +*/ +KHMEXP khm_int32 KHMAPI init_module(kmm_module h_module); + +/*! \brief Type for init_module() */ +typedef khm_int32 (KHMAPI *init_module_t)(kmm_module); + +#if defined(_WIN64) +#define EXP_INIT_MODULE "init_module" +#elif defined(_WIN32) +#define EXP_INIT_MODULE "_init_module@4" +#else +#error EXP_INIT_MODULE not defined for platform +#endif + +/*! \brief Plugin procedure + + This is the message processor for a plugin. See \ref pi_fw_pnm_p + for more information. + + Essentially, this is a message subscriber for KMQ messages. +*/ +KHMEXP khm_int32 KHMAPI _plugin_proc(khm_int32 msg_type, khm_int32 msg_subtype, khm_ui_4 uparam, void * vparam); + +/*! \brief Type for init_plugin() */ +typedef kmq_callback_t _plugin_proc_t; + +/*! \brief Exit a module + + This is the last callback function that the NetIDMgr module + manager calls before unloading the module. When this function is + called, all of the plugins for the module have already been + stopped. However, any localization libraries that were loaded as + a result of init_module() calling kmm_set_locale_info() will still + be loaded. These localization libraries will be unloaded + immediately after this callback returns. + + Use this callback to perform any required cleanup tasks. However, + it is advisable that each plugin perform its own cleanup tasks, + since each plugin may be stopped independently of others. + + \return The return value of this function is ignored. + + \note This callback is not required. +*/ +KHMEXP khm_int32 KHMAPI exit_module(kmm_module h_module); + +/*! \brief Type for exit_module() */ +typedef khm_int32 (KHMAPI *exit_module_t)(kmm_module); + +#if defined(_WIN64) +#define EXP_EXIT_MODULE "exit_module" +#elif defined(_WIN32) +#define EXP_EXIT_MODULE "_exit_module@4" +#else +#error EXP_EXIT_MODULE not defined for platform +#endif + +/*@}*/ +/*@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/Makefile +++ krb5-1.4.4/src/windows/identity/Makefile @@ -1,204 +1,204 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# Copyright (c) 2006 Secure Endpoints Inc. -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -!ifdef ETAGRUN -all: finale doc -!else -all: finale -!endif - -MODULE=all -!include - -!ifndef CLEANRUN -!ifndef TESTRUN -!ifndef ETAGRUN - -# Define KH_NO_WX if the build should not fail on warnings. The -# default is to treat warnings as errors. - -#RMAKE=$(MAKECMD) /nologo all KH_NO_WX=1 -RMAKE=$(MAKECMD) /nologo all -RMAKE_W2K=$(MAKECMD) /nologo all KHBUILD_W2K=1 - -!else -RMAKE=$(MAKECMD) /nologo etag -RMAKE_W2K=echo Skipping W2K target for ETAGS run. -!endif -!else -RMAKE=$(MAKECMD) /nologo test -RMAKE_W2K=$(MAKECMD) /nologo test KHBUILD_W2K=1 -!endif -!else -RMAKE=$(MAKECMD) /nologo clean -RMAKE_W2K=$(MAKECMD) /nologo clean KHBUILD_W2K=1 -!endif - -start: - -config: start - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -include: config - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -util: include - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -kherr: util - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -kconfig: kherr - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -kmq: kconfig - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -kcreddb: kmq - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -kmm: kcreddb - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -help: kmm - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -uilib: help - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(RMAKE_W2K) - $(CD) .. - $(ECHO) -- Done with $@ - -nidmgrdll: uilib - $(ECHO) -- Entering $@ - $(CD) $@ - $(RMAKE) - $(RMAKE_W2K) - $(CD) .. - $(ECHO) -- Done with $@ - -ui: nidmgrdll - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(RMAKE_W2K) - $(CD) .. - $(ECHO) -- Done with $@ - -# Now build the plugins -plugincommon: ui - $(ECHO) -- Entering $@ - $(CD) plugins\common - $(RMAKE) - $(CD) ..\.. - $(ECHO) -- Done with $@ - -krb5plugin: plugincommon - $(ECHO) -- Entering $@ - $(CD) plugins\krb5 - $(RMAKE) - $(CD) ..\.. - $(ECHO) -- Done with $@ - -!ifndef NO_KRB4 -finale: krb4plugin - -krb4plugin: plugincommon - $(ECHO) -- Entering $@ - $(CD) plugins\krb4 - $(RMAKE) - $(CD) ..\.. - $(ECHO) -- Done with $@ -!endif - -!ifdef BUILD_AFS -finale: afsplugin - -afsplugin: plugincommon - $(ECHO) -- Entering $@ - $(CD) plugins\afs - $(RMAKE) - $(CD) ..\.. - $(ECHO) -- Done with $@ -!endif - -finale: krb5plugin - $(ECHO) -- Done. - -pdoc: - -doc: pdoc - $(ECHO) -- Entering $@: - $(CD) $@ - $(RMAKE) - $(CD) .. - $(ECHO) -- Done with $@ - -clean:: - $(MAKECMD) /nologo CLEANRUN=1 - -test:: - $(MAKECMD) /nologo TESTRUN=1 - -etags:: - $(RM) $(TAGFILE) - $(MAKECMD) /nologo ETAGRUN=1 +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# Copyright (c) 2006 Secure Endpoints Inc. +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +!ifdef ETAGRUN +all: finale doc +!else +all: finale +!endif + +MODULE=all +!include + +!ifndef CLEANRUN +!ifndef TESTRUN +!ifndef ETAGRUN + +# Define KH_NO_WX if the build should not fail on warnings. The +# default is to treat warnings as errors. + +#RMAKE=$(MAKECMD) /nologo all KH_NO_WX=1 +RMAKE=$(MAKECMD) /nologo all +RMAKE_W2K=$(MAKECMD) /nologo all KHBUILD_W2K=1 + +!else +RMAKE=$(MAKECMD) /nologo etag +RMAKE_W2K=echo Skipping W2K target for ETAGS run. +!endif +!else +RMAKE=$(MAKECMD) /nologo test +RMAKE_W2K=$(MAKECMD) /nologo test KHBUILD_W2K=1 +!endif +!else +RMAKE=$(MAKECMD) /nologo clean +RMAKE_W2K=$(MAKECMD) /nologo clean KHBUILD_W2K=1 +!endif + +start: + +config: start + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +include: config + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +util: include + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +kherr: util + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +kconfig: kherr + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +kmq: kconfig + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +kcreddb: kmq + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +kmm: kcreddb + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +help: kmm + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +uilib: help + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(RMAKE_W2K) + $(CD) .. + $(ECHO) -- Done with $@ + +nidmgrdll: uilib + $(ECHO) -- Entering $@ + $(CD) $@ + $(RMAKE) + $(RMAKE_W2K) + $(CD) .. + $(ECHO) -- Done with $@ + +ui: nidmgrdll + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(RMAKE_W2K) + $(CD) .. + $(ECHO) -- Done with $@ + +# Now build the plugins +plugincommon: ui + $(ECHO) -- Entering $@ + $(CD) plugins\common + $(RMAKE) + $(CD) ..\.. + $(ECHO) -- Done with $@ + +krb5plugin: plugincommon + $(ECHO) -- Entering $@ + $(CD) plugins\krb5 + $(RMAKE) + $(CD) ..\.. + $(ECHO) -- Done with $@ + +!ifndef NO_KRB4 +finale: krb4plugin + +krb4plugin: plugincommon + $(ECHO) -- Entering $@ + $(CD) plugins\krb4 + $(RMAKE) + $(CD) ..\.. + $(ECHO) -- Done with $@ +!endif + +!ifdef BUILD_AFS +finale: afsplugin + +afsplugin: plugincommon + $(ECHO) -- Entering $@ + $(CD) plugins\afs + $(RMAKE) + $(CD) ..\.. + $(ECHO) -- Done with $@ +!endif + +finale: krb5plugin + $(ECHO) -- Done. + +pdoc: + +doc: pdoc + $(ECHO) -- Entering $@: + $(CD) $@ + $(RMAKE) + $(CD) .. + $(ECHO) -- Done with $@ + +clean:: + $(MAKECMD) /nologo CLEANRUN=1 + +test:: + $(MAKECMD) /nologo TESTRUN=1 + +etags:: + $(RM) $(TAGFILE) + $(MAKECMD) /nologo ETAGRUN=1 --- krb5-1.4.4.orig/src/windows/identity/kmq/init.c +++ krb5-1.4.4/src/windows/identity/kmq/init.c @@ -1,251 +1,251 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -CRITICAL_SECTION cs_kmq_global; -kmq_timer kmq_queue_dead_timeout; -kmq_timer kmq_call_dead_timeout; - -kmq_queue * queues; - -LONG kmq_init_once = 0; - -void kmqint_init(void) { - khm_handle hconfig = NULL; - - queues = NULL; - - InitializeCriticalSection(&cs_kmq_global); - InitializeCriticalSection(&cs_kmq_msg); - InitializeCriticalSection(&cs_kmq_msg_ref); - - EnterCriticalSection(&cs_kmq_global); - khc_load_schema(NULL, schema_kmqconfig); - khc_open_space(NULL, KMQ_CONF_SPACE_NAME, KHM_PERM_READ, &hconfig); - if(hconfig) { - khm_int32 t = 0; - - khc_read_int32(hconfig, KMQ_CONF_QUEUE_DEAD_TIMEOUT_NAME, &t); - kmq_queue_dead_timeout = t; - - khc_read_int32(hconfig, KMQ_CONF_CALL_DEAD_TIMEOUT_NAME, &t); - kmq_call_dead_timeout = t; - - khc_close_space(hconfig); - } - kmqint_init_msg_types(); - LeaveCriticalSection(&cs_kmq_global); - - kmq_tls_queue = TlsAlloc(); -} - -void kmqint_exit(void) { - EnterCriticalSection(&cs_kmq_global); - kmqint_exit_msg_types(); - LeaveCriticalSection(&cs_kmq_global); - DeleteCriticalSection(&cs_kmq_msg); - DeleteCriticalSection(&cs_kmq_msg_ref); - DeleteCriticalSection(&cs_kmq_global); - - TlsFree(kmq_tls_queue); -} - -/*! \internal - \brief Preps a thread for use with kmq - \note Obtains ::cs_kmq_global - */ -void kmqint_attach_this_thread(void) { - kmq_queue * q; - - EnterCriticalSection(&cs_kmq_global); - - q = (kmq_queue *) TlsGetValue(kmq_tls_queue); - if(!q) { - q = PMALLOC(sizeof(kmq_queue)); - - InitializeCriticalSection(&q->cs); - q->thread = GetCurrentThreadId(); - QINIT(q); - LINIT(q); - q->wait_o = CreateEvent(NULL, FALSE, FALSE, NULL); - q->load = 0; - q->last_post = 0; - q->flags = 0; - - LPUSH(&queues, q); - - TlsSetValue(kmq_tls_queue, (LPVOID) q); - } - - LeaveCriticalSection(&cs_kmq_global); -} - -/*! \internal - \brief Detaches the current thread from kmq - \note Obtains ::cs_kmq_global - */ -void kmqint_detach_this_thread(void) { - kmq_queue * q; - - q = (kmq_queue *) TlsGetValue(kmq_tls_queue); - if(q) { - EnterCriticalSection(&q->cs); - q->flags |= KMQ_QUEUE_FLAG_DELETED; - LeaveCriticalSection(&q->cs); - - /* TODO: free up the queued messages */ - } -} - -HANDLE kmq_h_compl = NULL; -kmq_thread_id kmq_tid_compl; - -/* Message transfer */ -struct tag_kmq_msg_xfer { - QDCL(kmq_message); -} kmq_completion_xfer; - -HANDLE compl_wx; -BOOL compl_continue; -CRITICAL_SECTION cs_compl; - -DWORD WINAPI kmqint_completion_thread_proc(LPVOID p) { - kmq_message * m; - kherr_context * ctx; - - EnterCriticalSection(&cs_compl); - do { - - if (QTOP(&kmq_completion_xfer) == NULL) { - LeaveCriticalSection(&cs_compl); - WaitForSingleObject(compl_wx, INFINITE); - EnterCriticalSection(&cs_compl); - /* go through the loop again before checking the queue */ - } else { - QGET(&kmq_completion_xfer, &m); - LeaveCriticalSection(&cs_compl); - EnterCriticalSection(&cs_kmq_msg); - - ctx = m->err_ctx; - - if (ctx) - kherr_push_context(ctx); - - kmqint_put_message(m); - - if (ctx) - kherr_pop_context(); - - LeaveCriticalSection(&cs_kmq_msg); - EnterCriticalSection(&cs_compl); - } - - } while(compl_continue); - - LeaveCriticalSection(&cs_compl); - - ExitThread(0); - - /* not reached */ - return 0; -} - -int kmqint_call_completion_handler(kmq_msg_completion_handler h, - kmq_message * m) { - if (h == NULL) - return 0; - - /* We only dispatch to the completion thread if we are not the - completion thread. If calling the completion handler results - in more messages completing, then we just call the completion - handler directly. We also make an exception for completions - that happen before the message queue is properly intiailized. */ - - if (kmq_tid_compl != GetCurrentThreadId() && - kmq_h_compl != NULL) { - - EnterCriticalSection(&cs_compl); - QPUT(&kmq_completion_xfer, m); - SetEvent(compl_wx); - LeaveCriticalSection(&cs_compl); - - return 1; - - } else { - h(m); - - return 0; - } -} - -KHMEXP khm_int32 KHMAPI kmq_init(void) { - if (InterlockedIncrement(&kmq_init_once) == 1) { - EnterCriticalSection(&cs_kmq_global); - - InitializeCriticalSection(&cs_compl); - compl_wx = CreateEvent(NULL, FALSE, FALSE, NULL); - compl_continue = TRUE; - QINIT(&kmq_completion_xfer); - - kmq_h_compl = CreateThread(NULL, - 0, - kmqint_completion_thread_proc, - NULL, - 0, - &kmq_tid_compl); - - assert(kmq_h_compl != NULL); - - LeaveCriticalSection(&cs_kmq_global); - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kmq_exit(void) { - if (InterlockedDecrement(&kmq_init_once) == 0) { - - EnterCriticalSection(&cs_compl); - compl_continue = FALSE; - SetEvent(compl_wx); - LeaveCriticalSection(&cs_compl); - - WaitForSingleObject(kmq_h_compl, INFINITE); - - EnterCriticalSection(&cs_kmq_global); - CloseHandle(kmq_h_compl); - kmq_h_compl = NULL; - kmq_tid_compl = 0; - CloseHandle(compl_wx); - DeleteCriticalSection(&cs_compl); - LeaveCriticalSection(&cs_kmq_global); - } - - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +CRITICAL_SECTION cs_kmq_global; +kmq_timer kmq_queue_dead_timeout; +kmq_timer kmq_call_dead_timeout; + +kmq_queue * queues; + +LONG kmq_init_once = 0; + +void kmqint_init(void) { + khm_handle hconfig = NULL; + + queues = NULL; + + InitializeCriticalSection(&cs_kmq_global); + InitializeCriticalSection(&cs_kmq_msg); + InitializeCriticalSection(&cs_kmq_msg_ref); + + EnterCriticalSection(&cs_kmq_global); + khc_load_schema(NULL, schema_kmqconfig); + khc_open_space(NULL, KMQ_CONF_SPACE_NAME, KHM_PERM_READ, &hconfig); + if(hconfig) { + khm_int32 t = 0; + + khc_read_int32(hconfig, KMQ_CONF_QUEUE_DEAD_TIMEOUT_NAME, &t); + kmq_queue_dead_timeout = t; + + khc_read_int32(hconfig, KMQ_CONF_CALL_DEAD_TIMEOUT_NAME, &t); + kmq_call_dead_timeout = t; + + khc_close_space(hconfig); + } + kmqint_init_msg_types(); + LeaveCriticalSection(&cs_kmq_global); + + kmq_tls_queue = TlsAlloc(); +} + +void kmqint_exit(void) { + EnterCriticalSection(&cs_kmq_global); + kmqint_exit_msg_types(); + LeaveCriticalSection(&cs_kmq_global); + DeleteCriticalSection(&cs_kmq_msg); + DeleteCriticalSection(&cs_kmq_msg_ref); + DeleteCriticalSection(&cs_kmq_global); + + TlsFree(kmq_tls_queue); +} + +/*! \internal + \brief Preps a thread for use with kmq + \note Obtains ::cs_kmq_global + */ +void kmqint_attach_this_thread(void) { + kmq_queue * q; + + EnterCriticalSection(&cs_kmq_global); + + q = (kmq_queue *) TlsGetValue(kmq_tls_queue); + if(!q) { + q = PMALLOC(sizeof(kmq_queue)); + + InitializeCriticalSection(&q->cs); + q->thread = GetCurrentThreadId(); + QINIT(q); + LINIT(q); + q->wait_o = CreateEvent(NULL, FALSE, FALSE, NULL); + q->load = 0; + q->last_post = 0; + q->flags = 0; + + LPUSH(&queues, q); + + TlsSetValue(kmq_tls_queue, (LPVOID) q); + } + + LeaveCriticalSection(&cs_kmq_global); +} + +/*! \internal + \brief Detaches the current thread from kmq + \note Obtains ::cs_kmq_global + */ +void kmqint_detach_this_thread(void) { + kmq_queue * q; + + q = (kmq_queue *) TlsGetValue(kmq_tls_queue); + if(q) { + EnterCriticalSection(&q->cs); + q->flags |= KMQ_QUEUE_FLAG_DELETED; + LeaveCriticalSection(&q->cs); + + /* TODO: free up the queued messages */ + } +} + +HANDLE kmq_h_compl = NULL; +kmq_thread_id kmq_tid_compl; + +/* Message transfer */ +struct tag_kmq_msg_xfer { + QDCL(kmq_message); +} kmq_completion_xfer; + +HANDLE compl_wx; +BOOL compl_continue; +CRITICAL_SECTION cs_compl; + +DWORD WINAPI kmqint_completion_thread_proc(LPVOID p) { + kmq_message * m; + kherr_context * ctx; + + EnterCriticalSection(&cs_compl); + do { + + if (QTOP(&kmq_completion_xfer) == NULL) { + LeaveCriticalSection(&cs_compl); + WaitForSingleObject(compl_wx, INFINITE); + EnterCriticalSection(&cs_compl); + /* go through the loop again before checking the queue */ + } else { + QGET(&kmq_completion_xfer, &m); + LeaveCriticalSection(&cs_compl); + EnterCriticalSection(&cs_kmq_msg); + + ctx = m->err_ctx; + + if (ctx) + kherr_push_context(ctx); + + kmqint_put_message(m); + + if (ctx) + kherr_pop_context(); + + LeaveCriticalSection(&cs_kmq_msg); + EnterCriticalSection(&cs_compl); + } + + } while(compl_continue); + + LeaveCriticalSection(&cs_compl); + + ExitThread(0); + + /* not reached */ + return 0; +} + +int kmqint_call_completion_handler(kmq_msg_completion_handler h, + kmq_message * m) { + if (h == NULL) + return 0; + + /* We only dispatch to the completion thread if we are not the + completion thread. If calling the completion handler results + in more messages completing, then we just call the completion + handler directly. We also make an exception for completions + that happen before the message queue is properly intiailized. */ + + if (kmq_tid_compl != GetCurrentThreadId() && + kmq_h_compl != NULL) { + + EnterCriticalSection(&cs_compl); + QPUT(&kmq_completion_xfer, m); + SetEvent(compl_wx); + LeaveCriticalSection(&cs_compl); + + return 1; + + } else { + h(m); + + return 0; + } +} + +KHMEXP khm_int32 KHMAPI kmq_init(void) { + if (InterlockedIncrement(&kmq_init_once) == 1) { + EnterCriticalSection(&cs_kmq_global); + + InitializeCriticalSection(&cs_compl); + compl_wx = CreateEvent(NULL, FALSE, FALSE, NULL); + compl_continue = TRUE; + QINIT(&kmq_completion_xfer); + + kmq_h_compl = CreateThread(NULL, + 0, + kmqint_completion_thread_proc, + NULL, + 0, + &kmq_tid_compl); + + assert(kmq_h_compl != NULL); + + LeaveCriticalSection(&cs_kmq_global); + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kmq_exit(void) { + if (InterlockedDecrement(&kmq_init_once) == 0) { + + EnterCriticalSection(&cs_compl); + compl_continue = FALSE; + SetEvent(compl_wx); + LeaveCriticalSection(&cs_compl); + + WaitForSingleObject(kmq_h_compl, INFINITE); + + EnterCriticalSection(&cs_kmq_global); + CloseHandle(kmq_h_compl); + kmq_h_compl = NULL; + kmq_tid_compl = 0; + CloseHandle(compl_wx); + DeleteCriticalSection(&cs_compl); + LeaveCriticalSection(&cs_kmq_global); + } + + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/kmq/kmqmain.c +++ krb5-1.4.4/src/windows/identity/kmq/kmqmain.c @@ -1,47 +1,47 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -void -kmq_process_attach(void) { - kmqint_init(); -} - -void -kmq_process_detach(void) { - kmqint_exit(); -} - -void -kmq_thread_attach(void) { - kmqint_attach_this_thread(); -} - -void -kmq_thread_detach(void) { - kmqint_detach_this_thread(); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +void +kmq_process_attach(void) { + kmqint_init(); +} + +void +kmq_process_detach(void) { + kmqint_exit(); +} + +void +kmq_thread_attach(void) { + kmqint_attach_this_thread(); +} + +void +kmq_thread_detach(void) { + kmqint_detach_this_thread(); +} --- krb5-1.4.4.orig/src/windows/identity/kmq/Makefile +++ krb5-1.4.4/src/windows/identity/kmq/Makefile @@ -1,48 +1,48 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=kmq -!include <../config/Makefile.w32> - -INCFILES= \ - $(INCDIR)\kmq.h - -OBJFILES= \ - $(OBJ)\kmqmain.obj \ - $(OBJ)\init.obj \ - $(OBJ)\msgtype.obj \ - $(OBJ)\consumer.obj \ - $(OBJ)\publisher.obj \ - $(OBJ)\kmqconfig.obj - -SDKLIBFILES=\ - strsafe.lib - -$(OBJ)\kmqconfig.c: kmqconfig.csv $(CONFDIR)\csvschema.cfg - $(CCSV) $** $@ - -all: mkdirs $(INCFILES) $(OBJFILES) - -clean:: - $(RM) $(INCFILES) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=kmq +!include <../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\kmq.h + +OBJFILES= \ + $(OBJ)\kmqmain.obj \ + $(OBJ)\init.obj \ + $(OBJ)\msgtype.obj \ + $(OBJ)\consumer.obj \ + $(OBJ)\publisher.obj \ + $(OBJ)\kmqconfig.obj + +SDKLIBFILES=\ + strsafe.lib + +$(OBJ)\kmqconfig.c: kmqconfig.csv $(CONFDIR)\csvschema.cfg + $(CCSV) $** $@ + +all: mkdirs $(INCFILES) $(OBJFILES) + +clean:: + $(RM) $(INCFILES) --- krb5-1.4.4.orig/src/windows/identity/kmq/consumer.c +++ krb5-1.4.4/src/windows/identity/kmq/consumer.c @@ -1,471 +1,471 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -DWORD kmq_tls_queue; - -CRITICAL_SECTION cs_kmq_msg_ref; - -kmq_message_ref * kmq_msg_ref_free = NULL; - -/* ad-hoc subscriptions */ -kmq_msg_subscription * kmq_adhoc_subs = NULL; - -/*! \internal - \brief Get a message ref object - \note called with cs_kmq_msg_ref held */ -kmq_message_ref * kmqint_get_message_ref(void) { - kmq_message_ref * r; - - LPOP(&kmq_msg_ref_free, &r); - if(!r) { - r = PMALLOC(sizeof(kmq_message_ref)); - } - ZeroMemory(r, sizeof(kmq_message_ref)); - - r->msg = NULL; - r->recipient = NULL; - - return r; -} - -/*! \internal - \brief Free a message ref object - \note called with cs_kmq_msg_ref and cs_kmq_msg held */ -void kmqint_put_message_ref(kmq_message_ref * r) { - if(!r) - return; - if(r->msg) { - r->msg->refcount--; - r->msg = NULL; - } - LPUSH(&kmq_msg_ref_free, r); -} - -/*! \internal - \brief Get the queue associated with the current thread - \note Obtains ::cs_kmq_global - */ -kmq_queue * kmqint_get_thread_queue(void) { - kmq_queue * q; - - q = (kmq_queue *) TlsGetValue(kmq_tls_queue); - if(!q) { - kmqint_attach_this_thread(); - q = (kmq_queue *) TlsGetValue(kmq_tls_queue); - } - - return q; -} - -/*! \internal - \brief Get the topmost message ref for a queue - \note Obtains kmq_queue::cs - */ -void kmqint_get_queue_message_ref(kmq_queue * q, kmq_message_ref ** r) { - EnterCriticalSection(&q->cs); - QGET(q,r); - if(QTOP(q)) - SetEvent(q->wait_o); - LeaveCriticalSection(&q->cs); -} - -/*! \internal - \brief Post a message to a queue - \note Obtains ::cs_kmq_msg_ref, ::cs_kmq_msg, kmq_queue::cs - */ -void kmqint_post_queue(kmq_queue * q, kmq_message *m) { - kmq_message_ref *r; - - EnterCriticalSection(&cs_kmq_msg_ref); - r = kmqint_get_message_ref(); - LeaveCriticalSection(&cs_kmq_msg_ref); - - r->msg = m; - r->recipient = NULL; - - EnterCriticalSection(&cs_kmq_msg); - m->refcount++; - m->nSent++; - LeaveCriticalSection(&cs_kmq_msg); - - EnterCriticalSection(&q->cs); - QPUT(q,r); - SetEvent(q->wait_o); - LeaveCriticalSection(&q->cs); -} - -/*! \internal - \brief Post a message to a subscriber - \note Obtains ::cs_kmq_msg_ref, ::cs_kmq_msg, kmq_queue::cs - \note Should be called with ::cs_kmq_msg held - */ -void kmqint_post(kmq_msg_subscription * s, kmq_message * m, khm_boolean try_send) { - if(s->rcpt_type == KMQ_RCPTTYPE_CB) { - kmq_queue *q; - kmq_message_ref *r; - - q = s->queue; - - if(try_send && q->thread == GetCurrentThreadId()) { - khm_int32 rv; - /* we are sending a message from this thread to this - thread. just call the recipient directly, bypassing - the message queue. */ - m->refcount++; - m->nSent++; - if (IsBadCodePtr(s->recipient.cb)) { - rv = KHM_ERROR_INVALID_OPERATION; - } else { - if (IsBadCodePtr(s->recipient.cb)) - rv = KHM_ERROR_INVALID_OPERATION; - else - rv = s->recipient.cb(m->type, m->subtype, - m->uparam, m->vparam); - } - m->refcount--; - if(KHM_SUCCEEDED(rv)) - m->nCompleted++; - else - m->nFailed++; - } else { - EnterCriticalSection(&cs_kmq_msg_ref); - r = kmqint_get_message_ref(); - LeaveCriticalSection(&cs_kmq_msg_ref); - - r->msg = m; - r->recipient = s->recipient.cb; - - m->refcount++; - m->nSent++; - - EnterCriticalSection(&q->cs); - QPUT(q,r); - SetEvent(q->wait_o); - LeaveCriticalSection(&q->cs); - } - } - -#ifdef _WIN32 - else if(s->rcpt_type == KMQ_RCPTTYPE_HWND) { - m->refcount++; - - if(try_send && - GetCurrentThreadId() == GetWindowThreadProcessId(s->recipient.hwnd, - NULL)) { - /* kmqint_post does not know whether there are any other - messages waiting to be posted at this point. Hence, - simply sending the message is not the right thing to do - as the recipient may incorrectly assume that the - message has completed when (m->nCompleted + m->nFailed - == m->nSent). Therefore, we only increment nSent after - the message is sent. */ - SendMessage(s->recipient.hwnd, KMQ_WM_DISPATCH, - m->type, (LPARAM) m); - m->nSent++; - } else { - m->nSent++; - PostMessage(s->recipient.hwnd, KMQ_WM_DISPATCH, - m->type, (LPARAM) m); - } - } -#endif - - else { - /* This could either be because we were passed in an invalid - subscription or because we lost a race to a thread that - deleted an ad-hoc subscription. */ -#ifdef DEBUG - assert(FALSE); -#else - return; -#endif - } -} - -/*! \internal - \brief Subscribes a window to a message type - \note Obtains ::cs_kmq_types - */ -KHMEXP khm_int32 KHMAPI kmq_subscribe_hwnd(khm_int32 type, HWND hwnd) { - kmq_msg_subscription * s; - - s = PMALLOC(sizeof(kmq_msg_subscription)); - ZeroMemory(s, sizeof(*s)); - s->magic = KMQ_MSG_SUB_MAGIC; - LINIT(s); - s->queue = NULL; - s->rcpt_type = KMQ_RCPTTYPE_HWND; - s->recipient.hwnd = hwnd; - kmqint_msg_type_add_sub(type, s); - - return KHM_ERROR_SUCCESS; -} - -/*! \internal - \note Obtains ::cs_kmq_types, ::cs_kmq_global - */ -KHMEXP khm_int32 KHMAPI kmq_subscribe(khm_int32 type, kmq_callback_t cb) { - kmq_msg_subscription * s; - - s = PMALLOC(sizeof(kmq_msg_subscription)); - ZeroMemory(s, sizeof(*s)); - s->magic = KMQ_MSG_SUB_MAGIC; - LINIT(s); - s->queue = kmqint_get_thread_queue(); - s->rcpt_type = KMQ_RCPTTYPE_CB; - s->recipient.cb = cb; - kmqint_msg_type_add_sub(type, s); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kmq_create_hwnd_subscription(HWND hw, - khm_handle * result) -{ - kmq_msg_subscription * s; - - s = PMALLOC(sizeof(kmq_msg_subscription)); - ZeroMemory(s, sizeof(*s)); - s->magic = KMQ_MSG_SUB_MAGIC; - LINIT(s); - s->queue = NULL; - s->rcpt_type = KMQ_RCPTTYPE_HWND; - s->recipient.hwnd = hw; - - EnterCriticalSection(&cs_kmq_global); - LPUSH(&kmq_adhoc_subs, s); - LeaveCriticalSection(&cs_kmq_global); - - *result = (khm_handle) s; - - return KHM_ERROR_SUCCESS; -} - -/*! \internal - \note Obtains ::cs_kmq_global -*/ -KHMEXP khm_int32 KHMAPI kmq_create_subscription(kmq_callback_t cb, - khm_handle * result) -{ - kmq_msg_subscription * s; - - s = PMALLOC(sizeof(kmq_msg_subscription)); - ZeroMemory(s, sizeof(*s)); - s->magic = KMQ_MSG_SUB_MAGIC; - LINIT(s); - s->queue = kmqint_get_thread_queue(); - s->rcpt_type = KMQ_RCPTTYPE_CB; - s->recipient.cb = cb; - - EnterCriticalSection(&cs_kmq_global); - LPUSH(&kmq_adhoc_subs, s); - LeaveCriticalSection(&cs_kmq_global); - - *result = (khm_handle) s; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI kmq_delete_subscription(khm_handle sub) -{ - kmq_msg_subscription * s; - - s = (kmq_msg_subscription *) sub; - - assert(s->magic == KMQ_MSG_SUB_MAGIC); - - s->type = 0; - - EnterCriticalSection(&cs_kmq_global); - LDELETE(&kmq_adhoc_subs, s); - LeaveCriticalSection(&cs_kmq_global); - - PFREE(s); - - return KHM_ERROR_SUCCESS; -} - -/*! \internal - \brief Unsubscribes a window from a message type - \note Obtains ::cs_kmq_types - */ -KHMEXP khm_int32 KHMAPI kmq_unsubscribe_hwnd(khm_int32 type, HWND hwnd) { - kmq_msg_subscription * s; - - s = kmqint_msg_type_del_sub_hwnd(type, hwnd); - if(s) - PFREE(s); - return (s)?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; -} - -/*! \internal - \brief Unsubscribe a callback from a message type - \note Obtains ::cs_kmq_types, ::cs_kmq_global - */ -KHMEXP khm_int32 KHMAPI kmq_unsubscribe(khm_int32 type, kmq_callback_t cb) { - kmq_msg_subscription * s; - - s = kmqint_msg_type_del_sub_cb(type,cb); - if(s) - PFREE(s); - - return (s)?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; -} - -KHMEXP LRESULT KHMAPI kmq_wm_begin(LPARAM lparm, kmq_message ** m) { - *m = (kmq_message *) lparm; - if ((*m)->err_ctx) { - kherr_push_context((*m)->err_ctx); - } - return TRUE; -} - -/*! \internal - \note Obtains ::cs_kmq_msg - */ -KHMEXP LRESULT KHMAPI kmq_wm_end(kmq_message *m, khm_int32 rv) { - if (m->err_ctx) - kherr_pop_context(); - - EnterCriticalSection(&cs_kmq_msg); - m->refcount--; - if(KHM_SUCCEEDED(rv)) - m->nCompleted++; - else - m->nFailed++; - - if(m->nCompleted + m->nFailed == m->nSent) { - kmqint_put_message(m); - } - LeaveCriticalSection(&cs_kmq_msg); - - return TRUE; -} - -/*! \internal - \note Obtains ::cs_kmq_msg - */ -KHMEXP LRESULT KHMAPI kmq_wm_dispatch(LPARAM lparm, kmq_callback_t cb) { - kmq_message *m; - khm_int32 rv; - - m = (kmq_message *) lparm; - - if (m->err_ctx) - kherr_push_context(m->err_ctx); - - rv = cb(m->type, m->subtype, m->uparam, m->vparam); - - if (m->err_ctx) - kherr_pop_context(); - - EnterCriticalSection(&cs_kmq_msg); - - m->refcount--; - if(KHM_SUCCEEDED(rv)) - m->nCompleted++; - else - m->nFailed++; - - if(m->nCompleted + m->nFailed == m->nSent) { - kmqint_put_message(m); - } - LeaveCriticalSection(&cs_kmq_msg); - - return TRUE; -} - -/*! \internal - - \note Obtains ::cs_kmq_global, kmq_queue::cs, ::cs_kmq_msg_ref, ::cs_kmq_msg, -*/ -KHMEXP khm_int32 KHMAPI kmq_dispatch(kmq_timer timeout) { - kmq_queue * q; - kmq_message_ref * r; - kmq_message *m; - DWORD hr; - - q = kmqint_get_thread_queue(); - - assert(q->wait_o); - - hr = WaitForSingleObject(q->wait_o, timeout); - if(hr == WAIT_OBJECT_0) { - /* signalled */ - kmqint_get_queue_message_ref(q, &r); - - m = r->msg; - - if(m->type != KMSG_SYSTEM || m->subtype != KMSG_SYSTEM_EXIT) { - khm_boolean rv; - - if (m->err_ctx) - kherr_push_context(m->err_ctx); - - /* dispatch */ - rv = r->recipient(m->type, m->subtype, m->uparam, m->vparam); - - if (m->err_ctx) - kherr_pop_context(); - - EnterCriticalSection(&cs_kmq_msg); - EnterCriticalSection(&cs_kmq_msg_ref); - kmqint_put_message_ref(r); - LeaveCriticalSection(&cs_kmq_msg_ref); - - if(KHM_SUCCEEDED(rv)) - m->nCompleted++; - else - m->nFailed++; - - if(m->nCompleted + m->nFailed == m->nSent) { - kmqint_put_message(m); - } - LeaveCriticalSection(&cs_kmq_msg); - - return KHM_ERROR_SUCCESS; - } else { - EnterCriticalSection(&cs_kmq_msg); - EnterCriticalSection(&cs_kmq_msg_ref); - kmqint_put_message_ref(r); - LeaveCriticalSection(&cs_kmq_msg_ref); - m->nCompleted++; - if(m->nCompleted + m->nFailed == m->nSent) { - kmqint_put_message(m); - } - LeaveCriticalSection(&cs_kmq_msg); - - return KHM_ERROR_EXIT; - } - } else { - return KHM_ERROR_TIMEOUT; - } -} - -/* TODO: rename this file to subscriber.c */ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +DWORD kmq_tls_queue; + +CRITICAL_SECTION cs_kmq_msg_ref; + +kmq_message_ref * kmq_msg_ref_free = NULL; + +/* ad-hoc subscriptions */ +kmq_msg_subscription * kmq_adhoc_subs = NULL; + +/*! \internal + \brief Get a message ref object + \note called with cs_kmq_msg_ref held */ +kmq_message_ref * kmqint_get_message_ref(void) { + kmq_message_ref * r; + + LPOP(&kmq_msg_ref_free, &r); + if(!r) { + r = PMALLOC(sizeof(kmq_message_ref)); + } + ZeroMemory(r, sizeof(kmq_message_ref)); + + r->msg = NULL; + r->recipient = NULL; + + return r; +} + +/*! \internal + \brief Free a message ref object + \note called with cs_kmq_msg_ref and cs_kmq_msg held */ +void kmqint_put_message_ref(kmq_message_ref * r) { + if(!r) + return; + if(r->msg) { + r->msg->refcount--; + r->msg = NULL; + } + LPUSH(&kmq_msg_ref_free, r); +} + +/*! \internal + \brief Get the queue associated with the current thread + \note Obtains ::cs_kmq_global + */ +kmq_queue * kmqint_get_thread_queue(void) { + kmq_queue * q; + + q = (kmq_queue *) TlsGetValue(kmq_tls_queue); + if(!q) { + kmqint_attach_this_thread(); + q = (kmq_queue *) TlsGetValue(kmq_tls_queue); + } + + return q; +} + +/*! \internal + \brief Get the topmost message ref for a queue + \note Obtains kmq_queue::cs + */ +void kmqint_get_queue_message_ref(kmq_queue * q, kmq_message_ref ** r) { + EnterCriticalSection(&q->cs); + QGET(q,r); + if(QTOP(q)) + SetEvent(q->wait_o); + LeaveCriticalSection(&q->cs); +} + +/*! \internal + \brief Post a message to a queue + \note Obtains ::cs_kmq_msg_ref, ::cs_kmq_msg, kmq_queue::cs + */ +void kmqint_post_queue(kmq_queue * q, kmq_message *m) { + kmq_message_ref *r; + + EnterCriticalSection(&cs_kmq_msg_ref); + r = kmqint_get_message_ref(); + LeaveCriticalSection(&cs_kmq_msg_ref); + + r->msg = m; + r->recipient = NULL; + + EnterCriticalSection(&cs_kmq_msg); + m->refcount++; + m->nSent++; + LeaveCriticalSection(&cs_kmq_msg); + + EnterCriticalSection(&q->cs); + QPUT(q,r); + SetEvent(q->wait_o); + LeaveCriticalSection(&q->cs); +} + +/*! \internal + \brief Post a message to a subscriber + \note Obtains ::cs_kmq_msg_ref, ::cs_kmq_msg, kmq_queue::cs + \note Should be called with ::cs_kmq_msg held + */ +void kmqint_post(kmq_msg_subscription * s, kmq_message * m, khm_boolean try_send) { + if(s->rcpt_type == KMQ_RCPTTYPE_CB) { + kmq_queue *q; + kmq_message_ref *r; + + q = s->queue; + + if(try_send && q->thread == GetCurrentThreadId()) { + khm_int32 rv; + /* we are sending a message from this thread to this + thread. just call the recipient directly, bypassing + the message queue. */ + m->refcount++; + m->nSent++; + if (IsBadCodePtr(s->recipient.cb)) { + rv = KHM_ERROR_INVALID_OPERATION; + } else { + if (IsBadCodePtr(s->recipient.cb)) + rv = KHM_ERROR_INVALID_OPERATION; + else + rv = s->recipient.cb(m->type, m->subtype, + m->uparam, m->vparam); + } + m->refcount--; + if(KHM_SUCCEEDED(rv)) + m->nCompleted++; + else + m->nFailed++; + } else { + EnterCriticalSection(&cs_kmq_msg_ref); + r = kmqint_get_message_ref(); + LeaveCriticalSection(&cs_kmq_msg_ref); + + r->msg = m; + r->recipient = s->recipient.cb; + + m->refcount++; + m->nSent++; + + EnterCriticalSection(&q->cs); + QPUT(q,r); + SetEvent(q->wait_o); + LeaveCriticalSection(&q->cs); + } + } + +#ifdef _WIN32 + else if(s->rcpt_type == KMQ_RCPTTYPE_HWND) { + m->refcount++; + + if(try_send && + GetCurrentThreadId() == GetWindowThreadProcessId(s->recipient.hwnd, + NULL)) { + /* kmqint_post does not know whether there are any other + messages waiting to be posted at this point. Hence, + simply sending the message is not the right thing to do + as the recipient may incorrectly assume that the + message has completed when (m->nCompleted + m->nFailed + == m->nSent). Therefore, we only increment nSent after + the message is sent. */ + SendMessage(s->recipient.hwnd, KMQ_WM_DISPATCH, + m->type, (LPARAM) m); + m->nSent++; + } else { + m->nSent++; + PostMessage(s->recipient.hwnd, KMQ_WM_DISPATCH, + m->type, (LPARAM) m); + } + } +#endif + + else { + /* This could either be because we were passed in an invalid + subscription or because we lost a race to a thread that + deleted an ad-hoc subscription. */ +#ifdef DEBUG + assert(FALSE); +#else + return; +#endif + } +} + +/*! \internal + \brief Subscribes a window to a message type + \note Obtains ::cs_kmq_types + */ +KHMEXP khm_int32 KHMAPI kmq_subscribe_hwnd(khm_int32 type, HWND hwnd) { + kmq_msg_subscription * s; + + s = PMALLOC(sizeof(kmq_msg_subscription)); + ZeroMemory(s, sizeof(*s)); + s->magic = KMQ_MSG_SUB_MAGIC; + LINIT(s); + s->queue = NULL; + s->rcpt_type = KMQ_RCPTTYPE_HWND; + s->recipient.hwnd = hwnd; + kmqint_msg_type_add_sub(type, s); + + return KHM_ERROR_SUCCESS; +} + +/*! \internal + \note Obtains ::cs_kmq_types, ::cs_kmq_global + */ +KHMEXP khm_int32 KHMAPI kmq_subscribe(khm_int32 type, kmq_callback_t cb) { + kmq_msg_subscription * s; + + s = PMALLOC(sizeof(kmq_msg_subscription)); + ZeroMemory(s, sizeof(*s)); + s->magic = KMQ_MSG_SUB_MAGIC; + LINIT(s); + s->queue = kmqint_get_thread_queue(); + s->rcpt_type = KMQ_RCPTTYPE_CB; + s->recipient.cb = cb; + kmqint_msg_type_add_sub(type, s); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kmq_create_hwnd_subscription(HWND hw, + khm_handle * result) +{ + kmq_msg_subscription * s; + + s = PMALLOC(sizeof(kmq_msg_subscription)); + ZeroMemory(s, sizeof(*s)); + s->magic = KMQ_MSG_SUB_MAGIC; + LINIT(s); + s->queue = NULL; + s->rcpt_type = KMQ_RCPTTYPE_HWND; + s->recipient.hwnd = hw; + + EnterCriticalSection(&cs_kmq_global); + LPUSH(&kmq_adhoc_subs, s); + LeaveCriticalSection(&cs_kmq_global); + + *result = (khm_handle) s; + + return KHM_ERROR_SUCCESS; +} + +/*! \internal + \note Obtains ::cs_kmq_global +*/ +KHMEXP khm_int32 KHMAPI kmq_create_subscription(kmq_callback_t cb, + khm_handle * result) +{ + kmq_msg_subscription * s; + + s = PMALLOC(sizeof(kmq_msg_subscription)); + ZeroMemory(s, sizeof(*s)); + s->magic = KMQ_MSG_SUB_MAGIC; + LINIT(s); + s->queue = kmqint_get_thread_queue(); + s->rcpt_type = KMQ_RCPTTYPE_CB; + s->recipient.cb = cb; + + EnterCriticalSection(&cs_kmq_global); + LPUSH(&kmq_adhoc_subs, s); + LeaveCriticalSection(&cs_kmq_global); + + *result = (khm_handle) s; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI kmq_delete_subscription(khm_handle sub) +{ + kmq_msg_subscription * s; + + s = (kmq_msg_subscription *) sub; + + assert(s->magic == KMQ_MSG_SUB_MAGIC); + + s->type = 0; + + EnterCriticalSection(&cs_kmq_global); + LDELETE(&kmq_adhoc_subs, s); + LeaveCriticalSection(&cs_kmq_global); + + PFREE(s); + + return KHM_ERROR_SUCCESS; +} + +/*! \internal + \brief Unsubscribes a window from a message type + \note Obtains ::cs_kmq_types + */ +KHMEXP khm_int32 KHMAPI kmq_unsubscribe_hwnd(khm_int32 type, HWND hwnd) { + kmq_msg_subscription * s; + + s = kmqint_msg_type_del_sub_hwnd(type, hwnd); + if(s) + PFREE(s); + return (s)?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; +} + +/*! \internal + \brief Unsubscribe a callback from a message type + \note Obtains ::cs_kmq_types, ::cs_kmq_global + */ +KHMEXP khm_int32 KHMAPI kmq_unsubscribe(khm_int32 type, kmq_callback_t cb) { + kmq_msg_subscription * s; + + s = kmqint_msg_type_del_sub_cb(type,cb); + if(s) + PFREE(s); + + return (s)?KHM_ERROR_SUCCESS:KHM_ERROR_NOT_FOUND; +} + +KHMEXP LRESULT KHMAPI kmq_wm_begin(LPARAM lparm, kmq_message ** m) { + *m = (kmq_message *) lparm; + if ((*m)->err_ctx) { + kherr_push_context((*m)->err_ctx); + } + return TRUE; +} + +/*! \internal + \note Obtains ::cs_kmq_msg + */ +KHMEXP LRESULT KHMAPI kmq_wm_end(kmq_message *m, khm_int32 rv) { + if (m->err_ctx) + kherr_pop_context(); + + EnterCriticalSection(&cs_kmq_msg); + m->refcount--; + if(KHM_SUCCEEDED(rv)) + m->nCompleted++; + else + m->nFailed++; + + if(m->nCompleted + m->nFailed == m->nSent) { + kmqint_put_message(m); + } + LeaveCriticalSection(&cs_kmq_msg); + + return TRUE; +} + +/*! \internal + \note Obtains ::cs_kmq_msg + */ +KHMEXP LRESULT KHMAPI kmq_wm_dispatch(LPARAM lparm, kmq_callback_t cb) { + kmq_message *m; + khm_int32 rv; + + m = (kmq_message *) lparm; + + if (m->err_ctx) + kherr_push_context(m->err_ctx); + + rv = cb(m->type, m->subtype, m->uparam, m->vparam); + + if (m->err_ctx) + kherr_pop_context(); + + EnterCriticalSection(&cs_kmq_msg); + + m->refcount--; + if(KHM_SUCCEEDED(rv)) + m->nCompleted++; + else + m->nFailed++; + + if(m->nCompleted + m->nFailed == m->nSent) { + kmqint_put_message(m); + } + LeaveCriticalSection(&cs_kmq_msg); + + return TRUE; +} + +/*! \internal + + \note Obtains ::cs_kmq_global, kmq_queue::cs, ::cs_kmq_msg_ref, ::cs_kmq_msg, +*/ +KHMEXP khm_int32 KHMAPI kmq_dispatch(kmq_timer timeout) { + kmq_queue * q; + kmq_message_ref * r; + kmq_message *m; + DWORD hr; + + q = kmqint_get_thread_queue(); + + assert(q->wait_o); + + hr = WaitForSingleObject(q->wait_o, timeout); + if(hr == WAIT_OBJECT_0) { + /* signalled */ + kmqint_get_queue_message_ref(q, &r); + + m = r->msg; + + if(m->type != KMSG_SYSTEM || m->subtype != KMSG_SYSTEM_EXIT) { + khm_boolean rv; + + if (m->err_ctx) + kherr_push_context(m->err_ctx); + + /* dispatch */ + rv = r->recipient(m->type, m->subtype, m->uparam, m->vparam); + + if (m->err_ctx) + kherr_pop_context(); + + EnterCriticalSection(&cs_kmq_msg); + EnterCriticalSection(&cs_kmq_msg_ref); + kmqint_put_message_ref(r); + LeaveCriticalSection(&cs_kmq_msg_ref); + + if(KHM_SUCCEEDED(rv)) + m->nCompleted++; + else + m->nFailed++; + + if(m->nCompleted + m->nFailed == m->nSent) { + kmqint_put_message(m); + } + LeaveCriticalSection(&cs_kmq_msg); + + return KHM_ERROR_SUCCESS; + } else { + EnterCriticalSection(&cs_kmq_msg); + EnterCriticalSection(&cs_kmq_msg_ref); + kmqint_put_message_ref(r); + LeaveCriticalSection(&cs_kmq_msg_ref); + m->nCompleted++; + if(m->nCompleted + m->nFailed == m->nSent) { + kmqint_put_message(m); + } + LeaveCriticalSection(&cs_kmq_msg); + + return KHM_ERROR_EXIT; + } + } else { + return KHM_ERROR_TIMEOUT; + } +} + +/* TODO: rename this file to subscriber.c */ --- krb5-1.4.4.orig/src/windows/identity/kmq/publisher.c +++ krb5-1.4.4/src/windows/identity/kmq/publisher.c @@ -1,483 +1,483 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -CRITICAL_SECTION cs_kmq_msg; -kmq_message * msg_free = NULL; -kmq_message * msg_active = NULL; - -/*! \internal - \brief Get a message object - \note called with ::cs_kmq_msg held */ -kmq_message * -kmqint_get_message(void) { - kmq_message * m; - - LPOP(&msg_free,&m); - if(!m) { - /* allocate one */ - m = PMALLOC(sizeof(kmq_message)); - } - ZeroMemory((void*)m, sizeof(kmq_message)); - - LPUSH(&msg_active, m); - - return m; -} - -/*! \internal - \brief Frees a message object - \note called with ::cs_kmq_msg held - */ -void -kmqint_put_message(kmq_message *m) { - int queued; - /* we can only free a message if the refcount is zero. - Otherwise we have to wait until the call is freed. */ - if(m->refcount == 0) { - LDELETE(&msg_active, m); - LeaveCriticalSection(&cs_kmq_msg); - queued = kmqint_notify_msg_completion(m); - EnterCriticalSection(&cs_kmq_msg); - if (!queued) { - if(m->err_ctx) { - kherr_release_context(m->err_ctx); - m->err_ctx = NULL; - } - if(m->wait_o) { - CloseHandle(m->wait_o); - m->wait_o = NULL; - } - LPUSH(&msg_free,m); - } - } else if(m->wait_o) { - SetEvent(m->wait_o); - } -} - -/*! \internal - \note Obtains ::cs_kmq_msg, ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs - */ -KHMEXP khm_int32 KHMAPI -kmq_send_message(khm_int32 type, khm_int32 subtype, - khm_ui_4 uparam, void * blob) { - kmq_call c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - rv = kmqint_post_message_ex(type, subtype, uparam, blob, &c, TRUE); - if(KHM_FAILED(rv)) - return rv; - - rv = kmq_wait(c, INFINITE); - if(KHM_SUCCEEDED(rv) && c->nFailed > 0) - rv = KHM_ERROR_PARTIAL; - - kmq_free_call(c); - - return rv; -} - -/*! \internal - \note Obtains ::cs_kmq_msg, ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs - */ -KHMEXP khm_int32 KHMAPI -kmq_post_message(khm_int32 type, khm_int32 subtype, - khm_ui_4 uparam, void * blob) { - return kmqint_post_message_ex(type, subtype, uparam, blob, NULL, FALSE); -} - -/*! \internal - \brief Frees a call - \note Obtains ::cs_kmq_msg - */ -KHMEXP khm_int32 KHMAPI -kmq_free_call(kmq_call call) { - kmq_message * m; - - m = call; - - EnterCriticalSection(&cs_kmq_msg); - m->refcount--; - if(!m->refcount) { - kmqint_put_message(m); - } - LeaveCriticalSection(&cs_kmq_msg); - - return KHM_ERROR_SUCCESS; -} - -/*! \internal - \note Obtains ::cs_kmq_msg, ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs - */ -khm_int32 -kmqint_post_message_ex(khm_int32 type, khm_int32 subtype, khm_ui_4 uparam, - void * blob, kmq_call * call, khm_boolean try_send) -{ - kmq_message * m; - kherr_context * ctx; - - EnterCriticalSection(&cs_kmq_msg); - m = kmqint_get_message(); - LeaveCriticalSection(&cs_kmq_msg); - - m->type = type; - m->subtype = subtype; - m->uparam = uparam; - m->vparam = blob; - - m->timeSent = GetTickCount(); - m->timeExpire = m->timeSent + kmq_call_dead_timeout; - - ctx = kherr_peek_context(); - if (ctx) { - if (ctx->flags & KHERR_CF_TRANSITIVE) { - m->err_ctx = ctx; - /* leave it held */ - } else { - kherr_release_context(ctx); - } - } - - if(call) { - m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); - *call = m; - m->refcount++; - } else - m->wait_o = NULL; - - kmqint_msg_publish(m, try_send); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kmq_post_message_ex(khm_int32 type, khm_int32 subtype, - khm_ui_4 uparam, void * blob, kmq_call * call) -{ - return kmqint_post_message_ex(type, subtype, uparam, blob, call, FALSE); -} - - -/*! \internal -*/ -KHMEXP khm_int32 KHMAPI -kmq_post_sub_msg(khm_handle sub, khm_int32 type, khm_int32 subtype, - khm_ui_4 uparam, void * vparam) -{ - return kmq_post_sub_msg_ex(sub, type, subtype, uparam, vparam, NULL); -} - -/*! \internal -*/ -khm_int32 -kmqint_post_sub_msg_ex(khm_handle sub, khm_int32 type, khm_int32 subtype, - khm_ui_4 uparam, void * vparam, - kmq_call * call, khm_boolean try_send) -{ - kmq_message * m; - kherr_context * ctx; - - EnterCriticalSection(&cs_kmq_msg); - m = kmqint_get_message(); - LeaveCriticalSection(&cs_kmq_msg); - - m->type = type; - m->subtype = subtype; - m->uparam = uparam; - m->vparam = vparam; - - m->timeSent = GetTickCount(); - m->timeExpire = m->timeSent + kmq_call_dead_timeout; - - ctx = kherr_peek_context(); - if (ctx) { - if (ctx->flags & KHERR_CF_TRANSITIVE) { - m->err_ctx = ctx; - /* leave it held */ - } else { - kherr_release_context(ctx); - } - } - - if(call) { - m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); - *call = m; - m->refcount++; - } else - m->wait_o = NULL; - - EnterCriticalSection(&cs_kmq_msg); - kmqint_post((kmq_msg_subscription *) sub, m, try_send); - - if(m->nCompleted + m->nFailed == m->nSent) { - kmqint_put_message(m); - } - LeaveCriticalSection(&cs_kmq_msg); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kmq_post_sub_msg_ex(khm_handle sub, khm_int32 type, khm_int32 subtype, - khm_ui_4 uparam, void * vparam, kmq_call * call) -{ - return kmqint_post_sub_msg_ex(sub, type, subtype, - uparam, vparam, call, FALSE); -} - -khm_int32 -kmqint_post_subs_msg_ex(khm_handle * subs, khm_size n_subs, khm_int32 type, - khm_int32 subtype, khm_ui_4 uparam, void * vparam, - kmq_call * call, khm_boolean try_send) -{ - kmq_message * m; - kherr_context * ctx; - khm_size i; - - if(n_subs == 0) - return KHM_ERROR_SUCCESS; - - EnterCriticalSection(&cs_kmq_msg); - m = kmqint_get_message(); - LeaveCriticalSection(&cs_kmq_msg); - - m->type = type; - m->subtype = subtype; - m->uparam = uparam; - m->vparam = vparam; - - m->timeSent = GetTickCount(); - m->timeExpire = m->timeSent + kmq_call_dead_timeout; - - ctx = kherr_peek_context(); - if (ctx) { - if (ctx->flags & KHERR_CF_TRANSITIVE) { - m->err_ctx = ctx; - /* leave it held */ - } else { - kherr_release_context(ctx); - } - } - - if(call) { - m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); - *call = m; - m->refcount++; - } else - m->wait_o = NULL; - - EnterCriticalSection(&cs_kmq_msg); - for(i=0;inCompleted + m->nFailed == m->nSent) { - kmqint_put_message(m); - } - LeaveCriticalSection(&cs_kmq_msg); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -kmq_post_subs_msg(khm_handle * subs, - khm_size n_subs, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam) -{ - return kmqint_post_subs_msg_ex(subs, - n_subs, - type, - subtype, - uparam, - vparam, - NULL, - FALSE); -} - -KHMEXP khm_int32 KHMAPI -kmq_post_subs_msg_ex(khm_handle * subs, - khm_int32 n_subs, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam, - kmq_call * call) -{ - return kmqint_post_subs_msg_ex(subs, n_subs, type, subtype, - uparam, vparam, call, FALSE); -} - -KHMEXP khm_int32 KHMAPI -kmq_send_subs_msg(khm_handle *subs, - khm_int32 n_subs, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam) -{ - kmq_call c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - rv = kmqint_post_subs_msg_ex(subs, n_subs, type, subtype, - uparam, vparam, &c, TRUE); - if(KHM_FAILED(rv)) - return rv; - - rv = kmq_wait(c, INFINITE); - if(KHM_SUCCEEDED(rv) && c->nFailed > 0) - rv = KHM_ERROR_PARTIAL; - - kmq_free_call(c); - - return rv; -} - -/*! \internal -*/ -KHMEXP khm_int32 KHMAPI -kmq_send_sub_msg(khm_handle sub, khm_int32 type, khm_int32 subtype, - khm_ui_4 uparam, void * vparam) -{ - kmq_call c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - rv = kmqint_post_sub_msg_ex(sub, type, subtype, uparam, vparam, &c, TRUE); - if(KHM_FAILED(rv)) - return rv; - - rv = kmq_wait(c, INFINITE); - if(KHM_SUCCEEDED(rv) && c->nFailed > 0) - rv = KHM_ERROR_PARTIAL; - - kmq_free_call(c); - - return rv; -} - -/*! \internal - \note Obtains ::cs_kmq_global, ::cs_kmq_msg, ::cs_kmq_msg_ref, kmq_queue::cs - */ -KHMEXP khm_int32 KHMAPI -kmq_send_thread_quit_message(kmq_thread_id thread, khm_ui_4 uparam) { - kmq_call c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - rv = kmq_post_thread_quit_message(thread, uparam, &c); - if(KHM_FAILED(rv)) - return rv; - - rv = kmq_wait(c, INFINITE); - - kmq_free_call(c); - - return rv; -} - -/*! \internal - \note Obtains ::cs_kmq_global, ::cs_kmq_msg, ::cs_kmq_msg_ref, kmq_queue::cs - */ -KHMEXP khm_int32 KHMAPI -kmq_post_thread_quit_message(kmq_thread_id thread, - khm_ui_4 uparam, kmq_call * call) { - kmq_message * m; - kmq_queue * q; - - EnterCriticalSection(&cs_kmq_global); - q = queues; - while(q) { - if(q->thread == thread) - break; - q = LNEXT(q); - } - LeaveCriticalSection(&cs_kmq_global); - - if(!q) - return KHM_ERROR_NOT_FOUND; - - EnterCriticalSection(&cs_kmq_msg); - m = kmqint_get_message(); - LeaveCriticalSection(&cs_kmq_msg); - - m->type = KMSG_SYSTEM; - m->subtype = KMSG_SYSTEM_EXIT; - m->uparam = uparam; - m->vparam = NULL; - - m->timeSent = GetTickCount(); - m->timeExpire = m->timeSent + kmq_call_dead_timeout; - - if(call) { - m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); - *call = m; - m->refcount++; - } else - m->wait_o = NULL; - - kmqint_post_queue(q, m); - - return KHM_ERROR_SUCCESS; -} - -/* TODO:Implement these */ -KHMEXP khm_int32 KHMAPI -kmq_get_next_response(kmq_call call, void ** resp) { - return 0; -} - -KHMEXP khm_boolean KHMAPI -kmq_has_completed(kmq_call call) { - return (call->nCompleted + call->nFailed == call->nSent); -} - -KHMEXP khm_int32 KHMAPI -kmq_wait(kmq_call call, kmq_timer timeout) { - kmq_message * m = call; - DWORD rv; - /*TODO: check for call free */ - - if(m && m->wait_o) { - rv = WaitForSingleObject(m->wait_o, timeout); - if(rv == WAIT_OBJECT_0) - return KHM_ERROR_SUCCESS; - else - return KHM_ERROR_TIMEOUT; - } else - return KHM_ERROR_INVALID_PARAM; -} - -/*! \internal - \note Obtains ::cs_kmq_types - */ -KHMEXP khm_int32 KHMAPI -kmq_set_completion_handler(khm_int32 type, - kmq_msg_completion_handler handler) { - return kmqint_msg_type_set_handler(type, handler); -} - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +CRITICAL_SECTION cs_kmq_msg; +kmq_message * msg_free = NULL; +kmq_message * msg_active = NULL; + +/*! \internal + \brief Get a message object + \note called with ::cs_kmq_msg held */ +kmq_message * +kmqint_get_message(void) { + kmq_message * m; + + LPOP(&msg_free,&m); + if(!m) { + /* allocate one */ + m = PMALLOC(sizeof(kmq_message)); + } + ZeroMemory((void*)m, sizeof(kmq_message)); + + LPUSH(&msg_active, m); + + return m; +} + +/*! \internal + \brief Frees a message object + \note called with ::cs_kmq_msg held + */ +void +kmqint_put_message(kmq_message *m) { + int queued; + /* we can only free a message if the refcount is zero. + Otherwise we have to wait until the call is freed. */ + if(m->refcount == 0) { + LDELETE(&msg_active, m); + LeaveCriticalSection(&cs_kmq_msg); + queued = kmqint_notify_msg_completion(m); + EnterCriticalSection(&cs_kmq_msg); + if (!queued) { + if(m->err_ctx) { + kherr_release_context(m->err_ctx); + m->err_ctx = NULL; + } + if(m->wait_o) { + CloseHandle(m->wait_o); + m->wait_o = NULL; + } + LPUSH(&msg_free,m); + } + } else if(m->wait_o) { + SetEvent(m->wait_o); + } +} + +/*! \internal + \note Obtains ::cs_kmq_msg, ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs + */ +KHMEXP khm_int32 KHMAPI +kmq_send_message(khm_int32 type, khm_int32 subtype, + khm_ui_4 uparam, void * blob) { + kmq_call c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + rv = kmqint_post_message_ex(type, subtype, uparam, blob, &c, TRUE); + if(KHM_FAILED(rv)) + return rv; + + rv = kmq_wait(c, INFINITE); + if(KHM_SUCCEEDED(rv) && c->nFailed > 0) + rv = KHM_ERROR_PARTIAL; + + kmq_free_call(c); + + return rv; +} + +/*! \internal + \note Obtains ::cs_kmq_msg, ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs + */ +KHMEXP khm_int32 KHMAPI +kmq_post_message(khm_int32 type, khm_int32 subtype, + khm_ui_4 uparam, void * blob) { + return kmqint_post_message_ex(type, subtype, uparam, blob, NULL, FALSE); +} + +/*! \internal + \brief Frees a call + \note Obtains ::cs_kmq_msg + */ +KHMEXP khm_int32 KHMAPI +kmq_free_call(kmq_call call) { + kmq_message * m; + + m = call; + + EnterCriticalSection(&cs_kmq_msg); + m->refcount--; + if(!m->refcount) { + kmqint_put_message(m); + } + LeaveCriticalSection(&cs_kmq_msg); + + return KHM_ERROR_SUCCESS; +} + +/*! \internal + \note Obtains ::cs_kmq_msg, ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs + */ +khm_int32 +kmqint_post_message_ex(khm_int32 type, khm_int32 subtype, khm_ui_4 uparam, + void * blob, kmq_call * call, khm_boolean try_send) +{ + kmq_message * m; + kherr_context * ctx; + + EnterCriticalSection(&cs_kmq_msg); + m = kmqint_get_message(); + LeaveCriticalSection(&cs_kmq_msg); + + m->type = type; + m->subtype = subtype; + m->uparam = uparam; + m->vparam = blob; + + m->timeSent = GetTickCount(); + m->timeExpire = m->timeSent + kmq_call_dead_timeout; + + ctx = kherr_peek_context(); + if (ctx) { + if (ctx->flags & KHERR_CF_TRANSITIVE) { + m->err_ctx = ctx; + /* leave it held */ + } else { + kherr_release_context(ctx); + } + } + + if(call) { + m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); + *call = m; + m->refcount++; + } else + m->wait_o = NULL; + + kmqint_msg_publish(m, try_send); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kmq_post_message_ex(khm_int32 type, khm_int32 subtype, + khm_ui_4 uparam, void * blob, kmq_call * call) +{ + return kmqint_post_message_ex(type, subtype, uparam, blob, call, FALSE); +} + + +/*! \internal +*/ +KHMEXP khm_int32 KHMAPI +kmq_post_sub_msg(khm_handle sub, khm_int32 type, khm_int32 subtype, + khm_ui_4 uparam, void * vparam) +{ + return kmq_post_sub_msg_ex(sub, type, subtype, uparam, vparam, NULL); +} + +/*! \internal +*/ +khm_int32 +kmqint_post_sub_msg_ex(khm_handle sub, khm_int32 type, khm_int32 subtype, + khm_ui_4 uparam, void * vparam, + kmq_call * call, khm_boolean try_send) +{ + kmq_message * m; + kherr_context * ctx; + + EnterCriticalSection(&cs_kmq_msg); + m = kmqint_get_message(); + LeaveCriticalSection(&cs_kmq_msg); + + m->type = type; + m->subtype = subtype; + m->uparam = uparam; + m->vparam = vparam; + + m->timeSent = GetTickCount(); + m->timeExpire = m->timeSent + kmq_call_dead_timeout; + + ctx = kherr_peek_context(); + if (ctx) { + if (ctx->flags & KHERR_CF_TRANSITIVE) { + m->err_ctx = ctx; + /* leave it held */ + } else { + kherr_release_context(ctx); + } + } + + if(call) { + m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); + *call = m; + m->refcount++; + } else + m->wait_o = NULL; + + EnterCriticalSection(&cs_kmq_msg); + kmqint_post((kmq_msg_subscription *) sub, m, try_send); + + if(m->nCompleted + m->nFailed == m->nSent) { + kmqint_put_message(m); + } + LeaveCriticalSection(&cs_kmq_msg); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kmq_post_sub_msg_ex(khm_handle sub, khm_int32 type, khm_int32 subtype, + khm_ui_4 uparam, void * vparam, kmq_call * call) +{ + return kmqint_post_sub_msg_ex(sub, type, subtype, + uparam, vparam, call, FALSE); +} + +khm_int32 +kmqint_post_subs_msg_ex(khm_handle * subs, khm_size n_subs, khm_int32 type, + khm_int32 subtype, khm_ui_4 uparam, void * vparam, + kmq_call * call, khm_boolean try_send) +{ + kmq_message * m; + kherr_context * ctx; + khm_size i; + + if(n_subs == 0) + return KHM_ERROR_SUCCESS; + + EnterCriticalSection(&cs_kmq_msg); + m = kmqint_get_message(); + LeaveCriticalSection(&cs_kmq_msg); + + m->type = type; + m->subtype = subtype; + m->uparam = uparam; + m->vparam = vparam; + + m->timeSent = GetTickCount(); + m->timeExpire = m->timeSent + kmq_call_dead_timeout; + + ctx = kherr_peek_context(); + if (ctx) { + if (ctx->flags & KHERR_CF_TRANSITIVE) { + m->err_ctx = ctx; + /* leave it held */ + } else { + kherr_release_context(ctx); + } + } + + if(call) { + m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); + *call = m; + m->refcount++; + } else + m->wait_o = NULL; + + EnterCriticalSection(&cs_kmq_msg); + for(i=0;inCompleted + m->nFailed == m->nSent) { + kmqint_put_message(m); + } + LeaveCriticalSection(&cs_kmq_msg); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +kmq_post_subs_msg(khm_handle * subs, + khm_size n_subs, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam) +{ + return kmqint_post_subs_msg_ex(subs, + n_subs, + type, + subtype, + uparam, + vparam, + NULL, + FALSE); +} + +KHMEXP khm_int32 KHMAPI +kmq_post_subs_msg_ex(khm_handle * subs, + khm_int32 n_subs, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam, + kmq_call * call) +{ + return kmqint_post_subs_msg_ex(subs, n_subs, type, subtype, + uparam, vparam, call, FALSE); +} + +KHMEXP khm_int32 KHMAPI +kmq_send_subs_msg(khm_handle *subs, + khm_int32 n_subs, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam) +{ + kmq_call c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + rv = kmqint_post_subs_msg_ex(subs, n_subs, type, subtype, + uparam, vparam, &c, TRUE); + if(KHM_FAILED(rv)) + return rv; + + rv = kmq_wait(c, INFINITE); + if(KHM_SUCCEEDED(rv) && c->nFailed > 0) + rv = KHM_ERROR_PARTIAL; + + kmq_free_call(c); + + return rv; +} + +/*! \internal +*/ +KHMEXP khm_int32 KHMAPI +kmq_send_sub_msg(khm_handle sub, khm_int32 type, khm_int32 subtype, + khm_ui_4 uparam, void * vparam) +{ + kmq_call c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + rv = kmqint_post_sub_msg_ex(sub, type, subtype, uparam, vparam, &c, TRUE); + if(KHM_FAILED(rv)) + return rv; + + rv = kmq_wait(c, INFINITE); + if(KHM_SUCCEEDED(rv) && c->nFailed > 0) + rv = KHM_ERROR_PARTIAL; + + kmq_free_call(c); + + return rv; +} + +/*! \internal + \note Obtains ::cs_kmq_global, ::cs_kmq_msg, ::cs_kmq_msg_ref, kmq_queue::cs + */ +KHMEXP khm_int32 KHMAPI +kmq_send_thread_quit_message(kmq_thread_id thread, khm_ui_4 uparam) { + kmq_call c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + rv = kmq_post_thread_quit_message(thread, uparam, &c); + if(KHM_FAILED(rv)) + return rv; + + rv = kmq_wait(c, INFINITE); + + kmq_free_call(c); + + return rv; +} + +/*! \internal + \note Obtains ::cs_kmq_global, ::cs_kmq_msg, ::cs_kmq_msg_ref, kmq_queue::cs + */ +KHMEXP khm_int32 KHMAPI +kmq_post_thread_quit_message(kmq_thread_id thread, + khm_ui_4 uparam, kmq_call * call) { + kmq_message * m; + kmq_queue * q; + + EnterCriticalSection(&cs_kmq_global); + q = queues; + while(q) { + if(q->thread == thread) + break; + q = LNEXT(q); + } + LeaveCriticalSection(&cs_kmq_global); + + if(!q) + return KHM_ERROR_NOT_FOUND; + + EnterCriticalSection(&cs_kmq_msg); + m = kmqint_get_message(); + LeaveCriticalSection(&cs_kmq_msg); + + m->type = KMSG_SYSTEM; + m->subtype = KMSG_SYSTEM_EXIT; + m->uparam = uparam; + m->vparam = NULL; + + m->timeSent = GetTickCount(); + m->timeExpire = m->timeSent + kmq_call_dead_timeout; + + if(call) { + m->wait_o = CreateEvent(NULL,FALSE,FALSE,NULL); + *call = m; + m->refcount++; + } else + m->wait_o = NULL; + + kmqint_post_queue(q, m); + + return KHM_ERROR_SUCCESS; +} + +/* TODO:Implement these */ +KHMEXP khm_int32 KHMAPI +kmq_get_next_response(kmq_call call, void ** resp) { + return 0; +} + +KHMEXP khm_boolean KHMAPI +kmq_has_completed(kmq_call call) { + return (call->nCompleted + call->nFailed == call->nSent); +} + +KHMEXP khm_int32 KHMAPI +kmq_wait(kmq_call call, kmq_timer timeout) { + kmq_message * m = call; + DWORD rv; + /*TODO: check for call free */ + + if(m && m->wait_o) { + rv = WaitForSingleObject(m->wait_o, timeout); + if(rv == WAIT_OBJECT_0) + return KHM_ERROR_SUCCESS; + else + return KHM_ERROR_TIMEOUT; + } else + return KHM_ERROR_INVALID_PARAM; +} + +/*! \internal + \note Obtains ::cs_kmq_types + */ +KHMEXP khm_int32 KHMAPI +kmq_set_completion_handler(khm_int32 type, + kmq_msg_completion_handler handler) { + return kmqint_msg_type_set_handler(type, handler); +} + --- krb5-1.4.4.orig/src/windows/identity/kmq/msgtype.c +++ krb5-1.4.4/src/windows/identity/kmq/msgtype.c @@ -1,367 +1,367 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -CRITICAL_SECTION cs_kmq_types; - -kmq_msg_type *msg_types[KMQ_MSG_TYPE_MAX + 1]; -kmq_msg_type *all_msg_types = NULL; - -/*! \internal - \brief Initializes the message type data structures - \note called with cs_mkq_global held */ -void kmqint_init_msg_types(void) { - ZeroMemory(msg_types, sizeof(kmq_msg_type *) * (KMQ_MSG_TYPE_MAX + 1)); - InitializeCriticalSection(&cs_kmq_types); -} - -/*! \internal - \brief Frees up the message type data structures - \note called with cs_mkq_global held */ -void kmqint_exit_msg_types(void) { - int i; - - EnterCriticalSection(&cs_kmq_types); - for(i=0;itype]; - if(mt == NULL) - return 0; - h = mt->completion_handler; - - /* handler is set to NULL before freeing type */ - if(h == NULL || msg_types[m->type] == NULL) - return 0; - - return kmqint_call_completion_handler(h,m); -} - -/* called with cs_mkq_global && cs_kmq_types held */ -void kmqint_free_msg_type(int t) { - /*TODO: free the message type*/ - /* must set handler to NULL before freeing type */ - /* must set msg_type[t] = NULL before starting to free type */ -} - -/*! \internal - \brief Create a message type - \note Obtains ::cs_kmq_types - */ -void kmqint_msg_type_create(int t) { - if(t < 0 || t > KMQ_MSG_TYPE_MAX) - return; - - EnterCriticalSection(&cs_kmq_types); - if(!msg_types[t]) { - kmq_msg_type * mt; - mt = PMALLOC(sizeof(kmq_msg_type)); - ZeroMemory(mt, sizeof(kmq_msg_type)); - mt->id = t; - LINIT(mt); - mt->subs = NULL; - msg_types[t] = mt; - - LPUSH(&all_msg_types, mt); - } - LeaveCriticalSection(&cs_kmq_types); -} - -KHMEXP khm_int32 KHMAPI kmq_register_type(wchar_t * name, - khm_int32 * new_id) -{ - int i; - khm_int32 rv = KHM_ERROR_SUCCESS; - BOOL registered = FALSE; - int first_free = 0; - size_t sz; - - if(FAILED(StringCbLength(name, KMQ_MAXCB_TYPE_NAME, &sz)) || - sz == 0) - return KHM_ERROR_INVALID_PARAM; - sz += sizeof(wchar_t); - - EnterCriticalSection(&cs_kmq_types); - for(i=KMSGBASE_USER; i <= KMQ_MSG_TYPE_MAX; i++) { - if(msg_types[i] == NULL) { - if(first_free == 0) - first_free = i; - /* continue searching since we might find that this type - is already registered. */ - } else { - if(msg_types[i]->name != NULL && - !wcscmp(msg_types[i]->name, name)) { - - registered = TRUE; - if (new_id) - *new_id = i; - break; - } - } - } - - if(registered) { - rv = KHM_ERROR_EXISTS; - } else if(first_free == 0) { - rv = KHM_ERROR_NO_RESOURCES; - } else { - kmqint_msg_type_create(first_free); - msg_types[first_free]->name = PMALLOC(sz); - StringCbCopy(msg_types[first_free]->name, sz, name); - - if(new_id != NULL) - *new_id = first_free; - } - LeaveCriticalSection(&cs_kmq_types); - - return rv; -} - -KHMEXP khm_int32 KHMAPI kmq_find_type(wchar_t * name, khm_int32 * id) -{ - int i; - - EnterCriticalSection(&cs_kmq_types); - for(i=KMSGBASE_USER; i <= KMQ_MSG_TYPE_MAX; i++) { - if(msg_types[i] != NULL && msg_types[i]->name != NULL) { - if(!wcscmp(msg_types[i]->name, name)) - break; - } - } - LeaveCriticalSection(&cs_kmq_types); - - if(i <= KMQ_MSG_TYPE_MAX) { - if(id != NULL) - *id = i; - return KHM_ERROR_SUCCESS; - } - - return KHM_ERROR_NOT_FOUND; -} - -KHMEXP khm_int32 KHMAPI kmq_unregister_type(khm_int32 id) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(id < KMSGBASE_USER || id > KMQ_MSG_TYPE_MAX) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_kmq_types); - if(msg_types[id] != NULL) { - EnterCriticalSection(&cs_kmq_global); - kmqint_free_msg_type(id); - LeaveCriticalSection(&cs_kmq_global); - } else { - rv = KHM_ERROR_NOT_FOUND; - } - LeaveCriticalSection(&cs_kmq_types); - - return rv; -} - -/*! \internal - \brief Adds a subscription to a message type - \note Obtains ::cs_kmq_types - */ -void kmqint_msg_type_add_sub(int t, kmq_msg_subscription *s) { - kmq_msg_subscription * ts; - - if(t < 0 || t > KMQ_MSG_TYPE_MAX) - return; - - if(!msg_types[t]) - kmqint_msg_type_create(t); - - EnterCriticalSection(&cs_kmq_types); - s->type = t; - /* check if we already have this subscription */ - ts = msg_types[t]->subs; - while(ts) { - if((ts->rcpt_type == s->rcpt_type) && - (((ts->rcpt_type == KMQ_RCPTTYPE_CB) && (ts->recipient.cb == s->recipient.cb)) || - ((ts->rcpt_type == KMQ_RCPTTYPE_HWND) && (ts->recipient.hwnd == s->recipient.hwnd)))) - break; - ts = LNEXT(ts); - } - /* add it if we didn't find it */ - if(!ts) { - LPUSH(&msg_types[t]->subs, s); - } - LeaveCriticalSection(&cs_kmq_types); -} - -/*! \internal - \brief Delete a subscription - \note Obtains ::cs_kmq_types - */ -void kmqint_msg_type_del_sub(kmq_msg_subscription *s) { - int t = s->type; - - EnterCriticalSection(&cs_kmq_types); - if(msg_types[t]) { - LDELETE(&msg_types[t]->subs,s); - } - LeaveCriticalSection(&cs_kmq_types); -} - - -/*! \internal - \brief Deletes a window subscription from a message type - \note Obtains ::cs_kmq_types -*/ -kmq_msg_subscription * kmqint_msg_type_del_sub_hwnd(khm_int32 t, HWND hwnd) { - kmq_msg_subscription *s = NULL; - - if(t < 0 || t > KMQ_MSG_TYPE_MAX) - return NULL; - - EnterCriticalSection(&cs_kmq_types); - if(msg_types[t]) { - s = msg_types[t]->subs; - while(s) { - kmq_msg_subscription * n = LNEXT(s); - if(s->rcpt_type == KMQ_RCPTTYPE_HWND && s->recipient.hwnd == hwnd) { - /*TODO: do more here? */ - LDELETE(&msg_types[t]->subs, s); - break; - } - s = n; - } - } - LeaveCriticalSection(&cs_kmq_types); - - return s; -} - -/*! \internal - \brief Delete a callback from a message type - \note Obtains ::cs_kmq_types, ::cs_kmq_global - */ -kmq_msg_subscription * kmqint_msg_type_del_sub_cb(khm_int32 t, kmq_callback_t cb) { - kmq_msg_subscription *s; - kmq_queue *q; - - if(t < 0 || t > KMQ_MSG_TYPE_MAX) - return NULL; - - if(!msg_types[t]) - return NULL; - - q = kmqint_get_thread_queue(); - - EnterCriticalSection(&cs_kmq_types); - s = msg_types[t]->subs; - while(s) { - kmq_msg_subscription * n = LNEXT(s); - if(s->rcpt_type == KMQ_RCPTTYPE_CB && - s->recipient.cb == cb && - s->queue == q) { - /*TODO: do more here? */ - LDELETE(&msg_types[t]->subs, s); - break; - } - s = n; - } - LeaveCriticalSection(&cs_kmq_types); - - return s; -} - -/*! \internal - \brief Publish a message - \note Obtains ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs, ::cs_kmq_msg - */ -khm_int32 kmqint_msg_publish(kmq_message * m, khm_boolean try_send) { - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(msg_types[m->type]) { - kmq_msg_type *t; - kmq_msg_subscription * s; - - EnterCriticalSection(&cs_kmq_types); - EnterCriticalSection(&cs_kmq_msg); - t = msg_types[m->type]; - s = t->subs; - while(s) { - kmqint_post(s, m, try_send); - s = LNEXT(s); - } - - if(m->nCompleted + m->nFailed == m->nSent) { - kmqint_put_message(m); - } - - LeaveCriticalSection(&cs_kmq_msg); - LeaveCriticalSection(&cs_kmq_types); - - } else { - EnterCriticalSection(&cs_kmq_msg); - kmqint_put_message(m); - LeaveCriticalSection(&cs_kmq_msg); - } - return rv; -} - -/*! \internal - \brief Sets the completion handler for a message type - \note Obtains ::cs_kmq_types - */ -khm_int32 kmqint_msg_type_set_handler(khm_int32 type, kmq_msg_completion_handler handler) { - - if (type == KMSG_SYSTEM) - return KHM_ERROR_INVALID_PARAM; - - if(!msg_types[type]) - kmqint_msg_type_create(type); - - if(!msg_types[type]) - return KHM_ERROR_NO_RESOURCES; - - EnterCriticalSection(&cs_kmq_types); - msg_types[type]->completion_handler = handler; - LeaveCriticalSection(&cs_kmq_types); - - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +CRITICAL_SECTION cs_kmq_types; + +kmq_msg_type *msg_types[KMQ_MSG_TYPE_MAX + 1]; +kmq_msg_type *all_msg_types = NULL; + +/*! \internal + \brief Initializes the message type data structures + \note called with cs_mkq_global held */ +void kmqint_init_msg_types(void) { + ZeroMemory(msg_types, sizeof(kmq_msg_type *) * (KMQ_MSG_TYPE_MAX + 1)); + InitializeCriticalSection(&cs_kmq_types); +} + +/*! \internal + \brief Frees up the message type data structures + \note called with cs_mkq_global held */ +void kmqint_exit_msg_types(void) { + int i; + + EnterCriticalSection(&cs_kmq_types); + for(i=0;itype]; + if(mt == NULL) + return 0; + h = mt->completion_handler; + + /* handler is set to NULL before freeing type */ + if(h == NULL || msg_types[m->type] == NULL) + return 0; + + return kmqint_call_completion_handler(h,m); +} + +/* called with cs_mkq_global && cs_kmq_types held */ +void kmqint_free_msg_type(int t) { + /*TODO: free the message type*/ + /* must set handler to NULL before freeing type */ + /* must set msg_type[t] = NULL before starting to free type */ +} + +/*! \internal + \brief Create a message type + \note Obtains ::cs_kmq_types + */ +void kmqint_msg_type_create(int t) { + if(t < 0 || t > KMQ_MSG_TYPE_MAX) + return; + + EnterCriticalSection(&cs_kmq_types); + if(!msg_types[t]) { + kmq_msg_type * mt; + mt = PMALLOC(sizeof(kmq_msg_type)); + ZeroMemory(mt, sizeof(kmq_msg_type)); + mt->id = t; + LINIT(mt); + mt->subs = NULL; + msg_types[t] = mt; + + LPUSH(&all_msg_types, mt); + } + LeaveCriticalSection(&cs_kmq_types); +} + +KHMEXP khm_int32 KHMAPI kmq_register_type(wchar_t * name, + khm_int32 * new_id) +{ + int i; + khm_int32 rv = KHM_ERROR_SUCCESS; + BOOL registered = FALSE; + int first_free = 0; + size_t sz; + + if(FAILED(StringCbLength(name, KMQ_MAXCB_TYPE_NAME, &sz)) || + sz == 0) + return KHM_ERROR_INVALID_PARAM; + sz += sizeof(wchar_t); + + EnterCriticalSection(&cs_kmq_types); + for(i=KMSGBASE_USER; i <= KMQ_MSG_TYPE_MAX; i++) { + if(msg_types[i] == NULL) { + if(first_free == 0) + first_free = i; + /* continue searching since we might find that this type + is already registered. */ + } else { + if(msg_types[i]->name != NULL && + !wcscmp(msg_types[i]->name, name)) { + + registered = TRUE; + if (new_id) + *new_id = i; + break; + } + } + } + + if(registered) { + rv = KHM_ERROR_EXISTS; + } else if(first_free == 0) { + rv = KHM_ERROR_NO_RESOURCES; + } else { + kmqint_msg_type_create(first_free); + msg_types[first_free]->name = PMALLOC(sz); + StringCbCopy(msg_types[first_free]->name, sz, name); + + if(new_id != NULL) + *new_id = first_free; + } + LeaveCriticalSection(&cs_kmq_types); + + return rv; +} + +KHMEXP khm_int32 KHMAPI kmq_find_type(wchar_t * name, khm_int32 * id) +{ + int i; + + EnterCriticalSection(&cs_kmq_types); + for(i=KMSGBASE_USER; i <= KMQ_MSG_TYPE_MAX; i++) { + if(msg_types[i] != NULL && msg_types[i]->name != NULL) { + if(!wcscmp(msg_types[i]->name, name)) + break; + } + } + LeaveCriticalSection(&cs_kmq_types); + + if(i <= KMQ_MSG_TYPE_MAX) { + if(id != NULL) + *id = i; + return KHM_ERROR_SUCCESS; + } + + return KHM_ERROR_NOT_FOUND; +} + +KHMEXP khm_int32 KHMAPI kmq_unregister_type(khm_int32 id) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(id < KMSGBASE_USER || id > KMQ_MSG_TYPE_MAX) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_kmq_types); + if(msg_types[id] != NULL) { + EnterCriticalSection(&cs_kmq_global); + kmqint_free_msg_type(id); + LeaveCriticalSection(&cs_kmq_global); + } else { + rv = KHM_ERROR_NOT_FOUND; + } + LeaveCriticalSection(&cs_kmq_types); + + return rv; +} + +/*! \internal + \brief Adds a subscription to a message type + \note Obtains ::cs_kmq_types + */ +void kmqint_msg_type_add_sub(int t, kmq_msg_subscription *s) { + kmq_msg_subscription * ts; + + if(t < 0 || t > KMQ_MSG_TYPE_MAX) + return; + + if(!msg_types[t]) + kmqint_msg_type_create(t); + + EnterCriticalSection(&cs_kmq_types); + s->type = t; + /* check if we already have this subscription */ + ts = msg_types[t]->subs; + while(ts) { + if((ts->rcpt_type == s->rcpt_type) && + (((ts->rcpt_type == KMQ_RCPTTYPE_CB) && (ts->recipient.cb == s->recipient.cb)) || + ((ts->rcpt_type == KMQ_RCPTTYPE_HWND) && (ts->recipient.hwnd == s->recipient.hwnd)))) + break; + ts = LNEXT(ts); + } + /* add it if we didn't find it */ + if(!ts) { + LPUSH(&msg_types[t]->subs, s); + } + LeaveCriticalSection(&cs_kmq_types); +} + +/*! \internal + \brief Delete a subscription + \note Obtains ::cs_kmq_types + */ +void kmqint_msg_type_del_sub(kmq_msg_subscription *s) { + int t = s->type; + + EnterCriticalSection(&cs_kmq_types); + if(msg_types[t]) { + LDELETE(&msg_types[t]->subs,s); + } + LeaveCriticalSection(&cs_kmq_types); +} + + +/*! \internal + \brief Deletes a window subscription from a message type + \note Obtains ::cs_kmq_types +*/ +kmq_msg_subscription * kmqint_msg_type_del_sub_hwnd(khm_int32 t, HWND hwnd) { + kmq_msg_subscription *s = NULL; + + if(t < 0 || t > KMQ_MSG_TYPE_MAX) + return NULL; + + EnterCriticalSection(&cs_kmq_types); + if(msg_types[t]) { + s = msg_types[t]->subs; + while(s) { + kmq_msg_subscription * n = LNEXT(s); + if(s->rcpt_type == KMQ_RCPTTYPE_HWND && s->recipient.hwnd == hwnd) { + /*TODO: do more here? */ + LDELETE(&msg_types[t]->subs, s); + break; + } + s = n; + } + } + LeaveCriticalSection(&cs_kmq_types); + + return s; +} + +/*! \internal + \brief Delete a callback from a message type + \note Obtains ::cs_kmq_types, ::cs_kmq_global + */ +kmq_msg_subscription * kmqint_msg_type_del_sub_cb(khm_int32 t, kmq_callback_t cb) { + kmq_msg_subscription *s; + kmq_queue *q; + + if(t < 0 || t > KMQ_MSG_TYPE_MAX) + return NULL; + + if(!msg_types[t]) + return NULL; + + q = kmqint_get_thread_queue(); + + EnterCriticalSection(&cs_kmq_types); + s = msg_types[t]->subs; + while(s) { + kmq_msg_subscription * n = LNEXT(s); + if(s->rcpt_type == KMQ_RCPTTYPE_CB && + s->recipient.cb == cb && + s->queue == q) { + /*TODO: do more here? */ + LDELETE(&msg_types[t]->subs, s); + break; + } + s = n; + } + LeaveCriticalSection(&cs_kmq_types); + + return s; +} + +/*! \internal + \brief Publish a message + \note Obtains ::cs_kmq_types, ::cs_kmq_msg_ref, kmq_queue::cs, ::cs_kmq_msg + */ +khm_int32 kmqint_msg_publish(kmq_message * m, khm_boolean try_send) { + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(msg_types[m->type]) { + kmq_msg_type *t; + kmq_msg_subscription * s; + + EnterCriticalSection(&cs_kmq_types); + EnterCriticalSection(&cs_kmq_msg); + t = msg_types[m->type]; + s = t->subs; + while(s) { + kmqint_post(s, m, try_send); + s = LNEXT(s); + } + + if(m->nCompleted + m->nFailed == m->nSent) { + kmqint_put_message(m); + } + + LeaveCriticalSection(&cs_kmq_msg); + LeaveCriticalSection(&cs_kmq_types); + + } else { + EnterCriticalSection(&cs_kmq_msg); + kmqint_put_message(m); + LeaveCriticalSection(&cs_kmq_msg); + } + return rv; +} + +/*! \internal + \brief Sets the completion handler for a message type + \note Obtains ::cs_kmq_types + */ +khm_int32 kmqint_msg_type_set_handler(khm_int32 type, kmq_msg_completion_handler handler) { + + if (type == KMSG_SYSTEM) + return KHM_ERROR_INVALID_PARAM; + + if(!msg_types[type]) + kmqint_msg_type_create(type); + + if(!msg_types[type]) + return KHM_ERROR_NO_RESOURCES; + + EnterCriticalSection(&cs_kmq_types); + msg_types[type]->completion_handler = handler; + LeaveCriticalSection(&cs_kmq_types); + + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/kmq/kmqinternal.h +++ krb5-1.4.4/src/windows/identity/kmq/kmqinternal.h @@ -1,112 +1,112 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KMQINTERNAL_H -#define __KHIMAIRA_KMQINTERNAL_H - -#include -#include -#include -#include -#include -#include -#include -#include - -#define KMQ_CONF_SPACE_NAME L"KMQ" -#define KMQ_CONF_QUEUE_DEAD_TIMEOUT_NAME L"QueueDeadTimeout" -#define KMQ_CONF_CALL_DEAD_TIMEOUT_NAME L"CallDeadTimeout" - -extern CRITICAL_SECTION cs_kmq_global; -extern kmq_timer kmq_queue_dead_timeout; -extern kmq_timer kmq_call_dead_timeout; - -extern kmq_queue * queues; - -/* message type */ -extern CRITICAL_SECTION cs_kmq_types; -extern kmq_msg_type *msg_types[KMQ_MSG_TYPE_MAX+1]; - -void kmqint_init_msg_types(void); -void kmqint_exit_msg_types(void); -void kmqint_free_msg_type(int t); -void kmqint_msg_type_create(int t); -void kmqint_msg_type_add_sub(int t, kmq_msg_subscription *s); -void kmqint_msg_type_del_sub(kmq_msg_subscription *s); -kmq_msg_subscription * kmqint_msg_type_del_sub_hwnd(khm_int32 t, HWND hwnd); -kmq_msg_subscription * kmqint_msg_type_del_sub_cb(khm_int32 t, kmq_callback_t cb); -khm_int32 kmqint_msg_publish(kmq_message * m, khm_boolean try_send); -khm_int32 kmqint_msg_type_set_handler(khm_int32 type, kmq_msg_completion_handler handler); -int kmqint_notify_msg_completion(kmq_message * m); - -/* consumer */ -extern DWORD kmq_tls_queue; - -void kmqint_post_queue(kmq_queue * q, kmq_message *m); -void kmqint_post(kmq_msg_subscription * s, kmq_message * m, khm_boolean try_send); -kmq_queue * kmqint_get_thread_queue(void); -void kmqint_get_queue_message_ref(kmq_queue * q, kmq_message_ref ** r); - -/* publisher */ -extern CRITICAL_SECTION cs_kmq_msg; -extern CRITICAL_SECTION cs_kmq_msg_ref; - -kmq_message * kmqint_get_message(void); -void kmqint_put_message(kmq_message *m); - -void kmqint_init(void); -void kmqint_exit(void); -void kmqint_attach_this_thread(void); -void kmqint_detach_this_thread(void); - -khm_int32 kmqint_post_message_ex( - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * blob, - kmq_call * call, - khm_boolean try_send); - -int kmqint_call_completion_handler(kmq_msg_completion_handler h, - kmq_message * m); - -/* global */ -extern kconf_schema schema_kmqconfig[]; - -/* Lock hiearchy : - - cs_kmq_types - cs_kmq_msg - cs_kmq_msg_ref - cs_compl - cs_kmq_global - kmq_queue::cs - - If you have a level 'x' lock, you can obtain a level 'x+n' lock. - You can't obtain a 'x-n' lock if you already have a level 'x' lock. - If you don't have any locks, you can obtain any lock. - */ -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KMQINTERNAL_H +#define __KHIMAIRA_KMQINTERNAL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#define KMQ_CONF_SPACE_NAME L"KMQ" +#define KMQ_CONF_QUEUE_DEAD_TIMEOUT_NAME L"QueueDeadTimeout" +#define KMQ_CONF_CALL_DEAD_TIMEOUT_NAME L"CallDeadTimeout" + +extern CRITICAL_SECTION cs_kmq_global; +extern kmq_timer kmq_queue_dead_timeout; +extern kmq_timer kmq_call_dead_timeout; + +extern kmq_queue * queues; + +/* message type */ +extern CRITICAL_SECTION cs_kmq_types; +extern kmq_msg_type *msg_types[KMQ_MSG_TYPE_MAX+1]; + +void kmqint_init_msg_types(void); +void kmqint_exit_msg_types(void); +void kmqint_free_msg_type(int t); +void kmqint_msg_type_create(int t); +void kmqint_msg_type_add_sub(int t, kmq_msg_subscription *s); +void kmqint_msg_type_del_sub(kmq_msg_subscription *s); +kmq_msg_subscription * kmqint_msg_type_del_sub_hwnd(khm_int32 t, HWND hwnd); +kmq_msg_subscription * kmqint_msg_type_del_sub_cb(khm_int32 t, kmq_callback_t cb); +khm_int32 kmqint_msg_publish(kmq_message * m, khm_boolean try_send); +khm_int32 kmqint_msg_type_set_handler(khm_int32 type, kmq_msg_completion_handler handler); +int kmqint_notify_msg_completion(kmq_message * m); + +/* consumer */ +extern DWORD kmq_tls_queue; + +void kmqint_post_queue(kmq_queue * q, kmq_message *m); +void kmqint_post(kmq_msg_subscription * s, kmq_message * m, khm_boolean try_send); +kmq_queue * kmqint_get_thread_queue(void); +void kmqint_get_queue_message_ref(kmq_queue * q, kmq_message_ref ** r); + +/* publisher */ +extern CRITICAL_SECTION cs_kmq_msg; +extern CRITICAL_SECTION cs_kmq_msg_ref; + +kmq_message * kmqint_get_message(void); +void kmqint_put_message(kmq_message *m); + +void kmqint_init(void); +void kmqint_exit(void); +void kmqint_attach_this_thread(void); +void kmqint_detach_this_thread(void); + +khm_int32 kmqint_post_message_ex( + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * blob, + kmq_call * call, + khm_boolean try_send); + +int kmqint_call_completion_handler(kmq_msg_completion_handler h, + kmq_message * m); + +/* global */ +extern kconf_schema schema_kmqconfig[]; + +/* Lock hiearchy : + + cs_kmq_types + cs_kmq_msg + cs_kmq_msg_ref + cs_compl + cs_kmq_global + kmq_queue::cs + + If you have a level 'x' lock, you can obtain a level 'x+n' lock. + You can't obtain a 'x-n' lock if you already have a level 'x' lock. + If you don't have any locks, you can obtain any lock. + */ +#endif --- krb5-1.4.4.orig/src/windows/identity/kmq/kmq.h +++ krb5-1.4.4/src/windows/identity/kmq/kmq.h @@ -1,764 +1,764 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KMQ_H__ -#define __KHIMAIRA_KMQ_H__ - -/*! \defgroup kmq NetIDMgr Message Queue */ -/*@{*/ - -#include -#include -#include - -/* general */ -#ifdef _WIN32 -typedef DWORD kmq_thread_id; -typedef DWORD kmq_timer; -#endif - -#ifdef _WIN32 -/*! \brief Window message for kmq - - This message is sent to the window procedure of a window if that - window is a subscriber to KMQ messages. - - \see kmq_subscribe_hwnd() for more information about handling this - window message - */ -#define KMQ_WM_DISPATCH (WM_APP+0x100) -#endif - -/* callback */ - -/*! \brief A message callback - - Should return TRUE if the message is properly handled. Otherwise - return FALSE */ -typedef khm_int32 (KHMAPI *kmq_callback_t)(khm_int32 msg_type, - khm_int32 msg_sub_type, - khm_ui_4 uparam, - void * vparam); - -/* message */ - -/*! \brief A single response. - - Certain broadcast messages may user scatter-gather type - notification and result gathering. Individual subscribers to a - message attach their individual responses to a ::kmq_response - object and attach that to the message which can later be read by - the sender of the message. - */ -typedef struct tag_kmq_response { - kmq_thread_id thread; - void * response; - - LDCL(struct tag_kmq_response); -} kmq_response; - -/*! \brief A single message - */ -typedef struct tag_kmq_message { - khm_int32 type; /*!< Type of message */ - khm_int32 subtype; /*!< Subtype of message */ - - khm_ui_4 uparam; /*!< Integer parameter */ - void * vparam; /*!< Pointer to parameter blob */ - - khm_int32 nSent; /*!< Number of instances of message - sent (for broadcast messages) */ - - khm_int32 nCompleted; /*!< Number of instances that have - completed processing (for broadcast - messages) */ - - khm_int32 nFailed; /*!< Number of instances that failed - to process (for broadcast - messages) */ - - kmq_response * responses; /*!< List of responses */ - HANDLE wait_o; /*!< Event to wait on (only valid if - the publisher of the message - requested a handle to the call) */ - - kmq_timer timeSent; /*!< Time at which the message was - sent */ - kmq_timer timeExpire; /*!< Time at which the message - expires */ - - kherr_context * err_ctx; /*!< Error context for the message */ - - khm_int32 refcount; - - LDCL(struct tag_kmq_message); -} kmq_message; - -/*! \brief A handle to a call - */ -typedef kmq_message *kmq_call; - -/*! \brief Message reference */ -typedef struct tag_kmq_message_ref { - kmq_message * msg; /*!< Message that we are referring - to */ - kmq_callback_t recipient; /*!< The recipient of the message */ - - LDCL(struct tag_kmq_message_ref); -} kmq_message_ref; - -/*! \brief Message queue - - Each thread gets its own message queue. When a message is - broadcast to which there is a subscriber in a particular thread, a - reference to the message is placed in the message queue of the - thread. The dispatch procedure then dispatches the message as - described in the message reference. -*/ -typedef struct tag_kmq_queue { - kmq_thread_id thread; /*!< The thread id */ - - CRITICAL_SECTION cs; - HANDLE wait_o; - - khm_int32 load; /*!< Number of messages waiting to be - processed on this message queue. */ - kmq_timer last_post; /*!< Time the last message was - received */ - - khm_int32 flags; /*!< Flags. Currently, it's just KMQ_QUEUE_FLAG_DELETED */ - - /*Q*/ - QDCL(kmq_message_ref); /*!< Queue of message references */ - - /*Lnode*/ - LDCL(struct tag_kmq_queue); -} kmq_queue; - -#define KMQ_QUEUE_FLAG_DELETED 0x0008 - -/*! \brief Message subscription - - A subscription binds a recipient with a message type. These are - specific to a thread. I.e. a subscription that was made in one - thread will not receive messages in the context of another thread. -*/ -typedef struct tag_kmq_msg_subscription { - khm_int32 magic; /*!< Magic number. Should always be - ::KMQ_MSG_SUB_MAGIC */ - khm_int32 type; /*!< Type of message */ - khm_int32 rcpt_type; /*!< Type of recipient. One of - ::KMQ_RCPTTYPE_CB or - ::KMQ_RCPTTYPE_HWND */ - union { - kmq_callback_t cb; /*!< Callback if the subscription is - of callback type */ - HWND hwnd; /*!< Window handle if the subscription - is a windows message type */ - } recipient; - - kmq_queue * queue; /*!< Associated queue */ - - /*lnode*/ - LDCL(struct tag_kmq_msg_subscription); -} kmq_msg_subscription; - -#define KMQ_MSG_SUB_MAGIC 0x3821b58e - -/*! \brief Callback recipient type - - The recipient is a callback function */ -#define KMQ_RCPTTYPE_CB 1 - -/*! \brief Windows recipient type - - The recipient is a window */ -#define KMQ_RCPTTYPE_HWND 2 - -/* publishers */ - -/*! \brief A completion handler for a message - - Each message type can have a completion handler. Once a message - of this a specific type has been broadcast and handled by all the - subscripbers, the message will be passed down to the completion - handler before the associated data structures are freed. This - allows applications that define message type to also define clean - up for each message. For example, the completion handler can - initiate another message if the messages form a sequence or free - up blocks of memory that was passed as the parameter to the - message. - */ -typedef void (KHMAPI *kmq_msg_completion_handler)(kmq_message *); - -/*! \brief A message type - */ -typedef struct tag_kmq_msg_type { - khm_int32 id; /*!< Identifier for the message - type. */ - kmq_msg_subscription * subs; /*!< The list of subscriptions */ - kmq_msg_completion_handler completion_handler; /*!< Completion - handler for the message type */ - - wchar_t * name; /*!< Name of the message type for - named types. Message type names are - language independant. */ - - /*Lnode*/ - LDCL(struct tag_kmq_msg_type); -} kmq_msg_type; - -/*! \brief The maximum number of message types - */ -#define KMQ_MSG_TYPE_MAX 255 - -/*! \brief Maximum number of characters in a message type name - - The count includes the terminating NULL - */ -#define KMQ_MAXCCH_TYPE_NAME 256 - -/*! \brief Maximum number of bytes in a message type name - - Type count includes the terminating NULL - */ -#define KMQ_MAXCB_TYPE_NAME (KMQ_MAXCCH_TYPE_NAME * sizeof(wchar_t)) - -KHMEXP khm_int32 KHMAPI kmq_init(void); - -KHMEXP khm_int32 KHMAPI kmq_exit(void); - -/*! \brief Register a message type - - Registers a custom message type. The \a name parameter specifies - a language independent name for the message type and must be - unique and must be less than ::KMQ_MAXCCH_TYPE_NAME characters. - - \param[in] name Name of the message type. Upto - ::KMQ_MAXCCH_TYPE_NAME characters including terminating NULL. - The \a name cannot be a zero length string. - - \param[out] new_id Receives the new message type ID. Specify NULL - if the new message type is not required. - - \see kmq_find_type() and kmq_unregister_type() - - \retval KHM_ERROR_INVALID_PARAM The \a name parameter was invalid. - \retval KHM_ERROR_EXISTS A message type with that name already exists. - \retval KHM_ERROR_NO_RESOURCES Can't register any more message types. - \retval KHM_ERROR_SUCCESS The operation succeeded. - */ -KHMEXP khm_int32 KHMAPI kmq_register_type(wchar_t * name, khm_int32 * new_id); - -/*! \brief Find a message type - - Find the message type with the given name. If found, the type ID - is returned in \a id. - - \retval KHM_ERROR_SUCCESS A message type with the given name was - found. - \retval KHM_ERROR_NOT_FOUND A message type with the given name was - not found. - */ -KHMEXP khm_int32 KHMAPI kmq_find_type(wchar_t * name, khm_int32 * id); - -/*! \brief Unregister a message type - - Unregisters a message type that was registered using - kmq_register_type(). - - \retval KHM_ERROR_SUCCESS The specified message type was - successfully unregistered. - - \retval KHM_ERROR_NOT_FOUND The message type was not found. - */ -KHMEXP khm_int32 KHMAPI kmq_unregister_type(khm_int32 id); - -/*! \brief Subscribte to a message type. - - Adds a subscription to messages of type \a type. Subscriptions - are managed per thread. Therefore the subscription is actually - added to the subscription list for the current thread (the thread - which calls kmq_subscribe()). - - When a message of type \a type is received by the thread, it is - dispatched to the callback function identified by \a cb within the - context of this thread. - - \note Calling kmq_subscribe() from within multiple threads with - the same \a type and \a cb will result in multiple - subscriptions. - - \see kmq_unsubscribe() - \see kmq_dispatch() -*/ -KHMEXP khm_int32 KHMAPI kmq_subscribe(khm_int32 type, kmq_callback_t cb); - -/*! \brief Subscribe a window to a message type - - Adds the window specified by \a hwnd to the subscription list for - the message type \a type. When a message of this type is posted, - then the window procedure of the window \a hwnd receives a message - ::KMQ_WM_DISPATCH. - - When a window receives a ::KMQ_WM_DISPATCH message, it means that - a message has been posted which is of a type that the window has - subscribed for. Because of the way Windows handles window - messages and the way NetIDMgr message queues work, a thread which - has a window (or thread) procedure can not call kmq_dispatch() to - handle these messages. For threads that have window or thread - message loops, they must call kmq_subscribe_hwnd() to subscribe a - particular window (for thread message loops, this would be the - HWND of the message window for the thread) to NetIDMgr messages. - - There are two supported ways of handling the ::KMQ_WM_DISPATCH - message. Examples of both are provided below. - - Handling the message inline: - - \code - LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - kmq_message * m; - khm_int32 rv; - ... - switch(uMsg) { - case WM_CREATE: - ... - kmq_subscribe_hwnd(KMSG_CRED, hwnd); - ... - break; - - case WM_DESTROY: - ... - kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); - ... - break; - - ... - case KMQ_WM_DISPATCH: - kmq_wm_begin(lParam,&m); - - if(m->type == KMSG_CRED && m->subtype == KMSG_CRED_ROOTDELTA) { - // do something - rv = KHM_ERROR_SUCCESS; - } - - return kmq_wm_end(m, rv); - ... - }; - ... - } - \endcode - - The other method is to dispatch the ::KMQ_WM_DISPATCH message to a - secondary callback function: - - \code - khm_int32 msg_handler(khm_int32 t, khm_int32 st, khm_ui_4 up, void * pb) { - khm_int32 rv = KHM_ERROR_SUCCESS; - - //handle message - - return rv; - } - - LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - kmq_message * m; - khm_int32 rv; - ... - switch(uMsg) { - ... - - case WM_CREATE: - ... - kmq_subscribe_hwnd(KMSG_CRED, hwnd); - ... - break; - - case WM_DESTROY: - ... - kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); - ... - break; - - ... - case KMQ_WM_DISPATCH: - return kmq_wm_dispatch(lParam, msg_handler); - ... - }; - ... - } - \endcode - - \note Make sure you unsubscribe from the message type when the - window is destroyed. - - \see kmq_unsubscribe_hwnd() - \see kmq_wm_begin() - \see kmq_wm_end() - \see kmq_wm_dispatch() - */ -KHMEXP khm_int32 KHMAPI kmq_subscribe_hwnd(khm_int32 type, HWND hwnd); - -#ifdef _WIN32 -/*! \brief Begins handling a KMQ_WM_DISPATCH message - - \return The return value of this function should be ignored. - - \see kmq_subscribe_hwnd() for more details about handling ::KMQ_WM_DISPATCH - */ -KHMEXP LRESULT KHMAPI kmq_wm_begin(LPARAM lparm, kmq_message ** m); - -/*! \brief Ends handling a KMQ_WM_DISPATCH message - - \return The return value of this function should be the return - value of the window procedure. See kmq_subscribe_hwnd() - documentation for example - - \see kmq_subscribe_hwnd() for more details about handling ::KMQ_WM_DISPATCH - */ -KHMEXP LRESULT KHMAPI kmq_wm_end(kmq_message *m, khm_int32 rv); - -/*! \brief Dispatches a KMQ_WM_DISPATCH message to a callback - - \return The return value of this function should be the return - value of the window procedure. See kmq_subscribe_hwnd() - documentation for example. - - \see kmq_subscribe_hwnd() for more details about handling ::KMQ_WM_DISPATCH - */ -KHMEXP LRESULT KHMAPI kmq_wm_dispatch(LPARAM lparm, kmq_callback_t cb); -#endif - -/*! \brief Unsubscribe a callback from a message type - - Removes the subscription for message type \a type for callback - function \a cb from the subscription list for the current thread - (the thread that calls kmq_unsubscribe()). - - \note kmq_unsubscribe() can only remove subscriptions for the subscription - list for the current thread. - - \see kmq_subscribe() - \see kmq_dispatch() -*/ -KHMEXP khm_int32 KHMAPI kmq_unsubscribe(khm_int32 type, kmq_callback_t cb); - -/*! \brief Unsubscribe a window from a message type - - Removes the specific window from the subsription list for message - type \a type. - - \see kmq_subscribe_hwnd() -*/ -KHMEXP khm_int32 KHMAPI kmq_unsubscribe_hwnd(khm_int32 type, HWND hwnd); - -/*! \brief Create an ad-hoc subscription - - An ad-hoc subscription describes a callback point in a thread that - can be dispatched messages to individually without broadcasting. - - \see kmq_post_sub_msg(), kmq_post_sub_msg_ex(), - kmq_send_sub_msg(), kmq_post_subs_msg(), - kmq_post_subs_msg_ex(), kmq_send_subs_msg(), - kmq_delete_subscription() -*/ -KHMEXP khm_int32 KHMAPI kmq_create_subscription( - kmq_callback_t cb, - khm_handle * result); - -/*! \brief Create an ad-hoc subscription for a window - - An ad-hoc subscription describes a window that will be dispatched - messages individually without broadcasting. - - \see kmq_post_sub_msg(), kmq_post_sub_msg_ex(), - kmq_send_sub_msg(), kmq_post_subs_msg(), - kmq_post_subs_msg_ex(), kmq_send_subs_msg(), - kmq_delete_subscription() - */ -KHMEXP khm_int32 KHMAPI kmq_create_hwnd_subscription(HWND hw, - khm_handle * result); - -/*! \brief Delete an ad-hoc subscription - - Deletes a subscriptoin that was created using - kmq_create_subscription() - */ -KHMEXP khm_int32 KHMAPI kmq_delete_subscription(khm_handle sub); - -/*! \brief Post a message to a subscription - - Equivalent of kmq_post_msg() but only posts the message to the - specified subscription. - */ -KHMEXP khm_int32 KHMAPI kmq_post_sub_msg( - khm_handle sub, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam); - -/*! \brief Post a message to a subscription and acquire a handle to the call - */ -KHMEXP khm_int32 KHMAPI kmq_post_sub_msg_ex( - khm_handle sub, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam, - kmq_call * call); - -/*! \brief Send a synchronous message to a subscription - - \retval KHM_ERROR_SUCCESS The call succeeded, and no subscribers reported errors - \retval KHM_ERROR_PARTIAL The call succeeded, but at least one subscriber reported errors - */ -KHMEXP khm_int32 KHMAPI kmq_send_sub_msg( - khm_handle sub, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam); - -/*! \brief Post a message to a group of subscriptions - - The block of memory pointed to by \a subs should be an array of - subscriptions. The number of elements in that array should be \a - n_subs. A message as specified by the remaining parameters will - be dispatched to all of the subscription points in the array. - */ -KHMEXP khm_int32 KHMAPI kmq_post_subs_msg( - khm_handle * subs, - khm_size n_subs, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam); - -/*! \brief Post a message to a group of subscriptions and acquire a handle to the call - - The block of memory pointed to by \a subs should be an array of - subscriptions. The number of elements in that array should be \a - n_subs. A message as specified by the remaining parameters will - be dispatched to all of the subscription points in the array, and - a handle to the call will be returned in \a call. - - The returned \a call will reference all of the dispatches that - were made. -*/ -KHMEXP khm_int32 KHMAPI kmq_post_subs_msg_ex( - khm_handle * subs, - khm_int32 n_subs, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam, - kmq_call * call); - -/*! \brief Send a synchronous message to a group of subscriptions - - The block of memory pointed to by \a subs should be an array of - subscriptions. The number of elements in that array should be \a - n_subs. A message as specified by the remaining parameters will - be dispatched to all of the subscription points in the array. The - function will not return until all of the calls have succeeded. - - \retval KHM_ERROR_SUCCESS The call succeeded, and no subscribers reported errors - \retval KHM_ERROR_PARTIAL The call succeeded, but at least one subscriber reported errors -*/ -KHMEXP khm_int32 KHMAPI kmq_send_subs_msg( - khm_handle *subs, - khm_int32 n_subs, - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * vparam); - -/*! \brief Dispatch a message for the current thread. - - This function opens the message list for the current thread and - dispatches the first message instance that is found. Note that if - multiple callbacks subscribe to the same message type in the same - thread, then when a message of that type is received, multiple - message instances are added to the message queue corresponding to - each subscription. - - If no message instances are waiting in the queue, kmq_dispatch() - waits for the \a timeout period for a message. - - \param[in] timeout The timeout period in milliseconds. Specify INFINITE for - kmq_dispatch() to wait indefinitely. - - \retval KHM_ERROR_SUCCESS A message instance was dispatched - \retval KHM_ERROR_TIMEOUT The timeout period elapsed - \retval KHM_ERROR_EXIT The message found on the queue was -*/ -KHMEXP khm_int32 KHMAPI kmq_dispatch(kmq_timer timeout); - -/*! \brief Send a message - - The specified message will be posted to all the subscribers of the - message type. Then the function will wait for all the subscribers - to finish processing the message before returning. - - \param[in] type The type of the message - \param[in] subtype The subtype - \param[in] uparam The khm_ui_4 parameter for the message - \param[in] blob The parameter blob for the message - - \note The internal timeout for this function is INFINITE. If you - it is desirable to use a different timeout, use - kmq_post_message_ex() and kmq_wait() functions. - - \retval KHM_ERROR_SUCCESS The call succeeded and no subscribers returned errors - \retval KHM_ERROR_PARTIAL The call succeeded but at least one subscriber returned an error -*/ -KHMEXP khm_int32 KHMAPI kmq_send_message( - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * blob); - -/*! \brief Post a message - - The specified message will be posted to all the subscribers of the - message type. The function returns immediately. - - If you want to be able to wait for all the subscribers to finish - processing the message, you should use kmq_post_message_ex() - instead. - - \param[in] type The type of the message - \param[in] subtype The subtype - \param[in] uparam The khm_ui_4 parameter for the message - \param[in] blob The parameter blob for the message -*/ -KHMEXP khm_int32 KHMAPI kmq_post_message( - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * blob); - -/*! \brief Post a message and acquire a handle to the call. - - The specified message is posted to all the subscribers. In - addition, a handle is obtained for the call which can be used in - subsequent call to kmq_free_call() or kmq_wait(). - - Call kmq_free_call() to free the handle. - - \param[in] type The type of the message - \param[in] subtype The subtype - \param[in] uparam The khm_ui_4 parameter for the message - \param[in] blob The parameter blob for the message - \param[out] call Receives the call handle. Set to NULL if the call handle is not required. - - \see kmq_free_call() -*/ -KHMEXP khm_int32 KHMAPI kmq_post_message_ex( - khm_int32 type, - khm_int32 subtype, - khm_ui_4 uparam, - void * blob, - kmq_call * call); - -/*! \brief Free a handle to a call obtained through kmq_post_message_ex() - - All call handles obtained through kmq_post_message_ex() must be - freed via a call to kmq_free_call(). -*/ -KHMEXP khm_int32 KHMAPI kmq_free_call(kmq_call call); - -/*! \brief Sends a message to the specified thread. - - The message itself will not be received by any callback function, - however, any kmq_dispatch() function that is currently active of - becomes active will exit with a KHM_ERROR_EXIT code. - kmq_send_thread_quit_message() will wait for this to happen before - returning. - */ -KHMEXP khm_int32 KHMAPI kmq_send_thread_quit_message( - kmq_thread_id thread, - khm_ui_4 uparam); - -/*! \brief Post a message to the specified thread. - - The message itself will not be received by any callback function, - however, any kmq_dispatch() function that is currently active of - becomes active will exit with a KHM_ERROR_EXIT code. - kmq_post_thread_quit_message() will return immediately. - */ -KHMEXP khm_int32 KHMAPI kmq_post_thread_quit_message( - kmq_thread_id thread, - khm_ui_4 uparam, - kmq_call * call); - -KHMEXP khm_int32 KHMAPI kmq_get_next_response(kmq_call call, void ** resp); - -/*! \brief Check if a specific call has completed - - \return TRUE if the call has completed. FALSE otherwise. -*/ -KHMEXP khm_boolean KHMAPI kmq_has_completed(kmq_call call); - -/*! \brief Wait for a call to complete. - - Waits for the specified call to complete. If the call dispatched - to multiple recipients, the function waits for all dispatches to - complete. - - If the call has already completed, then the function returns - immediately. - - If more than one thread is waiting for a single message to - complete, then only one of them will be released when the message - compeltes. Each subsequent thread will be released as each - released thread calls kmq_free_call(). - - \param[in] call A handle to a call. - \param[in] timeout Specifies, in milliseconds, the amount of time - to wait for the call to complete. Specify INFINITE to wait - indefinitely. - - \retval KHM_ERROR_SUCCESS The call completed - \retval KHM_ERROR_TIMEOUT The timeout period expired - \retval KHM_ERROR_INVALID_PARAM One of the parameters were invalid. -*/ -KHMEXP khm_int32 KHMAPI kmq_wait(kmq_call call, kmq_timer timeout); - -/*! \brief Sets the completion handler for a specified message type. - - \note Only one completion handler can exist for one message type. - Calling this function overwrites the previous completion - handler. -*/ -KHMEXP khm_int32 KHMAPI kmq_set_completion_handler( - khm_int32 type, - kmq_msg_completion_handler hander); - -/*@}*/ -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KMQ_H__ +#define __KHIMAIRA_KMQ_H__ + +/*! \defgroup kmq NetIDMgr Message Queue */ +/*@{*/ + +#include +#include +#include + +/* general */ +#ifdef _WIN32 +typedef DWORD kmq_thread_id; +typedef DWORD kmq_timer; +#endif + +#ifdef _WIN32 +/*! \brief Window message for kmq + + This message is sent to the window procedure of a window if that + window is a subscriber to KMQ messages. + + \see kmq_subscribe_hwnd() for more information about handling this + window message + */ +#define KMQ_WM_DISPATCH (WM_APP+0x100) +#endif + +/* callback */ + +/*! \brief A message callback + + Should return TRUE if the message is properly handled. Otherwise + return FALSE */ +typedef khm_int32 (KHMAPI *kmq_callback_t)(khm_int32 msg_type, + khm_int32 msg_sub_type, + khm_ui_4 uparam, + void * vparam); + +/* message */ + +/*! \brief A single response. + + Certain broadcast messages may user scatter-gather type + notification and result gathering. Individual subscribers to a + message attach their individual responses to a ::kmq_response + object and attach that to the message which can later be read by + the sender of the message. + */ +typedef struct tag_kmq_response { + kmq_thread_id thread; + void * response; + + LDCL(struct tag_kmq_response); +} kmq_response; + +/*! \brief A single message + */ +typedef struct tag_kmq_message { + khm_int32 type; /*!< Type of message */ + khm_int32 subtype; /*!< Subtype of message */ + + khm_ui_4 uparam; /*!< Integer parameter */ + void * vparam; /*!< Pointer to parameter blob */ + + khm_int32 nSent; /*!< Number of instances of message + sent (for broadcast messages) */ + + khm_int32 nCompleted; /*!< Number of instances that have + completed processing (for broadcast + messages) */ + + khm_int32 nFailed; /*!< Number of instances that failed + to process (for broadcast + messages) */ + + kmq_response * responses; /*!< List of responses */ + HANDLE wait_o; /*!< Event to wait on (only valid if + the publisher of the message + requested a handle to the call) */ + + kmq_timer timeSent; /*!< Time at which the message was + sent */ + kmq_timer timeExpire; /*!< Time at which the message + expires */ + + kherr_context * err_ctx; /*!< Error context for the message */ + + khm_int32 refcount; + + LDCL(struct tag_kmq_message); +} kmq_message; + +/*! \brief A handle to a call + */ +typedef kmq_message *kmq_call; + +/*! \brief Message reference */ +typedef struct tag_kmq_message_ref { + kmq_message * msg; /*!< Message that we are referring + to */ + kmq_callback_t recipient; /*!< The recipient of the message */ + + LDCL(struct tag_kmq_message_ref); +} kmq_message_ref; + +/*! \brief Message queue + + Each thread gets its own message queue. When a message is + broadcast to which there is a subscriber in a particular thread, a + reference to the message is placed in the message queue of the + thread. The dispatch procedure then dispatches the message as + described in the message reference. +*/ +typedef struct tag_kmq_queue { + kmq_thread_id thread; /*!< The thread id */ + + CRITICAL_SECTION cs; + HANDLE wait_o; + + khm_int32 load; /*!< Number of messages waiting to be + processed on this message queue. */ + kmq_timer last_post; /*!< Time the last message was + received */ + + khm_int32 flags; /*!< Flags. Currently, it's just KMQ_QUEUE_FLAG_DELETED */ + + /*Q*/ + QDCL(kmq_message_ref); /*!< Queue of message references */ + + /*Lnode*/ + LDCL(struct tag_kmq_queue); +} kmq_queue; + +#define KMQ_QUEUE_FLAG_DELETED 0x0008 + +/*! \brief Message subscription + + A subscription binds a recipient with a message type. These are + specific to a thread. I.e. a subscription that was made in one + thread will not receive messages in the context of another thread. +*/ +typedef struct tag_kmq_msg_subscription { + khm_int32 magic; /*!< Magic number. Should always be + ::KMQ_MSG_SUB_MAGIC */ + khm_int32 type; /*!< Type of message */ + khm_int32 rcpt_type; /*!< Type of recipient. One of + ::KMQ_RCPTTYPE_CB or + ::KMQ_RCPTTYPE_HWND */ + union { + kmq_callback_t cb; /*!< Callback if the subscription is + of callback type */ + HWND hwnd; /*!< Window handle if the subscription + is a windows message type */ + } recipient; + + kmq_queue * queue; /*!< Associated queue */ + + /*lnode*/ + LDCL(struct tag_kmq_msg_subscription); +} kmq_msg_subscription; + +#define KMQ_MSG_SUB_MAGIC 0x3821b58e + +/*! \brief Callback recipient type + + The recipient is a callback function */ +#define KMQ_RCPTTYPE_CB 1 + +/*! \brief Windows recipient type + + The recipient is a window */ +#define KMQ_RCPTTYPE_HWND 2 + +/* publishers */ + +/*! \brief A completion handler for a message + + Each message type can have a completion handler. Once a message + of this a specific type has been broadcast and handled by all the + subscripbers, the message will be passed down to the completion + handler before the associated data structures are freed. This + allows applications that define message type to also define clean + up for each message. For example, the completion handler can + initiate another message if the messages form a sequence or free + up blocks of memory that was passed as the parameter to the + message. + */ +typedef void (KHMAPI *kmq_msg_completion_handler)(kmq_message *); + +/*! \brief A message type + */ +typedef struct tag_kmq_msg_type { + khm_int32 id; /*!< Identifier for the message + type. */ + kmq_msg_subscription * subs; /*!< The list of subscriptions */ + kmq_msg_completion_handler completion_handler; /*!< Completion + handler for the message type */ + + wchar_t * name; /*!< Name of the message type for + named types. Message type names are + language independant. */ + + /*Lnode*/ + LDCL(struct tag_kmq_msg_type); +} kmq_msg_type; + +/*! \brief The maximum number of message types + */ +#define KMQ_MSG_TYPE_MAX 255 + +/*! \brief Maximum number of characters in a message type name + + The count includes the terminating NULL + */ +#define KMQ_MAXCCH_TYPE_NAME 256 + +/*! \brief Maximum number of bytes in a message type name + + Type count includes the terminating NULL + */ +#define KMQ_MAXCB_TYPE_NAME (KMQ_MAXCCH_TYPE_NAME * sizeof(wchar_t)) + +KHMEXP khm_int32 KHMAPI kmq_init(void); + +KHMEXP khm_int32 KHMAPI kmq_exit(void); + +/*! \brief Register a message type + + Registers a custom message type. The \a name parameter specifies + a language independent name for the message type and must be + unique and must be less than ::KMQ_MAXCCH_TYPE_NAME characters. + + \param[in] name Name of the message type. Upto + ::KMQ_MAXCCH_TYPE_NAME characters including terminating NULL. + The \a name cannot be a zero length string. + + \param[out] new_id Receives the new message type ID. Specify NULL + if the new message type is not required. + + \see kmq_find_type() and kmq_unregister_type() + + \retval KHM_ERROR_INVALID_PARAM The \a name parameter was invalid. + \retval KHM_ERROR_EXISTS A message type with that name already exists. + \retval KHM_ERROR_NO_RESOURCES Can't register any more message types. + \retval KHM_ERROR_SUCCESS The operation succeeded. + */ +KHMEXP khm_int32 KHMAPI kmq_register_type(wchar_t * name, khm_int32 * new_id); + +/*! \brief Find a message type + + Find the message type with the given name. If found, the type ID + is returned in \a id. + + \retval KHM_ERROR_SUCCESS A message type with the given name was + found. + \retval KHM_ERROR_NOT_FOUND A message type with the given name was + not found. + */ +KHMEXP khm_int32 KHMAPI kmq_find_type(wchar_t * name, khm_int32 * id); + +/*! \brief Unregister a message type + + Unregisters a message type that was registered using + kmq_register_type(). + + \retval KHM_ERROR_SUCCESS The specified message type was + successfully unregistered. + + \retval KHM_ERROR_NOT_FOUND The message type was not found. + */ +KHMEXP khm_int32 KHMAPI kmq_unregister_type(khm_int32 id); + +/*! \brief Subscribte to a message type. + + Adds a subscription to messages of type \a type. Subscriptions + are managed per thread. Therefore the subscription is actually + added to the subscription list for the current thread (the thread + which calls kmq_subscribe()). + + When a message of type \a type is received by the thread, it is + dispatched to the callback function identified by \a cb within the + context of this thread. + + \note Calling kmq_subscribe() from within multiple threads with + the same \a type and \a cb will result in multiple + subscriptions. + + \see kmq_unsubscribe() + \see kmq_dispatch() +*/ +KHMEXP khm_int32 KHMAPI kmq_subscribe(khm_int32 type, kmq_callback_t cb); + +/*! \brief Subscribe a window to a message type + + Adds the window specified by \a hwnd to the subscription list for + the message type \a type. When a message of this type is posted, + then the window procedure of the window \a hwnd receives a message + ::KMQ_WM_DISPATCH. + + When a window receives a ::KMQ_WM_DISPATCH message, it means that + a message has been posted which is of a type that the window has + subscribed for. Because of the way Windows handles window + messages and the way NetIDMgr message queues work, a thread which + has a window (or thread) procedure can not call kmq_dispatch() to + handle these messages. For threads that have window or thread + message loops, they must call kmq_subscribe_hwnd() to subscribe a + particular window (for thread message loops, this would be the + HWND of the message window for the thread) to NetIDMgr messages. + + There are two supported ways of handling the ::KMQ_WM_DISPATCH + message. Examples of both are provided below. + + Handling the message inline: + + \code + LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + kmq_message * m; + khm_int32 rv; + ... + switch(uMsg) { + case WM_CREATE: + ... + kmq_subscribe_hwnd(KMSG_CRED, hwnd); + ... + break; + + case WM_DESTROY: + ... + kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); + ... + break; + + ... + case KMQ_WM_DISPATCH: + kmq_wm_begin(lParam,&m); + + if(m->type == KMSG_CRED && m->subtype == KMSG_CRED_ROOTDELTA) { + // do something + rv = KHM_ERROR_SUCCESS; + } + + return kmq_wm_end(m, rv); + ... + }; + ... + } + \endcode + + The other method is to dispatch the ::KMQ_WM_DISPATCH message to a + secondary callback function: + + \code + khm_int32 msg_handler(khm_int32 t, khm_int32 st, khm_ui_4 up, void * pb) { + khm_int32 rv = KHM_ERROR_SUCCESS; + + //handle message + + return rv; + } + + LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + kmq_message * m; + khm_int32 rv; + ... + switch(uMsg) { + ... + + case WM_CREATE: + ... + kmq_subscribe_hwnd(KMSG_CRED, hwnd); + ... + break; + + case WM_DESTROY: + ... + kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); + ... + break; + + ... + case KMQ_WM_DISPATCH: + return kmq_wm_dispatch(lParam, msg_handler); + ... + }; + ... + } + \endcode + + \note Make sure you unsubscribe from the message type when the + window is destroyed. + + \see kmq_unsubscribe_hwnd() + \see kmq_wm_begin() + \see kmq_wm_end() + \see kmq_wm_dispatch() + */ +KHMEXP khm_int32 KHMAPI kmq_subscribe_hwnd(khm_int32 type, HWND hwnd); + +#ifdef _WIN32 +/*! \brief Begins handling a KMQ_WM_DISPATCH message + + \return The return value of this function should be ignored. + + \see kmq_subscribe_hwnd() for more details about handling ::KMQ_WM_DISPATCH + */ +KHMEXP LRESULT KHMAPI kmq_wm_begin(LPARAM lparm, kmq_message ** m); + +/*! \brief Ends handling a KMQ_WM_DISPATCH message + + \return The return value of this function should be the return + value of the window procedure. See kmq_subscribe_hwnd() + documentation for example + + \see kmq_subscribe_hwnd() for more details about handling ::KMQ_WM_DISPATCH + */ +KHMEXP LRESULT KHMAPI kmq_wm_end(kmq_message *m, khm_int32 rv); + +/*! \brief Dispatches a KMQ_WM_DISPATCH message to a callback + + \return The return value of this function should be the return + value of the window procedure. See kmq_subscribe_hwnd() + documentation for example. + + \see kmq_subscribe_hwnd() for more details about handling ::KMQ_WM_DISPATCH + */ +KHMEXP LRESULT KHMAPI kmq_wm_dispatch(LPARAM lparm, kmq_callback_t cb); +#endif + +/*! \brief Unsubscribe a callback from a message type + + Removes the subscription for message type \a type for callback + function \a cb from the subscription list for the current thread + (the thread that calls kmq_unsubscribe()). + + \note kmq_unsubscribe() can only remove subscriptions for the subscription + list for the current thread. + + \see kmq_subscribe() + \see kmq_dispatch() +*/ +KHMEXP khm_int32 KHMAPI kmq_unsubscribe(khm_int32 type, kmq_callback_t cb); + +/*! \brief Unsubscribe a window from a message type + + Removes the specific window from the subsription list for message + type \a type. + + \see kmq_subscribe_hwnd() +*/ +KHMEXP khm_int32 KHMAPI kmq_unsubscribe_hwnd(khm_int32 type, HWND hwnd); + +/*! \brief Create an ad-hoc subscription + + An ad-hoc subscription describes a callback point in a thread that + can be dispatched messages to individually without broadcasting. + + \see kmq_post_sub_msg(), kmq_post_sub_msg_ex(), + kmq_send_sub_msg(), kmq_post_subs_msg(), + kmq_post_subs_msg_ex(), kmq_send_subs_msg(), + kmq_delete_subscription() +*/ +KHMEXP khm_int32 KHMAPI kmq_create_subscription( + kmq_callback_t cb, + khm_handle * result); + +/*! \brief Create an ad-hoc subscription for a window + + An ad-hoc subscription describes a window that will be dispatched + messages individually without broadcasting. + + \see kmq_post_sub_msg(), kmq_post_sub_msg_ex(), + kmq_send_sub_msg(), kmq_post_subs_msg(), + kmq_post_subs_msg_ex(), kmq_send_subs_msg(), + kmq_delete_subscription() + */ +KHMEXP khm_int32 KHMAPI kmq_create_hwnd_subscription(HWND hw, + khm_handle * result); + +/*! \brief Delete an ad-hoc subscription + + Deletes a subscriptoin that was created using + kmq_create_subscription() + */ +KHMEXP khm_int32 KHMAPI kmq_delete_subscription(khm_handle sub); + +/*! \brief Post a message to a subscription + + Equivalent of kmq_post_msg() but only posts the message to the + specified subscription. + */ +KHMEXP khm_int32 KHMAPI kmq_post_sub_msg( + khm_handle sub, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam); + +/*! \brief Post a message to a subscription and acquire a handle to the call + */ +KHMEXP khm_int32 KHMAPI kmq_post_sub_msg_ex( + khm_handle sub, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam, + kmq_call * call); + +/*! \brief Send a synchronous message to a subscription + + \retval KHM_ERROR_SUCCESS The call succeeded, and no subscribers reported errors + \retval KHM_ERROR_PARTIAL The call succeeded, but at least one subscriber reported errors + */ +KHMEXP khm_int32 KHMAPI kmq_send_sub_msg( + khm_handle sub, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam); + +/*! \brief Post a message to a group of subscriptions + + The block of memory pointed to by \a subs should be an array of + subscriptions. The number of elements in that array should be \a + n_subs. A message as specified by the remaining parameters will + be dispatched to all of the subscription points in the array. + */ +KHMEXP khm_int32 KHMAPI kmq_post_subs_msg( + khm_handle * subs, + khm_size n_subs, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam); + +/*! \brief Post a message to a group of subscriptions and acquire a handle to the call + + The block of memory pointed to by \a subs should be an array of + subscriptions. The number of elements in that array should be \a + n_subs. A message as specified by the remaining parameters will + be dispatched to all of the subscription points in the array, and + a handle to the call will be returned in \a call. + + The returned \a call will reference all of the dispatches that + were made. +*/ +KHMEXP khm_int32 KHMAPI kmq_post_subs_msg_ex( + khm_handle * subs, + khm_int32 n_subs, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam, + kmq_call * call); + +/*! \brief Send a synchronous message to a group of subscriptions + + The block of memory pointed to by \a subs should be an array of + subscriptions. The number of elements in that array should be \a + n_subs. A message as specified by the remaining parameters will + be dispatched to all of the subscription points in the array. The + function will not return until all of the calls have succeeded. + + \retval KHM_ERROR_SUCCESS The call succeeded, and no subscribers reported errors + \retval KHM_ERROR_PARTIAL The call succeeded, but at least one subscriber reported errors +*/ +KHMEXP khm_int32 KHMAPI kmq_send_subs_msg( + khm_handle *subs, + khm_int32 n_subs, + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * vparam); + +/*! \brief Dispatch a message for the current thread. + + This function opens the message list for the current thread and + dispatches the first message instance that is found. Note that if + multiple callbacks subscribe to the same message type in the same + thread, then when a message of that type is received, multiple + message instances are added to the message queue corresponding to + each subscription. + + If no message instances are waiting in the queue, kmq_dispatch() + waits for the \a timeout period for a message. + + \param[in] timeout The timeout period in milliseconds. Specify INFINITE for + kmq_dispatch() to wait indefinitely. + + \retval KHM_ERROR_SUCCESS A message instance was dispatched + \retval KHM_ERROR_TIMEOUT The timeout period elapsed + \retval KHM_ERROR_EXIT The message found on the queue was +*/ +KHMEXP khm_int32 KHMAPI kmq_dispatch(kmq_timer timeout); + +/*! \brief Send a message + + The specified message will be posted to all the subscribers of the + message type. Then the function will wait for all the subscribers + to finish processing the message before returning. + + \param[in] type The type of the message + \param[in] subtype The subtype + \param[in] uparam The khm_ui_4 parameter for the message + \param[in] blob The parameter blob for the message + + \note The internal timeout for this function is INFINITE. If you + it is desirable to use a different timeout, use + kmq_post_message_ex() and kmq_wait() functions. + + \retval KHM_ERROR_SUCCESS The call succeeded and no subscribers returned errors + \retval KHM_ERROR_PARTIAL The call succeeded but at least one subscriber returned an error +*/ +KHMEXP khm_int32 KHMAPI kmq_send_message( + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * blob); + +/*! \brief Post a message + + The specified message will be posted to all the subscribers of the + message type. The function returns immediately. + + If you want to be able to wait for all the subscribers to finish + processing the message, you should use kmq_post_message_ex() + instead. + + \param[in] type The type of the message + \param[in] subtype The subtype + \param[in] uparam The khm_ui_4 parameter for the message + \param[in] blob The parameter blob for the message +*/ +KHMEXP khm_int32 KHMAPI kmq_post_message( + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * blob); + +/*! \brief Post a message and acquire a handle to the call. + + The specified message is posted to all the subscribers. In + addition, a handle is obtained for the call which can be used in + subsequent call to kmq_free_call() or kmq_wait(). + + Call kmq_free_call() to free the handle. + + \param[in] type The type of the message + \param[in] subtype The subtype + \param[in] uparam The khm_ui_4 parameter for the message + \param[in] blob The parameter blob for the message + \param[out] call Receives the call handle. Set to NULL if the call handle is not required. + + \see kmq_free_call() +*/ +KHMEXP khm_int32 KHMAPI kmq_post_message_ex( + khm_int32 type, + khm_int32 subtype, + khm_ui_4 uparam, + void * blob, + kmq_call * call); + +/*! \brief Free a handle to a call obtained through kmq_post_message_ex() + + All call handles obtained through kmq_post_message_ex() must be + freed via a call to kmq_free_call(). +*/ +KHMEXP khm_int32 KHMAPI kmq_free_call(kmq_call call); + +/*! \brief Sends a message to the specified thread. + + The message itself will not be received by any callback function, + however, any kmq_dispatch() function that is currently active of + becomes active will exit with a KHM_ERROR_EXIT code. + kmq_send_thread_quit_message() will wait for this to happen before + returning. + */ +KHMEXP khm_int32 KHMAPI kmq_send_thread_quit_message( + kmq_thread_id thread, + khm_ui_4 uparam); + +/*! \brief Post a message to the specified thread. + + The message itself will not be received by any callback function, + however, any kmq_dispatch() function that is currently active of + becomes active will exit with a KHM_ERROR_EXIT code. + kmq_post_thread_quit_message() will return immediately. + */ +KHMEXP khm_int32 KHMAPI kmq_post_thread_quit_message( + kmq_thread_id thread, + khm_ui_4 uparam, + kmq_call * call); + +KHMEXP khm_int32 KHMAPI kmq_get_next_response(kmq_call call, void ** resp); + +/*! \brief Check if a specific call has completed + + \return TRUE if the call has completed. FALSE otherwise. +*/ +KHMEXP khm_boolean KHMAPI kmq_has_completed(kmq_call call); + +/*! \brief Wait for a call to complete. + + Waits for the specified call to complete. If the call dispatched + to multiple recipients, the function waits for all dispatches to + complete. + + If the call has already completed, then the function returns + immediately. + + If more than one thread is waiting for a single message to + complete, then only one of them will be released when the message + compeltes. Each subsequent thread will be released as each + released thread calls kmq_free_call(). + + \param[in] call A handle to a call. + \param[in] timeout Specifies, in milliseconds, the amount of time + to wait for the call to complete. Specify INFINITE to wait + indefinitely. + + \retval KHM_ERROR_SUCCESS The call completed + \retval KHM_ERROR_TIMEOUT The timeout period expired + \retval KHM_ERROR_INVALID_PARAM One of the parameters were invalid. +*/ +KHMEXP khm_int32 KHMAPI kmq_wait(kmq_call call, kmq_timer timeout); + +/*! \brief Sets the completion handler for a specified message type. + + \note Only one completion handler can exist for one message type. + Calling this function overwrites the previous completion + handler. +*/ +KHMEXP khm_int32 KHMAPI kmq_set_completion_handler( + khm_int32 type, + kmq_msg_completion_handler hander); + +/*@}*/ +#endif --- krb5-1.4.4.orig/src/windows/identity/util/hashtable.h +++ krb5-1.4.4/src/windows/identity/util/hashtable.h @@ -1,223 +1,223 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_HASHTABLE_H -#define __KHIMAIRA_HASHTABLE_H - -/*! \addtogroup util - @{ */ - -/*! \defgroup util_ht Hashtable - @{*/ - -#include -#include - -/*! \brief A hash function - - The function should take a key as a parameter and return an - khm_int32 that serves as the hash of the key. - */ -typedef khm_int32 (*hash_function_t)(const void *key); - -/*! \brief A comparison function - - The function takes two keys and returns a value indicating the - relative ordering of the two keys. - - The return value should be: - - \b Zero if \a key1 == \a key2 - - \b Negative if \a key1 < \a key2 - - \b Positive if \a key1 > \a key2 - */ -typedef khm_int32 (*comp_function_t)(const void *key1, const void *key2); - -/*! \brief Add-reference function - - When an object is successfully added to a hashtable, this function - will be called with the \a key and \a data used to add the object. - The function is allowed to modify \a data, however, the - modification should not alter the \a key or the relationship - between \a key and \a data. - */ -typedef void (*add_ref_function_t)(const void *key, void *data); - -/*! \brief Delete-reference function - - When an object is successfully removed from the hashtable, this - function will be called. As with the add-ref function, the object - can be modified, but the \a key and the relationship between \a - key and \a data should remain intact. - - An object is removed if it is explicitly removed from the - hashtable or another object with the same \a key is added to the - hashtable. There should be a 1-1 correspondence with keys and - objects in the hashtable. The delete-reference function will be - called on all the remaining objects in the hashtable when the - hashtable is deleted. - */ -typedef void (*del_ref_function_t)(const void *key, void *data); - -typedef struct tag_hash_bin { - void * data; - void * key; - - LDCL(struct tag_hash_bin); -} hash_bin; - -typedef struct hashtable_t { - khm_int32 n; - hash_function_t hash; - comp_function_t comp; - add_ref_function_t addr; - del_ref_function_t delr; - hash_bin ** bins; -} hashtable; - -/*! \brief Create a new hashtable - - \param[in] n Number of bins in hashtable. - \param[in] hash A hash function. Required. - \param[in] comp A comparator. Required. - \param[in] addr An add-ref function. Optional; can be NULL. - \param[in] delr A del-ref function. Optional; can be NULL. - - */ -KHMEXP hashtable * KHMAPI hash_new_hashtable(khm_int32 n, - hash_function_t hash, - comp_function_t comp, - add_ref_function_t addr, - del_ref_function_t delr); - -/*! \brief Delete a hashtable - - \note Not thread-safe. Applications must serialize calls that - reference the same hashtable. - */ -KHMEXP void KHMAPI hash_del_hashtable(hashtable * h); - -/*! \brief Add an object to a hashtable - - Creates an association between the \a key and \a data in the - hashtable \a h. If there is an add-ref function defined for the - hashtable, it will be called with \a key and \data after the - object is added. If there is already an object with the same key - in the hashtable, that object will be removed (and the del-ref - function called, if appilcable) before adding the new object and - before the add-ref function is called for the new object. - - Note that two keys \a key1 and \a key2 are equal (or same) in a - hashtable if the comparator returns zero when called with \a key1 - and \a key2. - - Also note that all additions and removals to the hashtable are - done by reference. No data is copied. Any objects pointed to are - expected to exist for the duration that the object and key are - contained in the hashtable. - - \param[in] h Hashtable - \param[in] key A key. If \a key points to a location in memory, - it should be within the object pointed to by \a data, or be a - constant. Can be NULL. - \param[in] data Data. Cannot be NULL. - - \note Not thread-safe. Applications must serialize calls that - reference the same hashtable. - */ -KHMEXP void KHMAPI hash_add(hashtable * h, void * key, void * data); - -/*! \brief Delete an object from a hashtable - - Deletes the object in the hashtable \a h that is associated with - key \a key. An object is associated with key \a key if the key \a - key_o that the object is associated with is the same as \a key as - determined by the comparator. If the del-ref function is defined - for the hash-table, it will be called with the \a key_o and \a - data that was used to add the object. - - \note Not thread-safe. Applications must serialize calls that - reference the same hashtable. - */ -KHMEXP void KHMAPI hash_del(hashtable * h, void * key); - -/*! \brief Resolve and association - - Return the object that is associated with key \a key in hashtable - \a h. An object \a data is associated with key \a key in \a h if - the key \a key_o that was used to add \a data to \a h is equal to - \a key as determined by the comparator. - - Returns NULL if no association is found. - - \note Not thread-safe. Applications must serialize calls that - reference the same hashtable. - */ -KHMEXP void * KHMAPI hash_lookup(hashtable * h, void * key); - -/*! \brief Check for the presence of an association - - Returns non-zero if there exists an association between key \a key - and some object in hashtable \a h. See hash_lookup() for - definition of "association". - - Returns zero if there is no association. - - \note (hash_lookup(h,key) == NULL) iff (hash_exist(h,key)==0) - - \note Not thead-safe. Application must serialize calls that - reference the same hashtable. - */ -KHMEXP khm_boolean KHMAPI hash_exist(hashtable * h, void * key); - -/*! \brief Compute a hashvalue for a unicode string - - The hash value is computed using DJB with parameter 13331. - - This function is suitable for use as the hash function for a - hashtable if the keys are NULL terminated safe unicode strings - that are either part of the data objects or are constants. - - \param[in] str A pointer to a NULL terminated wchar_t string cast - as (void *). - */ -KHMEXP khm_int32 hash_string(const void *str); - -/*! \brief Compare two strings - - Compares two strings are returns a value that is in accordance - with the comparator for a hashtable. - - \param[in] vs1 A pointer to a NULL terminated wchar_t string cast - as (void *). - \param[in] vs2 A pointer to a NULL terminated wchar_t string cast - as (void *). - */ -KHMEXP khm_int32 hash_string_comp(const void *vs1, const void *vs2); - -/*@}*/ -/*@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_HASHTABLE_H +#define __KHIMAIRA_HASHTABLE_H + +/*! \addtogroup util + @{ */ + +/*! \defgroup util_ht Hashtable + @{*/ + +#include +#include + +/*! \brief A hash function + + The function should take a key as a parameter and return an + khm_int32 that serves as the hash of the key. + */ +typedef khm_int32 (*hash_function_t)(const void *key); + +/*! \brief A comparison function + + The function takes two keys and returns a value indicating the + relative ordering of the two keys. + + The return value should be: + - \b Zero if \a key1 == \a key2 + - \b Negative if \a key1 < \a key2 + - \b Positive if \a key1 > \a key2 + */ +typedef khm_int32 (*comp_function_t)(const void *key1, const void *key2); + +/*! \brief Add-reference function + + When an object is successfully added to a hashtable, this function + will be called with the \a key and \a data used to add the object. + The function is allowed to modify \a data, however, the + modification should not alter the \a key or the relationship + between \a key and \a data. + */ +typedef void (*add_ref_function_t)(const void *key, void *data); + +/*! \brief Delete-reference function + + When an object is successfully removed from the hashtable, this + function will be called. As with the add-ref function, the object + can be modified, but the \a key and the relationship between \a + key and \a data should remain intact. + + An object is removed if it is explicitly removed from the + hashtable or another object with the same \a key is added to the + hashtable. There should be a 1-1 correspondence with keys and + objects in the hashtable. The delete-reference function will be + called on all the remaining objects in the hashtable when the + hashtable is deleted. + */ +typedef void (*del_ref_function_t)(const void *key, void *data); + +typedef struct tag_hash_bin { + void * data; + void * key; + + LDCL(struct tag_hash_bin); +} hash_bin; + +typedef struct hashtable_t { + khm_int32 n; + hash_function_t hash; + comp_function_t comp; + add_ref_function_t addr; + del_ref_function_t delr; + hash_bin ** bins; +} hashtable; + +/*! \brief Create a new hashtable + + \param[in] n Number of bins in hashtable. + \param[in] hash A hash function. Required. + \param[in] comp A comparator. Required. + \param[in] addr An add-ref function. Optional; can be NULL. + \param[in] delr A del-ref function. Optional; can be NULL. + + */ +KHMEXP hashtable * KHMAPI hash_new_hashtable(khm_int32 n, + hash_function_t hash, + comp_function_t comp, + add_ref_function_t addr, + del_ref_function_t delr); + +/*! \brief Delete a hashtable + + \note Not thread-safe. Applications must serialize calls that + reference the same hashtable. + */ +KHMEXP void KHMAPI hash_del_hashtable(hashtable * h); + +/*! \brief Add an object to a hashtable + + Creates an association between the \a key and \a data in the + hashtable \a h. If there is an add-ref function defined for the + hashtable, it will be called with \a key and \data after the + object is added. If there is already an object with the same key + in the hashtable, that object will be removed (and the del-ref + function called, if appilcable) before adding the new object and + before the add-ref function is called for the new object. + + Note that two keys \a key1 and \a key2 are equal (or same) in a + hashtable if the comparator returns zero when called with \a key1 + and \a key2. + + Also note that all additions and removals to the hashtable are + done by reference. No data is copied. Any objects pointed to are + expected to exist for the duration that the object and key are + contained in the hashtable. + + \param[in] h Hashtable + \param[in] key A key. If \a key points to a location in memory, + it should be within the object pointed to by \a data, or be a + constant. Can be NULL. + \param[in] data Data. Cannot be NULL. + + \note Not thread-safe. Applications must serialize calls that + reference the same hashtable. + */ +KHMEXP void KHMAPI hash_add(hashtable * h, void * key, void * data); + +/*! \brief Delete an object from a hashtable + + Deletes the object in the hashtable \a h that is associated with + key \a key. An object is associated with key \a key if the key \a + key_o that the object is associated with is the same as \a key as + determined by the comparator. If the del-ref function is defined + for the hash-table, it will be called with the \a key_o and \a + data that was used to add the object. + + \note Not thread-safe. Applications must serialize calls that + reference the same hashtable. + */ +KHMEXP void KHMAPI hash_del(hashtable * h, void * key); + +/*! \brief Resolve and association + + Return the object that is associated with key \a key in hashtable + \a h. An object \a data is associated with key \a key in \a h if + the key \a key_o that was used to add \a data to \a h is equal to + \a key as determined by the comparator. + + Returns NULL if no association is found. + + \note Not thread-safe. Applications must serialize calls that + reference the same hashtable. + */ +KHMEXP void * KHMAPI hash_lookup(hashtable * h, void * key); + +/*! \brief Check for the presence of an association + + Returns non-zero if there exists an association between key \a key + and some object in hashtable \a h. See hash_lookup() for + definition of "association". + + Returns zero if there is no association. + + \note (hash_lookup(h,key) == NULL) iff (hash_exist(h,key)==0) + + \note Not thead-safe. Application must serialize calls that + reference the same hashtable. + */ +KHMEXP khm_boolean KHMAPI hash_exist(hashtable * h, void * key); + +/*! \brief Compute a hashvalue for a unicode string + + The hash value is computed using DJB with parameter 13331. + + This function is suitable for use as the hash function for a + hashtable if the keys are NULL terminated safe unicode strings + that are either part of the data objects or are constants. + + \param[in] str A pointer to a NULL terminated wchar_t string cast + as (void *). + */ +KHMEXP khm_int32 hash_string(const void *str); + +/*! \brief Compare two strings + + Compares two strings are returns a value that is in accordance + with the comparator for a hashtable. + + \param[in] vs1 A pointer to a NULL terminated wchar_t string cast + as (void *). + \param[in] vs2 A pointer to a NULL terminated wchar_t string cast + as (void *). + */ +KHMEXP khm_int32 hash_string_comp(const void *vs1, const void *vs2); + +/*@}*/ +/*@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/util/Makefile +++ krb5-1.4.4/src/windows/identity/util/Makefile @@ -1,48 +1,48 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=util -!include <../config/Makefile.w32> - -INCFILES= \ - $(INCDIR)\utils.h \ - $(INCDIR)\hashtable.h \ - $(INCDIR)\mstring.h \ - $(INCDIR)\sync.h \ - $(INCDIR)\perfstat.h - -OBJFILES= \ - $(OBJ)\hashtable.obj \ - $(OBJ)\mstring.obj \ - $(OBJ)\sync.obj \ - $(OBJ)\perfstat.obj - -LIBFILES= - -SDKLIBFILES= - -all: mkdirs $(INCFILES) $(OBJFILES) - -clean:: - $(RM) $(INCFILES) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=util +!include <../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\utils.h \ + $(INCDIR)\hashtable.h \ + $(INCDIR)\mstring.h \ + $(INCDIR)\sync.h \ + $(INCDIR)\perfstat.h + +OBJFILES= \ + $(OBJ)\hashtable.obj \ + $(OBJ)\mstring.obj \ + $(OBJ)\sync.obj \ + $(OBJ)\perfstat.obj + +LIBFILES= + +SDKLIBFILES= + +all: mkdirs $(INCFILES) $(OBJFILES) + +clean:: + $(RM) $(INCFILES) --- krb5-1.4.4.orig/src/windows/identity/util/hashtable.c +++ krb5-1.4.4/src/windows/identity/util/hashtable.c @@ -1,168 +1,168 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -KHMEXP hashtable * KHMAPI hash_new_hashtable(khm_int32 n, - hash_function_t hash, - comp_function_t comp, - add_ref_function_t addr, - del_ref_function_t delr) -{ - hashtable * h; - - h = PMALLOC(sizeof(hashtable)); - - h->n = n; - h->addr = addr; - h->comp = comp; - h->delr = delr; - h->hash = hash; - - h->bins = PCALLOC(sizeof(hash_bin *), n); - - return h; -} - -KHMEXP void KHMAPI hash_del_hashtable(hashtable * h) { - hash_bin * b; - int i; - - for(i=0;in;i++) { - LPOP(&h->bins[i], &b); - while(b) { - if(h->delr) - h->delr(b->key, b->data); - PFREE(b); - LPOP(&h->bins[i], &b); - } - } - - PFREE(h); -} - -KHMEXP void KHMAPI hash_add(hashtable * h, void * key, void * data) { - int hv; - hash_bin * b; - - hv = h->hash(key) % h->n; - b = h->bins[hv]; - while(b) { - if(!h->comp(b->key, key)) { - /* found an existing value */ - if(h->delr) - h->delr(b->key, b->data); - b->key = key; - b->data = data; - if(h->addr) - h->addr(b->key, b->data); - break; - } - b = LNEXT(b); - } - - if(!b) { - b = PMALLOC(sizeof(hash_bin)); - b->data = data; - b->key = key; - LINIT(b); - LPUSH(&h->bins[hv], b); - if(h->addr) - h->addr(b->key, b->data); - } -} - -KHMEXP void KHMAPI hash_del(hashtable * h, void * key) { - hash_bin * b; - int hv; - - hv = h->hash(key) % h->n; - - b = h->bins[hv]; - while(b) { - if(!h->comp(b->key, key)) { - /* found it */ - LDELETE(&h->bins[hv], b); - if(h->delr) - h->delr(b->key, b->data); - PFREE(b); - break; - } - b = LNEXT(b); - } -} - -KHMEXP void * KHMAPI hash_lookup(hashtable * h, void * key) { - hash_bin * b; - int hv; - - hv = h->hash(key) % h->n; - - b = h->bins[hv]; - - while(b) { - if(!h->comp(b->key, key)) { - return b->data; - } - b = LNEXT(b); - } - - return NULL; -} - -KHMEXP khm_boolean KHMAPI hash_exist(hashtable * h, void * key) { - hash_bin * b; - int hv; - - hv = h->hash(key) % h->n; - b = h->bins[hv]; - while(b) { - if(!h->comp(b->key, key)) - return 1; - b = LNEXT(b); - } - - return 0; -} - -KHMEXP khm_int32 hash_string(const void *vs) { - /* DJB algorithm */ - - khm_int32 hv = 13331; - wchar_t * c; - - for(c = (wchar_t *) vs; *c; c++) { - hv = ((hv<<5) + hv) + (khm_int32) *c; - } - - return (hv & KHM_INT32_MAX); -} - -KHMEXP khm_int32 hash_string_comp(const void *vs1, const void *vs2) { - return wcscmp((const wchar_t *) vs1, (const wchar_t *) vs2); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +KHMEXP hashtable * KHMAPI hash_new_hashtable(khm_int32 n, + hash_function_t hash, + comp_function_t comp, + add_ref_function_t addr, + del_ref_function_t delr) +{ + hashtable * h; + + h = PMALLOC(sizeof(hashtable)); + + h->n = n; + h->addr = addr; + h->comp = comp; + h->delr = delr; + h->hash = hash; + + h->bins = PCALLOC(sizeof(hash_bin *), n); + + return h; +} + +KHMEXP void KHMAPI hash_del_hashtable(hashtable * h) { + hash_bin * b; + int i; + + for(i=0;in;i++) { + LPOP(&h->bins[i], &b); + while(b) { + if(h->delr) + h->delr(b->key, b->data); + PFREE(b); + LPOP(&h->bins[i], &b); + } + } + + PFREE(h); +} + +KHMEXP void KHMAPI hash_add(hashtable * h, void * key, void * data) { + int hv; + hash_bin * b; + + hv = h->hash(key) % h->n; + b = h->bins[hv]; + while(b) { + if(!h->comp(b->key, key)) { + /* found an existing value */ + if(h->delr) + h->delr(b->key, b->data); + b->key = key; + b->data = data; + if(h->addr) + h->addr(b->key, b->data); + break; + } + b = LNEXT(b); + } + + if(!b) { + b = PMALLOC(sizeof(hash_bin)); + b->data = data; + b->key = key; + LINIT(b); + LPUSH(&h->bins[hv], b); + if(h->addr) + h->addr(b->key, b->data); + } +} + +KHMEXP void KHMAPI hash_del(hashtable * h, void * key) { + hash_bin * b; + int hv; + + hv = h->hash(key) % h->n; + + b = h->bins[hv]; + while(b) { + if(!h->comp(b->key, key)) { + /* found it */ + LDELETE(&h->bins[hv], b); + if(h->delr) + h->delr(b->key, b->data); + PFREE(b); + break; + } + b = LNEXT(b); + } +} + +KHMEXP void * KHMAPI hash_lookup(hashtable * h, void * key) { + hash_bin * b; + int hv; + + hv = h->hash(key) % h->n; + + b = h->bins[hv]; + + while(b) { + if(!h->comp(b->key, key)) { + return b->data; + } + b = LNEXT(b); + } + + return NULL; +} + +KHMEXP khm_boolean KHMAPI hash_exist(hashtable * h, void * key) { + hash_bin * b; + int hv; + + hv = h->hash(key) % h->n; + b = h->bins[hv]; + while(b) { + if(!h->comp(b->key, key)) + return 1; + b = LNEXT(b); + } + + return 0; +} + +KHMEXP khm_int32 hash_string(const void *vs) { + /* DJB algorithm */ + + khm_int32 hv = 13331; + wchar_t * c; + + for(c = (wchar_t *) vs; *c; c++) { + hv = ((hv<<5) + hv) + (khm_int32) *c; + } + + return (hv & KHM_INT32_MAX); +} + +KHMEXP khm_int32 hash_string_comp(const void *vs1, const void *vs2) { + return wcscmp((const wchar_t *) vs1, (const wchar_t *) vs2); +} --- krb5-1.4.4.orig/src/windows/identity/util/sync.c +++ krb5-1.4.4/src/windows/identity/util/sync.c @@ -1,130 +1,130 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -#define LOCK_OPEN 0 -#define LOCK_READING 1 -#define LOCK_WRITING 2 - -KHMEXP void KHMAPI InitializeRwLock(PRWLOCK pLock) -{ - pLock->locks = 0; - pLock->status = LOCK_OPEN; - InitializeCriticalSection(&(pLock->cs)); - pLock->writewx = CreateEvent(NULL, - FALSE, /* Manual reset */ - TRUE, /* Initial state */ - NULL); - pLock->readwx = CreateEvent(NULL, - TRUE, /* Manual reset */ - TRUE, /* Initial state */ - NULL); -} - -KHMEXP void KHMAPI DeleteRwLock(PRWLOCK pLock) -{ - EnterCriticalSection(&pLock->cs); - - CloseHandle(pLock->readwx); - CloseHandle(pLock->writewx); - pLock->readwx = NULL; - pLock->writewx = NULL; - - LeaveCriticalSection(&pLock->cs); - DeleteCriticalSection(&(pLock->cs)); -} - -KHMEXP void KHMAPI LockObtainRead(PRWLOCK pLock) -{ - while(1) { - WaitForSingleObject(pLock->readwx, INFINITE); - EnterCriticalSection(&pLock->cs); - if(pLock->status == LOCK_WRITING) { - LeaveCriticalSection(&(pLock->cs)); - continue; - } else - break; - } - pLock->locks ++; - pLock->status = LOCK_READING; - ResetEvent(pLock->writewx); - LeaveCriticalSection(&(pLock->cs)); -} - -KHMEXP void KHMAPI LockReleaseRead(PRWLOCK pLock) -{ - EnterCriticalSection(&(pLock->cs)); - assert(pLock->status == LOCK_READING); - pLock->locks--; - if(!pLock->locks) { - pLock->status = LOCK_OPEN; - SetEvent(pLock->readwx); - SetEvent(pLock->writewx); - } - LeaveCriticalSection(&(pLock->cs)); -} - -KHMEXP void KHMAPI LockObtainWrite(PRWLOCK pLock) -{ - EnterCriticalSection(&(pLock->cs)); - if(pLock->status == LOCK_WRITING && - pLock->writer == GetCurrentThreadId()) { - pLock->locks++; - LeaveCriticalSection(&(pLock->cs)); - return; - } - LeaveCriticalSection(&(pLock->cs)); - while(1) { - WaitForSingleObject(pLock->writewx, INFINITE); - EnterCriticalSection(&(pLock->cs)); - if(pLock->status == LOCK_OPEN) - break; - LeaveCriticalSection(&(pLock->cs)); - } - pLock->status = LOCK_WRITING; - pLock->locks++; - pLock->writer = GetCurrentThreadId(); - ResetEvent(pLock->readwx); - ResetEvent(pLock->writewx); - LeaveCriticalSection(&(pLock->cs)); -} - -KHMEXP void KHMAPI LockReleaseWrite(PRWLOCK pLock) -{ - EnterCriticalSection(&(pLock->cs)); - assert(pLock->status == LOCK_WRITING); - pLock->locks--; - if(!pLock->locks) { - pLock->status = LOCK_OPEN; - pLock->writer = 0; - SetEvent(pLock->readwx); - SetEvent(pLock->writewx); - } - LeaveCriticalSection(&(pLock->cs)); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +#define LOCK_OPEN 0 +#define LOCK_READING 1 +#define LOCK_WRITING 2 + +KHMEXP void KHMAPI InitializeRwLock(PRWLOCK pLock) +{ + pLock->locks = 0; + pLock->status = LOCK_OPEN; + InitializeCriticalSection(&(pLock->cs)); + pLock->writewx = CreateEvent(NULL, + FALSE, /* Manual reset */ + TRUE, /* Initial state */ + NULL); + pLock->readwx = CreateEvent(NULL, + TRUE, /* Manual reset */ + TRUE, /* Initial state */ + NULL); +} + +KHMEXP void KHMAPI DeleteRwLock(PRWLOCK pLock) +{ + EnterCriticalSection(&pLock->cs); + + CloseHandle(pLock->readwx); + CloseHandle(pLock->writewx); + pLock->readwx = NULL; + pLock->writewx = NULL; + + LeaveCriticalSection(&pLock->cs); + DeleteCriticalSection(&(pLock->cs)); +} + +KHMEXP void KHMAPI LockObtainRead(PRWLOCK pLock) +{ + while(1) { + WaitForSingleObject(pLock->readwx, INFINITE); + EnterCriticalSection(&pLock->cs); + if(pLock->status == LOCK_WRITING) { + LeaveCriticalSection(&(pLock->cs)); + continue; + } else + break; + } + pLock->locks ++; + pLock->status = LOCK_READING; + ResetEvent(pLock->writewx); + LeaveCriticalSection(&(pLock->cs)); +} + +KHMEXP void KHMAPI LockReleaseRead(PRWLOCK pLock) +{ + EnterCriticalSection(&(pLock->cs)); + assert(pLock->status == LOCK_READING); + pLock->locks--; + if(!pLock->locks) { + pLock->status = LOCK_OPEN; + SetEvent(pLock->readwx); + SetEvent(pLock->writewx); + } + LeaveCriticalSection(&(pLock->cs)); +} + +KHMEXP void KHMAPI LockObtainWrite(PRWLOCK pLock) +{ + EnterCriticalSection(&(pLock->cs)); + if(pLock->status == LOCK_WRITING && + pLock->writer == GetCurrentThreadId()) { + pLock->locks++; + LeaveCriticalSection(&(pLock->cs)); + return; + } + LeaveCriticalSection(&(pLock->cs)); + while(1) { + WaitForSingleObject(pLock->writewx, INFINITE); + EnterCriticalSection(&(pLock->cs)); + if(pLock->status == LOCK_OPEN) + break; + LeaveCriticalSection(&(pLock->cs)); + } + pLock->status = LOCK_WRITING; + pLock->locks++; + pLock->writer = GetCurrentThreadId(); + ResetEvent(pLock->readwx); + ResetEvent(pLock->writewx); + LeaveCriticalSection(&(pLock->cs)); +} + +KHMEXP void KHMAPI LockReleaseWrite(PRWLOCK pLock) +{ + EnterCriticalSection(&(pLock->cs)); + assert(pLock->status == LOCK_WRITING); + pLock->locks--; + if(!pLock->locks) { + pLock->status = LOCK_OPEN; + pLock->writer = 0; + SetEvent(pLock->readwx); + SetEvent(pLock->writewx); + } + LeaveCriticalSection(&(pLock->cs)); +} --- krb5-1.4.4.orig/src/windows/identity/util/sync.h +++ krb5-1.4.4/src/windows/identity/util/sync.h @@ -1,128 +1,128 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_SYNC_H -#define __KHIMAIRA_SYNC_H - -#include - -/*! \addtogroup util - @{ */ - -/*! \defgroup util_sync Synchronization - @{*/ - -/*! \brief A read/write lock - - A classic read/write lock. Allows multiple readers or a single - writer to access a protected object. Readers will wait for any - pending writer to release the lock, while a writer will wait for - any pending readers to release the lock. -*/ -typedef struct tag_rwlock { - int locks; - int status; - CRITICAL_SECTION cs; - HANDLE readwx; - HANDLE writewx; - - DWORD writer; /* TID of writer thread */ -} rw_lock_t; - -typedef rw_lock_t RWLOCK, *PRWLOCK; - -/*! \brief Initialize a read/write lock. - - A lock must be initialized before it can be used. - Initializing the lock does not grant the caller any locks on the - object. -*/ -KHMEXP void KHMAPI InitializeRwLock(PRWLOCK pLock); - -/*! \brief Delete a read/write lock - - Once the application is done using the read/write lock, it must be - deleted with a call to DeleteRwLock() -*/ -KHMEXP void KHMAPI DeleteRwLock(PRWLOCK pLock); - -/*! \brief Obtains a read lock on the read/write lock - - Multiple readers can obtain read locks on the same r/w lock. - However, if any thread attempts to obtain a write lock on the - object, it will wait until all readers have released the read - locks. - - Call LockReleaseRead() to release the read lock. While the same - thread may obtain multiple read locks on the same object, each - call to LockObtainRead() must have a corresponding call to - LockReleaseRead() to properly relinquish the lock. - - \see LockReleaseRead() -*/ -KHMEXP void KHMAPI LockObtainRead(PRWLOCK pLock); - -/*! \brief Relase a read lock obtained on a read/write lock - - Each call to LockObtainRead() must have a corresponding call to - LockReleaseRead(). Once all read locks are released, any threads - waiting on write locks on the object will be woken and assigned a - write lock. - - \see LockObtainRead() -*/ -KHMEXP void KHMAPI LockReleaseRead(PRWLOCK pLock); - -/*! \brief Obtains a write lock on the read/write lock - - Only a single writer is allowed to lock a single r/w lock. - However, if any thread attempts to obtain a read lock on the - object, it will wait until the writer has released the lock. - - Call LockReleaseWrite() to release the write lock. While the same - thread may obtain multiple write locks on the same object, each - call to LockObtainWrite() must have a corresponding call to - LockReleaseWrite() to properly relinquish the lock. - - \see LockReleaseWrite() -*/ -KHMEXP void KHMAPI LockObtainWrite(PRWLOCK pLock); - -/*! \brief Relase a write lock obtained on a read/write lock - - Each call to LockObtainWrite() must have a corresponding call to - LockReleaseWrite(). Once the write lock is released, any threads - waiting for read or write locks on the object will be woken and - assigned the proper lock. - - \see LockObtainWrite() -*/ -KHMEXP void KHMAPI LockReleaseWrite(PRWLOCK pLock); - -/*@}*/ -/*@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_SYNC_H +#define __KHIMAIRA_SYNC_H + +#include + +/*! \addtogroup util + @{ */ + +/*! \defgroup util_sync Synchronization + @{*/ + +/*! \brief A read/write lock + + A classic read/write lock. Allows multiple readers or a single + writer to access a protected object. Readers will wait for any + pending writer to release the lock, while a writer will wait for + any pending readers to release the lock. +*/ +typedef struct tag_rwlock { + int locks; + int status; + CRITICAL_SECTION cs; + HANDLE readwx; + HANDLE writewx; + + DWORD writer; /* TID of writer thread */ +} rw_lock_t; + +typedef rw_lock_t RWLOCK, *PRWLOCK; + +/*! \brief Initialize a read/write lock. + + A lock must be initialized before it can be used. + Initializing the lock does not grant the caller any locks on the + object. +*/ +KHMEXP void KHMAPI InitializeRwLock(PRWLOCK pLock); + +/*! \brief Delete a read/write lock + + Once the application is done using the read/write lock, it must be + deleted with a call to DeleteRwLock() +*/ +KHMEXP void KHMAPI DeleteRwLock(PRWLOCK pLock); + +/*! \brief Obtains a read lock on the read/write lock + + Multiple readers can obtain read locks on the same r/w lock. + However, if any thread attempts to obtain a write lock on the + object, it will wait until all readers have released the read + locks. + + Call LockReleaseRead() to release the read lock. While the same + thread may obtain multiple read locks on the same object, each + call to LockObtainRead() must have a corresponding call to + LockReleaseRead() to properly relinquish the lock. + + \see LockReleaseRead() +*/ +KHMEXP void KHMAPI LockObtainRead(PRWLOCK pLock); + +/*! \brief Relase a read lock obtained on a read/write lock + + Each call to LockObtainRead() must have a corresponding call to + LockReleaseRead(). Once all read locks are released, any threads + waiting on write locks on the object will be woken and assigned a + write lock. + + \see LockObtainRead() +*/ +KHMEXP void KHMAPI LockReleaseRead(PRWLOCK pLock); + +/*! \brief Obtains a write lock on the read/write lock + + Only a single writer is allowed to lock a single r/w lock. + However, if any thread attempts to obtain a read lock on the + object, it will wait until the writer has released the lock. + + Call LockReleaseWrite() to release the write lock. While the same + thread may obtain multiple write locks on the same object, each + call to LockObtainWrite() must have a corresponding call to + LockReleaseWrite() to properly relinquish the lock. + + \see LockReleaseWrite() +*/ +KHMEXP void KHMAPI LockObtainWrite(PRWLOCK pLock); + +/*! \brief Relase a write lock obtained on a read/write lock + + Each call to LockObtainWrite() must have a corresponding call to + LockReleaseWrite(). Once the write lock is released, any threads + waiting for read or write locks on the object will be woken and + assigned the proper lock. + + \see LockObtainWrite() +*/ +KHMEXP void KHMAPI LockReleaseWrite(PRWLOCK pLock); + +/*@}*/ +/*@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/util/mstring.h +++ krb5-1.4.4/src/windows/identity/util/mstring.h @@ -1,361 +1,361 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_MSTRING_H -#define __KHIMAIRA_MSTRING_H - -#include - -/*! \addtogroup util - @{ */ - -/*! \defgroup util_mstring Multi String and CSV functions - @{*/ - -#define KHM_PREFIX 8 - -#define KHM_CASE_SENSITIVE 16 - -#define KHM_MAXCCH_STRING 16384 - -#define KHM_MAXCB_STRING (KHM_MAXCCH_STRING * sizeof(wchar_t)) - -/*! \brief Initialize a multi-string - */ -KHMEXP khm_int32 KHMAPI -multi_string_init(wchar_t * ms, - khm_size cb_ms); - -/*! \brief Prepend a string to a multi string - - Adds the string \a str to the beginning of multi-string \a ms. - - \param[in,out] ms The multi-string to be modified. - - \param[in,out] pcb_ms A pointer to the size of the multistring. - On entry this specifies the size of the buffer pointed to by - \a ms. If the call is successful, on exit this will receive - the new size of the multi string in bytes. If the buffer is - insufficient, the function will return KHM_ERROR_TOO_LONG and - set this to the required size of the buffer in bytes. - - \param[in] str The string to prepend to \a ms. This cannot be - longer than KHM_MAXCCH_STRING in characters including the - terminating NULL. - */ -KHMEXP khm_int32 KHMAPI -multi_string_prepend(wchar_t * ms, - khm_size * pcb_ms, - const wchar_t * str); - -/*! \brief Append a string to a multi-string - - Appends the string specified by \a str to the multi string - specified by \a ms. The size of the multi string in characters - including terminating NULLs after appending \a str can not exceed - KHM_MAXCCH_STRING. - - \param[in] ms The buffer containing the multi string - - \param[in,out] pcb_ms Points to a khm_int32 indicating the size of - the buffer pointed to by \a ms. On entry this contains the - size (in bytes) of the buffer pointed to by \a ms. On exit, - contains the new size of the multi string in bytes. - - \param[in] str The string to append to the multi string. This - string cannot be NULL or an empty (zero length) string. The - length of \a str cannot exceed KHM_MAXCCH_STRING in - characters including terminating NULL. - - \retval KHM_ERROR_SUCCESS The string was appended to the multi string - - \retval KHM_ERROR_TOO_LONG The buffer pointed to by \a ms was - insufficient. The required size of the buffer is in \a pcb_ms - - \retval KHM_ERROR_INVALID_PARAM One of more of the parameters were invalid. - */ -KHMEXP khm_int32 KHMAPI -multi_string_append(wchar_t * ms, - khm_size * pcb_ms, - const wchar_t * str); - -/*! \brief Deletes a string from a multi string - - Deletes the string specified by \a str from the multi string - specified by \a ms. How the string is matched to the strings in - \a ms is determined by \a flags. If more than one match is found, - then only the first match is deleted. - - \param[in] ms The multi string to modify. The length of the multi - string in characters cannot exceed KHM_MAXCCH_STRING. - - \param[in] str The string to search for - - \param[in] flags How \a str is to be matched to existing strings - in \a ms. This could be a combination of KHM_PREFIX and - KHM_CASE_SENSITIVE. If KHM_PREFIX is used, then \a ms is - searched for a string that begins with \a str. Otherwise, \a - str must match the an entire string in the multi string. If - KHM_CASE_SENSITIVE is specified, then a case sensitive match - is performed. The defualt is to use a case insensitive - search. - - \retval KHM_ERROR_SUCCESS A string was matched and deleted from \a ms - - \retval KHM_ERROR_NOT_FOUND No matches were found - - \retval KHM_ERROR_INVALID_PARAM One or more parameters were incorrect. - - \note The search for the existing string is done with - multi_string_find() - */ -KHMEXP khm_int32 KHMAPI -multi_string_delete(wchar_t * ms, - const wchar_t * str, - const khm_int32 flags); - -/*! \brief Search a multi string for a string - - Searches the string specified by \a ms for a string that matches - \a str. How the match is performed is determined by \a flags. - Returns a poitner to the start of the matched string in \a ms. If - more than one string in \a ms matches \a str, then only the first - match is returned. - - \param[in] ms The multi string to search in. The length of the - multi string cannot exceed KHM_MAXCCH_STRING in characters. - - \param[in] str The string to search for - - \param[in] flags How \a str is to be matched to existing strings - in \a ms. This could be a combination of KHM_PREFIX and - KHM_CASE_SENSITIVE. If KHM_PREFIX is used, then \a ms is - searched for a string that begins with \a str. Otherwise, \a - str must match the an entire string in the multi string. If - KHM_CASE_SENSITIVE is specified, then a case sensitive match - is performed. The defualt is to use a case insensitive - search. - - \return A pointer to the start of the first matched string or - NULL if no matches were found. - - */ -KHMEXP wchar_t * KHMAPI -multi_string_find(const wchar_t * ms, - const wchar_t * str, - const khm_int32 flags); - -/*! \brief Convert a multi string to CSV - - Converts a multi string to a comma separated value string based on - the following rules. - - - Each string in the multi string is treated an individual field - - - A field is quoted if it has double quotes or commas - - - Double quotes within quoted fields are escaped by two - consecutive double quotes. - - For example: - - \code - multi_string = L"foo\0bar\0baz,quux\0ab\"cd\0"; - csv_string = L"foo,bar,\"baz,quux\",\"ab\"\"cd\""; - \endcode - - If multi_string_to_csv() is called on \a multi_string above, - you would obtain \a csv_string. - - \param[out] csvbuf The buffer to place the CSV string in. Can be - NULL if only teh size of the needed buffer is required. - - \param[in,out] pcb_csvbuf On entry, points to a khm_int32 that - holds the size of the buffer pointed to by \a csvbuf. On - exit, gets the number of bytes writted to \a csvbuf or the - required size of \a csvbuf if the buffer is too small or \a - csvbuf is NULL. - - \param[in] ms The mutli string to convert to a CSV. - - \retval KHM_ERROR_SUCCESS The multi string was successfully - converted to a CSV string. The number of bytes written is in - \a pcb_csvbuf. The count includes the terminating NULL. - - \retval KHM_ERROR_TOO_LONG The buffer was too small or \a csvbuf - was NULL. The required number of bytes in the buffer is in \a - pcb_csvbuf. - - \retval KHM_ERROR_INVALID_PARAM One or more parameters were ivnalid. - - \see csv_to_multi_string() -*/ -KHMEXP khm_int32 KHMAPI -multi_string_to_csv(wchar_t * csvbuf, - khm_size * pcb_csvbuf, - const wchar_t * ms); - -/*! \brief Converts a CSV to a multi string - - Undoes what multi_string_to_csv() does. - - \param[out] ms The buffer that recieves the multi string. This - can be NULL if only the size of the buffer is requried. - - \param[in,out] pcb_ms On entry contains the number of bytes ni the - buffer poitned to by \a ms. On exit contains the number of - bytes that were copied to \a ms including terminating NULLs, - or if the buffer was too small or \a ms was NULL, holds the - size in bytes of the requied buffer. - - \param[in] csv The CSV string. - - \retval KHM_ERROR_SUCCESS The CSV string was successfully - converted. The number of bytes written is in \a pcb_ms. - - \retval KHM_ERROR_TOO_LONG The provided buffer was too small or \a - ms was NULL. The required size of the buffer in bytes is in \a - pcb_ms. - - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. - - */ -KHMEXP khm_int32 KHMAPI -csv_to_multi_string(wchar_t * ms, - khm_size * pcb_ms, - const wchar_t * csv); - -/*! \brief Get the next string in a multi string - - When \a str is pointing to a string that is in a multi string, - this function returns a pointer to the next string in the multi - string. - - Typically, one would start by having \a str point to the start of - the multi string (which is the first string in the multi string), - and then call this function repeatedly, until it returns NULL, at - which point the end of the multi string has been reached. - - \param[in] str Pointer to a string in a multi string. Each string - in a multi string cannot exceed KHM_MAXCCH_STRING in charaters - including the terminating NULL. - - \return A pointer to the start of the next string in the multi - string or NULL if there is no more strings. - */ -KHMEXP wchar_t * KHMAPI -multi_string_next(const wchar_t * str); - -/*! \brief Get the length of a multi string in bytes - - The returned length includes the trailing double \a NULL and any - other \a NULL inbetween. - - \param[in] str Pointer to a multi string. - \param[in] max_cb Maximum size that the str can be. This can not - be larger than KHM_MAXCB_STRING. - \param[out] len_cb The length of the string in bytes if the call - is successful. - - \retval KHM_ERROR_SUCCESS The length of the string is in \a len_cb - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_TOO_LONG The multi string is longer than \a - max_cb bytes. - */ -KHMEXP khm_int32 KHMAPI -multi_string_length_cb(const wchar_t * str, - khm_size max_cb, - khm_size * len_cb); - -/*! \brief Get the length of a multi string in characters - - The returned length includes the trailing double \a NULL and any - other \a NULL inbetween. - - \param[in] str Pointer to a multi string. - \param[in] max_cch Maximum size that the str can be. This can not - be larger than KHM_MAXCCH_STRING. - \param[out] len_cch The length of the string in characters if the call - is successful. - - \retval KHM_ERROR_SUCCESS The length of the string is in \a len_cch - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_TOO_LONG The multi string is longer than \a - max_cch characters. - */ -KHMEXP khm_int32 KHMAPI -multi_string_length_cch(const wchar_t * str, - khm_size max_cch, - khm_size * len_cch); - -/*! \brief Get the number of strings in a multi string - */ -KHMEXP khm_size KHMAPI -multi_string_length_n(const wchar_t * str); - -/*! \brief Copy a multi string with byte counts - - Copy a multi string from one location to another. - - \param[out] s_dest Receives a copy of the multi string - \param[in] max_cb_dest Number of bytes in the buffer pointed to by - \a s_dest. - \param[in] src The source multi string - - \retval KHM_ERROR_SUCCESS The multi string was copied successfully - \retval KHM_ERROR_INVALID_PARAM One or more parameters were - invalid. - \retval KHM_ERROR_TOO_LONG The size of the destination buffer was - insufficient. - */ -KHMEXP khm_int32 KHMAPI -multi_string_copy_cb(wchar_t * s_dest, - khm_size max_cb_dest, - const wchar_t * src); - -/*! \brief Copy a multi string with character count - - Copy a multi string from one location to another. - - \param[out] s_dest Receives a copy of the multi string - \param[in] max_cb_dest Number of characters in the buffer pointed - to by \a s_dest. - \param[in] src The source multi string - - \retval KHM_ERROR_SUCCESS The multi string was copied successfully - \retval KHM_ERROR_INVALID_PARAM One or more parameters were - invalid. - \retval KHM_ERROR_TOO_LONG The size of the destination buffer was - insufficient. - */ -KHMEXP khm_int32 KHMAPI -multi_string_copy_cch(wchar_t * s_dest, - khm_size max_cch_dest, - const wchar_t * src); - -/*@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_MSTRING_H +#define __KHIMAIRA_MSTRING_H + +#include + +/*! \addtogroup util + @{ */ + +/*! \defgroup util_mstring Multi String and CSV functions + @{*/ + +#define KHM_PREFIX 8 + +#define KHM_CASE_SENSITIVE 16 + +#define KHM_MAXCCH_STRING 16384 + +#define KHM_MAXCB_STRING (KHM_MAXCCH_STRING * sizeof(wchar_t)) + +/*! \brief Initialize a multi-string + */ +KHMEXP khm_int32 KHMAPI +multi_string_init(wchar_t * ms, + khm_size cb_ms); + +/*! \brief Prepend a string to a multi string + + Adds the string \a str to the beginning of multi-string \a ms. + + \param[in,out] ms The multi-string to be modified. + + \param[in,out] pcb_ms A pointer to the size of the multistring. + On entry this specifies the size of the buffer pointed to by + \a ms. If the call is successful, on exit this will receive + the new size of the multi string in bytes. If the buffer is + insufficient, the function will return KHM_ERROR_TOO_LONG and + set this to the required size of the buffer in bytes. + + \param[in] str The string to prepend to \a ms. This cannot be + longer than KHM_MAXCCH_STRING in characters including the + terminating NULL. + */ +KHMEXP khm_int32 KHMAPI +multi_string_prepend(wchar_t * ms, + khm_size * pcb_ms, + const wchar_t * str); + +/*! \brief Append a string to a multi-string + + Appends the string specified by \a str to the multi string + specified by \a ms. The size of the multi string in characters + including terminating NULLs after appending \a str can not exceed + KHM_MAXCCH_STRING. + + \param[in] ms The buffer containing the multi string + + \param[in,out] pcb_ms Points to a khm_int32 indicating the size of + the buffer pointed to by \a ms. On entry this contains the + size (in bytes) of the buffer pointed to by \a ms. On exit, + contains the new size of the multi string in bytes. + + \param[in] str The string to append to the multi string. This + string cannot be NULL or an empty (zero length) string. The + length of \a str cannot exceed KHM_MAXCCH_STRING in + characters including terminating NULL. + + \retval KHM_ERROR_SUCCESS The string was appended to the multi string + + \retval KHM_ERROR_TOO_LONG The buffer pointed to by \a ms was + insufficient. The required size of the buffer is in \a pcb_ms + + \retval KHM_ERROR_INVALID_PARAM One of more of the parameters were invalid. + */ +KHMEXP khm_int32 KHMAPI +multi_string_append(wchar_t * ms, + khm_size * pcb_ms, + const wchar_t * str); + +/*! \brief Deletes a string from a multi string + + Deletes the string specified by \a str from the multi string + specified by \a ms. How the string is matched to the strings in + \a ms is determined by \a flags. If more than one match is found, + then only the first match is deleted. + + \param[in] ms The multi string to modify. The length of the multi + string in characters cannot exceed KHM_MAXCCH_STRING. + + \param[in] str The string to search for + + \param[in] flags How \a str is to be matched to existing strings + in \a ms. This could be a combination of KHM_PREFIX and + KHM_CASE_SENSITIVE. If KHM_PREFIX is used, then \a ms is + searched for a string that begins with \a str. Otherwise, \a + str must match the an entire string in the multi string. If + KHM_CASE_SENSITIVE is specified, then a case sensitive match + is performed. The defualt is to use a case insensitive + search. + + \retval KHM_ERROR_SUCCESS A string was matched and deleted from \a ms + + \retval KHM_ERROR_NOT_FOUND No matches were found + + \retval KHM_ERROR_INVALID_PARAM One or more parameters were incorrect. + + \note The search for the existing string is done with + multi_string_find() + */ +KHMEXP khm_int32 KHMAPI +multi_string_delete(wchar_t * ms, + const wchar_t * str, + const khm_int32 flags); + +/*! \brief Search a multi string for a string + + Searches the string specified by \a ms for a string that matches + \a str. How the match is performed is determined by \a flags. + Returns a poitner to the start of the matched string in \a ms. If + more than one string in \a ms matches \a str, then only the first + match is returned. + + \param[in] ms The multi string to search in. The length of the + multi string cannot exceed KHM_MAXCCH_STRING in characters. + + \param[in] str The string to search for + + \param[in] flags How \a str is to be matched to existing strings + in \a ms. This could be a combination of KHM_PREFIX and + KHM_CASE_SENSITIVE. If KHM_PREFIX is used, then \a ms is + searched for a string that begins with \a str. Otherwise, \a + str must match the an entire string in the multi string. If + KHM_CASE_SENSITIVE is specified, then a case sensitive match + is performed. The defualt is to use a case insensitive + search. + + \return A pointer to the start of the first matched string or + NULL if no matches were found. + + */ +KHMEXP wchar_t * KHMAPI +multi_string_find(const wchar_t * ms, + const wchar_t * str, + const khm_int32 flags); + +/*! \brief Convert a multi string to CSV + + Converts a multi string to a comma separated value string based on + the following rules. + + - Each string in the multi string is treated an individual field + + - A field is quoted if it has double quotes or commas + + - Double quotes within quoted fields are escaped by two + consecutive double quotes. + + For example: + + \code + multi_string = L"foo\0bar\0baz,quux\0ab\"cd\0"; + csv_string = L"foo,bar,\"baz,quux\",\"ab\"\"cd\""; + \endcode + + If multi_string_to_csv() is called on \a multi_string above, + you would obtain \a csv_string. + + \param[out] csvbuf The buffer to place the CSV string in. Can be + NULL if only teh size of the needed buffer is required. + + \param[in,out] pcb_csvbuf On entry, points to a khm_int32 that + holds the size of the buffer pointed to by \a csvbuf. On + exit, gets the number of bytes writted to \a csvbuf or the + required size of \a csvbuf if the buffer is too small or \a + csvbuf is NULL. + + \param[in] ms The mutli string to convert to a CSV. + + \retval KHM_ERROR_SUCCESS The multi string was successfully + converted to a CSV string. The number of bytes written is in + \a pcb_csvbuf. The count includes the terminating NULL. + + \retval KHM_ERROR_TOO_LONG The buffer was too small or \a csvbuf + was NULL. The required number of bytes in the buffer is in \a + pcb_csvbuf. + + \retval KHM_ERROR_INVALID_PARAM One or more parameters were ivnalid. + + \see csv_to_multi_string() +*/ +KHMEXP khm_int32 KHMAPI +multi_string_to_csv(wchar_t * csvbuf, + khm_size * pcb_csvbuf, + const wchar_t * ms); + +/*! \brief Converts a CSV to a multi string + + Undoes what multi_string_to_csv() does. + + \param[out] ms The buffer that recieves the multi string. This + can be NULL if only the size of the buffer is requried. + + \param[in,out] pcb_ms On entry contains the number of bytes ni the + buffer poitned to by \a ms. On exit contains the number of + bytes that were copied to \a ms including terminating NULLs, + or if the buffer was too small or \a ms was NULL, holds the + size in bytes of the requied buffer. + + \param[in] csv The CSV string. + + \retval KHM_ERROR_SUCCESS The CSV string was successfully + converted. The number of bytes written is in \a pcb_ms. + + \retval KHM_ERROR_TOO_LONG The provided buffer was too small or \a + ms was NULL. The required size of the buffer in bytes is in \a + pcb_ms. + + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. + + */ +KHMEXP khm_int32 KHMAPI +csv_to_multi_string(wchar_t * ms, + khm_size * pcb_ms, + const wchar_t * csv); + +/*! \brief Get the next string in a multi string + + When \a str is pointing to a string that is in a multi string, + this function returns a pointer to the next string in the multi + string. + + Typically, one would start by having \a str point to the start of + the multi string (which is the first string in the multi string), + and then call this function repeatedly, until it returns NULL, at + which point the end of the multi string has been reached. + + \param[in] str Pointer to a string in a multi string. Each string + in a multi string cannot exceed KHM_MAXCCH_STRING in charaters + including the terminating NULL. + + \return A pointer to the start of the next string in the multi + string or NULL if there is no more strings. + */ +KHMEXP wchar_t * KHMAPI +multi_string_next(const wchar_t * str); + +/*! \brief Get the length of a multi string in bytes + + The returned length includes the trailing double \a NULL and any + other \a NULL inbetween. + + \param[in] str Pointer to a multi string. + \param[in] max_cb Maximum size that the str can be. This can not + be larger than KHM_MAXCB_STRING. + \param[out] len_cb The length of the string in bytes if the call + is successful. + + \retval KHM_ERROR_SUCCESS The length of the string is in \a len_cb + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_TOO_LONG The multi string is longer than \a + max_cb bytes. + */ +KHMEXP khm_int32 KHMAPI +multi_string_length_cb(const wchar_t * str, + khm_size max_cb, + khm_size * len_cb); + +/*! \brief Get the length of a multi string in characters + + The returned length includes the trailing double \a NULL and any + other \a NULL inbetween. + + \param[in] str Pointer to a multi string. + \param[in] max_cch Maximum size that the str can be. This can not + be larger than KHM_MAXCCH_STRING. + \param[out] len_cch The length of the string in characters if the call + is successful. + + \retval KHM_ERROR_SUCCESS The length of the string is in \a len_cch + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_TOO_LONG The multi string is longer than \a + max_cch characters. + */ +KHMEXP khm_int32 KHMAPI +multi_string_length_cch(const wchar_t * str, + khm_size max_cch, + khm_size * len_cch); + +/*! \brief Get the number of strings in a multi string + */ +KHMEXP khm_size KHMAPI +multi_string_length_n(const wchar_t * str); + +/*! \brief Copy a multi string with byte counts + + Copy a multi string from one location to another. + + \param[out] s_dest Receives a copy of the multi string + \param[in] max_cb_dest Number of bytes in the buffer pointed to by + \a s_dest. + \param[in] src The source multi string + + \retval KHM_ERROR_SUCCESS The multi string was copied successfully + \retval KHM_ERROR_INVALID_PARAM One or more parameters were + invalid. + \retval KHM_ERROR_TOO_LONG The size of the destination buffer was + insufficient. + */ +KHMEXP khm_int32 KHMAPI +multi_string_copy_cb(wchar_t * s_dest, + khm_size max_cb_dest, + const wchar_t * src); + +/*! \brief Copy a multi string with character count + + Copy a multi string from one location to another. + + \param[out] s_dest Receives a copy of the multi string + \param[in] max_cb_dest Number of characters in the buffer pointed + to by \a s_dest. + \param[in] src The source multi string + + \retval KHM_ERROR_SUCCESS The multi string was copied successfully + \retval KHM_ERROR_INVALID_PARAM One or more parameters were + invalid. + \retval KHM_ERROR_TOO_LONG The size of the destination buffer was + insufficient. + */ +KHMEXP khm_int32 KHMAPI +multi_string_copy_cch(wchar_t * s_dest, + khm_size max_cch_dest, + const wchar_t * src); + +/*@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/util/mstring.c +++ krb5-1.4.4/src/windows/identity/util/mstring.c @@ -1,510 +1,510 @@ -/* -* Copyright (c) 2005 Massachusetts Institute of Technology -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, -* modify, merge, publish, distribute, sublicense, and/or sell copies -* of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -/* $Id$ */ - -#include -#include -#include -#include - -#define TRUE 1 -#define FALSE 0 - -KHMEXP khm_int32 KHMAPI -multi_string_init(wchar_t * ms, - khm_size cb_ms) { - if (!ms || cb_ms < sizeof(wchar_t) * 2) - return KHM_ERROR_INVALID_PARAM; - - memset(ms, 0, cb_ms); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -multi_string_append(wchar_t * ms, - khm_size * pcb_ms, - const wchar_t * str) -{ - wchar_t * s; - size_t cch_s; - size_t cch_t; - size_t cch_r; - - if(!ms || !pcb_ms || !str) - return KHM_ERROR_INVALID_PARAM; - - if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch_s)) || cch_s == 0) - return KHM_ERROR_INVALID_PARAM; - cch_s++; - - s = ms; - - while(*s && ((s - ms) < KHM_MAXCCH_STRING)) { - if(FAILED(StringCchLength(s, KHM_MAXCB_STRING, &cch_t))) - return KHM_ERROR_INVALID_PARAM; - s += cch_t + 1; - } - - if(*s || (s - ms) >= KHM_MAXCCH_STRING) { - return KHM_ERROR_INVALID_PARAM; - } - - /* now s points to the second NULL of the terminating double NULL */ - - cch_r = ((s - ms) + cch_s + 1) * sizeof(wchar_t); - if(*pcb_ms < cch_r) { - *pcb_ms = cch_r; - return KHM_ERROR_TOO_LONG; - } - - *pcb_ms = cch_r; - - StringCchCopy(s, cch_s, str); - s += cch_s; - *s = 0; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -multi_string_prepend(wchar_t * ms, - khm_size * pcb_ms, - const wchar_t * str) -{ - size_t cch_s; - size_t cch_t; - size_t cch_r; - khm_size cb_r; - - if(!ms || !pcb_ms || !str) - return KHM_ERROR_INVALID_PARAM; - - if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch_s)) || cch_s == 0) - return KHM_ERROR_INVALID_PARAM; - cch_s++; - - if(KHM_FAILED(multi_string_length_cch(ms, - KHM_MAXCCH_STRING, - &cch_r))) - return KHM_ERROR_INVALID_PARAM; - - cch_t = cch_s + cch_r; - cb_r = cch_t * sizeof(wchar_t); - - if (*pcb_ms < cb_r) { - *pcb_ms = cb_r; - return KHM_ERROR_TOO_LONG; - } - - memmove(ms + cch_s, ms, cch_r * sizeof(wchar_t)); - memcpy(ms, str, cch_s * sizeof(wchar_t)); - - *pcb_ms = cb_r; - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -multi_string_delete(wchar_t * ms, - const wchar_t * str, - const khm_int32 flags) -{ - wchar_t * s; - wchar_t * n; - wchar_t * e; - size_t cch; - - if(!ms || !str) - return KHM_ERROR_INVALID_PARAM; - - s = multi_string_find(ms, str, flags); - if(!s) - return KHM_ERROR_NOT_FOUND; - - e = s; - n = NULL; - while(*e && (e - s) < KHM_MAXCCH_STRING) { - if(FAILED(StringCchLength(e, KHM_MAXCCH_STRING, &cch))) - return KHM_ERROR_INVALID_PARAM; - e += cch + 1; - - if(!n) - n = e; - } - - if(*e || (e - s) >= KHM_MAXCCH_STRING) - return KHM_ERROR_INVALID_PARAM; - - if(e == s) - return KHM_ERROR_SUCCESS; - - memmove((void *) s, (void *) n, ((e - n) + 1) * sizeof(wchar_t)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP wchar_t * KHMAPI -multi_string_find(const wchar_t * ms, - const wchar_t * str, - const khm_int32 flags) -{ - const wchar_t *s; - size_t cch; - size_t cch_s; - - if(!ms || !str) - return NULL; - - if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch_s))) - return NULL; - - s = ms; - - while(*s && (s - ms) < KHM_MAXCCH_STRING) { - if(FAILED(StringCchLength(s, KHM_MAXCCH_STRING, &cch))) - return NULL; - /* cch++ at end */ - - if(flags & KHM_PREFIX) { - if(((flags & KHM_CASE_SENSITIVE) && !wcsncmp(s, str, cch_s)) || - (!(flags & KHM_CASE_SENSITIVE) && !_wcsnicmp(s, str, cch_s))) - return (wchar_t *) s; - } else { - if((cch == cch_s) && - ((flags & KHM_CASE_SENSITIVE) && !wcsncmp(s, str, cch)) || - (!(flags & KHM_CASE_SENSITIVE) && !_wcsnicmp(s, str, cch))) - return (wchar_t *) s; - } - - s += cch + 1; - } - - return NULL; -} - -KHMEXP khm_int32 KHMAPI -multi_string_to_csv(wchar_t * csvbuf, - khm_size * pcb_csvbuf, - const wchar_t * ms) -{ - size_t cb; - size_t cbt; - const wchar_t * t; - wchar_t * d; - - if(!pcb_csvbuf || !ms) - return KHM_ERROR_INVALID_PARAM; - - /* dry run */ - cbt = 0; - t = ms; - while(*t && cbt <= KHM_MAXCB_STRING) { - khm_boolean quotes = FALSE; - - if(FAILED(StringCbLength(t, KHM_MAXCB_STRING, &cb))) - return KHM_ERROR_INVALID_PARAM; - cb += sizeof(wchar_t); - - cbt += cb; - - if(wcschr(t, L',')) - quotes = TRUE; - - d = (wchar_t *) t; - while(d = wcschr(d, L'"')) { - cbt += sizeof(wchar_t); /* '"'-> '""' */ - d++; - quotes = TRUE; - } - - if(quotes) - cbt += 2*sizeof(wchar_t); /* make room for quotes */ - - t += cb / sizeof(wchar_t); - } - - if(cbt > KHM_MAXCB_STRING) - return KHM_ERROR_INVALID_PARAM; - - /* happens if the multi string contained no strings */ - if(cbt == 0) - cbt = sizeof(wchar_t); - - if(!csvbuf || *pcb_csvbuf < cbt) - { - *pcb_csvbuf = cbt; - return KHM_ERROR_TOO_LONG; - } - - *pcb_csvbuf = cbt; - - /* wet run */ - t = ms; - d = csvbuf; - *csvbuf = 0; - while(*t) { - const wchar_t * s; - - StringCbLength(t, KHM_MAXCB_STRING, &cb); - cb += sizeof(wchar_t); - - if(d != csvbuf) - *d++ = L','; - if(wcschr(t, L',') || wcschr(t, L'"')) { - *d++ = L'"'; - s = t; - while(*s) { - if(*s == L'"') { - *d++ = L'"'; - *d++ = L'"'; - } else - *d++ = *s; - s++; - } - *d++ = L'"'; - *d = 0; - } else { - StringCbCopy(d, cbt - ((d - csvbuf) * sizeof(wchar_t)), t); - d += cb / sizeof(wchar_t) - 1; - } - t += cb / sizeof(wchar_t); - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -csv_to_multi_string(wchar_t * ms, - khm_size * pcb_ms, - const wchar_t * csv) -{ - const wchar_t * t; - wchar_t * p; - size_t cchr; - int field = 1; - - - if(!pcb_ms || !csv) - return KHM_ERROR_INVALID_PARAM; - - cchr = 0; - - /* dry run */ - t = csv; - while(*t && (t - csv) < KHM_MAXCCH_STRING) { - if(field && *t == L'"') { - t++; - while(*t && (t - csv) < KHM_MAXCCH_STRING) { - if(*t == L'"') { - t++; - if(*t != L'"') - break; - } - cchr++; - t++; - } - } - - if(*t) { - cchr++; - if(*t == L',') - field = 1; - else - field = 0; - - t++; - } - } - - if((t - csv) >= KHM_MAXCCH_STRING) - return KHM_ERROR_INVALID_PARAM; - - cchr++; /* last string ends */ - cchr++; /* double NULL */ - - if(!ms || *pcb_ms < (cchr * sizeof(wchar_t))) { - *pcb_ms = cchr * sizeof(wchar_t); - return KHM_ERROR_TOO_LONG; - } - - /* wet run */ - t = csv; - p = ms; - field = 1; - while(*t) { - if(field && *t == L'"') { - t++; - while(*t) { - if(*t == L'"') { - t++; - if(*t != L'"') - break; - } - *p++ = *t; - t++; - } - } - - if(*t == L',') { - *p++ = 0; - field = 1; - t++; - } else if(*t) { - *p++ = *t; - field = 0; - t++; - } - } - - *p++ = 0; /* last string ends */ - *p++ = 0; /* double NULL */ - - *pcb_ms = (p - ms) * sizeof(wchar_t); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP wchar_t * KHMAPI -multi_string_next(const wchar_t * str) -{ - size_t cch; - - if(*str) { - if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch))) - return NULL; - str += cch + 1; - if(*str) - return (wchar_t *) str; - else - return NULL; - } else { - return NULL; - } -} - -KHMEXP khm_size KHMAPI -multi_string_length_n(const wchar_t * str) -{ - size_t n = 0; - const wchar_t * c = str; - - while(c) { - n++; - c = multi_string_next(c); - } - - return n; -} - -KHMEXP khm_int32 KHMAPI -multi_string_length_cb(const wchar_t * str, - khm_size max_cb, - khm_size * len_cb) -{ - khm_size cch; - khm_int32 rv; - - rv = multi_string_length_cch(str, max_cb / sizeof(wchar_t), &cch); - - if(KHM_FAILED(rv)) - return rv; - - if(len_cb) - *len_cb = cch * sizeof(wchar_t); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -multi_string_length_cch(const wchar_t * str, - khm_size max_cch, - khm_size * len_cch) -{ - const wchar_t * s; - khm_size cch; - size_t tcch; - - if(!str) - return KHM_ERROR_INVALID_PARAM; - - s = str; - cch = 0; - while(*s && (cch < max_cch)) { - if(FAILED(StringCchLength(s, max_cch, &tcch))) - return KHM_ERROR_TOO_LONG; - cch += ++tcch; - s += tcch; - } - - if(cch >= max_cch) - return KHM_ERROR_TOO_LONG; - - if(len_cch) { - *len_cch = ++cch; - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -multi_string_copy_cb(wchar_t * s_dest, - khm_size max_cb_dest, - const wchar_t * src) -{ - khm_size cb_dest; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!s_dest) - return KHM_ERROR_INVALID_PARAM; - - rv = multi_string_length_cb(src, max_cb_dest, &cb_dest); - if(KHM_FAILED(rv)) - return rv; - - memmove(s_dest, src, cb_dest); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -multi_string_copy_cch(wchar_t * s_dest, - khm_size max_cch_dest, - const wchar_t * src) -{ - khm_size cch_dest; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!s_dest) - return KHM_ERROR_INVALID_PARAM; - - rv = multi_string_length_cch(src, max_cch_dest, &cch_dest); - if(KHM_FAILED(rv)) - return rv; - - memmove(s_dest, src, cch_dest * sizeof(wchar_t)); - - return rv; -} +/* +* Copyright (c) 2005 Massachusetts Institute of Technology +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, +* modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/* $Id$ */ + +#include +#include +#include +#include + +#define TRUE 1 +#define FALSE 0 + +KHMEXP khm_int32 KHMAPI +multi_string_init(wchar_t * ms, + khm_size cb_ms) { + if (!ms || cb_ms < sizeof(wchar_t) * 2) + return KHM_ERROR_INVALID_PARAM; + + memset(ms, 0, cb_ms); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +multi_string_append(wchar_t * ms, + khm_size * pcb_ms, + const wchar_t * str) +{ + wchar_t * s; + size_t cch_s; + size_t cch_t; + size_t cch_r; + + if(!ms || !pcb_ms || !str) + return KHM_ERROR_INVALID_PARAM; + + if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch_s)) || cch_s == 0) + return KHM_ERROR_INVALID_PARAM; + cch_s++; + + s = ms; + + while(*s && ((s - ms) < KHM_MAXCCH_STRING)) { + if(FAILED(StringCchLength(s, KHM_MAXCB_STRING, &cch_t))) + return KHM_ERROR_INVALID_PARAM; + s += cch_t + 1; + } + + if(*s || (s - ms) >= KHM_MAXCCH_STRING) { + return KHM_ERROR_INVALID_PARAM; + } + + /* now s points to the second NULL of the terminating double NULL */ + + cch_r = ((s - ms) + cch_s + 1) * sizeof(wchar_t); + if(*pcb_ms < cch_r) { + *pcb_ms = cch_r; + return KHM_ERROR_TOO_LONG; + } + + *pcb_ms = cch_r; + + StringCchCopy(s, cch_s, str); + s += cch_s; + *s = 0; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +multi_string_prepend(wchar_t * ms, + khm_size * pcb_ms, + const wchar_t * str) +{ + size_t cch_s; + size_t cch_t; + size_t cch_r; + khm_size cb_r; + + if(!ms || !pcb_ms || !str) + return KHM_ERROR_INVALID_PARAM; + + if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch_s)) || cch_s == 0) + return KHM_ERROR_INVALID_PARAM; + cch_s++; + + if(KHM_FAILED(multi_string_length_cch(ms, + KHM_MAXCCH_STRING, + &cch_r))) + return KHM_ERROR_INVALID_PARAM; + + cch_t = cch_s + cch_r; + cb_r = cch_t * sizeof(wchar_t); + + if (*pcb_ms < cb_r) { + *pcb_ms = cb_r; + return KHM_ERROR_TOO_LONG; + } + + memmove(ms + cch_s, ms, cch_r * sizeof(wchar_t)); + memcpy(ms, str, cch_s * sizeof(wchar_t)); + + *pcb_ms = cb_r; + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +multi_string_delete(wchar_t * ms, + const wchar_t * str, + const khm_int32 flags) +{ + wchar_t * s; + wchar_t * n; + wchar_t * e; + size_t cch; + + if(!ms || !str) + return KHM_ERROR_INVALID_PARAM; + + s = multi_string_find(ms, str, flags); + if(!s) + return KHM_ERROR_NOT_FOUND; + + e = s; + n = NULL; + while(*e && (e - s) < KHM_MAXCCH_STRING) { + if(FAILED(StringCchLength(e, KHM_MAXCCH_STRING, &cch))) + return KHM_ERROR_INVALID_PARAM; + e += cch + 1; + + if(!n) + n = e; + } + + if(*e || (e - s) >= KHM_MAXCCH_STRING) + return KHM_ERROR_INVALID_PARAM; + + if(e == s) + return KHM_ERROR_SUCCESS; + + memmove((void *) s, (void *) n, ((e - n) + 1) * sizeof(wchar_t)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP wchar_t * KHMAPI +multi_string_find(const wchar_t * ms, + const wchar_t * str, + const khm_int32 flags) +{ + const wchar_t *s; + size_t cch; + size_t cch_s; + + if(!ms || !str) + return NULL; + + if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch_s))) + return NULL; + + s = ms; + + while(*s && (s - ms) < KHM_MAXCCH_STRING) { + if(FAILED(StringCchLength(s, KHM_MAXCCH_STRING, &cch))) + return NULL; + /* cch++ at end */ + + if(flags & KHM_PREFIX) { + if(((flags & KHM_CASE_SENSITIVE) && !wcsncmp(s, str, cch_s)) || + (!(flags & KHM_CASE_SENSITIVE) && !_wcsnicmp(s, str, cch_s))) + return (wchar_t *) s; + } else { + if((cch == cch_s) && + ((flags & KHM_CASE_SENSITIVE) && !wcsncmp(s, str, cch)) || + (!(flags & KHM_CASE_SENSITIVE) && !_wcsnicmp(s, str, cch))) + return (wchar_t *) s; + } + + s += cch + 1; + } + + return NULL; +} + +KHMEXP khm_int32 KHMAPI +multi_string_to_csv(wchar_t * csvbuf, + khm_size * pcb_csvbuf, + const wchar_t * ms) +{ + size_t cb; + size_t cbt; + const wchar_t * t; + wchar_t * d; + + if(!pcb_csvbuf || !ms) + return KHM_ERROR_INVALID_PARAM; + + /* dry run */ + cbt = 0; + t = ms; + while(*t && cbt <= KHM_MAXCB_STRING) { + khm_boolean quotes = FALSE; + + if(FAILED(StringCbLength(t, KHM_MAXCB_STRING, &cb))) + return KHM_ERROR_INVALID_PARAM; + cb += sizeof(wchar_t); + + cbt += cb; + + if(wcschr(t, L',')) + quotes = TRUE; + + d = (wchar_t *) t; + while(d = wcschr(d, L'"')) { + cbt += sizeof(wchar_t); /* '"'-> '""' */ + d++; + quotes = TRUE; + } + + if(quotes) + cbt += 2*sizeof(wchar_t); /* make room for quotes */ + + t += cb / sizeof(wchar_t); + } + + if(cbt > KHM_MAXCB_STRING) + return KHM_ERROR_INVALID_PARAM; + + /* happens if the multi string contained no strings */ + if(cbt == 0) + cbt = sizeof(wchar_t); + + if(!csvbuf || *pcb_csvbuf < cbt) + { + *pcb_csvbuf = cbt; + return KHM_ERROR_TOO_LONG; + } + + *pcb_csvbuf = cbt; + + /* wet run */ + t = ms; + d = csvbuf; + *csvbuf = 0; + while(*t) { + const wchar_t * s; + + StringCbLength(t, KHM_MAXCB_STRING, &cb); + cb += sizeof(wchar_t); + + if(d != csvbuf) + *d++ = L','; + if(wcschr(t, L',') || wcschr(t, L'"')) { + *d++ = L'"'; + s = t; + while(*s) { + if(*s == L'"') { + *d++ = L'"'; + *d++ = L'"'; + } else + *d++ = *s; + s++; + } + *d++ = L'"'; + *d = 0; + } else { + StringCbCopy(d, cbt - ((d - csvbuf) * sizeof(wchar_t)), t); + d += cb / sizeof(wchar_t) - 1; + } + t += cb / sizeof(wchar_t); + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +csv_to_multi_string(wchar_t * ms, + khm_size * pcb_ms, + const wchar_t * csv) +{ + const wchar_t * t; + wchar_t * p; + size_t cchr; + int field = 1; + + + if(!pcb_ms || !csv) + return KHM_ERROR_INVALID_PARAM; + + cchr = 0; + + /* dry run */ + t = csv; + while(*t && (t - csv) < KHM_MAXCCH_STRING) { + if(field && *t == L'"') { + t++; + while(*t && (t - csv) < KHM_MAXCCH_STRING) { + if(*t == L'"') { + t++; + if(*t != L'"') + break; + } + cchr++; + t++; + } + } + + if(*t) { + cchr++; + if(*t == L',') + field = 1; + else + field = 0; + + t++; + } + } + + if((t - csv) >= KHM_MAXCCH_STRING) + return KHM_ERROR_INVALID_PARAM; + + cchr++; /* last string ends */ + cchr++; /* double NULL */ + + if(!ms || *pcb_ms < (cchr * sizeof(wchar_t))) { + *pcb_ms = cchr * sizeof(wchar_t); + return KHM_ERROR_TOO_LONG; + } + + /* wet run */ + t = csv; + p = ms; + field = 1; + while(*t) { + if(field && *t == L'"') { + t++; + while(*t) { + if(*t == L'"') { + t++; + if(*t != L'"') + break; + } + *p++ = *t; + t++; + } + } + + if(*t == L',') { + *p++ = 0; + field = 1; + t++; + } else if(*t) { + *p++ = *t; + field = 0; + t++; + } + } + + *p++ = 0; /* last string ends */ + *p++ = 0; /* double NULL */ + + *pcb_ms = (p - ms) * sizeof(wchar_t); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP wchar_t * KHMAPI +multi_string_next(const wchar_t * str) +{ + size_t cch; + + if(*str) { + if(FAILED(StringCchLength(str, KHM_MAXCCH_STRING, &cch))) + return NULL; + str += cch + 1; + if(*str) + return (wchar_t *) str; + else + return NULL; + } else { + return NULL; + } +} + +KHMEXP khm_size KHMAPI +multi_string_length_n(const wchar_t * str) +{ + size_t n = 0; + const wchar_t * c = str; + + while(c) { + n++; + c = multi_string_next(c); + } + + return n; +} + +KHMEXP khm_int32 KHMAPI +multi_string_length_cb(const wchar_t * str, + khm_size max_cb, + khm_size * len_cb) +{ + khm_size cch; + khm_int32 rv; + + rv = multi_string_length_cch(str, max_cb / sizeof(wchar_t), &cch); + + if(KHM_FAILED(rv)) + return rv; + + if(len_cb) + *len_cb = cch * sizeof(wchar_t); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +multi_string_length_cch(const wchar_t * str, + khm_size max_cch, + khm_size * len_cch) +{ + const wchar_t * s; + khm_size cch; + size_t tcch; + + if(!str) + return KHM_ERROR_INVALID_PARAM; + + s = str; + cch = 0; + while(*s && (cch < max_cch)) { + if(FAILED(StringCchLength(s, max_cch, &tcch))) + return KHM_ERROR_TOO_LONG; + cch += ++tcch; + s += tcch; + } + + if(cch >= max_cch) + return KHM_ERROR_TOO_LONG; + + if(len_cch) { + *len_cch = ++cch; + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +multi_string_copy_cb(wchar_t * s_dest, + khm_size max_cb_dest, + const wchar_t * src) +{ + khm_size cb_dest; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!s_dest) + return KHM_ERROR_INVALID_PARAM; + + rv = multi_string_length_cb(src, max_cb_dest, &cb_dest); + if(KHM_FAILED(rv)) + return rv; + + memmove(s_dest, src, cb_dest); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +multi_string_copy_cch(wchar_t * s_dest, + khm_size max_cch_dest, + const wchar_t * src) +{ + khm_size cch_dest; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!s_dest) + return KHM_ERROR_INVALID_PARAM; + + rv = multi_string_length_cch(src, max_cch_dest, &cch_dest); + if(KHM_FAILED(rv)) + return rv; + + memmove(s_dest, src, cch_dest * sizeof(wchar_t)); + + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/util/utils.h +++ krb5-1.4.4/src/windows/identity/util/utils.h @@ -1,37 +1,37 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_UTIL_H -#define __KHIMAIRA_UTIL_H - -/*! \defgroup util Utilities - */ -#include -#include -#include -#include - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_UTIL_H +#define __KHIMAIRA_UTIL_H + +/*! \defgroup util Utilities + */ +#include +#include +#include +#include + +#endif --- krb5-1.4.4.orig/src/windows/identity/config/Makefile +++ krb5-1.4.4/src/windows/identity/config/Makefile @@ -1,146 +1,146 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=config -!include - -all: showvars showvers mkalldirs mkversion - -showvars: - $(ECHO) SRC= $(SRC) - $(ECHO) DESTDIR = $(DESTDIR) - $(ECHO) OBJDIR = $(OBJDIR) - $(ECHO). - $(ECHO) CC = $(CC) - $(ECHO) DOXYGEN = $(DOXYGEN) - $(ECHO) HHC = $(HHC) - -showvers: - $(ECHO) ---- Version Information ---- - $(ECHO) NETIDMGR_VERSION= $(NETIDMGR_VERSION) - $(ECHO) NETIDMGR_VERSION_API=$(NETIDMGR_VERSION_API) - $(ECHO) NETIDMGR_RELEASEDESC=$(NETIDMGR_RELEASEDESC) - $(ECHO) Build Type :$(KH_BUILD), $(KH_RELEASE) - $(ECHO) Strings: - $(ECHO) Company = $(NETIDMGR_SRC_COMPANY_1033) - $(ECHO) Copyright = $(NETIDMGR_SRC_COPYRIGHT_1033) - $(ECHO) ---- End Version Information --- - $(ECHO). - -mkalldirs: -! if !exist($(DESTROOT)) - -$(MKDIR) $(DESTROOT) -! endif -! if !exist($(OBJROOT)) - -$(MKDIR) $(OBJROOT) -! endif -! if !exist($(DESTDIR)) - -$(MKDIR) $(DESTDIR) -! endif -! if !exist($(OBJDIR)) - -$(MKDIR) $(OBJDIR) -! endif -! if !exist($(INCDIR)) - -$(MKDIR) $(INCDIR) -! endif -! if !exist($(BINDIR)) - -$(MKDIR) $(BINDIR) -! endif -! if !exist($(LIBDIR)) - -$(MKDIR) $(LIBDIR) -! endif -! if !exist($(DOCDIR)) - -$(MKDIR) $(DOCDIR) -! endif -! if !exist($(OBJDIR)\W2K) - -$(MKDIR) $(OBJDIR)\W2K -! endif -! if !exist($(BINDIR)\W2K) - -$(MKDIR) $(BINDIR)\W2K -! endif -! if !exist($(LIBDIR)\W2K) - -$(MKDIR) $(LIBDIR)\W2K -! endif - $(ECHO) Done creating directories. - -VERSIONINT=$(INCDIR)\netidmgr_intver.h - -VERSIONEXT=$(INCDIR)\netidmgr_version.h - -# Version related defines - -! if "$(KH_BUILD)"=="RETAIL" -kh_fileflags=0 -! else -kh_fileflags=VS_FF_DEBUG -! endif -! if "$(KH_RELEASE)"=="PRERELEASE" -kh_fileflags=$(kh_fileflags) | VS_FF_PRERELEASE -! elseif "$(KH_RELEASE)"=="PRIVATE" -kh_fileflags=$(kh_fileflags) | VS_FF_PRIVATEBUILD -! elseif "$(KH_RELEASE)"=="SPECIAL" -kh_fileflags=$(kh_fileflags) | VS_FF_SPECIALBUILD -! endif - -kh_fileos=VOS_NT_WINDOWS32 -kh_filetype_app=VFT_APP -kh_filetype_dll=VFT_DLL - -mkversion: $(VERSIONINT) $(VERSIONEXT) - -# Version and build strings - -!if "$(KH_RELEASE)" == "OFFICIAL" -NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION) -NETIDMGR_COMMENT_STR_1033=Official build. Please send bug reports to kfw-bugs@MIT.EDU -!elseif "$(KH_RELEASE)" == "PRERELEASE" -NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION) Prelease $(NETIDMGR_RELEASEDESC) -NETIDMGR_COMMENT_STR_1033=Prerelease build. Please send bug reports to kfw-bugs@MIT.EDU -!elseif "$(KH_RELEASE)" == "PRIVATE" -NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION).PRIVATE -NETIDMGR_PRIVATE_STR_1033=Private build. Please send bug reports to kfw-bugs@MIT.EDU -!elseif "$(KH_RELEASE)" == "SPECIAL" -NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION).SPECIAL -NETIDMGR_SPECIAL_STR_1033=Special build. Please send bug reports to kfw-bugs@MIT.EDU -!endif - -!if "$(KH_BUILD)" == "DEBUG" -NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION_STR_1033).DEBUG -!else -!endif - -NETIDMGR_PRODUCT_1033=NetIDMgr $(NETIDMGR_VERSION_STR_1033) - -!include netidmgr_version.h.in - -!include netidmgr_intver.h.in - -clean:: -! if exist($(VERSIONINT)) - $(RM) $(VERSIONINT) -! endif -! if exist($(VERSIONEXT)) - $(RM) $(VERSIONEXT) -! endif - +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=config +!include + +all: showvars showvers mkalldirs mkversion + +showvars: + $(ECHO) SRC= $(SRC) + $(ECHO) DESTDIR = $(DESTDIR) + $(ECHO) OBJDIR = $(OBJDIR) + $(ECHO). + $(ECHO) CC = $(CC) + $(ECHO) DOXYGEN = $(DOXYGEN) + $(ECHO) HHC = $(HHC) + +showvers: + $(ECHO) ---- Version Information ---- + $(ECHO) NETIDMGR_VERSION= $(NETIDMGR_VERSION) + $(ECHO) NETIDMGR_VERSION_API=$(NETIDMGR_VERSION_API) + $(ECHO) NETIDMGR_RELEASEDESC=$(NETIDMGR_RELEASEDESC) + $(ECHO) Build Type :$(KH_BUILD), $(KH_RELEASE) + $(ECHO) Strings: + $(ECHO) Company = $(NETIDMGR_SRC_COMPANY_1033) + $(ECHO) Copyright = $(NETIDMGR_SRC_COPYRIGHT_1033) + $(ECHO) ---- End Version Information --- + $(ECHO). + +mkalldirs: +! if !exist($(DESTROOT)) + -$(MKDIR) $(DESTROOT) +! endif +! if !exist($(OBJROOT)) + -$(MKDIR) $(OBJROOT) +! endif +! if !exist($(DESTDIR)) + -$(MKDIR) $(DESTDIR) +! endif +! if !exist($(OBJDIR)) + -$(MKDIR) $(OBJDIR) +! endif +! if !exist($(INCDIR)) + -$(MKDIR) $(INCDIR) +! endif +! if !exist($(BINDIR)) + -$(MKDIR) $(BINDIR) +! endif +! if !exist($(LIBDIR)) + -$(MKDIR) $(LIBDIR) +! endif +! if !exist($(DOCDIR)) + -$(MKDIR) $(DOCDIR) +! endif +! if !exist($(OBJDIR)\W2K) + -$(MKDIR) $(OBJDIR)\W2K +! endif +! if !exist($(BINDIR)\W2K) + -$(MKDIR) $(BINDIR)\W2K +! endif +! if !exist($(LIBDIR)\W2K) + -$(MKDIR) $(LIBDIR)\W2K +! endif + $(ECHO) Done creating directories. + +VERSIONINT=$(INCDIR)\netidmgr_intver.h + +VERSIONEXT=$(INCDIR)\netidmgr_version.h + +# Version related defines + +! if "$(KH_BUILD)"=="RETAIL" +kh_fileflags=0 +! else +kh_fileflags=VS_FF_DEBUG +! endif +! if "$(KH_RELEASE)"=="PRERELEASE" +kh_fileflags=$(kh_fileflags) | VS_FF_PRERELEASE +! elseif "$(KH_RELEASE)"=="PRIVATE" +kh_fileflags=$(kh_fileflags) | VS_FF_PRIVATEBUILD +! elseif "$(KH_RELEASE)"=="SPECIAL" +kh_fileflags=$(kh_fileflags) | VS_FF_SPECIALBUILD +! endif + +kh_fileos=VOS_NT_WINDOWS32 +kh_filetype_app=VFT_APP +kh_filetype_dll=VFT_DLL + +mkversion: $(VERSIONINT) $(VERSIONEXT) + +# Version and build strings + +!if "$(KH_RELEASE)" == "OFFICIAL" +NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION) +NETIDMGR_COMMENT_STR_1033=Official build. Please send bug reports to kfw-bugs@MIT.EDU +!elseif "$(KH_RELEASE)" == "PRERELEASE" +NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION) Prelease $(NETIDMGR_RELEASEDESC) +NETIDMGR_COMMENT_STR_1033=Prerelease build. Please send bug reports to kfw-bugs@MIT.EDU +!elseif "$(KH_RELEASE)" == "PRIVATE" +NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION).PRIVATE +NETIDMGR_PRIVATE_STR_1033=Private build. Please send bug reports to kfw-bugs@MIT.EDU +!elseif "$(KH_RELEASE)" == "SPECIAL" +NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION).SPECIAL +NETIDMGR_SPECIAL_STR_1033=Special build. Please send bug reports to kfw-bugs@MIT.EDU +!endif + +!if "$(KH_BUILD)" == "DEBUG" +NETIDMGR_VERSION_STR_1033=$(NETIDMGR_VERSION_STR_1033).DEBUG +!else +!endif + +NETIDMGR_PRODUCT_1033=NetIDMgr $(NETIDMGR_VERSION_STR_1033) + +!include netidmgr_version.h.in + +!include netidmgr_intver.h.in + +clean:: +! if exist($(VERSIONINT)) + $(RM) $(VERSIONINT) +! endif +! if exist($(VERSIONEXT)) + $(RM) $(VERSIONEXT) +! endif + --- krb5-1.4.4.orig/src/windows/identity/doc/ui_main.h +++ krb5-1.4.4/src/windows/identity/doc/ui_main.h @@ -1,35 +1,35 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page khui User Interface Topics - - \section khui_contents Contents - - - \subpage khui_actions - - \subpage khui_menus - - \subpage khui_context - - \subpage khui_htwnd - */ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page khui User Interface Topics + + \section khui_contents Contents + + - \subpage khui_actions + - \subpage khui_menus + - \subpage khui_context + - \subpage khui_htwnd + */ --- krb5-1.4.4.orig/src/windows/identity/doc/cred_main.h +++ krb5-1.4.4/src/windows/identity/doc/cred_main.h @@ -1,35 +1,35 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page cred Credentials Providers - - \section cred_contents Contents - - - \subpage cred_data_types - - \subpage cred_acq - - \subpage cred_prop_pages - - \subpage cred_msgs -*/ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page cred Credentials Providers + + \section cred_contents Contents + + - \subpage cred_data_types + - \subpage cred_acq + - \subpage cred_prop_pages + - \subpage cred_msgs +*/ --- krb5-1.4.4.orig/src/windows/identity/doc/cred_msgs.h +++ krb5-1.4.4/src/windows/identity/doc/cred_msgs.h @@ -1,47 +1,47 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page cred_msgs Handling credentials provider messages - -A credentials provider plugin receives a number of messages during the -course of execution. This section describes the appropriate ways of -handling these messages. - -\section pi_credmsg_system System mesages - -There are only two system messages that a credentials provider needs -to handle. Both of these are explained elsewhere as they deal with -initialization and uninitialization of the plugin. See the following -two sections for details on handling these messages. - -- <::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> \ref pi_pt_cred_init -- <::KMSG_SYSTEM,::KMSG_SYSTEM_EXIT> \ref pi_pt_cred_exit - -\section pi_credmsg_cred Credential messages - - - -*/ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page cred_msgs Handling credentials provider messages + +A credentials provider plugin receives a number of messages during the +course of execution. This section describes the appropriate ways of +handling these messages. + +\section pi_credmsg_system System mesages + +There are only two system messages that a credentials provider needs +to handle. Both of these are explained elsewhere as they deal with +initialization and uninitialization of the plugin. See the following +two sections for details on handling these messages. + +- <::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> \ref pi_pt_cred_init +- <::KMSG_SYSTEM,::KMSG_SYSTEM_EXIT> \ref pi_pt_cred_exit + +\section pi_credmsg_cred Credential messages + + + +*/ --- krb5-1.4.4.orig/src/windows/identity/doc/plugin_framework.h +++ krb5-1.4.4/src/windows/identity/doc/plugin_framework.h @@ -1,131 +1,131 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! -\page pi_framework Plugin Framework - -\section pi_fw_pnm Plugins and Modules - -\subsection pi_fw_pnm_p Plugins - -A NetIDMgr plugin is a package that implements a defined API that will -perform credentials management or related tasks on behalf of NetIDMgr. -The core NetIDMgr codebase does not interact directly with Kerberos of -AFS or any other external entity directly. Instead, plugins are used -to abstract out this task. - -Each plugin has a name. The name should be unique among the loaded -plugins, or the plugin will fail to load. - -The method in which NetIDMgr communicates with a plugin depends on the -plugin type. For more information on each plugin type, please refer -to \ref pi_pt. - -Most plugin types rely on a message processor for communication. -During plugin registration, the module specifies the message processor -for the plugin, which acts as the only point of contact between the -NetIDMgr core and the plugin. Some other plugins require exporting -specific functions. - -\subsection pi_fw_pnw_m Modules - -One or more plugins can be bundled together into a module. A module -is essentially a dynamically loadable library which contain a specific -set of callbacks. Currently, the only two required callbacks for a -module are : - -- init_module(), and -- exit_module() - -\section pi_fw_pm Plugin/Module Manager - -The plugin manager maintains a separate thread for loading and -registering modules. When a module is successfully loaded and it -registers one or more plugins, a new thread is created for each -plugin. Plugin specific initialization and other callback functions -are called from within this new thread. This is to prevent one plugin -from "hanging" other plugins and the main NetIDMgr UI threads. - -Read more : -- \ref pi_structure - -\subsection pi_fw_pm_load Load sequence - -When kmm_load_module() is called, the following sequence of events -happen. - -- The standard system search path is used to locate the binary. - -- The binary is loaded into the address space of NetIDMgr along with - any dependencies not already loaded. - -- If the NetIDMgr core binary is signed, then the signature is checked - against the system and user certificate stores. If this fails, the - module is unloaded. See \ref pi_fw_pm_unload. - -- init_module() for the loaded module is called. If this function - returns an error or if no plugins are registered, then the module is - unloaded. See \ref pi_fw_pm_unload. - -- During processing of init_module(), if any localized resource - libraries are specified using kmm_set_locale_info(), then one of the - localized libraries will be loaded. See \ref pi_localization - -- During processing of init_module(), the module registers all the - plugins that it is implementing by calling kmm_register_plugin() for - each. - -- Once init_module() returns, each plugin is initialized. The method - by which a plugin is initialized depends on the plugin type. The - initialization code for the plugin may indicate that it didn't - initialize properly, in which case the plugin is immediately - unregistered. No further calls are made to the plugin. - -- If no plugin is successfully loaded, the module is unloaded. See - \ref pi_fw_pm_unload. - -- During normal operation, any registered plugins for a module can be - unloaded explicitly, or the plugin itself may signal that it should - be unloaded. If at anytime, all the plugins for the module are - unloaded, then the module itself is also unloaded. - -\subsection pi_fw_pm_unload Unload sequence - -- For each of the plugins that are registered for a module, the exit - code is invoked. The method by which this happens depends on the - plugin type. The plugin is not given a chance to object to the - decision to unload. Each plugin is responsible for performing - cleanup tasks, freeing resources and unsubscribing from any message - classes that it has subscribed to. - -- exit_module() is called for the module. - -- If any localized resource libraries were loaded for the module, they - are unloaded. - -- The module is unloaded. - - */ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! +\page pi_framework Plugin Framework + +\section pi_fw_pnm Plugins and Modules + +\subsection pi_fw_pnm_p Plugins + +A NetIDMgr plugin is a package that implements a defined API that will +perform credentials management or related tasks on behalf of NetIDMgr. +The core NetIDMgr codebase does not interact directly with Kerberos of +AFS or any other external entity directly. Instead, plugins are used +to abstract out this task. + +Each plugin has a name. The name should be unique among the loaded +plugins, or the plugin will fail to load. + +The method in which NetIDMgr communicates with a plugin depends on the +plugin type. For more information on each plugin type, please refer +to \ref pi_pt. + +Most plugin types rely on a message processor for communication. +During plugin registration, the module specifies the message processor +for the plugin, which acts as the only point of contact between the +NetIDMgr core and the plugin. Some other plugins require exporting +specific functions. + +\subsection pi_fw_pnw_m Modules + +One or more plugins can be bundled together into a module. A module +is essentially a dynamically loadable library which contain a specific +set of callbacks. Currently, the only two required callbacks for a +module are : + +- init_module(), and +- exit_module() + +\section pi_fw_pm Plugin/Module Manager + +The plugin manager maintains a separate thread for loading and +registering modules. When a module is successfully loaded and it +registers one or more plugins, a new thread is created for each +plugin. Plugin specific initialization and other callback functions +are called from within this new thread. This is to prevent one plugin +from "hanging" other plugins and the main NetIDMgr UI threads. + +Read more : +- \ref pi_structure + +\subsection pi_fw_pm_load Load sequence + +When kmm_load_module() is called, the following sequence of events +happen. + +- The standard system search path is used to locate the binary. + +- The binary is loaded into the address space of NetIDMgr along with + any dependencies not already loaded. + +- If the NetIDMgr core binary is signed, then the signature is checked + against the system and user certificate stores. If this fails, the + module is unloaded. See \ref pi_fw_pm_unload. + +- init_module() for the loaded module is called. If this function + returns an error or if no plugins are registered, then the module is + unloaded. See \ref pi_fw_pm_unload. + +- During processing of init_module(), if any localized resource + libraries are specified using kmm_set_locale_info(), then one of the + localized libraries will be loaded. See \ref pi_localization + +- During processing of init_module(), the module registers all the + plugins that it is implementing by calling kmm_register_plugin() for + each. + +- Once init_module() returns, each plugin is initialized. The method + by which a plugin is initialized depends on the plugin type. The + initialization code for the plugin may indicate that it didn't + initialize properly, in which case the plugin is immediately + unregistered. No further calls are made to the plugin. + +- If no plugin is successfully loaded, the module is unloaded. See + \ref pi_fw_pm_unload. + +- During normal operation, any registered plugins for a module can be + unloaded explicitly, or the plugin itself may signal that it should + be unloaded. If at anytime, all the plugins for the module are + unloaded, then the module itself is also unloaded. + +\subsection pi_fw_pm_unload Unload sequence + +- For each of the plugins that are registered for a module, the exit + code is invoked. The method by which this happens depends on the + plugin type. The plugin is not given a chance to object to the + decision to unload. Each plugin is responsible for performing + cleanup tasks, freeing resources and unsubscribing from any message + classes that it has subscribed to. + +- exit_module() is called for the module. + +- If any localized resource libraries were loaded for the module, they + are unloaded. + +- The module is unloaded. + + */ --- krb5-1.4.4.orig/src/windows/identity/doc/cred_prop_pages.h +++ krb5-1.4.4/src/windows/identity/doc/cred_prop_pages.h @@ -1,83 +1,83 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page cred_prop_pages Property Pages for Credentials - - This section describes the logistics of property pages. When a - user selects the 'Properties' option from a menu (either the File - menu or a context menu), then a KHUI_ACTION_PROPERTIES action is - triggered. This is handled by the credentials window and triggers - the launch of a property sheet if there is a valid context to - extract properties from. - - Sequence of actions: - - - KHUI_ACTION_PROPERTIES action is triggered. - - - The main window dispatches the action to the credentials window. - - - If there is a valid context, then the credentials window calls - khui_ps_create_sheet() to create an empty property sheet - structure of type ::khui_property_sheet. The \a ctx member of - the structure is populated with the property context obtained - through khui_context_get(). - - - A global message is broadcast of type - <::KMSG_CRED,::KMSG_CRED_PP_BEGIN> with the parameter blob that - is a pointer to the ::khui_property_sheet structure. - - - Subscribers to <::KMSG_CRED> messages handle the message, check - the \a ctx member of the structure and determine whether or not - and what type property pages to add to the property sheet. New - property sheets are added by calling khui_ps_add_page(). - - - Once all the pages are added, a - <::KMSG_CRED,::KMSG_CRED_PP_PRECREATE> message is broadcast. - This is a chance for the property page providers to do any - processing before the property page is created. - - - The property sheet is created and made visible with a call to - khui_ps_show_sheet(). - - - The NetIDMgr message loop takes over. Further interaction - including notifications of 'Ok','Cancel','Apply' and other - property sheet related actions are handled through WIN32 - messages. - - - Once the user closes the property sheet, a - <::KMSG_CRED,::KMSG_CRED_PP_END> message is sent to all - subscribers. Individual subscribers who added pages to the - property sheet must free up any associated resources at this - point. - - - All the ::khui_property_page structures that were allocated as - well as the ::khui_property_sheet structure are freed up with a - call to khui_ps_destroy_sheet(). - -The maximum number of property sheets that can be open at one time is -currently set to 256. Each property sheet can have a maximum of 16 -property pages. - */ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page cred_prop_pages Property Pages for Credentials + + This section describes the logistics of property pages. When a + user selects the 'Properties' option from a menu (either the File + menu or a context menu), then a KHUI_ACTION_PROPERTIES action is + triggered. This is handled by the credentials window and triggers + the launch of a property sheet if there is a valid context to + extract properties from. + + Sequence of actions: + + - KHUI_ACTION_PROPERTIES action is triggered. + + - The main window dispatches the action to the credentials window. + + - If there is a valid context, then the credentials window calls + khui_ps_create_sheet() to create an empty property sheet + structure of type ::khui_property_sheet. The \a ctx member of + the structure is populated with the property context obtained + through khui_context_get(). + + - A global message is broadcast of type + <::KMSG_CRED,::KMSG_CRED_PP_BEGIN> with the parameter blob that + is a pointer to the ::khui_property_sheet structure. + + - Subscribers to <::KMSG_CRED> messages handle the message, check + the \a ctx member of the structure and determine whether or not + and what type property pages to add to the property sheet. New + property sheets are added by calling khui_ps_add_page(). + + - Once all the pages are added, a + <::KMSG_CRED,::KMSG_CRED_PP_PRECREATE> message is broadcast. + This is a chance for the property page providers to do any + processing before the property page is created. + + - The property sheet is created and made visible with a call to + khui_ps_show_sheet(). + + - The NetIDMgr message loop takes over. Further interaction + including notifications of 'Ok','Cancel','Apply' and other + property sheet related actions are handled through WIN32 + messages. + + - Once the user closes the property sheet, a + <::KMSG_CRED,::KMSG_CRED_PP_END> message is sent to all + subscribers. Individual subscribers who added pages to the + property sheet must free up any associated resources at this + point. + + - All the ::khui_property_page structures that were allocated as + well as the ::khui_property_sheet structure are freed up with a + call to khui_ps_destroy_sheet(). + +The maximum number of property sheets that can be open at one time is +currently set to 256. Each property sheet can have a maximum of 16 +property pages. + */ --- krb5-1.4.4.orig/src/windows/identity/doc/ui_context.h +++ krb5-1.4.4/src/windows/identity/doc/ui_context.h @@ -1,187 +1,187 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page khui_context Contexts - - \section khui_context_contents Contents - - - \ref khui_context_intro "Introduction" - - \subpage khui_context_using - - \section khui_context_intro Introduction - - Several ::KMSG_CRED messages and many messages depend on the - selections that the user has made on the user interface. The UI - context functions and data structures provide access to this - information. - - The NetIDMgr user interface presents an outline view of all the - credentials that were provided by credentials providers. This - view consists of headers representing the outline levels and rows - representing individual credentials. - - Users can make multiple selections of credentials or headers from - this view. If all the credentials and subheaders under a - particular outline level are selected, then the header itself is - automatically selected. There may be multiple disjointed - selections of headers and credentials. - - In addition, the current cursor position also acts as a selector. - The credential or header under the cursor may not actually be - selected. The cursor is not the mouse pointer, but the focus - rectangle that may be moved either using the keyboard or by - clicking on a credential or header. - - Thus there are two independent groups of selections: - - - Credentials and headers which are in a selected state at some - specific point in time (the current selection). - - - The current credential or selection which the cursor is on (the - cursor selection). - - There are a few notes on how credentials are selected: - - - An "empty" header (a header that does not contain any credential - rows) does not appear in a UI context. However they can appear - as the current cursor context. - - - At its current implementation, cursor selections of identity, - credential type, and individual credentials are treated as - special cases since they are the most common. - - How the UI context is used when processing a specific action or - message depends on the action or message. If an action operates - on a group of credentials, then the current selection may be used, - and on the other hand if an action or message relates to just one - credential, identity or credential type is invoked, then the - cursor selection is invoked. - - For example, double-clicking a credential, or right clicking and - selecting 'Properties' from the context menu launches the property - window for a credential. This operates on the cursor selection - since that reflects where the user double clicked. However, - choosing 'Destroy' from the context menu invokes a command that - can be applied to a group of credential, and hence uses the - current selection. - - Next: \ref khui_context_using "Using Contexts" - */ - -/*! \page khui_context_using Using Contexts - - \section khui_context_using_1 Obtaining the context - - Typically, messages sent by actions that rely on UI context will - obtain and store the context in a location that is accessible to - the handlers of the message. - - If a plugin needs to obtain the UI context, it should do so by - calling khui_context_get() and passing in a pointer to a - ::khui_action_context structure. - - Once obtained, the contents of the ::khui_action_context structure - should be considered read-only. When the plugin is done with the - structure, it should call ::khui_context_release(). This cleans - up any additional memory allocated for storing the context as well - as releasing all the objects that were referenced from the - context. - - \section khui_context_sel_ctx Selection context - - The selection context is specified in the ::khui_action_context - structure in the \a sel_creds and \a n_sel_creds fields. These - combined provide an array of handles to credentials which are - selected. - - \note If \a n_sel_creds is zero, then \a sel_creds may be NULL. - - \section khui_context_cur_ctx Cursor context - - The scope of the cursor context is specified in the \a scope field - of the ::khui_action_context strucutre. The scope can be one of: - - - ::KHUI_SCOPE_NONE - - ::KHUI_SCOPE_IDENT - - ::KHUI_SCOPE_CREDTYPE - - ::KHUI_SCOPE_GROUP - - ::KHUI_SCOPE_CRED - - Depending on the scope, several other members of the strucre may - also be set. - - In general, the cursor context can be a single credential or an - entire outline level. Unlike the selection context, since this - specifies a single point of selection it can not be disjointed. - - The contents of the \a identity, \a cred_type, \a cred, \a headers - and \a n_headers are described in the documentation of each of the - scope values above. - - \subsection khui_context_sel_ctx_grp KHUI_SCOPE_GROUP - - The ::KHUI_SCOPE_GROUP scope is the generic scope which describes - a cursor selection that can not be simplified into any other - scope. - - In this case, the selection is described by an array of - ::khui_header elements each of which specify a criterion for - narrowing down the selection of credentials. The ::khui_header - structure specifies an attribute in the \a attr_id field and a - value in the \a data and \a cb_data fields. The credentials that - are selected are those in the root credential set whose repective - attributes contain the values specified in each of the - ::khui_header elements. - - For example, the following selection: - - \image html credview-select-outline.jpg - - will result in the following header specification: - - \code - ctx.n_headers = 3; - - ctx.headers[0].attr_id = KCDB_ATTR_LOCATION; - ctx.headers[0].data = L"grailauth@KHMTEST"; - ctx.headers[0].cb_data = sizeof(L"grailauth@KHMTEST"); - - ctx.headers[1].attr_id = KCDB_ATTR_ID; - ctx.headers[1].data = &handle_to_identity; - ctx.headers[1].cb_data = sizeof(khm_handle); - - ctx.headers[2].attr_id = KCDB_ATTR_TYPE; - ctx.headers[2].data = &kerberos_5_credtype; - ctx.headers[2].cb_data = sizeof(khm_int32); - \endcode - - \note The attribute that is used to specify the header is not the - display attribute, but the canonical attribute. For example, - in the above, the second header was actually - KCDB_ATTR_ID_NAME. But KCDB_ATTR_ID was used since that is - the canonical source for KCDB_ATTR_ID_NAME. See ::kcdb_attrib - for more information on canonical attributes. -*/ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page khui_context Contexts + + \section khui_context_contents Contents + + - \ref khui_context_intro "Introduction" + - \subpage khui_context_using + + \section khui_context_intro Introduction + + Several ::KMSG_CRED messages and many messages depend on the + selections that the user has made on the user interface. The UI + context functions and data structures provide access to this + information. + + The NetIDMgr user interface presents an outline view of all the + credentials that were provided by credentials providers. This + view consists of headers representing the outline levels and rows + representing individual credentials. + + Users can make multiple selections of credentials or headers from + this view. If all the credentials and subheaders under a + particular outline level are selected, then the header itself is + automatically selected. There may be multiple disjointed + selections of headers and credentials. + + In addition, the current cursor position also acts as a selector. + The credential or header under the cursor may not actually be + selected. The cursor is not the mouse pointer, but the focus + rectangle that may be moved either using the keyboard or by + clicking on a credential or header. + + Thus there are two independent groups of selections: + + - Credentials and headers which are in a selected state at some + specific point in time (the current selection). + + - The current credential or selection which the cursor is on (the + cursor selection). + + There are a few notes on how credentials are selected: + + - An "empty" header (a header that does not contain any credential + rows) does not appear in a UI context. However they can appear + as the current cursor context. + + - At its current implementation, cursor selections of identity, + credential type, and individual credentials are treated as + special cases since they are the most common. + + How the UI context is used when processing a specific action or + message depends on the action or message. If an action operates + on a group of credentials, then the current selection may be used, + and on the other hand if an action or message relates to just one + credential, identity or credential type is invoked, then the + cursor selection is invoked. + + For example, double-clicking a credential, or right clicking and + selecting 'Properties' from the context menu launches the property + window for a credential. This operates on the cursor selection + since that reflects where the user double clicked. However, + choosing 'Destroy' from the context menu invokes a command that + can be applied to a group of credential, and hence uses the + current selection. + + Next: \ref khui_context_using "Using Contexts" + */ + +/*! \page khui_context_using Using Contexts + + \section khui_context_using_1 Obtaining the context + + Typically, messages sent by actions that rely on UI context will + obtain and store the context in a location that is accessible to + the handlers of the message. + + If a plugin needs to obtain the UI context, it should do so by + calling khui_context_get() and passing in a pointer to a + ::khui_action_context structure. + + Once obtained, the contents of the ::khui_action_context structure + should be considered read-only. When the plugin is done with the + structure, it should call ::khui_context_release(). This cleans + up any additional memory allocated for storing the context as well + as releasing all the objects that were referenced from the + context. + + \section khui_context_sel_ctx Selection context + + The selection context is specified in the ::khui_action_context + structure in the \a sel_creds and \a n_sel_creds fields. These + combined provide an array of handles to credentials which are + selected. + + \note If \a n_sel_creds is zero, then \a sel_creds may be NULL. + + \section khui_context_cur_ctx Cursor context + + The scope of the cursor context is specified in the \a scope field + of the ::khui_action_context strucutre. The scope can be one of: + + - ::KHUI_SCOPE_NONE + - ::KHUI_SCOPE_IDENT + - ::KHUI_SCOPE_CREDTYPE + - ::KHUI_SCOPE_GROUP + - ::KHUI_SCOPE_CRED + + Depending on the scope, several other members of the strucre may + also be set. + + In general, the cursor context can be a single credential or an + entire outline level. Unlike the selection context, since this + specifies a single point of selection it can not be disjointed. + + The contents of the \a identity, \a cred_type, \a cred, \a headers + and \a n_headers are described in the documentation of each of the + scope values above. + + \subsection khui_context_sel_ctx_grp KHUI_SCOPE_GROUP + + The ::KHUI_SCOPE_GROUP scope is the generic scope which describes + a cursor selection that can not be simplified into any other + scope. + + In this case, the selection is described by an array of + ::khui_header elements each of which specify a criterion for + narrowing down the selection of credentials. The ::khui_header + structure specifies an attribute in the \a attr_id field and a + value in the \a data and \a cb_data fields. The credentials that + are selected are those in the root credential set whose repective + attributes contain the values specified in each of the + ::khui_header elements. + + For example, the following selection: + + \image html credview-select-outline.jpg + + will result in the following header specification: + + \code + ctx.n_headers = 3; + + ctx.headers[0].attr_id = KCDB_ATTR_LOCATION; + ctx.headers[0].data = L"grailauth@KHMTEST"; + ctx.headers[0].cb_data = sizeof(L"grailauth@KHMTEST"); + + ctx.headers[1].attr_id = KCDB_ATTR_ID; + ctx.headers[1].data = &handle_to_identity; + ctx.headers[1].cb_data = sizeof(khm_handle); + + ctx.headers[2].attr_id = KCDB_ATTR_TYPE; + ctx.headers[2].data = &kerberos_5_credtype; + ctx.headers[2].cb_data = sizeof(khm_int32); + \endcode + + \note The attribute that is used to specify the header is not the + display attribute, but the canonical attribute. For example, + in the above, the second header was actually + KCDB_ATTR_ID_NAME. But KCDB_ATTR_ID was used since that is + the canonical source for KCDB_ATTR_ID_NAME. See ::kcdb_attrib + for more information on canonical attributes. +*/ --- krb5-1.4.4.orig/src/windows/identity/doc/Makefile +++ krb5-1.4.4/src/windows/identity/doc/Makefile @@ -1,68 +1,68 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=doc -!include <../config/Makefile.w32> - -all: mkdirs docs - -docs: - $(DOXYGEN) << -@INCLUDE = doxyfile.cfg - -PROJECT_NUMBER = "$(KHIMAIRA_VERSION)" - -OUTPUT_DIRECTORY = "$(DOCDIR)" - -STRIP_FROM_PATH = "$(SRC)" - -INTERNAL_DOCS = NO - -WARN_LOGFILE = "$(OBJ)\doxywarnings.txt" - -INPUT = "$(SRC)\include" -INPUT += "$(SRC)\kconfig" -INPUT += "$(SRC)\kcreddb" -INPUT += "$(SRC)\kmq" -INPUT += "$(SRC)\ui" -INPUT += "$(SRC)\uilib" -INPUT += "$(SRC)\util" -INPUT += "$(SRC)\doc" -INPUT += "$(SRC)\kmm" -INPUT += "$(SRC)\kherr" -!ifdef BUILD_AFS -INPUT += "$(SRC)\plugins\afs" -!endif - -IMAGE_PATH = "$(SRC)\doc\images" - -INCLUDE_PATH = "$(INCDIR)" "$(SRC)\include" - -CHM_FILE = "$(DOCDIR)\netiddev.chm" -<< - -$(HHC) $(DOCDIR)\html\index.hhp - -clean:: - $(RMDIR) /s /q $(DOCDIR)\html - $(RM) $(DOCDIR)\*.* +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=doc +!include <../config/Makefile.w32> + +all: mkdirs docs + +docs: + $(DOXYGEN) << +@INCLUDE = doxyfile.cfg + +PROJECT_NUMBER = "$(KHIMAIRA_VERSION)" + +OUTPUT_DIRECTORY = "$(DOCDIR)" + +STRIP_FROM_PATH = "$(SRC)" + +INTERNAL_DOCS = NO + +WARN_LOGFILE = "$(OBJ)\doxywarnings.txt" + +INPUT = "$(SRC)\include" +INPUT += "$(SRC)\kconfig" +INPUT += "$(SRC)\kcreddb" +INPUT += "$(SRC)\kmq" +INPUT += "$(SRC)\ui" +INPUT += "$(SRC)\uilib" +INPUT += "$(SRC)\util" +INPUT += "$(SRC)\doc" +INPUT += "$(SRC)\kmm" +INPUT += "$(SRC)\kherr" +!ifdef BUILD_AFS +INPUT += "$(SRC)\plugins\afs" +!endif + +IMAGE_PATH = "$(SRC)\doc\images" + +INCLUDE_PATH = "$(INCDIR)" "$(SRC)\include" + +CHM_FILE = "$(DOCDIR)\netiddev.chm" +<< + -$(HHC) $(DOCDIR)\html\index.hhp + +clean:: + $(RMDIR) /s /q $(DOCDIR)\html + $(RM) $(DOCDIR)\*.* --- krb5-1.4.4.orig/src/windows/identity/doc/ui_actions.h +++ krb5-1.4.4/src/windows/identity/doc/ui_actions.h @@ -1,29 +1,29 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page khui_actions Actions - - */ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page khui_actions Actions + + */ --- krb5-1.4.4.orig/src/windows/identity/doc/plugin_locale.h +++ krb5-1.4.4/src/windows/identity/doc/plugin_locale.h @@ -1,107 +1,107 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! -\page pi_localization Localization - -If a module requires localized resources, it can register the -localized resource libraries with the module manager when it receives -the init_module() callback. Note that you can only register localized -resource libraries during init_module(). - -The localized resource library is global to a module. Each plugin is -not allowed to define its own localization library, although it is -free to load and use any library as it sees fit. The module manager -does not manage these libraries for the plugin. - -\section pi_loc_spec Specification of localized resources - -In order to register localized resource libraries, a module calls -kmm_set_locale_info(). The \a locales parameter to the function holds -a pointer to an array of ::kmm_module_locale records. Each record -specifies one language code and a filename of a library that holds the -language resources for that language. - -It is recommended that you use the LOCALE_DEF convenience macro when -defining locale records for use with kmm_set_locale_info(). This will -ensure that future changes in the API will only minimally affect your -code. For example: - -\code -kmm_module_locale my_locales[] = { -LOCALE_DEF(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), L"english.dll", KMM_MLOC_FLAG_DEFAULT), -LOCALE_DEF(MAKELANGID(LANG_DUTCH,SUBLANG_DUTCH), L"dutch.dll", 0), -LOCALE_DEF(MAKELANGID(LANG_SPANISH,SUBLANG_SPANISH_MODERN), L"spanish.dll", 0) -}; - -int n_locales = sizeof(my_locales)/sizeof(my_locales[0]); - -... - -kmm_set_locale_info(h_module, my_locales, n_locales); - -... -\endcode - -See kmm_set_locale_info() and ::kmm_module_locale for more info. - -\section pi_loc_how Selection of localized resource library - -The module manager searches the array of ::kmm_module_locale objects -passed into the kmm_set_locale_info() function for one that matches -the current user locale (as opposed to the current system locale). A -record matches the locale if it has the same language ID. - -If a match is found, that library is selected. Otherwise, the list is -searched for one that is compatible with the current user locale. A -locale record is compatible with the user locale if the primary -language matches. - -If a match is still not found, the first record in the locale array -that has the ::KMM_MLOC_FLAG_DEFAULT flag set will be selected. - -If a match is still not found, then the kmm_set_locale_info() will -return ::KHM_ERROR_NOT_FOUND. - -\section pi_loc_usage Using localization - -The following convenience macros are available for using a module -handle to load resources from the corresponding resource library. -However, for performance reasons, it is advisable to obtain a handle -to the resource library loaded by the module manager using -kmm_get_resource_module() and then use it to access resources using -the regular WIN32 API. - -- ::kmm_LoadAccelerators -- ::kmm_LoadBitmap -- ::kmm_LoadCursor -- ::kmm_LoadIcon -- ::kmm_LoadImage -- ::kmm_LoadMenu -- ::kmm_LoadString - -*/ - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! +\page pi_localization Localization + +If a module requires localized resources, it can register the +localized resource libraries with the module manager when it receives +the init_module() callback. Note that you can only register localized +resource libraries during init_module(). + +The localized resource library is global to a module. Each plugin is +not allowed to define its own localization library, although it is +free to load and use any library as it sees fit. The module manager +does not manage these libraries for the plugin. + +\section pi_loc_spec Specification of localized resources + +In order to register localized resource libraries, a module calls +kmm_set_locale_info(). The \a locales parameter to the function holds +a pointer to an array of ::kmm_module_locale records. Each record +specifies one language code and a filename of a library that holds the +language resources for that language. + +It is recommended that you use the LOCALE_DEF convenience macro when +defining locale records for use with kmm_set_locale_info(). This will +ensure that future changes in the API will only minimally affect your +code. For example: + +\code +kmm_module_locale my_locales[] = { +LOCALE_DEF(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US), L"english.dll", KMM_MLOC_FLAG_DEFAULT), +LOCALE_DEF(MAKELANGID(LANG_DUTCH,SUBLANG_DUTCH), L"dutch.dll", 0), +LOCALE_DEF(MAKELANGID(LANG_SPANISH,SUBLANG_SPANISH_MODERN), L"spanish.dll", 0) +}; + +int n_locales = sizeof(my_locales)/sizeof(my_locales[0]); + +... + +kmm_set_locale_info(h_module, my_locales, n_locales); + +... +\endcode + +See kmm_set_locale_info() and ::kmm_module_locale for more info. + +\section pi_loc_how Selection of localized resource library + +The module manager searches the array of ::kmm_module_locale objects +passed into the kmm_set_locale_info() function for one that matches +the current user locale (as opposed to the current system locale). A +record matches the locale if it has the same language ID. + +If a match is found, that library is selected. Otherwise, the list is +searched for one that is compatible with the current user locale. A +locale record is compatible with the user locale if the primary +language matches. + +If a match is still not found, the first record in the locale array +that has the ::KMM_MLOC_FLAG_DEFAULT flag set will be selected. + +If a match is still not found, then the kmm_set_locale_info() will +return ::KHM_ERROR_NOT_FOUND. + +\section pi_loc_usage Using localization + +The following convenience macros are available for using a module +handle to load resources from the corresponding resource library. +However, for performance reasons, it is advisable to obtain a handle +to the resource library loaded by the module manager using +kmm_get_resource_module() and then use it to access resources using +the regular WIN32 API. + +- ::kmm_LoadAccelerators +- ::kmm_LoadBitmap +- ::kmm_LoadCursor +- ::kmm_LoadIcon +- ::kmm_LoadImage +- ::kmm_LoadMenu +- ::kmm_LoadString + +*/ + --- krb5-1.4.4.orig/src/windows/identity/doc/cred_aquisition.h +++ krb5-1.4.4/src/windows/identity/doc/cred_aquisition.h @@ -1,208 +1,208 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page cred_acq Managed credential acquisition - - Credential providers and the identity provider must participate in - managed credential acquisition in order to respond to the user's - requests to obtain new credentials for an identity or to obtain - new credentials for an existing identity. - - There are two major processes that result in managed credential - acuqisition. One is the acquisition of initial credentials, while - the other is the acquisition of new crednetials. Both processes - acquire new credentials (or replace existing credentials with new - ones). The difference between the two processes lie in the way the - new credentials are obtained. Initial credentials are obtained - using user supplied username and password while new credentials - are obtained using other existing credentials. - - \section cred_acq_init Initial Credentials - - When a user initiates the process of initial credential - acquisition, NetIDMgr broadcasts a - <::KMSG_CRED,::KMSG_CRED_INITIAL_CREDS> message. Credential - providers which need to participate in the initial credential - acquisition should respond to this message as detailed in - \ref cred_acq_handle. - - \section cred_acq_new New Credentials - - When a user initiates the process of obtaining new credentials - based on existing credentials, NetIDMgr broadcasts a - <::KMSG_CRED,::KMSG_CRED_NEW_CREDS> message. Credential providers - which need to participate in the initial credential acquisition - should respond to this message as detailed in \ref cred_acq_handle. - - The following pages provide detailed information: - - - \subpage cred_acq_new_resp - - \subpage cred_acq_dlgproc - */ - -/*! \page cred_acq_new_resp Handling new credentials acquisition - - The process of acquiring new credentials whether they are initial - credentials or not, happen as follows : - - - NetIDMgr creates a ::khui_new_creds object and a credentials - acquisition window. - - - <::KMSG_CRED,::KMSG_CRED_INITIAL_CREDS> or - <::KMSG_CRED,::KMSG_CRED_NEW_CREDS> is sent to all the - credentials providers. - - - The credential providers create the panels (where appropriate) - for customizing their respective credential types. The type, - panel and any dependency information is populated into a - ::khui_new_creds_by_type structure and added to the - ::khui_new_creds structure. - - - <::KMSG_CRED, ::KMSG_CRED_DIALOG_PRESTART> is sent to all the - credentials providers. Credentials providers should use this - message to finialize initialization in preparation of showing - the credentials acquisition window, such as by initializing the - controls of the individual panels. - - - <::KMSG_CRED, ::KMSG_CRED_DIALOG_START> is sent to all the - credentials providers. - - - The dialog for obtaining credentials is displayed. - Notifications between the main dialog and the individual panels - are done through ::KHUI_WM_NC_NOTIFY messages to the dialog - procedures. - - - Once the dialog completes, NetIDMgr sends - <::KMSG_CRED,::KMSG_CRED_DIALOG_END> message to all the - credentials providers. The UI portion ends here. The - individual dialog controls are destroyed as a result of the main - credentials acquisition window being destroyed. - - - NetIDMgr posts <::KMSG_CRED,::KMSG_CRED_DIALOG_PROCESS> message - to all the credentials providers. Each provider should check if - the user cancelled the dialog or indicated that the new - credentials should be obtained and act accordingly. The - credentials provider is responsible for removing the - ::khui_new_creds_by_type structre from the ::khui_new_creds - structure and freeing up any resources it allocated earlier in - preparation for obtaining new credentials. - - \section cred_acq_handle Responding to credential acquisition messages - - The credential acquisition messages are - <::KMSG_CRED,::KMSG_CRED_INITIAL_CREDS> and <::KMSG_CRED, - ::KMSG_CRED_NEW_CREDS>. They are structured as follows : - - - \b type : ::KMSG_CRED - - \b subtype: ::KMSG_CRED_INITIAL_CREDS or ::KMSG_CRED_NEW_CREDS - - \b uparam : 0 (unused) - - \b vparam : a pointer to a ::khui_new_creds structure. - - The \a vparam parameter of the message, as shown above, is a - pointer to a ::khui_new_creds structure. You can use the \a - subtype field of this structure to determine whether this is an - initial credentials acquisition or a new credentials acquisition - at any point. - - In response to this message, a credentials provider is expected to - provide a configuration panel which the user can use to customize - how the credentials of this type are to be obtained. The panel is - described by the ::khui_new_cred_panel structure. - - \subsection cred_acq_panel_spec Specifying the credentials type panel - - The credentials type panel is used by the user to customize how - credentials of the specified type are to be obtained. The - ::khui_new_cred_panel structure that describes the panel can be - used to specify a number of parameters that guide how the panel is - to be displayed in the new credentials acquisition dialog. - - The \a name field defines a localized string that will be - displayed in the tab control that houses the panel. Optionally, - an icon can be specified in the \a icon field which will appear - alongside the name. A tooltip may be provided in the \a tooltip - field which will be displayed when the user hovers the mouse over - the tab. - - In order to assert that the tab appears at a specific position in - the list of tabs, you can specify a positive number in the \a - ordinal field. Zero does not count as a valid ordinal. The - panels with positive ordinals are arranged first in increasing - order of ordinal (conflicts are resolved by sorting along the \a - name). Then the panels without a positive ordianl are arranged - behind these in increasing order of \a name. - - The \a hwnd_panel field is used to specify the handle to the - dialog or window of the panel. The parent of this window should - be set to the \a hwnd parameter of the ::khui_new_creds structure - which is passed in to the message handler. - - Following is a code snippet which suggests how this could be done: - - \code - // Message handling code for KMSG_CRED_NEW_CREDS or - // KMSG_CRED_INIT_CREDS - ... - khui_new_creds * c; - khui_new_creds_by_type * t; - - c = (khui_new_creds *) vparam; - t = PMALLOC(sizeof(*t)); - ZeroMemory(t, sizeof(*t)); - - t->type = my_cred_type; - - // set look and feel params - t->ordinal = 3; // third in line - t->name = L"My panel name"; - t->icon = LoadIcon(my_hInstance, MAKEINTRESOURCE(IDI_PANEL_ICON)); - t->tooltip = L"Configure credentials of my type"; - - t->hwnd_panel = CreateDialog( - my_hInstance, - MAKEINTRESOURCE(IDD_MY_PANEL), - c->hwnd, - my_dialog_proc); - - if(KHM_FAILED(khui_cw_add_type(c,t))) { - // handle error - } - \endcode - - It is important to note that the ::khui_new_creds_by_type pointer - that is passed into khui_cw_add_type() points to an allocated - block of memory which should remain in memory until - <::KMSG_CRED,::KMSG_CRED_DIALOG_PROCESS> message is received. - - For information on how the dialog procedure should be written, see - \ref cred_acq_dlgproc . - -*/ - -/*! \page cred_acq_dlgproc Writing the dialog procedure for a cred type panel - - -*/ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page cred_acq Managed credential acquisition + + Credential providers and the identity provider must participate in + managed credential acquisition in order to respond to the user's + requests to obtain new credentials for an identity or to obtain + new credentials for an existing identity. + + There are two major processes that result in managed credential + acuqisition. One is the acquisition of initial credentials, while + the other is the acquisition of new crednetials. Both processes + acquire new credentials (or replace existing credentials with new + ones). The difference between the two processes lie in the way the + new credentials are obtained. Initial credentials are obtained + using user supplied username and password while new credentials + are obtained using other existing credentials. + + \section cred_acq_init Initial Credentials + + When a user initiates the process of initial credential + acquisition, NetIDMgr broadcasts a + <::KMSG_CRED,::KMSG_CRED_INITIAL_CREDS> message. Credential + providers which need to participate in the initial credential + acquisition should respond to this message as detailed in + \ref cred_acq_handle. + + \section cred_acq_new New Credentials + + When a user initiates the process of obtaining new credentials + based on existing credentials, NetIDMgr broadcasts a + <::KMSG_CRED,::KMSG_CRED_NEW_CREDS> message. Credential providers + which need to participate in the initial credential acquisition + should respond to this message as detailed in \ref cred_acq_handle. + + The following pages provide detailed information: + + - \subpage cred_acq_new_resp + - \subpage cred_acq_dlgproc + */ + +/*! \page cred_acq_new_resp Handling new credentials acquisition + + The process of acquiring new credentials whether they are initial + credentials or not, happen as follows : + + - NetIDMgr creates a ::khui_new_creds object and a credentials + acquisition window. + + - <::KMSG_CRED,::KMSG_CRED_INITIAL_CREDS> or + <::KMSG_CRED,::KMSG_CRED_NEW_CREDS> is sent to all the + credentials providers. + + - The credential providers create the panels (where appropriate) + for customizing their respective credential types. The type, + panel and any dependency information is populated into a + ::khui_new_creds_by_type structure and added to the + ::khui_new_creds structure. + + - <::KMSG_CRED, ::KMSG_CRED_DIALOG_PRESTART> is sent to all the + credentials providers. Credentials providers should use this + message to finialize initialization in preparation of showing + the credentials acquisition window, such as by initializing the + controls of the individual panels. + + - <::KMSG_CRED, ::KMSG_CRED_DIALOG_START> is sent to all the + credentials providers. + + - The dialog for obtaining credentials is displayed. + Notifications between the main dialog and the individual panels + are done through ::KHUI_WM_NC_NOTIFY messages to the dialog + procedures. + + - Once the dialog completes, NetIDMgr sends + <::KMSG_CRED,::KMSG_CRED_DIALOG_END> message to all the + credentials providers. The UI portion ends here. The + individual dialog controls are destroyed as a result of the main + credentials acquisition window being destroyed. + + - NetIDMgr posts <::KMSG_CRED,::KMSG_CRED_DIALOG_PROCESS> message + to all the credentials providers. Each provider should check if + the user cancelled the dialog or indicated that the new + credentials should be obtained and act accordingly. The + credentials provider is responsible for removing the + ::khui_new_creds_by_type structre from the ::khui_new_creds + structure and freeing up any resources it allocated earlier in + preparation for obtaining new credentials. + + \section cred_acq_handle Responding to credential acquisition messages + + The credential acquisition messages are + <::KMSG_CRED,::KMSG_CRED_INITIAL_CREDS> and <::KMSG_CRED, + ::KMSG_CRED_NEW_CREDS>. They are structured as follows : + + - \b type : ::KMSG_CRED + - \b subtype: ::KMSG_CRED_INITIAL_CREDS or ::KMSG_CRED_NEW_CREDS + - \b uparam : 0 (unused) + - \b vparam : a pointer to a ::khui_new_creds structure. + + The \a vparam parameter of the message, as shown above, is a + pointer to a ::khui_new_creds structure. You can use the \a + subtype field of this structure to determine whether this is an + initial credentials acquisition or a new credentials acquisition + at any point. + + In response to this message, a credentials provider is expected to + provide a configuration panel which the user can use to customize + how the credentials of this type are to be obtained. The panel is + described by the ::khui_new_cred_panel structure. + + \subsection cred_acq_panel_spec Specifying the credentials type panel + + The credentials type panel is used by the user to customize how + credentials of the specified type are to be obtained. The + ::khui_new_cred_panel structure that describes the panel can be + used to specify a number of parameters that guide how the panel is + to be displayed in the new credentials acquisition dialog. + + The \a name field defines a localized string that will be + displayed in the tab control that houses the panel. Optionally, + an icon can be specified in the \a icon field which will appear + alongside the name. A tooltip may be provided in the \a tooltip + field which will be displayed when the user hovers the mouse over + the tab. + + In order to assert that the tab appears at a specific position in + the list of tabs, you can specify a positive number in the \a + ordinal field. Zero does not count as a valid ordinal. The + panels with positive ordinals are arranged first in increasing + order of ordinal (conflicts are resolved by sorting along the \a + name). Then the panels without a positive ordianl are arranged + behind these in increasing order of \a name. + + The \a hwnd_panel field is used to specify the handle to the + dialog or window of the panel. The parent of this window should + be set to the \a hwnd parameter of the ::khui_new_creds structure + which is passed in to the message handler. + + Following is a code snippet which suggests how this could be done: + + \code + // Message handling code for KMSG_CRED_NEW_CREDS or + // KMSG_CRED_INIT_CREDS + ... + khui_new_creds * c; + khui_new_creds_by_type * t; + + c = (khui_new_creds *) vparam; + t = PMALLOC(sizeof(*t)); + ZeroMemory(t, sizeof(*t)); + + t->type = my_cred_type; + + // set look and feel params + t->ordinal = 3; // third in line + t->name = L"My panel name"; + t->icon = LoadIcon(my_hInstance, MAKEINTRESOURCE(IDI_PANEL_ICON)); + t->tooltip = L"Configure credentials of my type"; + + t->hwnd_panel = CreateDialog( + my_hInstance, + MAKEINTRESOURCE(IDD_MY_PANEL), + c->hwnd, + my_dialog_proc); + + if(KHM_FAILED(khui_cw_add_type(c,t))) { + // handle error + } + \endcode + + It is important to note that the ::khui_new_creds_by_type pointer + that is passed into khui_cw_add_type() points to an allocated + block of memory which should remain in memory until + <::KMSG_CRED,::KMSG_CRED_DIALOG_PROCESS> message is received. + + For information on how the dialog procedure should be written, see + \ref cred_acq_dlgproc . + +*/ + +/*! \page cred_acq_dlgproc Writing the dialog procedure for a cred type panel + + +*/ --- krb5-1.4.4.orig/src/windows/identity/doc/main_page.h +++ krb5-1.4.4/src/windows/identity/doc/main_page.h @@ -1,110 +1,110 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \mainpage NetIDMgr - - \image html khimaira_logo.png - - \section main_dev Documentation for Developers - - NetIDMgr is a credentials manager, which currently manages - Kerberos IV, Kerberos V and AFS credentials. This document - describes the API that is implemented by the NetIDMgr system. - - See the following sections for more information : - - \subpage license - - \subpage bugs - - \subpage releases - - © 2004 Massachusetts Institute of Technology -*/ - -/*! - \page license License agreement and credits - - NetIDMgr is distributed under the MIT License. - - \section license_l MIT License - - Copyright © 2004 Massachusetts Institute of Technology - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - \section license_credits Credits - - NetIDMgr was developed at the Massachusetts Institute of - Technology. - - (Contributor list goes here) - - At the moment, no contributers have come forward to accept - responsibility. - - Information Services and - Technology at Massachusetts - Institute of Technology -*/ - -/*! \page bugs Reporting bugs - - NetIDMgr bugs can be reported to - kfw-bugs@mit.edu for now. - - In the future, there will actually be a place to track NetIDMgr bugs. - - When reporting bugs, please include as much information as - possible to help diagnose the problem. More guidelines about - reporting bugs will appear here at some point in time. - - \image html khimaira_logo_small.png -*/ - -/*! \page releases Prior releases - - - 0.1.1 First Alpha release Nov 01, 2005\n - Released along with Kerberos for Windows 3.0.0 beta. - - - 0.1.2 Second Alpha release Nov 30, 2005\n - Released along with Kerberos for Windows 3.0.0 beta 2. -*/ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \mainpage NetIDMgr + + \image html khimaira_logo.png + + \section main_dev Documentation for Developers + + NetIDMgr is a credentials manager, which currently manages + Kerberos IV, Kerberos V and AFS credentials. This document + describes the API that is implemented by the NetIDMgr system. + + See the following sections for more information : + - \subpage license + - \subpage bugs + - \subpage releases + + © 2004 Massachusetts Institute of Technology +*/ + +/*! + \page license License agreement and credits + + NetIDMgr is distributed under the MIT License. + + \section license_l MIT License + + Copyright © 2004 Massachusetts Institute of Technology + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + \section license_credits Credits + + NetIDMgr was developed at the Massachusetts Institute of + Technology. + + (Contributor list goes here) + + At the moment, no contributers have come forward to accept + responsibility. + + Information Services and + Technology at Massachusetts + Institute of Technology +*/ + +/*! \page bugs Reporting bugs + + NetIDMgr bugs can be reported to + kfw-bugs@mit.edu for now. + + In the future, there will actually be a place to track NetIDMgr bugs. + + When reporting bugs, please include as much information as + possible to help diagnose the problem. More guidelines about + reporting bugs will appear here at some point in time. + + \image html khimaira_logo_small.png +*/ + +/*! \page releases Prior releases + + - 0.1.1 First Alpha release Nov 01, 2005\n + Released along with Kerberos for Windows 3.0.0 beta. + + - 0.1.2 Second Alpha release Nov 30, 2005\n + Released along with Kerberos for Windows 3.0.0 beta 2. +*/ --- krb5-1.4.4.orig/src/windows/identity/doc/plugin_main.h +++ krb5-1.4.4/src/windows/identity/doc/plugin_main.h @@ -1,126 +1,126 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! - -\page plugins NetIDMgr Modules and Plugins - -Plugins and localization are handled by the NetIDMgr Module Manager -API. Each plugin consists of a dynamically loadable library and zero -or more associated resource libraries. - -For more information about NetIDMgr Plugins, see the following -sections: - -- \subpage pi_framework -- \subpage pi_pt -- \subpage pi_structure -- \subpage pi_localization -*/ - -/*! \page pi_pt Plugin Types - -The types of plugins that are currently supported by NetIDMgr are : - -\section pi_pt_cred Credential Provider - -A credential provider plugin essentially acts as an interface between -NetIDMgr and some entity which defines the credentials for the purpose -of managing those credentials. - -There can be more than one credential provider in a module. - -\subsection pi_pt_cred_comm Communication - -Communication between NetIDMgr and a credential provider occurs -through a message processor. When registering a credential provider, -the module initialization code in init_module() specifies -::KHM_PITYPE_CRED as the \a type member and sets \a msg_proc member to -a valid message processor in the ::khm_plugin record. - -\subsection pi_pt_cred_init Initialization - -Once init_module() has completed, the module manager sends a -<::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> message to the message processor. - -For credential provider plugins, <::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> is -guaranteed to be the first message it receives. - -The callback function should return KHM_ERROR_SUCCESS if it -initializes properly or some other value otherwise. If the return -value signals an error, then the plugin is assume to not be loaded and -immediately unregistered. - -The message processor is automatically subscribed to the following -message types: -- ::KMSG_SYSTEM -- ::KMSG_KCDB - -Although a plugin can use the <::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> -message enumerate existing credentials in the system, it should not -obtain new credentials. This is because other plugins that may depend -on the new credential messages may not be loaded at this time. See the -section on \ref cred_msgs for more information. - - -\subsection pi_pt_cred_exit Uninitialization - -When the plugin is to be removed, the module manager sends a -<::KMSG_SYSTEM,::KMSG_SYSTEM_EXIT> to the message processor. The -plugin must perform any necessary shutdown operations, free up -resources and unsubscribe from any messages that it has subscribed to. - -This message is guaranteed to be the last message received by a -credentials manager plugin if the plugin unsubsribes from all -additional message classes that it subsribed to. - -The message types that the message processor is automatically -subscribed to (See \ref pi_pt_cred_init) do not have to be -unsubscribed from as they are automatically removed. - -\subsection pi_pt_cred_other Other Notes - -Since credential managers may receive privileged information, the -signature requirements for credential managers are specially strict. - -\section pi_pt_conf Configuration Provider - -Provides configuration information. -[TODO: fill in] - -\subsection pi_pt_conf_comm Communication -[TODO: fill in] - -\subsection pi_pt_conf_init Initialization -[TODO: fill in] - -\subsection pi_pt_conf_exit Uninitialization -[TODO: fill in] - -\subsection pi_pt_conf_other Other Notes - -*/ - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! + +\page plugins NetIDMgr Modules and Plugins + +Plugins and localization are handled by the NetIDMgr Module Manager +API. Each plugin consists of a dynamically loadable library and zero +or more associated resource libraries. + +For more information about NetIDMgr Plugins, see the following +sections: + +- \subpage pi_framework +- \subpage pi_pt +- \subpage pi_structure +- \subpage pi_localization +*/ + +/*! \page pi_pt Plugin Types + +The types of plugins that are currently supported by NetIDMgr are : + +\section pi_pt_cred Credential Provider + +A credential provider plugin essentially acts as an interface between +NetIDMgr and some entity which defines the credentials for the purpose +of managing those credentials. + +There can be more than one credential provider in a module. + +\subsection pi_pt_cred_comm Communication + +Communication between NetIDMgr and a credential provider occurs +through a message processor. When registering a credential provider, +the module initialization code in init_module() specifies +::KHM_PITYPE_CRED as the \a type member and sets \a msg_proc member to +a valid message processor in the ::khm_plugin record. + +\subsection pi_pt_cred_init Initialization + +Once init_module() has completed, the module manager sends a +<::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> message to the message processor. + +For credential provider plugins, <::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> is +guaranteed to be the first message it receives. + +The callback function should return KHM_ERROR_SUCCESS if it +initializes properly or some other value otherwise. If the return +value signals an error, then the plugin is assume to not be loaded and +immediately unregistered. + +The message processor is automatically subscribed to the following +message types: +- ::KMSG_SYSTEM +- ::KMSG_KCDB + +Although a plugin can use the <::KMSG_SYSTEM,::KMSG_SYSTEM_INIT> +message enumerate existing credentials in the system, it should not +obtain new credentials. This is because other plugins that may depend +on the new credential messages may not be loaded at this time. See the +section on \ref cred_msgs for more information. + + +\subsection pi_pt_cred_exit Uninitialization + +When the plugin is to be removed, the module manager sends a +<::KMSG_SYSTEM,::KMSG_SYSTEM_EXIT> to the message processor. The +plugin must perform any necessary shutdown operations, free up +resources and unsubscribe from any messages that it has subscribed to. + +This message is guaranteed to be the last message received by a +credentials manager plugin if the plugin unsubsribes from all +additional message classes that it subsribed to. + +The message types that the message processor is automatically +subscribed to (See \ref pi_pt_cred_init) do not have to be +unsubscribed from as they are automatically removed. + +\subsection pi_pt_cred_other Other Notes + +Since credential managers may receive privileged information, the +signature requirements for credential managers are specially strict. + +\section pi_pt_conf Configuration Provider + +Provides configuration information. +[TODO: fill in] + +\subsection pi_pt_conf_comm Communication +[TODO: fill in] + +\subsection pi_pt_conf_init Initialization +[TODO: fill in] + +\subsection pi_pt_conf_exit Uninitialization +[TODO: fill in] + +\subsection pi_pt_conf_other Other Notes + +*/ + --- krb5-1.4.4.orig/src/windows/identity/doc/ui_menus.h +++ krb5-1.4.4/src/windows/identity/doc/ui_menus.h @@ -1,29 +1,29 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page khui_menus Menus - - */ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page khui_menus Menus + + */ --- krb5-1.4.4.orig/src/windows/identity/doc/plugin_structure.h +++ krb5-1.4.4/src/windows/identity/doc/plugin_structure.h @@ -1,50 +1,50 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! - -\page pi_structure Structure of a module - -A NetIDMgr module is essentially a dynamically loadable library with a -specific set of exported symbols. Each export symbol and general -notes about writing a plugin module are documented below. - -\section pi_str_init Initialization - -Do not use DllMain or other system specific callback routines to -perform intilization tasks other than creating mutexes, initializing -thread local storage and other tasks that must be performed at that -stage. Specifically, do not call any NetIDMgr API functions from -within DllMain. - -\section pi_str_cb Callbacks - -The callbacks that must be implemented by a module are: - -- init_module() -- exit_module() - - */ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! + +\page pi_structure Structure of a module + +A NetIDMgr module is essentially a dynamically loadable library with a +specific set of exported symbols. Each export symbol and general +notes about writing a plugin module are documented below. + +\section pi_str_init Initialization + +Do not use DllMain or other system specific callback routines to +perform intilization tasks other than creating mutexes, initializing +thread local storage and other tasks that must be performed at that +stage. Specifically, do not call any NetIDMgr API functions from +within DllMain. + +\section pi_str_cb Callbacks + +The callbacks that must be implemented by a module are: + +- init_module() +- exit_module() + + */ --- krb5-1.4.4.orig/src/windows/identity/doc/cred_data_types.h +++ krb5-1.4.4/src/windows/identity/doc/cred_data_types.h @@ -1,246 +1,246 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/*! \page cred_data_types Data types in NetIDMgr - - NetIDMgr's Credentials Database supports several useful data types. In - addition, plug-ins can define custom data types. Only a few operations - are expected of these data types since the core KCDB delegates fine grained - operations to other entities that understand the underlying format. - - A field in a credential can have any one of these data types, but it must - have some data type. Each value can be at most \a KCDB_TYPE_MAXCB bytes - in length regardless of the data type. - - Some data types have a fixed size (such as \a Int32), while others are - variable size. The required memory for each field in a credential is - allocated as needed. - - \section kcdb_pg_dt Data types - - Descriptions of individual data types are below. - - \subsection kcdb_pg_idt Individual data types - - \subsubsection kcdb_pg_idt_v Void - - Pretty useless. This data type is used to indicate that the associated - object doesn't actually contain any data. - - \subsubsection kcdb_pg_idt_s String - - A unicode string that is terminated with a unicode NULL (L'\\0'). By - default, the type has the following flags : - - \a KCDB_TYPE_FLAG_CB_AUTO - - This is because, as long as the string is terminated with a unicode NULL, - the length of the string, and therefore it's size in bytes, can be inferred - from the data itself. - - \subsubsection kcdb_pg_idt_d Date - - Dates and times in NetIDMgr are stored as \a FILETIME structures. Utility - functions are provided for converting from other formats such as \a time_t. - - \subsubsection kcdb_pg_idt_i Interval - - Stores an interval of time. Stored as a 64 bit signed integer. The - string representation of this data type is different from the \a - Date data type and designate an interval of time. - - The special value _I64_MAX (which is defined in limits.h as - 0x7fffffffffffffff, or in otherwords, the largest positive value - that can be stored in a 64 bit signed integer) is used to - represent an interval of unknown length. - - The string representations of a data value of Interval type are - defined as follows for English (US): - - - "(Unknown)" if the value is _I64_MAX - - - "(Expired)" if the value is less than zero - - - "%d days %d hours" if the value is greater than 24 hours - - - "%d hours %d mins" if the value is greater than 1 hour - - - "%d mins %d secs" if the value is greater than 1 minute - - - "%d seconds" otherwise - - \subsubsection kcdb_pg_idt_i32 Int32 - - A signed 32 bit integer. - - \subsubsection kcdb_pg_idt_i64 Int64 - - A signed 64 bit integer. - - \subsubsection kcdb_pg_idt_da Data - - Raw data. Can contain a byte stream. This data type can be used by - plug-ins to associate raw data with a credential. However, there is no - built in string representation for this data type. As such, this is not - meant to be used for storing anything that has to be displayed to the user - verbatim. - - \section kcdb_pg_cust Custom data types - - \subsection kcdb_pg_cb Custom data type call backs - - Custom data types in the NetIDMgr Credentials Database are defined using - \a kcdb_type structures which must include several callback functions. - The expected behavior of these callback functions is documented below. - - \subsubsection kcdb_pg_cb_ts toString - - \code - khm_int32 toString( - const void * data, - khm_int32 cb_data, - wchar_t *buffer, - khm_int32 *pcb_buffer, - khm_int32 flags); - \endcode - - Produce the localized string representation of the object pointed to by - \a data. The size of the data block is specified by the \a cb_data - parameter. If the data type specified the \a KCDB_TYPE_FLAG_CB_AUTO flag - then \a cb_data can be \a KCDB_CBSIZE_AUTO, in which case the size of the - data block is to be inferred. - - \a toString should assume that the block of data pointed to by \a data is - valid for this data type. - - The \a pcb_buffer parameter is always a valid pointer to an \a khm_int32 - variable. - - The \a buffer parameter is a pointer to a \a wchar_t buffer which is to - receive the unicode string representing the object. \a buffer may be - \a NULL, in which case the required size of the buffer should be returned - in \a pcb_buffer. In this case, the function should return - \a KHM_ERROR_TOO_LONG. - - If the \a buffer parameter is not \a NULL and the \a pcb_buffer specifies - that the buffer is large enough to hold the string representation, the - function should copy the string representation to the buffer, set the - \a pcb_buffer to the number of bytes that were copied including the - terminating \a NULL, and return \a KHM_ERROR_SUCCESS. - - If the \a buffer parameter is not \a NULL and the \a pcb_buffer specifies - a buffer that is not large enough, the function should set \a pcb_buffer - to the required size (including the terminating \a NULL) and then return - \a KHM_ERROR_TOO_LONG. - - \subsubsection kcdb_pg_cb_cmp comp - - \code - khm_int32 comp( - const void * data1, - khm_int32 cb_data1, - const void * data2, - khm_int32 cb_d2); - \endcode - - Compares two objects and returns a value indicating the relative ordering. - - Since the KCDB does not interpret any data type, it relies on a loose - definition of what a relative ordering is. It is left up to each data - type callback to interpret what 'ascending' and 'descending' mean. - - The return value \a r should be as follows : - - \a r < 0 : if \a data1 < \a data2 - - \a r > 0 : if \a data1 > \a data2 - - \a r = 0 : if \a data1 = \a data2 or no relative ordering can be determined - for the two objects \a data1 and \a data2. - - The function should assume that both objects are valid for this data type. - - The size specifiers \a cb_data1 and \a cb_data2 can (either or both) be - \a KCDB_CBSIZE_AUTO if the data type specified \a KCDB_TYPE_FLAG_CB_AUTO - flag. - - \subsubsection kcdb_pg_cb_dup dup - - \code - khm_int32 dup( - const void * d_src, - khm_int32 cb_src, - void * d_dst, - khm_int32 * pcb_dst); - \endcode - - Duplicate an object. The object pointed to by \a d_src is to be copied to - the buffer pointed to by \a d_dst. The function is to assume that \a d_src - object is valid. The size specifier \a cb_src may be \a KCDB_CBSIZE_AUTO - if \a KCDB_TYPE_FLAG_CB_AUTO was specified for the data type. - - If \a d_dst pointer is \a NULL, then the required buffer size should be - returned in \a pcb_dst. In this case, the function itself should return - \a KHM_ERROR_TOO_LONG. The same behavior should occur if \a d_dst is non - \a NULL and \a pcb_dst indicates that the buffer is not sufficient. - - If \a d_dst is not \a NULL and \a pcb_dst indicates that the buffer is - sufficient, then a copy of the object in \a d_src should be placed in - \a d_dst. The function shold return \a KHM_ERROR_SUCCESS and set - \a pcb_dst to the number of bytes that were copied. - - This callback will only be called when the credentials database is - retrieving objects from the outside. Once it receives an object it may be - copied or moved as required. Hence the object should not assume to reside - in a specific location of memory. Also, \a dup is not intended to perform - such functions as reference counting which require knowledge of a precise - number of instances of an object, as the credentials database may copy - the object simply by copying the block of memory. - - Note that whenever \a pcb_dst is to be set, it MUST be set to a valid byte - count. It can not be assigned \a KCDB_CBSIZE_AUTO even if the data type - supports it. The \a pcb_dst parameter is used internally to allocate - memory for the object. - - \subsubsection kcdb_pg_cb_iv isValid - - \code - khm_boolean isValid( - const void * data, - khm_int32 cb_data); - \endcode - - Checks if the object pointed to by the \a data pointer is a valid object - for this data type. If the data type specified the \a KCDB_TYPE_CB_AUTO - flag, then the \a cb_data parameter may be \a KCDB_CBSIZE_AUTO, in which - the size of the object should be inferred from the data. - - The function should be able to determine the validity of the object and - return \a TRUE if it is valid. Return \a FALSE if it isn't, or if the - size of the object can not be inferred from the given data, or if the - inferred size exceeds \a KCDB_TYPE_MAXCB. - -*/ +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/*! \page cred_data_types Data types in NetIDMgr + + NetIDMgr's Credentials Database supports several useful data types. In + addition, plug-ins can define custom data types. Only a few operations + are expected of these data types since the core KCDB delegates fine grained + operations to other entities that understand the underlying format. + + A field in a credential can have any one of these data types, but it must + have some data type. Each value can be at most \a KCDB_TYPE_MAXCB bytes + in length regardless of the data type. + + Some data types have a fixed size (such as \a Int32), while others are + variable size. The required memory for each field in a credential is + allocated as needed. + + \section kcdb_pg_dt Data types + + Descriptions of individual data types are below. + + \subsection kcdb_pg_idt Individual data types + + \subsubsection kcdb_pg_idt_v Void + + Pretty useless. This data type is used to indicate that the associated + object doesn't actually contain any data. + + \subsubsection kcdb_pg_idt_s String + + A unicode string that is terminated with a unicode NULL (L'\\0'). By + default, the type has the following flags : + + \a KCDB_TYPE_FLAG_CB_AUTO + + This is because, as long as the string is terminated with a unicode NULL, + the length of the string, and therefore it's size in bytes, can be inferred + from the data itself. + + \subsubsection kcdb_pg_idt_d Date + + Dates and times in NetIDMgr are stored as \a FILETIME structures. Utility + functions are provided for converting from other formats such as \a time_t. + + \subsubsection kcdb_pg_idt_i Interval + + Stores an interval of time. Stored as a 64 bit signed integer. The + string representation of this data type is different from the \a + Date data type and designate an interval of time. + + The special value _I64_MAX (which is defined in limits.h as + 0x7fffffffffffffff, or in otherwords, the largest positive value + that can be stored in a 64 bit signed integer) is used to + represent an interval of unknown length. + + The string representations of a data value of Interval type are + defined as follows for English (US): + + - "(Unknown)" if the value is _I64_MAX + + - "(Expired)" if the value is less than zero + + - "%d days %d hours" if the value is greater than 24 hours + + - "%d hours %d mins" if the value is greater than 1 hour + + - "%d mins %d secs" if the value is greater than 1 minute + + - "%d seconds" otherwise + + \subsubsection kcdb_pg_idt_i32 Int32 + + A signed 32 bit integer. + + \subsubsection kcdb_pg_idt_i64 Int64 + + A signed 64 bit integer. + + \subsubsection kcdb_pg_idt_da Data + + Raw data. Can contain a byte stream. This data type can be used by + plug-ins to associate raw data with a credential. However, there is no + built in string representation for this data type. As such, this is not + meant to be used for storing anything that has to be displayed to the user + verbatim. + + \section kcdb_pg_cust Custom data types + + \subsection kcdb_pg_cb Custom data type call backs + + Custom data types in the NetIDMgr Credentials Database are defined using + \a kcdb_type structures which must include several callback functions. + The expected behavior of these callback functions is documented below. + + \subsubsection kcdb_pg_cb_ts toString + + \code + khm_int32 toString( + const void * data, + khm_int32 cb_data, + wchar_t *buffer, + khm_int32 *pcb_buffer, + khm_int32 flags); + \endcode + + Produce the localized string representation of the object pointed to by + \a data. The size of the data block is specified by the \a cb_data + parameter. If the data type specified the \a KCDB_TYPE_FLAG_CB_AUTO flag + then \a cb_data can be \a KCDB_CBSIZE_AUTO, in which case the size of the + data block is to be inferred. + + \a toString should assume that the block of data pointed to by \a data is + valid for this data type. + + The \a pcb_buffer parameter is always a valid pointer to an \a khm_int32 + variable. + + The \a buffer parameter is a pointer to a \a wchar_t buffer which is to + receive the unicode string representing the object. \a buffer may be + \a NULL, in which case the required size of the buffer should be returned + in \a pcb_buffer. In this case, the function should return + \a KHM_ERROR_TOO_LONG. + + If the \a buffer parameter is not \a NULL and the \a pcb_buffer specifies + that the buffer is large enough to hold the string representation, the + function should copy the string representation to the buffer, set the + \a pcb_buffer to the number of bytes that were copied including the + terminating \a NULL, and return \a KHM_ERROR_SUCCESS. + + If the \a buffer parameter is not \a NULL and the \a pcb_buffer specifies + a buffer that is not large enough, the function should set \a pcb_buffer + to the required size (including the terminating \a NULL) and then return + \a KHM_ERROR_TOO_LONG. + + \subsubsection kcdb_pg_cb_cmp comp + + \code + khm_int32 comp( + const void * data1, + khm_int32 cb_data1, + const void * data2, + khm_int32 cb_d2); + \endcode + + Compares two objects and returns a value indicating the relative ordering. + + Since the KCDB does not interpret any data type, it relies on a loose + definition of what a relative ordering is. It is left up to each data + type callback to interpret what 'ascending' and 'descending' mean. + + The return value \a r should be as follows : + + \a r < 0 : if \a data1 < \a data2 + + \a r > 0 : if \a data1 > \a data2 + + \a r = 0 : if \a data1 = \a data2 or no relative ordering can be determined + for the two objects \a data1 and \a data2. + + The function should assume that both objects are valid for this data type. + + The size specifiers \a cb_data1 and \a cb_data2 can (either or both) be + \a KCDB_CBSIZE_AUTO if the data type specified \a KCDB_TYPE_FLAG_CB_AUTO + flag. + + \subsubsection kcdb_pg_cb_dup dup + + \code + khm_int32 dup( + const void * d_src, + khm_int32 cb_src, + void * d_dst, + khm_int32 * pcb_dst); + \endcode + + Duplicate an object. The object pointed to by \a d_src is to be copied to + the buffer pointed to by \a d_dst. The function is to assume that \a d_src + object is valid. The size specifier \a cb_src may be \a KCDB_CBSIZE_AUTO + if \a KCDB_TYPE_FLAG_CB_AUTO was specified for the data type. + + If \a d_dst pointer is \a NULL, then the required buffer size should be + returned in \a pcb_dst. In this case, the function itself should return + \a KHM_ERROR_TOO_LONG. The same behavior should occur if \a d_dst is non + \a NULL and \a pcb_dst indicates that the buffer is not sufficient. + + If \a d_dst is not \a NULL and \a pcb_dst indicates that the buffer is + sufficient, then a copy of the object in \a d_src should be placed in + \a d_dst. The function shold return \a KHM_ERROR_SUCCESS and set + \a pcb_dst to the number of bytes that were copied. + + This callback will only be called when the credentials database is + retrieving objects from the outside. Once it receives an object it may be + copied or moved as required. Hence the object should not assume to reside + in a specific location of memory. Also, \a dup is not intended to perform + such functions as reference counting which require knowledge of a precise + number of instances of an object, as the credentials database may copy + the object simply by copying the block of memory. + + Note that whenever \a pcb_dst is to be set, it MUST be set to a valid byte + count. It can not be assigned \a KCDB_CBSIZE_AUTO even if the data type + supports it. The \a pcb_dst parameter is used internally to allocate + memory for the object. + + \subsubsection kcdb_pg_cb_iv isValid + + \code + khm_boolean isValid( + const void * data, + khm_int32 cb_data); + \endcode + + Checks if the object pointed to by the \a data pointer is a valid object + for this data type. If the data type specified the \a KCDB_TYPE_CB_AUTO + flag, then the \a cb_data parameter may be \a KCDB_CBSIZE_AUTO, in which + the size of the object should be inferred from the data. + + The function should be able to determine the validity of the object and + return \a TRUE if it is valid. Return \a FALSE if it isn't, or if the + size of the object can not be inferred from the given data, or if the + inferred size exceeds \a KCDB_TYPE_MAXCB. + +*/ --- krb5-1.4.4.orig/src/windows/identity/kconfig/kconfigmain.c +++ krb5-1.4.4/src/windows/identity/kconfig/kconfigmain.c @@ -1,37 +1,37 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -void -kconfig_process_attach(void) { - init_kconf(); -} - -void -kconfig_process_detach(void) { - exit_kconf(); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +void +kconfig_process_attach(void) { + init_kconf(); +} + +void +kconfig_process_detach(void) { + exit_kconf(); +} --- krb5-1.4.4.orig/src/windows/identity/kconfig/test/utiltest.c +++ krb5-1.4.4/src/windows/identity/kconfig/test/utiltest.c @@ -1,207 +1,207 @@ -#include -#include -#include - -struct string_pair { - wchar_t * ms; - wchar_t * csv; -}; - -struct string_pair strings[] = { - {L"foo\0bar\0baz,quux\0ab\"cd\0", L"foo,bar,\"baz,quux\",\"ab\"\"cd\""}, - {L"a\0b\0c\0d\0e\0", L"a,b,c,d,e"}, - {L"1\0", L"1"}, - {L"\0", L""}, - {L"b\0a\0", L"b,a"}, - {L"c\0a\0b\0", L"c,a,b"}, - {L"c\0a\0B\0", L"c,a,B"}, - {L"sdf\0Bar\0Foo\0BBB\0", L"sdf,Bar,Foo,BBB"} -}; - -int n_strings = ARRAYLENGTH(strings); - -void print_ms(wchar_t * ms) { - wchar_t * s; - size_t cch; - - s = ms; - while(*s) { - printf("%S\\0", s); - StringCchLength(s, 512, &cch); - s += cch + 1; - } -} - -int ms_to_csv_test(void) { - wchar_t wbuf[512]; - int i; - khm_int32 code = 0; - size_t cbbuf; - size_t cbr; - size_t cbnull; - - printf("khc_multi_string_to_csv() test:\n"); - - for(i=0; i"); - code = khc_multi_string_to_csv(NULL, &cbnull, strings[i].ms); - code = khc_multi_string_to_csv(wbuf, &cbbuf, strings[i].ms); - if(code) { - printf(" returned %d\n", code); - return code; - } - printf("CSV[%S]", wbuf); - if(wcscmp(wbuf, strings[i].csv)) { - printf(" MISMATCH!"); - return 1; - } - - StringCbLength(wbuf, sizeof(wbuf), &cbr); - cbr+= sizeof(wchar_t); - - if(cbr != cbbuf) { - printf(" Length mismatch"); - return 1; - } - - if(cbnull != cbr) { - printf(" NULL length mismatch"); - return 1; - } - - printf("\n"); - } - - return code; -} - -int csv_to_ms_test(void) { - wchar_t wbuf[512]; - int i; - khm_int32 code = 0; - size_t cbbuf; - size_t cbr; - size_t cbnull; - - printf("khc_csv_to_multi_string() test:\n"); - - for(i=0; i", strings[i].csv); - code = khc_csv_to_multi_string(NULL, &cbnull, strings[i].csv); - code = khc_csv_to_multi_string(wbuf, &cbbuf, strings[i].csv); - if(code) { - printf(" returned %d\n", code); - return code; - } - printf("MS["); - print_ms(wbuf); - printf("]"); - - if(cbnull != cbbuf) { - printf(" NULL length mismatch"); - return 1; - } - - printf("\n"); - - printf(" Byte length:%d\n", cbbuf); - } - - return code; -} - -int ms_append_test(void) -{ - wchar_t wbuf[512]; - size_t cbbuf; - khm_int32 code; - int i; - - printf("khc_multi_string_append() test:\n"); - - for(i=0; i +#include +#include + +struct string_pair { + wchar_t * ms; + wchar_t * csv; +}; + +struct string_pair strings[] = { + {L"foo\0bar\0baz,quux\0ab\"cd\0", L"foo,bar,\"baz,quux\",\"ab\"\"cd\""}, + {L"a\0b\0c\0d\0e\0", L"a,b,c,d,e"}, + {L"1\0", L"1"}, + {L"\0", L""}, + {L"b\0a\0", L"b,a"}, + {L"c\0a\0b\0", L"c,a,b"}, + {L"c\0a\0B\0", L"c,a,B"}, + {L"sdf\0Bar\0Foo\0BBB\0", L"sdf,Bar,Foo,BBB"} +}; + +int n_strings = ARRAYLENGTH(strings); + +void print_ms(wchar_t * ms) { + wchar_t * s; + size_t cch; + + s = ms; + while(*s) { + printf("%S\\0", s); + StringCchLength(s, 512, &cch); + s += cch + 1; + } +} + +int ms_to_csv_test(void) { + wchar_t wbuf[512]; + int i; + khm_int32 code = 0; + size_t cbbuf; + size_t cbr; + size_t cbnull; + + printf("khc_multi_string_to_csv() test:\n"); + + for(i=0; i"); + code = khc_multi_string_to_csv(NULL, &cbnull, strings[i].ms); + code = khc_multi_string_to_csv(wbuf, &cbbuf, strings[i].ms); + if(code) { + printf(" returned %d\n", code); + return code; + } + printf("CSV[%S]", wbuf); + if(wcscmp(wbuf, strings[i].csv)) { + printf(" MISMATCH!"); + return 1; + } + + StringCbLength(wbuf, sizeof(wbuf), &cbr); + cbr+= sizeof(wchar_t); + + if(cbr != cbbuf) { + printf(" Length mismatch"); + return 1; + } + + if(cbnull != cbr) { + printf(" NULL length mismatch"); + return 1; + } + + printf("\n"); + } + + return code; +} + +int csv_to_ms_test(void) { + wchar_t wbuf[512]; + int i; + khm_int32 code = 0; + size_t cbbuf; + size_t cbr; + size_t cbnull; + + printf("khc_csv_to_multi_string() test:\n"); + + for(i=0; i", strings[i].csv); + code = khc_csv_to_multi_string(NULL, &cbnull, strings[i].csv); + code = khc_csv_to_multi_string(wbuf, &cbbuf, strings[i].csv); + if(code) { + printf(" returned %d\n", code); + return code; + } + printf("MS["); + print_ms(wbuf); + printf("]"); + + if(cbnull != cbbuf) { + printf(" NULL length mismatch"); + return 1; + } + + printf("\n"); + + printf(" Byte length:%d\n", cbbuf); + } + + return code; +} + +int ms_append_test(void) +{ + wchar_t wbuf[512]; + size_t cbbuf; + khm_int32 code; + int i; + + printf("khc_multi_string_append() test:\n"); + + for(i=0; i - -INCFILES= \ - $(INCDIR)\kconfig.h - -OBJFILES= \ - $(OBJ)\kconfigmain.obj \ - $(OBJ)\api.obj - -all: mkdirs $(INCFILES) $(OBJFILES) - -clean:: - $(RM) $(INCFILES) - -# Tests - -test:: util_test - -util_test: $(OBJ)\utiltest.exe - $(OBJ)\utiltest.exe - -$(OBJ)\utiltest.exe: $(OBJ)\utiltest.obj - $(EXECONLINK) $(OBJFILES) - -$(OBJ)\utiltest.obj: test\utiltest.c - $(C2OBJ) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=kconfig +!include <../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\kconfig.h + +OBJFILES= \ + $(OBJ)\kconfigmain.obj \ + $(OBJ)\api.obj + +all: mkdirs $(INCFILES) $(OBJFILES) + +clean:: + $(RM) $(INCFILES) + +# Tests + +test:: util_test + +util_test: $(OBJ)\utiltest.exe + $(OBJ)\utiltest.exe + +$(OBJ)\utiltest.exe: $(OBJ)\utiltest.obj + $(EXECONLINK) $(OBJFILES) + +$(OBJ)\utiltest.obj: test\utiltest.c + $(C2OBJ) --- krb5-1.4.4.orig/src/windows/identity/kconfig/kconfiginternal.h +++ krb5-1.4.4/src/windows/identity/kconfig/kconfiginternal.h @@ -1,129 +1,129 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCONFIGINTERNAL_H -#define __KHIMAIRA_KCONFIGINTERNAL_H - -#include -#include -#include -#include -#include -#include - -/* TODO: Implement configuration provider interfaces - -typedef struct kconf_provider_t { - -} kconf_provider; -*/ - -typedef struct kconf_conf_space_t { - wchar_t * name; - - /* kconf_provider * provider; */ - - /* the regpath is the cumulative path starting from a hive root */ - wchar_t * regpath; - HKEY regkey_user; - khm_int32 regkey_user_flags; - HKEY regkey_machine; - khm_int32 regkey_machine_flags; - - khm_int32 refcount; - khm_int32 flags; - - const kconf_schema * schema; - khm_int32 nSchema; - - TDCL(struct kconf_conf_space_t); -} kconf_conf_space; - -#define KCONF_SPACE_FLAG_DELETE_U 0x00000040 -#define KCONF_SPACE_FLAG_DELETE_M 0x00000080 -#define KCONF_SPACE_FLAG_DELETED 0x00000100 - -typedef struct kconf_conf_handle_t { - khm_int32 magic; - khm_int32 flags; - kconf_conf_space * space; - - struct kconf_conf_handle_t * lower; - - LDCL(struct kconf_conf_handle_t); -} kconf_handle; - -#define KCONF_HANDLE_MAGIC 0x38eb49d2 -#define khc_is_handle(h) ((h) && ((kconf_handle *)h)->magic == KCONF_HANDLE_MAGIC) -#define khc_shadow(h) (((kconf_handle *)h)->lower) -#define khc_is_shadowed(h) (khc_is_handle(h) && khc_shadow(h) != NULL) - -extern kconf_conf_space * conf_root; -extern kconf_handle * conf_handles; -extern kconf_handle * conf_free_handles; -extern CRITICAL_SECTION cs_conf_global; -extern LONG conf_init; -extern LONG conf_status; - -#define khc_is_config_running() (conf_init && conf_status) - -#define CONFIG_REGPATHW L"Software\\MIT\\NetIDMgr" - -void init_kconf(void); -void exit_kconf(void); - -/* handle operations */ -#define khc_space_from_handle(h) (((kconf_handle *) h)->space) -#define khc_is_schema_handle(h) (((kconf_handle *) h)->flags & KCONF_FLAG_SCHEMA) -#define khc_is_user_handle(h) (((kconf_handle *) h)->flags & KCONF_FLAG_USER) -#define khc_is_machine_handle(h) (((kconf_handle *) h)->flags & KCONF_FLAG_MACHINE) -#define khc_handle_flags(h) (((kconf_handle *) h)->flags) - -kconf_handle * -khcint_handle_from_space(kconf_conf_space * s, khm_int32 flags); - -void -khcint_handle_free(kconf_handle * h); - -kconf_conf_space * -khcint_create_empty_space(void); - -void -khcint_free_space(kconf_conf_space * r); - -void -khcint_space_hold(kconf_conf_space * s); - -void -khcint_space_release(kconf_conf_space * s); - -HKEY -khcint_space_open_key(kconf_conf_space * s, khm_int32 flags); - -khm_int32 -khcint_remove_space(kconf_conf_space * c, khm_int32 flags); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCONFIGINTERNAL_H +#define __KHIMAIRA_KCONFIGINTERNAL_H + +#include +#include +#include +#include +#include +#include + +/* TODO: Implement configuration provider interfaces + +typedef struct kconf_provider_t { + +} kconf_provider; +*/ + +typedef struct kconf_conf_space_t { + wchar_t * name; + + /* kconf_provider * provider; */ + + /* the regpath is the cumulative path starting from a hive root */ + wchar_t * regpath; + HKEY regkey_user; + khm_int32 regkey_user_flags; + HKEY regkey_machine; + khm_int32 regkey_machine_flags; + + khm_int32 refcount; + khm_int32 flags; + + const kconf_schema * schema; + khm_int32 nSchema; + + TDCL(struct kconf_conf_space_t); +} kconf_conf_space; + +#define KCONF_SPACE_FLAG_DELETE_U 0x00000040 +#define KCONF_SPACE_FLAG_DELETE_M 0x00000080 +#define KCONF_SPACE_FLAG_DELETED 0x00000100 + +typedef struct kconf_conf_handle_t { + khm_int32 magic; + khm_int32 flags; + kconf_conf_space * space; + + struct kconf_conf_handle_t * lower; + + LDCL(struct kconf_conf_handle_t); +} kconf_handle; + +#define KCONF_HANDLE_MAGIC 0x38eb49d2 +#define khc_is_handle(h) ((h) && ((kconf_handle *)h)->magic == KCONF_HANDLE_MAGIC) +#define khc_shadow(h) (((kconf_handle *)h)->lower) +#define khc_is_shadowed(h) (khc_is_handle(h) && khc_shadow(h) != NULL) + +extern kconf_conf_space * conf_root; +extern kconf_handle * conf_handles; +extern kconf_handle * conf_free_handles; +extern CRITICAL_SECTION cs_conf_global; +extern LONG conf_init; +extern LONG conf_status; + +#define khc_is_config_running() (conf_init && conf_status) + +#define CONFIG_REGPATHW L"Software\\MIT\\NetIDMgr" + +void init_kconf(void); +void exit_kconf(void); + +/* handle operations */ +#define khc_space_from_handle(h) (((kconf_handle *) h)->space) +#define khc_is_schema_handle(h) (((kconf_handle *) h)->flags & KCONF_FLAG_SCHEMA) +#define khc_is_user_handle(h) (((kconf_handle *) h)->flags & KCONF_FLAG_USER) +#define khc_is_machine_handle(h) (((kconf_handle *) h)->flags & KCONF_FLAG_MACHINE) +#define khc_handle_flags(h) (((kconf_handle *) h)->flags) + +kconf_handle * +khcint_handle_from_space(kconf_conf_space * s, khm_int32 flags); + +void +khcint_handle_free(kconf_handle * h); + +kconf_conf_space * +khcint_create_empty_space(void); + +void +khcint_free_space(kconf_conf_space * r); + +void +khcint_space_hold(kconf_conf_space * s); + +void +khcint_space_release(kconf_conf_space * s); + +HKEY +khcint_space_open_key(kconf_conf_space * s, khm_int32 flags); + +khm_int32 +khcint_remove_space(kconf_conf_space * c, khm_int32 flags); + +#endif --- krb5-1.4.4.orig/src/windows/identity/kconfig/registry.c +++ krb5-1.4.4/src/windows/identity/kconfig/registry.c @@ -1,28 +1,28 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + --- krb5-1.4.4.orig/src/windows/identity/kconfig/kconfig.h +++ krb5-1.4.4/src/windows/identity/kconfig/kconfig.h @@ -1,954 +1,954 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KCONFIG_H -#define __KHIMAIRA_KCONFIG_H - -#include -#include - -/*! \defgroup kconf NetIDMgr Configuration Provider */ -/*@{*/ - -/*! \brief Configuration schema descriptor record - - The schema descriptor is a convenient way to provide a default set - of configuration options for a part of an application. It - describes the configuration spaces and the values and subspaces - contained in each space. - - \see kconf_load_schema() -*/ -typedef struct tag_kconf_schema { - wchar_t * name; /*!< name of the object being described. - Optional for KC_ENDSPACE type object, - but required for everything else. - Names can be upto KCONF_MAXCCH_NAME - characters in length. */ - khm_int32 type; /*!< type of the object. Can be one of - KC_SPACE, KC_ENDSPACE, KC_INT32, - KC_INT64, KC_STRING or KC_BINARY */ - khm_ui_8 value; /*!< the value of the object. It is not - used for KC_SPACE and KC_ENDSPACE - typed objects. For a KC_STRING, this - contains a pointer to the string - value. The string should not be - longer than KCONF_MAXCCH_STRING - characters. KC_INT32 and KC_INT64 - objects store the value directly in - this field, while KC_BINARY objects do - not support defining a default value - here. */ - wchar_t * description;/*!< a friendly description of the value - or configuration space. */ -} kconf_schema; - -/*! \name Configuration data types - @{*/ -/*! \brief Not a known type */ -#define KC_NONE 0 - -/*! \brief When used as ::kconf_schema \a type, defines the start of a configuration space. - - There should be a subsequent KC_ENDSPACE record in the schema - which defines the end of this configuration space. - - \a name specifies the name of the configuration space. Optionally - use \a description to provide a description.*/ -#define KC_SPACE 1 - -/*! \brief Ends a configuration space started with KC_SPACE */ -#define KC_ENDSPACE 2 - -/*! \brief A 32 bit integer - - Specifies a configuration parameter named \a name which is of this - type. Use \a description to provide an optional description of - the value. - - \a value specifies a default value for this parameter in the lower - 32 bits. -*/ -#define KC_INT32 3 - -/*! \brief A 64 bit integer - - Specifies a configuration parameter named \a name which is of this - type. Use \a description to provide an optional description of - the value. - - \a value specifies a default value for this parameter. -*/ -#define KC_INT64 4 - -/*! \brief A unicode string - - Specifies a configuration parameter named \a name which is of this - type. Use \a description to provide an optional description of - the value. - - \a value specifies a default value for this parameter which should - be a pointer to a NULL terminated unicode string of no more than - ::KCONF_MAXCCH_STRING characters. -*/ -#define KC_STRING 5 - -/*! \brief An unparsed binary stream - - Specifies a configuration parameter named \a name which is of this - type. Use \a description to provide an optional description of - the value. - - Default values are not supported for binary streams. \a value is - ignored. -*/ -#define KC_BINARY 6 -/*@}*/ - -/*! \brief This is the root configuration space */ -#define KCONF_FLAG_ROOT 0x00000001 - -/*! \brief Indicates the configuration store which stores user-specific information */ -#define KCONF_FLAG_USER 0x00000002 - -/*! \brief Indicates the configuration store which stores machine-specific information */ -#define KCONF_FLAG_MACHINE 0x00000004 - -/*! \brief Indicates the configuration store which stores the schema */ -#define KCONF_FLAG_SCHEMA 0x00000008 - -/*! \brief Indicates that the last component of the given configuration path is to be considered to be a configuration value */ -#define KCONF_FLAG_TRAILINGVALUE 0x00000020 - -/*! \brief Only write values back there is a change - - Any write operations using the handle with check if the value - being written is different from the value being read from the - handle. It will only be written if the value is different. - - \note Note that the value being read from a handle takes schema and - shadowed configuration handles into consideration while the value - being written is only written to the topmost layer of - configuration that can be written to. - - \note Note also that this flag does not affect binary values. - */ -#define KCONF_FLAG_WRITEIFMOD 0x00000040 - -/*! \brief Use case-insensitive comparison for KCONF_FLAG_WRITEIFMOD - - When used in combination with \a KCONF_FLAG_WRITEIFMOD , the - string comparison used when determining whether the string read - from the configuration handle is the same as the string being - written will be case insensitive. If this flag is not set, the - comparison will be case sensitive. - */ -#define KCONF_FLAG_IFMODCI 0x00000080 - -/*! \brief Do not parse the configuration space name - - If set, disables the parsing of the configuration space for - subspaces. The space name is taken verbatim to be a configuration - space name. This can be used when there can be forward slashes or - backslahes in the name which are not escaped. - - By default, the configuration space name, - - \code - L"foo\\bar" - \endcode - - is taken to mean the configuration space \a bar which is a - subspace of \a foo. If ::KCONF_FLAG_NOPARSENAME is set, then this - is taken to mean configuration space \a foo\\bar. - */ -#define KCONF_FLAG_NOPARSENAME 0x00000040 - -/*! \brief Maximum number of allowed characters (including terminating NULL) in a name - - \note This is a hard limit in Windows, since we are mapping - configuration spaces to registry keys. -*/ -#define KCONF_MAXCCH_NAME 256 - -/*! \brief Maximum number of allowed bytes (including terminating NULL) in a name */ -#define KCONF_MAXCB_NAME (KCONF_MAXCCH_NAME * sizeof(wchar_t)) - -/*! \brief Maximum level of nesting for configuration spaces - */ -#define KCONF_MAX_DEPTH 16 - -/*! \brief Maximum number of allowed characters (including terminating NULL) in a configuration path */ -#define KCONF_MAXCCH_PATH (KCONF_MAXCCH_NAME * KCONF_MAX_DEPTH) - -/*! \brief Maximum number of allowed bytes (including terminating NULL) in a configuration path */ -#define KCONF_MAXCB_PATH (KCONF_MAXCCH_PATH * sizeof(wchar_t)) - -/*! \brief Maximum number of allowed characters (including terminating NULL) in a string */ -#define KCONF_MAXCCH_STRING KHM_MAXCCH_STRING - -/*! \brief Maximum number of allowed bytes (including terminating NULL) in a string */ -#define KCONF_MAXCB_STRING (KCONF_MAXCCH_STRING * sizeof(wchar_t)) - -/*! \brief Open a configuration space - - Opens the configuration space specified by \a cspace. By default, - the opened space includes user,machine and schema configuration - stores. However, you can specify a subset of these. - - If the configuration space does not exist and the \a flags specify - KHM_FLAG_CREATE, then the configuration space is created. The - stores that are affected by the create operation depend on \a - flags. If the \a flags only specifies ::KCONF_FLAG_MACHINE, then - the configuration space is created in the machine store. If \a - flags specifies any combination of stores including \a - ::KCONF_FLAG_USER, then the configuration space is created in the - user store. Note that ::KCONF_FLAG_SCHEMA is readonly. - - Once opened, use khc_close_space() to close the configuration - space. - - \param[in] parent The parent configuration space. The path - specified in \a cspace is relative to the parent. Set this to - NULL to indicate the root configuration space. - - \param[in] cspace The confiuration path. This can be up to - ::KCONF_MAXCCH_PATH characters in length. Use either - backslashes or forward slashes to specify hiearchy. Set this - to NULL to reopen the parent configuration space. - - \param[in] flags Flags. This can be a combination of KCONF_FLAG_* - constants and KHM_FLAG_CREATE. If none of ::KCONF_FLAG_USER, - ::KCONF_FLAG_MACHINE or ::KCONF_FLAG_SCHEMA is specified, then - it defaults to all three. - - \param[out] result Pointer to a handle which receives the handle - to the opened configuration space if the call succeeds. - - \note You can re-open a configuration space with different flags - such as ::KCONF_FLAG_MACHINE by specifying NULL for \a cspace - and settings \a flags to the required flags. - -*/ -KHMEXP khm_int32 KHMAPI -khc_open_space(khm_handle parent, const wchar_t * cspace, khm_int32 flags, - khm_handle * result); - -/*! \brief Set the shadow space for a configuration handle - - The handle specified by \a lower becomes a shadow for the handle - specified by \a upper. Any configuration value that is queried in - \a upper that does not exist in \a upper will be queried in \a - lower. - - If \a upper already had a shadow handle, that handle will be - replaced by \a lower. The handle \a lower still needs to be - closed by a call to khc_close_space(). However, closing \a lower - will not affect \a upper which will still treat the configuration - space pointed to by \a lower to be it's shadow. - - Shadows are specific to handles and not configuration spaces. - Shadowing a configuration space using one handle does not affect - any other handles which may be obtained for the same configuration - space. - - Specify NULL for \a lower to remove any prior shadow. - */ -KHMEXP khm_int32 KHMAPI -khc_shadow_space(khm_handle upper, khm_handle lower); - -/*! \brief Close a handle opened with khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_close_space(khm_handle conf); - -/*! \brief Read a string value from a configuration space - - The \a value_name parameter specifies the value to read from the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to access the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema - store. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. - - If the value is not found in the configuration space and any - shadowed configuration spaces, the function returns \a - KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. - - \param[in] buf Buffer to copy the string to. Specify NULL to just - retrieve the number of required bytes. - - \param[in,out] bufsize On entry, specifies the number of bytes of - space available at the location specified by \a buf. On exit - specifies the number of bytes actually copied or the size of - the required buffer if \a buf is NULL or insufficient. - - \retval KHM_ERROR_NOT_READY The configuration provider has not started - \retval KHM_ERROR_INVALID_PARAM One or more of the supplied parameters are not valid - \retval KHM_ERROR_TYPE_MISMATCH The specified value is not a string - \retval KHM_ERROR_TOO_LONG \a buf was NULL or the size of the buffer was insufficient. The required size is in bufsize. - \retval KHM_ERROR_SUCCESS Success. The number of bytes copied is in bufsize. - \retval KHM_ERROR_NOT_FOUND The value was not found. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_read_string(khm_handle conf, - const wchar_t * value_name, - wchar_t * buf, - khm_size * bufsize); - -/*! \brief Read a multi-string value from a configuration space - - The \a value_name parameter specifies the value to read from the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to access the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema - store. - - A multi-string is a pseudo data type. The value in the - configuration store should contain a CSV string. Each comma - separated value in the CSV string is considered to be a separate - value. Empty values are not allowed. The buffer pointed to by \a - buf will receive these values in the form of a series of NULL - terminated strings terminated by an empty string (or equivalently, - the last string will be terminated by a double NULL). - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. - - If the value is not found in the configuration space and any - shadowed configuration spaces, the function returns \a - KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. - - \param[in] buf Buffer to copy the multi-string to. Specify NULL - to just retrieve the number of required bytes. - - \param[in,out] bufsize On entry, specifies the number of bytes of - space available at the location specified by \a buf. On exit - specifies the number of bytes actually copied or the size of - the required buffer if \a buf is NULL or insufficient. - - \retval KHM_ERROR_NOT_READY The configuration provider has not started - \retval KHM_ERROR_INVALID_PARAM One or more of the supplied parameters are not valid - \retval KHM_ERROR_TYPE_MISMATCH The specified value is not a string - \retval KHM_ERROR_TOO_LONG \a buf was NULL or the size of the buffer was insufficient. The required size is in bufsize. - \retval KHM_ERROR_SUCCESS Success. The number of bytes copied is in bufsize. - \retval KHM_ERROR_NOT_FOUND The value was not found. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_read_multi_string(khm_handle conf, - const wchar_t * value_name, - wchar_t * buf, - khm_size * bufsize); - -/*! \brief Read a 32 bit integer value from a configuration space - - The \a value_name parameter specifies the value to read from the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to access the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema - store. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. - - If the value is not found in the configuration space and any - shadowed configuration spaces, the function returns \a - KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. - - \param[in] conf Handle to a configuration space - \param[in] value The value to query - \param[out] buf The buffer to receive the value - - \retval KHM_ERROR_NOT_READY The configuration provider has not started. - \retval KHM_ERROR_SUCCESS Success. The value that was read was placed in \a buf - \retval KHM_ERROR_NOT_FOUND The specified value was not found - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_TYPE_MISMATCH The specified value was found but was not of the correct type. - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_read_int32(khm_handle conf, - const wchar_t * value_name, - khm_int32 * buf); - -/*! \brief Read a 64 bit integer value from a configuration space - - The \a value_name parameter specifies the value to read from the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to access the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema - store. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. - - If the value is not found in the configuration space and any - shadowed configuration spaces, the function returns \a - KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. - - \param[in] conf Handle to a configuration space - \param[in] value_name The value to query - \param[out] buf The buffer to receive the value - - \retval KHM_ERROR_NOT_READY The configuration provider has not started - \retval KHM_ERROR_SUCCESS Success. The value that was read was placed in \a buf - \retval KHM_ERROR_NOT_FOUND The specified value was not found - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid - \retval KHM_ERROR_TYPE_MISMATCH The specified value was found but was not the correct data type. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_read_int64(khm_handle conf, - const wchar_t * value_name, - khm_int64 * buf); - -/*! \brief Read a binary value from a configuration space - - The \a value_name parameter specifies the value to read from the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to access the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. Also note that the schema store (KCONF_FLAG_SCHEMA) does - not support binary values. - - If the value is not found in the configuration space and any - shadowed configuration spaces, the function returns \a - KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. - - \param[in] buf Buffer to copy the string to. Specify NULL to just - retrieve the number of required bytes. - - \param[in,out] bufsize On entry, specifies the number of bytes of - space available at the location specified by \a buf. On exit - specifies the number of bytes actually copied or the size of - the required buffer if \a buf is NULL or insufficient. - - \retval KHM_ERROR_SUCCESS Success. The data was copied to \a buf. The number of bytes copied is stored in \a bufsize - \retval KHM_ERROR_NOT_FOUND The specified value was not found - \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_read_binary(khm_handle conf, - const wchar_t * value_name, - void * buf, - khm_size * bufsize); - -/*! \brief Write a string value to a configuration space - - The \a value_name parameter specifies the value to write to the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to write the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If \a KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if \a KCONF_FLAG_MACHINE was specified, then the - machine configuration space. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. Also note that the schema store (KCONF_FLAG_SCHEMA) is - readonly. - - If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to - khc_open_space() for obtaining the configuration handle, the - specified string will only be written if it is different from the - value being read from the handle. - - If the \a KCONF_FLAG_IFMODCI flag is specified along with the \a - KCONF_FLAG_WRITEIFMOD flag, then the string comparison used will - be case insensitive. - - \param[in] conf Handle to a configuration space - \param[in] value_name Name of value to write - \param[in] buf A NULL terminated unicode string not exceeding KCONF_MAXCCH_STRING in characters including terminating NULL - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_write_string(khm_handle conf, - const wchar_t * value_name, - wchar_t * buf); - -/*! \brief Write a multi-string value to a configuration space - - The \a value_name parameter specifies the value to write to the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to write the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - A multi-string is a pseudo data type. The buffer pointed to by \a - buf should contain a sequence of NULL terminated strings - terminated by an empty string (or equivalently, the last string - should terminate with a double NULL). This will be stored in the - value as a CSV string. - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. Also note that the schema store (KCONF_FLAG_SCHEMA) is - readonly. - - If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to - khc_open_space() for obtaining the configuration handle, the - specified string will only be written if it is different from the - value being read from the handle. - - If the \a KCONF_FLAG_IFMODCI flag is specified along with the \a - KCONF_FLAG_WRITEIFMOD flag, then the string comparison used will - be case insensitive. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_write_multi_string(khm_handle conf, - const wchar_t * value_name, - wchar_t * buf); - -/*! \brief Write a 32 bit integer value to a configuration space - - The \a value_name parameter specifies the value to write to the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to write the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. Also note that the schema store (KCONF_FLAG_SCHEMA) is - readonly. - - If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to - khc_open_space() for obtaining the configuration handle, the - specified string will only be written if it is different from the - value being read from the handle. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_write_int32(khm_handle conf, - const wchar_t * value_name, - khm_int32 buf); - -/*! \brief Write a 64 bit integer value to a configuration space - - The \a value_name parameter specifies the value to write to the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to write the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. Also note that the schema store (KCONF_FLAG_SCHEMA) is - readonly. - - If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to - khc_open_space() for obtaining the configuration handle, the - specified string will only be written if it is different from the - value being read from the handle. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_write_int64(khm_handle conf, - const wchar_t * value_name, - khm_int64 buf); - -/*! \brief Write a binary value to a configuration space - - The \a value_name parameter specifies the value to write to the - configuration space. This can be either a value name or a value - path consisting of a series nested configuration space names - followed by the value name all separated by backslashes or forward - slashes. - - For example: If \a conf is a handle to the configuration space \c - 'A/B/C', then the value name \c 'D/E/v' refers to the value named - \c 'v' in the configuration space \c 'A/B/C/D/E'. - - The specific configuration store that is used to write the value - depends on the flags that were specified in the call to - khc_open_space(). The precedence of configuration stores are as - follows: - - - If KCONF_FLAG_USER was specified, then the user configuration - space. - - - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine - configuration space. - - Note that not specifying any of the configuration store specifiers - in the call to khc_open_space() is equivalent to specifying all - three. Also note that the schema store (KCONF_FLAG_SCHEMA) is - readonly. - - \see khc_open_space() -*/ -KHMEXP khm_int32 KHMAPI -khc_write_binary(khm_handle conf, - const wchar_t * value_name, - void * buf, - khm_size bufsize); - -/*! \brief Get the type of a value in a configuration space - - \return The return value is the type of the specified value, or - KC_NONE if the value does not exist. - */ -KHMEXP khm_int32 KHMAPI -khc_get_type(khm_handle conf, const wchar_t * value_name); - -/*! \brief Check which configuration stores contain a specific value. - - Each value in a configuration space can be contained in zero or - more configuration stores. Use this function to determine which - configuration stores contain the specific value. - - The returned bitmask always indicates a subset of the - configuration stores that were specified when opening the - configuration space corresponding to \a conf. - - \return A combination of ::KCONF_FLAG_MACHINE, ::KCONF_FLAG_USER - and ::KCONF_FLAG_SCHEMA indicating which stores contain the - value. - */ -KHMEXP khm_int32 KHMAPI -khc_value_exists(khm_handle conf, const wchar_t * value); - -/*! \brief Remove a value from a configuration space - - Removes a value from one or more configuration stores. - - A value can exist in multiple configuration stores. Only the - values that are stored in writable stores can be removed. When - the function searches for values to remove, it will only look in - configuration stores that are specified in the handle. In - addition, the configuration stores affected can be further - narrowed by specifying them in the \a flags parameter. If \a - flags is zero, then all the stores visible to the handle are - searched. If \a flags specifies ::KCONF_FLAG_USER or - ::KCONF_FLAG_MACHINE or both, then only the specified stores are - searched, provided that the stores are visible to the handle. - - This function only operates on the topmost configuration space - visible to the handle. If the configuration handle is shadowed, - the shadowed configuration spaces are unaffected by the removal. - - \param[in] conf Handle to configuration space to remove value from - - \param[in] value_name Value to remove - - \param[in] flags Specifies which configuration stores will be - affected by the removal. See above. - - \retval KHM_ERROR_SUCCESS The value was removed from all the - specified configuration stores. - - \retval KHM_ERROR_NOT_FOUND The value was not found. - - \retval KHM_ERROR_UNKNOWN An unknown error occurred while trying - to remove the value. - - \retval KHM_ERROR_PARTIAL The value was successfully removed from - one or more stores, but the operation failed on one or more - other stores. - */ -KHMEXP khm_int32 KHMAPI -khc_remove_value(khm_handle conf, const wchar_t * value_name, khm_int32 flags); - -/*! \brief Get the name of a configuration space - - \param[in] conf Handle to a configuration space - - \param[out] buf The buffer to receive the name. Set to NULL if - only the size of the buffer is required. - - \param[in,out] bufsize On entry, holds the size of the buffer - pointed to by \a buf. On exit, holds the number of bytes - copied into the buffer including the NULL terminator. - */ -KHMEXP khm_int32 KHMAPI -khc_get_config_space_name(khm_handle conf, - wchar_t * buf, - khm_size * bufsize); - -/*! \brief Get a handle to the parent space - - \param[in] conf Handle to a configuration space - - \param[out] parent Handle to the parent configuration space if the - call succeeds. Receives NULL otherwise. The returned handle - must be closed using khc_close_space() - */ -KHMEXP khm_int32 KHMAPI -khc_get_config_space_parent(khm_handle conf, - khm_handle * parent); - -/*! \brief Load a configuration schema into the specified configuration space - - \param[in] conf Handle to a configuration space or NULL to use the - root configuration space. - - \param[in] schema The schema to load. The schema is assumed to be - well formed. - - \see khc_unload_schema() - */ -KHMEXP khm_int32 KHMAPI -khc_load_schema(khm_handle conf, - const kconf_schema * schema); - -/*! \brief Unload a schema from a configuration space - */ -KHMEXP khm_int32 KHMAPI -khc_unload_schema(khm_handle conf, - const kconf_schema * schema); - -/*! \brief Enumerate the subspaces of a configuration space - - Prepares a configuration space for enumeration and returns the - child spaces in no particular order. - - \param[in] conf The configuration space to enumerate child spaces - - \param[in] prev The previous configuration space returned by - khc_enum_subspaces() or NULL if this is the first call. If - this is not NULL, then the handle passed in \a prev will be - freed. - - \param[out] next If \a prev was NULL, receives the first sub space - found in \a conf. You must \b either call - khc_enum_subspaces() again with the returned handle or call - khc_close_space() to free the returned handle if no more - subspaces are required. \a next can point to the same handle - specified in \a prev. - - \retval KHM_ERROR_SUCCESS The call succeeded. There is a valid - handle to a configuration space in \a first_subspace. - - \retval KHM_ERROR_INVALID_PARAM Either \a conf or \a prev was not a - valid configuration space handle or \a first_subspace is NULL. - Note that \a prev can be NULL. - - \retval KHM_ERROR_NOT_FOUND There were no subspaces in the - configuration space pointed to by \a conf. - - \note The configuration spaces that are enumerated directly belong - to the configuration space given by \a conf. This function - does not enumerate subspaces of shadowed configuration spaces - (see khc_shadow_space()). Even if \a conf was obtained on a - restricted domain (i.e. you specified one or more - configuration stores when you openend the handle and didn't - include all the configuration stores. See khc_open_space()), - the subspaces that are returned are the union of all - configuration spaces in all the configuration stores. This is - not a bug. This is a feature. In NetIDMgr, a configuartion - space exists if some configuration store defines it (or it was - created with a call to khc_open_space() even if no - configuration store defines it yet). This is the tradeoff you - make when using a layered configuration system. - - However, the returned handle has the same domain restrictions - as \a conf. - */ -KHMEXP khm_int32 KHMAPI -khc_enum_subspaces(khm_handle conf, - khm_handle prev, - khm_handle * next); - -/*! \brief Remove a configuration space - - The configuration space will be marked for removal. Once all the - handles for the space have been released, it will be deleted. The - configuration stores that will be affected are the write enabled - configuration stores for the handle. - */ -KHMEXP khm_int32 KHMAPI -khc_remove_space(khm_handle conf); -/*@}*/ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KCONFIG_H +#define __KHIMAIRA_KCONFIG_H + +#include +#include + +/*! \defgroup kconf NetIDMgr Configuration Provider */ +/*@{*/ + +/*! \brief Configuration schema descriptor record + + The schema descriptor is a convenient way to provide a default set + of configuration options for a part of an application. It + describes the configuration spaces and the values and subspaces + contained in each space. + + \see kconf_load_schema() +*/ +typedef struct tag_kconf_schema { + wchar_t * name; /*!< name of the object being described. + Optional for KC_ENDSPACE type object, + but required for everything else. + Names can be upto KCONF_MAXCCH_NAME + characters in length. */ + khm_int32 type; /*!< type of the object. Can be one of + KC_SPACE, KC_ENDSPACE, KC_INT32, + KC_INT64, KC_STRING or KC_BINARY */ + khm_ui_8 value; /*!< the value of the object. It is not + used for KC_SPACE and KC_ENDSPACE + typed objects. For a KC_STRING, this + contains a pointer to the string + value. The string should not be + longer than KCONF_MAXCCH_STRING + characters. KC_INT32 and KC_INT64 + objects store the value directly in + this field, while KC_BINARY objects do + not support defining a default value + here. */ + wchar_t * description;/*!< a friendly description of the value + or configuration space. */ +} kconf_schema; + +/*! \name Configuration data types + @{*/ +/*! \brief Not a known type */ +#define KC_NONE 0 + +/*! \brief When used as ::kconf_schema \a type, defines the start of a configuration space. + + There should be a subsequent KC_ENDSPACE record in the schema + which defines the end of this configuration space. + + \a name specifies the name of the configuration space. Optionally + use \a description to provide a description.*/ +#define KC_SPACE 1 + +/*! \brief Ends a configuration space started with KC_SPACE */ +#define KC_ENDSPACE 2 + +/*! \brief A 32 bit integer + + Specifies a configuration parameter named \a name which is of this + type. Use \a description to provide an optional description of + the value. + + \a value specifies a default value for this parameter in the lower + 32 bits. +*/ +#define KC_INT32 3 + +/*! \brief A 64 bit integer + + Specifies a configuration parameter named \a name which is of this + type. Use \a description to provide an optional description of + the value. + + \a value specifies a default value for this parameter. +*/ +#define KC_INT64 4 + +/*! \brief A unicode string + + Specifies a configuration parameter named \a name which is of this + type. Use \a description to provide an optional description of + the value. + + \a value specifies a default value for this parameter which should + be a pointer to a NULL terminated unicode string of no more than + ::KCONF_MAXCCH_STRING characters. +*/ +#define KC_STRING 5 + +/*! \brief An unparsed binary stream + + Specifies a configuration parameter named \a name which is of this + type. Use \a description to provide an optional description of + the value. + + Default values are not supported for binary streams. \a value is + ignored. +*/ +#define KC_BINARY 6 +/*@}*/ + +/*! \brief This is the root configuration space */ +#define KCONF_FLAG_ROOT 0x00000001 + +/*! \brief Indicates the configuration store which stores user-specific information */ +#define KCONF_FLAG_USER 0x00000002 + +/*! \brief Indicates the configuration store which stores machine-specific information */ +#define KCONF_FLAG_MACHINE 0x00000004 + +/*! \brief Indicates the configuration store which stores the schema */ +#define KCONF_FLAG_SCHEMA 0x00000008 + +/*! \brief Indicates that the last component of the given configuration path is to be considered to be a configuration value */ +#define KCONF_FLAG_TRAILINGVALUE 0x00000020 + +/*! \brief Only write values back there is a change + + Any write operations using the handle with check if the value + being written is different from the value being read from the + handle. It will only be written if the value is different. + + \note Note that the value being read from a handle takes schema and + shadowed configuration handles into consideration while the value + being written is only written to the topmost layer of + configuration that can be written to. + + \note Note also that this flag does not affect binary values. + */ +#define KCONF_FLAG_WRITEIFMOD 0x00000040 + +/*! \brief Use case-insensitive comparison for KCONF_FLAG_WRITEIFMOD + + When used in combination with \a KCONF_FLAG_WRITEIFMOD , the + string comparison used when determining whether the string read + from the configuration handle is the same as the string being + written will be case insensitive. If this flag is not set, the + comparison will be case sensitive. + */ +#define KCONF_FLAG_IFMODCI 0x00000080 + +/*! \brief Do not parse the configuration space name + + If set, disables the parsing of the configuration space for + subspaces. The space name is taken verbatim to be a configuration + space name. This can be used when there can be forward slashes or + backslahes in the name which are not escaped. + + By default, the configuration space name, + + \code + L"foo\\bar" + \endcode + + is taken to mean the configuration space \a bar which is a + subspace of \a foo. If ::KCONF_FLAG_NOPARSENAME is set, then this + is taken to mean configuration space \a foo\\bar. + */ +#define KCONF_FLAG_NOPARSENAME 0x00000040 + +/*! \brief Maximum number of allowed characters (including terminating NULL) in a name + + \note This is a hard limit in Windows, since we are mapping + configuration spaces to registry keys. +*/ +#define KCONF_MAXCCH_NAME 256 + +/*! \brief Maximum number of allowed bytes (including terminating NULL) in a name */ +#define KCONF_MAXCB_NAME (KCONF_MAXCCH_NAME * sizeof(wchar_t)) + +/*! \brief Maximum level of nesting for configuration spaces + */ +#define KCONF_MAX_DEPTH 16 + +/*! \brief Maximum number of allowed characters (including terminating NULL) in a configuration path */ +#define KCONF_MAXCCH_PATH (KCONF_MAXCCH_NAME * KCONF_MAX_DEPTH) + +/*! \brief Maximum number of allowed bytes (including terminating NULL) in a configuration path */ +#define KCONF_MAXCB_PATH (KCONF_MAXCCH_PATH * sizeof(wchar_t)) + +/*! \brief Maximum number of allowed characters (including terminating NULL) in a string */ +#define KCONF_MAXCCH_STRING KHM_MAXCCH_STRING + +/*! \brief Maximum number of allowed bytes (including terminating NULL) in a string */ +#define KCONF_MAXCB_STRING (KCONF_MAXCCH_STRING * sizeof(wchar_t)) + +/*! \brief Open a configuration space + + Opens the configuration space specified by \a cspace. By default, + the opened space includes user,machine and schema configuration + stores. However, you can specify a subset of these. + + If the configuration space does not exist and the \a flags specify + KHM_FLAG_CREATE, then the configuration space is created. The + stores that are affected by the create operation depend on \a + flags. If the \a flags only specifies ::KCONF_FLAG_MACHINE, then + the configuration space is created in the machine store. If \a + flags specifies any combination of stores including \a + ::KCONF_FLAG_USER, then the configuration space is created in the + user store. Note that ::KCONF_FLAG_SCHEMA is readonly. + + Once opened, use khc_close_space() to close the configuration + space. + + \param[in] parent The parent configuration space. The path + specified in \a cspace is relative to the parent. Set this to + NULL to indicate the root configuration space. + + \param[in] cspace The confiuration path. This can be up to + ::KCONF_MAXCCH_PATH characters in length. Use either + backslashes or forward slashes to specify hiearchy. Set this + to NULL to reopen the parent configuration space. + + \param[in] flags Flags. This can be a combination of KCONF_FLAG_* + constants and KHM_FLAG_CREATE. If none of ::KCONF_FLAG_USER, + ::KCONF_FLAG_MACHINE or ::KCONF_FLAG_SCHEMA is specified, then + it defaults to all three. + + \param[out] result Pointer to a handle which receives the handle + to the opened configuration space if the call succeeds. + + \note You can re-open a configuration space with different flags + such as ::KCONF_FLAG_MACHINE by specifying NULL for \a cspace + and settings \a flags to the required flags. + +*/ +KHMEXP khm_int32 KHMAPI +khc_open_space(khm_handle parent, const wchar_t * cspace, khm_int32 flags, + khm_handle * result); + +/*! \brief Set the shadow space for a configuration handle + + The handle specified by \a lower becomes a shadow for the handle + specified by \a upper. Any configuration value that is queried in + \a upper that does not exist in \a upper will be queried in \a + lower. + + If \a upper already had a shadow handle, that handle will be + replaced by \a lower. The handle \a lower still needs to be + closed by a call to khc_close_space(). However, closing \a lower + will not affect \a upper which will still treat the configuration + space pointed to by \a lower to be it's shadow. + + Shadows are specific to handles and not configuration spaces. + Shadowing a configuration space using one handle does not affect + any other handles which may be obtained for the same configuration + space. + + Specify NULL for \a lower to remove any prior shadow. + */ +KHMEXP khm_int32 KHMAPI +khc_shadow_space(khm_handle upper, khm_handle lower); + +/*! \brief Close a handle opened with khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_close_space(khm_handle conf); + +/*! \brief Read a string value from a configuration space + + The \a value_name parameter specifies the value to read from the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to access the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema + store. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. + + If the value is not found in the configuration space and any + shadowed configuration spaces, the function returns \a + KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. + + \param[in] buf Buffer to copy the string to. Specify NULL to just + retrieve the number of required bytes. + + \param[in,out] bufsize On entry, specifies the number of bytes of + space available at the location specified by \a buf. On exit + specifies the number of bytes actually copied or the size of + the required buffer if \a buf is NULL or insufficient. + + \retval KHM_ERROR_NOT_READY The configuration provider has not started + \retval KHM_ERROR_INVALID_PARAM One or more of the supplied parameters are not valid + \retval KHM_ERROR_TYPE_MISMATCH The specified value is not a string + \retval KHM_ERROR_TOO_LONG \a buf was NULL or the size of the buffer was insufficient. The required size is in bufsize. + \retval KHM_ERROR_SUCCESS Success. The number of bytes copied is in bufsize. + \retval KHM_ERROR_NOT_FOUND The value was not found. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_read_string(khm_handle conf, + const wchar_t * value_name, + wchar_t * buf, + khm_size * bufsize); + +/*! \brief Read a multi-string value from a configuration space + + The \a value_name parameter specifies the value to read from the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to access the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema + store. + + A multi-string is a pseudo data type. The value in the + configuration store should contain a CSV string. Each comma + separated value in the CSV string is considered to be a separate + value. Empty values are not allowed. The buffer pointed to by \a + buf will receive these values in the form of a series of NULL + terminated strings terminated by an empty string (or equivalently, + the last string will be terminated by a double NULL). + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. + + If the value is not found in the configuration space and any + shadowed configuration spaces, the function returns \a + KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. + + \param[in] buf Buffer to copy the multi-string to. Specify NULL + to just retrieve the number of required bytes. + + \param[in,out] bufsize On entry, specifies the number of bytes of + space available at the location specified by \a buf. On exit + specifies the number of bytes actually copied or the size of + the required buffer if \a buf is NULL or insufficient. + + \retval KHM_ERROR_NOT_READY The configuration provider has not started + \retval KHM_ERROR_INVALID_PARAM One or more of the supplied parameters are not valid + \retval KHM_ERROR_TYPE_MISMATCH The specified value is not a string + \retval KHM_ERROR_TOO_LONG \a buf was NULL or the size of the buffer was insufficient. The required size is in bufsize. + \retval KHM_ERROR_SUCCESS Success. The number of bytes copied is in bufsize. + \retval KHM_ERROR_NOT_FOUND The value was not found. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_read_multi_string(khm_handle conf, + const wchar_t * value_name, + wchar_t * buf, + khm_size * bufsize); + +/*! \brief Read a 32 bit integer value from a configuration space + + The \a value_name parameter specifies the value to read from the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to access the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema + store. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. + + If the value is not found in the configuration space and any + shadowed configuration spaces, the function returns \a + KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. + + \param[in] conf Handle to a configuration space + \param[in] value The value to query + \param[out] buf The buffer to receive the value + + \retval KHM_ERROR_NOT_READY The configuration provider has not started. + \retval KHM_ERROR_SUCCESS Success. The value that was read was placed in \a buf + \retval KHM_ERROR_NOT_FOUND The specified value was not found + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_TYPE_MISMATCH The specified value was found but was not of the correct type. + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_read_int32(khm_handle conf, + const wchar_t * value_name, + khm_int32 * buf); + +/*! \brief Read a 64 bit integer value from a configuration space + + The \a value_name parameter specifies the value to read from the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to access the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + - Otherwise, if KCONF_FLAG_SCHEMA was specified, the the schema + store. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. + + If the value is not found in the configuration space and any + shadowed configuration spaces, the function returns \a + KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. + + \param[in] conf Handle to a configuration space + \param[in] value_name The value to query + \param[out] buf The buffer to receive the value + + \retval KHM_ERROR_NOT_READY The configuration provider has not started + \retval KHM_ERROR_SUCCESS Success. The value that was read was placed in \a buf + \retval KHM_ERROR_NOT_FOUND The specified value was not found + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid + \retval KHM_ERROR_TYPE_MISMATCH The specified value was found but was not the correct data type. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_read_int64(khm_handle conf, + const wchar_t * value_name, + khm_int64 * buf); + +/*! \brief Read a binary value from a configuration space + + The \a value_name parameter specifies the value to read from the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to access the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. Also note that the schema store (KCONF_FLAG_SCHEMA) does + not support binary values. + + If the value is not found in the configuration space and any + shadowed configuration spaces, the function returns \a + KHM_ERROR_NOT_FOUND. In this case, the buffer is left unmodified. + + \param[in] buf Buffer to copy the string to. Specify NULL to just + retrieve the number of required bytes. + + \param[in,out] bufsize On entry, specifies the number of bytes of + space available at the location specified by \a buf. On exit + specifies the number of bytes actually copied or the size of + the required buffer if \a buf is NULL or insufficient. + + \retval KHM_ERROR_SUCCESS Success. The data was copied to \a buf. The number of bytes copied is stored in \a bufsize + \retval KHM_ERROR_NOT_FOUND The specified value was not found + \retval KHM_ERROR_INVALID_PARAM One or more parameters were invalid. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_read_binary(khm_handle conf, + const wchar_t * value_name, + void * buf, + khm_size * bufsize); + +/*! \brief Write a string value to a configuration space + + The \a value_name parameter specifies the value to write to the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to write the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If \a KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if \a KCONF_FLAG_MACHINE was specified, then the + machine configuration space. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. Also note that the schema store (KCONF_FLAG_SCHEMA) is + readonly. + + If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to + khc_open_space() for obtaining the configuration handle, the + specified string will only be written if it is different from the + value being read from the handle. + + If the \a KCONF_FLAG_IFMODCI flag is specified along with the \a + KCONF_FLAG_WRITEIFMOD flag, then the string comparison used will + be case insensitive. + + \param[in] conf Handle to a configuration space + \param[in] value_name Name of value to write + \param[in] buf A NULL terminated unicode string not exceeding KCONF_MAXCCH_STRING in characters including terminating NULL + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_write_string(khm_handle conf, + const wchar_t * value_name, + wchar_t * buf); + +/*! \brief Write a multi-string value to a configuration space + + The \a value_name parameter specifies the value to write to the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to write the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + A multi-string is a pseudo data type. The buffer pointed to by \a + buf should contain a sequence of NULL terminated strings + terminated by an empty string (or equivalently, the last string + should terminate with a double NULL). This will be stored in the + value as a CSV string. + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. Also note that the schema store (KCONF_FLAG_SCHEMA) is + readonly. + + If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to + khc_open_space() for obtaining the configuration handle, the + specified string will only be written if it is different from the + value being read from the handle. + + If the \a KCONF_FLAG_IFMODCI flag is specified along with the \a + KCONF_FLAG_WRITEIFMOD flag, then the string comparison used will + be case insensitive. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_write_multi_string(khm_handle conf, + const wchar_t * value_name, + wchar_t * buf); + +/*! \brief Write a 32 bit integer value to a configuration space + + The \a value_name parameter specifies the value to write to the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to write the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. Also note that the schema store (KCONF_FLAG_SCHEMA) is + readonly. + + If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to + khc_open_space() for obtaining the configuration handle, the + specified string will only be written if it is different from the + value being read from the handle. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_write_int32(khm_handle conf, + const wchar_t * value_name, + khm_int32 buf); + +/*! \brief Write a 64 bit integer value to a configuration space + + The \a value_name parameter specifies the value to write to the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to write the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. Also note that the schema store (KCONF_FLAG_SCHEMA) is + readonly. + + If the \a KCONF_FLAG_WRITEIFMOD flag is specified in the call to + khc_open_space() for obtaining the configuration handle, the + specified string will only be written if it is different from the + value being read from the handle. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_write_int64(khm_handle conf, + const wchar_t * value_name, + khm_int64 buf); + +/*! \brief Write a binary value to a configuration space + + The \a value_name parameter specifies the value to write to the + configuration space. This can be either a value name or a value + path consisting of a series nested configuration space names + followed by the value name all separated by backslashes or forward + slashes. + + For example: If \a conf is a handle to the configuration space \c + 'A/B/C', then the value name \c 'D/E/v' refers to the value named + \c 'v' in the configuration space \c 'A/B/C/D/E'. + + The specific configuration store that is used to write the value + depends on the flags that were specified in the call to + khc_open_space(). The precedence of configuration stores are as + follows: + + - If KCONF_FLAG_USER was specified, then the user configuration + space. + + - Otherwise, if KCONF_FLAG_MACHINE was specified, then the machine + configuration space. + + Note that not specifying any of the configuration store specifiers + in the call to khc_open_space() is equivalent to specifying all + three. Also note that the schema store (KCONF_FLAG_SCHEMA) is + readonly. + + \see khc_open_space() +*/ +KHMEXP khm_int32 KHMAPI +khc_write_binary(khm_handle conf, + const wchar_t * value_name, + void * buf, + khm_size bufsize); + +/*! \brief Get the type of a value in a configuration space + + \return The return value is the type of the specified value, or + KC_NONE if the value does not exist. + */ +KHMEXP khm_int32 KHMAPI +khc_get_type(khm_handle conf, const wchar_t * value_name); + +/*! \brief Check which configuration stores contain a specific value. + + Each value in a configuration space can be contained in zero or + more configuration stores. Use this function to determine which + configuration stores contain the specific value. + + The returned bitmask always indicates a subset of the + configuration stores that were specified when opening the + configuration space corresponding to \a conf. + + \return A combination of ::KCONF_FLAG_MACHINE, ::KCONF_FLAG_USER + and ::KCONF_FLAG_SCHEMA indicating which stores contain the + value. + */ +KHMEXP khm_int32 KHMAPI +khc_value_exists(khm_handle conf, const wchar_t * value); + +/*! \brief Remove a value from a configuration space + + Removes a value from one or more configuration stores. + + A value can exist in multiple configuration stores. Only the + values that are stored in writable stores can be removed. When + the function searches for values to remove, it will only look in + configuration stores that are specified in the handle. In + addition, the configuration stores affected can be further + narrowed by specifying them in the \a flags parameter. If \a + flags is zero, then all the stores visible to the handle are + searched. If \a flags specifies ::KCONF_FLAG_USER or + ::KCONF_FLAG_MACHINE or both, then only the specified stores are + searched, provided that the stores are visible to the handle. + + This function only operates on the topmost configuration space + visible to the handle. If the configuration handle is shadowed, + the shadowed configuration spaces are unaffected by the removal. + + \param[in] conf Handle to configuration space to remove value from + + \param[in] value_name Value to remove + + \param[in] flags Specifies which configuration stores will be + affected by the removal. See above. + + \retval KHM_ERROR_SUCCESS The value was removed from all the + specified configuration stores. + + \retval KHM_ERROR_NOT_FOUND The value was not found. + + \retval KHM_ERROR_UNKNOWN An unknown error occurred while trying + to remove the value. + + \retval KHM_ERROR_PARTIAL The value was successfully removed from + one or more stores, but the operation failed on one or more + other stores. + */ +KHMEXP khm_int32 KHMAPI +khc_remove_value(khm_handle conf, const wchar_t * value_name, khm_int32 flags); + +/*! \brief Get the name of a configuration space + + \param[in] conf Handle to a configuration space + + \param[out] buf The buffer to receive the name. Set to NULL if + only the size of the buffer is required. + + \param[in,out] bufsize On entry, holds the size of the buffer + pointed to by \a buf. On exit, holds the number of bytes + copied into the buffer including the NULL terminator. + */ +KHMEXP khm_int32 KHMAPI +khc_get_config_space_name(khm_handle conf, + wchar_t * buf, + khm_size * bufsize); + +/*! \brief Get a handle to the parent space + + \param[in] conf Handle to a configuration space + + \param[out] parent Handle to the parent configuration space if the + call succeeds. Receives NULL otherwise. The returned handle + must be closed using khc_close_space() + */ +KHMEXP khm_int32 KHMAPI +khc_get_config_space_parent(khm_handle conf, + khm_handle * parent); + +/*! \brief Load a configuration schema into the specified configuration space + + \param[in] conf Handle to a configuration space or NULL to use the + root configuration space. + + \param[in] schema The schema to load. The schema is assumed to be + well formed. + + \see khc_unload_schema() + */ +KHMEXP khm_int32 KHMAPI +khc_load_schema(khm_handle conf, + const kconf_schema * schema); + +/*! \brief Unload a schema from a configuration space + */ +KHMEXP khm_int32 KHMAPI +khc_unload_schema(khm_handle conf, + const kconf_schema * schema); + +/*! \brief Enumerate the subspaces of a configuration space + + Prepares a configuration space for enumeration and returns the + child spaces in no particular order. + + \param[in] conf The configuration space to enumerate child spaces + + \param[in] prev The previous configuration space returned by + khc_enum_subspaces() or NULL if this is the first call. If + this is not NULL, then the handle passed in \a prev will be + freed. + + \param[out] next If \a prev was NULL, receives the first sub space + found in \a conf. You must \b either call + khc_enum_subspaces() again with the returned handle or call + khc_close_space() to free the returned handle if no more + subspaces are required. \a next can point to the same handle + specified in \a prev. + + \retval KHM_ERROR_SUCCESS The call succeeded. There is a valid + handle to a configuration space in \a first_subspace. + + \retval KHM_ERROR_INVALID_PARAM Either \a conf or \a prev was not a + valid configuration space handle or \a first_subspace is NULL. + Note that \a prev can be NULL. + + \retval KHM_ERROR_NOT_FOUND There were no subspaces in the + configuration space pointed to by \a conf. + + \note The configuration spaces that are enumerated directly belong + to the configuration space given by \a conf. This function + does not enumerate subspaces of shadowed configuration spaces + (see khc_shadow_space()). Even if \a conf was obtained on a + restricted domain (i.e. you specified one or more + configuration stores when you openend the handle and didn't + include all the configuration stores. See khc_open_space()), + the subspaces that are returned are the union of all + configuration spaces in all the configuration stores. This is + not a bug. This is a feature. In NetIDMgr, a configuartion + space exists if some configuration store defines it (or it was + created with a call to khc_open_space() even if no + configuration store defines it yet). This is the tradeoff you + make when using a layered configuration system. + + However, the returned handle has the same domain restrictions + as \a conf. + */ +KHMEXP khm_int32 KHMAPI +khc_enum_subspaces(khm_handle conf, + khm_handle prev, + khm_handle * next); + +/*! \brief Remove a configuration space + + The configuration space will be marked for removal. Once all the + handles for the space have been released, it will be deleted. The + configuration stores that will be affected are the write enabled + configuration stores for the handle. + */ +KHMEXP khm_int32 KHMAPI +khc_remove_space(khm_handle conf); +/*@}*/ + +#endif --- krb5-1.4.4.orig/src/windows/identity/kconfig/api.c +++ krb5-1.4.4/src/windows/identity/kconfig/api.c @@ -1,2492 +1,2492 @@ -/* -* Copyright (c) 2005 Massachusetts Institute of Technology -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, -* modify, merge, publish, distribute, sublicense, and/or sell copies -* of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -/* $Id$ */ - -#include -#include -#include - -kconf_conf_space * conf_root = NULL; -kconf_handle * conf_handles = NULL; -kconf_handle * conf_free_handles = NULL; - -CRITICAL_SECTION cs_conf_global; -CRITICAL_SECTION cs_conf_handle; -LONG conf_init = 0; -LONG conf_status = 0; - -void init_kconf(void) { - if(InterlockedIncrement(&conf_init) == 1L) { - /* we are the first */ - InitializeCriticalSection(&cs_conf_global); - EnterCriticalSection(&cs_conf_global); - conf_root = khcint_create_empty_space(); - conf_root->name = PWCSDUP(L"Root"); - conf_root->regpath = PWCSDUP(CONFIG_REGPATHW); - conf_root->refcount++; - conf_status = 1; - InitializeCriticalSection(&cs_conf_handle); - LeaveCriticalSection(&cs_conf_global); - } - /* else assume we are already initialized */ -} - -void exit_kconf(void) { - if(khc_is_config_running()) { - kconf_handle * h; - - EnterCriticalSection(&cs_conf_global); - - conf_init = 0; - conf_status = 0; - - khcint_free_space(conf_root); - - EnterCriticalSection(&cs_conf_handle); - while(conf_free_handles) { - LPOP(&conf_free_handles, &h); - if(h) { - PFREE(h); - } - } - - while(conf_handles) { - LPOP(&conf_handles, &h); - if(h) { - PFREE(h); - } - } - LeaveCriticalSection(&cs_conf_handle); - DeleteCriticalSection(&cs_conf_handle); - - LeaveCriticalSection(&cs_conf_global); - DeleteCriticalSection(&cs_conf_global); - } -} - -kconf_handle * -khcint_handle_from_space(kconf_conf_space * s, khm_int32 flags) -{ - kconf_handle * h; - - EnterCriticalSection(&cs_conf_handle); - LPOP(&conf_free_handles, &h); - if(!h) { - h = PMALLOC(sizeof(kconf_handle)); - assert(h != NULL); - } - ZeroMemory((void *) h, sizeof(kconf_handle)); - - h->magic = KCONF_HANDLE_MAGIC; - khcint_space_hold(s); - h->space = s; - h->flags = flags; - - LPUSH(&conf_handles, h); - LeaveCriticalSection(&cs_conf_handle); - - return h; -} - -/* must be called with cs_conf_global held */ -void -khcint_handle_free(kconf_handle * h) -{ - kconf_handle * lower; - - EnterCriticalSection(&cs_conf_handle); -#ifdef DEBUG - /* check if the handle is actually in use */ - { - kconf_handle * a; - a = conf_handles; - while(a) { - if(h == a) - break; - a = LNEXT(a); - } - - if(a == NULL) { - DebugBreak(); - } - } -#endif - while(h) { - LDELETE(&conf_handles, h); - if(h->space) { - khcint_space_release(h->space); - h->space = NULL; - } - lower = h->lower; - LPUSH(&conf_free_handles, h); - h = lower; - } - LeaveCriticalSection(&cs_conf_handle); -} - -kconf_handle * -khcint_handle_dup(kconf_handle * o) -{ - kconf_handle * h; - kconf_handle * r; - - r = khcint_handle_from_space(o->space, o->flags); - h = r; - - while(o->lower) { - h->lower = khcint_handle_from_space(o->lower->space, o->lower->flags); - - o = o->lower; - h = h->lower; - } - - return r; -} - -void -khcint_space_hold(kconf_conf_space * s) { - EnterCriticalSection(&cs_conf_global); - s->refcount ++; - LeaveCriticalSection(&cs_conf_global); -} - -void -khcint_space_release(kconf_conf_space * s) { - khm_int32 l; - - EnterCriticalSection(&cs_conf_global); - - l = -- s->refcount; - if (l == 0) { - if(s->regkey_machine) - RegCloseKey(s->regkey_machine); - if(s->regkey_user) - RegCloseKey(s->regkey_user); - s->regkey_machine = NULL; - s->regkey_user = NULL; - - if (s->flags & - (KCONF_SPACE_FLAG_DELETE_M | - KCONF_SPACE_FLAG_DELETE_U)) { - khcint_remove_space(s, s->flags); - } - } - - LeaveCriticalSection(&cs_conf_global); -} - -/* case sensitive replacement for RegOpenKeyEx */ -LONG -khcint_RegOpenKeyEx(HKEY hkey, LPCWSTR sSubKey, DWORD ulOptions, - REGSAM samDesired, PHKEY phkResult) { - int i; - wchar_t sk_name[KCONF_MAXCCH_NAME]; - FILETIME ft; - size_t cch; - HKEY hkp = NULL; - const wchar_t * t; - LONG rv = ERROR_SUCCESS; - - hkp = hkey; - t = sSubKey; - - /* check for case insensitive prefix first */ - if (!_wcsnicmp(sSubKey, CONFIG_REGPATHW, ARRAYLENGTH(CONFIG_REGPATHW) - 1)) { - HKEY hkt; - - t = sSubKey + (ARRAYLENGTH(CONFIG_REGPATHW) - 1); - -#ifdef DEBUG - assert(*t == L'\0' || *t == L'\\'); -#endif - - rv = RegOpenKeyEx(hkp, - CONFIG_REGPATHW, - ulOptions, - samDesired, - &hkt); - - if (rv != ERROR_SUCCESS) - return rv; - - if (*t == L'\0') { - *phkResult = hkt; - return rv; - } - - t++; - hkp = hkt; - } - - /* descend down the components of the subkey */ - while(TRUE) { - wchar_t * slash; - HKEY hkt; - - slash = wcschr(t, L'\\'); - if (slash == NULL) - break; - - if (FAILED(StringCchCopyN(sk_name, ARRAYLENGTH(sk_name), - t, slash - t))) { - rv = ERROR_CANTOPEN; - goto _cleanup; - } - - sk_name[slash - t] = L'\0'; - t = slash+1; - - if (khcint_RegOpenKeyEx(hkp, sk_name, ulOptions, samDesired, &hkt) == - ERROR_SUCCESS) { - - if (hkp != hkey) - RegCloseKey(hkp); - hkp = hkt; - - } else { - - rv = ERROR_CANTOPEN; - goto _cleanup; - - } - } - - /* by now hkp is a handle to the parent of the last component in - the subkey. t is a pointer to the last component. */ - - if (FAILED(StringCchLength(t, KCONF_MAXCCH_NAME, &cch))) { - rv = ERROR_CANTOPEN; - goto _cleanup; - } - - /* go through and find the case sensitive match for the key */ - - for (i=0; ;i++) { - LONG l; - DWORD dw; - - dw = ARRAYLENGTH(sk_name); - l = RegEnumKeyEx(hkp, i, sk_name, &dw, - NULL, NULL, NULL, &ft); - - if (l != ERROR_SUCCESS) { - rv = ERROR_CANTOPEN; - goto _cleanup; - } - - if (!(wcsncmp(sk_name, t, cch))) { - /* bingo! ?? */ - if (cch < KCONF_MAXCCH_NAME && - (sk_name[cch] == L'\0' || - sk_name[cch] == L'~')) { - rv = RegOpenKeyEx(hkp, sk_name, ulOptions, - samDesired, phkResult); - goto _cleanup; - } - } - } - - _cleanup: - if (hkp != hkey && hkp != NULL) - RegCloseKey(hkp); - - return rv; -} - -/*! \internal - - \note This function is not a good replacement for RegDeleteKey since - it deletes all the subkeys in addition to the key being deleted. - */ -LONG -khcint_RegDeleteKey(HKEY hKey, - LPCWSTR lpSubKey) { - int i; - wchar_t sk_name[KCONF_MAXCCH_NAME]; - FILETIME ft; - size_t cch; - LONG rv = ERROR_SUCCESS; - - /* go through and find the case sensitive match for the key */ - - if (FAILED(StringCchLength(lpSubKey, KCONF_MAXCCH_NAME, &cch))) - return ERROR_BADKEY; - - for (i=0; ;i++) { - LONG l; - DWORD dw; - - dw = ARRAYLENGTH(sk_name); - l = RegEnumKeyEx(hKey, i, sk_name, &dw, - NULL, NULL, NULL, &ft); - - if (l != ERROR_SUCCESS) { - rv = ERROR_BADKEY; - goto _cleanup; - } - - if (!(wcsncmp(sk_name, lpSubKey, cch))) { - /* bingo! ?? */ - if ((sk_name[cch] == L'\0' || - sk_name[cch] == L'~')) { - - /* instead of calling RegDeleteKey we call SHDeleteKey - because we want to blow off all the subkeys as - well. This is different from the behavior of - RegDeleteKey making khcint_RegDeleteKey not a very - good case sensitive replacement for - RegDeleteKey. */ - - rv = SHDeleteKey(hKey, sk_name); - goto _cleanup; - } - } - } - - _cleanup: - return rv; -} - -LONG -khcint_RegCreateKeyEx(HKEY hKey, - LPCWSTR lpSubKey, - DWORD Reserved, - LPWSTR lpClass, - DWORD dwOptions, - REGSAM samDesired, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition) { - LONG l; - int i; - long index = 0; - wchar_t sk_name[KCONF_MAXCCH_NAME]; /* hard limit in Windows */ - FILETIME ft; - size_t cch; - const wchar_t * t; - LONG rv = ERROR_SUCCESS; - HKEY hkp = NULL; - - hkp = hKey; - t = lpSubKey; - - /* check for case insensitive prefix first */ - if (!_wcsnicmp(lpSubKey, CONFIG_REGPATHW, ARRAYLENGTH(CONFIG_REGPATHW) - 1)) { - HKEY hkt; - - t = lpSubKey + (ARRAYLENGTH(CONFIG_REGPATHW) - 1); - -#ifdef DEBUG - assert(*t == L'\0' || *t == L'\\'); -#endif - - rv = RegCreateKeyEx(hkp, - CONFIG_REGPATHW, - Reserved, - lpClass, - dwOptions, - samDesired, - lpSecurityAttributes, - &hkt, - lpdwDisposition); - - if (rv != ERROR_SUCCESS) - return rv; - - if (*t == L'\0') { - *phkResult = hkt; - return rv; - } - - t++; - hkp = hkt; - } - - while(TRUE) { - wchar_t * slash; - HKEY hkt; - - slash = wcschr(t, L'\\'); - if (slash == NULL) - break; - - if (FAILED(StringCchCopyN(sk_name, ARRAYLENGTH(sk_name), - t, slash - t))) { - rv = ERROR_CANTOPEN; - goto _cleanup; - } - - sk_name[slash - t] = L'\0'; - t = slash+1; - - if (khcint_RegOpenKeyEx(hkp, sk_name, 0, samDesired, &hkt) == - ERROR_SUCCESS) { - - if (hkp != hKey) - RegCloseKey(hkp); - hkp = hkt; - } else { - - rv = RegCreateKeyEx(hKey, - lpSubKey, - Reserved, - lpClass, - dwOptions, - samDesired, - lpSecurityAttributes, - phkResult, - lpdwDisposition); - goto _cleanup; - } - } - - if (FAILED(StringCchLength(t, KCONF_MAXCCH_NAME, &cch))) { - rv = ERROR_CANTOPEN; - goto _cleanup; - } - - for (i=0; ;i++) { - DWORD dw; - - dw = ARRAYLENGTH(sk_name); - l = RegEnumKeyEx(hkp, i, sk_name, &dw, - NULL, NULL, NULL, &ft); - - if (l != ERROR_SUCCESS) - break; - - if (!(wcsncmp(sk_name, t, cch))) { - /* bingo! ?? */ - if (sk_name[cch] == L'\0' || - sk_name[cch] == L'~') { - l = RegOpenKeyEx(hkp, sk_name, 0, - samDesired, phkResult); - if (l == ERROR_SUCCESS && lpdwDisposition) - *lpdwDisposition = REG_OPENED_EXISTING_KEY; - rv = l; - goto _cleanup; - } - } - - if (!_wcsnicmp(sk_name, t, cch) && - (sk_name[cch] == L'\0' || - sk_name[cch] == L'~')) { - long new_idx; - - if (sk_name[cch] == L'\0') - new_idx = 1; - else if (cch + 1 < KCONF_MAXCCH_NAME) - new_idx = wcstol(sk_name + (cch + 1), NULL, 10); - else - return ERROR_BUFFER_OVERFLOW; - - assert(new_idx > 0); - - if (new_idx > index) - index = new_idx; - } - } - - if (index != 0) { - if (FAILED(StringCbPrintf(sk_name, sizeof(sk_name), - L"%s~%d", t, index))) - return ERROR_BUFFER_OVERFLOW; - } else { - StringCbCopy(sk_name, sizeof(sk_name), t); - } - - rv = RegCreateKeyEx(hkp, - sk_name, - Reserved, - lpClass, - dwOptions, - samDesired, - lpSecurityAttributes, - phkResult, - lpdwDisposition); - - _cleanup: - - if (hkp != hKey && hkp != NULL) - RegCloseKey(hkp); - - return rv; -} - - -HKEY -khcint_space_open_key(kconf_conf_space * s, khm_int32 flags) { - HKEY hk = NULL; - int nflags = 0; - DWORD disp; - if(flags & KCONF_FLAG_MACHINE) { - if(s->regkey_machine) - return s->regkey_machine; - if((khcint_RegOpenKeyEx(HKEY_LOCAL_MACHINE, s->regpath, 0, - KEY_READ | KEY_WRITE, &hk) != - ERROR_SUCCESS) && - !(flags & KHM_PERM_WRITE)) { - - if(khcint_RegOpenKeyEx(HKEY_LOCAL_MACHINE, s->regpath, 0, - KEY_READ, &hk) == ERROR_SUCCESS) { - nflags = KHM_PERM_READ; - } - - } - if(!hk && (flags & KHM_FLAG_CREATE)) { - - khcint_RegCreateKeyEx(HKEY_LOCAL_MACHINE, - s->regpath, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ | KEY_WRITE, - NULL, - &hk, - &disp); - } - if(hk) { - EnterCriticalSection(&cs_conf_global); - s->regkey_machine = hk; - s->regkey_machine_flags = nflags; - LeaveCriticalSection(&cs_conf_global); - } - - return hk; - } else { - if(s->regkey_user) - return s->regkey_user; - if((khcint_RegOpenKeyEx(HKEY_CURRENT_USER, s->regpath, 0, - KEY_READ | KEY_WRITE, &hk) != - ERROR_SUCCESS) && - !(flags & KHM_PERM_WRITE)) { - if(khcint_RegOpenKeyEx(HKEY_CURRENT_USER, s->regpath, 0, - KEY_READ, &hk) == ERROR_SUCCESS) { - nflags = KHM_PERM_READ; - } - } - if(!hk && (flags & KHM_FLAG_CREATE)) { - khcint_RegCreateKeyEx(HKEY_CURRENT_USER, - s->regpath, 0, NULL, - REG_OPTION_NON_VOLATILE, - KEY_READ | KEY_WRITE, - NULL, &hk, &disp); - } - if(hk) { - EnterCriticalSection(&cs_conf_global); - s->regkey_user = hk; - s->regkey_user_flags = nflags; - LeaveCriticalSection(&cs_conf_global); - } - - return hk; - } -} - -KHMEXP khm_int32 KHMAPI -khc_shadow_space(khm_handle upper, khm_handle lower) -{ - kconf_handle * h; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(upper)) - return KHM_ERROR_INVALID_PARAM; - - h = (kconf_handle *) upper; - - EnterCriticalSection(&cs_conf_handle); - if(h->lower) { - LeaveCriticalSection(&cs_conf_handle); - EnterCriticalSection(&cs_conf_global); - khcint_handle_free(h->lower); - LeaveCriticalSection(&cs_conf_global); - EnterCriticalSection(&cs_conf_handle); - h->lower = NULL; - } - - if(khc_is_handle(lower)) { - kconf_handle * l; - kconf_handle * lc; - - l = (kconf_handle *) lower; - LeaveCriticalSection(&cs_conf_handle); - lc = khcint_handle_dup(l); - EnterCriticalSection(&cs_conf_handle); - h->lower = lc; - } - LeaveCriticalSection(&cs_conf_handle); - - return KHM_ERROR_SUCCESS; -} - -kconf_conf_space * -khcint_create_empty_space(void) { - kconf_conf_space * r; - - r = PMALLOC(sizeof(kconf_conf_space)); - assert(r != NULL); - ZeroMemory(r,sizeof(kconf_conf_space)); - - return r; -} - -void -khcint_free_space(kconf_conf_space * r) { - kconf_conf_space * c; - - if(!r) - return; - - LPOP(&r->children, &c); - while(c) { - khcint_free_space(c); - LPOP(&r->children, &c); - } - - if(r->name) - PFREE(r->name); - - if(r->regpath) - PFREE(r->regpath); - - if(r->regkey_machine) - RegCloseKey(r->regkey_machine); - - if(r->regkey_user) - RegCloseKey(r->regkey_user); - - PFREE(r); -} - -khm_int32 -khcint_open_space(kconf_conf_space * parent, - const wchar_t * sname, size_t n_sname, - khm_int32 flags, kconf_conf_space **result) { - kconf_conf_space * p; - kconf_conf_space * c; - HKEY pkey = NULL; - HKEY ckey = NULL; - wchar_t buf[KCONF_MAXCCH_NAME]; - size_t cb_regpath = 0; - - if(!parent) - p = conf_root; - else - p = parent; - - if(n_sname >= KCONF_MAXCCH_NAME || n_sname <= 0) - return KHM_ERROR_INVALID_PARAM; - - StringCchCopyN(buf, ARRAYLENGTH(buf), sname, n_sname); - - /* see if there is already a config space by this name. if so, - return it. Note that if the configuration space is specified - in a schema, we would find it here. */ - EnterCriticalSection(&cs_conf_global); - c = TFIRSTCHILD(p); - while(c) { - if(c->name && !wcscmp(c->name, buf)) - break; - - c = LNEXT(c); - } - LeaveCriticalSection(&cs_conf_global); - - if(c) { - - if (c->flags & KCONF_SPACE_FLAG_DELETED) { - if (flags & KHM_FLAG_CREATE) { - c->flags &= ~(KCONF_SPACE_FLAG_DELETED | - KCONF_SPACE_FLAG_DELETE_M | - KCONF_SPACE_FLAG_DELETE_U); - } else { - *result = NULL; - return KHM_ERROR_NOT_FOUND; - } - } - - khcint_space_hold(c); - *result = c; - return KHM_ERROR_SUCCESS; - } - - if(!(flags & KHM_FLAG_CREATE)) { - - /* we are not creating the space, so it must exist in the form of a - registry key in HKLM or HKCU. If it existed as a schema, we - would have already retured it above. */ - - if (flags & KCONF_FLAG_USER) - pkey = khcint_space_open_key(p, KHM_PERM_READ | KCONF_FLAG_USER); - - if((!pkey || - (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != - ERROR_SUCCESS)) - && (flags & KCONF_FLAG_MACHINE)) { - - pkey = khcint_space_open_key(p, KHM_PERM_READ | KCONF_FLAG_MACHINE); - if(!pkey || - (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != - ERROR_SUCCESS)) { - *result = NULL; - - return KHM_ERROR_NOT_FOUND; - } - } - - if(ckey) { - RegCloseKey(ckey); - ckey = NULL; - } - } - - c = khcint_create_empty_space(); - - /*SAFE: buf: is of known length < KCONF_MAXCCH_NAME */ - c->name = PWCSDUP(buf); - - /*SAFE: p->regpath: is valid since it was set using this same - function. */ - /*SAFE: buf: see above */ - cb_regpath = (wcslen(p->regpath) + wcslen(buf) + 2) * sizeof(wchar_t); - c->regpath = PMALLOC(cb_regpath); - - assert(c->regpath != NULL); - - /*SAFE: c->regpath: allocated above to be big enough */ - /*SAFE: p->regpath: see above */ - StringCbCopy(c->regpath, cb_regpath, p->regpath); - StringCbCat(c->regpath, cb_regpath, L"\\"); - - /*SAFE: buf: see above */ - StringCbCat(c->regpath, cb_regpath, buf); - - khcint_space_hold(c); - - EnterCriticalSection(&cs_conf_global); - TADDCHILD(p,c); - LeaveCriticalSection(&cs_conf_global); - - *result = c; - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khc_open_space(khm_handle parent, const wchar_t * cspace, khm_int32 flags, - khm_handle * result) { - kconf_handle * h; - kconf_conf_space * p; - kconf_conf_space * c = NULL; - size_t cbsize; - const wchar_t * str; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) { - return KHM_ERROR_NOT_READY; - } - - if(!result || (parent && !khc_is_handle(parent))) - return KHM_ERROR_INVALID_PARAM; - - if(!parent) - p = conf_root; - else { - h = (kconf_handle *) parent; - p = khc_space_from_handle(parent); - } - - khcint_space_hold(p); - - /* if none of these flags are specified, make it seem like all of - them were */ - if(!(flags & KCONF_FLAG_USER) && - !(flags & KCONF_FLAG_MACHINE) && - !(flags & KCONF_FLAG_SCHEMA)) - flags |= KCONF_FLAG_USER | KCONF_FLAG_MACHINE | KCONF_FLAG_SCHEMA; - - if(cspace == NULL) { - khcint_space_release(p); - *result = (khm_handle) khcint_handle_from_space(p, flags); - return KHM_ERROR_SUCCESS; - } - - if(FAILED(StringCbLength(cspace, KCONF_MAXCB_PATH, &cbsize))) { - khcint_space_release(p); - *result = NULL; - return KHM_ERROR_INVALID_PARAM; - } - - str = cspace; - while(TRUE) { - const wchar_t * end = NULL; - - if (!(flags & KCONF_FLAG_NOPARSENAME)) { - - end = wcschr(str, L'\\'); /* safe because cspace was - validated above */ -#if 0 - if(!end) - end = wcschr(str, L'/'); /* safe because cspace was - validated above */ -#endif - } - - if(!end) { - if(flags & KCONF_FLAG_TRAILINGVALUE) { - /* we are at the value component */ - c = p; - khcint_space_hold(c); - break; - } else - end = str + wcslen(str); /* safe because cspace was - validated above */ - } - - rv = khcint_open_space(p, str, end - str, flags, &c); - - if(KHM_SUCCEEDED(rv) && (*end == L'\\' -#if 0 - || *end == L'/' -#endif - )) { - khcint_space_release(p); - p = c; - c = NULL; - str = end+1; - } - else - break; - } - - khcint_space_release(p); - if(KHM_SUCCEEDED(rv)) { - *result = khcint_handle_from_space(c, flags); - } else - *result = NULL; - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_close_space(khm_handle csp) { - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(csp)) - return KHM_ERROR_INVALID_PARAM; - - khcint_handle_free((kconf_handle *) csp); - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khc_read_string(khm_handle pconf, - const wchar_t * pvalue, - wchar_t * buf, - khm_size * bufsize) -{ - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - do { - HKEY hku = NULL; - HKEY hkm = NULL; - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - DWORD size; - DWORD type; - LONG hr; - - int i; - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - - if(KHM_FAILED(khc_open_space( - pconf, - pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - goto _shadow; - - free_space = 1; -#if 0 - const wchar_t * back, * forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; /* works for nulls too */ -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf)) - goto _shadow; - - c = khc_space_from_handle(conf); - - if(khc_is_user_handle(conf)) - hku = khcint_space_open_key(c, KHM_PERM_READ); - - if(khc_is_machine_handle(conf)) - hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); - - size = (DWORD) *bufsize; - if(hku) { - hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_SZ) { - rv = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - *bufsize = size; - /* if buf==NULL, RegQueryValueEx will return success and just return the - required buffer size in 'size' */ - rv = (buf)? KHM_ERROR_SUCCESS: KHM_ERROR_TOO_LONG; - goto _exit; - } - } else { - if(hr == ERROR_MORE_DATA) { - *bufsize = size; - rv = KHM_ERROR_TOO_LONG; - goto _exit; - } - } - } - - size = (DWORD) *bufsize; - if(hkm) { - hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_SZ) { - rv = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - *bufsize = size; - rv = (buf)? KHM_ERROR_SUCCESS: KHM_ERROR_TOO_LONG; - goto _exit; - } - } else { - if(hr == ERROR_MORE_DATA) { - *bufsize = size; - rv = KHM_ERROR_TOO_LONG; - goto _exit; - } - } - } - - if(c->schema && khc_is_schema_handle(conf)) { - for(i=0;inSchema;i++) { - if(c->schema[i].type == KC_STRING && !wcscmp(value, c->schema[i].name)) { - /* found it */ - size_t cbsize = 0; - - if(!c->schema[i].value) { - rv = KHM_ERROR_NOT_FOUND; - goto _exit; - } - - if(FAILED(StringCbLength((wchar_t *) c->schema[i].value, KCONF_MAXCB_STRING, &cbsize))) { - rv = KHM_ERROR_NOT_FOUND; - goto _exit; - } - cbsize += sizeof(wchar_t); - - if(!buf || *bufsize < cbsize) { - *bufsize = cbsize; - rv = KHM_ERROR_TOO_LONG; - goto _exit; - } - - StringCbCopy(buf, *bufsize, (wchar_t *) c->schema[i].value); - *bufsize = cbsize; - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } - } - -_shadow: - if(free_space && conf) - khc_close_space(conf); - - if(khc_is_shadowed(pconf)) { - pconf = khc_shadow(pconf); - continue; - } else { - rv = KHM_ERROR_NOT_FOUND; - break; - } - -_exit: - if(free_space && conf) - khc_close_space(conf); - break; - - } while(TRUE); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_read_int32(khm_handle pconf, const wchar_t * pvalue, khm_int32 * buf) { - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!buf || !pvalue) - return KHM_ERROR_INVALID_PARAM; - - do { - DWORD size; - DWORD type; - LONG hr; - HKEY hku = NULL; - HKEY hkm = NULL; - - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - - int i; - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - if(KHM_FAILED(khc_open_space( - pconf, - pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - goto _shadow; - free_space = 1; -#if 0 - const wchar_t * back, * forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf) || !buf) - goto _shadow; - - c = khc_space_from_handle(conf); - - if(khc_is_user_handle(conf)) - hku = khcint_space_open_key(c, KHM_PERM_READ); - - if(khc_is_machine_handle(conf)) - hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); - - size = sizeof(DWORD); - if(hku) { - hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_DWORD) { - rv = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } - } - - size = sizeof(DWORD); - if(hkm) { - hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_DWORD) { - rv= KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - rv= KHM_ERROR_SUCCESS; - goto _exit; - } - } - } - - if(c->schema && khc_is_schema_handle(conf)) { - for(i=0;inSchema;i++) { - if(c->schema[i].type == KC_INT32 && !wcscmp(value, c->schema[i].name)) { - *buf = (khm_int32) c->schema[i].value; - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } - } -_shadow: - if(free_space && conf) - khc_close_space(conf); - - if(khc_is_shadowed(pconf)) { - pconf = khc_shadow(pconf); - continue; - } else { - rv = KHM_ERROR_NOT_FOUND; - break; - } -_exit: - if(free_space && conf) - khc_close_space(conf); - break; - } - while(TRUE); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_read_int64(khm_handle pconf, const wchar_t * pvalue, khm_int64 * buf) { - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - do { - DWORD size; - DWORD type; - LONG hr; - HKEY hku = NULL; - HKEY hkm = NULL; - - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - - int i; - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - if(KHM_FAILED(khc_open_space( - pconf, - pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - goto _shadow; - free_space = 1; -#if 0 - const wchar_t * back, *forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf) || !buf) - goto _shadow; - - c = khc_space_from_handle(conf); - - if(khc_is_user_handle(conf)) - hku = khcint_space_open_key(c, KHM_PERM_READ); - - if(khc_is_machine_handle(conf)) - hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); - - size = sizeof(khm_int64); - if(hku) { - hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_QWORD) { - rv= KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } - } - - size = sizeof(khm_int64); - if(hkm) { - hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_QWORD) { - rv = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } - } - - if(c->schema && khc_is_schema_handle(conf)) { - for(i=0;inSchema;i++) { - if(c->schema[i].type == KC_INT64 && !wcscmp(value, c->schema[i].name)) { - *buf = (khm_int64) c->schema[i].value; - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } - } - -_shadow: - if(free_space && conf) - khc_close_space(conf); - if(khc_is_shadowed(pconf)) { - pconf = khc_shadow(pconf); - continue; - } else { - rv = KHM_ERROR_NOT_FOUND; - break; - } - -_exit: - if(free_space && conf) - khc_close_space(conf); - break; - - } while(TRUE); - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_read_binary(khm_handle pconf, const wchar_t * pvalue, - void * buf, khm_size * bufsize) { - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - do { - DWORD size; - DWORD type; - LONG hr; - HKEY hku = NULL; - HKEY hkm = NULL; - - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - if(KHM_FAILED(khc_open_space( - pconf, - pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - goto _shadow; - free_space = 1; -#if 0 - const wchar_t * back, *forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf)) - goto _shadow; - - c = khc_space_from_handle(conf); - - if(khc_is_user_handle(conf)) - hku = khcint_space_open_key(c, KHM_PERM_READ); - - if(khc_is_machine_handle(conf)) - hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); - - size = (DWORD) *bufsize; - if(hku) { - hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_BINARY) { - rv = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - *bufsize = size; - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } else { - if(hr == ERROR_MORE_DATA) { - *bufsize = size; - rv = KHM_ERROR_TOO_LONG; - goto _exit; - } - } - } - - size = (DWORD) *bufsize; - if(hkm) { - hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); - if(hr == ERROR_SUCCESS) { - if(type != REG_BINARY) { - rv = KHM_ERROR_TYPE_MISMATCH; - goto _exit; - } - else { - *bufsize = size; - rv = KHM_ERROR_SUCCESS; - goto _exit; - } - } else { - if(hr == ERROR_MORE_DATA) { - *bufsize = size; - rv = KHM_ERROR_TOO_LONG; - goto _exit; - } - } - } - - /* binary values aren't supported in schema */ -_shadow: - if(free_space && conf) - khc_close_space(conf); - if(khc_is_shadowed(pconf)) { - pconf = khc_shadow(pconf); - continue; - } else { - rv = KHM_ERROR_NOT_FOUND; - break; - } - -_exit: - if(free_space && conf) - khc_close_space(conf); - break; - - }while (TRUE); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_write_string(khm_handle pconf, - const wchar_t * pvalue, - wchar_t * buf) -{ - HKEY pk = NULL; - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - LONG hr; - size_t cbsize; - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) - return KHM_ERROR_INVALID_OPERATION; - - if(FAILED(StringCbLength(buf, KCONF_MAXCB_STRING, &cbsize))) { - rv = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - cbsize += sizeof(wchar_t); - - if (khc_handle_flags(pconf) & KCONF_FLAG_WRITEIFMOD) { - wchar_t tmpbuf[512]; - wchar_t * buffer; - size_t tmpsize = cbsize; - khm_boolean is_equal = FALSE; - - if (cbsize <= sizeof(tmpbuf)) { - buffer = tmpbuf; - } else { - buffer = PMALLOC(cbsize); - } - - if (KHM_SUCCEEDED(khc_read_string(pconf, pvalue, buffer, &tmpsize)) && - tmpsize == cbsize) { - if (khc_handle_flags(pconf) & KCONF_FLAG_IFMODCI) - is_equal = !_wcsicmp(buffer, buf); - else - is_equal = !wcscmp(buffer, buf); - } - - if (buffer != tmpbuf) - PFREE(buffer); - - if (is_equal) { - return KHM_ERROR_SUCCESS; - } - } - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - if(KHM_FAILED(khc_open_space(pconf, pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - return KHM_ERROR_INVALID_PARAM; - free_space = 1; -#if 0 - const wchar_t * back, *forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf) || !buf) { - rv = KHM_ERROR_INVALID_PARAM; - goto _exit; - } - - c = khc_space_from_handle(conf); - - if(khc_is_user_handle(conf)) { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); - } else { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); - } - - hr = RegSetValueEx(pk, value, 0, REG_SZ, (LPBYTE) buf, (DWORD) cbsize); - - if(hr != ERROR_SUCCESS) - rv = KHM_ERROR_INVALID_OPERATION; - -_exit: - if(free_space) - khc_close_space(conf); - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_write_int32(khm_handle pconf, - const wchar_t * pvalue, - khm_int32 buf) -{ - HKEY pk = NULL; - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - LONG hr; - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) - return KHM_ERROR_INVALID_OPERATION; - - if (khc_handle_flags(pconf) & KCONF_FLAG_WRITEIFMOD) { - khm_int32 tmpvalue; - - if (KHM_SUCCEEDED(khc_read_int32(pconf, pvalue, &tmpvalue)) && - tmpvalue == buf) { - return KHM_ERROR_SUCCESS; - } - } - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - if(KHM_FAILED(khc_open_space( - pconf, - pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - return KHM_ERROR_INVALID_PARAM; - free_space = 1; -#if 0 - const wchar_t * back, *forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle( conf); - - if(khc_is_user_handle(conf)) { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); - } else { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); - } - - hr = RegSetValueEx(pk, value, 0, REG_DWORD, (LPBYTE) &buf, sizeof(khm_int32)); - - if(hr != ERROR_SUCCESS) - rv = KHM_ERROR_INVALID_OPERATION; - - if(free_space) - khc_close_space(conf); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_write_int64(khm_handle pconf, const wchar_t * pvalue, khm_int64 buf) { - HKEY pk = NULL; - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - LONG hr; - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) - return KHM_ERROR_INVALID_OPERATION; - - if (khc_handle_flags(pconf) & KCONF_FLAG_WRITEIFMOD) { - khm_int64 tmpvalue; - - if (KHM_SUCCEEDED(khc_read_int64(pconf, pvalue, &tmpvalue)) && - tmpvalue == buf) { - return KHM_ERROR_SUCCESS; - } - } - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - if(KHM_FAILED(khc_open_space( - pconf, - pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - return KHM_ERROR_INVALID_PARAM; - free_space = 1; -#if 0 - const wchar_t * back, *forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle( conf); - - if(khc_is_user_handle(conf)) { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); - } else { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); - } - - hr = RegSetValueEx(pk, value, 0, REG_QWORD, (LPBYTE) &buf, sizeof(khm_int64)); - - if(hr != ERROR_SUCCESS) - rv = KHM_ERROR_INVALID_OPERATION; - - if(free_space) - khc_close_space(conf); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_write_binary(khm_handle pconf, - const wchar_t * pvalue, - void * buf, khm_size bufsize) { - HKEY pk = NULL; - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - LONG hr; - const wchar_t * value = NULL; - int free_space = 0; - khm_handle conf = NULL; - - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) - return KHM_ERROR_INVALID_OPERATION; - - if(wcschr(pvalue, L'\\') -#if 0 - || wcschr(pvalue, L'/') -#endif - ) { - if(KHM_FAILED(khc_open_space( - pconf, - pvalue, - KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), - &conf))) - return KHM_ERROR_INVALID_PARAM; - free_space = 1; -#if 0 - const wchar_t * back, *forward; - - back = wcsrchr(pvalue, L'\\'); - forward = wcsrchr(pvalue, L'/'); - value = (back > forward)?back:forward; -#else - value = wcsrchr(pvalue, L'\\'); -#endif - } else { - value = pvalue; - conf = pconf; - free_space = 0; - } - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle(conf); - - if(khc_is_user_handle(conf)) { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); - } else { - pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); - } - - hr = RegSetValueEx(pk, value, 0, REG_BINARY, buf, (DWORD) bufsize); - - if(hr != ERROR_SUCCESS) - rv = KHM_ERROR_INVALID_OPERATION; - - if(free_space) - khc_close_space(conf); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_get_config_space_name(khm_handle conf, - wchar_t * buf, khm_size * bufsize) { - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle(conf); - - if(!c->name) { - if(buf && *bufsize > 0) - buf[0] = L'\0'; - else { - *bufsize = sizeof(wchar_t); - rv = KHM_ERROR_TOO_LONG; - } - } else { - size_t cbsize; - - if(FAILED(StringCbLength(c->name, KCONF_MAXCB_NAME, &cbsize))) - return KHM_ERROR_UNKNOWN; - - cbsize += sizeof(wchar_t); - - if(!buf || cbsize > *bufsize) { - *bufsize = cbsize; - rv = KHM_ERROR_TOO_LONG; - } else { - StringCbCopy(buf, *bufsize, c->name); - *bufsize = cbsize; - } - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_get_config_space_parent(khm_handle conf, khm_handle * parent) { - kconf_conf_space * c; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle(conf); - - if(c == conf_root || c->parent == conf_root) - *parent = NULL; - else - *parent = khcint_handle_from_space(c->parent, khc_handle_flags(conf)); - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khc_get_type(khm_handle conf, const wchar_t * value) { - HKEY hkm = NULL; - HKEY hku = NULL; - kconf_conf_space * c; - khm_int32 rv; - LONG hr = ERROR_SUCCESS; - DWORD type = 0; - - if(!khc_is_config_running()) - return KC_NONE; - - if(!khc_is_handle(conf)) - return KC_NONE; - - c = (kconf_conf_space *) conf; - - if(!khc_is_machine_handle(conf)) - hku = khcint_space_open_key(c, KHM_PERM_READ); - hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); - - if(hku) - hr = RegQueryValueEx(hku, value, NULL, &type, NULL, NULL); - if(!hku || hr != ERROR_SUCCESS) - hr = RegQueryValueEx(hkm, value, NULL, &type, NULL, NULL); - if(((!hku && !hkm) || hr != ERROR_SUCCESS) && c->schema) { - int i; - - for(i=0; inSchema; i++) { - if(!wcscmp(c->schema[i].name, value)) { - return c->schema[i].type; - } - } - - return KC_NONE; - } - - switch(type) { - case REG_MULTI_SZ: - case REG_SZ: - rv = KC_STRING; - break; - case REG_DWORD: - rv = KC_INT32; - break; - case REG_QWORD: - rv = KC_INT64; - break; - case REG_BINARY: - rv = KC_BINARY; - break; - default: - rv = KC_NONE; - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_value_exists(khm_handle conf, const wchar_t * value) { - HKEY hku = NULL; - HKEY hkm = NULL; - kconf_conf_space * c; - khm_int32 rv = 0; - DWORD t; - int i; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle(conf); - - if (khc_is_user_handle(conf)) - hku = khcint_space_open_key(c, KHM_PERM_READ); - if (khc_is_machine_handle(conf)) - hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); - - if(hku && (RegQueryValueEx(hku, value, NULL, &t, NULL, NULL) == ERROR_SUCCESS)) - rv |= KCONF_FLAG_USER; - if(hkm && (RegQueryValueEx(hkm, value, NULL, &t, NULL, NULL) == ERROR_SUCCESS)) - rv |= KCONF_FLAG_MACHINE; - - if(c->schema && khc_is_schema_handle(conf)) { - for(i=0; inSchema; i++) { - if(!wcscmp(c->schema[i].name, value)) { - rv |= KCONF_FLAG_SCHEMA; - break; - } - } - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_remove_value(khm_handle conf, const wchar_t * value, khm_int32 flags) { - HKEY hku = NULL; - HKEY hkm = NULL; - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_NOT_FOUND; - DWORD t; - LONG l; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle(conf); - - if(!khc_is_machine_handle(conf)) - hku = khcint_space_open_key(c, KHM_PERM_READ); - hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); - - if((flags == 0 || - (flags & KCONF_FLAG_USER)) && - hku && (RegQueryValueEx(hku, value, NULL, - &t, NULL, NULL) == ERROR_SUCCESS)) { - l = RegDeleteValue(hku, value); - if (l == ERROR_SUCCESS) - rv = KHM_ERROR_SUCCESS; - else - rv = KHM_ERROR_UNKNOWN; - } - if((flags == 0 || - (flags & KCONF_FLAG_MACHINE)) && - hkm && (RegQueryValueEx(hkm, value, NULL, - &t, NULL, NULL) == ERROR_SUCCESS)) { - l = RegDeleteValue(hkm, value); - if (l == ERROR_SUCCESS) - rv = (rv == KHM_ERROR_UNKNOWN)?KHM_ERROR_PARTIAL: - KHM_ERROR_SUCCESS; - else - rv = (rv == KHM_ERROR_SUCCESS)?KHM_ERROR_PARTIAL: - KHM_ERROR_UNKNOWN; - } - - return rv; -} - -/* called with cs_conf_global held */ -khm_int32 -khcint_remove_space(kconf_conf_space * c, khm_int32 flags) { - kconf_conf_space * cc; - kconf_conf_space * cn; - kconf_conf_space * p; - - /* TODO: if this is the last child space and the parent is marked - for deletion, delete the parent as well. */ - - p = TPARENT(c); - - /* We don't allow deleting top level keys. They are - predefined. */ -#ifdef DEBUG - assert(p); -#endif - if (!p) - return KHM_ERROR_INVALID_OPERATION; - - cc = TFIRSTCHILD(c); - while (cc) { - cn = LNEXT(cc); - - khcint_remove_space(cc, flags); - - cc = cn; - } - - cc = TFIRSTCHILD(c); - if (!cc && c->refcount == 0) { - TDELCHILD(p, c); - khcint_free_space(c); - } else { - c->flags |= (flags & - (KCONF_SPACE_FLAG_DELETE_M | - KCONF_SPACE_FLAG_DELETE_U)); - - /* if all the registry spaces have been marked as deleted and - there is no schema, we should mark the space as deleted as - well. Note that ideally we only need to check for stores - which have data corresponding to this configuration space, - but this is a bit problematic since we don't monitor the - registry for changes. */ - if ((c->flags & - (KCONF_SPACE_FLAG_DELETE_M | - KCONF_SPACE_FLAG_DELETE_U)) == - (KCONF_SPACE_FLAG_DELETE_M | - KCONF_SPACE_FLAG_DELETE_U) && - (!c->schema || c->nSchema == 0)) - - c->flags |= KCONF_SPACE_FLAG_DELETED; - } - - if (c->regpath && p->regpath) { - HKEY hk; - - if (flags & KCONF_SPACE_FLAG_DELETE_U) { - hk = khcint_space_open_key(p, KCONF_FLAG_USER); - - if (hk) - khcint_RegDeleteKey(hk, c->name); - } - if (flags & KCONF_SPACE_FLAG_DELETE_M) { - hk = khcint_space_open_key(p, KCONF_FLAG_MACHINE); - - if (hk) - khcint_RegDeleteKey(hk, c->name); - } - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khc_remove_space(khm_handle conf) { - - /* - - mark this space as well as all child spaces as - 'delete-on-close' using flags. Mark should indicate which - repository to delete the space from. (user/machine) - - - When each subspace is released, check if it has been marked - for deletion. If so, delete the marked spaces as well as - removing the space from kconf space tree. - - - When removing a subspace from a space, check if the parent - space has any children left. If there are none, check if the - parent space is also marked for deletion. - */ - kconf_conf_space * c; - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_int32 flags = 0; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - c = khc_space_from_handle(conf); - - EnterCriticalSection(&cs_conf_global); - - if (khc_is_machine_handle(conf)) - flags |= KCONF_SPACE_FLAG_DELETE_M; - if (khc_is_user_handle(conf)) - flags |= KCONF_SPACE_FLAG_DELETE_U; - - rv = khcint_remove_space(c, flags); - - LeaveCriticalSection(&cs_conf_global); - - return rv; -} - -khm_boolean -khcint_is_valid_name(wchar_t * name) -{ - size_t cbsize; - if(FAILED(StringCbLength(name, KCONF_MAXCB_NAME, &cbsize))) - return FALSE; - return TRUE; -} - -khm_int32 -khcint_validate_schema(const kconf_schema * schema, - int begin, - int *end) -{ - int i; - int state = 0; - int end_found = 0; - - i=begin; - while(!end_found) { - switch(state) { - case 0: /* initial. this record should start a config space */ - if(!khcint_is_valid_name(schema[i].name) || - schema[i].type != KC_SPACE) - return KHM_ERROR_INVALID_PARAM; - state = 1; - break; - - case 1: /* we are inside a config space, in the values area */ - if(!khcint_is_valid_name(schema[i].name)) - return KHM_ERROR_INVALID_PARAM; - if(schema[i].type == KC_SPACE) { - if(KHM_FAILED(khcint_validate_schema(schema, i, &i))) - return KHM_ERROR_INVALID_PARAM; - state = 2; - } else if(schema[i].type == KC_ENDSPACE) { - end_found = 1; - if(end) - *end = i; - } else { - if(schema[i].type != KC_STRING && - schema[i].type != KC_INT32 && - schema[i].type != KC_INT64 && - schema[i].type != KC_BINARY) - return KHM_ERROR_INVALID_PARAM; - } - break; - - case 2: /* we are inside a config space, in the subspace area */ - if(schema[i].type == KC_SPACE) { - if(KHM_FAILED(khcint_validate_schema(schema, i, &i))) - return KHM_ERROR_INVALID_PARAM; - } else if(schema[i].type == KC_ENDSPACE) { - end_found = 1; - if(end) - *end = i; - } else { - return KHM_ERROR_INVALID_PARAM; - } - break; - - default: - /* unreachable */ - return KHM_ERROR_INVALID_PARAM; - } - i++; - } - - return KHM_ERROR_SUCCESS; -} - -khm_int32 -khcint_load_schema_i(khm_handle parent, const kconf_schema * schema, - int begin, int * end) -{ - int i; - int state = 0; - int end_found = 0; - kconf_conf_space * thisconf = NULL; - khm_handle h = NULL; - - i=begin; - while(!end_found) { - switch(state) { - case 0: /* initial. this record should start a config space */ - if(KHM_FAILED(khc_open_space(parent, schema[i].name, - KHM_FLAG_CREATE, &h))) - return KHM_ERROR_INVALID_PARAM; - thisconf = khc_space_from_handle(h); - thisconf->schema = schema + (begin + 1); - state = 1; - break; - - case 1: /* we are inside a config space, in the values area */ - if(schema[i].type == KC_SPACE) { - thisconf->nSchema = i - (begin + 1); - if(KHM_FAILED(khcint_load_schema_i(h, schema, i, &i))) - return KHM_ERROR_INVALID_PARAM; - state = 2; - } else if(schema[i].type == KC_ENDSPACE) { - thisconf->nSchema = i - (begin + 1); - end_found = 1; - if(end) - *end = i; - khc_close_space(h); - } - break; - - case 2: /* we are inside a config space, in the subspace area */ - if(schema[i].type == KC_SPACE) { - if(KHM_FAILED(khcint_load_schema_i(h, schema, i, &i))) - return KHM_ERROR_INVALID_PARAM; - } else if(schema[i].type == KC_ENDSPACE) { - end_found = 1; - if(end) - *end = i; - khc_close_space(h); - } else { - return KHM_ERROR_INVALID_PARAM; - } - break; - - default: - /* unreachable */ - return KHM_ERROR_INVALID_PARAM; - } - i++; - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khc_load_schema(khm_handle conf, const kconf_schema * schema) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(conf && !khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - if(KHM_FAILED(khcint_validate_schema(schema, 0, NULL))) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_conf_global); - rv = khcint_load_schema_i(conf, schema, 0, NULL); - LeaveCriticalSection(&cs_conf_global); - - return rv; -} - -khm_int32 -khcint_unload_schema_i(khm_handle parent, const kconf_schema * schema, - int begin, int * end) -{ - int i; - int state = 0; - int end_found = 0; - kconf_conf_space * thisconf = NULL; - khm_handle h = NULL; - - i=begin; - while(!end_found) { - switch(state) { - case 0: /* initial. this record should start a config space */ - if(KHM_FAILED(khc_open_space(parent, schema[i].name, 0, &h))) - return KHM_ERROR_INVALID_PARAM; - thisconf = khc_space_from_handle(h); - if(thisconf->schema == (schema + (begin + 1))) { - thisconf->schema = NULL; - thisconf->nSchema = 0; - } - state = 1; - break; - - case 1: /* we are inside a config space, in the values area */ - if(schema[i].type == KC_SPACE) { - if(KHM_FAILED(khcint_unload_schema_i(h, schema, i, &i))) - return KHM_ERROR_INVALID_PARAM; - state = 2; - } else if(schema[i].type == KC_ENDSPACE) { - end_found = 1; - if(end) - *end = i; - khc_close_space(h); - } - break; - - case 2: /* we are inside a config space, in the subspace area */ - if(schema[i].type == KC_SPACE) { - if(KHM_FAILED(khcint_unload_schema_i(h, schema, i, &i))) - return KHM_ERROR_INVALID_PARAM; - } else if(schema[i].type == KC_ENDSPACE) { - end_found = 1; - if(end) - *end = i; - khc_close_space(h); - } else { - return KHM_ERROR_INVALID_PARAM; - } - break; - - default: - /* unreachable */ - return KHM_ERROR_INVALID_PARAM; - } - i++; - } - - return KHM_ERROR_SUCCESS; -} - -KHMEXP khm_int32 KHMAPI -khc_unload_schema(khm_handle conf, const kconf_schema * schema) -{ - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(conf && !khc_is_handle(conf)) - return KHM_ERROR_INVALID_PARAM; - - if(KHM_FAILED(khcint_validate_schema(schema, 0, NULL))) - return KHM_ERROR_INVALID_PARAM; - - EnterCriticalSection(&cs_conf_global); - rv = khcint_unload_schema_i(conf, schema, 0, NULL); - LeaveCriticalSection(&cs_conf_global); - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_enum_subspaces(khm_handle conf, - khm_handle prev, - khm_handle * next) -{ - kconf_conf_space * s; - kconf_conf_space * c; - kconf_conf_space * p; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!khc_is_handle(conf) || next == NULL || - (prev != NULL && !khc_is_handle(prev))) - return KHM_ERROR_INVALID_PARAM; - - s = khc_space_from_handle(conf); - - if(prev == NULL) { - /* first off, we enumerate all the registry spaces regardless of - whether the handle is applicable for some registry space or not. - See notes for khc_begin_enum_subspaces() for reasons as to why - this is done (notes are in kconfig.h)*/ - - /* go through the user hive first */ - { - HKEY hk_conf; - - hk_conf = khcint_space_open_key(s, 0); - if(hk_conf) { - wchar_t name[KCONF_MAXCCH_NAME]; - khm_handle h; - int idx; - - idx = 0; - while(RegEnumKey(hk_conf, idx, - name, ARRAYLENGTH(name)) == ERROR_SUCCESS) { - wchar_t * tilde; - tilde = wcschr(name, L'~'); - if (tilde) - *tilde = 0; - if(KHM_SUCCEEDED(khc_open_space(conf, name, 0, &h))) - khc_close_space(h); - idx++; - } - } - } - - /* go through the machine hive next */ - { - HKEY hk_conf; - - hk_conf = khcint_space_open_key(s, KCONF_FLAG_MACHINE); - if(hk_conf) { - wchar_t name[KCONF_MAXCCH_NAME]; - khm_handle h; - int idx; - - idx = 0; - while(RegEnumKey(hk_conf, idx, - name, ARRAYLENGTH(name)) == ERROR_SUCCESS) { - wchar_t * tilde; - tilde = wcschr(name, L'~'); - if (tilde) - *tilde = 0; - - if(KHM_SUCCEEDED(khc_open_space(conf, name, - KCONF_FLAG_MACHINE, &h))) - khc_close_space(h); - idx++; - } - } - } - - /* don't need to go through schema, because that was already - done when the schema was loaded. */ - } - - /* at last we are now ready to return the results */ - EnterCriticalSection(&cs_conf_global); - if(prev == NULL) { - c = TFIRSTCHILD(s); - rv = KHM_ERROR_SUCCESS; - } else { - p = khc_space_from_handle(prev); - if(TPARENT(p) == s) - c = LNEXT(p); - else - c = NULL; - } - LeaveCriticalSection(&cs_conf_global); - - if(prev != NULL) - khc_close_space(prev); - - if(c) { - *next = khcint_handle_from_space(c, khc_handle_flags(conf)); - rv = KHM_ERROR_SUCCESS; - } else { - *next = NULL; - rv = KHM_ERROR_NOT_FOUND; - } - - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_write_multi_string(khm_handle conf, const wchar_t * value, wchar_t * buf) -{ - size_t cb; - wchar_t vbuf[KCONF_MAXCCH_STRING]; - wchar_t *tb; - khm_int32 rv; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - if(!khc_is_handle(conf) || buf == NULL || value == NULL) - return KHM_ERROR_INVALID_PARAM; - - if(multi_string_to_csv(NULL, &cb, buf) != KHM_ERROR_TOO_LONG) - return KHM_ERROR_INVALID_PARAM; - - if (cb < sizeof(vbuf)) - tb = vbuf; - else - tb = PMALLOC(cb); - - assert(tb != NULL); - - multi_string_to_csv(tb, &cb, buf); - rv = khc_write_string(conf, value, tb); - - if (tb != vbuf) - PFREE(tb); - return rv; -} - -KHMEXP khm_int32 KHMAPI -khc_read_multi_string(khm_handle conf, const wchar_t * value, - wchar_t * buf, khm_size * bufsize) -{ - wchar_t vbuf[KCONF_MAXCCH_STRING]; - wchar_t * tb; - khm_size cbbuf; - khm_int32 rv = KHM_ERROR_SUCCESS; - - if(!khc_is_config_running()) - return KHM_ERROR_NOT_READY; - - if(!bufsize) - return KHM_ERROR_INVALID_PARAM; - - rv = khc_read_string(conf, value, NULL, &cbbuf); - if(rv != KHM_ERROR_TOO_LONG) - return rv; - - if (cbbuf < sizeof(vbuf)) - tb = vbuf; - else - tb = PMALLOC(cbbuf); - - assert(tb != NULL); - - rv = khc_read_string(conf, value, tb, &cbbuf); - - if(KHM_FAILED(rv)) - goto _exit; - - rv = csv_to_multi_string(buf, bufsize, tb); - -_exit: - if (tb != vbuf) - PFREE(tb); - - return rv; -} +/* +* Copyright (c) 2005 Massachusetts Institute of Technology +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, +* modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/* $Id$ */ + +#include +#include +#include + +kconf_conf_space * conf_root = NULL; +kconf_handle * conf_handles = NULL; +kconf_handle * conf_free_handles = NULL; + +CRITICAL_SECTION cs_conf_global; +CRITICAL_SECTION cs_conf_handle; +LONG conf_init = 0; +LONG conf_status = 0; + +void init_kconf(void) { + if(InterlockedIncrement(&conf_init) == 1L) { + /* we are the first */ + InitializeCriticalSection(&cs_conf_global); + EnterCriticalSection(&cs_conf_global); + conf_root = khcint_create_empty_space(); + conf_root->name = PWCSDUP(L"Root"); + conf_root->regpath = PWCSDUP(CONFIG_REGPATHW); + conf_root->refcount++; + conf_status = 1; + InitializeCriticalSection(&cs_conf_handle); + LeaveCriticalSection(&cs_conf_global); + } + /* else assume we are already initialized */ +} + +void exit_kconf(void) { + if(khc_is_config_running()) { + kconf_handle * h; + + EnterCriticalSection(&cs_conf_global); + + conf_init = 0; + conf_status = 0; + + khcint_free_space(conf_root); + + EnterCriticalSection(&cs_conf_handle); + while(conf_free_handles) { + LPOP(&conf_free_handles, &h); + if(h) { + PFREE(h); + } + } + + while(conf_handles) { + LPOP(&conf_handles, &h); + if(h) { + PFREE(h); + } + } + LeaveCriticalSection(&cs_conf_handle); + DeleteCriticalSection(&cs_conf_handle); + + LeaveCriticalSection(&cs_conf_global); + DeleteCriticalSection(&cs_conf_global); + } +} + +kconf_handle * +khcint_handle_from_space(kconf_conf_space * s, khm_int32 flags) +{ + kconf_handle * h; + + EnterCriticalSection(&cs_conf_handle); + LPOP(&conf_free_handles, &h); + if(!h) { + h = PMALLOC(sizeof(kconf_handle)); + assert(h != NULL); + } + ZeroMemory((void *) h, sizeof(kconf_handle)); + + h->magic = KCONF_HANDLE_MAGIC; + khcint_space_hold(s); + h->space = s; + h->flags = flags; + + LPUSH(&conf_handles, h); + LeaveCriticalSection(&cs_conf_handle); + + return h; +} + +/* must be called with cs_conf_global held */ +void +khcint_handle_free(kconf_handle * h) +{ + kconf_handle * lower; + + EnterCriticalSection(&cs_conf_handle); +#ifdef DEBUG + /* check if the handle is actually in use */ + { + kconf_handle * a; + a = conf_handles; + while(a) { + if(h == a) + break; + a = LNEXT(a); + } + + if(a == NULL) { + DebugBreak(); + } + } +#endif + while(h) { + LDELETE(&conf_handles, h); + if(h->space) { + khcint_space_release(h->space); + h->space = NULL; + } + lower = h->lower; + LPUSH(&conf_free_handles, h); + h = lower; + } + LeaveCriticalSection(&cs_conf_handle); +} + +kconf_handle * +khcint_handle_dup(kconf_handle * o) +{ + kconf_handle * h; + kconf_handle * r; + + r = khcint_handle_from_space(o->space, o->flags); + h = r; + + while(o->lower) { + h->lower = khcint_handle_from_space(o->lower->space, o->lower->flags); + + o = o->lower; + h = h->lower; + } + + return r; +} + +void +khcint_space_hold(kconf_conf_space * s) { + EnterCriticalSection(&cs_conf_global); + s->refcount ++; + LeaveCriticalSection(&cs_conf_global); +} + +void +khcint_space_release(kconf_conf_space * s) { + khm_int32 l; + + EnterCriticalSection(&cs_conf_global); + + l = -- s->refcount; + if (l == 0) { + if(s->regkey_machine) + RegCloseKey(s->regkey_machine); + if(s->regkey_user) + RegCloseKey(s->regkey_user); + s->regkey_machine = NULL; + s->regkey_user = NULL; + + if (s->flags & + (KCONF_SPACE_FLAG_DELETE_M | + KCONF_SPACE_FLAG_DELETE_U)) { + khcint_remove_space(s, s->flags); + } + } + + LeaveCriticalSection(&cs_conf_global); +} + +/* case sensitive replacement for RegOpenKeyEx */ +LONG +khcint_RegOpenKeyEx(HKEY hkey, LPCWSTR sSubKey, DWORD ulOptions, + REGSAM samDesired, PHKEY phkResult) { + int i; + wchar_t sk_name[KCONF_MAXCCH_NAME]; + FILETIME ft; + size_t cch; + HKEY hkp = NULL; + const wchar_t * t; + LONG rv = ERROR_SUCCESS; + + hkp = hkey; + t = sSubKey; + + /* check for case insensitive prefix first */ + if (!_wcsnicmp(sSubKey, CONFIG_REGPATHW, ARRAYLENGTH(CONFIG_REGPATHW) - 1)) { + HKEY hkt; + + t = sSubKey + (ARRAYLENGTH(CONFIG_REGPATHW) - 1); + +#ifdef DEBUG + assert(*t == L'\0' || *t == L'\\'); +#endif + + rv = RegOpenKeyEx(hkp, + CONFIG_REGPATHW, + ulOptions, + samDesired, + &hkt); + + if (rv != ERROR_SUCCESS) + return rv; + + if (*t == L'\0') { + *phkResult = hkt; + return rv; + } + + t++; + hkp = hkt; + } + + /* descend down the components of the subkey */ + while(TRUE) { + wchar_t * slash; + HKEY hkt; + + slash = wcschr(t, L'\\'); + if (slash == NULL) + break; + + if (FAILED(StringCchCopyN(sk_name, ARRAYLENGTH(sk_name), + t, slash - t))) { + rv = ERROR_CANTOPEN; + goto _cleanup; + } + + sk_name[slash - t] = L'\0'; + t = slash+1; + + if (khcint_RegOpenKeyEx(hkp, sk_name, ulOptions, samDesired, &hkt) == + ERROR_SUCCESS) { + + if (hkp != hkey) + RegCloseKey(hkp); + hkp = hkt; + + } else { + + rv = ERROR_CANTOPEN; + goto _cleanup; + + } + } + + /* by now hkp is a handle to the parent of the last component in + the subkey. t is a pointer to the last component. */ + + if (FAILED(StringCchLength(t, KCONF_MAXCCH_NAME, &cch))) { + rv = ERROR_CANTOPEN; + goto _cleanup; + } + + /* go through and find the case sensitive match for the key */ + + for (i=0; ;i++) { + LONG l; + DWORD dw; + + dw = ARRAYLENGTH(sk_name); + l = RegEnumKeyEx(hkp, i, sk_name, &dw, + NULL, NULL, NULL, &ft); + + if (l != ERROR_SUCCESS) { + rv = ERROR_CANTOPEN; + goto _cleanup; + } + + if (!(wcsncmp(sk_name, t, cch))) { + /* bingo! ?? */ + if (cch < KCONF_MAXCCH_NAME && + (sk_name[cch] == L'\0' || + sk_name[cch] == L'~')) { + rv = RegOpenKeyEx(hkp, sk_name, ulOptions, + samDesired, phkResult); + goto _cleanup; + } + } + } + + _cleanup: + if (hkp != hkey && hkp != NULL) + RegCloseKey(hkp); + + return rv; +} + +/*! \internal + + \note This function is not a good replacement for RegDeleteKey since + it deletes all the subkeys in addition to the key being deleted. + */ +LONG +khcint_RegDeleteKey(HKEY hKey, + LPCWSTR lpSubKey) { + int i; + wchar_t sk_name[KCONF_MAXCCH_NAME]; + FILETIME ft; + size_t cch; + LONG rv = ERROR_SUCCESS; + + /* go through and find the case sensitive match for the key */ + + if (FAILED(StringCchLength(lpSubKey, KCONF_MAXCCH_NAME, &cch))) + return ERROR_BADKEY; + + for (i=0; ;i++) { + LONG l; + DWORD dw; + + dw = ARRAYLENGTH(sk_name); + l = RegEnumKeyEx(hKey, i, sk_name, &dw, + NULL, NULL, NULL, &ft); + + if (l != ERROR_SUCCESS) { + rv = ERROR_BADKEY; + goto _cleanup; + } + + if (!(wcsncmp(sk_name, lpSubKey, cch))) { + /* bingo! ?? */ + if ((sk_name[cch] == L'\0' || + sk_name[cch] == L'~')) { + + /* instead of calling RegDeleteKey we call SHDeleteKey + because we want to blow off all the subkeys as + well. This is different from the behavior of + RegDeleteKey making khcint_RegDeleteKey not a very + good case sensitive replacement for + RegDeleteKey. */ + + rv = SHDeleteKey(hKey, sk_name); + goto _cleanup; + } + } + } + + _cleanup: + return rv; +} + +LONG +khcint_RegCreateKeyEx(HKEY hKey, + LPCWSTR lpSubKey, + DWORD Reserved, + LPWSTR lpClass, + DWORD dwOptions, + REGSAM samDesired, + LPSECURITY_ATTRIBUTES lpSecurityAttributes, + PHKEY phkResult, + LPDWORD lpdwDisposition) { + LONG l; + int i; + long index = 0; + wchar_t sk_name[KCONF_MAXCCH_NAME]; /* hard limit in Windows */ + FILETIME ft; + size_t cch; + const wchar_t * t; + LONG rv = ERROR_SUCCESS; + HKEY hkp = NULL; + + hkp = hKey; + t = lpSubKey; + + /* check for case insensitive prefix first */ + if (!_wcsnicmp(lpSubKey, CONFIG_REGPATHW, ARRAYLENGTH(CONFIG_REGPATHW) - 1)) { + HKEY hkt; + + t = lpSubKey + (ARRAYLENGTH(CONFIG_REGPATHW) - 1); + +#ifdef DEBUG + assert(*t == L'\0' || *t == L'\\'); +#endif + + rv = RegCreateKeyEx(hkp, + CONFIG_REGPATHW, + Reserved, + lpClass, + dwOptions, + samDesired, + lpSecurityAttributes, + &hkt, + lpdwDisposition); + + if (rv != ERROR_SUCCESS) + return rv; + + if (*t == L'\0') { + *phkResult = hkt; + return rv; + } + + t++; + hkp = hkt; + } + + while(TRUE) { + wchar_t * slash; + HKEY hkt; + + slash = wcschr(t, L'\\'); + if (slash == NULL) + break; + + if (FAILED(StringCchCopyN(sk_name, ARRAYLENGTH(sk_name), + t, slash - t))) { + rv = ERROR_CANTOPEN; + goto _cleanup; + } + + sk_name[slash - t] = L'\0'; + t = slash+1; + + if (khcint_RegOpenKeyEx(hkp, sk_name, 0, samDesired, &hkt) == + ERROR_SUCCESS) { + + if (hkp != hKey) + RegCloseKey(hkp); + hkp = hkt; + } else { + + rv = RegCreateKeyEx(hKey, + lpSubKey, + Reserved, + lpClass, + dwOptions, + samDesired, + lpSecurityAttributes, + phkResult, + lpdwDisposition); + goto _cleanup; + } + } + + if (FAILED(StringCchLength(t, KCONF_MAXCCH_NAME, &cch))) { + rv = ERROR_CANTOPEN; + goto _cleanup; + } + + for (i=0; ;i++) { + DWORD dw; + + dw = ARRAYLENGTH(sk_name); + l = RegEnumKeyEx(hkp, i, sk_name, &dw, + NULL, NULL, NULL, &ft); + + if (l != ERROR_SUCCESS) + break; + + if (!(wcsncmp(sk_name, t, cch))) { + /* bingo! ?? */ + if (sk_name[cch] == L'\0' || + sk_name[cch] == L'~') { + l = RegOpenKeyEx(hkp, sk_name, 0, + samDesired, phkResult); + if (l == ERROR_SUCCESS && lpdwDisposition) + *lpdwDisposition = REG_OPENED_EXISTING_KEY; + rv = l; + goto _cleanup; + } + } + + if (!_wcsnicmp(sk_name, t, cch) && + (sk_name[cch] == L'\0' || + sk_name[cch] == L'~')) { + long new_idx; + + if (sk_name[cch] == L'\0') + new_idx = 1; + else if (cch + 1 < KCONF_MAXCCH_NAME) + new_idx = wcstol(sk_name + (cch + 1), NULL, 10); + else + return ERROR_BUFFER_OVERFLOW; + + assert(new_idx > 0); + + if (new_idx > index) + index = new_idx; + } + } + + if (index != 0) { + if (FAILED(StringCbPrintf(sk_name, sizeof(sk_name), + L"%s~%d", t, index))) + return ERROR_BUFFER_OVERFLOW; + } else { + StringCbCopy(sk_name, sizeof(sk_name), t); + } + + rv = RegCreateKeyEx(hkp, + sk_name, + Reserved, + lpClass, + dwOptions, + samDesired, + lpSecurityAttributes, + phkResult, + lpdwDisposition); + + _cleanup: + + if (hkp != hKey && hkp != NULL) + RegCloseKey(hkp); + + return rv; +} + + +HKEY +khcint_space_open_key(kconf_conf_space * s, khm_int32 flags) { + HKEY hk = NULL; + int nflags = 0; + DWORD disp; + if(flags & KCONF_FLAG_MACHINE) { + if(s->regkey_machine) + return s->regkey_machine; + if((khcint_RegOpenKeyEx(HKEY_LOCAL_MACHINE, s->regpath, 0, + KEY_READ | KEY_WRITE, &hk) != + ERROR_SUCCESS) && + !(flags & KHM_PERM_WRITE)) { + + if(khcint_RegOpenKeyEx(HKEY_LOCAL_MACHINE, s->regpath, 0, + KEY_READ, &hk) == ERROR_SUCCESS) { + nflags = KHM_PERM_READ; + } + + } + if(!hk && (flags & KHM_FLAG_CREATE)) { + + khcint_RegCreateKeyEx(HKEY_LOCAL_MACHINE, + s->regpath, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, + &hk, + &disp); + } + if(hk) { + EnterCriticalSection(&cs_conf_global); + s->regkey_machine = hk; + s->regkey_machine_flags = nflags; + LeaveCriticalSection(&cs_conf_global); + } + + return hk; + } else { + if(s->regkey_user) + return s->regkey_user; + if((khcint_RegOpenKeyEx(HKEY_CURRENT_USER, s->regpath, 0, + KEY_READ | KEY_WRITE, &hk) != + ERROR_SUCCESS) && + !(flags & KHM_PERM_WRITE)) { + if(khcint_RegOpenKeyEx(HKEY_CURRENT_USER, s->regpath, 0, + KEY_READ, &hk) == ERROR_SUCCESS) { + nflags = KHM_PERM_READ; + } + } + if(!hk && (flags & KHM_FLAG_CREATE)) { + khcint_RegCreateKeyEx(HKEY_CURRENT_USER, + s->regpath, 0, NULL, + REG_OPTION_NON_VOLATILE, + KEY_READ | KEY_WRITE, + NULL, &hk, &disp); + } + if(hk) { + EnterCriticalSection(&cs_conf_global); + s->regkey_user = hk; + s->regkey_user_flags = nflags; + LeaveCriticalSection(&cs_conf_global); + } + + return hk; + } +} + +KHMEXP khm_int32 KHMAPI +khc_shadow_space(khm_handle upper, khm_handle lower) +{ + kconf_handle * h; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(upper)) + return KHM_ERROR_INVALID_PARAM; + + h = (kconf_handle *) upper; + + EnterCriticalSection(&cs_conf_handle); + if(h->lower) { + LeaveCriticalSection(&cs_conf_handle); + EnterCriticalSection(&cs_conf_global); + khcint_handle_free(h->lower); + LeaveCriticalSection(&cs_conf_global); + EnterCriticalSection(&cs_conf_handle); + h->lower = NULL; + } + + if(khc_is_handle(lower)) { + kconf_handle * l; + kconf_handle * lc; + + l = (kconf_handle *) lower; + LeaveCriticalSection(&cs_conf_handle); + lc = khcint_handle_dup(l); + EnterCriticalSection(&cs_conf_handle); + h->lower = lc; + } + LeaveCriticalSection(&cs_conf_handle); + + return KHM_ERROR_SUCCESS; +} + +kconf_conf_space * +khcint_create_empty_space(void) { + kconf_conf_space * r; + + r = PMALLOC(sizeof(kconf_conf_space)); + assert(r != NULL); + ZeroMemory(r,sizeof(kconf_conf_space)); + + return r; +} + +void +khcint_free_space(kconf_conf_space * r) { + kconf_conf_space * c; + + if(!r) + return; + + LPOP(&r->children, &c); + while(c) { + khcint_free_space(c); + LPOP(&r->children, &c); + } + + if(r->name) + PFREE(r->name); + + if(r->regpath) + PFREE(r->regpath); + + if(r->regkey_machine) + RegCloseKey(r->regkey_machine); + + if(r->regkey_user) + RegCloseKey(r->regkey_user); + + PFREE(r); +} + +khm_int32 +khcint_open_space(kconf_conf_space * parent, + const wchar_t * sname, size_t n_sname, + khm_int32 flags, kconf_conf_space **result) { + kconf_conf_space * p; + kconf_conf_space * c; + HKEY pkey = NULL; + HKEY ckey = NULL; + wchar_t buf[KCONF_MAXCCH_NAME]; + size_t cb_regpath = 0; + + if(!parent) + p = conf_root; + else + p = parent; + + if(n_sname >= KCONF_MAXCCH_NAME || n_sname <= 0) + return KHM_ERROR_INVALID_PARAM; + + StringCchCopyN(buf, ARRAYLENGTH(buf), sname, n_sname); + + /* see if there is already a config space by this name. if so, + return it. Note that if the configuration space is specified + in a schema, we would find it here. */ + EnterCriticalSection(&cs_conf_global); + c = TFIRSTCHILD(p); + while(c) { + if(c->name && !wcscmp(c->name, buf)) + break; + + c = LNEXT(c); + } + LeaveCriticalSection(&cs_conf_global); + + if(c) { + + if (c->flags & KCONF_SPACE_FLAG_DELETED) { + if (flags & KHM_FLAG_CREATE) { + c->flags &= ~(KCONF_SPACE_FLAG_DELETED | + KCONF_SPACE_FLAG_DELETE_M | + KCONF_SPACE_FLAG_DELETE_U); + } else { + *result = NULL; + return KHM_ERROR_NOT_FOUND; + } + } + + khcint_space_hold(c); + *result = c; + return KHM_ERROR_SUCCESS; + } + + if(!(flags & KHM_FLAG_CREATE)) { + + /* we are not creating the space, so it must exist in the form of a + registry key in HKLM or HKCU. If it existed as a schema, we + would have already retured it above. */ + + if (flags & KCONF_FLAG_USER) + pkey = khcint_space_open_key(p, KHM_PERM_READ | KCONF_FLAG_USER); + + if((!pkey || + (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != + ERROR_SUCCESS)) + && (flags & KCONF_FLAG_MACHINE)) { + + pkey = khcint_space_open_key(p, KHM_PERM_READ | KCONF_FLAG_MACHINE); + if(!pkey || + (khcint_RegOpenKeyEx(pkey, buf, 0, KEY_READ, &ckey) != + ERROR_SUCCESS)) { + *result = NULL; + + return KHM_ERROR_NOT_FOUND; + } + } + + if(ckey) { + RegCloseKey(ckey); + ckey = NULL; + } + } + + c = khcint_create_empty_space(); + + /*SAFE: buf: is of known length < KCONF_MAXCCH_NAME */ + c->name = PWCSDUP(buf); + + /*SAFE: p->regpath: is valid since it was set using this same + function. */ + /*SAFE: buf: see above */ + cb_regpath = (wcslen(p->regpath) + wcslen(buf) + 2) * sizeof(wchar_t); + c->regpath = PMALLOC(cb_regpath); + + assert(c->regpath != NULL); + + /*SAFE: c->regpath: allocated above to be big enough */ + /*SAFE: p->regpath: see above */ + StringCbCopy(c->regpath, cb_regpath, p->regpath); + StringCbCat(c->regpath, cb_regpath, L"\\"); + + /*SAFE: buf: see above */ + StringCbCat(c->regpath, cb_regpath, buf); + + khcint_space_hold(c); + + EnterCriticalSection(&cs_conf_global); + TADDCHILD(p,c); + LeaveCriticalSection(&cs_conf_global); + + *result = c; + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khc_open_space(khm_handle parent, const wchar_t * cspace, khm_int32 flags, + khm_handle * result) { + kconf_handle * h; + kconf_conf_space * p; + kconf_conf_space * c = NULL; + size_t cbsize; + const wchar_t * str; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) { + return KHM_ERROR_NOT_READY; + } + + if(!result || (parent && !khc_is_handle(parent))) + return KHM_ERROR_INVALID_PARAM; + + if(!parent) + p = conf_root; + else { + h = (kconf_handle *) parent; + p = khc_space_from_handle(parent); + } + + khcint_space_hold(p); + + /* if none of these flags are specified, make it seem like all of + them were */ + if(!(flags & KCONF_FLAG_USER) && + !(flags & KCONF_FLAG_MACHINE) && + !(flags & KCONF_FLAG_SCHEMA)) + flags |= KCONF_FLAG_USER | KCONF_FLAG_MACHINE | KCONF_FLAG_SCHEMA; + + if(cspace == NULL) { + khcint_space_release(p); + *result = (khm_handle) khcint_handle_from_space(p, flags); + return KHM_ERROR_SUCCESS; + } + + if(FAILED(StringCbLength(cspace, KCONF_MAXCB_PATH, &cbsize))) { + khcint_space_release(p); + *result = NULL; + return KHM_ERROR_INVALID_PARAM; + } + + str = cspace; + while(TRUE) { + const wchar_t * end = NULL; + + if (!(flags & KCONF_FLAG_NOPARSENAME)) { + + end = wcschr(str, L'\\'); /* safe because cspace was + validated above */ +#if 0 + if(!end) + end = wcschr(str, L'/'); /* safe because cspace was + validated above */ +#endif + } + + if(!end) { + if(flags & KCONF_FLAG_TRAILINGVALUE) { + /* we are at the value component */ + c = p; + khcint_space_hold(c); + break; + } else + end = str + wcslen(str); /* safe because cspace was + validated above */ + } + + rv = khcint_open_space(p, str, end - str, flags, &c); + + if(KHM_SUCCEEDED(rv) && (*end == L'\\' +#if 0 + || *end == L'/' +#endif + )) { + khcint_space_release(p); + p = c; + c = NULL; + str = end+1; + } + else + break; + } + + khcint_space_release(p); + if(KHM_SUCCEEDED(rv)) { + *result = khcint_handle_from_space(c, flags); + } else + *result = NULL; + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_close_space(khm_handle csp) { + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(csp)) + return KHM_ERROR_INVALID_PARAM; + + khcint_handle_free((kconf_handle *) csp); + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khc_read_string(khm_handle pconf, + const wchar_t * pvalue, + wchar_t * buf, + khm_size * bufsize) +{ + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + do { + HKEY hku = NULL; + HKEY hkm = NULL; + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + DWORD size; + DWORD type; + LONG hr; + + int i; + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + + if(KHM_FAILED(khc_open_space( + pconf, + pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + goto _shadow; + + free_space = 1; +#if 0 + const wchar_t * back, * forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; /* works for nulls too */ +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf)) + goto _shadow; + + c = khc_space_from_handle(conf); + + if(khc_is_user_handle(conf)) + hku = khcint_space_open_key(c, KHM_PERM_READ); + + if(khc_is_machine_handle(conf)) + hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); + + size = (DWORD) *bufsize; + if(hku) { + hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_SZ) { + rv = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + *bufsize = size; + /* if buf==NULL, RegQueryValueEx will return success and just return the + required buffer size in 'size' */ + rv = (buf)? KHM_ERROR_SUCCESS: KHM_ERROR_TOO_LONG; + goto _exit; + } + } else { + if(hr == ERROR_MORE_DATA) { + *bufsize = size; + rv = KHM_ERROR_TOO_LONG; + goto _exit; + } + } + } + + size = (DWORD) *bufsize; + if(hkm) { + hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_SZ) { + rv = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + *bufsize = size; + rv = (buf)? KHM_ERROR_SUCCESS: KHM_ERROR_TOO_LONG; + goto _exit; + } + } else { + if(hr == ERROR_MORE_DATA) { + *bufsize = size; + rv = KHM_ERROR_TOO_LONG; + goto _exit; + } + } + } + + if(c->schema && khc_is_schema_handle(conf)) { + for(i=0;inSchema;i++) { + if(c->schema[i].type == KC_STRING && !wcscmp(value, c->schema[i].name)) { + /* found it */ + size_t cbsize = 0; + + if(!c->schema[i].value) { + rv = KHM_ERROR_NOT_FOUND; + goto _exit; + } + + if(FAILED(StringCbLength((wchar_t *) c->schema[i].value, KCONF_MAXCB_STRING, &cbsize))) { + rv = KHM_ERROR_NOT_FOUND; + goto _exit; + } + cbsize += sizeof(wchar_t); + + if(!buf || *bufsize < cbsize) { + *bufsize = cbsize; + rv = KHM_ERROR_TOO_LONG; + goto _exit; + } + + StringCbCopy(buf, *bufsize, (wchar_t *) c->schema[i].value); + *bufsize = cbsize; + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } + } + +_shadow: + if(free_space && conf) + khc_close_space(conf); + + if(khc_is_shadowed(pconf)) { + pconf = khc_shadow(pconf); + continue; + } else { + rv = KHM_ERROR_NOT_FOUND; + break; + } + +_exit: + if(free_space && conf) + khc_close_space(conf); + break; + + } while(TRUE); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_read_int32(khm_handle pconf, const wchar_t * pvalue, khm_int32 * buf) { + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!buf || !pvalue) + return KHM_ERROR_INVALID_PARAM; + + do { + DWORD size; + DWORD type; + LONG hr; + HKEY hku = NULL; + HKEY hkm = NULL; + + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + + int i; + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + if(KHM_FAILED(khc_open_space( + pconf, + pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + goto _shadow; + free_space = 1; +#if 0 + const wchar_t * back, * forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf) || !buf) + goto _shadow; + + c = khc_space_from_handle(conf); + + if(khc_is_user_handle(conf)) + hku = khcint_space_open_key(c, KHM_PERM_READ); + + if(khc_is_machine_handle(conf)) + hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); + + size = sizeof(DWORD); + if(hku) { + hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_DWORD) { + rv = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } + } + + size = sizeof(DWORD); + if(hkm) { + hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_DWORD) { + rv= KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + rv= KHM_ERROR_SUCCESS; + goto _exit; + } + } + } + + if(c->schema && khc_is_schema_handle(conf)) { + for(i=0;inSchema;i++) { + if(c->schema[i].type == KC_INT32 && !wcscmp(value, c->schema[i].name)) { + *buf = (khm_int32) c->schema[i].value; + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } + } +_shadow: + if(free_space && conf) + khc_close_space(conf); + + if(khc_is_shadowed(pconf)) { + pconf = khc_shadow(pconf); + continue; + } else { + rv = KHM_ERROR_NOT_FOUND; + break; + } +_exit: + if(free_space && conf) + khc_close_space(conf); + break; + } + while(TRUE); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_read_int64(khm_handle pconf, const wchar_t * pvalue, khm_int64 * buf) { + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + do { + DWORD size; + DWORD type; + LONG hr; + HKEY hku = NULL; + HKEY hkm = NULL; + + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + + int i; + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + if(KHM_FAILED(khc_open_space( + pconf, + pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + goto _shadow; + free_space = 1; +#if 0 + const wchar_t * back, *forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf) || !buf) + goto _shadow; + + c = khc_space_from_handle(conf); + + if(khc_is_user_handle(conf)) + hku = khcint_space_open_key(c, KHM_PERM_READ); + + if(khc_is_machine_handle(conf)) + hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); + + size = sizeof(khm_int64); + if(hku) { + hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_QWORD) { + rv= KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } + } + + size = sizeof(khm_int64); + if(hkm) { + hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_QWORD) { + rv = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } + } + + if(c->schema && khc_is_schema_handle(conf)) { + for(i=0;inSchema;i++) { + if(c->schema[i].type == KC_INT64 && !wcscmp(value, c->schema[i].name)) { + *buf = (khm_int64) c->schema[i].value; + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } + } + +_shadow: + if(free_space && conf) + khc_close_space(conf); + if(khc_is_shadowed(pconf)) { + pconf = khc_shadow(pconf); + continue; + } else { + rv = KHM_ERROR_NOT_FOUND; + break; + } + +_exit: + if(free_space && conf) + khc_close_space(conf); + break; + + } while(TRUE); + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_read_binary(khm_handle pconf, const wchar_t * pvalue, + void * buf, khm_size * bufsize) { + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + do { + DWORD size; + DWORD type; + LONG hr; + HKEY hku = NULL; + HKEY hkm = NULL; + + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + if(KHM_FAILED(khc_open_space( + pconf, + pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + goto _shadow; + free_space = 1; +#if 0 + const wchar_t * back, *forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf)) + goto _shadow; + + c = khc_space_from_handle(conf); + + if(khc_is_user_handle(conf)) + hku = khcint_space_open_key(c, KHM_PERM_READ); + + if(khc_is_machine_handle(conf)) + hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); + + size = (DWORD) *bufsize; + if(hku) { + hr = RegQueryValueEx(hku, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_BINARY) { + rv = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + *bufsize = size; + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } else { + if(hr == ERROR_MORE_DATA) { + *bufsize = size; + rv = KHM_ERROR_TOO_LONG; + goto _exit; + } + } + } + + size = (DWORD) *bufsize; + if(hkm) { + hr = RegQueryValueEx(hkm, value, NULL, &type, (LPBYTE) buf, &size); + if(hr == ERROR_SUCCESS) { + if(type != REG_BINARY) { + rv = KHM_ERROR_TYPE_MISMATCH; + goto _exit; + } + else { + *bufsize = size; + rv = KHM_ERROR_SUCCESS; + goto _exit; + } + } else { + if(hr == ERROR_MORE_DATA) { + *bufsize = size; + rv = KHM_ERROR_TOO_LONG; + goto _exit; + } + } + } + + /* binary values aren't supported in schema */ +_shadow: + if(free_space && conf) + khc_close_space(conf); + if(khc_is_shadowed(pconf)) { + pconf = khc_shadow(pconf); + continue; + } else { + rv = KHM_ERROR_NOT_FOUND; + break; + } + +_exit: + if(free_space && conf) + khc_close_space(conf); + break; + + }while (TRUE); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_write_string(khm_handle pconf, + const wchar_t * pvalue, + wchar_t * buf) +{ + HKEY pk = NULL; + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + LONG hr; + size_t cbsize; + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) + return KHM_ERROR_INVALID_OPERATION; + + if(FAILED(StringCbLength(buf, KCONF_MAXCB_STRING, &cbsize))) { + rv = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + cbsize += sizeof(wchar_t); + + if (khc_handle_flags(pconf) & KCONF_FLAG_WRITEIFMOD) { + wchar_t tmpbuf[512]; + wchar_t * buffer; + size_t tmpsize = cbsize; + khm_boolean is_equal = FALSE; + + if (cbsize <= sizeof(tmpbuf)) { + buffer = tmpbuf; + } else { + buffer = PMALLOC(cbsize); + } + + if (KHM_SUCCEEDED(khc_read_string(pconf, pvalue, buffer, &tmpsize)) && + tmpsize == cbsize) { + if (khc_handle_flags(pconf) & KCONF_FLAG_IFMODCI) + is_equal = !_wcsicmp(buffer, buf); + else + is_equal = !wcscmp(buffer, buf); + } + + if (buffer != tmpbuf) + PFREE(buffer); + + if (is_equal) { + return KHM_ERROR_SUCCESS; + } + } + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + if(KHM_FAILED(khc_open_space(pconf, pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + return KHM_ERROR_INVALID_PARAM; + free_space = 1; +#if 0 + const wchar_t * back, *forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf) || !buf) { + rv = KHM_ERROR_INVALID_PARAM; + goto _exit; + } + + c = khc_space_from_handle(conf); + + if(khc_is_user_handle(conf)) { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); + } else { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); + } + + hr = RegSetValueEx(pk, value, 0, REG_SZ, (LPBYTE) buf, (DWORD) cbsize); + + if(hr != ERROR_SUCCESS) + rv = KHM_ERROR_INVALID_OPERATION; + +_exit: + if(free_space) + khc_close_space(conf); + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_write_int32(khm_handle pconf, + const wchar_t * pvalue, + khm_int32 buf) +{ + HKEY pk = NULL; + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + LONG hr; + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) + return KHM_ERROR_INVALID_OPERATION; + + if (khc_handle_flags(pconf) & KCONF_FLAG_WRITEIFMOD) { + khm_int32 tmpvalue; + + if (KHM_SUCCEEDED(khc_read_int32(pconf, pvalue, &tmpvalue)) && + tmpvalue == buf) { + return KHM_ERROR_SUCCESS; + } + } + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + if(KHM_FAILED(khc_open_space( + pconf, + pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + return KHM_ERROR_INVALID_PARAM; + free_space = 1; +#if 0 + const wchar_t * back, *forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle( conf); + + if(khc_is_user_handle(conf)) { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); + } else { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); + } + + hr = RegSetValueEx(pk, value, 0, REG_DWORD, (LPBYTE) &buf, sizeof(khm_int32)); + + if(hr != ERROR_SUCCESS) + rv = KHM_ERROR_INVALID_OPERATION; + + if(free_space) + khc_close_space(conf); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_write_int64(khm_handle pconf, const wchar_t * pvalue, khm_int64 buf) { + HKEY pk = NULL; + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + LONG hr; + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) + return KHM_ERROR_INVALID_OPERATION; + + if (khc_handle_flags(pconf) & KCONF_FLAG_WRITEIFMOD) { + khm_int64 tmpvalue; + + if (KHM_SUCCEEDED(khc_read_int64(pconf, pvalue, &tmpvalue)) && + tmpvalue == buf) { + return KHM_ERROR_SUCCESS; + } + } + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + if(KHM_FAILED(khc_open_space( + pconf, + pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + return KHM_ERROR_INVALID_PARAM; + free_space = 1; +#if 0 + const wchar_t * back, *forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle( conf); + + if(khc_is_user_handle(conf)) { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); + } else { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); + } + + hr = RegSetValueEx(pk, value, 0, REG_QWORD, (LPBYTE) &buf, sizeof(khm_int64)); + + if(hr != ERROR_SUCCESS) + rv = KHM_ERROR_INVALID_OPERATION; + + if(free_space) + khc_close_space(conf); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_write_binary(khm_handle pconf, + const wchar_t * pvalue, + void * buf, khm_size bufsize) { + HKEY pk = NULL; + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + LONG hr; + const wchar_t * value = NULL; + int free_space = 0; + khm_handle conf = NULL; + + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(pconf && !khc_is_machine_handle(pconf) && !khc_is_user_handle(pconf)) + return KHM_ERROR_INVALID_OPERATION; + + if(wcschr(pvalue, L'\\') +#if 0 + || wcschr(pvalue, L'/') +#endif + ) { + if(KHM_FAILED(khc_open_space( + pconf, + pvalue, + KCONF_FLAG_TRAILINGVALUE | (pconf?khc_handle_flags(pconf):0), + &conf))) + return KHM_ERROR_INVALID_PARAM; + free_space = 1; +#if 0 + const wchar_t * back, *forward; + + back = wcsrchr(pvalue, L'\\'); + forward = wcsrchr(pvalue, L'/'); + value = (back > forward)?back:forward; +#else + value = wcsrchr(pvalue, L'\\'); +#endif + } else { + value = pvalue; + conf = pconf; + free_space = 0; + } + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle(conf); + + if(khc_is_user_handle(conf)) { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KHM_FLAG_CREATE); + } else { + pk = khcint_space_open_key(c, KHM_PERM_WRITE | KCONF_FLAG_MACHINE | KHM_FLAG_CREATE); + } + + hr = RegSetValueEx(pk, value, 0, REG_BINARY, buf, (DWORD) bufsize); + + if(hr != ERROR_SUCCESS) + rv = KHM_ERROR_INVALID_OPERATION; + + if(free_space) + khc_close_space(conf); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_get_config_space_name(khm_handle conf, + wchar_t * buf, khm_size * bufsize) { + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle(conf); + + if(!c->name) { + if(buf && *bufsize > 0) + buf[0] = L'\0'; + else { + *bufsize = sizeof(wchar_t); + rv = KHM_ERROR_TOO_LONG; + } + } else { + size_t cbsize; + + if(FAILED(StringCbLength(c->name, KCONF_MAXCB_NAME, &cbsize))) + return KHM_ERROR_UNKNOWN; + + cbsize += sizeof(wchar_t); + + if(!buf || cbsize > *bufsize) { + *bufsize = cbsize; + rv = KHM_ERROR_TOO_LONG; + } else { + StringCbCopy(buf, *bufsize, c->name); + *bufsize = cbsize; + } + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_get_config_space_parent(khm_handle conf, khm_handle * parent) { + kconf_conf_space * c; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle(conf); + + if(c == conf_root || c->parent == conf_root) + *parent = NULL; + else + *parent = khcint_handle_from_space(c->parent, khc_handle_flags(conf)); + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khc_get_type(khm_handle conf, const wchar_t * value) { + HKEY hkm = NULL; + HKEY hku = NULL; + kconf_conf_space * c; + khm_int32 rv; + LONG hr = ERROR_SUCCESS; + DWORD type = 0; + + if(!khc_is_config_running()) + return KC_NONE; + + if(!khc_is_handle(conf)) + return KC_NONE; + + c = (kconf_conf_space *) conf; + + if(!khc_is_machine_handle(conf)) + hku = khcint_space_open_key(c, KHM_PERM_READ); + hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); + + if(hku) + hr = RegQueryValueEx(hku, value, NULL, &type, NULL, NULL); + if(!hku || hr != ERROR_SUCCESS) + hr = RegQueryValueEx(hkm, value, NULL, &type, NULL, NULL); + if(((!hku && !hkm) || hr != ERROR_SUCCESS) && c->schema) { + int i; + + for(i=0; inSchema; i++) { + if(!wcscmp(c->schema[i].name, value)) { + return c->schema[i].type; + } + } + + return KC_NONE; + } + + switch(type) { + case REG_MULTI_SZ: + case REG_SZ: + rv = KC_STRING; + break; + case REG_DWORD: + rv = KC_INT32; + break; + case REG_QWORD: + rv = KC_INT64; + break; + case REG_BINARY: + rv = KC_BINARY; + break; + default: + rv = KC_NONE; + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_value_exists(khm_handle conf, const wchar_t * value) { + HKEY hku = NULL; + HKEY hkm = NULL; + kconf_conf_space * c; + khm_int32 rv = 0; + DWORD t; + int i; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle(conf); + + if (khc_is_user_handle(conf)) + hku = khcint_space_open_key(c, KHM_PERM_READ); + if (khc_is_machine_handle(conf)) + hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); + + if(hku && (RegQueryValueEx(hku, value, NULL, &t, NULL, NULL) == ERROR_SUCCESS)) + rv |= KCONF_FLAG_USER; + if(hkm && (RegQueryValueEx(hkm, value, NULL, &t, NULL, NULL) == ERROR_SUCCESS)) + rv |= KCONF_FLAG_MACHINE; + + if(c->schema && khc_is_schema_handle(conf)) { + for(i=0; inSchema; i++) { + if(!wcscmp(c->schema[i].name, value)) { + rv |= KCONF_FLAG_SCHEMA; + break; + } + } + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_remove_value(khm_handle conf, const wchar_t * value, khm_int32 flags) { + HKEY hku = NULL; + HKEY hkm = NULL; + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_NOT_FOUND; + DWORD t; + LONG l; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle(conf); + + if(!khc_is_machine_handle(conf)) + hku = khcint_space_open_key(c, KHM_PERM_READ); + hkm = khcint_space_open_key(c, KHM_PERM_READ | KCONF_FLAG_MACHINE); + + if((flags == 0 || + (flags & KCONF_FLAG_USER)) && + hku && (RegQueryValueEx(hku, value, NULL, + &t, NULL, NULL) == ERROR_SUCCESS)) { + l = RegDeleteValue(hku, value); + if (l == ERROR_SUCCESS) + rv = KHM_ERROR_SUCCESS; + else + rv = KHM_ERROR_UNKNOWN; + } + if((flags == 0 || + (flags & KCONF_FLAG_MACHINE)) && + hkm && (RegQueryValueEx(hkm, value, NULL, + &t, NULL, NULL) == ERROR_SUCCESS)) { + l = RegDeleteValue(hkm, value); + if (l == ERROR_SUCCESS) + rv = (rv == KHM_ERROR_UNKNOWN)?KHM_ERROR_PARTIAL: + KHM_ERROR_SUCCESS; + else + rv = (rv == KHM_ERROR_SUCCESS)?KHM_ERROR_PARTIAL: + KHM_ERROR_UNKNOWN; + } + + return rv; +} + +/* called with cs_conf_global held */ +khm_int32 +khcint_remove_space(kconf_conf_space * c, khm_int32 flags) { + kconf_conf_space * cc; + kconf_conf_space * cn; + kconf_conf_space * p; + + /* TODO: if this is the last child space and the parent is marked + for deletion, delete the parent as well. */ + + p = TPARENT(c); + + /* We don't allow deleting top level keys. They are + predefined. */ +#ifdef DEBUG + assert(p); +#endif + if (!p) + return KHM_ERROR_INVALID_OPERATION; + + cc = TFIRSTCHILD(c); + while (cc) { + cn = LNEXT(cc); + + khcint_remove_space(cc, flags); + + cc = cn; + } + + cc = TFIRSTCHILD(c); + if (!cc && c->refcount == 0) { + TDELCHILD(p, c); + khcint_free_space(c); + } else { + c->flags |= (flags & + (KCONF_SPACE_FLAG_DELETE_M | + KCONF_SPACE_FLAG_DELETE_U)); + + /* if all the registry spaces have been marked as deleted and + there is no schema, we should mark the space as deleted as + well. Note that ideally we only need to check for stores + which have data corresponding to this configuration space, + but this is a bit problematic since we don't monitor the + registry for changes. */ + if ((c->flags & + (KCONF_SPACE_FLAG_DELETE_M | + KCONF_SPACE_FLAG_DELETE_U)) == + (KCONF_SPACE_FLAG_DELETE_M | + KCONF_SPACE_FLAG_DELETE_U) && + (!c->schema || c->nSchema == 0)) + + c->flags |= KCONF_SPACE_FLAG_DELETED; + } + + if (c->regpath && p->regpath) { + HKEY hk; + + if (flags & KCONF_SPACE_FLAG_DELETE_U) { + hk = khcint_space_open_key(p, KCONF_FLAG_USER); + + if (hk) + khcint_RegDeleteKey(hk, c->name); + } + if (flags & KCONF_SPACE_FLAG_DELETE_M) { + hk = khcint_space_open_key(p, KCONF_FLAG_MACHINE); + + if (hk) + khcint_RegDeleteKey(hk, c->name); + } + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khc_remove_space(khm_handle conf) { + + /* + - mark this space as well as all child spaces as + 'delete-on-close' using flags. Mark should indicate which + repository to delete the space from. (user/machine) + + - When each subspace is released, check if it has been marked + for deletion. If so, delete the marked spaces as well as + removing the space from kconf space tree. + + - When removing a subspace from a space, check if the parent + space has any children left. If there are none, check if the + parent space is also marked for deletion. + */ + kconf_conf_space * c; + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_int32 flags = 0; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + c = khc_space_from_handle(conf); + + EnterCriticalSection(&cs_conf_global); + + if (khc_is_machine_handle(conf)) + flags |= KCONF_SPACE_FLAG_DELETE_M; + if (khc_is_user_handle(conf)) + flags |= KCONF_SPACE_FLAG_DELETE_U; + + rv = khcint_remove_space(c, flags); + + LeaveCriticalSection(&cs_conf_global); + + return rv; +} + +khm_boolean +khcint_is_valid_name(wchar_t * name) +{ + size_t cbsize; + if(FAILED(StringCbLength(name, KCONF_MAXCB_NAME, &cbsize))) + return FALSE; + return TRUE; +} + +khm_int32 +khcint_validate_schema(const kconf_schema * schema, + int begin, + int *end) +{ + int i; + int state = 0; + int end_found = 0; + + i=begin; + while(!end_found) { + switch(state) { + case 0: /* initial. this record should start a config space */ + if(!khcint_is_valid_name(schema[i].name) || + schema[i].type != KC_SPACE) + return KHM_ERROR_INVALID_PARAM; + state = 1; + break; + + case 1: /* we are inside a config space, in the values area */ + if(!khcint_is_valid_name(schema[i].name)) + return KHM_ERROR_INVALID_PARAM; + if(schema[i].type == KC_SPACE) { + if(KHM_FAILED(khcint_validate_schema(schema, i, &i))) + return KHM_ERROR_INVALID_PARAM; + state = 2; + } else if(schema[i].type == KC_ENDSPACE) { + end_found = 1; + if(end) + *end = i; + } else { + if(schema[i].type != KC_STRING && + schema[i].type != KC_INT32 && + schema[i].type != KC_INT64 && + schema[i].type != KC_BINARY) + return KHM_ERROR_INVALID_PARAM; + } + break; + + case 2: /* we are inside a config space, in the subspace area */ + if(schema[i].type == KC_SPACE) { + if(KHM_FAILED(khcint_validate_schema(schema, i, &i))) + return KHM_ERROR_INVALID_PARAM; + } else if(schema[i].type == KC_ENDSPACE) { + end_found = 1; + if(end) + *end = i; + } else { + return KHM_ERROR_INVALID_PARAM; + } + break; + + default: + /* unreachable */ + return KHM_ERROR_INVALID_PARAM; + } + i++; + } + + return KHM_ERROR_SUCCESS; +} + +khm_int32 +khcint_load_schema_i(khm_handle parent, const kconf_schema * schema, + int begin, int * end) +{ + int i; + int state = 0; + int end_found = 0; + kconf_conf_space * thisconf = NULL; + khm_handle h = NULL; + + i=begin; + while(!end_found) { + switch(state) { + case 0: /* initial. this record should start a config space */ + if(KHM_FAILED(khc_open_space(parent, schema[i].name, + KHM_FLAG_CREATE, &h))) + return KHM_ERROR_INVALID_PARAM; + thisconf = khc_space_from_handle(h); + thisconf->schema = schema + (begin + 1); + state = 1; + break; + + case 1: /* we are inside a config space, in the values area */ + if(schema[i].type == KC_SPACE) { + thisconf->nSchema = i - (begin + 1); + if(KHM_FAILED(khcint_load_schema_i(h, schema, i, &i))) + return KHM_ERROR_INVALID_PARAM; + state = 2; + } else if(schema[i].type == KC_ENDSPACE) { + thisconf->nSchema = i - (begin + 1); + end_found = 1; + if(end) + *end = i; + khc_close_space(h); + } + break; + + case 2: /* we are inside a config space, in the subspace area */ + if(schema[i].type == KC_SPACE) { + if(KHM_FAILED(khcint_load_schema_i(h, schema, i, &i))) + return KHM_ERROR_INVALID_PARAM; + } else if(schema[i].type == KC_ENDSPACE) { + end_found = 1; + if(end) + *end = i; + khc_close_space(h); + } else { + return KHM_ERROR_INVALID_PARAM; + } + break; + + default: + /* unreachable */ + return KHM_ERROR_INVALID_PARAM; + } + i++; + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khc_load_schema(khm_handle conf, const kconf_schema * schema) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(conf && !khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + if(KHM_FAILED(khcint_validate_schema(schema, 0, NULL))) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_conf_global); + rv = khcint_load_schema_i(conf, schema, 0, NULL); + LeaveCriticalSection(&cs_conf_global); + + return rv; +} + +khm_int32 +khcint_unload_schema_i(khm_handle parent, const kconf_schema * schema, + int begin, int * end) +{ + int i; + int state = 0; + int end_found = 0; + kconf_conf_space * thisconf = NULL; + khm_handle h = NULL; + + i=begin; + while(!end_found) { + switch(state) { + case 0: /* initial. this record should start a config space */ + if(KHM_FAILED(khc_open_space(parent, schema[i].name, 0, &h))) + return KHM_ERROR_INVALID_PARAM; + thisconf = khc_space_from_handle(h); + if(thisconf->schema == (schema + (begin + 1))) { + thisconf->schema = NULL; + thisconf->nSchema = 0; + } + state = 1; + break; + + case 1: /* we are inside a config space, in the values area */ + if(schema[i].type == KC_SPACE) { + if(KHM_FAILED(khcint_unload_schema_i(h, schema, i, &i))) + return KHM_ERROR_INVALID_PARAM; + state = 2; + } else if(schema[i].type == KC_ENDSPACE) { + end_found = 1; + if(end) + *end = i; + khc_close_space(h); + } + break; + + case 2: /* we are inside a config space, in the subspace area */ + if(schema[i].type == KC_SPACE) { + if(KHM_FAILED(khcint_unload_schema_i(h, schema, i, &i))) + return KHM_ERROR_INVALID_PARAM; + } else if(schema[i].type == KC_ENDSPACE) { + end_found = 1; + if(end) + *end = i; + khc_close_space(h); + } else { + return KHM_ERROR_INVALID_PARAM; + } + break; + + default: + /* unreachable */ + return KHM_ERROR_INVALID_PARAM; + } + i++; + } + + return KHM_ERROR_SUCCESS; +} + +KHMEXP khm_int32 KHMAPI +khc_unload_schema(khm_handle conf, const kconf_schema * schema) +{ + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(conf && !khc_is_handle(conf)) + return KHM_ERROR_INVALID_PARAM; + + if(KHM_FAILED(khcint_validate_schema(schema, 0, NULL))) + return KHM_ERROR_INVALID_PARAM; + + EnterCriticalSection(&cs_conf_global); + rv = khcint_unload_schema_i(conf, schema, 0, NULL); + LeaveCriticalSection(&cs_conf_global); + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_enum_subspaces(khm_handle conf, + khm_handle prev, + khm_handle * next) +{ + kconf_conf_space * s; + kconf_conf_space * c; + kconf_conf_space * p; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!khc_is_handle(conf) || next == NULL || + (prev != NULL && !khc_is_handle(prev))) + return KHM_ERROR_INVALID_PARAM; + + s = khc_space_from_handle(conf); + + if(prev == NULL) { + /* first off, we enumerate all the registry spaces regardless of + whether the handle is applicable for some registry space or not. + See notes for khc_begin_enum_subspaces() for reasons as to why + this is done (notes are in kconfig.h)*/ + + /* go through the user hive first */ + { + HKEY hk_conf; + + hk_conf = khcint_space_open_key(s, 0); + if(hk_conf) { + wchar_t name[KCONF_MAXCCH_NAME]; + khm_handle h; + int idx; + + idx = 0; + while(RegEnumKey(hk_conf, idx, + name, ARRAYLENGTH(name)) == ERROR_SUCCESS) { + wchar_t * tilde; + tilde = wcschr(name, L'~'); + if (tilde) + *tilde = 0; + if(KHM_SUCCEEDED(khc_open_space(conf, name, 0, &h))) + khc_close_space(h); + idx++; + } + } + } + + /* go through the machine hive next */ + { + HKEY hk_conf; + + hk_conf = khcint_space_open_key(s, KCONF_FLAG_MACHINE); + if(hk_conf) { + wchar_t name[KCONF_MAXCCH_NAME]; + khm_handle h; + int idx; + + idx = 0; + while(RegEnumKey(hk_conf, idx, + name, ARRAYLENGTH(name)) == ERROR_SUCCESS) { + wchar_t * tilde; + tilde = wcschr(name, L'~'); + if (tilde) + *tilde = 0; + + if(KHM_SUCCEEDED(khc_open_space(conf, name, + KCONF_FLAG_MACHINE, &h))) + khc_close_space(h); + idx++; + } + } + } + + /* don't need to go through schema, because that was already + done when the schema was loaded. */ + } + + /* at last we are now ready to return the results */ + EnterCriticalSection(&cs_conf_global); + if(prev == NULL) { + c = TFIRSTCHILD(s); + rv = KHM_ERROR_SUCCESS; + } else { + p = khc_space_from_handle(prev); + if(TPARENT(p) == s) + c = LNEXT(p); + else + c = NULL; + } + LeaveCriticalSection(&cs_conf_global); + + if(prev != NULL) + khc_close_space(prev); + + if(c) { + *next = khcint_handle_from_space(c, khc_handle_flags(conf)); + rv = KHM_ERROR_SUCCESS; + } else { + *next = NULL; + rv = KHM_ERROR_NOT_FOUND; + } + + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_write_multi_string(khm_handle conf, const wchar_t * value, wchar_t * buf) +{ + size_t cb; + wchar_t vbuf[KCONF_MAXCCH_STRING]; + wchar_t *tb; + khm_int32 rv; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + if(!khc_is_handle(conf) || buf == NULL || value == NULL) + return KHM_ERROR_INVALID_PARAM; + + if(multi_string_to_csv(NULL, &cb, buf) != KHM_ERROR_TOO_LONG) + return KHM_ERROR_INVALID_PARAM; + + if (cb < sizeof(vbuf)) + tb = vbuf; + else + tb = PMALLOC(cb); + + assert(tb != NULL); + + multi_string_to_csv(tb, &cb, buf); + rv = khc_write_string(conf, value, tb); + + if (tb != vbuf) + PFREE(tb); + return rv; +} + +KHMEXP khm_int32 KHMAPI +khc_read_multi_string(khm_handle conf, const wchar_t * value, + wchar_t * buf, khm_size * bufsize) +{ + wchar_t vbuf[KCONF_MAXCCH_STRING]; + wchar_t * tb; + khm_size cbbuf; + khm_int32 rv = KHM_ERROR_SUCCESS; + + if(!khc_is_config_running()) + return KHM_ERROR_NOT_READY; + + if(!bufsize) + return KHM_ERROR_INVALID_PARAM; + + rv = khc_read_string(conf, value, NULL, &cbbuf); + if(rv != KHM_ERROR_TOO_LONG) + return rv; + + if (cbbuf < sizeof(vbuf)) + tb = vbuf; + else + tb = PMALLOC(cbbuf); + + assert(tb != NULL); + + rv = khc_read_string(conf, value, tb, &cbbuf); + + if(KHM_FAILED(rv)) + goto _exit; + + rv = csv_to_multi_string(buf, bufsize, tb); + +_exit: + if (tb != vbuf) + PFREE(tb); + + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/nidmgrdll/dllmain.c +++ krb5-1.4.4/src/windows/identity/nidmgrdll/dllmain.c @@ -1,114 +1,114 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include - -/* forward dcls */ -void -kherr_process_attach(void); - -void -kherr_process_detach(void); - -void -kherr_thread_attach(void); - -void -kherr_thread_detach(void); - -void -kconfig_process_attach(void); - -void -kconfig_process_detach(void); - -void -kmq_process_attach(void); - -void -kmq_process_detach(void); - -void -kmq_thread_attach(void); - -void -kmq_thread_detach(void); - -void -kcdb_process_attach(HINSTANCE); - -void -kcdb_process_detach(void); - -void -kmm_process_attach(HINSTANCE); - -void -kmm_process_detach(void); - -void -uilib_process_attach(void); - -void -uilib_process_detach(void); - - -BOOL WINAPI DllMain( - HINSTANCE hinstDLL, // handle to DLL module - DWORD fdwReason, // reason for calling function - LPVOID lpReserved ) // reserved -{ - switch(fdwReason) { - case DLL_PROCESS_ATTACH: - kherr_process_attach(); - kconfig_process_attach(); - kmq_process_attach(); - kcdb_process_attach(hinstDLL); - kmm_process_attach(hinstDLL); - uilib_process_attach(); - break; - - case DLL_PROCESS_DETACH: - kherr_process_detach(); - kconfig_process_detach(); - kmq_process_detach(); - kcdb_process_detach(); - kmm_process_detach(); - uilib_process_detach(); - break; - - case DLL_THREAD_ATTACH: - kherr_thread_attach(); - kmq_thread_attach(); - break; - - case DLL_THREAD_DETACH: - kherr_thread_detach(); - kmq_thread_detach(); - break; - } - return TRUE; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include + +/* forward dcls */ +void +kherr_process_attach(void); + +void +kherr_process_detach(void); + +void +kherr_thread_attach(void); + +void +kherr_thread_detach(void); + +void +kconfig_process_attach(void); + +void +kconfig_process_detach(void); + +void +kmq_process_attach(void); + +void +kmq_process_detach(void); + +void +kmq_thread_attach(void); + +void +kmq_thread_detach(void); + +void +kcdb_process_attach(HINSTANCE); + +void +kcdb_process_detach(void); + +void +kmm_process_attach(HINSTANCE); + +void +kmm_process_detach(void); + +void +uilib_process_attach(void); + +void +uilib_process_detach(void); + + +BOOL WINAPI DllMain( + HINSTANCE hinstDLL, // handle to DLL module + DWORD fdwReason, // reason for calling function + LPVOID lpReserved ) // reserved +{ + switch(fdwReason) { + case DLL_PROCESS_ATTACH: + kherr_process_attach(); + kconfig_process_attach(); + kmq_process_attach(); + kcdb_process_attach(hinstDLL); + kmm_process_attach(hinstDLL); + uilib_process_attach(); + break; + + case DLL_PROCESS_DETACH: + kherr_process_detach(); + kconfig_process_detach(); + kmq_process_detach(); + kcdb_process_detach(); + kmm_process_detach(); + uilib_process_detach(); + break; + + case DLL_THREAD_ATTACH: + kherr_thread_attach(); + kmq_thread_attach(); + break; + + case DLL_THREAD_DETACH: + kherr_thread_detach(); + kmq_thread_detach(); + break; + } + return TRUE; +} --- krb5-1.4.4.orig/src/windows/identity/include/khdefs.h +++ krb5-1.4.4/src/windows/identity/include/khdefs.h @@ -1,235 +1,235 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHDEFS_H__ -#define __KHIMAIRA_KHDEFS_H__ - -/*! \defgroup khdef Core definitions - - Key type definitions used throughout NetIDMgr. - */ -/*@{*/ -#include -#include -#include - -/*!\typedef khm_octet - \brief A byte (8 bit unsigned)*/ - -/*!\typedef khm_int16 - \brief A signed 16 bit quantity */ - -/*!\typedef khm_ui_2 - \brief An unsigned 16 bit quantity */ - -/*!\typedef khm_int32 - \brief A signed 32 bit quantity */ - -/*!\typedef khm_ui_4 - \brief An unsigned 32 bit quantity */ - -/*!\typedef khm_int64 - \brief A signed 64 bit quantity */ - -/*!\typedef khm_ui_8 - \brief An unsigned 64 bit quantity */ - -typedef unsigned __int8 khm_octet; - -typedef __int16 khm_int16; -typedef unsigned __int16 khm_ui_2; - -typedef __int32 khm_int32; -typedef unsigned __int32 khm_ui_4; - -typedef __int64 khm_int64; -typedef unsigned __int64 khm_ui_8; - -#define VALID_INT_BITS INT_MAX -#define VALID_UINT_BITS UINT_MAX - -#define KHM_UINT32_MAX 4294967295 - -#define KHM_INT32_MAX 2147483647 -/* this strange form is necessary since - is a unary operator, not a sign - indicator */ -#define KHM_INT32_MIN (-KHM_INT32_MAX-1) - -#define KHM_UINT16_MAX 65535 - -#define KHM_INT16_MAX 32767 -/* this strange form is necessary since - is a unary operator, not a sign - indicator */ -#define KHM_INT16_MIN (-KHM_INT16_MAX-1) - -/*! \brief Generic handle type. - - Handles in NetIDMgr are generic pointers. -*/ -typedef void * khm_handle; - -/*! \brief The invalid handle - - Just used to indicate that this handle does not point to anything useful. - Usually returned by a function that returns a handle as a signal that the - operation failed. -*/ -#define KHM_INVALID_HANDLE ((khm_handle) NULL) - -/*! \brief Boolean. -*/ -typedef khm_int32 khm_boolean; - -/*! \brief A size - */ -typedef size_t khm_size; - -/*! \typedef ssize_t - \brief Signed size specifier - - Just a signed version of size_t - */ - -#ifdef _WIN64 -typedef __int64 ssize_t; -#else -typedef _W64 int ssize_t; -#endif - -typedef ssize_t khm_ssize; - -#if defined(_WIN64) -typedef unsigned __int64 khm_wparm; -/*TODO: is this enough? */ -typedef unsigned __int64 khm_lparm; -#elif defined(_WIN32) -typedef unsigned __int32 khm_wparm; -typedef unsigned __int64 khm_lparm; -#else -#error khm_wparm and khm_lparm need to be defined for this platform -#endif - -/*!\def KHMAPI - \brief Calling convention for NetIDMgr exported functions - - The caling convention for all NetIDMgr exported functions is \b - __stdcall , unless otherwise noted. - */ - -/*!\def KHMEXP - \brief Export prefix for NetIDMgr exported functions - - When compiling source that exports functions, those exported - function declarations will be done as follows: - - \code - __declspec(dllexport) khm_int32 __stdcall function_name(arguments...); - \endcode - - This eliminates the need for a separate exports definition file. - However, it doesn't preserve ordinals, but we aren't guaranteeing - that anyway. - - On the other hand, if a particular function is going to be imported - from a DLL, it should declared as follows: - - \code - __declspec(dllimport) khm_int32 __stdcall function_name(arguments...); - \endcode - - This allows the compiler to properly instrument the import. If the - function is not declared this way, there will be a stub function - generated that will just jump to the proper import, generating - redundant instructions and wasting execution time. - - This macro encapsulates the proper declaration specifier. - */ - -#ifdef _WIN32 -#define KHMAPI __stdcall - -#define KHMEXP_EXP __declspec(dllexport) -#define KHMEXP_IMP __declspec(dllimport) - -#define KHMEXP KHMEXP_EXP -#endif - -/* Generic permission values */ -/*! \brief Generic read permission or request */ -#define KHM_PERM_READ 0x100 - -/*! \brief Generic write permission or request */ -#define KHM_PERM_WRITE 0x200 - -/* Generic flags */ -/*! \brief Generic create request - - For most lookup functions, specifying this flag indicates that if - the requested object is not found it should be created. -*/ -#define KHM_FLAG_CREATE 0x1000 - -/*! \brief Wrap to DWORD boundary - - Returns the smallest integer greater than or equal to the - parameter that is a multiple of 4. - - \note Only use with positive integers. */ -#define UBOUND32(d) ((((d)-1)&~3) + 4) - -/*! \brief Offset a pointer by a number of bytes - - Given a pointer, returns a void pointer that is a given number of - bytes offset from the pointer. - */ -#define BYTEOFFSET(p,off) ((void *)(((char *) (p)) + (off))) - -/*! \brief Check for powers of 2 - - Return TRUE if the operand is a positive power of 2 or 0*/ -#define IS_POW2(d) ((d)>=0 && !((d) & ((d) - 1))) - -/*! \brief Wrap to upper bound based on start and step size - - Return the smallest element in the series s, s+t, s+2*t, - s+3*t, ... that is greater than or equal to \c v. -*/ -#define UBOUNDSS(v,start,step) (((v)<=(start))?(start):(start)+((((v)-((start)+1))/(step))+1)*(step)) - -/* \brief Length of an array -*/ -#define ARRAYLENGTH(x) (sizeof(x)/sizeof(x[0])) - -/*! \brief Generic version type*/ -typedef struct tag_khm_version { - khm_ui_2 major; /*!< Major version number */ - khm_ui_2 minor; /*!< Minor version number */ - khm_ui_2 patch; /*!< Patch level */ - khm_ui_2 aux; /*!< Auxilary level (usually carries a build number) */ -} khm_version; - -/*@}*/ -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHDEFS_H__ +#define __KHIMAIRA_KHDEFS_H__ + +/*! \defgroup khdef Core definitions + + Key type definitions used throughout NetIDMgr. + */ +/*@{*/ +#include +#include +#include + +/*!\typedef khm_octet + \brief A byte (8 bit unsigned)*/ + +/*!\typedef khm_int16 + \brief A signed 16 bit quantity */ + +/*!\typedef khm_ui_2 + \brief An unsigned 16 bit quantity */ + +/*!\typedef khm_int32 + \brief A signed 32 bit quantity */ + +/*!\typedef khm_ui_4 + \brief An unsigned 32 bit quantity */ + +/*!\typedef khm_int64 + \brief A signed 64 bit quantity */ + +/*!\typedef khm_ui_8 + \brief An unsigned 64 bit quantity */ + +typedef unsigned __int8 khm_octet; + +typedef __int16 khm_int16; +typedef unsigned __int16 khm_ui_2; + +typedef __int32 khm_int32; +typedef unsigned __int32 khm_ui_4; + +typedef __int64 khm_int64; +typedef unsigned __int64 khm_ui_8; + +#define VALID_INT_BITS INT_MAX +#define VALID_UINT_BITS UINT_MAX + +#define KHM_UINT32_MAX 4294967295 + +#define KHM_INT32_MAX 2147483647 +/* this strange form is necessary since - is a unary operator, not a sign + indicator */ +#define KHM_INT32_MIN (-KHM_INT32_MAX-1) + +#define KHM_UINT16_MAX 65535 + +#define KHM_INT16_MAX 32767 +/* this strange form is necessary since - is a unary operator, not a sign + indicator */ +#define KHM_INT16_MIN (-KHM_INT16_MAX-1) + +/*! \brief Generic handle type. + + Handles in NetIDMgr are generic pointers. +*/ +typedef void * khm_handle; + +/*! \brief The invalid handle + + Just used to indicate that this handle does not point to anything useful. + Usually returned by a function that returns a handle as a signal that the + operation failed. +*/ +#define KHM_INVALID_HANDLE ((khm_handle) NULL) + +/*! \brief Boolean. +*/ +typedef khm_int32 khm_boolean; + +/*! \brief A size + */ +typedef size_t khm_size; + +/*! \typedef ssize_t + \brief Signed size specifier + + Just a signed version of size_t + */ + +#ifdef _WIN64 +typedef __int64 ssize_t; +#else +typedef _W64 int ssize_t; +#endif + +typedef ssize_t khm_ssize; + +#if defined(_WIN64) +typedef unsigned __int64 khm_wparm; +/*TODO: is this enough? */ +typedef unsigned __int64 khm_lparm; +#elif defined(_WIN32) +typedef unsigned __int32 khm_wparm; +typedef unsigned __int64 khm_lparm; +#else +#error khm_wparm and khm_lparm need to be defined for this platform +#endif + +/*!\def KHMAPI + \brief Calling convention for NetIDMgr exported functions + + The caling convention for all NetIDMgr exported functions is \b + __stdcall , unless otherwise noted. + */ + +/*!\def KHMEXP + \brief Export prefix for NetIDMgr exported functions + + When compiling source that exports functions, those exported + function declarations will be done as follows: + + \code + __declspec(dllexport) khm_int32 __stdcall function_name(arguments...); + \endcode + + This eliminates the need for a separate exports definition file. + However, it doesn't preserve ordinals, but we aren't guaranteeing + that anyway. + + On the other hand, if a particular function is going to be imported + from a DLL, it should declared as follows: + + \code + __declspec(dllimport) khm_int32 __stdcall function_name(arguments...); + \endcode + + This allows the compiler to properly instrument the import. If the + function is not declared this way, there will be a stub function + generated that will just jump to the proper import, generating + redundant instructions and wasting execution time. + + This macro encapsulates the proper declaration specifier. + */ + +#ifdef _WIN32 +#define KHMAPI __stdcall + +#define KHMEXP_EXP __declspec(dllexport) +#define KHMEXP_IMP __declspec(dllimport) + +#define KHMEXP KHMEXP_EXP +#endif + +/* Generic permission values */ +/*! \brief Generic read permission or request */ +#define KHM_PERM_READ 0x100 + +/*! \brief Generic write permission or request */ +#define KHM_PERM_WRITE 0x200 + +/* Generic flags */ +/*! \brief Generic create request + + For most lookup functions, specifying this flag indicates that if + the requested object is not found it should be created. +*/ +#define KHM_FLAG_CREATE 0x1000 + +/*! \brief Wrap to DWORD boundary + + Returns the smallest integer greater than or equal to the + parameter that is a multiple of 4. + + \note Only use with positive integers. */ +#define UBOUND32(d) ((((d)-1)&~3) + 4) + +/*! \brief Offset a pointer by a number of bytes + + Given a pointer, returns a void pointer that is a given number of + bytes offset from the pointer. + */ +#define BYTEOFFSET(p,off) ((void *)(((char *) (p)) + (off))) + +/*! \brief Check for powers of 2 + + Return TRUE if the operand is a positive power of 2 or 0*/ +#define IS_POW2(d) ((d)>=0 && !((d) & ((d) - 1))) + +/*! \brief Wrap to upper bound based on start and step size + + Return the smallest element in the series s, s+t, s+2*t, + s+3*t, ... that is greater than or equal to \c v. +*/ +#define UBOUNDSS(v,start,step) (((v)<=(start))?(start):(start)+((((v)-((start)+1))/(step))+1)*(step)) + +/* \brief Length of an array +*/ +#define ARRAYLENGTH(x) (sizeof(x)/sizeof(x[0])) + +/*! \brief Generic version type*/ +typedef struct tag_khm_version { + khm_ui_2 major; /*!< Major version number */ + khm_ui_2 minor; /*!< Minor version number */ + khm_ui_2 patch; /*!< Patch level */ + khm_ui_2 aux; /*!< Auxilary level (usually carries a build number) */ +} khm_version; + +/*@}*/ +#endif --- krb5-1.4.4.orig/src/windows/identity/include/khmsgtypes.h +++ krb5-1.4.4/src/windows/identity/include/khmsgtypes.h @@ -1,814 +1,814 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHMSGTYPES_H -#define __KHIMAIRA_KHMSGTYPES_H - -/*! \addtogroup kmq -@{*/ -/*! \defgroup kmq_msg Message Types -@{*/ - -/*! \name Global message types -@{*/ - -/*! \brief System messages. - - All subscribers are subscribed to the system message class by default. - - \see \ref kmq_msg_system -*/ -#define KMSG_SYSTEM 0 - -/*! \brief Ad-hoc messages. - - These are messages that are sent through add hoc publishers and - subscribers. -*/ -#define KMSG_ADHOC 1 - -/*! \brief NetIDMgr Credentials Database messages - - These messages notify subscribers of events related to the - credentials database, such as the registration, unregistration and - modification of identities, attributes, attribute types and - credential types. It also provides notifications of changes to - the root crednetial set. - - \see \ref kmq_msg_kcdb -*/ -#define KMSG_KCDB 2 - -/*! \brief NetIDMgr Module Manager messages - - \see \ref kmq_msg_kmm -*/ -#define KMSG_KMM 3 - -/*! \brief NetIDMgr Credential messages - - Notifications of crednetial events. These are the most important - events that a credentials provider should respond to. The - notifications provide co-oridination between credential providers - for performing basic credentials management tasks such as - obtaining new credentials for an identity, deleting credentials - for an identity, obtaining or deleting credentials of a particular - type for an identity etc. - - \see \ref cred_msgs - \see \ref kmq_msg_cred - */ -#define KMSG_CRED 4 - -/*! \brief Action list messages - - Notifications of changes in action state and firing of custom - actions. - - \see \ref kmq_msg_act - */ -#define KMSG_ACT 5 - -/*! \brief Alert messages - - Notifier is the component which displays alerts and error messages - when the NetIDMgr window is normally in operation and which - displays balloon prompts when the window is minimized to alert the - user to important messages such as credentials expiring etc. - - \note This is an internal message class. Components that are not - the notifier should not be subscribing to alert messages. - - \see \ref kmq_msg_alert - */ -#define KMSG_ALERT 6 - -/*! \brief Identity messages - - These are messages that are sent to the identity provider. These - are generally dispatched through a specific subscription object - and are not broadcast. - - \see \ref kmq_msg_ident - */ -#define KMSG_IDENT 7 - -/*! \brief Base message type ID for customized message types - */ -#define KMSGBASE_USER 16 - -/*@}*/ - -/*! \defgroup kmq_msg_system KMSG_SYSTEM subtypes -@{*/ -/*! \brief Generic initialization message - - This message is used by specific components to signal that the - recipient is to perform initialization tasks. As a convention, - the recipient should return KHM_ERROR_SUCCESS if it successfully - performed the initlization tasks or some other value if it failed - to do so. Failure to successfully initialize is usually taken to - mean that the recipient component is not able to perform its - function. - - Usually this is the first message to be received by the recipient. - - \see \ref pi_pt_cred_init - */ -#define KMSG_SYSTEM_INIT 1 - -/*! \brief Generic uninitialization message - - Used by specific components to signal that the recipient should - perform uninitilization tasks in preparation of termination. The - return value of this message is not used. - - Usually this is the last message to be received by the recipient. - - \see \ref pi_pt_cred_exit - */ -#define KMSG_SYSTEM_EXIT 2 - -/*! \brief Message completion - - This is an internal message - */ -#define KMSG_SYSTEM_COMPLETION 3 -/*@}*/ - -/*! \defgroup kmq_msg_kcdb KMSG_KCDB subtypes -@{*/ -#define KMSG_KCDB_IDENT 1 -#define KMSG_KCDB_CREDTYPE 2 -#define KMSG_KCDB_ATTRIB 3 -#define KMSG_KCDB_TYPE 4 - -/*! \brief Generic credentials request - - \see ::kcdb_cred_request for more information - */ -#define KMSG_KCDB_REQUEST 256 -/*@}*/ - -/*! \defgroup kmq_msg_kmm KMSG_KMM subtypes -@{*/ -#define KMSG_KMM_I_REG 1 - -#define KMSG_KMM_I_DONE 2 -/*@}*/ - -/*! \defgroup kmq_msg_act KMSG_ACT subtypes - @{*/ - -/*! \brief One or more actions changed state - - This message is sent in response to a call to - khui_enable_actions() or khui_enable_action() and indicates that - one or more actions have changed their state. - */ -#define KMSG_ACT_ENABLE 1 - -/*! \brief One or more actions changed check state - - Sent in response to khui_check_radio_action() or - khui_check_action() and indicates that one or more actions have - either been checked or unchecked. - */ -#define KMSG_ACT_CHECK 2 - -/*! \brief Refresh action states - - Sent after a batch of modifications were made to action states. - */ -#define KMSG_ACT_REFRESH 3 - -/*! \brief A new action was created - - Sent when a new custom action was created. The \a uparam - parameter of the message contains the identifier of the newly - created action. -*/ -#define KMSG_ACT_NEW 4 - -/*! \brief A custom action was deleted - - Sent after a custom action is deleted. The \a uparam parameter of - the message contains the identifier of the deleted action. - */ -#define KMSG_ACT_DELETE 5 - -/*! \brief A custom action has been activated - - When a custom action is activated, then the listener of that - custom action receives this message. Note that only the listener - for that custom action will receive this notification. - - \a uparam of the message is set to the identifier of the custom - action. - */ -#define KMSG_ACT_ACTIVATE 6 - -/*! \brief Internal */ -#define KMSG_ACT_BEGIN_CMDLINE 128 - -/*! \brief Internal */ -#define KMSG_ACT_CONTINUE_CMDLINE 129 - -/*! \brief Internal */ -#define KMSG_ACT_SYNC_CFG 130 - -/*@}*/ - -/*! \defgroup kmq_msg_cred KMSG_CRED subtypes - @{*/ -/*! \brief Root credential set changed - - This message is issued when the root credential set successfully - collected credentials from another credential set. - - \a uparam of the message is set to a bitmask indicating the change - that occured. It is a combination of ::KCDB_DELTA_ADD, - ::KCDB_DELTA_DEL and ::KCDB_DELTA_MODIFY. - */ -#define KMSG_CRED_ROOTDELTA 1 - -/*! \brief Re-enumerate credentials - - A notice to all credential providers to re-enumerate their - respective credentials. - - \note May be sent to individual credential subscriptions. - */ -#define KMSG_CRED_REFRESH 2 - -/*! \brief Change the password - - This message notifies credentials providers that a password change - request has been received. - - A plug-in handling this message that wishes to participate in the - password change operation is expected to add a - ::khui_new_creds_by_type to the list of participants in the - ::khui_new_creds structure by calling khui_cw_add_type(). - - The password change operation requires user interaction. Any - plug-ins that are participating in the operation need to provide a - user-interface. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \see khui_cw_add_type(), ::khui_new_creds, ::khui_new_creds_by_type - */ -#define KMSG_CRED_PASSWORD 16 - -/*! \brief Initiate the process of obtaining new credentials - - The UI sends this message to start the process of obtaining new - credentials. See \ref cred_acq for more information about - handling this message. - - A plug-in handling this message that wishes to participate in the - new credentials acquisition operation is expected to add a - ::khui_new_creds_by_type to hte list of participants in the - ::khui_new_creds structure by calling khui_cw_add_type(). - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \see \ref cred_acq, khui_cw_add_type(), ::khui_new_creds, - ::khui_new_creds_by_type - */ -#define KMSG_CRED_NEW_CREDS 17 - -/*! \brief Renew credentials - - This is a notification sent to individual credentials providers - that a specified identity's credentials should be renewed. - - A plug-in handling this message that wishes to participate in the - renew credentials operation is expected to add a - ::khui_new_creds_by_type to the list of participants in the - ::khui_new_creds structure by calling khui_cw_add_type(). - - Message parameters: - - \b vparam : Pointer to a khui_new_creds object - - \see khui_cw_add_type(), ::khui_new_creds, - ::khui_new_creds_by_type - */ -#define KMSG_CRED_RENEW_CREDS 18 - -/*! \brief Dialog setup - - Once ::KMSG_CRED_NEW_CREDS has been responded to by all the - credential types, the UI creates the dialog windows using the data - supplied in the ::khui_new_creds_by_type structures and issues - this message. Each credentials provider is expected to respond by - finalizing dialog creation operations. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \note May be sent to individual credential subscriptions. - */ -#define KMSG_CRED_DIALOG_SETUP 19 - -/*! \brief Dialog pre-start - - Sent after all the credentials providers have responded to - ::KMSG_CRED_DIALOG_SETUP and all the initialization has been - completed. Credentials providers are expected to respond to this - message by loading any default data into the dialog controls for - each credential type. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \note May be sent to individual credential subscriptions. - */ -#define KMSG_CRED_DIALOG_PRESTART 20 - -/*! \brief Dialog start - - A notification that the dialog is now in progress. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \note May be sent to individual credential subscriptions. - */ -#define KMSG_CRED_DIALOG_START 21 - -/*! \brief The primary identity of the new credentials dialog has changed - - This message is not sent out by the UI, but is reserved here for - use by individual credentials providers. The message may be sent - from the dialog procedure to the plugin. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \note Be careful when sending this message. All messages that are - not sent by the system should not be sent via broadcast. - Instead, create a subscription using kmq_create_subscription() - for the individual plugin that you want to send the message - and use one of the per-subscription message functions to send - the actual message. - */ -#define KMSG_CRED_DIALOG_NEW_IDENTITY 22 - -/*! \brief New credentials options have changed. - - This message is not sent out by the UI, but is reserved here for - use by individual credentials providers. The message may be sent - from the dialog procedure to the plugin. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \note Be careful when sending this message. All messages that are - not sent by the system should not be sent via broadcast. - Instead, create a subscription using kmq_create_subscription() - for the individual plugin that you want to send the message - and use one of the per-subscription message functions to send - the actual message. - */ -#define KMSG_CRED_DIALOG_NEW_OPTIONS 23 - -/*! \brief Process dialog - - Sent to all the credential providers to look at the contents of - the given ::khui_new_creds structure and do any required - processing. - - If the \a result field in the structure is set to - ::KHUI_NC_RESULT_PROCESS, then new credentials should be - obtained using the given data. - - Set the \a response field in the structure to indicate how the UI - should proceed from here. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \note May be sent to individual credential subscriptions. - */ -#define KMSG_CRED_PROCESS 24 - -/*! \brief End a credentials acquisition operation - - A notification that the credentials acquisition operation has - ended. - - Message parameters: - - \b vparam : pointer to a ::khui_new_creds structure - - \note May be sent to individual credential subscriptions. - */ -#define KMSG_CRED_END 25 - -/*! \brief Import credentials from the operating system - - Notification to all credentials providers to import any available - credentials from the operating system. - - Message parameters: - - This message does not have any parameters -*/ -#define KMSG_CRED_IMPORT 26 - -/*! \brief Destroy credentials - - Notification that the specified credentials should be destroyed. - Once this message has completed processing a ::KMSG_CRED_REFRESH - message will be issued. - - The credentials that should be destroyed are specified by a - ::khui_action_context structure. The context that should be used - is the selection context. Hence, the credentials that must be - destroyed are the ones lised in the credential set (\a credset). - - Message parameters: - - - \b upram : Unused. Zero. - - - \b vparam : pointer to a ::khui_action_context structure which - describes which credentials need to be destroyed. - - */ -#define KMSG_CRED_DESTROY_CREDS 32 - -#if 0 -/*! \brief Parse an identity - - \note May be sent to individual credential subscriptions. - */ -#define KMSG_CRED_IDENT_PARSE 65 -#endif - -/*! \brief A property page is being launced - - Handlers of this message should determine whether or not they - should participate in the property sheet and if so, add a - ::khui_property_page structure to the property sheet. - - Message parameters: - - \b vparam : pointer to a ::khui_property_sheet structure - */ -#define KMSG_CRED_PP_BEGIN 128 - -/*! \brief A property page is about to be created - - Message parameters: - - \b vparam : pointer to a ::khui_property_sheet structure - - \note This message is merely a notification that the property - sheet is being created. Handlers should not modify the state - of the property sheet or pages at this time. - */ -#define KMSG_CRED_PP_PRECREATE 129 - -/*! \brief A property page has finished processing - - Handlers of this message should remove any ::khui_property_page - structures they added when processing ::KMSG_CRED_PP_BEGIN. - - Message parameters: - - \b vparam : pointer to a ::khui_property_sheet structure - */ -#define KMSG_CRED_PP_END 130 - -/*! \brief A property page has been destroyed - - Message parameters: - - \b vparam : pointer to a ::khui_property_sheet structure - - \note This is a notification that the property sheet processing - has been completed and that the property sheet data structures - should be freed. Any property page data structures should - have already been freed while processing KMSG_CRED_PP_END. - The validity of the ::khui_property_sheet structure should not - be relied upon while processing this message. - */ -#define KMSG_CRED_PP_DESTROY 131 - -/*! \brief An IP address change occurred - - There are no parameters for this message. The NetIDMgr - application handles this message and depending on configuration, - posts message for the individual credentials providers to either - obtain new credentials or renew old ones. - */ -#define KMSG_CRED_ADDR_CHANGE 140 - -/*! \brief Check if a KMSG_CRED subtype is a credentials acquisition message - - Dialog messages are those that deal with the new or initial - credentials acquisition dialog, from initial announcement to - dialog completion. - - Currently, the dialog messages are: - - ::KMSG_CRED_NEW_CREDS - - ::KMSG_CRED_RENEW_CREDS - - ::KMSG_CRED_DIALOG_SETUP - - ::KMSG_CRED_DIALOG_PRESTART - - ::KMSG_CRED_DIALOG_START - - ::KMSG_CRED_DIALOG_NEW_IDENTITY - - ::KMSG_CRED_DIALOG_NEW_OPTIONS - - ::KMSG_CRED_PROCESS - - ::KMSG_CRED_END - - All dialog message numbers are allocated in a contigous block. - - Note that while ::KMSG_CRED_PROCESS and ::KMSG_CRED_END are not - specific to dialogs, they are still included in this predicate - because they are also part of the dialog message sequence. - */ -#define IS_CRED_ACQ_MSG(msg) ((msg) >= 16 && (msg) <=31) - -/*@}*/ /* /KMSG_CRED subtypes */ - -/*! \defgroup kmq_msg_alert KMSG_ALERT Subtypes - @{*/ - -/*! \brief Show an alert - - Message parameters: - - \b vparam : held pointer to a ::khui_alert object - - \note The ::khui_alert object will be released when the processing - of this message completes. - */ -#define KMSG_ALERT_SHOW 1 - -/*! \brief Add an alert to the alert queue - - Message parameters: - - \b vparam : held pointer to a ::khui_alert object - - \note the ::khui_alert object will be released when the queued - messages are displayed. - */ -#define KMSG_ALERT_QUEUE 2 - -/*! \brief Show the next queued alert - - There are no message parameters - */ -#define KMSG_ALERT_SHOW_QUEUED 3 - -/*! \brief Check if there are any queued messages and, if so, update the statusbar - - There are no message parameters - */ -#define KMSG_ALERT_CHECK_QUEUE 4 - -/*! \brief Show a modal alert - - Message parameters: - - \b vparam : held pointer to a ::khui_alert object. - - \note the ::khui_alert object will be released when the queued - messages are displayed. - */ -#define KMSG_ALERT_SHOW_MODAL 5 - -/*@}*/ - -/*! \defgroup kmq_msg_ident KMSG_IDENT Subtypes - @{*/ - -/*! \brief Initialize and start the identity provider - - - Sent by the KCDB to notify the identity provider that it is now - the current identity provider. - - Note that unlike regular plugins, an identity provider can be - loaded and inert (not provide any services). Also, the user may - switch between multiple identity providers on the fly. - */ -#define KMSG_IDENT_INIT 1 - -/*! \brief Stop the identity provider - - Sent by the KCDB as notificaton that the identity provider is no - longer the current provider. - */ -#define KMSG_IDENT_EXIT 2 - -/*! \brief Check if an identity name is valid - - This message is sent to the identity provider to verify the syntax - of an identity name. Note that only the syntax of the name is to - be verfied and not the actual physical existence of said identity. - - Message parameters: - - - \b vparam : pointer to ::kcdb_ident_name_xfer object. The - name to be validated will be in the \a name_src member. The - buffer will be NULL terminated with a maximum limit of - KCDB_IDENT_MAXCCH_NAME characters including the terminating - NULL, consisting only of characters in KCDB_IDENT_VALID_CHARS - The \a result member should be set to one of the following - depending on the result of the validation: - - - KHM_ERROR_SUCCESS : The name was valid - - KHM_ERROR_INVALID_NAME : The name was invalid - */ -#define KMSG_IDENT_VALIDATE_NAME 3 - -/*! \brief Check if an identity is valid - - Sent to the identity provider to verify the validity of the given - identity. The provider should verify that the identity exists and - is in a state where it can be actively used. - - Depending on the result of the validation, the flags of the - identity should be updated. - - Message parameters: - - \b vparam : Handle to an identity cast as a void pointer. - */ -#define KMSG_IDENT_VALIDATE_IDENTITY 4 - -/*! \brief Canonicalize identity name - - The identity provider will be given a name, which it should put in - canonical form, adjusting case and any character replacement or - doing any relevant expansions if applicable, and place it in the - supplied buffer. - - Message parameters: - - - \b vparam : Pointer to a ::kcdb_ident_name_xfer structure - which provides the identity name to canonicalize in the \a - name_src member, and the buffer to store the canonical name - in the \a name_dest member. The \a name_dest buffer is - guaranteed to be at least KCDB_IDENT_MAXCCH_NAME characters - in size. - - If the name cannot be canonicalized for some reason, the - destination buffer should be set to a zero-length string and the - \a result member of the ::kcdb_ident_name_xfer structure should be - set to the error code. If the destination buffer is set to a - zero-length string and \a result is KHM_ERROR_SUCCESS, then the - original name provided in \a name_src is assumed to be already in - canonical form. - */ -#define KMSG_IDENT_CANON_NAME 5 - -/*! \brief Compare names - - Compare two identity names. The names that are given aren't - guaranteed to be in canonical form. The return value should be - akin to strcmp(). - - Message parameters: - - - \b vparam : A pointer to a ::kcdb_ident_name_xfer structure. - The \a name_src member points at the first name, and the \a - name_alt member specifies the second name. The result of the - comparison should be place in \a result. - */ -#define KMSG_IDENT_COMPARE_NAME 6 - -/*! \brief Set the default identity - - Set or unset the default identity. To set the default identity, - the \a uparam parameter will be set to a non-zero value and a - handle to the identity will be specified in \a vparam. To unset - the default identity (i.e. not have a default identity), a zero - value will be specified in \a uparam and no identities will be - specified in \a vparam. - - When setting a default identity, the identity provider will - receive this message prior to the ::KCDB_IDENT_FLAG_DEFAULT bit - being set or reset on any identity. It should return - KHM_ERROR_SUCCESS if the requested operation can be performed. - Returning any other value will abort the operation and will leave - the default identity unchanged. - - When resetting the default identity, this message should be - treated only as a notification. - - Message parameters: - - - \a uparam : Is non-zero if an identity is being made default. If - this is zero, then identity should be the default. - - - \a vparam : A handle to the identity to be made default if \a - uparam is non-zero. NULL otherwise. - - Return value: - - - KHM_ERROR_SUCCESS : The identity should be marked as default - - Any other value : The identity should not be marked as default - - */ -#define KMSG_IDENT_SET_DEFAULT 7 - -/*! \brief Set an identity as searchable - - Set or reset the searchable bit on an identity. If the \a uparam - parameter is non-zero, then the searchable bit is being set. - Otherwise it is being reset. The identity provider should return - KHM_ERROR_SUCCESS in order to indicate that the identity should be - marked as searchable. Any other value will result in the - searchable bit being reset on the identity. - - Message parameters: - - - \a uparam : Is non-zero if the searchable bit is being set. Zero - otherwise. - - - \a vparam : Handle to the identity - - Return value: - - - KHM_ERROR_SUCCESS: The identity should be marked as searchable - - Any other value : The identity should not be marked as default - */ -#define KMSG_IDENT_SET_SEARCHABLE 8 - -/*! \brief Get information about an identity - - */ -#define KMSG_IDENT_GET_INFO 9 - -/*! \brief Enumerate known and accessible identities - */ -#define KMSG_IDENT_ENUM_KNOWN 10 - -/*! \brief Update information about an identity - */ -#define KMSG_IDENT_UPDATE 11 - -/*! \brief Retrieve the user interface callback function - - When obtaining new credentials, the user interface needs to obtain - a callback function which will provide identity selection - controls. - - Message parameters: - - - \a uparam : Not used - - - \a vparam : pointer to a ::khui_ident_new_creds_cb which will - receive the call back. - */ -#define KMSG_IDENT_GET_UI_CALLBACK 12 - -/*! \brief Notification of the creation of an identity - - This should be considered just a notification. The identit - provider does not have an opportunity to veto the creation of an - identity whose name has been found to be valid. However, when - handing this notification, the identity provider can: - - - Change the flags of the identity and/or marking the identity as - invalid. - - - Change the default identity. - - Note that this notification is sent before the general :;KMSG_KCDB - notification of the identity creation is sent. - - Message parameters: - - - \a uparam : Not used. - - - \p vparam : handle to the identity - */ -#define KMSG_IDENT_NOTIFY_CREATE 13 - -/*@}*/ /* /KMSG_IDENT subtypes */ - -/*@}*/ /* / message types */ -/*@}*/ /* / kmq */ - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHMSGTYPES_H +#define __KHIMAIRA_KHMSGTYPES_H + +/*! \addtogroup kmq +@{*/ +/*! \defgroup kmq_msg Message Types +@{*/ + +/*! \name Global message types +@{*/ + +/*! \brief System messages. + + All subscribers are subscribed to the system message class by default. + + \see \ref kmq_msg_system +*/ +#define KMSG_SYSTEM 0 + +/*! \brief Ad-hoc messages. + + These are messages that are sent through add hoc publishers and + subscribers. +*/ +#define KMSG_ADHOC 1 + +/*! \brief NetIDMgr Credentials Database messages + + These messages notify subscribers of events related to the + credentials database, such as the registration, unregistration and + modification of identities, attributes, attribute types and + credential types. It also provides notifications of changes to + the root crednetial set. + + \see \ref kmq_msg_kcdb +*/ +#define KMSG_KCDB 2 + +/*! \brief NetIDMgr Module Manager messages + + \see \ref kmq_msg_kmm +*/ +#define KMSG_KMM 3 + +/*! \brief NetIDMgr Credential messages + + Notifications of crednetial events. These are the most important + events that a credentials provider should respond to. The + notifications provide co-oridination between credential providers + for performing basic credentials management tasks such as + obtaining new credentials for an identity, deleting credentials + for an identity, obtaining or deleting credentials of a particular + type for an identity etc. + + \see \ref cred_msgs + \see \ref kmq_msg_cred + */ +#define KMSG_CRED 4 + +/*! \brief Action list messages + + Notifications of changes in action state and firing of custom + actions. + + \see \ref kmq_msg_act + */ +#define KMSG_ACT 5 + +/*! \brief Alert messages + + Notifier is the component which displays alerts and error messages + when the NetIDMgr window is normally in operation and which + displays balloon prompts when the window is minimized to alert the + user to important messages such as credentials expiring etc. + + \note This is an internal message class. Components that are not + the notifier should not be subscribing to alert messages. + + \see \ref kmq_msg_alert + */ +#define KMSG_ALERT 6 + +/*! \brief Identity messages + + These are messages that are sent to the identity provider. These + are generally dispatched through a specific subscription object + and are not broadcast. + + \see \ref kmq_msg_ident + */ +#define KMSG_IDENT 7 + +/*! \brief Base message type ID for customized message types + */ +#define KMSGBASE_USER 16 + +/*@}*/ + +/*! \defgroup kmq_msg_system KMSG_SYSTEM subtypes +@{*/ +/*! \brief Generic initialization message + + This message is used by specific components to signal that the + recipient is to perform initialization tasks. As a convention, + the recipient should return KHM_ERROR_SUCCESS if it successfully + performed the initlization tasks or some other value if it failed + to do so. Failure to successfully initialize is usually taken to + mean that the recipient component is not able to perform its + function. + + Usually this is the first message to be received by the recipient. + + \see \ref pi_pt_cred_init + */ +#define KMSG_SYSTEM_INIT 1 + +/*! \brief Generic uninitialization message + + Used by specific components to signal that the recipient should + perform uninitilization tasks in preparation of termination. The + return value of this message is not used. + + Usually this is the last message to be received by the recipient. + + \see \ref pi_pt_cred_exit + */ +#define KMSG_SYSTEM_EXIT 2 + +/*! \brief Message completion + + This is an internal message + */ +#define KMSG_SYSTEM_COMPLETION 3 +/*@}*/ + +/*! \defgroup kmq_msg_kcdb KMSG_KCDB subtypes +@{*/ +#define KMSG_KCDB_IDENT 1 +#define KMSG_KCDB_CREDTYPE 2 +#define KMSG_KCDB_ATTRIB 3 +#define KMSG_KCDB_TYPE 4 + +/*! \brief Generic credentials request + + \see ::kcdb_cred_request for more information + */ +#define KMSG_KCDB_REQUEST 256 +/*@}*/ + +/*! \defgroup kmq_msg_kmm KMSG_KMM subtypes +@{*/ +#define KMSG_KMM_I_REG 1 + +#define KMSG_KMM_I_DONE 2 +/*@}*/ + +/*! \defgroup kmq_msg_act KMSG_ACT subtypes + @{*/ + +/*! \brief One or more actions changed state + + This message is sent in response to a call to + khui_enable_actions() or khui_enable_action() and indicates that + one or more actions have changed their state. + */ +#define KMSG_ACT_ENABLE 1 + +/*! \brief One or more actions changed check state + + Sent in response to khui_check_radio_action() or + khui_check_action() and indicates that one or more actions have + either been checked or unchecked. + */ +#define KMSG_ACT_CHECK 2 + +/*! \brief Refresh action states + + Sent after a batch of modifications were made to action states. + */ +#define KMSG_ACT_REFRESH 3 + +/*! \brief A new action was created + + Sent when a new custom action was created. The \a uparam + parameter of the message contains the identifier of the newly + created action. +*/ +#define KMSG_ACT_NEW 4 + +/*! \brief A custom action was deleted + + Sent after a custom action is deleted. The \a uparam parameter of + the message contains the identifier of the deleted action. + */ +#define KMSG_ACT_DELETE 5 + +/*! \brief A custom action has been activated + + When a custom action is activated, then the listener of that + custom action receives this message. Note that only the listener + for that custom action will receive this notification. + + \a uparam of the message is set to the identifier of the custom + action. + */ +#define KMSG_ACT_ACTIVATE 6 + +/*! \brief Internal */ +#define KMSG_ACT_BEGIN_CMDLINE 128 + +/*! \brief Internal */ +#define KMSG_ACT_CONTINUE_CMDLINE 129 + +/*! \brief Internal */ +#define KMSG_ACT_SYNC_CFG 130 + +/*@}*/ + +/*! \defgroup kmq_msg_cred KMSG_CRED subtypes + @{*/ +/*! \brief Root credential set changed + + This message is issued when the root credential set successfully + collected credentials from another credential set. + + \a uparam of the message is set to a bitmask indicating the change + that occured. It is a combination of ::KCDB_DELTA_ADD, + ::KCDB_DELTA_DEL and ::KCDB_DELTA_MODIFY. + */ +#define KMSG_CRED_ROOTDELTA 1 + +/*! \brief Re-enumerate credentials + + A notice to all credential providers to re-enumerate their + respective credentials. + + \note May be sent to individual credential subscriptions. + */ +#define KMSG_CRED_REFRESH 2 + +/*! \brief Change the password + + This message notifies credentials providers that a password change + request has been received. + + A plug-in handling this message that wishes to participate in the + password change operation is expected to add a + ::khui_new_creds_by_type to the list of participants in the + ::khui_new_creds structure by calling khui_cw_add_type(). + + The password change operation requires user interaction. Any + plug-ins that are participating in the operation need to provide a + user-interface. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \see khui_cw_add_type(), ::khui_new_creds, ::khui_new_creds_by_type + */ +#define KMSG_CRED_PASSWORD 16 + +/*! \brief Initiate the process of obtaining new credentials + + The UI sends this message to start the process of obtaining new + credentials. See \ref cred_acq for more information about + handling this message. + + A plug-in handling this message that wishes to participate in the + new credentials acquisition operation is expected to add a + ::khui_new_creds_by_type to hte list of participants in the + ::khui_new_creds structure by calling khui_cw_add_type(). + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \see \ref cred_acq, khui_cw_add_type(), ::khui_new_creds, + ::khui_new_creds_by_type + */ +#define KMSG_CRED_NEW_CREDS 17 + +/*! \brief Renew credentials + + This is a notification sent to individual credentials providers + that a specified identity's credentials should be renewed. + + A plug-in handling this message that wishes to participate in the + renew credentials operation is expected to add a + ::khui_new_creds_by_type to the list of participants in the + ::khui_new_creds structure by calling khui_cw_add_type(). + + Message parameters: + - \b vparam : Pointer to a khui_new_creds object + + \see khui_cw_add_type(), ::khui_new_creds, + ::khui_new_creds_by_type + */ +#define KMSG_CRED_RENEW_CREDS 18 + +/*! \brief Dialog setup + + Once ::KMSG_CRED_NEW_CREDS has been responded to by all the + credential types, the UI creates the dialog windows using the data + supplied in the ::khui_new_creds_by_type structures and issues + this message. Each credentials provider is expected to respond by + finalizing dialog creation operations. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \note May be sent to individual credential subscriptions. + */ +#define KMSG_CRED_DIALOG_SETUP 19 + +/*! \brief Dialog pre-start + + Sent after all the credentials providers have responded to + ::KMSG_CRED_DIALOG_SETUP and all the initialization has been + completed. Credentials providers are expected to respond to this + message by loading any default data into the dialog controls for + each credential type. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \note May be sent to individual credential subscriptions. + */ +#define KMSG_CRED_DIALOG_PRESTART 20 + +/*! \brief Dialog start + + A notification that the dialog is now in progress. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \note May be sent to individual credential subscriptions. + */ +#define KMSG_CRED_DIALOG_START 21 + +/*! \brief The primary identity of the new credentials dialog has changed + + This message is not sent out by the UI, but is reserved here for + use by individual credentials providers. The message may be sent + from the dialog procedure to the plugin. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \note Be careful when sending this message. All messages that are + not sent by the system should not be sent via broadcast. + Instead, create a subscription using kmq_create_subscription() + for the individual plugin that you want to send the message + and use one of the per-subscription message functions to send + the actual message. + */ +#define KMSG_CRED_DIALOG_NEW_IDENTITY 22 + +/*! \brief New credentials options have changed. + + This message is not sent out by the UI, but is reserved here for + use by individual credentials providers. The message may be sent + from the dialog procedure to the plugin. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \note Be careful when sending this message. All messages that are + not sent by the system should not be sent via broadcast. + Instead, create a subscription using kmq_create_subscription() + for the individual plugin that you want to send the message + and use one of the per-subscription message functions to send + the actual message. + */ +#define KMSG_CRED_DIALOG_NEW_OPTIONS 23 + +/*! \brief Process dialog + + Sent to all the credential providers to look at the contents of + the given ::khui_new_creds structure and do any required + processing. + + If the \a result field in the structure is set to + ::KHUI_NC_RESULT_PROCESS, then new credentials should be + obtained using the given data. + + Set the \a response field in the structure to indicate how the UI + should proceed from here. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \note May be sent to individual credential subscriptions. + */ +#define KMSG_CRED_PROCESS 24 + +/*! \brief End a credentials acquisition operation + + A notification that the credentials acquisition operation has + ended. + + Message parameters: + - \b vparam : pointer to a ::khui_new_creds structure + + \note May be sent to individual credential subscriptions. + */ +#define KMSG_CRED_END 25 + +/*! \brief Import credentials from the operating system + + Notification to all credentials providers to import any available + credentials from the operating system. + + Message parameters: + - This message does not have any parameters +*/ +#define KMSG_CRED_IMPORT 26 + +/*! \brief Destroy credentials + + Notification that the specified credentials should be destroyed. + Once this message has completed processing a ::KMSG_CRED_REFRESH + message will be issued. + + The credentials that should be destroyed are specified by a + ::khui_action_context structure. The context that should be used + is the selection context. Hence, the credentials that must be + destroyed are the ones lised in the credential set (\a credset). + + Message parameters: + + - \b upram : Unused. Zero. + + - \b vparam : pointer to a ::khui_action_context structure which + describes which credentials need to be destroyed. + + */ +#define KMSG_CRED_DESTROY_CREDS 32 + +#if 0 +/*! \brief Parse an identity + + \note May be sent to individual credential subscriptions. + */ +#define KMSG_CRED_IDENT_PARSE 65 +#endif + +/*! \brief A property page is being launced + + Handlers of this message should determine whether or not they + should participate in the property sheet and if so, add a + ::khui_property_page structure to the property sheet. + + Message parameters: + - \b vparam : pointer to a ::khui_property_sheet structure + */ +#define KMSG_CRED_PP_BEGIN 128 + +/*! \brief A property page is about to be created + + Message parameters: + - \b vparam : pointer to a ::khui_property_sheet structure + + \note This message is merely a notification that the property + sheet is being created. Handlers should not modify the state + of the property sheet or pages at this time. + */ +#define KMSG_CRED_PP_PRECREATE 129 + +/*! \brief A property page has finished processing + + Handlers of this message should remove any ::khui_property_page + structures they added when processing ::KMSG_CRED_PP_BEGIN. + + Message parameters: + - \b vparam : pointer to a ::khui_property_sheet structure + */ +#define KMSG_CRED_PP_END 130 + +/*! \brief A property page has been destroyed + + Message parameters: + - \b vparam : pointer to a ::khui_property_sheet structure + + \note This is a notification that the property sheet processing + has been completed and that the property sheet data structures + should be freed. Any property page data structures should + have already been freed while processing KMSG_CRED_PP_END. + The validity of the ::khui_property_sheet structure should not + be relied upon while processing this message. + */ +#define KMSG_CRED_PP_DESTROY 131 + +/*! \brief An IP address change occurred + + There are no parameters for this message. The NetIDMgr + application handles this message and depending on configuration, + posts message for the individual credentials providers to either + obtain new credentials or renew old ones. + */ +#define KMSG_CRED_ADDR_CHANGE 140 + +/*! \brief Check if a KMSG_CRED subtype is a credentials acquisition message + + Dialog messages are those that deal with the new or initial + credentials acquisition dialog, from initial announcement to + dialog completion. + + Currently, the dialog messages are: + - ::KMSG_CRED_NEW_CREDS + - ::KMSG_CRED_RENEW_CREDS + - ::KMSG_CRED_DIALOG_SETUP + - ::KMSG_CRED_DIALOG_PRESTART + - ::KMSG_CRED_DIALOG_START + - ::KMSG_CRED_DIALOG_NEW_IDENTITY + - ::KMSG_CRED_DIALOG_NEW_OPTIONS + - ::KMSG_CRED_PROCESS + - ::KMSG_CRED_END + + All dialog message numbers are allocated in a contigous block. + + Note that while ::KMSG_CRED_PROCESS and ::KMSG_CRED_END are not + specific to dialogs, they are still included in this predicate + because they are also part of the dialog message sequence. + */ +#define IS_CRED_ACQ_MSG(msg) ((msg) >= 16 && (msg) <=31) + +/*@}*/ /* /KMSG_CRED subtypes */ + +/*! \defgroup kmq_msg_alert KMSG_ALERT Subtypes + @{*/ + +/*! \brief Show an alert + + Message parameters: + - \b vparam : held pointer to a ::khui_alert object + + \note The ::khui_alert object will be released when the processing + of this message completes. + */ +#define KMSG_ALERT_SHOW 1 + +/*! \brief Add an alert to the alert queue + + Message parameters: + - \b vparam : held pointer to a ::khui_alert object + + \note the ::khui_alert object will be released when the queued + messages are displayed. + */ +#define KMSG_ALERT_QUEUE 2 + +/*! \brief Show the next queued alert + + There are no message parameters + */ +#define KMSG_ALERT_SHOW_QUEUED 3 + +/*! \brief Check if there are any queued messages and, if so, update the statusbar + + There are no message parameters + */ +#define KMSG_ALERT_CHECK_QUEUE 4 + +/*! \brief Show a modal alert + + Message parameters: + - \b vparam : held pointer to a ::khui_alert object. + + \note the ::khui_alert object will be released when the queued + messages are displayed. + */ +#define KMSG_ALERT_SHOW_MODAL 5 + +/*@}*/ + +/*! \defgroup kmq_msg_ident KMSG_IDENT Subtypes + @{*/ + +/*! \brief Initialize and start the identity provider + + + Sent by the KCDB to notify the identity provider that it is now + the current identity provider. + + Note that unlike regular plugins, an identity provider can be + loaded and inert (not provide any services). Also, the user may + switch between multiple identity providers on the fly. + */ +#define KMSG_IDENT_INIT 1 + +/*! \brief Stop the identity provider + + Sent by the KCDB as notificaton that the identity provider is no + longer the current provider. + */ +#define KMSG_IDENT_EXIT 2 + +/*! \brief Check if an identity name is valid + + This message is sent to the identity provider to verify the syntax + of an identity name. Note that only the syntax of the name is to + be verfied and not the actual physical existence of said identity. + + Message parameters: + + - \b vparam : pointer to ::kcdb_ident_name_xfer object. The + name to be validated will be in the \a name_src member. The + buffer will be NULL terminated with a maximum limit of + KCDB_IDENT_MAXCCH_NAME characters including the terminating + NULL, consisting only of characters in KCDB_IDENT_VALID_CHARS + The \a result member should be set to one of the following + depending on the result of the validation: + + - KHM_ERROR_SUCCESS : The name was valid + - KHM_ERROR_INVALID_NAME : The name was invalid + */ +#define KMSG_IDENT_VALIDATE_NAME 3 + +/*! \brief Check if an identity is valid + + Sent to the identity provider to verify the validity of the given + identity. The provider should verify that the identity exists and + is in a state where it can be actively used. + + Depending on the result of the validation, the flags of the + identity should be updated. + + Message parameters: + - \b vparam : Handle to an identity cast as a void pointer. + */ +#define KMSG_IDENT_VALIDATE_IDENTITY 4 + +/*! \brief Canonicalize identity name + + The identity provider will be given a name, which it should put in + canonical form, adjusting case and any character replacement or + doing any relevant expansions if applicable, and place it in the + supplied buffer. + + Message parameters: + + - \b vparam : Pointer to a ::kcdb_ident_name_xfer structure + which provides the identity name to canonicalize in the \a + name_src member, and the buffer to store the canonical name + in the \a name_dest member. The \a name_dest buffer is + guaranteed to be at least KCDB_IDENT_MAXCCH_NAME characters + in size. + + If the name cannot be canonicalized for some reason, the + destination buffer should be set to a zero-length string and the + \a result member of the ::kcdb_ident_name_xfer structure should be + set to the error code. If the destination buffer is set to a + zero-length string and \a result is KHM_ERROR_SUCCESS, then the + original name provided in \a name_src is assumed to be already in + canonical form. + */ +#define KMSG_IDENT_CANON_NAME 5 + +/*! \brief Compare names + + Compare two identity names. The names that are given aren't + guaranteed to be in canonical form. The return value should be + akin to strcmp(). + + Message parameters: + + - \b vparam : A pointer to a ::kcdb_ident_name_xfer structure. + The \a name_src member points at the first name, and the \a + name_alt member specifies the second name. The result of the + comparison should be place in \a result. + */ +#define KMSG_IDENT_COMPARE_NAME 6 + +/*! \brief Set the default identity + + Set or unset the default identity. To set the default identity, + the \a uparam parameter will be set to a non-zero value and a + handle to the identity will be specified in \a vparam. To unset + the default identity (i.e. not have a default identity), a zero + value will be specified in \a uparam and no identities will be + specified in \a vparam. + + When setting a default identity, the identity provider will + receive this message prior to the ::KCDB_IDENT_FLAG_DEFAULT bit + being set or reset on any identity. It should return + KHM_ERROR_SUCCESS if the requested operation can be performed. + Returning any other value will abort the operation and will leave + the default identity unchanged. + + When resetting the default identity, this message should be + treated only as a notification. + + Message parameters: + + - \a uparam : Is non-zero if an identity is being made default. If + this is zero, then identity should be the default. + + - \a vparam : A handle to the identity to be made default if \a + uparam is non-zero. NULL otherwise. + + Return value: + + - KHM_ERROR_SUCCESS : The identity should be marked as default + - Any other value : The identity should not be marked as default + + */ +#define KMSG_IDENT_SET_DEFAULT 7 + +/*! \brief Set an identity as searchable + + Set or reset the searchable bit on an identity. If the \a uparam + parameter is non-zero, then the searchable bit is being set. + Otherwise it is being reset. The identity provider should return + KHM_ERROR_SUCCESS in order to indicate that the identity should be + marked as searchable. Any other value will result in the + searchable bit being reset on the identity. + + Message parameters: + + - \a uparam : Is non-zero if the searchable bit is being set. Zero + otherwise. + + - \a vparam : Handle to the identity + + Return value: + + - KHM_ERROR_SUCCESS: The identity should be marked as searchable + - Any other value : The identity should not be marked as default + */ +#define KMSG_IDENT_SET_SEARCHABLE 8 + +/*! \brief Get information about an identity + + */ +#define KMSG_IDENT_GET_INFO 9 + +/*! \brief Enumerate known and accessible identities + */ +#define KMSG_IDENT_ENUM_KNOWN 10 + +/*! \brief Update information about an identity + */ +#define KMSG_IDENT_UPDATE 11 + +/*! \brief Retrieve the user interface callback function + + When obtaining new credentials, the user interface needs to obtain + a callback function which will provide identity selection + controls. + + Message parameters: + + - \a uparam : Not used + + - \a vparam : pointer to a ::khui_ident_new_creds_cb which will + receive the call back. + */ +#define KMSG_IDENT_GET_UI_CALLBACK 12 + +/*! \brief Notification of the creation of an identity + + This should be considered just a notification. The identit + provider does not have an opportunity to veto the creation of an + identity whose name has been found to be valid. However, when + handing this notification, the identity provider can: + + - Change the flags of the identity and/or marking the identity as + invalid. + + - Change the default identity. + + Note that this notification is sent before the general :;KMSG_KCDB + notification of the identity creation is sent. + + Message parameters: + + - \a uparam : Not used. + + - \p vparam : handle to the identity + */ +#define KMSG_IDENT_NOTIFY_CREATE 13 + +/*@}*/ /* /KMSG_IDENT subtypes */ + +/*@}*/ /* / message types */ +/*@}*/ /* / kmq */ + +#endif --- krb5-1.4.4.orig/src/windows/identity/include/Makefile +++ krb5-1.4.4/src/windows/identity/include/Makefile @@ -1,38 +1,38 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=include -!include <../config/Makefile.w32> - -INCFILES= \ - $(INCDIR)\khdefs.h \ - $(INCDIR)\kherror.h \ - $(INCDIR)\khlist.h \ - $(INCDIR)\khmsgtypes.h \ - $(INCDIR)\netidmgr.h - -all: $(INCFILES) - -clean:: - $(RM) $(INCFILES) +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=include +!include <../config/Makefile.w32> + +INCFILES= \ + $(INCDIR)\khdefs.h \ + $(INCDIR)\kherror.h \ + $(INCDIR)\khlist.h \ + $(INCDIR)\khmsgtypes.h \ + $(INCDIR)\netidmgr.h + +all: $(INCFILES) + +clean:: + $(RM) $(INCFILES) --- krb5-1.4.4.orig/src/windows/identity/include/khlist.h +++ krb5-1.4.4/src/windows/identity/include/khlist.h @@ -1,173 +1,173 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/* Not exported */ -#ifndef _KHIMAIRA_KHLIST_H -#define _KHIMAIRA_KHLIST_H - -/* Note that most of these are "unsafe" macros. Not for general use */ - -/* LIFO lists */ -#define LDCL(type) \ - type * next; \ - type * prev - -#define LINIT(pe) \ - do { \ - (pe)->next = NULL; \ - (pe)->prev = NULL; } while(0) - -#define LPUSH(pph,pe) \ - do { \ - (pe)->next = *pph; \ - (pe)->prev = NULL; \ - if(*(pph)) (*(pph))->prev = (pe); \ - (*(pph)) = (pe); } while(0) - -#define LPOP(pph,ppe) \ - do { \ - *(ppe) = *(pph); \ - if(*(pph)) *(pph) = (*(pph))->next; \ - if(*(pph)) (*(pph))->prev = NULL; \ - if(*(ppe)) (*(ppe))->next = NULL; \ - } while(0) - -#define LDELETE(pph,pe) \ - do { \ - if((pe)->prev) (pe)->prev->next = (pe)->next; \ - if((pe)->next) (pe)->next->prev = (pe)->prev; \ - if(*(pph) == (pe)) *(pph) = (pe)->next; \ - (pe)->next = (pe)->prev = NULL; \ - } while(0) - -#define LEMPTY(pph) (*(pph) == NULL) - -#define LNEXT(pe) ((pe)?(pe)->next:NULL) - -#define LPREV(pe) ((pe)?(pe)->prev:NULL) - -/* Trees with LIFO child lists */ -#define TDCL(type) \ - LDCL(type); \ - type * children; \ - type * parent - -#define TINIT(pe) \ - do { \ - (pe)->children = NULL; \ - (pe)->parent = NULL; } while(0) - -#define TADDCHILD(pt,pe) \ - do { \ - LPUSH(&((pt)->children),(pe)); \ - (pe)->parent = (pt); } while(0) - -#define TFIRSTCHILD(pt) ((pt)?(pt)->children:NULL) - -#define TPOPCHILD(pt, ppe) \ - do { \ - LPOP(&((pt)->children), ppe); \ - if(*(ppe)) (*(ppe))->parent = NULL; \ - } while(0) - -#define TDELCHILD(pt, pe) \ - do { \ - LDELETE(&((pt)->children), (pe)); \ - (pe)->parent = NULL; } while(0) - -#define TPARENT(pe) ((pe)?(pe)->parent:NULL) - -/* FIFO lists */ -#define QDCL(type) \ - type * head; \ - type * tail - -#define QINIT(pq) \ - do { \ - (pq)->head = (pq)->tail = NULL; \ - } while(0) - -#define QPUT(pq, pe) \ - do { \ - LPUSH(&(pq)->tail, (pe)); \ - if(!(pq)->head) (pq)->head = (pe); \ - } while(0) - -#define QGET(pq, ppe) \ - do { \ - *(ppe) = (pq)->head; \ - if(*(ppe)) { \ - (pq)->head = (*(ppe))->prev; \ - if( (*(ppe))->prev ) (*(ppe))->prev->next = NULL; \ - (*(ppe))->prev = NULL; \ - if( (pq)->tail == *(ppe)) (pq)->tail = NULL; \ - } \ - } while(0) - -#define QDEL(pq, pe) \ - do { \ - if((pq)->head == (pe)) (pq)->head = LPREV(pe); \ - LDELETE(&((pq)->tail), (pe)); \ - } while(0) - - -#define QGETT(pq,ppe) \ - do { \ - *(ppe) = (pq)->tail; \ - if(*(ppe)) { \ - (pq)->tail = (*(ppe))->next; \ - if( (*(ppe))->next ) (*(ppe))->next->prev = NULL; \ - (*(ppe))->next = NULL; \ - if( (pq)->head == *(ppe)) (pq)->head = NULL; \ - } \ - } while(0) - -#define QTOP(pq) ((pq)->head) -#define QBOTTOM(pq) ((pq)->tail) -#define QNEXT(pe) ((pe)->prev) -#define QPREV(pe) ((pe)->next) - -/* Trees with FIFO child lists */ -#define TQDCL(type) \ - LDCL(type); \ - QDCL(type); \ - type * parent - -#define TQINIT(pe) \ - do { \ - QINIT(pe); \ - (pe)->parent = NULL; } while(0) - -#define TQADDCHILD(pt,pe) \ - do { \ - QPUT((pt), (pe)); \ - (pe)->parent = (pt); } while(0) - -#define TQFIRSTCHILD(pt) ((pt)?QTOP(pt):NULL) - -#define TQPARENT(pe) ((pe)?(pe)->parent:NULL) - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/* Not exported */ +#ifndef _KHIMAIRA_KHLIST_H +#define _KHIMAIRA_KHLIST_H + +/* Note that most of these are "unsafe" macros. Not for general use */ + +/* LIFO lists */ +#define LDCL(type) \ + type * next; \ + type * prev + +#define LINIT(pe) \ + do { \ + (pe)->next = NULL; \ + (pe)->prev = NULL; } while(0) + +#define LPUSH(pph,pe) \ + do { \ + (pe)->next = *pph; \ + (pe)->prev = NULL; \ + if(*(pph)) (*(pph))->prev = (pe); \ + (*(pph)) = (pe); } while(0) + +#define LPOP(pph,ppe) \ + do { \ + *(ppe) = *(pph); \ + if(*(pph)) *(pph) = (*(pph))->next; \ + if(*(pph)) (*(pph))->prev = NULL; \ + if(*(ppe)) (*(ppe))->next = NULL; \ + } while(0) + +#define LDELETE(pph,pe) \ + do { \ + if((pe)->prev) (pe)->prev->next = (pe)->next; \ + if((pe)->next) (pe)->next->prev = (pe)->prev; \ + if(*(pph) == (pe)) *(pph) = (pe)->next; \ + (pe)->next = (pe)->prev = NULL; \ + } while(0) + +#define LEMPTY(pph) (*(pph) == NULL) + +#define LNEXT(pe) ((pe)?(pe)->next:NULL) + +#define LPREV(pe) ((pe)?(pe)->prev:NULL) + +/* Trees with LIFO child lists */ +#define TDCL(type) \ + LDCL(type); \ + type * children; \ + type * parent + +#define TINIT(pe) \ + do { \ + (pe)->children = NULL; \ + (pe)->parent = NULL; } while(0) + +#define TADDCHILD(pt,pe) \ + do { \ + LPUSH(&((pt)->children),(pe)); \ + (pe)->parent = (pt); } while(0) + +#define TFIRSTCHILD(pt) ((pt)?(pt)->children:NULL) + +#define TPOPCHILD(pt, ppe) \ + do { \ + LPOP(&((pt)->children), ppe); \ + if(*(ppe)) (*(ppe))->parent = NULL; \ + } while(0) + +#define TDELCHILD(pt, pe) \ + do { \ + LDELETE(&((pt)->children), (pe)); \ + (pe)->parent = NULL; } while(0) + +#define TPARENT(pe) ((pe)?(pe)->parent:NULL) + +/* FIFO lists */ +#define QDCL(type) \ + type * head; \ + type * tail + +#define QINIT(pq) \ + do { \ + (pq)->head = (pq)->tail = NULL; \ + } while(0) + +#define QPUT(pq, pe) \ + do { \ + LPUSH(&(pq)->tail, (pe)); \ + if(!(pq)->head) (pq)->head = (pe); \ + } while(0) + +#define QGET(pq, ppe) \ + do { \ + *(ppe) = (pq)->head; \ + if(*(ppe)) { \ + (pq)->head = (*(ppe))->prev; \ + if( (*(ppe))->prev ) (*(ppe))->prev->next = NULL; \ + (*(ppe))->prev = NULL; \ + if( (pq)->tail == *(ppe)) (pq)->tail = NULL; \ + } \ + } while(0) + +#define QDEL(pq, pe) \ + do { \ + if((pq)->head == (pe)) (pq)->head = LPREV(pe); \ + LDELETE(&((pq)->tail), (pe)); \ + } while(0) + + +#define QGETT(pq,ppe) \ + do { \ + *(ppe) = (pq)->tail; \ + if(*(ppe)) { \ + (pq)->tail = (*(ppe))->next; \ + if( (*(ppe))->next ) (*(ppe))->next->prev = NULL; \ + (*(ppe))->next = NULL; \ + if( (pq)->head == *(ppe)) (pq)->head = NULL; \ + } \ + } while(0) + +#define QTOP(pq) ((pq)->head) +#define QBOTTOM(pq) ((pq)->tail) +#define QNEXT(pe) ((pe)->prev) +#define QPREV(pe) ((pe)->next) + +/* Trees with FIFO child lists */ +#define TQDCL(type) \ + LDCL(type); \ + QDCL(type); \ + type * parent + +#define TQINIT(pe) \ + do { \ + QINIT(pe); \ + (pe)->parent = NULL; } while(0) + +#define TQADDCHILD(pt,pe) \ + do { \ + QPUT((pt), (pe)); \ + (pe)->parent = (pt); } while(0) + +#define TQFIRSTCHILD(pt) ((pt)?QTOP(pt):NULL) + +#define TQPARENT(pe) ((pe)?(pe)->parent:NULL) + +#endif --- krb5-1.4.4.orig/src/windows/identity/include/kherror.h +++ krb5-1.4.4/src/windows/identity/include/kherror.h @@ -1,180 +1,180 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -/* Exported */ -#ifndef __KHIMAIRA_KHERROR_H -#define __KHIMAIRA_KHERROR_H - -/*! \defgroup kherror NetIDMgr errors - -@{*/ -/*! \brief Base for error codes - - NetIDMgr errors range from \a KHM_ERROR_BASE to KHM_ERROR_BASE + - KHM_ERROR_RANGE, with the exception of KHM_ERROR_SUCCESS and - KHM_ERROR_NONE. - */ -#define KHM_ERROR_BASE 0x40000000L - -/*! \brief Range for error codes - - NetIDMgr errors range from \a KHM_ERROR_BASE to - KHM_ERROR_BASE + KHM_ERROR_RANGE. -*/ -#define KHM_ERROR_RANGE 256L - -/*! \defgroup kherror_codes Error codes - @{*/ - -/*! \brief No error */ -#define KHM_ERROR_NONE 0x00000000L - -/*! \brief Success. Same as \a KHM_ERROR_NONE */ -#define KHM_ERROR_SUCCESS KHM_ERROR_NONE - -/*! \brief The supplied name was invalid */ -#define KHM_ERROR_INVALID_NAME (KHM_ERROR_BASE + 1) - -/*! \brief Too much data - - A supplied buffer was invalid, was of insufficient size, or a - buffer was of a larger size than expected - */ -#define KHM_ERROR_TOO_LONG (KHM_ERROR_BASE + 2) - -/*! \brief One or more parameters supplied to a function were invalid */ -#define KHM_ERROR_INVALID_PARAM (KHM_ERROR_BASE + 3) - -/*! \brief A duplicate. - - Usually means that something that should have been unique was - found to be not. - */ -#define KHM_ERROR_DUPLICATE (KHM_ERROR_BASE + 4) - -/*! \brief An object was not found - - An object referenced in a parameter was not found. - */ -#define KHM_ERROR_NOT_FOUND (KHM_ERROR_BASE + 5) - -/*! \brief The relevant subsystem is not ready - - Indicates that initialization has not been completed for a - subsystem. - */ -#define KHM_ERROR_NOT_READY (KHM_ERROR_BASE + 6) - -/*! \brief No more resources - - A limited resource has been exhausted. - */ -#define KHM_ERROR_NO_RESOURCES (KHM_ERROR_BASE + 7) - -/*! \brief Type mismatch - */ -#define KHM_ERROR_TYPE_MISMATCH (KHM_ERROR_BASE + 8) - -/*! \brief Already exists - - Usually indicates that an exclusive create operation failed due to - the existence of a similar object. Subtly different from - ::KHM_ERROR_DUPLICATE - */ -#define KHM_ERROR_EXISTS (KHM_ERROR_BASE + 9) - -/*! \brief Operation timed out - */ -#define KHM_ERROR_TIMEOUT (KHM_ERROR_BASE + 10) - -/*! \brief An EXIT message was received - */ -#define KHM_ERROR_EXIT (KHM_ERROR_BASE + 11) - -/*! \brief Unknown or unspecified error - */ -#define KHM_ERROR_UNKNOWN (KHM_ERROR_BASE + 12) - -/*! \brief General error - */ -#define KHM_ERROR_GENERAL KHM_ERROR_UNKNOWN - -/*! \brief An index was out of bounds - */ -#define KHM_ERROR_OUT_OF_BOUNDS (KHM_ERROR_BASE + 13) - -/*! \brief Object already deleted - - One or more objects that were referenced were found to have been - already deleted. - */ -#define KHM_ERROR_DELETED (KHM_ERROR_BASE + 14) - -/*! \brief Invalid operation - - The operation was not permitted to continue for some reason. - Usually because the necessary conditions for the operation haven't - been met yet or the operation can only be performed at certain - times during the execution of NetIDMgr. - */ -#define KHM_ERROR_INVALID_OPERATION (KHM_ERROR_BASE + 15) - -/*! \brief Signature check failed - */ -#define KHM_ERROR_INVALID_SIGNATURE (KHM_ERROR_BASE + 16) - -/*! \brief Not implemented yet - - The operation that was attempted involved invoking functionality - that has not been implemented yet. - */ -#define KHM_ERROR_NOT_IMPLEMENTED (KHM_ERROR_BASE + 17) - -/*! \brief The objects were equivalent - */ -#define KHM_ERROR_EQUIVALENT (KHM_ERROR_BASE + 18) - -/*! \brief No provider exists to service the request -*/ -#define KHM_ERROR_NO_PROVIDER (KHM_ERROR_BASE + 19) - -/*! \brief The operation succeeded, but with errors -*/ -#define KHM_ERROR_PARTIAL (KHM_ERROR_BASE + 20) - -/*! \brief An incompatibility was found */ -#define KHM_ERROR_INCOMPATIBLE (KHM_ERROR_BASE + 21) - -/*@}*/ /*kherror_codes*/ - -/*! \brief Tests whether a return value indicates success */ -#define KHM_SUCCEEDED(rv) ((rv)==KHM_ERROR_NONE) - -/*! \brief Tests whether a return value indicates failure */ -#define KHM_FAILED(rv) ((rv)!=KHM_ERROR_NONE) - -/*@}*/ -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +/* Exported */ +#ifndef __KHIMAIRA_KHERROR_H +#define __KHIMAIRA_KHERROR_H + +/*! \defgroup kherror NetIDMgr errors + +@{*/ +/*! \brief Base for error codes + + NetIDMgr errors range from \a KHM_ERROR_BASE to KHM_ERROR_BASE + + KHM_ERROR_RANGE, with the exception of KHM_ERROR_SUCCESS and + KHM_ERROR_NONE. + */ +#define KHM_ERROR_BASE 0x40000000L + +/*! \brief Range for error codes + + NetIDMgr errors range from \a KHM_ERROR_BASE to + KHM_ERROR_BASE + KHM_ERROR_RANGE. +*/ +#define KHM_ERROR_RANGE 256L + +/*! \defgroup kherror_codes Error codes + @{*/ + +/*! \brief No error */ +#define KHM_ERROR_NONE 0x00000000L + +/*! \brief Success. Same as \a KHM_ERROR_NONE */ +#define KHM_ERROR_SUCCESS KHM_ERROR_NONE + +/*! \brief The supplied name was invalid */ +#define KHM_ERROR_INVALID_NAME (KHM_ERROR_BASE + 1) + +/*! \brief Too much data + + A supplied buffer was invalid, was of insufficient size, or a + buffer was of a larger size than expected + */ +#define KHM_ERROR_TOO_LONG (KHM_ERROR_BASE + 2) + +/*! \brief One or more parameters supplied to a function were invalid */ +#define KHM_ERROR_INVALID_PARAM (KHM_ERROR_BASE + 3) + +/*! \brief A duplicate. + + Usually means that something that should have been unique was + found to be not. + */ +#define KHM_ERROR_DUPLICATE (KHM_ERROR_BASE + 4) + +/*! \brief An object was not found + + An object referenced in a parameter was not found. + */ +#define KHM_ERROR_NOT_FOUND (KHM_ERROR_BASE + 5) + +/*! \brief The relevant subsystem is not ready + + Indicates that initialization has not been completed for a + subsystem. + */ +#define KHM_ERROR_NOT_READY (KHM_ERROR_BASE + 6) + +/*! \brief No more resources + + A limited resource has been exhausted. + */ +#define KHM_ERROR_NO_RESOURCES (KHM_ERROR_BASE + 7) + +/*! \brief Type mismatch + */ +#define KHM_ERROR_TYPE_MISMATCH (KHM_ERROR_BASE + 8) + +/*! \brief Already exists + + Usually indicates that an exclusive create operation failed due to + the existence of a similar object. Subtly different from + ::KHM_ERROR_DUPLICATE + */ +#define KHM_ERROR_EXISTS (KHM_ERROR_BASE + 9) + +/*! \brief Operation timed out + */ +#define KHM_ERROR_TIMEOUT (KHM_ERROR_BASE + 10) + +/*! \brief An EXIT message was received + */ +#define KHM_ERROR_EXIT (KHM_ERROR_BASE + 11) + +/*! \brief Unknown or unspecified error + */ +#define KHM_ERROR_UNKNOWN (KHM_ERROR_BASE + 12) + +/*! \brief General error + */ +#define KHM_ERROR_GENERAL KHM_ERROR_UNKNOWN + +/*! \brief An index was out of bounds + */ +#define KHM_ERROR_OUT_OF_BOUNDS (KHM_ERROR_BASE + 13) + +/*! \brief Object already deleted + + One or more objects that were referenced were found to have been + already deleted. + */ +#define KHM_ERROR_DELETED (KHM_ERROR_BASE + 14) + +/*! \brief Invalid operation + + The operation was not permitted to continue for some reason. + Usually because the necessary conditions for the operation haven't + been met yet or the operation can only be performed at certain + times during the execution of NetIDMgr. + */ +#define KHM_ERROR_INVALID_OPERATION (KHM_ERROR_BASE + 15) + +/*! \brief Signature check failed + */ +#define KHM_ERROR_INVALID_SIGNATURE (KHM_ERROR_BASE + 16) + +/*! \brief Not implemented yet + + The operation that was attempted involved invoking functionality + that has not been implemented yet. + */ +#define KHM_ERROR_NOT_IMPLEMENTED (KHM_ERROR_BASE + 17) + +/*! \brief The objects were equivalent + */ +#define KHM_ERROR_EQUIVALENT (KHM_ERROR_BASE + 18) + +/*! \brief No provider exists to service the request +*/ +#define KHM_ERROR_NO_PROVIDER (KHM_ERROR_BASE + 19) + +/*! \brief The operation succeeded, but with errors +*/ +#define KHM_ERROR_PARTIAL (KHM_ERROR_BASE + 20) + +/*! \brief An incompatibility was found */ +#define KHM_ERROR_INCOMPATIBLE (KHM_ERROR_BASE + 21) + +/*@}*/ /*kherror_codes*/ + +/*! \brief Tests whether a return value indicates success */ +#define KHM_SUCCEEDED(rv) ((rv)==KHM_ERROR_NONE) + +/*! \brief Tests whether a return value indicates failure */ +#define KHM_FAILED(rv) ((rv)!=KHM_ERROR_NONE) + +/*@}*/ +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/statusbar.c +++ krb5-1.4.4/src/windows/identity/ui/statusbar.c @@ -1,191 +1,191 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#ifdef DEBUG -#include -#endif - -khm_statusbar_part khm_statusbar_parts[] = { - {KHUI_SBPART_INFO, 0, KHUI_SB_WTYPE_FILLER}, - {KHUI_SBPART_NOTICE, 40, KHUI_SB_WTYPE_RELATIVE}, - {KHUI_SBPART_LOC, 40, KHUI_SB_WTYPE_ABSOLUTE} -}; - -int khm_n_statusbar_parts = sizeof(khm_statusbar_parts) / sizeof(khm_statusbar_part); - -HWND khm_hwnd_statusbar = NULL; - -LRESULT -khm_statusbar_notify(LPNMHDR nmhdr) { - LPNMMOUSE pnmm; - - switch(nmhdr->code) { - case NM_CLICK: - case NM_DBLCLK: - pnmm = (LPNMMOUSE) nmhdr; - - if (pnmm->dwItemSpec >= (DWORD) khm_n_statusbar_parts) - return TRUE; - - if (khm_statusbar_parts[pnmm->dwItemSpec].id == KHUI_SBPART_NOTICE) { - /* means, show next notification */ - kmq_post_message(KMSG_ALERT, KMSG_ALERT_SHOW_QUEUED, 0, 0); - } - - return TRUE; - } - - return FALSE; -} - -void -khui_statusbar_set_parts(HWND parent) { - int i; - int fillerwidth; - int staticwidth; - int lastx; - int width; - RECT r; - INT * parts; - - GetClientRect(parent, &r); - width = r.right - r.left; - - /* calculate fillerwidth and staticwidth */ - staticwidth = 0; - for(i=0;i +#ifdef DEBUG +#include +#endif + +khm_statusbar_part khm_statusbar_parts[] = { + {KHUI_SBPART_INFO, 0, KHUI_SB_WTYPE_FILLER}, + {KHUI_SBPART_NOTICE, 40, KHUI_SB_WTYPE_RELATIVE}, + {KHUI_SBPART_LOC, 40, KHUI_SB_WTYPE_ABSOLUTE} +}; + +int khm_n_statusbar_parts = sizeof(khm_statusbar_parts) / sizeof(khm_statusbar_part); + +HWND khm_hwnd_statusbar = NULL; + +LRESULT +khm_statusbar_notify(LPNMHDR nmhdr) { + LPNMMOUSE pnmm; + + switch(nmhdr->code) { + case NM_CLICK: + case NM_DBLCLK: + pnmm = (LPNMMOUSE) nmhdr; + + if (pnmm->dwItemSpec >= (DWORD) khm_n_statusbar_parts) + return TRUE; + + if (khm_statusbar_parts[pnmm->dwItemSpec].id == KHUI_SBPART_NOTICE) { + /* means, show next notification */ + kmq_post_message(KMSG_ALERT, KMSG_ALERT_SHOW_QUEUED, 0, 0); + } + + return TRUE; + } + + return FALSE; +} + +void +khui_statusbar_set_parts(HWND parent) { + int i; + int fillerwidth; + int staticwidth; + int lastx; + int width; + RECT r; + INT * parts; + + GetClientRect(parent, &r); + width = r.right - r.left; + + /* calculate fillerwidth and staticwidth */ + staticwidth = 0; + for(i=0;i -#include -#include - -#if DEBUG -#include -#endif - -HINSTANCE khm_hInstance; -const wchar_t * khm_facility = L"NetIDMgr"; -int khm_nCmdShow; -khm_ui_4 khm_commctl_version = 0; - -khm_startup_options khm_startup; - -khm_version app_version = {KH_VERSION_LIST}; - -void khm_init_gui(void) { - khui_init_actions(); - khui_init_rescache(); - khui_init_menu(); - khui_init_toolbar(); - khm_init_notifier(); - khm_init_config(); - khm_init_debug(); -} - -void khm_exit_gui(void) { - khm_exit_debug(); - khm_exit_config(); - khm_exit_notifier(); - khui_exit_toolbar(); - khui_exit_menu(); - khui_exit_rescache(); - khui_exit_actions(); -} - -void khm_parse_commandline(void) { - LPWSTR wcmdline; - LPWSTR * wargs; - int wargc; - int i; - - ZeroMemory(&khm_startup, sizeof(khm_startup)); - - wcmdline = GetCommandLine(); - wargs = CommandLineToArgvW(wcmdline, &wargc); - - for (i=1; i= 0x501) - ((IS_COMMCTL6())? - ICC_LINK_CLASS | - ICC_STANDARD_CLASSES : - 0) | -#endif - 0; - - InitCommonControlsEx(&ics); - - khm_register_main_wnd_class(); - khm_register_credwnd_class(); - khm_register_htwnd_class(); - khm_register_passwnd_class(); - khm_register_newcredwnd_class(); - khm_register_propertywnd_class(); -} - -void khm_unregister_window_classes(void) { - khm_unregister_main_wnd_class(); - khm_unregister_credwnd_class(); - khm_unregister_htwnd_class(); - khm_unregister_passwnd_class(); - khm_unregister_newcredwnd_class(); - khm_unregister_propertywnd_class(); -} - - -/* we support up to 16 simutaneous dialogs. In reality, more than two - is pretty unlikely. Property sheets are special and are handled - separately. */ -#define MAX_UI_DIALOGS 16 - -typedef struct tag_khui_dialog { - HWND hwnd; - HWND hwnd_next; - BOOL active; -} khui_dialog; - -static khui_dialog khui_dialogs[MAX_UI_DIALOGS]; -static int n_khui_dialogs = 0; -static HWND khui_modal_dialog = NULL; -static BOOL khui_main_window_active; - -/* should only be called from the UI thread */ -void khm_add_dialog(HWND dlg) { - if(n_khui_dialogs < MAX_UI_DIALOGS - 1) { - khui_dialogs[n_khui_dialogs].hwnd = dlg; - khui_dialogs[n_khui_dialogs].hwnd_next = NULL; - /* we set .active=FALSE for now. We don't need this to have a - meaningful value until we enter a modal loop */ - khui_dialogs[n_khui_dialogs].active = FALSE; - n_khui_dialogs++; - } -#if DEBUG - else { - assert(FALSE); - } -#endif -} - -/* should only be called from the UI thread */ -void khm_enter_modal(HWND hwnd) { - int i; - - if (khui_modal_dialog) { - - /* we are already in a modal loop. */ - -#ifdef DEBUG - assert(hwnd != khui_modal_dialog); -#endif - - for (i=0; i < n_khui_dialogs; i++) { - if (khui_dialogs[i].hwnd == khui_modal_dialog) { - khui_dialogs[i].active = TRUE; - EnableWindow(khui_modal_dialog, FALSE); - break; - } - } - -#ifdef DEBUG - assert(i < n_khui_dialogs); -#endif - - for (i=0; i < n_khui_dialogs; i++) { - if (khui_dialogs[i].hwnd == hwnd) { - khui_dialogs[i].hwnd_next = khui_modal_dialog; - break; - } - } - -#ifdef DEBUG - assert(i < n_khui_dialogs); -#endif - - khui_modal_dialog = hwnd; - - } else { - - /* we are entering a modal loop. preserve the active state of - the overlapped dialogs and proceed with the modal - dialog. */ - - for (i=0; i < n_khui_dialogs; i++) { - if(khui_dialogs[i].hwnd != hwnd) { - khui_dialogs[i].active = IsWindowEnabled(khui_dialogs[i].hwnd); - EnableWindow(khui_dialogs[i].hwnd, FALSE); - } - } - - khui_main_window_active = khm_is_main_window_active(); - EnableWindow(khm_hwnd_main, FALSE); - - khui_modal_dialog = hwnd; - } -} - -/* should only be called from the UI thread */ -void khm_leave_modal(void) { - int i; - - for (i=0; i < n_khui_dialogs; i++) { - if (khui_dialogs[i].hwnd == khui_modal_dialog) - break; - } - -#ifdef DEBUG - assert(i < n_khui_dialogs); -#endif - - if (i < n_khui_dialogs && khui_dialogs[i].hwnd_next) { - - /* we need to proceed to the next one down the modal dialog - chain. We are not exiting a modal loop. */ - - khui_modal_dialog = khui_dialogs[i].hwnd_next; - khui_dialogs[i].hwnd_next = FALSE; - - EnableWindow(khui_modal_dialog, TRUE); - - } else { - - /* we are exiting a modal loop. */ - - for (i=0; i < n_khui_dialogs; i++) { - if(khui_dialogs[i].hwnd != khui_modal_dialog) { - EnableWindow(khui_dialogs[i].hwnd, khui_dialogs[i].active); - } - } - - EnableWindow(khm_hwnd_main, TRUE); - - khui_modal_dialog = NULL; - } -} - -/* should only be called from the UI thread */ -void khm_del_dialog(HWND dlg) { - int i; - for(i=0;i < n_khui_dialogs; i++) { - if(khui_dialogs[i].hwnd == dlg) - break; - } - - if(i < n_khui_dialogs) - n_khui_dialogs--; - else - return; - - for(;i < n_khui_dialogs; i++) { - khui_dialogs[i] = khui_dialogs[i+1]; - } -} - -BOOL khm_check_dlg_message(LPMSG pmsg) { - int i; - BOOL found = FALSE; - for(i=0;istatus == KHUI_PS_STATUS_DONE) { - ps = _ui_propsheets[i]; - - ps->status = KHUI_PS_STATUS_DESTROY; - kmq_post_message(KMSG_CRED, KMSG_CRED_PP_END, 0, (void *) ps); - - return TRUE; - } - return TRUE; - } - } - - return FALSE; -} - -static HACCEL ha_menu; - -WPARAM khm_message_loop_int(khm_boolean * p_exit) { - int r; - MSG msg; - - while((r = GetMessage(&msg, NULL, 0,0)) && - (p_exit == NULL || *p_exit)) { - if(r == -1) - break; - if(!khm_check_dlg_message(&msg) && - !khm_check_ps_message(&msg) && - !TranslateAccelerator(khm_hwnd_main, ha_menu, &msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - - return msg.wParam; -} - -WPARAM khm_message_loop(void) { - WPARAM w; - ha_menu = khui_create_global_accel_table(); - w = khm_message_loop_int(NULL); - DestroyAcceleratorTable(ha_menu); - return w; -} - -/* Handles all context closures which have a signalled error state. - If the context is a top level context, then the errors are - displayed. */ -void KHMAPI -khm_err_ctx_completion_handler(enum kherr_ctx_event evt, - kherr_context * c) { - kherr_event * e; - khui_alert * a; - - /* we only handle top level contexts here. For others, we allow - the child contexts to fold upward silently. */ - if (c->parent || !kherr_is_error_i(c)) - return; - - for(e = kherr_get_first_event(c); - e; - e = kherr_get_next_event(e)) { - - if (e->severity != KHERR_ERROR && e->severity != KHERR_WARNING) - continue; - - kherr_evaluate_event(e); - - /* we only report errors if there is enough information to - present a message. */ - if (e->short_desc && e->long_desc) { - - khui_alert_create_empty(&a); - - khui_alert_set_severity(a, e->severity); - khui_alert_set_title(a, e->short_desc); - khui_alert_set_message(a, e->long_desc); - if (e->suggestion) - khui_alert_set_suggestion(a, e->suggestion); - - khui_alert_queue(a); - - khui_alert_release(a); - } - } -} - -static wchar_t helpfile[MAX_PATH] = L""; - -HWND khm_html_help(HWND hwnd, wchar_t * suffix, - UINT command, DWORD_PTR data) { - - wchar_t gpath[MAX_PATH + MAX_PATH]; - - if (!*helpfile) { - DWORD dw; - wchar_t ppath[MAX_PATH]; - - dw = GetModuleFileName(NULL, ppath, ARRAYLENGTH(ppath)); - - if (dw == 0) { - StringCbCopy(helpfile, sizeof(helpfile), NIDM_HELPFILE); - } else { - PathRemoveFileSpec(ppath); - PathAppend(ppath, NIDM_HELPFILE); - StringCbCopy(helpfile, sizeof(helpfile), ppath); - } - } - - StringCbCopy(gpath, sizeof(gpath), helpfile); - - if (suffix) - StringCbCat(gpath, sizeof(gpath), suffix); - - return HtmlHelp(hwnd, gpath, command, data); -} - -void khm_load_default_modules(void) { - kmm_load_default_modules(); -} - -int WINAPI WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -{ - int rv = 0; - HANDLE h_appmutex; - BOOL slave = FALSE; - - khm_hInstance = hInstance; - khm_nCmdShow = nCmdShow; - - khm_parse_commandline(); - - if (khm_startup.error_exit) - return 0; - - h_appmutex = CreateMutex(NULL, FALSE, L"Local\\NetIDMgr_GlobalAppMutex"); - if (h_appmutex == NULL) - return 5; - if (GetLastError() == ERROR_ALREADY_EXISTS) - slave = TRUE; - - khc_load_schema(NULL, schema_uiconfig); - - _start_app: - - if(!slave) { - - /* set this so that we don't accidently invoke an API that - inadvertently puts up the new creds dialog at an - inopportune moment, like, say, during the new creds dialog - is open. This only affects this process, and any child - processes started by plugins. */ - SetEnvironmentVariable(L"KERBEROSLOGIN_NEVER_PROMPT", L"1"); - - khm_version_init(); - - khm_commctl_version = khm_get_commctl_version(NULL); - - /* we only open a main window if this is the only instance - of the application that is running. */ - kmq_init(); - kmm_init(); - khm_init_gui(); - - kmq_set_completion_handler(KMSG_CRED, kmsg_cred_completion); - - kherr_add_ctx_handler(khm_err_ctx_completion_handler, - KHERR_CTX_END, - 0); - - /* load the standard plugins */ - khm_load_default_modules(); - - khm_register_window_classes(); - - khm_init_request_daemon(); - - khm_create_main_window(); - - if (!khm_startup.no_main_window) - khm_show_main_window(); - - khm_refresh_config(); - - rv = (int) khm_message_loop(); - - kmq_set_completion_handler(KMSG_CRED, NULL); - - khm_exit_request_daemon(); - - khm_exit_gui(); - khm_unregister_window_classes(); - kmm_exit(); - kmq_exit(); - - CloseHandle(h_appmutex); - } else { - HWND hwnd = NULL; - int retries = 5; - HANDLE hmap; - wchar_t mapname[256]; - DWORD tid; - void * xfer; - khm_query_app_version query_app_version; - - CloseHandle(h_appmutex); - - while (hwnd == NULL && retries) { - hwnd = FindWindowEx(NULL, NULL, KHUI_MAIN_WINDOW_CLASS, NULL); - - if (hwnd) - break; - - retries--; - Sleep(1000); - } - - if (!hwnd) - return 2; - - /* first check if the remote instance supports a version - query */ - - StringCbPrintf(mapname, sizeof(mapname), - QUERY_APP_VER_MAP_FMT, - (tid = GetCurrentThreadId())); - - hmap = CreateFileMapping(INVALID_HANDLE_VALUE, - NULL, - PAGE_READWRITE, - 0, - 4096, - mapname); - - if (hmap == NULL) - return 3; - - xfer = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, - sizeof(query_app_version)); - - ZeroMemory(&query_app_version, sizeof(query_app_version)); - - if (xfer) { - query_app_version.magic = KHM_QUERY_APP_VER_MAGIC; - query_app_version.code = KHM_ERROR_NOT_IMPLEMENTED; - query_app_version.ver_caller = app_version; - - query_app_version.request_swap = TRUE; - - memcpy(xfer, &query_app_version, sizeof(query_app_version)); - - SendMessage(hwnd, WM_KHUI_QUERY_APP_VERSION, - 0, (LPARAM) tid); - - memcpy(&query_app_version, xfer, sizeof(query_app_version)); - - UnmapViewOfFile(xfer); - xfer = NULL; - } - - CloseHandle(hmap); - hmap = NULL; - - if (query_app_version.code == KHM_ERROR_SUCCESS && - query_app_version.request_swap) { - /* the request for swap was granted. We can now - initialize our instance as the master instance. */ - - slave = FALSE; - goto _start_app; - } - - StringCbPrintf(mapname, sizeof(mapname), - COMMANDLINE_MAP_FMT, - (tid = GetCurrentThreadId())); - - hmap = CreateFileMapping(INVALID_HANDLE_VALUE, - NULL, - PAGE_READWRITE, - 0, - 4096, - mapname); - - if (hmap == NULL) - return 3; - - xfer = MapViewOfFile(hmap, - FILE_MAP_WRITE, - 0, 0, - sizeof(khm_startup)); - - if (xfer) { - memcpy(xfer, &khm_startup, sizeof(khm_startup)); - - SendMessage(hwnd, WM_KHUI_ASSIGN_COMMANDLINE, - 0, (LPARAM) tid); - } - - if (xfer) - UnmapViewOfFile(xfer); - - if (hmap) - CloseHandle(hmap); - } - -#if defined(DEBUG) && ( defined(KH_BUILD_PRIVATE) || defined(KH_BUILD_SPECIAL)) - /* writes a report of memory leaks to the specified file. Should - only be enabled on development versions. */ - PDUMP("memleak.txt"); -#endif - - return rv; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +#if DEBUG +#include +#endif + +HINSTANCE khm_hInstance; +const wchar_t * khm_facility = L"NetIDMgr"; +int khm_nCmdShow; +khm_ui_4 khm_commctl_version = 0; + +khm_startup_options khm_startup; + +khm_version app_version = {KH_VERSION_LIST}; + +void khm_init_gui(void) { + khui_init_actions(); + khui_init_rescache(); + khui_init_menu(); + khui_init_toolbar(); + khm_init_notifier(); + khm_init_config(); + khm_init_debug(); +} + +void khm_exit_gui(void) { + khm_exit_debug(); + khm_exit_config(); + khm_exit_notifier(); + khui_exit_toolbar(); + khui_exit_menu(); + khui_exit_rescache(); + khui_exit_actions(); +} + +void khm_parse_commandline(void) { + LPWSTR wcmdline; + LPWSTR * wargs; + int wargc; + int i; + + ZeroMemory(&khm_startup, sizeof(khm_startup)); + + wcmdline = GetCommandLine(); + wargs = CommandLineToArgvW(wcmdline, &wargc); + + for (i=1; i= 0x501) + ((IS_COMMCTL6())? + ICC_LINK_CLASS | + ICC_STANDARD_CLASSES : + 0) | +#endif + 0; + + InitCommonControlsEx(&ics); + + khm_register_main_wnd_class(); + khm_register_credwnd_class(); + khm_register_htwnd_class(); + khm_register_passwnd_class(); + khm_register_newcredwnd_class(); + khm_register_propertywnd_class(); +} + +void khm_unregister_window_classes(void) { + khm_unregister_main_wnd_class(); + khm_unregister_credwnd_class(); + khm_unregister_htwnd_class(); + khm_unregister_passwnd_class(); + khm_unregister_newcredwnd_class(); + khm_unregister_propertywnd_class(); +} + + +/* we support up to 16 simutaneous dialogs. In reality, more than two + is pretty unlikely. Property sheets are special and are handled + separately. */ +#define MAX_UI_DIALOGS 16 + +typedef struct tag_khui_dialog { + HWND hwnd; + HWND hwnd_next; + BOOL active; +} khui_dialog; + +static khui_dialog khui_dialogs[MAX_UI_DIALOGS]; +static int n_khui_dialogs = 0; +static HWND khui_modal_dialog = NULL; +static BOOL khui_main_window_active; + +/* should only be called from the UI thread */ +void khm_add_dialog(HWND dlg) { + if(n_khui_dialogs < MAX_UI_DIALOGS - 1) { + khui_dialogs[n_khui_dialogs].hwnd = dlg; + khui_dialogs[n_khui_dialogs].hwnd_next = NULL; + /* we set .active=FALSE for now. We don't need this to have a + meaningful value until we enter a modal loop */ + khui_dialogs[n_khui_dialogs].active = FALSE; + n_khui_dialogs++; + } +#if DEBUG + else { + assert(FALSE); + } +#endif +} + +/* should only be called from the UI thread */ +void khm_enter_modal(HWND hwnd) { + int i; + + if (khui_modal_dialog) { + + /* we are already in a modal loop. */ + +#ifdef DEBUG + assert(hwnd != khui_modal_dialog); +#endif + + for (i=0; i < n_khui_dialogs; i++) { + if (khui_dialogs[i].hwnd == khui_modal_dialog) { + khui_dialogs[i].active = TRUE; + EnableWindow(khui_modal_dialog, FALSE); + break; + } + } + +#ifdef DEBUG + assert(i < n_khui_dialogs); +#endif + + for (i=0; i < n_khui_dialogs; i++) { + if (khui_dialogs[i].hwnd == hwnd) { + khui_dialogs[i].hwnd_next = khui_modal_dialog; + break; + } + } + +#ifdef DEBUG + assert(i < n_khui_dialogs); +#endif + + khui_modal_dialog = hwnd; + + } else { + + /* we are entering a modal loop. preserve the active state of + the overlapped dialogs and proceed with the modal + dialog. */ + + for (i=0; i < n_khui_dialogs; i++) { + if(khui_dialogs[i].hwnd != hwnd) { + khui_dialogs[i].active = IsWindowEnabled(khui_dialogs[i].hwnd); + EnableWindow(khui_dialogs[i].hwnd, FALSE); + } + } + + khui_main_window_active = khm_is_main_window_active(); + EnableWindow(khm_hwnd_main, FALSE); + + khui_modal_dialog = hwnd; + } +} + +/* should only be called from the UI thread */ +void khm_leave_modal(void) { + int i; + + for (i=0; i < n_khui_dialogs; i++) { + if (khui_dialogs[i].hwnd == khui_modal_dialog) + break; + } + +#ifdef DEBUG + assert(i < n_khui_dialogs); +#endif + + if (i < n_khui_dialogs && khui_dialogs[i].hwnd_next) { + + /* we need to proceed to the next one down the modal dialog + chain. We are not exiting a modal loop. */ + + khui_modal_dialog = khui_dialogs[i].hwnd_next; + khui_dialogs[i].hwnd_next = FALSE; + + EnableWindow(khui_modal_dialog, TRUE); + + } else { + + /* we are exiting a modal loop. */ + + for (i=0; i < n_khui_dialogs; i++) { + if(khui_dialogs[i].hwnd != khui_modal_dialog) { + EnableWindow(khui_dialogs[i].hwnd, khui_dialogs[i].active); + } + } + + EnableWindow(khm_hwnd_main, TRUE); + + khui_modal_dialog = NULL; + } +} + +/* should only be called from the UI thread */ +void khm_del_dialog(HWND dlg) { + int i; + for(i=0;i < n_khui_dialogs; i++) { + if(khui_dialogs[i].hwnd == dlg) + break; + } + + if(i < n_khui_dialogs) + n_khui_dialogs--; + else + return; + + for(;i < n_khui_dialogs; i++) { + khui_dialogs[i] = khui_dialogs[i+1]; + } +} + +BOOL khm_check_dlg_message(LPMSG pmsg) { + int i; + BOOL found = FALSE; + for(i=0;istatus == KHUI_PS_STATUS_DONE) { + ps = _ui_propsheets[i]; + + ps->status = KHUI_PS_STATUS_DESTROY; + kmq_post_message(KMSG_CRED, KMSG_CRED_PP_END, 0, (void *) ps); + + return TRUE; + } + return TRUE; + } + } + + return FALSE; +} + +static HACCEL ha_menu; + +WPARAM khm_message_loop_int(khm_boolean * p_exit) { + int r; + MSG msg; + + while((r = GetMessage(&msg, NULL, 0,0)) && + (p_exit == NULL || *p_exit)) { + if(r == -1) + break; + if(!khm_check_dlg_message(&msg) && + !khm_check_ps_message(&msg) && + !TranslateAccelerator(khm_hwnd_main, ha_menu, &msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return msg.wParam; +} + +WPARAM khm_message_loop(void) { + WPARAM w; + ha_menu = khui_create_global_accel_table(); + w = khm_message_loop_int(NULL); + DestroyAcceleratorTable(ha_menu); + return w; +} + +/* Handles all context closures which have a signalled error state. + If the context is a top level context, then the errors are + displayed. */ +void KHMAPI +khm_err_ctx_completion_handler(enum kherr_ctx_event evt, + kherr_context * c) { + kherr_event * e; + khui_alert * a; + + /* we only handle top level contexts here. For others, we allow + the child contexts to fold upward silently. */ + if (c->parent || !kherr_is_error_i(c)) + return; + + for(e = kherr_get_first_event(c); + e; + e = kherr_get_next_event(e)) { + + if (e->severity != KHERR_ERROR && e->severity != KHERR_WARNING) + continue; + + kherr_evaluate_event(e); + + /* we only report errors if there is enough information to + present a message. */ + if (e->short_desc && e->long_desc) { + + khui_alert_create_empty(&a); + + khui_alert_set_severity(a, e->severity); + khui_alert_set_title(a, e->short_desc); + khui_alert_set_message(a, e->long_desc); + if (e->suggestion) + khui_alert_set_suggestion(a, e->suggestion); + + khui_alert_queue(a); + + khui_alert_release(a); + } + } +} + +static wchar_t helpfile[MAX_PATH] = L""; + +HWND khm_html_help(HWND hwnd, wchar_t * suffix, + UINT command, DWORD_PTR data) { + + wchar_t gpath[MAX_PATH + MAX_PATH]; + + if (!*helpfile) { + DWORD dw; + wchar_t ppath[MAX_PATH]; + + dw = GetModuleFileName(NULL, ppath, ARRAYLENGTH(ppath)); + + if (dw == 0) { + StringCbCopy(helpfile, sizeof(helpfile), NIDM_HELPFILE); + } else { + PathRemoveFileSpec(ppath); + PathAppend(ppath, NIDM_HELPFILE); + StringCbCopy(helpfile, sizeof(helpfile), ppath); + } + } + + StringCbCopy(gpath, sizeof(gpath), helpfile); + + if (suffix) + StringCbCat(gpath, sizeof(gpath), suffix); + + return HtmlHelp(hwnd, gpath, command, data); +} + +void khm_load_default_modules(void) { + kmm_load_default_modules(); +} + +int WINAPI WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +{ + int rv = 0; + HANDLE h_appmutex; + BOOL slave = FALSE; + + khm_hInstance = hInstance; + khm_nCmdShow = nCmdShow; + + khm_parse_commandline(); + + if (khm_startup.error_exit) + return 0; + + h_appmutex = CreateMutex(NULL, FALSE, L"Local\\NetIDMgr_GlobalAppMutex"); + if (h_appmutex == NULL) + return 5; + if (GetLastError() == ERROR_ALREADY_EXISTS) + slave = TRUE; + + khc_load_schema(NULL, schema_uiconfig); + + _start_app: + + if(!slave) { + + /* set this so that we don't accidently invoke an API that + inadvertently puts up the new creds dialog at an + inopportune moment, like, say, during the new creds dialog + is open. This only affects this process, and any child + processes started by plugins. */ + SetEnvironmentVariable(L"KERBEROSLOGIN_NEVER_PROMPT", L"1"); + + khm_version_init(); + + khm_commctl_version = khm_get_commctl_version(NULL); + + /* we only open a main window if this is the only instance + of the application that is running. */ + kmq_init(); + kmm_init(); + khm_init_gui(); + + kmq_set_completion_handler(KMSG_CRED, kmsg_cred_completion); + + kherr_add_ctx_handler(khm_err_ctx_completion_handler, + KHERR_CTX_END, + 0); + + /* load the standard plugins */ + khm_load_default_modules(); + + khm_register_window_classes(); + + khm_init_request_daemon(); + + khm_create_main_window(); + + if (!khm_startup.no_main_window) + khm_show_main_window(); + + khm_refresh_config(); + + rv = (int) khm_message_loop(); + + kmq_set_completion_handler(KMSG_CRED, NULL); + + khm_exit_request_daemon(); + + khm_exit_gui(); + khm_unregister_window_classes(); + kmm_exit(); + kmq_exit(); + + CloseHandle(h_appmutex); + } else { + HWND hwnd = NULL; + int retries = 5; + HANDLE hmap; + wchar_t mapname[256]; + DWORD tid; + void * xfer; + khm_query_app_version query_app_version; + + CloseHandle(h_appmutex); + + while (hwnd == NULL && retries) { + hwnd = FindWindowEx(NULL, NULL, KHUI_MAIN_WINDOW_CLASS, NULL); + + if (hwnd) + break; + + retries--; + Sleep(1000); + } + + if (!hwnd) + return 2; + + /* first check if the remote instance supports a version + query */ + + StringCbPrintf(mapname, sizeof(mapname), + QUERY_APP_VER_MAP_FMT, + (tid = GetCurrentThreadId())); + + hmap = CreateFileMapping(INVALID_HANDLE_VALUE, + NULL, + PAGE_READWRITE, + 0, + 4096, + mapname); + + if (hmap == NULL) + return 3; + + xfer = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, + sizeof(query_app_version)); + + ZeroMemory(&query_app_version, sizeof(query_app_version)); + + if (xfer) { + query_app_version.magic = KHM_QUERY_APP_VER_MAGIC; + query_app_version.code = KHM_ERROR_NOT_IMPLEMENTED; + query_app_version.ver_caller = app_version; + + query_app_version.request_swap = TRUE; + + memcpy(xfer, &query_app_version, sizeof(query_app_version)); + + SendMessage(hwnd, WM_KHUI_QUERY_APP_VERSION, + 0, (LPARAM) tid); + + memcpy(&query_app_version, xfer, sizeof(query_app_version)); + + UnmapViewOfFile(xfer); + xfer = NULL; + } + + CloseHandle(hmap); + hmap = NULL; + + if (query_app_version.code == KHM_ERROR_SUCCESS && + query_app_version.request_swap) { + /* the request for swap was granted. We can now + initialize our instance as the master instance. */ + + slave = FALSE; + goto _start_app; + } + + StringCbPrintf(mapname, sizeof(mapname), + COMMANDLINE_MAP_FMT, + (tid = GetCurrentThreadId())); + + hmap = CreateFileMapping(INVALID_HANDLE_VALUE, + NULL, + PAGE_READWRITE, + 0, + 4096, + mapname); + + if (hmap == NULL) + return 3; + + xfer = MapViewOfFile(hmap, + FILE_MAP_WRITE, + 0, 0, + sizeof(khm_startup)); + + if (xfer) { + memcpy(xfer, &khm_startup, sizeof(khm_startup)); + + SendMessage(hwnd, WM_KHUI_ASSIGN_COMMANDLINE, + 0, (LPARAM) tid); + } + + if (xfer) + UnmapViewOfFile(xfer); + + if (hmap) + CloseHandle(hmap); + } + +#if defined(DEBUG) && ( defined(KH_BUILD_PRIVATE) || defined(KH_BUILD_SPECIAL)) + /* writes a report of memory leaks to the specified file. Should + only be enabled on development versions. */ + PDUMP("memleak.txt"); +#endif + + return rv; +} --- krb5-1.4.4.orig/src/windows/identity/ui/notifier.c +++ krb5-1.4.4/src/windows/identity/ui/notifier.c @@ -1,1290 +1,1290 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#define OEMRESOURCE - -#include -#include - -#define KHUI_NOTIFIER_CLASS L"KhuiNotifierMsgWindowClass" -#define KHUI_ALERTER_CLASS L"KhuiAlerterWindowClass" - -#define KHUI_NOTIFIER_WINDOW L"KhuiNotifierMsgWindow" - -/* notifier message for notification icon */ -#define KHUI_WM_NOTIFIER WM_COMMAND - -#define KHUI_ALERT_QUEUE_MAX 64 - -/* window class registration atom for message only notifier window - class */ -ATOM atom_notifier = 0; - -/* window class registration atom for alert windows */ -ATOM atom_alerter = 0; - -/* notifier message window */ -HWND hwnd_notifier = NULL; - -BOOL notifier_ready = FALSE; - -khm_boolean notifier_modal_loop = FALSE; - -khui_alert * current_alert = NULL; - -khui_alert * alert_queue[KHUI_ALERT_QUEUE_MAX]; -khm_int32 alert_queue_head = 0; -khm_int32 alert_queue_tail = 0; - -int iid_normal = IDI_NOTIFY_NONE; - -#define is_alert_queue_empty() (alert_queue_head == alert_queue_tail) -#define is_alert_queue_full() (((alert_queue_tail + 1) % KHUI_ALERT_QUEUE_MAX) == alert_queue_head) - -static void -add_to_alert_queue(khui_alert * a) { - if (is_alert_queue_full()) return; - alert_queue[alert_queue_tail++] = a; - khui_alert_hold(a); - alert_queue_tail %= KHUI_ALERT_QUEUE_MAX; -} - -static khui_alert * -del_from_alert_queue(void) { - khui_alert * a; - - if (is_alert_queue_empty()) return NULL; - a = alert_queue[alert_queue_head++]; - alert_queue_head %= KHUI_ALERT_QUEUE_MAX; - - return a; /* held */ -} - -static khui_alert * -peek_alert_queue(void) { - if (is_alert_queue_empty()) return NULL; - return alert_queue[alert_queue_head]; -} - -static void -check_for_queued_alerts(void) { - if (!is_alert_queue_empty()) { - khui_alert * a; - - a = peek_alert_queue(); - - if (a->title) { - HICON hi; - int res; - - if (a->severity == KHERR_ERROR) - res = OIC_ERROR; - else if (a->severity == KHERR_WARNING) - res = OIC_WARNING; - else - res = OIC_INFORMATION; - - hi = LoadImage(0, MAKEINTRESOURCE(res), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - LR_SHARED); - - khm_statusbar_set_part(KHUI_SBPART_NOTICE, - hi, - a->title); - } - } else { - khm_statusbar_set_part(KHUI_SBPART_NOTICE, - NULL, NULL); - } -} - - -/* forward dcls */ -static khm_int32 -alert_show(khui_alert * a); - -static khm_int32 -alert_show_minimized(khui_alert * a); - -static khm_int32 -alert_show_normal(khui_alert * a); - -static khm_int32 -alert_enqueue(khui_alert * a); - -/* These are defined for APPVER >= 0x501. We are defining them here - so that we can build with APPVER = 0x500 and use the same binaries - with Win XP. */ - -#ifndef NIN_BALLOONSHOW -#define NIN_BALLOONSHOW (WM_USER + 2) -#endif - -#ifndef NIN_BALLOONHIDE -#define NIN_BALLOONHIDE (WM_USER + 3) -#endif - -#ifndef NIN_BALLOONTIMEOUT -#define NIN_BALLOONTIMEOUT (WM_USER + 4) -#endif - -#ifndef NIN_BALLOONUSERCLICK -#define NIN_BALLOONUSERCLICK (WM_USER + 5) -#endif - - -/********************************************************************** - Notifier -*********************************************************************** - -The notifier is a message only window that listens for notifier -messages. This window will exist for the lifetime of the application -and will use alerter windows as needed to show application alerts. -*/ - -static LRESULT CALLBACK -notifier_wnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - kmq_message * m; - khm_int32 rv; - - if(uMsg == KMQ_WM_DISPATCH) { - kmq_wm_begin(lParam, &m); - rv = KHM_ERROR_SUCCESS; - - if(m->type == KMSG_ALERT) { - /* handle notifier messages */ - switch(m->subtype) { - case KMSG_ALERT_SHOW: - rv = alert_show((khui_alert *) m->vparam); - khui_alert_release((khui_alert *) m->vparam); - break; - - case KMSG_ALERT_QUEUE: - rv = alert_enqueue((khui_alert *) m->vparam); - khui_alert_release((khui_alert *) m->vparam); - break; - - case KMSG_ALERT_CHECK_QUEUE: - check_for_queued_alerts(); - break; - - case KMSG_ALERT_SHOW_QUEUED: - if (current_alert == NULL) { - khui_alert * a; - - a = del_from_alert_queue(); - if (a) { - rv = alert_show(a); - check_for_queued_alerts(); - khui_alert_release(a); - } - } - break; - - case KMSG_ALERT_SHOW_MODAL: - { - khui_alert * a; - - a = (khui_alert *) m->vparam; - a->flags |= KHUI_ALERT_FLAG_MODAL; - rv = alert_show(a); - khui_alert_release(a); - - if (KHM_SUCCEEDED(rv)) { - notifier_modal_loop = TRUE; - - khm_message_loop_int(¬ifier_modal_loop); - } - } - break; - } - } else if (m->type == KMSG_CRED && - m->subtype == KMSG_CRED_ROOTDELTA) { - - KillTimer(hwnd, KHUI_REFRESH_TIMER_ID); - SetTimer(hwnd, KHUI_REFRESH_TIMER_ID, - KHUI_REFRESH_TIMEOUT, - NULL); - - } - - return kmq_wm_end(m, rv); - } else if (uMsg == KHUI_WM_NOTIFIER) { - /* Handle events generated from the notification icon */ - - /* wParam is the identifier of the notify icon, but we only - have one. */ - switch(lParam) { - case WM_CONTEXTMENU: - { - POINT pt; - int menu_id; - - GetCursorPos(&pt); - - if (khm_is_main_window_visible()) - menu_id = KHUI_MENU_ICO_CTX_NORMAL; - else - menu_id = KHUI_MENU_ICO_CTX_MIN; - - SetForegroundWindow(khm_hwnd_main); - - khm_menu_show_panel(menu_id, pt.x, pt.y); - - PostMessage(khm_hwnd_main, WM_NULL, 0, 0); - } - break; - - case WM_LBUTTONDOWN: - /* we actually wait for the WM_LBUTTONUP before doing - anything */ - break; - - case WM_LBUTTONUP: - /* fall through */ - case NIN_SELECT: - /* fall through */ - case NIN_KEYSELECT: - khm_show_main_window(); - break; - - case NIN_BALLOONUSERCLICK: - if (current_alert) { - if ((current_alert->flags & KHUI_ALERT_FLAG_DEFACTION) && - current_alert->n_alert_commands > 0) { - PostMessage(khm_hwnd_main, WM_COMMAND, - MAKEWPARAM(current_alert->alert_commands[0], - 0), - 0); - } else if (current_alert->flags & - KHUI_ALERT_FLAG_REQUEST_WINDOW) { - khm_show_main_window(); - alert_show_normal(current_alert); - } - } - /* fallthrough */ - case NIN_BALLOONHIDE: - case NIN_BALLOONTIMEOUT: - khm_notify_icon_change(KHERR_NONE); - if (current_alert) { - khui_alert_release(current_alert); - current_alert = NULL; - } - break; - } - } else if (uMsg == WM_TIMER) { - if (wParam == KHUI_TRIGGER_TIMER_ID) { - KillTimer(hwnd, KHUI_TRIGGER_TIMER_ID); - khm_timer_fire(hwnd); - } else if (wParam == KHUI_REFRESH_TIMER_ID) { - KillTimer(hwnd, KHUI_REFRESH_TIMER_ID); - khm_timer_refresh(hwnd); - } - } - - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -ATOM -khm_register_notifier_wnd_class(void) -{ - WNDCLASSEX wcx; - - ZeroMemory(&wcx, sizeof(wcx)); - - wcx.cbSize = sizeof(wcx); - wcx.style = 0; - wcx.lpfnWndProc = notifier_wnd_proc; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = 0; - wcx.hInstance = khm_hInstance; - wcx.hIcon = NULL; - wcx.hCursor = NULL; - wcx.hbrBackground = NULL; - wcx.lpszMenuName = NULL; - wcx.lpszClassName = KHUI_NOTIFIER_CLASS; - wcx.hIconSm = NULL; - - atom_notifier = RegisterClassEx(&wcx); - - return atom_notifier; -} - -/********************************************************************* - Alerter -**********************************************************************/ - -typedef struct tag_alerter_wnd_data { - khui_alert * alert; - - HWND hwnd; - HFONT hfont; - - BOOL metrics_done; - - HWND hwnd_buttons[KHUI_MAX_ALERT_COMMANDS]; - - /* various metrics */ - - /* calculated during WM_CREATE and adjusted during WM_PAINT */ - int dy_message; - int dy_suggestion; - - /* calculated during WM_CREATE */ - int dx_button; - int dy_button; - int dx_button_incr; - int dx_margin; - int dy_margin; - int dy_bb; - int x_message; - int dx_message; - int dx_icon; - int dy_icon; - int dx_suggest_pad; - - /* calculated during WM_CREATE and adjusted during WM_PAINT */ - int dx_client; - int dy_client; - - /* calculated during WM_PAINT */ - int y_message; - int y_suggestion; - - LDCL(struct tag_alerter_wnd_data); -} alerter_wnd_data; - -alerter_wnd_data * khui_alerts = NULL; - -#define NTF_PARAM DWLP_USER - -/* dialog sizes in base dialog units */ - -#define NTF_MARGIN 5 -#define NTF_WIDTH 200 - -#define NTF_BB_HEIGHT 15 - -#define NTF_ICON_X NTF_MARGIN -#define NTF_ICON_WIDTH 20 -#define NTF_ICON_HEIGHT 20 - -#define NTF_MSG_X (NTF_ICON_X + NTF_ICON_WIDTH + NTF_MARGIN) -#define NTF_MSG_WIDTH ((NTF_WIDTH - NTF_MARGIN) - NTF_MSG_X) -#define NTF_MSG_HEIGHT 15 - -#define NTF_SUG_X NTF_MSG_X -#define NTF_SUG_WIDTH NTF_MSG_WIDTH -#define NTF_SUG_HEIGHT NTF_MSG_HEIGHT -#define NTF_SUG_PAD 2 - -#define NTF_BUTTON_X NTF_MSG_X - -#define NTF_BUTTON_WIDTH ((NTF_MSG_WIDTH - 3*NTF_MARGIN) / 4) -#define NTF_BUTTON_XINCR (NTF_BUTTON_WIDTH + NTF_MARGIN) -#define NTF_BUTTON_HEIGHT (NTF_BB_HEIGHT - NTF_MARGIN) - -#define NTF_TIMEOUT 20000 - -static khm_int32 -alert_show_minimized(khui_alert * a) { - wchar_t tbuf[64]; - wchar_t mbuf[256]; - - if (a->message == NULL) - return KHM_ERROR_SUCCESS; - - if (a->title == NULL) { - LoadString(khm_hInstance, IDS_ALERT_DEFAULT, - tbuf, ARRAYLENGTH(tbuf)); - } else { - StringCbCopy(tbuf, sizeof(tbuf), a->title); - } - - if (FAILED(StringCbCopy(mbuf, sizeof(mbuf), a->message)) || - (!(a->flags & KHUI_ALERT_FLAG_DEFACTION) && - (a->n_alert_commands > 0 || - a->suggestion || - (a->flags & KHUI_ALERT_FLAG_VALID_ERROR)))) { - /* if mbuf wasn't big enough, this should have copied a - truncated version of it */ - size_t cch_m, cch_p; - wchar_t postfix[256]; - - cch_p = LoadString(khm_hInstance, IDS_ALERT_MOREINFO, postfix, - ARRAYLENGTH(postfix)); - cch_p++; /* account for NULL */ - - StringCchLength(mbuf, ARRAYLENGTH(mbuf), &cch_m); - cch_m = min(cch_m, ARRAYLENGTH(mbuf) - cch_p); - - StringCchCopy(mbuf + cch_m, ARRAYLENGTH(mbuf) - cch_m, - postfix); - - a->flags |= KHUI_ALERT_FLAG_REQUEST_WINDOW; - } - - a->flags |= KHUI_ALERT_FLAG_DISPLAY_BALLOON; - -#if (_WIN32_IE >= 0x0501) - current_alert = a; - khui_alert_hold(a); -#endif - - khm_notify_icon_balloon(a->severity, - tbuf, - mbuf, - NTF_TIMEOUT); - - return KHM_ERROR_SUCCESS; -} - -static khm_int32 -alert_show_normal(khui_alert * a) { - HWND hwa; - wchar_t buf[256]; - wchar_t * title; - - if(a->title == NULL) { - LoadString(khm_hInstance, IDS_ALERT_DEFAULT, - buf, ARRAYLENGTH(buf)); - title = buf; - } else - title = a->title; - - /* if we don't have any commands, we just add a "close" button */ - if (a->n_alert_commands == 0) { - khui_alert_add_command(a, KHUI_PACTION_CLOSE); - } - - /* if there are other alerts queued up, we should add a 'Next - alert...' button that when clicked, would show the next queued - alert. However, we only do this if the current alert doesn't - actually require a command response. Otherwise, clicking the - 'next' button will be the equivalent of cancelling out of the - alert without selecting any of the commands. */ - if (!is_alert_queue_empty() && - a->n_alert_commands == 1 && - a->alert_commands[0] == KHUI_PACTION_CLOSE) { - - khui_alert_add_command(a, KHUI_PACTION_NEXT); - } - - /* we don't need to keep track of the window handle - because the window procedure adds it to the dialog - list automatically */ - - hwa = - CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_CONTEXTHELP, - MAKEINTATOM(atom_alerter), - title, - WS_DLGFRAME | WS_POPUPWINDOW | WS_CLIPCHILDREN, - 0, 0, 300, 300, // bogus values - khm_hwnd_main, - (HMENU) NULL, - khm_hInstance, - (LPVOID) a); - - ShowWindow(hwa, SW_SHOW); - - return KHM_ERROR_SUCCESS; -} - -static khm_int32 -alert_show(khui_alert * a) { - /* is there an alert already? If so, we just enqueue the message - and let it sit. */ - if (current_alert) { - return alert_enqueue(a); - } - - /* the window has already been shown */ - if((a->flags & KHUI_ALERT_FLAG_DISPLAY_WINDOW) || - ((a->flags & KHUI_ALERT_FLAG_DISPLAY_BALLOON) && - !(a->flags & KHUI_ALERT_FLAG_REQUEST_WINDOW))) - return KHM_ERROR_SUCCESS; - - if(a->err_context != NULL || - a->err_event != NULL) { - khui_alert_lock(a); - a->flags |= KHUI_ALERT_FLAG_VALID_ERROR; - khui_alert_unlock(a); - } - - /* depending on the state of the main window, we - need to either show a window or a balloon */ - if ((a->flags & KHUI_ALERT_FLAG_MODAL) || - (khm_is_main_window_active() && - !(a->flags & KHUI_ALERT_FLAG_REQUEST_BALLOON))) - return alert_show_normal(a); - else - return alert_show_minimized(a); -} - -static khm_int32 -alert_enqueue(khui_alert * a) { - if (is_alert_queue_full()) - return KHM_ERROR_NO_RESOURCES; - - add_to_alert_queue(a); - check_for_queued_alerts(); - - return KHM_ERROR_SUCCESS; -} - -/* the alerter window is actually a dialog */ -static LRESULT CALLBACK -alerter_wnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - switch(uMsg) { - case WM_CREATE: - { - LONG dlgb; - HWND hwnd_parent; - RECT r_parent; - POINT pos; - SIZE s; - LPCREATESTRUCT lpcs; - khui_alert * a; - alerter_wnd_data * d; - - lpcs = (LPCREATESTRUCT) lParam; - a = (khui_alert *) lpcs->lpCreateParams; - khui_alert_hold(a); - - d = PMALLOC(sizeof(*d)); - ZeroMemory(d, sizeof(*d)); - - d->alert = a; - d->hwnd = hwnd; - - khui_alert_lock(a); - - a->flags |= KHUI_ALERT_FLAG_DISPLAY_WINDOW; - LPUSH(&khui_alerts, d); - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, NTF_PARAM, (LONG_PTR) d); -#pragma warning(pop) - - khm_add_dialog(hwnd); - khm_enter_modal(hwnd); - - /* now figure out the size and position of the window */ - - hwnd_parent = GetWindow(hwnd, GW_OWNER); - GetWindowRect(hwnd_parent, &r_parent); - - dlgb = GetDialogBaseUnits(); - -#define DLG2SCNX(x) MulDiv((x), LOWORD(dlgb), 4) -#define DLG2SCNY(y) MulDiv((y), HIWORD(dlgb), 8) - - d->dx_margin = DLG2SCNX(NTF_MARGIN); - d->dy_margin = DLG2SCNY(NTF_MARGIN); - - d->x_message = DLG2SCNX(NTF_MSG_X); - d->dx_message = DLG2SCNX(NTF_MSG_WIDTH); - - if (a->message) { - d->dy_message = DLG2SCNY(NTF_MSG_HEIGHT); - } - - if (a->suggestion) { - d->dy_suggestion = DLG2SCNY(NTF_SUG_HEIGHT); - d->dx_suggest_pad = DLG2SCNX(NTF_SUG_PAD); - } - - d->dy_bb = DLG2SCNY(NTF_BB_HEIGHT); - d->dx_button = DLG2SCNX(NTF_BUTTON_WIDTH); - d->dy_button = DLG2SCNY(NTF_BUTTON_HEIGHT); - d->dx_button_incr = DLG2SCNX(NTF_BUTTON_XINCR); - - d->dx_icon = DLG2SCNX(NTF_ICON_WIDTH); - d->dy_icon = DLG2SCNY(NTF_ICON_HEIGHT); - - d->dx_client = DLG2SCNX(NTF_WIDTH); - d->dy_client = max(d->dy_icon, - d->dy_message + - ((d->dy_suggestion > 0)? - (d->dy_suggestion + d->dy_margin): - 0)) + - d->dy_margin * 3 + d->dy_bb; - - /* adjust for client rect */ - s.cx = d->dx_client; - s.cy = d->dy_client; - - { - RECT c_r; - RECT w_r; - - GetWindowRect(hwnd, &w_r); - GetClientRect(hwnd, &c_r); - - s.cx += (w_r.right - w_r.left) - (c_r.right - c_r.left); - s.cy += (w_r.bottom - w_r.top) - (c_r.bottom - c_r.top); - } - - pos.x = (r_parent.left + r_parent.right - s.cx) / 2; - pos.y = (r_parent.top + r_parent.bottom - s.cy) / 2; - - SetWindowPos(hwnd, - HWND_TOP, - pos.x, pos.y, - s.cx, s.cy, - SWP_SHOWWINDOW); - - { - LOGFONT lf; - HDC hdc_dt; - - hdc_dt = GetDC(NULL); - - lf.lfHeight = -MulDiv(8, - GetDeviceCaps(hdc_dt, LOGPIXELSY), - 72); - lf.lfWidth = 0; - lf.lfEscapement = 0; - lf.lfOrientation = 0; - lf.lfWeight = FW_NORMAL; - lf.lfItalic = FALSE; - lf.lfUnderline = FALSE; - lf.lfStrikeOut = FALSE; - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfOutPrecision = OUT_DEFAULT_PRECIS; - lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; - lf.lfQuality = DEFAULT_QUALITY; - lf.lfPitchAndFamily = DEFAULT_PITCH; - - LoadString(khm_hInstance, IDS_DEFAULT_FONT, - lf.lfFaceName, ARRAYLENGTH(lf.lfFaceName)); - - d->hfont = CreateFontIndirect(&lf); - - ReleaseDC(NULL, hdc_dt); - } - - /* create dialog controls now */ - { - int x,y; - int width, height; - int i; - - x = d->x_message; - y = d->dy_client - d->dy_bb; - width = d->dx_button; - height = d->dy_button; - - for(i=0; in_alert_commands; i++) { - wchar_t caption[256]; - khui_action * action; - HWND hw_button; - - if(a->alert_commands[i] == 0) - continue; - - action = khui_find_action(a->alert_commands[i]); - if(action == NULL) - continue; - - LoadString(khm_hInstance, action->is_caption, - caption, ARRAYLENGTH(caption)); - - hw_button = - CreateWindowEx(0, - L"BUTTON", - caption, - WS_VISIBLE | WS_CHILD | - /* the first button is the default */ - ((i==0)? BS_DEFPUSHBUTTON: 0), - x,y,width,height, - hwnd, - (HMENU)(INT_PTR) (action->cmd), - khm_hInstance, - NULL); - - SendMessage(hw_button, WM_SETFONT, - (WPARAM) d->hfont, MAKELPARAM(TRUE, 0)); - - d->hwnd_buttons[i] = hw_button; - - x += d->dx_button_incr; - } - } - - khm_notify_icon_change(a->severity); - - khui_alert_unlock(a); - - d->metrics_done = FALSE; - - return TRUE; - } - break; /* not reached */ - - case WM_DESTROY: - { - alerter_wnd_data * d; - - /* khm_leave_modal() could be here, but instead it is in - the WM_COMMAND handler. This is because the modal loop - has to be exited before DestroyWindow() is issued. */ - //khm_leave_modal(); - khm_del_dialog(hwnd); - - d = (alerter_wnd_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, NTF_PARAM); - - LDELETE(&khui_alerts, d); - - khui_alert_lock(d->alert); - d->alert->flags &= ~KHUI_ALERT_FLAG_DISPLAY_WINDOW; - if (d->alert->flags & KHUI_ALERT_FLAG_MODAL) - notifier_modal_loop = FALSE; - khui_alert_unlock(d->alert); - - khui_alert_release(d->alert); - - DeleteObject(d->hfont); - - PFREE(d); - - khm_notify_icon_change(KHERR_NONE); - - return TRUE; - } - break; - - case WM_PAINT: - { - RECT r_update; - PAINTSTRUCT ps; - HDC hdc; - LONG dlgb; - alerter_wnd_data * d; - HFONT hf_old; - BOOL need_resize = FALSE; - - if(!GetUpdateRect(hwnd, &r_update, TRUE)) - return FALSE; - - d = (alerter_wnd_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, NTF_PARAM); - - dlgb = GetDialogBaseUnits(); - - hdc = BeginPaint(hwnd, &ps); - - hf_old = SelectFont(hdc, d->hfont); - - khui_alert_lock(d->alert); - - // draw the severity icon - { - HICON hicon; - int x,y; - int iid; - - /* GOINGHERE! If the metrics for the window haven't - been calculated yet, then calculate them. If the - hight needs to be expanded, then do that and wait - for the next repaint cycle. Also move the button - controls down. */ - x = d->dx_margin; - y = d->dy_margin; - - if(d->alert->severity == KHERR_ERROR) - iid = OIC_HAND; - else if(d->alert->severity == KHERR_WARNING) - iid = OIC_BANG; - else - iid = OIC_NOTE; - - hicon = LoadImage(NULL, - MAKEINTRESOURCE(iid), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - LR_SHARED); - - DrawIcon(hdc, x, y, hicon); - } - - // draw the message - if(d->alert->message) { - RECT r; - int width; - int height; - size_t cch; - - r.left = d->x_message; - r.top = d->dy_margin; - width = d->dx_message; - r.right = r.left + width; - height = d->dy_message; - r.bottom = r.top + height; - - StringCchLength(d->alert->message, - KHUI_MAXCCH_MESSAGE, &cch); - - height = DrawText(hdc, - d->alert->message, - (int) cch, - &r, - DT_WORDBREAK | - DT_CALCRECT); - - if (height > d->dy_message) { - d->dy_message = height; - need_resize = TRUE; - } else { - DrawText(hdc, - d->alert->message, - (int) cch, - &r, - DT_WORDBREAK); - } - - d->y_message = r.top; - } - - // and the suggestion - if (d->alert->suggestion) { - RECT r, ro; - int height; - size_t cch; - HICON h_sug_ico; - - r.left = d->x_message; - r.top = d->y_message + d->dy_message + d->dy_margin; - r.right = r.left + d->dx_message; - r.bottom = r.top + d->dy_suggestion; - - CopyRect(&ro, &r); - - // adjust for icon and padding - r.left += GetSystemMetrics(SM_CXSMICON) + d->dx_suggest_pad * 2; - r.top += d->dx_suggest_pad; - r.right -= d->dx_suggest_pad; - r.bottom -= d->dx_suggest_pad; - - StringCchLength(d->alert->suggestion, - KHUI_MAXCCH_SUGGESTION, &cch); - - height = DrawText(hdc, - d->alert->suggestion, - (int) cch, - &r, - DT_WORDBREAK | - DT_CALCRECT); - - if (height > d->dy_suggestion) { - d->dy_suggestion = height; - need_resize = TRUE; - } else { - int old_bk_mode; - - ro.bottom = r.bottom + d->dx_suggest_pad; - - FillRect(hdc, &ro, (HBRUSH) (COLOR_INFOBK + 1)); - DrawEdge(hdc, &ro, EDGE_SUNKEN, BF_FLAT | BF_RECT); - - h_sug_ico = - LoadImage(0, - MAKEINTRESOURCE(OIC_INFORMATION), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - LR_SHARED); - - assert(h_sug_ico != NULL); - - DrawIconEx(hdc, - ro.left + d->dx_suggest_pad, - ro.top + d->dx_suggest_pad, - h_sug_ico, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - 0, NULL, - DI_NORMAL); - - old_bk_mode = SetBkMode(hdc, TRANSPARENT); - - DrawText(hdc, - d->alert->suggestion, - (int) cch, - &r, - DT_WORDBREAK); - - SetBkMode(hdc, old_bk_mode); - } - - d->y_suggestion = r.top; - } - - khui_alert_unlock(d->alert); - - SelectObject(hdc, hf_old); - - EndPaint(hwnd, &ps); - - if (need_resize) { - RECT r; - int x,y; - int width, height; - int i; - - GetClientRect(hwnd, &r); - - height = max(d->dy_icon, - d->dy_message + - ((d->dy_suggestion > 0)? - (d->dy_suggestion + d->dy_margin): - 0)) + - d->dy_margin * 3 + d->dy_bb; - r.bottom = r.top + height; - - d->dy_client = height; - - AdjustWindowRectEx(&r, - GetWindowLongPtr(hwnd, GWL_STYLE), - FALSE, - GetWindowLongPtr(hwnd, GWL_EXSTYLE)); - - SetWindowPos(hwnd, - NULL, - 0, 0, - r.right - r.left, - r.bottom - r.top, - SWP_NOACTIVATE | SWP_NOCOPYBITS | - SWP_NOMOVE | SWP_NOOWNERZORDER | - SWP_NOZORDER); - - InvalidateRect(hwnd, NULL, TRUE); - - x = d->x_message; - y = d->dy_client - d->dy_bb; - width = d->dx_button; - height = d->dy_button; - - for(i=0; ialert->n_alert_commands; i++) { - MoveWindow(d->hwnd_buttons[i], - x,y, - width,height, - TRUE); - - x += d->dx_button_incr; - } - } - - return FALSE; - } - break; /* not reached */ - - case WM_COMMAND: - { - alerter_wnd_data * d; - - d = (alerter_wnd_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, NTF_PARAM); - - if(HIWORD(wParam) == BN_CLICKED) { - khui_alert_lock(d->alert); - d->alert->response = LOWORD(wParam); - khui_alert_unlock(d->alert); - - khm_leave_modal(); - - DestroyWindow(hwnd); - - if (LOWORD(wParam) == KHUI_PACTION_NEXT) - kmq_post_message(KMSG_ALERT, KMSG_ALERT_SHOW_QUEUED, 0, 0); - return 0; - } - } - break; - } - - return DefDlgProc(hwnd, uMsg, wParam, lParam); - //return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -ATOM khm_register_alerter_wnd_class(void) -{ - WNDCLASSEX wcx; - - ZeroMemory(&wcx, sizeof(wcx)); - - wcx.cbSize = sizeof(wcx); - wcx.style = - CS_OWNDC | -#if(_WIN32_WINNT >= 0x0501) - ((IS_COMMCTL6())? CS_DROPSHADOW: 0) | -#endif - 0; - wcx.lpfnWndProc = alerter_wnd_proc; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = DLGWINDOWEXTRA + sizeof(LONG_PTR); - wcx.hInstance = khm_hInstance; - wcx.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); - wcx.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); - wcx.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1); - wcx.lpszMenuName = NULL; - wcx.lpszClassName = KHUI_ALERTER_CLASS; - wcx.hIconSm = NULL; - - atom_alerter = RegisterClassEx(&wcx); - - return atom_alerter; -} - -/********************************************************************** - Notification Icon -***********************************************************************/ - -#define KHUI_NOTIFY_ICON_ID 0 - -void khm_notify_icon_add(void) { - NOTIFYICONDATA ni; - wchar_t buf[256]; - - ZeroMemory(&ni, sizeof(ni)); - - ni.cbSize = sizeof(ni); - ni.hWnd = hwnd_notifier; - ni.uID = KHUI_NOTIFY_ICON_ID; - ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; - ni.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(iid_normal)); - ni.uCallbackMessage = KHUI_WM_NOTIFIER; - LoadString(khm_hInstance, IDS_NOTIFY_PREFIX, buf, ARRAYLENGTH(buf)); - StringCbCopy(ni.szTip, sizeof(ni.szTip), buf); - LoadString(khm_hInstance, IDS_NOTIFY_READY, buf, ARRAYLENGTH(buf)); - StringCbCat(ni.szTip, sizeof(ni.szTip), buf); - - Shell_NotifyIcon(NIM_ADD, &ni); - - ni.cbSize = sizeof(ni); - ni.uVersion = NOTIFYICON_VERSION; - Shell_NotifyIcon(NIM_SETVERSION, &ni); - - DestroyIcon(ni.hIcon); -} - -void -khm_notify_icon_balloon(khm_int32 severity, - wchar_t * title, - wchar_t * msg, - khm_int32 timeout) { - NOTIFYICONDATA ni; - int iid; - - if (!msg || !title) - return; - - ZeroMemory(&ni, sizeof(ni)); - ni.cbSize = sizeof(ni); - - if (severity == KHERR_INFO) { - ni.dwInfoFlags = NIIF_INFO; - iid = IDI_NOTIFY_INFO; - } else if (severity == KHERR_WARNING) { - ni.dwInfoFlags = NIIF_WARNING; - iid = IDI_NOTIFY_WARN; - } else if (severity == KHERR_ERROR) { - ni.dwInfoFlags = NIIF_ERROR; - iid = IDI_NOTIFY_ERROR; - } else { - ni.dwInfoFlags = NIIF_NONE; - iid = iid_normal; - } - - ni.hWnd = hwnd_notifier; - ni.uID = KHUI_NOTIFY_ICON_ID; - ni.uFlags = NIF_INFO | NIF_ICON; - ni.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(iid)); - - if (FAILED(StringCbCopy(ni.szInfo, sizeof(ni.szInfo), msg))) { - /* too long? */ - StringCchCopyN(ni.szInfo, ARRAYLENGTH(ni.szInfo), - msg, - ARRAYLENGTH(ni.szInfo) - ARRAYLENGTH(ELIPSIS)); - StringCchCat(ni.szInfo, ARRAYLENGTH(ni.szInfo), - ELIPSIS); - } - - if (FAILED(StringCbCopy(ni.szInfoTitle, sizeof(ni.szInfoTitle), - title))) { - StringCchCopyN(ni.szInfoTitle, ARRAYLENGTH(ni.szInfoTitle), - title, - ARRAYLENGTH(ni.szInfoTitle) - ARRAYLENGTH(ELIPSIS)); - StringCchCat(ni.szInfoTitle, ARRAYLENGTH(ni.szInfoTitle), - ELIPSIS); - } - ni.uTimeout = timeout; - - Shell_NotifyIcon(NIM_MODIFY, &ni); - - DestroyIcon(ni.hIcon); -} - -void khm_notify_icon_expstate(enum khm_notif_expstate expseverity) { - int new_iid; - - if (expseverity == KHM_NOTIF_OK) - new_iid = IDI_APPICON_OK; - else if (expseverity == KHM_NOTIF_WARN) - new_iid = IDI_APPICON_WARN; - else if (expseverity == KHM_NOTIF_EXP) - new_iid = IDI_APPICON_EXP; - else - new_iid = IDI_NOTIFY_NONE; - - if (iid_normal == new_iid) - return; - - iid_normal = new_iid; - - if (current_alert == NULL) - khm_notify_icon_change(KHERR_NONE); -} - -void khm_notify_icon_change(khm_int32 severity) { - NOTIFYICONDATA ni; - wchar_t buf[256]; - int iid; - - if (severity == KHERR_INFO) - iid = IDI_NOTIFY_INFO; - else if (severity == KHERR_WARNING) - iid = IDI_NOTIFY_WARN; - else if (severity == KHERR_ERROR) - iid = IDI_NOTIFY_ERROR; - else - iid = iid_normal; - - ZeroMemory(&ni, sizeof(ni)); - - ni.cbSize = sizeof(ni); - ni.hWnd = hwnd_notifier; - ni.uID = KHUI_NOTIFY_ICON_ID; - ni.uFlags = NIF_ICON | NIF_TIP; - ni.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(iid)); - LoadString(khm_hInstance, IDS_NOTIFY_PREFIX, buf, ARRAYLENGTH(buf)); - StringCbCopy(ni.szTip, sizeof(ni.szTip), buf); - if(severity == KHERR_NONE) - LoadString(khm_hInstance, IDS_NOTIFY_READY, buf, ARRAYLENGTH(buf)); - else - LoadString(khm_hInstance, IDS_NOTIFY_ATTENTION, buf, ARRAYLENGTH(buf)); - StringCbCat(ni.szTip, sizeof(ni.szTip), buf); - - Shell_NotifyIcon(NIM_MODIFY, &ni); - - DestroyIcon(ni.hIcon); -} - -void khm_notify_icon_remove(void) { - NOTIFYICONDATA ni; - - ZeroMemory(&ni, sizeof(ni)); - - ni.cbSize = sizeof(ni); - ni.hWnd = hwnd_notifier; - ni.uID = KHUI_NOTIFY_ICON_ID; - - Shell_NotifyIcon(NIM_DELETE, &ni); -} - -/********************************************************************* - Initialization -**********************************************************************/ - -void khm_init_notifier(void) -{ - if(!khm_register_notifier_wnd_class()) - return; - - if(!khm_register_alerter_wnd_class()) - return; - - hwnd_notifier = CreateWindowEx(0, - MAKEINTATOM(atom_notifier), - KHUI_NOTIFIER_WINDOW, - 0, - 0,0,0,0, - HWND_MESSAGE, - NULL, - khm_hInstance, - NULL); - - if(hwnd_notifier != NULL) { - kmq_subscribe_hwnd(KMSG_ALERT, hwnd_notifier); - kmq_subscribe_hwnd(KMSG_CRED, hwnd_notifier); - notifier_ready = TRUE; - - khm_notify_icon_add(); - } -#ifdef DEBUG - else { - assert(hwnd_notifier != NULL); - } -#endif - khm_timer_init(); - - khm_addr_change_notifier_init(); -} - -void khm_exit_notifier(void) -{ - khm_addr_change_notifier_exit(); - - khm_timer_exit(); - - if(hwnd_notifier != NULL) { - khm_notify_icon_remove(); - kmq_unsubscribe_hwnd(KMSG_ALERT, hwnd_notifier); - kmq_unsubscribe_hwnd(KMSG_CRED, hwnd_notifier); - DestroyWindow(hwnd_notifier); - hwnd_notifier = NULL; - } - - if(atom_notifier != 0) { - UnregisterClass(MAKEINTATOM(atom_notifier), khm_hInstance); - atom_notifier = 0; - } - - if(atom_alerter != 0) { - UnregisterClass(MAKEINTATOM(atom_alerter), khm_hInstance); - atom_alerter = 0; - } - - notifier_ready = FALSE; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#define OEMRESOURCE + +#include +#include + +#define KHUI_NOTIFIER_CLASS L"KhuiNotifierMsgWindowClass" +#define KHUI_ALERTER_CLASS L"KhuiAlerterWindowClass" + +#define KHUI_NOTIFIER_WINDOW L"KhuiNotifierMsgWindow" + +/* notifier message for notification icon */ +#define KHUI_WM_NOTIFIER WM_COMMAND + +#define KHUI_ALERT_QUEUE_MAX 64 + +/* window class registration atom for message only notifier window + class */ +ATOM atom_notifier = 0; + +/* window class registration atom for alert windows */ +ATOM atom_alerter = 0; + +/* notifier message window */ +HWND hwnd_notifier = NULL; + +BOOL notifier_ready = FALSE; + +khm_boolean notifier_modal_loop = FALSE; + +khui_alert * current_alert = NULL; + +khui_alert * alert_queue[KHUI_ALERT_QUEUE_MAX]; +khm_int32 alert_queue_head = 0; +khm_int32 alert_queue_tail = 0; + +int iid_normal = IDI_NOTIFY_NONE; + +#define is_alert_queue_empty() (alert_queue_head == alert_queue_tail) +#define is_alert_queue_full() (((alert_queue_tail + 1) % KHUI_ALERT_QUEUE_MAX) == alert_queue_head) + +static void +add_to_alert_queue(khui_alert * a) { + if (is_alert_queue_full()) return; + alert_queue[alert_queue_tail++] = a; + khui_alert_hold(a); + alert_queue_tail %= KHUI_ALERT_QUEUE_MAX; +} + +static khui_alert * +del_from_alert_queue(void) { + khui_alert * a; + + if (is_alert_queue_empty()) return NULL; + a = alert_queue[alert_queue_head++]; + alert_queue_head %= KHUI_ALERT_QUEUE_MAX; + + return a; /* held */ +} + +static khui_alert * +peek_alert_queue(void) { + if (is_alert_queue_empty()) return NULL; + return alert_queue[alert_queue_head]; +} + +static void +check_for_queued_alerts(void) { + if (!is_alert_queue_empty()) { + khui_alert * a; + + a = peek_alert_queue(); + + if (a->title) { + HICON hi; + int res; + + if (a->severity == KHERR_ERROR) + res = OIC_ERROR; + else if (a->severity == KHERR_WARNING) + res = OIC_WARNING; + else + res = OIC_INFORMATION; + + hi = LoadImage(0, MAKEINTRESOURCE(res), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + LR_SHARED); + + khm_statusbar_set_part(KHUI_SBPART_NOTICE, + hi, + a->title); + } + } else { + khm_statusbar_set_part(KHUI_SBPART_NOTICE, + NULL, NULL); + } +} + + +/* forward dcls */ +static khm_int32 +alert_show(khui_alert * a); + +static khm_int32 +alert_show_minimized(khui_alert * a); + +static khm_int32 +alert_show_normal(khui_alert * a); + +static khm_int32 +alert_enqueue(khui_alert * a); + +/* These are defined for APPVER >= 0x501. We are defining them here + so that we can build with APPVER = 0x500 and use the same binaries + with Win XP. */ + +#ifndef NIN_BALLOONSHOW +#define NIN_BALLOONSHOW (WM_USER + 2) +#endif + +#ifndef NIN_BALLOONHIDE +#define NIN_BALLOONHIDE (WM_USER + 3) +#endif + +#ifndef NIN_BALLOONTIMEOUT +#define NIN_BALLOONTIMEOUT (WM_USER + 4) +#endif + +#ifndef NIN_BALLOONUSERCLICK +#define NIN_BALLOONUSERCLICK (WM_USER + 5) +#endif + + +/********************************************************************** + Notifier +*********************************************************************** + +The notifier is a message only window that listens for notifier +messages. This window will exist for the lifetime of the application +and will use alerter windows as needed to show application alerts. +*/ + +static LRESULT CALLBACK +notifier_wnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + kmq_message * m; + khm_int32 rv; + + if(uMsg == KMQ_WM_DISPATCH) { + kmq_wm_begin(lParam, &m); + rv = KHM_ERROR_SUCCESS; + + if(m->type == KMSG_ALERT) { + /* handle notifier messages */ + switch(m->subtype) { + case KMSG_ALERT_SHOW: + rv = alert_show((khui_alert *) m->vparam); + khui_alert_release((khui_alert *) m->vparam); + break; + + case KMSG_ALERT_QUEUE: + rv = alert_enqueue((khui_alert *) m->vparam); + khui_alert_release((khui_alert *) m->vparam); + break; + + case KMSG_ALERT_CHECK_QUEUE: + check_for_queued_alerts(); + break; + + case KMSG_ALERT_SHOW_QUEUED: + if (current_alert == NULL) { + khui_alert * a; + + a = del_from_alert_queue(); + if (a) { + rv = alert_show(a); + check_for_queued_alerts(); + khui_alert_release(a); + } + } + break; + + case KMSG_ALERT_SHOW_MODAL: + { + khui_alert * a; + + a = (khui_alert *) m->vparam; + a->flags |= KHUI_ALERT_FLAG_MODAL; + rv = alert_show(a); + khui_alert_release(a); + + if (KHM_SUCCEEDED(rv)) { + notifier_modal_loop = TRUE; + + khm_message_loop_int(¬ifier_modal_loop); + } + } + break; + } + } else if (m->type == KMSG_CRED && + m->subtype == KMSG_CRED_ROOTDELTA) { + + KillTimer(hwnd, KHUI_REFRESH_TIMER_ID); + SetTimer(hwnd, KHUI_REFRESH_TIMER_ID, + KHUI_REFRESH_TIMEOUT, + NULL); + + } + + return kmq_wm_end(m, rv); + } else if (uMsg == KHUI_WM_NOTIFIER) { + /* Handle events generated from the notification icon */ + + /* wParam is the identifier of the notify icon, but we only + have one. */ + switch(lParam) { + case WM_CONTEXTMENU: + { + POINT pt; + int menu_id; + + GetCursorPos(&pt); + + if (khm_is_main_window_visible()) + menu_id = KHUI_MENU_ICO_CTX_NORMAL; + else + menu_id = KHUI_MENU_ICO_CTX_MIN; + + SetForegroundWindow(khm_hwnd_main); + + khm_menu_show_panel(menu_id, pt.x, pt.y); + + PostMessage(khm_hwnd_main, WM_NULL, 0, 0); + } + break; + + case WM_LBUTTONDOWN: + /* we actually wait for the WM_LBUTTONUP before doing + anything */ + break; + + case WM_LBUTTONUP: + /* fall through */ + case NIN_SELECT: + /* fall through */ + case NIN_KEYSELECT: + khm_show_main_window(); + break; + + case NIN_BALLOONUSERCLICK: + if (current_alert) { + if ((current_alert->flags & KHUI_ALERT_FLAG_DEFACTION) && + current_alert->n_alert_commands > 0) { + PostMessage(khm_hwnd_main, WM_COMMAND, + MAKEWPARAM(current_alert->alert_commands[0], + 0), + 0); + } else if (current_alert->flags & + KHUI_ALERT_FLAG_REQUEST_WINDOW) { + khm_show_main_window(); + alert_show_normal(current_alert); + } + } + /* fallthrough */ + case NIN_BALLOONHIDE: + case NIN_BALLOONTIMEOUT: + khm_notify_icon_change(KHERR_NONE); + if (current_alert) { + khui_alert_release(current_alert); + current_alert = NULL; + } + break; + } + } else if (uMsg == WM_TIMER) { + if (wParam == KHUI_TRIGGER_TIMER_ID) { + KillTimer(hwnd, KHUI_TRIGGER_TIMER_ID); + khm_timer_fire(hwnd); + } else if (wParam == KHUI_REFRESH_TIMER_ID) { + KillTimer(hwnd, KHUI_REFRESH_TIMER_ID); + khm_timer_refresh(hwnd); + } + } + + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +ATOM +khm_register_notifier_wnd_class(void) +{ + WNDCLASSEX wcx; + + ZeroMemory(&wcx, sizeof(wcx)); + + wcx.cbSize = sizeof(wcx); + wcx.style = 0; + wcx.lpfnWndProc = notifier_wnd_proc; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = 0; + wcx.hInstance = khm_hInstance; + wcx.hIcon = NULL; + wcx.hCursor = NULL; + wcx.hbrBackground = NULL; + wcx.lpszMenuName = NULL; + wcx.lpszClassName = KHUI_NOTIFIER_CLASS; + wcx.hIconSm = NULL; + + atom_notifier = RegisterClassEx(&wcx); + + return atom_notifier; +} + +/********************************************************************* + Alerter +**********************************************************************/ + +typedef struct tag_alerter_wnd_data { + khui_alert * alert; + + HWND hwnd; + HFONT hfont; + + BOOL metrics_done; + + HWND hwnd_buttons[KHUI_MAX_ALERT_COMMANDS]; + + /* various metrics */ + + /* calculated during WM_CREATE and adjusted during WM_PAINT */ + int dy_message; + int dy_suggestion; + + /* calculated during WM_CREATE */ + int dx_button; + int dy_button; + int dx_button_incr; + int dx_margin; + int dy_margin; + int dy_bb; + int x_message; + int dx_message; + int dx_icon; + int dy_icon; + int dx_suggest_pad; + + /* calculated during WM_CREATE and adjusted during WM_PAINT */ + int dx_client; + int dy_client; + + /* calculated during WM_PAINT */ + int y_message; + int y_suggestion; + + LDCL(struct tag_alerter_wnd_data); +} alerter_wnd_data; + +alerter_wnd_data * khui_alerts = NULL; + +#define NTF_PARAM DWLP_USER + +/* dialog sizes in base dialog units */ + +#define NTF_MARGIN 5 +#define NTF_WIDTH 200 + +#define NTF_BB_HEIGHT 15 + +#define NTF_ICON_X NTF_MARGIN +#define NTF_ICON_WIDTH 20 +#define NTF_ICON_HEIGHT 20 + +#define NTF_MSG_X (NTF_ICON_X + NTF_ICON_WIDTH + NTF_MARGIN) +#define NTF_MSG_WIDTH ((NTF_WIDTH - NTF_MARGIN) - NTF_MSG_X) +#define NTF_MSG_HEIGHT 15 + +#define NTF_SUG_X NTF_MSG_X +#define NTF_SUG_WIDTH NTF_MSG_WIDTH +#define NTF_SUG_HEIGHT NTF_MSG_HEIGHT +#define NTF_SUG_PAD 2 + +#define NTF_BUTTON_X NTF_MSG_X + +#define NTF_BUTTON_WIDTH ((NTF_MSG_WIDTH - 3*NTF_MARGIN) / 4) +#define NTF_BUTTON_XINCR (NTF_BUTTON_WIDTH + NTF_MARGIN) +#define NTF_BUTTON_HEIGHT (NTF_BB_HEIGHT - NTF_MARGIN) + +#define NTF_TIMEOUT 20000 + +static khm_int32 +alert_show_minimized(khui_alert * a) { + wchar_t tbuf[64]; + wchar_t mbuf[256]; + + if (a->message == NULL) + return KHM_ERROR_SUCCESS; + + if (a->title == NULL) { + LoadString(khm_hInstance, IDS_ALERT_DEFAULT, + tbuf, ARRAYLENGTH(tbuf)); + } else { + StringCbCopy(tbuf, sizeof(tbuf), a->title); + } + + if (FAILED(StringCbCopy(mbuf, sizeof(mbuf), a->message)) || + (!(a->flags & KHUI_ALERT_FLAG_DEFACTION) && + (a->n_alert_commands > 0 || + a->suggestion || + (a->flags & KHUI_ALERT_FLAG_VALID_ERROR)))) { + /* if mbuf wasn't big enough, this should have copied a + truncated version of it */ + size_t cch_m, cch_p; + wchar_t postfix[256]; + + cch_p = LoadString(khm_hInstance, IDS_ALERT_MOREINFO, postfix, + ARRAYLENGTH(postfix)); + cch_p++; /* account for NULL */ + + StringCchLength(mbuf, ARRAYLENGTH(mbuf), &cch_m); + cch_m = min(cch_m, ARRAYLENGTH(mbuf) - cch_p); + + StringCchCopy(mbuf + cch_m, ARRAYLENGTH(mbuf) - cch_m, + postfix); + + a->flags |= KHUI_ALERT_FLAG_REQUEST_WINDOW; + } + + a->flags |= KHUI_ALERT_FLAG_DISPLAY_BALLOON; + +#if (_WIN32_IE >= 0x0501) + current_alert = a; + khui_alert_hold(a); +#endif + + khm_notify_icon_balloon(a->severity, + tbuf, + mbuf, + NTF_TIMEOUT); + + return KHM_ERROR_SUCCESS; +} + +static khm_int32 +alert_show_normal(khui_alert * a) { + HWND hwa; + wchar_t buf[256]; + wchar_t * title; + + if(a->title == NULL) { + LoadString(khm_hInstance, IDS_ALERT_DEFAULT, + buf, ARRAYLENGTH(buf)); + title = buf; + } else + title = a->title; + + /* if we don't have any commands, we just add a "close" button */ + if (a->n_alert_commands == 0) { + khui_alert_add_command(a, KHUI_PACTION_CLOSE); + } + + /* if there are other alerts queued up, we should add a 'Next + alert...' button that when clicked, would show the next queued + alert. However, we only do this if the current alert doesn't + actually require a command response. Otherwise, clicking the + 'next' button will be the equivalent of cancelling out of the + alert without selecting any of the commands. */ + if (!is_alert_queue_empty() && + a->n_alert_commands == 1 && + a->alert_commands[0] == KHUI_PACTION_CLOSE) { + + khui_alert_add_command(a, KHUI_PACTION_NEXT); + } + + /* we don't need to keep track of the window handle + because the window procedure adds it to the dialog + list automatically */ + + hwa = + CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_CONTEXTHELP, + MAKEINTATOM(atom_alerter), + title, + WS_DLGFRAME | WS_POPUPWINDOW | WS_CLIPCHILDREN, + 0, 0, 300, 300, // bogus values + khm_hwnd_main, + (HMENU) NULL, + khm_hInstance, + (LPVOID) a); + + ShowWindow(hwa, SW_SHOW); + + return KHM_ERROR_SUCCESS; +} + +static khm_int32 +alert_show(khui_alert * a) { + /* is there an alert already? If so, we just enqueue the message + and let it sit. */ + if (current_alert) { + return alert_enqueue(a); + } + + /* the window has already been shown */ + if((a->flags & KHUI_ALERT_FLAG_DISPLAY_WINDOW) || + ((a->flags & KHUI_ALERT_FLAG_DISPLAY_BALLOON) && + !(a->flags & KHUI_ALERT_FLAG_REQUEST_WINDOW))) + return KHM_ERROR_SUCCESS; + + if(a->err_context != NULL || + a->err_event != NULL) { + khui_alert_lock(a); + a->flags |= KHUI_ALERT_FLAG_VALID_ERROR; + khui_alert_unlock(a); + } + + /* depending on the state of the main window, we + need to either show a window or a balloon */ + if ((a->flags & KHUI_ALERT_FLAG_MODAL) || + (khm_is_main_window_active() && + !(a->flags & KHUI_ALERT_FLAG_REQUEST_BALLOON))) + return alert_show_normal(a); + else + return alert_show_minimized(a); +} + +static khm_int32 +alert_enqueue(khui_alert * a) { + if (is_alert_queue_full()) + return KHM_ERROR_NO_RESOURCES; + + add_to_alert_queue(a); + check_for_queued_alerts(); + + return KHM_ERROR_SUCCESS; +} + +/* the alerter window is actually a dialog */ +static LRESULT CALLBACK +alerter_wnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch(uMsg) { + case WM_CREATE: + { + LONG dlgb; + HWND hwnd_parent; + RECT r_parent; + POINT pos; + SIZE s; + LPCREATESTRUCT lpcs; + khui_alert * a; + alerter_wnd_data * d; + + lpcs = (LPCREATESTRUCT) lParam; + a = (khui_alert *) lpcs->lpCreateParams; + khui_alert_hold(a); + + d = PMALLOC(sizeof(*d)); + ZeroMemory(d, sizeof(*d)); + + d->alert = a; + d->hwnd = hwnd; + + khui_alert_lock(a); + + a->flags |= KHUI_ALERT_FLAG_DISPLAY_WINDOW; + LPUSH(&khui_alerts, d); + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, NTF_PARAM, (LONG_PTR) d); +#pragma warning(pop) + + khm_add_dialog(hwnd); + khm_enter_modal(hwnd); + + /* now figure out the size and position of the window */ + + hwnd_parent = GetWindow(hwnd, GW_OWNER); + GetWindowRect(hwnd_parent, &r_parent); + + dlgb = GetDialogBaseUnits(); + +#define DLG2SCNX(x) MulDiv((x), LOWORD(dlgb), 4) +#define DLG2SCNY(y) MulDiv((y), HIWORD(dlgb), 8) + + d->dx_margin = DLG2SCNX(NTF_MARGIN); + d->dy_margin = DLG2SCNY(NTF_MARGIN); + + d->x_message = DLG2SCNX(NTF_MSG_X); + d->dx_message = DLG2SCNX(NTF_MSG_WIDTH); + + if (a->message) { + d->dy_message = DLG2SCNY(NTF_MSG_HEIGHT); + } + + if (a->suggestion) { + d->dy_suggestion = DLG2SCNY(NTF_SUG_HEIGHT); + d->dx_suggest_pad = DLG2SCNX(NTF_SUG_PAD); + } + + d->dy_bb = DLG2SCNY(NTF_BB_HEIGHT); + d->dx_button = DLG2SCNX(NTF_BUTTON_WIDTH); + d->dy_button = DLG2SCNY(NTF_BUTTON_HEIGHT); + d->dx_button_incr = DLG2SCNX(NTF_BUTTON_XINCR); + + d->dx_icon = DLG2SCNX(NTF_ICON_WIDTH); + d->dy_icon = DLG2SCNY(NTF_ICON_HEIGHT); + + d->dx_client = DLG2SCNX(NTF_WIDTH); + d->dy_client = max(d->dy_icon, + d->dy_message + + ((d->dy_suggestion > 0)? + (d->dy_suggestion + d->dy_margin): + 0)) + + d->dy_margin * 3 + d->dy_bb; + + /* adjust for client rect */ + s.cx = d->dx_client; + s.cy = d->dy_client; + + { + RECT c_r; + RECT w_r; + + GetWindowRect(hwnd, &w_r); + GetClientRect(hwnd, &c_r); + + s.cx += (w_r.right - w_r.left) - (c_r.right - c_r.left); + s.cy += (w_r.bottom - w_r.top) - (c_r.bottom - c_r.top); + } + + pos.x = (r_parent.left + r_parent.right - s.cx) / 2; + pos.y = (r_parent.top + r_parent.bottom - s.cy) / 2; + + SetWindowPos(hwnd, + HWND_TOP, + pos.x, pos.y, + s.cx, s.cy, + SWP_SHOWWINDOW); + + { + LOGFONT lf; + HDC hdc_dt; + + hdc_dt = GetDC(NULL); + + lf.lfHeight = -MulDiv(8, + GetDeviceCaps(hdc_dt, LOGPIXELSY), + 72); + lf.lfWidth = 0; + lf.lfEscapement = 0; + lf.lfOrientation = 0; + lf.lfWeight = FW_NORMAL; + lf.lfItalic = FALSE; + lf.lfUnderline = FALSE; + lf.lfStrikeOut = FALSE; + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfOutPrecision = OUT_DEFAULT_PRECIS; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfPitchAndFamily = DEFAULT_PITCH; + + LoadString(khm_hInstance, IDS_DEFAULT_FONT, + lf.lfFaceName, ARRAYLENGTH(lf.lfFaceName)); + + d->hfont = CreateFontIndirect(&lf); + + ReleaseDC(NULL, hdc_dt); + } + + /* create dialog controls now */ + { + int x,y; + int width, height; + int i; + + x = d->x_message; + y = d->dy_client - d->dy_bb; + width = d->dx_button; + height = d->dy_button; + + for(i=0; in_alert_commands; i++) { + wchar_t caption[256]; + khui_action * action; + HWND hw_button; + + if(a->alert_commands[i] == 0) + continue; + + action = khui_find_action(a->alert_commands[i]); + if(action == NULL) + continue; + + LoadString(khm_hInstance, action->is_caption, + caption, ARRAYLENGTH(caption)); + + hw_button = + CreateWindowEx(0, + L"BUTTON", + caption, + WS_VISIBLE | WS_CHILD | + /* the first button is the default */ + ((i==0)? BS_DEFPUSHBUTTON: 0), + x,y,width,height, + hwnd, + (HMENU)(INT_PTR) (action->cmd), + khm_hInstance, + NULL); + + SendMessage(hw_button, WM_SETFONT, + (WPARAM) d->hfont, MAKELPARAM(TRUE, 0)); + + d->hwnd_buttons[i] = hw_button; + + x += d->dx_button_incr; + } + } + + khm_notify_icon_change(a->severity); + + khui_alert_unlock(a); + + d->metrics_done = FALSE; + + return TRUE; + } + break; /* not reached */ + + case WM_DESTROY: + { + alerter_wnd_data * d; + + /* khm_leave_modal() could be here, but instead it is in + the WM_COMMAND handler. This is because the modal loop + has to be exited before DestroyWindow() is issued. */ + //khm_leave_modal(); + khm_del_dialog(hwnd); + + d = (alerter_wnd_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, NTF_PARAM); + + LDELETE(&khui_alerts, d); + + khui_alert_lock(d->alert); + d->alert->flags &= ~KHUI_ALERT_FLAG_DISPLAY_WINDOW; + if (d->alert->flags & KHUI_ALERT_FLAG_MODAL) + notifier_modal_loop = FALSE; + khui_alert_unlock(d->alert); + + khui_alert_release(d->alert); + + DeleteObject(d->hfont); + + PFREE(d); + + khm_notify_icon_change(KHERR_NONE); + + return TRUE; + } + break; + + case WM_PAINT: + { + RECT r_update; + PAINTSTRUCT ps; + HDC hdc; + LONG dlgb; + alerter_wnd_data * d; + HFONT hf_old; + BOOL need_resize = FALSE; + + if(!GetUpdateRect(hwnd, &r_update, TRUE)) + return FALSE; + + d = (alerter_wnd_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, NTF_PARAM); + + dlgb = GetDialogBaseUnits(); + + hdc = BeginPaint(hwnd, &ps); + + hf_old = SelectFont(hdc, d->hfont); + + khui_alert_lock(d->alert); + + // draw the severity icon + { + HICON hicon; + int x,y; + int iid; + + /* GOINGHERE! If the metrics for the window haven't + been calculated yet, then calculate them. If the + hight needs to be expanded, then do that and wait + for the next repaint cycle. Also move the button + controls down. */ + x = d->dx_margin; + y = d->dy_margin; + + if(d->alert->severity == KHERR_ERROR) + iid = OIC_HAND; + else if(d->alert->severity == KHERR_WARNING) + iid = OIC_BANG; + else + iid = OIC_NOTE; + + hicon = LoadImage(NULL, + MAKEINTRESOURCE(iid), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + LR_SHARED); + + DrawIcon(hdc, x, y, hicon); + } + + // draw the message + if(d->alert->message) { + RECT r; + int width; + int height; + size_t cch; + + r.left = d->x_message; + r.top = d->dy_margin; + width = d->dx_message; + r.right = r.left + width; + height = d->dy_message; + r.bottom = r.top + height; + + StringCchLength(d->alert->message, + KHUI_MAXCCH_MESSAGE, &cch); + + height = DrawText(hdc, + d->alert->message, + (int) cch, + &r, + DT_WORDBREAK | + DT_CALCRECT); + + if (height > d->dy_message) { + d->dy_message = height; + need_resize = TRUE; + } else { + DrawText(hdc, + d->alert->message, + (int) cch, + &r, + DT_WORDBREAK); + } + + d->y_message = r.top; + } + + // and the suggestion + if (d->alert->suggestion) { + RECT r, ro; + int height; + size_t cch; + HICON h_sug_ico; + + r.left = d->x_message; + r.top = d->y_message + d->dy_message + d->dy_margin; + r.right = r.left + d->dx_message; + r.bottom = r.top + d->dy_suggestion; + + CopyRect(&ro, &r); + + // adjust for icon and padding + r.left += GetSystemMetrics(SM_CXSMICON) + d->dx_suggest_pad * 2; + r.top += d->dx_suggest_pad; + r.right -= d->dx_suggest_pad; + r.bottom -= d->dx_suggest_pad; + + StringCchLength(d->alert->suggestion, + KHUI_MAXCCH_SUGGESTION, &cch); + + height = DrawText(hdc, + d->alert->suggestion, + (int) cch, + &r, + DT_WORDBREAK | + DT_CALCRECT); + + if (height > d->dy_suggestion) { + d->dy_suggestion = height; + need_resize = TRUE; + } else { + int old_bk_mode; + + ro.bottom = r.bottom + d->dx_suggest_pad; + + FillRect(hdc, &ro, (HBRUSH) (COLOR_INFOBK + 1)); + DrawEdge(hdc, &ro, EDGE_SUNKEN, BF_FLAT | BF_RECT); + + h_sug_ico = + LoadImage(0, + MAKEINTRESOURCE(OIC_INFORMATION), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + LR_SHARED); + + assert(h_sug_ico != NULL); + + DrawIconEx(hdc, + ro.left + d->dx_suggest_pad, + ro.top + d->dx_suggest_pad, + h_sug_ico, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + 0, NULL, + DI_NORMAL); + + old_bk_mode = SetBkMode(hdc, TRANSPARENT); + + DrawText(hdc, + d->alert->suggestion, + (int) cch, + &r, + DT_WORDBREAK); + + SetBkMode(hdc, old_bk_mode); + } + + d->y_suggestion = r.top; + } + + khui_alert_unlock(d->alert); + + SelectObject(hdc, hf_old); + + EndPaint(hwnd, &ps); + + if (need_resize) { + RECT r; + int x,y; + int width, height; + int i; + + GetClientRect(hwnd, &r); + + height = max(d->dy_icon, + d->dy_message + + ((d->dy_suggestion > 0)? + (d->dy_suggestion + d->dy_margin): + 0)) + + d->dy_margin * 3 + d->dy_bb; + r.bottom = r.top + height; + + d->dy_client = height; + + AdjustWindowRectEx(&r, + GetWindowLongPtr(hwnd, GWL_STYLE), + FALSE, + GetWindowLongPtr(hwnd, GWL_EXSTYLE)); + + SetWindowPos(hwnd, + NULL, + 0, 0, + r.right - r.left, + r.bottom - r.top, + SWP_NOACTIVATE | SWP_NOCOPYBITS | + SWP_NOMOVE | SWP_NOOWNERZORDER | + SWP_NOZORDER); + + InvalidateRect(hwnd, NULL, TRUE); + + x = d->x_message; + y = d->dy_client - d->dy_bb; + width = d->dx_button; + height = d->dy_button; + + for(i=0; ialert->n_alert_commands; i++) { + MoveWindow(d->hwnd_buttons[i], + x,y, + width,height, + TRUE); + + x += d->dx_button_incr; + } + } + + return FALSE; + } + break; /* not reached */ + + case WM_COMMAND: + { + alerter_wnd_data * d; + + d = (alerter_wnd_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, NTF_PARAM); + + if(HIWORD(wParam) == BN_CLICKED) { + khui_alert_lock(d->alert); + d->alert->response = LOWORD(wParam); + khui_alert_unlock(d->alert); + + khm_leave_modal(); + + DestroyWindow(hwnd); + + if (LOWORD(wParam) == KHUI_PACTION_NEXT) + kmq_post_message(KMSG_ALERT, KMSG_ALERT_SHOW_QUEUED, 0, 0); + return 0; + } + } + break; + } + + return DefDlgProc(hwnd, uMsg, wParam, lParam); + //return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +ATOM khm_register_alerter_wnd_class(void) +{ + WNDCLASSEX wcx; + + ZeroMemory(&wcx, sizeof(wcx)); + + wcx.cbSize = sizeof(wcx); + wcx.style = + CS_OWNDC | +#if(_WIN32_WINNT >= 0x0501) + ((IS_COMMCTL6())? CS_DROPSHADOW: 0) | +#endif + 0; + wcx.lpfnWndProc = alerter_wnd_proc; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = DLGWINDOWEXTRA + sizeof(LONG_PTR); + wcx.hInstance = khm_hInstance; + wcx.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); + wcx.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); + wcx.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1); + wcx.lpszMenuName = NULL; + wcx.lpszClassName = KHUI_ALERTER_CLASS; + wcx.hIconSm = NULL; + + atom_alerter = RegisterClassEx(&wcx); + + return atom_alerter; +} + +/********************************************************************** + Notification Icon +***********************************************************************/ + +#define KHUI_NOTIFY_ICON_ID 0 + +void khm_notify_icon_add(void) { + NOTIFYICONDATA ni; + wchar_t buf[256]; + + ZeroMemory(&ni, sizeof(ni)); + + ni.cbSize = sizeof(ni); + ni.hWnd = hwnd_notifier; + ni.uID = KHUI_NOTIFY_ICON_ID; + ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + ni.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(iid_normal)); + ni.uCallbackMessage = KHUI_WM_NOTIFIER; + LoadString(khm_hInstance, IDS_NOTIFY_PREFIX, buf, ARRAYLENGTH(buf)); + StringCbCopy(ni.szTip, sizeof(ni.szTip), buf); + LoadString(khm_hInstance, IDS_NOTIFY_READY, buf, ARRAYLENGTH(buf)); + StringCbCat(ni.szTip, sizeof(ni.szTip), buf); + + Shell_NotifyIcon(NIM_ADD, &ni); + + ni.cbSize = sizeof(ni); + ni.uVersion = NOTIFYICON_VERSION; + Shell_NotifyIcon(NIM_SETVERSION, &ni); + + DestroyIcon(ni.hIcon); +} + +void +khm_notify_icon_balloon(khm_int32 severity, + wchar_t * title, + wchar_t * msg, + khm_int32 timeout) { + NOTIFYICONDATA ni; + int iid; + + if (!msg || !title) + return; + + ZeroMemory(&ni, sizeof(ni)); + ni.cbSize = sizeof(ni); + + if (severity == KHERR_INFO) { + ni.dwInfoFlags = NIIF_INFO; + iid = IDI_NOTIFY_INFO; + } else if (severity == KHERR_WARNING) { + ni.dwInfoFlags = NIIF_WARNING; + iid = IDI_NOTIFY_WARN; + } else if (severity == KHERR_ERROR) { + ni.dwInfoFlags = NIIF_ERROR; + iid = IDI_NOTIFY_ERROR; + } else { + ni.dwInfoFlags = NIIF_NONE; + iid = iid_normal; + } + + ni.hWnd = hwnd_notifier; + ni.uID = KHUI_NOTIFY_ICON_ID; + ni.uFlags = NIF_INFO | NIF_ICON; + ni.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(iid)); + + if (FAILED(StringCbCopy(ni.szInfo, sizeof(ni.szInfo), msg))) { + /* too long? */ + StringCchCopyN(ni.szInfo, ARRAYLENGTH(ni.szInfo), + msg, + ARRAYLENGTH(ni.szInfo) - ARRAYLENGTH(ELIPSIS)); + StringCchCat(ni.szInfo, ARRAYLENGTH(ni.szInfo), + ELIPSIS); + } + + if (FAILED(StringCbCopy(ni.szInfoTitle, sizeof(ni.szInfoTitle), + title))) { + StringCchCopyN(ni.szInfoTitle, ARRAYLENGTH(ni.szInfoTitle), + title, + ARRAYLENGTH(ni.szInfoTitle) - ARRAYLENGTH(ELIPSIS)); + StringCchCat(ni.szInfoTitle, ARRAYLENGTH(ni.szInfoTitle), + ELIPSIS); + } + ni.uTimeout = timeout; + + Shell_NotifyIcon(NIM_MODIFY, &ni); + + DestroyIcon(ni.hIcon); +} + +void khm_notify_icon_expstate(enum khm_notif_expstate expseverity) { + int new_iid; + + if (expseverity == KHM_NOTIF_OK) + new_iid = IDI_APPICON_OK; + else if (expseverity == KHM_NOTIF_WARN) + new_iid = IDI_APPICON_WARN; + else if (expseverity == KHM_NOTIF_EXP) + new_iid = IDI_APPICON_EXP; + else + new_iid = IDI_NOTIFY_NONE; + + if (iid_normal == new_iid) + return; + + iid_normal = new_iid; + + if (current_alert == NULL) + khm_notify_icon_change(KHERR_NONE); +} + +void khm_notify_icon_change(khm_int32 severity) { + NOTIFYICONDATA ni; + wchar_t buf[256]; + int iid; + + if (severity == KHERR_INFO) + iid = IDI_NOTIFY_INFO; + else if (severity == KHERR_WARNING) + iid = IDI_NOTIFY_WARN; + else if (severity == KHERR_ERROR) + iid = IDI_NOTIFY_ERROR; + else + iid = iid_normal; + + ZeroMemory(&ni, sizeof(ni)); + + ni.cbSize = sizeof(ni); + ni.hWnd = hwnd_notifier; + ni.uID = KHUI_NOTIFY_ICON_ID; + ni.uFlags = NIF_ICON | NIF_TIP; + ni.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(iid)); + LoadString(khm_hInstance, IDS_NOTIFY_PREFIX, buf, ARRAYLENGTH(buf)); + StringCbCopy(ni.szTip, sizeof(ni.szTip), buf); + if(severity == KHERR_NONE) + LoadString(khm_hInstance, IDS_NOTIFY_READY, buf, ARRAYLENGTH(buf)); + else + LoadString(khm_hInstance, IDS_NOTIFY_ATTENTION, buf, ARRAYLENGTH(buf)); + StringCbCat(ni.szTip, sizeof(ni.szTip), buf); + + Shell_NotifyIcon(NIM_MODIFY, &ni); + + DestroyIcon(ni.hIcon); +} + +void khm_notify_icon_remove(void) { + NOTIFYICONDATA ni; + + ZeroMemory(&ni, sizeof(ni)); + + ni.cbSize = sizeof(ni); + ni.hWnd = hwnd_notifier; + ni.uID = KHUI_NOTIFY_ICON_ID; + + Shell_NotifyIcon(NIM_DELETE, &ni); +} + +/********************************************************************* + Initialization +**********************************************************************/ + +void khm_init_notifier(void) +{ + if(!khm_register_notifier_wnd_class()) + return; + + if(!khm_register_alerter_wnd_class()) + return; + + hwnd_notifier = CreateWindowEx(0, + MAKEINTATOM(atom_notifier), + KHUI_NOTIFIER_WINDOW, + 0, + 0,0,0,0, + HWND_MESSAGE, + NULL, + khm_hInstance, + NULL); + + if(hwnd_notifier != NULL) { + kmq_subscribe_hwnd(KMSG_ALERT, hwnd_notifier); + kmq_subscribe_hwnd(KMSG_CRED, hwnd_notifier); + notifier_ready = TRUE; + + khm_notify_icon_add(); + } +#ifdef DEBUG + else { + assert(hwnd_notifier != NULL); + } +#endif + khm_timer_init(); + + khm_addr_change_notifier_init(); +} + +void khm_exit_notifier(void) +{ + khm_addr_change_notifier_exit(); + + khm_timer_exit(); + + if(hwnd_notifier != NULL) { + khm_notify_icon_remove(); + kmq_unsubscribe_hwnd(KMSG_ALERT, hwnd_notifier); + kmq_unsubscribe_hwnd(KMSG_CRED, hwnd_notifier); + DestroyWindow(hwnd_notifier); + hwnd_notifier = NULL; + } + + if(atom_notifier != 0) { + UnregisterClass(MAKEINTATOM(atom_notifier), khm_hInstance); + atom_notifier = 0; + } + + if(atom_alerter != 0) { + UnregisterClass(MAKEINTATOM(atom_alerter), khm_hInstance); + atom_alerter = 0; + } + + notifier_ready = FALSE; +} --- krb5-1.4.4.orig/src/windows/identity/ui/statusbar.h +++ krb5-1.4.4/src/windows/identity/ui/statusbar.h @@ -1,54 +1,54 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_STATUSBAR_H -#define __KHIMAIRA_STATUSBAR_H - -typedef struct khm_statusbar_part_t { - int id; - int width; - int wtype; /* one of KHUI_SB_WTYPE_* */ -} khm_statusbar_part; - -#define KHUI_SB_WTYPE_RELATIVE 1 -#define KHUI_SB_WTYPE_ABSOLUTE 2 -#define KHUI_SB_WTYPE_FILLER 4 - -/* statusbar parts */ -#define KHUI_SBPART_INFO 1 -#define KHUI_SBPART_NOTICE 2 -#define KHUI_SBPART_LOC 3 - -extern HWND khm_hwnd_statusbar; -extern khm_statusbar_part khm_statusbar_parts[]; -extern int khm_n_statusbar_parts; - -void khm_create_statusbar(HWND p); -void khm_update_statusbar(HWND parent); -void khm_statusbar_set_part(int id, HICON icon, wchar_t * text); -LRESULT khm_statusbar_notify(LPNMHDR nmhdr); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_STATUSBAR_H +#define __KHIMAIRA_STATUSBAR_H + +typedef struct khm_statusbar_part_t { + int id; + int width; + int wtype; /* one of KHUI_SB_WTYPE_* */ +} khm_statusbar_part; + +#define KHUI_SB_WTYPE_RELATIVE 1 +#define KHUI_SB_WTYPE_ABSOLUTE 2 +#define KHUI_SB_WTYPE_FILLER 4 + +/* statusbar parts */ +#define KHUI_SBPART_INFO 1 +#define KHUI_SBPART_NOTICE 2 +#define KHUI_SBPART_LOC 3 + +extern HWND khm_hwnd_statusbar; +extern khm_statusbar_part khm_statusbar_parts[]; +extern int khm_n_statusbar_parts; + +void khm_create_statusbar(HWND p); +void khm_update_statusbar(HWND parent); +void khm_statusbar_set_part(int id, HICON icon, wchar_t * text); +LRESULT khm_statusbar_notify(LPNMHDR nmhdr); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/aboutwnd.h +++ krb5-1.4.4/src/windows/identity/ui/aboutwnd.h @@ -1,33 +1,33 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_ABOUTWND_H -#define __KHIMAIRA_ABOUTWND_H - -void -khm_create_about_window(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_ABOUTWND_H +#define __KHIMAIRA_ABOUTWND_H + +void +khm_create_about_window(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/mainwnd.c +++ krb5-1.4.4/src/windows/identity/ui/mainwnd.c @@ -1,926 +1,926 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -ATOM khm_main_window_class; -ATOM khm_null_window_class; -HWND khm_hwnd_null; -HWND khm_hwnd_main; -HWND khm_hwnd_rebar; -HWND khm_hwnd_main_cred; - -#define MW_RESIZE_TIMER 1 -#define MW_RESIZE_TIMEOUT 2000 -#define MW_REFRESH_TIMER 2 -#define MW_REFRESH_TIMEOUT 600 - -void -khm_set_dialog_result(HWND hwnd, LRESULT lr) { -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_MSGRESULT, lr); -#pragma warning(pop) -} - -static void -mw_restart_refresh_timer(HWND hwnd) { - khm_handle csp_cw; - khm_int32 timeout; - - KillTimer(hwnd, MW_REFRESH_TIMER); - if (KHM_SUCCEEDED(khc_open_space(NULL, - L"CredWindow", - KHM_PERM_READ, - &csp_cw))) { - if (KHM_FAILED(khc_read_int32(csp_cw, - L"RefreshTimeout", - &timeout))) - timeout = MW_REFRESH_TIMEOUT; - khc_close_space(csp_cw); - } else - timeout = MW_REFRESH_TIMEOUT; - - timeout *= 1000; /* convert to milliseconds */ - - SetTimer(hwnd, MW_REFRESH_TIMER, timeout, NULL); -} - -khm_int32 KHMAPI -mw_select_cred(khm_handle cred, void * rock) { - if (cred) - kcdb_cred_set_flags(cred, - KCDB_CRED_FLAG_SELECTED, - KCDB_CRED_FLAG_SELECTED); - - return KHM_ERROR_SUCCESS; -} - -/* perform shutdown operations */ -static void -khm_pre_shutdown(void) { - khm_handle csp_cw = NULL; - khm_handle credset = NULL; - khm_int32 t; - khm_size s; - - /* Check if we should destroy all credentials on exit... */ - - if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", 0, &csp_cw))) - return; - - if (KHM_FAILED(khc_read_int32(csp_cw, L"DestroyCredsOnExit", &t)) || - !t) - goto _cleanup; - - if (KHM_FAILED(kcdb_credset_create(&credset))) - goto _cleanup; - - if (KHM_FAILED(kcdb_credset_extract(credset, NULL, NULL, - KCDB_TYPE_INVALID))) - goto _cleanup; - - if (KHM_FAILED(kcdb_credset_get_size(credset, &s)) || - s == 0) - goto _cleanup; - - kcdb_credset_apply(credset, mw_select_cred, NULL); - - khui_context_set(KHUI_SCOPE_GROUP, - NULL, - KCDB_CREDTYPE_INVALID, - NULL, - NULL, - 0, - credset); - - khm_cred_destroy_creds(TRUE, TRUE); - - _cleanup: - - if (credset) - kcdb_credset_delete(credset); - - if (csp_cw) - khc_close_space(csp_cw); -} - -void -khm_process_query_app_ver(khm_query_app_version * papp_ver) { - - if (!papp_ver || papp_ver->magic != KHM_QUERY_APP_VER_MAGIC) - return; - - papp_ver->ver_remote = app_version; - - /* the remote instance has requested swapping in. we check the - version numbers and if the remote instance is newer than us, - then we exit and let the remote instance take over. */ - if (papp_ver->request_swap) { - khm_version ver_caller = papp_ver->ver_caller; - - if (ver_caller.major > app_version.major || - - (ver_caller.major == app_version.major && - ver_caller.minor > app_version.minor) || - - (ver_caller.major == app_version.major && - ver_caller.minor == app_version.minor && - ver_caller.aux > app_version.aux) || - - (ver_caller.major == app_version.major && - ver_caller.minor == app_version.minor && - ver_caller.aux == app_version.aux && - ver_caller.patch > app_version.patch)) { - - papp_ver->request_swap = TRUE; - - if (khm_hwnd_main) - DestroyWindow(khm_hwnd_main); - - } else { - - papp_ver->request_swap = FALSE; - - } - } - - papp_ver->code = KHM_ERROR_SUCCESS; -} - -LRESULT CALLBACK -khm_main_wnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - LPNMHDR lpnm; - - switch(uMsg) { - case WM_CREATE: - khm_create_main_window_controls(hwnd); - kmq_subscribe_hwnd(KMSG_CRED, hwnd); - kmq_subscribe_hwnd(KMSG_ACT, hwnd); - kmq_subscribe_hwnd(KMSG_KMM, hwnd); - mw_restart_refresh_timer(hwnd); - - if (!kmm_load_pending()) - kmq_post_message(KMSG_ACT, KMSG_ACT_BEGIN_CMDLINE, 0, 0); - break; - - case WM_DESTROY: - khm_pre_shutdown(); - kmq_unsubscribe_hwnd(KMSG_ACT, hwnd); - kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); - HtmlHelp(NULL, NULL, HH_CLOSE_ALL, 0); - PostQuitMessage(0); - break; - - case WM_NOTIFY: - lpnm = (LPNMHDR) lParam; - if(lpnm->hwndFrom == khui_main_menu_toolbar) { - return khm_menu_notify_main(lpnm); - } else if(lpnm->hwndFrom == khui_hwnd_standard_toolbar) { - return khm_toolbar_notify(lpnm); - } else if(lpnm->hwndFrom == khm_hwnd_rebar) { - return khm_rebar_notify(lpnm); - } else if(lpnm->hwndFrom == khm_hwnd_statusbar) { - return khm_statusbar_notify(lpnm); - } - break; - - case WM_HELP: - khm_html_help(khm_hwnd_main, NULL, HH_HELP_CONTEXT, IDH_WELCOME); - break; - - case WM_COMMAND: - switch(LOWORD(wParam)) { - /* general actions */ - case KHUI_ACTION_VIEW_REFRESH: - khm_cred_refresh(); - InvalidateRect(khm_hwnd_main_cred, NULL, FALSE); - return 0; - - case KHUI_ACTION_PASSWD_ID: - khm_cred_change_password(NULL); - return 0; - - case KHUI_ACTION_NEW_CRED: - khm_cred_obtain_new_creds(NULL); - return 0; - - case KHUI_ACTION_RENEW_CRED: - khm_cred_renew_creds(); - return 0; - - case KHUI_ACTION_DESTROY_CRED: - khm_cred_destroy_creds(FALSE, FALSE); - return 0; - - case KHUI_ACTION_SET_DEF_ID: - khm_cred_set_default(); - return 0; - - case KHUI_ACTION_EXIT: - DestroyWindow(hwnd); - break; - - case KHUI_ACTION_OPEN_APP: - khm_show_main_window(); - break; - - case KHUI_ACTION_CLOSE_APP: - khm_hide_main_window(); - break; - - case KHUI_ACTION_OPT_KHIM: { - khui_config_node node = NULL; - - khui_cfg_open(NULL, L"KhmGeneral", &node); - khm_show_config_pane(node); - } - break; - - case KHUI_ACTION_OPT_IDENTS: { - khui_config_node node = NULL; - - khui_cfg_open(NULL, L"KhmIdentities", &node); - khm_show_config_pane(node); - } - break; - - case KHUI_ACTION_OPT_APPEAR: { - khui_config_node node = NULL; - - khui_cfg_open(NULL, L"KhmAppear", &node); - khm_show_config_pane(node); - } - break; - - case KHUI_ACTION_OPT_NOTIF: { - khui_config_node node = NULL; - - khui_cfg_open(NULL, L"KhmNotifications", &node); - khm_show_config_pane(node); - } - break; - - case KHUI_ACTION_OPT_PLUGINS: { - khui_config_node node = NULL; - - khui_cfg_open(NULL, L"KhmPlugins", &node); - khm_show_config_pane(node); - } - break; - - case KHUI_ACTION_HELP_CTX: - khm_html_help(khm_hwnd_main, NULL, HH_HELP_CONTEXT, IDH_WELCOME); - break; - - case KHUI_ACTION_HELP_CONTENTS: - khm_html_help(khm_hwnd_main, NULL, HH_DISPLAY_TOC, 0); - break; - - case KHUI_ACTION_HELP_INDEX: - khm_html_help(khm_hwnd_main, NULL, HH_DISPLAY_INDEX, (DWORD_PTR) L""); - break; - - case KHUI_ACTION_HELP_ABOUT: - khm_create_about_window(); - break; - - case KHUI_ACTION_IMPORT: - khm_cred_import(); - break; - - case KHUI_ACTION_PROPERTIES: - /* properties are not handled by the main window. - Just bounce it to credwnd. However, use SendMessage - instead of PostMessage so we don't lose context */ - return SendMessage(khm_hwnd_main_cred, uMsg, - wParam, lParam); - - /* menu commands */ - case KHUI_PACTION_MENU: - if(HIWORD(lParam) == 1) - mm_last_hot_item = LOWORD(lParam); - return khm_menu_activate(MENU_ACTIVATE_DEFAULT); - - case KHUI_PACTION_ESC: - /* if esc is pressed while no menu is active, we close the - main window */ - if (mm_last_hot_item == -1) { - khm_close_main_window(); - return 0; - } - - /* generic, retargetting */ - case KHUI_PACTION_UP: - case KHUI_PACTION_UP_TOGGLE: - case KHUI_PACTION_UP_EXTEND: - case KHUI_PACTION_PGUP: - case KHUI_PACTION_PGUP_EXTEND: - case KHUI_PACTION_DOWN: - case KHUI_PACTION_DOWN_TOGGLE: - case KHUI_PACTION_DOWN_EXTEND: - case KHUI_PACTION_PGDN: - case KHUI_PACTION_PGDN_EXTEND: - case KHUI_PACTION_LEFT: - case KHUI_PACTION_RIGHT: - case KHUI_PACTION_ENTER: - /* menu tracking */ - if(mm_last_hot_item != -1) { - switch(LOWORD(wParam)) { - case KHUI_PACTION_LEFT: - khm_menu_activate(MENU_ACTIVATE_LEFT); - break; - - case KHUI_PACTION_RIGHT: - khm_menu_activate(MENU_ACTIVATE_RIGHT); - break; - - case KHUI_PACTION_ESC: - case KHUI_PACTION_ENTER: - khm_menu_activate(MENU_ACTIVATE_NONE); - break; - - case KHUI_PACTION_DOWN: - khm_menu_track_current(); - break; - } - return 0; - } - - /*FALLTHROUGH*/ - case KHUI_PACTION_DELETE: - - case KHUI_PACTION_SELALL: - case KHUI_ACTION_LAYOUT_ID: - case KHUI_ACTION_LAYOUT_TYPE: - case KHUI_ACTION_LAYOUT_LOC: - case KHUI_ACTION_LAYOUT_CUST: - case KHUI_ACTION_LAYOUT_RELOAD: - /* otherwise fallthrough and bounce to the creds window */ - return SendMessage(khm_hwnd_main_cred, uMsg, - wParam, lParam); - - default: - /* handle custom actions here */ - { - khui_action * act; - - act = khui_find_action(LOWORD(wParam)); - if (act && act->listener) { - kmq_post_sub_msg(act->listener, KMSG_ACT, KMSG_ACT_ACTIVATE, act->cmd, NULL); - } - } - } - break; /* WM_COMMAND */ - - case WM_SYSCOMMAND: - switch(wParam & 0xfff0) { - case SC_MINIMIZE: - khm_hide_main_window(); - return 0; - - case SC_CLOSE: - khm_close_main_window(); - return 0; - } - break; - - case WM_MEASUREITEM: - /* sent to measure the bitmaps associated with a menu item */ - if(!wParam) /* sent by menu */ - return khm_menu_measure_item(wParam, lParam); - break; - - case WM_DRAWITEM: - /* sent to draw a menu item */ - if(!wParam) - return khm_menu_draw_item(wParam, lParam); - break; - - case WM_ERASEBKGND: - /* Don't erase the background. The whole client area is - covered with children. It doesn't need to be erased */ - return TRUE; - break; - - case WM_SIZE: - if(hwnd == khm_hwnd_main && - (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED)) { - int cwidth, cheight; - RECT r_rebar, r_status; - - cwidth = LOWORD(lParam); - cheight = HIWORD(lParam); - - /* resize the rebar control */ - SendMessage(khm_hwnd_rebar, WM_SIZE, 0, 0); - - khm_update_statusbar(hwnd); - - GetWindowRect(khm_hwnd_rebar, &r_rebar); - GetWindowRect(khm_hwnd_statusbar, &r_status); - - /* the cred window fills the area between the rebar - and the status bar */ - MoveWindow(khm_hwnd_main_cred, 0, - r_rebar.bottom - r_rebar.top, - r_status.right - r_status.left, - r_status.top - r_rebar.bottom, TRUE); - - SetTimer(hwnd, - MW_RESIZE_TIMER, - MW_RESIZE_TIMEOUT, - NULL); - return 0; - } - break; - - case WM_MOVE: - { - SetTimer(hwnd, - MW_RESIZE_TIMER, - MW_RESIZE_TIMEOUT, - NULL); - } - break; - - case WM_TIMER: - if (wParam == MW_RESIZE_TIMER) { - RECT r; - khm_handle csp_cw; - khm_handle csp_mw; - - KillTimer(hwnd, wParam); - - GetWindowRect(hwnd, &r); - - if (KHM_SUCCEEDED(khc_open_space(NULL, - L"CredWindow", - KHM_PERM_WRITE, - &csp_cw))) { - if (KHM_SUCCEEDED(khc_open_space(csp_cw, - L"Windows\\Main", - KHM_PERM_WRITE, - &csp_mw))) { - khc_write_int32(csp_mw, L"XPos", r.left); - khc_write_int32(csp_mw, L"YPos", r.top); - khc_write_int32(csp_mw, L"Width", - r.right - r.left); - khc_write_int32(csp_mw, L"Height", - r.bottom - r.top); - - khc_close_space(csp_mw); - } - khc_close_space(csp_cw); - } - } else if (wParam == MW_REFRESH_TIMER) { - kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, 0); - } - break; - - case WM_MENUSELECT: - return khm_menu_handle_select(wParam, lParam); - break; - - case KMQ_WM_DISPATCH: - { - kmq_message * m; - khm_int32 rv = KHM_ERROR_SUCCESS; - - kmq_wm_begin(lParam, &m); - if (m->type == KMSG_ACT && - m->subtype == KMSG_ACT_REFRESH) { - khm_menu_refresh_items(); - khm_update_standard_toolbar(); - } else if (m->type == KMSG_ACT && - m->subtype == KMSG_ACT_BEGIN_CMDLINE) { - khm_cred_begin_startup_actions(); - } else if (m->type == KMSG_ACT && - m->subtype == KMSG_ACT_CONTINUE_CMDLINE) { - khm_cred_process_startup_actions(); - } else if (m->type == KMSG_ACT && - m->subtype == KMSG_ACT_SYNC_CFG) { - khm_refresh_config(); - } else if (m->type == KMSG_ACT && - m->subtype == KMSG_ACT_ACTIVATE) { - /* some custom action fired */ - - khm_int32 action; - khui_action * paction; - - action = m->uparam; - paction = khui_find_action(action); - if (paction && paction->data == (void *) CFGACTION_MAGIC) { - /* a custom configuration needs to be invoked */ - khui_config_node node; - - if (KHM_SUCCEEDED(khui_cfg_open(NULL, paction->name, &node))) { - khm_show_config_pane(node); - khui_cfg_release(node); - } - } - } else if (m->type == KMSG_CRED && - m->subtype == KMSG_CRED_REFRESH) { - mw_restart_refresh_timer(hwnd); - } else if (m->type == KMSG_CRED && - m->subtype == KMSG_CRED_ADDR_CHANGE) { - khm_cred_addr_change(); - } else if (m->type == KMSG_KMM && - m->subtype == KMSG_KMM_I_DONE) { - kmq_post_message(KMSG_ACT, KMSG_ACT_BEGIN_CMDLINE, 0, 0); - } - return kmq_wm_end(m, rv); - } - break; - - case WM_KHUI_ASSIGN_COMMANDLINE: - { - HANDLE hmap; - void * xfer; - wchar_t mapname[256]; - - StringCbPrintf(mapname, sizeof(mapname), - COMMANDLINE_MAP_FMT, (DWORD) lParam); - - hmap = OpenFileMapping(FILE_MAP_READ, FALSE, mapname); - - if (hmap == NULL) - return 1; - - xfer = MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, - sizeof(khm_startup)); - - if (xfer) { - memcpy(&khm_startup, xfer, sizeof(khm_startup)); - - UnmapViewOfFile(xfer); - } - - CloseHandle(hmap); - - if(InSendMessage()) - ReplyMessage(0); - - khm_startup.exit = FALSE; - - khm_startup.seen = FALSE; - khm_startup.processing = FALSE; - - khm_cred_begin_startup_actions(); - } - break; - - case WM_KHUI_QUERY_APP_VERSION: - { - HANDLE hmap; - void * xfer; - wchar_t mapname[256]; - - StringCbPrintf(mapname, sizeof(mapname), - QUERY_APP_VER_MAP_FMT, (DWORD) lParam); - - hmap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, - FALSE, mapname); - - if (hmap == NULL) - return 1; - - xfer = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, - sizeof(khm_query_app_version)); - - if (xfer) { - khm_process_query_app_ver((khm_query_app_version *) xfer); - - UnmapViewOfFile(xfer); - } - - CloseHandle(hmap); - } - break; - - } - return DefWindowProc(hwnd,uMsg,wParam,lParam); -} - -LRESULT CALLBACK -khm_null_wnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -LRESULT -khm_rebar_notify(LPNMHDR lpnm) { - switch(lpnm->code) { -#if (_WIN32_WINNT >= 0x0501) - case RBN_AUTOBREAK: - { - LPNMREBARAUTOBREAK lpra = (LPNMREBARAUTOBREAK) lpnm; - lpra->fAutoBreak = TRUE; - } - break; -#endif - case RBN_BEGINDRAG: - { - LPNMREBAR lprb = (LPNMREBAR) lpnm; - if ((lprb->dwMask & RBNM_ID) && - lprb->wID == 0) - return 1; - else - return 0; - } - break; - - case NM_CUSTOMDRAW: - return CDRF_DODEFAULT; - break; - } - - return 1; -} - -void -khm_create_main_window_controls(HWND hwnd_main) { - REBARINFO rbi; - HWND hwRebar; - - khm_menu_create_main(hwnd_main); - - hwRebar = - CreateWindowEx(WS_EX_TOOLWINDOW, - REBARCLASSNAME, - L"Rebar", - WS_CHILD | - WS_VISIBLE| - WS_CLIPSIBLINGS | - WS_CLIPCHILDREN | - CCS_NODIVIDER | - RBS_VARHEIGHT | - RBS_FIXEDORDER, - 0,0,0,0, - hwnd_main, - NULL, - khm_hInstance, - NULL); - - if(!hwRebar) { - DWORD dwe = GetLastError(); - return; - } - - khm_hwnd_rebar = hwRebar; - - rbi.cbSize = sizeof(rbi); - rbi.fMask = 0; - rbi.himl = (HIMAGELIST) NULL; - if(!SendMessage(hwRebar, RB_SETBARINFO, 0, (LPARAM) &rbi)) - return; - - /* self attach */ - khm_create_standard_toolbar(hwRebar); - khm_create_statusbar(hwnd_main); - - /* manual attach */ - khm_hwnd_main_cred = khm_create_credwnd(hwnd_main); -} - -void -khm_create_main_window(void) { - wchar_t buf[1024]; - khm_handle csp_cw = NULL; - khm_handle csp_mw = NULL; - int x,y,width,height; - - LoadString(khm_hInstance, IDS_MAIN_WINDOW_TITLE, - buf, ARRAYLENGTH(buf)); - - khm_hwnd_null = - CreateWindow(MAKEINTATOM(khm_null_window_class), - buf, - 0, /* Style */ - 0, 0, /* x, y */ - 100, 100, /* width, height */ - NULL, /* parent */ - NULL, /* menu */ - NULL, /* HINSTANCE */ - 0); /* lparam */ - - if (!khm_hwnd_null) - return; - - x = CW_USEDEFAULT; - y = CW_USEDEFAULT; - width = CW_USEDEFAULT; - height = CW_USEDEFAULT; - - if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", - KHM_PERM_READ, - &csp_cw))) { - if (KHM_SUCCEEDED(khc_open_space(csp_cw, - L"Windows\\Main", - KHM_PERM_READ, - &csp_mw))) { - khm_int32 t; - - if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"XPos", &t))) - x = t; - if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"YPos", &t))) - y = t; - if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"Width", &t))) - width = t; - if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"Height", &t))) - height = t; - - khc_close_space(csp_mw); - } - khc_close_space(csp_cw); - } - - khm_hwnd_main = - CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, - MAKEINTATOM(khm_main_window_class), - buf, - WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | - WS_CLIPSIBLINGS, - x, y, width, height, - khm_hwnd_null, - NULL, - NULL, - NULL); - - khui_set_main_window(khm_hwnd_main); -} - -void -khm_show_main_window(void) { - - if (khm_nCmdShow == SW_RESTORE) { - HWND hw; - - hw = GetForegroundWindow(); - if (hw != khm_hwnd_main) - SetForegroundWindow(khm_hwnd_main); - } - - if (khm_nCmdShow == SW_SHOWMINIMIZED || - khm_nCmdShow == SW_SHOWMINNOACTIVE || - khm_nCmdShow == SW_MINIMIZE) { - khm_hide_main_window(); - } else { - ShowWindow(khm_hwnd_main, khm_nCmdShow); - UpdateWindow(khm_hwnd_main); - } - - khm_nCmdShow = SW_RESTORE; -} - -void -khm_close_main_window(void) { - khm_handle csp_cw; - BOOL keep_running = FALSE; - - if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", - KHM_PERM_READ, &csp_cw))) { - khm_int32 t; - - if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"KeepRunning", - &t))) { - keep_running = t; - } else { -#ifdef DEBUG - assert(FALSE); -#endif - } - - khc_close_space(csp_cw); - } else { -#ifdef DEBUG - assert(FALSE); -#endif - } - - if (keep_running) - khm_hide_main_window(); - else - DestroyWindow(khm_hwnd_main); -} - -void -khm_hide_main_window(void) { - khm_handle csp_notices = NULL; - khm_int32 show_warning = FALSE; - - if (khm_nCmdShow != SW_MINIMIZE && - KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow\\Notices", - KHM_PERM_WRITE, &csp_notices)) && - KHM_SUCCEEDED(khc_read_int32(csp_notices, L"MinimizeWarning", - &show_warning)) && - show_warning != 0) { - - khui_alert * alert; - wchar_t title[KHUI_MAXCCH_TITLE]; - wchar_t msg[KHUI_MAXCCH_MESSAGE]; - - LoadString(khm_hInstance, IDS_WARN_WM_TITLE, - title, ARRAYLENGTH(title)); - LoadString(khm_hInstance, IDS_WARN_WM_MSG, - msg, ARRAYLENGTH(msg)); - - khui_alert_create_simple(title, msg, KHERR_INFO, &alert); - khui_alert_set_flags(alert, KHUI_ALERT_FLAG_REQUEST_BALLOON, - KHUI_ALERT_FLAG_REQUEST_BALLOON); - - khui_alert_show(alert); - - khc_write_int32(csp_notices, L"MinimizeWarning", 0); - } - - if (csp_notices != NULL) - khc_close_space(csp_notices); - - ShowWindow(khm_hwnd_main, SW_HIDE); -} - -BOOL -khm_is_main_window_visible(void) { - return IsWindowVisible(khm_hwnd_main); -} - -BOOL -khm_is_main_window_active(void) { - if (!IsWindowVisible(khm_hwnd_main)) - return FALSE; - if (GetForegroundWindow() == khm_hwnd_main) - return TRUE; - return khm_is_dialog_active(); -} - -void -khm_register_main_wnd_class(void) { - WNDCLASSEX wc; - - wc.cbSize = sizeof(WNDCLASSEX); - wc.style = 0; - wc.lpfnWndProc = khm_null_wnd_proc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = khm_hInstance; - wc.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); - wc.hCursor = LoadCursor((HINSTANCE) NULL, MAKEINTRESOURCE(IDC_ARROW)); - wc.hIconSm = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); - wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE); - wc.lpszMenuName = NULL; - wc.lpszClassName = KHUI_NULL_WINDOW_CLASS; - - khm_null_window_class = RegisterClassEx(&wc); - - wc.cbSize = sizeof(WNDCLASSEX); - wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = khm_main_wnd_proc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = khm_hInstance; - wc.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); - wc.hCursor = LoadCursor((HINSTANCE) NULL, MAKEINTRESOURCE(IDC_ARROW)); - wc.hIconSm = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); - wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE); - wc.lpszMenuName = NULL; - wc.lpszClassName = KHUI_MAIN_WINDOW_CLASS; - - khm_main_window_class = RegisterClassEx(&wc); -} - -void -khm_unregister_main_wnd_class(void) { - UnregisterClass(MAKEINTATOM(khm_main_window_class),khm_hInstance); - UnregisterClass(MAKEINTATOM(khm_null_window_class),khm_hInstance); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +ATOM khm_main_window_class; +ATOM khm_null_window_class; +HWND khm_hwnd_null; +HWND khm_hwnd_main; +HWND khm_hwnd_rebar; +HWND khm_hwnd_main_cred; + +#define MW_RESIZE_TIMER 1 +#define MW_RESIZE_TIMEOUT 2000 +#define MW_REFRESH_TIMER 2 +#define MW_REFRESH_TIMEOUT 600 + +void +khm_set_dialog_result(HWND hwnd, LRESULT lr) { +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_MSGRESULT, lr); +#pragma warning(pop) +} + +static void +mw_restart_refresh_timer(HWND hwnd) { + khm_handle csp_cw; + khm_int32 timeout; + + KillTimer(hwnd, MW_REFRESH_TIMER); + if (KHM_SUCCEEDED(khc_open_space(NULL, + L"CredWindow", + KHM_PERM_READ, + &csp_cw))) { + if (KHM_FAILED(khc_read_int32(csp_cw, + L"RefreshTimeout", + &timeout))) + timeout = MW_REFRESH_TIMEOUT; + khc_close_space(csp_cw); + } else + timeout = MW_REFRESH_TIMEOUT; + + timeout *= 1000; /* convert to milliseconds */ + + SetTimer(hwnd, MW_REFRESH_TIMER, timeout, NULL); +} + +khm_int32 KHMAPI +mw_select_cred(khm_handle cred, void * rock) { + if (cred) + kcdb_cred_set_flags(cred, + KCDB_CRED_FLAG_SELECTED, + KCDB_CRED_FLAG_SELECTED); + + return KHM_ERROR_SUCCESS; +} + +/* perform shutdown operations */ +static void +khm_pre_shutdown(void) { + khm_handle csp_cw = NULL; + khm_handle credset = NULL; + khm_int32 t; + khm_size s; + + /* Check if we should destroy all credentials on exit... */ + + if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", 0, &csp_cw))) + return; + + if (KHM_FAILED(khc_read_int32(csp_cw, L"DestroyCredsOnExit", &t)) || + !t) + goto _cleanup; + + if (KHM_FAILED(kcdb_credset_create(&credset))) + goto _cleanup; + + if (KHM_FAILED(kcdb_credset_extract(credset, NULL, NULL, + KCDB_TYPE_INVALID))) + goto _cleanup; + + if (KHM_FAILED(kcdb_credset_get_size(credset, &s)) || + s == 0) + goto _cleanup; + + kcdb_credset_apply(credset, mw_select_cred, NULL); + + khui_context_set(KHUI_SCOPE_GROUP, + NULL, + KCDB_CREDTYPE_INVALID, + NULL, + NULL, + 0, + credset); + + khm_cred_destroy_creds(TRUE, TRUE); + + _cleanup: + + if (credset) + kcdb_credset_delete(credset); + + if (csp_cw) + khc_close_space(csp_cw); +} + +void +khm_process_query_app_ver(khm_query_app_version * papp_ver) { + + if (!papp_ver || papp_ver->magic != KHM_QUERY_APP_VER_MAGIC) + return; + + papp_ver->ver_remote = app_version; + + /* the remote instance has requested swapping in. we check the + version numbers and if the remote instance is newer than us, + then we exit and let the remote instance take over. */ + if (papp_ver->request_swap) { + khm_version ver_caller = papp_ver->ver_caller; + + if (ver_caller.major > app_version.major || + + (ver_caller.major == app_version.major && + ver_caller.minor > app_version.minor) || + + (ver_caller.major == app_version.major && + ver_caller.minor == app_version.minor && + ver_caller.aux > app_version.aux) || + + (ver_caller.major == app_version.major && + ver_caller.minor == app_version.minor && + ver_caller.aux == app_version.aux && + ver_caller.patch > app_version.patch)) { + + papp_ver->request_swap = TRUE; + + if (khm_hwnd_main) + DestroyWindow(khm_hwnd_main); + + } else { + + papp_ver->request_swap = FALSE; + + } + } + + papp_ver->code = KHM_ERROR_SUCCESS; +} + +LRESULT CALLBACK +khm_main_wnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + LPNMHDR lpnm; + + switch(uMsg) { + case WM_CREATE: + khm_create_main_window_controls(hwnd); + kmq_subscribe_hwnd(KMSG_CRED, hwnd); + kmq_subscribe_hwnd(KMSG_ACT, hwnd); + kmq_subscribe_hwnd(KMSG_KMM, hwnd); + mw_restart_refresh_timer(hwnd); + + if (!kmm_load_pending()) + kmq_post_message(KMSG_ACT, KMSG_ACT_BEGIN_CMDLINE, 0, 0); + break; + + case WM_DESTROY: + khm_pre_shutdown(); + kmq_unsubscribe_hwnd(KMSG_ACT, hwnd); + kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); + HtmlHelp(NULL, NULL, HH_CLOSE_ALL, 0); + PostQuitMessage(0); + break; + + case WM_NOTIFY: + lpnm = (LPNMHDR) lParam; + if(lpnm->hwndFrom == khui_main_menu_toolbar) { + return khm_menu_notify_main(lpnm); + } else if(lpnm->hwndFrom == khui_hwnd_standard_toolbar) { + return khm_toolbar_notify(lpnm); + } else if(lpnm->hwndFrom == khm_hwnd_rebar) { + return khm_rebar_notify(lpnm); + } else if(lpnm->hwndFrom == khm_hwnd_statusbar) { + return khm_statusbar_notify(lpnm); + } + break; + + case WM_HELP: + khm_html_help(khm_hwnd_main, NULL, HH_HELP_CONTEXT, IDH_WELCOME); + break; + + case WM_COMMAND: + switch(LOWORD(wParam)) { + /* general actions */ + case KHUI_ACTION_VIEW_REFRESH: + khm_cred_refresh(); + InvalidateRect(khm_hwnd_main_cred, NULL, FALSE); + return 0; + + case KHUI_ACTION_PASSWD_ID: + khm_cred_change_password(NULL); + return 0; + + case KHUI_ACTION_NEW_CRED: + khm_cred_obtain_new_creds(NULL); + return 0; + + case KHUI_ACTION_RENEW_CRED: + khm_cred_renew_creds(); + return 0; + + case KHUI_ACTION_DESTROY_CRED: + khm_cred_destroy_creds(FALSE, FALSE); + return 0; + + case KHUI_ACTION_SET_DEF_ID: + khm_cred_set_default(); + return 0; + + case KHUI_ACTION_EXIT: + DestroyWindow(hwnd); + break; + + case KHUI_ACTION_OPEN_APP: + khm_show_main_window(); + break; + + case KHUI_ACTION_CLOSE_APP: + khm_hide_main_window(); + break; + + case KHUI_ACTION_OPT_KHIM: { + khui_config_node node = NULL; + + khui_cfg_open(NULL, L"KhmGeneral", &node); + khm_show_config_pane(node); + } + break; + + case KHUI_ACTION_OPT_IDENTS: { + khui_config_node node = NULL; + + khui_cfg_open(NULL, L"KhmIdentities", &node); + khm_show_config_pane(node); + } + break; + + case KHUI_ACTION_OPT_APPEAR: { + khui_config_node node = NULL; + + khui_cfg_open(NULL, L"KhmAppear", &node); + khm_show_config_pane(node); + } + break; + + case KHUI_ACTION_OPT_NOTIF: { + khui_config_node node = NULL; + + khui_cfg_open(NULL, L"KhmNotifications", &node); + khm_show_config_pane(node); + } + break; + + case KHUI_ACTION_OPT_PLUGINS: { + khui_config_node node = NULL; + + khui_cfg_open(NULL, L"KhmPlugins", &node); + khm_show_config_pane(node); + } + break; + + case KHUI_ACTION_HELP_CTX: + khm_html_help(khm_hwnd_main, NULL, HH_HELP_CONTEXT, IDH_WELCOME); + break; + + case KHUI_ACTION_HELP_CONTENTS: + khm_html_help(khm_hwnd_main, NULL, HH_DISPLAY_TOC, 0); + break; + + case KHUI_ACTION_HELP_INDEX: + khm_html_help(khm_hwnd_main, NULL, HH_DISPLAY_INDEX, (DWORD_PTR) L""); + break; + + case KHUI_ACTION_HELP_ABOUT: + khm_create_about_window(); + break; + + case KHUI_ACTION_IMPORT: + khm_cred_import(); + break; + + case KHUI_ACTION_PROPERTIES: + /* properties are not handled by the main window. + Just bounce it to credwnd. However, use SendMessage + instead of PostMessage so we don't lose context */ + return SendMessage(khm_hwnd_main_cred, uMsg, + wParam, lParam); + + /* menu commands */ + case KHUI_PACTION_MENU: + if(HIWORD(lParam) == 1) + mm_last_hot_item = LOWORD(lParam); + return khm_menu_activate(MENU_ACTIVATE_DEFAULT); + + case KHUI_PACTION_ESC: + /* if esc is pressed while no menu is active, we close the + main window */ + if (mm_last_hot_item == -1) { + khm_close_main_window(); + return 0; + } + + /* generic, retargetting */ + case KHUI_PACTION_UP: + case KHUI_PACTION_UP_TOGGLE: + case KHUI_PACTION_UP_EXTEND: + case KHUI_PACTION_PGUP: + case KHUI_PACTION_PGUP_EXTEND: + case KHUI_PACTION_DOWN: + case KHUI_PACTION_DOWN_TOGGLE: + case KHUI_PACTION_DOWN_EXTEND: + case KHUI_PACTION_PGDN: + case KHUI_PACTION_PGDN_EXTEND: + case KHUI_PACTION_LEFT: + case KHUI_PACTION_RIGHT: + case KHUI_PACTION_ENTER: + /* menu tracking */ + if(mm_last_hot_item != -1) { + switch(LOWORD(wParam)) { + case KHUI_PACTION_LEFT: + khm_menu_activate(MENU_ACTIVATE_LEFT); + break; + + case KHUI_PACTION_RIGHT: + khm_menu_activate(MENU_ACTIVATE_RIGHT); + break; + + case KHUI_PACTION_ESC: + case KHUI_PACTION_ENTER: + khm_menu_activate(MENU_ACTIVATE_NONE); + break; + + case KHUI_PACTION_DOWN: + khm_menu_track_current(); + break; + } + return 0; + } + + /*FALLTHROUGH*/ + case KHUI_PACTION_DELETE: + + case KHUI_PACTION_SELALL: + case KHUI_ACTION_LAYOUT_ID: + case KHUI_ACTION_LAYOUT_TYPE: + case KHUI_ACTION_LAYOUT_LOC: + case KHUI_ACTION_LAYOUT_CUST: + case KHUI_ACTION_LAYOUT_RELOAD: + /* otherwise fallthrough and bounce to the creds window */ + return SendMessage(khm_hwnd_main_cred, uMsg, + wParam, lParam); + + default: + /* handle custom actions here */ + { + khui_action * act; + + act = khui_find_action(LOWORD(wParam)); + if (act && act->listener) { + kmq_post_sub_msg(act->listener, KMSG_ACT, KMSG_ACT_ACTIVATE, act->cmd, NULL); + } + } + } + break; /* WM_COMMAND */ + + case WM_SYSCOMMAND: + switch(wParam & 0xfff0) { + case SC_MINIMIZE: + khm_hide_main_window(); + return 0; + + case SC_CLOSE: + khm_close_main_window(); + return 0; + } + break; + + case WM_MEASUREITEM: + /* sent to measure the bitmaps associated with a menu item */ + if(!wParam) /* sent by menu */ + return khm_menu_measure_item(wParam, lParam); + break; + + case WM_DRAWITEM: + /* sent to draw a menu item */ + if(!wParam) + return khm_menu_draw_item(wParam, lParam); + break; + + case WM_ERASEBKGND: + /* Don't erase the background. The whole client area is + covered with children. It doesn't need to be erased */ + return TRUE; + break; + + case WM_SIZE: + if(hwnd == khm_hwnd_main && + (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED)) { + int cwidth, cheight; + RECT r_rebar, r_status; + + cwidth = LOWORD(lParam); + cheight = HIWORD(lParam); + + /* resize the rebar control */ + SendMessage(khm_hwnd_rebar, WM_SIZE, 0, 0); + + khm_update_statusbar(hwnd); + + GetWindowRect(khm_hwnd_rebar, &r_rebar); + GetWindowRect(khm_hwnd_statusbar, &r_status); + + /* the cred window fills the area between the rebar + and the status bar */ + MoveWindow(khm_hwnd_main_cred, 0, + r_rebar.bottom - r_rebar.top, + r_status.right - r_status.left, + r_status.top - r_rebar.bottom, TRUE); + + SetTimer(hwnd, + MW_RESIZE_TIMER, + MW_RESIZE_TIMEOUT, + NULL); + return 0; + } + break; + + case WM_MOVE: + { + SetTimer(hwnd, + MW_RESIZE_TIMER, + MW_RESIZE_TIMEOUT, + NULL); + } + break; + + case WM_TIMER: + if (wParam == MW_RESIZE_TIMER) { + RECT r; + khm_handle csp_cw; + khm_handle csp_mw; + + KillTimer(hwnd, wParam); + + GetWindowRect(hwnd, &r); + + if (KHM_SUCCEEDED(khc_open_space(NULL, + L"CredWindow", + KHM_PERM_WRITE, + &csp_cw))) { + if (KHM_SUCCEEDED(khc_open_space(csp_cw, + L"Windows\\Main", + KHM_PERM_WRITE, + &csp_mw))) { + khc_write_int32(csp_mw, L"XPos", r.left); + khc_write_int32(csp_mw, L"YPos", r.top); + khc_write_int32(csp_mw, L"Width", + r.right - r.left); + khc_write_int32(csp_mw, L"Height", + r.bottom - r.top); + + khc_close_space(csp_mw); + } + khc_close_space(csp_cw); + } + } else if (wParam == MW_REFRESH_TIMER) { + kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, 0); + } + break; + + case WM_MENUSELECT: + return khm_menu_handle_select(wParam, lParam); + break; + + case KMQ_WM_DISPATCH: + { + kmq_message * m; + khm_int32 rv = KHM_ERROR_SUCCESS; + + kmq_wm_begin(lParam, &m); + if (m->type == KMSG_ACT && + m->subtype == KMSG_ACT_REFRESH) { + khm_menu_refresh_items(); + khm_update_standard_toolbar(); + } else if (m->type == KMSG_ACT && + m->subtype == KMSG_ACT_BEGIN_CMDLINE) { + khm_cred_begin_startup_actions(); + } else if (m->type == KMSG_ACT && + m->subtype == KMSG_ACT_CONTINUE_CMDLINE) { + khm_cred_process_startup_actions(); + } else if (m->type == KMSG_ACT && + m->subtype == KMSG_ACT_SYNC_CFG) { + khm_refresh_config(); + } else if (m->type == KMSG_ACT && + m->subtype == KMSG_ACT_ACTIVATE) { + /* some custom action fired */ + + khm_int32 action; + khui_action * paction; + + action = m->uparam; + paction = khui_find_action(action); + if (paction && paction->data == (void *) CFGACTION_MAGIC) { + /* a custom configuration needs to be invoked */ + khui_config_node node; + + if (KHM_SUCCEEDED(khui_cfg_open(NULL, paction->name, &node))) { + khm_show_config_pane(node); + khui_cfg_release(node); + } + } + } else if (m->type == KMSG_CRED && + m->subtype == KMSG_CRED_REFRESH) { + mw_restart_refresh_timer(hwnd); + } else if (m->type == KMSG_CRED && + m->subtype == KMSG_CRED_ADDR_CHANGE) { + khm_cred_addr_change(); + } else if (m->type == KMSG_KMM && + m->subtype == KMSG_KMM_I_DONE) { + kmq_post_message(KMSG_ACT, KMSG_ACT_BEGIN_CMDLINE, 0, 0); + } + return kmq_wm_end(m, rv); + } + break; + + case WM_KHUI_ASSIGN_COMMANDLINE: + { + HANDLE hmap; + void * xfer; + wchar_t mapname[256]; + + StringCbPrintf(mapname, sizeof(mapname), + COMMANDLINE_MAP_FMT, (DWORD) lParam); + + hmap = OpenFileMapping(FILE_MAP_READ, FALSE, mapname); + + if (hmap == NULL) + return 1; + + xfer = MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, + sizeof(khm_startup)); + + if (xfer) { + memcpy(&khm_startup, xfer, sizeof(khm_startup)); + + UnmapViewOfFile(xfer); + } + + CloseHandle(hmap); + + if(InSendMessage()) + ReplyMessage(0); + + khm_startup.exit = FALSE; + + khm_startup.seen = FALSE; + khm_startup.processing = FALSE; + + khm_cred_begin_startup_actions(); + } + break; + + case WM_KHUI_QUERY_APP_VERSION: + { + HANDLE hmap; + void * xfer; + wchar_t mapname[256]; + + StringCbPrintf(mapname, sizeof(mapname), + QUERY_APP_VER_MAP_FMT, (DWORD) lParam); + + hmap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, + FALSE, mapname); + + if (hmap == NULL) + return 1; + + xfer = MapViewOfFile(hmap, FILE_MAP_WRITE, 0, 0, + sizeof(khm_query_app_version)); + + if (xfer) { + khm_process_query_app_ver((khm_query_app_version *) xfer); + + UnmapViewOfFile(xfer); + } + + CloseHandle(hmap); + } + break; + + } + return DefWindowProc(hwnd,uMsg,wParam,lParam); +} + +LRESULT CALLBACK +khm_null_wnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +LRESULT +khm_rebar_notify(LPNMHDR lpnm) { + switch(lpnm->code) { +#if (_WIN32_WINNT >= 0x0501) + case RBN_AUTOBREAK: + { + LPNMREBARAUTOBREAK lpra = (LPNMREBARAUTOBREAK) lpnm; + lpra->fAutoBreak = TRUE; + } + break; +#endif + case RBN_BEGINDRAG: + { + LPNMREBAR lprb = (LPNMREBAR) lpnm; + if ((lprb->dwMask & RBNM_ID) && + lprb->wID == 0) + return 1; + else + return 0; + } + break; + + case NM_CUSTOMDRAW: + return CDRF_DODEFAULT; + break; + } + + return 1; +} + +void +khm_create_main_window_controls(HWND hwnd_main) { + REBARINFO rbi; + HWND hwRebar; + + khm_menu_create_main(hwnd_main); + + hwRebar = + CreateWindowEx(WS_EX_TOOLWINDOW, + REBARCLASSNAME, + L"Rebar", + WS_CHILD | + WS_VISIBLE| + WS_CLIPSIBLINGS | + WS_CLIPCHILDREN | + CCS_NODIVIDER | + RBS_VARHEIGHT | + RBS_FIXEDORDER, + 0,0,0,0, + hwnd_main, + NULL, + khm_hInstance, + NULL); + + if(!hwRebar) { + DWORD dwe = GetLastError(); + return; + } + + khm_hwnd_rebar = hwRebar; + + rbi.cbSize = sizeof(rbi); + rbi.fMask = 0; + rbi.himl = (HIMAGELIST) NULL; + if(!SendMessage(hwRebar, RB_SETBARINFO, 0, (LPARAM) &rbi)) + return; + + /* self attach */ + khm_create_standard_toolbar(hwRebar); + khm_create_statusbar(hwnd_main); + + /* manual attach */ + khm_hwnd_main_cred = khm_create_credwnd(hwnd_main); +} + +void +khm_create_main_window(void) { + wchar_t buf[1024]; + khm_handle csp_cw = NULL; + khm_handle csp_mw = NULL; + int x,y,width,height; + + LoadString(khm_hInstance, IDS_MAIN_WINDOW_TITLE, + buf, ARRAYLENGTH(buf)); + + khm_hwnd_null = + CreateWindow(MAKEINTATOM(khm_null_window_class), + buf, + 0, /* Style */ + 0, 0, /* x, y */ + 100, 100, /* width, height */ + NULL, /* parent */ + NULL, /* menu */ + NULL, /* HINSTANCE */ + 0); /* lparam */ + + if (!khm_hwnd_null) + return; + + x = CW_USEDEFAULT; + y = CW_USEDEFAULT; + width = CW_USEDEFAULT; + height = CW_USEDEFAULT; + + if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", + KHM_PERM_READ, + &csp_cw))) { + if (KHM_SUCCEEDED(khc_open_space(csp_cw, + L"Windows\\Main", + KHM_PERM_READ, + &csp_mw))) { + khm_int32 t; + + if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"XPos", &t))) + x = t; + if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"YPos", &t))) + y = t; + if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"Width", &t))) + width = t; + if (KHM_SUCCEEDED(khc_read_int32(csp_mw, L"Height", &t))) + height = t; + + khc_close_space(csp_mw); + } + khc_close_space(csp_cw); + } + + khm_hwnd_main = + CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, + MAKEINTATOM(khm_main_window_class), + buf, + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | + WS_CLIPSIBLINGS, + x, y, width, height, + khm_hwnd_null, + NULL, + NULL, + NULL); + + khui_set_main_window(khm_hwnd_main); +} + +void +khm_show_main_window(void) { + + if (khm_nCmdShow == SW_RESTORE) { + HWND hw; + + hw = GetForegroundWindow(); + if (hw != khm_hwnd_main) + SetForegroundWindow(khm_hwnd_main); + } + + if (khm_nCmdShow == SW_SHOWMINIMIZED || + khm_nCmdShow == SW_SHOWMINNOACTIVE || + khm_nCmdShow == SW_MINIMIZE) { + khm_hide_main_window(); + } else { + ShowWindow(khm_hwnd_main, khm_nCmdShow); + UpdateWindow(khm_hwnd_main); + } + + khm_nCmdShow = SW_RESTORE; +} + +void +khm_close_main_window(void) { + khm_handle csp_cw; + BOOL keep_running = FALSE; + + if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", + KHM_PERM_READ, &csp_cw))) { + khm_int32 t; + + if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"KeepRunning", + &t))) { + keep_running = t; + } else { +#ifdef DEBUG + assert(FALSE); +#endif + } + + khc_close_space(csp_cw); + } else { +#ifdef DEBUG + assert(FALSE); +#endif + } + + if (keep_running) + khm_hide_main_window(); + else + DestroyWindow(khm_hwnd_main); +} + +void +khm_hide_main_window(void) { + khm_handle csp_notices = NULL; + khm_int32 show_warning = FALSE; + + if (khm_nCmdShow != SW_MINIMIZE && + KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow\\Notices", + KHM_PERM_WRITE, &csp_notices)) && + KHM_SUCCEEDED(khc_read_int32(csp_notices, L"MinimizeWarning", + &show_warning)) && + show_warning != 0) { + + khui_alert * alert; + wchar_t title[KHUI_MAXCCH_TITLE]; + wchar_t msg[KHUI_MAXCCH_MESSAGE]; + + LoadString(khm_hInstance, IDS_WARN_WM_TITLE, + title, ARRAYLENGTH(title)); + LoadString(khm_hInstance, IDS_WARN_WM_MSG, + msg, ARRAYLENGTH(msg)); + + khui_alert_create_simple(title, msg, KHERR_INFO, &alert); + khui_alert_set_flags(alert, KHUI_ALERT_FLAG_REQUEST_BALLOON, + KHUI_ALERT_FLAG_REQUEST_BALLOON); + + khui_alert_show(alert); + + khc_write_int32(csp_notices, L"MinimizeWarning", 0); + } + + if (csp_notices != NULL) + khc_close_space(csp_notices); + + ShowWindow(khm_hwnd_main, SW_HIDE); +} + +BOOL +khm_is_main_window_visible(void) { + return IsWindowVisible(khm_hwnd_main); +} + +BOOL +khm_is_main_window_active(void) { + if (!IsWindowVisible(khm_hwnd_main)) + return FALSE; + if (GetForegroundWindow() == khm_hwnd_main) + return TRUE; + return khm_is_dialog_active(); +} + +void +khm_register_main_wnd_class(void) { + WNDCLASSEX wc; + + wc.cbSize = sizeof(WNDCLASSEX); + wc.style = 0; + wc.lpfnWndProc = khm_null_wnd_proc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = khm_hInstance; + wc.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); + wc.hCursor = LoadCursor((HINSTANCE) NULL, MAKEINTRESOURCE(IDC_ARROW)); + wc.hIconSm = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); + wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE); + wc.lpszMenuName = NULL; + wc.lpszClassName = KHUI_NULL_WINDOW_CLASS; + + khm_null_window_class = RegisterClassEx(&wc); + + wc.cbSize = sizeof(WNDCLASSEX); + wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = khm_main_wnd_proc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = khm_hInstance; + wc.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); + wc.hCursor = LoadCursor((HINSTANCE) NULL, MAKEINTRESOURCE(IDC_ARROW)); + wc.hIconSm = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE); + wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE); + wc.lpszMenuName = NULL; + wc.lpszClassName = KHUI_MAIN_WINDOW_CLASS; + + khm_main_window_class = RegisterClassEx(&wc); +} + +void +khm_unregister_main_wnd_class(void) { + UnregisterClass(MAKEINTATOM(khm_main_window_class),khm_hInstance); + UnregisterClass(MAKEINTATOM(khm_null_window_class),khm_hInstance); +} --- krb5-1.4.4.orig/src/windows/identity/ui/resource.h +++ krb5-1.4.4/src/windows/identity/ui/resource.h @@ -1,407 +1,407 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by C:\work\pismere\athena\auth\krb5\src\windows\identity\ui\lang\en_us\khapp.rc -// -#define IDI_MAIN_APP 104 -#define IDD_PROPPAGE_MEDIUM 106 -#define IDD_PP_CRED 106 -#define IDD_PP_IDENT 107 -#define IDB_TK_REFRESH 108 -#define IDS_MAIN_WINDOW_TITLE 108 -#define IDS_MENU_FILE 109 -#define IDB_ID 110 -#define IDS_MENU_IDENTITY 110 -#define IDS_MENU_CRED 110 -#define IDB_ID_DELETE 111 -#define IDS_MENU_VIEW 111 -#define IDB_ID_NEW 112 -#define IDS_MENU_OPTIONS 112 -#define IDB_ID_REFRESH 113 -#define IDS_MENU_HELP 113 -#define IDB_TK 114 -#define IDS_ACTION_PROPERTIES 114 -#define IDB_TK_DELETE 115 -#define IDS_ACTION_EXIT 115 -#define IDB_TK_NEW 116 -#define IDS_ACTION_NEW_ID 116 -#define IDS_CFG_ROOT_NAME 116 -#define IDS_ACTION_SET_DEF_ID 117 -#define IDS_ACTION_SET_SRCH_ID 118 -#define IDB_VW_REFRESH_SM 118 -#define IDS_ACTION_DESTROY_ID 119 -#define IDR_MENU_BAR 119 -#define IDS_CFG_ROOT_TITLE 119 -#define IDS_ACTION_RENEW_ID 120 -#define IDS_CFG_GENERAL_SHORT 120 -#define IDS_ACTION_ADD_CRED 121 -#define IDB_TB_BLANK 121 -#define IDS_ACTION_NEW_CRED 121 -#define IDS_ACTION_PASSWD_ID 122 -#define IDS_ACTION_CHOOSE_COLS 123 -#define IDB_TB_BLANK_SM 123 -#define IDS_ACTION_DEBUG_WINDOW 124 -#define IDB_VW_REFRESH 124 -#define IDS_ACTION_VIEW_REFRESH 125 -#define IDB_ID_DELETE_DIS 125 -#define IDS_MENU_LAYOUT 126 -#define IDB_ID_DELETE_DIS_SM 126 -#define IDS_MENU_TOOLBARS 127 -#define IDB_ID_DELETE_SM 127 -#define IDS_ACTION_LAYOUT_ID 128 -#define IDB_ID_DIS 128 -#define IDS_ACTION_LAYOUT_TYPE 129 -#define IDB_ID_DIS_SM 129 -#define IDS_ACTION_LAYOUT_LOC 130 -#define IDB_ID_NEW_DIS 130 -#define IDS_ACTION_TB_STANDARD 131 -#define IDB_ID_NEW_DIS_SM 131 -#define IDS_ACTION_OPT_KHIM 132 -#define IDB_ID_NEW_SM 132 -#define IDS_ACTION_OPT_INIT 133 -#define IDB_ID_REFRESH_DIS 133 -#define IDS_ACTION_OPT_IDENTS 133 -#define IDS_ACTION_OPT_NOTIF 134 -#define IDB_ID_REFRESH_SM 134 -#define IDS_ACTION_HELP_CTX 135 -#define IDB_ID_REFRESH_DIS_SM 135 -#define IDS_ACTION_HELP_CONTENTS 136 -#define IDB_TK_DELETE_DIS 136 -#define IDS_ACTION_HELP_INDEX 137 -#define IDB_TK_DELETE_DIS_SM 137 -#define IDS_ACTION_HELP_ABOUT 138 -#define IDB_TK_DELETE_SM 138 -#define IDB_TK_DIS_SM 139 -#define IDS_ACTIONINFO_NEW_ID 139 -#define IDS_CFG_GENERAL_LONG 139 -#define IDB_TK_NEW_DIS 140 -#define IDS_SAMPLE_STRING 140 -#define IDB_TK_NEW_DIS_SM 141 -#define IDS_NO_CREDS 141 -#define IDB_TK_NEW_SM 142 -#define IDS_WT_INIT_CREDS 142 -#define IDB_TK_REFRESH_DIS 143 -#define IDS_WT_NEW_CREDS 143 -#define IDB_TK_REFRESH_DIS_SM 144 -#define IDS_NC_PASSWORD 144 -#define IDS_NC_IDENTITY 144 -#define IDB_TK_REFRESH_SM 145 -#define IDS_NC_IDENTS 145 -#define IDB_TK_SM 146 -#define IDS_NC_CREDTEXT_ID_NONE 146 -#define IDB_HELP_SM 147 -#define IDS_NC_CREDTEXT_ID_ONE 147 -#define IDB_HELP 148 -#define IDS_NC_CREDTEXT_ID_MANY 148 -#define IDB_LOGO_SHADE 149 -#define IDS_NC_CREDTEXT_ID_INVALID 149 -#define IDS_WTPOST_INIT_CREDS 150 -#define IDS_WTPOST_NEW_CREDS 151 -#define IDB_WDG_EXPAND 152 -#define IDS_ACTION_RENEW_CRED 152 -#define IDB_WDG_COLLAPSE 153 -#define IDS_ACTION_DESTROY_CRED 153 -#define IDB_ID_SM 154 -#define IDS_DEFAULT_FONT 154 -#define IDB_WDG_EXPAND_HI 155 -#define IDS_NC_CREDTEXT_TABS 155 -#define IDB_WDG_COLLAPSE_HI 156 -#define IDS_NOTIFY_PREFIX 156 -#define IDB_WDG_CREDTYPE 157 -#define IDS_NOTIFY_READY 157 -#define IDB_WDG_FLAG 158 -#define IDS_NOTIFY_ATTENTION 158 -#define IDB_FLAG_WARN 159 -#define IDS_ALERT_DEFAULT 159 -#define IDB_FLAG_EXPIRED 160 -#define IDS_PACTION_OK 160 -#define IDB_FLAG_CRITICAL 161 -#define IDS_PACTION_CANCEL 161 -#define IDD_NC_PASSWORD 162 -#define IDS_PACTION_CLOSE 162 -#define IDD_NC_NEWCRED 162 -#define IDD_NC_BBAR 163 -#define IDS_ALERT_NOSEL_TITLE 163 -#define IDD_NC_TS 164 -#define IDS_ALERT_NOSEL 164 -#define IDI_ENABLED 165 -#define IDS_NC_CREDTEXT_ID_VALID 165 -#define IDI_DISABLED 166 -#define IDS_NC_CREDTEXT_ID_UNCHECKED 166 -#define IDS_PROP_COL_PROPERTY 167 -#define IDS_PROP_COL_VALUE 168 -#define IDI_NOTIFY_NONE 169 -#define IDS_NC_NEW_IDENT 169 -#define IDI_NOTIFY_INFO 170 -#define IDS_NC_CREDTEXT_ID_CHECKING 170 -#define IDI_NOTIFY_WARN 171 -#define IDS_ACTION_OPEN_APP 171 -#define IDI_NOTIFY_ERROR 172 -#define IDS_CTX_NEW_IDENT 172 -#define IDS_CTX_NEW_CREDS 173 -#define IDD_CFG_MAIN 173 -#define IDS_CTX_RENEW_CREDS 174 -#define IDD_CFG_GENERIC 174 -#define IDS_CTX_PROC_NEW_IDENT 175 -#define IDB_LOGO_OPAQUE 175 -#define IDS_CTX_PROC_NEW_CREDS 176 -#define IDD_CFG_GENERAL 176 -#define IDS_CTX_PROC_RENEW_CREDS 177 -#define IDD_CFG_IDENTITIES 177 -#define IDS_ACTION_CLOSE_APP 178 -#define IDD_CFG_NOTIF 178 -#define IDS_NC_FAILED_TITLE 179 -#define IDD_CFG_PLUGINS 179 -#define IDS_CFG_IDENTITIES_SHORT 180 -#define IDD_CFG_IDENTITY 180 -#define IDS_CFG_IDENTITIES_LONG 181 -#define IDI_CFG_DEFAULT 181 -#define IDS_CFG_NOTIF_SHORT 182 -#define IDI_CFG_MODIFIED 182 -#define IDS_CFG_NOTIF_LONG 183 -#define IDI_CFG_APPLIED 183 -#define IDS_CFG_PLUGINS_SHORT 184 -#define IDD_CFG_IDS_TAB 184 -#define IDS_CFG_PLUGINS_LONG 185 -#define IDD_CFG_ID_TAB 185 -#define IDS_CFG_IDENTITY_SHORT 186 -#define IDI_CFG_DELETED 186 -#define IDS_CFG_IDENTITY_LONG 187 -#define IDI_ICON1 187 -#define IDI_ID 187 -#define IDS_CTX_DESTROY_CREDS 188 -#define IDB_IMPORT_SM_DIS 188 -#define IDS_WARN_EXPIRE 189 -#define IDB_IMPORT 189 -#define IDS_WARN_TITLE 190 -#define IDB_IMPORT_DIS 190 -#define IDS_ALERT_MOREINFO 191 -#define IDB_IMPORT_SM 191 -#define IDS_WARN_EXPIRED 192 -#define IDB_CHPW_SM 192 -#define IDS_WARN_EXPIRE_ID 193 -#define IDB_CHPW 193 -#define IDS_WARN_EXPIRED_ID 194 -#define IDB_CHPW_DIS 194 -#define IDS_WARN_WM_TITLE 195 -#define IDB_CHPW_DIS_SM 195 -#define IDS_WARN_WM_MSG 196 -#define IDD_ABOUT 196 -#define IDS_CFG_ID_TAB_SHORT 197 -#define IDB_TB_SPACE 197 -#define IDS_CFG_ID_TAB_LONG 198 -#define IDB_WDG_STUCK_HI 198 -#define IDS_CFG_IDS_TAB_SHORT 199 -#define IDB_WDG_STICK 199 -#define IDS_CFG_IDS_TAB_LONG 200 -#define IDB_WDG_STICK_HI 200 -#define IDS_CFG_IDS_IDENTITY 201 -#define IDB_WDG_STUCK 201 -#define IDS_ACTION_IMPORT 202 -#define IDS_CTX_IMPORT 203 -#define IDB_FLAG_RENEW 203 -#define IDS_CFG_PI_COL_PLUGINS 204 -#define IDI_APPICON_WARN 204 -#define IDS_PISTATE_FAILUNK 205 -#define IDI_APPICON_EXP 205 -#define IDS_PISTATE_FAILMAX 206 -#define IDI_ICON4 206 -#define IDI_APPICON_OK 206 -#define IDS_PISTATE_FAILREG 207 -#define IDI_CFG_PLUGIN 207 -#define IDS_PISTATE_FAILDIS 208 -#define IDI_CFG_PLUGIN_ERR 208 -#define IDS_PISTATE_FAILLOD 209 -#define IDI_CFG_PLUGIN_DIS 209 -#define IDS_PISTATE_PLACEHOLD 210 -#define IDD_CFG_APPEAR 210 -#define IDS_PISTATE_REG 211 -#define IDD_CFG_ADDIDENT 211 -#define IDS_PISTATE_HOLD 212 -#define IDS_PISTATE_INIT 213 -#define IDS_PISTATE_RUN 214 -#define IDS_PISTATE_EXIT 215 -#define IDS_CTX_PASSWORD 216 -#define IDS_WT_PASSWORD 217 -#define IDS_WTPOST_PASSWORD 218 -#define IDS_CTX_PROC_PASSWORD 219 -#define IDS_NC_PWD_FAILED_TITLE 220 -#define IDS_CMDLINE_HELP 221 -#define IDS_PACTION_NEXT 222 -#define IDS_ERR_TITLE_NO_IDENTPRO 223 -#define IDS_ERR_MSG_NO_IDENTPRO 224 -#define IDS_ERR_SUGG_NO_IDENTPRO 225 -#define IDS_NC_REN_FAILED_TITLE 226 -#define IDS_CW_DEFAULT 227 -#define IDS_ACTION_OPT_PLUGINS 228 -#define IDS_NC_SETDEF 229 -#define IDS_NC_ID_DEF 230 -#define IDS_NC_ID_WDEF 231 -#define IDS_NC_ID_NDEF 232 -#define IDS_PACTION_YES 233 -#define IDS_PACTION_NO 234 -#define IDS_PACTION_YESALL 235 -#define IDS_PACTION_NOALL 236 -#define IDS_PACTION_KEEP 237 -#define IDS_PACTION_REMOVE 238 -#define IDS_PACTION_DISCARD 239 -#define IDS_CFG_IT_MOD 240 -#define IDS_CFG_IT_APP 241 -#define IDS_CFG_IT_NONE 242 -#define IDS_CFG_NODESC 243 -#define IDS_CFG_P_DELCNFT 244 -#define IDS_CFG_P_DELCNFM 245 -#define IDS_CFG_P_DELCNFS 246 -#define IDS_CFG_P_DELNDEP 247 -#define IDS_CFG_P_ENBCNFT 248 -#define IDS_CFG_P_ENBCNFM 249 -#define IDS_PISTATE_FAILINIT 250 -#define IDS_CFG_P_UNRCNFT 251 -#define IDS_CFG_P_UNRCNFM 252 -#define IDS_CFG_P_UNRCNFS 253 -#define IDS_ACTION_LAYOUT_CUST 254 -#define IDS_APR_HEADER_TEXT 255 -#define IDS_APR_HEADER_TEXT_BOLD 256 -#define IDS_APR_TEXT 257 -#define IDS_APR_TEXT_BOLD 258 -#define IDS_APR_SAMPLE_TEXT_NORMAL 259 -#define IDS_CFG_APPEAR_SHORT 260 -#define IDS_CFG_APPEAR_LONG 261 -#define IDS_ACTION_OPT_APPEAR 262 -#define IDS_APR_SAMPLE_TEXT_SEL 263 -#define IDS_CFG_IDNAME_INV 264 -#define IDS_CFG_IDNAME_PRB 265 -#define IDS_CFG_IDNAME_EXT 266 -#define IDS_CFG_IDNAME_CCR 267 -#define IDS_CFG_IDNAME_CCC 268 -#define IDS_CFG_LOGF_CS 269 -#define IDS_CFG_LOGF_CSR 270 -#define IDS_ACTIONT_PROPERTIES 271 -#define IDS_ACTIONT_EXIT 272 -#define IDS_ACTIONT_SET_DEF_ID 273 -#define IDS_ACTIONT_PASSWD_ID 274 -#define IDS_ACTIONT_NEW_CRED 275 -#define IDS_ACTIONT_RENEW_CRED 276 -#define IDS_ACTIONT_DESTROY_CRED 277 -#define IDS_ACTIONT_VIEW_REFRESH 278 -#define IDS_ACTIONT_OPT_IDENTS 279 -#define IDS_ACTIONT_OPT_KHIM 280 -#define IDS_ACTIONT_OPT_NOTIF 281 -#define IDS_ACTIONT_OPT_PLUGINS 282 -#define IDS_ACTIONT_OPT_APPEAR 283 -#define IDS_ACTIONT_HELP_CTX 284 -#define IDS_ACTIONT_IMPORT 285 -#define IDC_NC_USERNAME 1007 -#define IDC_NC_PASSWORD 1008 -#define IDC_NC_CREDTEXT_LABEL 1009 -#define IDC_NC_PASSWORD_LABEL 1010 -#define IDC_NC_USERNAME_LABEL 1011 -#define IDC_NC_CREDTEXT 1012 -#define IDC_NC_HELP 1017 -#define IDC_NC_OPTIONS 1019 -#define IDC_PP_IDNAME 1026 -#define IDC_PP_IDDEF 1027 -#define IDC_PP_IDSEARCH 1028 -#define IDC_PP_IDSTATUS 1029 -#define IDC_PP_IDSTATUSIMG 1030 -#define IDC_PP_IDVALID 1031 -#define IDC_PP_IDRENEW 1032 -#define IDC_NC_IDENTITY 1033 -#define IDC_NC_IDENTITY_LABEL 1034 -#define IDC_PP_PROPLIST 1035 -#define IDC_PP_CPROPLIST 1036 -#define IDC_NC_REALM 1037 -#define IDC_NC_REALM_LABEL 1038 -#define IDC_NC_TPL_ROW 1039 -#define IDC_NC_TPL_PANEL 1040 -#define IDC_NC_TPL_LABEL 1041 -#define IDC_NC_TPL_INPUT 1042 -#define IDC_NC_TPL_LABEL_LG 1043 -#define IDC_NC_TPL_INPUT_LG 1044 -#define IDC_NC_TPL_ROW2 1045 -#define IDC_NC_TPL_ROW_LG 1045 -#define IDC_CFG_NODELIST 1045 -#define IDAPPLY 1048 -#define IDC_CFG_SUMMARY 1049 -#define IDC_CFG_TITLE 1050 -#define IDC_CFG_PANE 1051 -#define IDC_NOTIF_MONITOR 1053 -#define IDC_PP_DUMMY 1054 -#define IDC_NOTIF_RENEW 1055 -#define IDC_NOTIF_RENEW_THR 1056 -#define IDC_NOTIF_WARN1 1057 -#define IDC_NOTIF_WARN1_THR 1058 -#define IDC_NOTIF_WARN2 1059 -#define IDC_NOTIF_WARN2_THR 1060 -#define IDC_CFG_KEEPRUNNING 1061 -#define IDC_CFG_STARTUP_GROUP 1062 -#define IDC_CFG_AUTOSTART 1063 -#define IDC_CFG_AUTOIMPORT 1064 -#define IDC_CFG_AUTOINIT 1065 -#define IDC_CFG_OTHER 1066 -#define IDC_CFG_MONITOR 1069 -#define IDC_CFG_STICKY 1070 -#define IDC_CFG_IDENTS 1071 -#define IDC_CFG_IDENTITY 1072 -#define IDC_CFG_RENEW 1075 -#define IDC_CFG_REMOVE 1076 -#define IDC_CFG_TAB 1077 -#define IDC_CFG_TARGET 1078 -#define IDC_CFG_PLUGINS 1079 -#define IDC_CFG_PLUGINGRP 1080 -#define IDC_CFG_LBL_DESC 1083 -#define IDC_CFG_DESC 1084 -#define IDC_CFG_LBL_STATE 1085 -#define IDC_CFG_STATE 1086 -#define IDC_CFG_LBL_DEPS 1087 -#define IDC_CFG_DEPS 1088 -#define IDC_CFG_DISABLE 1089 -#define IDC_CFG_ENABLE 1090 -#define IDC_CFG_PROVGRP 1091 -#define IDC_CFG_LBL_MOD 1092 -#define IDC_CFG_MODULE 1093 -#define IDC_CFG_LBL_VEN 1094 -#define IDC_CFG_VENDOR 1095 -#define IDC_CFG_REGISTER 1097 -#define IDC_CFG_NETDETECT 1098 -#define IDC_PP_STICKY 1099 -#define IDC_PRODUCT 1100 -#define IDC_COPYRIGHT 1101 -#define IDC_BUILDINFO 1102 -#define IDC_LIST1 1103 -#define IDC_MODULES 1103 -#define IDC_PP_CONFIG 1104 -#define IDC_CFG_UNREGISTER 1107 -#define IDC_CFG_VERSION 1108 -#define IDC_CFG_ICON 1109 -#define IDC_CFG_LOGTOFILE 1110 -#define IDC_CFG_LOGPATH 1111 -#define IDC_NOTIF_HALFLIFE 1112 -#define IDC_CFG_DESTROYALL 1113 -#define IDC_CFG_SAMPLE_NORMAL 1123 -#define IDC_CFG_REVERT 1127 -#define IDC_CFG_FONTS 1128 -#define IDC_CFG_SAMPLE_BOLD 1129 -#define IDC_CFG_SIZE 1130 -#define IDC_CFG_BOLD 1131 -#define IDC_CFG_ITALICS 1132 -#define IDC_CFG_ADDIDENT 1133 -#define IDC_CFG_IDNAME 1134 -#define IDC_CFG_SHOWLOG 1135 -#define IDA_ACTIVATE_MENU 40003 -#define IDA_UP 40004 -#define IDA_DOWN 40005 -#define IDA_LEFT 40006 -#define IDA_RIGHT 40007 -#define IDA_ESC 40008 -#define IDA_ENTER 40009 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 212 -#define _APS_NEXT_COMMAND_VALUE 40010 -#define _APS_NEXT_CONTROL_VALUE 1136 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by C:\work\pismere\athena\auth\krb5\src\windows\identity\ui\lang\en_us\khapp.rc +// +#define IDI_MAIN_APP 104 +#define IDD_PROPPAGE_MEDIUM 106 +#define IDD_PP_CRED 106 +#define IDD_PP_IDENT 107 +#define IDB_TK_REFRESH 108 +#define IDS_MAIN_WINDOW_TITLE 108 +#define IDS_MENU_FILE 109 +#define IDB_ID 110 +#define IDS_MENU_IDENTITY 110 +#define IDS_MENU_CRED 110 +#define IDB_ID_DELETE 111 +#define IDS_MENU_VIEW 111 +#define IDB_ID_NEW 112 +#define IDS_MENU_OPTIONS 112 +#define IDB_ID_REFRESH 113 +#define IDS_MENU_HELP 113 +#define IDB_TK 114 +#define IDS_ACTION_PROPERTIES 114 +#define IDB_TK_DELETE 115 +#define IDS_ACTION_EXIT 115 +#define IDB_TK_NEW 116 +#define IDS_ACTION_NEW_ID 116 +#define IDS_CFG_ROOT_NAME 116 +#define IDS_ACTION_SET_DEF_ID 117 +#define IDS_ACTION_SET_SRCH_ID 118 +#define IDB_VW_REFRESH_SM 118 +#define IDS_ACTION_DESTROY_ID 119 +#define IDR_MENU_BAR 119 +#define IDS_CFG_ROOT_TITLE 119 +#define IDS_ACTION_RENEW_ID 120 +#define IDS_CFG_GENERAL_SHORT 120 +#define IDS_ACTION_ADD_CRED 121 +#define IDB_TB_BLANK 121 +#define IDS_ACTION_NEW_CRED 121 +#define IDS_ACTION_PASSWD_ID 122 +#define IDS_ACTION_CHOOSE_COLS 123 +#define IDB_TB_BLANK_SM 123 +#define IDS_ACTION_DEBUG_WINDOW 124 +#define IDB_VW_REFRESH 124 +#define IDS_ACTION_VIEW_REFRESH 125 +#define IDB_ID_DELETE_DIS 125 +#define IDS_MENU_LAYOUT 126 +#define IDB_ID_DELETE_DIS_SM 126 +#define IDS_MENU_TOOLBARS 127 +#define IDB_ID_DELETE_SM 127 +#define IDS_ACTION_LAYOUT_ID 128 +#define IDB_ID_DIS 128 +#define IDS_ACTION_LAYOUT_TYPE 129 +#define IDB_ID_DIS_SM 129 +#define IDS_ACTION_LAYOUT_LOC 130 +#define IDB_ID_NEW_DIS 130 +#define IDS_ACTION_TB_STANDARD 131 +#define IDB_ID_NEW_DIS_SM 131 +#define IDS_ACTION_OPT_KHIM 132 +#define IDB_ID_NEW_SM 132 +#define IDS_ACTION_OPT_INIT 133 +#define IDB_ID_REFRESH_DIS 133 +#define IDS_ACTION_OPT_IDENTS 133 +#define IDS_ACTION_OPT_NOTIF 134 +#define IDB_ID_REFRESH_SM 134 +#define IDS_ACTION_HELP_CTX 135 +#define IDB_ID_REFRESH_DIS_SM 135 +#define IDS_ACTION_HELP_CONTENTS 136 +#define IDB_TK_DELETE_DIS 136 +#define IDS_ACTION_HELP_INDEX 137 +#define IDB_TK_DELETE_DIS_SM 137 +#define IDS_ACTION_HELP_ABOUT 138 +#define IDB_TK_DELETE_SM 138 +#define IDB_TK_DIS_SM 139 +#define IDS_ACTIONINFO_NEW_ID 139 +#define IDS_CFG_GENERAL_LONG 139 +#define IDB_TK_NEW_DIS 140 +#define IDS_SAMPLE_STRING 140 +#define IDB_TK_NEW_DIS_SM 141 +#define IDS_NO_CREDS 141 +#define IDB_TK_NEW_SM 142 +#define IDS_WT_INIT_CREDS 142 +#define IDB_TK_REFRESH_DIS 143 +#define IDS_WT_NEW_CREDS 143 +#define IDB_TK_REFRESH_DIS_SM 144 +#define IDS_NC_PASSWORD 144 +#define IDS_NC_IDENTITY 144 +#define IDB_TK_REFRESH_SM 145 +#define IDS_NC_IDENTS 145 +#define IDB_TK_SM 146 +#define IDS_NC_CREDTEXT_ID_NONE 146 +#define IDB_HELP_SM 147 +#define IDS_NC_CREDTEXT_ID_ONE 147 +#define IDB_HELP 148 +#define IDS_NC_CREDTEXT_ID_MANY 148 +#define IDB_LOGO_SHADE 149 +#define IDS_NC_CREDTEXT_ID_INVALID 149 +#define IDS_WTPOST_INIT_CREDS 150 +#define IDS_WTPOST_NEW_CREDS 151 +#define IDB_WDG_EXPAND 152 +#define IDS_ACTION_RENEW_CRED 152 +#define IDB_WDG_COLLAPSE 153 +#define IDS_ACTION_DESTROY_CRED 153 +#define IDB_ID_SM 154 +#define IDS_DEFAULT_FONT 154 +#define IDB_WDG_EXPAND_HI 155 +#define IDS_NC_CREDTEXT_TABS 155 +#define IDB_WDG_COLLAPSE_HI 156 +#define IDS_NOTIFY_PREFIX 156 +#define IDB_WDG_CREDTYPE 157 +#define IDS_NOTIFY_READY 157 +#define IDB_WDG_FLAG 158 +#define IDS_NOTIFY_ATTENTION 158 +#define IDB_FLAG_WARN 159 +#define IDS_ALERT_DEFAULT 159 +#define IDB_FLAG_EXPIRED 160 +#define IDS_PACTION_OK 160 +#define IDB_FLAG_CRITICAL 161 +#define IDS_PACTION_CANCEL 161 +#define IDD_NC_PASSWORD 162 +#define IDS_PACTION_CLOSE 162 +#define IDD_NC_NEWCRED 162 +#define IDD_NC_BBAR 163 +#define IDS_ALERT_NOSEL_TITLE 163 +#define IDD_NC_TS 164 +#define IDS_ALERT_NOSEL 164 +#define IDI_ENABLED 165 +#define IDS_NC_CREDTEXT_ID_VALID 165 +#define IDI_DISABLED 166 +#define IDS_NC_CREDTEXT_ID_UNCHECKED 166 +#define IDS_PROP_COL_PROPERTY 167 +#define IDS_PROP_COL_VALUE 168 +#define IDI_NOTIFY_NONE 169 +#define IDS_NC_NEW_IDENT 169 +#define IDI_NOTIFY_INFO 170 +#define IDS_NC_CREDTEXT_ID_CHECKING 170 +#define IDI_NOTIFY_WARN 171 +#define IDS_ACTION_OPEN_APP 171 +#define IDI_NOTIFY_ERROR 172 +#define IDS_CTX_NEW_IDENT 172 +#define IDS_CTX_NEW_CREDS 173 +#define IDD_CFG_MAIN 173 +#define IDS_CTX_RENEW_CREDS 174 +#define IDD_CFG_GENERIC 174 +#define IDS_CTX_PROC_NEW_IDENT 175 +#define IDB_LOGO_OPAQUE 175 +#define IDS_CTX_PROC_NEW_CREDS 176 +#define IDD_CFG_GENERAL 176 +#define IDS_CTX_PROC_RENEW_CREDS 177 +#define IDD_CFG_IDENTITIES 177 +#define IDS_ACTION_CLOSE_APP 178 +#define IDD_CFG_NOTIF 178 +#define IDS_NC_FAILED_TITLE 179 +#define IDD_CFG_PLUGINS 179 +#define IDS_CFG_IDENTITIES_SHORT 180 +#define IDD_CFG_IDENTITY 180 +#define IDS_CFG_IDENTITIES_LONG 181 +#define IDI_CFG_DEFAULT 181 +#define IDS_CFG_NOTIF_SHORT 182 +#define IDI_CFG_MODIFIED 182 +#define IDS_CFG_NOTIF_LONG 183 +#define IDI_CFG_APPLIED 183 +#define IDS_CFG_PLUGINS_SHORT 184 +#define IDD_CFG_IDS_TAB 184 +#define IDS_CFG_PLUGINS_LONG 185 +#define IDD_CFG_ID_TAB 185 +#define IDS_CFG_IDENTITY_SHORT 186 +#define IDI_CFG_DELETED 186 +#define IDS_CFG_IDENTITY_LONG 187 +#define IDI_ICON1 187 +#define IDI_ID 187 +#define IDS_CTX_DESTROY_CREDS 188 +#define IDB_IMPORT_SM_DIS 188 +#define IDS_WARN_EXPIRE 189 +#define IDB_IMPORT 189 +#define IDS_WARN_TITLE 190 +#define IDB_IMPORT_DIS 190 +#define IDS_ALERT_MOREINFO 191 +#define IDB_IMPORT_SM 191 +#define IDS_WARN_EXPIRED 192 +#define IDB_CHPW_SM 192 +#define IDS_WARN_EXPIRE_ID 193 +#define IDB_CHPW 193 +#define IDS_WARN_EXPIRED_ID 194 +#define IDB_CHPW_DIS 194 +#define IDS_WARN_WM_TITLE 195 +#define IDB_CHPW_DIS_SM 195 +#define IDS_WARN_WM_MSG 196 +#define IDD_ABOUT 196 +#define IDS_CFG_ID_TAB_SHORT 197 +#define IDB_TB_SPACE 197 +#define IDS_CFG_ID_TAB_LONG 198 +#define IDB_WDG_STUCK_HI 198 +#define IDS_CFG_IDS_TAB_SHORT 199 +#define IDB_WDG_STICK 199 +#define IDS_CFG_IDS_TAB_LONG 200 +#define IDB_WDG_STICK_HI 200 +#define IDS_CFG_IDS_IDENTITY 201 +#define IDB_WDG_STUCK 201 +#define IDS_ACTION_IMPORT 202 +#define IDS_CTX_IMPORT 203 +#define IDB_FLAG_RENEW 203 +#define IDS_CFG_PI_COL_PLUGINS 204 +#define IDI_APPICON_WARN 204 +#define IDS_PISTATE_FAILUNK 205 +#define IDI_APPICON_EXP 205 +#define IDS_PISTATE_FAILMAX 206 +#define IDI_ICON4 206 +#define IDI_APPICON_OK 206 +#define IDS_PISTATE_FAILREG 207 +#define IDI_CFG_PLUGIN 207 +#define IDS_PISTATE_FAILDIS 208 +#define IDI_CFG_PLUGIN_ERR 208 +#define IDS_PISTATE_FAILLOD 209 +#define IDI_CFG_PLUGIN_DIS 209 +#define IDS_PISTATE_PLACEHOLD 210 +#define IDD_CFG_APPEAR 210 +#define IDS_PISTATE_REG 211 +#define IDD_CFG_ADDIDENT 211 +#define IDS_PISTATE_HOLD 212 +#define IDS_PISTATE_INIT 213 +#define IDS_PISTATE_RUN 214 +#define IDS_PISTATE_EXIT 215 +#define IDS_CTX_PASSWORD 216 +#define IDS_WT_PASSWORD 217 +#define IDS_WTPOST_PASSWORD 218 +#define IDS_CTX_PROC_PASSWORD 219 +#define IDS_NC_PWD_FAILED_TITLE 220 +#define IDS_CMDLINE_HELP 221 +#define IDS_PACTION_NEXT 222 +#define IDS_ERR_TITLE_NO_IDENTPRO 223 +#define IDS_ERR_MSG_NO_IDENTPRO 224 +#define IDS_ERR_SUGG_NO_IDENTPRO 225 +#define IDS_NC_REN_FAILED_TITLE 226 +#define IDS_CW_DEFAULT 227 +#define IDS_ACTION_OPT_PLUGINS 228 +#define IDS_NC_SETDEF 229 +#define IDS_NC_ID_DEF 230 +#define IDS_NC_ID_WDEF 231 +#define IDS_NC_ID_NDEF 232 +#define IDS_PACTION_YES 233 +#define IDS_PACTION_NO 234 +#define IDS_PACTION_YESALL 235 +#define IDS_PACTION_NOALL 236 +#define IDS_PACTION_KEEP 237 +#define IDS_PACTION_REMOVE 238 +#define IDS_PACTION_DISCARD 239 +#define IDS_CFG_IT_MOD 240 +#define IDS_CFG_IT_APP 241 +#define IDS_CFG_IT_NONE 242 +#define IDS_CFG_NODESC 243 +#define IDS_CFG_P_DELCNFT 244 +#define IDS_CFG_P_DELCNFM 245 +#define IDS_CFG_P_DELCNFS 246 +#define IDS_CFG_P_DELNDEP 247 +#define IDS_CFG_P_ENBCNFT 248 +#define IDS_CFG_P_ENBCNFM 249 +#define IDS_PISTATE_FAILINIT 250 +#define IDS_CFG_P_UNRCNFT 251 +#define IDS_CFG_P_UNRCNFM 252 +#define IDS_CFG_P_UNRCNFS 253 +#define IDS_ACTION_LAYOUT_CUST 254 +#define IDS_APR_HEADER_TEXT 255 +#define IDS_APR_HEADER_TEXT_BOLD 256 +#define IDS_APR_TEXT 257 +#define IDS_APR_TEXT_BOLD 258 +#define IDS_APR_SAMPLE_TEXT_NORMAL 259 +#define IDS_CFG_APPEAR_SHORT 260 +#define IDS_CFG_APPEAR_LONG 261 +#define IDS_ACTION_OPT_APPEAR 262 +#define IDS_APR_SAMPLE_TEXT_SEL 263 +#define IDS_CFG_IDNAME_INV 264 +#define IDS_CFG_IDNAME_PRB 265 +#define IDS_CFG_IDNAME_EXT 266 +#define IDS_CFG_IDNAME_CCR 267 +#define IDS_CFG_IDNAME_CCC 268 +#define IDS_CFG_LOGF_CS 269 +#define IDS_CFG_LOGF_CSR 270 +#define IDS_ACTIONT_PROPERTIES 271 +#define IDS_ACTIONT_EXIT 272 +#define IDS_ACTIONT_SET_DEF_ID 273 +#define IDS_ACTIONT_PASSWD_ID 274 +#define IDS_ACTIONT_NEW_CRED 275 +#define IDS_ACTIONT_RENEW_CRED 276 +#define IDS_ACTIONT_DESTROY_CRED 277 +#define IDS_ACTIONT_VIEW_REFRESH 278 +#define IDS_ACTIONT_OPT_IDENTS 279 +#define IDS_ACTIONT_OPT_KHIM 280 +#define IDS_ACTIONT_OPT_NOTIF 281 +#define IDS_ACTIONT_OPT_PLUGINS 282 +#define IDS_ACTIONT_OPT_APPEAR 283 +#define IDS_ACTIONT_HELP_CTX 284 +#define IDS_ACTIONT_IMPORT 285 +#define IDC_NC_USERNAME 1007 +#define IDC_NC_PASSWORD 1008 +#define IDC_NC_CREDTEXT_LABEL 1009 +#define IDC_NC_PASSWORD_LABEL 1010 +#define IDC_NC_USERNAME_LABEL 1011 +#define IDC_NC_CREDTEXT 1012 +#define IDC_NC_HELP 1017 +#define IDC_NC_OPTIONS 1019 +#define IDC_PP_IDNAME 1026 +#define IDC_PP_IDDEF 1027 +#define IDC_PP_IDSEARCH 1028 +#define IDC_PP_IDSTATUS 1029 +#define IDC_PP_IDSTATUSIMG 1030 +#define IDC_PP_IDVALID 1031 +#define IDC_PP_IDRENEW 1032 +#define IDC_NC_IDENTITY 1033 +#define IDC_NC_IDENTITY_LABEL 1034 +#define IDC_PP_PROPLIST 1035 +#define IDC_PP_CPROPLIST 1036 +#define IDC_NC_REALM 1037 +#define IDC_NC_REALM_LABEL 1038 +#define IDC_NC_TPL_ROW 1039 +#define IDC_NC_TPL_PANEL 1040 +#define IDC_NC_TPL_LABEL 1041 +#define IDC_NC_TPL_INPUT 1042 +#define IDC_NC_TPL_LABEL_LG 1043 +#define IDC_NC_TPL_INPUT_LG 1044 +#define IDC_NC_TPL_ROW2 1045 +#define IDC_NC_TPL_ROW_LG 1045 +#define IDC_CFG_NODELIST 1045 +#define IDAPPLY 1048 +#define IDC_CFG_SUMMARY 1049 +#define IDC_CFG_TITLE 1050 +#define IDC_CFG_PANE 1051 +#define IDC_NOTIF_MONITOR 1053 +#define IDC_PP_DUMMY 1054 +#define IDC_NOTIF_RENEW 1055 +#define IDC_NOTIF_RENEW_THR 1056 +#define IDC_NOTIF_WARN1 1057 +#define IDC_NOTIF_WARN1_THR 1058 +#define IDC_NOTIF_WARN2 1059 +#define IDC_NOTIF_WARN2_THR 1060 +#define IDC_CFG_KEEPRUNNING 1061 +#define IDC_CFG_STARTUP_GROUP 1062 +#define IDC_CFG_AUTOSTART 1063 +#define IDC_CFG_AUTOIMPORT 1064 +#define IDC_CFG_AUTOINIT 1065 +#define IDC_CFG_OTHER 1066 +#define IDC_CFG_MONITOR 1069 +#define IDC_CFG_STICKY 1070 +#define IDC_CFG_IDENTS 1071 +#define IDC_CFG_IDENTITY 1072 +#define IDC_CFG_RENEW 1075 +#define IDC_CFG_REMOVE 1076 +#define IDC_CFG_TAB 1077 +#define IDC_CFG_TARGET 1078 +#define IDC_CFG_PLUGINS 1079 +#define IDC_CFG_PLUGINGRP 1080 +#define IDC_CFG_LBL_DESC 1083 +#define IDC_CFG_DESC 1084 +#define IDC_CFG_LBL_STATE 1085 +#define IDC_CFG_STATE 1086 +#define IDC_CFG_LBL_DEPS 1087 +#define IDC_CFG_DEPS 1088 +#define IDC_CFG_DISABLE 1089 +#define IDC_CFG_ENABLE 1090 +#define IDC_CFG_PROVGRP 1091 +#define IDC_CFG_LBL_MOD 1092 +#define IDC_CFG_MODULE 1093 +#define IDC_CFG_LBL_VEN 1094 +#define IDC_CFG_VENDOR 1095 +#define IDC_CFG_REGISTER 1097 +#define IDC_CFG_NETDETECT 1098 +#define IDC_PP_STICKY 1099 +#define IDC_PRODUCT 1100 +#define IDC_COPYRIGHT 1101 +#define IDC_BUILDINFO 1102 +#define IDC_LIST1 1103 +#define IDC_MODULES 1103 +#define IDC_PP_CONFIG 1104 +#define IDC_CFG_UNREGISTER 1107 +#define IDC_CFG_VERSION 1108 +#define IDC_CFG_ICON 1109 +#define IDC_CFG_LOGTOFILE 1110 +#define IDC_CFG_LOGPATH 1111 +#define IDC_NOTIF_HALFLIFE 1112 +#define IDC_CFG_DESTROYALL 1113 +#define IDC_CFG_SAMPLE_NORMAL 1123 +#define IDC_CFG_REVERT 1127 +#define IDC_CFG_FONTS 1128 +#define IDC_CFG_SAMPLE_BOLD 1129 +#define IDC_CFG_SIZE 1130 +#define IDC_CFG_BOLD 1131 +#define IDC_CFG_ITALICS 1132 +#define IDC_CFG_ADDIDENT 1133 +#define IDC_CFG_IDNAME 1134 +#define IDC_CFG_SHOWLOG 1135 +#define IDA_ACTIVATE_MENU 40003 +#define IDA_UP 40004 +#define IDA_DOWN 40005 +#define IDA_LEFT 40006 +#define IDA_RIGHT 40007 +#define IDA_ESC 40008 +#define IDA_ENTER 40009 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 212 +#define _APS_NEXT_COMMAND_VALUE 40010 +#define _APS_NEXT_CONTROL_VALUE 1136 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/cfg_notif_wnd.c +++ krb5-1.4.4/src/windows/identity/ui/cfg_notif_wnd.c @@ -1,341 +1,341 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -typedef struct tag_notif_data { - khui_config_node node; - - BOOL modified; - - BOOL monitor; - BOOL renew; - BOOL halflife; - BOOL warn1; - BOOL warn2; - - khui_tracker tc_renew; - khui_tracker tc_warn1; - khui_tracker tc_warn2; -} notif_data; - -static void -read_params(notif_data * d) { - khm_handle csp_cw; - khm_int32 rv; - khm_int32 t; - - rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, &csp_cw); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_read_int32(csp_cw, L"Monitor", &t); - assert(KHM_SUCCEEDED(rv)); - d->monitor = !!t; - - rv = khc_read_int32(csp_cw, L"AllowAutoRenew", &t); - assert(KHM_SUCCEEDED(rv)); - d->renew = !!t; - - rv = khc_read_int32(csp_cw, L"RenewAtHalfLife", &t); - assert(KHM_SUCCEEDED(rv)); - d->halflife = !!t; - - rv = khc_read_int32(csp_cw, L"AllowWarn", &t); - assert(KHM_SUCCEEDED(rv)); - d->warn1 = !!t; - - rv = khc_read_int32(csp_cw, L"AllowCritical", &t); - assert(KHM_SUCCEEDED(rv)); - d->warn2 = !!t; - - rv = khc_read_int32(csp_cw, L"AutoRenewThreshold", &t); - assert(KHM_SUCCEEDED(rv)); - d->tc_renew.current = t; - - rv = khc_read_int32(csp_cw, L"WarnThreshold", &t); - assert(KHM_SUCCEEDED(rv)); - d->tc_warn1.current = t; - - rv = khc_read_int32(csp_cw, L"CriticalThreshold", &t); - assert(KHM_SUCCEEDED(rv)); - d->tc_warn2.current = t; - - rv = khc_read_int32(csp_cw, L"MaxThreshold", &t); - assert(KHM_SUCCEEDED(rv)); - d->tc_renew.max = t; - d->tc_warn1.max = t; - d->tc_warn2.max = t; - - rv = khc_read_int32(csp_cw, L"MinThreshold", &t); - assert(KHM_SUCCEEDED(rv)); - d->tc_renew.min = t; - d->tc_warn1.min = t; - d->tc_warn2.min = t; - - khc_close_space(csp_cw); - - d->modified = FALSE; -} - -static void -check_for_modification(notif_data * d) { - notif_data t; - - ZeroMemory(&t, sizeof(t)); - - read_params(&t); - - if ((!!d->monitor) != (!!t.monitor) || - (!!d->renew) != (!!t.renew) || - (!!d->halflife) != (!!t.halflife) || - (!!d->warn1) != (!!t.warn1) || - (!!d->warn2) != (!!t.warn2) || - d->tc_renew.current != t.tc_renew.current || - d->tc_warn1.current != t.tc_warn1.current || - d->tc_warn2.current != t.tc_warn2.current) { - - khui_cfg_set_flags(d->node, - KHUI_CNFLAG_MODIFIED, - KHUI_CNFLAG_MODIFIED); - - d->modified = TRUE; - - } else { - khui_cfg_set_flags(d->node, - 0, - KHUI_CNFLAG_MODIFIED); - - d->modified = FALSE; - } -} - -static void -write_params(notif_data * d) { - khm_handle csp_cw; - khm_int32 rv; - - if (!d->modified) - return; - - rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_WRITE, &csp_cw); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_int32(csp_cw, L"Monitor", d->monitor); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_int32(csp_cw, L"AllowAutoRenew", d->renew); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_int32(csp_cw, L"RenewAtHalfLife", d->halflife); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_int32(csp_cw, L"AllowWarn", d->warn1); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_int32(csp_cw, L"AllowCritical", d->warn2); - assert(KHM_SUCCEEDED(rv)); - - - rv = khc_write_int32(csp_cw, L"AutoRenewThreshold", - (khm_int32) d->tc_renew.current); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_int32(csp_cw, L"WarnThreshold", - (khm_int32) d->tc_warn1.current); - assert(KHM_SUCCEEDED(rv)); - - rv = khc_write_int32(csp_cw, L"CriticalThreshold", - (khm_int32) d->tc_warn2.current); - assert(KHM_SUCCEEDED(rv)); - - khc_close_space(csp_cw); - - khui_cfg_set_flags(d->node, - KHUI_CNFLAG_APPLIED, - KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); - - khm_timer_refresh(hwnd_notifier); -} - -static void -refresh_view(HWND hwnd, notif_data * d) { - CheckDlgButton(hwnd, IDC_NOTIF_MONITOR, - (d->monitor?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_NOTIF_RENEW, - (d->renew?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_NOTIF_HALFLIFE, - (d->halflife?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_NOTIF_WARN1, - (d->warn1?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_NOTIF_WARN2, - (d->warn2?BST_CHECKED:BST_UNCHECKED)); - khui_tracker_refresh(&d->tc_renew); - khui_tracker_refresh(&d->tc_warn1); - khui_tracker_refresh(&d->tc_warn2); - if (!d->monitor) { - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_HALFLIFE), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR), FALSE); - } else { - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW), TRUE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_HALFLIFE), TRUE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1), TRUE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2), TRUE); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR), !!(d->renew)); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR), !!(d->warn1)); - EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR), !!(d->warn2)); - } -} - -static void -refresh_data(HWND hwnd, notif_data * d) { - d->monitor = (IsDlgButtonChecked(hwnd, IDC_NOTIF_MONITOR) - == BST_CHECKED); - d->renew = (IsDlgButtonChecked(hwnd, IDC_NOTIF_RENEW) - == BST_CHECKED); - d->halflife = (IsDlgButtonChecked(hwnd, IDC_NOTIF_HALFLIFE) - == BST_CHECKED); - d->warn1 = (IsDlgButtonChecked(hwnd, IDC_NOTIF_WARN1) - == BST_CHECKED); - d->warn2 = (IsDlgButtonChecked(hwnd, IDC_NOTIF_WARN2) - == BST_CHECKED); - - check_for_modification(d); -} - -INT_PTR CALLBACK -khm_cfg_notifications_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - - notif_data * d; - - switch(uMsg) { - case WM_INITDIALOG: { - HWND hw; - - d = PMALLOC(sizeof(*d)); -#ifdef DEBUG - assert(d != NULL); -#endif - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); -#pragma warning(pop) - - ZeroMemory(d, sizeof(*d)); - - d->node = (khui_config_node) lParam; - - khui_tracker_initialize(&d->tc_renew); - khui_tracker_initialize(&d->tc_warn1); - khui_tracker_initialize(&d->tc_warn2); - - read_params(d); - - hw = GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR); - khui_tracker_install(hw, &d->tc_renew); - - hw = GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR); - khui_tracker_install(hw, &d->tc_warn1); - - hw = GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR); - khui_tracker_install(hw, &d->tc_warn2); - - refresh_view(hwnd, d); - - /* normally we should return TRUE, but in this case we return - FALSE since we don't want to inadvertently steal the focus - from the treeview. */ - return FALSE; - } - - case WM_COMMAND: { - d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - - if (HIWORD(wParam) == BN_CLICKED) { - refresh_data(hwnd, d); - refresh_view(hwnd, d); - - check_for_modification(d); - } else if (HIWORD(wParam) == EN_CHANGE) { - SetTimer(hwnd, 1, 500, NULL); - } - - khm_set_dialog_result(hwnd, 0); - - return TRUE; - } - - case WM_TIMER: { - d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - KillTimer(hwnd, 1); - check_for_modification(d); - - khm_set_dialog_result(hwnd, 0); - - return TRUE; - } - - case WM_DESTROY: { - d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - - khui_tracker_kill_controls(&d->tc_renew); - khui_tracker_kill_controls(&d->tc_warn1); - khui_tracker_kill_controls(&d->tc_warn2); - - PFREE(d); - - SetWindowLongPtr(hwnd, DWLP_USER, 0); - - khm_set_dialog_result(hwnd, 0); - - return TRUE; - } - - case KHUI_WM_CFG_NOTIFY: { - d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - - if (HIWORD(wParam) == WMCFG_APPLY) { - write_params(d); - } - - khm_set_dialog_result(hwnd, 0); - - return TRUE; - } - - } - - return FALSE; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +typedef struct tag_notif_data { + khui_config_node node; + + BOOL modified; + + BOOL monitor; + BOOL renew; + BOOL halflife; + BOOL warn1; + BOOL warn2; + + khui_tracker tc_renew; + khui_tracker tc_warn1; + khui_tracker tc_warn2; +} notif_data; + +static void +read_params(notif_data * d) { + khm_handle csp_cw; + khm_int32 rv; + khm_int32 t; + + rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, &csp_cw); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_read_int32(csp_cw, L"Monitor", &t); + assert(KHM_SUCCEEDED(rv)); + d->monitor = !!t; + + rv = khc_read_int32(csp_cw, L"AllowAutoRenew", &t); + assert(KHM_SUCCEEDED(rv)); + d->renew = !!t; + + rv = khc_read_int32(csp_cw, L"RenewAtHalfLife", &t); + assert(KHM_SUCCEEDED(rv)); + d->halflife = !!t; + + rv = khc_read_int32(csp_cw, L"AllowWarn", &t); + assert(KHM_SUCCEEDED(rv)); + d->warn1 = !!t; + + rv = khc_read_int32(csp_cw, L"AllowCritical", &t); + assert(KHM_SUCCEEDED(rv)); + d->warn2 = !!t; + + rv = khc_read_int32(csp_cw, L"AutoRenewThreshold", &t); + assert(KHM_SUCCEEDED(rv)); + d->tc_renew.current = t; + + rv = khc_read_int32(csp_cw, L"WarnThreshold", &t); + assert(KHM_SUCCEEDED(rv)); + d->tc_warn1.current = t; + + rv = khc_read_int32(csp_cw, L"CriticalThreshold", &t); + assert(KHM_SUCCEEDED(rv)); + d->tc_warn2.current = t; + + rv = khc_read_int32(csp_cw, L"MaxThreshold", &t); + assert(KHM_SUCCEEDED(rv)); + d->tc_renew.max = t; + d->tc_warn1.max = t; + d->tc_warn2.max = t; + + rv = khc_read_int32(csp_cw, L"MinThreshold", &t); + assert(KHM_SUCCEEDED(rv)); + d->tc_renew.min = t; + d->tc_warn1.min = t; + d->tc_warn2.min = t; + + khc_close_space(csp_cw); + + d->modified = FALSE; +} + +static void +check_for_modification(notif_data * d) { + notif_data t; + + ZeroMemory(&t, sizeof(t)); + + read_params(&t); + + if ((!!d->monitor) != (!!t.monitor) || + (!!d->renew) != (!!t.renew) || + (!!d->halflife) != (!!t.halflife) || + (!!d->warn1) != (!!t.warn1) || + (!!d->warn2) != (!!t.warn2) || + d->tc_renew.current != t.tc_renew.current || + d->tc_warn1.current != t.tc_warn1.current || + d->tc_warn2.current != t.tc_warn2.current) { + + khui_cfg_set_flags(d->node, + KHUI_CNFLAG_MODIFIED, + KHUI_CNFLAG_MODIFIED); + + d->modified = TRUE; + + } else { + khui_cfg_set_flags(d->node, + 0, + KHUI_CNFLAG_MODIFIED); + + d->modified = FALSE; + } +} + +static void +write_params(notif_data * d) { + khm_handle csp_cw; + khm_int32 rv; + + if (!d->modified) + return; + + rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_WRITE, &csp_cw); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_int32(csp_cw, L"Monitor", d->monitor); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_int32(csp_cw, L"AllowAutoRenew", d->renew); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_int32(csp_cw, L"RenewAtHalfLife", d->halflife); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_int32(csp_cw, L"AllowWarn", d->warn1); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_int32(csp_cw, L"AllowCritical", d->warn2); + assert(KHM_SUCCEEDED(rv)); + + + rv = khc_write_int32(csp_cw, L"AutoRenewThreshold", + (khm_int32) d->tc_renew.current); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_int32(csp_cw, L"WarnThreshold", + (khm_int32) d->tc_warn1.current); + assert(KHM_SUCCEEDED(rv)); + + rv = khc_write_int32(csp_cw, L"CriticalThreshold", + (khm_int32) d->tc_warn2.current); + assert(KHM_SUCCEEDED(rv)); + + khc_close_space(csp_cw); + + khui_cfg_set_flags(d->node, + KHUI_CNFLAG_APPLIED, + KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); + + khm_timer_refresh(hwnd_notifier); +} + +static void +refresh_view(HWND hwnd, notif_data * d) { + CheckDlgButton(hwnd, IDC_NOTIF_MONITOR, + (d->monitor?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_NOTIF_RENEW, + (d->renew?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_NOTIF_HALFLIFE, + (d->halflife?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_NOTIF_WARN1, + (d->warn1?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_NOTIF_WARN2, + (d->warn2?BST_CHECKED:BST_UNCHECKED)); + khui_tracker_refresh(&d->tc_renew); + khui_tracker_refresh(&d->tc_warn1); + khui_tracker_refresh(&d->tc_warn2); + if (!d->monitor) { + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_HALFLIFE), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR), FALSE); + } else { + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW), TRUE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_HALFLIFE), TRUE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1), TRUE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2), TRUE); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR), !!(d->renew)); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR), !!(d->warn1)); + EnableWindow(GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR), !!(d->warn2)); + } +} + +static void +refresh_data(HWND hwnd, notif_data * d) { + d->monitor = (IsDlgButtonChecked(hwnd, IDC_NOTIF_MONITOR) + == BST_CHECKED); + d->renew = (IsDlgButtonChecked(hwnd, IDC_NOTIF_RENEW) + == BST_CHECKED); + d->halflife = (IsDlgButtonChecked(hwnd, IDC_NOTIF_HALFLIFE) + == BST_CHECKED); + d->warn1 = (IsDlgButtonChecked(hwnd, IDC_NOTIF_WARN1) + == BST_CHECKED); + d->warn2 = (IsDlgButtonChecked(hwnd, IDC_NOTIF_WARN2) + == BST_CHECKED); + + check_for_modification(d); +} + +INT_PTR CALLBACK +khm_cfg_notifications_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + + notif_data * d; + + switch(uMsg) { + case WM_INITDIALOG: { + HWND hw; + + d = PMALLOC(sizeof(*d)); +#ifdef DEBUG + assert(d != NULL); +#endif + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); +#pragma warning(pop) + + ZeroMemory(d, sizeof(*d)); + + d->node = (khui_config_node) lParam; + + khui_tracker_initialize(&d->tc_renew); + khui_tracker_initialize(&d->tc_warn1); + khui_tracker_initialize(&d->tc_warn2); + + read_params(d); + + hw = GetDlgItem(hwnd, IDC_NOTIF_RENEW_THR); + khui_tracker_install(hw, &d->tc_renew); + + hw = GetDlgItem(hwnd, IDC_NOTIF_WARN1_THR); + khui_tracker_install(hw, &d->tc_warn1); + + hw = GetDlgItem(hwnd, IDC_NOTIF_WARN2_THR); + khui_tracker_install(hw, &d->tc_warn2); + + refresh_view(hwnd, d); + + /* normally we should return TRUE, but in this case we return + FALSE since we don't want to inadvertently steal the focus + from the treeview. */ + return FALSE; + } + + case WM_COMMAND: { + d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + + if (HIWORD(wParam) == BN_CLICKED) { + refresh_data(hwnd, d); + refresh_view(hwnd, d); + + check_for_modification(d); + } else if (HIWORD(wParam) == EN_CHANGE) { + SetTimer(hwnd, 1, 500, NULL); + } + + khm_set_dialog_result(hwnd, 0); + + return TRUE; + } + + case WM_TIMER: { + d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + KillTimer(hwnd, 1); + check_for_modification(d); + + khm_set_dialog_result(hwnd, 0); + + return TRUE; + } + + case WM_DESTROY: { + d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + + khui_tracker_kill_controls(&d->tc_renew); + khui_tracker_kill_controls(&d->tc_warn1); + khui_tracker_kill_controls(&d->tc_warn2); + + PFREE(d); + + SetWindowLongPtr(hwnd, DWLP_USER, 0); + + khm_set_dialog_result(hwnd, 0); + + return TRUE; + } + + case KHUI_WM_CFG_NOTIFY: { + d = (notif_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + + if (HIWORD(wParam) == WMCFG_APPLY) { + write_params(d); + } + + khm_set_dialog_result(hwnd, 0); + + return TRUE; + } + + } + + return FALSE; +} --- krb5-1.4.4.orig/src/windows/identity/ui/timer.c +++ krb5-1.4.4/src/windows/identity/ui/timer.c @@ -1,836 +1,836 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -/* The minimum half time interval is 60 seconds*/ -#define TT_MIN_HALFLIFE_INTERVAL 60 - -/* as above, in FILETIME units of 100ns */ -#define FT_MIN_HALFLIFE_INTERVAL (TT_MIN_HALFLIFE_INTERVAL * 10000000i64) - -/* in seconds */ -#if 0 -khm_int32 khui_timeout_warn = KHUI_DEF_TIMEOUT_WARN; -khm_int32 khui_timeout_crit = KHUI_DEF_TIMEOUT_CRIT; -khm_int32 khui_timeout_renew = KHUI_DEF_TIMEOUT_RENEW; - -khm_boolean khui_do_renew = TRUE; -khm_boolean khui_do_warn = TRUE; -khm_boolean khui_do_crit = TRUE; -#endif - -khui_timer_event * khui_timers = NULL; -khm_size khui_n_timers = 0; -khm_size khui_nc_timers = 0; - -CRITICAL_SECTION cs_timers; - -/********************************************************************* - Timers - *********************************************************************/ - - -#define KHUI_TIMER_ALLOC_INCR 16 - -void -khm_timer_init(void) { -#ifdef DEBUG - assert(khui_timers == NULL); -#endif - - khui_nc_timers = KHUI_TIMER_ALLOC_INCR; - khui_n_timers = 0; - khui_timers = PMALLOC(sizeof(*khui_timers) * khui_nc_timers); - -#ifdef DEBUG - assert(khui_timers != NULL); -#endif - - InitializeCriticalSection(&cs_timers); -} - -void -khm_timer_exit(void) { - EnterCriticalSection(&cs_timers); - - if (khui_timers) - PFREE(khui_timers); - khui_timers = NULL; - khui_n_timers = 0; - khui_nc_timers = 0; - - LeaveCriticalSection(&cs_timers); - DeleteCriticalSection(&cs_timers); -} - -/* called with cs_timers held */ -static void -tmr_fire_timer(void) { - int i; - unsigned __int64 curtime; - unsigned __int64 err; - unsigned __int64 next_event; - int tmr_count[KHUI_N_TTYPES]; - unsigned __int64 tmr_offset[KHUI_N_TTYPES]; - int t; - khm_handle eff_ident = NULL; - khui_timer_type eff_type = 0; /* meaningless */ - int fire_count = 0; - FILETIME ft; - - TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR_SMALL, &ft); - err = FtToInt(&ft); - GetSystemTimeAsFileTime(&ft); - curtime = FtToInt(&ft); - - next_event = 0; - - ZeroMemory(tmr_count, sizeof(tmr_count)); - ZeroMemory(tmr_offset, sizeof(tmr_offset)); - - for (i=0; i < (int) khui_n_timers; i++) { - if (!(khui_timers[i].flags & - (KHUI_TE_FLAG_STALE | KHUI_TE_FLAG_EXPIRED)) && - khui_timers[i].type != KHUI_TTYPE_ID_MARK && - khui_timers[i].expire < curtime + err) { - - t = khui_timers[i].type; - - switch(t) { - case KHUI_TTYPE_ID_RENEW: - khm_cred_renew_identity(khui_timers[i].key); - khui_timers[i].flags |= KHUI_TE_FLAG_EXPIRED; - break; - - case KHUI_TTYPE_CRED_RENEW: - /* the equivalence threshold for setting the timer is - a lot larger than what we are testing for here - (KHUI_TIMEEQ_ERROR vs KHUI_TIMEEQ_ERROR_SMALL) so - we assume that it is safe to trigger a renew_cred - call here without checking if there's an imminent - renew_identity call. */ - khm_cred_renew_cred(khui_timers[i].key); - khui_timers[i].flags |= KHUI_TE_FLAG_EXPIRED; - break; - - default: - if (t < KHUI_N_TTYPES) { - tmr_count[t]++; - if (tmr_offset[t] == 0 || - tmr_offset[t] > khui_timers[i].offset) - tmr_offset[t] = khui_timers[i].offset; - if (next_event == 0 || - next_event > - khui_timers[i].expire + khui_timers[i].offset) - next_event = khui_timers[i].expire + - khui_timers[i].offset; - - if (eff_ident == NULL && - (t == KHUI_TTYPE_ID_EXP || - t == KHUI_TTYPE_ID_CRIT || - t == KHUI_TTYPE_ID_WARN)) { - /* we don't need a hold since we will be done - with the handle before the marker is - expired (the marker is the timer with the - KHUI_TTYPE_ID_MARK which contains a held - handle and is not really a timer.) */ - eff_ident = khui_timers[i].key; - eff_type = t; - } - - fire_count++; - - khui_timers[i].flags |= KHUI_TE_FLAG_EXPIRED; - } - else { -#ifdef DEBUG - assert(FALSE); -#endif - } - } - } - } - - /* See if we have anything to do */ - if (next_event == 0) - return; - else { - wchar_t fmt[128]; - wchar_t wtime[128]; - wchar_t wmsg[256]; - wchar_t wtitle[64]; - unsigned __int64 second; - khui_alert * alert = NULL; - - khm_size cb; - - next_event -= curtime; - - /* Due to measurement errors we may be slightly off on our - next_event calculation which shows up as '4 mins 59 - seconds' instead of '5 mins' and so on when converting to a - string. So we add half a second to make the message - neater. */ - TimetToFileTimeInterval(1, &ft); - second = FtToInt(&ft); - next_event += second / 2; - - cb = sizeof(wtime); - ft = IntToFt(next_event); - FtIntervalToString(&ft, - wtime, - &cb); - - if (fire_count == 1 && - eff_ident != NULL && - (eff_type == KHUI_TTYPE_ID_EXP || - eff_type == KHUI_TTYPE_ID_CRIT || - eff_type == KHUI_TTYPE_ID_WARN)) { - - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - - cb = sizeof(idname); - kcdb_identity_get_name(eff_ident, idname, &cb); - - if (next_event < second) { - LoadString(khm_hInstance, IDS_WARN_EXPIRED_ID, - fmt, ARRAYLENGTH(fmt)); - - StringCbPrintf(wmsg, sizeof(wmsg), fmt, idname); - } else { - LoadString(khm_hInstance, IDS_WARN_EXPIRE_ID, - fmt, ARRAYLENGTH(fmt)); - - StringCbPrintf(wmsg, sizeof(wmsg), fmt, idname, wtime); - } - } else { - if (next_event < second) { - LoadString(khm_hInstance, IDS_WARN_EXPIRED, - wmsg, ARRAYLENGTH(wmsg)); - } else { - LoadString(khm_hInstance, IDS_WARN_EXPIRE, - fmt, ARRAYLENGTH(fmt)); - - StringCbPrintf(wmsg, sizeof(wmsg), fmt, wtime); - } - } - - LoadString(khm_hInstance, IDS_WARN_TITLE, - wtitle, ARRAYLENGTH(wtitle)); - - khui_alert_create_simple(wtitle, wmsg, KHERR_WARNING, &alert); - khui_alert_set_flags(alert, KHUI_ALERT_FLAG_REQUEST_BALLOON, - KHUI_ALERT_FLAG_REQUEST_BALLOON); - khui_alert_show(alert); - khui_alert_release(alert); - } -} - -void -khm_timer_fire(HWND hwnd) { - EnterCriticalSection(&cs_timers); - tmr_fire_timer(); - LeaveCriticalSection(&cs_timers); - - khm_timer_refresh(hwnd); -} - -static int -tmr_update(khm_handle key, khui_timer_type type, __int64 expire, - __int64 offset, void * data, khm_boolean reinstate) { - int i; - - for (i=0; i < (int) khui_n_timers; i++) { - if (khui_timers[i].key == key && - khui_timers[i].type == type) - break; - } - - if (i >= (int) khui_n_timers) { - i = (int) khui_n_timers; - - if (i >= (int) khui_nc_timers) { - khui_timer_event * nt; -#ifdef DEBUG - assert(khui_timers); -#endif - khui_nc_timers = UBOUNDSS(i+1, KHUI_TIMER_ALLOC_INCR, - KHUI_TIMER_ALLOC_INCR); - nt = PMALLOC(sizeof(*nt) * khui_nc_timers); -#ifdef DEBUG - assert(nt); -#endif - memcpy(nt, khui_timers, sizeof(*nt) * khui_n_timers); - - PFREE(khui_timers); - khui_timers = nt; - } - - khui_timers[i].key = key; - khui_timers[i].type = type; - khui_timers[i].flags = 0; - khui_n_timers++; - } - - khui_timers[i].expire = expire; - khui_timers[i].offset = offset; - khui_timers[i].data = data; - - khui_timers[i].flags &= ~KHUI_TE_FLAG_STALE; - if (reinstate) - khui_timers[i].flags &= ~KHUI_TE_FLAG_EXPIRED; - - return i; -} - -/* called with cs_timers held */ -static int -tmr_find(khm_handle key, khui_timer_type type, - khm_int32 and_flags, khm_int32 eq_flags) { - int i; - - eq_flags &= and_flags; - - for (i=0; i < (int) khui_n_timers; i++) { - if (khui_timers[i].key == key && - khui_timers[i].type == type && - (khui_timers[i].flags & and_flags) == eq_flags) - break; - } - - if (i < (int) khui_n_timers) - return i; - else - return -1; -} - -/* called with cs_timers held. */ -static FILETIME -tmr_next_halflife_timeout(int idx, FILETIME * issue, FILETIME * expire) { - FILETIME lifetime; - FILETIME current; - FILETIME ret; - - khm_int64 ilife; - khm_int64 icurrent; - khm_int64 iexpire; - - khm_int64 iret; - - GetSystemTimeAsFileTime(¤t); - - /* wha?? */ - if (CompareFileTime(issue, expire) >= 0) - return current; - - lifetime = FtSub(expire, issue); - icurrent = FtToInt(¤t); - iexpire = FtToInt(expire); - - ilife = FtToInt(&lifetime); - - while(ilife / 2 > FT_MIN_HALFLIFE_INTERVAL) { - ilife /= 2; - - /* is this the next renewal time? */ - if (iexpire - ilife > icurrent) { - if (idx >= 0 && - khui_timers[idx].expire == iexpire - ilife && - (khui_timers[idx].flags & KHUI_TE_FLAG_EXPIRED)) { - - /* if this renewal time has already been triggered - (note that when the timer fires, it also fires all - events that are within a few seconds of the current - time) then we need to set the alarm for the next - slot down the line. */ - - continue; - - } else { - break; - } - } - } - - iret = iexpire - ilife; - - ret = IntToFt(iret); - - /* if the previous renew timer had fired, we need to mark it as - not expired. However, we leave it to the caller to update the - actual timer and mark it as not stale. */ - if (idx >= 0 && - khui_timers[idx].expire < (khm_ui_8) iret) { - - khui_timers[idx].flags &= ~KHUI_TE_FLAG_EXPIRED; - khui_timers[idx].expire = iret; - } - - return ret; -} - -/* called with cs_timers held */ -static khm_int32 KHMAPI -tmr_cred_apply_proc(khm_handle cred, void * rock) { - khm_handle ident = NULL; - int mark_idx; - int idx; - FILETIME ft_expiry; - FILETIME ft_current; - FILETIME ft_creinst; - FILETIME ft_cred_expiry; - FILETIME ft_cred_issue; - FILETIME ft_issue; - FILETIME ft; - FILETIME fte; - FILETIME ft_reinst; - khm_size cb; - - kcdb_cred_get_identity(cred, &ident); -#ifdef DEBUG - assert(ident); -#endif - - /* now get the expiry */ - cb = sizeof(ft_expiry); - if (KHM_FAILED(kcdb_identity_get_attr(ident, KCDB_ATTR_EXPIRE, - NULL, - &ft_expiry, &cb))) { - cb = sizeof(ft_expiry); - if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_EXPIRE, - NULL, - &ft_expiry, &cb))) { - /* we don't have an expiry time to work with */ - kcdb_identity_release(ident); - return KHM_ERROR_SUCCESS; - } - } - - cb = sizeof(ft_issue); - if (KHM_FAILED(kcdb_identity_get_attr(ident, KCDB_ATTR_ISSUE, - NULL, - &ft_issue, &cb))) { - cb = sizeof(ft_issue); - if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_ISSUE, - NULL, - &ft_issue, &cb))) { - /* we don't really abandon the timer. In this case, we - fall back to using the threshold value to set the - expiry timer. */ - ZeroMemory(&ft_issue, sizeof(ft_issue)); - } - } - - /* and the current time */ - GetSystemTimeAsFileTime(&ft_current); - - TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR, &ft_reinst); - - ft_creinst = FtAdd(&ft_current, &ft_reinst); - - mark_idx = tmr_find(ident, KHUI_TTYPE_ID_MARK, 0, 0); - - if (mark_idx < 0) { - mark_idx = tmr_update(ident, KHUI_TTYPE_ID_MARK, 0, 0, 0, FALSE); - kcdb_identity_hold(ident); -#ifdef DEBUG - assert(mark_idx >= 0); -#endif - khui_timers[mark_idx].flags |= KHUI_TE_FLAG_STALE; - } - - if (khui_timers[mark_idx].flags & KHUI_TE_FLAG_STALE) { - /* first time we are touching this */ - khm_handle csp_cw = NULL; - khm_handle csp_id = NULL; - khm_int32 rv; - khm_int32 t; - khm_boolean do_warn = TRUE; - khm_boolean do_crit = TRUE; - khm_boolean do_renew = TRUE; - khm_boolean do_halflife = TRUE; - khm_boolean renew_done = FALSE; - khm_boolean monitor = TRUE; - khm_int32 to_warn = KHUI_DEF_TIMEOUT_WARN; - khm_int32 to_crit = KHUI_DEF_TIMEOUT_CRIT; - khm_int32 to_renew = KHUI_DEF_TIMEOUT_RENEW; - - if (CompareFileTime(&ft_expiry, &ft_current) < 0) - /* already expired */ - goto _done_with_ident; - - rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, - &csp_cw); - - assert(KHM_SUCCEEDED(rv)); - - rv = kcdb_identity_get_config(ident, KHM_PERM_READ, &csp_id); - if (KHM_SUCCEEDED(rv)) { - khc_shadow_space(csp_id, csp_cw); - khc_close_space(csp_cw); - } else { - csp_id = csp_cw; - } - csp_cw = NULL; - - rv = khc_read_int32(csp_id, L"Monitor", &t); - if (KHM_SUCCEEDED(rv)) - monitor = t; - - rv = khc_read_int32(csp_id, L"AllowWarn", &t); - if (KHM_SUCCEEDED(rv)) - do_warn = t; - - rv = khc_read_int32(csp_id, L"AllowCritical", &t); - if (KHM_SUCCEEDED(rv)) - do_crit = t; - - rv = khc_read_int32(csp_id, L"AllowAutoRenew", &t); - if (KHM_SUCCEEDED(rv)) - do_renew = t; - - rv = khc_read_int32(csp_id, L"RenewAtHalfLife", &t); - if (KHM_SUCCEEDED(rv)) - do_halflife = t; - - rv = khc_read_int32(csp_id, L"WarnThreshold", &t); - if (KHM_SUCCEEDED(rv)) - to_warn = t; - - rv = khc_read_int32(csp_id, L"CriticalThreshold", &t); - if (KHM_SUCCEEDED(rv)) - to_crit = t; - - rv = khc_read_int32(csp_id, L"AutoRenewThreshold", &t); - if (KHM_SUCCEEDED(rv)) - to_renew = t; - - khc_close_space(csp_id); - - if (monitor && do_renew) { - int prev; - - TimetToFileTimeInterval(to_renew, &ft); - - prev = - tmr_find(ident, KHUI_TTYPE_ID_RENEW, 0, 0); - - if (do_halflife) - fte = tmr_next_halflife_timeout(prev, &ft_issue, &ft_expiry); - else - fte = FtSub(&ft_expiry, &ft); - - /* we set off a renew notification immediately if the - renew threshold has passed but a renew was never sent. - This maybe because that NetIDMgr was started at the - last minute, or because for some reason the renew timer - could not be triggered earlier. */ - - if (CompareFileTime(&fte, &ft_current) > 0 || - prev == -1 || - !(khui_timers[prev].flags & KHUI_TE_FLAG_EXPIRED)) { - - if (CompareFileTime(&fte, &ft_current) < 0) - fte = ft_current; - - tmr_update(ident, KHUI_TTYPE_ID_RENEW, - FtToInt(&fte), FtToInt(&ft), 0, - CompareFileTime(&fte,&ft_creinst) > 0); - renew_done = TRUE; - - } else { - - /* special case. If the renew timer was in the past - and it was expired, then we retain the record as - long as the credentials are around. If the renewal - failed we don't want to automatically retry - everytime we check the timers. */ - - tmr_update(ident, KHUI_TTYPE_ID_RENEW, - FtToInt(&fte), FtToInt(&ft), 0, FALSE); - - } - } - - if (monitor && do_warn && !renew_done) { - - TimetToFileTimeInterval(to_warn, &ft); - fte = FtSub(&ft_expiry, &ft); - - if (CompareFileTime(&fte, &ft_current) > 0) - tmr_update(ident, KHUI_TTYPE_ID_WARN, - FtToInt(&fte), FtToInt(&ft), 0, - CompareFileTime(&fte, &ft_creinst) > 0); - } - - if (monitor && do_crit && !renew_done) { - TimetToFileTimeInterval(to_crit, &ft); - fte = FtSub(&ft_expiry, &ft); - - if (CompareFileTime(&fte, &ft_current) > 0) - tmr_update(ident, KHUI_TTYPE_ID_CRIT, - FtToInt(&fte), FtToInt(&ft), 0, - CompareFileTime(&fte, &ft_creinst) > 0); - } - - if (monitor && !renew_done) { - if (CompareFileTime(&ft_expiry, &ft_current) > 0) - tmr_update(ident, KHUI_TTYPE_ID_EXP, - FtToInt(&ft_expiry), 0, 0, - CompareFileTime(&fte, &ft_creinst) > 0); - } - - _done_with_ident: - khui_timers[mark_idx].flags &= ~KHUI_TE_FLAG_STALE; - } - - cb = sizeof(ft_cred_expiry); - if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_EXPIRE, - NULL, - &ft_cred_expiry, - &cb))) - goto _cleanup; - - cb = sizeof(ft_cred_issue); - if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_ISSUE, - NULL, - &ft_cred_issue, - &cb))) - goto _cleanup; - - TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR, &ft); - - { - /* if the credential has a longer lifetime than the identity, - or it expires within KHUI_TIMEEQ_ERROR seconds of the - identity, then we don't need to set any alerts for this - credential. */ - - FILETIME ft_delta; - - ft_delta = FtSub(&ft_expiry, &ft_cred_expiry); - - if (CompareFileTime(&ft_cred_expiry, &ft_expiry) >= 0 || - CompareFileTime(&ft_delta, &ft) < 0) - goto _cleanup; - } - - if ((idx = tmr_find(ident, KHUI_TTYPE_ID_WARN, 0, 0)) >= 0 && - !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { - - fte = IntToFt(FtToInt(&ft_cred_expiry) - khui_timers[idx].offset); - if (CompareFileTime(&fte, &ft_current) > 0) { - tmr_update(cred, KHUI_TTYPE_CRED_WARN, - FtToInt(&fte), - khui_timers[idx].offset, 0, - CompareFileTime(&fte, &ft_creinst) > 0); - kcdb_cred_hold(cred); - } - } - - if ((idx = tmr_find(ident, KHUI_TTYPE_ID_CRIT, 0, 0)) >= 0 && - !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { - - fte = IntToFt(FtToInt(&ft_cred_expiry) - khui_timers[idx].offset); - if (CompareFileTime(&fte, &ft_current) > 0) { - tmr_update(cred, KHUI_TTYPE_CRED_CRIT, - FtToInt(&fte), - khui_timers[idx].offset, 0, - CompareFileTime(&fte, &ft_creinst) > 0); - kcdb_cred_hold(cred); - } - } - - if ((idx = tmr_find(ident, KHUI_TTYPE_ID_RENEW, 0, 0)) >= 0 && - !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { - - //fte = IntToFt(FtToInt(&ft_cred_expiry) - khui_timers[idx].offset); - fte = tmr_next_halflife_timeout(idx, &ft_cred_issue, &ft_cred_expiry); - - if (CompareFileTime(&fte, &ft_current) > 0) { - tmr_update(cred, KHUI_TTYPE_CRED_RENEW, - FtToInt(&fte), - khui_timers[idx].offset, 0, - CompareFileTime(&fte, &ft_creinst) > 0); - kcdb_cred_hold(cred); - } - } - - if ((idx = tmr_find(ident, KHUI_TTYPE_ID_EXP, 0, 0)) >= 0 && - !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { - - if (CompareFileTime(&ft_cred_expiry, &ft_current) > 0) { - tmr_update(cred, KHUI_TTYPE_CRED_EXP, - FtToInt(&ft_cred_expiry), - 0, 0, - CompareFileTime(&ft_cred_expiry, &ft_creinst) > 0); - } - } - - _cleanup: - - if (ident) - kcdb_identity_release(ident); - - return KHM_ERROR_SUCCESS; -} - -/* called with cs_timers held */ -static void -tmr_purge(void) { - int i, j; - - for (i=0,j=0; i < (int) khui_n_timers; i++) { - if (khui_timers[i].flags & KHUI_TE_FLAG_STALE) { - if (khui_timers[i].type == KHUI_TTYPE_ID_MARK) { - kcdb_identity_release(khui_timers[i].key); -#ifdef DEBUG - { - int idx; - - idx = tmr_find(khui_timers[i].key, - KHUI_TTYPE_ID_CRIT, 0, 0); - assert(idx < 0 || - (khui_timers[idx].flags & - KHUI_TE_FLAG_STALE)); - - idx = tmr_find(khui_timers[i].key, - KHUI_TTYPE_ID_RENEW, 0, 0); - assert(idx < 0 || - (khui_timers[idx].flags & - KHUI_TE_FLAG_STALE)); - - idx = tmr_find(khui_timers[i].key, - KHUI_TTYPE_ID_WARN, 0, 0); - assert(idx < 0 || - (khui_timers[idx].flags & - KHUI_TE_FLAG_STALE)); - - idx = tmr_find(khui_timers[i].key, - KHUI_TTYPE_ID_EXP, 0, 0); - assert(idx < 0 || - (khui_timers[idx].flags & - KHUI_TE_FLAG_STALE)); - } -#endif - } else if (khui_timers[i].type == KHUI_TTYPE_CRED_WARN || - khui_timers[i].type == KHUI_TTYPE_CRED_CRIT || - khui_timers[i].type == KHUI_TTYPE_CRED_RENEW || - khui_timers[i].type == KHUI_TTYPE_CRED_EXP) { - kcdb_cred_release(khui_timers[i].key); - } - } else { - if (i != j) - khui_timers[j] = khui_timers[i]; - j++; - } - } - - khui_n_timers = j; -} - -/* go through all the credentials and set timers as appropriate. */ -void -khm_timer_refresh(HWND hwnd) { - int i; - unsigned __int64 next_event = 0; - unsigned __int64 curtime; - unsigned __int64 diff; - - EnterCriticalSection(&cs_timers); - - KillTimer(hwnd, KHUI_TRIGGER_TIMER_ID); - - /* When refreshing timers, we go through all of them and mark them - as stale. Then we go through the credentials in the root - credential set and add or refresh the timers associated with - each identity and credential. Once this is done, we remove the - timers that are still stale, since they are no longer in - use. */ - - for (i=0; i < (int) khui_n_timers; i++) { -#ifdef NOT_IMPLEMENTED_YET - if (khui_timers[i].type == KHUI_TTYPE_BMSG || - khui_timers[i].type == KHUI_TTYPE_SMSG) { - khui_timers[i].flags &= ~KHUI_TE_FLAG_STALE; - } else { -#endif - - khui_timers[i].flags |= KHUI_TE_FLAG_STALE; - -#ifdef NOT_IMPLEMENTED_YET - } -#endif - } - - kcdb_credset_apply(NULL, - tmr_cred_apply_proc, - NULL); - - tmr_purge(); - - _check_next_event: - - /* Before we return, we should check if any timers are set to - expire right now. If there are, we should fire the timer - before returning. */ - - next_event = 0; - for (i=0; i < (int) khui_n_timers; i++) { - if (!(khui_timers[i].flags & KHUI_TE_FLAG_EXPIRED) && - khui_timers[i].type != KHUI_TTYPE_ID_MARK && - (next_event == 0 || - next_event > khui_timers[i].expire)) - - next_event = khui_timers[i].expire; - } - - if (next_event != 0) { - FILETIME ft; - - GetSystemTimeAsFileTime(&ft); - curtime = FtToInt(&ft); - - TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR_SMALL, &ft); - diff = FtToInt(&ft); - - if (curtime + diff > next_event) { - tmr_fire_timer(); - goto _check_next_event; - } else { - diff = next_event - curtime; - ft = IntToFt(diff); - SetTimer(hwnd, - KHUI_TRIGGER_TIMER_ID, - FtIntervalToMilliseconds(&ft), - NULL); - } - } - - LeaveCriticalSection(&cs_timers); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +/* The minimum half time interval is 60 seconds*/ +#define TT_MIN_HALFLIFE_INTERVAL 60 + +/* as above, in FILETIME units of 100ns */ +#define FT_MIN_HALFLIFE_INTERVAL (TT_MIN_HALFLIFE_INTERVAL * 10000000i64) + +/* in seconds */ +#if 0 +khm_int32 khui_timeout_warn = KHUI_DEF_TIMEOUT_WARN; +khm_int32 khui_timeout_crit = KHUI_DEF_TIMEOUT_CRIT; +khm_int32 khui_timeout_renew = KHUI_DEF_TIMEOUT_RENEW; + +khm_boolean khui_do_renew = TRUE; +khm_boolean khui_do_warn = TRUE; +khm_boolean khui_do_crit = TRUE; +#endif + +khui_timer_event * khui_timers = NULL; +khm_size khui_n_timers = 0; +khm_size khui_nc_timers = 0; + +CRITICAL_SECTION cs_timers; + +/********************************************************************* + Timers + *********************************************************************/ + + +#define KHUI_TIMER_ALLOC_INCR 16 + +void +khm_timer_init(void) { +#ifdef DEBUG + assert(khui_timers == NULL); +#endif + + khui_nc_timers = KHUI_TIMER_ALLOC_INCR; + khui_n_timers = 0; + khui_timers = PMALLOC(sizeof(*khui_timers) * khui_nc_timers); + +#ifdef DEBUG + assert(khui_timers != NULL); +#endif + + InitializeCriticalSection(&cs_timers); +} + +void +khm_timer_exit(void) { + EnterCriticalSection(&cs_timers); + + if (khui_timers) + PFREE(khui_timers); + khui_timers = NULL; + khui_n_timers = 0; + khui_nc_timers = 0; + + LeaveCriticalSection(&cs_timers); + DeleteCriticalSection(&cs_timers); +} + +/* called with cs_timers held */ +static void +tmr_fire_timer(void) { + int i; + unsigned __int64 curtime; + unsigned __int64 err; + unsigned __int64 next_event; + int tmr_count[KHUI_N_TTYPES]; + unsigned __int64 tmr_offset[KHUI_N_TTYPES]; + int t; + khm_handle eff_ident = NULL; + khui_timer_type eff_type = 0; /* meaningless */ + int fire_count = 0; + FILETIME ft; + + TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR_SMALL, &ft); + err = FtToInt(&ft); + GetSystemTimeAsFileTime(&ft); + curtime = FtToInt(&ft); + + next_event = 0; + + ZeroMemory(tmr_count, sizeof(tmr_count)); + ZeroMemory(tmr_offset, sizeof(tmr_offset)); + + for (i=0; i < (int) khui_n_timers; i++) { + if (!(khui_timers[i].flags & + (KHUI_TE_FLAG_STALE | KHUI_TE_FLAG_EXPIRED)) && + khui_timers[i].type != KHUI_TTYPE_ID_MARK && + khui_timers[i].expire < curtime + err) { + + t = khui_timers[i].type; + + switch(t) { + case KHUI_TTYPE_ID_RENEW: + khm_cred_renew_identity(khui_timers[i].key); + khui_timers[i].flags |= KHUI_TE_FLAG_EXPIRED; + break; + + case KHUI_TTYPE_CRED_RENEW: + /* the equivalence threshold for setting the timer is + a lot larger than what we are testing for here + (KHUI_TIMEEQ_ERROR vs KHUI_TIMEEQ_ERROR_SMALL) so + we assume that it is safe to trigger a renew_cred + call here without checking if there's an imminent + renew_identity call. */ + khm_cred_renew_cred(khui_timers[i].key); + khui_timers[i].flags |= KHUI_TE_FLAG_EXPIRED; + break; + + default: + if (t < KHUI_N_TTYPES) { + tmr_count[t]++; + if (tmr_offset[t] == 0 || + tmr_offset[t] > khui_timers[i].offset) + tmr_offset[t] = khui_timers[i].offset; + if (next_event == 0 || + next_event > + khui_timers[i].expire + khui_timers[i].offset) + next_event = khui_timers[i].expire + + khui_timers[i].offset; + + if (eff_ident == NULL && + (t == KHUI_TTYPE_ID_EXP || + t == KHUI_TTYPE_ID_CRIT || + t == KHUI_TTYPE_ID_WARN)) { + /* we don't need a hold since we will be done + with the handle before the marker is + expired (the marker is the timer with the + KHUI_TTYPE_ID_MARK which contains a held + handle and is not really a timer.) */ + eff_ident = khui_timers[i].key; + eff_type = t; + } + + fire_count++; + + khui_timers[i].flags |= KHUI_TE_FLAG_EXPIRED; + } + else { +#ifdef DEBUG + assert(FALSE); +#endif + } + } + } + } + + /* See if we have anything to do */ + if (next_event == 0) + return; + else { + wchar_t fmt[128]; + wchar_t wtime[128]; + wchar_t wmsg[256]; + wchar_t wtitle[64]; + unsigned __int64 second; + khui_alert * alert = NULL; + + khm_size cb; + + next_event -= curtime; + + /* Due to measurement errors we may be slightly off on our + next_event calculation which shows up as '4 mins 59 + seconds' instead of '5 mins' and so on when converting to a + string. So we add half a second to make the message + neater. */ + TimetToFileTimeInterval(1, &ft); + second = FtToInt(&ft); + next_event += second / 2; + + cb = sizeof(wtime); + ft = IntToFt(next_event); + FtIntervalToString(&ft, + wtime, + &cb); + + if (fire_count == 1 && + eff_ident != NULL && + (eff_type == KHUI_TTYPE_ID_EXP || + eff_type == KHUI_TTYPE_ID_CRIT || + eff_type == KHUI_TTYPE_ID_WARN)) { + + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + + cb = sizeof(idname); + kcdb_identity_get_name(eff_ident, idname, &cb); + + if (next_event < second) { + LoadString(khm_hInstance, IDS_WARN_EXPIRED_ID, + fmt, ARRAYLENGTH(fmt)); + + StringCbPrintf(wmsg, sizeof(wmsg), fmt, idname); + } else { + LoadString(khm_hInstance, IDS_WARN_EXPIRE_ID, + fmt, ARRAYLENGTH(fmt)); + + StringCbPrintf(wmsg, sizeof(wmsg), fmt, idname, wtime); + } + } else { + if (next_event < second) { + LoadString(khm_hInstance, IDS_WARN_EXPIRED, + wmsg, ARRAYLENGTH(wmsg)); + } else { + LoadString(khm_hInstance, IDS_WARN_EXPIRE, + fmt, ARRAYLENGTH(fmt)); + + StringCbPrintf(wmsg, sizeof(wmsg), fmt, wtime); + } + } + + LoadString(khm_hInstance, IDS_WARN_TITLE, + wtitle, ARRAYLENGTH(wtitle)); + + khui_alert_create_simple(wtitle, wmsg, KHERR_WARNING, &alert); + khui_alert_set_flags(alert, KHUI_ALERT_FLAG_REQUEST_BALLOON, + KHUI_ALERT_FLAG_REQUEST_BALLOON); + khui_alert_show(alert); + khui_alert_release(alert); + } +} + +void +khm_timer_fire(HWND hwnd) { + EnterCriticalSection(&cs_timers); + tmr_fire_timer(); + LeaveCriticalSection(&cs_timers); + + khm_timer_refresh(hwnd); +} + +static int +tmr_update(khm_handle key, khui_timer_type type, __int64 expire, + __int64 offset, void * data, khm_boolean reinstate) { + int i; + + for (i=0; i < (int) khui_n_timers; i++) { + if (khui_timers[i].key == key && + khui_timers[i].type == type) + break; + } + + if (i >= (int) khui_n_timers) { + i = (int) khui_n_timers; + + if (i >= (int) khui_nc_timers) { + khui_timer_event * nt; +#ifdef DEBUG + assert(khui_timers); +#endif + khui_nc_timers = UBOUNDSS(i+1, KHUI_TIMER_ALLOC_INCR, + KHUI_TIMER_ALLOC_INCR); + nt = PMALLOC(sizeof(*nt) * khui_nc_timers); +#ifdef DEBUG + assert(nt); +#endif + memcpy(nt, khui_timers, sizeof(*nt) * khui_n_timers); + + PFREE(khui_timers); + khui_timers = nt; + } + + khui_timers[i].key = key; + khui_timers[i].type = type; + khui_timers[i].flags = 0; + khui_n_timers++; + } + + khui_timers[i].expire = expire; + khui_timers[i].offset = offset; + khui_timers[i].data = data; + + khui_timers[i].flags &= ~KHUI_TE_FLAG_STALE; + if (reinstate) + khui_timers[i].flags &= ~KHUI_TE_FLAG_EXPIRED; + + return i; +} + +/* called with cs_timers held */ +static int +tmr_find(khm_handle key, khui_timer_type type, + khm_int32 and_flags, khm_int32 eq_flags) { + int i; + + eq_flags &= and_flags; + + for (i=0; i < (int) khui_n_timers; i++) { + if (khui_timers[i].key == key && + khui_timers[i].type == type && + (khui_timers[i].flags & and_flags) == eq_flags) + break; + } + + if (i < (int) khui_n_timers) + return i; + else + return -1; +} + +/* called with cs_timers held. */ +static FILETIME +tmr_next_halflife_timeout(int idx, FILETIME * issue, FILETIME * expire) { + FILETIME lifetime; + FILETIME current; + FILETIME ret; + + khm_int64 ilife; + khm_int64 icurrent; + khm_int64 iexpire; + + khm_int64 iret; + + GetSystemTimeAsFileTime(¤t); + + /* wha?? */ + if (CompareFileTime(issue, expire) >= 0) + return current; + + lifetime = FtSub(expire, issue); + icurrent = FtToInt(¤t); + iexpire = FtToInt(expire); + + ilife = FtToInt(&lifetime); + + while(ilife / 2 > FT_MIN_HALFLIFE_INTERVAL) { + ilife /= 2; + + /* is this the next renewal time? */ + if (iexpire - ilife > icurrent) { + if (idx >= 0 && + khui_timers[idx].expire == iexpire - ilife && + (khui_timers[idx].flags & KHUI_TE_FLAG_EXPIRED)) { + + /* if this renewal time has already been triggered + (note that when the timer fires, it also fires all + events that are within a few seconds of the current + time) then we need to set the alarm for the next + slot down the line. */ + + continue; + + } else { + break; + } + } + } + + iret = iexpire - ilife; + + ret = IntToFt(iret); + + /* if the previous renew timer had fired, we need to mark it as + not expired. However, we leave it to the caller to update the + actual timer and mark it as not stale. */ + if (idx >= 0 && + khui_timers[idx].expire < (khm_ui_8) iret) { + + khui_timers[idx].flags &= ~KHUI_TE_FLAG_EXPIRED; + khui_timers[idx].expire = iret; + } + + return ret; +} + +/* called with cs_timers held */ +static khm_int32 KHMAPI +tmr_cred_apply_proc(khm_handle cred, void * rock) { + khm_handle ident = NULL; + int mark_idx; + int idx; + FILETIME ft_expiry; + FILETIME ft_current; + FILETIME ft_creinst; + FILETIME ft_cred_expiry; + FILETIME ft_cred_issue; + FILETIME ft_issue; + FILETIME ft; + FILETIME fte; + FILETIME ft_reinst; + khm_size cb; + + kcdb_cred_get_identity(cred, &ident); +#ifdef DEBUG + assert(ident); +#endif + + /* now get the expiry */ + cb = sizeof(ft_expiry); + if (KHM_FAILED(kcdb_identity_get_attr(ident, KCDB_ATTR_EXPIRE, + NULL, + &ft_expiry, &cb))) { + cb = sizeof(ft_expiry); + if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_EXPIRE, + NULL, + &ft_expiry, &cb))) { + /* we don't have an expiry time to work with */ + kcdb_identity_release(ident); + return KHM_ERROR_SUCCESS; + } + } + + cb = sizeof(ft_issue); + if (KHM_FAILED(kcdb_identity_get_attr(ident, KCDB_ATTR_ISSUE, + NULL, + &ft_issue, &cb))) { + cb = sizeof(ft_issue); + if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_ISSUE, + NULL, + &ft_issue, &cb))) { + /* we don't really abandon the timer. In this case, we + fall back to using the threshold value to set the + expiry timer. */ + ZeroMemory(&ft_issue, sizeof(ft_issue)); + } + } + + /* and the current time */ + GetSystemTimeAsFileTime(&ft_current); + + TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR, &ft_reinst); + + ft_creinst = FtAdd(&ft_current, &ft_reinst); + + mark_idx = tmr_find(ident, KHUI_TTYPE_ID_MARK, 0, 0); + + if (mark_idx < 0) { + mark_idx = tmr_update(ident, KHUI_TTYPE_ID_MARK, 0, 0, 0, FALSE); + kcdb_identity_hold(ident); +#ifdef DEBUG + assert(mark_idx >= 0); +#endif + khui_timers[mark_idx].flags |= KHUI_TE_FLAG_STALE; + } + + if (khui_timers[mark_idx].flags & KHUI_TE_FLAG_STALE) { + /* first time we are touching this */ + khm_handle csp_cw = NULL; + khm_handle csp_id = NULL; + khm_int32 rv; + khm_int32 t; + khm_boolean do_warn = TRUE; + khm_boolean do_crit = TRUE; + khm_boolean do_renew = TRUE; + khm_boolean do_halflife = TRUE; + khm_boolean renew_done = FALSE; + khm_boolean monitor = TRUE; + khm_int32 to_warn = KHUI_DEF_TIMEOUT_WARN; + khm_int32 to_crit = KHUI_DEF_TIMEOUT_CRIT; + khm_int32 to_renew = KHUI_DEF_TIMEOUT_RENEW; + + if (CompareFileTime(&ft_expiry, &ft_current) < 0) + /* already expired */ + goto _done_with_ident; + + rv = khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, + &csp_cw); + + assert(KHM_SUCCEEDED(rv)); + + rv = kcdb_identity_get_config(ident, KHM_PERM_READ, &csp_id); + if (KHM_SUCCEEDED(rv)) { + khc_shadow_space(csp_id, csp_cw); + khc_close_space(csp_cw); + } else { + csp_id = csp_cw; + } + csp_cw = NULL; + + rv = khc_read_int32(csp_id, L"Monitor", &t); + if (KHM_SUCCEEDED(rv)) + monitor = t; + + rv = khc_read_int32(csp_id, L"AllowWarn", &t); + if (KHM_SUCCEEDED(rv)) + do_warn = t; + + rv = khc_read_int32(csp_id, L"AllowCritical", &t); + if (KHM_SUCCEEDED(rv)) + do_crit = t; + + rv = khc_read_int32(csp_id, L"AllowAutoRenew", &t); + if (KHM_SUCCEEDED(rv)) + do_renew = t; + + rv = khc_read_int32(csp_id, L"RenewAtHalfLife", &t); + if (KHM_SUCCEEDED(rv)) + do_halflife = t; + + rv = khc_read_int32(csp_id, L"WarnThreshold", &t); + if (KHM_SUCCEEDED(rv)) + to_warn = t; + + rv = khc_read_int32(csp_id, L"CriticalThreshold", &t); + if (KHM_SUCCEEDED(rv)) + to_crit = t; + + rv = khc_read_int32(csp_id, L"AutoRenewThreshold", &t); + if (KHM_SUCCEEDED(rv)) + to_renew = t; + + khc_close_space(csp_id); + + if (monitor && do_renew) { + int prev; + + TimetToFileTimeInterval(to_renew, &ft); + + prev = + tmr_find(ident, KHUI_TTYPE_ID_RENEW, 0, 0); + + if (do_halflife) + fte = tmr_next_halflife_timeout(prev, &ft_issue, &ft_expiry); + else + fte = FtSub(&ft_expiry, &ft); + + /* we set off a renew notification immediately if the + renew threshold has passed but a renew was never sent. + This maybe because that NetIDMgr was started at the + last minute, or because for some reason the renew timer + could not be triggered earlier. */ + + if (CompareFileTime(&fte, &ft_current) > 0 || + prev == -1 || + !(khui_timers[prev].flags & KHUI_TE_FLAG_EXPIRED)) { + + if (CompareFileTime(&fte, &ft_current) < 0) + fte = ft_current; + + tmr_update(ident, KHUI_TTYPE_ID_RENEW, + FtToInt(&fte), FtToInt(&ft), 0, + CompareFileTime(&fte,&ft_creinst) > 0); + renew_done = TRUE; + + } else { + + /* special case. If the renew timer was in the past + and it was expired, then we retain the record as + long as the credentials are around. If the renewal + failed we don't want to automatically retry + everytime we check the timers. */ + + tmr_update(ident, KHUI_TTYPE_ID_RENEW, + FtToInt(&fte), FtToInt(&ft), 0, FALSE); + + } + } + + if (monitor && do_warn && !renew_done) { + + TimetToFileTimeInterval(to_warn, &ft); + fte = FtSub(&ft_expiry, &ft); + + if (CompareFileTime(&fte, &ft_current) > 0) + tmr_update(ident, KHUI_TTYPE_ID_WARN, + FtToInt(&fte), FtToInt(&ft), 0, + CompareFileTime(&fte, &ft_creinst) > 0); + } + + if (monitor && do_crit && !renew_done) { + TimetToFileTimeInterval(to_crit, &ft); + fte = FtSub(&ft_expiry, &ft); + + if (CompareFileTime(&fte, &ft_current) > 0) + tmr_update(ident, KHUI_TTYPE_ID_CRIT, + FtToInt(&fte), FtToInt(&ft), 0, + CompareFileTime(&fte, &ft_creinst) > 0); + } + + if (monitor && !renew_done) { + if (CompareFileTime(&ft_expiry, &ft_current) > 0) + tmr_update(ident, KHUI_TTYPE_ID_EXP, + FtToInt(&ft_expiry), 0, 0, + CompareFileTime(&fte, &ft_creinst) > 0); + } + + _done_with_ident: + khui_timers[mark_idx].flags &= ~KHUI_TE_FLAG_STALE; + } + + cb = sizeof(ft_cred_expiry); + if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_EXPIRE, + NULL, + &ft_cred_expiry, + &cb))) + goto _cleanup; + + cb = sizeof(ft_cred_issue); + if (KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_ISSUE, + NULL, + &ft_cred_issue, + &cb))) + goto _cleanup; + + TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR, &ft); + + { + /* if the credential has a longer lifetime than the identity, + or it expires within KHUI_TIMEEQ_ERROR seconds of the + identity, then we don't need to set any alerts for this + credential. */ + + FILETIME ft_delta; + + ft_delta = FtSub(&ft_expiry, &ft_cred_expiry); + + if (CompareFileTime(&ft_cred_expiry, &ft_expiry) >= 0 || + CompareFileTime(&ft_delta, &ft) < 0) + goto _cleanup; + } + + if ((idx = tmr_find(ident, KHUI_TTYPE_ID_WARN, 0, 0)) >= 0 && + !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { + + fte = IntToFt(FtToInt(&ft_cred_expiry) - khui_timers[idx].offset); + if (CompareFileTime(&fte, &ft_current) > 0) { + tmr_update(cred, KHUI_TTYPE_CRED_WARN, + FtToInt(&fte), + khui_timers[idx].offset, 0, + CompareFileTime(&fte, &ft_creinst) > 0); + kcdb_cred_hold(cred); + } + } + + if ((idx = tmr_find(ident, KHUI_TTYPE_ID_CRIT, 0, 0)) >= 0 && + !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { + + fte = IntToFt(FtToInt(&ft_cred_expiry) - khui_timers[idx].offset); + if (CompareFileTime(&fte, &ft_current) > 0) { + tmr_update(cred, KHUI_TTYPE_CRED_CRIT, + FtToInt(&fte), + khui_timers[idx].offset, 0, + CompareFileTime(&fte, &ft_creinst) > 0); + kcdb_cred_hold(cred); + } + } + + if ((idx = tmr_find(ident, KHUI_TTYPE_ID_RENEW, 0, 0)) >= 0 && + !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { + + //fte = IntToFt(FtToInt(&ft_cred_expiry) - khui_timers[idx].offset); + fte = tmr_next_halflife_timeout(idx, &ft_cred_issue, &ft_cred_expiry); + + if (CompareFileTime(&fte, &ft_current) > 0) { + tmr_update(cred, KHUI_TTYPE_CRED_RENEW, + FtToInt(&fte), + khui_timers[idx].offset, 0, + CompareFileTime(&fte, &ft_creinst) > 0); + kcdb_cred_hold(cred); + } + } + + if ((idx = tmr_find(ident, KHUI_TTYPE_ID_EXP, 0, 0)) >= 0 && + !(khui_timers[idx].flags & KHUI_TE_FLAG_STALE)) { + + if (CompareFileTime(&ft_cred_expiry, &ft_current) > 0) { + tmr_update(cred, KHUI_TTYPE_CRED_EXP, + FtToInt(&ft_cred_expiry), + 0, 0, + CompareFileTime(&ft_cred_expiry, &ft_creinst) > 0); + } + } + + _cleanup: + + if (ident) + kcdb_identity_release(ident); + + return KHM_ERROR_SUCCESS; +} + +/* called with cs_timers held */ +static void +tmr_purge(void) { + int i, j; + + for (i=0,j=0; i < (int) khui_n_timers; i++) { + if (khui_timers[i].flags & KHUI_TE_FLAG_STALE) { + if (khui_timers[i].type == KHUI_TTYPE_ID_MARK) { + kcdb_identity_release(khui_timers[i].key); +#ifdef DEBUG + { + int idx; + + idx = tmr_find(khui_timers[i].key, + KHUI_TTYPE_ID_CRIT, 0, 0); + assert(idx < 0 || + (khui_timers[idx].flags & + KHUI_TE_FLAG_STALE)); + + idx = tmr_find(khui_timers[i].key, + KHUI_TTYPE_ID_RENEW, 0, 0); + assert(idx < 0 || + (khui_timers[idx].flags & + KHUI_TE_FLAG_STALE)); + + idx = tmr_find(khui_timers[i].key, + KHUI_TTYPE_ID_WARN, 0, 0); + assert(idx < 0 || + (khui_timers[idx].flags & + KHUI_TE_FLAG_STALE)); + + idx = tmr_find(khui_timers[i].key, + KHUI_TTYPE_ID_EXP, 0, 0); + assert(idx < 0 || + (khui_timers[idx].flags & + KHUI_TE_FLAG_STALE)); + } +#endif + } else if (khui_timers[i].type == KHUI_TTYPE_CRED_WARN || + khui_timers[i].type == KHUI_TTYPE_CRED_CRIT || + khui_timers[i].type == KHUI_TTYPE_CRED_RENEW || + khui_timers[i].type == KHUI_TTYPE_CRED_EXP) { + kcdb_cred_release(khui_timers[i].key); + } + } else { + if (i != j) + khui_timers[j] = khui_timers[i]; + j++; + } + } + + khui_n_timers = j; +} + +/* go through all the credentials and set timers as appropriate. */ +void +khm_timer_refresh(HWND hwnd) { + int i; + unsigned __int64 next_event = 0; + unsigned __int64 curtime; + unsigned __int64 diff; + + EnterCriticalSection(&cs_timers); + + KillTimer(hwnd, KHUI_TRIGGER_TIMER_ID); + + /* When refreshing timers, we go through all of them and mark them + as stale. Then we go through the credentials in the root + credential set and add or refresh the timers associated with + each identity and credential. Once this is done, we remove the + timers that are still stale, since they are no longer in + use. */ + + for (i=0; i < (int) khui_n_timers; i++) { +#ifdef NOT_IMPLEMENTED_YET + if (khui_timers[i].type == KHUI_TTYPE_BMSG || + khui_timers[i].type == KHUI_TTYPE_SMSG) { + khui_timers[i].flags &= ~KHUI_TE_FLAG_STALE; + } else { +#endif + + khui_timers[i].flags |= KHUI_TE_FLAG_STALE; + +#ifdef NOT_IMPLEMENTED_YET + } +#endif + } + + kcdb_credset_apply(NULL, + tmr_cred_apply_proc, + NULL); + + tmr_purge(); + + _check_next_event: + + /* Before we return, we should check if any timers are set to + expire right now. If there are, we should fire the timer + before returning. */ + + next_event = 0; + for (i=0; i < (int) khui_n_timers; i++) { + if (!(khui_timers[i].flags & KHUI_TE_FLAG_EXPIRED) && + khui_timers[i].type != KHUI_TTYPE_ID_MARK && + (next_event == 0 || + next_event > khui_timers[i].expire)) + + next_event = khui_timers[i].expire; + } + + if (next_event != 0) { + FILETIME ft; + + GetSystemTimeAsFileTime(&ft); + curtime = FtToInt(&ft); + + TimetToFileTimeInterval(KHUI_TIMEEQ_ERROR_SMALL, &ft); + diff = FtToInt(&ft); + + if (curtime + diff > next_event) { + tmr_fire_timer(); + goto _check_next_event; + } else { + diff = next_event - curtime; + ft = IntToFt(diff); + SetTimer(hwnd, + KHUI_TRIGGER_TIMER_ID, + FtIntervalToMilliseconds(&ft), + NULL); + } + } + + LeaveCriticalSection(&cs_timers); +} --- krb5-1.4.4.orig/src/windows/identity/ui/cfg_general_wnd.c +++ krb5-1.4.4/src/windows/identity/ui/cfg_general_wnd.c @@ -1,345 +1,345 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -typedef struct tag_cfg_data { - BOOL auto_init; - BOOL auto_start; - BOOL auto_import; - BOOL keep_running; - BOOL auto_detect_net; - BOOL log_to_file; - BOOL destroy_creds; -} cfg_data; - -typedef struct tag_dlg_data { - khui_config_node node; - cfg_data saved; - cfg_data work; -} dlg_data; - -static void -read_params(dlg_data * dd) { - cfg_data * d; - khm_handle csp_cw; - khm_int32 t; - - d = &dd->saved; - - if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, - &csp_cw))) { -#ifdef DEBUG - assert(FALSE); -#endif - return; - } - - khc_read_int32(csp_cw, L"AutoInit", &t); - d->auto_init = !!t; - - khc_read_int32(csp_cw, L"AutoStart", &t); - d->auto_start = !!t; - - khc_read_int32(csp_cw, L"AutoImport", &t); - d->auto_import = !!t; - - khc_read_int32(csp_cw, L"KeepRunning", &t); - d->keep_running = !!t; - - khc_read_int32(csp_cw, L"AutoDetectNet", &t); - d->auto_detect_net = !!t; - - khc_read_int32(csp_cw, L"LogToFile", &t); - d->log_to_file = !!t; - - khc_read_int32(csp_cw, L"DestroyCredsOnExit", &t); - d->destroy_creds = !!t; - - khc_close_space(csp_cw); - - dd->work = *d; -} - -static void -write_params(dlg_data * dd) { - cfg_data * d, * s; - khm_handle csp_cw; - BOOL applied = FALSE; - - d = &dd->work; - s = &dd->saved; - - if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_WRITE, - &csp_cw))) { -#ifdef DEBUG - assert(FALSE); -#endif - return; - } - - if (!!d->auto_init != !!s->auto_init) { - khc_write_int32(csp_cw, L"AutoInit", d->auto_init); - applied = TRUE; - } - - if (!!d->auto_start != !!s->auto_start) { - khc_write_int32(csp_cw, L"AutoStart", d->auto_start); - applied = TRUE; - } - - if (!!d->auto_import != !!s->auto_import) { - khc_write_int32(csp_cw, L"AutoImport", d->auto_import); - applied = TRUE; - } - - if (!!d->keep_running != !!s->keep_running) { - khc_write_int32(csp_cw, L"KeepRunning", d->keep_running); - applied = TRUE; - } - - if (!!d->auto_detect_net != !!s->auto_detect_net) { - khc_write_int32(csp_cw, L"AutoDetectNet", d->auto_detect_net); - applied = TRUE; - } - - if (!!d->log_to_file != !!s->log_to_file) { - khc_write_int32(csp_cw, L"LogToFile", d->log_to_file); - applied = TRUE; - - if (d->log_to_file) { - khm_start_file_log(); - } else { - khm_stop_file_log(); - } - } - - if (!!d->destroy_creds != !!s->destroy_creds) { - khc_write_int32(csp_cw, L"DestroyCredsOnExit", d->destroy_creds); - applied = TRUE; - } - - khc_close_space(csp_cw); - - khui_cfg_set_flags(dd->node, - (applied) ? KHUI_CNFLAG_APPLIED : 0, - KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); - - *s = *d; -} - -static void -check_for_modification(dlg_data * dd) { - cfg_data * d, * s; - d = &dd->work; - s = &dd->saved; - - if (!!d->auto_init != !!s->auto_init || - !!d->auto_start != !!s->auto_start || - !!d->auto_import != !!s->auto_import || - !!d->keep_running != !!s->keep_running || - !!d->auto_detect_net != !!s->auto_detect_net || - !!d->log_to_file != !!s->log_to_file || - !!d->destroy_creds != !!s->destroy_creds) { - - khui_cfg_set_flags(dd->node, - KHUI_CNFLAG_MODIFIED, - KHUI_CNFLAG_MODIFIED); - - } else { - - khui_cfg_set_flags(dd->node, - 0, - KHUI_CNFLAG_MODIFIED); - - } -} - -static void -refresh_view(HWND hwnd, dlg_data * d) { - wchar_t buf[512]; - - CheckDlgButton(hwnd, IDC_CFG_AUTOINIT, - (d->work.auto_init?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_AUTOSTART, - (d->work.auto_start?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_AUTOIMPORT, - (d->work.auto_import?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_KEEPRUNNING, - (d->work.keep_running?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_NETDETECT, - (d->work.auto_detect_net?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_LOGTOFILE, - (d->work.log_to_file?BST_CHECKED:BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_DESTROYALL, - (d->work.destroy_creds?BST_CHECKED:BST_UNCHECKED)); - - /* in addition, we correct the label on the trace log control to - reflect the actual path that is going to get used */ - if (GetDlgItemText(hwnd, IDC_CFG_LOGPATH, buf, - ARRAYLENGTH(buf)) == 0) { - - khm_get_file_log_path(sizeof(buf), buf); - - SetDlgItemText(hwnd, IDC_CFG_LOGPATH, buf); - } -} - -static void -refresh_data(HWND hwnd, dlg_data * d) { - d->work.auto_init = (IsDlgButtonChecked(hwnd, IDC_CFG_AUTOINIT) - == BST_CHECKED); - d->work.auto_start = (IsDlgButtonChecked(hwnd, IDC_CFG_AUTOSTART) - == BST_CHECKED); - d->work.auto_import = (IsDlgButtonChecked(hwnd, IDC_CFG_AUTOIMPORT) - == BST_CHECKED); - d->work.keep_running = (IsDlgButtonChecked(hwnd, IDC_CFG_KEEPRUNNING) - == BST_CHECKED); - d->work.auto_detect_net = (IsDlgButtonChecked(hwnd, IDC_CFG_NETDETECT) - == BST_CHECKED); - d->work.log_to_file = (IsDlgButtonChecked(hwnd, IDC_CFG_LOGTOFILE) - == BST_CHECKED); - d->work.destroy_creds = (IsDlgButtonChecked(hwnd, IDC_CFG_DESTROYALL) - == BST_CHECKED); -} - -INT_PTR CALLBACK -khm_cfg_general_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - dlg_data * d; - - switch(uMsg) { - case WM_INITDIALOG: - d = PMALLOC(sizeof(*d)); -#ifdef DEBUG - assert(d != NULL); -#endif - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); -#pragma warning(pop) - - ZeroMemory(d, sizeof(*d)); - - d->node = (khui_config_node) lParam; - - read_params(d); - - refresh_view(hwnd, d); - - return FALSE; - - case WM_DESTROY: - d = (dlg_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - if (d) { - PFREE(d); - } - return TRUE; - - case WM_COMMAND: - d = (dlg_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - - if (HIWORD(wParam) == BN_CLICKED) { - if (LOWORD(wParam) == IDC_CFG_SHOWLOG) { - /* we need to display the logfile */ - wchar_t buf[512]; - - buf[0] = L'\0'; - khm_get_file_log_path(sizeof(buf), buf); - - if (!buf[0] || - !PathFileExists(buf)) { - - wchar_t title[256]; - wchar_t msg[550]; - wchar_t fmt[256]; - - LoadString(khm_hInstance, IDS_CFG_LOGF_CS, - title, ARRAYLENGTH(title)); - LoadString(khm_hInstance, IDS_CFG_LOGF_CSR, - fmt, ARRAYLENGTH(fmt)); - - StringCbPrintf(msg, sizeof(msg), fmt, buf); - - MessageBox(hwnd, title, msg, MB_OK); - - } else { - wchar_t cmdline[550]; - STARTUPINFO si; - PROCESS_INFORMATION pi; - - StringCbCopy(cmdline, sizeof(cmdline), L"notepad.exe "); - StringCbCat(cmdline, sizeof(cmdline), L"\""); - StringCbCat(cmdline, sizeof(cmdline), buf); - StringCbCat(cmdline, sizeof(cmdline), L"\""); - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - ZeroMemory(&pi, sizeof(pi)); - - CreateProcess(NULL, - cmdline, - NULL, NULL, - FALSE, - 0, NULL, NULL, - &si, - &pi); - - if (pi.hProcess) - CloseHandle(pi.hProcess); - if (pi.hThread) - CloseHandle(pi.hThread); - - } - } else { - refresh_data(hwnd, d); - check_for_modification(d); - } - } - - khm_set_dialog_result(hwnd, 0); - - return TRUE; - - case KHUI_WM_CFG_NOTIFY: - d = (dlg_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - - if (HIWORD(wParam) == WMCFG_APPLY) { - write_params(d); - } - - khm_set_dialog_result(hwnd, 0); - - return TRUE; - } - - return FALSE; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +typedef struct tag_cfg_data { + BOOL auto_init; + BOOL auto_start; + BOOL auto_import; + BOOL keep_running; + BOOL auto_detect_net; + BOOL log_to_file; + BOOL destroy_creds; +} cfg_data; + +typedef struct tag_dlg_data { + khui_config_node node; + cfg_data saved; + cfg_data work; +} dlg_data; + +static void +read_params(dlg_data * dd) { + cfg_data * d; + khm_handle csp_cw; + khm_int32 t; + + d = &dd->saved; + + if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, + &csp_cw))) { +#ifdef DEBUG + assert(FALSE); +#endif + return; + } + + khc_read_int32(csp_cw, L"AutoInit", &t); + d->auto_init = !!t; + + khc_read_int32(csp_cw, L"AutoStart", &t); + d->auto_start = !!t; + + khc_read_int32(csp_cw, L"AutoImport", &t); + d->auto_import = !!t; + + khc_read_int32(csp_cw, L"KeepRunning", &t); + d->keep_running = !!t; + + khc_read_int32(csp_cw, L"AutoDetectNet", &t); + d->auto_detect_net = !!t; + + khc_read_int32(csp_cw, L"LogToFile", &t); + d->log_to_file = !!t; + + khc_read_int32(csp_cw, L"DestroyCredsOnExit", &t); + d->destroy_creds = !!t; + + khc_close_space(csp_cw); + + dd->work = *d; +} + +static void +write_params(dlg_data * dd) { + cfg_data * d, * s; + khm_handle csp_cw; + BOOL applied = FALSE; + + d = &dd->work; + s = &dd->saved; + + if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_WRITE, + &csp_cw))) { +#ifdef DEBUG + assert(FALSE); +#endif + return; + } + + if (!!d->auto_init != !!s->auto_init) { + khc_write_int32(csp_cw, L"AutoInit", d->auto_init); + applied = TRUE; + } + + if (!!d->auto_start != !!s->auto_start) { + khc_write_int32(csp_cw, L"AutoStart", d->auto_start); + applied = TRUE; + } + + if (!!d->auto_import != !!s->auto_import) { + khc_write_int32(csp_cw, L"AutoImport", d->auto_import); + applied = TRUE; + } + + if (!!d->keep_running != !!s->keep_running) { + khc_write_int32(csp_cw, L"KeepRunning", d->keep_running); + applied = TRUE; + } + + if (!!d->auto_detect_net != !!s->auto_detect_net) { + khc_write_int32(csp_cw, L"AutoDetectNet", d->auto_detect_net); + applied = TRUE; + } + + if (!!d->log_to_file != !!s->log_to_file) { + khc_write_int32(csp_cw, L"LogToFile", d->log_to_file); + applied = TRUE; + + if (d->log_to_file) { + khm_start_file_log(); + } else { + khm_stop_file_log(); + } + } + + if (!!d->destroy_creds != !!s->destroy_creds) { + khc_write_int32(csp_cw, L"DestroyCredsOnExit", d->destroy_creds); + applied = TRUE; + } + + khc_close_space(csp_cw); + + khui_cfg_set_flags(dd->node, + (applied) ? KHUI_CNFLAG_APPLIED : 0, + KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); + + *s = *d; +} + +static void +check_for_modification(dlg_data * dd) { + cfg_data * d, * s; + d = &dd->work; + s = &dd->saved; + + if (!!d->auto_init != !!s->auto_init || + !!d->auto_start != !!s->auto_start || + !!d->auto_import != !!s->auto_import || + !!d->keep_running != !!s->keep_running || + !!d->auto_detect_net != !!s->auto_detect_net || + !!d->log_to_file != !!s->log_to_file || + !!d->destroy_creds != !!s->destroy_creds) { + + khui_cfg_set_flags(dd->node, + KHUI_CNFLAG_MODIFIED, + KHUI_CNFLAG_MODIFIED); + + } else { + + khui_cfg_set_flags(dd->node, + 0, + KHUI_CNFLAG_MODIFIED); + + } +} + +static void +refresh_view(HWND hwnd, dlg_data * d) { + wchar_t buf[512]; + + CheckDlgButton(hwnd, IDC_CFG_AUTOINIT, + (d->work.auto_init?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_AUTOSTART, + (d->work.auto_start?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_AUTOIMPORT, + (d->work.auto_import?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_KEEPRUNNING, + (d->work.keep_running?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_NETDETECT, + (d->work.auto_detect_net?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_LOGTOFILE, + (d->work.log_to_file?BST_CHECKED:BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_DESTROYALL, + (d->work.destroy_creds?BST_CHECKED:BST_UNCHECKED)); + + /* in addition, we correct the label on the trace log control to + reflect the actual path that is going to get used */ + if (GetDlgItemText(hwnd, IDC_CFG_LOGPATH, buf, + ARRAYLENGTH(buf)) == 0) { + + khm_get_file_log_path(sizeof(buf), buf); + + SetDlgItemText(hwnd, IDC_CFG_LOGPATH, buf); + } +} + +static void +refresh_data(HWND hwnd, dlg_data * d) { + d->work.auto_init = (IsDlgButtonChecked(hwnd, IDC_CFG_AUTOINIT) + == BST_CHECKED); + d->work.auto_start = (IsDlgButtonChecked(hwnd, IDC_CFG_AUTOSTART) + == BST_CHECKED); + d->work.auto_import = (IsDlgButtonChecked(hwnd, IDC_CFG_AUTOIMPORT) + == BST_CHECKED); + d->work.keep_running = (IsDlgButtonChecked(hwnd, IDC_CFG_KEEPRUNNING) + == BST_CHECKED); + d->work.auto_detect_net = (IsDlgButtonChecked(hwnd, IDC_CFG_NETDETECT) + == BST_CHECKED); + d->work.log_to_file = (IsDlgButtonChecked(hwnd, IDC_CFG_LOGTOFILE) + == BST_CHECKED); + d->work.destroy_creds = (IsDlgButtonChecked(hwnd, IDC_CFG_DESTROYALL) + == BST_CHECKED); +} + +INT_PTR CALLBACK +khm_cfg_general_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + dlg_data * d; + + switch(uMsg) { + case WM_INITDIALOG: + d = PMALLOC(sizeof(*d)); +#ifdef DEBUG + assert(d != NULL); +#endif + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); +#pragma warning(pop) + + ZeroMemory(d, sizeof(*d)); + + d->node = (khui_config_node) lParam; + + read_params(d); + + refresh_view(hwnd, d); + + return FALSE; + + case WM_DESTROY: + d = (dlg_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + if (d) { + PFREE(d); + } + return TRUE; + + case WM_COMMAND: + d = (dlg_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + + if (HIWORD(wParam) == BN_CLICKED) { + if (LOWORD(wParam) == IDC_CFG_SHOWLOG) { + /* we need to display the logfile */ + wchar_t buf[512]; + + buf[0] = L'\0'; + khm_get_file_log_path(sizeof(buf), buf); + + if (!buf[0] || + !PathFileExists(buf)) { + + wchar_t title[256]; + wchar_t msg[550]; + wchar_t fmt[256]; + + LoadString(khm_hInstance, IDS_CFG_LOGF_CS, + title, ARRAYLENGTH(title)); + LoadString(khm_hInstance, IDS_CFG_LOGF_CSR, + fmt, ARRAYLENGTH(fmt)); + + StringCbPrintf(msg, sizeof(msg), fmt, buf); + + MessageBox(hwnd, title, msg, MB_OK); + + } else { + wchar_t cmdline[550]; + STARTUPINFO si; + PROCESS_INFORMATION pi; + + StringCbCopy(cmdline, sizeof(cmdline), L"notepad.exe "); + StringCbCat(cmdline, sizeof(cmdline), L"\""); + StringCbCat(cmdline, sizeof(cmdline), buf); + StringCbCat(cmdline, sizeof(cmdline), L"\""); + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + CreateProcess(NULL, + cmdline, + NULL, NULL, + FALSE, + 0, NULL, NULL, + &si, + &pi); + + if (pi.hProcess) + CloseHandle(pi.hProcess); + if (pi.hThread) + CloseHandle(pi.hThread); + + } + } else { + refresh_data(hwnd, d); + check_for_modification(d); + } + } + + khm_set_dialog_result(hwnd, 0); + + return TRUE; + + case KHUI_WM_CFG_NOTIFY: + d = (dlg_data *) (DWORD_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + + if (HIWORD(wParam) == WMCFG_APPLY) { + write_params(d); + } + + khm_set_dialog_result(hwnd, 0); + + return TRUE; + } + + return FALSE; +} --- krb5-1.4.4.orig/src/windows/identity/ui/cfg_identities_wnd.c +++ krb5-1.4.4/src/windows/identity/ui/cfg_identities_wnd.c @@ -1,1263 +1,1263 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -static khui_config_node -get_window_node(HWND hwnd) { - return (khui_config_node) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); -} - -static void -set_window_node(HWND hwnd, khui_config_node node) { -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, - (LONG_PTR) node); -#pragma warning(pop) -} - -static void -add_subpanels(HWND hwnd, - khui_config_node ctx_node, - khui_config_node ref_node) { - - HWND hw_tab; - HWND hw_target; - khui_config_node sub; - khui_config_node_reg reg; - khui_config_init_data idata; - int idx; - - hw_tab = GetDlgItem(hwnd, IDC_CFG_TAB); - hw_target = GetDlgItem(hwnd, IDC_CFG_TARGET); -#ifdef DEBUG - assert(hw_tab); - assert(hw_target); -#endif - - if (KHM_FAILED(khui_cfg_get_first_subpanel(ref_node, &sub))) { -#ifdef DEBUG - assert(FALSE); -#endif - return; - } - - idx = 0; - while(sub) { - HWND hwnd_panel; - TCITEM tci; - int iid; - - khui_cfg_get_reg(sub, ®); - - if ((ctx_node == ref_node && (reg.flags & KHUI_CNFLAG_PLURAL)) || - (ctx_node != ref_node && !(reg.flags & KHUI_CNFLAG_PLURAL))) - goto _next_node; - - idata.ctx_node = ctx_node; - idata.this_node = sub; - idata.ref_node = ref_node; - - hwnd_panel = CreateDialogParam(reg.h_module, - reg.dlg_template, - hwnd, - reg.dlg_proc, - (LPARAM) &idata); - -#ifdef DEBUG - assert(hwnd_panel); -#endif - - ShowWindow(hwnd_panel, SW_HIDE); - - ZeroMemory(&tci, sizeof(tci)); - - tci.mask = TCIF_PARAM | TCIF_TEXT; - tci.lParam = (LPARAM) sub; - tci.pszText = (LPWSTR) reg.short_desc; - - iid = TabCtrl_InsertItem(hw_tab, 0, &tci); - idx++; - - if (reg.flags & KHUI_CNFLAG_PLURAL) { - khui_cfg_set_param_inst(sub, ctx_node, iid); - khui_cfg_set_hwnd_inst(sub, ctx_node, hwnd_panel); - } else { - khui_cfg_set_param(sub, iid); - khui_cfg_set_hwnd(sub, hwnd_panel); - } - - _next_node: - - khui_cfg_get_next_release(&sub); - } - - TabCtrl_SetCurSel(hw_tab, 0); -} - -static void -apply_all(HWND hwnd, - HWND hw_tab, - khui_config_node noderef) { - TCITEM tci; - HWND hw; - khui_config_node_reg reg; - int idx; - int count; - - count = TabCtrl_GetItemCount(hw_tab); - - for (idx = 0; idx < count; idx++) { - - ZeroMemory(&tci, sizeof(tci)); - - tci.mask = TCIF_PARAM; - TabCtrl_GetItem(hw_tab, - idx, - &tci); - -#ifdef DEBUG - assert(tci.lParam); -#endif - khui_cfg_get_reg((khui_config_node) tci.lParam, ®); - if (reg.flags & KHUI_CNFLAG_PLURAL) - hw = khui_cfg_get_hwnd_inst((khui_config_node) tci.lParam, - noderef); - else - hw = khui_cfg_get_hwnd((khui_config_node) tci.lParam); -#ifdef DEBUG - assert(hw); -#endif - - SendMessage(hw, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(0, WMCFG_APPLY), 0); - } -} - -static void -show_tab_panel(HWND hwnd, - khui_config_node node, - HWND hw_tab, - int idx, - BOOL show) { - TCITEM tci; - HWND hw; - HWND hw_target; - HWND hw_firstctl; - RECT r; - RECT rref; - khui_config_node_reg reg; - - ZeroMemory(&tci, sizeof(tci)); - - tci.mask = TCIF_PARAM; - TabCtrl_GetItem(hw_tab, - idx, - &tci); - -#ifdef DEBUG - assert(tci.lParam); -#endif - khui_cfg_get_reg((khui_config_node) tci.lParam, ®); - if (reg.flags & KHUI_CNFLAG_PLURAL) - hw = khui_cfg_get_hwnd_inst((khui_config_node) tci.lParam, - node); - else - hw = khui_cfg_get_hwnd((khui_config_node) tci.lParam); -#ifdef DEBUG - assert(hw); -#endif - - if (!show) { - ShowWindow(hw, SW_HIDE); - return; - } - - hw_target = GetDlgItem(hwnd, IDC_CFG_TARGET); -#ifdef DEBUG - assert(hw_target); -#endif - GetWindowRect(hwnd, &rref); - GetWindowRect(hw_target, &r); - - OffsetRect(&r, -rref.left, -rref.top); - - SetWindowPos(hw, - hw_tab, - r.left, r.top, - r.right - r.left, r.bottom - r.top, - SWP_NOACTIVATE | SWP_NOOWNERZORDER | - SWP_SHOWWINDOW); - - hw_firstctl = GetNextDlgTabItem(hw, NULL, FALSE); - if (hw_firstctl) { - SetFocus(hw_firstctl); - } -} - -static INT_PTR -handle_cfg_notify(HWND hwnd, - WPARAM wParam, - LPARAM lParam) { - khui_config_node node; - HWND hw; - - node = get_window_node(hwnd); - - if (HIWORD(wParam) == WMCFG_APPLY) { - - hw = GetDlgItem(hwnd, IDC_CFG_TAB); - - apply_all(hwnd, - hw, - node); - } - - return TRUE; -} - -static INT_PTR -handle_notify(HWND hwnd, - WPARAM wParam, - LPARAM lParam) { - LPNMHDR lpnm; - int i; - - - khui_config_node node; - - lpnm = (LPNMHDR) lParam; - node = get_window_node(hwnd); - - if (lpnm->idFrom == IDC_CFG_TAB) { - switch(lpnm->code) { - case TCN_SELCHANGING: - i = TabCtrl_GetCurSel(lpnm->hwndFrom); - - show_tab_panel(hwnd, - node, - lpnm->hwndFrom, - i, - FALSE); - break; - - case TCN_SELCHANGE: - i = TabCtrl_GetCurSel(lpnm->hwndFrom); - - show_tab_panel(hwnd, - node, - lpnm->hwndFrom, - i, - TRUE); - break; - } - return TRUE; - } else { - return FALSE; - } -} - -typedef struct tag_ident_props { - BOOL monitor; - BOOL auto_renew; - BOOL sticky; -} ident_props; - -typedef struct tag_ident_data { - khm_handle ident; - wchar_t * idname; - int lv_idx; - - BOOL removed; - BOOL applied; - - khm_int32 flags; - - ident_props saved; - ident_props work; - - HWND hwnd; -} ident_data; - -typedef struct tag_global_props { - BOOL monitor; - BOOL auto_renew; - BOOL sticky; -} global_props; - -typedef struct tag_idents_data { - BOOL valid; - - ident_data * idents; - khm_size n_idents; - khm_size nc_idents; - - /* global options */ - global_props saved; - global_props work; - BOOL applied; - - int refcount; - - HIMAGELIST hi_status; - int idx_id; - int idx_default; - int idx_modified; - int idx_applied; - int idx_deleted; - - HWND hwnd; - khui_config_init_data cfg; -} idents_data; - -static idents_data cfg_idents = {FALSE, NULL, 0, 0, - {0, 0, 0}, - {0, 0, 0}, - FALSE, - - 0, NULL }; - -static void -read_params_ident(ident_data * d) { - khm_handle csp_ident; - khm_handle csp_cw; - khm_int32 t; - - if (KHM_FAILED(kcdb_identity_get_config(d->ident, - KHM_PERM_READ, - &csp_ident))) { - csp_ident = NULL; - } - - if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, - &csp_cw))) { - if (csp_ident) { - khc_shadow_space(csp_ident, - csp_cw); - khc_close_space(csp_cw); - } else { - csp_ident = csp_cw; - } - csp_cw = NULL; - } else { -#ifdef DEBUG - assert(FALSE); -#endif - d->saved.monitor = TRUE; - d->saved.auto_renew = TRUE; - d->saved.sticky = FALSE; - d->work = d->saved; - - if (csp_ident) - khc_close_space(csp_ident); - - return; - } - - if (KHM_FAILED(khc_read_int32(csp_ident, L"Monitor", &t))) { -#ifdef DEBUG - assert(FALSE); -#endif - d->saved.monitor = TRUE; - } else { - d->saved.monitor = !!t; - } - - if (KHM_FAILED(khc_read_int32(csp_ident, L"AllowAutoRenew", &t))) { -#ifdef DEBUG - assert(FALSE); -#endif - d->saved.auto_renew = TRUE; - } else { - d->saved.auto_renew = !!t; - } - - if (KHM_FAILED(khc_read_int32(csp_ident, L"Sticky", &t))) { - d->saved.sticky = FALSE; - } else { - d->saved.sticky = !!t; - } - - khc_close_space(csp_ident); - - d->work = d->saved; - d->applied = FALSE; -} - -static void -write_params_ident(ident_data * d) { - khm_handle csp_ident; - - if (d->saved.monitor == d->work.monitor && - d->saved.auto_renew == d->work.auto_renew && - d->saved.sticky == d->work.sticky && - !d->removed) - return; - - if (KHM_FAILED(kcdb_identity_get_config(d->ident, KHM_PERM_WRITE, - &csp_ident))) { -#ifdef DEBUG - assert(FALSE); -#endif - return; - } - - if (d->removed) { - khm_handle h = NULL; - - khc_remove_space(csp_ident); - - /* calling kcdb_identity_get_config() will update the - KCDB_IDENT_FLAG_CONFIG flag for the identity to reflect the - fact that it nolonger has a configuration. */ - kcdb_identity_get_config(d->ident, 0, &h); - if (h) { - /* what the ? */ -#ifdef DEBUG - assert(FALSE); -#endif - khc_close_space(h); - } - - } else { - - if (d->saved.monitor != d->work.monitor) - khc_write_int32(csp_ident, L"Monitor", !!d->work.monitor); - - if (d->saved.auto_renew != d->work.auto_renew) - khc_write_int32(csp_ident, L"AllowAutoRenew", - !!d->work.auto_renew); - - if (d->saved.sticky != d->work.sticky) { - kcdb_identity_set_flags(d->ident, - (d->work.sticky)?KCDB_IDENT_FLAG_STICKY:0, - KCDB_IDENT_FLAG_STICKY); - } - } - - khc_close_space(csp_ident); - - d->saved = d->work; - - d->applied = TRUE; - - if (d->hwnd) - PostMessage(d->hwnd, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(0, WMCFG_UPDATE_STATE), 0); -} - -static void -write_params_idents(void) { - int i; - khm_handle csp_cw; - - if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", - KHM_FLAG_CREATE, &csp_cw))) { - if (cfg_idents.work.monitor != cfg_idents.saved.monitor) { - khc_write_int32(csp_cw, L"DefaultMonitor", - !!cfg_idents.work.monitor); - cfg_idents.work.monitor = cfg_idents.saved.monitor; - cfg_idents.applied = TRUE; - } - if (cfg_idents.work.auto_renew != cfg_idents.saved.auto_renew) { - khc_write_int32(csp_cw, L"DefaultAllowAutoRenew", - !!cfg_idents.work.auto_renew); - cfg_idents.work.auto_renew = cfg_idents.saved.auto_renew; - cfg_idents.applied = TRUE; - } - if (cfg_idents.work.sticky != cfg_idents.saved.sticky) { - khc_write_int32(csp_cw, L"DefaultMonitor", - !!cfg_idents.work.sticky); - cfg_idents.work.sticky = cfg_idents.saved.sticky; - cfg_idents.applied = TRUE; - } - khc_close_space(csp_cw); - } - - for (i=0; i < (int)cfg_idents.n_idents; i++) { - write_params_ident(&cfg_idents.idents[i]); - } - - if (cfg_idents.hwnd) - PostMessage(cfg_idents.hwnd, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(0, WMCFG_UPDATE_STATE), 0); -} - -static void -init_idents_data(void) { - khm_int32 rv; - wchar_t * t; - wchar_t * widnames = NULL; - khm_size cb; - int n_tries = 0; - int i; - khm_handle csp_cw; - - if (cfg_idents.valid) - return; - -#ifdef DEBUG - assert(cfg_idents.idents == NULL); - assert(cfg_idents.n_idents == 0); - assert(cfg_idents.nc_idents == 0); -#endif - - if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", 0, &csp_cw))) { - khm_int32 t; - - if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"DefaultMonitor", &t))) - cfg_idents.saved.monitor = !!t; - else - cfg_idents.saved.monitor = TRUE; - - if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"DefaultAllowAutoRenew", &t))) - cfg_idents.saved.auto_renew = !!t; - else - cfg_idents.saved.auto_renew = TRUE; - - if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"DefaultSticky", &t))) - cfg_idents.saved.sticky = !!t; - else - cfg_idents.saved.sticky = FALSE; - - } else { - - cfg_idents.saved.monitor = TRUE; - cfg_idents.saved.auto_renew = TRUE; - cfg_idents.saved.sticky = FALSE; - - } - - cfg_idents.work = cfg_idents.saved; - cfg_idents.applied = FALSE; - - do { - rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, - KCDB_IDENT_FLAG_CONFIG, - NULL, - &cb, - &cfg_idents.n_idents); - - if (rv != KHM_ERROR_TOO_LONG || - cfg_idents.n_idents == 0 || - cb == 0) - break; - - if (widnames) - PFREE(widnames); - widnames = PMALLOC(cb); -#ifdef DEBUG - assert(widnames); -#endif - - rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, - KCDB_IDENT_FLAG_CONFIG, - widnames, - &cb, - &cfg_idents.n_idents); - n_tries++; - } while(KHM_FAILED(rv) && - n_tries < 5); - - if (KHM_FAILED(rv) || - cfg_idents.n_idents == 0) { - cfg_idents.n_idents = 0; - goto _cleanup; - } - - cfg_idents.idents = PMALLOC(sizeof(*cfg_idents.idents) * - cfg_idents.n_idents); -#ifdef DEBUG - assert(cfg_idents.idents); -#endif - ZeroMemory(cfg_idents.idents, - sizeof(*cfg_idents.idents) * cfg_idents.n_idents); - cfg_idents.nc_idents = cfg_idents.n_idents; - - i = 0; - for (t = widnames; t && *t; t = multi_string_next(t)) { - khm_handle ident; - - if (KHM_FAILED(kcdb_identity_create(t, 0, &ident))) { - cfg_idents.n_idents--; - continue; - } - - StringCbLength(t, KCDB_IDENT_MAXCB_NAME, &cb); - cb += sizeof(wchar_t); - - cfg_idents.idents[i].idname = PMALLOC(cb); -#ifdef DEBUG - assert(cfg_idents.idents[i].idname); -#endif - StringCbCopy(cfg_idents.idents[i].idname, cb, t); - - cfg_idents.idents[i].ident = ident; - cfg_idents.idents[i].removed = FALSE; - - kcdb_identity_get_flags(ident, &cfg_idents.idents[i].flags); - - read_params_ident(&cfg_idents.idents[i]); - - i++; - /* leave identity held */ - } - - _cleanup: - - cfg_idents.valid = TRUE; - - if (widnames) - PFREE(widnames); -} - -static void -free_idents_data(void) { - int i; - - if (!cfg_idents.valid) - return; - - for (i=0; i< (int) cfg_idents.n_idents; i++) { - if (cfg_idents.idents[i].ident) - kcdb_identity_release(cfg_idents.idents[i].ident); - if (cfg_idents.idents[i].idname) - PFREE(cfg_idents.idents[i].idname); - } - - if (cfg_idents.idents) - PFREE(cfg_idents.idents); - - cfg_idents.idents = NULL; - cfg_idents.n_idents = 0; - cfg_idents.nc_idents = 0; - cfg_idents.valid = FALSE; -} - -static void -hold_idents_data(void) { - if (!cfg_idents.valid) - init_idents_data(); -#ifdef DEBUG - assert(cfg_idents.valid); -#endif - cfg_idents.refcount++; -} - -static void -release_idents_data(void) { -#ifdef DEBUG - assert(cfg_idents.valid); -#endif - cfg_idents.refcount--; - - if (cfg_idents.refcount == 0) - free_idents_data(); -} - - -static void -refresh_data_idents(HWND hwnd) { - cfg_idents.work.monitor = - (IsDlgButtonChecked(hwnd, IDC_CFG_MONITOR) == BST_CHECKED); - cfg_idents.work.auto_renew = - (IsDlgButtonChecked(hwnd, IDC_CFG_RENEW) == BST_CHECKED); - cfg_idents.work.sticky = - (IsDlgButtonChecked(hwnd, IDC_CFG_STICKY) == BST_CHECKED); -} - -static void -refresh_view_idents_state(HWND hwnd) { - BOOL modified; - BOOL applied; - khm_int32 flags = 0; - - applied = cfg_idents.applied; - modified = (cfg_idents.work.monitor != cfg_idents.saved.monitor || - cfg_idents.work.auto_renew != cfg_idents.saved.auto_renew || - cfg_idents.work.sticky != cfg_idents.saved.sticky); - - if (modified) - flags |= KHUI_CNFLAG_MODIFIED; - if (applied) - flags |= KHUI_CNFLAG_APPLIED; - - khui_cfg_set_flags_inst(&cfg_idents.cfg, flags, - KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); -} - -/* dialog box procedure for the "Add new identity" dialog */ -INT_PTR CALLBACK -khm_cfg_add_ident_proc(HWND hwnd, - UINT umsg, - WPARAM wParam, - LPARAM lparam) { - switch(umsg) { - case WM_INITDIALOG: - /* set the max length of the edit control first */ - SendDlgItemMessage(hwnd, IDC_CFG_IDNAME, - EM_SETLIMITTEXT, - KCDB_IDENT_MAXCCH_NAME - 1, - 0); - break; - - case WM_DESTROY: - /* nor do we have to do anything here */ - break; - - case WM_COMMAND: - if (LOWORD(wParam) == IDOK) { - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_handle ident = NULL; - khm_handle csp_ident = NULL; - khm_size i; - wchar_t err_msg[512] = L""; - - GetDlgItemText(hwnd, IDC_CFG_IDNAME, idname, - ARRAYLENGTH(idname)); - - idname[ARRAYLENGTH(idname) - 1] = L'\0'; - if (KHM_FAILED(rv = kcdb_identpro_validate_name(idname)) && - rv != KHM_ERROR_NO_PROVIDER && - rv != KHM_ERROR_NOT_IMPLEMENTED) { - /* the supplied name was invalid or something */ - - wchar_t fmt[256]; - - LoadString(khm_hInstance, IDS_CFG_IDNAME_INV, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(err_msg, sizeof(err_msg), fmt, idname); - - goto show_failure; - } - - /* now check if this is actually a new identity */ - for (i=0; i < cfg_idents.n_idents; i++) { - if (!kcdb_identpro_compare_name(cfg_idents.idents[i].idname, - idname)) - break; - } - - if (i < cfg_idents.n_idents) { - wchar_t fmt[256]; - - LoadString(khm_hInstance, IDS_CFG_IDNAME_EXT, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(err_msg, sizeof(err_msg), fmt, idname); - - goto show_failure; - } - - /* ok. now we are all set to add the new identity */ - if (KHM_FAILED(rv = kcdb_identity_create(idname, - KCDB_IDENT_FLAG_CREATE, - &ident))) { - /* oops */ - wchar_t fmt[256]; - - LoadString(khm_hInstance, IDS_CFG_IDNAME_CCR, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(err_msg, sizeof(err_msg), fmt, rv); - - goto show_failure; - } - - /* now we have to create the identity configuration. */ - if (KHM_FAILED(rv = kcdb_identity_get_config(ident, - KHM_FLAG_CREATE, - &csp_ident))) { - wchar_t fmt[256]; - - LoadString(khm_hInstance, IDS_CFG_IDNAME_CCC, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(err_msg, sizeof(err_msg), fmt, rv); - - kcdb_identity_release(ident); - - goto show_failure; - } - - khm_refresh_config(); - - kcdb_identity_release(ident); - khc_close_space(csp_ident); - - EndDialog(hwnd, 0); - break; - - show_failure: - { - wchar_t title[512]; - wchar_t fmt[256]; - - if (!err_msg[0]) - break; - - LoadString(khm_hInstance, IDS_CFG_IDNAME_PRB, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(title, sizeof(title), fmt, idname); - - MessageBox(hwnd, err_msg, title, MB_OK | MB_ICONSTOP); - - /* don't end the dialog yet */ - break; - } - break; - - } else if (LOWORD(wParam) == IDCANCEL) { - EndDialog(hwnd, 1); - } - break; - } - - return FALSE; -} - -/* dialog procedure for the "general" pane of the "identities" - configuration node. */ -INT_PTR CALLBACK -khm_cfg_ids_tab_proc(HWND hwnd, - UINT umsg, - WPARAM wParam, - LPARAM lParam) { - - switch(umsg) { - case WM_INITDIALOG: - { - HICON hicon; - - hold_idents_data(); - - cfg_idents.hwnd = hwnd; - cfg_idents.cfg = *((khui_config_init_data *) lParam); - - /* add the status icons */ - if (cfg_idents.hi_status) - goto _done_with_icons; - - cfg_idents.hi_status = - ImageList_Create(GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), - ILC_COLOR8 | ILC_MASK, - 4,4); - - hicon = - LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_ID), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - cfg_idents.idx_id = ImageList_AddIcon(cfg_idents.hi_status, - hicon); - - DestroyIcon(hicon); - - hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_DEFAULT), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - cfg_idents.idx_default = ImageList_AddIcon(cfg_idents.hi_status, - hicon) + 1; - - DestroyIcon(hicon); - - hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_MODIFIED), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - cfg_idents.idx_modified = ImageList_AddIcon(cfg_idents.hi_status, - hicon) + 1; - - DestroyIcon(hicon); - - hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_APPLIED), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - cfg_idents.idx_applied = ImageList_AddIcon(cfg_idents.hi_status, - hicon) + 1; - - DestroyIcon(hicon); - - hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_DELETED), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - cfg_idents.idx_deleted = ImageList_AddIcon(cfg_idents.hi_status, - hicon) + 1; - - DestroyIcon(hicon); - - _done_with_icons: - - CheckDlgButton(hwnd, IDC_CFG_MONITOR, - (cfg_idents.work.monitor)?BST_CHECKED:BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_CFG_RENEW, - (cfg_idents.work.auto_renew)?BST_CHECKED:BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_CFG_STICKY, - (cfg_idents.work.sticky)?BST_CHECKED:BST_UNCHECKED); - - } - return FALSE; - - case WM_COMMAND: - - if (HIWORD(wParam) == BN_CLICKED) { - UINT ctrl = LOWORD(wParam); - - switch(ctrl) { - case IDC_CFG_MONITOR: - case IDC_CFG_RENEW: - case IDC_CFG_STICKY: - refresh_data_idents(hwnd); - break; - - case IDC_CFG_ADDIDENT: - DialogBoxParam(khm_hInstance, - MAKEINTRESOURCE(IDD_CFG_ADDIDENT), - hwnd, - khm_cfg_add_ident_proc, - (LPARAM) hwnd); - break; - } - - refresh_view_idents_state(hwnd); - } - - khm_set_dialog_result(hwnd, 0); - return TRUE; - - case KHUI_WM_CFG_NOTIFY: - { - switch(HIWORD(wParam)) { - case WMCFG_APPLY: - write_params_idents(); - break; - - case WMCFG_UPDATE_STATE: - refresh_view_idents_state(hwnd); - break; - } - } - return TRUE; - - case WM_DESTROY: - cfg_idents.hwnd = NULL; - - if (cfg_idents.hi_status != NULL) { - ImageList_Destroy(cfg_idents.hi_status); - cfg_idents.hi_status = NULL; - } - release_idents_data(); - - khm_set_dialog_result(hwnd, 0); - - return TRUE; - } - - return FALSE; -} - -/* dialog procedure for the "Identities" configuration node */ -INT_PTR CALLBACK -khm_cfg_identities_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - HWND hw; - switch(uMsg) { - case WM_INITDIALOG: - set_window_node(hwnd, (khui_config_node) lParam); - add_subpanels(hwnd, (khui_config_node) lParam, - (khui_config_node) lParam); - hw = GetDlgItem(hwnd, IDC_CFG_TAB); - show_tab_panel(hwnd, - (khui_config_node) lParam, - hw, - TabCtrl_GetCurSel(hw), - TRUE); - return FALSE; - - case WM_DESTROY: - return 0; - - case KHUI_WM_CFG_NOTIFY: - return handle_cfg_notify(hwnd, wParam, lParam); - - case WM_NOTIFY: - return handle_notify(hwnd, wParam, lParam); - } - - return FALSE; -} - -static ident_data * -find_ident_by_node(khui_config_node node) { - khm_size cb; - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - int i; - - cb = sizeof(idname); - khui_cfg_get_name(node, idname, &cb); - - for (i=0; i < (int)cfg_idents.n_idents; i++) { - if (!wcscmp(cfg_idents.idents[i].idname, idname)) - break; - } - - if (i < (int)cfg_idents.n_idents) - return &cfg_idents.idents[i]; - else - return NULL; -} - -static void -refresh_view_ident(HWND hwnd, khui_config_node node) { - ident_data * d; - - d = find_ident_by_node(node); -#ifdef DEBUG - assert(d); -#endif - - CheckDlgButton(hwnd, IDC_CFG_MONITOR, - (d->work.monitor? BST_CHECKED: BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_RENEW, - (d->work.auto_renew? BST_CHECKED: BST_UNCHECKED)); - CheckDlgButton(hwnd, IDC_CFG_STICKY, - (d->work.sticky? BST_CHECKED: BST_UNCHECKED)); -} - -static void -mark_remove_ident(HWND hwnd, khui_config_init_data * idata) { - ident_data * d; - - d = find_ident_by_node(idata->ctx_node); -#ifdef DEBUG - assert(d); -#endif - - if (d->removed) - return; - - d->removed = TRUE; - - khui_cfg_set_flags_inst(idata, KHUI_CNFLAG_MODIFIED, - KHUI_CNFLAG_MODIFIED); - - EnableWindow(GetDlgItem(hwnd, IDC_CFG_REMOVE), FALSE); -} - -static void -refresh_data_ident(HWND hwnd, khui_config_init_data * idata) { - ident_data * d; - - d = find_ident_by_node(idata->ctx_node); -#ifdef DEBUG - assert(d); -#endif - - if (IsDlgButtonChecked(hwnd, IDC_CFG_MONITOR) == BST_CHECKED) - d->work.monitor = TRUE; - else - d->work.monitor = FALSE; - - if (IsDlgButtonChecked(hwnd, IDC_CFG_RENEW) == BST_CHECKED) - d->work.auto_renew = TRUE; - else - d->work.auto_renew = FALSE; - - if (IsDlgButtonChecked(hwnd, IDC_CFG_STICKY) == BST_CHECKED) - d->work.sticky = TRUE; - else - d->work.sticky = FALSE; - - if (d->work.monitor != d->saved.monitor || - d->work.auto_renew != d->saved.auto_renew || - d->work.sticky != d->saved.sticky) { - - khui_cfg_set_flags_inst(idata, KHUI_CNFLAG_MODIFIED, - KHUI_CNFLAG_MODIFIED); - - } else { - khui_cfg_set_flags_inst(idata, 0, - KHUI_CNFLAG_MODIFIED); - } -} - -/* dialog procedure for the "general" pane of individual identity - configuration nodes. */ -INT_PTR CALLBACK -khm_cfg_id_tab_proc(HWND hwnd, - UINT umsg, - WPARAM wParam, - LPARAM lParam) { - - khui_config_init_data * idata; - - switch(umsg) { - case WM_INITDIALOG: - { - ident_data * d; - - hold_idents_data(); - - idata = (khui_config_init_data *) lParam; - - khui_cfg_init_dialog_data(hwnd, idata, 0, NULL, NULL); - - refresh_view_ident(hwnd, idata->ctx_node); - - d = find_ident_by_node(idata->ctx_node); - if (d) - d->hwnd = hwnd; -#ifdef DEBUG - else - assert(FALSE); -#endif - } - return FALSE; - - case WM_COMMAND: - khui_cfg_get_dialog_data(hwnd, &idata, NULL); - - if (HIWORD(wParam) == BN_CLICKED) { - switch(LOWORD(wParam)) { - case IDC_CFG_MONITOR: - case IDC_CFG_RENEW: - case IDC_CFG_STICKY: - - refresh_data_ident(hwnd, idata); - if (cfg_idents.hwnd) - PostMessage(cfg_idents.hwnd, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(1, WMCFG_UPDATE_STATE), 0); - break; - - case IDC_CFG_REMOVE: - mark_remove_ident(hwnd, idata); - if (cfg_idents.hwnd) - PostMessage(cfg_idents.hwnd, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(1, WMCFG_UPDATE_STATE), 0); - break; - } - } - - khm_set_dialog_result(hwnd, 0); - return TRUE; - - case WM_DESTROY: - { - ident_data * d; - - khui_cfg_get_dialog_data(hwnd, &idata, NULL); - - d = find_ident_by_node(idata->ctx_node); - if (d) - d->hwnd = NULL; - - release_idents_data(); - khui_cfg_free_dialog_data(hwnd); - khm_set_dialog_result(hwnd, 0); - } - return TRUE; - - case KHUI_WM_CFG_NOTIFY: - { - ident_data * d; - - khui_cfg_get_dialog_data(hwnd, &idata, NULL); - - switch (HIWORD(wParam)) { - case WMCFG_APPLY: - d = find_ident_by_node(idata->ctx_node); - write_params_ident(d); - khui_cfg_set_flags_inst(idata, KHUI_CNFLAG_APPLIED, - KHUI_CNFLAG_APPLIED | - KHUI_CNFLAG_MODIFIED); - break; - - case WMCFG_UPDATE_STATE: - refresh_view_ident(hwnd, idata->ctx_node); - refresh_data_ident(hwnd, idata); - break; - } - } - return TRUE; - } - - return FALSE; -} - -/* dialog procedure for individual identity configuration nodes */ -INT_PTR CALLBACK -khm_cfg_identity_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - HWND hw; - - switch(uMsg) { - case WM_INITDIALOG: - { - khui_config_node refnode = NULL; - - set_window_node(hwnd, (khui_config_node) lParam); - - khui_cfg_open(NULL, L"KhmIdentities", &refnode); -#ifdef DEBUG - assert(refnode != NULL); -#endif - add_subpanels(hwnd, - (khui_config_node) lParam, - refnode); - - hw = GetDlgItem(hwnd, IDC_CFG_TAB); - - show_tab_panel(hwnd, - (khui_config_node) lParam, - hw, - TabCtrl_GetCurSel(hw), - TRUE); - - khui_cfg_release(refnode); - } - return FALSE; - - case WM_DESTROY: - return 0; - - case KHUI_WM_CFG_NOTIFY: - return handle_cfg_notify(hwnd, wParam, lParam); - - case WM_NOTIFY: - return handle_notify(hwnd, wParam, lParam); - } - return FALSE; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +static khui_config_node +get_window_node(HWND hwnd) { + return (khui_config_node) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); +} + +static void +set_window_node(HWND hwnd, khui_config_node node) { +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, + (LONG_PTR) node); +#pragma warning(pop) +} + +static void +add_subpanels(HWND hwnd, + khui_config_node ctx_node, + khui_config_node ref_node) { + + HWND hw_tab; + HWND hw_target; + khui_config_node sub; + khui_config_node_reg reg; + khui_config_init_data idata; + int idx; + + hw_tab = GetDlgItem(hwnd, IDC_CFG_TAB); + hw_target = GetDlgItem(hwnd, IDC_CFG_TARGET); +#ifdef DEBUG + assert(hw_tab); + assert(hw_target); +#endif + + if (KHM_FAILED(khui_cfg_get_first_subpanel(ref_node, &sub))) { +#ifdef DEBUG + assert(FALSE); +#endif + return; + } + + idx = 0; + while(sub) { + HWND hwnd_panel; + TCITEM tci; + int iid; + + khui_cfg_get_reg(sub, ®); + + if ((ctx_node == ref_node && (reg.flags & KHUI_CNFLAG_PLURAL)) || + (ctx_node != ref_node && !(reg.flags & KHUI_CNFLAG_PLURAL))) + goto _next_node; + + idata.ctx_node = ctx_node; + idata.this_node = sub; + idata.ref_node = ref_node; + + hwnd_panel = CreateDialogParam(reg.h_module, + reg.dlg_template, + hwnd, + reg.dlg_proc, + (LPARAM) &idata); + +#ifdef DEBUG + assert(hwnd_panel); +#endif + + ShowWindow(hwnd_panel, SW_HIDE); + + ZeroMemory(&tci, sizeof(tci)); + + tci.mask = TCIF_PARAM | TCIF_TEXT; + tci.lParam = (LPARAM) sub; + tci.pszText = (LPWSTR) reg.short_desc; + + iid = TabCtrl_InsertItem(hw_tab, 0, &tci); + idx++; + + if (reg.flags & KHUI_CNFLAG_PLURAL) { + khui_cfg_set_param_inst(sub, ctx_node, iid); + khui_cfg_set_hwnd_inst(sub, ctx_node, hwnd_panel); + } else { + khui_cfg_set_param(sub, iid); + khui_cfg_set_hwnd(sub, hwnd_panel); + } + + _next_node: + + khui_cfg_get_next_release(&sub); + } + + TabCtrl_SetCurSel(hw_tab, 0); +} + +static void +apply_all(HWND hwnd, + HWND hw_tab, + khui_config_node noderef) { + TCITEM tci; + HWND hw; + khui_config_node_reg reg; + int idx; + int count; + + count = TabCtrl_GetItemCount(hw_tab); + + for (idx = 0; idx < count; idx++) { + + ZeroMemory(&tci, sizeof(tci)); + + tci.mask = TCIF_PARAM; + TabCtrl_GetItem(hw_tab, + idx, + &tci); + +#ifdef DEBUG + assert(tci.lParam); +#endif + khui_cfg_get_reg((khui_config_node) tci.lParam, ®); + if (reg.flags & KHUI_CNFLAG_PLURAL) + hw = khui_cfg_get_hwnd_inst((khui_config_node) tci.lParam, + noderef); + else + hw = khui_cfg_get_hwnd((khui_config_node) tci.lParam); +#ifdef DEBUG + assert(hw); +#endif + + SendMessage(hw, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(0, WMCFG_APPLY), 0); + } +} + +static void +show_tab_panel(HWND hwnd, + khui_config_node node, + HWND hw_tab, + int idx, + BOOL show) { + TCITEM tci; + HWND hw; + HWND hw_target; + HWND hw_firstctl; + RECT r; + RECT rref; + khui_config_node_reg reg; + + ZeroMemory(&tci, sizeof(tci)); + + tci.mask = TCIF_PARAM; + TabCtrl_GetItem(hw_tab, + idx, + &tci); + +#ifdef DEBUG + assert(tci.lParam); +#endif + khui_cfg_get_reg((khui_config_node) tci.lParam, ®); + if (reg.flags & KHUI_CNFLAG_PLURAL) + hw = khui_cfg_get_hwnd_inst((khui_config_node) tci.lParam, + node); + else + hw = khui_cfg_get_hwnd((khui_config_node) tci.lParam); +#ifdef DEBUG + assert(hw); +#endif + + if (!show) { + ShowWindow(hw, SW_HIDE); + return; + } + + hw_target = GetDlgItem(hwnd, IDC_CFG_TARGET); +#ifdef DEBUG + assert(hw_target); +#endif + GetWindowRect(hwnd, &rref); + GetWindowRect(hw_target, &r); + + OffsetRect(&r, -rref.left, -rref.top); + + SetWindowPos(hw, + hw_tab, + r.left, r.top, + r.right - r.left, r.bottom - r.top, + SWP_NOACTIVATE | SWP_NOOWNERZORDER | + SWP_SHOWWINDOW); + + hw_firstctl = GetNextDlgTabItem(hw, NULL, FALSE); + if (hw_firstctl) { + SetFocus(hw_firstctl); + } +} + +static INT_PTR +handle_cfg_notify(HWND hwnd, + WPARAM wParam, + LPARAM lParam) { + khui_config_node node; + HWND hw; + + node = get_window_node(hwnd); + + if (HIWORD(wParam) == WMCFG_APPLY) { + + hw = GetDlgItem(hwnd, IDC_CFG_TAB); + + apply_all(hwnd, + hw, + node); + } + + return TRUE; +} + +static INT_PTR +handle_notify(HWND hwnd, + WPARAM wParam, + LPARAM lParam) { + LPNMHDR lpnm; + int i; + + + khui_config_node node; + + lpnm = (LPNMHDR) lParam; + node = get_window_node(hwnd); + + if (lpnm->idFrom == IDC_CFG_TAB) { + switch(lpnm->code) { + case TCN_SELCHANGING: + i = TabCtrl_GetCurSel(lpnm->hwndFrom); + + show_tab_panel(hwnd, + node, + lpnm->hwndFrom, + i, + FALSE); + break; + + case TCN_SELCHANGE: + i = TabCtrl_GetCurSel(lpnm->hwndFrom); + + show_tab_panel(hwnd, + node, + lpnm->hwndFrom, + i, + TRUE); + break; + } + return TRUE; + } else { + return FALSE; + } +} + +typedef struct tag_ident_props { + BOOL monitor; + BOOL auto_renew; + BOOL sticky; +} ident_props; + +typedef struct tag_ident_data { + khm_handle ident; + wchar_t * idname; + int lv_idx; + + BOOL removed; + BOOL applied; + + khm_int32 flags; + + ident_props saved; + ident_props work; + + HWND hwnd; +} ident_data; + +typedef struct tag_global_props { + BOOL monitor; + BOOL auto_renew; + BOOL sticky; +} global_props; + +typedef struct tag_idents_data { + BOOL valid; + + ident_data * idents; + khm_size n_idents; + khm_size nc_idents; + + /* global options */ + global_props saved; + global_props work; + BOOL applied; + + int refcount; + + HIMAGELIST hi_status; + int idx_id; + int idx_default; + int idx_modified; + int idx_applied; + int idx_deleted; + + HWND hwnd; + khui_config_init_data cfg; +} idents_data; + +static idents_data cfg_idents = {FALSE, NULL, 0, 0, + {0, 0, 0}, + {0, 0, 0}, + FALSE, + + 0, NULL }; + +static void +read_params_ident(ident_data * d) { + khm_handle csp_ident; + khm_handle csp_cw; + khm_int32 t; + + if (KHM_FAILED(kcdb_identity_get_config(d->ident, + KHM_PERM_READ, + &csp_ident))) { + csp_ident = NULL; + } + + if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", KHM_PERM_READ, + &csp_cw))) { + if (csp_ident) { + khc_shadow_space(csp_ident, + csp_cw); + khc_close_space(csp_cw); + } else { + csp_ident = csp_cw; + } + csp_cw = NULL; + } else { +#ifdef DEBUG + assert(FALSE); +#endif + d->saved.monitor = TRUE; + d->saved.auto_renew = TRUE; + d->saved.sticky = FALSE; + d->work = d->saved; + + if (csp_ident) + khc_close_space(csp_ident); + + return; + } + + if (KHM_FAILED(khc_read_int32(csp_ident, L"Monitor", &t))) { +#ifdef DEBUG + assert(FALSE); +#endif + d->saved.monitor = TRUE; + } else { + d->saved.monitor = !!t; + } + + if (KHM_FAILED(khc_read_int32(csp_ident, L"AllowAutoRenew", &t))) { +#ifdef DEBUG + assert(FALSE); +#endif + d->saved.auto_renew = TRUE; + } else { + d->saved.auto_renew = !!t; + } + + if (KHM_FAILED(khc_read_int32(csp_ident, L"Sticky", &t))) { + d->saved.sticky = FALSE; + } else { + d->saved.sticky = !!t; + } + + khc_close_space(csp_ident); + + d->work = d->saved; + d->applied = FALSE; +} + +static void +write_params_ident(ident_data * d) { + khm_handle csp_ident; + + if (d->saved.monitor == d->work.monitor && + d->saved.auto_renew == d->work.auto_renew && + d->saved.sticky == d->work.sticky && + !d->removed) + return; + + if (KHM_FAILED(kcdb_identity_get_config(d->ident, KHM_PERM_WRITE, + &csp_ident))) { +#ifdef DEBUG + assert(FALSE); +#endif + return; + } + + if (d->removed) { + khm_handle h = NULL; + + khc_remove_space(csp_ident); + + /* calling kcdb_identity_get_config() will update the + KCDB_IDENT_FLAG_CONFIG flag for the identity to reflect the + fact that it nolonger has a configuration. */ + kcdb_identity_get_config(d->ident, 0, &h); + if (h) { + /* what the ? */ +#ifdef DEBUG + assert(FALSE); +#endif + khc_close_space(h); + } + + } else { + + if (d->saved.monitor != d->work.monitor) + khc_write_int32(csp_ident, L"Monitor", !!d->work.monitor); + + if (d->saved.auto_renew != d->work.auto_renew) + khc_write_int32(csp_ident, L"AllowAutoRenew", + !!d->work.auto_renew); + + if (d->saved.sticky != d->work.sticky) { + kcdb_identity_set_flags(d->ident, + (d->work.sticky)?KCDB_IDENT_FLAG_STICKY:0, + KCDB_IDENT_FLAG_STICKY); + } + } + + khc_close_space(csp_ident); + + d->saved = d->work; + + d->applied = TRUE; + + if (d->hwnd) + PostMessage(d->hwnd, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(0, WMCFG_UPDATE_STATE), 0); +} + +static void +write_params_idents(void) { + int i; + khm_handle csp_cw; + + if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", + KHM_FLAG_CREATE, &csp_cw))) { + if (cfg_idents.work.monitor != cfg_idents.saved.monitor) { + khc_write_int32(csp_cw, L"DefaultMonitor", + !!cfg_idents.work.monitor); + cfg_idents.work.monitor = cfg_idents.saved.monitor; + cfg_idents.applied = TRUE; + } + if (cfg_idents.work.auto_renew != cfg_idents.saved.auto_renew) { + khc_write_int32(csp_cw, L"DefaultAllowAutoRenew", + !!cfg_idents.work.auto_renew); + cfg_idents.work.auto_renew = cfg_idents.saved.auto_renew; + cfg_idents.applied = TRUE; + } + if (cfg_idents.work.sticky != cfg_idents.saved.sticky) { + khc_write_int32(csp_cw, L"DefaultMonitor", + !!cfg_idents.work.sticky); + cfg_idents.work.sticky = cfg_idents.saved.sticky; + cfg_idents.applied = TRUE; + } + khc_close_space(csp_cw); + } + + for (i=0; i < (int)cfg_idents.n_idents; i++) { + write_params_ident(&cfg_idents.idents[i]); + } + + if (cfg_idents.hwnd) + PostMessage(cfg_idents.hwnd, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(0, WMCFG_UPDATE_STATE), 0); +} + +static void +init_idents_data(void) { + khm_int32 rv; + wchar_t * t; + wchar_t * widnames = NULL; + khm_size cb; + int n_tries = 0; + int i; + khm_handle csp_cw; + + if (cfg_idents.valid) + return; + +#ifdef DEBUG + assert(cfg_idents.idents == NULL); + assert(cfg_idents.n_idents == 0); + assert(cfg_idents.nc_idents == 0); +#endif + + if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", 0, &csp_cw))) { + khm_int32 t; + + if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"DefaultMonitor", &t))) + cfg_idents.saved.monitor = !!t; + else + cfg_idents.saved.monitor = TRUE; + + if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"DefaultAllowAutoRenew", &t))) + cfg_idents.saved.auto_renew = !!t; + else + cfg_idents.saved.auto_renew = TRUE; + + if (KHM_SUCCEEDED(khc_read_int32(csp_cw, L"DefaultSticky", &t))) + cfg_idents.saved.sticky = !!t; + else + cfg_idents.saved.sticky = FALSE; + + } else { + + cfg_idents.saved.monitor = TRUE; + cfg_idents.saved.auto_renew = TRUE; + cfg_idents.saved.sticky = FALSE; + + } + + cfg_idents.work = cfg_idents.saved; + cfg_idents.applied = FALSE; + + do { + rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, + KCDB_IDENT_FLAG_CONFIG, + NULL, + &cb, + &cfg_idents.n_idents); + + if (rv != KHM_ERROR_TOO_LONG || + cfg_idents.n_idents == 0 || + cb == 0) + break; + + if (widnames) + PFREE(widnames); + widnames = PMALLOC(cb); +#ifdef DEBUG + assert(widnames); +#endif + + rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, + KCDB_IDENT_FLAG_CONFIG, + widnames, + &cb, + &cfg_idents.n_idents); + n_tries++; + } while(KHM_FAILED(rv) && + n_tries < 5); + + if (KHM_FAILED(rv) || + cfg_idents.n_idents == 0) { + cfg_idents.n_idents = 0; + goto _cleanup; + } + + cfg_idents.idents = PMALLOC(sizeof(*cfg_idents.idents) * + cfg_idents.n_idents); +#ifdef DEBUG + assert(cfg_idents.idents); +#endif + ZeroMemory(cfg_idents.idents, + sizeof(*cfg_idents.idents) * cfg_idents.n_idents); + cfg_idents.nc_idents = cfg_idents.n_idents; + + i = 0; + for (t = widnames; t && *t; t = multi_string_next(t)) { + khm_handle ident; + + if (KHM_FAILED(kcdb_identity_create(t, 0, &ident))) { + cfg_idents.n_idents--; + continue; + } + + StringCbLength(t, KCDB_IDENT_MAXCB_NAME, &cb); + cb += sizeof(wchar_t); + + cfg_idents.idents[i].idname = PMALLOC(cb); +#ifdef DEBUG + assert(cfg_idents.idents[i].idname); +#endif + StringCbCopy(cfg_idents.idents[i].idname, cb, t); + + cfg_idents.idents[i].ident = ident; + cfg_idents.idents[i].removed = FALSE; + + kcdb_identity_get_flags(ident, &cfg_idents.idents[i].flags); + + read_params_ident(&cfg_idents.idents[i]); + + i++; + /* leave identity held */ + } + + _cleanup: + + cfg_idents.valid = TRUE; + + if (widnames) + PFREE(widnames); +} + +static void +free_idents_data(void) { + int i; + + if (!cfg_idents.valid) + return; + + for (i=0; i< (int) cfg_idents.n_idents; i++) { + if (cfg_idents.idents[i].ident) + kcdb_identity_release(cfg_idents.idents[i].ident); + if (cfg_idents.idents[i].idname) + PFREE(cfg_idents.idents[i].idname); + } + + if (cfg_idents.idents) + PFREE(cfg_idents.idents); + + cfg_idents.idents = NULL; + cfg_idents.n_idents = 0; + cfg_idents.nc_idents = 0; + cfg_idents.valid = FALSE; +} + +static void +hold_idents_data(void) { + if (!cfg_idents.valid) + init_idents_data(); +#ifdef DEBUG + assert(cfg_idents.valid); +#endif + cfg_idents.refcount++; +} + +static void +release_idents_data(void) { +#ifdef DEBUG + assert(cfg_idents.valid); +#endif + cfg_idents.refcount--; + + if (cfg_idents.refcount == 0) + free_idents_data(); +} + + +static void +refresh_data_idents(HWND hwnd) { + cfg_idents.work.monitor = + (IsDlgButtonChecked(hwnd, IDC_CFG_MONITOR) == BST_CHECKED); + cfg_idents.work.auto_renew = + (IsDlgButtonChecked(hwnd, IDC_CFG_RENEW) == BST_CHECKED); + cfg_idents.work.sticky = + (IsDlgButtonChecked(hwnd, IDC_CFG_STICKY) == BST_CHECKED); +} + +static void +refresh_view_idents_state(HWND hwnd) { + BOOL modified; + BOOL applied; + khm_int32 flags = 0; + + applied = cfg_idents.applied; + modified = (cfg_idents.work.monitor != cfg_idents.saved.monitor || + cfg_idents.work.auto_renew != cfg_idents.saved.auto_renew || + cfg_idents.work.sticky != cfg_idents.saved.sticky); + + if (modified) + flags |= KHUI_CNFLAG_MODIFIED; + if (applied) + flags |= KHUI_CNFLAG_APPLIED; + + khui_cfg_set_flags_inst(&cfg_idents.cfg, flags, + KHUI_CNFLAG_APPLIED | KHUI_CNFLAG_MODIFIED); +} + +/* dialog box procedure for the "Add new identity" dialog */ +INT_PTR CALLBACK +khm_cfg_add_ident_proc(HWND hwnd, + UINT umsg, + WPARAM wParam, + LPARAM lparam) { + switch(umsg) { + case WM_INITDIALOG: + /* set the max length of the edit control first */ + SendDlgItemMessage(hwnd, IDC_CFG_IDNAME, + EM_SETLIMITTEXT, + KCDB_IDENT_MAXCCH_NAME - 1, + 0); + break; + + case WM_DESTROY: + /* nor do we have to do anything here */ + break; + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK) { + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_handle ident = NULL; + khm_handle csp_ident = NULL; + khm_size i; + wchar_t err_msg[512] = L""; + + GetDlgItemText(hwnd, IDC_CFG_IDNAME, idname, + ARRAYLENGTH(idname)); + + idname[ARRAYLENGTH(idname) - 1] = L'\0'; + if (KHM_FAILED(rv = kcdb_identpro_validate_name(idname)) && + rv != KHM_ERROR_NO_PROVIDER && + rv != KHM_ERROR_NOT_IMPLEMENTED) { + /* the supplied name was invalid or something */ + + wchar_t fmt[256]; + + LoadString(khm_hInstance, IDS_CFG_IDNAME_INV, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(err_msg, sizeof(err_msg), fmt, idname); + + goto show_failure; + } + + /* now check if this is actually a new identity */ + for (i=0; i < cfg_idents.n_idents; i++) { + if (!kcdb_identpro_compare_name(cfg_idents.idents[i].idname, + idname)) + break; + } + + if (i < cfg_idents.n_idents) { + wchar_t fmt[256]; + + LoadString(khm_hInstance, IDS_CFG_IDNAME_EXT, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(err_msg, sizeof(err_msg), fmt, idname); + + goto show_failure; + } + + /* ok. now we are all set to add the new identity */ + if (KHM_FAILED(rv = kcdb_identity_create(idname, + KCDB_IDENT_FLAG_CREATE, + &ident))) { + /* oops */ + wchar_t fmt[256]; + + LoadString(khm_hInstance, IDS_CFG_IDNAME_CCR, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(err_msg, sizeof(err_msg), fmt, rv); + + goto show_failure; + } + + /* now we have to create the identity configuration. */ + if (KHM_FAILED(rv = kcdb_identity_get_config(ident, + KHM_FLAG_CREATE, + &csp_ident))) { + wchar_t fmt[256]; + + LoadString(khm_hInstance, IDS_CFG_IDNAME_CCC, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(err_msg, sizeof(err_msg), fmt, rv); + + kcdb_identity_release(ident); + + goto show_failure; + } + + khm_refresh_config(); + + kcdb_identity_release(ident); + khc_close_space(csp_ident); + + EndDialog(hwnd, 0); + break; + + show_failure: + { + wchar_t title[512]; + wchar_t fmt[256]; + + if (!err_msg[0]) + break; + + LoadString(khm_hInstance, IDS_CFG_IDNAME_PRB, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(title, sizeof(title), fmt, idname); + + MessageBox(hwnd, err_msg, title, MB_OK | MB_ICONSTOP); + + /* don't end the dialog yet */ + break; + } + break; + + } else if (LOWORD(wParam) == IDCANCEL) { + EndDialog(hwnd, 1); + } + break; + } + + return FALSE; +} + +/* dialog procedure for the "general" pane of the "identities" + configuration node. */ +INT_PTR CALLBACK +khm_cfg_ids_tab_proc(HWND hwnd, + UINT umsg, + WPARAM wParam, + LPARAM lParam) { + + switch(umsg) { + case WM_INITDIALOG: + { + HICON hicon; + + hold_idents_data(); + + cfg_idents.hwnd = hwnd; + cfg_idents.cfg = *((khui_config_init_data *) lParam); + + /* add the status icons */ + if (cfg_idents.hi_status) + goto _done_with_icons; + + cfg_idents.hi_status = + ImageList_Create(GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + ILC_COLOR8 | ILC_MASK, + 4,4); + + hicon = + LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_ID), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + cfg_idents.idx_id = ImageList_AddIcon(cfg_idents.hi_status, + hicon); + + DestroyIcon(hicon); + + hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_DEFAULT), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + cfg_idents.idx_default = ImageList_AddIcon(cfg_idents.hi_status, + hicon) + 1; + + DestroyIcon(hicon); + + hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_MODIFIED), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + cfg_idents.idx_modified = ImageList_AddIcon(cfg_idents.hi_status, + hicon) + 1; + + DestroyIcon(hicon); + + hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_APPLIED), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + cfg_idents.idx_applied = ImageList_AddIcon(cfg_idents.hi_status, + hicon) + 1; + + DestroyIcon(hicon); + + hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_DELETED), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + cfg_idents.idx_deleted = ImageList_AddIcon(cfg_idents.hi_status, + hicon) + 1; + + DestroyIcon(hicon); + + _done_with_icons: + + CheckDlgButton(hwnd, IDC_CFG_MONITOR, + (cfg_idents.work.monitor)?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwnd, IDC_CFG_RENEW, + (cfg_idents.work.auto_renew)?BST_CHECKED:BST_UNCHECKED); + CheckDlgButton(hwnd, IDC_CFG_STICKY, + (cfg_idents.work.sticky)?BST_CHECKED:BST_UNCHECKED); + + } + return FALSE; + + case WM_COMMAND: + + if (HIWORD(wParam) == BN_CLICKED) { + UINT ctrl = LOWORD(wParam); + + switch(ctrl) { + case IDC_CFG_MONITOR: + case IDC_CFG_RENEW: + case IDC_CFG_STICKY: + refresh_data_idents(hwnd); + break; + + case IDC_CFG_ADDIDENT: + DialogBoxParam(khm_hInstance, + MAKEINTRESOURCE(IDD_CFG_ADDIDENT), + hwnd, + khm_cfg_add_ident_proc, + (LPARAM) hwnd); + break; + } + + refresh_view_idents_state(hwnd); + } + + khm_set_dialog_result(hwnd, 0); + return TRUE; + + case KHUI_WM_CFG_NOTIFY: + { + switch(HIWORD(wParam)) { + case WMCFG_APPLY: + write_params_idents(); + break; + + case WMCFG_UPDATE_STATE: + refresh_view_idents_state(hwnd); + break; + } + } + return TRUE; + + case WM_DESTROY: + cfg_idents.hwnd = NULL; + + if (cfg_idents.hi_status != NULL) { + ImageList_Destroy(cfg_idents.hi_status); + cfg_idents.hi_status = NULL; + } + release_idents_data(); + + khm_set_dialog_result(hwnd, 0); + + return TRUE; + } + + return FALSE; +} + +/* dialog procedure for the "Identities" configuration node */ +INT_PTR CALLBACK +khm_cfg_identities_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + HWND hw; + switch(uMsg) { + case WM_INITDIALOG: + set_window_node(hwnd, (khui_config_node) lParam); + add_subpanels(hwnd, (khui_config_node) lParam, + (khui_config_node) lParam); + hw = GetDlgItem(hwnd, IDC_CFG_TAB); + show_tab_panel(hwnd, + (khui_config_node) lParam, + hw, + TabCtrl_GetCurSel(hw), + TRUE); + return FALSE; + + case WM_DESTROY: + return 0; + + case KHUI_WM_CFG_NOTIFY: + return handle_cfg_notify(hwnd, wParam, lParam); + + case WM_NOTIFY: + return handle_notify(hwnd, wParam, lParam); + } + + return FALSE; +} + +static ident_data * +find_ident_by_node(khui_config_node node) { + khm_size cb; + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + int i; + + cb = sizeof(idname); + khui_cfg_get_name(node, idname, &cb); + + for (i=0; i < (int)cfg_idents.n_idents; i++) { + if (!wcscmp(cfg_idents.idents[i].idname, idname)) + break; + } + + if (i < (int)cfg_idents.n_idents) + return &cfg_idents.idents[i]; + else + return NULL; +} + +static void +refresh_view_ident(HWND hwnd, khui_config_node node) { + ident_data * d; + + d = find_ident_by_node(node); +#ifdef DEBUG + assert(d); +#endif + + CheckDlgButton(hwnd, IDC_CFG_MONITOR, + (d->work.monitor? BST_CHECKED: BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_RENEW, + (d->work.auto_renew? BST_CHECKED: BST_UNCHECKED)); + CheckDlgButton(hwnd, IDC_CFG_STICKY, + (d->work.sticky? BST_CHECKED: BST_UNCHECKED)); +} + +static void +mark_remove_ident(HWND hwnd, khui_config_init_data * idata) { + ident_data * d; + + d = find_ident_by_node(idata->ctx_node); +#ifdef DEBUG + assert(d); +#endif + + if (d->removed) + return; + + d->removed = TRUE; + + khui_cfg_set_flags_inst(idata, KHUI_CNFLAG_MODIFIED, + KHUI_CNFLAG_MODIFIED); + + EnableWindow(GetDlgItem(hwnd, IDC_CFG_REMOVE), FALSE); +} + +static void +refresh_data_ident(HWND hwnd, khui_config_init_data * idata) { + ident_data * d; + + d = find_ident_by_node(idata->ctx_node); +#ifdef DEBUG + assert(d); +#endif + + if (IsDlgButtonChecked(hwnd, IDC_CFG_MONITOR) == BST_CHECKED) + d->work.monitor = TRUE; + else + d->work.monitor = FALSE; + + if (IsDlgButtonChecked(hwnd, IDC_CFG_RENEW) == BST_CHECKED) + d->work.auto_renew = TRUE; + else + d->work.auto_renew = FALSE; + + if (IsDlgButtonChecked(hwnd, IDC_CFG_STICKY) == BST_CHECKED) + d->work.sticky = TRUE; + else + d->work.sticky = FALSE; + + if (d->work.monitor != d->saved.monitor || + d->work.auto_renew != d->saved.auto_renew || + d->work.sticky != d->saved.sticky) { + + khui_cfg_set_flags_inst(idata, KHUI_CNFLAG_MODIFIED, + KHUI_CNFLAG_MODIFIED); + + } else { + khui_cfg_set_flags_inst(idata, 0, + KHUI_CNFLAG_MODIFIED); + } +} + +/* dialog procedure for the "general" pane of individual identity + configuration nodes. */ +INT_PTR CALLBACK +khm_cfg_id_tab_proc(HWND hwnd, + UINT umsg, + WPARAM wParam, + LPARAM lParam) { + + khui_config_init_data * idata; + + switch(umsg) { + case WM_INITDIALOG: + { + ident_data * d; + + hold_idents_data(); + + idata = (khui_config_init_data *) lParam; + + khui_cfg_init_dialog_data(hwnd, idata, 0, NULL, NULL); + + refresh_view_ident(hwnd, idata->ctx_node); + + d = find_ident_by_node(idata->ctx_node); + if (d) + d->hwnd = hwnd; +#ifdef DEBUG + else + assert(FALSE); +#endif + } + return FALSE; + + case WM_COMMAND: + khui_cfg_get_dialog_data(hwnd, &idata, NULL); + + if (HIWORD(wParam) == BN_CLICKED) { + switch(LOWORD(wParam)) { + case IDC_CFG_MONITOR: + case IDC_CFG_RENEW: + case IDC_CFG_STICKY: + + refresh_data_ident(hwnd, idata); + if (cfg_idents.hwnd) + PostMessage(cfg_idents.hwnd, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(1, WMCFG_UPDATE_STATE), 0); + break; + + case IDC_CFG_REMOVE: + mark_remove_ident(hwnd, idata); + if (cfg_idents.hwnd) + PostMessage(cfg_idents.hwnd, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(1, WMCFG_UPDATE_STATE), 0); + break; + } + } + + khm_set_dialog_result(hwnd, 0); + return TRUE; + + case WM_DESTROY: + { + ident_data * d; + + khui_cfg_get_dialog_data(hwnd, &idata, NULL); + + d = find_ident_by_node(idata->ctx_node); + if (d) + d->hwnd = NULL; + + release_idents_data(); + khui_cfg_free_dialog_data(hwnd); + khm_set_dialog_result(hwnd, 0); + } + return TRUE; + + case KHUI_WM_CFG_NOTIFY: + { + ident_data * d; + + khui_cfg_get_dialog_data(hwnd, &idata, NULL); + + switch (HIWORD(wParam)) { + case WMCFG_APPLY: + d = find_ident_by_node(idata->ctx_node); + write_params_ident(d); + khui_cfg_set_flags_inst(idata, KHUI_CNFLAG_APPLIED, + KHUI_CNFLAG_APPLIED | + KHUI_CNFLAG_MODIFIED); + break; + + case WMCFG_UPDATE_STATE: + refresh_view_ident(hwnd, idata->ctx_node); + refresh_data_ident(hwnd, idata); + break; + } + } + return TRUE; + } + + return FALSE; +} + +/* dialog procedure for individual identity configuration nodes */ +INT_PTR CALLBACK +khm_cfg_identity_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + HWND hw; + + switch(uMsg) { + case WM_INITDIALOG: + { + khui_config_node refnode = NULL; + + set_window_node(hwnd, (khui_config_node) lParam); + + khui_cfg_open(NULL, L"KhmIdentities", &refnode); +#ifdef DEBUG + assert(refnode != NULL); +#endif + add_subpanels(hwnd, + (khui_config_node) lParam, + refnode); + + hw = GetDlgItem(hwnd, IDC_CFG_TAB); + + show_tab_panel(hwnd, + (khui_config_node) lParam, + hw, + TabCtrl_GetCurSel(hw), + TRUE); + + khui_cfg_release(refnode); + } + return FALSE; + + case WM_DESTROY: + return 0; + + case KHUI_WM_CFG_NOTIFY: + return handle_cfg_notify(hwnd, wParam, lParam); + + case WM_NOTIFY: + return handle_notify(hwnd, wParam, lParam); + } + return FALSE; +} --- krb5-1.4.4.orig/src/windows/identity/ui/newcredwnd.h +++ krb5-1.4.4/src/windows/identity/ui/newcredwnd.h @@ -1,103 +1,103 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_NEWCREDWND_H -#define __KHIMAIRA_NEWCREDWND_H - -#include - -#define KHUI_NEWCREDWND_CLASS L"KhmNewCredWnd" - -typedef struct khui_nc_wnd_data_t { - khui_new_creds * nc; - - HWND dlg_main; /* main dialog */ - RECT r_main; - HWND dlg_bb; /* button bar */ - RECT r_bb; - HWND dlg_ts; /* tab strip */ - RECT r_ts; - - khm_size ctab; /* current tab */ - - HWND hwnd_tc_main; /* tab control button for main dialog */ - - HWND hwnd_banner; /* static control for banner */ - HWND hwnd_name; /* static control for name */ - - HWND hwnd_last_idspec; /* last identity specifier control */ - - /* metrics for custom prompts and identity specifiers */ - - RECT r_idspec; /* Area used by identity specifiers - (relative to client) */ - RECT r_row; /* Metrics for a control row - (top=0,left=0,right=width, - bottom=height) */ - RECT r_area; /* Area available for controls (relative - to client) */ - RECT r_n_label; /* coords of the static control (relative - to row) */ - RECT r_n_input; /* coords of the edit control (relative to - row) */ - RECT r_e_label; /* coords of the extended edit control - (relative to row) */ - RECT r_e_input; /* coords of the extended edit control - (relative to row) */ - RECT r_credtext; /* Area for credtext window (relative to - row) */ -} khui_nc_wnd_data; - -void khm_register_newcredwnd_class(void); -void khm_unregister_newcredwnd_class(void); -HWND khm_create_newcredwnd(HWND parent, khui_new_creds * c); -void khm_prep_newcredwnd(HWND hwnd); -void khm_show_newcredwnd(HWND hwnd); - -/* This is the first control ID that is created in the custom tabstrip - control buttons. Subsequent buttons get consecutive IDs starting - from this one. */ -#define NC_TS_CTRL_ID_MIN 8001 - -/* Maximum number of controls */ -#define NC_TS_MAX_CTRLS 8 - -/* Maximum control ID */ -#define NC_TS_CTRL_ID_MAX (NC_TS_CTRL_ID_MIN + NC_TS_MAX_CTRLS - 1) - -#define NC_BN_SET_DEF_ID 8012 - -/* the first control ID that may be used by an identity provider */ -#define NC_IS_CTRL_ID_MIN 8016 - -/* the maximum number of controls that may be created by an identity - provider*/ -#define NC_IS_CTRL_MAX_CTRLS 8 - -/* the maximum control ID that may be used by an identity provider */ -#define NC_IS_CTRL_ID_MAX (NC_IS_CTRL_ID_MIN + NC_IS_MAX_CTRLS - 1) - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_NEWCREDWND_H +#define __KHIMAIRA_NEWCREDWND_H + +#include + +#define KHUI_NEWCREDWND_CLASS L"KhmNewCredWnd" + +typedef struct khui_nc_wnd_data_t { + khui_new_creds * nc; + + HWND dlg_main; /* main dialog */ + RECT r_main; + HWND dlg_bb; /* button bar */ + RECT r_bb; + HWND dlg_ts; /* tab strip */ + RECT r_ts; + + khm_size ctab; /* current tab */ + + HWND hwnd_tc_main; /* tab control button for main dialog */ + + HWND hwnd_banner; /* static control for banner */ + HWND hwnd_name; /* static control for name */ + + HWND hwnd_last_idspec; /* last identity specifier control */ + + /* metrics for custom prompts and identity specifiers */ + + RECT r_idspec; /* Area used by identity specifiers + (relative to client) */ + RECT r_row; /* Metrics for a control row + (top=0,left=0,right=width, + bottom=height) */ + RECT r_area; /* Area available for controls (relative + to client) */ + RECT r_n_label; /* coords of the static control (relative + to row) */ + RECT r_n_input; /* coords of the edit control (relative to + row) */ + RECT r_e_label; /* coords of the extended edit control + (relative to row) */ + RECT r_e_input; /* coords of the extended edit control + (relative to row) */ + RECT r_credtext; /* Area for credtext window (relative to + row) */ +} khui_nc_wnd_data; + +void khm_register_newcredwnd_class(void); +void khm_unregister_newcredwnd_class(void); +HWND khm_create_newcredwnd(HWND parent, khui_new_creds * c); +void khm_prep_newcredwnd(HWND hwnd); +void khm_show_newcredwnd(HWND hwnd); + +/* This is the first control ID that is created in the custom tabstrip + control buttons. Subsequent buttons get consecutive IDs starting + from this one. */ +#define NC_TS_CTRL_ID_MIN 8001 + +/* Maximum number of controls */ +#define NC_TS_MAX_CTRLS 8 + +/* Maximum control ID */ +#define NC_TS_CTRL_ID_MAX (NC_TS_CTRL_ID_MIN + NC_TS_MAX_CTRLS - 1) + +#define NC_BN_SET_DEF_ID 8012 + +/* the first control ID that may be used by an identity provider */ +#define NC_IS_CTRL_ID_MIN 8016 + +/* the maximum number of controls that may be created by an identity + provider*/ +#define NC_IS_CTRL_MAX_CTRLS 8 + +/* the maximum control ID that may be used by an identity provider */ +#define NC_IS_CTRL_ID_MAX (NC_IS_CTRL_ID_MIN + NC_IS_MAX_CTRLS - 1) + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/toolbar.c +++ krb5-1.4.4/src/windows/identity/ui/toolbar.c @@ -1,445 +1,445 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -HWND khui_hwnd_standard_toolbar; -int khui_tb_blank; - -khui_ilist * ilist_toolbar; - -void khui_init_toolbar(void) { - ilist_toolbar = khui_create_ilist(KHUI_TOOLBAR_IMAGE_WIDTH, KHUI_TOOLBAR_IMAGE_HEIGHT, KHUI_TOOLBAR_MAX_BTNS, 5, 0); -} - -void khui_exit_toolbar(void) { - khui_delete_ilist(ilist_toolbar); -} - -LRESULT khm_toolbar_notify(LPNMHDR notice) { - switch(notice->code) { - case TBN_GETINFOTIP: - { - LPNMTBGETINFOTIP git = (LPNMTBGETINFOTIP) notice; - int cmd; - khui_action * a; - - cmd = git->iItem; - a = khui_find_action(cmd); - - if (a) { - if (a->caption) { - StringCchCopy(git->pszText, git->cchTextMax, a->caption); - } else if (a->tooltip) { - StringCchCopy(git->pszText, git->cchTextMax, a->tooltip); - } else if (a->is_caption) { - wchar_t buf[INFOTIPSIZE]; - - buf[0] = L'\0'; - LoadString(khm_hInstance, a->is_caption, - buf, ARRAYLENGTH(buf)); - - StringCchCopy(git->pszText, git->cchTextMax, buf); - } else { - StringCchCopy(git->pszText, git->cchTextMax, L""); - } - } else { - StringCchCopy(git->pszText, - git->cchTextMax, - L""); - } - } - break; - - case TBN_HOTITEMCHANGE: - { - LPNMTBHOTITEM hi = (LPNMTBHOTITEM) notice; - - if (hi->dwFlags & HICF_LEAVING) { - khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, L""); - } else { - khui_action * a; - int cmd; - wchar_t buf[256]; - - cmd = hi->idNew; - a = khui_find_action(cmd); - - buf[0] = L'\0'; - - if (a) { - if (a->tooltip) - StringCbCopy(buf, sizeof(buf), a->tooltip); - else if (a->is_tooltip) { - LoadString(khm_hInstance, a->is_tooltip, - buf, ARRAYLENGTH(buf)); - } - } - - khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, buf); - } - } - break; - - case NM_CUSTOMDRAW: - { - LPNMTBCUSTOMDRAW nmcd = (LPNMTBCUSTOMDRAW) notice; - if(nmcd->nmcd.dwDrawStage == CDDS_PREPAINT) { - return CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTERASE; - } else if(nmcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { - return CDRF_NOTIFYPOSTPAINT; - } else if(nmcd->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT) { - /* draw the actual icon */ - int iidx; - int ibmp; - HBITMAP hbmp; - RECT r; - - khui_action * act = - khui_find_action((int) nmcd->nmcd.dwItemSpec); - - if(!act || !act->ib_normal) - return CDRF_DODEFAULT; - - if((act->state & KHUI_ACTIONSTATE_DISABLED) && - act->ib_disabled) { - ibmp = act->ib_disabled; - } else if(act->ib_hot && - ((nmcd->nmcd.uItemState & CDIS_HOT) || - (nmcd->nmcd.uItemState & CDIS_SELECTED))){ - ibmp = act->ib_hot; - } else { - ibmp = act->ib_normal; - } - - iidx = khui_ilist_lookup_id(ilist_toolbar, ibmp); - if(iidx < 0) { - hbmp = LoadImage(khm_hInstance, - MAKEINTRESOURCE(ibmp), - IMAGE_BITMAP, - KHUI_TOOLBAR_IMAGE_WIDTH, - KHUI_TOOLBAR_IMAGE_HEIGHT, 0); - iidx = - khui_ilist_add_masked_id(ilist_toolbar, - hbmp, - KHUI_TOOLBAR_BGCOLOR, - ibmp); - DeleteObject(hbmp); - } - - if(iidx < 0) - return CDRF_DODEFAULT; - - CopyRect(&r, &(nmcd->nmcd.rc)); - r.left += ((r.right - r.left) - - KHUI_TOOLBAR_IMAGE_WIDTH) / 2; - r.top += ((r.bottom - r.top) - - KHUI_TOOLBAR_IMAGE_HEIGHT) / 2; - - khui_ilist_draw(ilist_toolbar, - iidx, - nmcd->nmcd.hdc, - r.left, - r.top, - 0); - - return CDRF_DODEFAULT; - } - } - break; - } - return 0; -} - -void khui_add_action_to_toolbar(HWND tb, khui_action *a, int opt, HIMAGELIST hiList) { - wchar_t buf[MAX_RES_STRING] = L""; - int idx_caption = 0; - TBBUTTON bn; - LRESULT lr; - - ZeroMemory(&bn,sizeof(bn)); - - if(opt & KHUI_TOOLBAR_ADD_SEP) { - bn.fsStyle = BTNS_SEP; - bn.iBitmap = 3; - - lr = SendMessage(tb, - TB_ADDBUTTONS, - 1, - (LPARAM) &bn); -#ifdef DEBUG - assert(lr); -#endif - return; - } - - bn.fsStyle = BTNS_BUTTON; - - if(opt & KHUI_TOOLBAR_VARSIZE) { - bn.fsStyle |= BTNS_AUTOSIZE; - } - - if(opt & KHUI_TOOLBAR_ADD_TEXT) { - int sid = 0; - if((opt & KHUI_TOOLBAR_ADD_LONGTEXT) == - KHUI_TOOLBAR_ADD_LONGTEXT) { - sid = a->is_tooltip; - } - if(!sid) - sid = a->is_caption; - if(sid) { - LoadString(khm_hInstance, - sid, - buf, ARRAYLENGTH(buf)); - buf[wcslen(buf) + 1] = L'\0'; - idx_caption = (int) SendMessage(tb, - TB_ADDSTRING, - (WPARAM) NULL, - (LPARAM) buf); -#if (_WIN32_IE >= 0x0501) - bn.fsStyle |= BTNS_SHOWTEXT; -#endif - bn.iString = idx_caption; - } - } - - if(opt & KHUI_TOOLBAR_ADD_DROPDOWN) { - bn.fsStyle |= BTNS_DROPDOWN; - } - - if((opt & KHUI_TOOLBAR_ADD_BITMAP) && a->ib_normal) { - bn.fsStyle |= TBSTYLE_CUSTOMERASE; - bn.iBitmap = khui_tb_blank; - } else { -#if (_WIN32_IE >= 0x0501) - bn.iBitmap = I_IMAGENONE; -#endif - } - - bn.idCommand = a->cmd; - - if(a->state & KHUI_ACTIONSTATE_DISABLED) { - bn.fsState = 0; - } else { - bn.fsState = TBSTATE_ENABLED; - } - - if(a->state & KHUI_ACTIONSTATE_CHECKED) { - bn.fsState |= TBSTATE_CHECKED; - } - - bn.dwData = 0; - - lr = SendMessage( - tb, - TB_ADDBUTTONS, - 1, - (LPARAM) &bn); - -#ifdef DEBUG - assert(lr); -#endif -} - -void khm_update_standard_toolbar(void) -{ - khui_menu_def * def; - khui_action_ref * aref; - khui_action * act; - - def = khui_find_menu(KHUI_TOOLBAR_STANDARD); - - aref = def->items; - - while(aref && aref->action != KHUI_MENU_END) { - if(aref->action == KHUI_MENU_SEP) { - aref++; - continue; - } - - act = khui_find_action(aref->action); - if(act) { - BOOL enable; - - enable = !(act->state & KHUI_ACTIONSTATE_DISABLED); - SendMessage(khui_hwnd_standard_toolbar, - TB_ENABLEBUTTON, - (WPARAM) act->cmd, - MAKELPARAM(enable, 0)); - } - - aref++; - } -} - -void khm_create_standard_toolbar(HWND rebar) { - HWND hwtb; - SIZE sz; - HBITMAP hbm_blank; - HIMAGELIST hiList; - REBARBANDINFO rbi; - khui_menu_def * def; - khui_action * act; - khui_action_ref * aref; - int idx_blank; - - def = khui_find_menu(KHUI_TOOLBAR_STANDARD); - - if (!def) { -#ifdef DEBUG - assert(FALSE); -#else - return; -#endif - } - - hwtb = CreateWindowEx(0 -#if (_WIN32_IE >= 0x0501) - | TBSTYLE_EX_MIXEDBUTTONS -#endif - , - TOOLBARCLASSNAME, - (LPWSTR) NULL, - WS_CHILD | - TBSTYLE_FLAT | - TBSTYLE_AUTOSIZE | - TBSTYLE_LIST | - TBSTYLE_TOOLTIPS | - CCS_NORESIZE | - CCS_NOPARENTALIGN | - CCS_ADJUSTABLE | - CCS_NODIVIDER, - 0, 0, 0, 0, rebar, - (HMENU) NULL, khm_hInstance, - NULL); - - if(!hwtb) { -#ifdef DEBUG - assert(FALSE); -#else - return; -#endif - } - - hiList = ImageList_Create( - KHUI_TOOLBAR_IMAGE_WIDTH, - KHUI_TOOLBAR_IMAGE_HEIGHT, - ILC_MASK, - (int) khui_action_list_length(def->items), - 3); - - hbm_blank = LoadImage(khm_hInstance, - MAKEINTRESOURCE(IDB_TB_BLANK), - IMAGE_BITMAP, - KHUI_TOOLBAR_IMAGE_WIDTH, - KHUI_TOOLBAR_IMAGE_HEIGHT, 0); - idx_blank = ImageList_AddMasked(hiList, hbm_blank, RGB(0,0,0)); - - khui_hwnd_standard_toolbar = hwtb; - khui_tb_blank = idx_blank; - - def = khui_find_menu(KHUI_TOOLBAR_STANDARD); - - aref = def->items; - - SendMessage(hwtb, - TB_BUTTONSTRUCTSIZE, - sizeof(TBBUTTON), - 0); - - SendMessage(hwtb, - TB_SETBITMAPSIZE, - 0, - MAKELONG(KHUI_TOOLBAR_IMAGE_WIDTH,KHUI_TOOLBAR_IMAGE_HEIGHT)); - - SendMessage(hwtb, - TB_SETIMAGELIST, - 0, - (LPARAM) hiList); - - SendMessage(hwtb, - TB_SETBUTTONSIZE, - 0, - MAKELONG(KHUI_TOOLBAR_IMAGE_WIDTH,KHUI_TOOLBAR_IMAGE_HEIGHT)); - - while(aref && aref->action != KHUI_MENU_END) { - if(aref->action == KHUI_MENU_SEP) { - khui_add_action_to_toolbar(hwtb, - NULL, - KHUI_TOOLBAR_ADD_SEP, - hiList); - } else { - act = khui_find_action(aref->action); - khui_add_action_to_toolbar(hwtb, - act, - KHUI_TOOLBAR_ADD_BITMAP, - hiList); - } - aref ++; - } - - SendMessage(hwtb, - TB_AUTOSIZE, - 0,0); - - SendMessage(hwtb, - TB_GETMAXSIZE, - 0, - (LPARAM) &sz); - - sz.cy += 5; - - ZeroMemory(&rbi, sizeof(rbi)); - - rbi.cbSize = sizeof(rbi); - rbi.fMask = - RBBIM_ID | - RBBIM_CHILD | - RBBIM_CHILDSIZE | - RBBIM_IDEALSIZE | - RBBIM_SIZE | - RBBIM_STYLE; - rbi.fStyle = - RBBS_USECHEVRON | - RBBS_BREAK; - rbi.hwndChild = hwtb; - - rbi.wID = KHUI_TOOLBAR_STANDARD; - rbi.cx = sz.cx; - rbi.cxMinChild = sz.cx; - rbi.cyMinChild = sz.cy; - rbi.cyChild = rbi.cyMinChild; - rbi.cyMaxChild = rbi.cyMinChild; - rbi.cyIntegral = rbi.cyMinChild; - - rbi.cxIdeal = rbi.cx; - - SendMessage(rebar, - RB_INSERTBAND, - 0, - (LPARAM) &rbi); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +HWND khui_hwnd_standard_toolbar; +int khui_tb_blank; + +khui_ilist * ilist_toolbar; + +void khui_init_toolbar(void) { + ilist_toolbar = khui_create_ilist(KHUI_TOOLBAR_IMAGE_WIDTH, KHUI_TOOLBAR_IMAGE_HEIGHT, KHUI_TOOLBAR_MAX_BTNS, 5, 0); +} + +void khui_exit_toolbar(void) { + khui_delete_ilist(ilist_toolbar); +} + +LRESULT khm_toolbar_notify(LPNMHDR notice) { + switch(notice->code) { + case TBN_GETINFOTIP: + { + LPNMTBGETINFOTIP git = (LPNMTBGETINFOTIP) notice; + int cmd; + khui_action * a; + + cmd = git->iItem; + a = khui_find_action(cmd); + + if (a) { + if (a->caption) { + StringCchCopy(git->pszText, git->cchTextMax, a->caption); + } else if (a->tooltip) { + StringCchCopy(git->pszText, git->cchTextMax, a->tooltip); + } else if (a->is_caption) { + wchar_t buf[INFOTIPSIZE]; + + buf[0] = L'\0'; + LoadString(khm_hInstance, a->is_caption, + buf, ARRAYLENGTH(buf)); + + StringCchCopy(git->pszText, git->cchTextMax, buf); + } else { + StringCchCopy(git->pszText, git->cchTextMax, L""); + } + } else { + StringCchCopy(git->pszText, + git->cchTextMax, + L""); + } + } + break; + + case TBN_HOTITEMCHANGE: + { + LPNMTBHOTITEM hi = (LPNMTBHOTITEM) notice; + + if (hi->dwFlags & HICF_LEAVING) { + khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, L""); + } else { + khui_action * a; + int cmd; + wchar_t buf[256]; + + cmd = hi->idNew; + a = khui_find_action(cmd); + + buf[0] = L'\0'; + + if (a) { + if (a->tooltip) + StringCbCopy(buf, sizeof(buf), a->tooltip); + else if (a->is_tooltip) { + LoadString(khm_hInstance, a->is_tooltip, + buf, ARRAYLENGTH(buf)); + } + } + + khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, buf); + } + } + break; + + case NM_CUSTOMDRAW: + { + LPNMTBCUSTOMDRAW nmcd = (LPNMTBCUSTOMDRAW) notice; + if(nmcd->nmcd.dwDrawStage == CDDS_PREPAINT) { + return CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTERASE; + } else if(nmcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { + return CDRF_NOTIFYPOSTPAINT; + } else if(nmcd->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT) { + /* draw the actual icon */ + int iidx; + int ibmp; + HBITMAP hbmp; + RECT r; + + khui_action * act = + khui_find_action((int) nmcd->nmcd.dwItemSpec); + + if(!act || !act->ib_normal) + return CDRF_DODEFAULT; + + if((act->state & KHUI_ACTIONSTATE_DISABLED) && + act->ib_disabled) { + ibmp = act->ib_disabled; + } else if(act->ib_hot && + ((nmcd->nmcd.uItemState & CDIS_HOT) || + (nmcd->nmcd.uItemState & CDIS_SELECTED))){ + ibmp = act->ib_hot; + } else { + ibmp = act->ib_normal; + } + + iidx = khui_ilist_lookup_id(ilist_toolbar, ibmp); + if(iidx < 0) { + hbmp = LoadImage(khm_hInstance, + MAKEINTRESOURCE(ibmp), + IMAGE_BITMAP, + KHUI_TOOLBAR_IMAGE_WIDTH, + KHUI_TOOLBAR_IMAGE_HEIGHT, 0); + iidx = + khui_ilist_add_masked_id(ilist_toolbar, + hbmp, + KHUI_TOOLBAR_BGCOLOR, + ibmp); + DeleteObject(hbmp); + } + + if(iidx < 0) + return CDRF_DODEFAULT; + + CopyRect(&r, &(nmcd->nmcd.rc)); + r.left += ((r.right - r.left) - + KHUI_TOOLBAR_IMAGE_WIDTH) / 2; + r.top += ((r.bottom - r.top) - + KHUI_TOOLBAR_IMAGE_HEIGHT) / 2; + + khui_ilist_draw(ilist_toolbar, + iidx, + nmcd->nmcd.hdc, + r.left, + r.top, + 0); + + return CDRF_DODEFAULT; + } + } + break; + } + return 0; +} + +void khui_add_action_to_toolbar(HWND tb, khui_action *a, int opt, HIMAGELIST hiList) { + wchar_t buf[MAX_RES_STRING] = L""; + int idx_caption = 0; + TBBUTTON bn; + LRESULT lr; + + ZeroMemory(&bn,sizeof(bn)); + + if(opt & KHUI_TOOLBAR_ADD_SEP) { + bn.fsStyle = BTNS_SEP; + bn.iBitmap = 3; + + lr = SendMessage(tb, + TB_ADDBUTTONS, + 1, + (LPARAM) &bn); +#ifdef DEBUG + assert(lr); +#endif + return; + } + + bn.fsStyle = BTNS_BUTTON; + + if(opt & KHUI_TOOLBAR_VARSIZE) { + bn.fsStyle |= BTNS_AUTOSIZE; + } + + if(opt & KHUI_TOOLBAR_ADD_TEXT) { + int sid = 0; + if((opt & KHUI_TOOLBAR_ADD_LONGTEXT) == + KHUI_TOOLBAR_ADD_LONGTEXT) { + sid = a->is_tooltip; + } + if(!sid) + sid = a->is_caption; + if(sid) { + LoadString(khm_hInstance, + sid, + buf, ARRAYLENGTH(buf)); + buf[wcslen(buf) + 1] = L'\0'; + idx_caption = (int) SendMessage(tb, + TB_ADDSTRING, + (WPARAM) NULL, + (LPARAM) buf); +#if (_WIN32_IE >= 0x0501) + bn.fsStyle |= BTNS_SHOWTEXT; +#endif + bn.iString = idx_caption; + } + } + + if(opt & KHUI_TOOLBAR_ADD_DROPDOWN) { + bn.fsStyle |= BTNS_DROPDOWN; + } + + if((opt & KHUI_TOOLBAR_ADD_BITMAP) && a->ib_normal) { + bn.fsStyle |= TBSTYLE_CUSTOMERASE; + bn.iBitmap = khui_tb_blank; + } else { +#if (_WIN32_IE >= 0x0501) + bn.iBitmap = I_IMAGENONE; +#endif + } + + bn.idCommand = a->cmd; + + if(a->state & KHUI_ACTIONSTATE_DISABLED) { + bn.fsState = 0; + } else { + bn.fsState = TBSTATE_ENABLED; + } + + if(a->state & KHUI_ACTIONSTATE_CHECKED) { + bn.fsState |= TBSTATE_CHECKED; + } + + bn.dwData = 0; + + lr = SendMessage( + tb, + TB_ADDBUTTONS, + 1, + (LPARAM) &bn); + +#ifdef DEBUG + assert(lr); +#endif +} + +void khm_update_standard_toolbar(void) +{ + khui_menu_def * def; + khui_action_ref * aref; + khui_action * act; + + def = khui_find_menu(KHUI_TOOLBAR_STANDARD); + + aref = def->items; + + while(aref && aref->action != KHUI_MENU_END) { + if(aref->action == KHUI_MENU_SEP) { + aref++; + continue; + } + + act = khui_find_action(aref->action); + if(act) { + BOOL enable; + + enable = !(act->state & KHUI_ACTIONSTATE_DISABLED); + SendMessage(khui_hwnd_standard_toolbar, + TB_ENABLEBUTTON, + (WPARAM) act->cmd, + MAKELPARAM(enable, 0)); + } + + aref++; + } +} + +void khm_create_standard_toolbar(HWND rebar) { + HWND hwtb; + SIZE sz; + HBITMAP hbm_blank; + HIMAGELIST hiList; + REBARBANDINFO rbi; + khui_menu_def * def; + khui_action * act; + khui_action_ref * aref; + int idx_blank; + + def = khui_find_menu(KHUI_TOOLBAR_STANDARD); + + if (!def) { +#ifdef DEBUG + assert(FALSE); +#else + return; +#endif + } + + hwtb = CreateWindowEx(0 +#if (_WIN32_IE >= 0x0501) + | TBSTYLE_EX_MIXEDBUTTONS +#endif + , + TOOLBARCLASSNAME, + (LPWSTR) NULL, + WS_CHILD | + TBSTYLE_FLAT | + TBSTYLE_AUTOSIZE | + TBSTYLE_LIST | + TBSTYLE_TOOLTIPS | + CCS_NORESIZE | + CCS_NOPARENTALIGN | + CCS_ADJUSTABLE | + CCS_NODIVIDER, + 0, 0, 0, 0, rebar, + (HMENU) NULL, khm_hInstance, + NULL); + + if(!hwtb) { +#ifdef DEBUG + assert(FALSE); +#else + return; +#endif + } + + hiList = ImageList_Create( + KHUI_TOOLBAR_IMAGE_WIDTH, + KHUI_TOOLBAR_IMAGE_HEIGHT, + ILC_MASK, + (int) khui_action_list_length(def->items), + 3); + + hbm_blank = LoadImage(khm_hInstance, + MAKEINTRESOURCE(IDB_TB_BLANK), + IMAGE_BITMAP, + KHUI_TOOLBAR_IMAGE_WIDTH, + KHUI_TOOLBAR_IMAGE_HEIGHT, 0); + idx_blank = ImageList_AddMasked(hiList, hbm_blank, RGB(0,0,0)); + + khui_hwnd_standard_toolbar = hwtb; + khui_tb_blank = idx_blank; + + def = khui_find_menu(KHUI_TOOLBAR_STANDARD); + + aref = def->items; + + SendMessage(hwtb, + TB_BUTTONSTRUCTSIZE, + sizeof(TBBUTTON), + 0); + + SendMessage(hwtb, + TB_SETBITMAPSIZE, + 0, + MAKELONG(KHUI_TOOLBAR_IMAGE_WIDTH,KHUI_TOOLBAR_IMAGE_HEIGHT)); + + SendMessage(hwtb, + TB_SETIMAGELIST, + 0, + (LPARAM) hiList); + + SendMessage(hwtb, + TB_SETBUTTONSIZE, + 0, + MAKELONG(KHUI_TOOLBAR_IMAGE_WIDTH,KHUI_TOOLBAR_IMAGE_HEIGHT)); + + while(aref && aref->action != KHUI_MENU_END) { + if(aref->action == KHUI_MENU_SEP) { + khui_add_action_to_toolbar(hwtb, + NULL, + KHUI_TOOLBAR_ADD_SEP, + hiList); + } else { + act = khui_find_action(aref->action); + khui_add_action_to_toolbar(hwtb, + act, + KHUI_TOOLBAR_ADD_BITMAP, + hiList); + } + aref ++; + } + + SendMessage(hwtb, + TB_AUTOSIZE, + 0,0); + + SendMessage(hwtb, + TB_GETMAXSIZE, + 0, + (LPARAM) &sz); + + sz.cy += 5; + + ZeroMemory(&rbi, sizeof(rbi)); + + rbi.cbSize = sizeof(rbi); + rbi.fMask = + RBBIM_ID | + RBBIM_CHILD | + RBBIM_CHILDSIZE | + RBBIM_IDEALSIZE | + RBBIM_SIZE | + RBBIM_STYLE; + rbi.fStyle = + RBBS_USECHEVRON | + RBBS_BREAK; + rbi.hwndChild = hwtb; + + rbi.wID = KHUI_TOOLBAR_STANDARD; + rbi.cx = sz.cx; + rbi.cxMinChild = sz.cx; + rbi.cyMinChild = sz.cy; + rbi.cyChild = rbi.cyMinChild; + rbi.cyMaxChild = rbi.cyMinChild; + rbi.cyIntegral = rbi.cyMinChild; + + rbi.cxIdeal = rbi.cx; + + SendMessage(rebar, + RB_INSERTBAND, + 0, + (LPARAM) &rbi); +} --- krb5-1.4.4.orig/src/windows/identity/ui/mainmenu.c +++ krb5-1.4.4/src/windows/identity/ui/mainmenu.c @@ -1,688 +1,688 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -HWND khui_main_menu_toolbar; -int mm_last_hot_item = -1; -int mm_next_hot_item = -1; -BOOL mm_hot_track = FALSE; - -#define MAX_ILIST 256 -/* not the same as MENU_SIZE_ICON_* */ -#define ILIST_ICON_X 16 -#define ILIST_ICON_Y 15 - -khui_ilist * il_icon; -int il_icon_id[MAX_ILIST]; - -void khui_init_menu(void) { - int i; - - il_icon = khui_create_ilist(ILIST_ICON_X, - ILIST_ICON_Y, - MAX_ILIST, 5, 0); - for(i=0;icmd); - - mii.cbSize = sizeof(mii); - mii.fMask = 0; - - if(act == NULL) { - mii.fMask = MIIM_FTYPE; - mii.fType = MFT_SEPARATOR; - } else { - khui_menu_def * def; - - if (act->caption) { - StringCbCopy(buf, sizeof(buf), act->caption); - } else { - LoadString(khm_hInstance, - act->is_caption, - buf, ARRAYLENGTH(buf)); - } - - if(khui_get_cmd_accel_string(act->cmd, accel, - ARRAYLENGTH(accel))) { - StringCbCat(buf, sizeof(buf), L"\t"); - StringCbCat(buf, sizeof(buf), accel); - } - - mii.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID; - mii.fType = MFT_STRING; - - mii.dwTypeData = buf; - mii.cch = (int) wcslen(buf); - - mii.wID = act->cmd; - - if(act->state & KHUI_ACTIONSTATE_DISABLED) { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } else { - mii.fState = 0; - } - - if((act->type & KHUI_ACTIONTYPE_TOGGLE) && - (act->state & KHUI_ACTIONSTATE_CHECKED)) { - mii.fMask |= MIIM_STATE; - mii.fState |= MFS_CHECKED; - } - - if(act->ib_icon) { - mii.fMask |= MIIM_BITMAP; - mii.hbmpItem = HBMMENU_CALLBACK; - } - - if (flags & KHUI_ACTIONREF_SUBMENU) { - def = khui_find_menu(act->cmd); - if(def) { - mii.fMask |= MIIM_SUBMENU; - mii.hSubMenu = mm_create_menu_from_def(def, FALSE); - } - } - - if(flags & KHUI_ACTIONREF_DEFAULT) - mii.fState |= MFS_DEFAULT; - } - - InsertMenuItem(hm,idx,TRUE,&mii); -} - -static void refresh_menu(HMENU hm, khui_menu_def * def); - -static void refresh_menu_item(HMENU hm, khui_action * act, - int idx, int flags) { - MENUITEMINFO mii; - - mii.cbSize = sizeof(mii); - mii.fMask = 0; - - if (act == NULL) - return; - else { - khui_menu_def * def; - - /* first check if the menu item is there. Otherwise we need - to add it. */ - mii.fMask = MIIM_STATE; - if (!GetMenuItemInfo(hm, act->cmd, FALSE, &mii)) { - /* the 1000 is fairly arbitrary, but there should be much - less menu items on a menu anyway. If there are that - many items, the system would be unusable to the extent - that the order of the items would be the least of our - worries. */ - add_action_to_menu(hm, act, 1000, flags); - return; - } - - mii.fMask = 0; - - if(act->state & KHUI_ACTIONSTATE_DISABLED) { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_DISABLED; - } else { - mii.fMask |= MIIM_STATE; - mii.fState = MFS_ENABLED; - } - - if(act->type & KHUI_ACTIONTYPE_TOGGLE) { - mii.fMask |= MIIM_STATE; - if (act->state & KHUI_ACTIONSTATE_CHECKED) { - mii.fState |= MFS_CHECKED; - } else { - mii.fState |= MFS_UNCHECKED; - } - } - - SetMenuItemInfo(hm, act->cmd, FALSE, &mii); - - def = khui_find_menu(act->cmd); - if(def) { - MENUITEMINFO mii2; - - mii2.cbSize = sizeof(mii2); - mii2.fMask = MIIM_SUBMENU; - - if (GetMenuItemInfo(hm, act->cmd, FALSE, &mii2)) { - refresh_menu(mii2.hSubMenu, def); - } - } - } -} - -static void refresh_menu(HMENU hm, khui_menu_def * def) { - khui_action_ref * act; - int i; - - act = def->items; - i = 0; - while ((def->n_items == -1 && act->action != KHUI_MENU_END) || - (def->n_items >= 0 && i < (int) def->n_items)) { - refresh_menu_item(hm, khui_find_action(act->action), i, act->flags); - act++; i++; - } -} - -static HMENU mm_create_menu_from_def(khui_menu_def * def, BOOL main) { - HMENU hm; - khui_action_ref * act; - int i; - - if (main) - hm = CreateMenu(); - else - hm = CreatePopupMenu(); - - act = def->items; - i = 0; - while((!(def->state & KHUI_MENUSTATE_ALLOCD) && act->action != KHUI_MENU_END) || - ((def->state & KHUI_MENUSTATE_ALLOCD) && i < (int) def->n_items)) { - add_action_to_menu(hm,khui_find_action(act->action),i,act->flags); - act++; i++; - } - - return hm; -} - -void mm_begin_hot_track(void); -void mm_end_hot_track(void); - -static void mm_show_panel_def(khui_menu_def * def, LONG x, LONG y) -{ - HMENU hm; - - hm = mm_create_menu_from_def(def, FALSE); - - mm_hot_track = (mm_last_hot_item >= 0); - - if (mm_hot_track) - mm_begin_hot_track(); - - TrackPopupMenuEx(hm, - TPM_LEFTALIGN | TPM_TOPALIGN | - TPM_VERPOSANIMATION, - x, y, khm_hwnd_main, NULL); - - mm_last_hot_item = -1; - - if (mm_hot_track) - mm_end_hot_track(); - - mm_hot_track = FALSE; - - DestroyMenu(hm); -} - -void khm_menu_show_panel(int id, LONG x, LONG y) { - khui_menu_def * def; - - def = khui_find_menu(id); - if(!def) - return; - - mm_show_panel_def(def, x, y); -} - -LRESULT khm_menu_activate(int menu_id) { - khui_menu_def * mmdef; - int nmm; - - mmdef = khui_find_menu(KHUI_MENU_MAIN); - nmm = (int) khui_action_list_length(mmdef->items); - - if(menu_id == MENU_ACTIVATE_DEFAULT) { - if (mm_last_hot_item != -1) - menu_id = mm_last_hot_item; - else - menu_id = 0; - } else if(menu_id == MENU_ACTIVATE_LEFT) { - menu_id = (mm_last_hot_item > 0)? - mm_last_hot_item - 1: - ((mm_last_hot_item == 0)? nmm - 1: 0); - } else if(menu_id == MENU_ACTIVATE_RIGHT) { - menu_id = (mm_last_hot_item >=0 && mm_last_hot_item < nmm - 1)? - mm_last_hot_item + 1: - 0; - } else if(menu_id == MENU_ACTIVATE_NONE) { - menu_id = -1; - } - - SendMessage(khui_main_menu_toolbar, - TB_SETHOTITEM, - menu_id, - 0); - - khm_menu_track_current(); - - return TRUE; -} - -LRESULT khm_menu_measure_item(WPARAM wParam, LPARAM lParam) { - /* all menu icons have a fixed size */ - LPMEASUREITEMSTRUCT lpm = (LPMEASUREITEMSTRUCT) lParam; - lpm->itemWidth = MENU_SIZE_ICON_X; - lpm->itemHeight = MENU_SIZE_ICON_Y; - return TRUE; -} - -LRESULT khm_menu_draw_item(WPARAM wParam, LPARAM lParam) { - LPDRAWITEMSTRUCT lpd; - khui_action * act; - int resid; - int iidx; - UINT style; - - lpd = (LPDRAWITEMSTRUCT) lParam; - act = khui_find_action(lpd->itemID); - - resid = 0; - if((lpd->itemState & ODS_DISABLED) || (lpd->itemState & ODS_GRAYED)) { - resid = act->ib_icon_dis; - } - if(!resid) - resid = act->ib_icon; - - if(!resid) /* nothing to draw */ - return TRUE; - - - iidx = khui_get_icon_index(resid); - if(iidx == -1) - return TRUE; - - - style = ILD_TRANSPARENT; - if(lpd->itemState & ODS_HOTLIGHT || lpd->itemState & ODS_SELECTED) { - style |= ILD_SELECTED; - } - - khui_ilist_draw(il_icon, - iidx, - lpd->hDC, - lpd->rcItem.left, lpd->rcItem.top, style); - - return TRUE; -} - -void khm_track_menu(int menu) { - TBBUTTON bi; - RECT r; - RECT wr; - - if (menu != -1) - mm_last_hot_item = menu; - - if (mm_last_hot_item != -1) { - SendMessage(khui_main_menu_toolbar, - TB_GETBUTTON, - mm_last_hot_item, - (LPARAM) &bi); - - SendMessage(khui_main_menu_toolbar, - TB_GETITEMRECT, - mm_last_hot_item, - (LPARAM) &r); - - GetWindowRect(khui_main_menu_toolbar, &wr); - - khm_menu_show_panel(bi.idCommand, wr.left + r.left, wr.top + r.bottom); - - r.left = 0; - - if (mm_next_hot_item != -1) { - mm_last_hot_item = mm_next_hot_item; - mm_next_hot_item = -1; - - PostMessage(khm_hwnd_main, WM_COMMAND, - MAKEWPARAM(KHUI_PACTION_MENU,0), - MAKELPARAM(mm_last_hot_item,1)); - } - } -} - -void khm_menu_track_current(void) { - khm_track_menu(-1); -} - -LRESULT khm_menu_handle_select(WPARAM wParam, LPARAM lParam) { - if((HIWORD(wParam) == 0xffff && lParam == 0) || - (HIWORD(wParam) & MF_POPUP)) { - /* the menu was closed */ - khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, NULL); - } else { - khui_action * act; - int id; - wchar_t buf[MAX_RES_STRING] = L""; - - id = LOWORD(wParam); - act = khui_find_action(id); - if(act == NULL || (act->is_tooltip == 0 && act->tooltip == NULL)) - khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, NULL); - else { - if (act->tooltip) - StringCbCopy(buf, sizeof(buf), act->tooltip); - else - LoadString(khm_hInstance, - act->is_tooltip, - buf, ARRAYLENGTH(buf)); - khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, buf); - } - } - return 0; -} - -HHOOK mm_hevt_hook = NULL; -HWND mm_hwnd_menu_panel = NULL; - -LRESULT CALLBACK mm_event_filter(int code, - WPARAM wParam, - LPARAM lParam) { - MSG * m; - RECT r; - int x,y; - - if (code == MSGF_MENU) { - /* do stuff */ - m = (MSG *) lParam; - GetWindowRect(khui_main_menu_toolbar, &r); - - if (m->hwnd != khm_hwnd_main) - mm_hwnd_menu_panel = m->hwnd; - - switch(m->message) { - case WM_MOUSEMOVE: - - x = GET_X_LPARAM(m->lParam); - y = GET_Y_LPARAM(m->lParam); - x -= r.left; - y -= r.top; - - SendMessage(khui_main_menu_toolbar, - m->message, - m->wParam, - MAKELPARAM(x,y)); - break; - } - } - - return CallNextHookEx(mm_hevt_hook, code, wParam, lParam); -} - - -void mm_begin_hot_track(void) { - - if (mm_hevt_hook) - UnhookWindowsHookEx(mm_hevt_hook); - - mm_hevt_hook = SetWindowsHookEx(WH_MSGFILTER, - mm_event_filter, - NULL, - GetCurrentThreadId()); -} - -void mm_end_hot_track(void) { - if (mm_hevt_hook) - UnhookWindowsHookEx(mm_hevt_hook); - - mm_hevt_hook = NULL; - mm_hwnd_menu_panel = NULL; -} - -void mm_cancel_menu(void) { - if (mm_hwnd_menu_panel) - SendMessage(mm_hwnd_menu_panel, WM_CANCELMODE, 0, 0); -} - -LRESULT khm_menu_notify_main(LPNMHDR notice) { - LPNMTOOLBAR nmt; - LRESULT ret = FALSE; - RECT r; - khui_menu_def * mmdef; - khui_action_ref * mm; - int nmm; - - mmdef = khui_find_menu(KHUI_MENU_MAIN); - mm = mmdef->items; - nmm = (int) khui_action_list_length(mm); - - GetWindowRect(khui_main_menu_toolbar, &r); - - nmt = (LPNMTOOLBAR) notice; - switch(notice->code) { - case TBN_DROPDOWN: - khm_track_menu(-1); - /* - khm_menu_show_panel(nmt->iItem, - r.left + nmt->rcButton.left, - r.top + nmt->rcButton.bottom); - */ - ret = TBDDRET_DEFAULT; - break; - - case TBN_HOTITEMCHANGE: - { - LPNMTBHOTITEM nmhi; - int new_item = -1; - - nmhi = (LPNMTBHOTITEM) notice; - - if(nmhi->dwFlags & HICF_LEAVING) - new_item = -1; - else { - int i; - for(i=0; i < nmm; i++) { - if(mm[i].action == nmhi->idNew) { - new_item = i; - break; - } - } - } - - if (mm_hot_track && - new_item != mm_last_hot_item && - new_item != -1 && - mm_last_hot_item != -1) { - - EndMenu(); - mm_next_hot_item = new_item; - - } - - ret = 0; - - if (!mm_hot_track || new_item != -1) - mm_last_hot_item = new_item; - - } break; - - default: - /* hmm. what to do */ - ret = FALSE; - } - return ret; -} - -HMENU khui_hmenu_main = NULL; - -void khm_menu_refresh_items(void) { - khui_menu_def * def; - - if (!khui_hmenu_main) - return; - - def = khui_find_menu(KHUI_MENU_MAIN); - - refresh_menu(khui_hmenu_main, def); - - DrawMenuBar(khm_hwnd_main); -} - -void khm_menu_create_main(HWND parent) { - HMENU hmenu; - khui_menu_def * def; - - def = khui_find_menu(KHUI_MENU_MAIN); - - hmenu = mm_create_menu_from_def(def, TRUE); - - SetMenu(parent, hmenu); - - khui_hmenu_main = hmenu; - - return; - -#ifdef USE_EXPLORER_STYLE_MENU_BAR - HWND hwtb; - REBARBANDINFO rbi; - SIZE sz; - int i; - khui_menu_def * mmdef; - khui_action_ref * mm; - int nmm; - - mmdef = khui_find_menu(KHUI_MENU_MAIN); - mm = mmdef->items; - nmm = (int) khui_action_list_length(mm); - - hwtb = CreateWindowEx(0 -#if (_WIN32_IE >= 0x0501) - | TBSTYLE_EX_MIXEDBUTTONS -#endif - , - TOOLBARCLASSNAME, - (LPWSTR) NULL, - WS_CHILD | - CCS_ADJUSTABLE | - TBSTYLE_FLAT | - TBSTYLE_AUTOSIZE | - TBSTYLE_LIST | - CCS_NORESIZE | - CCS_NOPARENTALIGN | - CCS_NODIVIDER, - 0, 0, 0, 0, rebar, - (HMENU) NULL, khm_hInstance, - NULL); - - if(!hwtb) { -#ifdef DEBUG - assert(FALSE); -#else - return; -#endif - } - - khui_main_menu_toolbar = hwtb; - - SendMessage(hwtb, - TB_BUTTONSTRUCTSIZE, - (WPARAM) sizeof(TBBUTTON), - 0); - - for(i=0; i +#include + +HWND khui_main_menu_toolbar; +int mm_last_hot_item = -1; +int mm_next_hot_item = -1; +BOOL mm_hot_track = FALSE; + +#define MAX_ILIST 256 +/* not the same as MENU_SIZE_ICON_* */ +#define ILIST_ICON_X 16 +#define ILIST_ICON_Y 15 + +khui_ilist * il_icon; +int il_icon_id[MAX_ILIST]; + +void khui_init_menu(void) { + int i; + + il_icon = khui_create_ilist(ILIST_ICON_X, + ILIST_ICON_Y, + MAX_ILIST, 5, 0); + for(i=0;icmd); + + mii.cbSize = sizeof(mii); + mii.fMask = 0; + + if(act == NULL) { + mii.fMask = MIIM_FTYPE; + mii.fType = MFT_SEPARATOR; + } else { + khui_menu_def * def; + + if (act->caption) { + StringCbCopy(buf, sizeof(buf), act->caption); + } else { + LoadString(khm_hInstance, + act->is_caption, + buf, ARRAYLENGTH(buf)); + } + + if(khui_get_cmd_accel_string(act->cmd, accel, + ARRAYLENGTH(accel))) { + StringCbCat(buf, sizeof(buf), L"\t"); + StringCbCat(buf, sizeof(buf), accel); + } + + mii.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID; + mii.fType = MFT_STRING; + + mii.dwTypeData = buf; + mii.cch = (int) wcslen(buf); + + mii.wID = act->cmd; + + if(act->state & KHUI_ACTIONSTATE_DISABLED) { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } else { + mii.fState = 0; + } + + if((act->type & KHUI_ACTIONTYPE_TOGGLE) && + (act->state & KHUI_ACTIONSTATE_CHECKED)) { + mii.fMask |= MIIM_STATE; + mii.fState |= MFS_CHECKED; + } + + if(act->ib_icon) { + mii.fMask |= MIIM_BITMAP; + mii.hbmpItem = HBMMENU_CALLBACK; + } + + if (flags & KHUI_ACTIONREF_SUBMENU) { + def = khui_find_menu(act->cmd); + if(def) { + mii.fMask |= MIIM_SUBMENU; + mii.hSubMenu = mm_create_menu_from_def(def, FALSE); + } + } + + if(flags & KHUI_ACTIONREF_DEFAULT) + mii.fState |= MFS_DEFAULT; + } + + InsertMenuItem(hm,idx,TRUE,&mii); +} + +static void refresh_menu(HMENU hm, khui_menu_def * def); + +static void refresh_menu_item(HMENU hm, khui_action * act, + int idx, int flags) { + MENUITEMINFO mii; + + mii.cbSize = sizeof(mii); + mii.fMask = 0; + + if (act == NULL) + return; + else { + khui_menu_def * def; + + /* first check if the menu item is there. Otherwise we need + to add it. */ + mii.fMask = MIIM_STATE; + if (!GetMenuItemInfo(hm, act->cmd, FALSE, &mii)) { + /* the 1000 is fairly arbitrary, but there should be much + less menu items on a menu anyway. If there are that + many items, the system would be unusable to the extent + that the order of the items would be the least of our + worries. */ + add_action_to_menu(hm, act, 1000, flags); + return; + } + + mii.fMask = 0; + + if(act->state & KHUI_ACTIONSTATE_DISABLED) { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_DISABLED; + } else { + mii.fMask |= MIIM_STATE; + mii.fState = MFS_ENABLED; + } + + if(act->type & KHUI_ACTIONTYPE_TOGGLE) { + mii.fMask |= MIIM_STATE; + if (act->state & KHUI_ACTIONSTATE_CHECKED) { + mii.fState |= MFS_CHECKED; + } else { + mii.fState |= MFS_UNCHECKED; + } + } + + SetMenuItemInfo(hm, act->cmd, FALSE, &mii); + + def = khui_find_menu(act->cmd); + if(def) { + MENUITEMINFO mii2; + + mii2.cbSize = sizeof(mii2); + mii2.fMask = MIIM_SUBMENU; + + if (GetMenuItemInfo(hm, act->cmd, FALSE, &mii2)) { + refresh_menu(mii2.hSubMenu, def); + } + } + } +} + +static void refresh_menu(HMENU hm, khui_menu_def * def) { + khui_action_ref * act; + int i; + + act = def->items; + i = 0; + while ((def->n_items == -1 && act->action != KHUI_MENU_END) || + (def->n_items >= 0 && i < (int) def->n_items)) { + refresh_menu_item(hm, khui_find_action(act->action), i, act->flags); + act++; i++; + } +} + +static HMENU mm_create_menu_from_def(khui_menu_def * def, BOOL main) { + HMENU hm; + khui_action_ref * act; + int i; + + if (main) + hm = CreateMenu(); + else + hm = CreatePopupMenu(); + + act = def->items; + i = 0; + while((!(def->state & KHUI_MENUSTATE_ALLOCD) && act->action != KHUI_MENU_END) || + ((def->state & KHUI_MENUSTATE_ALLOCD) && i < (int) def->n_items)) { + add_action_to_menu(hm,khui_find_action(act->action),i,act->flags); + act++; i++; + } + + return hm; +} + +void mm_begin_hot_track(void); +void mm_end_hot_track(void); + +static void mm_show_panel_def(khui_menu_def * def, LONG x, LONG y) +{ + HMENU hm; + + hm = mm_create_menu_from_def(def, FALSE); + + mm_hot_track = (mm_last_hot_item >= 0); + + if (mm_hot_track) + mm_begin_hot_track(); + + TrackPopupMenuEx(hm, + TPM_LEFTALIGN | TPM_TOPALIGN | + TPM_VERPOSANIMATION, + x, y, khm_hwnd_main, NULL); + + mm_last_hot_item = -1; + + if (mm_hot_track) + mm_end_hot_track(); + + mm_hot_track = FALSE; + + DestroyMenu(hm); +} + +void khm_menu_show_panel(int id, LONG x, LONG y) { + khui_menu_def * def; + + def = khui_find_menu(id); + if(!def) + return; + + mm_show_panel_def(def, x, y); +} + +LRESULT khm_menu_activate(int menu_id) { + khui_menu_def * mmdef; + int nmm; + + mmdef = khui_find_menu(KHUI_MENU_MAIN); + nmm = (int) khui_action_list_length(mmdef->items); + + if(menu_id == MENU_ACTIVATE_DEFAULT) { + if (mm_last_hot_item != -1) + menu_id = mm_last_hot_item; + else + menu_id = 0; + } else if(menu_id == MENU_ACTIVATE_LEFT) { + menu_id = (mm_last_hot_item > 0)? + mm_last_hot_item - 1: + ((mm_last_hot_item == 0)? nmm - 1: 0); + } else if(menu_id == MENU_ACTIVATE_RIGHT) { + menu_id = (mm_last_hot_item >=0 && mm_last_hot_item < nmm - 1)? + mm_last_hot_item + 1: + 0; + } else if(menu_id == MENU_ACTIVATE_NONE) { + menu_id = -1; + } + + SendMessage(khui_main_menu_toolbar, + TB_SETHOTITEM, + menu_id, + 0); + + khm_menu_track_current(); + + return TRUE; +} + +LRESULT khm_menu_measure_item(WPARAM wParam, LPARAM lParam) { + /* all menu icons have a fixed size */ + LPMEASUREITEMSTRUCT lpm = (LPMEASUREITEMSTRUCT) lParam; + lpm->itemWidth = MENU_SIZE_ICON_X; + lpm->itemHeight = MENU_SIZE_ICON_Y; + return TRUE; +} + +LRESULT khm_menu_draw_item(WPARAM wParam, LPARAM lParam) { + LPDRAWITEMSTRUCT lpd; + khui_action * act; + int resid; + int iidx; + UINT style; + + lpd = (LPDRAWITEMSTRUCT) lParam; + act = khui_find_action(lpd->itemID); + + resid = 0; + if((lpd->itemState & ODS_DISABLED) || (lpd->itemState & ODS_GRAYED)) { + resid = act->ib_icon_dis; + } + if(!resid) + resid = act->ib_icon; + + if(!resid) /* nothing to draw */ + return TRUE; + + + iidx = khui_get_icon_index(resid); + if(iidx == -1) + return TRUE; + + + style = ILD_TRANSPARENT; + if(lpd->itemState & ODS_HOTLIGHT || lpd->itemState & ODS_SELECTED) { + style |= ILD_SELECTED; + } + + khui_ilist_draw(il_icon, + iidx, + lpd->hDC, + lpd->rcItem.left, lpd->rcItem.top, style); + + return TRUE; +} + +void khm_track_menu(int menu) { + TBBUTTON bi; + RECT r; + RECT wr; + + if (menu != -1) + mm_last_hot_item = menu; + + if (mm_last_hot_item != -1) { + SendMessage(khui_main_menu_toolbar, + TB_GETBUTTON, + mm_last_hot_item, + (LPARAM) &bi); + + SendMessage(khui_main_menu_toolbar, + TB_GETITEMRECT, + mm_last_hot_item, + (LPARAM) &r); + + GetWindowRect(khui_main_menu_toolbar, &wr); + + khm_menu_show_panel(bi.idCommand, wr.left + r.left, wr.top + r.bottom); + + r.left = 0; + + if (mm_next_hot_item != -1) { + mm_last_hot_item = mm_next_hot_item; + mm_next_hot_item = -1; + + PostMessage(khm_hwnd_main, WM_COMMAND, + MAKEWPARAM(KHUI_PACTION_MENU,0), + MAKELPARAM(mm_last_hot_item,1)); + } + } +} + +void khm_menu_track_current(void) { + khm_track_menu(-1); +} + +LRESULT khm_menu_handle_select(WPARAM wParam, LPARAM lParam) { + if((HIWORD(wParam) == 0xffff && lParam == 0) || + (HIWORD(wParam) & MF_POPUP)) { + /* the menu was closed */ + khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, NULL); + } else { + khui_action * act; + int id; + wchar_t buf[MAX_RES_STRING] = L""; + + id = LOWORD(wParam); + act = khui_find_action(id); + if(act == NULL || (act->is_tooltip == 0 && act->tooltip == NULL)) + khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, NULL); + else { + if (act->tooltip) + StringCbCopy(buf, sizeof(buf), act->tooltip); + else + LoadString(khm_hInstance, + act->is_tooltip, + buf, ARRAYLENGTH(buf)); + khm_statusbar_set_part(KHUI_SBPART_INFO, NULL, buf); + } + } + return 0; +} + +HHOOK mm_hevt_hook = NULL; +HWND mm_hwnd_menu_panel = NULL; + +LRESULT CALLBACK mm_event_filter(int code, + WPARAM wParam, + LPARAM lParam) { + MSG * m; + RECT r; + int x,y; + + if (code == MSGF_MENU) { + /* do stuff */ + m = (MSG *) lParam; + GetWindowRect(khui_main_menu_toolbar, &r); + + if (m->hwnd != khm_hwnd_main) + mm_hwnd_menu_panel = m->hwnd; + + switch(m->message) { + case WM_MOUSEMOVE: + + x = GET_X_LPARAM(m->lParam); + y = GET_Y_LPARAM(m->lParam); + x -= r.left; + y -= r.top; + + SendMessage(khui_main_menu_toolbar, + m->message, + m->wParam, + MAKELPARAM(x,y)); + break; + } + } + + return CallNextHookEx(mm_hevt_hook, code, wParam, lParam); +} + + +void mm_begin_hot_track(void) { + + if (mm_hevt_hook) + UnhookWindowsHookEx(mm_hevt_hook); + + mm_hevt_hook = SetWindowsHookEx(WH_MSGFILTER, + mm_event_filter, + NULL, + GetCurrentThreadId()); +} + +void mm_end_hot_track(void) { + if (mm_hevt_hook) + UnhookWindowsHookEx(mm_hevt_hook); + + mm_hevt_hook = NULL; + mm_hwnd_menu_panel = NULL; +} + +void mm_cancel_menu(void) { + if (mm_hwnd_menu_panel) + SendMessage(mm_hwnd_menu_panel, WM_CANCELMODE, 0, 0); +} + +LRESULT khm_menu_notify_main(LPNMHDR notice) { + LPNMTOOLBAR nmt; + LRESULT ret = FALSE; + RECT r; + khui_menu_def * mmdef; + khui_action_ref * mm; + int nmm; + + mmdef = khui_find_menu(KHUI_MENU_MAIN); + mm = mmdef->items; + nmm = (int) khui_action_list_length(mm); + + GetWindowRect(khui_main_menu_toolbar, &r); + + nmt = (LPNMTOOLBAR) notice; + switch(notice->code) { + case TBN_DROPDOWN: + khm_track_menu(-1); + /* + khm_menu_show_panel(nmt->iItem, + r.left + nmt->rcButton.left, + r.top + nmt->rcButton.bottom); + */ + ret = TBDDRET_DEFAULT; + break; + + case TBN_HOTITEMCHANGE: + { + LPNMTBHOTITEM nmhi; + int new_item = -1; + + nmhi = (LPNMTBHOTITEM) notice; + + if(nmhi->dwFlags & HICF_LEAVING) + new_item = -1; + else { + int i; + for(i=0; i < nmm; i++) { + if(mm[i].action == nmhi->idNew) { + new_item = i; + break; + } + } + } + + if (mm_hot_track && + new_item != mm_last_hot_item && + new_item != -1 && + mm_last_hot_item != -1) { + + EndMenu(); + mm_next_hot_item = new_item; + + } + + ret = 0; + + if (!mm_hot_track || new_item != -1) + mm_last_hot_item = new_item; + + } break; + + default: + /* hmm. what to do */ + ret = FALSE; + } + return ret; +} + +HMENU khui_hmenu_main = NULL; + +void khm_menu_refresh_items(void) { + khui_menu_def * def; + + if (!khui_hmenu_main) + return; + + def = khui_find_menu(KHUI_MENU_MAIN); + + refresh_menu(khui_hmenu_main, def); + + DrawMenuBar(khm_hwnd_main); +} + +void khm_menu_create_main(HWND parent) { + HMENU hmenu; + khui_menu_def * def; + + def = khui_find_menu(KHUI_MENU_MAIN); + + hmenu = mm_create_menu_from_def(def, TRUE); + + SetMenu(parent, hmenu); + + khui_hmenu_main = hmenu; + + return; + +#ifdef USE_EXPLORER_STYLE_MENU_BAR + HWND hwtb; + REBARBANDINFO rbi; + SIZE sz; + int i; + khui_menu_def * mmdef; + khui_action_ref * mm; + int nmm; + + mmdef = khui_find_menu(KHUI_MENU_MAIN); + mm = mmdef->items; + nmm = (int) khui_action_list_length(mm); + + hwtb = CreateWindowEx(0 +#if (_WIN32_IE >= 0x0501) + | TBSTYLE_EX_MIXEDBUTTONS +#endif + , + TOOLBARCLASSNAME, + (LPWSTR) NULL, + WS_CHILD | + CCS_ADJUSTABLE | + TBSTYLE_FLAT | + TBSTYLE_AUTOSIZE | + TBSTYLE_LIST | + CCS_NORESIZE | + CCS_NOPARENTALIGN | + CCS_NODIVIDER, + 0, 0, 0, 0, rebar, + (HMENU) NULL, khm_hInstance, + NULL); + + if(!hwtb) { +#ifdef DEBUG + assert(FALSE); +#else + return; +#endif + } + + khui_main_menu_toolbar = hwtb; + + SendMessage(hwtb, + TB_BUTTONSTRUCTSIZE, + (WPARAM) sizeof(TBBUTTON), + 0); + + for(i=0; i -#include - -typedef struct tag_pw_data { - khm_handle record; - HWND hwnd_lv; -} pw_data; - -ATOM khui_propertywnd_cls; - -#define ID_LISTVIEW 1 - -#define PW_WM_SET_RECORD WM_USER - -void pw_update_property_data(HWND hw, pw_data * d) -{ - HWND hwnd_lv; - khm_int32 * attrs = NULL; - - hwnd_lv = d->hwnd_lv; - - if(hwnd_lv == NULL) - return; - - ListView_DeleteAllItems(hwnd_lv); - - if(d->record != NULL) { - wchar_t * buffer; - khm_size attr_count; - khm_size i; - khm_size cb_buf; - khm_size t; - LVITEM lvi; - int idx; - - if(KHM_FAILED(kcdb_attrib_get_count( - KCDB_ATTR_FLAG_VOLATILE | - KCDB_ATTR_FLAG_HIDDEN, - 0, - &attr_count))) - return; - - attrs = PMALLOC(sizeof(khm_int32) * attr_count); - assert(attrs != NULL); - - kcdb_attrib_get_ids( - KCDB_ATTR_FLAG_VOLATILE | - KCDB_ATTR_FLAG_HIDDEN, - 0, - attrs, - &attr_count); - - cb_buf = sizeof(wchar_t) * 2048; - buffer = PMALLOC(cb_buf); - assert(buffer != NULL); - - for(i=0; irecord, attrs[i], NULL, NULL, NULL))) - continue; - - ZeroMemory(&lvi, sizeof(lvi)); - lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.iItem = (int) i; - lvi.iSubItem = 0; - lvi.pszText = buffer; - lvi.lParam = (LPARAM) attrs[i]; - - t = cb_buf; - kcdb_attrib_describe(attrs[i], buffer, &t, KCDB_TS_SHORT); - - idx = ListView_InsertItem(hwnd_lv, &lvi); - - ZeroMemory(&lvi, sizeof(lvi)); - lvi.mask = LVIF_TEXT; - lvi.iItem = idx; - lvi.iSubItem = 1; - lvi.pszText = buffer; - - t = cb_buf; - kcdb_buf_get_attr_string(d->record, attrs[i], buffer, &t, 0); - - ListView_SetItem(hwnd_lv, &lvi); - } - - PFREE(attrs); - PFREE(buffer); - } -} - -LRESULT CALLBACK khui_property_wnd_proc( - HWND hwnd, - UINT msg, - WPARAM wParam, - LPARAM lParam) -{ - BOOL child_msg = FALSE; - pw_data * child; - - switch(msg) { - case WM_CREATE: - { - CREATESTRUCT * cs; - LVCOLUMN lvc; - wchar_t sz_title[256]; - - cs = (CREATESTRUCT *) lParam; - - child = PMALLOC(sizeof(*child)); - ZeroMemory(child, sizeof(*child)); - -#pragma warning(push) -#pragma warning(disable:4244) - SetWindowLongPtr(hwnd, 0, (LONG_PTR) child); -#pragma warning(pop) - - child->hwnd_lv = CreateWindow( - WC_LISTVIEW, - L"", - WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | - LVS_REPORT | LVS_SORTASCENDING, - 0, 0, - cs->cx, cs->cy, - hwnd, - (HMENU) ID_LISTVIEW, - khm_hInstance, - NULL); - - ListView_SetExtendedListViewStyle(child->hwnd_lv, - LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); - - ZeroMemory(&lvc, sizeof(lvc)); - lvc.mask = LVCF_FMT | LVCF_ORDER | LVCF_TEXT | LVCF_WIDTH; - lvc.fmt = LVCFMT_LEFT; - lvc.cx = (cs->cx * 2)/ 5; - lvc.pszText = sz_title; - lvc.iSubItem = 0; - lvc.iOrder = 0; - LoadString(khm_hInstance, IDS_PROP_COL_PROPERTY, sz_title, ARRAYLENGTH(sz_title)); - - ListView_InsertColumn(child->hwnd_lv, 0, &lvc); - - ZeroMemory(&lvc, sizeof(lvc)); - lvc.mask = LVCF_FMT | LVCF_ORDER | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; - lvc.fmt = LVCFMT_LEFT; - lvc.cx = (cs->cx * 3)/ 5; - lvc.pszText = sz_title; - lvc.iSubItem = 1; - lvc.iOrder = 1; - LoadString(khm_hInstance, IDS_PROP_COL_VALUE, sz_title, ARRAYLENGTH(sz_title)); - - ListView_InsertColumn(child->hwnd_lv, 1, &lvc); - - if(cs->lpCreateParams != NULL) { - child->record = cs->lpCreateParams; - kcdb_buf_hold(child->record); - pw_update_property_data(hwnd, child); - } - } - break; - - case PW_WM_SET_RECORD: - { - child = (pw_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - kcdb_buf_release(child->record); - child->record = (khm_handle) lParam; - kcdb_buf_hold(child->record); - pw_update_property_data(hwnd, child); - } - return 0; - - case WM_DESTROY: - { - child = (pw_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - kcdb_buf_release(child->record); - PFREE(child); - } - break; - - case WM_PAINT: - break; - - default: - child = (pw_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - child_msg = TRUE; - } - - /* - if(child_msg && child && child->hwnd_lv) - return SendMessage(child->hwnd_lv, msg, wParam, lParam); - else - */ - return DefWindowProc(hwnd, msg, wParam, lParam); -} - -khm_int32 khm_register_propertywnd_class(void) -{ - WNDCLASSEX wcx; - - wcx.cbSize = sizeof(wcx); - wcx.style = CS_DBLCLKS; - wcx.lpfnWndProc = khui_property_wnd_proc; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = sizeof(LONG_PTR); - wcx.hInstance = khm_hInstance; - wcx.hIcon = NULL; - wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); - wcx.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1); - wcx.lpszMenuName = NULL; - wcx.lpszClassName = KHUI_PROPERTYWND_CLASS_NAME; - wcx.hIconSm = NULL; - - khui_propertywnd_cls = RegisterClassEx(&wcx); - - return (khui_propertywnd_cls == 0)?KHM_ERROR_UNKNOWN:KHM_ERROR_SUCCESS; -} - -khm_int32 khm_unregister_propertywnd_class(void) -{ - UnregisterClass(MAKEINTATOM(khui_propertywnd_cls), khm_hInstance); - - return KHM_ERROR_SUCCESS; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +typedef struct tag_pw_data { + khm_handle record; + HWND hwnd_lv; +} pw_data; + +ATOM khui_propertywnd_cls; + +#define ID_LISTVIEW 1 + +#define PW_WM_SET_RECORD WM_USER + +void pw_update_property_data(HWND hw, pw_data * d) +{ + HWND hwnd_lv; + khm_int32 * attrs = NULL; + + hwnd_lv = d->hwnd_lv; + + if(hwnd_lv == NULL) + return; + + ListView_DeleteAllItems(hwnd_lv); + + if(d->record != NULL) { + wchar_t * buffer; + khm_size attr_count; + khm_size i; + khm_size cb_buf; + khm_size t; + LVITEM lvi; + int idx; + + if(KHM_FAILED(kcdb_attrib_get_count( + KCDB_ATTR_FLAG_VOLATILE | + KCDB_ATTR_FLAG_HIDDEN, + 0, + &attr_count))) + return; + + attrs = PMALLOC(sizeof(khm_int32) * attr_count); + assert(attrs != NULL); + + kcdb_attrib_get_ids( + KCDB_ATTR_FLAG_VOLATILE | + KCDB_ATTR_FLAG_HIDDEN, + 0, + attrs, + &attr_count); + + cb_buf = sizeof(wchar_t) * 2048; + buffer = PMALLOC(cb_buf); + assert(buffer != NULL); + + for(i=0; irecord, attrs[i], NULL, NULL, NULL))) + continue; + + ZeroMemory(&lvi, sizeof(lvi)); + lvi.mask = LVIF_TEXT | LVIF_PARAM; + lvi.iItem = (int) i; + lvi.iSubItem = 0; + lvi.pszText = buffer; + lvi.lParam = (LPARAM) attrs[i]; + + t = cb_buf; + kcdb_attrib_describe(attrs[i], buffer, &t, KCDB_TS_SHORT); + + idx = ListView_InsertItem(hwnd_lv, &lvi); + + ZeroMemory(&lvi, sizeof(lvi)); + lvi.mask = LVIF_TEXT; + lvi.iItem = idx; + lvi.iSubItem = 1; + lvi.pszText = buffer; + + t = cb_buf; + kcdb_buf_get_attr_string(d->record, attrs[i], buffer, &t, 0); + + ListView_SetItem(hwnd_lv, &lvi); + } + + PFREE(attrs); + PFREE(buffer); + } +} + +LRESULT CALLBACK khui_property_wnd_proc( + HWND hwnd, + UINT msg, + WPARAM wParam, + LPARAM lParam) +{ + BOOL child_msg = FALSE; + pw_data * child; + + switch(msg) { + case WM_CREATE: + { + CREATESTRUCT * cs; + LVCOLUMN lvc; + wchar_t sz_title[256]; + + cs = (CREATESTRUCT *) lParam; + + child = PMALLOC(sizeof(*child)); + ZeroMemory(child, sizeof(*child)); + +#pragma warning(push) +#pragma warning(disable:4244) + SetWindowLongPtr(hwnd, 0, (LONG_PTR) child); +#pragma warning(pop) + + child->hwnd_lv = CreateWindow( + WC_LISTVIEW, + L"", + WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | + LVS_REPORT | LVS_SORTASCENDING, + 0, 0, + cs->cx, cs->cy, + hwnd, + (HMENU) ID_LISTVIEW, + khm_hInstance, + NULL); + + ListView_SetExtendedListViewStyle(child->hwnd_lv, + LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); + + ZeroMemory(&lvc, sizeof(lvc)); + lvc.mask = LVCF_FMT | LVCF_ORDER | LVCF_TEXT | LVCF_WIDTH; + lvc.fmt = LVCFMT_LEFT; + lvc.cx = (cs->cx * 2)/ 5; + lvc.pszText = sz_title; + lvc.iSubItem = 0; + lvc.iOrder = 0; + LoadString(khm_hInstance, IDS_PROP_COL_PROPERTY, sz_title, ARRAYLENGTH(sz_title)); + + ListView_InsertColumn(child->hwnd_lv, 0, &lvc); + + ZeroMemory(&lvc, sizeof(lvc)); + lvc.mask = LVCF_FMT | LVCF_ORDER | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH; + lvc.fmt = LVCFMT_LEFT; + lvc.cx = (cs->cx * 3)/ 5; + lvc.pszText = sz_title; + lvc.iSubItem = 1; + lvc.iOrder = 1; + LoadString(khm_hInstance, IDS_PROP_COL_VALUE, sz_title, ARRAYLENGTH(sz_title)); + + ListView_InsertColumn(child->hwnd_lv, 1, &lvc); + + if(cs->lpCreateParams != NULL) { + child->record = cs->lpCreateParams; + kcdb_buf_hold(child->record); + pw_update_property_data(hwnd, child); + } + } + break; + + case PW_WM_SET_RECORD: + { + child = (pw_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + kcdb_buf_release(child->record); + child->record = (khm_handle) lParam; + kcdb_buf_hold(child->record); + pw_update_property_data(hwnd, child); + } + return 0; + + case WM_DESTROY: + { + child = (pw_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + kcdb_buf_release(child->record); + PFREE(child); + } + break; + + case WM_PAINT: + break; + + default: + child = (pw_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + child_msg = TRUE; + } + + /* + if(child_msg && child && child->hwnd_lv) + return SendMessage(child->hwnd_lv, msg, wParam, lParam); + else + */ + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +khm_int32 khm_register_propertywnd_class(void) +{ + WNDCLASSEX wcx; + + wcx.cbSize = sizeof(wcx); + wcx.style = CS_DBLCLKS; + wcx.lpfnWndProc = khui_property_wnd_proc; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = sizeof(LONG_PTR); + wcx.hInstance = khm_hInstance; + wcx.hIcon = NULL; + wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); + wcx.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1); + wcx.lpszMenuName = NULL; + wcx.lpszClassName = KHUI_PROPERTYWND_CLASS_NAME; + wcx.hIconSm = NULL; + + khui_propertywnd_cls = RegisterClassEx(&wcx); + + return (khui_propertywnd_cls == 0)?KHM_ERROR_UNKNOWN:KHM_ERROR_SUCCESS; +} + +khm_int32 khm_unregister_propertywnd_class(void) +{ + UnregisterClass(MAKEINTATOM(khui_propertywnd_cls), khm_hInstance); + + return KHM_ERROR_SUCCESS; +} --- krb5-1.4.4.orig/src/windows/identity/ui/reqdaemon.h +++ krb5-1.4.4/src/windows/identity/ui/reqdaemon.h @@ -1,42 +1,42 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_REQDAEMON_H -#define __KHIMAIRA_REQDAEMON_H - -void -khm_register_reqdaemonwnd_class(void); - -void -khm_unregister_reqdaemonwnd_class(void); - -void -khm_init_request_daemon(void); - -void -khm_exit_request_daemon(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_REQDAEMON_H +#define __KHIMAIRA_REQDAEMON_H + +void +khm_register_reqdaemonwnd_class(void); + +void +khm_unregister_reqdaemonwnd_class(void); + +void +khm_init_request_daemon(void); + +void +khm_exit_request_daemon(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/credfuncs.h +++ krb5-1.4.4/src/windows/identity/ui/credfuncs.h @@ -1,83 +1,83 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_CREDFUNCS_H -#define __KHIMAIRA_CREDFUNCS_H - -void KHMAPI -kmsg_cred_completion(kmq_message *m); - -void -khm_cred_destroy_creds(khm_boolean sync, - khm_boolean quiet); - -void -khm_cred_renew_identity(khm_handle identity); - -void -khm_cred_renew_cred(khm_handle cred); - -void -khm_cred_renew_creds(void); - -void -khm_cred_obtain_new_creds(wchar_t * window_title); - -void -khm_cred_set_default(void); - -void -khm_cred_change_password(wchar_t * window_title); - -void -khm_cred_dispatch_process_message(khui_new_creds *nc); - -BOOL -khm_cred_dispatch_process_level(khui_new_creds *nc); - -BOOL -khm_cred_is_in_dialog(void); - -khm_int32 -khm_cred_wait_for_dialog(DWORD timeout, khm_int32 * result, - wchar_t * ident, khm_size cb_ident); - -void -khm_cred_begin_startup_actions(void); - -void -khm_cred_process_startup_actions(void); - -void -khm_cred_refresh(void); - -void -khm_cred_addr_change(void); - -void -khm_cred_import(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_CREDFUNCS_H +#define __KHIMAIRA_CREDFUNCS_H + +void KHMAPI +kmsg_cred_completion(kmq_message *m); + +void +khm_cred_destroy_creds(khm_boolean sync, + khm_boolean quiet); + +void +khm_cred_renew_identity(khm_handle identity); + +void +khm_cred_renew_cred(khm_handle cred); + +void +khm_cred_renew_creds(void); + +void +khm_cred_obtain_new_creds(wchar_t * window_title); + +void +khm_cred_set_default(void); + +void +khm_cred_change_password(wchar_t * window_title); + +void +khm_cred_dispatch_process_message(khui_new_creds *nc); + +BOOL +khm_cred_dispatch_process_level(khui_new_creds *nc); + +BOOL +khm_cred_is_in_dialog(void); + +khm_int32 +khm_cred_wait_for_dialog(DWORD timeout, khm_int32 * result, + wchar_t * ident, khm_size cb_ident); + +void +khm_cred_begin_startup_actions(void); + +void +khm_cred_process_startup_actions(void); + +void +khm_cred_refresh(void); + +void +khm_cred_addr_change(void); + +void +khm_cred_import(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/cfg_plugins_wnd.c +++ krb5-1.4.4/src/windows/identity/ui/cfg_plugins_wnd.c @@ -1,646 +1,646 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -#define MAX_PLUGINS 256 - -typedef struct tag_plugin_data { - kmm_plugin_info plugin; - kmm_module_info module; -} plugin_data; - -typedef struct tag_plugin_dlg_data { - plugin_data * info[MAX_PLUGINS]; - khm_size n_info; - - plugin_data * selected; - HICON plugin_ico; -} plugin_dlg_data; - -void update_dialog_fields(HWND hwnd, - plugin_dlg_data * d, - plugin_data * info) { - wchar_t buf[256]; - UINT resid; - wchar_t * t; - khm_handle csp_module = NULL; - - d->selected = info; - - if (info->plugin.reg.description) - SetDlgItemText(hwnd, IDC_CFG_DESC, info->plugin.reg.description); - else { - wchar_t fmt[128]; - - LoadString(khm_hInstance, IDS_CFG_NODESC, fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, info->plugin.reg.name); - SetDlgItemText(hwnd, IDC_CFG_DESC, buf); - } - - switch(info->plugin.state) { - case KMM_PLUGIN_STATE_FAIL_INIT: - resid = IDS_PISTATE_FAILINIT; - break; - - case KMM_PLUGIN_STATE_FAIL_UNKNOWN: - resid = IDS_PISTATE_FAILUNK; - break; - - case KMM_PLUGIN_STATE_FAIL_MAX_FAILURE: - resid = IDS_PISTATE_FAILMAX; - break; - - case KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED: - resid = IDS_PISTATE_FAILREG; - break; - - case KMM_PLUGIN_STATE_FAIL_DISABLED: - resid = IDS_PISTATE_FAILDIS; - break; - - case KMM_PLUGIN_STATE_FAIL_LOAD: - resid = IDS_PISTATE_FAILLOD; - break; - - case KMM_PLUGIN_STATE_NONE: - case KMM_PLUGIN_STATE_PLACEHOLDER: - resid = IDS_PISTATE_PLACEHOLD; - break; - - case KMM_PLUGIN_STATE_REG: - case KMM_PLUGIN_STATE_PREINIT: - resid = IDS_PISTATE_REG; - break; - - case KMM_PLUGIN_STATE_HOLD: - resid = IDS_PISTATE_HOLD; - break; - - case KMM_PLUGIN_STATE_INIT: - resid = IDS_PISTATE_INIT; - break; - - case KMM_PLUGIN_STATE_RUNNING: - resid = IDS_PISTATE_RUN; - break; - - case KMM_PLUGIN_STATE_EXITED: - resid = IDS_PISTATE_EXIT; - break; - - default: -#ifdef DEBUG - assert(FALSE); -#endif - resid = IDS_PISTATE_FAILUNK; - } - - LoadString(khm_hInstance, resid, - buf, ARRAYLENGTH(buf)); - - SetDlgItemText(hwnd, IDC_CFG_STATE, buf); - - SendDlgItemMessage(hwnd, IDC_CFG_DEPS, - LB_RESETCONTENT, 0, 0); - - for (t = info->plugin.reg.dependencies; t && *t; - t = multi_string_next(t)) { - SendDlgItemMessage(hwnd, IDC_CFG_DEPS, - LB_INSERTSTRING, -1, (LPARAM) t); - } - - if (info->plugin.reg.module) - SetDlgItemText(hwnd, IDC_CFG_MODULE, - info->plugin.reg.module); - else - SetDlgItemText(hwnd, IDC_CFG_MODULE, - L""); - - if (info->module.reg.vendor) - SetDlgItemText(hwnd, IDC_CFG_VENDOR, - info->module.reg.vendor); - else - SetDlgItemText(hwnd, IDC_CFG_VENDOR, - L""); - - StringCbPrintf(buf, sizeof(buf), L"%u.%u.%u.%u", - (unsigned int) info->module.product_version.major, - (unsigned int) info->module.product_version.minor, - (unsigned int) info->module.product_version.patch, - (unsigned int) info->module.product_version.aux); - - SetDlgItemText(hwnd, IDC_CFG_VERSION, buf); - - if (info->plugin.reg.icon) { - SendDlgItemMessage(hwnd, IDC_CFG_ICON, - STM_SETICON, - (WPARAM) info->plugin.reg.icon, - 0); - } else { - SendDlgItemMessage(hwnd, IDC_CFG_ICON, - STM_SETICON, - (WPARAM) d->plugin_ico, - 0); - } - - if (KHM_SUCCEEDED(kmm_get_module_config(info->module.reg.name, - 0, &csp_module)) && - (khc_value_exists(csp_module, L"ImagePath") & - (KCONF_FLAG_MACHINE | KCONF_FLAG_USER))) { - - EnableWindow(GetDlgItem(hwnd, IDC_CFG_UNREGISTER), TRUE); - } else { - EnableWindow(GetDlgItem(hwnd, IDC_CFG_UNREGISTER), FALSE); - } - - if (csp_module) - khc_close_space(csp_module); - - if (info->plugin.flags & KMM_PLUGIN_FLAG_DISABLED) { - EnableWindow(GetDlgItem(hwnd, IDC_CFG_ENABLE), TRUE); - EnableWindow(GetDlgItem(hwnd, IDC_CFG_DISABLE), FALSE); - } else { - EnableWindow(GetDlgItem(hwnd, IDC_CFG_ENABLE), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_CFG_DISABLE), TRUE); - } -} - -#define IDX_PLUGIN_NORMAL 1 -#define IDX_PLUGIN_DISABLED 2 -#define IDX_PLUGIN_ERROR 3 - -INT_PTR CALLBACK -khm_cfg_plugins_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - - plugin_dlg_data * d; - - switch(uMsg) { - case WM_INITDIALOG: - { - kmm_plugin p; - kmm_plugin pn; - kmm_module m; - khm_size i; - LVCOLUMN lvc; - RECT r; - HWND hw; - wchar_t buf[256]; - HIMAGELIST h_ilist; - HICON h_icon; - - d = PMALLOC(sizeof(*d)); -#ifdef DEBUG - assert(d); -#endif - ZeroMemory(d, sizeof(*d)); -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); -#pragma warning(pop) - - p = NULL; - i = 0; - do { - if (KHM_FAILED(kmm_get_next_plugin(p, &pn))) - break; - - if (p) - kmm_release_plugin(p); - p = pn; - -#ifdef DEBUG - assert(d->info[i] == NULL); -#endif - d->info[i] = PMALLOC(sizeof(*(d->info[i]))); -#ifdef DEBUG - assert(d->info[i]); -#endif - ZeroMemory(&d->info[i]->plugin, - sizeof(d->info[i]->plugin)); - - if (KHM_FAILED(kmm_get_plugin_info_i(p, &d->info[i]->plugin))) { - PFREE(d->info[i]); - d->info[i] = NULL; - break; - } - - ZeroMemory(&d->info[i]->module, - sizeof(d->info[i]->module)); - - if (KHM_SUCCEEDED(kmm_load_module(d->info[i]->plugin.reg.module, - KMM_LM_FLAG_NOLOAD, - &m))) { - kmm_get_module_info_i(m, &d->info[i]->module); - kmm_release_module(m); - } - - i ++; - - if (i == MAX_PLUGINS) - break; - } while(p); - - if (p) - kmm_release_plugin(p); - - d->n_info = i; - - /* now populate the list view */ - hw = GetDlgItem(hwnd, IDC_CFG_PLUGINS); -#ifdef DEBUG - assert(hw); -#endif - - h_ilist = ImageList_Create(GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), - ILC_COLOR8, - 4, 4); - - h_icon = LoadImage(khm_hInstance, - MAKEINTRESOURCE(IDI_CFG_PLUGIN), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), - LR_DEFAULTCOLOR); -#ifdef DEBUG - assert(h_icon); -#endif - ImageList_AddIcon(h_ilist, h_icon); - DestroyIcon(h_icon); - - h_icon = LoadImage(khm_hInstance, - MAKEINTRESOURCE(IDI_CFG_PLUGIN_DIS), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), - LR_DEFAULTCOLOR); -#ifdef DEBUG - assert(h_icon); -#endif - ImageList_AddIcon(h_ilist, h_icon); - DestroyIcon(h_icon); - - h_icon = LoadImage(khm_hInstance, - MAKEINTRESOURCE(IDI_CFG_PLUGIN_ERR), - IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), - GetSystemMetrics(SM_CYSMICON), - LR_DEFAULTCOLOR); -#ifdef DEBUG - assert(h_icon); -#endif - ImageList_AddIcon(h_ilist, h_icon); - DestroyIcon(h_icon); - - ListView_SetImageList(hw, h_ilist, LVSIL_STATE); - - ZeroMemory(&lvc, sizeof(lvc)); - - lvc.mask = LVCF_TEXT | LVCF_WIDTH; - GetWindowRect(hw, &r); - lvc.cx = ((r.right - r.left) * 95) / 100; - lvc.pszText = buf; - - LoadString(khm_hInstance, IDS_CFG_PI_COL_PLUGINS, - buf, ARRAYLENGTH(buf)); - - ListView_InsertColumn(hw, 0, &lvc); - - for(i=0; in_info; i++) { - LVITEM lvi; - - ZeroMemory(&lvi, sizeof(lvi)); - - lvi.mask = LVIF_PARAM | LVIF_TEXT | LVIF_STATE; - lvi.lParam = (LPARAM) d->info[i]; - lvi.pszText = d->info[i]->plugin.reg.name; - - if (d->info[i]->plugin.flags & KMM_PLUGIN_FLAG_DISABLED) { - lvi.state = INDEXTOSTATEIMAGEMASK(IDX_PLUGIN_DISABLED); - } else if (d->info[i]->plugin.state < 0) { - lvi.state = INDEXTOSTATEIMAGEMASK(IDX_PLUGIN_ERROR); - } else { - lvi.state = INDEXTOSTATEIMAGEMASK(IDX_PLUGIN_NORMAL); - } - - ListView_InsertItem(hw, &lvi); - } - - d->plugin_ico = - (HICON) LoadImage(khm_hInstance, - MAKEINTRESOURCE(IDI_CFG_PLUGIN), - IMAGE_ICON, - GetSystemMetrics(SM_CXICON), - GetSystemMetrics(SM_CYICON), - LR_DEFAULTCOLOR); - } - return FALSE; - - case WM_NOTIFY: - { - LPNMHDR lpnm; - HWND hw; - - d = (plugin_dlg_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (wParam == IDC_CFG_PLUGINS && - (lpnm = (LPNMHDR) lParam) && - lpnm->code == LVN_ITEMCHANGED) { - - LVITEM lvi; - - hw = GetDlgItem(hwnd, IDC_CFG_PLUGINS); -#ifdef DEBUG - assert(hw); -#endif - if (ListView_GetSelectedCount(hw) != 1) { - SetDlgItemText(hwnd, IDC_CFG_DESC, L""); - SetDlgItemText(hwnd, IDC_CFG_STATE, L""); - SetDlgItemText(hwnd, IDC_CFG_MODULE, L""); - SetDlgItemText(hwnd, IDC_CFG_VENDOR, L""); - SetDlgItemText(hwnd, IDC_CFG_VERSION, L""); - EnableWindow(GetDlgItem(hwnd, IDC_CFG_ENABLE), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_CFG_DISABLE), FALSE); - EnableWindow(GetDlgItem(hwnd, IDC_CFG_UNREGISTER), FALSE); - SendDlgItemMessage(hwnd, IDC_CFG_DEPS, - LB_RESETCONTENT, 0, 0); - SendDlgItemMessage(hwnd, IDC_CFG_ICON, STM_SETICON, - (WPARAM) d->plugin_ico, 0); - d->selected = NULL; - } else { - int idx; - plugin_data * info; - - idx = ListView_GetNextItem(hw, -1, LVNI_SELECTED); -#ifdef DEBUG - assert(idx != -1); -#endif - ZeroMemory(&lvi, sizeof(lvi)); - lvi.iItem = idx; - lvi.iSubItem = 0; - lvi.mask = LVIF_PARAM; - - ListView_GetItem(hw, &lvi); -#ifdef DEBUG - assert(lvi.lParam != 0); -#endif - info = (plugin_data *) lvi.lParam; - - update_dialog_fields(hwnd, d, info); - } - } - } - return TRUE; - - case WM_COMMAND: - { - - d = (plugin_dlg_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - switch (wParam) { - case MAKEWPARAM(IDC_CFG_ENABLE, BN_CLICKED): - if (d->selected != NULL) { - khui_alert * alert = NULL; - wchar_t buf[KHUI_MAXCCH_MESSAGE]; - wchar_t fmt[KHUI_MAXCCH_MESSAGE]; - kmm_plugin p; - - khui_alert_create_empty(&alert); - - LoadString(khm_hInstance, IDS_CFG_P_ENBCNFT, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); - khui_alert_set_title(alert, buf); - - LoadString(khm_hInstance, IDS_CFG_P_ENBCNFM, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); - khui_alert_set_message(alert, buf); - - khui_alert_set_severity(alert, KHERR_INFO); - - khui_alert_show_modal(alert); - - kmm_enable_plugin(d->selected->plugin.h_plugin, TRUE); - - khui_alert_release(alert); - - p = d->selected->plugin.h_plugin; - kmm_hold_plugin(p); - kmm_release_plugin_info_i(&d->selected->plugin); - kmm_get_plugin_info_i(p, &d->selected->plugin); - kmm_release_plugin(p); - - update_dialog_fields(hwnd, d, d->selected); - } - break; - - case MAKEWPARAM(IDC_CFG_DISABLE, BN_CLICKED): - if (d->selected != NULL) { - khui_alert * alert = NULL; - wchar_t buf[KHUI_MAXCCH_MESSAGE]; - wchar_t fmt[KHUI_MAXCCH_MESSAGE]; - wchar_t depends[KHUI_MAXCCH_MESSAGE]; - khm_size i; - kmm_plugin p; - - khui_alert_create_empty(&alert); -#ifdef DEBUG - assert(alert); -#endif - if (alert == NULL) - break; - - LoadString(khm_hInstance, IDS_CFG_P_DELCNFT, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); - khui_alert_set_title(alert, buf); - - LoadString(khm_hInstance, IDS_CFG_P_DELCNFM, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); - khui_alert_set_message(alert, buf); - - depends[0] = L'\0'; - - for (i=0; in_info; i++) { - wchar_t * t; - - t = d->info[i]->plugin.reg.dependencies; - - while(t) { - if (!wcscmp(t, d->selected->plugin.reg.name)) { - if (depends[0]) - StringCbCat(depends, sizeof(depends), L", "); - StringCbCat(depends, sizeof(depends), - d->info[i]->plugin.reg.name); - break; - } - t = multi_string_next(t); - } - } - - if (depends[0]) { - LoadString(khm_hInstance, IDS_CFG_P_DELCNFS, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, depends); - khui_alert_set_suggestion(alert, buf); - } else { - LoadString(khm_hInstance, IDS_CFG_P_DELNDEP, - buf, ARRAYLENGTH(buf)); - khui_alert_set_suggestion(alert, buf); - } - - khui_alert_add_command(alert, KHUI_PACTION_YES); - khui_alert_add_command(alert, KHUI_PACTION_NO); - - khui_alert_set_severity(alert, KHERR_WARNING); - - if (KHM_SUCCEEDED(khui_alert_show_modal(alert)) && - alert->response == KHUI_PACTION_YES) { - kmm_enable_plugin(d->selected->plugin.h_plugin, FALSE); - } - - khui_alert_release(alert); - - p = d->selected->plugin.h_plugin; - kmm_hold_plugin(p); - kmm_release_plugin_info_i(&d->selected->plugin); - kmm_get_plugin_info_i(p, &d->selected->plugin); - kmm_release_plugin(p); - - update_dialog_fields(hwnd, d, d->selected); - } - break; - - case MAKEWPARAM(IDC_CFG_UNREGISTER, BN_CLICKED): - { - khui_alert * alert = NULL; - wchar_t buf[KHUI_MAXCCH_MESSAGE]; - wchar_t fmt[KHUI_MAXCCH_MESSAGE]; - wchar_t plist[KHUI_MAXCCH_MESSAGE]; - khm_size i; - - if (d->selected == NULL) { -#ifdef DEBUG - assert(FALSE); -#endif - break; - } - - khui_alert_create_empty(&alert); - - LoadString(khm_hInstance, IDS_CFG_P_UNRCNFT, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, - d->selected->plugin.reg.name); - - khui_alert_set_title(alert, buf); - - LoadString(khm_hInstance, IDS_CFG_P_UNRCNFM, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, - d->selected->plugin.reg.name); - - khui_alert_set_message(alert, buf); - - plist[0] = L'\0'; - for (i=0; i < d->n_info; i++) { - if (!wcscmp(d->info[i]->module.reg.name, - d->selected->module.reg.name)) { - if (plist[0]) - StringCbCat(plist, sizeof(plist), L", "); - StringCbCat(plist, sizeof(plist), - d->info[i]->plugin.reg.name); - } - } - -#ifdef DEBUG - /* there should have been at least one plugin */ - assert(plist[0]); -#endif - - LoadString(khm_hInstance, IDS_CFG_P_UNRCNFS, - fmt, ARRAYLENGTH(fmt)); - StringCbPrintf(buf, sizeof(buf), fmt, plist); - khui_alert_set_suggestion(alert, buf); - - khui_alert_add_command(alert, KHUI_PACTION_YES); - khui_alert_add_command(alert, KHUI_PACTION_NO); - - khui_alert_set_severity(alert, KHERR_WARNING); - - if (KHM_SUCCEEDED(khui_alert_show_modal(alert)) && - alert->response == KHUI_PACTION_YES) { - kmm_unregister_module(d->selected->module.reg.name, 0); - - update_dialog_fields(hwnd, d, d->selected); - } - } - break; - - case MAKEWPARAM(IDC_CFG_REGISTER, BN_CLICKED): - { - - } - break; - } - } - return TRUE; - - case WM_DESTROY: - { - khm_size i; - - d = (plugin_dlg_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); -#ifdef DEBUG - assert(d); -#endif - for (i=0; in_info; i++) { -#ifdef DEBUG - assert(d->info[i]); -#endif - kmm_release_plugin_info_i(&d->info[i]->plugin); - kmm_release_module_info_i(&d->info[i]->module); - PFREE(d->info[i]); - } - - PFREE(d); - - khm_set_dialog_result(hwnd, 0); - } - return TRUE; - } - return FALSE; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +#define MAX_PLUGINS 256 + +typedef struct tag_plugin_data { + kmm_plugin_info plugin; + kmm_module_info module; +} plugin_data; + +typedef struct tag_plugin_dlg_data { + plugin_data * info[MAX_PLUGINS]; + khm_size n_info; + + plugin_data * selected; + HICON plugin_ico; +} plugin_dlg_data; + +void update_dialog_fields(HWND hwnd, + plugin_dlg_data * d, + plugin_data * info) { + wchar_t buf[256]; + UINT resid; + wchar_t * t; + khm_handle csp_module = NULL; + + d->selected = info; + + if (info->plugin.reg.description) + SetDlgItemText(hwnd, IDC_CFG_DESC, info->plugin.reg.description); + else { + wchar_t fmt[128]; + + LoadString(khm_hInstance, IDS_CFG_NODESC, fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, info->plugin.reg.name); + SetDlgItemText(hwnd, IDC_CFG_DESC, buf); + } + + switch(info->plugin.state) { + case KMM_PLUGIN_STATE_FAIL_INIT: + resid = IDS_PISTATE_FAILINIT; + break; + + case KMM_PLUGIN_STATE_FAIL_UNKNOWN: + resid = IDS_PISTATE_FAILUNK; + break; + + case KMM_PLUGIN_STATE_FAIL_MAX_FAILURE: + resid = IDS_PISTATE_FAILMAX; + break; + + case KMM_PLUGIN_STATE_FAIL_NOT_REGISTERED: + resid = IDS_PISTATE_FAILREG; + break; + + case KMM_PLUGIN_STATE_FAIL_DISABLED: + resid = IDS_PISTATE_FAILDIS; + break; + + case KMM_PLUGIN_STATE_FAIL_LOAD: + resid = IDS_PISTATE_FAILLOD; + break; + + case KMM_PLUGIN_STATE_NONE: + case KMM_PLUGIN_STATE_PLACEHOLDER: + resid = IDS_PISTATE_PLACEHOLD; + break; + + case KMM_PLUGIN_STATE_REG: + case KMM_PLUGIN_STATE_PREINIT: + resid = IDS_PISTATE_REG; + break; + + case KMM_PLUGIN_STATE_HOLD: + resid = IDS_PISTATE_HOLD; + break; + + case KMM_PLUGIN_STATE_INIT: + resid = IDS_PISTATE_INIT; + break; + + case KMM_PLUGIN_STATE_RUNNING: + resid = IDS_PISTATE_RUN; + break; + + case KMM_PLUGIN_STATE_EXITED: + resid = IDS_PISTATE_EXIT; + break; + + default: +#ifdef DEBUG + assert(FALSE); +#endif + resid = IDS_PISTATE_FAILUNK; + } + + LoadString(khm_hInstance, resid, + buf, ARRAYLENGTH(buf)); + + SetDlgItemText(hwnd, IDC_CFG_STATE, buf); + + SendDlgItemMessage(hwnd, IDC_CFG_DEPS, + LB_RESETCONTENT, 0, 0); + + for (t = info->plugin.reg.dependencies; t && *t; + t = multi_string_next(t)) { + SendDlgItemMessage(hwnd, IDC_CFG_DEPS, + LB_INSERTSTRING, -1, (LPARAM) t); + } + + if (info->plugin.reg.module) + SetDlgItemText(hwnd, IDC_CFG_MODULE, + info->plugin.reg.module); + else + SetDlgItemText(hwnd, IDC_CFG_MODULE, + L""); + + if (info->module.reg.vendor) + SetDlgItemText(hwnd, IDC_CFG_VENDOR, + info->module.reg.vendor); + else + SetDlgItemText(hwnd, IDC_CFG_VENDOR, + L""); + + StringCbPrintf(buf, sizeof(buf), L"%u.%u.%u.%u", + (unsigned int) info->module.product_version.major, + (unsigned int) info->module.product_version.minor, + (unsigned int) info->module.product_version.patch, + (unsigned int) info->module.product_version.aux); + + SetDlgItemText(hwnd, IDC_CFG_VERSION, buf); + + if (info->plugin.reg.icon) { + SendDlgItemMessage(hwnd, IDC_CFG_ICON, + STM_SETICON, + (WPARAM) info->plugin.reg.icon, + 0); + } else { + SendDlgItemMessage(hwnd, IDC_CFG_ICON, + STM_SETICON, + (WPARAM) d->plugin_ico, + 0); + } + + if (KHM_SUCCEEDED(kmm_get_module_config(info->module.reg.name, + 0, &csp_module)) && + (khc_value_exists(csp_module, L"ImagePath") & + (KCONF_FLAG_MACHINE | KCONF_FLAG_USER))) { + + EnableWindow(GetDlgItem(hwnd, IDC_CFG_UNREGISTER), TRUE); + } else { + EnableWindow(GetDlgItem(hwnd, IDC_CFG_UNREGISTER), FALSE); + } + + if (csp_module) + khc_close_space(csp_module); + + if (info->plugin.flags & KMM_PLUGIN_FLAG_DISABLED) { + EnableWindow(GetDlgItem(hwnd, IDC_CFG_ENABLE), TRUE); + EnableWindow(GetDlgItem(hwnd, IDC_CFG_DISABLE), FALSE); + } else { + EnableWindow(GetDlgItem(hwnd, IDC_CFG_ENABLE), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_CFG_DISABLE), TRUE); + } +} + +#define IDX_PLUGIN_NORMAL 1 +#define IDX_PLUGIN_DISABLED 2 +#define IDX_PLUGIN_ERROR 3 + +INT_PTR CALLBACK +khm_cfg_plugins_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + + plugin_dlg_data * d; + + switch(uMsg) { + case WM_INITDIALOG: + { + kmm_plugin p; + kmm_plugin pn; + kmm_module m; + khm_size i; + LVCOLUMN lvc; + RECT r; + HWND hw; + wchar_t buf[256]; + HIMAGELIST h_ilist; + HICON h_icon; + + d = PMALLOC(sizeof(*d)); +#ifdef DEBUG + assert(d); +#endif + ZeroMemory(d, sizeof(*d)); +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); +#pragma warning(pop) + + p = NULL; + i = 0; + do { + if (KHM_FAILED(kmm_get_next_plugin(p, &pn))) + break; + + if (p) + kmm_release_plugin(p); + p = pn; + +#ifdef DEBUG + assert(d->info[i] == NULL); +#endif + d->info[i] = PMALLOC(sizeof(*(d->info[i]))); +#ifdef DEBUG + assert(d->info[i]); +#endif + ZeroMemory(&d->info[i]->plugin, + sizeof(d->info[i]->plugin)); + + if (KHM_FAILED(kmm_get_plugin_info_i(p, &d->info[i]->plugin))) { + PFREE(d->info[i]); + d->info[i] = NULL; + break; + } + + ZeroMemory(&d->info[i]->module, + sizeof(d->info[i]->module)); + + if (KHM_SUCCEEDED(kmm_load_module(d->info[i]->plugin.reg.module, + KMM_LM_FLAG_NOLOAD, + &m))) { + kmm_get_module_info_i(m, &d->info[i]->module); + kmm_release_module(m); + } + + i ++; + + if (i == MAX_PLUGINS) + break; + } while(p); + + if (p) + kmm_release_plugin(p); + + d->n_info = i; + + /* now populate the list view */ + hw = GetDlgItem(hwnd, IDC_CFG_PLUGINS); +#ifdef DEBUG + assert(hw); +#endif + + h_ilist = ImageList_Create(GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + ILC_COLOR8, + 4, 4); + + h_icon = LoadImage(khm_hInstance, + MAKEINTRESOURCE(IDI_CFG_PLUGIN), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_DEFAULTCOLOR); +#ifdef DEBUG + assert(h_icon); +#endif + ImageList_AddIcon(h_ilist, h_icon); + DestroyIcon(h_icon); + + h_icon = LoadImage(khm_hInstance, + MAKEINTRESOURCE(IDI_CFG_PLUGIN_DIS), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_DEFAULTCOLOR); +#ifdef DEBUG + assert(h_icon); +#endif + ImageList_AddIcon(h_ilist, h_icon); + DestroyIcon(h_icon); + + h_icon = LoadImage(khm_hInstance, + MAKEINTRESOURCE(IDI_CFG_PLUGIN_ERR), + IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + LR_DEFAULTCOLOR); +#ifdef DEBUG + assert(h_icon); +#endif + ImageList_AddIcon(h_ilist, h_icon); + DestroyIcon(h_icon); + + ListView_SetImageList(hw, h_ilist, LVSIL_STATE); + + ZeroMemory(&lvc, sizeof(lvc)); + + lvc.mask = LVCF_TEXT | LVCF_WIDTH; + GetWindowRect(hw, &r); + lvc.cx = ((r.right - r.left) * 95) / 100; + lvc.pszText = buf; + + LoadString(khm_hInstance, IDS_CFG_PI_COL_PLUGINS, + buf, ARRAYLENGTH(buf)); + + ListView_InsertColumn(hw, 0, &lvc); + + for(i=0; in_info; i++) { + LVITEM lvi; + + ZeroMemory(&lvi, sizeof(lvi)); + + lvi.mask = LVIF_PARAM | LVIF_TEXT | LVIF_STATE; + lvi.lParam = (LPARAM) d->info[i]; + lvi.pszText = d->info[i]->plugin.reg.name; + + if (d->info[i]->plugin.flags & KMM_PLUGIN_FLAG_DISABLED) { + lvi.state = INDEXTOSTATEIMAGEMASK(IDX_PLUGIN_DISABLED); + } else if (d->info[i]->plugin.state < 0) { + lvi.state = INDEXTOSTATEIMAGEMASK(IDX_PLUGIN_ERROR); + } else { + lvi.state = INDEXTOSTATEIMAGEMASK(IDX_PLUGIN_NORMAL); + } + + ListView_InsertItem(hw, &lvi); + } + + d->plugin_ico = + (HICON) LoadImage(khm_hInstance, + MAKEINTRESOURCE(IDI_CFG_PLUGIN), + IMAGE_ICON, + GetSystemMetrics(SM_CXICON), + GetSystemMetrics(SM_CYICON), + LR_DEFAULTCOLOR); + } + return FALSE; + + case WM_NOTIFY: + { + LPNMHDR lpnm; + HWND hw; + + d = (plugin_dlg_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (wParam == IDC_CFG_PLUGINS && + (lpnm = (LPNMHDR) lParam) && + lpnm->code == LVN_ITEMCHANGED) { + + LVITEM lvi; + + hw = GetDlgItem(hwnd, IDC_CFG_PLUGINS); +#ifdef DEBUG + assert(hw); +#endif + if (ListView_GetSelectedCount(hw) != 1) { + SetDlgItemText(hwnd, IDC_CFG_DESC, L""); + SetDlgItemText(hwnd, IDC_CFG_STATE, L""); + SetDlgItemText(hwnd, IDC_CFG_MODULE, L""); + SetDlgItemText(hwnd, IDC_CFG_VENDOR, L""); + SetDlgItemText(hwnd, IDC_CFG_VERSION, L""); + EnableWindow(GetDlgItem(hwnd, IDC_CFG_ENABLE), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_CFG_DISABLE), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_CFG_UNREGISTER), FALSE); + SendDlgItemMessage(hwnd, IDC_CFG_DEPS, + LB_RESETCONTENT, 0, 0); + SendDlgItemMessage(hwnd, IDC_CFG_ICON, STM_SETICON, + (WPARAM) d->plugin_ico, 0); + d->selected = NULL; + } else { + int idx; + plugin_data * info; + + idx = ListView_GetNextItem(hw, -1, LVNI_SELECTED); +#ifdef DEBUG + assert(idx != -1); +#endif + ZeroMemory(&lvi, sizeof(lvi)); + lvi.iItem = idx; + lvi.iSubItem = 0; + lvi.mask = LVIF_PARAM; + + ListView_GetItem(hw, &lvi); +#ifdef DEBUG + assert(lvi.lParam != 0); +#endif + info = (plugin_data *) lvi.lParam; + + update_dialog_fields(hwnd, d, info); + } + } + } + return TRUE; + + case WM_COMMAND: + { + + d = (plugin_dlg_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + switch (wParam) { + case MAKEWPARAM(IDC_CFG_ENABLE, BN_CLICKED): + if (d->selected != NULL) { + khui_alert * alert = NULL; + wchar_t buf[KHUI_MAXCCH_MESSAGE]; + wchar_t fmt[KHUI_MAXCCH_MESSAGE]; + kmm_plugin p; + + khui_alert_create_empty(&alert); + + LoadString(khm_hInstance, IDS_CFG_P_ENBCNFT, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); + khui_alert_set_title(alert, buf); + + LoadString(khm_hInstance, IDS_CFG_P_ENBCNFM, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); + khui_alert_set_message(alert, buf); + + khui_alert_set_severity(alert, KHERR_INFO); + + khui_alert_show_modal(alert); + + kmm_enable_plugin(d->selected->plugin.h_plugin, TRUE); + + khui_alert_release(alert); + + p = d->selected->plugin.h_plugin; + kmm_hold_plugin(p); + kmm_release_plugin_info_i(&d->selected->plugin); + kmm_get_plugin_info_i(p, &d->selected->plugin); + kmm_release_plugin(p); + + update_dialog_fields(hwnd, d, d->selected); + } + break; + + case MAKEWPARAM(IDC_CFG_DISABLE, BN_CLICKED): + if (d->selected != NULL) { + khui_alert * alert = NULL; + wchar_t buf[KHUI_MAXCCH_MESSAGE]; + wchar_t fmt[KHUI_MAXCCH_MESSAGE]; + wchar_t depends[KHUI_MAXCCH_MESSAGE]; + khm_size i; + kmm_plugin p; + + khui_alert_create_empty(&alert); +#ifdef DEBUG + assert(alert); +#endif + if (alert == NULL) + break; + + LoadString(khm_hInstance, IDS_CFG_P_DELCNFT, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); + khui_alert_set_title(alert, buf); + + LoadString(khm_hInstance, IDS_CFG_P_DELCNFM, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, d->selected->plugin.reg.name); + khui_alert_set_message(alert, buf); + + depends[0] = L'\0'; + + for (i=0; in_info; i++) { + wchar_t * t; + + t = d->info[i]->plugin.reg.dependencies; + + while(t) { + if (!wcscmp(t, d->selected->plugin.reg.name)) { + if (depends[0]) + StringCbCat(depends, sizeof(depends), L", "); + StringCbCat(depends, sizeof(depends), + d->info[i]->plugin.reg.name); + break; + } + t = multi_string_next(t); + } + } + + if (depends[0]) { + LoadString(khm_hInstance, IDS_CFG_P_DELCNFS, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, depends); + khui_alert_set_suggestion(alert, buf); + } else { + LoadString(khm_hInstance, IDS_CFG_P_DELNDEP, + buf, ARRAYLENGTH(buf)); + khui_alert_set_suggestion(alert, buf); + } + + khui_alert_add_command(alert, KHUI_PACTION_YES); + khui_alert_add_command(alert, KHUI_PACTION_NO); + + khui_alert_set_severity(alert, KHERR_WARNING); + + if (KHM_SUCCEEDED(khui_alert_show_modal(alert)) && + alert->response == KHUI_PACTION_YES) { + kmm_enable_plugin(d->selected->plugin.h_plugin, FALSE); + } + + khui_alert_release(alert); + + p = d->selected->plugin.h_plugin; + kmm_hold_plugin(p); + kmm_release_plugin_info_i(&d->selected->plugin); + kmm_get_plugin_info_i(p, &d->selected->plugin); + kmm_release_plugin(p); + + update_dialog_fields(hwnd, d, d->selected); + } + break; + + case MAKEWPARAM(IDC_CFG_UNREGISTER, BN_CLICKED): + { + khui_alert * alert = NULL; + wchar_t buf[KHUI_MAXCCH_MESSAGE]; + wchar_t fmt[KHUI_MAXCCH_MESSAGE]; + wchar_t plist[KHUI_MAXCCH_MESSAGE]; + khm_size i; + + if (d->selected == NULL) { +#ifdef DEBUG + assert(FALSE); +#endif + break; + } + + khui_alert_create_empty(&alert); + + LoadString(khm_hInstance, IDS_CFG_P_UNRCNFT, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, + d->selected->plugin.reg.name); + + khui_alert_set_title(alert, buf); + + LoadString(khm_hInstance, IDS_CFG_P_UNRCNFM, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, + d->selected->plugin.reg.name); + + khui_alert_set_message(alert, buf); + + plist[0] = L'\0'; + for (i=0; i < d->n_info; i++) { + if (!wcscmp(d->info[i]->module.reg.name, + d->selected->module.reg.name)) { + if (plist[0]) + StringCbCat(plist, sizeof(plist), L", "); + StringCbCat(plist, sizeof(plist), + d->info[i]->plugin.reg.name); + } + } + +#ifdef DEBUG + /* there should have been at least one plugin */ + assert(plist[0]); +#endif + + LoadString(khm_hInstance, IDS_CFG_P_UNRCNFS, + fmt, ARRAYLENGTH(fmt)); + StringCbPrintf(buf, sizeof(buf), fmt, plist); + khui_alert_set_suggestion(alert, buf); + + khui_alert_add_command(alert, KHUI_PACTION_YES); + khui_alert_add_command(alert, KHUI_PACTION_NO); + + khui_alert_set_severity(alert, KHERR_WARNING); + + if (KHM_SUCCEEDED(khui_alert_show_modal(alert)) && + alert->response == KHUI_PACTION_YES) { + kmm_unregister_module(d->selected->module.reg.name, 0); + + update_dialog_fields(hwnd, d, d->selected); + } + } + break; + + case MAKEWPARAM(IDC_CFG_REGISTER, BN_CLICKED): + { + + } + break; + } + } + return TRUE; + + case WM_DESTROY: + { + khm_size i; + + d = (plugin_dlg_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); +#ifdef DEBUG + assert(d); +#endif + for (i=0; in_info; i++) { +#ifdef DEBUG + assert(d->info[i]); +#endif + kmm_release_plugin_info_i(&d->info[i]->plugin); + kmm_release_module_info_i(&d->info[i]->module); + PFREE(d->info[i]); + } + + PFREE(d); + + khm_set_dialog_result(hwnd, 0); + } + return TRUE; + } + return FALSE; +} --- krb5-1.4.4.orig/src/windows/identity/ui/aboutwnd.c +++ krb5-1.4.4/src/windows/identity/ui/aboutwnd.c @@ -1,146 +1,146 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -#if DEBUG -#include -#endif - -INT_PTR CALLBACK -about_dlg_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - - switch(uMsg) { - case WM_INITDIALOG: - { - HANDLE hsnap; - HWND hw; - - SetDlgItemText(hwnd, IDC_PRODUCT, - TEXT(KH_VERSTR_PRODUCT_1033)); - SetDlgItemText(hwnd, IDC_COPYRIGHT, - TEXT(KH_VERSTR_COPYRIGHT_1033)); - SetDlgItemText(hwnd, IDC_BUILDINFO, - TEXT(KH_VERSTR_BUILDINFO_1033)); - - hsnap = - CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, - 0); - - if (hsnap != INVALID_HANDLE_VALUE) { - LVCOLUMN lvc; - MODULEENTRY32 mod; - RECT r; - - hw = GetDlgItem(hwnd, IDC_MODULES); -#ifdef DEBUG - assert(hw != NULL); -#endif - - GetWindowRect(hw, &r); - OffsetRect(&r, -r.left, -r.top); - - ZeroMemory(&lvc, sizeof(lvc)); - lvc.mask = LVCF_TEXT | LVCF_WIDTH; - - lvc.pszText = L"Name"; - lvc.cx = r.right / 4; - - ListView_InsertColumn(hw, 0, &lvc); - - lvc.pszText = L"Path"; - lvc.cx = (r.right * 3) / 4; - ListView_InsertColumn(hw, 1, &lvc); - - ZeroMemory(&mod, sizeof(mod)); - mod.dwSize = sizeof(mod); - - /* done with columns, now for the actual data */ - if (!Module32First(hsnap, &mod)) - goto _done_with_modules; - - do { - - LVITEM lvi; - int idx; - - ZeroMemory(&lvi, sizeof(lvi)); - - lvi.mask = LVIF_TEXT; - lvi.pszText = mod.szModule; - idx = ListView_InsertItem(hw, &lvi); - - lvi.mask = LVIF_TEXT; - lvi.iItem = idx; - lvi.iSubItem = 1; - lvi.pszText = mod.szExePath; - ListView_SetItem(hw, &lvi); - - ZeroMemory(&mod, sizeof(mod)); - mod.dwSize = sizeof(mod); - } while(Module32Next(hsnap, &mod)); - - _done_with_modules: - CloseHandle(hsnap); - } - - khm_add_dialog(hwnd); - khm_enter_modal(hwnd); - } - return FALSE; - - case WM_DESTROY: - khm_del_dialog(hwnd); - return TRUE; - - case WM_COMMAND: - if (wParam == MAKEWPARAM(IDOK, BN_CLICKED)) { - khm_leave_modal(); - DestroyWindow(hwnd); - } - return TRUE; - } - - return FALSE; -} - -void -khm_create_about_window(void) { - HWND hwnd; - hwnd = CreateDialog(khm_hInstance, - MAKEINTRESOURCE(IDD_ABOUT), - khm_hwnd_main, - about_dlg_proc); - - ShowWindow(hwnd, SW_SHOW); - /* no need to keep track of the hwnd, since we add it to the - dialog chain in the dialog procedure */ -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +#if DEBUG +#include +#endif + +INT_PTR CALLBACK +about_dlg_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + + switch(uMsg) { + case WM_INITDIALOG: + { + HANDLE hsnap; + HWND hw; + + SetDlgItemText(hwnd, IDC_PRODUCT, + TEXT(KH_VERSTR_PRODUCT_1033)); + SetDlgItemText(hwnd, IDC_COPYRIGHT, + TEXT(KH_VERSTR_COPYRIGHT_1033)); + SetDlgItemText(hwnd, IDC_BUILDINFO, + TEXT(KH_VERSTR_BUILDINFO_1033)); + + hsnap = + CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, + 0); + + if (hsnap != INVALID_HANDLE_VALUE) { + LVCOLUMN lvc; + MODULEENTRY32 mod; + RECT r; + + hw = GetDlgItem(hwnd, IDC_MODULES); +#ifdef DEBUG + assert(hw != NULL); +#endif + + GetWindowRect(hw, &r); + OffsetRect(&r, -r.left, -r.top); + + ZeroMemory(&lvc, sizeof(lvc)); + lvc.mask = LVCF_TEXT | LVCF_WIDTH; + + lvc.pszText = L"Name"; + lvc.cx = r.right / 4; + + ListView_InsertColumn(hw, 0, &lvc); + + lvc.pszText = L"Path"; + lvc.cx = (r.right * 3) / 4; + ListView_InsertColumn(hw, 1, &lvc); + + ZeroMemory(&mod, sizeof(mod)); + mod.dwSize = sizeof(mod); + + /* done with columns, now for the actual data */ + if (!Module32First(hsnap, &mod)) + goto _done_with_modules; + + do { + + LVITEM lvi; + int idx; + + ZeroMemory(&lvi, sizeof(lvi)); + + lvi.mask = LVIF_TEXT; + lvi.pszText = mod.szModule; + idx = ListView_InsertItem(hw, &lvi); + + lvi.mask = LVIF_TEXT; + lvi.iItem = idx; + lvi.iSubItem = 1; + lvi.pszText = mod.szExePath; + ListView_SetItem(hw, &lvi); + + ZeroMemory(&mod, sizeof(mod)); + mod.dwSize = sizeof(mod); + } while(Module32Next(hsnap, &mod)); + + _done_with_modules: + CloseHandle(hsnap); + } + + khm_add_dialog(hwnd); + khm_enter_modal(hwnd); + } + return FALSE; + + case WM_DESTROY: + khm_del_dialog(hwnd); + return TRUE; + + case WM_COMMAND: + if (wParam == MAKEWPARAM(IDOK, BN_CLICKED)) { + khm_leave_modal(); + DestroyWindow(hwnd); + } + return TRUE; + } + + return FALSE; +} + +void +khm_create_about_window(void) { + HWND hwnd; + hwnd = CreateDialog(khm_hInstance, + MAKEINTRESOURCE(IDD_ABOUT), + khm_hwnd_main, + about_dlg_proc); + + ShowWindow(hwnd, SW_SHOW); + /* no need to keep track of the hwnd, since we add it to the + dialog chain in the dialog procedure */ +} --- krb5-1.4.4.orig/src/windows/identity/ui/configwnd.h +++ krb5-1.4.4/src/windows/identity/ui/configwnd.h @@ -1,88 +1,88 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_CONFIGWND_H -#define __KHIMAIRA_CONFIGWND_H - -#define CFGACTION_MAGIC 0x38f8 - -void -khm_show_config_pane(khui_config_node node); - -void khm_init_config(void); -void khm_exit_config(void); - -void khm_refresh_config(void); - -/* window procedures for other configuration windows */ -INT_PTR CALLBACK -khm_cfg_general_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -khm_cfg_identities_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -khm_cfg_identity_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -khm_cfg_id_tab_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -khm_cfg_ids_tab_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -khm_cfg_notifications_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -khm_cfg_plugins_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); - -INT_PTR CALLBACK -khm_cfg_appearance_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam); -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_CONFIGWND_H +#define __KHIMAIRA_CONFIGWND_H + +#define CFGACTION_MAGIC 0x38f8 + +void +khm_show_config_pane(khui_config_node node); + +void khm_init_config(void); +void khm_exit_config(void); + +void khm_refresh_config(void); + +/* window procedures for other configuration windows */ +INT_PTR CALLBACK +khm_cfg_general_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +khm_cfg_identities_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +khm_cfg_identity_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +khm_cfg_id_tab_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +khm_cfg_ids_tab_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +khm_cfg_notifications_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +khm_cfg_plugins_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + +INT_PTR CALLBACK +khm_cfg_appearance_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/credwnd.h +++ krb5-1.4.4/src/windows/identity/ui/credwnd.h @@ -1,259 +1,259 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_CREDWND_H -#define __KHIMAIRA_CREDWND_H - -#define KHUI_CREDWND_CLASS_NAME L"NetIDMgrCredWnd" - -#define KHUI_CREDWND_FLAG_ATTRNAME L"CredWndFlags" - -extern khm_int32 khui_cw_flag_id; - -/* The expiration states */ -#define CW_EXPSTATE_NONE 0x00000000 -#define CW_EXPSTATE_WARN 0x00000400 -#define CW_EXPSTATE_CRITICAL 0x00000800 -#define CW_EXPSTATE_EXPIRED 0x00000c00 - -#define CW_EXPSTATE_MASK 0x00000c00 - -typedef struct khui_credwnd_outline_t { - khm_int32 flags; /* combination of KHUI_CW_O_* */ - khm_int32 start; /* first row of outline */ - khm_int32 length; /* number of rows in outline */ - khm_int32 level; /* outline level */ - khm_int32 col; /* outline column */ - wchar_t *header; /* character string associated with header */ - khm_int32 attr_id; - void * data; /* level specific data : - Identity -> handle to identity - Type -> type ID - otherwise -> canonical data buffer - */ - khm_size cb_data; - - khm_size idx_start; /* index of the first cred in the credset */ - khm_size idx_end; /* index of the last cred in the credset */ - TDCL(struct khui_credwnd_outline_t); -} khui_credwnd_outline; - -#define KHUI_CW_O_EXPAND 0x00000001 -#define KHUI_CW_O_STICKY 0x00000002 -#define KHUI_CW_O_VISIBLE 0x00000004 -#define KHUI_CW_O_SHOWFLAG 0x00000008 -#define KHUI_CW_O_SELECTED 0x00000010 -#define KHUI_CW_O_DATAALLOC 0x00000020 - -typedef struct khui_credwnd_row_t { - khm_int32 flags; - khm_int32 col; - khm_handle data; - khm_size idx_start; - khm_size idx_end; -} khui_credwnd_row; - -#define KHUI_CW_ROW_CRED 0x00000002 -#define KHUI_CW_ROW_HEADER 0x00000004 -#define KHUI_CW_ROW_TIMERSET 0x00000008 -#define KHUI_CW_ROW_SELECTED 0x00000010 - -/* row allocation */ -/* initial number of rows to be allocated */ -#define KHUI_CW_ROW_INITIAL 512 -/* allocation increment, if we run out of space */ -#define KHUI_CW_ROW_INCREMENT 512 - -typedef struct khui_credwnd_col_t { - khm_int32 attr_id; - khm_int32 width; /* width of the column (screen units) */ - khm_int32 x; /* starting x coordinate (screen units) */ - khm_int32 flags; /* combination of KHUI_CW_COL_* */ - khm_int32 sort_index; - wchar_t * title; -} khui_credwnd_col; - -/* column allocation */ -/* initial number of columns to be allocated */ -#define KHUI_CW_COL_INITIAL 16 -/* allocation increment, if we run out of space */ -#define KHUI_CW_COL_INCREMENT 16 - -#define KHUI_CW_COL_AUTOSIZE 0x00000001 -#define KHUI_CW_COL_SORT_INC 0x00000002 -#define KHUI_CW_COL_SORT_DEC 0x00000004 -#define KHUI_CW_COL_GROUP 0x00000008 -#define KHUI_CW_COL_FIXED_WIDTH 0x00000010 -#define KHUI_CW_COL_FIXED_POS 0x00000020 -#define KHUI_CW_COL_META 0x00000040 - -/* Custom column attributes (are not kcdb attributes) */ -#define CW_CA_FLAGS -1 -#define CW_CANAME_FLAGS L"_CWFlags" - -#define CW_CA_TYPEICON -2 -#define CW_CANAME_TYPEICON L"_CWTypeIcon" - -#define cw_is_custom_attr(i) ((i)<0) - -typedef struct khui_credwnd_tbl_t { - HWND hwnd; /* the window that this table belongs to */ - - khm_handle csp_view; /* handle to the configuration space - that defined the view */ - - khm_int32 scr_top; /* screen units */ - khm_int32 scr_left; /* screen units */ - khm_int32 ext_width; /* screen units */ - khm_int32 ext_height; /* screen units */ - khm_int32 cell_height; /* screen units */ - - HWND hwnd_header; /* header control */ - khm_int32 header_height; /* height of the header */ - HWND hwnd_notif; /* notification control */ - - khui_credwnd_col * cols; /* n_cols elements */ - khui_credwnd_row * rows; /* n_rows elements */ - int n_cols; - int n_total_cols; /* number of columns actually - allocated in cols */ - int n_rows; - int n_total_rows; /* number of rows actually allocated - in rows */ - - khui_credwnd_outline * outline; - - khm_int32 flags; /* combo of KHUI_CW_TBL_* */ - - int cursor_row; /* cursor and selection */ - int anchor_row; /* anchor, for range selections */ - - /* view parameters */ - khm_int32 hpad; - khm_int32 vpad; - khm_int32 hpad_h; /* horizontal padding correction for headers */ - khm_int32 threshold_warn; /* Warning threshold, in seconds*/ - khm_int32 threshold_critical; /* Critical threshold, in seconds */ - - /* graphics objects we are going to need. */ - HFONT hf_normal; /* normal text */ - HFONT hf_header; /* header text */ - HFONT hf_bold; /* bold text */ - HFONT hf_bold_header; /* bold header text */ - HBRUSH hb_normal; /* normal background brush */ - HBRUSH hb_grey; /* normal grey background brush */ - HBRUSH hb_sel; /* selected background brush */ - COLORREF cr_hdr_outline;/* header outline color */ - COLORREF cr_normal; /* normal text color */ - COLORREF cr_sel; /* selected text color */ - COLORREF cr_hdr_normal; /* normal header text color */ - COLORREF cr_hdr_sel; /* selected header text color */ - HBRUSH hb_hdr_bg; /* header background color (normal) */ - HBRUSH hb_hdr_bg_exp; /* header background color (expired) */ - HBRUSH hb_hdr_bg_warn; /* header background color (warn) */ - HBRUSH hb_hdr_bg_crit; /* header background color (critical) */ - HBRUSH hb_hdr_bg_sel; /* header background color (selected) */ - HBRUSH hb_hdr_bg_def; /* header background color (default) */ - HCURSOR hc_hand; /* the HAND cursor */ - khui_ilist * ilist; /* image list */ - -#if 0 - /* icon indices */ - int idx_expand; /* index of 'expanded' icon in image list */ - int idx_expand_hi; /* index of 'expanded' icon (highlighted) in image list */ - int idx_collapse; /* index of 'collapsed' icon in image list */ - int idx_collapse_hi; /* index of 'collapsed' icon (highlighted) in image list */ - int idx_ident; /* index of 'identity' icon in image list */ -#endif - - /* mouse state */ - khm_int32 mouse_state; /* state of the mouse can be combo of CW_MOUSE_* values */ - khm_int32 mouse_row; /* row that the mouse state applies to */ - khm_int32 mouse_col; /* col that the mouse state applies to */ - - khui_bitmap kbm_logo_shade; - - /* the credentials set */ - khm_handle credset; -} khui_credwnd_tbl; - -#define KHUI_MAXCB_HEADING 256 - -/* table flags */ -#define KHUI_CW_TBL_INITIALIZED 0x00000001 -#define KHUI_CW_TBL_COL_DIRTY 0x00000002 -#define KHUI_CW_TBL_ROW_DIRTY 0x00000004 -#define KHUI_CW_TBL_ACTIVE 0x00000100 -#define KHUI_CW_TBL_CUSTVIEW 0x00000200 -#define KHUI_CW_TBL_COLSKIP 0x00000400 - -/* mouse_state constants */ -#define CW_MOUSE_NONE 0x00000000 /* nothing interesting */ -#define CW_MOUSE_WIDGET 0x00000001 /* mouse is highlighting a - widget */ -#define CW_MOUSE_LDOWN 0x00000002 /* left button is down */ -#define CW_MOUSE_ROW 0x00000004 /* mouse is acive over a valid - row */ -#define CW_MOUSE_WOUTLINE 0x00000008 /* mouse is highlighting an - outline widget */ -#define CW_MOUSE_WSTICKY 0x00000010 /* mouse is highlighting a - sticky widget */ -#define CW_MOUSE_WICON 0x00000020 /* an icon widget. represents - the icon next to identities - and next to credentials. */ - -#define CW_MOUSE_WMASK 0x00000039 /* all widget bits */ - -void khm_unregister_credwnd_class(void); - -void khm_register_credwnd_class(void); - -HWND khm_create_credwnd(HWND parent); - -LRESULT CALLBACK khm_credwnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam - ); - -void cw_load_view(khui_credwnd_tbl * tbl, wchar_t * viewname, HWND hwnd); - -void cw_update_creds(khui_credwnd_tbl * tbl); - -void cw_unload_view(khui_credwnd_tbl * tbl); - -void cw_hditem_from_tbl_col(khui_credwnd_col * col, HDITEM *phi); - -int cw_update_extents(khui_credwnd_tbl * tbl, khm_boolean update_scroll); - -void cw_insert_header_cols(khui_credwnd_tbl * tbl); - -void khm_get_cw_element_font(HDC hdc, wchar_t * name, BOOL use_default, - LOGFONT * pfont); - -void khm_set_cw_element_font(wchar_t * name, LOGFONT * pfont); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_CREDWND_H +#define __KHIMAIRA_CREDWND_H + +#define KHUI_CREDWND_CLASS_NAME L"NetIDMgrCredWnd" + +#define KHUI_CREDWND_FLAG_ATTRNAME L"CredWndFlags" + +extern khm_int32 khui_cw_flag_id; + +/* The expiration states */ +#define CW_EXPSTATE_NONE 0x00000000 +#define CW_EXPSTATE_WARN 0x00000400 +#define CW_EXPSTATE_CRITICAL 0x00000800 +#define CW_EXPSTATE_EXPIRED 0x00000c00 + +#define CW_EXPSTATE_MASK 0x00000c00 + +typedef struct khui_credwnd_outline_t { + khm_int32 flags; /* combination of KHUI_CW_O_* */ + khm_int32 start; /* first row of outline */ + khm_int32 length; /* number of rows in outline */ + khm_int32 level; /* outline level */ + khm_int32 col; /* outline column */ + wchar_t *header; /* character string associated with header */ + khm_int32 attr_id; + void * data; /* level specific data : + Identity -> handle to identity + Type -> type ID + otherwise -> canonical data buffer + */ + khm_size cb_data; + + khm_size idx_start; /* index of the first cred in the credset */ + khm_size idx_end; /* index of the last cred in the credset */ + TDCL(struct khui_credwnd_outline_t); +} khui_credwnd_outline; + +#define KHUI_CW_O_EXPAND 0x00000001 +#define KHUI_CW_O_STICKY 0x00000002 +#define KHUI_CW_O_VISIBLE 0x00000004 +#define KHUI_CW_O_SHOWFLAG 0x00000008 +#define KHUI_CW_O_SELECTED 0x00000010 +#define KHUI_CW_O_DATAALLOC 0x00000020 + +typedef struct khui_credwnd_row_t { + khm_int32 flags; + khm_int32 col; + khm_handle data; + khm_size idx_start; + khm_size idx_end; +} khui_credwnd_row; + +#define KHUI_CW_ROW_CRED 0x00000002 +#define KHUI_CW_ROW_HEADER 0x00000004 +#define KHUI_CW_ROW_TIMERSET 0x00000008 +#define KHUI_CW_ROW_SELECTED 0x00000010 + +/* row allocation */ +/* initial number of rows to be allocated */ +#define KHUI_CW_ROW_INITIAL 512 +/* allocation increment, if we run out of space */ +#define KHUI_CW_ROW_INCREMENT 512 + +typedef struct khui_credwnd_col_t { + khm_int32 attr_id; + khm_int32 width; /* width of the column (screen units) */ + khm_int32 x; /* starting x coordinate (screen units) */ + khm_int32 flags; /* combination of KHUI_CW_COL_* */ + khm_int32 sort_index; + wchar_t * title; +} khui_credwnd_col; + +/* column allocation */ +/* initial number of columns to be allocated */ +#define KHUI_CW_COL_INITIAL 16 +/* allocation increment, if we run out of space */ +#define KHUI_CW_COL_INCREMENT 16 + +#define KHUI_CW_COL_AUTOSIZE 0x00000001 +#define KHUI_CW_COL_SORT_INC 0x00000002 +#define KHUI_CW_COL_SORT_DEC 0x00000004 +#define KHUI_CW_COL_GROUP 0x00000008 +#define KHUI_CW_COL_FIXED_WIDTH 0x00000010 +#define KHUI_CW_COL_FIXED_POS 0x00000020 +#define KHUI_CW_COL_META 0x00000040 + +/* Custom column attributes (are not kcdb attributes) */ +#define CW_CA_FLAGS -1 +#define CW_CANAME_FLAGS L"_CWFlags" + +#define CW_CA_TYPEICON -2 +#define CW_CANAME_TYPEICON L"_CWTypeIcon" + +#define cw_is_custom_attr(i) ((i)<0) + +typedef struct khui_credwnd_tbl_t { + HWND hwnd; /* the window that this table belongs to */ + + khm_handle csp_view; /* handle to the configuration space + that defined the view */ + + khm_int32 scr_top; /* screen units */ + khm_int32 scr_left; /* screen units */ + khm_int32 ext_width; /* screen units */ + khm_int32 ext_height; /* screen units */ + khm_int32 cell_height; /* screen units */ + + HWND hwnd_header; /* header control */ + khm_int32 header_height; /* height of the header */ + HWND hwnd_notif; /* notification control */ + + khui_credwnd_col * cols; /* n_cols elements */ + khui_credwnd_row * rows; /* n_rows elements */ + int n_cols; + int n_total_cols; /* number of columns actually + allocated in cols */ + int n_rows; + int n_total_rows; /* number of rows actually allocated + in rows */ + + khui_credwnd_outline * outline; + + khm_int32 flags; /* combo of KHUI_CW_TBL_* */ + + int cursor_row; /* cursor and selection */ + int anchor_row; /* anchor, for range selections */ + + /* view parameters */ + khm_int32 hpad; + khm_int32 vpad; + khm_int32 hpad_h; /* horizontal padding correction for headers */ + khm_int32 threshold_warn; /* Warning threshold, in seconds*/ + khm_int32 threshold_critical; /* Critical threshold, in seconds */ + + /* graphics objects we are going to need. */ + HFONT hf_normal; /* normal text */ + HFONT hf_header; /* header text */ + HFONT hf_bold; /* bold text */ + HFONT hf_bold_header; /* bold header text */ + HBRUSH hb_normal; /* normal background brush */ + HBRUSH hb_grey; /* normal grey background brush */ + HBRUSH hb_sel; /* selected background brush */ + COLORREF cr_hdr_outline;/* header outline color */ + COLORREF cr_normal; /* normal text color */ + COLORREF cr_sel; /* selected text color */ + COLORREF cr_hdr_normal; /* normal header text color */ + COLORREF cr_hdr_sel; /* selected header text color */ + HBRUSH hb_hdr_bg; /* header background color (normal) */ + HBRUSH hb_hdr_bg_exp; /* header background color (expired) */ + HBRUSH hb_hdr_bg_warn; /* header background color (warn) */ + HBRUSH hb_hdr_bg_crit; /* header background color (critical) */ + HBRUSH hb_hdr_bg_sel; /* header background color (selected) */ + HBRUSH hb_hdr_bg_def; /* header background color (default) */ + HCURSOR hc_hand; /* the HAND cursor */ + khui_ilist * ilist; /* image list */ + +#if 0 + /* icon indices */ + int idx_expand; /* index of 'expanded' icon in image list */ + int idx_expand_hi; /* index of 'expanded' icon (highlighted) in image list */ + int idx_collapse; /* index of 'collapsed' icon in image list */ + int idx_collapse_hi; /* index of 'collapsed' icon (highlighted) in image list */ + int idx_ident; /* index of 'identity' icon in image list */ +#endif + + /* mouse state */ + khm_int32 mouse_state; /* state of the mouse can be combo of CW_MOUSE_* values */ + khm_int32 mouse_row; /* row that the mouse state applies to */ + khm_int32 mouse_col; /* col that the mouse state applies to */ + + khui_bitmap kbm_logo_shade; + + /* the credentials set */ + khm_handle credset; +} khui_credwnd_tbl; + +#define KHUI_MAXCB_HEADING 256 + +/* table flags */ +#define KHUI_CW_TBL_INITIALIZED 0x00000001 +#define KHUI_CW_TBL_COL_DIRTY 0x00000002 +#define KHUI_CW_TBL_ROW_DIRTY 0x00000004 +#define KHUI_CW_TBL_ACTIVE 0x00000100 +#define KHUI_CW_TBL_CUSTVIEW 0x00000200 +#define KHUI_CW_TBL_COLSKIP 0x00000400 + +/* mouse_state constants */ +#define CW_MOUSE_NONE 0x00000000 /* nothing interesting */ +#define CW_MOUSE_WIDGET 0x00000001 /* mouse is highlighting a + widget */ +#define CW_MOUSE_LDOWN 0x00000002 /* left button is down */ +#define CW_MOUSE_ROW 0x00000004 /* mouse is acive over a valid + row */ +#define CW_MOUSE_WOUTLINE 0x00000008 /* mouse is highlighting an + outline widget */ +#define CW_MOUSE_WSTICKY 0x00000010 /* mouse is highlighting a + sticky widget */ +#define CW_MOUSE_WICON 0x00000020 /* an icon widget. represents + the icon next to identities + and next to credentials. */ + +#define CW_MOUSE_WMASK 0x00000039 /* all widget bits */ + +void khm_unregister_credwnd_class(void); + +void khm_register_credwnd_class(void); + +HWND khm_create_credwnd(HWND parent); + +LRESULT CALLBACK khm_credwnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam + ); + +void cw_load_view(khui_credwnd_tbl * tbl, wchar_t * viewname, HWND hwnd); + +void cw_update_creds(khui_credwnd_tbl * tbl); + +void cw_unload_view(khui_credwnd_tbl * tbl); + +void cw_hditem_from_tbl_col(khui_credwnd_col * col, HDITEM *phi); + +int cw_update_extents(khui_credwnd_tbl * tbl, khm_boolean update_scroll); + +void cw_insert_header_cols(khui_credwnd_tbl * tbl); + +void khm_get_cw_element_font(HDC hdc, wchar_t * name, BOOL use_default, + LOGFONT * pfont); + +void khm_set_cw_element_font(wchar_t * name, LOGFONT * pfont); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/mainmenu.h +++ krb5-1.4.4/src/windows/identity/ui/mainmenu.h @@ -1,59 +1,59 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_MAINMENU_H -#define __KHIMAIRA_MAINMENU_H - -extern HWND khui_main_menu_toolbar; - -#define MENU_ACTIVATE_DEFAULT -1 -#define MENU_ACTIVATE_LEFT -2 -#define MENU_ACTIVATE_RIGHT -3 -#define MENU_ACTIVATE_NONE -4 - -extern int mm_last_hot_item; -extern BOOL mm_hot_track; - -void khm_menu_create_main(HWND rebar); -LRESULT khm_menu_handle_select(WPARAM wParam, LPARAM lParam); -LRESULT khm_menu_notify_main(LPNMHDR notice); -LRESULT khm_menu_activate(int menu_id); -void khm_menu_show_panel(int id, LONG x, LONG y); -void khm_menu_track_current(void); -LRESULT khm_menu_measure_item(WPARAM wParam, LPARAM lparam); -LRESULT khm_menu_draw_item(WPARAM wParam, LPARAM lparam); -void khm_menu_refresh_items(void); - -static HMENU mm_create_menu_from_def(khui_menu_def * def, BOOL main); -static void mm_show_panel_def(khui_menu_def * def, LONG x, LONG y); - -void khui_init_menu(void); -void khui_exit_menu(void); - -#define MENU_SIZE_ICON_X 16 -#define MENU_SIZE_ICON_Y 16 - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_MAINMENU_H +#define __KHIMAIRA_MAINMENU_H + +extern HWND khui_main_menu_toolbar; + +#define MENU_ACTIVATE_DEFAULT -1 +#define MENU_ACTIVATE_LEFT -2 +#define MENU_ACTIVATE_RIGHT -3 +#define MENU_ACTIVATE_NONE -4 + +extern int mm_last_hot_item; +extern BOOL mm_hot_track; + +void khm_menu_create_main(HWND rebar); +LRESULT khm_menu_handle_select(WPARAM wParam, LPARAM lParam); +LRESULT khm_menu_notify_main(LPNMHDR notice); +LRESULT khm_menu_activate(int menu_id); +void khm_menu_show_panel(int id, LONG x, LONG y); +void khm_menu_track_current(void); +LRESULT khm_menu_measure_item(WPARAM wParam, LPARAM lparam); +LRESULT khm_menu_draw_item(WPARAM wParam, LPARAM lparam); +void khm_menu_refresh_items(void); + +static HMENU mm_create_menu_from_def(khui_menu_def * def, BOOL main); +static void mm_show_panel_def(khui_menu_def * def, LONG x, LONG y); + +void khui_init_menu(void); +void khui_exit_menu(void); + +#define MENU_SIZE_ICON_X 16 +#define MENU_SIZE_ICON_Y 16 + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/appglobal.h +++ krb5-1.4.4/src/windows/identity/ui/appglobal.h @@ -1,98 +1,98 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_APPGLOBAL_H -#define __KHIMAIRA_APPGLOBAL_H - -/* Helpfile */ -#define NIDM_HELPFILE L"netidmgr.chm" - -/* global data */ -extern HINSTANCE khm_hInstance; -extern int khm_nCmdShow; -extern const wchar_t * khm_facility; -extern kconf_schema schema_uiconfig[]; -extern khm_ui_4 khm_commctl_version; -extern khm_version app_version; - -#define IS_COMMCTL6() (khm_commctl_version >= 0x60000) - -typedef struct tag_khm_startup_options_v1 { - BOOL seen; - BOOL processing; - - BOOL init; - BOOL import; - BOOL renew; - BOOL destroy; - - BOOL autoinit; - BOOL exit; - BOOL error_exit; - - BOOL no_main_window; -} khm_startup_options; - -extern khm_startup_options khm_startup; - -typedef struct tag_khm_query_app_version_v1 { - khm_int32 magic; - - khm_int32 code; - - khm_version ver_caller; - khm_version ver_remote; - - khm_boolean request_swap; -} khm_query_app_version; - -#define KHM_QUERY_APP_VER_MAGIC 0x38f8c2eb - -void khm_add_dialog(HWND dlg); -void khm_del_dialog(HWND dlg); -BOOL khm_is_dialog_active(void); - -void khm_enter_modal(HWND hwnd); -void khm_leave_modal(void); - -void khm_add_property_sheet(khui_property_sheet * s); -void khm_del_property_sheet(khui_property_sheet * s); - -void khm_init_gui(void); -void khm_exit_gui(void); - -void khm_parse_commandline(); -void khm_register_window_classes(void); - -HWND khm_html_help(HWND hwnd, wchar_t * suffix, UINT command, DWORD_PTR data); - -WPARAM khm_message_loop_int(khm_boolean * p_exit); - -#define MAX_RES_STRING 1024 - -#define ELIPSIS L"..." - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_APPGLOBAL_H +#define __KHIMAIRA_APPGLOBAL_H + +/* Helpfile */ +#define NIDM_HELPFILE L"netidmgr.chm" + +/* global data */ +extern HINSTANCE khm_hInstance; +extern int khm_nCmdShow; +extern const wchar_t * khm_facility; +extern kconf_schema schema_uiconfig[]; +extern khm_ui_4 khm_commctl_version; +extern khm_version app_version; + +#define IS_COMMCTL6() (khm_commctl_version >= 0x60000) + +typedef struct tag_khm_startup_options_v1 { + BOOL seen; + BOOL processing; + + BOOL init; + BOOL import; + BOOL renew; + BOOL destroy; + + BOOL autoinit; + BOOL exit; + BOOL error_exit; + + BOOL no_main_window; +} khm_startup_options; + +extern khm_startup_options khm_startup; + +typedef struct tag_khm_query_app_version_v1 { + khm_int32 magic; + + khm_int32 code; + + khm_version ver_caller; + khm_version ver_remote; + + khm_boolean request_swap; +} khm_query_app_version; + +#define KHM_QUERY_APP_VER_MAGIC 0x38f8c2eb + +void khm_add_dialog(HWND dlg); +void khm_del_dialog(HWND dlg); +BOOL khm_is_dialog_active(void); + +void khm_enter_modal(HWND hwnd); +void khm_leave_modal(void); + +void khm_add_property_sheet(khui_property_sheet * s); +void khm_del_property_sheet(khui_property_sheet * s); + +void khm_init_gui(void); +void khm_exit_gui(void); + +void khm_parse_commandline(); +void khm_register_window_classes(void); + +HWND khm_html_help(HWND hwnd, wchar_t * suffix, UINT command, DWORD_PTR data); + +WPARAM khm_message_loop_int(khm_boolean * p_exit); + +#define MAX_RES_STRING 1024 + +#define ELIPSIS L"..." + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/notifier.h +++ krb5-1.4.4/src/windows/identity/ui/notifier.h @@ -1,57 +1,57 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_NOTIFIER_H -#define __KHIMAIRA_NOTIFIER_H - -extern HWND hwnd_notifier; - -enum khm_notif_expstate { - KHM_NOTIF_EMPTY, - KHM_NOTIF_OK, - KHM_NOTIF_WARN, - KHM_NOTIF_EXP -}; - -void -khm_init_notifier(void); - -void -khm_exit_notifier(void); - -void -khm_notify_icon_change(khm_int32 severity); - -void -khm_notify_icon_balloon(khm_int32 severity, - wchar_t * title, - wchar_t * msg, - khm_int32 timeout); - -void -khm_notify_icon_expstate(enum khm_notif_expstate expseverity); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_NOTIFIER_H +#define __KHIMAIRA_NOTIFIER_H + +extern HWND hwnd_notifier; + +enum khm_notif_expstate { + KHM_NOTIF_EMPTY, + KHM_NOTIF_OK, + KHM_NOTIF_WARN, + KHM_NOTIF_EXP +}; + +void +khm_init_notifier(void); + +void +khm_exit_notifier(void); + +void +khm_notify_icon_change(khm_int32 severity); + +void +khm_notify_icon_balloon(khm_int32 severity, + wchar_t * title, + wchar_t * msg, + khm_int32 timeout); + +void +khm_notify_icon_expstate(enum khm_notif_expstate expseverity); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/propertywnd.h +++ krb5-1.4.4/src/windows/identity/ui/propertywnd.h @@ -1,36 +1,36 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_PROPERTYWND_H -#define __KHIMAIRA_PROPERTYWND_H - -#define KHUI_PROPERTYWND_CLASS_NAME L"NetIDMgrPropertyWnd" - -khm_int32 khm_register_propertywnd_class(void); - -khm_int32 khm_unregister_propertywnd_class(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_PROPERTYWND_H +#define __KHIMAIRA_PROPERTYWND_H + +#define KHUI_PROPERTYWND_CLASS_NAME L"NetIDMgrPropertyWnd" + +khm_int32 khm_register_propertywnd_class(void); + +khm_int32 khm_unregister_propertywnd_class(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/htwnd.h +++ krb5-1.4.4/src/windows/identity/ui/htwnd.h @@ -1,57 +1,57 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_HTWND_H -#define __KHIMAIRA_HTWND_H - -#include - -/* -We currently support the following tags: - -link text -
foo
-foo -foo -*/ - -#define KHUI_HTWND_TRANSPARENT 1 -#define KHUI_HTWND_CLIENTEDGE 2 -#define KHUI_HTWND_HSCROLL 4 -#define KHUI_HTWND_VSCROLL 8 -#define KHUI_HTWND_FOCUS 2048 - -#define KHUI_HTWND_CLASS L"KhmHtWnd" -#define KHUI_HTWND_CTLID 2040 - -#define KHUI_HTWND_MAXCCH_TEXT 2048 -#define KHUI_HTWND_MAXCB_TEXT (sizeof(wchar_t) * KHUI_HTWND_MAXCCH_TEXT) - -HWND khm_create_htwnd(HWND parent, LPWSTR text, int x, int y, int width, int height, DWORD ex_style, DWORD style); -void khm_unregister_htwnd_class(void); -void khm_register_htwnd_class(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_HTWND_H +#define __KHIMAIRA_HTWND_H + +#include + +/* +We currently support the following tags: + +link text +
foo
+foo +foo +*/ + +#define KHUI_HTWND_TRANSPARENT 1 +#define KHUI_HTWND_CLIENTEDGE 2 +#define KHUI_HTWND_HSCROLL 4 +#define KHUI_HTWND_VSCROLL 8 +#define KHUI_HTWND_FOCUS 2048 + +#define KHUI_HTWND_CLASS L"KhmHtWnd" +#define KHUI_HTWND_CTLID 2040 + +#define KHUI_HTWND_MAXCCH_TEXT 2048 +#define KHUI_HTWND_MAXCB_TEXT (sizeof(wchar_t) * KHUI_HTWND_MAXCCH_TEXT) + +HWND khm_create_htwnd(HWND parent, LPWSTR text, int x, int y, int width, int height, DWORD ex_style, DWORD style); +void khm_unregister_htwnd_class(void); +void khm_register_htwnd_class(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/passwnd.h +++ krb5-1.4.4/src/windows/identity/ui/passwnd.h @@ -1,39 +1,39 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_PASSWND_H -#define __KHIMAIRA_PASSWND_H - -/* Declarations for the MIT password change control. Functionally the - same as the regular Windows password edit control but doesn't - display the '*' password character. */ - -#define MIT_PWD_DLL_CLASS L"MITPasswordWnd" - -khm_int32 khm_unregister_passwnd_class(void); -khm_int32 khm_register_passwnd_class(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_PASSWND_H +#define __KHIMAIRA_PASSWND_H + +/* Declarations for the MIT password change control. Functionally the + same as the regular Windows password edit control but doesn't + display the '*' password character. */ + +#define MIT_PWD_DLL_CLASS L"MITPasswordWnd" + +khm_int32 khm_unregister_passwnd_class(void); +khm_int32 khm_register_passwnd_class(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/configwnd.c +++ krb5-1.4.4/src/windows/identity/ui/configwnd.c @@ -1,1003 +1,1003 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -static HWND cfgui_hwnd = NULL; - -typedef struct tag_cfgui_wnd_data { - khui_config_node current; - HWND hw_current; - HWND hw_generic_pane; - HBRUSH hbr_white; - HFONT hf_title; - khui_bitmap kbmp_logo; - HIMAGELIST hi_status; - BOOL modified; - int idx_default; - int idx_modified; - int idx_applied; -} cfgui_wnd_data; - -static cfgui_wnd_data * -cfgui_get_wnd_data(HWND hwnd) { - return (cfgui_wnd_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); -} - -static void -cfgui_set_wnd_data(HWND hwnd, cfgui_wnd_data * d) { -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); -#pragma warning(pop) -} - -static void -cfgui_add_node(cfgui_wnd_data * d, - HWND hwtv, - khui_config_node node, - khui_config_node parent, - BOOL sorted) { - - khui_config_node_reg reg; - khui_config_node c; - wchar_t wbuf[256]; - const wchar_t * short_desc; - TVINSERTSTRUCT s; - HTREEITEM hItem; - - if (node) { - khui_cfg_get_reg(node, ®); - short_desc = reg.short_desc; - } else { - short_desc = wbuf; - LoadString(khm_hInstance, IDS_CFG_ROOT_NAME, - wbuf, ARRAYLENGTH(wbuf)); - reg.flags = 0; - } - - ZeroMemory(&s, sizeof(s)); - - s.hParent = (node)? - (HTREEITEM) khui_cfg_get_param(parent): - TVI_ROOT; - - s.hInsertAfter = (sorted)? TVI_SORT: TVI_FIRST; - - s.itemex.mask = - TVIF_CHILDREN | - TVIF_PARAM | - TVIF_TEXT | - TVIF_STATE; - - { - khui_config_node n; - - if (KHM_SUCCEEDED(khui_cfg_get_first_child(node, - &n))) { - s.itemex.cChildren = 1; - s.itemex.state = TVIS_EXPANDED; - s.itemex.stateMask = TVIS_EXPANDED; - khui_cfg_release(n); - } else { - s.itemex.cChildren = 0; - s.itemex.state = 0; - s.itemex.stateMask = TVIS_EXPANDED; - } - - s.itemex.state |= INDEXTOSTATEIMAGEMASK(d->idx_default); - s.itemex.stateMask |= TVIS_STATEIMAGEMASK; - } - - s.itemex.lParam = (LPARAM) node; - khui_cfg_hold(node); - - s.itemex.pszText = (LPWSTR) short_desc; - - hItem = TreeView_InsertItem(hwtv, &s); - - khui_cfg_set_param(node, (LPARAM) hItem); - - if (KHM_SUCCEEDED(khui_cfg_get_first_child(node, - &c))) { - do { - cfgui_add_node(d, hwtv, c, node, - !!(reg.flags & KHUI_CNFLAG_SORT_CHILDREN)); - } while (KHM_SUCCEEDED(khui_cfg_get_next_release(&c))); - } -} - -static void -cfgui_initialize_dialog(HWND hwnd) { - cfgui_wnd_data * d; - HWND hwtv; - HWND hwtitle; - HFONT hf; - HDC hdc; - HICON hicon; - - d = cfgui_get_wnd_data(hwnd); - - /* create and fill the image list for the treeview */ - - d->hi_status = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - ILC_COLOR8 | ILC_MASK, - 4,4); - - hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_DEFAULT), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - /* note that we can't use index 0 because that is used to indicate - that there is no state image for the node */ - do { - d->idx_default = ImageList_AddIcon(d->hi_status, hicon); - } while(d->idx_default == 0); - - DestroyIcon(hicon); - - hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_MODIFIED), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - d->idx_modified = ImageList_AddIcon(d->hi_status, hicon); - - DestroyIcon(hicon); - - hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_APPLIED), - IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); - - d->idx_applied = ImageList_AddIcon(d->hi_status, hicon); - - DestroyIcon(hicon); - - /* now for the treeview */ - hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); - - TreeView_SetImageList(hwtv, d->hi_status, TVSIL_STATE); - - cfgui_add_node(d, hwtv, NULL, NULL, FALSE); - - hdc = GetDC(hwnd); - hf = CreateFont(-MulDiv(12, - GetDeviceCaps(hdc, LOGPIXELSY), - 72), - 0, /* nWidth */ - 0, /* nEscapement */ - 0, /* nOrientation */ - FW_BOLD, /* fnWeight */ - TRUE, /* fdwItalic */ - FALSE, /* fdwUnderline */ - FALSE, /* fdwStrikeOut */ - DEFAULT_CHARSET, /* fdwCharSet */ - OUT_DEFAULT_PRECIS, /* fdwOutputPrecision */ - CLIP_DEFAULT_PRECIS, /* fdwClipPrecision */ - DEFAULT_QUALITY, /* fdwQuality */ - FF_SWISS | DEFAULT_PITCH, /* pitch&family */ - NULL); /* face */ - ReleaseDC(hwnd, hdc); - - d->hf_title = hf; - - hwtitle = GetDlgItem(hwnd, IDC_CFG_TITLE); - - SendMessage(hwtitle, - WM_SETFONT, - (WPARAM) hf, - (LPARAM) FALSE); -} - -static void -cfgui_free_node(HWND hwtv, HTREEITEM hItem) { - TVITEMEX iex; - HTREEITEM hChItem; - - ZeroMemory(&iex, sizeof(iex)); - - iex.mask = TVIF_PARAM; - iex.hItem = hItem; - - if (TreeView_GetItem(hwtv, &iex)) { - khui_config_node node; - - node = (khui_config_node) iex.lParam; - khui_cfg_release(node); - } - - hChItem = TreeView_GetChild(hwtv, hItem); - while(hChItem) { - cfgui_free_node(hwtv, hChItem); - - hChItem = TreeView_GetNextSibling(hwtv, hChItem); - } -} - -static void -cfgui_uninitialize_dialog(HWND hwnd) { - cfgui_wnd_data * d; - HWND hwtv; - - d = cfgui_get_wnd_data(hwnd); - - hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); - - cfgui_free_node(hwtv, TreeView_GetRoot(hwtv)); - - if (d->hf_title) - DeleteObject(d->hf_title); - - if (d->hi_status) - ImageList_Destroy(d->hi_status); -} - -static HWND -cfgui_create_config_node_window(HWND hwnd, khui_config_node node) { - khui_config_node_reg reg; - khm_int32 rv; - HWND hw_new; - - khui_config_node parent; - - if (KHM_SUCCEEDED(khui_cfg_get_parent(node, &parent))) { - HWND hwp; - - hwp = khui_cfg_get_hwnd(parent); - - if (hwp == NULL) - cfgui_create_config_node_window(hwnd, parent); - - khui_cfg_release(parent); - } - - rv = khui_cfg_get_reg(node, ®); -#ifdef DEBUG - assert(KHM_SUCCEEDED(rv)); -#endif - hw_new = CreateDialogParam(reg.h_module, - reg.dlg_template, - hwnd, - reg.dlg_proc, - (LPARAM) node); -#ifdef DEBUG - assert(hw_new); -#endif - khui_cfg_set_hwnd(node, hw_new); - - return hw_new; -} - -static void -cfgui_activate_node(HWND hwnd, khui_config_node node) { - - cfgui_wnd_data * d; - HTREEITEM hItem; - HWND hw_new; - HWND hwtv; - - d = cfgui_get_wnd_data(hwnd); - hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); - hItem = (HTREEITEM) khui_cfg_get_param(node); - -#ifdef DEBUG - assert(hItem); - assert(hwtv); -#endif - - if (node == NULL) { - hw_new = d->hw_generic_pane; - } else { - - hw_new = khui_cfg_get_hwnd(node); - - if (hw_new == NULL) { - hw_new = cfgui_create_config_node_window(hwnd, node); - } - } - - if (hw_new == d->hw_current) - return; /* nothing to do */ - - { - RECT r_title; - RECT r_pane; - HWND hw; - - if (d->hw_current) - ShowWindow(d->hw_current, SW_HIDE); - - hw = GetDlgItem(hwnd, IDC_CFG_TITLE); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r_title); - - hw = GetDlgItem(hwnd, IDC_CFG_PANE); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r_pane); - - OffsetRect(&r_pane, -r_title.left, -r_title.top); - - SetWindowPos(hw_new, - hwtv, - r_pane.left, r_pane.top, - r_pane.right - r_pane.left, - r_pane.bottom - r_pane.top, - SWP_NOOWNERZORDER | - SWP_SHOWWINDOW | - SWP_NOACTIVATE); - } - - if (node == NULL) { - wchar_t wbuf[256]; - - LoadString(khm_hInstance, IDS_CFG_ROOT_TITLE, - wbuf, ARRAYLENGTH(wbuf)); - - SetDlgItemText(hwnd, IDC_CFG_TITLE, wbuf); - } else { - khm_int32 rv; - khui_config_node_reg reg; - - rv = khui_cfg_get_reg(node, ®); -#ifdef DEBUG - assert(KHM_SUCCEEDED(rv)); -#endif - SetDlgItemText(hwnd, IDC_CFG_TITLE, reg.long_desc); - } - - d->hw_current = hw_new; - d->current = node; - - TreeView_SelectItem(hwtv, hItem); -} - -static BOOL -cfgui_check_mod_state(khui_config_node node) { - khm_int32 flags; - khui_config_node c = NULL; - BOOL rv = FALSE; - - flags = khui_cfg_get_flags(node); - - if (flags & KHUI_CNFLAG_MODIFIED) - return TRUE; - - if (KHM_FAILED(khui_cfg_get_first_child(node, &c))) - return FALSE; - - while(c) { - rv = (rv || cfgui_check_mod_state(c)); - khui_cfg_get_next_release(&c); - } - - return rv; -} - -static void -cfgui_apply_settings(khui_config_node node) { - HWND hwnd; - khui_config_node c; - khm_int32 flags; - - hwnd = khui_cfg_get_hwnd(node); - flags = khui_cfg_get_flags(node); - - if (hwnd && (flags & KHUI_CNFLAG_MODIFIED)) { - SendMessage(hwnd, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(0, WMCFG_APPLY), - (LPARAM) node); - } - - if (KHM_FAILED(khui_cfg_get_first_child(node, &c))) - return; - - while (c) { - cfgui_apply_settings(c); - khui_cfg_get_next_release(&c); - } -} - -static void -cfgui_update_state(HWND hwnd, - khm_int32 flags, - khui_config_node node) { - cfgui_wnd_data * d; - HWND hwtv; - HTREEITEM hItem; - TVITEMEX itx; - int idx; - - d = cfgui_get_wnd_data(hwnd); - hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); - hItem = (HTREEITEM) khui_cfg_get_param(node); - - ZeroMemory(&itx, sizeof(itx)); - - if (flags & KHUI_CNFLAG_MODIFIED) - idx = d->idx_modified; - else if (flags & KHUI_CNFLAG_APPLIED) - idx = d->idx_applied; - else - idx = d->idx_default; - - itx.hItem = hItem; - itx.mask = TVIF_STATE; - itx.state = INDEXTOSTATEIMAGEMASK(idx); - itx.stateMask = TVIS_STATEIMAGEMASK; - - TreeView_SetItem(hwtv, &itx); - - if(cfgui_check_mod_state(NULL)) { - EnableWindow(GetDlgItem(hwnd, IDAPPLY), TRUE); - } else { - EnableWindow(GetDlgItem(hwnd, IDAPPLY), FALSE); - } -} - - -/* dialog procedure for the generic dialog */ -static INT_PTR CALLBACK -cfgui_dlgproc_generic(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - cfgui_wnd_data * d; - - switch(uMsg) { - case WM_INITDIALOG: - d = (cfgui_wnd_data *) lParam; - cfgui_set_wnd_data(hwnd, d); - return TRUE; - - case WM_CTLCOLORSTATIC: - d = cfgui_get_wnd_data(hwnd); - return (BOOL)(DWORD_PTR) d->hbr_white; - - case WM_ERASEBKGND: - { - HDC hdc = (HDC) wParam; - RECT r_client; - RECT r_logo; - RECT r_fill; - - d = cfgui_get_wnd_data(hwnd); - - GetClientRect(hwnd, &r_client); - SetRectEmpty(&r_logo); - - r_logo.right = d->kbmp_logo.cx; - r_logo.bottom = d->kbmp_logo.cy; - - OffsetRect(&r_logo, - r_client.right - r_logo.right, - r_client.bottom - r_logo.bottom); - - khui_draw_bitmap(hdc, - r_logo.left, - r_logo.top, - &d->kbmp_logo); - - r_fill.left = 0; - r_fill.top = 0; - r_fill.right = r_logo.left; - r_fill.bottom = r_client.bottom; - FillRect(hdc, &r_fill, d->hbr_white); - - r_fill.left = r_logo.left; - r_fill.right = r_client.right; - r_fill.bottom = r_logo.top; - FillRect(hdc, &r_fill, d->hbr_white); - - SetWindowLongPtr(hwnd, DWLP_MSGRESULT, (LONG) TRUE); - } - return TRUE; - } - - return FALSE; -} - -static INT_PTR CALLBACK -cfgui_dlgproc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - - khui_config_node node; - cfgui_wnd_data * d; - - switch(uMsg) { - case WM_INITDIALOG: - node = (khui_config_node) lParam; - - khui_cfg_clear_params(); - - khui_cfg_set_configui_handle(hwnd); - - d = PMALLOC(sizeof(*d)); - ZeroMemory(d, sizeof(*d)); - - d->hbr_white = CreateSolidBrush(RGB(255,255,255)); - - d->hw_generic_pane = - CreateDialogParam(khm_hInstance, - MAKEINTRESOURCE(IDD_CFG_GENERIC), - hwnd, - cfgui_dlgproc_generic, - (LPARAM) d); - - khui_bitmap_from_hbmp(&d->kbmp_logo, - LoadImage( - khm_hInstance, - MAKEINTRESOURCE(IDB_LOGO_OPAQUE), - IMAGE_BITMAP, - 0, - 0, - LR_DEFAULTCOLOR)); - - cfgui_set_wnd_data(hwnd, d); - - cfgui_initialize_dialog(hwnd); - - cfgui_activate_node(hwnd, node); - - khm_add_dialog(hwnd); - khm_enter_modal(hwnd); - - return TRUE; - - case WM_DESTROY: - cfgui_hwnd = NULL; - - khui_cfg_set_configui_handle(NULL); - - cfgui_uninitialize_dialog(hwnd); - - d = cfgui_get_wnd_data(hwnd); - khui_delete_bitmap(&d->kbmp_logo); - DeleteObject(d->hbr_white); - - khm_del_dialog(hwnd); - - SetForegroundWindow(khm_hwnd_main); - - return FALSE; - - case WM_NOTIFY: - { - LPNMHDR lpnm; - LPNMTREEVIEW lptv; - LPNMTVGETINFOTIP lpgi; - khui_config_node node; - - lpnm = (LPNMHDR) lParam; - - switch (lpnm->code) { - case TVN_SELCHANGED: - lptv = (LPNMTREEVIEW) lParam; - cfgui_activate_node(hwnd, - (khui_config_node) - lptv->itemNew.lParam); - return TRUE; - - case TVN_GETINFOTIP: - lpgi = (LPNMTVGETINFOTIP) lParam; - node = (khui_config_node) lpgi->lParam; - - if (node) { - khm_int32 flags = 0; - - flags = khui_cfg_get_flags(node); - - if (flags & KHUI_CNFLAG_MODIFIED) { - LoadString(khm_hInstance, IDS_CFG_IT_MOD, - lpgi->pszText, lpgi->cchTextMax); - } else if (flags & KHUI_CNFLAG_APPLIED) { - LoadString(khm_hInstance, IDS_CFG_IT_APP, - lpgi->pszText, lpgi->cchTextMax); - } else { - LoadString(khm_hInstance, IDS_CFG_IT_NONE, - lpgi->pszText, lpgi->cchTextMax); - } - } else { - StringCchCopy(lpgi->pszText, lpgi->cchTextMax, L""); - } - - return TRUE; - } - } - return TRUE; - - case WM_CTLCOLORSTATIC: - { - d = cfgui_get_wnd_data(hwnd); - return (BOOL)(DWORD_PTR) d->hbr_white; - } - /* implicit break */ - - case WM_COMMAND: - switch(wParam) { - case MAKEWPARAM(IDCANCEL, BN_CLICKED): - khm_leave_modal(); - DestroyWindow(hwnd); - break; - - case MAKEWPARAM(IDAPPLY, BN_CLICKED): - cfgui_apply_settings(NULL); - break; - - case MAKEWPARAM(IDOK, BN_CLICKED): - cfgui_apply_settings(NULL); - khm_leave_modal(); - DestroyWindow(hwnd); - break; - } - return TRUE; - - case KHUI_WM_CFG_NOTIFY: - switch(HIWORD(wParam)) { - case WMCFG_SHOW_NODE: - cfgui_activate_node(hwnd, (khui_config_node) lParam); - break; - - case WMCFG_UPDATE_STATE: - cfgui_update_state(hwnd, LOWORD(wParam), - (khui_config_node) lParam); - break; - - case WMCFG_SYNC_NODE_LIST: - /*TODO: synchronize the node lists here */ - break; - } - - return TRUE; - } - - return FALSE; -} - -static void -cfgui_create_window(khui_config_node node) { -#ifdef DEBUG - assert(cfgui_hwnd == NULL); -#endif - - khm_refresh_config(); - - cfgui_hwnd = CreateDialogParam(khm_hInstance, - MAKEINTRESOURCE(IDD_CFG_MAIN), - khm_hwnd_main, - cfgui_dlgproc, - (LPARAM) node); -#ifdef DEBUG - assert(cfgui_hwnd != NULL); -#endif - ShowWindow(cfgui_hwnd,SW_SHOW); -} - -static void -cfgui_destroy_window(void) { - if (cfgui_hwnd) - DestroyWindow(cfgui_hwnd); - /* cfgui_hwnd will be set to NULL in the dialog proc */ -} - -void -khm_show_config_pane(khui_config_node node) { - if (cfgui_hwnd != NULL) { - SendMessage(cfgui_hwnd, KHUI_WM_CFG_NOTIFY, - MAKEWPARAM(0, WMCFG_SHOW_NODE), - (LPARAM) node); - } else { - cfgui_create_window(node); - } -} - -void khm_refresh_config(void) { - khm_size cb; - khm_size n_idents; - wchar_t * idents = NULL; - wchar_t * t; - khm_int32 rv; - int n_tries = 0; - khui_config_node cfg_ids = NULL; - khui_config_node cfg_r = NULL; - khui_config_node cfg_iter = NULL; - khui_menu_def * omenu; - khm_boolean refresh_menu = FALSE; - - do { - rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, - KCDB_IDENT_FLAG_CONFIG, - NULL, - &cb, - &n_idents); - - if (rv != KHM_ERROR_TOO_LONG || - n_idents == 0) - return; - - if (idents) - PFREE(idents); - idents = PMALLOC(cb); -#ifdef DEBUG - assert(idents); -#endif - - rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, - KCDB_IDENT_FLAG_CONFIG, - idents, - &cb, - &n_idents); - - n_tries++; - } while(KHM_FAILED(rv) && - n_tries < 5); - - if (KHM_FAILED(rv)) - goto _cleanup; - - if (KHM_FAILED(khui_cfg_open(NULL, - L"KhmIdentities", - &cfg_ids))) - goto _cleanup; - - for(t = idents; t && *t; t = multi_string_next(t)) { - khui_config_node cfg_id = NULL; - - rv = khui_cfg_open(cfg_ids, - t, - &cfg_id); - - if (KHM_FAILED(rv)) { - khui_config_node_reg reg; - wchar_t wshort[KHUI_MAXCCH_SHORT_DESC]; - wchar_t wlong[KHUI_MAXCCH_LONG_DESC]; - wchar_t wfmt[KHUI_MAXCCH_SHORT_DESC]; - - ZeroMemory(®, sizeof(reg)); - - reg.name = t; - reg.short_desc = wshort; - reg.long_desc = wlong; - reg.h_module = khm_hInstance; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDENTITY); - reg.dlg_proc = khm_cfg_identity_proc; - reg.flags = 0; - - LoadString(khm_hInstance, IDS_CFG_IDENTITY_SHORT, - wfmt, ARRAYLENGTH(wfmt)); - StringCbPrintf(wshort, sizeof(wshort), wfmt, t); - - LoadString(khm_hInstance, IDS_CFG_IDENTITY_LONG, - wfmt, ARRAYLENGTH(wfmt)); - StringCbPrintf(wlong, sizeof(wlong), wfmt, t); - - khui_cfg_register(cfg_ids, - ®); - } else { - khui_cfg_release(cfg_id); - } - } - - for (khui_cfg_get_first_child(cfg_ids, &cfg_iter); - cfg_iter; - khui_cfg_get_next_release(&cfg_iter)) { - - wchar_t cfgname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - khm_handle tident = NULL; - khm_int32 tflags = 0; - - cb = sizeof(cfgname); - khui_cfg_get_name(cfg_iter, cfgname, &cb); - - if (KHM_FAILED(kcdb_identity_create(cfgname, 0, &tident)) || - KHM_FAILED(kcdb_identity_get_flags(tident, &tflags)) || - !(tflags & KCDB_IDENT_FLAG_ACTIVE) || - !(tflags & KCDB_IDENT_FLAG_CONFIG)) { - - /* this configuration node needs to be removed */ - - khui_cfg_remove(cfg_iter); - } - } - - /* Now iterate through the root level configuration nodes and make - sure we have a menu item for each of them. */ - if (KHM_FAILED(khui_cfg_get_first_child(NULL, &cfg_r))) - goto _cleanup; - - omenu = khui_find_menu(KHUI_MENU_OPTIONS); - if (omenu == NULL) - goto _cleanup; - - do { - khm_int32 action; - khm_int32 flags; - khui_action * paction; - wchar_t cname[KHUI_MAXCCH_NAME]; - wchar_t wshort[KHUI_MAXCCH_SHORT_DESC]; - khm_size cb; - khm_handle sub; - khui_config_node_reg reg; - - flags = khui_cfg_get_flags(cfg_r); - if (flags & KHUI_CNFLAG_SYSTEM) - goto _next_cfg; - - cb = sizeof(cname); - if (KHM_FAILED(khui_cfg_get_name(cfg_r, cname, &cb))) { -#ifdef DEBUG - assert(FALSE); -#endif - goto _next_cfg; - } - - paction = khui_find_named_action(cname); - - if (!paction) { - khui_cfg_get_reg(cfg_r, ®); - - kmq_create_hwnd_subscription(khm_hwnd_main, &sub); - - StringCbCopy(wshort, sizeof(wshort), reg.short_desc); - StringCbCat(wshort, sizeof(wshort), L" ..."); - - action = khui_action_create(cname, - wshort, - reg.long_desc, - (void *) CFGACTION_MAGIC, - KHUI_ACTIONTYPE_TRIGGER, - sub); - - if (action == 0) { -#ifdef DEBUG - assert(FALSE); -#endif - goto _next_cfg; - } - - khui_menu_insert_action(omenu, -1, action, 0); - - refresh_menu = TRUE; - } - - _next_cfg: - if (KHM_FAILED(khui_cfg_get_next_release(&cfg_r))) - break; - } while(cfg_r); - - if (refresh_menu) - khm_menu_refresh_items(); - - _cleanup: - if (cfg_ids) - khui_cfg_release(cfg_ids); - - if (cfg_r) - khui_cfg_release(cfg_r); - - if (idents) - PFREE(idents); -} - -void khm_init_config(void) { - wchar_t wshort[KHUI_MAXCCH_SHORT_DESC]; - wchar_t wlong[KHUI_MAXCCH_LONG_DESC]; - khui_config_node_reg reg; - khui_config_node node; - - reg.short_desc = wshort; - reg.long_desc = wlong; - reg.h_module = khm_hInstance; - reg.flags = KHUI_CNFLAG_SYSTEM; - - reg.name = L"KhmGeneral"; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_GENERAL); - reg.dlg_proc = khm_cfg_general_proc; - LoadString(khm_hInstance, IDS_CFG_GENERAL_SHORT, - wshort, ARRAYLENGTH(wshort)); - LoadString(khm_hInstance, IDS_CFG_GENERAL_LONG, - wlong, ARRAYLENGTH(wlong)); - - khui_cfg_register(NULL, ®); - - reg.name = L"KhmAppear"; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_APPEAR); - reg.dlg_proc = khm_cfg_appearance_proc; - LoadString(khm_hInstance, IDS_CFG_APPEAR_SHORT, - wshort, ARRAYLENGTH(wshort)); - LoadString(khm_hInstance, IDS_CFG_APPEAR_LONG, - wlong, ARRAYLENGTH(wlong)); - - khui_cfg_register(NULL, ®); - - reg.name = L"KhmIdentities"; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDENTITIES); - reg.dlg_proc = khm_cfg_identities_proc; - LoadString(khm_hInstance, IDS_CFG_IDENTITIES_SHORT, - wshort, ARRAYLENGTH(wshort)); - LoadString(khm_hInstance, IDS_CFG_IDENTITIES_LONG, - wlong, ARRAYLENGTH(wlong)); - - khui_cfg_register(NULL, ®); - - node = NULL; - khui_cfg_open(NULL, L"KhmIdentities", &node); -#ifdef DEBUG - assert(node); -#endif - - reg.name = L"KhmIdentitiesTab"; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDS_TAB); - reg.dlg_proc = khm_cfg_ids_tab_proc; - LoadString(khm_hInstance, IDS_CFG_IDS_TAB_SHORT, - wshort, ARRAYLENGTH(wshort)); - LoadString(khm_hInstance, IDS_CFG_IDS_TAB_LONG, - wlong, ARRAYLENGTH(wlong)); - reg.flags = KHUI_CNFLAG_SUBPANEL | KHUI_CNFLAG_SYSTEM; - - khui_cfg_register(node, ®); - - reg.name = L"KhmIdentitiesTabPlural"; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_ID_TAB); - reg.dlg_proc = khm_cfg_id_tab_proc; - LoadString(khm_hInstance, IDS_CFG_ID_TAB_SHORT, - wshort, ARRAYLENGTH(wshort)); - LoadString(khm_hInstance, IDS_CFG_ID_TAB_LONG, - wlong, ARRAYLENGTH(wlong)); - reg.flags = KHUI_CNFLAG_PLURAL | KHUI_CNFLAG_SUBPANEL | KHUI_CNFLAG_SYSTEM; - - khui_cfg_register(node, ®); - - reg.flags = KHUI_CNFLAG_SYSTEM; - khui_cfg_release(node); - - reg.name = L"KhmNotifications"; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_NOTIF); - reg.dlg_proc = khm_cfg_notifications_proc; - LoadString(khm_hInstance, IDS_CFG_NOTIF_SHORT, - wshort, ARRAYLENGTH(wshort)); - LoadString(khm_hInstance, IDS_CFG_NOTIF_LONG, - wlong, ARRAYLENGTH(wlong)); - - khui_cfg_register(NULL, ®); - - reg.name = L"KhmPlugins"; - reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_PLUGINS); - reg.dlg_proc = khm_cfg_plugins_proc; - LoadString(khm_hInstance, IDS_CFG_PLUGINS_SHORT, - wshort, ARRAYLENGTH(wshort)); - LoadString(khm_hInstance, IDS_CFG_PLUGINS_LONG, - wlong, ARRAYLENGTH(wlong)); - - khui_cfg_register(NULL, ®); -} - -void khm_exit_config(void) { -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +static HWND cfgui_hwnd = NULL; + +typedef struct tag_cfgui_wnd_data { + khui_config_node current; + HWND hw_current; + HWND hw_generic_pane; + HBRUSH hbr_white; + HFONT hf_title; + khui_bitmap kbmp_logo; + HIMAGELIST hi_status; + BOOL modified; + int idx_default; + int idx_modified; + int idx_applied; +} cfgui_wnd_data; + +static cfgui_wnd_data * +cfgui_get_wnd_data(HWND hwnd) { + return (cfgui_wnd_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); +} + +static void +cfgui_set_wnd_data(HWND hwnd, cfgui_wnd_data * d) { +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) d); +#pragma warning(pop) +} + +static void +cfgui_add_node(cfgui_wnd_data * d, + HWND hwtv, + khui_config_node node, + khui_config_node parent, + BOOL sorted) { + + khui_config_node_reg reg; + khui_config_node c; + wchar_t wbuf[256]; + const wchar_t * short_desc; + TVINSERTSTRUCT s; + HTREEITEM hItem; + + if (node) { + khui_cfg_get_reg(node, ®); + short_desc = reg.short_desc; + } else { + short_desc = wbuf; + LoadString(khm_hInstance, IDS_CFG_ROOT_NAME, + wbuf, ARRAYLENGTH(wbuf)); + reg.flags = 0; + } + + ZeroMemory(&s, sizeof(s)); + + s.hParent = (node)? + (HTREEITEM) khui_cfg_get_param(parent): + TVI_ROOT; + + s.hInsertAfter = (sorted)? TVI_SORT: TVI_FIRST; + + s.itemex.mask = + TVIF_CHILDREN | + TVIF_PARAM | + TVIF_TEXT | + TVIF_STATE; + + { + khui_config_node n; + + if (KHM_SUCCEEDED(khui_cfg_get_first_child(node, + &n))) { + s.itemex.cChildren = 1; + s.itemex.state = TVIS_EXPANDED; + s.itemex.stateMask = TVIS_EXPANDED; + khui_cfg_release(n); + } else { + s.itemex.cChildren = 0; + s.itemex.state = 0; + s.itemex.stateMask = TVIS_EXPANDED; + } + + s.itemex.state |= INDEXTOSTATEIMAGEMASK(d->idx_default); + s.itemex.stateMask |= TVIS_STATEIMAGEMASK; + } + + s.itemex.lParam = (LPARAM) node; + khui_cfg_hold(node); + + s.itemex.pszText = (LPWSTR) short_desc; + + hItem = TreeView_InsertItem(hwtv, &s); + + khui_cfg_set_param(node, (LPARAM) hItem); + + if (KHM_SUCCEEDED(khui_cfg_get_first_child(node, + &c))) { + do { + cfgui_add_node(d, hwtv, c, node, + !!(reg.flags & KHUI_CNFLAG_SORT_CHILDREN)); + } while (KHM_SUCCEEDED(khui_cfg_get_next_release(&c))); + } +} + +static void +cfgui_initialize_dialog(HWND hwnd) { + cfgui_wnd_data * d; + HWND hwtv; + HWND hwtitle; + HFONT hf; + HDC hdc; + HICON hicon; + + d = cfgui_get_wnd_data(hwnd); + + /* create and fill the image list for the treeview */ + + d->hi_status = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + ILC_COLOR8 | ILC_MASK, + 4,4); + + hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_DEFAULT), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + /* note that we can't use index 0 because that is used to indicate + that there is no state image for the node */ + do { + d->idx_default = ImageList_AddIcon(d->hi_status, hicon); + } while(d->idx_default == 0); + + DestroyIcon(hicon); + + hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_MODIFIED), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + d->idx_modified = ImageList_AddIcon(d->hi_status, hicon); + + DestroyIcon(hicon); + + hicon = LoadImage(khm_hInstance, MAKEINTRESOURCE(IDI_CFG_APPLIED), + IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + d->idx_applied = ImageList_AddIcon(d->hi_status, hicon); + + DestroyIcon(hicon); + + /* now for the treeview */ + hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); + + TreeView_SetImageList(hwtv, d->hi_status, TVSIL_STATE); + + cfgui_add_node(d, hwtv, NULL, NULL, FALSE); + + hdc = GetDC(hwnd); + hf = CreateFont(-MulDiv(12, + GetDeviceCaps(hdc, LOGPIXELSY), + 72), + 0, /* nWidth */ + 0, /* nEscapement */ + 0, /* nOrientation */ + FW_BOLD, /* fnWeight */ + TRUE, /* fdwItalic */ + FALSE, /* fdwUnderline */ + FALSE, /* fdwStrikeOut */ + DEFAULT_CHARSET, /* fdwCharSet */ + OUT_DEFAULT_PRECIS, /* fdwOutputPrecision */ + CLIP_DEFAULT_PRECIS, /* fdwClipPrecision */ + DEFAULT_QUALITY, /* fdwQuality */ + FF_SWISS | DEFAULT_PITCH, /* pitch&family */ + NULL); /* face */ + ReleaseDC(hwnd, hdc); + + d->hf_title = hf; + + hwtitle = GetDlgItem(hwnd, IDC_CFG_TITLE); + + SendMessage(hwtitle, + WM_SETFONT, + (WPARAM) hf, + (LPARAM) FALSE); +} + +static void +cfgui_free_node(HWND hwtv, HTREEITEM hItem) { + TVITEMEX iex; + HTREEITEM hChItem; + + ZeroMemory(&iex, sizeof(iex)); + + iex.mask = TVIF_PARAM; + iex.hItem = hItem; + + if (TreeView_GetItem(hwtv, &iex)) { + khui_config_node node; + + node = (khui_config_node) iex.lParam; + khui_cfg_release(node); + } + + hChItem = TreeView_GetChild(hwtv, hItem); + while(hChItem) { + cfgui_free_node(hwtv, hChItem); + + hChItem = TreeView_GetNextSibling(hwtv, hChItem); + } +} + +static void +cfgui_uninitialize_dialog(HWND hwnd) { + cfgui_wnd_data * d; + HWND hwtv; + + d = cfgui_get_wnd_data(hwnd); + + hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); + + cfgui_free_node(hwtv, TreeView_GetRoot(hwtv)); + + if (d->hf_title) + DeleteObject(d->hf_title); + + if (d->hi_status) + ImageList_Destroy(d->hi_status); +} + +static HWND +cfgui_create_config_node_window(HWND hwnd, khui_config_node node) { + khui_config_node_reg reg; + khm_int32 rv; + HWND hw_new; + + khui_config_node parent; + + if (KHM_SUCCEEDED(khui_cfg_get_parent(node, &parent))) { + HWND hwp; + + hwp = khui_cfg_get_hwnd(parent); + + if (hwp == NULL) + cfgui_create_config_node_window(hwnd, parent); + + khui_cfg_release(parent); + } + + rv = khui_cfg_get_reg(node, ®); +#ifdef DEBUG + assert(KHM_SUCCEEDED(rv)); +#endif + hw_new = CreateDialogParam(reg.h_module, + reg.dlg_template, + hwnd, + reg.dlg_proc, + (LPARAM) node); +#ifdef DEBUG + assert(hw_new); +#endif + khui_cfg_set_hwnd(node, hw_new); + + return hw_new; +} + +static void +cfgui_activate_node(HWND hwnd, khui_config_node node) { + + cfgui_wnd_data * d; + HTREEITEM hItem; + HWND hw_new; + HWND hwtv; + + d = cfgui_get_wnd_data(hwnd); + hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); + hItem = (HTREEITEM) khui_cfg_get_param(node); + +#ifdef DEBUG + assert(hItem); + assert(hwtv); +#endif + + if (node == NULL) { + hw_new = d->hw_generic_pane; + } else { + + hw_new = khui_cfg_get_hwnd(node); + + if (hw_new == NULL) { + hw_new = cfgui_create_config_node_window(hwnd, node); + } + } + + if (hw_new == d->hw_current) + return; /* nothing to do */ + + { + RECT r_title; + RECT r_pane; + HWND hw; + + if (d->hw_current) + ShowWindow(d->hw_current, SW_HIDE); + + hw = GetDlgItem(hwnd, IDC_CFG_TITLE); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r_title); + + hw = GetDlgItem(hwnd, IDC_CFG_PANE); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r_pane); + + OffsetRect(&r_pane, -r_title.left, -r_title.top); + + SetWindowPos(hw_new, + hwtv, + r_pane.left, r_pane.top, + r_pane.right - r_pane.left, + r_pane.bottom - r_pane.top, + SWP_NOOWNERZORDER | + SWP_SHOWWINDOW | + SWP_NOACTIVATE); + } + + if (node == NULL) { + wchar_t wbuf[256]; + + LoadString(khm_hInstance, IDS_CFG_ROOT_TITLE, + wbuf, ARRAYLENGTH(wbuf)); + + SetDlgItemText(hwnd, IDC_CFG_TITLE, wbuf); + } else { + khm_int32 rv; + khui_config_node_reg reg; + + rv = khui_cfg_get_reg(node, ®); +#ifdef DEBUG + assert(KHM_SUCCEEDED(rv)); +#endif + SetDlgItemText(hwnd, IDC_CFG_TITLE, reg.long_desc); + } + + d->hw_current = hw_new; + d->current = node; + + TreeView_SelectItem(hwtv, hItem); +} + +static BOOL +cfgui_check_mod_state(khui_config_node node) { + khm_int32 flags; + khui_config_node c = NULL; + BOOL rv = FALSE; + + flags = khui_cfg_get_flags(node); + + if (flags & KHUI_CNFLAG_MODIFIED) + return TRUE; + + if (KHM_FAILED(khui_cfg_get_first_child(node, &c))) + return FALSE; + + while(c) { + rv = (rv || cfgui_check_mod_state(c)); + khui_cfg_get_next_release(&c); + } + + return rv; +} + +static void +cfgui_apply_settings(khui_config_node node) { + HWND hwnd; + khui_config_node c; + khm_int32 flags; + + hwnd = khui_cfg_get_hwnd(node); + flags = khui_cfg_get_flags(node); + + if (hwnd && (flags & KHUI_CNFLAG_MODIFIED)) { + SendMessage(hwnd, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(0, WMCFG_APPLY), + (LPARAM) node); + } + + if (KHM_FAILED(khui_cfg_get_first_child(node, &c))) + return; + + while (c) { + cfgui_apply_settings(c); + khui_cfg_get_next_release(&c); + } +} + +static void +cfgui_update_state(HWND hwnd, + khm_int32 flags, + khui_config_node node) { + cfgui_wnd_data * d; + HWND hwtv; + HTREEITEM hItem; + TVITEMEX itx; + int idx; + + d = cfgui_get_wnd_data(hwnd); + hwtv = GetDlgItem(hwnd, IDC_CFG_NODELIST); + hItem = (HTREEITEM) khui_cfg_get_param(node); + + ZeroMemory(&itx, sizeof(itx)); + + if (flags & KHUI_CNFLAG_MODIFIED) + idx = d->idx_modified; + else if (flags & KHUI_CNFLAG_APPLIED) + idx = d->idx_applied; + else + idx = d->idx_default; + + itx.hItem = hItem; + itx.mask = TVIF_STATE; + itx.state = INDEXTOSTATEIMAGEMASK(idx); + itx.stateMask = TVIS_STATEIMAGEMASK; + + TreeView_SetItem(hwtv, &itx); + + if(cfgui_check_mod_state(NULL)) { + EnableWindow(GetDlgItem(hwnd, IDAPPLY), TRUE); + } else { + EnableWindow(GetDlgItem(hwnd, IDAPPLY), FALSE); + } +} + + +/* dialog procedure for the generic dialog */ +static INT_PTR CALLBACK +cfgui_dlgproc_generic(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + cfgui_wnd_data * d; + + switch(uMsg) { + case WM_INITDIALOG: + d = (cfgui_wnd_data *) lParam; + cfgui_set_wnd_data(hwnd, d); + return TRUE; + + case WM_CTLCOLORSTATIC: + d = cfgui_get_wnd_data(hwnd); + return (BOOL)(DWORD_PTR) d->hbr_white; + + case WM_ERASEBKGND: + { + HDC hdc = (HDC) wParam; + RECT r_client; + RECT r_logo; + RECT r_fill; + + d = cfgui_get_wnd_data(hwnd); + + GetClientRect(hwnd, &r_client); + SetRectEmpty(&r_logo); + + r_logo.right = d->kbmp_logo.cx; + r_logo.bottom = d->kbmp_logo.cy; + + OffsetRect(&r_logo, + r_client.right - r_logo.right, + r_client.bottom - r_logo.bottom); + + khui_draw_bitmap(hdc, + r_logo.left, + r_logo.top, + &d->kbmp_logo); + + r_fill.left = 0; + r_fill.top = 0; + r_fill.right = r_logo.left; + r_fill.bottom = r_client.bottom; + FillRect(hdc, &r_fill, d->hbr_white); + + r_fill.left = r_logo.left; + r_fill.right = r_client.right; + r_fill.bottom = r_logo.top; + FillRect(hdc, &r_fill, d->hbr_white); + + SetWindowLongPtr(hwnd, DWLP_MSGRESULT, (LONG) TRUE); + } + return TRUE; + } + + return FALSE; +} + +static INT_PTR CALLBACK +cfgui_dlgproc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + + khui_config_node node; + cfgui_wnd_data * d; + + switch(uMsg) { + case WM_INITDIALOG: + node = (khui_config_node) lParam; + + khui_cfg_clear_params(); + + khui_cfg_set_configui_handle(hwnd); + + d = PMALLOC(sizeof(*d)); + ZeroMemory(d, sizeof(*d)); + + d->hbr_white = CreateSolidBrush(RGB(255,255,255)); + + d->hw_generic_pane = + CreateDialogParam(khm_hInstance, + MAKEINTRESOURCE(IDD_CFG_GENERIC), + hwnd, + cfgui_dlgproc_generic, + (LPARAM) d); + + khui_bitmap_from_hbmp(&d->kbmp_logo, + LoadImage( + khm_hInstance, + MAKEINTRESOURCE(IDB_LOGO_OPAQUE), + IMAGE_BITMAP, + 0, + 0, + LR_DEFAULTCOLOR)); + + cfgui_set_wnd_data(hwnd, d); + + cfgui_initialize_dialog(hwnd); + + cfgui_activate_node(hwnd, node); + + khm_add_dialog(hwnd); + khm_enter_modal(hwnd); + + return TRUE; + + case WM_DESTROY: + cfgui_hwnd = NULL; + + khui_cfg_set_configui_handle(NULL); + + cfgui_uninitialize_dialog(hwnd); + + d = cfgui_get_wnd_data(hwnd); + khui_delete_bitmap(&d->kbmp_logo); + DeleteObject(d->hbr_white); + + khm_del_dialog(hwnd); + + SetForegroundWindow(khm_hwnd_main); + + return FALSE; + + case WM_NOTIFY: + { + LPNMHDR lpnm; + LPNMTREEVIEW lptv; + LPNMTVGETINFOTIP lpgi; + khui_config_node node; + + lpnm = (LPNMHDR) lParam; + + switch (lpnm->code) { + case TVN_SELCHANGED: + lptv = (LPNMTREEVIEW) lParam; + cfgui_activate_node(hwnd, + (khui_config_node) + lptv->itemNew.lParam); + return TRUE; + + case TVN_GETINFOTIP: + lpgi = (LPNMTVGETINFOTIP) lParam; + node = (khui_config_node) lpgi->lParam; + + if (node) { + khm_int32 flags = 0; + + flags = khui_cfg_get_flags(node); + + if (flags & KHUI_CNFLAG_MODIFIED) { + LoadString(khm_hInstance, IDS_CFG_IT_MOD, + lpgi->pszText, lpgi->cchTextMax); + } else if (flags & KHUI_CNFLAG_APPLIED) { + LoadString(khm_hInstance, IDS_CFG_IT_APP, + lpgi->pszText, lpgi->cchTextMax); + } else { + LoadString(khm_hInstance, IDS_CFG_IT_NONE, + lpgi->pszText, lpgi->cchTextMax); + } + } else { + StringCchCopy(lpgi->pszText, lpgi->cchTextMax, L""); + } + + return TRUE; + } + } + return TRUE; + + case WM_CTLCOLORSTATIC: + { + d = cfgui_get_wnd_data(hwnd); + return (BOOL)(DWORD_PTR) d->hbr_white; + } + /* implicit break */ + + case WM_COMMAND: + switch(wParam) { + case MAKEWPARAM(IDCANCEL, BN_CLICKED): + khm_leave_modal(); + DestroyWindow(hwnd); + break; + + case MAKEWPARAM(IDAPPLY, BN_CLICKED): + cfgui_apply_settings(NULL); + break; + + case MAKEWPARAM(IDOK, BN_CLICKED): + cfgui_apply_settings(NULL); + khm_leave_modal(); + DestroyWindow(hwnd); + break; + } + return TRUE; + + case KHUI_WM_CFG_NOTIFY: + switch(HIWORD(wParam)) { + case WMCFG_SHOW_NODE: + cfgui_activate_node(hwnd, (khui_config_node) lParam); + break; + + case WMCFG_UPDATE_STATE: + cfgui_update_state(hwnd, LOWORD(wParam), + (khui_config_node) lParam); + break; + + case WMCFG_SYNC_NODE_LIST: + /*TODO: synchronize the node lists here */ + break; + } + + return TRUE; + } + + return FALSE; +} + +static void +cfgui_create_window(khui_config_node node) { +#ifdef DEBUG + assert(cfgui_hwnd == NULL); +#endif + + khm_refresh_config(); + + cfgui_hwnd = CreateDialogParam(khm_hInstance, + MAKEINTRESOURCE(IDD_CFG_MAIN), + khm_hwnd_main, + cfgui_dlgproc, + (LPARAM) node); +#ifdef DEBUG + assert(cfgui_hwnd != NULL); +#endif + ShowWindow(cfgui_hwnd,SW_SHOW); +} + +static void +cfgui_destroy_window(void) { + if (cfgui_hwnd) + DestroyWindow(cfgui_hwnd); + /* cfgui_hwnd will be set to NULL in the dialog proc */ +} + +void +khm_show_config_pane(khui_config_node node) { + if (cfgui_hwnd != NULL) { + SendMessage(cfgui_hwnd, KHUI_WM_CFG_NOTIFY, + MAKEWPARAM(0, WMCFG_SHOW_NODE), + (LPARAM) node); + } else { + cfgui_create_window(node); + } +} + +void khm_refresh_config(void) { + khm_size cb; + khm_size n_idents; + wchar_t * idents = NULL; + wchar_t * t; + khm_int32 rv; + int n_tries = 0; + khui_config_node cfg_ids = NULL; + khui_config_node cfg_r = NULL; + khui_config_node cfg_iter = NULL; + khui_menu_def * omenu; + khm_boolean refresh_menu = FALSE; + + do { + rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, + KCDB_IDENT_FLAG_CONFIG, + NULL, + &cb, + &n_idents); + + if (rv != KHM_ERROR_TOO_LONG || + n_idents == 0) + return; + + if (idents) + PFREE(idents); + idents = PMALLOC(cb); +#ifdef DEBUG + assert(idents); +#endif + + rv = kcdb_identity_enum(KCDB_IDENT_FLAG_CONFIG, + KCDB_IDENT_FLAG_CONFIG, + idents, + &cb, + &n_idents); + + n_tries++; + } while(KHM_FAILED(rv) && + n_tries < 5); + + if (KHM_FAILED(rv)) + goto _cleanup; + + if (KHM_FAILED(khui_cfg_open(NULL, + L"KhmIdentities", + &cfg_ids))) + goto _cleanup; + + for(t = idents; t && *t; t = multi_string_next(t)) { + khui_config_node cfg_id = NULL; + + rv = khui_cfg_open(cfg_ids, + t, + &cfg_id); + + if (KHM_FAILED(rv)) { + khui_config_node_reg reg; + wchar_t wshort[KHUI_MAXCCH_SHORT_DESC]; + wchar_t wlong[KHUI_MAXCCH_LONG_DESC]; + wchar_t wfmt[KHUI_MAXCCH_SHORT_DESC]; + + ZeroMemory(®, sizeof(reg)); + + reg.name = t; + reg.short_desc = wshort; + reg.long_desc = wlong; + reg.h_module = khm_hInstance; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDENTITY); + reg.dlg_proc = khm_cfg_identity_proc; + reg.flags = 0; + + LoadString(khm_hInstance, IDS_CFG_IDENTITY_SHORT, + wfmt, ARRAYLENGTH(wfmt)); + StringCbPrintf(wshort, sizeof(wshort), wfmt, t); + + LoadString(khm_hInstance, IDS_CFG_IDENTITY_LONG, + wfmt, ARRAYLENGTH(wfmt)); + StringCbPrintf(wlong, sizeof(wlong), wfmt, t); + + khui_cfg_register(cfg_ids, + ®); + } else { + khui_cfg_release(cfg_id); + } + } + + for (khui_cfg_get_first_child(cfg_ids, &cfg_iter); + cfg_iter; + khui_cfg_get_next_release(&cfg_iter)) { + + wchar_t cfgname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + khm_handle tident = NULL; + khm_int32 tflags = 0; + + cb = sizeof(cfgname); + khui_cfg_get_name(cfg_iter, cfgname, &cb); + + if (KHM_FAILED(kcdb_identity_create(cfgname, 0, &tident)) || + KHM_FAILED(kcdb_identity_get_flags(tident, &tflags)) || + !(tflags & KCDB_IDENT_FLAG_ACTIVE) || + !(tflags & KCDB_IDENT_FLAG_CONFIG)) { + + /* this configuration node needs to be removed */ + + khui_cfg_remove(cfg_iter); + } + } + + /* Now iterate through the root level configuration nodes and make + sure we have a menu item for each of them. */ + if (KHM_FAILED(khui_cfg_get_first_child(NULL, &cfg_r))) + goto _cleanup; + + omenu = khui_find_menu(KHUI_MENU_OPTIONS); + if (omenu == NULL) + goto _cleanup; + + do { + khm_int32 action; + khm_int32 flags; + khui_action * paction; + wchar_t cname[KHUI_MAXCCH_NAME]; + wchar_t wshort[KHUI_MAXCCH_SHORT_DESC]; + khm_size cb; + khm_handle sub; + khui_config_node_reg reg; + + flags = khui_cfg_get_flags(cfg_r); + if (flags & KHUI_CNFLAG_SYSTEM) + goto _next_cfg; + + cb = sizeof(cname); + if (KHM_FAILED(khui_cfg_get_name(cfg_r, cname, &cb))) { +#ifdef DEBUG + assert(FALSE); +#endif + goto _next_cfg; + } + + paction = khui_find_named_action(cname); + + if (!paction) { + khui_cfg_get_reg(cfg_r, ®); + + kmq_create_hwnd_subscription(khm_hwnd_main, &sub); + + StringCbCopy(wshort, sizeof(wshort), reg.short_desc); + StringCbCat(wshort, sizeof(wshort), L" ..."); + + action = khui_action_create(cname, + wshort, + reg.long_desc, + (void *) CFGACTION_MAGIC, + KHUI_ACTIONTYPE_TRIGGER, + sub); + + if (action == 0) { +#ifdef DEBUG + assert(FALSE); +#endif + goto _next_cfg; + } + + khui_menu_insert_action(omenu, -1, action, 0); + + refresh_menu = TRUE; + } + + _next_cfg: + if (KHM_FAILED(khui_cfg_get_next_release(&cfg_r))) + break; + } while(cfg_r); + + if (refresh_menu) + khm_menu_refresh_items(); + + _cleanup: + if (cfg_ids) + khui_cfg_release(cfg_ids); + + if (cfg_r) + khui_cfg_release(cfg_r); + + if (idents) + PFREE(idents); +} + +void khm_init_config(void) { + wchar_t wshort[KHUI_MAXCCH_SHORT_DESC]; + wchar_t wlong[KHUI_MAXCCH_LONG_DESC]; + khui_config_node_reg reg; + khui_config_node node; + + reg.short_desc = wshort; + reg.long_desc = wlong; + reg.h_module = khm_hInstance; + reg.flags = KHUI_CNFLAG_SYSTEM; + + reg.name = L"KhmGeneral"; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_GENERAL); + reg.dlg_proc = khm_cfg_general_proc; + LoadString(khm_hInstance, IDS_CFG_GENERAL_SHORT, + wshort, ARRAYLENGTH(wshort)); + LoadString(khm_hInstance, IDS_CFG_GENERAL_LONG, + wlong, ARRAYLENGTH(wlong)); + + khui_cfg_register(NULL, ®); + + reg.name = L"KhmAppear"; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_APPEAR); + reg.dlg_proc = khm_cfg_appearance_proc; + LoadString(khm_hInstance, IDS_CFG_APPEAR_SHORT, + wshort, ARRAYLENGTH(wshort)); + LoadString(khm_hInstance, IDS_CFG_APPEAR_LONG, + wlong, ARRAYLENGTH(wlong)); + + khui_cfg_register(NULL, ®); + + reg.name = L"KhmIdentities"; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDENTITIES); + reg.dlg_proc = khm_cfg_identities_proc; + LoadString(khm_hInstance, IDS_CFG_IDENTITIES_SHORT, + wshort, ARRAYLENGTH(wshort)); + LoadString(khm_hInstance, IDS_CFG_IDENTITIES_LONG, + wlong, ARRAYLENGTH(wlong)); + + khui_cfg_register(NULL, ®); + + node = NULL; + khui_cfg_open(NULL, L"KhmIdentities", &node); +#ifdef DEBUG + assert(node); +#endif + + reg.name = L"KhmIdentitiesTab"; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_IDS_TAB); + reg.dlg_proc = khm_cfg_ids_tab_proc; + LoadString(khm_hInstance, IDS_CFG_IDS_TAB_SHORT, + wshort, ARRAYLENGTH(wshort)); + LoadString(khm_hInstance, IDS_CFG_IDS_TAB_LONG, + wlong, ARRAYLENGTH(wlong)); + reg.flags = KHUI_CNFLAG_SUBPANEL | KHUI_CNFLAG_SYSTEM; + + khui_cfg_register(node, ®); + + reg.name = L"KhmIdentitiesTabPlural"; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_ID_TAB); + reg.dlg_proc = khm_cfg_id_tab_proc; + LoadString(khm_hInstance, IDS_CFG_ID_TAB_SHORT, + wshort, ARRAYLENGTH(wshort)); + LoadString(khm_hInstance, IDS_CFG_ID_TAB_LONG, + wlong, ARRAYLENGTH(wlong)); + reg.flags = KHUI_CNFLAG_PLURAL | KHUI_CNFLAG_SUBPANEL | KHUI_CNFLAG_SYSTEM; + + khui_cfg_register(node, ®); + + reg.flags = KHUI_CNFLAG_SYSTEM; + khui_cfg_release(node); + + reg.name = L"KhmNotifications"; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_NOTIF); + reg.dlg_proc = khm_cfg_notifications_proc; + LoadString(khm_hInstance, IDS_CFG_NOTIF_SHORT, + wshort, ARRAYLENGTH(wshort)); + LoadString(khm_hInstance, IDS_CFG_NOTIF_LONG, + wlong, ARRAYLENGTH(wlong)); + + khui_cfg_register(NULL, ®); + + reg.name = L"KhmPlugins"; + reg.dlg_template = MAKEINTRESOURCE(IDD_CFG_PLUGINS); + reg.dlg_proc = khm_cfg_plugins_proc; + LoadString(khm_hInstance, IDS_CFG_PLUGINS_SHORT, + wshort, ARRAYLENGTH(wshort)); + LoadString(khm_hInstance, IDS_CFG_PLUGINS_LONG, + wlong, ARRAYLENGTH(wlong)); + + khui_cfg_register(NULL, ®); +} + +void khm_exit_config(void) { +} --- krb5-1.4.4.orig/src/windows/identity/ui/htwnd.c +++ krb5-1.4.4/src/windows/identity/ui/htwnd.c @@ -1,1252 +1,1252 @@ -/* -* Copyright (c) 2005 Massachusetts Institute of Technology -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without -* restriction, including without limitation the rights to use, copy, -* modify, merge, publish, distribute, sublicense, and/or sell copies -* of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -* SOFTWARE. -*/ - -/* $Id$ */ - -#include -#include - -ATOM khui_htwnd_cls; - -#define HTW_STYLE_NORMAL 0 - -/* There are currently 4 style "bits" and 3 sizes, which means - there can be 2^4*3=48 possible styles max. If someone is - feeling adventurous you can slightly improve performance of - the parser using this little fact. For now, I don't care. - (hint: combine size and style bits to form a single number - and use it as an index into the styles array) -*/ -#define HTW_STYLE_MAX 48 - -#define HTW_FORMAT_MAX 128 - -#define HTW_TAB_MAX 8 - -#define HTW_DEFAULT (-1) - -#define HTW_NORMAL_SIZE 8 -#define HTW_LARGE_SIZE 12 -#define HTW_HUGE_SIZE 20 - -/* font variant */ -#define FV_ABSOLUTE 0x10000000 - -#define FV_ITALIC 0x00000002 -#define FV_UNDERLINE 0x00000004 -#define FV_STRIKEOUT 0x00000008 -#define FV_BOLD 0x00000010 - -#define FV_NOITALIC 0x00020000 -#define FV_NOUNDERLINE 0x00040000 -#define FV_NOSTRIKEOUT 0x00080000 -#define FV_NOBOLD 0x00100000 - -#define FV_NONE 0x00000000 -#define FV_MASK 0x0000001f - -#define HTW_LINK_ALLOC 8 - -#define ALIGN_LEFT 0 -#define ALIGN_CENTER 1 -#define ALIGN_RIGHT 2 - -struct tx_tbl_t { - wchar_t * string; - LONG value; -} - -htw_color_table[] = { - {L"black", RGB(0,0,0)}, - {L"white", RGB(255,255,255)}, - {L"red", RGB(255,0,0)}, - {L"green", RGB(0,255,0)}, - {L"blue", RGB(0,0,255)}, - {L"grey", RGB(128,128,128)} -}, - -htw_size_table[] = { - {L"normal", HTW_NORMAL_SIZE}, - {L"large", HTW_LARGE_SIZE}, - {L"huge", HTW_HUGE_SIZE} -}, - -htw_align_table[] = { - {L"left", ALIGN_LEFT}, - {L"center", ALIGN_LEFT}, - {L"right", ALIGN_RIGHT} -}; - -typedef struct khui_htwnd_style_t { - LONG height; - LONG variation; /* combination of FV_* */ - - HFONT font; -} khui_htwnd_style; - -typedef struct khui_format_t { - int style_idx; - COLORREF color; -} khui_format; - -typedef struct format_stack_t { - khui_format stack[HTW_FORMAT_MAX]; - int stack_top; -} format_stack; - -typedef struct khui_htwnd_data_t { - int id; /* control ID */ - int flags; - wchar_t * text; - int scroll_left; - int scroll_top; - int ext_width; - int ext_height; - COLORREF bk_color; - HCURSOR hc_hand; - int l_pixel_y; - - khui_htwnd_style styles[HTW_STYLE_MAX]; - int n_styles; - - khui_htwnd_link ** links; - int n_links; - int max_links; - int active_link; - int md_link; - - int tabs[HTW_TAB_MAX]; - int n_tabs; -} khui_htwnd_data; - -static LONG table_lookup(struct tx_tbl_t * tbl, int n, wchar_t * v, int len) -{ - int i; - - for(i=0; in_styles; i++) { - if(d->styles[i].font != NULL) { - DeleteObject(d->styles[i].font); - d->styles[i].font = NULL; - } - } - - d->n_styles = 0; -} - -static void format_init(format_stack * s) -{ - s->stack_top = -1; - ZeroMemory(s->stack, sizeof(s->stack)); -} - -static khui_format * format_current(format_stack * s) -{ - if(s->stack_top >= 0) - return &(s->stack[s->stack_top]); - else - return NULL; -} - -static int format_style(format_stack * s) -{ - if(s->stack_top >= 0) - return s->stack[s->stack_top].style_idx; - else - return 0; -} - -static COLORREF format_color(format_stack * s) -{ - if(s->stack_top >= 0) - return s->stack[s->stack_top].color; - else - return 0; -} - -static int format_level(format_stack * s) -{ - return s->stack_top; -} - -static void format_unwind(format_stack * s, int level) -{ - s->stack_top = level; -} - -static void format_push(format_stack * s, khui_htwnd_data * d, LONG height, LONG variation, COLORREF color) -{ - int i; - khui_format * top; - khui_htwnd_style * style; - - _ASSERT(s->stack_top < (HTW_FORMAT_MAX-1)); - - /* formatting is additive unless FV_NORMAL is set in variation */ - top = format_current(s); - if(top) { - style = &(d->styles[top->style_idx]); - if(height == HTW_DEFAULT) - height = style->height; - - if(variation == HTW_DEFAULT) - variation = style->variation; - else if(!(variation & FV_ABSOLUTE)) - variation |= style->variation; - - if(color == HTW_DEFAULT) - color = top->color; - } - - variation &= ~FV_ABSOLUTE; - variation ^= variation & (variation>>16); - variation &= FV_MASK; - - /* now look for an existing style that matches the requested one */ - for(i=0; in_styles; i++) { - style = &(d->styles[i]); - - if(style->height == height && - style->variation == variation) - break; - } - - s->stack_top++; - - if(in_styles) { - s->stack[s->stack_top].style_idx = i; - } else { - if(d->n_styles == HTW_STYLE_MAX) { - s->stack[s->stack_top].style_idx = 0; - } else { - s->stack[s->stack_top].style_idx = d->n_styles; - d->styles[d->n_styles].font = NULL; - d->styles[d->n_styles].height = height; - d->styles[d->n_styles].variation = variation; - d->n_styles++; - } - } - s->stack[s->stack_top].color = color; -} - -static void format_pop(format_stack * s) { - if(s->stack_top >= 0) - s->stack_top--; -} - -static wchar_t * token_end(wchar_t * s) { - while(iswalnum(*s) || *s == L'/') - s++; - return s; -} - -static wchar_t * skip_ws(wchar_t * s) { - while(iswspace(*s)) - s++; - return s; -} - -/* s points to something like " = \"value\"" - start and len will point to the start and - length of value. return value will point to the - character following the last double quote. */ -static wchar_t * read_attr(wchar_t * s, wchar_t ** start, int * len) -{ - wchar_t *e; - - *start = NULL; - *len = 0; - - do { - s = skip_ws(s); - if(*s != L'=') - break; - s = skip_ws(++s); - if(*s != L'"') - break; - e = wcschr(++s, L'"'); - if(!e) - break; - - *start = s; - *len = (int) (e - s); - - s = e + 1; - } while(FALSE); - - return s; -} - -/* -We currently support the following tags: - -link text -foo -foo -foo - -foo - (color)=black|white|red|green|blue|grey -foo -foo - -
foo
-foo -foo - -

foo

- - -*/ - -static int htw_parse_tag( - wchar_t * start, - wchar_t ** end, - int * align, - khui_htwnd_data * d, - format_stack * s, - PPOINT p_abs, - PPOINT p_rel, - int lh, - BOOL dry_run) -{ - wchar_t * c; - int n = 0; - - /* start initially points to the starting '<' */ - c = token_end(++start); - - if(!_wcsnicmp(start,L"a",c-start)) { - /* start of an 'a' tag */ - wchar_t * id_start = NULL; - int id_len = 0; - wchar_t * param_start = NULL; - int param_len = 0; - - /* We don't need to parse the link - if it is just a dry run */ - if(dry_run) { - format_push(s, d, HTW_DEFAULT, HTW_DEFAULT, RGB(0,0,255)); - *end = wcschr(start, L'>'); - return FALSE; - } - - while(c && *c && *c != L'>') { - wchar_t * e; - - c = skip_ws(c); - e = token_end(c); - - if(c==e) - break; - - if(!_wcsnicmp(c,L"id",e-c)) { - c = read_attr(e, &id_start, &id_len); - } else if(!_wcsnicmp(c,L"param",e-c)) { - c = read_attr(e, ¶m_start, ¶m_len); - } - } - - if(d->active_link == d->n_links) - format_push(s,d, HTW_DEFAULT, FV_UNDERLINE, RGB(0,0,255)); - else - format_push(s,d, HTW_DEFAULT, FV_NONE, RGB(0,0,255)); - - { - khui_htwnd_link * l; - - if(!d->links) { - d->links = PMALLOC(sizeof(khui_htwnd_link *) * HTW_LINK_ALLOC); - ZeroMemory(d->links, sizeof(khui_htwnd_link *) * HTW_LINK_ALLOC); - d->max_links = HTW_LINK_ALLOC; - d->n_links = 0; - } - - if(d->n_links >= d->max_links) { - khui_htwnd_link ** ll; - int n_new; - - n_new = UBOUNDSS(d->n_links + 1, HTW_LINK_ALLOC, HTW_LINK_ALLOC); - - ll = PMALLOC(sizeof(khui_htwnd_link *) * n_new); - ZeroMemory(ll, sizeof(khui_htwnd_link *) * n_new); - memcpy(ll, d->links, sizeof(khui_htwnd_link *) * d->max_links); - PFREE(d->links); - d->links = ll; - d->max_links = n_new; - } - - l = d->links[d->n_links]; - if(!l) { - l = PMALLOC(sizeof(khui_htwnd_link)); - d->links[d->n_links] = l; - } - - l->id = id_start; - l->id_len = id_len; - l->param = param_start; - l->param_len = param_len; - - l->r.left = p_abs->x; - l->r.top = p_abs->y; - - d->n_links++; - } - - } else if(!_wcsnicmp(start, L"/a", c - start)) { - khui_htwnd_link * l; - - c = wcschr(c,L'>'); - if(!c) - c = c + wcslen(c); - - format_pop(s); - - if(!dry_run) { - l = d->links[d->n_links - 1]; /* last link */ - l->r.right = p_abs->x; - l->r.bottom = p_abs->y + lh; - } - } else if(!_wcsnicmp(start, L"p", c - start)) { - wchar_t * e; - wchar_t * align_s = NULL; - int align_len = 0; - - c = skip_ws(c); - e = token_end(c); - - if(c != e && !_wcsnicmp(c,L"align",e-c)) { - c = read_attr(e, &align_s, &align_len); - } - - c = wcschr(c, L'>'); - if(!c) - c = c + wcslen(c); - - - if(align_s) - *align = table_lookup(htw_align_table, ARRAYLENGTH(htw_align_table), align_s, align_len); - else - *align = ALIGN_LEFT; - - n = 1; - } else if(!_wcsnicmp(start, L"b", c - start)) { - format_push(s,d, HTW_DEFAULT, FV_BOLD, HTW_DEFAULT); - } else if(!_wcsnicmp(start, L"/b", c - start)) { - format_pop(s); - } else if(!_wcsnicmp(start, L"u", c - start)) { - format_push(s,d, HTW_DEFAULT, FV_UNDERLINE, HTW_DEFAULT); - } else if(!_wcsnicmp(start, L"/u", c - start)) { - format_pop(s); - } else if(!_wcsnicmp(start, L"i", c - start)) { - format_push(s,d, HTW_DEFAULT, FV_ITALIC, HTW_DEFAULT); - } else if(!_wcsnicmp(start, L"/i", c - start)) { - format_pop(s); - } else if(!_wcsnicmp(start, L"large", c - start)) { - format_push(s,d,-MulDiv(HTW_LARGE_SIZE, d->l_pixel_y, 72), HTW_DEFAULT, HTW_DEFAULT); - } else if(!_wcsnicmp(start, L"/large", c - start)) { - format_pop(s); - } else if(!_wcsnicmp(start, L"huge", c - start)) { - format_push(s,d,-MulDiv(HTW_HUGE_SIZE, d->l_pixel_y, 72), HTW_DEFAULT, HTW_DEFAULT); - } else if(!_wcsnicmp(start, L"/huge", c - start)) { - format_pop(s); - } else if(!_wcsnicmp(start, L"center", c - start)) { - c = wcschr(c, L'>'); - if(!c) - c = c + wcslen(c); - *align = ALIGN_CENTER; - n = 1; - } else if(!_wcsnicmp(start, L"left", c - start) || - !_wcsnicmp(start, L"p", c - start)) - { - c = wcschr(c, L'>'); - if(!c) - c = c + wcslen(c); - *align = ALIGN_LEFT; - n = 1; - } else if(!_wcsnicmp(start, L"right", c - start)) { - c = wcschr(c, L'>'); - if(!c) - c = c + wcslen(c); - *align = ALIGN_RIGHT; - n = 1; - } else if(!_wcsnicmp(start, L"/center", c - start) || - !_wcsnicmp(start, L"/left", c - start) || - !_wcsnicmp(start, L"/right", c - start) || - !_wcsnicmp(start, L"/p", c - start)) { - c = wcschr(c, L'>'); - if(!c) - c = c + wcslen(c); - *align = ALIGN_LEFT; - n = 1; - } else if(!_wcsnicmp(start, L"font", c - start)) { - wchar_t * color_s = NULL; - int color_len = 0; - wchar_t * size_s = NULL; - int size_len = 0; - LONG color = HTW_DEFAULT; - LONG h = HTW_DEFAULT; - - while(c && *c && *c != L'>') { - wchar_t * e; - - c = skip_ws(c); - e = token_end(c); - - if(c==e) - break; - - if(!_wcsnicmp(c,L"color",e-c)) { - c = read_attr(e, &color_s, &color_len); - } else if(!_wcsnicmp(c,L"size",e-c)) { - c = read_attr(e, &size_s, &size_len); - } - } - - if(color_s) - color = table_lookup(htw_color_table, ARRAYLENGTH(htw_color_table), color_s, color_len); - if(size_s) { - h = table_lookup(htw_size_table, ARRAYLENGTH(htw_size_table), size_s, size_len); - if(h) - h = -MulDiv(h, d->l_pixel_y, 72); - else - h = -MulDiv(HTW_NORMAL_SIZE, d->l_pixel_y, 72); - } - - format_push(s,d,h,HTW_DEFAULT,color); - } else if(!_wcsnicmp(start, L"/font", c - start)) { - format_pop(s); - } else if(!_wcsnicmp(start, L"settab", c - start)) { - wchar_t * e; - wchar_t * pos_s = NULL; - int pos_len; - - c = skip_ws(c); - e = token_end(c); - - if(c != e && !_wcsnicmp(c,L"pos",e-c)) { - c = read_attr(e, &pos_s, &pos_len); - } - - c = wcschr(c, L'>'); - if(!c) - c = c + wcslen(c); - - if(pos_s && d->n_tabs < HTW_TAB_MAX && !dry_run) { - wchar_t * dummy; - LONG bu; - int bx; - int dx; - - bu = GetDialogBaseUnits(); - bx = LOWORD(bu); - - dx = wcstol(pos_s, &dummy, 10); - - d->tabs[d->n_tabs++] = MulDiv(dx, bx, 4); - } - } else if(!_wcsnicmp(start, L"tab", c - start)) { - int i; - - if(!dry_run) { - for(i=0; i < d->n_tabs; i++) { - if(d->tabs[i] > p_rel->x) { - p_rel->x = d->tabs[i]; - break; - } - } - } - } - - if(*c) - c++; - *end = c; - - return n; -} - -static void htw_assert_style(HDC hdc, khui_htwnd_data * d, int style) -{ - LOGFONT lf; - - if(d->styles[style].font) - return; - - /*TODO: we need select different fonts depending on system locale */ - lf.lfHeight = d->styles[style].height; //-MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72); - lf.lfWidth = 0; - lf.lfEscapement = 0; - lf.lfOrientation = 0; - lf.lfWeight = (d->styles[style].variation & FV_BOLD)? FW_BOLD: FW_NORMAL; - lf.lfItalic = !!(d->styles[style].variation & FV_ITALIC); - lf.lfUnderline = !!(d->styles[style].variation & FV_UNDERLINE); - lf.lfStrikeOut = !!(d->styles[style].variation & FV_STRIKEOUT); - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfOutPrecision = OUT_DEFAULT_PRECIS; - lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; - lf.lfQuality = DEFAULT_QUALITY; - lf.lfPitchAndFamily = DEFAULT_PITCH; - - LoadString(khm_hInstance, IDS_DEFAULT_FONT, lf.lfFaceName, ARRAYLENGTH(lf.lfFaceName)); - - d->styles[style].font = CreateFontIndirect(&lf); -} - -static LRESULT htw_paint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PAINTSTRUCT ps; - HBRUSH hbk; - khui_htwnd_data * d; - RECT r; - SIZE s; - HDC hdc; - wchar_t * text; - format_stack s_stack; - - int align; - int y; - wchar_t * par_start; - int ext_width = 0; - int ext_height = 0; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - if(!GetUpdateRect(hwnd, &r, !(d->flags & KHUI_HTWND_TRANSPARENT))) - return 0; - - if(d->text == NULL) - return 0; - - text = d->text; - - hdc = BeginPaint(hwnd, &ps); - - GetClientRect(hwnd, &r); - -#ifdef DRAW_HTWND_CLIENT_EDGE - /* for the moment, we are skipping on the client edge. */ - if(d->flags & KHUI_HTWND_CLIENTEDGE) - DrawEdge(hdc, &r, EDGE_SUNKEN, BF_ADJUST | BF_RECT | BF_FLAT); -#endif - - hbk = CreateSolidBrush(RGB(255,255,255)); - FillRect(hdc, &r, hbk); - DeleteObject(hbk); - - /* push the default format */ - format_init(&s_stack); - - d->l_pixel_y = GetDeviceCaps(hdc, LOGPIXELSY); - format_push(&s_stack,d, -MulDiv(HTW_NORMAL_SIZE, d->l_pixel_y, 72), FV_NONE, RGB(0,0,0)); - - y = d->scroll_top + r.top; - - par_start = text; - - align = ALIGN_LEFT; - - SetTextAlign(hdc, TA_TOP | TA_LEFT | TA_NOUPDATECP); - if(d->flags & KHUI_HTWND_TRANSPARENT) - SetBkMode(hdc, TRANSPARENT); - - d->n_links = 0; - d->n_tabs = 0; - - while(*par_start) { - wchar_t * p = par_start; - wchar_t * c = NULL; - int p_width = 0; - int s_start; - int l_height = 0; - int x = 0; - POINT pt; - POINT pt_rel; - - s_start = format_level(&s_stack); - - /* begin dry run */ - while(*p) { - if(*p == L'<') { - int talign = -1; - int n = htw_parse_tag(p,&c,&talign,d,&s_stack,NULL,NULL,0,TRUE); - - if(n && p_width) - break; - - p = c; - - if(n && talign >= 0) - align = talign; - } else { - HFONT hfold; - c = wcschr(p, L'<'); - if(!c) - c = p + wcslen(p); - - htw_assert_style(hdc, d, format_style(&s_stack)); - hfold = SelectFont(hdc, d->styles[format_style(&s_stack)].font); - GetTextExtentPoint32(hdc, p, (int)(c - p), &s); - SelectFont(hdc, hfold); - - p_width += s.cx; - if(s.cy > l_height) - l_height = s.cy; - - p = c; - } - } - - /* dry run ends */ - - x = r.left - d->scroll_left; - - if(align == ALIGN_CENTER) - x += (r.right - r.left)/2 - p_width / 2; - else if(align == ALIGN_RIGHT) - x += (r.right - r.left) - p_width; - - /* begin wet run */ - p = par_start; - format_unwind(&s_stack, s_start); /* unwind format stack */ - - p_width = 0; - - while(*p) { - if(*p == L'<') { - int talign = -1; - int n; - - pt.x = x + p_width; - pt.y = y; - pt_rel.x = p_width; - pt_rel.y = 0; - - n = htw_parse_tag(p, &c, &talign, d, &s_stack, &pt, &pt_rel, l_height, FALSE); - - if(n && p_width) { - break; - } - - p_width = pt_rel.x; - - p = c; - if(n && talign >= 0) - align = talign; - } else { - HFONT hfold; - RECT rd,rt; - - c = wcschr(p, L'<'); - if(!c) - c = p + wcslen(p); - - htw_assert_style(hdc, d, format_style(&s_stack)); - hfold = SelectFont(hdc, d->styles[format_style(&s_stack)].font); - SetTextColor(hdc, format_color(&s_stack)); - - GetTextExtentPoint32(hdc, p, (int)(c - p), &s); - rd.left = x + p_width - d->scroll_left; - rd.top = y - d->scroll_top; - rd.right = x + p_width + s.cx - d->scroll_left; - rd.bottom = y + l_height - d->scroll_top; - - if(IntersectRect(&rt, &rd, &r)) { - DrawText(hdc, p, (int)(c - p), &rd, - DT_BOTTOM | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); - } - - p_width += s.cx; - - SelectFont(hdc, hfold); - p = c; - } - } - - if (p_width > ext_width) - ext_width = p_width; - - y += l_height; - par_start = p; - } - - if (y > ext_height) - ext_height = y; - - EndPaint(hwnd, &ps); - - if (d->ext_width < ext_width) { - SCROLLINFO si; - LONG l; - - /* the extents need to be adjusted. But first check if we - have exactly the right scroll bars we need. */ - if ((ext_width > (r.right - r.left) && - !(d->flags & KHUI_HTWND_HSCROLL)) || - (ext_height > (r.bottom - r.top) && - !(d->flags & KHUI_HTWND_VSCROLL)) || - - (ext_width <= (r.right - r.left) && - (d->flags & KHUI_HTWND_HSCROLL)) || - (ext_height <= (r.bottom - r.top) && - (d->flags & KHUI_HTWND_VSCROLL))) { - - /* need to add scroll bars */ - if (ext_width > (r.right - r.left)) - d->flags |= KHUI_HTWND_HSCROLL; - else - d->flags &= ~KHUI_HTWND_HSCROLL; - - if (ext_height > (r.bottom - r.top)) - d->flags |= KHUI_HTWND_VSCROLL; - else - d->flags &= ~KHUI_HTWND_VSCROLL; - - l = GetWindowLongPtr(hwnd, GWL_STYLE); - l &= ~(WS_HSCROLL | WS_VSCROLL); - - l |= ((d->flags & KHUI_HTWND_HSCROLL) ? WS_HSCROLL : 0) | - ((d->flags & KHUI_HTWND_VSCROLL) ? WS_VSCROLL : 0); - - SetWindowLongPtr(hwnd, GWL_STYLE, l); - - InvalidateRect(hwnd, NULL, FALSE); - /* since the client area changed, we do another redraw - before updating the scroll bar positions. */ - } else { - d->ext_width = ext_width; - d->ext_height = ext_height; - - if (d->flags & KHUI_HTWND_HSCROLL) { - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; - si.nMin = 0; - si.nMax = ext_width; - si.nPage = r.right - r.left; - si.nPos = d->scroll_left; - - SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); - } - - if (d->flags & KHUI_HTWND_VSCROLL) { - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; - si.nMin = 0; - si.nMax = ext_height; - si.nPage = r.bottom - r.top; - si.nPos = d->scroll_top; - - SetScrollInfo(hwnd, SB_VERT, &si, TRUE); - } - } - } - - return 0; -} - -LRESULT CALLBACK khui_htwnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam - ) -{ - switch(uMsg) { - case WM_CREATE: - { - CREATESTRUCT * cs; - khui_htwnd_data * d; - size_t cbsize; - - cs = (CREATESTRUCT *) lParam; - - d = PMALLOC(sizeof(*d)); - ZeroMemory(d, sizeof(*d)); - - if(cs->dwExStyle & WS_EX_TRANSPARENT) { - d->flags |= KHUI_HTWND_TRANSPARENT; - } - if(cs->dwExStyle & WS_EX_CLIENTEDGE) { - d->flags |= KHUI_HTWND_CLIENTEDGE; - } - if(cs->style & WS_HSCROLL) { - d->flags |= KHUI_HTWND_HSCROLL; - } - if(cs->style & WS_VSCROLL) { - d->flags |= KHUI_HTWND_VSCROLL; - } - d->id = (int)(INT_PTR) cs->hMenu; - - d->active_link = -1; - d->bk_color = RGB(255,255,255); - d->hc_hand = LoadCursor(NULL, IDC_HAND); - - if(SUCCEEDED(StringCbLength(cs->lpszName, KHUI_HTWND_MAXCB_TEXT, &cbsize))) { - cbsize += sizeof(wchar_t); - d->text = PMALLOC(cbsize); - StringCbCopy(d->text, cbsize, cs->lpszName); - } - - /* this is just a flag to the WM_PAINT handler that the - extents haven't been set yet. */ - d->ext_width = -1; - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, 0, (LONG_PTR) d); -#pragma warning(pop) - - return 0; - } - break; - - case WM_SETTEXT: - { - wchar_t * newtext; - size_t cbsize; - khui_htwnd_data * d; - BOOL rv; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - newtext = (wchar_t *) lParam; - - if(d->text) { - PFREE(d->text); - d->text = NULL; - } - - if(SUCCEEDED(StringCbLength(newtext, KHUI_HTWND_MAXCB_TEXT, &cbsize))) { - cbsize += sizeof(wchar_t); - d->text = PMALLOC(cbsize); - StringCbCopy(d->text, cbsize, newtext); - rv = TRUE; - } else - rv = FALSE; - - clear_styles(d); - - d->ext_width = -1; - d->scroll_left = 0; - d->scroll_top = 0; - - InvalidateRect(hwnd, NULL, TRUE); - - return rv; - } - break; - - case WM_DESTROY: - { - khui_htwnd_data * d; - int i; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - if(d->text) - PFREE(d->text); - d->text = 0; - - if(d->links) { - for(i=0;imax_links;i++) { - if(d->links[i]) - PFREE(d->links[i]); - } - PFREE(d->links); - } - - clear_styles(d); - - PFREE(d); - } - break; - - case WM_ERASEBKGND: - { - khui_htwnd_data * d; - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - if(d->flags & KHUI_HTWND_TRANSPARENT) - return TRUE; - - return FALSE; - } - - case WM_PAINT: - htw_paint(hwnd, uMsg, wParam, lParam); - break; - - case WM_SETCURSOR: - { - khui_htwnd_data * d; - - if(hwnd != (HWND)wParam) - break; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - if(d->active_link >= 0) { - SetCursor(d->hc_hand); - return TRUE; - } - } - break; - - case WM_SETFOCUS: - { - khui_htwnd_data * d; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - d->flags |= KHUI_HTWND_FOCUS; - - InvalidateRect(hwnd, NULL, TRUE); - } - break; - - case WM_KILLFOCUS: - { - khui_htwnd_data * d; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - d->flags &= ~KHUI_HTWND_FOCUS; - - InvalidateRect(hwnd, NULL, TRUE); - } - break; - - case WM_LBUTTONDOWN: - { - khui_htwnd_data * d; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - d->md_link = d->active_link; - - SetCapture(hwnd); - } - break; - - case WM_LBUTTONUP: - { - khui_htwnd_data * d; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - if(d->md_link == d->active_link && d->md_link >= 0) { - /* clicked */ - SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(d->id, BN_CLICKED), (LPARAM) d->links[d->md_link]); - } - - ReleaseCapture(); - } - break; - - case WM_HSCROLL: - { - khui_htwnd_data * d; - int old_pos; - int new_pos; - int ext; - SCROLLINFO si; - RECT r; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - old_pos = new_pos = d->scroll_left; - ext = d->ext_width; - - switch(HIWORD(wParam)) { - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_TRACKPOS; - GetScrollInfo(hwnd, SB_HORZ, &si); - new_pos = si.nTrackPos; - break; - - case SB_LINELEFT: - new_pos -= ext / 12; /* arbitrary unit */ - break; - - case SB_LINERIGHT: - new_pos += ext / 12; /* arbitrary unit */ - break; - - case SB_PAGELEFT: - GetClientRect(hwnd, &r); - new_pos -= r.right - r.left; - break; - - case SB_PAGERIGHT: - GetClientRect(hwnd, &r); - new_pos += r.right - r.left; - break; - } - - if (new_pos == old_pos) - break; - - GetClientRect(hwnd, &r); - -#if 0 - if (new_pos > ext - (r.right - r.left)) - new_pos = ext - (r.right - r.left); -#endif - if (new_pos > ext) - new_pos = ext; - - if (new_pos < 0) - new_pos = 0; - - if (new_pos == old_pos) - break; - - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_POS; - si.nPos = new_pos; - SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); - /* note that Windows sometimes adjusts the position after - setting it with SetScrollInfo. We have to look it up - again to see what value it ended up at. */ - GetScrollInfo(hwnd, SB_HORZ, &si); - new_pos = si.nPos; - - if (new_pos == old_pos) - break; - - d->scroll_left = new_pos; - - ScrollWindow(hwnd, old_pos - new_pos, 0, NULL, NULL); - - return 0; - } - break; - - case WM_MOUSEMOVE: - { - khui_htwnd_data * d; - int i; - POINT p; - int nl; - - d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - p.x = GET_X_LPARAM(lParam) + d->scroll_left; - p.y = GET_Y_LPARAM(lParam) + d->scroll_top; - - for(i=0; in_links; i++) { - if(d->links && d->links[i] && PtInRect(&(d->links[i]->r), p)) - break; - } - - if(i == d->n_links) - nl = -1; - else - nl = i; - - if(d->active_link != nl) { - if(d->active_link >= 0) { - if(d->flags & KHUI_HTWND_TRANSPARENT) - { - HWND parent = GetParent(hwnd); - if(parent) { - InvalidateRect(parent, NULL, TRUE); - } - } - /* although we are invalidating the rect before setting active_link, - WM_PAINT will not be issued until wndproc returns */ - InvalidateRect(hwnd, &(d->links[d->active_link]->r), TRUE); - } - d->active_link = nl; - if(d->active_link >= 0) { - /* although we are invalidating the rect before setting active_link, - WM_PAINT will not be issued until wndproc returns */ - if(d->flags & KHUI_HTWND_TRANSPARENT) - { - HWND parent = GetParent(hwnd); - if(parent) { - InvalidateRect(parent, NULL, TRUE); - } - } - InvalidateRect(hwnd, &(d->links[d->active_link]->r), TRUE); - } - } - } - break; - } - - return DefWindowProc(hwnd, uMsg,wParam,lParam); -} - -void khm_register_htwnd_class(void) -{ - WNDCLASSEX wcx; - - wcx.cbSize = sizeof(wcx); - wcx.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; - wcx.lpfnWndProc = khui_htwnd_proc; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = sizeof(LONG_PTR); - wcx.hInstance = khm_hInstance; - wcx.hIcon = NULL; - wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); - wcx.hbrBackground = CreateSolidBrush(RGB(255,255,255)); - wcx.lpszMenuName = NULL; - wcx.lpszClassName = KHUI_HTWND_CLASS; - wcx.hIconSm = NULL; - - khui_htwnd_cls = RegisterClassEx(&wcx); -} - -void khm_unregister_htwnd_class(void) -{ - UnregisterClass(MAKEINTATOM(khui_htwnd_cls), khm_hInstance); -} - -HWND khm_create_htwnd(HWND parent, LPWSTR text, int x, int y, int width, int height, DWORD ex_style, DWORD style) -{ - - return CreateWindowEx( - ex_style, - MAKEINTATOM(khui_htwnd_cls), - text, - style | WS_CHILD, - x,y,width,height, - parent, - (HMENU) KHUI_HTWND_CTLID, - khm_hInstance, - NULL); -} +/* +* Copyright (c) 2005 Massachusetts Institute of Technology +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, +* modify, merge, publish, distribute, sublicense, and/or sell copies +* of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +/* $Id$ */ + +#include +#include + +ATOM khui_htwnd_cls; + +#define HTW_STYLE_NORMAL 0 + +/* There are currently 4 style "bits" and 3 sizes, which means + there can be 2^4*3=48 possible styles max. If someone is + feeling adventurous you can slightly improve performance of + the parser using this little fact. For now, I don't care. + (hint: combine size and style bits to form a single number + and use it as an index into the styles array) +*/ +#define HTW_STYLE_MAX 48 + +#define HTW_FORMAT_MAX 128 + +#define HTW_TAB_MAX 8 + +#define HTW_DEFAULT (-1) + +#define HTW_NORMAL_SIZE 8 +#define HTW_LARGE_SIZE 12 +#define HTW_HUGE_SIZE 20 + +/* font variant */ +#define FV_ABSOLUTE 0x10000000 + +#define FV_ITALIC 0x00000002 +#define FV_UNDERLINE 0x00000004 +#define FV_STRIKEOUT 0x00000008 +#define FV_BOLD 0x00000010 + +#define FV_NOITALIC 0x00020000 +#define FV_NOUNDERLINE 0x00040000 +#define FV_NOSTRIKEOUT 0x00080000 +#define FV_NOBOLD 0x00100000 + +#define FV_NONE 0x00000000 +#define FV_MASK 0x0000001f + +#define HTW_LINK_ALLOC 8 + +#define ALIGN_LEFT 0 +#define ALIGN_CENTER 1 +#define ALIGN_RIGHT 2 + +struct tx_tbl_t { + wchar_t * string; + LONG value; +} + +htw_color_table[] = { + {L"black", RGB(0,0,0)}, + {L"white", RGB(255,255,255)}, + {L"red", RGB(255,0,0)}, + {L"green", RGB(0,255,0)}, + {L"blue", RGB(0,0,255)}, + {L"grey", RGB(128,128,128)} +}, + +htw_size_table[] = { + {L"normal", HTW_NORMAL_SIZE}, + {L"large", HTW_LARGE_SIZE}, + {L"huge", HTW_HUGE_SIZE} +}, + +htw_align_table[] = { + {L"left", ALIGN_LEFT}, + {L"center", ALIGN_LEFT}, + {L"right", ALIGN_RIGHT} +}; + +typedef struct khui_htwnd_style_t { + LONG height; + LONG variation; /* combination of FV_* */ + + HFONT font; +} khui_htwnd_style; + +typedef struct khui_format_t { + int style_idx; + COLORREF color; +} khui_format; + +typedef struct format_stack_t { + khui_format stack[HTW_FORMAT_MAX]; + int stack_top; +} format_stack; + +typedef struct khui_htwnd_data_t { + int id; /* control ID */ + int flags; + wchar_t * text; + int scroll_left; + int scroll_top; + int ext_width; + int ext_height; + COLORREF bk_color; + HCURSOR hc_hand; + int l_pixel_y; + + khui_htwnd_style styles[HTW_STYLE_MAX]; + int n_styles; + + khui_htwnd_link ** links; + int n_links; + int max_links; + int active_link; + int md_link; + + int tabs[HTW_TAB_MAX]; + int n_tabs; +} khui_htwnd_data; + +static LONG table_lookup(struct tx_tbl_t * tbl, int n, wchar_t * v, int len) +{ + int i; + + for(i=0; in_styles; i++) { + if(d->styles[i].font != NULL) { + DeleteObject(d->styles[i].font); + d->styles[i].font = NULL; + } + } + + d->n_styles = 0; +} + +static void format_init(format_stack * s) +{ + s->stack_top = -1; + ZeroMemory(s->stack, sizeof(s->stack)); +} + +static khui_format * format_current(format_stack * s) +{ + if(s->stack_top >= 0) + return &(s->stack[s->stack_top]); + else + return NULL; +} + +static int format_style(format_stack * s) +{ + if(s->stack_top >= 0) + return s->stack[s->stack_top].style_idx; + else + return 0; +} + +static COLORREF format_color(format_stack * s) +{ + if(s->stack_top >= 0) + return s->stack[s->stack_top].color; + else + return 0; +} + +static int format_level(format_stack * s) +{ + return s->stack_top; +} + +static void format_unwind(format_stack * s, int level) +{ + s->stack_top = level; +} + +static void format_push(format_stack * s, khui_htwnd_data * d, LONG height, LONG variation, COLORREF color) +{ + int i; + khui_format * top; + khui_htwnd_style * style; + + _ASSERT(s->stack_top < (HTW_FORMAT_MAX-1)); + + /* formatting is additive unless FV_NORMAL is set in variation */ + top = format_current(s); + if(top) { + style = &(d->styles[top->style_idx]); + if(height == HTW_DEFAULT) + height = style->height; + + if(variation == HTW_DEFAULT) + variation = style->variation; + else if(!(variation & FV_ABSOLUTE)) + variation |= style->variation; + + if(color == HTW_DEFAULT) + color = top->color; + } + + variation &= ~FV_ABSOLUTE; + variation ^= variation & (variation>>16); + variation &= FV_MASK; + + /* now look for an existing style that matches the requested one */ + for(i=0; in_styles; i++) { + style = &(d->styles[i]); + + if(style->height == height && + style->variation == variation) + break; + } + + s->stack_top++; + + if(in_styles) { + s->stack[s->stack_top].style_idx = i; + } else { + if(d->n_styles == HTW_STYLE_MAX) { + s->stack[s->stack_top].style_idx = 0; + } else { + s->stack[s->stack_top].style_idx = d->n_styles; + d->styles[d->n_styles].font = NULL; + d->styles[d->n_styles].height = height; + d->styles[d->n_styles].variation = variation; + d->n_styles++; + } + } + s->stack[s->stack_top].color = color; +} + +static void format_pop(format_stack * s) { + if(s->stack_top >= 0) + s->stack_top--; +} + +static wchar_t * token_end(wchar_t * s) { + while(iswalnum(*s) || *s == L'/') + s++; + return s; +} + +static wchar_t * skip_ws(wchar_t * s) { + while(iswspace(*s)) + s++; + return s; +} + +/* s points to something like " = \"value\"" + start and len will point to the start and + length of value. return value will point to the + character following the last double quote. */ +static wchar_t * read_attr(wchar_t * s, wchar_t ** start, int * len) +{ + wchar_t *e; + + *start = NULL; + *len = 0; + + do { + s = skip_ws(s); + if(*s != L'=') + break; + s = skip_ws(++s); + if(*s != L'"') + break; + e = wcschr(++s, L'"'); + if(!e) + break; + + *start = s; + *len = (int) (e - s); + + s = e + 1; + } while(FALSE); + + return s; +} + +/* +We currently support the following tags: + +link text +foo +foo +foo + +foo + (color)=black|white|red|green|blue|grey +foo +foo + +
foo
+foo +foo + +

foo

+ + +*/ + +static int htw_parse_tag( + wchar_t * start, + wchar_t ** end, + int * align, + khui_htwnd_data * d, + format_stack * s, + PPOINT p_abs, + PPOINT p_rel, + int lh, + BOOL dry_run) +{ + wchar_t * c; + int n = 0; + + /* start initially points to the starting '<' */ + c = token_end(++start); + + if(!_wcsnicmp(start,L"a",c-start)) { + /* start of an 'a' tag */ + wchar_t * id_start = NULL; + int id_len = 0; + wchar_t * param_start = NULL; + int param_len = 0; + + /* We don't need to parse the link + if it is just a dry run */ + if(dry_run) { + format_push(s, d, HTW_DEFAULT, HTW_DEFAULT, RGB(0,0,255)); + *end = wcschr(start, L'>'); + return FALSE; + } + + while(c && *c && *c != L'>') { + wchar_t * e; + + c = skip_ws(c); + e = token_end(c); + + if(c==e) + break; + + if(!_wcsnicmp(c,L"id",e-c)) { + c = read_attr(e, &id_start, &id_len); + } else if(!_wcsnicmp(c,L"param",e-c)) { + c = read_attr(e, ¶m_start, ¶m_len); + } + } + + if(d->active_link == d->n_links) + format_push(s,d, HTW_DEFAULT, FV_UNDERLINE, RGB(0,0,255)); + else + format_push(s,d, HTW_DEFAULT, FV_NONE, RGB(0,0,255)); + + { + khui_htwnd_link * l; + + if(!d->links) { + d->links = PMALLOC(sizeof(khui_htwnd_link *) * HTW_LINK_ALLOC); + ZeroMemory(d->links, sizeof(khui_htwnd_link *) * HTW_LINK_ALLOC); + d->max_links = HTW_LINK_ALLOC; + d->n_links = 0; + } + + if(d->n_links >= d->max_links) { + khui_htwnd_link ** ll; + int n_new; + + n_new = UBOUNDSS(d->n_links + 1, HTW_LINK_ALLOC, HTW_LINK_ALLOC); + + ll = PMALLOC(sizeof(khui_htwnd_link *) * n_new); + ZeroMemory(ll, sizeof(khui_htwnd_link *) * n_new); + memcpy(ll, d->links, sizeof(khui_htwnd_link *) * d->max_links); + PFREE(d->links); + d->links = ll; + d->max_links = n_new; + } + + l = d->links[d->n_links]; + if(!l) { + l = PMALLOC(sizeof(khui_htwnd_link)); + d->links[d->n_links] = l; + } + + l->id = id_start; + l->id_len = id_len; + l->param = param_start; + l->param_len = param_len; + + l->r.left = p_abs->x; + l->r.top = p_abs->y; + + d->n_links++; + } + + } else if(!_wcsnicmp(start, L"/a", c - start)) { + khui_htwnd_link * l; + + c = wcschr(c,L'>'); + if(!c) + c = c + wcslen(c); + + format_pop(s); + + if(!dry_run) { + l = d->links[d->n_links - 1]; /* last link */ + l->r.right = p_abs->x; + l->r.bottom = p_abs->y + lh; + } + } else if(!_wcsnicmp(start, L"p", c - start)) { + wchar_t * e; + wchar_t * align_s = NULL; + int align_len = 0; + + c = skip_ws(c); + e = token_end(c); + + if(c != e && !_wcsnicmp(c,L"align",e-c)) { + c = read_attr(e, &align_s, &align_len); + } + + c = wcschr(c, L'>'); + if(!c) + c = c + wcslen(c); + + + if(align_s) + *align = table_lookup(htw_align_table, ARRAYLENGTH(htw_align_table), align_s, align_len); + else + *align = ALIGN_LEFT; + + n = 1; + } else if(!_wcsnicmp(start, L"b", c - start)) { + format_push(s,d, HTW_DEFAULT, FV_BOLD, HTW_DEFAULT); + } else if(!_wcsnicmp(start, L"/b", c - start)) { + format_pop(s); + } else if(!_wcsnicmp(start, L"u", c - start)) { + format_push(s,d, HTW_DEFAULT, FV_UNDERLINE, HTW_DEFAULT); + } else if(!_wcsnicmp(start, L"/u", c - start)) { + format_pop(s); + } else if(!_wcsnicmp(start, L"i", c - start)) { + format_push(s,d, HTW_DEFAULT, FV_ITALIC, HTW_DEFAULT); + } else if(!_wcsnicmp(start, L"/i", c - start)) { + format_pop(s); + } else if(!_wcsnicmp(start, L"large", c - start)) { + format_push(s,d,-MulDiv(HTW_LARGE_SIZE, d->l_pixel_y, 72), HTW_DEFAULT, HTW_DEFAULT); + } else if(!_wcsnicmp(start, L"/large", c - start)) { + format_pop(s); + } else if(!_wcsnicmp(start, L"huge", c - start)) { + format_push(s,d,-MulDiv(HTW_HUGE_SIZE, d->l_pixel_y, 72), HTW_DEFAULT, HTW_DEFAULT); + } else if(!_wcsnicmp(start, L"/huge", c - start)) { + format_pop(s); + } else if(!_wcsnicmp(start, L"center", c - start)) { + c = wcschr(c, L'>'); + if(!c) + c = c + wcslen(c); + *align = ALIGN_CENTER; + n = 1; + } else if(!_wcsnicmp(start, L"left", c - start) || + !_wcsnicmp(start, L"p", c - start)) + { + c = wcschr(c, L'>'); + if(!c) + c = c + wcslen(c); + *align = ALIGN_LEFT; + n = 1; + } else if(!_wcsnicmp(start, L"right", c - start)) { + c = wcschr(c, L'>'); + if(!c) + c = c + wcslen(c); + *align = ALIGN_RIGHT; + n = 1; + } else if(!_wcsnicmp(start, L"/center", c - start) || + !_wcsnicmp(start, L"/left", c - start) || + !_wcsnicmp(start, L"/right", c - start) || + !_wcsnicmp(start, L"/p", c - start)) { + c = wcschr(c, L'>'); + if(!c) + c = c + wcslen(c); + *align = ALIGN_LEFT; + n = 1; + } else if(!_wcsnicmp(start, L"font", c - start)) { + wchar_t * color_s = NULL; + int color_len = 0; + wchar_t * size_s = NULL; + int size_len = 0; + LONG color = HTW_DEFAULT; + LONG h = HTW_DEFAULT; + + while(c && *c && *c != L'>') { + wchar_t * e; + + c = skip_ws(c); + e = token_end(c); + + if(c==e) + break; + + if(!_wcsnicmp(c,L"color",e-c)) { + c = read_attr(e, &color_s, &color_len); + } else if(!_wcsnicmp(c,L"size",e-c)) { + c = read_attr(e, &size_s, &size_len); + } + } + + if(color_s) + color = table_lookup(htw_color_table, ARRAYLENGTH(htw_color_table), color_s, color_len); + if(size_s) { + h = table_lookup(htw_size_table, ARRAYLENGTH(htw_size_table), size_s, size_len); + if(h) + h = -MulDiv(h, d->l_pixel_y, 72); + else + h = -MulDiv(HTW_NORMAL_SIZE, d->l_pixel_y, 72); + } + + format_push(s,d,h,HTW_DEFAULT,color); + } else if(!_wcsnicmp(start, L"/font", c - start)) { + format_pop(s); + } else if(!_wcsnicmp(start, L"settab", c - start)) { + wchar_t * e; + wchar_t * pos_s = NULL; + int pos_len; + + c = skip_ws(c); + e = token_end(c); + + if(c != e && !_wcsnicmp(c,L"pos",e-c)) { + c = read_attr(e, &pos_s, &pos_len); + } + + c = wcschr(c, L'>'); + if(!c) + c = c + wcslen(c); + + if(pos_s && d->n_tabs < HTW_TAB_MAX && !dry_run) { + wchar_t * dummy; + LONG bu; + int bx; + int dx; + + bu = GetDialogBaseUnits(); + bx = LOWORD(bu); + + dx = wcstol(pos_s, &dummy, 10); + + d->tabs[d->n_tabs++] = MulDiv(dx, bx, 4); + } + } else if(!_wcsnicmp(start, L"tab", c - start)) { + int i; + + if(!dry_run) { + for(i=0; i < d->n_tabs; i++) { + if(d->tabs[i] > p_rel->x) { + p_rel->x = d->tabs[i]; + break; + } + } + } + } + + if(*c) + c++; + *end = c; + + return n; +} + +static void htw_assert_style(HDC hdc, khui_htwnd_data * d, int style) +{ + LOGFONT lf; + + if(d->styles[style].font) + return; + + /*TODO: we need select different fonts depending on system locale */ + lf.lfHeight = d->styles[style].height; //-MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72); + lf.lfWidth = 0; + lf.lfEscapement = 0; + lf.lfOrientation = 0; + lf.lfWeight = (d->styles[style].variation & FV_BOLD)? FW_BOLD: FW_NORMAL; + lf.lfItalic = !!(d->styles[style].variation & FV_ITALIC); + lf.lfUnderline = !!(d->styles[style].variation & FV_UNDERLINE); + lf.lfStrikeOut = !!(d->styles[style].variation & FV_STRIKEOUT); + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfOutPrecision = OUT_DEFAULT_PRECIS; + lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; + lf.lfQuality = DEFAULT_QUALITY; + lf.lfPitchAndFamily = DEFAULT_PITCH; + + LoadString(khm_hInstance, IDS_DEFAULT_FONT, lf.lfFaceName, ARRAYLENGTH(lf.lfFaceName)); + + d->styles[style].font = CreateFontIndirect(&lf); +} + +static LRESULT htw_paint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + HBRUSH hbk; + khui_htwnd_data * d; + RECT r; + SIZE s; + HDC hdc; + wchar_t * text; + format_stack s_stack; + + int align; + int y; + wchar_t * par_start; + int ext_width = 0; + int ext_height = 0; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + if(!GetUpdateRect(hwnd, &r, !(d->flags & KHUI_HTWND_TRANSPARENT))) + return 0; + + if(d->text == NULL) + return 0; + + text = d->text; + + hdc = BeginPaint(hwnd, &ps); + + GetClientRect(hwnd, &r); + +#ifdef DRAW_HTWND_CLIENT_EDGE + /* for the moment, we are skipping on the client edge. */ + if(d->flags & KHUI_HTWND_CLIENTEDGE) + DrawEdge(hdc, &r, EDGE_SUNKEN, BF_ADJUST | BF_RECT | BF_FLAT); +#endif + + hbk = CreateSolidBrush(RGB(255,255,255)); + FillRect(hdc, &r, hbk); + DeleteObject(hbk); + + /* push the default format */ + format_init(&s_stack); + + d->l_pixel_y = GetDeviceCaps(hdc, LOGPIXELSY); + format_push(&s_stack,d, -MulDiv(HTW_NORMAL_SIZE, d->l_pixel_y, 72), FV_NONE, RGB(0,0,0)); + + y = d->scroll_top + r.top; + + par_start = text; + + align = ALIGN_LEFT; + + SetTextAlign(hdc, TA_TOP | TA_LEFT | TA_NOUPDATECP); + if(d->flags & KHUI_HTWND_TRANSPARENT) + SetBkMode(hdc, TRANSPARENT); + + d->n_links = 0; + d->n_tabs = 0; + + while(*par_start) { + wchar_t * p = par_start; + wchar_t * c = NULL; + int p_width = 0; + int s_start; + int l_height = 0; + int x = 0; + POINT pt; + POINT pt_rel; + + s_start = format_level(&s_stack); + + /* begin dry run */ + while(*p) { + if(*p == L'<') { + int talign = -1; + int n = htw_parse_tag(p,&c,&talign,d,&s_stack,NULL,NULL,0,TRUE); + + if(n && p_width) + break; + + p = c; + + if(n && talign >= 0) + align = talign; + } else { + HFONT hfold; + c = wcschr(p, L'<'); + if(!c) + c = p + wcslen(p); + + htw_assert_style(hdc, d, format_style(&s_stack)); + hfold = SelectFont(hdc, d->styles[format_style(&s_stack)].font); + GetTextExtentPoint32(hdc, p, (int)(c - p), &s); + SelectFont(hdc, hfold); + + p_width += s.cx; + if(s.cy > l_height) + l_height = s.cy; + + p = c; + } + } + + /* dry run ends */ + + x = r.left - d->scroll_left; + + if(align == ALIGN_CENTER) + x += (r.right - r.left)/2 - p_width / 2; + else if(align == ALIGN_RIGHT) + x += (r.right - r.left) - p_width; + + /* begin wet run */ + p = par_start; + format_unwind(&s_stack, s_start); /* unwind format stack */ + + p_width = 0; + + while(*p) { + if(*p == L'<') { + int talign = -1; + int n; + + pt.x = x + p_width; + pt.y = y; + pt_rel.x = p_width; + pt_rel.y = 0; + + n = htw_parse_tag(p, &c, &talign, d, &s_stack, &pt, &pt_rel, l_height, FALSE); + + if(n && p_width) { + break; + } + + p_width = pt_rel.x; + + p = c; + if(n && talign >= 0) + align = talign; + } else { + HFONT hfold; + RECT rd,rt; + + c = wcschr(p, L'<'); + if(!c) + c = p + wcslen(p); + + htw_assert_style(hdc, d, format_style(&s_stack)); + hfold = SelectFont(hdc, d->styles[format_style(&s_stack)].font); + SetTextColor(hdc, format_color(&s_stack)); + + GetTextExtentPoint32(hdc, p, (int)(c - p), &s); + rd.left = x + p_width - d->scroll_left; + rd.top = y - d->scroll_top; + rd.right = x + p_width + s.cx - d->scroll_left; + rd.bottom = y + l_height - d->scroll_top; + + if(IntersectRect(&rt, &rd, &r)) { + DrawText(hdc, p, (int)(c - p), &rd, + DT_BOTTOM | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); + } + + p_width += s.cx; + + SelectFont(hdc, hfold); + p = c; + } + } + + if (p_width > ext_width) + ext_width = p_width; + + y += l_height; + par_start = p; + } + + if (y > ext_height) + ext_height = y; + + EndPaint(hwnd, &ps); + + if (d->ext_width < ext_width) { + SCROLLINFO si; + LONG l; + + /* the extents need to be adjusted. But first check if we + have exactly the right scroll bars we need. */ + if ((ext_width > (r.right - r.left) && + !(d->flags & KHUI_HTWND_HSCROLL)) || + (ext_height > (r.bottom - r.top) && + !(d->flags & KHUI_HTWND_VSCROLL)) || + + (ext_width <= (r.right - r.left) && + (d->flags & KHUI_HTWND_HSCROLL)) || + (ext_height <= (r.bottom - r.top) && + (d->flags & KHUI_HTWND_VSCROLL))) { + + /* need to add scroll bars */ + if (ext_width > (r.right - r.left)) + d->flags |= KHUI_HTWND_HSCROLL; + else + d->flags &= ~KHUI_HTWND_HSCROLL; + + if (ext_height > (r.bottom - r.top)) + d->flags |= KHUI_HTWND_VSCROLL; + else + d->flags &= ~KHUI_HTWND_VSCROLL; + + l = GetWindowLongPtr(hwnd, GWL_STYLE); + l &= ~(WS_HSCROLL | WS_VSCROLL); + + l |= ((d->flags & KHUI_HTWND_HSCROLL) ? WS_HSCROLL : 0) | + ((d->flags & KHUI_HTWND_VSCROLL) ? WS_VSCROLL : 0); + + SetWindowLongPtr(hwnd, GWL_STYLE, l); + + InvalidateRect(hwnd, NULL, FALSE); + /* since the client area changed, we do another redraw + before updating the scroll bar positions. */ + } else { + d->ext_width = ext_width; + d->ext_height = ext_height; + + if (d->flags & KHUI_HTWND_HSCROLL) { + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; + si.nMin = 0; + si.nMax = ext_width; + si.nPage = r.right - r.left; + si.nPos = d->scroll_left; + + SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); + } + + if (d->flags & KHUI_HTWND_VSCROLL) { + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; + si.nMin = 0; + si.nMax = ext_height; + si.nPage = r.bottom - r.top; + si.nPos = d->scroll_top; + + SetScrollInfo(hwnd, SB_VERT, &si, TRUE); + } + } + } + + return 0; +} + +LRESULT CALLBACK khui_htwnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam + ) +{ + switch(uMsg) { + case WM_CREATE: + { + CREATESTRUCT * cs; + khui_htwnd_data * d; + size_t cbsize; + + cs = (CREATESTRUCT *) lParam; + + d = PMALLOC(sizeof(*d)); + ZeroMemory(d, sizeof(*d)); + + if(cs->dwExStyle & WS_EX_TRANSPARENT) { + d->flags |= KHUI_HTWND_TRANSPARENT; + } + if(cs->dwExStyle & WS_EX_CLIENTEDGE) { + d->flags |= KHUI_HTWND_CLIENTEDGE; + } + if(cs->style & WS_HSCROLL) { + d->flags |= KHUI_HTWND_HSCROLL; + } + if(cs->style & WS_VSCROLL) { + d->flags |= KHUI_HTWND_VSCROLL; + } + d->id = (int)(INT_PTR) cs->hMenu; + + d->active_link = -1; + d->bk_color = RGB(255,255,255); + d->hc_hand = LoadCursor(NULL, IDC_HAND); + + if(SUCCEEDED(StringCbLength(cs->lpszName, KHUI_HTWND_MAXCB_TEXT, &cbsize))) { + cbsize += sizeof(wchar_t); + d->text = PMALLOC(cbsize); + StringCbCopy(d->text, cbsize, cs->lpszName); + } + + /* this is just a flag to the WM_PAINT handler that the + extents haven't been set yet. */ + d->ext_width = -1; + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, 0, (LONG_PTR) d); +#pragma warning(pop) + + return 0; + } + break; + + case WM_SETTEXT: + { + wchar_t * newtext; + size_t cbsize; + khui_htwnd_data * d; + BOOL rv; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + newtext = (wchar_t *) lParam; + + if(d->text) { + PFREE(d->text); + d->text = NULL; + } + + if(SUCCEEDED(StringCbLength(newtext, KHUI_HTWND_MAXCB_TEXT, &cbsize))) { + cbsize += sizeof(wchar_t); + d->text = PMALLOC(cbsize); + StringCbCopy(d->text, cbsize, newtext); + rv = TRUE; + } else + rv = FALSE; + + clear_styles(d); + + d->ext_width = -1; + d->scroll_left = 0; + d->scroll_top = 0; + + InvalidateRect(hwnd, NULL, TRUE); + + return rv; + } + break; + + case WM_DESTROY: + { + khui_htwnd_data * d; + int i; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + if(d->text) + PFREE(d->text); + d->text = 0; + + if(d->links) { + for(i=0;imax_links;i++) { + if(d->links[i]) + PFREE(d->links[i]); + } + PFREE(d->links); + } + + clear_styles(d); + + PFREE(d); + } + break; + + case WM_ERASEBKGND: + { + khui_htwnd_data * d; + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + if(d->flags & KHUI_HTWND_TRANSPARENT) + return TRUE; + + return FALSE; + } + + case WM_PAINT: + htw_paint(hwnd, uMsg, wParam, lParam); + break; + + case WM_SETCURSOR: + { + khui_htwnd_data * d; + + if(hwnd != (HWND)wParam) + break; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + if(d->active_link >= 0) { + SetCursor(d->hc_hand); + return TRUE; + } + } + break; + + case WM_SETFOCUS: + { + khui_htwnd_data * d; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + d->flags |= KHUI_HTWND_FOCUS; + + InvalidateRect(hwnd, NULL, TRUE); + } + break; + + case WM_KILLFOCUS: + { + khui_htwnd_data * d; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + d->flags &= ~KHUI_HTWND_FOCUS; + + InvalidateRect(hwnd, NULL, TRUE); + } + break; + + case WM_LBUTTONDOWN: + { + khui_htwnd_data * d; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + d->md_link = d->active_link; + + SetCapture(hwnd); + } + break; + + case WM_LBUTTONUP: + { + khui_htwnd_data * d; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + if(d->md_link == d->active_link && d->md_link >= 0) { + /* clicked */ + SendMessage(GetParent(hwnd), WM_COMMAND, MAKEWPARAM(d->id, BN_CLICKED), (LPARAM) d->links[d->md_link]); + } + + ReleaseCapture(); + } + break; + + case WM_HSCROLL: + { + khui_htwnd_data * d; + int old_pos; + int new_pos; + int ext; + SCROLLINFO si; + RECT r; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + old_pos = new_pos = d->scroll_left; + ext = d->ext_width; + + switch(HIWORD(wParam)) { + case SB_THUMBTRACK: + case SB_THUMBPOSITION: + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_TRACKPOS; + GetScrollInfo(hwnd, SB_HORZ, &si); + new_pos = si.nTrackPos; + break; + + case SB_LINELEFT: + new_pos -= ext / 12; /* arbitrary unit */ + break; + + case SB_LINERIGHT: + new_pos += ext / 12; /* arbitrary unit */ + break; + + case SB_PAGELEFT: + GetClientRect(hwnd, &r); + new_pos -= r.right - r.left; + break; + + case SB_PAGERIGHT: + GetClientRect(hwnd, &r); + new_pos += r.right - r.left; + break; + } + + if (new_pos == old_pos) + break; + + GetClientRect(hwnd, &r); + +#if 0 + if (new_pos > ext - (r.right - r.left)) + new_pos = ext - (r.right - r.left); +#endif + if (new_pos > ext) + new_pos = ext; + + if (new_pos < 0) + new_pos = 0; + + if (new_pos == old_pos) + break; + + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_POS; + si.nPos = new_pos; + SetScrollInfo(hwnd, SB_HORZ, &si, TRUE); + /* note that Windows sometimes adjusts the position after + setting it with SetScrollInfo. We have to look it up + again to see what value it ended up at. */ + GetScrollInfo(hwnd, SB_HORZ, &si); + new_pos = si.nPos; + + if (new_pos == old_pos) + break; + + d->scroll_left = new_pos; + + ScrollWindow(hwnd, old_pos - new_pos, 0, NULL, NULL); + + return 0; + } + break; + + case WM_MOUSEMOVE: + { + khui_htwnd_data * d; + int i; + POINT p; + int nl; + + d = (khui_htwnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + p.x = GET_X_LPARAM(lParam) + d->scroll_left; + p.y = GET_Y_LPARAM(lParam) + d->scroll_top; + + for(i=0; in_links; i++) { + if(d->links && d->links[i] && PtInRect(&(d->links[i]->r), p)) + break; + } + + if(i == d->n_links) + nl = -1; + else + nl = i; + + if(d->active_link != nl) { + if(d->active_link >= 0) { + if(d->flags & KHUI_HTWND_TRANSPARENT) + { + HWND parent = GetParent(hwnd); + if(parent) { + InvalidateRect(parent, NULL, TRUE); + } + } + /* although we are invalidating the rect before setting active_link, + WM_PAINT will not be issued until wndproc returns */ + InvalidateRect(hwnd, &(d->links[d->active_link]->r), TRUE); + } + d->active_link = nl; + if(d->active_link >= 0) { + /* although we are invalidating the rect before setting active_link, + WM_PAINT will not be issued until wndproc returns */ + if(d->flags & KHUI_HTWND_TRANSPARENT) + { + HWND parent = GetParent(hwnd); + if(parent) { + InvalidateRect(parent, NULL, TRUE); + } + } + InvalidateRect(hwnd, &(d->links[d->active_link]->r), TRUE); + } + } + } + break; + } + + return DefWindowProc(hwnd, uMsg,wParam,lParam); +} + +void khm_register_htwnd_class(void) +{ + WNDCLASSEX wcx; + + wcx.cbSize = sizeof(wcx); + wcx.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; + wcx.lpfnWndProc = khui_htwnd_proc; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = sizeof(LONG_PTR); + wcx.hInstance = khm_hInstance; + wcx.hIcon = NULL; + wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); + wcx.hbrBackground = CreateSolidBrush(RGB(255,255,255)); + wcx.lpszMenuName = NULL; + wcx.lpszClassName = KHUI_HTWND_CLASS; + wcx.hIconSm = NULL; + + khui_htwnd_cls = RegisterClassEx(&wcx); +} + +void khm_unregister_htwnd_class(void) +{ + UnregisterClass(MAKEINTATOM(khui_htwnd_cls), khm_hInstance); +} + +HWND khm_create_htwnd(HWND parent, LPWSTR text, int x, int y, int width, int height, DWORD ex_style, DWORD style) +{ + + return CreateWindowEx( + ex_style, + MAKEINTATOM(khui_htwnd_cls), + text, + style | WS_CHILD, + x,y,width,height, + parent, + (HMENU) KHUI_HTWND_CTLID, + khm_hInstance, + NULL); +} --- krb5-1.4.4.orig/src/windows/identity/ui/timer.h +++ krb5-1.4.4/src/windows/identity/ui/timer.h @@ -1,100 +1,100 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_TIMER_H -#define __KHIMAIRA_TIMER_H - -/* note that the ordering of the first few enum constants are - significant. The values of the constants up to KHUI_N_TTYPES are - used as indices. */ -typedef enum tag_khui_timer_type { - KHUI_TTYPE_ID_EXP = 0, /* Identity expiration */ - KHUI_TTYPE_ID_CRIT, /* Identity critical */ - KHUI_TTYPE_ID_WARN, /* Identity warning */ - KHUI_TTYPE_CRED_EXP, /* Credential expiration */ - KHUI_TTYPE_CRED_CRIT, /* Credential critical */ - KHUI_TTYPE_CRED_WARN, /* Credential warning */ - - KHUI_N_TTYPES, /* Count of the timers that we - aggregate for notifications */ - - KHUI_TTYPE_ID_MARK, /* Identity marker */ - - KHUI_TTYPE_ID_RENEW, /* Identity auto renewal */ - KHUI_TTYPE_CRED_RENEW, /* Credential renewal */ - -#if 0 - KHUI_TTYPE_BMSG, /* Custom. Sends broadcast message - when triggered.*/ - KHUI_TTYPE_SMSG, /* Custom. Sends subscription message - when triggered. */ -#endif -} khui_timer_type; - -typedef struct tag_khui_timer_event { - khm_handle key; - khui_timer_type type; - - unsigned __int64 expire; /* time at which the timer expires */ - unsigned __int64 offset; /* time offset at which the event that - the timer warns of happens */ - void * data; - khm_int32 flags; -} khui_timer_event; - -#define KHUI_TRIGGER_TIMER_ID 48 -#define KHUI_REFRESH_TIMER_ID 49 - -#define KHUI_REFRESH_TIMEOUT 5000 - -#define KHUI_TE_FLAG_EXPIRED 0x00000001 -#define KHUI_TE_FLAG_STALE 0x00000002 - -#define KHUI_DEF_TIMEOUT_WARN 900 -#define KHUI_DEF_TIMEOUT_CRIT 300 -#define KHUI_DEF_TIMEOUT_RENEW 60 - -/* the max absolute difference between two timers (in seconds) that - can exist where we consider both timers to be in the same - timeslot. */ -#define KHUI_TIMEEQ_ERROR 20 - -/* the small error. */ -#define KHUI_TIMEEQ_ERROR_SMALL 1 - -void -khm_timer_refresh(HWND hwnd); - -void -khm_timer_fire(HWND hwnd); - -void -khm_timer_init(void); - -void -khm_timer_exit(void); - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_TIMER_H +#define __KHIMAIRA_TIMER_H + +/* note that the ordering of the first few enum constants are + significant. The values of the constants up to KHUI_N_TTYPES are + used as indices. */ +typedef enum tag_khui_timer_type { + KHUI_TTYPE_ID_EXP = 0, /* Identity expiration */ + KHUI_TTYPE_ID_CRIT, /* Identity critical */ + KHUI_TTYPE_ID_WARN, /* Identity warning */ + KHUI_TTYPE_CRED_EXP, /* Credential expiration */ + KHUI_TTYPE_CRED_CRIT, /* Credential critical */ + KHUI_TTYPE_CRED_WARN, /* Credential warning */ + + KHUI_N_TTYPES, /* Count of the timers that we + aggregate for notifications */ + + KHUI_TTYPE_ID_MARK, /* Identity marker */ + + KHUI_TTYPE_ID_RENEW, /* Identity auto renewal */ + KHUI_TTYPE_CRED_RENEW, /* Credential renewal */ + +#if 0 + KHUI_TTYPE_BMSG, /* Custom. Sends broadcast message + when triggered.*/ + KHUI_TTYPE_SMSG, /* Custom. Sends subscription message + when triggered. */ +#endif +} khui_timer_type; + +typedef struct tag_khui_timer_event { + khm_handle key; + khui_timer_type type; + + unsigned __int64 expire; /* time at which the timer expires */ + unsigned __int64 offset; /* time offset at which the event that + the timer warns of happens */ + void * data; + khm_int32 flags; +} khui_timer_event; + +#define KHUI_TRIGGER_TIMER_ID 48 +#define KHUI_REFRESH_TIMER_ID 49 + +#define KHUI_REFRESH_TIMEOUT 5000 + +#define KHUI_TE_FLAG_EXPIRED 0x00000001 +#define KHUI_TE_FLAG_STALE 0x00000002 + +#define KHUI_DEF_TIMEOUT_WARN 900 +#define KHUI_DEF_TIMEOUT_CRIT 300 +#define KHUI_DEF_TIMEOUT_RENEW 60 + +/* the max absolute difference between two timers (in seconds) that + can exist where we consider both timers to be in the same + timeslot. */ +#define KHUI_TIMEEQ_ERROR 20 + +/* the small error. */ +#define KHUI_TIMEEQ_ERROR_SMALL 1 + +void +khm_timer_refresh(HWND hwnd); + +void +khm_timer_fire(HWND hwnd); + +void +khm_timer_init(void); + +void +khm_timer_exit(void); + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/khmapp.h +++ krb5-1.4.4/src/windows/identity/ui/khmapp.h @@ -1,74 +1,74 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_KHIMAIRA_H -#define __KHIMAIRA_KHIMAIRA_H - -#include -#include -#include -#include -#include - -#define KHERR_HMODULE khm_hInstance -#define KHERR_FACILITY khm_facility -#define KHERR_FACILITY_ID 3 -#define NOEXPORT - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_KHIMAIRA_H +#define __KHIMAIRA_KHIMAIRA_H + +#include +#include +#include +#include +#include + +#define KHERR_HMODULE khm_hInstance +#define KHERR_FACILITY khm_facility +#define KHERR_FACILITY_ID 3 +#define NOEXPORT + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#endif --- krb5-1.4.4.orig/src/windows/identity/ui/credwnd.c +++ krb5-1.4.4/src/windows/identity/ui/credwnd.c @@ -1,4616 +1,4616 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include -#include - -ATOM khui_credwnd_cls; -khm_int32 khui_cw_flag_id; - -khm_int32 attr_to_action[KCDB_ATTR_MAX_ID + 1]; - -void -khm_set_cw_element_font(wchar_t * name, LOGFONT * pfont) { - khm_handle csp_cw = NULL; - wchar_t * element_name; - - if (name == NULL) - element_name = L"FontBase"; - else - element_name = name; - - if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_WRITE, - &csp_cw))) - return; - - khc_write_binary(csp_cw, element_name, pfont, sizeof(LOGFONT)); - - khc_close_space(csp_cw); -} - -void -khm_get_cw_element_font(HDC hdc, wchar_t * name, BOOL use_default, LOGFONT * pfont) { - khm_handle csp_cw = NULL; - khm_size cb; - wchar_t * element_name; - khm_boolean try_derive = FALSE; - - if (name == NULL) - element_name = L"FontBase"; - else - element_name = name; - - if (use_default) - goto _use_defaults; - - if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", 0, - &csp_cw))) - goto _use_defaults; - - cb = sizeof(LOGFONT); - if (KHM_FAILED(khc_read_binary(csp_cw, element_name, pfont, - &cb)) || - cb != sizeof(LOGFONT)) { - try_derive = TRUE; - } - - if (try_derive) { - cb = sizeof(LOGFONT); - if (!name || - KHM_FAILED(khc_read_binary(csp_cw, L"FontBase", pfont, - &cb)) || - cb != sizeof(LOGFONT)) { - khc_close_space(csp_cw); - goto _use_defaults; - } - - if (!wcscmp(name, L"FontHeaderBold") || - !wcscmp(name, L"FontBold")) { - - pfont->lfWeight = FW_BOLD; - - } - } - - khc_close_space(csp_cw); - - return; - - _use_defaults: - - ZeroMemory(pfont, sizeof(*pfont)); - - if (name == NULL) { - LOGFONT lf = { - -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ - 0,0, /* escapement */ - FW_THIN, - FALSE, - FALSE, - FALSE, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_SWISS, - L"MS Shell Dlg"}; - - *pfont = lf; - - } else if (!wcscmp(name, L"FontHeader")) { - LOGFONT lf = { - -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ - 0,0, /* escapement */ - FW_THIN, - FALSE, - FALSE, - FALSE, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_SWISS, - L"MS Shell Dlg"}; - - *pfont = lf; - - } else if (!wcscmp(name, L"FontHeaderBold")) { - LOGFONT lf = { - -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ - 0,0, /* escapement */ - FW_BOLD, - FALSE, - FALSE, - FALSE, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_SWISS, - L"MS Shell Dlg"}; - - *pfont = lf; - - } else if (!wcscmp(name, L"FontNormal")) { - LOGFONT lf = { - -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ - 0,0, /* escapement */ - FW_THIN, - FALSE, - FALSE, - FALSE, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_SWISS, - L"MS Shell Dlg"}; - - *pfont = lf; - - } else if (!wcscmp(name, L"FontBold")) { - LOGFONT lf = { - -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ - 0,0, /* escapement */ - FW_BOLD, - FALSE, - FALSE, - FALSE, - DEFAULT_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, - FF_SWISS, - L"MS Shell Dlg"}; - - *pfont = lf; - - } else { -#ifdef DEBUG - assert(FALSE); -#endif - } -} - -void -cw_refresh_attribs(HWND hwnd) { - khm_int32 act; - kcdb_attrib * attrib; - khui_menu_def * menu; - khm_int32 i; - - menu = khui_find_menu(KHUI_MENU_COLUMNS); -#ifdef DEBUG - assert(menu); -#endif - - for (i=0; i <= KCDB_ATTR_MAX_ID; i++) { - if (KHM_FAILED(kcdb_attrib_get_info(i, &attrib))) { - if (attr_to_action[i] != 0) { - /* the action should be removed */ - khui_menu_remove_action(menu, attr_to_action[i]); - khui_action_delete(attr_to_action[i]); - attr_to_action[i] = 0; - } - } else { - if (attr_to_action[i] == 0 && - !(attrib->flags & KCDB_ATTR_FLAG_HIDDEN) && - (attrib->short_desc || attrib->long_desc)) { - /* new action */ - khm_handle sub = NULL; - - kmq_create_hwnd_subscription(hwnd, &sub); - - act = khui_action_create(attrib->name, - (attrib->short_desc? - attrib->short_desc: attrib->long_desc), - NULL, - (void *)(UINT_PTR) i, - KHUI_ACTIONTYPE_TOGGLE, - sub); - - attr_to_action[i] = act; - - khui_menu_insert_action(menu, 5000, act, 0); - } - - kcdb_attrib_release_info(attrib); - } - } -} - -khm_int32 -cw_get_custom_attr_id(wchar_t * s) -{ - if(!wcscmp(s, CW_CANAME_FLAGS)) - return CW_CA_FLAGS; - if(!wcscmp(s, CW_CANAME_TYPEICON)) - return CW_CA_TYPEICON; - return 0; -} - -const wchar_t * -cw_get_custom_attr_string(khm_int32 attr_id) -{ - if (attr_id == CW_CA_FLAGS) - return CW_CANAME_FLAGS; - if (attr_id == CW_CA_TYPEICON) - return CW_CANAME_TYPEICON; - return NULL; -} - -void -cw_save_view(khui_credwnd_tbl * tbl, wchar_t * view_name) { - wchar_t * col_list = NULL; - khm_size cb_col_list; - khm_handle csp_cw = NULL; - khm_handle csp_views = NULL; - khm_handle csp_view = NULL; - khm_handle csp_cols = NULL; - khm_size cb; - int i; - - if (tbl->n_cols == 0) - return; - - cb_col_list = (KCONF_MAXCB_NAME + 1) * tbl->n_cols; - - col_list = PMALLOC(cb_col_list); -#ifdef DEBUG - assert(col_list); -#endif - - if (!col_list) - goto _cleanup; - - multi_string_init(col_list, cb_col_list); - - if (!view_name && (tbl->flags & KHUI_CW_TBL_CUSTVIEW)) { - view_name = L"Custom_0"; - } - - if (view_name) { - if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", - KHM_PERM_READ | KHM_PERM_WRITE, &csp_cw))) - goto _cleanup; - - if (KHM_FAILED(khc_open_space(csp_cw, L"Views", KHM_PERM_READ, &csp_views))) - goto _cleanup; - - if (KHM_FAILED(khc_open_space(csp_views, view_name, - KHM_PERM_WRITE | KHM_FLAG_CREATE, - &csp_view))) - goto _cleanup; - - /* if we are switching to a custom view, then we should mark - that as the default. */ - if (tbl->flags & KHUI_CW_TBL_CUSTVIEW) { - khc_write_string(csp_cw, L"DefaultView", L"Custom_0"); - } - - } else { - csp_view = tbl->csp_view; - } - - if (!csp_view) - goto _cleanup; - - if (KHM_FAILED(khc_open_space(csp_view, L"Columns", - KHM_PERM_WRITE | KHM_FLAG_CREATE, - &csp_cols))) - goto _cleanup; - - for (i=0; i < tbl->n_cols; i++) { - const wchar_t * attr_name; - kcdb_attrib * attrib = NULL; - khm_handle csp_col = NULL; - - if (tbl->cols[i].attr_id < 0) { - attr_name = cw_get_custom_attr_string(tbl->cols[i].attr_id); - } else { - if (KHM_FAILED(kcdb_attrib_get_info(tbl->cols[i].attr_id, - &attrib))) { -#ifdef DEBUG - assert(FALSE); -#endif - goto _clean_col; - } - - attr_name = attrib->name; - } -#ifdef DEBUG - assert(attr_name); -#endif - - cb = cb_col_list; - multi_string_append(col_list, &cb, attr_name); - - if (KHM_FAILED(khc_open_space(csp_cols, attr_name, - KHM_PERM_WRITE | KHM_FLAG_CREATE, - &csp_col))) - goto _clean_col; - - khc_write_int32(csp_col, L"Width", tbl->cols[i].width); - khc_write_int32(csp_col, L"SortIndex", tbl->cols[i].sort_index); - khc_write_int32(csp_col, L"Flags", tbl->cols[i].flags); - - _clean_col: - - if (csp_col) - khc_close_space(csp_col); - - if (attrib) - kcdb_attrib_release_info(attrib); - } - - khc_write_multi_string(csp_view, L"ColumnList", col_list); - - _cleanup: - - if (view_name) { - if (csp_view) - khc_close_space(csp_view); - - if (csp_views) - khc_close_space(csp_views); - - if (csp_cw) - khc_close_space(csp_cw); - } - - if (csp_cols) - khc_close_space(csp_cols); - - if (col_list) - PFREE(col_list); -} - -void -cw_load_view(khui_credwnd_tbl * tbl, wchar_t * view, HWND hwnd) { - khm_handle hc_cw = NULL; - khm_handle hc_vs = NULL; - khm_handle hc_v = NULL; - khm_handle hc_cs = NULL; - khm_handle hc_c = NULL; - wchar_t buf[KCONF_MAXCCH_NAME]; - wchar_t * clist = NULL; - khm_size cbsize; - wchar_t * iter = NULL; - int i; - HDC hdc; - LOGFONT log_font; - - tbl->hwnd = hwnd; - - if(KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_READ | KHM_PERM_WRITE, - &hc_cw))) - return; - - if(KHM_FAILED(khc_open_space(hc_cw, L"Views", KHM_PERM_READ, &hc_vs))) - goto _exit; - - if(!view) { - cbsize = sizeof(buf); - if(KHM_FAILED(khc_read_string(hc_cw, L"DefaultView", buf, &cbsize))) - goto _exit; - view = buf; - - /* in addition, if we are loading the default view, we should - also check the appropriate menu item */ - - if (!wcscmp(view, L"ByIdentity")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_ID); - else if (!wcscmp(view, L"ByLocation")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_LOC); - else if (!wcscmp(view, L"ByType")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_TYPE); - else if (!wcscmp(view, L"Custom_0")) - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_CUST); - - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - } else { - khc_write_string(hc_cw, L"DefaultView", view); - } - - if(KHM_FAILED(khc_open_space(hc_vs, view, KHM_PERM_READ, &hc_v))) - goto _exit; - - tbl->csp_view = hc_v; - - if(KHM_FAILED(khc_open_space(hc_v, L"Columns", KHM_PERM_READ, &hc_cs))) - goto _exit; - - cbsize = 0; - if(khc_read_multi_string(hc_v, L"ColumnList", NULL, &cbsize) != KHM_ERROR_TOO_LONG) - goto _exit; - - /* temporary */ - clist = PMALLOC(cbsize); - - if(KHM_FAILED(khc_read_multi_string(hc_v, L"ColumnList", clist, &cbsize))) - goto _exit; - - tbl->n_cols = (int) multi_string_length_n(clist); - tbl->n_total_cols = UBOUNDSS(tbl->n_cols, - KHUI_CW_COL_INITIAL, KHUI_CW_COL_INCREMENT); - tbl->cols = PMALLOC(sizeof(khui_credwnd_col) * tbl->n_total_cols); - ZeroMemory(tbl->cols, sizeof(khui_credwnd_col) * tbl->n_total_cols); - - tbl->flags &= ~(KHUI_CW_TBL_CUSTVIEW | KHUI_CW_TBL_COLSKIP); - - iter = clist; - i = 0; - while(iter) { - khm_int32 attr_id; - - attr_id = cw_get_custom_attr_id(iter); - if(!attr_id) { - /* a KCDB attribute */ - if(KHM_FAILED(kcdb_attrib_get_id(iter, &attr_id))) { - tbl->flags |= KHUI_CW_TBL_COLSKIP; - goto _skip_col; - } - - if(kcdb_attrib_describe(attr_id, NULL, - &cbsize, KCDB_TS_SHORT) != KHM_ERROR_TOO_LONG || - cbsize == 0) { - tbl->flags |= KHUI_CW_TBL_COLSKIP; - goto _skip_col; - } - - tbl->cols[i].title = PMALLOC(cbsize); - kcdb_attrib_describe(attr_id, tbl->cols[i].title, &cbsize, KCDB_TS_SHORT); - - if (attr_id >= 0 && - attr_id <= KCDB_ATTR_MAX_ID && - attr_to_action[attr_id]) { - khui_check_action(attr_to_action[attr_id], TRUE); - } - - } else { - /* All current custom attributes are represented by icons, - not names */ - tbl->cols[i].title = NULL; - } - - tbl->cols[i].attr_id = attr_id; - - if(KHM_SUCCEEDED(khc_open_space(hc_cs, iter, KHM_PERM_READ, &hc_c))) { - if(KHM_FAILED(khc_read_int32(hc_c, L"Flags", &(tbl->cols[i].flags)))) - tbl->cols[i].flags = 0; - if(KHM_FAILED(khc_read_int32(hc_c, L"Width", &(tbl->cols[i].width)))) - tbl->cols[i].width = 100; - if(KHM_FAILED(khc_read_int32(hc_c, L"SortIndex", - &(tbl->cols[i].sort_index)))) - tbl->cols[i].sort_index = -1; - khc_close_space(hc_c); - hc_c = NULL; - } else { - tbl->cols[i].flags = 0; - tbl->cols[i].width = -1; - tbl->cols[i].sort_index = -1; - } - i++; -_skip_col: - iter = multi_string_next(iter); - } - - /* refresh the menus since we checked a few items */ - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - - /* adjust the number of columns. We may have skipped columns due to - inconsistencies above */ - tbl->n_cols = i; - - /* now that all the columns have been loaded, load the view - parameters */ - if(KHM_FAILED(khc_read_int32(hc_v, L"PaddingHorizontal", &(tbl->hpad)))) - khc_read_int32(hc_cw, L"PaddingHorizontal", &(tbl->hpad)); - if(KHM_FAILED(khc_read_int32(hc_v, L"PaddingVertical", &(tbl->vpad)))) - khc_read_int32(hc_cw, L"PaddingVertical", &(tbl->vpad)); - if(KHM_FAILED(khc_read_int32(hc_v, L"PaddingHeader", &(tbl->hpad_h)))) - khc_read_int32(hc_cw, L"PaddingHeader", &(tbl->hpad_h)); - if(KHM_FAILED(khc_read_int32(hc_v, L"WarnThreshold", &(tbl->threshold_warn)))) - khc_read_int32(hc_cw, L"WarnThreshold", &(tbl->threshold_warn)); - if(KHM_FAILED(khc_read_int32(hc_v, L"CriticalThreshold", - &(tbl->threshold_critical)))) - khc_read_int32(hc_cw, L"CriticalThreshold", - &(tbl->threshold_critical)); - - /* and the font resources and stuff */ - - tbl->flags |= KHUI_CW_TBL_INITIALIZED | KHUI_CW_TBL_COL_DIRTY | KHUI_CW_TBL_ACTIVE; - - /*TODO: the graphics objects should be customizable */ - - hdc = GetWindowDC(hwnd); - - khm_get_cw_element_font(hdc, L"FontHeader", FALSE, &log_font); - tbl->hf_header = CreateFontIndirect(&log_font); - - if(tbl->hf_header && tbl->hwnd_header) - SendMessage(tbl->hwnd_header, WM_SETFONT, (WPARAM) tbl->hf_header, 0); - - khm_get_cw_element_font(hdc, L"FontHeaderBold", FALSE, &log_font); - tbl->hf_bold_header = CreateFontIndirect(&log_font); - - - khm_get_cw_element_font(hdc, L"FontNormal", FALSE, &log_font); - tbl->hf_normal = CreateFontIndirect(&log_font); - - khm_get_cw_element_font(hdc, L"FontBold", FALSE, &log_font); - tbl->hf_bold = CreateFontIndirect(&log_font); - - ReleaseDC(hwnd, hdc); - - khui_bitmap_from_hbmp(&(tbl->kbm_logo_shade), - LoadImage(khm_hInstance, - MAKEINTRESOURCE(IDB_LOGO_SHADE), - IMAGE_BITMAP, - 0, - 0, - LR_DEFAULTCOLOR)); - - tbl->hb_normal = CreateSolidBrush(RGB(255,255,255)); - tbl->hb_grey = CreateSolidBrush(RGB(240,240,240)); - tbl->hb_sel = CreateSolidBrush(RGB(230,230,255)); - tbl->hb_hdr_bg = CreateSolidBrush(RGB(230,230,230)); - tbl->hb_hdr_bg_sel = CreateSolidBrush(RGB(0,0,255)); - tbl->hb_hdr_bg_crit = CreateSolidBrush(RGB(240,133,117)); - tbl->hb_hdr_bg_warn = CreateSolidBrush(RGB(251,199,77)); - tbl->hb_hdr_bg_exp = CreateSolidBrush(RGB(255,144,144)); - tbl->hb_hdr_bg_def = CreateSolidBrush(RGB(186,254,184)); - - tbl->cr_normal = RGB(0,0,0); - tbl->cr_sel = RGB(0,0,0); - tbl->cr_hdr_outline = RGB(0,0,0); - tbl->cr_hdr_normal = RGB(0,0,0); - tbl->cr_hdr_sel = RGB(255,255,255); - - tbl->ilist = khui_create_ilist(KHUI_SMICON_CX, KHUI_SMICON_CY-1, 20, 8, 0); - { - HBITMAP hbm; - -#define ADD_BITMAP(i) \ - hbm = LoadImage(khm_hInstance, MAKEINTRESOURCE(i), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); \ - if(hbm) { \ - khui_ilist_add_masked_id(tbl->ilist, hbm, KHUI_TOOLBAR_BGCOLOR, i); \ - DeleteObject(hbm); \ - } - - ADD_BITMAP(IDB_WDG_COLLAPSE); - ADD_BITMAP(IDB_WDG_EXPAND); - ADD_BITMAP(IDB_ID_SM); - ADD_BITMAP(IDB_ID_DIS_SM); - - ADD_BITMAP(IDB_TK_NEW_SM); - ADD_BITMAP(IDB_TK_REFRESH_SM); - ADD_BITMAP(IDB_WDG_COLLAPSE_HI); - ADD_BITMAP(IDB_WDG_EXPAND_HI); - - ADD_BITMAP(IDB_WDG_FLAG); - ADD_BITMAP(IDB_WDG_CREDTYPE); - ADD_BITMAP(IDB_FLAG_WARN); - ADD_BITMAP(IDB_FLAG_EXPIRED); - - ADD_BITMAP(IDB_FLAG_CRITICAL); - ADD_BITMAP(IDB_FLAG_RENEW); - ADD_BITMAP(IDB_WDG_STUCK); - ADD_BITMAP(IDB_WDG_STUCK_HI); - - ADD_BITMAP(IDB_WDG_STICK); - ADD_BITMAP(IDB_WDG_STICK_HI); - ADD_BITMAP(IDB_TK_SM); - -#undef ADD_BITMAP - } - - tbl->cursor_row = -1; - tbl->scr_left = 0; - tbl->scr_top = 0; - tbl->ext_height = 0; - tbl->ext_width = 0; - -_exit: - if(hc_cw) - khc_close_space(hc_cw); - if(hc_vs) - khc_close_space(hc_vs); - if(hc_cs) - khc_close_space(hc_cs); - if(clist) - PFREE(clist); - /* we leave hc_v held, because tbl->csp_view is the same handle. - We keep that open until the view is unloaded. */ -} - -void -cw_update_creds(khui_credwnd_tbl * tbl) -{ - kcdb_cred_comp_field * fields; - kcdb_cred_comp_order comp_order; - int i; - khm_int32 n; - khm_int32 delta; - khm_handle hc; - khm_int32 flags; - - if(!tbl->credset) { - if(KHM_FAILED(kcdb_credset_create(&(tbl->credset)))) - return; - } - - kcdb_credset_purge(tbl->credset); - - kcdb_identity_refresh_all(); - - kcdb_credset_collect( - tbl->credset, - NULL, - NULL, - KCDB_CREDTYPE_ALL, - &delta); - - /* now we need to figure out how to sort the credentials */ - fields = PMALLOC(sizeof(kcdb_cred_comp_field) * tbl->n_cols); - ZeroMemory(fields, sizeof(kcdb_cred_comp_field) * tbl->n_cols); - - for(i=0, n=0; in_cols; i++) { - if((tbl->cols[i].flags & KHUI_CW_COL_SORT_INC) || - (tbl->cols[i].flags & KHUI_CW_COL_SORT_DEC) || - (tbl->cols[i].flags & KHUI_CW_COL_GROUP)) { - int si; - /* we need to sort by this column */ - si = tbl->cols[i].sort_index; - - if(si < 0 || si >= (int) tbl->n_cols) - { - /* this shouldn't happen */ - tbl->cols[i].flags &= ~(KHUI_CW_COL_SORT_INC | - KHUI_CW_COL_SORT_DEC | - KHUI_CW_COL_GROUP); - continue; - } - - fields[si].attrib = tbl->cols[i].attr_id; - if(tbl->cols[i].flags & KHUI_CW_COL_SORT_DEC) - fields[si].order = KCDB_CRED_COMP_DECREASING; - else - fields[si].order = KCDB_CRED_COMP_INCREASING; - - /* special case. if we are sorting by name, we group - initial tickets before non-initial tickets. - - Also, if we are sorting by credential type name, then - we allow the primary credential type first before - others. */ - - if (fields[si].attrib == KCDB_ATTR_NAME || - fields[si].attrib == KCDB_ATTR_TYPE_NAME) - fields[si].order |= KCDB_CRED_COMP_INITIAL_FIRST; - - if(si >= n) - n = si+1; - } - } - - /* we assume that the sort order is sane */ - /*TODO: don't assume; check if the sort order is sane */ - - comp_order.nFields = n; - comp_order.fields = fields; - - kcdb_credset_sort(tbl->credset, - kcdb_cred_comp_generic, - (void *) &comp_order); - - /* also, if new credentials were added, initialize the UI flag - attribute to 0 */ - if(delta & KCDB_DELTA_ADD) { - khm_size s; - - kcdb_credset_get_size(tbl->credset, &s); - for(i=0;i< (int) s;i++) { - if(KHM_FAILED(kcdb_credset_get_cred(tbl->credset, - (khm_int32) i, &hc))) - continue; /* lost a race */ - if(KHM_FAILED(kcdb_cred_get_attr(hc, khui_cw_flag_id, NULL, - NULL, NULL))) { - flags = 0; - kcdb_cred_set_attr(hc, khui_cw_flag_id, &flags, sizeof(flags)); - } - kcdb_cred_release(hc); - } - } - - if (fields) - PFREE(fields); -} - -void -cw_del_outline(khui_credwnd_outline *o) { - khui_credwnd_outline * c; - if(!o) - return; - - /* the outline object is still in a list */ - if(o->next || o->prev) - return; - - if(o->header) - PFREE(o->header); - - if ((o->flags & KHUI_CW_O_DATAALLOC) && - o->data) - PFREE(o->data); - - if ((o->flags & KHUI_CW_O_STICKY) && - o->data) - kcdb_identity_release((khm_handle) o->data); - - LPOP(&(o->children), &c); - while(c) { - cw_del_outline(c); - LPOP(&(o->children), &c); - } - - PFREE(o); -} - -khui_credwnd_outline * -cw_new_outline_node(wchar_t * heading) { - khui_credwnd_outline * o; - size_t cblen; - - o = PMALLOC(sizeof(khui_credwnd_outline)); - ZeroMemory(o, sizeof(khui_credwnd_outline)); - - if(SUCCEEDED(StringCbLength(heading, KHUI_MAXCB_HEADING, &cblen))) { - cblen += sizeof(wchar_t); - o->header = PMALLOC(cblen); - StringCbCopy(o->header, cblen, heading); - } - - return o; -} - -khm_int32 -cw_get_cred_exp_flags(khui_credwnd_tbl * tbl, khm_handle cred) -{ - khm_int32 flags; - long s; - FILETIME ft; - khm_size cbsize; - - cbsize = sizeof(ft); - if(KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_TIMELEFT, NULL, &ft, &cbsize))) - return 0; - - s = FtIntervalToSeconds(&ft); - - flags = 0; - if(s < 0) - flags = CW_EXPSTATE_EXPIRED; - else if(s < tbl->threshold_critical) - flags = CW_EXPSTATE_CRITICAL; - else if(s < tbl->threshold_warn) - flags = CW_EXPSTATE_WARN; - else - flags = CW_EXPSTATE_NONE; - - return flags; -} - -void cw_update_outline(khui_credwnd_tbl * tbl); - -VOID CALLBACK -cw_timer_proc(HWND hwnd, - UINT uMsg, - UINT_PTR idEvent, - DWORD dwTime) -{ - khui_credwnd_tbl * tbl; - khui_credwnd_row * r; - khm_int32 nflags; - int nr; - long ms; - FILETIME ft; - khm_size cbsize; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - r = (khui_credwnd_row *) idEvent; - - nr = (int)(r - tbl->rows); - - if(nr < 0 || nr >= tbl->n_rows) - return; - - if(!(r->flags & KHUI_CW_ROW_CRED)) - return; /* we only know what to do with cred rows */ - - nflags = cw_get_cred_exp_flags(tbl, (khm_handle) r->data); - if((r->flags & CW_EXPSTATE_MASK) != nflags) { - /* flags have changed */ - /* the outline needs to be updated */ - cw_update_outline(tbl); - InvalidateRect(tbl->hwnd, NULL, FALSE); - } else { - /* just invalidate the row */ - RECT r,rr,ri; - - GetClientRect(tbl->hwnd, &r); - r.top += tbl->header_height; - rr.top = r.top + (long)nr * tbl->cell_height - tbl->scr_top; - rr.bottom = rr.top + tbl->cell_height; - rr.left = r.left; - rr.right = r.right; - - if(IntersectRect(&ri, &r, &rr)) - InvalidateRect(tbl->hwnd, &ri, FALSE); - } - - cbsize = sizeof(ft); - if(KHM_SUCCEEDED(kcdb_cred_get_attr((khm_handle) r->data, - KCDB_ATTR_TIMELEFT, NULL, - &ft, &cbsize))) { - ms = FtIntervalMsToRepChange(&ft); - if(ms > 0) { - SetTimer(tbl->hwnd, (UINT_PTR) r, ms + 100, cw_timer_proc); - } - } -} - -void -cw_set_tbl_row_cred(khui_credwnd_tbl * tbl, - int row, - khm_handle cred, - int col) -{ - FILETIME ft; - long ms; - khm_size cbsize; - - if((int) tbl->n_total_rows <= row) { - /* we need to resize the allocation */ - khui_credwnd_row * newrows; - int newsize; - - newsize = UBOUNDSS(row+1,KHUI_CW_ROW_INITIAL, KHUI_CW_ROW_INCREMENT); - newrows = PMALLOC(sizeof(khui_credwnd_row) * newsize); - memcpy(newrows, tbl->rows, sizeof(khui_credwnd_row) * tbl->n_rows); - PFREE(tbl->rows); - tbl->rows = newrows; - tbl->n_total_rows = newsize; - } - - tbl->rows[row].col = col; - tbl->rows[row].data = cred; - tbl->rows[row].flags = KHUI_CW_ROW_CRED; - - /* Set any required timer events */ - cbsize = sizeof(ft); - if(KHM_SUCCEEDED(kcdb_cred_get_attr(cred, KCDB_ATTR_TIMELEFT, NULL, &ft, &cbsize))) { - ms = FtIntervalMsToRepChange(&ft); - if(ms > 0) { - SetTimer(tbl->hwnd, (UINT_PTR) &(tbl->rows[row]), ms + 100, cw_timer_proc); - tbl->rows[row].flags |= KHUI_CW_ROW_TIMERSET; - } - } -} - -void -cw_set_tbl_row_header(khui_credwnd_tbl * tbl, - int row, int col, - khui_credwnd_outline * o) -{ - if((int) tbl->n_total_rows <= row) { - /* we need to resize the allocation */ - khui_credwnd_row * newrows; - int newsize; - - newsize = UBOUNDSS(row+1,KHUI_CW_ROW_INITIAL, KHUI_CW_ROW_INCREMENT); - newrows = PMALLOC(sizeof(khui_credwnd_row) * newsize); - memcpy(newrows, tbl->rows, sizeof(khui_credwnd_row) * tbl->n_rows); - PFREE(tbl->rows); - tbl->rows = newrows; - tbl->n_total_rows = newsize; - } - - tbl->rows[row].col = col; - tbl->rows[row].data = (khm_handle) o; - tbl->rows[row].flags = KHUI_CW_ROW_HEADER; - if(o->flags & KHUI_CW_O_SELECTED) - tbl->rows[row].flags |= KHUI_CW_ROW_SELECTED; -} - -static int -iwcscmp(const void * p1, const void * p2) { - const wchar_t * s1 = *(wchar_t **) p1; - const wchar_t * s2 = *(wchar_t **) p2; - - return wcscmp(s1, s2); -} - -void -cw_update_outline(khui_credwnd_tbl * tbl) -{ - int i,j,n_rows; - int level; - int visible; - khm_size n_creds = 0; - khm_handle prevcred = NULL; - khm_handle thiscred = NULL; - /* grouping[0..n_grouping-1] are the columns that we are going to - group the display by. Say we are grouping by identity and then - by type, then grouping[0]=col# of identity and grouping[1]=col# - of type */ - khm_int32 * grouping = NULL; - khui_credwnd_outline * ol = NULL; - int n_grouping; - wchar_t buf[256]; - khm_size cbbuf; - khm_int32 flags; - int selected; - khm_int32 expstate = 0; - - /* this is called after calling cw_update_creds, so we assume - that the credentials are all loaded and sorted according to - grouping rules */ - - /* if the columns have changed, then any outline info we have - cached are unreliable */ - if(tbl->flags & KHUI_CW_TBL_COL_DIRTY) { - khui_credwnd_outline * o; - LPOP(&(tbl->outline), &o); - while(o) { - cw_del_outline(o); - LPOP(&(tbl->outline), &o); - } - tbl->n_rows = 0; - } - - /* Otherwise, we should reset the outline indices. Just the first - level is enough */ - if (tbl->outline) { - khui_credwnd_outline * o; - - o = tbl->outline; - while(o) { - o->start = -1; - o = LNEXT(o); - } - } - - /* determine the grouping order */ - grouping = PMALLOC(sizeof(khm_int32) * tbl->n_cols); - for(i=0; i < (int) tbl->n_cols; i++) - grouping[i] = -1; - n_grouping = 0; - - for(i=0; i < (int) tbl->n_cols; i++) { - /* since cw_update_creds has run, the KHUI_CW_COL_GROUP flag - only exists for columns that has a valid sort_index */ - if(tbl->cols[i].flags & KHUI_CW_COL_GROUP) { - grouping[tbl->cols[i].sort_index] = i; - if(n_grouping <= tbl->cols[i].sort_index) - n_grouping = tbl->cols[i].sort_index + 1; - } - } - - /* if we have sorted by an index without grouping by it, we can't - establish any grouping beyond that index. */ - for(i=0; i < n_grouping; i++) { - if(grouping[i] == -1) - break; - } - n_grouping = i; - - if(!tbl->rows) { - /* we haven't allocated memory yet */ - tbl->n_total_rows = KHUI_CW_ROW_INITIAL; - tbl->n_rows = 0; - tbl->rows = PMALLOC(sizeof(khui_credwnd_row) * tbl->n_total_rows); - } else { - /* kill any pending timers */ - for(i=0; i < (int) tbl->n_rows; i++) - if(tbl->rows[i].flags & KHUI_CW_ROW_TIMERSET) - { - KillTimer(tbl->hwnd, (UINT_PTR) &(tbl->rows[i])); - tbl->rows[i].flags &= ~KHUI_CW_ROW_TIMERSET; - } - } - - if(KHM_FAILED(kcdb_credset_get_size(tbl->credset, &n_creds))) - goto _exit; - - n_rows = 0; - prevcred = NULL; - ol = NULL; - - for(i=0; i < (int) n_creds; i++) { - if(KHM_FAILED(kcdb_credset_get_cred(tbl->credset, i, &thiscred))) - continue; - - /* if this credential appears to be the same as another for - this view, we skip it */ - if(prevcred) { - for(j=0; j < (int) tbl->n_cols; j++) { - if(kcdb_creds_comp_attr(prevcred, thiscred, - tbl->cols[j].attr_id)) - break; - } - - if(j >= (int) tbl->n_cols) { - if (n_rows > 0) { - tbl->rows[n_rows - 1].idx_end = i; - } - continue; - } - } - - if(!prevcred) - level = 0; - else { - for(j=0; j < n_grouping; j++) { - /* determine the grouping level at which thiscred - differs from prevcred */ - if(kcdb_creds_comp_attr(prevcred,thiscred, - tbl->cols[grouping[j]].attr_id)) - break; - } - level = j; - } - - /* now we have to walk up until we get to the parent of the - outline level we should be in */ - while(ol && ol->level >= level) { - ol->length = n_rows - ol->start; - ol->idx_end = i - 1; - ol = TPARENT(ol); - } - - if(ol) { - visible = (ol->flags & KHUI_CW_O_VISIBLE) && - (ol->flags & KHUI_CW_O_EXPAND); - selected = (ol->flags & KHUI_CW_O_SELECTED); - } else { - visible = TRUE; - selected = FALSE; - } - - /* now ol points to an outline node at the next highest level - or is NULL if level = 0 */ - - for(j=level; j < n_grouping; j++) { - khui_credwnd_outline * to; - /* now we search for an outline object at the next level - which matches the heading */ - cbbuf = sizeof(buf); - buf[0] = L'\0'; - if(KHM_FAILED - (kcdb_cred_get_attr_string(thiscred, - tbl->cols[grouping[j]].attr_id, - buf, &cbbuf, 0))) { - cbbuf = sizeof(wchar_t); - buf[0] = L'\0'; - } - - if(ol) - to = TFIRSTCHILD(ol); - else - to = tbl->outline; - - while(to) { - if(!wcscmp(buf, to->header)) - break; - to = LNEXT(to); - } - - if(to) { - /* found it */ - ol = to; - } else { - /* not found. create */ - to = cw_new_outline_node(buf); - if(ol) { - TADDCHILD(ol, to); - } else { - LPUSH(&(tbl->outline), to); - } - ol = to; - ol->flags = KHUI_CW_O_EXPAND; - ol->level = j; - ol->col = grouping[j]; - - if(tbl->cols[grouping[j]].attr_id == KCDB_ATTR_ID_NAME) { - khm_handle h; - if(KHM_SUCCEEDED(kcdb_identity_create(buf, 0, &h))) { - ol->attr_id = KCDB_ATTR_ID; - ol->data = (void *) h; - - /* the outline only lasts as long as the - credential, and the credential has a hold - on the identity. */ - kcdb_identity_release(h); - } - else - ol->data = 0; - } else if(tbl->cols[grouping[j]].attr_id == - KCDB_ATTR_TYPE_NAME) { - khm_int32 t; - - ol->attr_id = KCDB_ATTR_TYPE; - if(KHM_SUCCEEDED(kcdb_cred_get_type(thiscred, &t))) - ol->data = (void *)(ssize_t) t; - else - ol->data = (void *)(ssize_t) KCDB_CREDTYPE_INVALID; - } else { - khm_int32 rv; - khm_int32 alt_id; - kcdb_attrib * attrib; - - rv = - kcdb_attrib_get_info(tbl->cols[grouping[j]].attr_id, - &attrib); - assert(KHM_SUCCEEDED(rv)); - - if (attrib->flags & KCDB_ATTR_FLAG_ALTVIEW) - alt_id = attrib->alt_id; - else - alt_id = tbl->cols[grouping[j]].attr_id; - - ol->attr_id = alt_id; - - kcdb_attrib_release_info(attrib); - - rv = kcdb_cred_get_attr(thiscred, - alt_id, - NULL, - NULL, - &cbbuf); - if (rv != KHM_ERROR_TOO_LONG || cbbuf == 0) { - ol->data = NULL; - } else { - ol->data = PMALLOC(cbbuf); - assert(ol->data); - rv = kcdb_cred_get_attr(thiscred, - alt_id, - NULL, - ol->data, - &cbbuf); - assert(KHM_SUCCEEDED(rv)); - ol->cb_data = cbbuf; - ol->flags |= KHUI_CW_O_DATAALLOC; - } - } - } - - /* now ol points at the node at level j we want to be - in */ - ol->start = n_rows; - ol->idx_start = i; - ol->length = 0; - ol->flags &= ~CW_EXPSTATE_MASK; - ol->flags &= ~KHUI_CW_O_SHOWFLAG; - ol->flags &= ~KHUI_CW_O_STICKY; - - if(selected) { - ol->flags |= KHUI_CW_O_SELECTED; - } - if(visible) { - cw_set_tbl_row_header(tbl, n_rows, grouping[j], ol); - n_rows ++; - ol->flags |= KHUI_CW_O_VISIBLE; - } else { - ol->flags &= ~KHUI_CW_O_VISIBLE; - } - visible = visible && (ol->flags & KHUI_CW_O_EXPAND); - selected = (selected || (ol->flags & KHUI_CW_O_SELECTED)); - } - - /* we need to do this here too just in case we were already at - the level we were supposed to be in */ - if (ol) - visible = visible && (ol->flags & KHUI_CW_O_EXPAND); - - flags = cw_get_cred_exp_flags(tbl, thiscred); - expstate |= flags; - - if(visible) { - khm_int32 c_flags; - - cw_set_tbl_row_cred(tbl, n_rows, thiscred, - grouping[n_grouping-1]); - kcdb_cred_get_flags(thiscred, &c_flags); - if(flags) { - tbl->rows[n_rows].flags |= flags; - } - if(selected || - (c_flags & KCDB_CRED_FLAG_SELECTED)) - tbl->rows[n_rows].flags |= KHUI_CW_ROW_SELECTED; - tbl->rows[n_rows].idx_start = i; - tbl->rows[n_rows].idx_end = i; - - n_rows++; - } else if(flags) { - khui_credwnd_outline *to; - /* the row that is flagged is not visible. We need to send - the flag upstream until we hit a visible outline node */ - to = ol; - while(to && !(to->flags & KHUI_CW_O_VISIBLE)) { - to = TPARENT(to); - } - if(to) { - to->flags |= KHUI_CW_O_SHOWFLAG; - } - } - - /* and we propagate the flags upstream */ - if(flags) { - khui_credwnd_outline *to; - - to = ol; - while(to) { - if((to->flags & CW_EXPSTATE_MASK) < flags) { - to->flags = (to->flags & ~CW_EXPSTATE_MASK) | flags; - } - to = TPARENT(to); - } - } - - if(prevcred) - kcdb_cred_release(prevcred); - prevcred = thiscred; - } - - while(ol) { - ol->length = n_rows - ol->start; - ol->idx_end = i - 1; - ol = TPARENT(ol); - } - - if(prevcred) { - kcdb_cred_release(prevcred); - prevcred = NULL; - } - - /* Add any sticky identities that we haven't seen yet */ - if (n_grouping > 0 && - tbl->cols[grouping[0]].attr_id == KCDB_ATTR_ID_NAME) { - - khui_credwnd_outline * o; - wchar_t * idnames = NULL; - wchar_t * t; - khm_size n_idents; - khm_size cb_names; - wchar_t ** idarray = NULL; - int i; - - if (kcdb_identity_enum(KCDB_IDENT_FLAG_STICKY, - KCDB_IDENT_FLAG_STICKY, - NULL, - &cb_names, - &n_idents) != KHM_ERROR_TOO_LONG || - n_idents == 0 || - cb_names == 0) - goto _cleanup_sticky; - - idnames = PMALLOC(cb_names); - idarray = PMALLOC(n_idents * sizeof(*idarray)); -#ifdef DEBUG - assert(idnames); - assert(idarray); -#endif - - if (KHM_FAILED(kcdb_identity_enum(KCDB_IDENT_FLAG_STICKY, - KCDB_IDENT_FLAG_STICKY, - idnames, - &cb_names, - &n_idents))) - goto _cleanup_sticky; - - for (i=0, t=idnames; t && *t; t = multi_string_next(t), i++) { - idarray[i] = t; - } - - qsort(idarray, n_idents, sizeof(*idarray), iwcscmp); - - for (i=0; i < (int) n_idents; i++) { - khm_handle h; - - if (KHM_FAILED(kcdb_identity_create(idarray[i], - KCDB_IDENT_FLAG_CREATE, &h))) - continue; - - for (o = tbl->outline; o; o = LNEXT(o)) { - if (!wcscmp(idarray[i], o->header)) - break; - } - - if (o) { - /* found it */ - if (o->start != -1) /* already visible? */ - continue; - o->flags &= KHUI_CW_O_STICKY; - o->flags |= KHUI_CW_O_VISIBLE; - } else { - /* not found. create */ - o = cw_new_outline_node(idarray[i]); - o->flags = KHUI_CW_O_VISIBLE; - o->level = 0; - o->col = grouping[0]; - o->data = (void *) h; - } - - if (o->flags & KHUI_CW_O_STICKY) - kcdb_identity_release(h); - else - /* leave identity held in this case */ - o->flags |= KHUI_CW_O_STICKY; - - o->flags &= ~KHUI_CW_O_EXPAND; - o->start = n_rows; - o->length = 1; - o->idx_start = -1; - - cw_set_tbl_row_header(tbl, n_rows, grouping[0], o); - - n_rows ++; - } - - _cleanup_sticky: - if (idnames) - PFREE(idnames); - if (idarray) - PFREE(idarray); - } - - tbl->n_rows = n_rows; - tbl->flags |= KHUI_CW_TBL_ROW_DIRTY; - - tbl->flags &= ~KHUI_CW_TBL_COL_DIRTY; - - if (tbl->cursor_row >= tbl->n_rows) - tbl->cursor_row = tbl->n_rows - 1; - if (tbl->cursor_row < 0) - tbl->cursor_row = 0; -_exit: - if(grouping) - PFREE(grouping); - - if (n_creds == 0) - khm_notify_icon_expstate(KHM_NOTIF_EMPTY); - else if (expstate & CW_EXPSTATE_EXPIRED) - khm_notify_icon_expstate(KHM_NOTIF_EXP); - else if ((expstate & CW_EXPSTATE_WARN) || - (expstate & CW_EXPSTATE_CRITICAL)) - khm_notify_icon_expstate(KHM_NOTIF_WARN); - else - khm_notify_icon_expstate(KHM_NOTIF_OK); -} - -void -cw_unload_view(khui_credwnd_tbl * tbl) -{ -#define SafeDeleteObject(o) \ - do { \ - if(o) { \ - DeleteObject(o); \ - o = NULL; \ - } \ - } while(0) - - SafeDeleteObject(tbl->hf_header); - SafeDeleteObject(tbl->hf_normal); - SafeDeleteObject(tbl->hf_bold); - SafeDeleteObject(tbl->hf_bold_header); - SafeDeleteObject(tbl->hb_grey); - SafeDeleteObject(tbl->hb_normal); - SafeDeleteObject(tbl->hb_sel); - SafeDeleteObject(tbl->hb_hdr_bg); - SafeDeleteObject(tbl->hb_hdr_bg_sel); - SafeDeleteObject(tbl->hb_hdr_bg_crit); - SafeDeleteObject(tbl->hb_hdr_bg_exp); - SafeDeleteObject(tbl->hb_hdr_bg_warn); - SafeDeleteObject(tbl->hb_hdr_bg_def); - -#undef SafeDeleteObject - - if(tbl->credset) { - kcdb_credset_delete(tbl->credset); - tbl->credset = NULL; - } - if(tbl->ilist) { - khui_delete_ilist(tbl->ilist); - tbl->ilist = NULL; - } - - if(tbl->cols) { - int i; - - for(i=0; i < tbl->n_cols; i++) { - if(tbl->cols[i].title) - PFREE(tbl->cols[i].title); - Header_DeleteItem(tbl->hwnd_header, 0); - - if (tbl->cols[i].attr_id >= 0 && - tbl->cols[i].attr_id <= KCDB_ATTR_MAX_ID && - attr_to_action[tbl->cols[i].attr_id]) { - - khui_check_action(attr_to_action[tbl->cols[i].attr_id], FALSE); - - } - } - PFREE(tbl->cols); - tbl->cols = NULL; - tbl->n_cols = 0; - tbl->n_total_cols = 0; - - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - } - - if(tbl->rows) { - PFREE(tbl->rows); - tbl->rows = NULL; - tbl->n_rows = 0; - tbl->n_total_rows = 0; - } - - khui_delete_bitmap(&tbl->kbm_logo_shade); - - if (tbl->csp_view) { - khc_close_space(tbl->csp_view); - tbl->csp_view = NULL; - } - - tbl->cell_height = 0; /* recalculate cell height next time */ -} - -void -cw_hditem_from_tbl_col(khui_credwnd_col * col, HDITEM *phi) -{ - size_t cchsize; - - phi->mask = HDI_FORMAT | HDI_LPARAM | HDI_WIDTH; - if(cw_is_custom_attr(col->attr_id)) { - if(col->attr_id == CW_CA_FLAGS) { - phi->fmt = 0; - } else if(col->attr_id == CW_CA_TYPEICON) { - phi->fmt = 0; - } else { - /* what the? */ - /*TODO: throw up and die */ - } - } else { - phi->mask |= HDI_TEXT; - phi->pszText = col->title; - StringCchLength(col->title, KCDB_MAXCCH_SHORT_DESC, &cchsize); - phi->cchTextMax = (int) cchsize; - phi->fmt = HDF_CENTER | HDF_STRING; - } - phi->lParam = col->attr_id; -#if (_WIN32_WINNT >= 0x501) - if (IS_COMMCTL6()) { - if(col->flags & KHUI_CW_COL_SORT_INC) { - phi->fmt |= HDF_SORTUP; - } else if(col->flags & KHUI_CW_COL_SORT_DEC) { - phi->fmt |= HDF_SORTDOWN; - } - } -#endif - if(col->width < 0) { - /*TODO: come up with a better way to handle this case */ - col->width = 200; - } - phi->cxy = col->width; -} - -int -cw_get_cell_height(HDC hdc, HFONT hf) { - SIZE size; - size_t cbbuf; - wchar_t buf[64]; - HFONT hfold = NULL; - - if (hf) - hfold = SelectFont(hdc, hf); - - LoadString(khm_hInstance, IDS_SAMPLE_STRING, buf, sizeof(buf)/sizeof(buf[0])); - StringCchLength(buf, sizeof(buf)/sizeof(buf[0]), &cbbuf); - GetTextExtentPoint32(hdc, buf, (int) cbbuf, &size); - - if (hf) - SelectFont(hdc, hfold); - - return size.cy; -} - -/* returns a bitmask indicating which measures were changed */ -int -cw_update_extents(khui_credwnd_tbl * tbl, - khm_boolean update_scroll) { - int ext_x, ext_y; - int i; - - ext_x = 0; - for(i=0; i < (int) tbl->n_cols; i++) { - tbl->cols[i].x = ext_x; - ext_x += tbl->cols[i].width; - } - - if(!tbl->cell_height) { - HDC dc; - int maxheight = 0; - int height; - - dc = GetWindowDC(tbl->hwnd); - - maxheight = cw_get_cell_height(dc, tbl->hf_normal); - height = cw_get_cell_height(dc, tbl->hf_bold); - if (height > maxheight) - maxheight = height; - height = cw_get_cell_height(dc, tbl->hf_header); - if (height > maxheight) - maxheight = height; - height = cw_get_cell_height(dc, tbl->hf_bold_header); - if (height > maxheight) - maxheight = height; - - ReleaseDC(tbl->hwnd, dc); - - tbl->cell_height = height + tbl->vpad * 2; - } - - ext_y = (int) tbl->n_rows * tbl->cell_height; - - tbl->ext_width = ext_x; - tbl->ext_height = ext_y; - - /* useful in the future when implementing variable height rows. - The KHUI_CW_TBL_ROW_DIRTY bit indicates that the rows have - changed and that the y extent has to be recalculated. */ - tbl->flags &= ~KHUI_CW_TBL_ROW_DIRTY; - - if(update_scroll) { - RECT r; - int cl_w; - int cl_h; - SCROLLINFO si; - WINDOWPOS pw; - HDLAYOUT hdl; - - /* update the header control first */ - - retry_update_scroll: - GetClientRect(tbl->hwnd, &r); - - cl_w = r.right - r.left; - cl_h = (r.bottom - r.top); - cl_h -= tbl->header_height; - - if(tbl->scr_top < 0 || tbl->ext_height < cl_h) - tbl->scr_top = 0; - else if(tbl->scr_top > tbl->ext_height - cl_h) - tbl->scr_top = tbl->ext_height - cl_h; - if(tbl->scr_left < 0 || tbl->ext_width < cl_w) - tbl->scr_left = 0; - else if(tbl->scr_left > tbl->ext_width - cl_w) - tbl->scr_left = tbl->ext_width - cl_w; - - /* adjustments for scrolling */ - r.left -= tbl->scr_left; - r.right = max(tbl->ext_width + r.left, r.right); - - hdl.prc = &r; - hdl.pwpos = &pw; - - Header_Layout(tbl->hwnd_header, &hdl); - - if(tbl->header_height == 0) { - tbl->header_height = pw.cy; - goto retry_update_scroll; - } else - tbl->header_height = pw.cy; - - SetWindowPos( - tbl->hwnd_header, - pw.hwndInsertAfter, - pw.x, - pw.y, - pw.cx, - pw.cy, - pw.flags); - - si.cbSize = sizeof(si); - si.nMin = 0; - si.nMax = tbl->ext_height; - si.nPage = cl_h; - si.nPos = tbl->scr_top; - si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; - SetScrollInfo(tbl->hwnd, SB_VERT, &si, TRUE); - - si.cbSize = sizeof(si); - si.nMin = 0; - si.nMax = tbl->ext_width; - si.nPage = cl_w; - si.nPos = tbl->scr_left; - si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; - SetScrollInfo(tbl->hwnd, SB_HORZ, &si, TRUE); - } - - return 0; -} - -void -cw_insert_header_cols(khui_credwnd_tbl * tbl) { - HWND hdr; - HDITEM hi; - int i; - - hdr = tbl->hwnd_header; - - for(i=0; i < (int) tbl->n_cols; i++) { - cw_hditem_from_tbl_col(&(tbl->cols[i]), &hi); - Header_InsertItem(hdr, 512, &hi); - } -} - -#define CW_ER_BLANK 0 -#define CW_ER_GREY 1 -#define CW_ER_SEL 2 - -void -cw_erase_rect(HDC hdc, - khui_credwnd_tbl * tbl, - RECT * r_wnd, - RECT * r_erase, - int type) -{ - RECT rlogo; - RECT ri; - RECT t; - BOOL rie; - HBRUSH hbr; - - if(RectVisible(hdc, r_erase)) { - - switch(type) { - case CW_ER_BLANK: - hbr = tbl->hb_normal; - break; - - case CW_ER_GREY: - hbr = tbl->hb_grey; - break; - - case CW_ER_SEL: - hbr = tbl->hb_sel; - break; - - default: - return; - } - - if(tbl->kbm_logo_shade.cx != -1 && type == CW_ER_BLANK) { - rlogo.left = r_wnd->right - tbl->kbm_logo_shade.cx; - rlogo.right = r_wnd->right; - rlogo.top = r_wnd->bottom - tbl->kbm_logo_shade.cy; - rlogo.bottom = r_wnd->bottom; - rie = IntersectRect(&ri, r_erase, &rlogo); - } else { - ZeroMemory(&rlogo, sizeof(rlogo)); - ZeroMemory(&ri, sizeof(ri)); - rie = FALSE; - } - - if(!rie) { - FillRect(hdc, r_erase, hbr); - } else { - HDC hdcb = CreateCompatibleDC(hdc); - HBITMAP hbmold = SelectObject(hdcb, tbl->kbm_logo_shade.hbmp); - - BitBlt(hdc, ri.left, ri.top, ri.right - ri.left, ri.bottom - ri.top, - hdcb, ri.left - rlogo.left, ri.top - rlogo.top, SRCCOPY); - - SelectObject(hdcb, hbmold); - DeleteDC(hdcb); - - if(r_erase->top < ri.top && r_erase->left < ri.left) { - t.left = r_erase->left; - t.top = r_erase->top; - t.right = ri.left; - t.bottom = ri.top; - FillRect(hdc, &t, hbr); - } - - if(r_erase->left < ri.left) { - t.left = r_erase->left; - t.top = ri.top; - t.right = ri.left; - t.bottom = ri.bottom; - FillRect(hdc, &t, hbr); - } - - if(r_erase->top < ri.top) { - t.left = ri.left; - t.top = r_erase->top; - t.right = ri.right; - t.bottom = ri.top; - FillRect(hdc, &t, hbr); - } - } - } -} - -void -cw_draw_header(HDC hdc, - khui_credwnd_tbl * tbl, - int row, - RECT * r) -{ - int colattr; - HPEN pl, pold; - khui_credwnd_row * cr; - khui_credwnd_outline * o; - int selected = 0; - khm_int32 idf = 0; - - /* each header consists of a couple of widgets and some text */ - /* we need to figure out the background color first */ - - cr = &(tbl->rows[row]); - o = (khui_credwnd_outline *) cr->data; - - colattr = tbl->cols[cr->col].attr_id; - - if (colattr == KCDB_ATTR_ID_NAME) { - khm_handle ident = o->data; - - kcdb_identity_get_flags(ident, &idf); - } - - selected = o->flags & KHUI_CW_O_SELECTED; - - { - HBRUSH hbr; - if(selected) - hbr = tbl->hb_hdr_bg_sel; - else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_EXPIRED) - hbr = tbl->hb_hdr_bg_exp; - else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_CRITICAL) - hbr = tbl->hb_hdr_bg_crit; - else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_WARN) - hbr = tbl->hb_hdr_bg_warn; - else if (idf & KCDB_IDENT_FLAG_DEFAULT) - hbr = tbl->hb_hdr_bg_def; - else - hbr = tbl->hb_hdr_bg; - - FillRect(hdc, r, hbr); - } - - pl = CreatePen(PS_SOLID, 0, tbl->cr_hdr_outline); - pold = SelectObject(hdc, pl); - MoveToEx(hdc, r->left, r->bottom - 1, NULL); - LineTo(hdc,r->right,r->bottom - 1); - SelectObject(hdc, pold); - DeleteObject(pl); - - if (o->flags & KHUI_CW_O_STICKY) { - /* khui_ilist_draw_id(tbl->ilist, IDB_TK_NEW_SM, hdc, - r->left, r->bottom - KHUI_SMICON_CY, 0); */ - } else if((tbl->mouse_state & CW_MOUSE_WOUTLINE) && - tbl->mouse_row == row) { - if(o->flags & KHUI_CW_O_EXPAND) { - khui_ilist_draw_id(tbl->ilist, IDB_WDG_EXPAND_HI, - hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); - } else { - khui_ilist_draw_id(tbl->ilist, IDB_WDG_COLLAPSE_HI, - hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); - } - } else { - if(o->flags & KHUI_CW_O_EXPAND) { - khui_ilist_draw_id(tbl->ilist, IDB_WDG_EXPAND, - hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); - } else { - khui_ilist_draw_id(tbl->ilist, IDB_WDG_COLLAPSE, - hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); - } - } - - r->left += KHUI_SMICON_CX * 3 / 2; - - /* try to draw the icon, if there is one */ - if(colattr == KCDB_ATTR_ID_NAME) { - - khui_ilist_draw_id(tbl->ilist, - (((tbl->mouse_state & CW_MOUSE_WSTICKY) && - tbl->mouse_row == row)? - ((idf & KCDB_IDENT_FLAG_STICKY)? - IDB_WDG_STUCK_HI: - IDB_WDG_STICK_HI): - ((idf & KCDB_IDENT_FLAG_STICKY)? - IDB_WDG_STUCK: - IDB_WDG_STICK)), - hdc, - r->left, r->bottom - KHUI_SMICON_CY, - 0); - - r->left += KHUI_SMICON_CX * 3 / 2; - - khui_ilist_draw_id(tbl->ilist, - ((o->flags & KHUI_CW_O_STICKY)? - IDB_ID_DIS_SM: - IDB_ID_SM), - hdc, - r->left, r->bottom - KHUI_SMICON_CY, - 0); - r->left += KHUI_SMICON_CX * 3 / 2 ; - } - - /* ok, now o->header contains the string representation of the - outline value */ - /* for now just write out the value */ - SetTextAlign(hdc, TA_BOTTOM | TA_LEFT); - - if(selected) - SetTextColor(hdc, tbl->cr_hdr_sel); - else - SetTextColor(hdc, tbl->cr_hdr_normal); - - TextOut(hdc, r->left, r->bottom - tbl->vpad, o->header, (int) wcslen(o->header)); - - if (colattr == KCDB_ATTR_ID_NAME && - (idf & KCDB_IDENT_FLAG_DEFAULT)) { - wchar_t defstr[64]; - SIZE size; - - LoadString(khm_hInstance, IDS_CW_DEFAULT, - defstr, ARRAYLENGTH(defstr)); - - GetTextExtentPoint32(hdc, o->header, (int) wcslen(o->header), - &size); - - r->left += size.cx + KHUI_SMICON_CX * 2; - - TextOut(hdc, r->left, r->bottom - tbl->vpad, - defstr, (int) wcslen(defstr)); - } -} - -LRESULT -cw_handle_header_msg(khui_credwnd_tbl * tbl, LPNMHEADER ph) { - RECT r; - HDITEM hi; - - switch(ph->hdr.code) { - /*TODO:Make it track smoother */ - case HDN_BEGINTRACK: - { - ZeroMemory(&hi, sizeof(hi)); - hi.mask = HDI_ORDER; - Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); - - if(tbl->cols[hi.iOrder].flags & KHUI_CW_COL_FIXED_WIDTH) - return TRUE; - else - return FALSE; - } - - case HDN_TRACK: - case HDN_ENDTRACK: - { - int width; - hi.mask = HDI_ORDER; - Header_GetItem(ph->hdr.hwndFrom, ph->iItem, &hi); - Header_GetItemRect(ph->hdr.hwndFrom, ph->iItem, &r); - width = r.right - r.left; - if(width != tbl->cols[hi.iOrder].width) { - tbl->cols[hi.iOrder].width = width; - cw_update_extents(tbl, TRUE); - InvalidateRect(tbl->hwnd, NULL, FALSE); - } - } - break; - - case HDN_BEGINDRAG: - { - - ZeroMemory(&hi, sizeof(hi)); - hi.mask = HDI_ORDER; - Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); - - if (tbl->cols[hi.iOrder].flags & KHUI_CW_COL_FIXED_WIDTH) { - return TRUE; - } else { - return FALSE; - } - } - break; - - case HDN_ENDDRAG: - { - int drag_start_index; - int drag_end_index; - int i; - khui_credwnd_col tcol; - int sort_index = 0; - khm_int32 old_flags; - - if (ph->pitem == NULL) - return TRUE; - - hi.mask = HDI_ORDER; - Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); - drag_start_index = hi.iOrder; - drag_end_index = ph->pitem->iOrder; - - /* the user dragged the column which was at drag_start_index - to drag_end_index. */ - - if (drag_end_index == drag_start_index) - return TRUE; - - /* we don't allow dragging in to the "fixed" area. */ - for (i=0; i < tbl->n_cols; i++) { - if (tbl->cols[i].attr_id >= 0) - break; - } - - if (drag_end_index <= i) - return TRUE; - - tcol = tbl->cols[drag_start_index]; - if (drag_end_index < drag_start_index) { - MoveMemory(&tbl->cols[drag_end_index + 1], - &tbl->cols[drag_end_index], - sizeof(tbl->cols[0]) * - (drag_start_index - drag_end_index)); - } else { - MoveMemory(&tbl->cols[drag_start_index], - &tbl->cols[drag_start_index + 1], - sizeof(tbl->cols[0]) * - (drag_end_index - drag_start_index)); - } - tbl->cols[drag_end_index] = tcol; - - old_flags = tbl->cols[drag_end_index].flags; - - if (drag_end_index < tbl->n_cols - 1) { - khm_int32 tflags = tbl->cols[drag_end_index + 1].flags; - - if (tflags & KHUI_CW_COL_GROUP) { - tbl->cols[drag_end_index].flags |= KHUI_CW_COL_GROUP; - } - - if ((tflags & (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC)) && - !(old_flags & (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC))) - tbl->cols[drag_end_index].flags |= KHUI_CW_COL_SORT_INC; - } - - if (drag_end_index > 0) { - khm_int32 tflags = tbl->cols[drag_end_index - 1].flags; - - if (!(tflags & KHUI_CW_COL_GROUP)) - tbl->cols[drag_end_index].flags &= ~KHUI_CW_COL_GROUP; - - if (!(tflags & (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC))) - tbl->cols[drag_end_index].flags &= - ~(KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC); - } - - if (old_flags != tbl->cols[drag_end_index].flags) { - cw_hditem_from_tbl_col(&tbl->cols[drag_end_index], &hi); - hi.mask = HDI_FORMAT; - Header_SetItem(tbl->hwnd_header, ph->iItem, &hi); - } - - if ((old_flags ^ tbl->cols[drag_end_index].flags) & - KHUI_CW_COL_GROUP) - tbl->flags |= KHUI_CW_TBL_COL_DIRTY; - - for (i=0; i < tbl->n_cols; i++) { - if (tbl->cols[i].attr_id < 0) - continue; - - if (tbl->cols[i].flags & - (KHUI_CW_COL_GROUP | - KHUI_CW_COL_SORT_INC | - KHUI_CW_COL_SORT_DEC)) - tbl->cols[i].sort_index = sort_index++; - else - break; - } - - tbl->flags |= KHUI_CW_TBL_CUSTVIEW; - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - InvalidateRect(tbl->hwnd, NULL, FALSE); - - return FALSE; - } - break; - - case HDN_ITEMCLICK: - { - int idx; - int hidx; - - hi.mask = HDI_ORDER; - Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); - idx = hi.iOrder; - - if (idx == 0 || idx >= tbl->n_cols) - return FALSE; - - if (tbl->cols[idx].flags & - (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC)) { - - tbl->cols[idx].flags ^= - (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC); - - cw_hditem_from_tbl_col(&tbl->cols[idx], &hi); - hi.mask = HDI_FORMAT; - Header_SetItem(tbl->hwnd_header, ph->iItem, &hi); - - } else { - int i; - int sort_idx = 0; - - for (i=0; i <= idx; i++) { - if (tbl->cols[i].attr_id < 0) - continue; - - if (!(tbl->flags & - (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC))) { - tbl->cols[i].flags |= KHUI_CW_COL_SORT_INC; - - cw_hditem_from_tbl_col(&tbl->cols[i], &hi); - hi.mask = HDI_FORMAT; - hidx = Header_OrderToIndex(tbl->hwnd_header, i); - Header_SetItem(tbl->hwnd_header, hidx, &hi); - } - - tbl->cols[i].sort_index = sort_idx++; - } - } - - tbl->flags |= KHUI_CW_TBL_CUSTVIEW; - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - InvalidateRect(tbl->hwnd, NULL, FALSE); - - } - break; - - case HDN_ITEMDBLCLICK: - { - int idx; - int hidx; - - hi.mask = HDI_ORDER; - Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); - idx = hi.iOrder; - - if (idx == 0 || idx >= tbl->n_cols) - return FALSE; - - if (tbl->cols[idx].flags & KHUI_CW_COL_GROUP) { - /* we are removing grouping from this level */ - - int i; - - for (i=idx; i < tbl->n_cols; i++) { - if (!(tbl->cols[i].flags & KHUI_CW_COL_GROUP)) - break; - - tbl->cols[i].flags &= ~KHUI_CW_COL_GROUP; - - cw_hditem_from_tbl_col(&tbl->cols[idx], &hi); - hi.mask = HDI_FORMAT; - hidx = Header_OrderToIndex(tbl->hwnd_header, i); - Header_SetItem(tbl->hwnd_header, hidx, &hi); - } - -#if 0 - } else if (tbl->cols[idx].flags & - (KHUI_CW_COL_SORT_INC | - KHUI_CW_COL_SORT_DEC)) { - int i; - - /* remove the sort condition from a column */ - - for (i=idx; i < tbl->n_cols; i++) { - if (!tbl->cols[i].flags & - (KHUI_CW_COL_SORT_INC | - KHUI_CW_COL_SORT_DEC)) - break; - - tbl->cols[i].flags &= - ~(KHUI_CW_COL_SORT_INC | - KHUI_CW_COL_SORT_DEC); - - cw_hditem_from_tbl_col(&tbl->cols[idx], &hi); - hi.mask = HDI_FORMAT; - hidx = Header_OrderToIndex(tbl->hwnd_header, i); - Header_SetItem(tbl->hwnd_header, hidx, &hi); - } -#endif - } else { - int i; - int sort_index = 0; - - for (i=0; i <= idx; i++) { - if (tbl->cols[i].attr_id < 0) - continue; - - if (!(tbl->cols[i].flags & KHUI_CW_COL_GROUP)) { - tbl->cols[i].flags |= KHUI_CW_COL_GROUP; - - if (!(tbl->cols[i].flags & - (KHUI_CW_COL_SORT_INC | - KHUI_CW_COL_SORT_DEC))) - tbl->cols[i].flags |= KHUI_CW_COL_SORT_INC; - - cw_hditem_from_tbl_col(&tbl->cols[i], &hi); - hi.mask = HDI_FORMAT; - hidx = Header_OrderToIndex(tbl->hwnd_header, i); - Header_SetItem(tbl->hwnd_header, hidx, &hi); - } - - tbl->cols[i].sort_index = sort_index++; - } - } - - tbl->flags |= KHUI_CW_TBL_COL_DIRTY; - tbl->flags |= KHUI_CW_TBL_CUSTVIEW; - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - InvalidateRect(tbl->hwnd, NULL, FALSE); - } - break; - - case NM_CUSTOMDRAW: - { - LPNMCUSTOMDRAW cd; - int idx; - - cd = (LPNMCUSTOMDRAW) ph; - switch(cd->dwDrawStage) { - case CDDS_PREPAINT: - return CDRF_NOTIFYITEMDRAW; - - case CDDS_ITEMPREPAINT: - return CDRF_NOTIFYPOSTPAINT; - - case CDDS_ITEMPOSTPAINT: - if(cd->lItemlParam == CW_CA_FLAGS) - idx = IDB_WDG_FLAG; - else if(cd->lItemlParam == CW_CA_TYPEICON) - idx = IDB_WDG_CREDTYPE; - else - idx = -1; - - khui_ilist_draw_id(tbl->ilist, idx, cd->hdc, cd->rc.left, cd->rc.top, 0); - return 0; - } - } - break; - } - return 0; -} - -LRESULT -cw_wm_create(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - - kmq_subscribe_hwnd(KMSG_CRED, hwnd); - kmq_subscribe_hwnd(KMSG_KCDB, hwnd); - kmq_subscribe_hwnd(KMSG_KMM, hwnd); - - /* freed in cw_wm_destroy */ - tbl = PMALLOC(sizeof(*tbl)); - ZeroMemory(tbl, sizeof(*tbl)); - - /* some versions of VC generate portability warnings for - SetWindowLongPtr */ -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, 0, (LONG_PTR) tbl); -#pragma warning(pop) - - cw_refresh_attribs(hwnd); - - tbl->hwnd_header = CreateWindowEx( - 0, - WC_HEADER, - (LPWSTR) NULL, - WS_CHILD | HDS_BUTTONS | - HDS_FULLDRAG | HDS_HORZ | HDS_HOTTRACK | - HDS_DRAGDROP -#if (_WIN32_WINNT >= 0x501) - | ((IS_COMMCTL6())?HDS_FLAT:0) -#endif - , - 0,0,0,0,hwnd, (HMENU) 0, khm_hInstance, NULL); - - cw_load_view(tbl, NULL /* default view */, hwnd); - cw_insert_header_cols(tbl); - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, FALSE); - - { - RECT rect; - WINDOWPOS pw; - HDLAYOUT hdl; - - hdl.prc = ▭ - hdl.pwpos = &pw; - GetClientRect(hwnd, &rect); - - Header_Layout(tbl->hwnd_header, &hdl); - - SetWindowPos( - tbl->hwnd_header, - pw.hwndInsertAfter, - pw.x, - pw.y, - pw.cx, - pw.cy, - pw.flags | SWP_SHOWWINDOW); - } - - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -LRESULT -cw_wm_destroy(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - - kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); - kmq_unsubscribe_hwnd(KMSG_KCDB, hwnd); - kmq_unsubscribe_hwnd(KMSG_KMM, hwnd); - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - cw_save_view(tbl, NULL); - - cw_unload_view(tbl); - - PFREE(tbl); - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -LRESULT -cw_wm_paint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - HDC hdc; - PAINTSTRUCT ps; - RECT r,rh; - HFONT hf_old = NULL; - int row_s, row_e; - int col_s, col_e; - int i,j,x,y,xs,xe,ys,ye; - int flag_col = -1; - int d_x = -1; - int selected = 0; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - if(!GetUpdateRect(hwnd, &r, FALSE)) - goto _exit; - - hdc = BeginPaint(hwnd, &ps); - if(tbl->hf_normal) - hf_old = SelectFont(hdc, tbl->hf_normal); - SetTextAlign(hdc, TA_LEFT | TA_TOP | TA_NOUPDATECP); - SetBkMode(hdc, TRANSPARENT); - - GetClientRect(hwnd,&r); - r.top += tbl->header_height; - - if(tbl->n_rows) { - /* remove the notification window if there is one */ - if(tbl->hwnd_notif) { - DestroyWindow(tbl->hwnd_notif); - tbl->hwnd_notif = NULL; - } - /* we compute the visible area in terms of rows and columns */ - /* row_s : first visible row */ - /* col_s : first visible column */ - /* row_e : last visible row */ - /* col_e : last visible column */ - /* ys : top edge of first visible row */ - /* xs : left edge of first visible column */ - - /* We *NEED* all the meta columns to be on the left */ - - row_s = tbl->scr_top / tbl->cell_height; - ys = row_s * tbl->cell_height; - row_e = (tbl->scr_top + (r.bottom - r.top)) / tbl->cell_height + 1; - if(row_e > (int) tbl->n_rows) - row_e = (int) tbl->n_rows; - x = 0; - col_s = -1; - col_e = -1; - xs = 0; - for(i=0; i < (int) tbl->n_cols; i++) { - if(col_e == -1 && x >= tbl->scr_left + (r.right - r.left)) { - col_e = i; - } - if(tbl->cols[i].attr_id == CW_CA_FLAGS) - flag_col = i; - if(d_x == -1 && !cw_is_custom_attr(tbl->cols[i].attr_id)) - d_x = x; - x += tbl->cols[i].width; - if(col_s == -1 && x > tbl->scr_left) { - col_s = i; - xs = tbl->cols[i].x; - } - } - - if(col_e == -1) - col_e = i; - - if(col_s == -1) - col_s = i; - - if(d_x != -1) - d_x += r.left - tbl->scr_left; - - xs += r.left - tbl->scr_left; - ys += r.top - tbl->scr_top; - xe = r.left + tbl->ext_width - tbl->scr_left; - ye = r.top + tbl->ext_height - tbl->scr_top; - - /* now draw */ - y = ys; - for(i=row_s; i < row_e; i++) { - selected = tbl->rows[i].flags & KHUI_CW_ROW_SELECTED; - - if(tbl->cursor_row == i) { - if (tbl->rows[i].flags & KHUI_CW_ROW_HEADER) - SelectFont(hdc, tbl->hf_bold_header); - else - SelectFont(hdc, tbl->hf_bold); - } else if (tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { - SelectFont(hdc, tbl->hf_header); - } - - x = xs; - if(tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { - rh.left = xs; - rh.right = xs; - for(j=col_s; j < tbl->rows[i].col; j++) - rh.right += tbl->cols[j].width; - rh.top = y; - rh.bottom = y + tbl->cell_height; - if(rh.right > rh.left) { - cw_erase_rect(hdc, tbl, &r, &rh, (selected)?CW_ER_SEL:CW_ER_BLANK); - } - rh.left = rh.right; - rh.right = xe; - - cw_draw_header(hdc, tbl, i, &rh); - } - - if(selected) - SetTextColor(hdc, tbl->cr_sel); - else - SetTextColor(hdc, tbl->cr_normal); - - x = xs; - rh.top = y; - rh.bottom = y + tbl->cell_height; - for(j=col_s; j < col_e; x += tbl->cols[j++].width) { - wchar_t buf[256]; - khm_size cbbuf; - - rh.left = x; - rh.right = x + tbl->cols[j].width; - - if(!RectVisible(hdc, &rh)) - continue; - - if(!cw_is_custom_attr(tbl->cols[j].attr_id)) { - if(!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { - cw_erase_rect(hdc, tbl, &r, &rh, (selected)?CW_ER_SEL:CW_ER_BLANK); - - if(j > tbl->rows[i].col) { - cbbuf = sizeof(buf); - if(KHM_FAILED(kcdb_cred_get_attr_string((khm_handle) tbl->rows[i].data, - tbl->cols[j].attr_id, buf, - &cbbuf, KCDB_TS_SHORT))) - continue; - - rh.left += tbl->hpad; - rh.right -= tbl->hpad; - - SetTextAlign(hdc, 0); - DrawText(hdc, buf, (int)((cbbuf / sizeof(wchar_t)) - 1), &rh, - DT_LEFT | DT_VCENTER | DT_NOCLIP | DT_SINGLELINE | DT_END_ELLIPSIS); - //TextOut(hdc, x, y + tbl->vpad, buf, (cbbuf / sizeof(wchar_t)) - 1); - } - } - } else { - cw_erase_rect(hdc, tbl, &r, &rh, (selected)?CW_ER_SEL:CW_ER_BLANK); - - if(tbl->cols[j].attr_id == CW_CA_FLAGS) { - khui_credwnd_outline * o; - khm_int32 flag; - - if(tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { - o = ((khui_credwnd_outline *) tbl->rows[i].data); - if(o->flags & KHUI_CW_O_SHOWFLAG) - flag = o->flags; - else - flag = 0; - } else { - flag = tbl->rows[i].flags; - } - - flag &= CW_EXPSTATE_MASK; - - if(flag == CW_EXPSTATE_WARN) { - khui_ilist_draw_id(tbl->ilist, IDB_FLAG_WARN, hdc, x, y, 0); - } else if(flag == CW_EXPSTATE_CRITICAL) { - khui_ilist_draw_id(tbl->ilist, IDB_FLAG_CRITICAL, hdc, x, y, 0); - } else if(flag == CW_EXPSTATE_EXPIRED) { - khui_ilist_draw_id(tbl->ilist, IDB_FLAG_EXPIRED, hdc, x, y, 0); - } else if(!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { - khm_int32 flags; - - if (KHM_SUCCEEDED(kcdb_cred_get_flags((khm_handle) tbl->rows[i].data, &flags)) && - (flags & KCDB_CRED_FLAG_RENEWABLE)) { - khui_ilist_draw_id(tbl->ilist, - IDB_FLAG_RENEW, - hdc, - x, y, 0); - } else { - khui_ilist_draw_id(tbl->ilist, - IDB_TK_SM, - hdc, - x, y, 0); - } - } - } - } - } - - if(tbl->cursor_row == i) { - rh.left = tbl->scr_left; - rh.right = tbl->scr_left + tbl->ext_width; - DrawFocusRect(hdc, &rh); - } - - if (tbl->cursor_row == i || - (tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { - SelectFont(hdc, tbl->hf_normal); - } - - y += tbl->cell_height; - - } - - if(xe < r.right) { - rh.left = xe; - rh.right = r.right; - rh.top = r.top; - rh.bottom = r.bottom; - - cw_erase_rect(hdc, tbl, &r, &rh, CW_ER_BLANK); - } - - if(ye < r.bottom) { - rh.left = r.left; - rh.right = (xe < r.right)?xe:r.right; - rh.top = ye; - rh.bottom = r.bottom; - - cw_erase_rect(hdc, tbl, &r, &rh, CW_ER_BLANK); - } - - } else { - wchar_t buf[512]; - cw_erase_rect(hdc, tbl, &r, &r, CW_ER_BLANK); - - if(tbl->hwnd_notif == NULL) { - LoadString(khm_hInstance, IDS_NO_CREDS, buf, sizeof(buf)/sizeof(buf[0])); - tbl->hwnd_notif = khm_create_htwnd( - tbl->hwnd, - buf, - r.left,r.top,r.right - r.left,(r.bottom - r.top) /2, - WS_EX_TRANSPARENT, - WS_VISIBLE); - if(tbl->hwnd_notif) { - SendMessage(tbl->hwnd_notif, WM_SETFONT, (WPARAM) tbl->hf_normal, (LPARAM) FALSE); - ShowWindow(tbl->hwnd_notif, SW_SHOW); - } - } - } - - if(tbl->hf_normal) - SelectFont(hdc, hf_old); - - EndPaint(hwnd,&ps); -_exit: - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -LRESULT -cw_wm_size(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - RECT rect; - khui_credwnd_tbl * tbl; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - cw_update_extents(tbl, TRUE); - - GetClientRect(hwnd, &rect); - - if(tbl->hwnd_notif) { - SetWindowPos( - tbl->hwnd_notif, - tbl->hwnd_header, - rect.left, - tbl->header_height, - rect.right - rect.left, - (rect.bottom - tbl->header_height) / 2, - 0); - } - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -LRESULT -cw_wm_notify(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - LPNMHDR pnmh; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - pnmh = (LPNMHDR) lParam; - if(pnmh->hwndFrom == tbl->hwnd_header) { - LPNMHEADER ph; - ph = (LPNMHEADER) lParam; - return cw_handle_header_msg(tbl, ph); - } - - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -static void cw_pp_begin(khui_property_sheet * s); -static void cw_pp_precreate(khui_property_sheet * s); -static void cw_pp_end(khui_property_sheet * s); -static void cw_pp_destroy(khui_property_sheet *ps); - -LRESULT -cw_kmq_wm_dispatch(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - kmq_message * m; - khm_int32 rv = KHM_ERROR_SUCCESS; - khui_credwnd_tbl * tbl; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - kmq_wm_begin(lParam, &m); - - if(m->type == KMSG_CRED) { - switch (m->subtype) { - case KMSG_CRED_ROOTDELTA: - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - InvalidateRect(hwnd, NULL, FALSE); - break; - - case KMSG_CRED_PP_BEGIN: - cw_pp_begin((khui_property_sheet *) m->vparam); - break; - - case KMSG_CRED_PP_PRECREATE: - cw_pp_precreate((khui_property_sheet *) m->vparam); - break; - - case KMSG_CRED_PP_END: - cw_pp_end((khui_property_sheet *) m->vparam); - break; - - case KMSG_CRED_PP_DESTROY: - cw_pp_destroy((khui_property_sheet *) m->vparam); - break; - } - } else if (m->type == KMSG_KCDB) { - if (m->subtype == KMSG_KCDB_IDENT && - m->uparam == KCDB_OP_MODIFY) { - - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - InvalidateRect(hwnd, NULL, FALSE); - } - else if (m->subtype == KMSG_KCDB_IDENT && - m->uparam == KCDB_OP_NEW_DEFAULT) { - - InvalidateRect(hwnd, NULL, FALSE); - } - else if (m->subtype == KMSG_KCDB_ATTRIB && - (m->uparam == KCDB_OP_INSERT || - m->uparam == KCDB_OP_DELETE)) { - cw_refresh_attribs(hwnd); - } - } else if (m->type == KMSG_KMM && - m->subtype == KMSG_KMM_I_DONE) { - - if (tbl->flags & KHUI_CW_TBL_COLSKIP) { - wchar_t cname[KCONF_MAXCCH_NAME]; - khm_size cb; - - cname[0] = L'\0'; - - if (tbl->csp_view) { - cb = sizeof(cname); - khc_get_config_space_name(tbl->csp_view, - cname, - &cb); - } - - cw_unload_view(tbl); - - cw_load_view(tbl, ((cname[0])?cname: NULL), hwnd); - cw_insert_header_cols(tbl); - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - } - - } else if (m->type == KMSG_ACT && - m->subtype == KMSG_ACT_ACTIVATE) { - /* a column selector menu item was activated */ - - khm_int32 attr_id; - khm_int32 action; - khui_action * paction; - int i; - int first_non_fixed = -1; - - action = m->uparam; - paction = khui_find_action(action); - - if (paction == NULL) - goto _skip_action; - - attr_id = (khm_int32)(INT_PTR) paction->data; - - if (attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) - goto _skip_action; - - for (i=0; i < tbl->n_cols; i++) { - if (tbl->cols[i].attr_id >= 0 && - first_non_fixed == -1) - first_non_fixed = i; - - if (tbl->cols[i].attr_id == attr_id) - break; - } - - if (first_non_fixed == i && - i == tbl->n_cols - 1) { - /* this is the only non-fixed column. We don't allow - deleting it, althoguh there's nothing wrong with doing - so other than not being very useful. */ - goto _skip_action; - } - - if (i < tbl->n_cols) { - khm_int32 sort_index; - - /* we need to remove a column */ - - Header_DeleteItem(tbl->hwnd_header, i); - sort_index = tbl->cols[i].sort_index; - - if (tbl->cols[i].title) - PFREE(tbl->cols[i].title); - tbl->cols[i].title = NULL; - - if (i < tbl->n_cols - 1) { - MoveMemory(&tbl->cols[i], &tbl->cols[i+1], - sizeof(tbl->cols[0]) * (tbl->n_cols - (i + 1))); - } - tbl->n_cols--; - - /* fix the sort index */ - if (sort_index >= 0) { - for (i=0; i < tbl->n_cols; i++) { - if (tbl->cols[i].sort_index > sort_index) - tbl->cols[i].sort_index--; - } - } - - tbl->flags |= KHUI_CW_TBL_COL_DIRTY; - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - - khui_check_action(attr_to_action[attr_id], FALSE); - - tbl->flags |= KHUI_CW_TBL_CUSTVIEW; - - } else { - /* we need to add a column */ - wchar_t buf[KCDB_MAXCCH_SHORT_DESC]; - khm_size cb; - khm_int32 idx = tbl->n_cols; - HDITEM hi; - - /* for now, we only allow KHUI_CW_COL_INITIAL columns */ - if (tbl->n_rows == tbl->n_total_rows) - goto _skip_action; - - cb = sizeof(buf); - if (KHM_FAILED(kcdb_attrib_describe(attr_id, - buf, - &cb, - KCDB_TS_SHORT))) - goto _skip_action; - - tbl->cols[idx].attr_id = attr_id; - tbl->cols[idx].width = 100; - tbl->cols[idx].x = -1; - tbl->cols[idx].flags = 0; - tbl->cols[idx].sort_index = -1; - tbl->cols[idx].title = PMALLOC(cb); -#ifdef DEBUG - assert(tbl->cols[idx].title); -#endif - if (!tbl->cols[idx].title) - goto _skip_action; - - StringCbCopy(tbl->cols[idx].title, - cb, - buf); - - tbl->n_cols++; - - cw_hditem_from_tbl_col(&(tbl->cols[idx]), &hi); - Header_InsertItem(tbl->hwnd_header, 512, &hi); - - tbl->flags |= KHUI_CW_TBL_COL_DIRTY; - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - - khui_check_action(attr_to_action[attr_id], TRUE); - - tbl->flags |= KHUI_CW_TBL_CUSTVIEW; - } - - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - - _skip_action: - ; - } - - return kmq_wm_end(m, rv); -} - -static void -cw_select_outline_level(khui_credwnd_outline * o, - BOOL select) -{ - while(o) { - if (select) - o->flags |= KHUI_CW_O_SELECTED; - else - o->flags &= ~KHUI_CW_O_SELECTED; - cw_select_outline_level(TFIRSTCHILD(o), select); - o = LNEXT(o); - } -} - -static void -cw_select_outline(khui_credwnd_outline * o, - BOOL select) -{ - if (select) - o->flags |= KHUI_CW_O_SELECTED; - else - o->flags &= ~KHUI_CW_O_SELECTED; -} - -static void -cw_unselect_all(khui_credwnd_tbl * tbl) -{ - int i; - - for(i=0; in_rows; i++) { - tbl->rows[i].flags &= ~KHUI_CW_ROW_SELECTED; - if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) - kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, - 0, - KCDB_CRED_FLAG_SELECTED); - } - - cw_select_outline_level(tbl->outline, FALSE); -} - -static void -cw_update_outline_selection_state(khui_credwnd_tbl * tbl, - khui_credwnd_outline * o) -{ - BOOL select = TRUE; - int j; - - for (j = o->start + 1; j < o->start + o->length; j++) { - if (tbl->rows[j].flags & KHUI_CW_ROW_HEADER) { - cw_update_outline_selection_state(tbl, - (khui_credwnd_outline *) - tbl->rows[j].data); - } - - if (!(tbl->rows[j].flags & KHUI_CW_ROW_SELECTED)) { - select = FALSE; - } - - if (tbl->rows[j].flags & KHUI_CW_ROW_HEADER) { - j += ((khui_credwnd_outline *) tbl->rows[j].data)->length - 1; - } - } - - /* special case : the header has been collapsed and we are just - using one row. In this case, the for loop above will do - nothing. */ - - if (o->length == 1) { - select = (tbl->rows[o->start].flags & KHUI_CW_ROW_SELECTED); - } - - cw_select_outline(o, select); - - if (select) { - tbl->rows[o->start].flags |= KHUI_CW_ROW_SELECTED; - } else { - tbl->rows[o->start].flags &= ~KHUI_CW_ROW_SELECTED; - } -} - -static void -cw_update_selection_state(khui_credwnd_tbl * tbl) -{ - int i; - - cw_select_outline_level(tbl->outline, FALSE); - - for (i=0; i < tbl->n_rows; i++) { - if (tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { - khui_credwnd_outline * o; - - o = (khui_credwnd_outline *) tbl->rows[i].data; - - cw_update_outline_selection_state(tbl, o); - - i += o->length - 1; - } - } -} - -/* Examine the current row and set the UI context */ -static void -cw_set_row_context(khui_credwnd_tbl * tbl, int row) -{ - khui_credwnd_outline * o; - BOOL set_context = TRUE; - - if (row < 0 || row >= (int) tbl->n_rows) { - if (tbl->n_rows > 0) - row = 0; - else { - khui_context_reset(); - return; - } - } - - if (tbl->rows[row].flags & KHUI_CW_ROW_HEADER) { - - o = (khui_credwnd_outline *) tbl->rows[row].data; - - if (tbl->cols[o->col].attr_id == KCDB_ATTR_ID_NAME) { - if (TPARENT(o) == NULL) { /* selected an identity */ - khui_context_set(KHUI_SCOPE_IDENT, - (khm_handle) o->data, - KCDB_CREDTYPE_INVALID, - NULL, - NULL, - 0, - tbl->credset); - } else { - khui_credwnd_outline * op; - - op = TPARENT(o); - - if (tbl->cols[op->col].attr_id == KCDB_ATTR_TYPE_NAME && - TPARENT(op) == NULL) { - /* selected a credential type */ - khui_context_set(KHUI_SCOPE_CREDTYPE, - (khm_handle) o->data, - (khm_int32) (DWORD_PTR) op->data, - NULL, - NULL, - 0, - tbl->credset); - } else { - set_context = FALSE; - } - } - } else if (tbl->cols[o->col].attr_id == KCDB_ATTR_TYPE_NAME) { - if (TPARENT(o) == NULL) { - /* selected an entire cred type */ - khui_context_set(KHUI_SCOPE_CREDTYPE, - NULL, - (khm_int32) (DWORD_PTR) o->data, - NULL, - NULL, - 0, - tbl->credset); - } else { - khui_credwnd_outline * op; - - op = TPARENT(o); - if (tbl->cols[op->col].attr_id == KCDB_ATTR_ID_NAME && - TPARENT(op) == NULL) { - /* credtype under an identity */ - khui_context_set(KHUI_SCOPE_CREDTYPE, - (khm_handle) op->data, - (khm_int32) (DWORD_PTR) o->data, - NULL, - NULL, - 0, - tbl->credset); - } else { - set_context = FALSE; - } - } - } else { - set_context = FALSE; - } - - if (!set_context) { - /* woohoo. cred group. yay. */ - khui_header headers[KHUI_MAX_HEADERS]; - khm_size n_headers = 0; - - do { - headers[n_headers].attr_id = - o->attr_id; - if (tbl->cols[o->col].attr_id == - KCDB_ATTR_ID_NAME) { - headers[n_headers].data = &(o->data); - headers[n_headers].cb_data = sizeof(khm_handle); - } else if (tbl->cols[o->col].attr_id == - KCDB_ATTR_TYPE_NAME) { - headers[n_headers].data = &(o->data); - headers[n_headers].cb_data = sizeof(khm_int32); - } else { - headers[n_headers].data = o->data; - headers[n_headers].cb_data = o->cb_data; - } - - n_headers++; - - o = TPARENT(o); - } while(o); - - khui_context_set(KHUI_SCOPE_GROUP, - NULL, - KCDB_CREDTYPE_INVALID, - NULL, - headers, - n_headers, - tbl->credset); - } - - } else { - khm_handle cred; - - cred = (khm_handle) tbl->rows[row].data; - - khui_context_set(KHUI_SCOPE_CRED, - NULL, - KCDB_CREDTYPE_INVALID, - cred, - NULL, - 0, - tbl->credset); - } -} - -static void -cw_select_all(khui_credwnd_tbl * tbl) -{ - int i; - - for(i=0; in_rows; i++) { - tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; - if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) - kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, - KCDB_CRED_FLAG_SELECTED, - KCDB_CRED_FLAG_SELECTED); - } - - cw_select_outline_level(tbl->outline, TRUE); - - cw_update_selection_state(tbl); - - cw_set_row_context(tbl, tbl->cursor_row); - - InvalidateRect(tbl->hwnd, NULL, FALSE); -} - -static void -cw_select_row(khui_credwnd_tbl * tbl, int row, WPARAM wParam) -{ - int i; - BOOL toggle; - BOOL extend; - int group_begin; - int group_end; - - if (wParam & MK_CONTROL) { - toggle = TRUE; - extend = FALSE; - } else if (wParam & MK_SHIFT) { - toggle = FALSE; - extend = TRUE; - } else { - toggle = FALSE; - extend = FALSE; - } - - if (row < 0 || row >= (int) tbl->n_rows) - return; - - if (tbl->rows[row].flags & KHUI_CW_ROW_HEADER) { - khui_credwnd_outline * o; - - o = (khui_credwnd_outline *) tbl->rows[row].data; - - group_begin = o->start; - group_end = o->start + o->length - 1; - } else { - group_begin = row; - group_end = row; - } - - if (!toggle && !extend) { - /* selecting a single row */ - cw_unselect_all(tbl); - - tbl->cursor_row = row; - tbl->anchor_row = row; - - for (i = group_begin; i <= group_end; i++) { - tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; - if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { - kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, - KCDB_CRED_FLAG_SELECTED, - KCDB_CRED_FLAG_SELECTED); - } - } - } else if (toggle) { - BOOL select; - - tbl->cursor_row = row; - tbl->anchor_row = row; - - select = !(tbl->rows[row].flags & KHUI_CW_ROW_SELECTED); - - for (i = group_begin; i <= group_end; i++) { - if (select) - tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; - else - tbl->rows[i].flags &= ~KHUI_CW_ROW_SELECTED; - - if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { - kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, - (select)?KCDB_CRED_FLAG_SELECTED:0, - KCDB_CRED_FLAG_SELECTED); - } - } - } else if (extend) { - int range_begin; - int range_end; - - cw_unselect_all(tbl); - - range_begin = min(row, tbl->anchor_row); - range_end = max(row, tbl->anchor_row); - - for (i = range_begin; i <= range_end; i++) { - tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; - - if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { - kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, - KCDB_CRED_FLAG_SELECTED, - KCDB_CRED_FLAG_SELECTED); - } - } - - tbl->cursor_row = row; - } - - cw_update_selection_state(tbl); - - cw_set_row_context(tbl, tbl->cursor_row); - - InvalidateRect(tbl->hwnd, NULL, FALSE); -} - -static void -cw_toggle_outline_state(khui_credwnd_tbl * tbl, - khui_credwnd_outline * o) { - - int old_range_begin; - int old_range_end; - int new_range_begin; - int new_range_end; - - old_range_begin = o->start; - old_range_end = o->start + o->length - 1; - - o->flags ^= KHUI_CW_O_EXPAND; - - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - new_range_begin = o->start; - new_range_end = o->start + o->length - 1; - - if (tbl->cursor_row > old_range_end) { - tbl->cursor_row -= old_range_end - new_range_end; - } else if (tbl->cursor_row >= old_range_begin && - tbl->cursor_row <= old_range_end) { - tbl->cursor_row = new_range_begin; - } - - if (tbl->anchor_row > old_range_end) { - tbl->anchor_row -= old_range_end - new_range_end; - } else if (tbl->anchor_row >= old_range_begin && - tbl->anchor_row <= old_range_end) { - tbl->anchor_row = new_range_begin; - } - - InvalidateRect(tbl->hwnd, NULL, TRUE); - -} - -LRESULT cw_properties(HWND hwnd); - -LRESULT -cw_wm_mouse(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - int x,y; - RECT r; - int row; - int col; - int i; - int nm_state,nm_row,nm_col; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - /* we are basically trying to capture events where the mouse is - hovering over one of the 'hotspots'. There are two kinds of - hotspots one is the little widget thinggy that you click on to - expand or collapse an outline. The other is a text cell that - is partially concealed. */ - - x = GET_X_LPARAM(lParam); - y = GET_Y_LPARAM(lParam); - x += tbl->scr_left; - y += tbl->scr_top - tbl->header_height; - - row = y / tbl->cell_height; - col = -1; - nm_state = CW_MOUSE_NONE; - nm_row = nm_col = -1; - - for(i=0; i < (int) tbl->n_cols; i++) { - if(x >= tbl->cols[i].x && - x < tbl->cols[i].x + tbl->cols[i].width) { - col = i; - break; - } - } - - if(wParam & MK_LBUTTON) - nm_state = CW_MOUSE_LDOWN; - - if(row >= 0 && row < (int) tbl->n_rows) { - nm_state |= CW_MOUSE_ROW; - nm_row = row; - nm_col = col; - if(tbl->rows[row].flags & KHUI_CW_ROW_HEADER) { - /* are we on a widget then? */ - x -= tbl->cols[tbl->rows[row].col].x; - if(x >= 0 && x < KHUI_SMICON_CX) /* hit */ { - nm_state |= CW_MOUSE_WOUTLINE | CW_MOUSE_WIDGET; - } else if (tbl->cols[tbl->rows[row].col].attr_id == - KCDB_ATTR_ID_NAME && - col == tbl->rows[row].col && - x >= KHUI_SMICON_CX * 3 / 2 && - x < KHUI_SMICON_CX * 5 / 2){ - nm_state |= CW_MOUSE_WSTICKY | CW_MOUSE_WIDGET; - } else if (tbl->cols[tbl->rows[row].col].attr_id == - KCDB_ATTR_ID_NAME && - col == tbl->rows[row].col && - x >= KHUI_SMICON_CX * 3 && - x < KHUI_SMICON_CX * 4) { - nm_state |= CW_MOUSE_WICON | CW_MOUSE_WIDGET; - } - } - } - - /* did the user drag the cursor off the current row? */ - if((tbl->mouse_state & CW_MOUSE_LDOWN) && - (nm_row != tbl->mouse_row)) { - nm_state &= ~CW_MOUSE_WMASK; - } - - if(!(nm_state & CW_MOUSE_LDOWN) && - (tbl->mouse_state & CW_MOUSE_LDOWN) && - tbl->mouse_row == nm_row) { - - if((nm_state & CW_MOUSE_WOUTLINE) && - (tbl->mouse_state & CW_MOUSE_WOUTLINE)) { - /* click on an outline widget */ - khui_credwnd_outline * o; - - o = (khui_credwnd_outline *) tbl->rows[nm_row].data; - tbl->mouse_state = CW_MOUSE_WIDGET | CW_MOUSE_WOUTLINE; - - cw_toggle_outline_state(tbl, o); - - return 0; - } else if ((nm_state & CW_MOUSE_WSTICKY) && - (tbl->mouse_state & CW_MOUSE_WSTICKY)) { - - khui_credwnd_outline * o; - khm_handle ident; - khm_int32 idf = 0; - - o = tbl->rows[nm_row].data; - ident = o->data; - - kcdb_identity_get_flags(ident, &idf); - idf &= KCDB_IDENT_FLAG_STICKY; - kcdb_identity_set_flags(ident, (idf ^ KCDB_IDENT_FLAG_STICKY), - KCDB_IDENT_FLAG_STICKY); - - tbl->mouse_state = CW_MOUSE_WIDGET | CW_MOUSE_WSTICKY; - - return 0; - } else if ((nm_state & CW_MOUSE_WICON) && - (tbl->mouse_state & CW_MOUSE_WICON)) { - /* click on an row icon */ - cw_select_row(tbl, nm_row, wParam); - cw_properties(hwnd); - } else { - /* click on a row */ - cw_select_row(tbl, nm_row, wParam); - - if (tbl->mouse_col == nm_col && - nm_col >= 0 && - tbl->cols[nm_col].attr_id == CW_CA_FLAGS && - !(tbl->rows[nm_row].flags & KHUI_CW_ROW_HEADER)) { - /* clicked on a cred icon */ - - cw_properties(hwnd); - } - } - } - - /* ok, now if we are changing state, we need to invalidate a few - regions */ - if (((tbl->mouse_state ^ nm_state) & (CW_MOUSE_WIDGET | - CW_MOUSE_WOUTLINE | - CW_MOUSE_WSTICKY)) || - tbl->mouse_row != nm_row) { - - if(tbl->mouse_state & CW_MOUSE_WOUTLINE) { - r.left = tbl->cols[tbl->mouse_col].x - tbl->scr_left; - r.top = tbl->mouse_row * tbl->cell_height + - tbl->header_height - tbl->scr_top; - r.right = r.left + KHUI_SMICON_CX; - r.bottom = r.top + tbl->cell_height; - InvalidateRect(tbl->hwnd, &r, TRUE); - } - if(tbl->mouse_state & CW_MOUSE_WSTICKY) { - r.left = KHUI_SMICON_CX * 3 / 2 + - tbl->cols[tbl->mouse_col].x - tbl->scr_left; - r.top = tbl->mouse_row * tbl->cell_height + - tbl->header_height - tbl->scr_top; - r.right = r.left + KHUI_SMICON_CX; - r.bottom = r.top + tbl->cell_height; - InvalidateRect(tbl->hwnd, &r, TRUE); - } - - if ((tbl->mouse_state & nm_state) & CW_MOUSE_LDOWN) { - if (tbl->mouse_row == nm_row) - tbl->mouse_col = nm_col; - } else { - tbl->mouse_col = nm_col; - tbl->mouse_row = nm_row; - } - tbl->mouse_state = nm_state; - - /* same code block as above */ - if(tbl->mouse_state & CW_MOUSE_WOUTLINE) { - r.left = tbl->cols[tbl->mouse_col].x - tbl->scr_left; - r.top = tbl->mouse_row * tbl->cell_height + - tbl->header_height - tbl->scr_top; - r.right = r.left + KHUI_SMICON_CX; - r.bottom = r.top + tbl->cell_height; - InvalidateRect(tbl->hwnd, &r, TRUE); - } - if(tbl->mouse_state & CW_MOUSE_WSTICKY) { - r.left = KHUI_SMICON_CX * 3 / 2 + - tbl->cols[tbl->mouse_col].x - tbl->scr_left; - r.top = tbl->mouse_row * tbl->cell_height + - tbl->header_height - tbl->scr_top; - r.right = r.left + KHUI_SMICON_CX; - r.bottom = r.top + tbl->cell_height; - InvalidateRect(tbl->hwnd, &r, TRUE); - } - } else if(tbl->mouse_state != nm_state) { - - if ((tbl->mouse_state & nm_state) & CW_MOUSE_LDOWN) { - if (tbl->mouse_row == nm_row) { - tbl->mouse_col = nm_col; - tbl->mouse_state = nm_state; - } - } else { - tbl->mouse_col = nm_col; - tbl->mouse_row = nm_row; - tbl->mouse_state = nm_state; - } - } - - /* if it was a double click, also show the property - window */ - if (uMsg == WM_LBUTTONDBLCLK) { - cw_properties(hwnd); - } - - return 0; -} - -LRESULT -cw_wm_hscroll(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - SCROLLINFO si; - RECT cr; - RECT lr; - RECT sr; - int dx; - int newpos; - - tbl = (khui_credwnd_tbl *) (LONG_PTR) GetWindowLongPtr(hwnd, 0); - GetClientRect(hwnd, &cr); - dx = tbl->scr_left; - - switch(LOWORD(wParam)) { - case SB_LEFT: - newpos = 0; - break; - - case SB_RIGHT: - newpos = tbl->ext_width; - break; - - case SB_LINELEFT: - newpos = tbl->scr_left - (tbl->ext_width / 12); - break; - - case SB_LINERIGHT: - newpos = tbl->scr_left + (tbl->ext_width / 12); - break; - - case SB_PAGELEFT: - newpos = tbl->scr_left - (cr.right - cr.left); - break; - - case SB_PAGERIGHT: - newpos = tbl->scr_left + (cr.right - cr.left); - break; - - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_TRACKPOS; - GetScrollInfo(hwnd, SB_HORZ, &si); - - newpos = si.nTrackPos; - break; - - default: - return DefWindowProc(hwnd, uMsg, wParam, lParam); - } - - //cr.top += tbl->header_height; - tbl->scr_left = newpos; - cw_update_extents(tbl, TRUE); - - dx -= tbl->scr_left; - - /* exclude the watermark */ - lr.bottom = cr.bottom; - lr.right = cr.right; - lr.top = max(cr.bottom - tbl->kbm_logo_shade.cy, cr.top); - lr.left = max(cr.right - tbl->kbm_logo_shade.cx, cr.left); - - if(cr.top < lr.top && cr.left < cr.right) { - sr.left = cr.left; - sr.right = cr.right; - sr.top = cr.top; - sr.bottom = lr.top; - ScrollWindowEx( - hwnd, - dx, - 0, - &sr, - &sr, - NULL, - NULL, - SW_INVALIDATE | SW_SCROLLCHILDREN); - } - - if(cr.left < lr.left && lr.top < lr.bottom) { - sr.left = cr.left; - sr.right = lr.left; - sr.top = lr.top; - sr.bottom = lr.bottom; - ScrollWindowEx( - hwnd, - dx, - 0, - &sr, - &sr, - NULL, - NULL, - SW_INVALIDATE | SW_SCROLLCHILDREN); - } - - if(lr.top < lr.bottom && lr.left < lr.right) { - InvalidateRect(hwnd, &lr, FALSE); - } - - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -static void -cw_vscroll_to_pos(HWND hwnd, khui_credwnd_tbl * tbl, int newpos) { - RECT cr; - RECT sr; - RECT lr; - int dy; - - GetClientRect(hwnd, &cr); - cr.top += tbl->header_height; - dy = tbl->scr_top; - - tbl->scr_top = newpos; - cw_update_extents(tbl, TRUE); - - dy -= tbl->scr_top; - - /* exclude watermark */ - lr.bottom = cr.bottom; - lr.right = cr.right; - lr.top = max(cr.bottom - tbl->kbm_logo_shade.cy, cr.top); - lr.left = max(cr.right - tbl->kbm_logo_shade.cx, cr.left); - - if(cr.left < lr.left && cr.top < cr.bottom) { - sr.left = cr.left; - sr.right = lr.left; - sr.top = cr.top; - sr.bottom = cr.bottom; - ScrollWindowEx( - hwnd, - 0, - dy, - &sr, - &sr, - NULL, - NULL, - SW_INVALIDATE); - } - - if(lr.left < lr.right && cr.top < lr.top) { - sr.left = lr.left; - sr.right = lr.right; - sr.top = cr.top; - sr.bottom = lr.top; - ScrollWindowEx( - hwnd, - 0, - dy, - &sr, - &sr, - NULL, - NULL, - SW_INVALIDATE); - } - - if(lr.top < lr.bottom && lr.left < lr.right) { - InvalidateRect(hwnd, &lr, FALSE); - } -} - -LRESULT -cw_wm_vscroll(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - SCROLLINFO si; - int newpos; - RECT cr; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - GetClientRect(hwnd, &cr); - cr.top += tbl->header_height; - - switch(LOWORD(wParam)) { - case SB_LEFT: - newpos = 0; - break; - - case SB_BOTTOM: - newpos = tbl->ext_height; - break; - - case SB_LINEUP: - newpos = tbl->scr_top - (tbl->ext_height / 12); - break; - - case SB_LINEDOWN: - newpos = tbl->scr_top + (tbl->ext_height / 12); - break; - - case SB_PAGEUP: - newpos = tbl->scr_top - (cr.bottom - cr.top); - break; - - case SB_PAGEDOWN: - newpos = tbl->scr_top + (cr.bottom - cr.top); - break; - - case SB_THUMBTRACK: - case SB_THUMBPOSITION: - ZeroMemory(&si, sizeof(si)); - si.cbSize = sizeof(si); - si.fMask = SIF_TRACKPOS; - GetScrollInfo(hwnd, SB_VERT, &si); - - newpos = si.nTrackPos; - break; - - default: - return DefWindowProc(hwnd, uMsg, wParam, lParam); - } - - cw_vscroll_to_pos(hwnd, tbl, newpos); - - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -static void -cw_ensure_row_visible(HWND hwnd, khui_credwnd_tbl * tbl, int row) { - RECT r; - int newpos; - - if (row < 0) - row = 0; - else if (row >= (int) tbl->n_rows) - row = (int) tbl->n_rows - 1; - - GetClientRect(hwnd, &r); - r.top += tbl->header_height; - - if (row * tbl->cell_height < tbl->scr_top) { - newpos = row * tbl->cell_height; - } else if ((row + 1) * tbl->cell_height - > tbl->scr_top + (r.bottom - r.top)) { - newpos = ((row + 1) * tbl->cell_height) - (r.bottom - r.top); - } else - return; - - cw_vscroll_to_pos(hwnd, tbl, newpos); -} - -static INT_PTR CALLBACK -cw_pp_ident_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - khui_property_sheet * s; - - switch(uMsg) { - case WM_INITDIALOG: - { - PROPSHEETPAGE * p; - khm_handle ident; - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - khm_size t; - khm_int32 i; - - p = (PROPSHEETPAGE *) lParam; - s = (khui_property_sheet *) p->lParam; - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) s); -#pragma warning(pop) - - ident = s->identity; - - t = sizeof(idname); - kcdb_identity_get_name(ident, idname, &t); - SetDlgItemText(hwnd, IDC_PP_IDNAME, idname); - - kcdb_identity_get_flags(ident, &i); - - CheckDlgButton(hwnd, IDC_PP_IDDEF, - ((i & KCDB_IDENT_FLAG_DEFAULT)?BST_CHECKED: - BST_UNCHECKED)); - - /* if it's default, you can't change it further */ - if (i & KCDB_IDENT_FLAG_DEFAULT) { - EnableWindow(GetDlgItem(hwnd, IDC_PP_IDDEF), FALSE); - } - - CheckDlgButton(hwnd, IDC_PP_IDSEARCH, - ((i & KCDB_IDENT_FLAG_SEARCHABLE)?BST_CHECKED: - BST_UNCHECKED)); - - CheckDlgButton(hwnd, IDC_PP_STICKY, - ((i & KCDB_IDENT_FLAG_STICKY)?BST_CHECKED: - BST_UNCHECKED)); - - khui_property_wnd_set_record(GetDlgItem(hwnd, IDC_PP_PROPLIST), - ident); - } - return TRUE; - - case WM_COMMAND: - s = (khui_property_sheet *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - switch(wParam) { - case MAKEWPARAM(IDC_PP_IDDEF, BN_CLICKED): - /* fallthrough */ - case MAKEWPARAM(IDC_PP_STICKY, BN_CLICKED): - - if (s->status != KHUI_PS_STATUS_NONE) - PropSheet_Changed(s->hwnd, hwnd); - return TRUE; - - case MAKEWPARAM(IDC_PP_CONFIG, BN_CLICKED): - { - khui_config_node cfg_id = NULL; - khui_config_node cfg_ids = NULL; - wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - khm_int32 rv; - - khm_refresh_config(); - - rv = khui_cfg_open(NULL, - L"KhmIdentities", - &cfg_ids); - - if (KHM_FAILED(rv)) - return TRUE; - - cb = sizeof(idname); - if (KHM_SUCCEEDED(kcdb_identity_get_name(s->identity, - idname, - &cb))) { - rv = khui_cfg_open(cfg_ids, - idname, - &cfg_id); - } - - if (cfg_id) - khm_show_config_pane(cfg_id); - else - khm_show_config_pane(cfg_ids); - - if (cfg_ids) - khui_cfg_release(cfg_ids); - if (cfg_id) - khui_cfg_release(cfg_id); - } - return TRUE; - } - return FALSE; - - case WM_NOTIFY: - { - LPPSHNOTIFY lpp; - khm_int32 flags; - - lpp = (LPPSHNOTIFY) lParam; - s = (khui_property_sheet *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - switch(lpp->hdr.code) { - case PSN_APPLY: - flags = 0; - if (IsDlgButtonChecked(hwnd, IDC_PP_STICKY) == BST_CHECKED) - flags |= KCDB_IDENT_FLAG_STICKY; - if (IsDlgButtonChecked(hwnd, IDC_PP_IDDEF) == BST_CHECKED) - flags |= KCDB_IDENT_FLAG_DEFAULT; - - kcdb_identity_set_flags(s->identity, flags, - KCDB_IDENT_FLAG_STICKY | - KCDB_IDENT_FLAG_DEFAULT); - return TRUE; - - case PSN_RESET: - kcdb_identity_get_flags(s->identity, &flags); - - CheckDlgButton(hwnd, - IDC_PP_IDDEF, - ((flags & KCDB_IDENT_FLAG_DEFAULT)?BST_CHECKED: - BST_UNCHECKED)); - - /* if it's default, you can't change it further */ - if (flags & KCDB_IDENT_FLAG_DEFAULT) { - EnableWindow(GetDlgItem(hwnd, IDC_PP_IDDEF), FALSE); - } - - CheckDlgButton(hwnd, IDC_PP_IDSEARCH, - ((flags & KCDB_IDENT_FLAG_SEARCHABLE)?BST_CHECKED:BST_UNCHECKED)); - - CheckDlgButton(hwnd, IDC_PP_STICKY, - ((flags & KCDB_IDENT_FLAG_STICKY)?BST_CHECKED:BST_UNCHECKED)); - return TRUE; - } - } - break; - } - return FALSE; -} - -static INT_PTR CALLBACK -cw_pp_cred_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam - ) -{ - switch(uMsg) { - case WM_INITDIALOG: - { - khui_property_sheet * s; - PROPSHEETPAGE * p; - khm_handle cred; - - p = (PROPSHEETPAGE *) lParam; - s = (khui_property_sheet *) p->lParam; - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) s); -#pragma warning(pop) - - cred = s->cred; - - khui_property_wnd_set_record( - GetDlgItem(hwnd, IDC_PP_CPROPLIST), - cred); - } - return TRUE; - } - return FALSE; -} - -static void -cw_pp_begin(khui_property_sheet * s) -{ - PROPSHEETPAGE *p; - - if(s->identity) { - p = PMALLOC(sizeof(*p)); - ZeroMemory(p, sizeof(*p)); - - p->dwSize = sizeof(*p); - p->dwFlags = 0; - p->hInstance = khm_hInstance; - p->pszTemplate = MAKEINTRESOURCE(IDD_PP_IDENT); - p->pfnDlgProc = cw_pp_ident_proc; - p->lParam = (LPARAM) s; - - khui_ps_add_page(s, KHUI_PPCT_IDENTITY, 129, p, NULL); - } - - if(s->cred) { - p = PMALLOC(sizeof(*p)); - ZeroMemory(p, sizeof(*p)); - - p->dwSize = sizeof(*p); - p->dwFlags = 0; - p->hInstance = khm_hInstance; - p->pszTemplate = MAKEINTRESOURCE(IDD_PP_CRED); - p->pfnDlgProc = cw_pp_cred_proc; - p->lParam = (LPARAM) s; - - khui_ps_add_page(s, KHUI_PPCT_CREDENTIAL, 128, p, NULL); - } -} - -static void -cw_pp_precreate(khui_property_sheet * s) -{ - khui_ps_show_sheet(khm_hwnd_main, s); - - khm_add_property_sheet(s); -} - -static void -cw_pp_end(khui_property_sheet * s) -{ - khui_property_page * p = NULL; - - khui_ps_find_page(s, KHUI_PPCT_IDENTITY, &p); - if(p) { - PFREE(p->p_page); - p->p_page = NULL; - } - - p = NULL; - - khui_ps_find_page(s, KHUI_PPCT_CREDENTIAL, &p); - if(p) { - PFREE(p->p_page); - p->p_page = NULL; - } -} - -static void -cw_pp_destroy(khui_property_sheet *ps) -{ - if(ps->ctx.scope == KHUI_SCOPE_CRED) { - if(ps->header.pszCaption) - PFREE((LPWSTR) ps->header.pszCaption); - } - - khui_context_release(&ps->ctx); - - khui_ps_destroy_sheet(ps); - - /* this is pretty weird because ps gets freed when - khui_ps_destroy_sheet() is called. However, since destroying - ps involves sending a WM_DESTROY message to the property sheet, - we still need to keep it on the property sheet chain (or else - the messages will not be delivered). This is only safe because - we are not relinquishing the thread in-between destroying ps - and removing it from the chain. */ - - /* TODO: fix this */ - khm_del_property_sheet(ps); -} - -LRESULT -cw_properties(HWND hwnd) -{ - /* show a property sheet of some sort */ - khui_action_context ctx; - khui_property_sheet * ps; - khui_credwnd_tbl * tbl; - - khui_context_get(&ctx); - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - if(ctx.scope == KHUI_SCOPE_NONE) { - khui_context_release(&ctx); - return FALSE; - - /* While it seems like a good idea, doing this is not */ -#if 0 - /* try to establish a context based on the current cursor - position */ - if(tbl->cursor_row >= 0 && tbl->cursor_row < (int) tbl->n_rows) { - if(tbl->rows[tbl->cursor_row].flags & KHUI_CW_ROW_HEADER) { - if(tbl->cols[tbl->rows[tbl->cursor_row].col].attr_id == KCDB_ATTR_ID_NAME) { - /* identity context */ - ctx.ctx = KHUI_SCOPE_IDENT; - ctx.identity = (khm_handle) - ((khui_credwnd_outline *) tbl->rows[tbl->cursor_row].data)->data; - } else if(tbl->cols[tbl->rows[tbl->cursor_row].col].attr_id == KCDB_ATTR_TYPE_NAME) { - ctx.ctx = KHUI_SCOPE_CREDTYPE; - ctx.cred_type = (khm_int32) (DWORD_PTR) - ((khui_credwnd_outline *) tbl->rows[tbl->cursor_row].data)->data; - } else { - ctx.ctx = KHUI_SCOPE_GROUP; - //ctx.parm = (khm_lparm) tbl->rows[tbl->cursor_row].data; - /* TODO: Figure out method of establishing a credgroup */ - } - } else { - /* a credential context */ - ctx.ctx = KHUI_SCOPE_CRED; - ctx.cred = (khm_handle) tbl->rows[tbl->cursor_row].data; - } - } -#endif - } - - /* if still no context, then we can't show a property sheet */ - if(ctx.scope == KHUI_SCOPE_NONE) { - khui_context_release(&ctx); - return FALSE; - } - - khui_ps_create_sheet(&ps); - - if(ctx.scope == KHUI_SCOPE_IDENT) { - khm_handle ident; - khm_size t; - - ident = ctx.identity; - - ps->header.hInstance = khm_hInstance; - ps->header.pszIcon = MAKEINTRESOURCE(IDI_MAIN_APP); - - kcdb_identity_get_name(ident, NULL, &t); - - if(t > 0) { - ps->header.pszCaption = PMALLOC(t); - kcdb_identity_get_name(ident, - (wchar_t *) ps->header.pszCaption, &t); - } else { - ps->header.pszCaption = NULL; - } - - ps->ctx = ctx; - ps->identity = ident; - ps->credtype = KCDB_CREDTYPE_INVALID; - - kmq_post_message(KMSG_CRED, KMSG_CRED_PP_BEGIN, 0, (void *) ps); - - } else if(ctx.scope == KHUI_SCOPE_CREDTYPE) { - khm_size t = 0; - khm_int32 cred_type; - - cred_type = ctx.cred_type; - - ps->header.hInstance = khm_hInstance; - ps->header.pszIcon = MAKEINTRESOURCE(IDI_MAIN_APP); - - ps->ctx = ctx; - ps->credtype = cred_type; - - if(ctx.identity) { - ps->identity = ctx.identity; - /* also, if there is an associated identity, we assume that - the properties are for the specified credentials type - specific to the identity. Hence we change the title to - something else */ - kcdb_identity_get_name(ctx.identity, NULL, &t); - if (t > 0) { - ps->header.pszCaption = PMALLOC(t); - kcdb_identity_get_name(ctx.identity, (wchar_t *) ps->header.pszCaption, &t); - } else { - ps->header.pszCaption = NULL; - } - } else { - kcdb_credtype_describe(cred_type, NULL, &t, KCDB_TS_LONG); - if(t > 0) { - ps->header.pszCaption = PMALLOC(t); - kcdb_credtype_describe(cred_type, (wchar_t *) ps->header.pszCaption, &t, KCDB_TS_LONG); - } else { - ps->header.pszCaption = NULL; - } - } - - kmq_post_message(KMSG_CRED, KMSG_CRED_PP_BEGIN, 0, (void *) ps); - } else if(ctx.scope == KHUI_SCOPE_CRED) { - khm_handle cred; - khm_size t; - - cred = ctx.cred; - - ps->header.hInstance = khm_hInstance; - ps->header.pszIcon = MAKEINTRESOURCE(IDI_MAIN_APP); - ps->ctx = ctx; - - kcdb_cred_get_name(cred, NULL, &t); - ps->header.pszCaption = PMALLOC(t); - kcdb_cred_get_name(cred, (LPWSTR) ps->header.pszCaption, &t); - - kcdb_cred_get_identity(cred, &ps->identity); - kcdb_cred_get_type(cred, &ps->credtype); - ps->cred = cred; - - kmq_post_message(KMSG_CRED, KMSG_CRED_PP_BEGIN, 0, (void *) ps); - } else { - khui_context_release(&ctx); - khui_ps_destroy_sheet(ps); - } - - /* by the way, if we are actually opening a property sheet, we - leave ctx held (which is now copied to ps->ctx). it will be - released when the property sheet is destroyed */ - - return TRUE; -} - -LRESULT -cw_wm_command(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - khui_credwnd_tbl * tbl; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - if(HIWORD(wParam) == BN_CLICKED && - LOWORD(wParam) == KHUI_HTWND_CTLID) { - - wchar_t wid[256]; - /* a hyperlink was activated */ - khui_htwnd_link * l; - l = (khui_htwnd_link *) lParam; - StringCchCopyN(wid, ARRAYLENGTH(wid), l->id, l->id_len); - wid[l->id_len] = 0; - - if(!wcscmp(wid, L"NewCreds")) { - PostMessage(khm_hwnd_main, WM_COMMAND, - MAKEWPARAM(KHUI_ACTION_NEW_CRED,0), 0); - } - return TRUE; - } - - switch(LOWORD(wParam)) - { - case KHUI_PACTION_ENTER: - /* enter key is a synonym for the default action, on the - context, which is to lauch a property sheet */ - /* fallthrough */ - case KHUI_ACTION_PROPERTIES: - { - return cw_properties(hwnd); - } - break; - - case KHUI_ACTION_LAYOUT_RELOAD: - { - wchar_t cname[KCONF_MAXCCH_NAME]; - khm_size cb; - - cname[0] = L'\0'; - - if (tbl->csp_view) { - cb = sizeof(cname); - khc_get_config_space_name(tbl->csp_view, - cname, - &cb); - } - - cw_unload_view(tbl); - - cw_load_view(tbl, ((cname[0])?cname: NULL), hwnd); - cw_insert_header_cols(tbl); - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, TRUE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - } - break; - - case KHUI_ACTION_LAYOUT_ID: - { - cw_save_view(tbl, NULL); - cw_unload_view(tbl); - - cw_load_view(tbl, L"ByIdentity", hwnd); - cw_insert_header_cols(tbl); - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, FALSE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), KHUI_ACTION_LAYOUT_ID); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - } - break; - - case KHUI_ACTION_LAYOUT_LOC: - { - cw_save_view(tbl, NULL); - cw_unload_view(tbl); - - cw_load_view(tbl, L"ByLocation", hwnd); - cw_insert_header_cols(tbl); - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, FALSE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_LOC); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - } - break; - - case KHUI_ACTION_LAYOUT_TYPE: - { - cw_save_view(tbl, NULL); - cw_unload_view(tbl); - - cw_load_view(tbl, L"ByType", hwnd); - cw_insert_header_cols(tbl); - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, FALSE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_TYPE); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - } - break; - - case KHUI_ACTION_LAYOUT_CUST: - { - cw_save_view(tbl, NULL); - cw_unload_view(tbl); - - cw_load_view(tbl, L"Custom_0", hwnd); - cw_insert_header_cols(tbl); - - cw_update_creds(tbl); - cw_update_outline(tbl); - cw_update_extents(tbl, FALSE); - - InvalidateRect(tbl->hwnd, NULL, TRUE); - - khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), - KHUI_ACTION_LAYOUT_CUST); - kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); - } - break; - - case KHUI_PACTION_UP: - case KHUI_PACTION_UP_EXTEND: - case KHUI_PACTION_UP_TOGGLE: - { /* cursor up */ - khm_int32 new_row; - WPARAM wp = 0; - - new_row = tbl->cursor_row - 1; - - /* checking both bounds. we make no assumption about the - value of cursor_row before this message */ - if(new_row < 0) - new_row = 0; - if(new_row >= (int) tbl->n_rows) - new_row = (int) tbl->n_rows - 1; - - if (LOWORD(wParam) == KHUI_PACTION_UP) - wp = 0; - else if (LOWORD(wParam) == KHUI_PACTION_UP_EXTEND) - wp = MK_SHIFT; - else if (LOWORD(wParam) == KHUI_PACTION_UP_TOGGLE) - wp = 0; //MK_CONTROL; -#ifdef DEBUG - else - assert(FALSE); -#endif - - cw_select_row(tbl, new_row, wp); - cw_ensure_row_visible(hwnd, tbl, new_row); - } - break; - - case KHUI_PACTION_PGUP_EXTEND: - case KHUI_PACTION_PGUP: - { - khm_int32 new_row; - WPARAM wp; - RECT r; - - if (LOWORD(wParam) == KHUI_PACTION_PGUP_EXTEND) - wp = MK_SHIFT; - else - wp = 0; - - GetClientRect(hwnd, &r); - - new_row = tbl->cursor_row - - ((r.bottom - r.top) - tbl->header_height) / tbl->cell_height; - - if (new_row < 0) - new_row = 0; - if (new_row >= (int) tbl->n_rows) - new_row = (int) tbl->n_rows - 1; - - cw_select_row(tbl, new_row, wp); - cw_ensure_row_visible(hwnd, tbl, new_row); - } - break; - - case KHUI_PACTION_DOWN: - case KHUI_PACTION_DOWN_EXTEND: - case KHUI_PACTION_DOWN_TOGGLE: - { /* cursor down */ - khm_int32 new_row; - WPARAM wp = 0; - - new_row = tbl->cursor_row + 1; - - /* checking both bounds. we make no assumption about the - value of cursor_row before this message */ - if(new_row < 0) - new_row = 0; - if(new_row >= (int) tbl->n_rows) - new_row = (int) tbl->n_rows - 1; - - if (LOWORD(wParam) == KHUI_PACTION_DOWN) - wp = 0; - else if (LOWORD(wParam) == KHUI_PACTION_DOWN_EXTEND) - wp = MK_SHIFT; - else if (LOWORD(wParam) == KHUI_PACTION_DOWN_TOGGLE) - wp = 0; //MK_CONTROL; -#ifdef DEBUG - else - assert(FALSE); -#endif - cw_select_row(tbl, new_row, wp); - cw_ensure_row_visible(hwnd, tbl, new_row); - } - break; - - case KHUI_PACTION_PGDN_EXTEND: - case KHUI_PACTION_PGDN: - { - khm_int32 new_row; - RECT r; - WPARAM wp; - - if (LOWORD(wParam) == KHUI_PACTION_PGDN_EXTEND) - wp = MK_SHIFT; - else - wp = 0; - - GetClientRect(hwnd, &r); - - new_row = tbl->cursor_row + - ((r.bottom - r.top) - tbl->header_height) / tbl->cell_height; - - if (new_row < 0) - new_row = 0; - if (new_row >= (int) tbl->n_rows) - new_row = (int) tbl->n_rows - 1; - - cw_select_row(tbl, new_row, wp); - cw_ensure_row_visible(hwnd, tbl, new_row); - } - break; - - case KHUI_PACTION_SELALL: - { - cw_select_all(tbl); - } - break; - - case KHUI_PACTION_LEFT: - { /* collapse and up*/ - khui_credwnd_outline * o; - int r; - - if(tbl->cursor_row < 0 || tbl->cursor_row >= (int) tbl->n_rows) { - cw_select_row(tbl, 0, 0); - break; - } - - for(r = tbl->cursor_row; - (r >= 0 && !(tbl->rows[r].flags & KHUI_CW_ROW_HEADER)); - r--); - - if(r < 0) - break; - - /* If we were not on a header, we collapse the innermost - outline. Otherwise, we collpase up to the parent - outline level */ - - if(r != tbl->cursor_row) { - o = (khui_credwnd_outline *) tbl->rows[r].data; - - cw_toggle_outline_state(tbl, o); - } else { - o = (khui_credwnd_outline *) tbl->rows[r].data; - - if(o->flags & KHUI_CW_O_EXPAND) { - cw_toggle_outline_state(tbl, o); - } else { - o = TPARENT(o); - if(o) { - cw_toggle_outline_state(tbl, o); - r = o->start; - } else if(r > 0) - r--; - } - } - - cw_select_row(tbl, r, 0); - } - break; - - case KHUI_PACTION_RIGHT: - { /* expand and down*/ - khui_credwnd_outline * o; - int r; - - if(tbl->cursor_row < 0 || - tbl->cursor_row >= (int) tbl->n_rows) { - cw_select_row(tbl, 0, 0); - break; - } - - r = tbl->cursor_row; - - if(tbl->rows[r].flags & KHUI_CW_ROW_HEADER) { - o = (khui_credwnd_outline *) tbl->rows[r].data; - if(!(o->flags & KHUI_CW_O_EXPAND)) { - cw_toggle_outline_state(tbl, o); - } - } - - r++; - if (r >= (int) tbl->n_rows) - r = (int)tbl->n_rows - 1; - - cw_select_row(tbl, r, 0); - } - break; - } - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -LRESULT -cw_wm_contextmenu(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - RECT r; - int x,y; - int row; - khui_credwnd_tbl * tbl; - - tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); - - GetWindowRect(hwnd, &r); - - x = GET_X_LPARAM(lParam); - y = GET_Y_LPARAM(lParam); - - x += tbl->scr_left - r.left; - y += tbl->scr_top - tbl->header_height - r.top; - - if (y < 0) { - /* context menu for header control */ - khm_menu_show_panel(KHUI_MENU_CWHEADER_CTX, - GET_X_LPARAM(lParam), - GET_Y_LPARAM(lParam)); - - return DefWindowProc(hwnd, uMsg, wParam, lParam); - } - - row = y / tbl->cell_height; - - if(row < 0 || row >= (int) tbl->n_rows) - return FALSE; - - cw_set_row_context(tbl, row); - - if((tbl->rows[row].flags & KHUI_CW_ROW_HEADER) && - (tbl->cols[tbl->rows[row].col].attr_id == KCDB_ATTR_ID_NAME)) - { - khm_menu_show_panel(KHUI_MENU_IDENT_CTX, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - //khui_context_reset(); - } else { - khm_menu_show_panel(KHUI_MENU_TOK_CTX, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - //khui_context_reset(); - } - - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -/* copy and paste template */ -#if 0 -LRESULT -cw_wm_msg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} -#endif - -LRESULT CALLBACK -khm_credwnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - switch(uMsg) { - case WM_COMMAND: - return cw_wm_command(hwnd, uMsg, wParam, lParam); - - case WM_CREATE: - return cw_wm_create(hwnd, uMsg, wParam, lParam); - - case WM_DESTROY: - return cw_wm_destroy(hwnd, uMsg, wParam, lParam); - - case WM_ERASEBKGND: - /* we don't bother wasting cycles erasing the background - because the foreground elements completely cover the - client area */ - return TRUE; - - case WM_PAINT: - return cw_wm_paint(hwnd, uMsg, wParam, lParam); - - case WM_SIZE: - return cw_wm_size(hwnd, uMsg, wParam, lParam); - - case WM_NOTIFY: - return cw_wm_notify(hwnd, uMsg, wParam, lParam); - - case WM_HSCROLL: - return cw_wm_hscroll(hwnd, uMsg, wParam, lParam); - - case WM_VSCROLL: - return cw_wm_vscroll(hwnd, uMsg, wParam, lParam); - - case KMQ_WM_DISPATCH: - return cw_kmq_wm_dispatch(hwnd, uMsg, wParam, lParam); - - case WM_LBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_MOUSEMOVE: - case WM_LBUTTONUP: - return cw_wm_mouse(hwnd, uMsg, wParam, lParam); - - case WM_CONTEXTMENU: - return cw_wm_contextmenu(hwnd, uMsg, wParam, lParam); - } - - return DefWindowProc(hwnd,uMsg,wParam,lParam); -} - -void -khm_register_credwnd_class(void) { - WNDCLASSEX wcx; - kcdb_attrib attrib; - khm_int32 attr_id; - - wcx.cbSize = sizeof(wcx); - wcx.style = CS_DBLCLKS | CS_OWNDC; - wcx.lpfnWndProc = khm_credwnd_proc; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = sizeof(LONG_PTR); - wcx.hInstance = khm_hInstance; - wcx.hIcon = NULL; - wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); - wcx.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1); - wcx.lpszMenuName = NULL; - wcx.lpszClassName = KHUI_CREDWND_CLASS_NAME; - wcx.hIconSm = NULL; - - khui_credwnd_cls = RegisterClassEx(&wcx); - - /* while we are at it, register the credwnd attribute type as well, and - obtain the type ID */ - if(KHM_FAILED(kcdb_attrib_get_id(KHUI_CREDWND_FLAG_ATTRNAME, &attr_id))) { - ZeroMemory(&attrib, sizeof(attrib)); - attrib.id = KCDB_ATTR_INVALID; - attrib.flags = KCDB_ATTR_FLAG_HIDDEN; - attrib.type = KCDB_TYPE_INT32; - attrib.name = KHUI_CREDWND_FLAG_ATTRNAME; - - kcdb_attrib_register(&attrib, &attr_id); - } - - khui_cw_flag_id = attr_id; -} - -void -khm_unregister_credwnd_class(void) { - UnregisterClass(MAKEINTATOM(khui_credwnd_cls), khm_hInstance); -} - -HWND -khm_create_credwnd(HWND parent) { - RECT r; - HWND hwnd; - - ZeroMemory(attr_to_action, sizeof(attr_to_action)); - - GetClientRect(parent, &r); - - hwnd = CreateWindowEx - (0, - MAKEINTATOM(khui_credwnd_cls), - L"", - WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL, - r.left, - r.top, - r.right - r.left, - r.bottom - r.top, - parent, - NULL, - khm_hInstance, - NULL); - - return hwnd; -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include +#include + +ATOM khui_credwnd_cls; +khm_int32 khui_cw_flag_id; + +khm_int32 attr_to_action[KCDB_ATTR_MAX_ID + 1]; + +void +khm_set_cw_element_font(wchar_t * name, LOGFONT * pfont) { + khm_handle csp_cw = NULL; + wchar_t * element_name; + + if (name == NULL) + element_name = L"FontBase"; + else + element_name = name; + + if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_WRITE, + &csp_cw))) + return; + + khc_write_binary(csp_cw, element_name, pfont, sizeof(LOGFONT)); + + khc_close_space(csp_cw); +} + +void +khm_get_cw_element_font(HDC hdc, wchar_t * name, BOOL use_default, LOGFONT * pfont) { + khm_handle csp_cw = NULL; + khm_size cb; + wchar_t * element_name; + khm_boolean try_derive = FALSE; + + if (name == NULL) + element_name = L"FontBase"; + else + element_name = name; + + if (use_default) + goto _use_defaults; + + if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", 0, + &csp_cw))) + goto _use_defaults; + + cb = sizeof(LOGFONT); + if (KHM_FAILED(khc_read_binary(csp_cw, element_name, pfont, + &cb)) || + cb != sizeof(LOGFONT)) { + try_derive = TRUE; + } + + if (try_derive) { + cb = sizeof(LOGFONT); + if (!name || + KHM_FAILED(khc_read_binary(csp_cw, L"FontBase", pfont, + &cb)) || + cb != sizeof(LOGFONT)) { + khc_close_space(csp_cw); + goto _use_defaults; + } + + if (!wcscmp(name, L"FontHeaderBold") || + !wcscmp(name, L"FontBold")) { + + pfont->lfWeight = FW_BOLD; + + } + } + + khc_close_space(csp_cw); + + return; + + _use_defaults: + + ZeroMemory(pfont, sizeof(*pfont)); + + if (name == NULL) { + LOGFONT lf = { + -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ + 0,0, /* escapement */ + FW_THIN, + FALSE, + FALSE, + FALSE, + DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, + FF_SWISS, + L"MS Shell Dlg"}; + + *pfont = lf; + + } else if (!wcscmp(name, L"FontHeader")) { + LOGFONT lf = { + -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ + 0,0, /* escapement */ + FW_THIN, + FALSE, + FALSE, + FALSE, + DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, + FF_SWISS, + L"MS Shell Dlg"}; + + *pfont = lf; + + } else if (!wcscmp(name, L"FontHeaderBold")) { + LOGFONT lf = { + -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ + 0,0, /* escapement */ + FW_BOLD, + FALSE, + FALSE, + FALSE, + DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, + FF_SWISS, + L"MS Shell Dlg"}; + + *pfont = lf; + + } else if (!wcscmp(name, L"FontNormal")) { + LOGFONT lf = { + -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ + 0,0, /* escapement */ + FW_THIN, + FALSE, + FALSE, + FALSE, + DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, + FF_SWISS, + L"MS Shell Dlg"}; + + *pfont = lf; + + } else if (!wcscmp(name, L"FontBold")) { + LOGFONT lf = { + -MulDiv(8, GetDeviceCaps(hdc, LOGPIXELSY), 72), 0, /* width/height */ + 0,0, /* escapement */ + FW_BOLD, + FALSE, + FALSE, + FALSE, + DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, + FF_SWISS, + L"MS Shell Dlg"}; + + *pfont = lf; + + } else { +#ifdef DEBUG + assert(FALSE); +#endif + } +} + +void +cw_refresh_attribs(HWND hwnd) { + khm_int32 act; + kcdb_attrib * attrib; + khui_menu_def * menu; + khm_int32 i; + + menu = khui_find_menu(KHUI_MENU_COLUMNS); +#ifdef DEBUG + assert(menu); +#endif + + for (i=0; i <= KCDB_ATTR_MAX_ID; i++) { + if (KHM_FAILED(kcdb_attrib_get_info(i, &attrib))) { + if (attr_to_action[i] != 0) { + /* the action should be removed */ + khui_menu_remove_action(menu, attr_to_action[i]); + khui_action_delete(attr_to_action[i]); + attr_to_action[i] = 0; + } + } else { + if (attr_to_action[i] == 0 && + !(attrib->flags & KCDB_ATTR_FLAG_HIDDEN) && + (attrib->short_desc || attrib->long_desc)) { + /* new action */ + khm_handle sub = NULL; + + kmq_create_hwnd_subscription(hwnd, &sub); + + act = khui_action_create(attrib->name, + (attrib->short_desc? + attrib->short_desc: attrib->long_desc), + NULL, + (void *)(UINT_PTR) i, + KHUI_ACTIONTYPE_TOGGLE, + sub); + + attr_to_action[i] = act; + + khui_menu_insert_action(menu, 5000, act, 0); + } + + kcdb_attrib_release_info(attrib); + } + } +} + +khm_int32 +cw_get_custom_attr_id(wchar_t * s) +{ + if(!wcscmp(s, CW_CANAME_FLAGS)) + return CW_CA_FLAGS; + if(!wcscmp(s, CW_CANAME_TYPEICON)) + return CW_CA_TYPEICON; + return 0; +} + +const wchar_t * +cw_get_custom_attr_string(khm_int32 attr_id) +{ + if (attr_id == CW_CA_FLAGS) + return CW_CANAME_FLAGS; + if (attr_id == CW_CA_TYPEICON) + return CW_CANAME_TYPEICON; + return NULL; +} + +void +cw_save_view(khui_credwnd_tbl * tbl, wchar_t * view_name) { + wchar_t * col_list = NULL; + khm_size cb_col_list; + khm_handle csp_cw = NULL; + khm_handle csp_views = NULL; + khm_handle csp_view = NULL; + khm_handle csp_cols = NULL; + khm_size cb; + int i; + + if (tbl->n_cols == 0) + return; + + cb_col_list = (KCONF_MAXCB_NAME + 1) * tbl->n_cols; + + col_list = PMALLOC(cb_col_list); +#ifdef DEBUG + assert(col_list); +#endif + + if (!col_list) + goto _cleanup; + + multi_string_init(col_list, cb_col_list); + + if (!view_name && (tbl->flags & KHUI_CW_TBL_CUSTVIEW)) { + view_name = L"Custom_0"; + } + + if (view_name) { + if (KHM_FAILED(khc_open_space(NULL, L"CredWindow", + KHM_PERM_READ | KHM_PERM_WRITE, &csp_cw))) + goto _cleanup; + + if (KHM_FAILED(khc_open_space(csp_cw, L"Views", KHM_PERM_READ, &csp_views))) + goto _cleanup; + + if (KHM_FAILED(khc_open_space(csp_views, view_name, + KHM_PERM_WRITE | KHM_FLAG_CREATE, + &csp_view))) + goto _cleanup; + + /* if we are switching to a custom view, then we should mark + that as the default. */ + if (tbl->flags & KHUI_CW_TBL_CUSTVIEW) { + khc_write_string(csp_cw, L"DefaultView", L"Custom_0"); + } + + } else { + csp_view = tbl->csp_view; + } + + if (!csp_view) + goto _cleanup; + + if (KHM_FAILED(khc_open_space(csp_view, L"Columns", + KHM_PERM_WRITE | KHM_FLAG_CREATE, + &csp_cols))) + goto _cleanup; + + for (i=0; i < tbl->n_cols; i++) { + const wchar_t * attr_name; + kcdb_attrib * attrib = NULL; + khm_handle csp_col = NULL; + + if (tbl->cols[i].attr_id < 0) { + attr_name = cw_get_custom_attr_string(tbl->cols[i].attr_id); + } else { + if (KHM_FAILED(kcdb_attrib_get_info(tbl->cols[i].attr_id, + &attrib))) { +#ifdef DEBUG + assert(FALSE); +#endif + goto _clean_col; + } + + attr_name = attrib->name; + } +#ifdef DEBUG + assert(attr_name); +#endif + + cb = cb_col_list; + multi_string_append(col_list, &cb, attr_name); + + if (KHM_FAILED(khc_open_space(csp_cols, attr_name, + KHM_PERM_WRITE | KHM_FLAG_CREATE, + &csp_col))) + goto _clean_col; + + khc_write_int32(csp_col, L"Width", tbl->cols[i].width); + khc_write_int32(csp_col, L"SortIndex", tbl->cols[i].sort_index); + khc_write_int32(csp_col, L"Flags", tbl->cols[i].flags); + + _clean_col: + + if (csp_col) + khc_close_space(csp_col); + + if (attrib) + kcdb_attrib_release_info(attrib); + } + + khc_write_multi_string(csp_view, L"ColumnList", col_list); + + _cleanup: + + if (view_name) { + if (csp_view) + khc_close_space(csp_view); + + if (csp_views) + khc_close_space(csp_views); + + if (csp_cw) + khc_close_space(csp_cw); + } + + if (csp_cols) + khc_close_space(csp_cols); + + if (col_list) + PFREE(col_list); +} + +void +cw_load_view(khui_credwnd_tbl * tbl, wchar_t * view, HWND hwnd) { + khm_handle hc_cw = NULL; + khm_handle hc_vs = NULL; + khm_handle hc_v = NULL; + khm_handle hc_cs = NULL; + khm_handle hc_c = NULL; + wchar_t buf[KCONF_MAXCCH_NAME]; + wchar_t * clist = NULL; + khm_size cbsize; + wchar_t * iter = NULL; + int i; + HDC hdc; + LOGFONT log_font; + + tbl->hwnd = hwnd; + + if(KHM_FAILED(khc_open_space(NULL, L"CredWindow", KHM_PERM_READ | KHM_PERM_WRITE, + &hc_cw))) + return; + + if(KHM_FAILED(khc_open_space(hc_cw, L"Views", KHM_PERM_READ, &hc_vs))) + goto _exit; + + if(!view) { + cbsize = sizeof(buf); + if(KHM_FAILED(khc_read_string(hc_cw, L"DefaultView", buf, &cbsize))) + goto _exit; + view = buf; + + /* in addition, if we are loading the default view, we should + also check the appropriate menu item */ + + if (!wcscmp(view, L"ByIdentity")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_ID); + else if (!wcscmp(view, L"ByLocation")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_LOC); + else if (!wcscmp(view, L"ByType")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_TYPE); + else if (!wcscmp(view, L"Custom_0")) + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_CUST); + + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + } else { + khc_write_string(hc_cw, L"DefaultView", view); + } + + if(KHM_FAILED(khc_open_space(hc_vs, view, KHM_PERM_READ, &hc_v))) + goto _exit; + + tbl->csp_view = hc_v; + + if(KHM_FAILED(khc_open_space(hc_v, L"Columns", KHM_PERM_READ, &hc_cs))) + goto _exit; + + cbsize = 0; + if(khc_read_multi_string(hc_v, L"ColumnList", NULL, &cbsize) != KHM_ERROR_TOO_LONG) + goto _exit; + + /* temporary */ + clist = PMALLOC(cbsize); + + if(KHM_FAILED(khc_read_multi_string(hc_v, L"ColumnList", clist, &cbsize))) + goto _exit; + + tbl->n_cols = (int) multi_string_length_n(clist); + tbl->n_total_cols = UBOUNDSS(tbl->n_cols, + KHUI_CW_COL_INITIAL, KHUI_CW_COL_INCREMENT); + tbl->cols = PMALLOC(sizeof(khui_credwnd_col) * tbl->n_total_cols); + ZeroMemory(tbl->cols, sizeof(khui_credwnd_col) * tbl->n_total_cols); + + tbl->flags &= ~(KHUI_CW_TBL_CUSTVIEW | KHUI_CW_TBL_COLSKIP); + + iter = clist; + i = 0; + while(iter) { + khm_int32 attr_id; + + attr_id = cw_get_custom_attr_id(iter); + if(!attr_id) { + /* a KCDB attribute */ + if(KHM_FAILED(kcdb_attrib_get_id(iter, &attr_id))) { + tbl->flags |= KHUI_CW_TBL_COLSKIP; + goto _skip_col; + } + + if(kcdb_attrib_describe(attr_id, NULL, + &cbsize, KCDB_TS_SHORT) != KHM_ERROR_TOO_LONG || + cbsize == 0) { + tbl->flags |= KHUI_CW_TBL_COLSKIP; + goto _skip_col; + } + + tbl->cols[i].title = PMALLOC(cbsize); + kcdb_attrib_describe(attr_id, tbl->cols[i].title, &cbsize, KCDB_TS_SHORT); + + if (attr_id >= 0 && + attr_id <= KCDB_ATTR_MAX_ID && + attr_to_action[attr_id]) { + khui_check_action(attr_to_action[attr_id], TRUE); + } + + } else { + /* All current custom attributes are represented by icons, + not names */ + tbl->cols[i].title = NULL; + } + + tbl->cols[i].attr_id = attr_id; + + if(KHM_SUCCEEDED(khc_open_space(hc_cs, iter, KHM_PERM_READ, &hc_c))) { + if(KHM_FAILED(khc_read_int32(hc_c, L"Flags", &(tbl->cols[i].flags)))) + tbl->cols[i].flags = 0; + if(KHM_FAILED(khc_read_int32(hc_c, L"Width", &(tbl->cols[i].width)))) + tbl->cols[i].width = 100; + if(KHM_FAILED(khc_read_int32(hc_c, L"SortIndex", + &(tbl->cols[i].sort_index)))) + tbl->cols[i].sort_index = -1; + khc_close_space(hc_c); + hc_c = NULL; + } else { + tbl->cols[i].flags = 0; + tbl->cols[i].width = -1; + tbl->cols[i].sort_index = -1; + } + i++; +_skip_col: + iter = multi_string_next(iter); + } + + /* refresh the menus since we checked a few items */ + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + + /* adjust the number of columns. We may have skipped columns due to + inconsistencies above */ + tbl->n_cols = i; + + /* now that all the columns have been loaded, load the view + parameters */ + if(KHM_FAILED(khc_read_int32(hc_v, L"PaddingHorizontal", &(tbl->hpad)))) + khc_read_int32(hc_cw, L"PaddingHorizontal", &(tbl->hpad)); + if(KHM_FAILED(khc_read_int32(hc_v, L"PaddingVertical", &(tbl->vpad)))) + khc_read_int32(hc_cw, L"PaddingVertical", &(tbl->vpad)); + if(KHM_FAILED(khc_read_int32(hc_v, L"PaddingHeader", &(tbl->hpad_h)))) + khc_read_int32(hc_cw, L"PaddingHeader", &(tbl->hpad_h)); + if(KHM_FAILED(khc_read_int32(hc_v, L"WarnThreshold", &(tbl->threshold_warn)))) + khc_read_int32(hc_cw, L"WarnThreshold", &(tbl->threshold_warn)); + if(KHM_FAILED(khc_read_int32(hc_v, L"CriticalThreshold", + &(tbl->threshold_critical)))) + khc_read_int32(hc_cw, L"CriticalThreshold", + &(tbl->threshold_critical)); + + /* and the font resources and stuff */ + + tbl->flags |= KHUI_CW_TBL_INITIALIZED | KHUI_CW_TBL_COL_DIRTY | KHUI_CW_TBL_ACTIVE; + + /*TODO: the graphics objects should be customizable */ + + hdc = GetWindowDC(hwnd); + + khm_get_cw_element_font(hdc, L"FontHeader", FALSE, &log_font); + tbl->hf_header = CreateFontIndirect(&log_font); + + if(tbl->hf_header && tbl->hwnd_header) + SendMessage(tbl->hwnd_header, WM_SETFONT, (WPARAM) tbl->hf_header, 0); + + khm_get_cw_element_font(hdc, L"FontHeaderBold", FALSE, &log_font); + tbl->hf_bold_header = CreateFontIndirect(&log_font); + + + khm_get_cw_element_font(hdc, L"FontNormal", FALSE, &log_font); + tbl->hf_normal = CreateFontIndirect(&log_font); + + khm_get_cw_element_font(hdc, L"FontBold", FALSE, &log_font); + tbl->hf_bold = CreateFontIndirect(&log_font); + + ReleaseDC(hwnd, hdc); + + khui_bitmap_from_hbmp(&(tbl->kbm_logo_shade), + LoadImage(khm_hInstance, + MAKEINTRESOURCE(IDB_LOGO_SHADE), + IMAGE_BITMAP, + 0, + 0, + LR_DEFAULTCOLOR)); + + tbl->hb_normal = CreateSolidBrush(RGB(255,255,255)); + tbl->hb_grey = CreateSolidBrush(RGB(240,240,240)); + tbl->hb_sel = CreateSolidBrush(RGB(230,230,255)); + tbl->hb_hdr_bg = CreateSolidBrush(RGB(230,230,230)); + tbl->hb_hdr_bg_sel = CreateSolidBrush(RGB(0,0,255)); + tbl->hb_hdr_bg_crit = CreateSolidBrush(RGB(240,133,117)); + tbl->hb_hdr_bg_warn = CreateSolidBrush(RGB(251,199,77)); + tbl->hb_hdr_bg_exp = CreateSolidBrush(RGB(255,144,144)); + tbl->hb_hdr_bg_def = CreateSolidBrush(RGB(186,254,184)); + + tbl->cr_normal = RGB(0,0,0); + tbl->cr_sel = RGB(0,0,0); + tbl->cr_hdr_outline = RGB(0,0,0); + tbl->cr_hdr_normal = RGB(0,0,0); + tbl->cr_hdr_sel = RGB(255,255,255); + + tbl->ilist = khui_create_ilist(KHUI_SMICON_CX, KHUI_SMICON_CY-1, 20, 8, 0); + { + HBITMAP hbm; + +#define ADD_BITMAP(i) \ + hbm = LoadImage(khm_hInstance, MAKEINTRESOURCE(i), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); \ + if(hbm) { \ + khui_ilist_add_masked_id(tbl->ilist, hbm, KHUI_TOOLBAR_BGCOLOR, i); \ + DeleteObject(hbm); \ + } + + ADD_BITMAP(IDB_WDG_COLLAPSE); + ADD_BITMAP(IDB_WDG_EXPAND); + ADD_BITMAP(IDB_ID_SM); + ADD_BITMAP(IDB_ID_DIS_SM); + + ADD_BITMAP(IDB_TK_NEW_SM); + ADD_BITMAP(IDB_TK_REFRESH_SM); + ADD_BITMAP(IDB_WDG_COLLAPSE_HI); + ADD_BITMAP(IDB_WDG_EXPAND_HI); + + ADD_BITMAP(IDB_WDG_FLAG); + ADD_BITMAP(IDB_WDG_CREDTYPE); + ADD_BITMAP(IDB_FLAG_WARN); + ADD_BITMAP(IDB_FLAG_EXPIRED); + + ADD_BITMAP(IDB_FLAG_CRITICAL); + ADD_BITMAP(IDB_FLAG_RENEW); + ADD_BITMAP(IDB_WDG_STUCK); + ADD_BITMAP(IDB_WDG_STUCK_HI); + + ADD_BITMAP(IDB_WDG_STICK); + ADD_BITMAP(IDB_WDG_STICK_HI); + ADD_BITMAP(IDB_TK_SM); + +#undef ADD_BITMAP + } + + tbl->cursor_row = -1; + tbl->scr_left = 0; + tbl->scr_top = 0; + tbl->ext_height = 0; + tbl->ext_width = 0; + +_exit: + if(hc_cw) + khc_close_space(hc_cw); + if(hc_vs) + khc_close_space(hc_vs); + if(hc_cs) + khc_close_space(hc_cs); + if(clist) + PFREE(clist); + /* we leave hc_v held, because tbl->csp_view is the same handle. + We keep that open until the view is unloaded. */ +} + +void +cw_update_creds(khui_credwnd_tbl * tbl) +{ + kcdb_cred_comp_field * fields; + kcdb_cred_comp_order comp_order; + int i; + khm_int32 n; + khm_int32 delta; + khm_handle hc; + khm_int32 flags; + + if(!tbl->credset) { + if(KHM_FAILED(kcdb_credset_create(&(tbl->credset)))) + return; + } + + kcdb_credset_purge(tbl->credset); + + kcdb_identity_refresh_all(); + + kcdb_credset_collect( + tbl->credset, + NULL, + NULL, + KCDB_CREDTYPE_ALL, + &delta); + + /* now we need to figure out how to sort the credentials */ + fields = PMALLOC(sizeof(kcdb_cred_comp_field) * tbl->n_cols); + ZeroMemory(fields, sizeof(kcdb_cred_comp_field) * tbl->n_cols); + + for(i=0, n=0; in_cols; i++) { + if((tbl->cols[i].flags & KHUI_CW_COL_SORT_INC) || + (tbl->cols[i].flags & KHUI_CW_COL_SORT_DEC) || + (tbl->cols[i].flags & KHUI_CW_COL_GROUP)) { + int si; + /* we need to sort by this column */ + si = tbl->cols[i].sort_index; + + if(si < 0 || si >= (int) tbl->n_cols) + { + /* this shouldn't happen */ + tbl->cols[i].flags &= ~(KHUI_CW_COL_SORT_INC | + KHUI_CW_COL_SORT_DEC | + KHUI_CW_COL_GROUP); + continue; + } + + fields[si].attrib = tbl->cols[i].attr_id; + if(tbl->cols[i].flags & KHUI_CW_COL_SORT_DEC) + fields[si].order = KCDB_CRED_COMP_DECREASING; + else + fields[si].order = KCDB_CRED_COMP_INCREASING; + + /* special case. if we are sorting by name, we group + initial tickets before non-initial tickets. + + Also, if we are sorting by credential type name, then + we allow the primary credential type first before + others. */ + + if (fields[si].attrib == KCDB_ATTR_NAME || + fields[si].attrib == KCDB_ATTR_TYPE_NAME) + fields[si].order |= KCDB_CRED_COMP_INITIAL_FIRST; + + if(si >= n) + n = si+1; + } + } + + /* we assume that the sort order is sane */ + /*TODO: don't assume; check if the sort order is sane */ + + comp_order.nFields = n; + comp_order.fields = fields; + + kcdb_credset_sort(tbl->credset, + kcdb_cred_comp_generic, + (void *) &comp_order); + + /* also, if new credentials were added, initialize the UI flag + attribute to 0 */ + if(delta & KCDB_DELTA_ADD) { + khm_size s; + + kcdb_credset_get_size(tbl->credset, &s); + for(i=0;i< (int) s;i++) { + if(KHM_FAILED(kcdb_credset_get_cred(tbl->credset, + (khm_int32) i, &hc))) + continue; /* lost a race */ + if(KHM_FAILED(kcdb_cred_get_attr(hc, khui_cw_flag_id, NULL, + NULL, NULL))) { + flags = 0; + kcdb_cred_set_attr(hc, khui_cw_flag_id, &flags, sizeof(flags)); + } + kcdb_cred_release(hc); + } + } + + if (fields) + PFREE(fields); +} + +void +cw_del_outline(khui_credwnd_outline *o) { + khui_credwnd_outline * c; + if(!o) + return; + + /* the outline object is still in a list */ + if(o->next || o->prev) + return; + + if(o->header) + PFREE(o->header); + + if ((o->flags & KHUI_CW_O_DATAALLOC) && + o->data) + PFREE(o->data); + + if ((o->flags & KHUI_CW_O_STICKY) && + o->data) + kcdb_identity_release((khm_handle) o->data); + + LPOP(&(o->children), &c); + while(c) { + cw_del_outline(c); + LPOP(&(o->children), &c); + } + + PFREE(o); +} + +khui_credwnd_outline * +cw_new_outline_node(wchar_t * heading) { + khui_credwnd_outline * o; + size_t cblen; + + o = PMALLOC(sizeof(khui_credwnd_outline)); + ZeroMemory(o, sizeof(khui_credwnd_outline)); + + if(SUCCEEDED(StringCbLength(heading, KHUI_MAXCB_HEADING, &cblen))) { + cblen += sizeof(wchar_t); + o->header = PMALLOC(cblen); + StringCbCopy(o->header, cblen, heading); + } + + return o; +} + +khm_int32 +cw_get_cred_exp_flags(khui_credwnd_tbl * tbl, khm_handle cred) +{ + khm_int32 flags; + long s; + FILETIME ft; + khm_size cbsize; + + cbsize = sizeof(ft); + if(KHM_FAILED(kcdb_cred_get_attr(cred, KCDB_ATTR_TIMELEFT, NULL, &ft, &cbsize))) + return 0; + + s = FtIntervalToSeconds(&ft); + + flags = 0; + if(s < 0) + flags = CW_EXPSTATE_EXPIRED; + else if(s < tbl->threshold_critical) + flags = CW_EXPSTATE_CRITICAL; + else if(s < tbl->threshold_warn) + flags = CW_EXPSTATE_WARN; + else + flags = CW_EXPSTATE_NONE; + + return flags; +} + +void cw_update_outline(khui_credwnd_tbl * tbl); + +VOID CALLBACK +cw_timer_proc(HWND hwnd, + UINT uMsg, + UINT_PTR idEvent, + DWORD dwTime) +{ + khui_credwnd_tbl * tbl; + khui_credwnd_row * r; + khm_int32 nflags; + int nr; + long ms; + FILETIME ft; + khm_size cbsize; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + r = (khui_credwnd_row *) idEvent; + + nr = (int)(r - tbl->rows); + + if(nr < 0 || nr >= tbl->n_rows) + return; + + if(!(r->flags & KHUI_CW_ROW_CRED)) + return; /* we only know what to do with cred rows */ + + nflags = cw_get_cred_exp_flags(tbl, (khm_handle) r->data); + if((r->flags & CW_EXPSTATE_MASK) != nflags) { + /* flags have changed */ + /* the outline needs to be updated */ + cw_update_outline(tbl); + InvalidateRect(tbl->hwnd, NULL, FALSE); + } else { + /* just invalidate the row */ + RECT r,rr,ri; + + GetClientRect(tbl->hwnd, &r); + r.top += tbl->header_height; + rr.top = r.top + (long)nr * tbl->cell_height - tbl->scr_top; + rr.bottom = rr.top + tbl->cell_height; + rr.left = r.left; + rr.right = r.right; + + if(IntersectRect(&ri, &r, &rr)) + InvalidateRect(tbl->hwnd, &ri, FALSE); + } + + cbsize = sizeof(ft); + if(KHM_SUCCEEDED(kcdb_cred_get_attr((khm_handle) r->data, + KCDB_ATTR_TIMELEFT, NULL, + &ft, &cbsize))) { + ms = FtIntervalMsToRepChange(&ft); + if(ms > 0) { + SetTimer(tbl->hwnd, (UINT_PTR) r, ms + 100, cw_timer_proc); + } + } +} + +void +cw_set_tbl_row_cred(khui_credwnd_tbl * tbl, + int row, + khm_handle cred, + int col) +{ + FILETIME ft; + long ms; + khm_size cbsize; + + if((int) tbl->n_total_rows <= row) { + /* we need to resize the allocation */ + khui_credwnd_row * newrows; + int newsize; + + newsize = UBOUNDSS(row+1,KHUI_CW_ROW_INITIAL, KHUI_CW_ROW_INCREMENT); + newrows = PMALLOC(sizeof(khui_credwnd_row) * newsize); + memcpy(newrows, tbl->rows, sizeof(khui_credwnd_row) * tbl->n_rows); + PFREE(tbl->rows); + tbl->rows = newrows; + tbl->n_total_rows = newsize; + } + + tbl->rows[row].col = col; + tbl->rows[row].data = cred; + tbl->rows[row].flags = KHUI_CW_ROW_CRED; + + /* Set any required timer events */ + cbsize = sizeof(ft); + if(KHM_SUCCEEDED(kcdb_cred_get_attr(cred, KCDB_ATTR_TIMELEFT, NULL, &ft, &cbsize))) { + ms = FtIntervalMsToRepChange(&ft); + if(ms > 0) { + SetTimer(tbl->hwnd, (UINT_PTR) &(tbl->rows[row]), ms + 100, cw_timer_proc); + tbl->rows[row].flags |= KHUI_CW_ROW_TIMERSET; + } + } +} + +void +cw_set_tbl_row_header(khui_credwnd_tbl * tbl, + int row, int col, + khui_credwnd_outline * o) +{ + if((int) tbl->n_total_rows <= row) { + /* we need to resize the allocation */ + khui_credwnd_row * newrows; + int newsize; + + newsize = UBOUNDSS(row+1,KHUI_CW_ROW_INITIAL, KHUI_CW_ROW_INCREMENT); + newrows = PMALLOC(sizeof(khui_credwnd_row) * newsize); + memcpy(newrows, tbl->rows, sizeof(khui_credwnd_row) * tbl->n_rows); + PFREE(tbl->rows); + tbl->rows = newrows; + tbl->n_total_rows = newsize; + } + + tbl->rows[row].col = col; + tbl->rows[row].data = (khm_handle) o; + tbl->rows[row].flags = KHUI_CW_ROW_HEADER; + if(o->flags & KHUI_CW_O_SELECTED) + tbl->rows[row].flags |= KHUI_CW_ROW_SELECTED; +} + +static int +iwcscmp(const void * p1, const void * p2) { + const wchar_t * s1 = *(wchar_t **) p1; + const wchar_t * s2 = *(wchar_t **) p2; + + return wcscmp(s1, s2); +} + +void +cw_update_outline(khui_credwnd_tbl * tbl) +{ + int i,j,n_rows; + int level; + int visible; + khm_size n_creds = 0; + khm_handle prevcred = NULL; + khm_handle thiscred = NULL; + /* grouping[0..n_grouping-1] are the columns that we are going to + group the display by. Say we are grouping by identity and then + by type, then grouping[0]=col# of identity and grouping[1]=col# + of type */ + khm_int32 * grouping = NULL; + khui_credwnd_outline * ol = NULL; + int n_grouping; + wchar_t buf[256]; + khm_size cbbuf; + khm_int32 flags; + int selected; + khm_int32 expstate = 0; + + /* this is called after calling cw_update_creds, so we assume + that the credentials are all loaded and sorted according to + grouping rules */ + + /* if the columns have changed, then any outline info we have + cached are unreliable */ + if(tbl->flags & KHUI_CW_TBL_COL_DIRTY) { + khui_credwnd_outline * o; + LPOP(&(tbl->outline), &o); + while(o) { + cw_del_outline(o); + LPOP(&(tbl->outline), &o); + } + tbl->n_rows = 0; + } + + /* Otherwise, we should reset the outline indices. Just the first + level is enough */ + if (tbl->outline) { + khui_credwnd_outline * o; + + o = tbl->outline; + while(o) { + o->start = -1; + o = LNEXT(o); + } + } + + /* determine the grouping order */ + grouping = PMALLOC(sizeof(khm_int32) * tbl->n_cols); + for(i=0; i < (int) tbl->n_cols; i++) + grouping[i] = -1; + n_grouping = 0; + + for(i=0; i < (int) tbl->n_cols; i++) { + /* since cw_update_creds has run, the KHUI_CW_COL_GROUP flag + only exists for columns that has a valid sort_index */ + if(tbl->cols[i].flags & KHUI_CW_COL_GROUP) { + grouping[tbl->cols[i].sort_index] = i; + if(n_grouping <= tbl->cols[i].sort_index) + n_grouping = tbl->cols[i].sort_index + 1; + } + } + + /* if we have sorted by an index without grouping by it, we can't + establish any grouping beyond that index. */ + for(i=0; i < n_grouping; i++) { + if(grouping[i] == -1) + break; + } + n_grouping = i; + + if(!tbl->rows) { + /* we haven't allocated memory yet */ + tbl->n_total_rows = KHUI_CW_ROW_INITIAL; + tbl->n_rows = 0; + tbl->rows = PMALLOC(sizeof(khui_credwnd_row) * tbl->n_total_rows); + } else { + /* kill any pending timers */ + for(i=0; i < (int) tbl->n_rows; i++) + if(tbl->rows[i].flags & KHUI_CW_ROW_TIMERSET) + { + KillTimer(tbl->hwnd, (UINT_PTR) &(tbl->rows[i])); + tbl->rows[i].flags &= ~KHUI_CW_ROW_TIMERSET; + } + } + + if(KHM_FAILED(kcdb_credset_get_size(tbl->credset, &n_creds))) + goto _exit; + + n_rows = 0; + prevcred = NULL; + ol = NULL; + + for(i=0; i < (int) n_creds; i++) { + if(KHM_FAILED(kcdb_credset_get_cred(tbl->credset, i, &thiscred))) + continue; + + /* if this credential appears to be the same as another for + this view, we skip it */ + if(prevcred) { + for(j=0; j < (int) tbl->n_cols; j++) { + if(kcdb_creds_comp_attr(prevcred, thiscred, + tbl->cols[j].attr_id)) + break; + } + + if(j >= (int) tbl->n_cols) { + if (n_rows > 0) { + tbl->rows[n_rows - 1].idx_end = i; + } + continue; + } + } + + if(!prevcred) + level = 0; + else { + for(j=0; j < n_grouping; j++) { + /* determine the grouping level at which thiscred + differs from prevcred */ + if(kcdb_creds_comp_attr(prevcred,thiscred, + tbl->cols[grouping[j]].attr_id)) + break; + } + level = j; + } + + /* now we have to walk up until we get to the parent of the + outline level we should be in */ + while(ol && ol->level >= level) { + ol->length = n_rows - ol->start; + ol->idx_end = i - 1; + ol = TPARENT(ol); + } + + if(ol) { + visible = (ol->flags & KHUI_CW_O_VISIBLE) && + (ol->flags & KHUI_CW_O_EXPAND); + selected = (ol->flags & KHUI_CW_O_SELECTED); + } else { + visible = TRUE; + selected = FALSE; + } + + /* now ol points to an outline node at the next highest level + or is NULL if level = 0 */ + + for(j=level; j < n_grouping; j++) { + khui_credwnd_outline * to; + /* now we search for an outline object at the next level + which matches the heading */ + cbbuf = sizeof(buf); + buf[0] = L'\0'; + if(KHM_FAILED + (kcdb_cred_get_attr_string(thiscred, + tbl->cols[grouping[j]].attr_id, + buf, &cbbuf, 0))) { + cbbuf = sizeof(wchar_t); + buf[0] = L'\0'; + } + + if(ol) + to = TFIRSTCHILD(ol); + else + to = tbl->outline; + + while(to) { + if(!wcscmp(buf, to->header)) + break; + to = LNEXT(to); + } + + if(to) { + /* found it */ + ol = to; + } else { + /* not found. create */ + to = cw_new_outline_node(buf); + if(ol) { + TADDCHILD(ol, to); + } else { + LPUSH(&(tbl->outline), to); + } + ol = to; + ol->flags = KHUI_CW_O_EXPAND; + ol->level = j; + ol->col = grouping[j]; + + if(tbl->cols[grouping[j]].attr_id == KCDB_ATTR_ID_NAME) { + khm_handle h; + if(KHM_SUCCEEDED(kcdb_identity_create(buf, 0, &h))) { + ol->attr_id = KCDB_ATTR_ID; + ol->data = (void *) h; + + /* the outline only lasts as long as the + credential, and the credential has a hold + on the identity. */ + kcdb_identity_release(h); + } + else + ol->data = 0; + } else if(tbl->cols[grouping[j]].attr_id == + KCDB_ATTR_TYPE_NAME) { + khm_int32 t; + + ol->attr_id = KCDB_ATTR_TYPE; + if(KHM_SUCCEEDED(kcdb_cred_get_type(thiscred, &t))) + ol->data = (void *)(ssize_t) t; + else + ol->data = (void *)(ssize_t) KCDB_CREDTYPE_INVALID; + } else { + khm_int32 rv; + khm_int32 alt_id; + kcdb_attrib * attrib; + + rv = + kcdb_attrib_get_info(tbl->cols[grouping[j]].attr_id, + &attrib); + assert(KHM_SUCCEEDED(rv)); + + if (attrib->flags & KCDB_ATTR_FLAG_ALTVIEW) + alt_id = attrib->alt_id; + else + alt_id = tbl->cols[grouping[j]].attr_id; + + ol->attr_id = alt_id; + + kcdb_attrib_release_info(attrib); + + rv = kcdb_cred_get_attr(thiscred, + alt_id, + NULL, + NULL, + &cbbuf); + if (rv != KHM_ERROR_TOO_LONG || cbbuf == 0) { + ol->data = NULL; + } else { + ol->data = PMALLOC(cbbuf); + assert(ol->data); + rv = kcdb_cred_get_attr(thiscred, + alt_id, + NULL, + ol->data, + &cbbuf); + assert(KHM_SUCCEEDED(rv)); + ol->cb_data = cbbuf; + ol->flags |= KHUI_CW_O_DATAALLOC; + } + } + } + + /* now ol points at the node at level j we want to be + in */ + ol->start = n_rows; + ol->idx_start = i; + ol->length = 0; + ol->flags &= ~CW_EXPSTATE_MASK; + ol->flags &= ~KHUI_CW_O_SHOWFLAG; + ol->flags &= ~KHUI_CW_O_STICKY; + + if(selected) { + ol->flags |= KHUI_CW_O_SELECTED; + } + if(visible) { + cw_set_tbl_row_header(tbl, n_rows, grouping[j], ol); + n_rows ++; + ol->flags |= KHUI_CW_O_VISIBLE; + } else { + ol->flags &= ~KHUI_CW_O_VISIBLE; + } + visible = visible && (ol->flags & KHUI_CW_O_EXPAND); + selected = (selected || (ol->flags & KHUI_CW_O_SELECTED)); + } + + /* we need to do this here too just in case we were already at + the level we were supposed to be in */ + if (ol) + visible = visible && (ol->flags & KHUI_CW_O_EXPAND); + + flags = cw_get_cred_exp_flags(tbl, thiscred); + expstate |= flags; + + if(visible) { + khm_int32 c_flags; + + cw_set_tbl_row_cred(tbl, n_rows, thiscred, + grouping[n_grouping-1]); + kcdb_cred_get_flags(thiscred, &c_flags); + if(flags) { + tbl->rows[n_rows].flags |= flags; + } + if(selected || + (c_flags & KCDB_CRED_FLAG_SELECTED)) + tbl->rows[n_rows].flags |= KHUI_CW_ROW_SELECTED; + tbl->rows[n_rows].idx_start = i; + tbl->rows[n_rows].idx_end = i; + + n_rows++; + } else if(flags) { + khui_credwnd_outline *to; + /* the row that is flagged is not visible. We need to send + the flag upstream until we hit a visible outline node */ + to = ol; + while(to && !(to->flags & KHUI_CW_O_VISIBLE)) { + to = TPARENT(to); + } + if(to) { + to->flags |= KHUI_CW_O_SHOWFLAG; + } + } + + /* and we propagate the flags upstream */ + if(flags) { + khui_credwnd_outline *to; + + to = ol; + while(to) { + if((to->flags & CW_EXPSTATE_MASK) < flags) { + to->flags = (to->flags & ~CW_EXPSTATE_MASK) | flags; + } + to = TPARENT(to); + } + } + + if(prevcred) + kcdb_cred_release(prevcred); + prevcred = thiscred; + } + + while(ol) { + ol->length = n_rows - ol->start; + ol->idx_end = i - 1; + ol = TPARENT(ol); + } + + if(prevcred) { + kcdb_cred_release(prevcred); + prevcred = NULL; + } + + /* Add any sticky identities that we haven't seen yet */ + if (n_grouping > 0 && + tbl->cols[grouping[0]].attr_id == KCDB_ATTR_ID_NAME) { + + khui_credwnd_outline * o; + wchar_t * idnames = NULL; + wchar_t * t; + khm_size n_idents; + khm_size cb_names; + wchar_t ** idarray = NULL; + int i; + + if (kcdb_identity_enum(KCDB_IDENT_FLAG_STICKY, + KCDB_IDENT_FLAG_STICKY, + NULL, + &cb_names, + &n_idents) != KHM_ERROR_TOO_LONG || + n_idents == 0 || + cb_names == 0) + goto _cleanup_sticky; + + idnames = PMALLOC(cb_names); + idarray = PMALLOC(n_idents * sizeof(*idarray)); +#ifdef DEBUG + assert(idnames); + assert(idarray); +#endif + + if (KHM_FAILED(kcdb_identity_enum(KCDB_IDENT_FLAG_STICKY, + KCDB_IDENT_FLAG_STICKY, + idnames, + &cb_names, + &n_idents))) + goto _cleanup_sticky; + + for (i=0, t=idnames; t && *t; t = multi_string_next(t), i++) { + idarray[i] = t; + } + + qsort(idarray, n_idents, sizeof(*idarray), iwcscmp); + + for (i=0; i < (int) n_idents; i++) { + khm_handle h; + + if (KHM_FAILED(kcdb_identity_create(idarray[i], + KCDB_IDENT_FLAG_CREATE, &h))) + continue; + + for (o = tbl->outline; o; o = LNEXT(o)) { + if (!wcscmp(idarray[i], o->header)) + break; + } + + if (o) { + /* found it */ + if (o->start != -1) /* already visible? */ + continue; + o->flags &= KHUI_CW_O_STICKY; + o->flags |= KHUI_CW_O_VISIBLE; + } else { + /* not found. create */ + o = cw_new_outline_node(idarray[i]); + o->flags = KHUI_CW_O_VISIBLE; + o->level = 0; + o->col = grouping[0]; + o->data = (void *) h; + } + + if (o->flags & KHUI_CW_O_STICKY) + kcdb_identity_release(h); + else + /* leave identity held in this case */ + o->flags |= KHUI_CW_O_STICKY; + + o->flags &= ~KHUI_CW_O_EXPAND; + o->start = n_rows; + o->length = 1; + o->idx_start = -1; + + cw_set_tbl_row_header(tbl, n_rows, grouping[0], o); + + n_rows ++; + } + + _cleanup_sticky: + if (idnames) + PFREE(idnames); + if (idarray) + PFREE(idarray); + } + + tbl->n_rows = n_rows; + tbl->flags |= KHUI_CW_TBL_ROW_DIRTY; + + tbl->flags &= ~KHUI_CW_TBL_COL_DIRTY; + + if (tbl->cursor_row >= tbl->n_rows) + tbl->cursor_row = tbl->n_rows - 1; + if (tbl->cursor_row < 0) + tbl->cursor_row = 0; +_exit: + if(grouping) + PFREE(grouping); + + if (n_creds == 0) + khm_notify_icon_expstate(KHM_NOTIF_EMPTY); + else if (expstate & CW_EXPSTATE_EXPIRED) + khm_notify_icon_expstate(KHM_NOTIF_EXP); + else if ((expstate & CW_EXPSTATE_WARN) || + (expstate & CW_EXPSTATE_CRITICAL)) + khm_notify_icon_expstate(KHM_NOTIF_WARN); + else + khm_notify_icon_expstate(KHM_NOTIF_OK); +} + +void +cw_unload_view(khui_credwnd_tbl * tbl) +{ +#define SafeDeleteObject(o) \ + do { \ + if(o) { \ + DeleteObject(o); \ + o = NULL; \ + } \ + } while(0) + + SafeDeleteObject(tbl->hf_header); + SafeDeleteObject(tbl->hf_normal); + SafeDeleteObject(tbl->hf_bold); + SafeDeleteObject(tbl->hf_bold_header); + SafeDeleteObject(tbl->hb_grey); + SafeDeleteObject(tbl->hb_normal); + SafeDeleteObject(tbl->hb_sel); + SafeDeleteObject(tbl->hb_hdr_bg); + SafeDeleteObject(tbl->hb_hdr_bg_sel); + SafeDeleteObject(tbl->hb_hdr_bg_crit); + SafeDeleteObject(tbl->hb_hdr_bg_exp); + SafeDeleteObject(tbl->hb_hdr_bg_warn); + SafeDeleteObject(tbl->hb_hdr_bg_def); + +#undef SafeDeleteObject + + if(tbl->credset) { + kcdb_credset_delete(tbl->credset); + tbl->credset = NULL; + } + if(tbl->ilist) { + khui_delete_ilist(tbl->ilist); + tbl->ilist = NULL; + } + + if(tbl->cols) { + int i; + + for(i=0; i < tbl->n_cols; i++) { + if(tbl->cols[i].title) + PFREE(tbl->cols[i].title); + Header_DeleteItem(tbl->hwnd_header, 0); + + if (tbl->cols[i].attr_id >= 0 && + tbl->cols[i].attr_id <= KCDB_ATTR_MAX_ID && + attr_to_action[tbl->cols[i].attr_id]) { + + khui_check_action(attr_to_action[tbl->cols[i].attr_id], FALSE); + + } + } + PFREE(tbl->cols); + tbl->cols = NULL; + tbl->n_cols = 0; + tbl->n_total_cols = 0; + + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + } + + if(tbl->rows) { + PFREE(tbl->rows); + tbl->rows = NULL; + tbl->n_rows = 0; + tbl->n_total_rows = 0; + } + + khui_delete_bitmap(&tbl->kbm_logo_shade); + + if (tbl->csp_view) { + khc_close_space(tbl->csp_view); + tbl->csp_view = NULL; + } + + tbl->cell_height = 0; /* recalculate cell height next time */ +} + +void +cw_hditem_from_tbl_col(khui_credwnd_col * col, HDITEM *phi) +{ + size_t cchsize; + + phi->mask = HDI_FORMAT | HDI_LPARAM | HDI_WIDTH; + if(cw_is_custom_attr(col->attr_id)) { + if(col->attr_id == CW_CA_FLAGS) { + phi->fmt = 0; + } else if(col->attr_id == CW_CA_TYPEICON) { + phi->fmt = 0; + } else { + /* what the? */ + /*TODO: throw up and die */ + } + } else { + phi->mask |= HDI_TEXT; + phi->pszText = col->title; + StringCchLength(col->title, KCDB_MAXCCH_SHORT_DESC, &cchsize); + phi->cchTextMax = (int) cchsize; + phi->fmt = HDF_CENTER | HDF_STRING; + } + phi->lParam = col->attr_id; +#if (_WIN32_WINNT >= 0x501) + if (IS_COMMCTL6()) { + if(col->flags & KHUI_CW_COL_SORT_INC) { + phi->fmt |= HDF_SORTUP; + } else if(col->flags & KHUI_CW_COL_SORT_DEC) { + phi->fmt |= HDF_SORTDOWN; + } + } +#endif + if(col->width < 0) { + /*TODO: come up with a better way to handle this case */ + col->width = 200; + } + phi->cxy = col->width; +} + +int +cw_get_cell_height(HDC hdc, HFONT hf) { + SIZE size; + size_t cbbuf; + wchar_t buf[64]; + HFONT hfold = NULL; + + if (hf) + hfold = SelectFont(hdc, hf); + + LoadString(khm_hInstance, IDS_SAMPLE_STRING, buf, sizeof(buf)/sizeof(buf[0])); + StringCchLength(buf, sizeof(buf)/sizeof(buf[0]), &cbbuf); + GetTextExtentPoint32(hdc, buf, (int) cbbuf, &size); + + if (hf) + SelectFont(hdc, hfold); + + return size.cy; +} + +/* returns a bitmask indicating which measures were changed */ +int +cw_update_extents(khui_credwnd_tbl * tbl, + khm_boolean update_scroll) { + int ext_x, ext_y; + int i; + + ext_x = 0; + for(i=0; i < (int) tbl->n_cols; i++) { + tbl->cols[i].x = ext_x; + ext_x += tbl->cols[i].width; + } + + if(!tbl->cell_height) { + HDC dc; + int maxheight = 0; + int height; + + dc = GetWindowDC(tbl->hwnd); + + maxheight = cw_get_cell_height(dc, tbl->hf_normal); + height = cw_get_cell_height(dc, tbl->hf_bold); + if (height > maxheight) + maxheight = height; + height = cw_get_cell_height(dc, tbl->hf_header); + if (height > maxheight) + maxheight = height; + height = cw_get_cell_height(dc, tbl->hf_bold_header); + if (height > maxheight) + maxheight = height; + + ReleaseDC(tbl->hwnd, dc); + + tbl->cell_height = height + tbl->vpad * 2; + } + + ext_y = (int) tbl->n_rows * tbl->cell_height; + + tbl->ext_width = ext_x; + tbl->ext_height = ext_y; + + /* useful in the future when implementing variable height rows. + The KHUI_CW_TBL_ROW_DIRTY bit indicates that the rows have + changed and that the y extent has to be recalculated. */ + tbl->flags &= ~KHUI_CW_TBL_ROW_DIRTY; + + if(update_scroll) { + RECT r; + int cl_w; + int cl_h; + SCROLLINFO si; + WINDOWPOS pw; + HDLAYOUT hdl; + + /* update the header control first */ + + retry_update_scroll: + GetClientRect(tbl->hwnd, &r); + + cl_w = r.right - r.left; + cl_h = (r.bottom - r.top); + cl_h -= tbl->header_height; + + if(tbl->scr_top < 0 || tbl->ext_height < cl_h) + tbl->scr_top = 0; + else if(tbl->scr_top > tbl->ext_height - cl_h) + tbl->scr_top = tbl->ext_height - cl_h; + if(tbl->scr_left < 0 || tbl->ext_width < cl_w) + tbl->scr_left = 0; + else if(tbl->scr_left > tbl->ext_width - cl_w) + tbl->scr_left = tbl->ext_width - cl_w; + + /* adjustments for scrolling */ + r.left -= tbl->scr_left; + r.right = max(tbl->ext_width + r.left, r.right); + + hdl.prc = &r; + hdl.pwpos = &pw; + + Header_Layout(tbl->hwnd_header, &hdl); + + if(tbl->header_height == 0) { + tbl->header_height = pw.cy; + goto retry_update_scroll; + } else + tbl->header_height = pw.cy; + + SetWindowPos( + tbl->hwnd_header, + pw.hwndInsertAfter, + pw.x, + pw.y, + pw.cx, + pw.cy, + pw.flags); + + si.cbSize = sizeof(si); + si.nMin = 0; + si.nMax = tbl->ext_height; + si.nPage = cl_h; + si.nPos = tbl->scr_top; + si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; + SetScrollInfo(tbl->hwnd, SB_VERT, &si, TRUE); + + si.cbSize = sizeof(si); + si.nMin = 0; + si.nMax = tbl->ext_width; + si.nPage = cl_w; + si.nPos = tbl->scr_left; + si.fMask = SIF_ALL | SIF_DISABLENOSCROLL; + SetScrollInfo(tbl->hwnd, SB_HORZ, &si, TRUE); + } + + return 0; +} + +void +cw_insert_header_cols(khui_credwnd_tbl * tbl) { + HWND hdr; + HDITEM hi; + int i; + + hdr = tbl->hwnd_header; + + for(i=0; i < (int) tbl->n_cols; i++) { + cw_hditem_from_tbl_col(&(tbl->cols[i]), &hi); + Header_InsertItem(hdr, 512, &hi); + } +} + +#define CW_ER_BLANK 0 +#define CW_ER_GREY 1 +#define CW_ER_SEL 2 + +void +cw_erase_rect(HDC hdc, + khui_credwnd_tbl * tbl, + RECT * r_wnd, + RECT * r_erase, + int type) +{ + RECT rlogo; + RECT ri; + RECT t; + BOOL rie; + HBRUSH hbr; + + if(RectVisible(hdc, r_erase)) { + + switch(type) { + case CW_ER_BLANK: + hbr = tbl->hb_normal; + break; + + case CW_ER_GREY: + hbr = tbl->hb_grey; + break; + + case CW_ER_SEL: + hbr = tbl->hb_sel; + break; + + default: + return; + } + + if(tbl->kbm_logo_shade.cx != -1 && type == CW_ER_BLANK) { + rlogo.left = r_wnd->right - tbl->kbm_logo_shade.cx; + rlogo.right = r_wnd->right; + rlogo.top = r_wnd->bottom - tbl->kbm_logo_shade.cy; + rlogo.bottom = r_wnd->bottom; + rie = IntersectRect(&ri, r_erase, &rlogo); + } else { + ZeroMemory(&rlogo, sizeof(rlogo)); + ZeroMemory(&ri, sizeof(ri)); + rie = FALSE; + } + + if(!rie) { + FillRect(hdc, r_erase, hbr); + } else { + HDC hdcb = CreateCompatibleDC(hdc); + HBITMAP hbmold = SelectObject(hdcb, tbl->kbm_logo_shade.hbmp); + + BitBlt(hdc, ri.left, ri.top, ri.right - ri.left, ri.bottom - ri.top, + hdcb, ri.left - rlogo.left, ri.top - rlogo.top, SRCCOPY); + + SelectObject(hdcb, hbmold); + DeleteDC(hdcb); + + if(r_erase->top < ri.top && r_erase->left < ri.left) { + t.left = r_erase->left; + t.top = r_erase->top; + t.right = ri.left; + t.bottom = ri.top; + FillRect(hdc, &t, hbr); + } + + if(r_erase->left < ri.left) { + t.left = r_erase->left; + t.top = ri.top; + t.right = ri.left; + t.bottom = ri.bottom; + FillRect(hdc, &t, hbr); + } + + if(r_erase->top < ri.top) { + t.left = ri.left; + t.top = r_erase->top; + t.right = ri.right; + t.bottom = ri.top; + FillRect(hdc, &t, hbr); + } + } + } +} + +void +cw_draw_header(HDC hdc, + khui_credwnd_tbl * tbl, + int row, + RECT * r) +{ + int colattr; + HPEN pl, pold; + khui_credwnd_row * cr; + khui_credwnd_outline * o; + int selected = 0; + khm_int32 idf = 0; + + /* each header consists of a couple of widgets and some text */ + /* we need to figure out the background color first */ + + cr = &(tbl->rows[row]); + o = (khui_credwnd_outline *) cr->data; + + colattr = tbl->cols[cr->col].attr_id; + + if (colattr == KCDB_ATTR_ID_NAME) { + khm_handle ident = o->data; + + kcdb_identity_get_flags(ident, &idf); + } + + selected = o->flags & KHUI_CW_O_SELECTED; + + { + HBRUSH hbr; + if(selected) + hbr = tbl->hb_hdr_bg_sel; + else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_EXPIRED) + hbr = tbl->hb_hdr_bg_exp; + else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_CRITICAL) + hbr = tbl->hb_hdr_bg_crit; + else if ((o->flags & CW_EXPSTATE_MASK) == CW_EXPSTATE_WARN) + hbr = tbl->hb_hdr_bg_warn; + else if (idf & KCDB_IDENT_FLAG_DEFAULT) + hbr = tbl->hb_hdr_bg_def; + else + hbr = tbl->hb_hdr_bg; + + FillRect(hdc, r, hbr); + } + + pl = CreatePen(PS_SOLID, 0, tbl->cr_hdr_outline); + pold = SelectObject(hdc, pl); + MoveToEx(hdc, r->left, r->bottom - 1, NULL); + LineTo(hdc,r->right,r->bottom - 1); + SelectObject(hdc, pold); + DeleteObject(pl); + + if (o->flags & KHUI_CW_O_STICKY) { + /* khui_ilist_draw_id(tbl->ilist, IDB_TK_NEW_SM, hdc, + r->left, r->bottom - KHUI_SMICON_CY, 0); */ + } else if((tbl->mouse_state & CW_MOUSE_WOUTLINE) && + tbl->mouse_row == row) { + if(o->flags & KHUI_CW_O_EXPAND) { + khui_ilist_draw_id(tbl->ilist, IDB_WDG_EXPAND_HI, + hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); + } else { + khui_ilist_draw_id(tbl->ilist, IDB_WDG_COLLAPSE_HI, + hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); + } + } else { + if(o->flags & KHUI_CW_O_EXPAND) { + khui_ilist_draw_id(tbl->ilist, IDB_WDG_EXPAND, + hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); + } else { + khui_ilist_draw_id(tbl->ilist, IDB_WDG_COLLAPSE, + hdc, r->left, r->bottom - KHUI_SMICON_CY, 0); + } + } + + r->left += KHUI_SMICON_CX * 3 / 2; + + /* try to draw the icon, if there is one */ + if(colattr == KCDB_ATTR_ID_NAME) { + + khui_ilist_draw_id(tbl->ilist, + (((tbl->mouse_state & CW_MOUSE_WSTICKY) && + tbl->mouse_row == row)? + ((idf & KCDB_IDENT_FLAG_STICKY)? + IDB_WDG_STUCK_HI: + IDB_WDG_STICK_HI): + ((idf & KCDB_IDENT_FLAG_STICKY)? + IDB_WDG_STUCK: + IDB_WDG_STICK)), + hdc, + r->left, r->bottom - KHUI_SMICON_CY, + 0); + + r->left += KHUI_SMICON_CX * 3 / 2; + + khui_ilist_draw_id(tbl->ilist, + ((o->flags & KHUI_CW_O_STICKY)? + IDB_ID_DIS_SM: + IDB_ID_SM), + hdc, + r->left, r->bottom - KHUI_SMICON_CY, + 0); + r->left += KHUI_SMICON_CX * 3 / 2 ; + } + + /* ok, now o->header contains the string representation of the + outline value */ + /* for now just write out the value */ + SetTextAlign(hdc, TA_BOTTOM | TA_LEFT); + + if(selected) + SetTextColor(hdc, tbl->cr_hdr_sel); + else + SetTextColor(hdc, tbl->cr_hdr_normal); + + TextOut(hdc, r->left, r->bottom - tbl->vpad, o->header, (int) wcslen(o->header)); + + if (colattr == KCDB_ATTR_ID_NAME && + (idf & KCDB_IDENT_FLAG_DEFAULT)) { + wchar_t defstr[64]; + SIZE size; + + LoadString(khm_hInstance, IDS_CW_DEFAULT, + defstr, ARRAYLENGTH(defstr)); + + GetTextExtentPoint32(hdc, o->header, (int) wcslen(o->header), + &size); + + r->left += size.cx + KHUI_SMICON_CX * 2; + + TextOut(hdc, r->left, r->bottom - tbl->vpad, + defstr, (int) wcslen(defstr)); + } +} + +LRESULT +cw_handle_header_msg(khui_credwnd_tbl * tbl, LPNMHEADER ph) { + RECT r; + HDITEM hi; + + switch(ph->hdr.code) { + /*TODO:Make it track smoother */ + case HDN_BEGINTRACK: + { + ZeroMemory(&hi, sizeof(hi)); + hi.mask = HDI_ORDER; + Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); + + if(tbl->cols[hi.iOrder].flags & KHUI_CW_COL_FIXED_WIDTH) + return TRUE; + else + return FALSE; + } + + case HDN_TRACK: + case HDN_ENDTRACK: + { + int width; + hi.mask = HDI_ORDER; + Header_GetItem(ph->hdr.hwndFrom, ph->iItem, &hi); + Header_GetItemRect(ph->hdr.hwndFrom, ph->iItem, &r); + width = r.right - r.left; + if(width != tbl->cols[hi.iOrder].width) { + tbl->cols[hi.iOrder].width = width; + cw_update_extents(tbl, TRUE); + InvalidateRect(tbl->hwnd, NULL, FALSE); + } + } + break; + + case HDN_BEGINDRAG: + { + + ZeroMemory(&hi, sizeof(hi)); + hi.mask = HDI_ORDER; + Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); + + if (tbl->cols[hi.iOrder].flags & KHUI_CW_COL_FIXED_WIDTH) { + return TRUE; + } else { + return FALSE; + } + } + break; + + case HDN_ENDDRAG: + { + int drag_start_index; + int drag_end_index; + int i; + khui_credwnd_col tcol; + int sort_index = 0; + khm_int32 old_flags; + + if (ph->pitem == NULL) + return TRUE; + + hi.mask = HDI_ORDER; + Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); + drag_start_index = hi.iOrder; + drag_end_index = ph->pitem->iOrder; + + /* the user dragged the column which was at drag_start_index + to drag_end_index. */ + + if (drag_end_index == drag_start_index) + return TRUE; + + /* we don't allow dragging in to the "fixed" area. */ + for (i=0; i < tbl->n_cols; i++) { + if (tbl->cols[i].attr_id >= 0) + break; + } + + if (drag_end_index <= i) + return TRUE; + + tcol = tbl->cols[drag_start_index]; + if (drag_end_index < drag_start_index) { + MoveMemory(&tbl->cols[drag_end_index + 1], + &tbl->cols[drag_end_index], + sizeof(tbl->cols[0]) * + (drag_start_index - drag_end_index)); + } else { + MoveMemory(&tbl->cols[drag_start_index], + &tbl->cols[drag_start_index + 1], + sizeof(tbl->cols[0]) * + (drag_end_index - drag_start_index)); + } + tbl->cols[drag_end_index] = tcol; + + old_flags = tbl->cols[drag_end_index].flags; + + if (drag_end_index < tbl->n_cols - 1) { + khm_int32 tflags = tbl->cols[drag_end_index + 1].flags; + + if (tflags & KHUI_CW_COL_GROUP) { + tbl->cols[drag_end_index].flags |= KHUI_CW_COL_GROUP; + } + + if ((tflags & (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC)) && + !(old_flags & (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC))) + tbl->cols[drag_end_index].flags |= KHUI_CW_COL_SORT_INC; + } + + if (drag_end_index > 0) { + khm_int32 tflags = tbl->cols[drag_end_index - 1].flags; + + if (!(tflags & KHUI_CW_COL_GROUP)) + tbl->cols[drag_end_index].flags &= ~KHUI_CW_COL_GROUP; + + if (!(tflags & (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC))) + tbl->cols[drag_end_index].flags &= + ~(KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC); + } + + if (old_flags != tbl->cols[drag_end_index].flags) { + cw_hditem_from_tbl_col(&tbl->cols[drag_end_index], &hi); + hi.mask = HDI_FORMAT; + Header_SetItem(tbl->hwnd_header, ph->iItem, &hi); + } + + if ((old_flags ^ tbl->cols[drag_end_index].flags) & + KHUI_CW_COL_GROUP) + tbl->flags |= KHUI_CW_TBL_COL_DIRTY; + + for (i=0; i < tbl->n_cols; i++) { + if (tbl->cols[i].attr_id < 0) + continue; + + if (tbl->cols[i].flags & + (KHUI_CW_COL_GROUP | + KHUI_CW_COL_SORT_INC | + KHUI_CW_COL_SORT_DEC)) + tbl->cols[i].sort_index = sort_index++; + else + break; + } + + tbl->flags |= KHUI_CW_TBL_CUSTVIEW; + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + InvalidateRect(tbl->hwnd, NULL, FALSE); + + return FALSE; + } + break; + + case HDN_ITEMCLICK: + { + int idx; + int hidx; + + hi.mask = HDI_ORDER; + Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); + idx = hi.iOrder; + + if (idx == 0 || idx >= tbl->n_cols) + return FALSE; + + if (tbl->cols[idx].flags & + (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC)) { + + tbl->cols[idx].flags ^= + (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC); + + cw_hditem_from_tbl_col(&tbl->cols[idx], &hi); + hi.mask = HDI_FORMAT; + Header_SetItem(tbl->hwnd_header, ph->iItem, &hi); + + } else { + int i; + int sort_idx = 0; + + for (i=0; i <= idx; i++) { + if (tbl->cols[i].attr_id < 0) + continue; + + if (!(tbl->flags & + (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC))) { + tbl->cols[i].flags |= KHUI_CW_COL_SORT_INC; + + cw_hditem_from_tbl_col(&tbl->cols[i], &hi); + hi.mask = HDI_FORMAT; + hidx = Header_OrderToIndex(tbl->hwnd_header, i); + Header_SetItem(tbl->hwnd_header, hidx, &hi); + } + + tbl->cols[i].sort_index = sort_idx++; + } + } + + tbl->flags |= KHUI_CW_TBL_CUSTVIEW; + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + InvalidateRect(tbl->hwnd, NULL, FALSE); + + } + break; + + case HDN_ITEMDBLCLICK: + { + int idx; + int hidx; + + hi.mask = HDI_ORDER; + Header_GetItem(tbl->hwnd_header, ph->iItem, &hi); + idx = hi.iOrder; + + if (idx == 0 || idx >= tbl->n_cols) + return FALSE; + + if (tbl->cols[idx].flags & KHUI_CW_COL_GROUP) { + /* we are removing grouping from this level */ + + int i; + + for (i=idx; i < tbl->n_cols; i++) { + if (!(tbl->cols[i].flags & KHUI_CW_COL_GROUP)) + break; + + tbl->cols[i].flags &= ~KHUI_CW_COL_GROUP; + + cw_hditem_from_tbl_col(&tbl->cols[idx], &hi); + hi.mask = HDI_FORMAT; + hidx = Header_OrderToIndex(tbl->hwnd_header, i); + Header_SetItem(tbl->hwnd_header, hidx, &hi); + } + +#if 0 + } else if (tbl->cols[idx].flags & + (KHUI_CW_COL_SORT_INC | + KHUI_CW_COL_SORT_DEC)) { + int i; + + /* remove the sort condition from a column */ + + for (i=idx; i < tbl->n_cols; i++) { + if (!tbl->cols[i].flags & + (KHUI_CW_COL_SORT_INC | + KHUI_CW_COL_SORT_DEC)) + break; + + tbl->cols[i].flags &= + ~(KHUI_CW_COL_SORT_INC | + KHUI_CW_COL_SORT_DEC); + + cw_hditem_from_tbl_col(&tbl->cols[idx], &hi); + hi.mask = HDI_FORMAT; + hidx = Header_OrderToIndex(tbl->hwnd_header, i); + Header_SetItem(tbl->hwnd_header, hidx, &hi); + } +#endif + } else { + int i; + int sort_index = 0; + + for (i=0; i <= idx; i++) { + if (tbl->cols[i].attr_id < 0) + continue; + + if (!(tbl->cols[i].flags & KHUI_CW_COL_GROUP)) { + tbl->cols[i].flags |= KHUI_CW_COL_GROUP; + + if (!(tbl->cols[i].flags & + (KHUI_CW_COL_SORT_INC | + KHUI_CW_COL_SORT_DEC))) + tbl->cols[i].flags |= KHUI_CW_COL_SORT_INC; + + cw_hditem_from_tbl_col(&tbl->cols[i], &hi); + hi.mask = HDI_FORMAT; + hidx = Header_OrderToIndex(tbl->hwnd_header, i); + Header_SetItem(tbl->hwnd_header, hidx, &hi); + } + + tbl->cols[i].sort_index = sort_index++; + } + } + + tbl->flags |= KHUI_CW_TBL_COL_DIRTY; + tbl->flags |= KHUI_CW_TBL_CUSTVIEW; + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + InvalidateRect(tbl->hwnd, NULL, FALSE); + } + break; + + case NM_CUSTOMDRAW: + { + LPNMCUSTOMDRAW cd; + int idx; + + cd = (LPNMCUSTOMDRAW) ph; + switch(cd->dwDrawStage) { + case CDDS_PREPAINT: + return CDRF_NOTIFYITEMDRAW; + + case CDDS_ITEMPREPAINT: + return CDRF_NOTIFYPOSTPAINT; + + case CDDS_ITEMPOSTPAINT: + if(cd->lItemlParam == CW_CA_FLAGS) + idx = IDB_WDG_FLAG; + else if(cd->lItemlParam == CW_CA_TYPEICON) + idx = IDB_WDG_CREDTYPE; + else + idx = -1; + + khui_ilist_draw_id(tbl->ilist, idx, cd->hdc, cd->rc.left, cd->rc.top, 0); + return 0; + } + } + break; + } + return 0; +} + +LRESULT +cw_wm_create(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + + kmq_subscribe_hwnd(KMSG_CRED, hwnd); + kmq_subscribe_hwnd(KMSG_KCDB, hwnd); + kmq_subscribe_hwnd(KMSG_KMM, hwnd); + + /* freed in cw_wm_destroy */ + tbl = PMALLOC(sizeof(*tbl)); + ZeroMemory(tbl, sizeof(*tbl)); + + /* some versions of VC generate portability warnings for + SetWindowLongPtr */ +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, 0, (LONG_PTR) tbl); +#pragma warning(pop) + + cw_refresh_attribs(hwnd); + + tbl->hwnd_header = CreateWindowEx( + 0, + WC_HEADER, + (LPWSTR) NULL, + WS_CHILD | HDS_BUTTONS | + HDS_FULLDRAG | HDS_HORZ | HDS_HOTTRACK | + HDS_DRAGDROP +#if (_WIN32_WINNT >= 0x501) + | ((IS_COMMCTL6())?HDS_FLAT:0) +#endif + , + 0,0,0,0,hwnd, (HMENU) 0, khm_hInstance, NULL); + + cw_load_view(tbl, NULL /* default view */, hwnd); + cw_insert_header_cols(tbl); + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, FALSE); + + { + RECT rect; + WINDOWPOS pw; + HDLAYOUT hdl; + + hdl.prc = ▭ + hdl.pwpos = &pw; + GetClientRect(hwnd, &rect); + + Header_Layout(tbl->hwnd_header, &hdl); + + SetWindowPos( + tbl->hwnd_header, + pw.hwndInsertAfter, + pw.x, + pw.y, + pw.cx, + pw.cy, + pw.flags | SWP_SHOWWINDOW); + } + + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +LRESULT +cw_wm_destroy(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + + kmq_unsubscribe_hwnd(KMSG_CRED, hwnd); + kmq_unsubscribe_hwnd(KMSG_KCDB, hwnd); + kmq_unsubscribe_hwnd(KMSG_KMM, hwnd); + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + cw_save_view(tbl, NULL); + + cw_unload_view(tbl); + + PFREE(tbl); + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +LRESULT +cw_wm_paint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + HDC hdc; + PAINTSTRUCT ps; + RECT r,rh; + HFONT hf_old = NULL; + int row_s, row_e; + int col_s, col_e; + int i,j,x,y,xs,xe,ys,ye; + int flag_col = -1; + int d_x = -1; + int selected = 0; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + if(!GetUpdateRect(hwnd, &r, FALSE)) + goto _exit; + + hdc = BeginPaint(hwnd, &ps); + if(tbl->hf_normal) + hf_old = SelectFont(hdc, tbl->hf_normal); + SetTextAlign(hdc, TA_LEFT | TA_TOP | TA_NOUPDATECP); + SetBkMode(hdc, TRANSPARENT); + + GetClientRect(hwnd,&r); + r.top += tbl->header_height; + + if(tbl->n_rows) { + /* remove the notification window if there is one */ + if(tbl->hwnd_notif) { + DestroyWindow(tbl->hwnd_notif); + tbl->hwnd_notif = NULL; + } + /* we compute the visible area in terms of rows and columns */ + /* row_s : first visible row */ + /* col_s : first visible column */ + /* row_e : last visible row */ + /* col_e : last visible column */ + /* ys : top edge of first visible row */ + /* xs : left edge of first visible column */ + + /* We *NEED* all the meta columns to be on the left */ + + row_s = tbl->scr_top / tbl->cell_height; + ys = row_s * tbl->cell_height; + row_e = (tbl->scr_top + (r.bottom - r.top)) / tbl->cell_height + 1; + if(row_e > (int) tbl->n_rows) + row_e = (int) tbl->n_rows; + x = 0; + col_s = -1; + col_e = -1; + xs = 0; + for(i=0; i < (int) tbl->n_cols; i++) { + if(col_e == -1 && x >= tbl->scr_left + (r.right - r.left)) { + col_e = i; + } + if(tbl->cols[i].attr_id == CW_CA_FLAGS) + flag_col = i; + if(d_x == -1 && !cw_is_custom_attr(tbl->cols[i].attr_id)) + d_x = x; + x += tbl->cols[i].width; + if(col_s == -1 && x > tbl->scr_left) { + col_s = i; + xs = tbl->cols[i].x; + } + } + + if(col_e == -1) + col_e = i; + + if(col_s == -1) + col_s = i; + + if(d_x != -1) + d_x += r.left - tbl->scr_left; + + xs += r.left - tbl->scr_left; + ys += r.top - tbl->scr_top; + xe = r.left + tbl->ext_width - tbl->scr_left; + ye = r.top + tbl->ext_height - tbl->scr_top; + + /* now draw */ + y = ys; + for(i=row_s; i < row_e; i++) { + selected = tbl->rows[i].flags & KHUI_CW_ROW_SELECTED; + + if(tbl->cursor_row == i) { + if (tbl->rows[i].flags & KHUI_CW_ROW_HEADER) + SelectFont(hdc, tbl->hf_bold_header); + else + SelectFont(hdc, tbl->hf_bold); + } else if (tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { + SelectFont(hdc, tbl->hf_header); + } + + x = xs; + if(tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { + rh.left = xs; + rh.right = xs; + for(j=col_s; j < tbl->rows[i].col; j++) + rh.right += tbl->cols[j].width; + rh.top = y; + rh.bottom = y + tbl->cell_height; + if(rh.right > rh.left) { + cw_erase_rect(hdc, tbl, &r, &rh, (selected)?CW_ER_SEL:CW_ER_BLANK); + } + rh.left = rh.right; + rh.right = xe; + + cw_draw_header(hdc, tbl, i, &rh); + } + + if(selected) + SetTextColor(hdc, tbl->cr_sel); + else + SetTextColor(hdc, tbl->cr_normal); + + x = xs; + rh.top = y; + rh.bottom = y + tbl->cell_height; + for(j=col_s; j < col_e; x += tbl->cols[j++].width) { + wchar_t buf[256]; + khm_size cbbuf; + + rh.left = x; + rh.right = x + tbl->cols[j].width; + + if(!RectVisible(hdc, &rh)) + continue; + + if(!cw_is_custom_attr(tbl->cols[j].attr_id)) { + if(!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { + cw_erase_rect(hdc, tbl, &r, &rh, (selected)?CW_ER_SEL:CW_ER_BLANK); + + if(j > tbl->rows[i].col) { + cbbuf = sizeof(buf); + if(KHM_FAILED(kcdb_cred_get_attr_string((khm_handle) tbl->rows[i].data, + tbl->cols[j].attr_id, buf, + &cbbuf, KCDB_TS_SHORT))) + continue; + + rh.left += tbl->hpad; + rh.right -= tbl->hpad; + + SetTextAlign(hdc, 0); + DrawText(hdc, buf, (int)((cbbuf / sizeof(wchar_t)) - 1), &rh, + DT_LEFT | DT_VCENTER | DT_NOCLIP | DT_SINGLELINE | DT_END_ELLIPSIS); + //TextOut(hdc, x, y + tbl->vpad, buf, (cbbuf / sizeof(wchar_t)) - 1); + } + } + } else { + cw_erase_rect(hdc, tbl, &r, &rh, (selected)?CW_ER_SEL:CW_ER_BLANK); + + if(tbl->cols[j].attr_id == CW_CA_FLAGS) { + khui_credwnd_outline * o; + khm_int32 flag; + + if(tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { + o = ((khui_credwnd_outline *) tbl->rows[i].data); + if(o->flags & KHUI_CW_O_SHOWFLAG) + flag = o->flags; + else + flag = 0; + } else { + flag = tbl->rows[i].flags; + } + + flag &= CW_EXPSTATE_MASK; + + if(flag == CW_EXPSTATE_WARN) { + khui_ilist_draw_id(tbl->ilist, IDB_FLAG_WARN, hdc, x, y, 0); + } else if(flag == CW_EXPSTATE_CRITICAL) { + khui_ilist_draw_id(tbl->ilist, IDB_FLAG_CRITICAL, hdc, x, y, 0); + } else if(flag == CW_EXPSTATE_EXPIRED) { + khui_ilist_draw_id(tbl->ilist, IDB_FLAG_EXPIRED, hdc, x, y, 0); + } else if(!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { + khm_int32 flags; + + if (KHM_SUCCEEDED(kcdb_cred_get_flags((khm_handle) tbl->rows[i].data, &flags)) && + (flags & KCDB_CRED_FLAG_RENEWABLE)) { + khui_ilist_draw_id(tbl->ilist, + IDB_FLAG_RENEW, + hdc, + x, y, 0); + } else { + khui_ilist_draw_id(tbl->ilist, + IDB_TK_SM, + hdc, + x, y, 0); + } + } + } + } + } + + if(tbl->cursor_row == i) { + rh.left = tbl->scr_left; + rh.right = tbl->scr_left + tbl->ext_width; + DrawFocusRect(hdc, &rh); + } + + if (tbl->cursor_row == i || + (tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { + SelectFont(hdc, tbl->hf_normal); + } + + y += tbl->cell_height; + + } + + if(xe < r.right) { + rh.left = xe; + rh.right = r.right; + rh.top = r.top; + rh.bottom = r.bottom; + + cw_erase_rect(hdc, tbl, &r, &rh, CW_ER_BLANK); + } + + if(ye < r.bottom) { + rh.left = r.left; + rh.right = (xe < r.right)?xe:r.right; + rh.top = ye; + rh.bottom = r.bottom; + + cw_erase_rect(hdc, tbl, &r, &rh, CW_ER_BLANK); + } + + } else { + wchar_t buf[512]; + cw_erase_rect(hdc, tbl, &r, &r, CW_ER_BLANK); + + if(tbl->hwnd_notif == NULL) { + LoadString(khm_hInstance, IDS_NO_CREDS, buf, sizeof(buf)/sizeof(buf[0])); + tbl->hwnd_notif = khm_create_htwnd( + tbl->hwnd, + buf, + r.left,r.top,r.right - r.left,(r.bottom - r.top) /2, + WS_EX_TRANSPARENT, + WS_VISIBLE); + if(tbl->hwnd_notif) { + SendMessage(tbl->hwnd_notif, WM_SETFONT, (WPARAM) tbl->hf_normal, (LPARAM) FALSE); + ShowWindow(tbl->hwnd_notif, SW_SHOW); + } + } + } + + if(tbl->hf_normal) + SelectFont(hdc, hf_old); + + EndPaint(hwnd,&ps); +_exit: + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +LRESULT +cw_wm_size(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + RECT rect; + khui_credwnd_tbl * tbl; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + cw_update_extents(tbl, TRUE); + + GetClientRect(hwnd, &rect); + + if(tbl->hwnd_notif) { + SetWindowPos( + tbl->hwnd_notif, + tbl->hwnd_header, + rect.left, + tbl->header_height, + rect.right - rect.left, + (rect.bottom - tbl->header_height) / 2, + 0); + } + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +LRESULT +cw_wm_notify(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + LPNMHDR pnmh; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + pnmh = (LPNMHDR) lParam; + if(pnmh->hwndFrom == tbl->hwnd_header) { + LPNMHEADER ph; + ph = (LPNMHEADER) lParam; + return cw_handle_header_msg(tbl, ph); + } + + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +static void cw_pp_begin(khui_property_sheet * s); +static void cw_pp_precreate(khui_property_sheet * s); +static void cw_pp_end(khui_property_sheet * s); +static void cw_pp_destroy(khui_property_sheet *ps); + +LRESULT +cw_kmq_wm_dispatch(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + kmq_message * m; + khm_int32 rv = KHM_ERROR_SUCCESS; + khui_credwnd_tbl * tbl; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + kmq_wm_begin(lParam, &m); + + if(m->type == KMSG_CRED) { + switch (m->subtype) { + case KMSG_CRED_ROOTDELTA: + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + InvalidateRect(hwnd, NULL, FALSE); + break; + + case KMSG_CRED_PP_BEGIN: + cw_pp_begin((khui_property_sheet *) m->vparam); + break; + + case KMSG_CRED_PP_PRECREATE: + cw_pp_precreate((khui_property_sheet *) m->vparam); + break; + + case KMSG_CRED_PP_END: + cw_pp_end((khui_property_sheet *) m->vparam); + break; + + case KMSG_CRED_PP_DESTROY: + cw_pp_destroy((khui_property_sheet *) m->vparam); + break; + } + } else if (m->type == KMSG_KCDB) { + if (m->subtype == KMSG_KCDB_IDENT && + m->uparam == KCDB_OP_MODIFY) { + + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + InvalidateRect(hwnd, NULL, FALSE); + } + else if (m->subtype == KMSG_KCDB_IDENT && + m->uparam == KCDB_OP_NEW_DEFAULT) { + + InvalidateRect(hwnd, NULL, FALSE); + } + else if (m->subtype == KMSG_KCDB_ATTRIB && + (m->uparam == KCDB_OP_INSERT || + m->uparam == KCDB_OP_DELETE)) { + cw_refresh_attribs(hwnd); + } + } else if (m->type == KMSG_KMM && + m->subtype == KMSG_KMM_I_DONE) { + + if (tbl->flags & KHUI_CW_TBL_COLSKIP) { + wchar_t cname[KCONF_MAXCCH_NAME]; + khm_size cb; + + cname[0] = L'\0'; + + if (tbl->csp_view) { + cb = sizeof(cname); + khc_get_config_space_name(tbl->csp_view, + cname, + &cb); + } + + cw_unload_view(tbl); + + cw_load_view(tbl, ((cname[0])?cname: NULL), hwnd); + cw_insert_header_cols(tbl); + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + } + + } else if (m->type == KMSG_ACT && + m->subtype == KMSG_ACT_ACTIVATE) { + /* a column selector menu item was activated */ + + khm_int32 attr_id; + khm_int32 action; + khui_action * paction; + int i; + int first_non_fixed = -1; + + action = m->uparam; + paction = khui_find_action(action); + + if (paction == NULL) + goto _skip_action; + + attr_id = (khm_int32)(INT_PTR) paction->data; + + if (attr_id < 0 || attr_id > KCDB_ATTR_MAX_ID) + goto _skip_action; + + for (i=0; i < tbl->n_cols; i++) { + if (tbl->cols[i].attr_id >= 0 && + first_non_fixed == -1) + first_non_fixed = i; + + if (tbl->cols[i].attr_id == attr_id) + break; + } + + if (first_non_fixed == i && + i == tbl->n_cols - 1) { + /* this is the only non-fixed column. We don't allow + deleting it, althoguh there's nothing wrong with doing + so other than not being very useful. */ + goto _skip_action; + } + + if (i < tbl->n_cols) { + khm_int32 sort_index; + + /* we need to remove a column */ + + Header_DeleteItem(tbl->hwnd_header, i); + sort_index = tbl->cols[i].sort_index; + + if (tbl->cols[i].title) + PFREE(tbl->cols[i].title); + tbl->cols[i].title = NULL; + + if (i < tbl->n_cols - 1) { + MoveMemory(&tbl->cols[i], &tbl->cols[i+1], + sizeof(tbl->cols[0]) * (tbl->n_cols - (i + 1))); + } + tbl->n_cols--; + + /* fix the sort index */ + if (sort_index >= 0) { + for (i=0; i < tbl->n_cols; i++) { + if (tbl->cols[i].sort_index > sort_index) + tbl->cols[i].sort_index--; + } + } + + tbl->flags |= KHUI_CW_TBL_COL_DIRTY; + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + + khui_check_action(attr_to_action[attr_id], FALSE); + + tbl->flags |= KHUI_CW_TBL_CUSTVIEW; + + } else { + /* we need to add a column */ + wchar_t buf[KCDB_MAXCCH_SHORT_DESC]; + khm_size cb; + khm_int32 idx = tbl->n_cols; + HDITEM hi; + + /* for now, we only allow KHUI_CW_COL_INITIAL columns */ + if (tbl->n_rows == tbl->n_total_rows) + goto _skip_action; + + cb = sizeof(buf); + if (KHM_FAILED(kcdb_attrib_describe(attr_id, + buf, + &cb, + KCDB_TS_SHORT))) + goto _skip_action; + + tbl->cols[idx].attr_id = attr_id; + tbl->cols[idx].width = 100; + tbl->cols[idx].x = -1; + tbl->cols[idx].flags = 0; + tbl->cols[idx].sort_index = -1; + tbl->cols[idx].title = PMALLOC(cb); +#ifdef DEBUG + assert(tbl->cols[idx].title); +#endif + if (!tbl->cols[idx].title) + goto _skip_action; + + StringCbCopy(tbl->cols[idx].title, + cb, + buf); + + tbl->n_cols++; + + cw_hditem_from_tbl_col(&(tbl->cols[idx]), &hi); + Header_InsertItem(tbl->hwnd_header, 512, &hi); + + tbl->flags |= KHUI_CW_TBL_COL_DIRTY; + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + + khui_check_action(attr_to_action[attr_id], TRUE); + + tbl->flags |= KHUI_CW_TBL_CUSTVIEW; + } + + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + + _skip_action: + ; + } + + return kmq_wm_end(m, rv); +} + +static void +cw_select_outline_level(khui_credwnd_outline * o, + BOOL select) +{ + while(o) { + if (select) + o->flags |= KHUI_CW_O_SELECTED; + else + o->flags &= ~KHUI_CW_O_SELECTED; + cw_select_outline_level(TFIRSTCHILD(o), select); + o = LNEXT(o); + } +} + +static void +cw_select_outline(khui_credwnd_outline * o, + BOOL select) +{ + if (select) + o->flags |= KHUI_CW_O_SELECTED; + else + o->flags &= ~KHUI_CW_O_SELECTED; +} + +static void +cw_unselect_all(khui_credwnd_tbl * tbl) +{ + int i; + + for(i=0; in_rows; i++) { + tbl->rows[i].flags &= ~KHUI_CW_ROW_SELECTED; + if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) + kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, + 0, + KCDB_CRED_FLAG_SELECTED); + } + + cw_select_outline_level(tbl->outline, FALSE); +} + +static void +cw_update_outline_selection_state(khui_credwnd_tbl * tbl, + khui_credwnd_outline * o) +{ + BOOL select = TRUE; + int j; + + for (j = o->start + 1; j < o->start + o->length; j++) { + if (tbl->rows[j].flags & KHUI_CW_ROW_HEADER) { + cw_update_outline_selection_state(tbl, + (khui_credwnd_outline *) + tbl->rows[j].data); + } + + if (!(tbl->rows[j].flags & KHUI_CW_ROW_SELECTED)) { + select = FALSE; + } + + if (tbl->rows[j].flags & KHUI_CW_ROW_HEADER) { + j += ((khui_credwnd_outline *) tbl->rows[j].data)->length - 1; + } + } + + /* special case : the header has been collapsed and we are just + using one row. In this case, the for loop above will do + nothing. */ + + if (o->length == 1) { + select = (tbl->rows[o->start].flags & KHUI_CW_ROW_SELECTED); + } + + cw_select_outline(o, select); + + if (select) { + tbl->rows[o->start].flags |= KHUI_CW_ROW_SELECTED; + } else { + tbl->rows[o->start].flags &= ~KHUI_CW_ROW_SELECTED; + } +} + +static void +cw_update_selection_state(khui_credwnd_tbl * tbl) +{ + int i; + + cw_select_outline_level(tbl->outline, FALSE); + + for (i=0; i < tbl->n_rows; i++) { + if (tbl->rows[i].flags & KHUI_CW_ROW_HEADER) { + khui_credwnd_outline * o; + + o = (khui_credwnd_outline *) tbl->rows[i].data; + + cw_update_outline_selection_state(tbl, o); + + i += o->length - 1; + } + } +} + +/* Examine the current row and set the UI context */ +static void +cw_set_row_context(khui_credwnd_tbl * tbl, int row) +{ + khui_credwnd_outline * o; + BOOL set_context = TRUE; + + if (row < 0 || row >= (int) tbl->n_rows) { + if (tbl->n_rows > 0) + row = 0; + else { + khui_context_reset(); + return; + } + } + + if (tbl->rows[row].flags & KHUI_CW_ROW_HEADER) { + + o = (khui_credwnd_outline *) tbl->rows[row].data; + + if (tbl->cols[o->col].attr_id == KCDB_ATTR_ID_NAME) { + if (TPARENT(o) == NULL) { /* selected an identity */ + khui_context_set(KHUI_SCOPE_IDENT, + (khm_handle) o->data, + KCDB_CREDTYPE_INVALID, + NULL, + NULL, + 0, + tbl->credset); + } else { + khui_credwnd_outline * op; + + op = TPARENT(o); + + if (tbl->cols[op->col].attr_id == KCDB_ATTR_TYPE_NAME && + TPARENT(op) == NULL) { + /* selected a credential type */ + khui_context_set(KHUI_SCOPE_CREDTYPE, + (khm_handle) o->data, + (khm_int32) (DWORD_PTR) op->data, + NULL, + NULL, + 0, + tbl->credset); + } else { + set_context = FALSE; + } + } + } else if (tbl->cols[o->col].attr_id == KCDB_ATTR_TYPE_NAME) { + if (TPARENT(o) == NULL) { + /* selected an entire cred type */ + khui_context_set(KHUI_SCOPE_CREDTYPE, + NULL, + (khm_int32) (DWORD_PTR) o->data, + NULL, + NULL, + 0, + tbl->credset); + } else { + khui_credwnd_outline * op; + + op = TPARENT(o); + if (tbl->cols[op->col].attr_id == KCDB_ATTR_ID_NAME && + TPARENT(op) == NULL) { + /* credtype under an identity */ + khui_context_set(KHUI_SCOPE_CREDTYPE, + (khm_handle) op->data, + (khm_int32) (DWORD_PTR) o->data, + NULL, + NULL, + 0, + tbl->credset); + } else { + set_context = FALSE; + } + } + } else { + set_context = FALSE; + } + + if (!set_context) { + /* woohoo. cred group. yay. */ + khui_header headers[KHUI_MAX_HEADERS]; + khm_size n_headers = 0; + + do { + headers[n_headers].attr_id = + o->attr_id; + if (tbl->cols[o->col].attr_id == + KCDB_ATTR_ID_NAME) { + headers[n_headers].data = &(o->data); + headers[n_headers].cb_data = sizeof(khm_handle); + } else if (tbl->cols[o->col].attr_id == + KCDB_ATTR_TYPE_NAME) { + headers[n_headers].data = &(o->data); + headers[n_headers].cb_data = sizeof(khm_int32); + } else { + headers[n_headers].data = o->data; + headers[n_headers].cb_data = o->cb_data; + } + + n_headers++; + + o = TPARENT(o); + } while(o); + + khui_context_set(KHUI_SCOPE_GROUP, + NULL, + KCDB_CREDTYPE_INVALID, + NULL, + headers, + n_headers, + tbl->credset); + } + + } else { + khm_handle cred; + + cred = (khm_handle) tbl->rows[row].data; + + khui_context_set(KHUI_SCOPE_CRED, + NULL, + KCDB_CREDTYPE_INVALID, + cred, + NULL, + 0, + tbl->credset); + } +} + +static void +cw_select_all(khui_credwnd_tbl * tbl) +{ + int i; + + for(i=0; in_rows; i++) { + tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; + if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) + kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, + KCDB_CRED_FLAG_SELECTED, + KCDB_CRED_FLAG_SELECTED); + } + + cw_select_outline_level(tbl->outline, TRUE); + + cw_update_selection_state(tbl); + + cw_set_row_context(tbl, tbl->cursor_row); + + InvalidateRect(tbl->hwnd, NULL, FALSE); +} + +static void +cw_select_row(khui_credwnd_tbl * tbl, int row, WPARAM wParam) +{ + int i; + BOOL toggle; + BOOL extend; + int group_begin; + int group_end; + + if (wParam & MK_CONTROL) { + toggle = TRUE; + extend = FALSE; + } else if (wParam & MK_SHIFT) { + toggle = FALSE; + extend = TRUE; + } else { + toggle = FALSE; + extend = FALSE; + } + + if (row < 0 || row >= (int) tbl->n_rows) + return; + + if (tbl->rows[row].flags & KHUI_CW_ROW_HEADER) { + khui_credwnd_outline * o; + + o = (khui_credwnd_outline *) tbl->rows[row].data; + + group_begin = o->start; + group_end = o->start + o->length - 1; + } else { + group_begin = row; + group_end = row; + } + + if (!toggle && !extend) { + /* selecting a single row */ + cw_unselect_all(tbl); + + tbl->cursor_row = row; + tbl->anchor_row = row; + + for (i = group_begin; i <= group_end; i++) { + tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; + if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { + kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, + KCDB_CRED_FLAG_SELECTED, + KCDB_CRED_FLAG_SELECTED); + } + } + } else if (toggle) { + BOOL select; + + tbl->cursor_row = row; + tbl->anchor_row = row; + + select = !(tbl->rows[row].flags & KHUI_CW_ROW_SELECTED); + + for (i = group_begin; i <= group_end; i++) { + if (select) + tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; + else + tbl->rows[i].flags &= ~KHUI_CW_ROW_SELECTED; + + if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { + kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, + (select)?KCDB_CRED_FLAG_SELECTED:0, + KCDB_CRED_FLAG_SELECTED); + } + } + } else if (extend) { + int range_begin; + int range_end; + + cw_unselect_all(tbl); + + range_begin = min(row, tbl->anchor_row); + range_end = max(row, tbl->anchor_row); + + for (i = range_begin; i <= range_end; i++) { + tbl->rows[i].flags |= KHUI_CW_ROW_SELECTED; + + if (!(tbl->rows[i].flags & KHUI_CW_ROW_HEADER)) { + kcdb_cred_set_flags((khm_handle) tbl->rows[i].data, + KCDB_CRED_FLAG_SELECTED, + KCDB_CRED_FLAG_SELECTED); + } + } + + tbl->cursor_row = row; + } + + cw_update_selection_state(tbl); + + cw_set_row_context(tbl, tbl->cursor_row); + + InvalidateRect(tbl->hwnd, NULL, FALSE); +} + +static void +cw_toggle_outline_state(khui_credwnd_tbl * tbl, + khui_credwnd_outline * o) { + + int old_range_begin; + int old_range_end; + int new_range_begin; + int new_range_end; + + old_range_begin = o->start; + old_range_end = o->start + o->length - 1; + + o->flags ^= KHUI_CW_O_EXPAND; + + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + new_range_begin = o->start; + new_range_end = o->start + o->length - 1; + + if (tbl->cursor_row > old_range_end) { + tbl->cursor_row -= old_range_end - new_range_end; + } else if (tbl->cursor_row >= old_range_begin && + tbl->cursor_row <= old_range_end) { + tbl->cursor_row = new_range_begin; + } + + if (tbl->anchor_row > old_range_end) { + tbl->anchor_row -= old_range_end - new_range_end; + } else if (tbl->anchor_row >= old_range_begin && + tbl->anchor_row <= old_range_end) { + tbl->anchor_row = new_range_begin; + } + + InvalidateRect(tbl->hwnd, NULL, TRUE); + +} + +LRESULT cw_properties(HWND hwnd); + +LRESULT +cw_wm_mouse(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + int x,y; + RECT r; + int row; + int col; + int i; + int nm_state,nm_row,nm_col; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + /* we are basically trying to capture events where the mouse is + hovering over one of the 'hotspots'. There are two kinds of + hotspots one is the little widget thinggy that you click on to + expand or collapse an outline. The other is a text cell that + is partially concealed. */ + + x = GET_X_LPARAM(lParam); + y = GET_Y_LPARAM(lParam); + x += tbl->scr_left; + y += tbl->scr_top - tbl->header_height; + + row = y / tbl->cell_height; + col = -1; + nm_state = CW_MOUSE_NONE; + nm_row = nm_col = -1; + + for(i=0; i < (int) tbl->n_cols; i++) { + if(x >= tbl->cols[i].x && + x < tbl->cols[i].x + tbl->cols[i].width) { + col = i; + break; + } + } + + if(wParam & MK_LBUTTON) + nm_state = CW_MOUSE_LDOWN; + + if(row >= 0 && row < (int) tbl->n_rows) { + nm_state |= CW_MOUSE_ROW; + nm_row = row; + nm_col = col; + if(tbl->rows[row].flags & KHUI_CW_ROW_HEADER) { + /* are we on a widget then? */ + x -= tbl->cols[tbl->rows[row].col].x; + if(x >= 0 && x < KHUI_SMICON_CX) /* hit */ { + nm_state |= CW_MOUSE_WOUTLINE | CW_MOUSE_WIDGET; + } else if (tbl->cols[tbl->rows[row].col].attr_id == + KCDB_ATTR_ID_NAME && + col == tbl->rows[row].col && + x >= KHUI_SMICON_CX * 3 / 2 && + x < KHUI_SMICON_CX * 5 / 2){ + nm_state |= CW_MOUSE_WSTICKY | CW_MOUSE_WIDGET; + } else if (tbl->cols[tbl->rows[row].col].attr_id == + KCDB_ATTR_ID_NAME && + col == tbl->rows[row].col && + x >= KHUI_SMICON_CX * 3 && + x < KHUI_SMICON_CX * 4) { + nm_state |= CW_MOUSE_WICON | CW_MOUSE_WIDGET; + } + } + } + + /* did the user drag the cursor off the current row? */ + if((tbl->mouse_state & CW_MOUSE_LDOWN) && + (nm_row != tbl->mouse_row)) { + nm_state &= ~CW_MOUSE_WMASK; + } + + if(!(nm_state & CW_MOUSE_LDOWN) && + (tbl->mouse_state & CW_MOUSE_LDOWN) && + tbl->mouse_row == nm_row) { + + if((nm_state & CW_MOUSE_WOUTLINE) && + (tbl->mouse_state & CW_MOUSE_WOUTLINE)) { + /* click on an outline widget */ + khui_credwnd_outline * o; + + o = (khui_credwnd_outline *) tbl->rows[nm_row].data; + tbl->mouse_state = CW_MOUSE_WIDGET | CW_MOUSE_WOUTLINE; + + cw_toggle_outline_state(tbl, o); + + return 0; + } else if ((nm_state & CW_MOUSE_WSTICKY) && + (tbl->mouse_state & CW_MOUSE_WSTICKY)) { + + khui_credwnd_outline * o; + khm_handle ident; + khm_int32 idf = 0; + + o = tbl->rows[nm_row].data; + ident = o->data; + + kcdb_identity_get_flags(ident, &idf); + idf &= KCDB_IDENT_FLAG_STICKY; + kcdb_identity_set_flags(ident, (idf ^ KCDB_IDENT_FLAG_STICKY), + KCDB_IDENT_FLAG_STICKY); + + tbl->mouse_state = CW_MOUSE_WIDGET | CW_MOUSE_WSTICKY; + + return 0; + } else if ((nm_state & CW_MOUSE_WICON) && + (tbl->mouse_state & CW_MOUSE_WICON)) { + /* click on an row icon */ + cw_select_row(tbl, nm_row, wParam); + cw_properties(hwnd); + } else { + /* click on a row */ + cw_select_row(tbl, nm_row, wParam); + + if (tbl->mouse_col == nm_col && + nm_col >= 0 && + tbl->cols[nm_col].attr_id == CW_CA_FLAGS && + !(tbl->rows[nm_row].flags & KHUI_CW_ROW_HEADER)) { + /* clicked on a cred icon */ + + cw_properties(hwnd); + } + } + } + + /* ok, now if we are changing state, we need to invalidate a few + regions */ + if (((tbl->mouse_state ^ nm_state) & (CW_MOUSE_WIDGET | + CW_MOUSE_WOUTLINE | + CW_MOUSE_WSTICKY)) || + tbl->mouse_row != nm_row) { + + if(tbl->mouse_state & CW_MOUSE_WOUTLINE) { + r.left = tbl->cols[tbl->mouse_col].x - tbl->scr_left; + r.top = tbl->mouse_row * tbl->cell_height + + tbl->header_height - tbl->scr_top; + r.right = r.left + KHUI_SMICON_CX; + r.bottom = r.top + tbl->cell_height; + InvalidateRect(tbl->hwnd, &r, TRUE); + } + if(tbl->mouse_state & CW_MOUSE_WSTICKY) { + r.left = KHUI_SMICON_CX * 3 / 2 + + tbl->cols[tbl->mouse_col].x - tbl->scr_left; + r.top = tbl->mouse_row * tbl->cell_height + + tbl->header_height - tbl->scr_top; + r.right = r.left + KHUI_SMICON_CX; + r.bottom = r.top + tbl->cell_height; + InvalidateRect(tbl->hwnd, &r, TRUE); + } + + if ((tbl->mouse_state & nm_state) & CW_MOUSE_LDOWN) { + if (tbl->mouse_row == nm_row) + tbl->mouse_col = nm_col; + } else { + tbl->mouse_col = nm_col; + tbl->mouse_row = nm_row; + } + tbl->mouse_state = nm_state; + + /* same code block as above */ + if(tbl->mouse_state & CW_MOUSE_WOUTLINE) { + r.left = tbl->cols[tbl->mouse_col].x - tbl->scr_left; + r.top = tbl->mouse_row * tbl->cell_height + + tbl->header_height - tbl->scr_top; + r.right = r.left + KHUI_SMICON_CX; + r.bottom = r.top + tbl->cell_height; + InvalidateRect(tbl->hwnd, &r, TRUE); + } + if(tbl->mouse_state & CW_MOUSE_WSTICKY) { + r.left = KHUI_SMICON_CX * 3 / 2 + + tbl->cols[tbl->mouse_col].x - tbl->scr_left; + r.top = tbl->mouse_row * tbl->cell_height + + tbl->header_height - tbl->scr_top; + r.right = r.left + KHUI_SMICON_CX; + r.bottom = r.top + tbl->cell_height; + InvalidateRect(tbl->hwnd, &r, TRUE); + } + } else if(tbl->mouse_state != nm_state) { + + if ((tbl->mouse_state & nm_state) & CW_MOUSE_LDOWN) { + if (tbl->mouse_row == nm_row) { + tbl->mouse_col = nm_col; + tbl->mouse_state = nm_state; + } + } else { + tbl->mouse_col = nm_col; + tbl->mouse_row = nm_row; + tbl->mouse_state = nm_state; + } + } + + /* if it was a double click, also show the property + window */ + if (uMsg == WM_LBUTTONDBLCLK) { + cw_properties(hwnd); + } + + return 0; +} + +LRESULT +cw_wm_hscroll(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + SCROLLINFO si; + RECT cr; + RECT lr; + RECT sr; + int dx; + int newpos; + + tbl = (khui_credwnd_tbl *) (LONG_PTR) GetWindowLongPtr(hwnd, 0); + GetClientRect(hwnd, &cr); + dx = tbl->scr_left; + + switch(LOWORD(wParam)) { + case SB_LEFT: + newpos = 0; + break; + + case SB_RIGHT: + newpos = tbl->ext_width; + break; + + case SB_LINELEFT: + newpos = tbl->scr_left - (tbl->ext_width / 12); + break; + + case SB_LINERIGHT: + newpos = tbl->scr_left + (tbl->ext_width / 12); + break; + + case SB_PAGELEFT: + newpos = tbl->scr_left - (cr.right - cr.left); + break; + + case SB_PAGERIGHT: + newpos = tbl->scr_left + (cr.right - cr.left); + break; + + case SB_THUMBTRACK: + case SB_THUMBPOSITION: + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_TRACKPOS; + GetScrollInfo(hwnd, SB_HORZ, &si); + + newpos = si.nTrackPos; + break; + + default: + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } + + //cr.top += tbl->header_height; + tbl->scr_left = newpos; + cw_update_extents(tbl, TRUE); + + dx -= tbl->scr_left; + + /* exclude the watermark */ + lr.bottom = cr.bottom; + lr.right = cr.right; + lr.top = max(cr.bottom - tbl->kbm_logo_shade.cy, cr.top); + lr.left = max(cr.right - tbl->kbm_logo_shade.cx, cr.left); + + if(cr.top < lr.top && cr.left < cr.right) { + sr.left = cr.left; + sr.right = cr.right; + sr.top = cr.top; + sr.bottom = lr.top; + ScrollWindowEx( + hwnd, + dx, + 0, + &sr, + &sr, + NULL, + NULL, + SW_INVALIDATE | SW_SCROLLCHILDREN); + } + + if(cr.left < lr.left && lr.top < lr.bottom) { + sr.left = cr.left; + sr.right = lr.left; + sr.top = lr.top; + sr.bottom = lr.bottom; + ScrollWindowEx( + hwnd, + dx, + 0, + &sr, + &sr, + NULL, + NULL, + SW_INVALIDATE | SW_SCROLLCHILDREN); + } + + if(lr.top < lr.bottom && lr.left < lr.right) { + InvalidateRect(hwnd, &lr, FALSE); + } + + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +static void +cw_vscroll_to_pos(HWND hwnd, khui_credwnd_tbl * tbl, int newpos) { + RECT cr; + RECT sr; + RECT lr; + int dy; + + GetClientRect(hwnd, &cr); + cr.top += tbl->header_height; + dy = tbl->scr_top; + + tbl->scr_top = newpos; + cw_update_extents(tbl, TRUE); + + dy -= tbl->scr_top; + + /* exclude watermark */ + lr.bottom = cr.bottom; + lr.right = cr.right; + lr.top = max(cr.bottom - tbl->kbm_logo_shade.cy, cr.top); + lr.left = max(cr.right - tbl->kbm_logo_shade.cx, cr.left); + + if(cr.left < lr.left && cr.top < cr.bottom) { + sr.left = cr.left; + sr.right = lr.left; + sr.top = cr.top; + sr.bottom = cr.bottom; + ScrollWindowEx( + hwnd, + 0, + dy, + &sr, + &sr, + NULL, + NULL, + SW_INVALIDATE); + } + + if(lr.left < lr.right && cr.top < lr.top) { + sr.left = lr.left; + sr.right = lr.right; + sr.top = cr.top; + sr.bottom = lr.top; + ScrollWindowEx( + hwnd, + 0, + dy, + &sr, + &sr, + NULL, + NULL, + SW_INVALIDATE); + } + + if(lr.top < lr.bottom && lr.left < lr.right) { + InvalidateRect(hwnd, &lr, FALSE); + } +} + +LRESULT +cw_wm_vscroll(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + SCROLLINFO si; + int newpos; + RECT cr; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + GetClientRect(hwnd, &cr); + cr.top += tbl->header_height; + + switch(LOWORD(wParam)) { + case SB_LEFT: + newpos = 0; + break; + + case SB_BOTTOM: + newpos = tbl->ext_height; + break; + + case SB_LINEUP: + newpos = tbl->scr_top - (tbl->ext_height / 12); + break; + + case SB_LINEDOWN: + newpos = tbl->scr_top + (tbl->ext_height / 12); + break; + + case SB_PAGEUP: + newpos = tbl->scr_top - (cr.bottom - cr.top); + break; + + case SB_PAGEDOWN: + newpos = tbl->scr_top + (cr.bottom - cr.top); + break; + + case SB_THUMBTRACK: + case SB_THUMBPOSITION: + ZeroMemory(&si, sizeof(si)); + si.cbSize = sizeof(si); + si.fMask = SIF_TRACKPOS; + GetScrollInfo(hwnd, SB_VERT, &si); + + newpos = si.nTrackPos; + break; + + default: + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } + + cw_vscroll_to_pos(hwnd, tbl, newpos); + + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +static void +cw_ensure_row_visible(HWND hwnd, khui_credwnd_tbl * tbl, int row) { + RECT r; + int newpos; + + if (row < 0) + row = 0; + else if (row >= (int) tbl->n_rows) + row = (int) tbl->n_rows - 1; + + GetClientRect(hwnd, &r); + r.top += tbl->header_height; + + if (row * tbl->cell_height < tbl->scr_top) { + newpos = row * tbl->cell_height; + } else if ((row + 1) * tbl->cell_height + > tbl->scr_top + (r.bottom - r.top)) { + newpos = ((row + 1) * tbl->cell_height) - (r.bottom - r.top); + } else + return; + + cw_vscroll_to_pos(hwnd, tbl, newpos); +} + +static INT_PTR CALLBACK +cw_pp_ident_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + khui_property_sheet * s; + + switch(uMsg) { + case WM_INITDIALOG: + { + PROPSHEETPAGE * p; + khm_handle ident; + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + khm_size t; + khm_int32 i; + + p = (PROPSHEETPAGE *) lParam; + s = (khui_property_sheet *) p->lParam; + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) s); +#pragma warning(pop) + + ident = s->identity; + + t = sizeof(idname); + kcdb_identity_get_name(ident, idname, &t); + SetDlgItemText(hwnd, IDC_PP_IDNAME, idname); + + kcdb_identity_get_flags(ident, &i); + + CheckDlgButton(hwnd, IDC_PP_IDDEF, + ((i & KCDB_IDENT_FLAG_DEFAULT)?BST_CHECKED: + BST_UNCHECKED)); + + /* if it's default, you can't change it further */ + if (i & KCDB_IDENT_FLAG_DEFAULT) { + EnableWindow(GetDlgItem(hwnd, IDC_PP_IDDEF), FALSE); + } + + CheckDlgButton(hwnd, IDC_PP_IDSEARCH, + ((i & KCDB_IDENT_FLAG_SEARCHABLE)?BST_CHECKED: + BST_UNCHECKED)); + + CheckDlgButton(hwnd, IDC_PP_STICKY, + ((i & KCDB_IDENT_FLAG_STICKY)?BST_CHECKED: + BST_UNCHECKED)); + + khui_property_wnd_set_record(GetDlgItem(hwnd, IDC_PP_PROPLIST), + ident); + } + return TRUE; + + case WM_COMMAND: + s = (khui_property_sheet *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + switch(wParam) { + case MAKEWPARAM(IDC_PP_IDDEF, BN_CLICKED): + /* fallthrough */ + case MAKEWPARAM(IDC_PP_STICKY, BN_CLICKED): + + if (s->status != KHUI_PS_STATUS_NONE) + PropSheet_Changed(s->hwnd, hwnd); + return TRUE; + + case MAKEWPARAM(IDC_PP_CONFIG, BN_CLICKED): + { + khui_config_node cfg_id = NULL; + khui_config_node cfg_ids = NULL; + wchar_t idname[KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + khm_int32 rv; + + khm_refresh_config(); + + rv = khui_cfg_open(NULL, + L"KhmIdentities", + &cfg_ids); + + if (KHM_FAILED(rv)) + return TRUE; + + cb = sizeof(idname); + if (KHM_SUCCEEDED(kcdb_identity_get_name(s->identity, + idname, + &cb))) { + rv = khui_cfg_open(cfg_ids, + idname, + &cfg_id); + } + + if (cfg_id) + khm_show_config_pane(cfg_id); + else + khm_show_config_pane(cfg_ids); + + if (cfg_ids) + khui_cfg_release(cfg_ids); + if (cfg_id) + khui_cfg_release(cfg_id); + } + return TRUE; + } + return FALSE; + + case WM_NOTIFY: + { + LPPSHNOTIFY lpp; + khm_int32 flags; + + lpp = (LPPSHNOTIFY) lParam; + s = (khui_property_sheet *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + switch(lpp->hdr.code) { + case PSN_APPLY: + flags = 0; + if (IsDlgButtonChecked(hwnd, IDC_PP_STICKY) == BST_CHECKED) + flags |= KCDB_IDENT_FLAG_STICKY; + if (IsDlgButtonChecked(hwnd, IDC_PP_IDDEF) == BST_CHECKED) + flags |= KCDB_IDENT_FLAG_DEFAULT; + + kcdb_identity_set_flags(s->identity, flags, + KCDB_IDENT_FLAG_STICKY | + KCDB_IDENT_FLAG_DEFAULT); + return TRUE; + + case PSN_RESET: + kcdb_identity_get_flags(s->identity, &flags); + + CheckDlgButton(hwnd, + IDC_PP_IDDEF, + ((flags & KCDB_IDENT_FLAG_DEFAULT)?BST_CHECKED: + BST_UNCHECKED)); + + /* if it's default, you can't change it further */ + if (flags & KCDB_IDENT_FLAG_DEFAULT) { + EnableWindow(GetDlgItem(hwnd, IDC_PP_IDDEF), FALSE); + } + + CheckDlgButton(hwnd, IDC_PP_IDSEARCH, + ((flags & KCDB_IDENT_FLAG_SEARCHABLE)?BST_CHECKED:BST_UNCHECKED)); + + CheckDlgButton(hwnd, IDC_PP_STICKY, + ((flags & KCDB_IDENT_FLAG_STICKY)?BST_CHECKED:BST_UNCHECKED)); + return TRUE; + } + } + break; + } + return FALSE; +} + +static INT_PTR CALLBACK +cw_pp_cred_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam + ) +{ + switch(uMsg) { + case WM_INITDIALOG: + { + khui_property_sheet * s; + PROPSHEETPAGE * p; + khm_handle cred; + + p = (PROPSHEETPAGE *) lParam; + s = (khui_property_sheet *) p->lParam; + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) s); +#pragma warning(pop) + + cred = s->cred; + + khui_property_wnd_set_record( + GetDlgItem(hwnd, IDC_PP_CPROPLIST), + cred); + } + return TRUE; + } + return FALSE; +} + +static void +cw_pp_begin(khui_property_sheet * s) +{ + PROPSHEETPAGE *p; + + if(s->identity) { + p = PMALLOC(sizeof(*p)); + ZeroMemory(p, sizeof(*p)); + + p->dwSize = sizeof(*p); + p->dwFlags = 0; + p->hInstance = khm_hInstance; + p->pszTemplate = MAKEINTRESOURCE(IDD_PP_IDENT); + p->pfnDlgProc = cw_pp_ident_proc; + p->lParam = (LPARAM) s; + + khui_ps_add_page(s, KHUI_PPCT_IDENTITY, 129, p, NULL); + } + + if(s->cred) { + p = PMALLOC(sizeof(*p)); + ZeroMemory(p, sizeof(*p)); + + p->dwSize = sizeof(*p); + p->dwFlags = 0; + p->hInstance = khm_hInstance; + p->pszTemplate = MAKEINTRESOURCE(IDD_PP_CRED); + p->pfnDlgProc = cw_pp_cred_proc; + p->lParam = (LPARAM) s; + + khui_ps_add_page(s, KHUI_PPCT_CREDENTIAL, 128, p, NULL); + } +} + +static void +cw_pp_precreate(khui_property_sheet * s) +{ + khui_ps_show_sheet(khm_hwnd_main, s); + + khm_add_property_sheet(s); +} + +static void +cw_pp_end(khui_property_sheet * s) +{ + khui_property_page * p = NULL; + + khui_ps_find_page(s, KHUI_PPCT_IDENTITY, &p); + if(p) { + PFREE(p->p_page); + p->p_page = NULL; + } + + p = NULL; + + khui_ps_find_page(s, KHUI_PPCT_CREDENTIAL, &p); + if(p) { + PFREE(p->p_page); + p->p_page = NULL; + } +} + +static void +cw_pp_destroy(khui_property_sheet *ps) +{ + if(ps->ctx.scope == KHUI_SCOPE_CRED) { + if(ps->header.pszCaption) + PFREE((LPWSTR) ps->header.pszCaption); + } + + khui_context_release(&ps->ctx); + + khui_ps_destroy_sheet(ps); + + /* this is pretty weird because ps gets freed when + khui_ps_destroy_sheet() is called. However, since destroying + ps involves sending a WM_DESTROY message to the property sheet, + we still need to keep it on the property sheet chain (or else + the messages will not be delivered). This is only safe because + we are not relinquishing the thread in-between destroying ps + and removing it from the chain. */ + + /* TODO: fix this */ + khm_del_property_sheet(ps); +} + +LRESULT +cw_properties(HWND hwnd) +{ + /* show a property sheet of some sort */ + khui_action_context ctx; + khui_property_sheet * ps; + khui_credwnd_tbl * tbl; + + khui_context_get(&ctx); + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + if(ctx.scope == KHUI_SCOPE_NONE) { + khui_context_release(&ctx); + return FALSE; + + /* While it seems like a good idea, doing this is not */ +#if 0 + /* try to establish a context based on the current cursor + position */ + if(tbl->cursor_row >= 0 && tbl->cursor_row < (int) tbl->n_rows) { + if(tbl->rows[tbl->cursor_row].flags & KHUI_CW_ROW_HEADER) { + if(tbl->cols[tbl->rows[tbl->cursor_row].col].attr_id == KCDB_ATTR_ID_NAME) { + /* identity context */ + ctx.ctx = KHUI_SCOPE_IDENT; + ctx.identity = (khm_handle) + ((khui_credwnd_outline *) tbl->rows[tbl->cursor_row].data)->data; + } else if(tbl->cols[tbl->rows[tbl->cursor_row].col].attr_id == KCDB_ATTR_TYPE_NAME) { + ctx.ctx = KHUI_SCOPE_CREDTYPE; + ctx.cred_type = (khm_int32) (DWORD_PTR) + ((khui_credwnd_outline *) tbl->rows[tbl->cursor_row].data)->data; + } else { + ctx.ctx = KHUI_SCOPE_GROUP; + //ctx.parm = (khm_lparm) tbl->rows[tbl->cursor_row].data; + /* TODO: Figure out method of establishing a credgroup */ + } + } else { + /* a credential context */ + ctx.ctx = KHUI_SCOPE_CRED; + ctx.cred = (khm_handle) tbl->rows[tbl->cursor_row].data; + } + } +#endif + } + + /* if still no context, then we can't show a property sheet */ + if(ctx.scope == KHUI_SCOPE_NONE) { + khui_context_release(&ctx); + return FALSE; + } + + khui_ps_create_sheet(&ps); + + if(ctx.scope == KHUI_SCOPE_IDENT) { + khm_handle ident; + khm_size t; + + ident = ctx.identity; + + ps->header.hInstance = khm_hInstance; + ps->header.pszIcon = MAKEINTRESOURCE(IDI_MAIN_APP); + + kcdb_identity_get_name(ident, NULL, &t); + + if(t > 0) { + ps->header.pszCaption = PMALLOC(t); + kcdb_identity_get_name(ident, + (wchar_t *) ps->header.pszCaption, &t); + } else { + ps->header.pszCaption = NULL; + } + + ps->ctx = ctx; + ps->identity = ident; + ps->credtype = KCDB_CREDTYPE_INVALID; + + kmq_post_message(KMSG_CRED, KMSG_CRED_PP_BEGIN, 0, (void *) ps); + + } else if(ctx.scope == KHUI_SCOPE_CREDTYPE) { + khm_size t = 0; + khm_int32 cred_type; + + cred_type = ctx.cred_type; + + ps->header.hInstance = khm_hInstance; + ps->header.pszIcon = MAKEINTRESOURCE(IDI_MAIN_APP); + + ps->ctx = ctx; + ps->credtype = cred_type; + + if(ctx.identity) { + ps->identity = ctx.identity; + /* also, if there is an associated identity, we assume that + the properties are for the specified credentials type + specific to the identity. Hence we change the title to + something else */ + kcdb_identity_get_name(ctx.identity, NULL, &t); + if (t > 0) { + ps->header.pszCaption = PMALLOC(t); + kcdb_identity_get_name(ctx.identity, (wchar_t *) ps->header.pszCaption, &t); + } else { + ps->header.pszCaption = NULL; + } + } else { + kcdb_credtype_describe(cred_type, NULL, &t, KCDB_TS_LONG); + if(t > 0) { + ps->header.pszCaption = PMALLOC(t); + kcdb_credtype_describe(cred_type, (wchar_t *) ps->header.pszCaption, &t, KCDB_TS_LONG); + } else { + ps->header.pszCaption = NULL; + } + } + + kmq_post_message(KMSG_CRED, KMSG_CRED_PP_BEGIN, 0, (void *) ps); + } else if(ctx.scope == KHUI_SCOPE_CRED) { + khm_handle cred; + khm_size t; + + cred = ctx.cred; + + ps->header.hInstance = khm_hInstance; + ps->header.pszIcon = MAKEINTRESOURCE(IDI_MAIN_APP); + ps->ctx = ctx; + + kcdb_cred_get_name(cred, NULL, &t); + ps->header.pszCaption = PMALLOC(t); + kcdb_cred_get_name(cred, (LPWSTR) ps->header.pszCaption, &t); + + kcdb_cred_get_identity(cred, &ps->identity); + kcdb_cred_get_type(cred, &ps->credtype); + ps->cred = cred; + + kmq_post_message(KMSG_CRED, KMSG_CRED_PP_BEGIN, 0, (void *) ps); + } else { + khui_context_release(&ctx); + khui_ps_destroy_sheet(ps); + } + + /* by the way, if we are actually opening a property sheet, we + leave ctx held (which is now copied to ps->ctx). it will be + released when the property sheet is destroyed */ + + return TRUE; +} + +LRESULT +cw_wm_command(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + khui_credwnd_tbl * tbl; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + if(HIWORD(wParam) == BN_CLICKED && + LOWORD(wParam) == KHUI_HTWND_CTLID) { + + wchar_t wid[256]; + /* a hyperlink was activated */ + khui_htwnd_link * l; + l = (khui_htwnd_link *) lParam; + StringCchCopyN(wid, ARRAYLENGTH(wid), l->id, l->id_len); + wid[l->id_len] = 0; + + if(!wcscmp(wid, L"NewCreds")) { + PostMessage(khm_hwnd_main, WM_COMMAND, + MAKEWPARAM(KHUI_ACTION_NEW_CRED,0), 0); + } + return TRUE; + } + + switch(LOWORD(wParam)) + { + case KHUI_PACTION_ENTER: + /* enter key is a synonym for the default action, on the + context, which is to lauch a property sheet */ + /* fallthrough */ + case KHUI_ACTION_PROPERTIES: + { + return cw_properties(hwnd); + } + break; + + case KHUI_ACTION_LAYOUT_RELOAD: + { + wchar_t cname[KCONF_MAXCCH_NAME]; + khm_size cb; + + cname[0] = L'\0'; + + if (tbl->csp_view) { + cb = sizeof(cname); + khc_get_config_space_name(tbl->csp_view, + cname, + &cb); + } + + cw_unload_view(tbl); + + cw_load_view(tbl, ((cname[0])?cname: NULL), hwnd); + cw_insert_header_cols(tbl); + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, TRUE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + } + break; + + case KHUI_ACTION_LAYOUT_ID: + { + cw_save_view(tbl, NULL); + cw_unload_view(tbl); + + cw_load_view(tbl, L"ByIdentity", hwnd); + cw_insert_header_cols(tbl); + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, FALSE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), KHUI_ACTION_LAYOUT_ID); + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + } + break; + + case KHUI_ACTION_LAYOUT_LOC: + { + cw_save_view(tbl, NULL); + cw_unload_view(tbl); + + cw_load_view(tbl, L"ByLocation", hwnd); + cw_insert_header_cols(tbl); + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, FALSE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_LOC); + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + } + break; + + case KHUI_ACTION_LAYOUT_TYPE: + { + cw_save_view(tbl, NULL); + cw_unload_view(tbl); + + cw_load_view(tbl, L"ByType", hwnd); + cw_insert_header_cols(tbl); + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, FALSE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_TYPE); + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + } + break; + + case KHUI_ACTION_LAYOUT_CUST: + { + cw_save_view(tbl, NULL); + cw_unload_view(tbl); + + cw_load_view(tbl, L"Custom_0", hwnd); + cw_insert_header_cols(tbl); + + cw_update_creds(tbl); + cw_update_outline(tbl); + cw_update_extents(tbl, FALSE); + + InvalidateRect(tbl->hwnd, NULL, TRUE); + + khui_check_radio_action(khui_find_menu(KHUI_MENU_LAYOUT), + KHUI_ACTION_LAYOUT_CUST); + kmq_post_message(KMSG_ACT, KMSG_ACT_REFRESH, 0, 0); + } + break; + + case KHUI_PACTION_UP: + case KHUI_PACTION_UP_EXTEND: + case KHUI_PACTION_UP_TOGGLE: + { /* cursor up */ + khm_int32 new_row; + WPARAM wp = 0; + + new_row = tbl->cursor_row - 1; + + /* checking both bounds. we make no assumption about the + value of cursor_row before this message */ + if(new_row < 0) + new_row = 0; + if(new_row >= (int) tbl->n_rows) + new_row = (int) tbl->n_rows - 1; + + if (LOWORD(wParam) == KHUI_PACTION_UP) + wp = 0; + else if (LOWORD(wParam) == KHUI_PACTION_UP_EXTEND) + wp = MK_SHIFT; + else if (LOWORD(wParam) == KHUI_PACTION_UP_TOGGLE) + wp = 0; //MK_CONTROL; +#ifdef DEBUG + else + assert(FALSE); +#endif + + cw_select_row(tbl, new_row, wp); + cw_ensure_row_visible(hwnd, tbl, new_row); + } + break; + + case KHUI_PACTION_PGUP_EXTEND: + case KHUI_PACTION_PGUP: + { + khm_int32 new_row; + WPARAM wp; + RECT r; + + if (LOWORD(wParam) == KHUI_PACTION_PGUP_EXTEND) + wp = MK_SHIFT; + else + wp = 0; + + GetClientRect(hwnd, &r); + + new_row = tbl->cursor_row - + ((r.bottom - r.top) - tbl->header_height) / tbl->cell_height; + + if (new_row < 0) + new_row = 0; + if (new_row >= (int) tbl->n_rows) + new_row = (int) tbl->n_rows - 1; + + cw_select_row(tbl, new_row, wp); + cw_ensure_row_visible(hwnd, tbl, new_row); + } + break; + + case KHUI_PACTION_DOWN: + case KHUI_PACTION_DOWN_EXTEND: + case KHUI_PACTION_DOWN_TOGGLE: + { /* cursor down */ + khm_int32 new_row; + WPARAM wp = 0; + + new_row = tbl->cursor_row + 1; + + /* checking both bounds. we make no assumption about the + value of cursor_row before this message */ + if(new_row < 0) + new_row = 0; + if(new_row >= (int) tbl->n_rows) + new_row = (int) tbl->n_rows - 1; + + if (LOWORD(wParam) == KHUI_PACTION_DOWN) + wp = 0; + else if (LOWORD(wParam) == KHUI_PACTION_DOWN_EXTEND) + wp = MK_SHIFT; + else if (LOWORD(wParam) == KHUI_PACTION_DOWN_TOGGLE) + wp = 0; //MK_CONTROL; +#ifdef DEBUG + else + assert(FALSE); +#endif + cw_select_row(tbl, new_row, wp); + cw_ensure_row_visible(hwnd, tbl, new_row); + } + break; + + case KHUI_PACTION_PGDN_EXTEND: + case KHUI_PACTION_PGDN: + { + khm_int32 new_row; + RECT r; + WPARAM wp; + + if (LOWORD(wParam) == KHUI_PACTION_PGDN_EXTEND) + wp = MK_SHIFT; + else + wp = 0; + + GetClientRect(hwnd, &r); + + new_row = tbl->cursor_row + + ((r.bottom - r.top) - tbl->header_height) / tbl->cell_height; + + if (new_row < 0) + new_row = 0; + if (new_row >= (int) tbl->n_rows) + new_row = (int) tbl->n_rows - 1; + + cw_select_row(tbl, new_row, wp); + cw_ensure_row_visible(hwnd, tbl, new_row); + } + break; + + case KHUI_PACTION_SELALL: + { + cw_select_all(tbl); + } + break; + + case KHUI_PACTION_LEFT: + { /* collapse and up*/ + khui_credwnd_outline * o; + int r; + + if(tbl->cursor_row < 0 || tbl->cursor_row >= (int) tbl->n_rows) { + cw_select_row(tbl, 0, 0); + break; + } + + for(r = tbl->cursor_row; + (r >= 0 && !(tbl->rows[r].flags & KHUI_CW_ROW_HEADER)); + r--); + + if(r < 0) + break; + + /* If we were not on a header, we collapse the innermost + outline. Otherwise, we collpase up to the parent + outline level */ + + if(r != tbl->cursor_row) { + o = (khui_credwnd_outline *) tbl->rows[r].data; + + cw_toggle_outline_state(tbl, o); + } else { + o = (khui_credwnd_outline *) tbl->rows[r].data; + + if(o->flags & KHUI_CW_O_EXPAND) { + cw_toggle_outline_state(tbl, o); + } else { + o = TPARENT(o); + if(o) { + cw_toggle_outline_state(tbl, o); + r = o->start; + } else if(r > 0) + r--; + } + } + + cw_select_row(tbl, r, 0); + } + break; + + case KHUI_PACTION_RIGHT: + { /* expand and down*/ + khui_credwnd_outline * o; + int r; + + if(tbl->cursor_row < 0 || + tbl->cursor_row >= (int) tbl->n_rows) { + cw_select_row(tbl, 0, 0); + break; + } + + r = tbl->cursor_row; + + if(tbl->rows[r].flags & KHUI_CW_ROW_HEADER) { + o = (khui_credwnd_outline *) tbl->rows[r].data; + if(!(o->flags & KHUI_CW_O_EXPAND)) { + cw_toggle_outline_state(tbl, o); + } + } + + r++; + if (r >= (int) tbl->n_rows) + r = (int)tbl->n_rows - 1; + + cw_select_row(tbl, r, 0); + } + break; + } + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +LRESULT +cw_wm_contextmenu(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + RECT r; + int x,y; + int row; + khui_credwnd_tbl * tbl; + + tbl = (khui_credwnd_tbl *)(LONG_PTR) GetWindowLongPtr(hwnd, 0); + + GetWindowRect(hwnd, &r); + + x = GET_X_LPARAM(lParam); + y = GET_Y_LPARAM(lParam); + + x += tbl->scr_left - r.left; + y += tbl->scr_top - tbl->header_height - r.top; + + if (y < 0) { + /* context menu for header control */ + khm_menu_show_panel(KHUI_MENU_CWHEADER_CTX, + GET_X_LPARAM(lParam), + GET_Y_LPARAM(lParam)); + + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } + + row = y / tbl->cell_height; + + if(row < 0 || row >= (int) tbl->n_rows) + return FALSE; + + cw_set_row_context(tbl, row); + + if((tbl->rows[row].flags & KHUI_CW_ROW_HEADER) && + (tbl->cols[tbl->rows[row].col].attr_id == KCDB_ATTR_ID_NAME)) + { + khm_menu_show_panel(KHUI_MENU_IDENT_CTX, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + //khui_context_reset(); + } else { + khm_menu_show_panel(KHUI_MENU_TOK_CTX, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + //khui_context_reset(); + } + + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +/* copy and paste template */ +#if 0 +LRESULT +cw_wm_msg(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} +#endif + +LRESULT CALLBACK +khm_credwnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch(uMsg) { + case WM_COMMAND: + return cw_wm_command(hwnd, uMsg, wParam, lParam); + + case WM_CREATE: + return cw_wm_create(hwnd, uMsg, wParam, lParam); + + case WM_DESTROY: + return cw_wm_destroy(hwnd, uMsg, wParam, lParam); + + case WM_ERASEBKGND: + /* we don't bother wasting cycles erasing the background + because the foreground elements completely cover the + client area */ + return TRUE; + + case WM_PAINT: + return cw_wm_paint(hwnd, uMsg, wParam, lParam); + + case WM_SIZE: + return cw_wm_size(hwnd, uMsg, wParam, lParam); + + case WM_NOTIFY: + return cw_wm_notify(hwnd, uMsg, wParam, lParam); + + case WM_HSCROLL: + return cw_wm_hscroll(hwnd, uMsg, wParam, lParam); + + case WM_VSCROLL: + return cw_wm_vscroll(hwnd, uMsg, wParam, lParam); + + case KMQ_WM_DISPATCH: + return cw_kmq_wm_dispatch(hwnd, uMsg, wParam, lParam); + + case WM_LBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_MOUSEMOVE: + case WM_LBUTTONUP: + return cw_wm_mouse(hwnd, uMsg, wParam, lParam); + + case WM_CONTEXTMENU: + return cw_wm_contextmenu(hwnd, uMsg, wParam, lParam); + } + + return DefWindowProc(hwnd,uMsg,wParam,lParam); +} + +void +khm_register_credwnd_class(void) { + WNDCLASSEX wcx; + kcdb_attrib attrib; + khm_int32 attr_id; + + wcx.cbSize = sizeof(wcx); + wcx.style = CS_DBLCLKS | CS_OWNDC; + wcx.lpfnWndProc = khm_credwnd_proc; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = sizeof(LONG_PTR); + wcx.hInstance = khm_hInstance; + wcx.hIcon = NULL; + wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); + wcx.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1); + wcx.lpszMenuName = NULL; + wcx.lpszClassName = KHUI_CREDWND_CLASS_NAME; + wcx.hIconSm = NULL; + + khui_credwnd_cls = RegisterClassEx(&wcx); + + /* while we are at it, register the credwnd attribute type as well, and + obtain the type ID */ + if(KHM_FAILED(kcdb_attrib_get_id(KHUI_CREDWND_FLAG_ATTRNAME, &attr_id))) { + ZeroMemory(&attrib, sizeof(attrib)); + attrib.id = KCDB_ATTR_INVALID; + attrib.flags = KCDB_ATTR_FLAG_HIDDEN; + attrib.type = KCDB_TYPE_INT32; + attrib.name = KHUI_CREDWND_FLAG_ATTRNAME; + + kcdb_attrib_register(&attrib, &attr_id); + } + + khui_cw_flag_id = attr_id; +} + +void +khm_unregister_credwnd_class(void) { + UnregisterClass(MAKEINTATOM(khui_credwnd_cls), khm_hInstance); +} + +HWND +khm_create_credwnd(HWND parent) { + RECT r; + HWND hwnd; + + ZeroMemory(attr_to_action, sizeof(attr_to_action)); + + GetClientRect(parent, &r); + + hwnd = CreateWindowEx + (0, + MAKEINTATOM(khui_credwnd_cls), + L"", + WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL, + r.left, + r.top, + r.right - r.left, + r.bottom - r.top, + parent, + NULL, + khm_hInstance, + NULL); + + return hwnd; +} --- krb5-1.4.4.orig/src/windows/identity/ui/newcredwnd.c +++ krb5-1.4.4/src/windows/identity/ui/newcredwnd.c @@ -1,1906 +1,1906 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * Copyright (c) 2006 Secure Endpoints Inc. - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -ATOM khui_newcredwnd_cls; - -/* forward dcl */ -static void -nc_position_credtext(khui_nc_wnd_data * d); - -/* Common dialog procedure. Be careful. This is used by more than - one dialog. */ -static INT_PTR CALLBACK -nc_common_dlg_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - switch(uMsg) { - case WM_INITDIALOG: - { - khui_nc_wnd_data * d; - - d = (khui_nc_wnd_data *) lParam; - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, DWLP_USER, lParam); -#pragma warning(pop) - if (d->nc->subtype == KMSG_CRED_PASSWORD) { - ShowWindow(GetDlgItem(hwnd, IDC_NC_OPTIONS), - SW_HIDE); - } - } - return TRUE; - - case WM_COMMAND: - { - int ctrl_id; - - ctrl_id = LOWORD(wParam); - if (ctrl_id < KHUI_CW_ID_MIN || - ctrl_id > KHUI_CW_ID_MAX) { - /* pump it to the parent */ - PostMessage(GetParent(hwnd), WM_COMMAND, wParam, lParam); - return TRUE; - } /* else we allow the message to fall through and get - passed into the identity provider's message - handler. */ - } - break; - -#if 0 - /* someday this will be used to draw custom tab buttons. But - that's not today */ - case WM_DRAWITEM: - { - khui_nc_wnd_data * d; - int id; - LPDRAWITEMSTRUCT ds; - - d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER); - id = wParam; - ds = (LPDRAWITEMSTRUCT) lParam; - - if(id >= NC_TS_CTRL_ID_MIN && id <= NC_TS_CTRL_ID_MAX) { - /*TODO: custom draw the buttons */ - } - else - return FALSE; - } - break; -#endif - - case KHUI_WM_NC_NOTIFY: - { - khui_nc_wnd_data * d; - d = (khui_nc_wnd_data *)(LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - /* message sent by parent to notify us of something */ - switch(HIWORD(wParam)) { - case WMNC_DIALOG_EXPAND: - if(hwnd == d->dlg_main) { - HWND hw; - - if(hw = GetDlgItem(hwnd, IDOK)) - ShowWindow(hw, SW_HIDE); - if(hw = GetDlgItem(hwnd, IDCANCEL)) - ShowWindow(hw, SW_HIDE); - if(hw = GetDlgItem(hwnd, IDC_NC_OPTIONS)) - ShowWindow(hw, SW_HIDE); - - d->r_credtext.bottom = d->r_area.bottom; - - nc_position_credtext(d); - - return TRUE; - } - } - } - return TRUE; - } - - /* check if we have a wnd_data, and if so pass the message on to - the identity provider callback. */ - { - khui_nc_wnd_data * d; - - d = (khui_nc_wnd_data *) (LONG_PTR) - GetWindowLongPtr(hwnd, DWLP_USER); - - if (d && d->nc && d->nc->ident_cb) { - return d->nc->ident_cb(d->nc, WMNC_IDENT_WMSG, hwnd, uMsg, - wParam, lParam); - } - } - - return FALSE; -} - -static void -nc_position_credtext(khui_nc_wnd_data * d) -{ - HWND hw; - - hw = GetDlgItem(d->dlg_main, IDC_NC_CREDTEXT); -#ifdef DEBUG - assert(hw); -#endif - - if (d->r_credtext.bottom < d->r_credtext.top + d->r_row.bottom * 2) { - /* not enough room */ - if (d->nc->mode == KHUI_NC_MODE_MINI && - d->nc->subtype != KMSG_CRED_PASSWORD) { - PostMessage(d->nc->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_EXPAND), 0); - return; - } else { - ShowWindow(hw, SW_HIDE); - return; - } - } else { - ShowWindow(hw, SW_SHOW); - } - - SetWindowPos(hw, NULL, - d->r_credtext.left + d->r_n_input.left, /* x */ - d->r_credtext.top, /* y */ - d->r_n_input.right - d->r_n_input.left, /* width */ - d->r_credtext.bottom - d->r_credtext.top, /* height */ - SWP_NOACTIVATE | SWP_NOOWNERZORDER | - SWP_NOZORDER); - - hw = GetDlgItem(d->dlg_main, IDC_NC_CREDTEXT_LABEL); - - SetWindowPos(hw, NULL, - d->r_credtext.left + d->r_n_label.left, /* x */ - d->r_credtext.top, /* y */ - d->r_n_label.right - d->r_n_label.left, /* width */ - d->r_n_label.bottom - d->r_n_label.top, /* height */ - SWP_NOACTIVATE | SWP_NOOWNERZORDER | - SWP_NOZORDER); -} - -/* sorts tab buttons */ -static int __cdecl -nc_tab_sort_func(const void * v1, const void * v2) -{ - /* v1 and v2 and of type : khui_new_creds_by_type ** */ - khui_new_creds_by_type *t1, *t2; - - t1 = *((khui_new_creds_by_type **) v1); - t2 = *((khui_new_creds_by_type **) v2); - - if(t1->ordinal != -1) { - if(t2->ordinal != -1) { - if(t1->ordinal == t2->ordinal) - return wcscmp(t1->name, t2->name); - else - /* safe to convert to an int here */ - return (int) (t1->ordinal - t2->ordinal); - } else - return -1; - } else { - if(t2->ordinal != -1) - return 1; - else if (t1->name && t2->name) - return wcscmp(t1->name, t2->name); - else - return 0; - } -} - -static void -nc_notify_types_async(khui_new_creds * c, UINT uMsg, - WPARAM wParam, LPARAM lParam) -{ - khm_size i; - - for(i=0; in_types; i++) { - PostMessage(c->types[i]->hwnd_panel, uMsg, wParam, lParam); - } -} - -static void -nc_notify_types(khui_new_creds * c, UINT uMsg, - WPARAM wParam, LPARAM lParam) -{ - khm_size i; - - for(i=0; in_types; i++) { - SendMessage(c->types[i]->hwnd_panel, uMsg, wParam, lParam); - } -} - -static void -nc_clear_password_fields(khui_nc_wnd_data * d) -{ - khm_size i; - khm_boolean need_sync = FALSE; - - khui_cw_lock_nc(d->nc); - - for (i=0; i < d->nc->n_prompts; i++) { - if ((d->nc->prompts[i]->flags & KHUI_NCPROMPT_FLAG_HIDDEN) && - d->nc->prompts[i]->hwnd_edit) { - SetWindowText(d->nc->prompts[i]->hwnd_edit, - L""); - need_sync = TRUE; - } - } - - khui_cw_unlock_nc(d->nc); - - if (need_sync) { - khui_cw_sync_prompt_values(d->nc); - } -} - -#define NC_MAXCCH_CREDTEXT 16384 -#define NC_MAXCB_CREDTEXT (NC_MAXCCH_CREDTEXT * sizeof(wchar_t)) - -static void -nc_update_credtext(khui_nc_wnd_data * d) -{ - wchar_t * ctbuf = NULL; - wchar_t * buf; - BOOL okEnable = FALSE; - BOOL validId = FALSE; - HWND hw = NULL; - size_t cch = 0; - - ctbuf = PMALLOC(NC_MAXCB_CREDTEXT); - - assert(ctbuf != NULL); - - LoadString(khm_hInstance, IDS_NC_CREDTEXT_TABS, ctbuf, NC_MAXCCH_CREDTEXT); - StringCchLength(ctbuf, NC_MAXCCH_CREDTEXT, &cch); - buf = ctbuf + cch; - nc_notify_types(d->nc, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_UPDATE_CREDTEXT), (LPARAM) d->nc); - - /* hopefully all the types have updated their credential texts */ - if(d->nc->n_identities == 1) { - wchar_t main_fmt[256]; - wchar_t id_fmt[256]; - wchar_t id_name[KCDB_IDENT_MAXCCH_NAME]; - wchar_t id_string[KCDB_IDENT_MAXCCH_NAME + 256]; - khm_size cbbuf; - khm_int32 flags; - - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_ONE, - main_fmt, (int) ARRAYLENGTH(main_fmt)); - - cbbuf = sizeof(id_name); - kcdb_identity_get_name(d->nc->identities[0], id_name, &cbbuf); - - kcdb_identity_get_flags(d->nc->identities[0], &flags); - - if (flags & KCDB_IDENT_FLAG_INVALID) { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_INVALID, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } else if(flags & KCDB_IDENT_FLAG_VALID) { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_VALID, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } else if(d->nc->subtype == KMSG_CRED_NEW_CREDS) { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_CHECKING, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } else { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_UNCHECKED, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } - - StringCbPrintf(id_string, sizeof(id_string), id_fmt, id_name); - - StringCbPrintf(buf, NC_MAXCB_CREDTEXT - cch*sizeof(wchar_t), - main_fmt, id_string); - - if (flags & KCDB_IDENT_FLAG_VALID) { - if (flags & KCDB_IDENT_FLAG_DEFAULT) - LoadString(khm_hInstance, IDS_NC_ID_DEF, - id_string, ARRAYLENGTH(id_string)); - else if (d->nc->set_default) - LoadString(khm_hInstance, IDS_NC_ID_WDEF, - id_string, ARRAYLENGTH(id_string)); - else - LoadString(khm_hInstance, IDS_NC_ID_NDEF, - id_string, ARRAYLENGTH(id_string)); - - StringCbCat(buf, NC_MAXCB_CREDTEXT - cch * sizeof(wchar_t), - id_string); - } - - } else if(d->nc->n_identities > 1) { - wchar_t *ids_string; - khm_size cb_ids_string; - - wchar_t id_name[KCDB_IDENT_MAXCCH_NAME]; - wchar_t id_fmt[256]; - wchar_t id_string[KCDB_IDENT_MAXCCH_NAME + 256]; - - wchar_t main_fmt[256]; - khm_size cbbuf; - - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_MANY, - main_fmt, (int) ARRAYLENGTH(main_fmt)); - - /* we are going to concatenate all the identity names into - a comma separated string */ - - /* d->nc->n_identities is at least 2 */ - ids_string = PMALLOC((KCDB_IDENT_MAXCB_NAME + sizeof(id_fmt)) * - (d->nc->n_identities - 1)); - cb_ids_string = - (KCDB_IDENT_MAXCB_NAME + sizeof(id_fmt)) * - (d->nc->n_identities - 1); - - assert(ids_string != NULL); - - ids_string[0] = 0; - - { - khm_size i; - khm_int32 flags; - - for(i=1; inc->n_identities; i++) { - if(i>1) { - StringCbCat(ids_string, cb_ids_string, L","); - } - - flags = 0; - - cbbuf = sizeof(id_name); - kcdb_identity_get_name(d->nc->identities[i], id_name, &cbbuf); - kcdb_identity_get_flags(d->nc->identities[i], &flags); - if(flags & KCDB_IDENT_FLAG_INVALID) { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_INVALID, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } else if(flags & KCDB_IDENT_FLAG_VALID) { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_VALID, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } else { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_UNCHECKED, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } - - StringCbPrintf(id_string, sizeof(id_string), id_fmt, id_name); - StringCbCat(ids_string, cb_ids_string, id_string); - } - - cbbuf = sizeof(id_name); - kcdb_identity_get_name(d->nc->identities[0], id_name, &cbbuf); - kcdb_identity_get_flags(d->nc->identities[0], &flags); - if(flags & KCDB_IDENT_FLAG_INVALID) { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_INVALID, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } else if(flags & KCDB_IDENT_FLAG_VALID) { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_VALID, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } else { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_UNCHECKED, - id_fmt, (int) ARRAYLENGTH(id_fmt)); - } - StringCbPrintf(id_string, sizeof(id_string), id_fmt, id_name); - - StringCbPrintf(buf, NC_MAXCB_CREDTEXT - cch*sizeof(wchar_t), - main_fmt, id_string, ids_string); - - PFREE(ids_string); - } - } else { - LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_NONE, - buf, (int)(NC_MAXCCH_CREDTEXT - cch)); - } - - /* now, append the credtext string from each of the cred types */ - { - khm_size i; - size_t cb; - wchar_t * buf; - - cb = NC_MAXCB_CREDTEXT; - buf = ctbuf; - - for(i=0; inc->n_types; i++) { - if(d->nc->types[i]->credtext != NULL) { - StringCbCatEx(buf, cb, - d->nc->types[i]->credtext, - &buf, &cb, - 0); - } - } - } - - SetDlgItemText(d->dlg_main, IDC_NC_CREDTEXT, ctbuf); - - PFREE(ctbuf); - - /* so depending on whether the primary identity was found to be - invalid, we need to disable the Ok button and set the title to - reflect this */ - - if(d->nc->n_identities > 0) { - khm_int32 flags = 0; - - if(KHM_SUCCEEDED(kcdb_identity_get_flags(d->nc->identities[0], - &flags)) && - (flags & KCDB_IDENT_FLAG_VALID)) { - validId = TRUE; - } - } - - if (d->nc->window_title == NULL) { - if(validId) { - wchar_t wpostfix[256]; - wchar_t wtitle[KCDB_IDENT_MAXCCH_NAME + 256]; - khm_size cbsize; - - cbsize = sizeof(wtitle); - kcdb_identity_get_name(d->nc->identities[0], wtitle, &cbsize); - - if (d->nc->subtype == KMSG_CRED_PASSWORD) - LoadString(khm_hInstance, IDS_WTPOST_PASSWORD, - wpostfix, (int) ARRAYLENGTH(wpostfix)); - else - LoadString(khm_hInstance, IDS_WTPOST_NEW_CREDS, - wpostfix, (int) ARRAYLENGTH(wpostfix)); - - StringCbCat(wtitle, sizeof(wtitle), wpostfix); - - SetWindowText(d->nc->hwnd, wtitle); - } else { - wchar_t wtitle[256]; - - if (d->nc->subtype == KMSG_CRED_PASSWORD) - LoadString(khm_hInstance, IDS_WT_PASSWORD, - wtitle, (int) ARRAYLENGTH(wtitle)); - else - LoadString(khm_hInstance, IDS_WT_NEW_CREDS, - wtitle, (int) ARRAYLENGTH(wtitle)); - - SetWindowText(d->nc->hwnd, wtitle); - } - } - - if (!(d->nc->response & KHUI_NC_RESPONSE_PROCESSING)) { - if(validId || d->nc->subtype == KMSG_CRED_PASSWORD) { - /* TODO: check if all the required fields have valid values - before enabling the Ok button */ - okEnable = TRUE; - } - - hw = GetDlgItem(d->dlg_main, IDOK); - EnableWindow(hw, okEnable); - hw = GetDlgItem(d->dlg_bb, IDOK); - EnableWindow(hw, okEnable); - } -} - -#define CW_PARAM DWLP_USER - -static void -nc_add_control_row(khui_nc_wnd_data * d, - HWND label, - HWND input, - khui_control_size size); - -static LRESULT -nc_handle_wm_create(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - LPCREATESTRUCT lpc; - khui_new_creds * c; - khui_nc_wnd_data * ncd; - int x, y; - int width, height; - RECT r; - - lpc = (LPCREATESTRUCT) lParam; - - ncd = PMALLOC(sizeof(*ncd)); - ZeroMemory(ncd, sizeof(*ncd)); - - c = (khui_new_creds *) lpc->lpCreateParams; - ncd->nc = c; - c->hwnd = hwnd; - -#pragma warning(push) -#pragma warning(disable: 4244) - SetWindowLongPtr(hwnd, CW_PARAM, (LONG_PTR) ncd); -#pragma warning(pop) - - /* first try to create the main dialog panel */ - - assert(c->subtype == KMSG_CRED_NEW_CREDS || - c->subtype == KMSG_CRED_PASSWORD); - - ncd->dlg_main = CreateDialogParam(khm_hInstance, - MAKEINTRESOURCE(IDD_NC_PASSWORD), - hwnd, - nc_common_dlg_proc, - (LPARAM) ncd); -#ifdef DEBUG - assert(ncd->dlg_main); -#endif - - { - RECT r_main; - RECT r_area; - RECT r_row; - HWND hw; - - /* pick out metrics for use by the custom prompter stuff */ - GetWindowRect(ncd->dlg_main, &r_main); - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_PANEL); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r_area); - OffsetRect(&r_area,-r_main.left, -r_main.top); - CopyRect(&ncd->r_area, &r_area); - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_ROW); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r); - CopyRect(&r_row, &r); - OffsetRect(&r,-r.left, -r.top); - CopyRect(&ncd->r_row, &r); - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_LABEL); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r); - OffsetRect(&r,-r_row.left, -r_row.top); - CopyRect(&ncd->r_n_label, &r); - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_INPUT); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r); - OffsetRect(&r, -r_row.left, -r_row.top); - CopyRect(&ncd->r_n_input, &r); - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_ROW_LG); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r_row); - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_LABEL_LG); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r); - OffsetRect(&r, -r_row.left, -r_row.top); - CopyRect(&ncd->r_e_label, &r); - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_INPUT_LG); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r); - OffsetRect(&r, -r_row.left, -r_row.top); - CopyRect(&ncd->r_e_input, &r); - - CopyRect(&ncd->r_credtext, &ncd->r_area); - CopyRect(&ncd->r_idspec, &ncd->r_area); - - ncd->r_idspec.bottom = ncd->r_idspec.top; - - hw = GetDlgItem(ncd->dlg_main, IDC_NC_CREDTEXT); -#ifdef DEBUG - assert(hw); -#endif - GetWindowRect(hw, &r); - OffsetRect(&r, -r_main.left, -r_main.top); - ncd->r_credtext.bottom = r.bottom; - } - - /* if the mode is 'mini'*/ - r.left = 0; - r.top = 0; - if(c->mode == KHUI_NC_MODE_MINI) { - r.right = NCDLG_WIDTH; - r.bottom = NCDLG_HEIGHT; - } else { - r.right = NCDLG_WIDTH + NCDLG_BBAR_WIDTH; - r.bottom = NCDLG_HEIGHT + NCDLG_TAB_HEIGHT; - } - - MapDialogRect(ncd->dlg_main, &r); - - ncd->r_main.left = 0; - ncd->r_main.top = 0; - ncd->r_main.right = NCDLG_WIDTH; - ncd->r_main.bottom = NCDLG_HEIGHT; - - ncd->r_ts.left = 0; - ncd->r_ts.top = ncd->r_main.bottom; - ncd->r_ts.right = ncd->r_main.right; - ncd->r_ts.bottom = ncd->r_ts.top + NCDLG_TAB_HEIGHT; - - ncd->r_bb.left = ncd->r_main.right; - ncd->r_bb.top = 0; - ncd->r_bb.right = ncd->r_bb.left + NCDLG_BBAR_WIDTH; - ncd->r_bb.bottom = ncd->r_ts.bottom; - - MapDialogRect(ncd->dlg_main, &(ncd->r_main)); - MapDialogRect(ncd->dlg_main, &(ncd->r_ts)); - MapDialogRect(ncd->dlg_main, &(ncd->r_bb)); - - /* center the new creds window over the main NetIDMgr window */ - width = r.right - r.left; - height = r.bottom - r.top; - - /* adjust width and height to accomodate NC area */ - { - RECT wr,cr; - - GetWindowRect(hwnd, &wr); - GetClientRect(hwnd, &cr); - - /* the non-client and client areas have already been calculated - at this point. We just use the difference to adjust the width - and height */ - width += (wr.right - wr.left) - (cr.right - cr.left); - height += (wr.bottom - wr.top) - (cr.bottom - cr.top); - } - - GetWindowRect(lpc->hwndParent, &r); - x = (r.right + r.left)/2 - width / 2; - y = (r.top + r.bottom)/2 - height / 2; - - MoveWindow(hwnd, x, y, width, height, FALSE); - - SetWindowPos(ncd->dlg_main, - NULL, - ncd->r_main.left, - ncd->r_main.top, - ncd->r_main.right - ncd->r_main.left, - ncd->r_main.bottom - ncd->r_main.top, - SWP_DEFERERASE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | - SWP_NOREDRAW | SWP_NOZORDER); - - /* IDD_NC_BBAR is the button bar that sits on the right of the - dialog when the new creds window is in 'expanded' mode. */ - - ncd->dlg_bb = CreateDialogParam(khm_hInstance, - MAKEINTRESOURCE(IDD_NC_BBAR), - hwnd, - nc_common_dlg_proc, - (LPARAM) ncd); - -#ifdef DEBUG - assert(ncd->dlg_bb); -#endif - - SetWindowPos(ncd->dlg_bb, - NULL, - ncd->r_bb.left, - ncd->r_bb.top, - ncd->r_bb.right - ncd->r_bb.left, - ncd->r_bb.bottom - ncd->r_bb.top, - SWP_DEFERERASE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | - SWP_NOREDRAW | SWP_NOZORDER); - - /* IDD_NC_TS is the tab strip that sits below the main panel when - the new creds window is in 'expanded' mode */ - - ncd->dlg_ts = CreateDialogParam(khm_hInstance, - MAKEINTRESOURCE(IDD_NC_TS), - hwnd, - nc_common_dlg_proc, - (LPARAM) ncd); - -#ifdef DEBUG - assert(ncd->dlg_ts); -#endif - - SetWindowPos(ncd->dlg_ts, - NULL, - ncd->r_ts.left, - ncd->r_ts.top, - ncd->r_ts.right - ncd->r_ts.left, - ncd->r_ts.bottom - ncd->r_ts.top, - SWP_DEFERERASE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | - SWP_NOREDRAW | SWP_NOZORDER); - - if(c->mode == KHUI_NC_MODE_MINI) { - /* hide and show stuff */ - ShowWindow(ncd->dlg_main, SW_SHOW); - ShowWindow(ncd->dlg_bb, SW_HIDE); - ShowWindow(ncd->dlg_ts, SW_HIDE); - - nc_position_credtext(ncd); - - } else { - /* hide and show stuff */ - ShowWindow(ncd->dlg_main, SW_SHOW); - ShowWindow(ncd->dlg_bb, SW_SHOW); - ShowWindow(ncd->dlg_ts, SW_SHOW); - - PostMessage(ncd->dlg_main, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_EXPAND), 0); - } - - /* Call the identity provider callback to set the identity - selector controls */ - c->ident_cb(c, WMNC_IDENT_INIT, NULL, 0, 0, (LPARAM) ncd->dlg_main); - -#if 0 - { - HWND hw; - wchar_t wcaption[64]; - - LoadString(khm_hInstance, IDS_NC_SETDEF, wcaption, - ARRAYLENGTH(wcaption)); - - /* Now create the set as default button */ - hw = CreateWindow - (L"BUTTON", - wcaption, - WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, - 0, 0, 100, 100, - ncd->dlg_main, - (HMENU) NC_BN_SET_DEF_ID, - khm_hInstance, - NULL); - - nc_add_control_row(ncd, NULL, hw, KHUI_CTRLSIZE_HALF); - } -#endif - /* we defer the creation of the tab buttons for later */ - - /* add this to the dialog chain */ - khm_add_dialog(hwnd); - - return TRUE; -} - -static void -nc_add_control_row(khui_nc_wnd_data * d, - HWND label, - HWND input, - khui_control_size size) -{ - RECT r_row; - RECT r_label; - RECT r_input; - HFONT hf; - - hf = (HFONT) SendMessage(d->dlg_main, WM_GETFONT, 0, 0); - SendMessage(label, WM_SETFONT, (WPARAM) hf, FALSE); - SendMessage(input, WM_SETFONT, (WPARAM) hf, FALSE); - - CopyRect(&r_row, &d->r_row); - OffsetRect(&r_row, d->r_idspec.left, d->r_idspec.bottom); - - if (size == KHUI_CTRLSIZE_SMALL) { - CopyRect(&r_label, &d->r_n_label); - CopyRect(&r_input, &d->r_n_input); - OffsetRect(&r_label, r_row.left, r_row.top); - OffsetRect(&r_input, r_row.left, r_row.top); - } else if (size == KHUI_CTRLSIZE_HALF) { - CopyRect(&r_label, &d->r_e_label); - CopyRect(&r_input, &d->r_e_input); - OffsetRect(&r_label, r_row.left, r_row.top); - OffsetRect(&r_input, r_row.left, r_row.top); - } else if (size == KHUI_CTRLSIZE_FULL) { - CopyRect(&r_label, &d->r_n_label); - r_label.right = d->r_row.right; - CopyRect(&r_input, &d->r_n_input); - OffsetRect(&r_input, r_row.left, r_row.top); - OffsetRect(&r_input, 0, r_input.bottom); - r_row.bottom += r_input.bottom; - OffsetRect(&r_label, r_row.left, r_row.top); - } else { - SetRectEmpty(&r_label); - SetRectEmpty(&r_input); -#ifdef DEBUG - assert(FALSE); -#else - return; -#endif - } - - if (label) - SetWindowPos(label, - ((d->hwnd_last_idspec != NULL)? - d->hwnd_last_idspec: - HWND_TOP), - r_label.left, r_label.top, - r_label.right - r_label.left, - r_label.bottom - r_label.top, - SWP_DEFERERASE | SWP_NOACTIVATE | - SWP_NOOWNERZORDER); - - if (input) - SetWindowPos(input, - (label ? label : ((d->hwnd_last_idspec != NULL)? - d->hwnd_last_idspec: - HWND_TOP)), - r_input.left, r_input.top, - r_input.right - r_input.left, - r_input.bottom - r_input.top, - SWP_DEFERERASE | SWP_NOACTIVATE | - SWP_NOOWNERZORDER); - - d->hwnd_last_idspec = input; - - d->r_idspec.bottom = r_row.bottom; - - d->r_credtext.top = r_row.bottom; - - nc_position_credtext(d); -} - - -static LRESULT -nc_handle_wm_destroy(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - khui_nc_wnd_data * d; - khm_size i; - - /* remove self from dialog chain */ - khm_del_dialog(hwnd); - - d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); - - d->nc->ident_cb(d->nc, WMNC_IDENT_EXIT, NULL, 0, 0, 0); - - if(d->hwnd_tc_main) - DestroyWindow(d->hwnd_tc_main); - for(i=0;inc->n_types;i++) { - if(d->nc->types[i]->hwnd_tc) { - DestroyWindow(d->nc->types[i]->hwnd_tc); - d->nc->types[i]->hwnd_tc = NULL; - } - } - - if(d->dlg_bb) - DestroyWindow(d->dlg_bb); - if(d->dlg_main) - DestroyWindow(d->dlg_main); - if(d->dlg_ts) - DestroyWindow(d->dlg_ts); - - d->dlg_bb = NULL; - d->dlg_main = NULL; - d->dlg_ts = NULL; - - PFREE(d); - - return TRUE; -} - -static LRESULT -nc_handle_wm_command(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - khui_nc_wnd_data * d; - int id; - - d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); - - switch(HIWORD(wParam)) { - case BN_CLICKED: - switch(LOWORD(wParam)) { - - case IDOK: - d->nc->result = KHUI_NC_RESULT_PROCESS; - - /* fallthrough */ - - case IDCANCEL: - /* the default value for d->nc->result is set to - KHUI_NC_RESULT_CANCEL */ - d->nc->response = KHUI_NC_RESPONSE_PROCESSING; - - nc_notify_types(d->nc, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0,WMNC_DIALOG_PREPROCESS), - (LPARAM) d->nc); - - khui_cw_sync_prompt_values(d->nc); - - khm_cred_dispatch_process_message(d->nc); - - /* we won't know whether to abort or not until we get - feedback from the plugins, even if the command was - to cancel */ - { - HWND hw; - - hw = GetDlgItem(d->dlg_main, IDOK); - EnableWindow(hw, FALSE); - hw = GetDlgItem(d->dlg_main, IDCANCEL); - EnableWindow(hw, FALSE); - hw = GetDlgItem(d->dlg_main, IDC_NC_OPTIONS); - EnableWindow(hw, FALSE); - hw = GetDlgItem(d->dlg_bb, IDOK); - EnableWindow(hw, FALSE); - hw = GetDlgItem(d->dlg_bb, IDCANCEL); - EnableWindow(hw, FALSE); - } - return FALSE; - - case IDC_NC_HELP: - khm_html_help(hwnd, NULL, HH_HELP_CONTEXT, IDH_ACTION_NEW_ID); - return FALSE; - - case IDC_NC_OPTIONS: - /* the Options button in the main window was clicked. we - respond by expanding the dialog. */ - PostMessage(hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_EXPAND), 0); - return FALSE; - - case IDC_NC_CREDTEXT: /* credtext link activated */ - { - khui_htwnd_link * l; - wchar_t sid[KHUI_MAXCCH_HTLINK_FIELD]; - wchar_t sparam[KHUI_MAXCCH_HTLINK_FIELD]; - wchar_t * colon; - - l = (khui_htwnd_link *) lParam; - - /* do we have a valid link? */ - if(l->id == NULL || l->id_len >= ARRAYLENGTH(sid)) - return TRUE; /* nope */ - - StringCchCopyN(sid, ARRAYLENGTH(sid), l->id, l->id_len); - sid[l->id_len] = L'\0'; /* just make sure */ - - if(l->param != NULL && - l->param_len < ARRAYLENGTH(sparam) && - l->param_len > 0) { - - StringCchCopyN(sparam, ARRAYLENGTH(sparam), - l->param, l->param_len); - sparam[l->param_len] = L'\0'; - - } else { - sparam[0] = L'\0'; - } - - /* If the ID is of the form ':' - and is a valid name of a credentials - type that is participating in the credentials - acquisition process, then we forward the message to - the panel that is providing the UI for that cred - type. We also switch to that panel first. */ - - colon = wcschr(sid, L':'); - if (colon != NULL) { - khm_int32 credtype; - khui_new_creds_by_type * t; - - *colon = L'\0'; - if (KHM_SUCCEEDED(kcdb_credtype_get_id(sid, &credtype)) && - KHM_SUCCEEDED(khui_cw_find_type(d->nc, credtype, &t))){ - *colon = L':'; - - if (t->ordinal != d->ctab) - PostMessage(hwnd, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(t->ordinal, - WMNC_DIALOG_SWITCH_PANEL), - 0); - - return SendMessage(t->hwnd_panel, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_CREDTEXT_LINK), - lParam); - } - } - - /* if it was for us, then we need to process the message */ - if(!_wcsicmp(sid, CTLINKID_SWITCH_PANEL)) { - khm_int32 credtype; - khui_new_creds_by_type * t; - - if (KHM_SUCCEEDED(kcdb_credtype_get_id(sparam, - &credtype)) && - KHM_SUCCEEDED(khui_cw_find_type(d->nc, - credtype, &t))) { - if (t->ordinal != d->ctab) - PostMessage(hwnd, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(t->ordinal, - WMNC_DIALOG_SWITCH_PANEL), - 0); - } - } else if (!_wcsicmp(sid, L"NotDef")) { - d->nc->set_default = FALSE; - nc_update_credtext(d); - } else if (!_wcsicmp(sid, L"MakeDef")) { - d->nc->set_default = TRUE; - nc_update_credtext(d); - } - } - return FALSE; - -#if 0 - case NC_BN_SET_DEF_ID: - { - d->nc->set_default = - (IsDlgButtonChecked(d->dlg_main, NC_BN_SET_DEF_ID) - == BST_CHECKED); - } - return FALSE; -#endif - - default: - /* if one of the tab strip buttons were pressed, then - we should switch to that panel */ - id = LOWORD(wParam); - if(id >= NC_TS_CTRL_ID_MIN && id <= NC_TS_CTRL_ID_MAX) { - id -= NC_TS_CTRL_ID_MIN; - PostMessage(hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(id, WMNC_DIALOG_SWITCH_PANEL),0); - return FALSE; - } - } - break; - } - - return TRUE; -} - -static LRESULT nc_handle_wm_moving(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - khui_nc_wnd_data * d; - - d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); - - nc_notify_types(d->nc, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_MOVE), (LPARAM) d->nc); - - return FALSE; -} - -static LRESULT nc_handle_wm_nc_notify(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - khui_nc_wnd_data * d; - RECT r; - int width, height; - khm_size id; - - d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); - - switch(HIWORD(wParam)) { - - case WMNC_DIALOG_SWITCH_PANEL: - id = LOWORD(wParam); - if(id >= 0 && id <= d->nc->n_types) { - /* one of the tab buttons were pressed */ - if(d->ctab == id) { - return TRUE; /* nothign to do */ - } - - if(d->ctab == 0) { - ShowWindow(d->dlg_main, SW_HIDE); - SendMessage(d->hwnd_tc_main, - BM_SETCHECK, BST_UNCHECKED, 0); - } else { - ShowWindow(d->nc->types[d->ctab - 1]->hwnd_panel, SW_HIDE); - SendMessage(d->nc->types[d->ctab - 1]->hwnd_tc, - BM_SETCHECK, BST_UNCHECKED, 0); - } - - d->ctab = id; - - if(d->ctab == 0) { - ShowWindow(d->dlg_main, SW_SHOW); - SendMessage(d->hwnd_tc_main, - BM_SETCHECK, BST_CHECKED, 0); - } else { - ShowWindow(d->nc->types[id - 1]->hwnd_panel, SW_SHOW); - SendMessage(d->nc->types[id - 1]->hwnd_tc, - BM_SETCHECK, BST_CHECKED, 0); - } - } - - if(d->nc->mode == KHUI_NC_MODE_EXPANDED) - return TRUE; - /*else*/ - /* fallthrough */ - - case WMNC_DIALOG_EXPAND: - /* we are expanding the dialog box */ - - /* nothing to do? */ - if (d->nc->mode == KHUI_NC_MODE_EXPANDED) - break; - - d->nc->mode = KHUI_NC_MODE_EXPANDED; - - r.top = 0; - r.left = 0; - r.right = NCDLG_WIDTH + NCDLG_BBAR_WIDTH; - r.bottom = NCDLG_HEIGHT + NCDLG_TAB_HEIGHT; - - MapDialogRect(d->dlg_main, &r); - - width = r.right - r.left; - height = r.bottom - r.top; - - /* adjust width and height to accomodate NC area */ - { - RECT wr,cr; - - GetWindowRect(hwnd, &wr); - GetClientRect(hwnd, &cr); - - /* the non-client and client areas have already been - calculated at this point. We just use the difference - to adjust the width and height */ - width += (wr.right - wr.left) - (cr.right - cr.left); - height += (wr.bottom - wr.top) - (cr.bottom - cr.top); - } - - SendMessage(d->dlg_main, - KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0,WMNC_DIALOG_EXPAND), - 0); - - SetWindowPos(hwnd, - NULL, - 0, 0, - width, height, - SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER | - SWP_NOZORDER); - - ShowWindow(d->dlg_bb, SW_SHOW); - ShowWindow(d->dlg_ts, SW_SHOW); - break; - - case WMNC_DIALOG_SETUP: - if(d->nc->n_types > 0) { - khm_size i; - for(i=0; i < d->nc->n_types;i++) { - - if (d->nc->types[i]->dlg_proc == NULL) { - d->nc->types[i]->hwnd_panel = NULL; - } else { - /* Create the dialog panel */ - d->nc->types[i]->hwnd_panel = - CreateDialogParam(d->nc->types[i]->h_module, - d->nc->types[i]->dlg_template, - d->nc->hwnd, - d->nc->types[i]->dlg_proc, - (LPARAM) d->nc); - -#ifdef DEBUG - assert(d->nc->types[i]->hwnd_panel); -#endif - } - } - } - break; - - case WMNC_DIALOG_ACTIVATE: - { - int x,y,width,height; - RECT r; - int id; - wchar_t wbuf[256]; - HFONT hf; - - /* now we create all the tab strip controls */ - r.left = 0; - r.top = 0; - r.right = NCDLG_TAB_WIDTH; - r.bottom = NCDLG_TAB_HEIGHT; - MapDialogRect(d->dlg_main, &r); - - width = r.right - r.left; - height = r.bottom - r.top; - - x = 0; - y = 0; - - id = NC_TS_CTRL_ID_MIN; - - /* if we have too many buttons than would fit on the - button bar, we have to adjust the width of the buttons. - Of course, having too many of them would be bad and - make the buttons fairly useless. This is just an - interim measure. */ - - khui_cw_lock_nc(d->nc); - - GetWindowRect(d->dlg_ts, &r); - if (x + width * d->nc->n_types > (khm_size) (r.right - r.left)) { - width = (int)(((r.right - r.left) - x) / d->nc->n_types); - } - - /* first, the control for the main panel */ - LoadString(khm_hInstance, IDS_NC_IDENTITY, - wbuf, ARRAYLENGTH(wbuf)); - - d->hwnd_tc_main = - CreateWindow(L"BUTTON", - wbuf, - WS_VISIBLE | WS_CHILD | WS_TABSTOP | - BS_PUSHLIKE | BS_CHECKBOX | BS_TEXT, - x,y,width,height, - d->dlg_ts, - (HMENU)(INT_PTR) id, - khm_hInstance, - NULL); - - hf = (HFONT) SendMessage(d->dlg_main, WM_GETFONT, 0, 0); - SendMessage(d->hwnd_tc_main, WM_SETFONT, (WPARAM) hf, 0); - SendMessage(d->hwnd_tc_main, BM_SETCHECK, BST_CHECKED, 0); - - id++; - x += width; - - if(d->nc->n_types > 0) { - khm_size i; - /* we should sort the tabs first */ - qsort(d->nc->types, - d->nc->n_types, - sizeof(*(d->nc->types)), - nc_tab_sort_func); - - for(i=0; i < d->nc->n_types;i++) { - wchar_t * name = NULL; - - d->nc->types[i]->ordinal = i + 1; - - if(d->nc->types[i]->name) - name = d->nc->types[i]->name; - else { - khm_size cbsize; - - if(kcdb_credtype_describe - (d->nc->types[i]->type, - NULL, - &cbsize, - KCDB_TS_SHORT) == KHM_ERROR_TOO_LONG) { - - name = PMALLOC(cbsize); - kcdb_credtype_describe(d->nc->types[i]->type, - name, - &cbsize, - KCDB_TS_SHORT); - } else { -#ifdef DEBUG - assert(FALSE); -#else - continue; -#endif - } - } - - d->nc->types[i]->hwnd_tc = - CreateWindow(L"BUTTON", - name, - WS_VISIBLE | WS_CHILD | WS_TABSTOP | - BS_PUSHLIKE | BS_CHECKBOX | BS_TEXT | - ((d->nc->types[i]->hwnd_panel == NULL)? - WS_DISABLED : 0), - x,y,width,height, - d->dlg_ts, - (HMENU)(INT_PTR) id, - khm_hInstance, - NULL); - - SendMessage(d->nc->types[i]->hwnd_tc, WM_SETFONT, - (WPARAM)hf, 0); - -#if 0 - if(d->nc->types[i]->flags & KHUI_NCT_FLAG_DISABLED) - SendMessage(d->nc->types[i]->hwnd_tc, - BM_SETIMAGE, - IMAGE_ICON, - LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_DISABLED))); - else - SendMessage(d->nc->types[i]->hwnd_tc, - BM_SETIMAGE, - IMAGE_ICON, - LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_ENABLED))); -#endif - - id++; - x += width; - - if(!(d->nc->types[i]->name)) - PFREE(name); - - /* Now set the position of the type panel */ - ShowWindow(d->nc->types[i]->hwnd_panel, SW_HIDE); - SetWindowPos(d->nc->types[i]->hwnd_panel, - NULL, - d->r_main.left, - d->r_main.top, - d->r_main.right - d->r_main.left, - d->r_main.bottom - d->r_main.top, - SWP_DEFERERASE | SWP_NOACTIVATE | - SWP_NOOWNERZORDER | SWP_NOREDRAW | - SWP_NOZORDER); - - } - } - - khui_cw_unlock_nc(d->nc); - - nc_update_credtext(d); - - ShowWindow(hwnd, SW_SHOW); - SetFocus(hwnd); - - if (d->nc->n_identities == 0) - break; - /* else */ - /* fallthrough */ - } - - case WMNC_IDENTITY_CHANGE: - { - BOOL okEnable = FALSE; - - nc_notify_types(d->nc, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_IDENTITY_CHANGE), (LPARAM) d->nc); - - if (d->nc->subtype == KMSG_CRED_NEW_CREDS && - d->nc->n_identities > 0 && - d->nc->identities[0]) { - khm_int32 f = 0; - - kcdb_identity_get_flags(d->nc->identities[0], &f); - - if (!(f & KCDB_IDENT_FLAG_DEFAULT)) { - d->nc->set_default = FALSE; - } - } - - nc_update_credtext(d); - - } - break; - - case WMNC_TYPE_STATE: - /* fallthrough */ - case WMNC_UPDATE_CREDTEXT: - nc_update_credtext(d); - break; - - case WMNC_CLEAR_PROMPTS: - { - khm_size i; - - khui_cw_lock_nc(d->nc); - - if(d->hwnd_banner != NULL) { - DestroyWindow(d->hwnd_banner); - d->hwnd_banner = NULL; - } - - if(d->hwnd_name != NULL) { - DestroyWindow(d->hwnd_name); - d->hwnd_name = NULL; - } - - for(i=0;inc->n_prompts;i++) { - if(!(d->nc->prompts[i]->flags & - KHUI_NCPROMPT_FLAG_STOCK)) { - if(d->nc->prompts[i]->hwnd_static != NULL) - DestroyWindow(d->nc->prompts[i]->hwnd_static); - - if(d->nc->prompts[i]->hwnd_edit != NULL) - DestroyWindow(d->nc->prompts[i]->hwnd_edit); - } - - d->nc->prompts[i]->hwnd_static = NULL; - d->nc->prompts[i]->hwnd_edit = NULL; - } - - khui_cw_unlock_nc(d->nc); - - d->r_credtext.top = d->r_idspec.bottom; - - nc_position_credtext(d); - } - break; - - case WMNC_SET_PROMPTS: - { - khm_size i; - int y; - HWND hw, hw_prev; - HFONT hf, hfold; - HDC hdc; - - /* we assume that WMNC_CLEAR_PROMPTS has already been - received */ - - khui_cw_lock_nc(d->nc); - -#if 0 - /* special case, we have one prompt and it is a password - prompt. very common */ - if(d->nc->n_prompts == 1 && - d->nc->prompts[0]->type == KHUI_NCPROMPT_TYPE_PASSWORD) { - - hw = GetDlgItem(d->dlg_main, IDC_NC_PASSWORD); - EnableWindow(hw, TRUE); - - d->nc->prompts[0]->flags |= KHUI_NCPROMPT_FLAG_STOCK; - d->nc->prompts[0]->hwnd_edit = hw; - d->nc->prompts[0]->hwnd_static = NULL; /* don't care */ - - khui_cw_unlock_nc(d->nc); - break; - } -#endif - /* for everything else */ - - /* hide the stock password controls */ -#if 0 - /* TAGREMOVE */ - hw = GetDlgItem(d->dlg_main, IDC_NC_PASSWORD); - ShowWindow(hw, SW_HIDE); - hw = GetDlgItem(d->dlg_main, IDC_NC_PASSWORD_LABEL); - ShowWindow(hw, SW_HIDE); -#endif - - y = d->r_idspec.bottom; - - hf = (HFONT) SendMessage(d->dlg_main, WM_GETFONT, 0, 0); - - if (d->nc->pname != NULL) { - hw = - CreateWindowEx - (0, - L"STATIC", - d->nc->pname, - SS_SUNKEN | WS_CHILD, - d->r_area.left, y, - d->r_row.right, - d->r_n_label.bottom - d->r_n_label.top, - d->dlg_main, - NULL, - khm_hInstance, - NULL); - -#ifdef DEBUG - assert(hw); -#endif - d->hwnd_name = hw; - SendMessage(hw, WM_SETFONT, (WPARAM)hf, (LPARAM) TRUE); - ShowWindow(hw, SW_SHOW); - - y += d->r_n_label.bottom - d->r_n_label.top; - } - - if (d->nc->banner != NULL) { - hw = - CreateWindowEx - (0, - L"STATIC", - d->nc->banner, - WS_CHILD, - d->r_area.left, y, - d->r_row.right, d->r_row.bottom, - d->dlg_main, - NULL, - khm_hInstance, - NULL); -#ifdef DEBUG - assert(hw); -#endif - d->hwnd_banner = hw; - SendMessage(hw, WM_SETFONT, (WPARAM)hf, (LPARAM)TRUE); - ShowWindow(hw, SW_SHOW); - y += d->r_row.bottom; - } - - hw_prev = d->hwnd_last_idspec; - - hdc = GetWindowDC(d->dlg_main); - hfold = SelectObject(hdc,hf); - - for(i=0; inc->n_prompts; i++) { - RECT pr, er; - SIZE s; - int dy; - - if(d->nc->prompts[i]->prompt != NULL) { - GetTextExtentPoint32(hdc, - d->nc->prompts[i]->prompt, - (int) wcslen(d->nc->prompts[i]->prompt), - &s); - if(s.cx < d->r_n_label.right - d->r_n_label.left) { - CopyRect(&pr, &d->r_n_label); - CopyRect(&er, &d->r_n_input); - dy = d->r_row.bottom; - } else if(s.cx < - d->r_e_label.right - d->r_e_label.left) { - CopyRect(&pr, &d->r_e_label); - CopyRect(&er, &d->r_e_input); - dy = d->r_row.bottom; - } else { - /* oops. the prompt doesn't fit in our - controls. we need to use up two lines */ - pr.left = 0; - pr.right = d->r_row.right; - pr.top = 0; - pr.bottom = d->r_n_label.bottom - - d->r_n_label.top; - CopyRect(&er, &d->r_n_input); - OffsetRect(&er, 0, pr.bottom); - dy = er.bottom + (d->r_row.bottom - - d->r_n_input.bottom); - } - } else { - SetRectEmpty(&pr); - CopyRect(&er, &d->r_n_input); - dy = d->r_row.bottom; - } - - if(IsRectEmpty(&pr)) { - d->nc->prompts[i]->hwnd_static = NULL; - } else { - OffsetRect(&pr, d->r_area.left, y); - - hw = CreateWindowEx - (0, - L"STATIC", - d->nc->prompts[i]->prompt, - WS_CHILD, - pr.left, pr.top, - pr.right - pr.left, pr.bottom - pr.top, - d->dlg_main, - NULL, - khm_hInstance, - NULL); -#ifdef DEBUG - assert(hw); -#endif - - SendMessage(hw, WM_SETFONT, - (WPARAM) hf, (LPARAM) TRUE); - - SetWindowPos(hw, hw_prev, - 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | - SWP_NOOWNERZORDER | SWP_NOSIZE | - SWP_SHOWWINDOW); - - d->nc->prompts[i]->hwnd_static = hw; - hw_prev = hw; - } - - OffsetRect(&er, d->r_area.left, y); - - hw = CreateWindowEx - (0, - L"EDIT", - (d->nc->prompts[i]->def ? - d->nc->prompts[i]->def : L""), - WS_CHILD | WS_TABSTOP | - WS_BORDER | - ((d->nc->prompts[i]->flags & - KHUI_NCPROMPT_FLAG_HIDDEN)? ES_PASSWORD:0), - er.left, er.top, - er.right - er.left, er.bottom - er.top, - d->dlg_main, - NULL, - khm_hInstance, - NULL); - -#ifdef DEBUG - assert(hw); -#endif - - SendMessage(hw, WM_SETFONT, - (WPARAM) hf, (LPARAM) TRUE); - - SetWindowPos(hw, hw_prev, - 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOMOVE | - SWP_NOOWNERZORDER | SWP_NOSIZE | - SWP_SHOWWINDOW); - - SendMessage(hw, EM_SETLIMITTEXT, - KHUI_MAXCCH_PROMPT_VALUE -1, - 0); - - d->nc->prompts[i]->hwnd_edit = hw; - - hw_prev = hw; - - y += dy; - } - - SelectObject(hdc, hfold); - ReleaseDC(d->dlg_main, hdc); - - khui_cw_unlock_nc(d->nc); - - d->r_credtext.top = y; - - nc_position_credtext(d); - } - break; - - case WMNC_DIALOG_PROCESS_COMPLETE: - { - khui_new_creds * nc; - - nc = d->nc; - - nc->response &= ~KHUI_NC_RESPONSE_PROCESSING; - - if(nc->response & KHUI_NC_RESPONSE_NOEXIT) { - HWND hw; - - /* reset state */ - nc->result = KHUI_NC_RESULT_CANCEL; - - hw = GetDlgItem(d->dlg_main, IDOK); - EnableWindow(hw, TRUE); - hw = GetDlgItem(d->dlg_main, IDCANCEL); - EnableWindow(hw, TRUE); - hw = GetDlgItem(d->dlg_main, IDC_NC_OPTIONS); - EnableWindow(hw, TRUE); - hw = GetDlgItem(d->dlg_bb, IDOK); - EnableWindow(hw, TRUE); - hw = GetDlgItem(d->dlg_bb, IDCANCEL); - EnableWindow(hw, TRUE); - - nc_clear_password_fields(d); - - return TRUE; - } - - DestroyWindow(hwnd); - - kmq_post_message(KMSG_CRED, KMSG_CRED_END, 0, (void *) nc); - } - break; - - /* MUST be called with SendMessage */ - case WMNC_ADD_CONTROL_ROW: - { - khui_control_row * row; - - row = (khui_control_row *) lParam; - -#ifdef DEBUG - assert(row->label); - assert(row->input); -#endif - - nc_add_control_row(d, row->label, row->input, row->size); - } - break; - } /* switch(HIWORD(wParam)) */ - - return TRUE; -} - -static LRESULT nc_handle_wm_help(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - static DWORD ctxids[] = { - NC_TS_CTRL_ID_MIN, IDH_NC_TABMAIN, - NC_TS_CTRL_ID_MIN + 1, IDH_NC_TABBUTTON, - NC_TS_CTRL_ID_MIN + 2, IDH_NC_TABBUTTON, - NC_TS_CTRL_ID_MIN + 3, IDH_NC_TABBUTTON, - NC_TS_CTRL_ID_MIN + 4, IDH_NC_TABBUTTON, - NC_TS_CTRL_ID_MIN + 5, IDH_NC_TABBUTTON, - NC_TS_CTRL_ID_MIN + 6, IDH_NC_TABBUTTON, - NC_TS_CTRL_ID_MIN + 7, IDH_NC_TABBUTTON, - IDOK, IDH_NC_OK, - IDCANCEL, IDH_NC_CANCEL, - IDC_NC_HELP, IDH_NC_HELP, - IDC_NC_OPTIONS, IDH_NC_OPTIONS, - IDC_NC_CREDTEXT, IDH_NC_CREDWND, - 0 - }; - - HELPINFO * hlp; - HWND hw = NULL; - HWND hw_ctrl; - khui_nc_wnd_data * d; - - d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); - - hlp = (HELPINFO *) lParam; - - if (d->nc->subtype != KMSG_CRED_NEW_CREDS && - d->nc->subtype != KMSG_CRED_PASSWORD) - return TRUE; - - if (hlp->iContextType != HELPINFO_WINDOW) - return TRUE; - - if (hlp->hItemHandle != NULL && - hlp->hItemHandle != hwnd) { - DWORD id; - int i; - - hw_ctrl =hlp->hItemHandle; - - id = GetWindowLong(hw_ctrl, GWL_ID); - for (i=0; ctxids[i] != 0; i += 2) - if (ctxids[i] == id) - break; - - if (ctxids[i] != 0) - hw = khm_html_help(hw_ctrl, - ((d->nc->subtype == KMSG_CRED_NEW_CREDS)? - L"::popups_newcreds.txt": - L"::popups_password.txt"), - HH_TP_HELP_WM_HELP, - (DWORD_PTR) ctxids); - } - - if (hw == NULL) { - khm_html_help(hwnd, NULL, HH_HELP_CONTEXT, - ((d->nc->subtype == KMSG_CRED_NEW_CREDS)? - IDH_ACTION_NEW_ID: IDH_ACTION_PASSWD_ID)); - } - - return TRUE; -} - -static LRESULT CALLBACK nc_window_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - switch(uMsg) { - case WM_CREATE: - return nc_handle_wm_create(hwnd, uMsg, wParam, lParam); - - case WM_DESTROY: - return nc_handle_wm_destroy(hwnd, uMsg, wParam, lParam); - - case WM_COMMAND: - return nc_handle_wm_command(hwnd, uMsg, wParam, lParam); - - case WM_MOVE: - case WM_MOVING: - return nc_handle_wm_moving(hwnd, uMsg, wParam, lParam); - - case WM_HELP: - return nc_handle_wm_help(hwnd, uMsg, wParam, lParam); - - case KHUI_WM_NC_NOTIFY: - return nc_handle_wm_nc_notify(hwnd, uMsg, wParam, lParam); - } - - /* Note that this is technically a dialog box */ - return DefDlgProc(hwnd, uMsg, wParam, lParam); -} - -void khm_register_newcredwnd_class(void) -{ - WNDCLASSEX wcx; - - wcx.cbSize = sizeof(wcx); - wcx.style = CS_DBLCLKS | CS_OWNDC; - wcx.lpfnWndProc = nc_window_proc; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = DLGWINDOWEXTRA + sizeof(LONG_PTR); - wcx.hInstance = khm_hInstance; - wcx.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); - wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); - wcx.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1); - wcx.lpszMenuName = NULL; - wcx.lpszClassName = KHUI_NEWCREDWND_CLASS; - wcx.hIconSm = NULL; - - khui_newcredwnd_cls = RegisterClassEx(&wcx); -} - -void khm_unregister_newcredwnd_class(void) -{ - UnregisterClass((LPWSTR) khui_newcredwnd_cls, khm_hInstance); -} - -HWND khm_create_newcredwnd(HWND parent, khui_new_creds * c) -{ - wchar_t wtitle[256]; - HWND hwnd; - - if (c->window_title == NULL) { - if (c->subtype == KMSG_CRED_PASSWORD) - LoadString(khm_hInstance, - IDS_WT_PASSWORD, - wtitle, - ARRAYLENGTH(wtitle)); - else - LoadString(khm_hInstance, - IDS_WT_NEW_CREDS, - wtitle, - ARRAYLENGTH(wtitle)); - } - - hwnd = CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_CONTEXTHELP, - MAKEINTATOM(khui_newcredwnd_cls), - ((c->window_title)?c->window_title: wtitle), - WS_DLGFRAME | WS_POPUPWINDOW | WS_CLIPCHILDREN, - 0,0,400,400, /* bogus values. the window - is going to resize and - reposition itself - anyway */ - parent, - NULL, - khm_hInstance, - (LPVOID) c); - -#ifdef DEBUG - assert(hwnd != NULL); -#endif - - /* note that the window is not visible yet. That's because, at - this point we don't know what the panels are */ - - return hwnd; -} - -void khm_prep_newcredwnd(HWND hwnd) -{ - SendMessage(hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_SETUP), 0); -} - -void khm_show_newcredwnd(HWND hwnd) -{ - /* add all the panels in and prep UI */ - SendMessage(hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_ACTIVATE), 0); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * Copyright (c) 2006 Secure Endpoints Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +ATOM khui_newcredwnd_cls; + +/* forward dcl */ +static void +nc_position_credtext(khui_nc_wnd_data * d); + +/* Common dialog procedure. Be careful. This is used by more than + one dialog. */ +static INT_PTR CALLBACK +nc_common_dlg_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch(uMsg) { + case WM_INITDIALOG: + { + khui_nc_wnd_data * d; + + d = (khui_nc_wnd_data *) lParam; + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, DWLP_USER, lParam); +#pragma warning(pop) + if (d->nc->subtype == KMSG_CRED_PASSWORD) { + ShowWindow(GetDlgItem(hwnd, IDC_NC_OPTIONS), + SW_HIDE); + } + } + return TRUE; + + case WM_COMMAND: + { + int ctrl_id; + + ctrl_id = LOWORD(wParam); + if (ctrl_id < KHUI_CW_ID_MIN || + ctrl_id > KHUI_CW_ID_MAX) { + /* pump it to the parent */ + PostMessage(GetParent(hwnd), WM_COMMAND, wParam, lParam); + return TRUE; + } /* else we allow the message to fall through and get + passed into the identity provider's message + handler. */ + } + break; + +#if 0 + /* someday this will be used to draw custom tab buttons. But + that's not today */ + case WM_DRAWITEM: + { + khui_nc_wnd_data * d; + int id; + LPDRAWITEMSTRUCT ds; + + d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, DWLP_USER); + id = wParam; + ds = (LPDRAWITEMSTRUCT) lParam; + + if(id >= NC_TS_CTRL_ID_MIN && id <= NC_TS_CTRL_ID_MAX) { + /*TODO: custom draw the buttons */ + } + else + return FALSE; + } + break; +#endif + + case KHUI_WM_NC_NOTIFY: + { + khui_nc_wnd_data * d; + d = (khui_nc_wnd_data *)(LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + /* message sent by parent to notify us of something */ + switch(HIWORD(wParam)) { + case WMNC_DIALOG_EXPAND: + if(hwnd == d->dlg_main) { + HWND hw; + + if(hw = GetDlgItem(hwnd, IDOK)) + ShowWindow(hw, SW_HIDE); + if(hw = GetDlgItem(hwnd, IDCANCEL)) + ShowWindow(hw, SW_HIDE); + if(hw = GetDlgItem(hwnd, IDC_NC_OPTIONS)) + ShowWindow(hw, SW_HIDE); + + d->r_credtext.bottom = d->r_area.bottom; + + nc_position_credtext(d); + + return TRUE; + } + } + } + return TRUE; + } + + /* check if we have a wnd_data, and if so pass the message on to + the identity provider callback. */ + { + khui_nc_wnd_data * d; + + d = (khui_nc_wnd_data *) (LONG_PTR) + GetWindowLongPtr(hwnd, DWLP_USER); + + if (d && d->nc && d->nc->ident_cb) { + return d->nc->ident_cb(d->nc, WMNC_IDENT_WMSG, hwnd, uMsg, + wParam, lParam); + } + } + + return FALSE; +} + +static void +nc_position_credtext(khui_nc_wnd_data * d) +{ + HWND hw; + + hw = GetDlgItem(d->dlg_main, IDC_NC_CREDTEXT); +#ifdef DEBUG + assert(hw); +#endif + + if (d->r_credtext.bottom < d->r_credtext.top + d->r_row.bottom * 2) { + /* not enough room */ + if (d->nc->mode == KHUI_NC_MODE_MINI && + d->nc->subtype != KMSG_CRED_PASSWORD) { + PostMessage(d->nc->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_EXPAND), 0); + return; + } else { + ShowWindow(hw, SW_HIDE); + return; + } + } else { + ShowWindow(hw, SW_SHOW); + } + + SetWindowPos(hw, NULL, + d->r_credtext.left + d->r_n_input.left, /* x */ + d->r_credtext.top, /* y */ + d->r_n_input.right - d->r_n_input.left, /* width */ + d->r_credtext.bottom - d->r_credtext.top, /* height */ + SWP_NOACTIVATE | SWP_NOOWNERZORDER | + SWP_NOZORDER); + + hw = GetDlgItem(d->dlg_main, IDC_NC_CREDTEXT_LABEL); + + SetWindowPos(hw, NULL, + d->r_credtext.left + d->r_n_label.left, /* x */ + d->r_credtext.top, /* y */ + d->r_n_label.right - d->r_n_label.left, /* width */ + d->r_n_label.bottom - d->r_n_label.top, /* height */ + SWP_NOACTIVATE | SWP_NOOWNERZORDER | + SWP_NOZORDER); +} + +/* sorts tab buttons */ +static int __cdecl +nc_tab_sort_func(const void * v1, const void * v2) +{ + /* v1 and v2 and of type : khui_new_creds_by_type ** */ + khui_new_creds_by_type *t1, *t2; + + t1 = *((khui_new_creds_by_type **) v1); + t2 = *((khui_new_creds_by_type **) v2); + + if(t1->ordinal != -1) { + if(t2->ordinal != -1) { + if(t1->ordinal == t2->ordinal) + return wcscmp(t1->name, t2->name); + else + /* safe to convert to an int here */ + return (int) (t1->ordinal - t2->ordinal); + } else + return -1; + } else { + if(t2->ordinal != -1) + return 1; + else if (t1->name && t2->name) + return wcscmp(t1->name, t2->name); + else + return 0; + } +} + +static void +nc_notify_types_async(khui_new_creds * c, UINT uMsg, + WPARAM wParam, LPARAM lParam) +{ + khm_size i; + + for(i=0; in_types; i++) { + PostMessage(c->types[i]->hwnd_panel, uMsg, wParam, lParam); + } +} + +static void +nc_notify_types(khui_new_creds * c, UINT uMsg, + WPARAM wParam, LPARAM lParam) +{ + khm_size i; + + for(i=0; in_types; i++) { + SendMessage(c->types[i]->hwnd_panel, uMsg, wParam, lParam); + } +} + +static void +nc_clear_password_fields(khui_nc_wnd_data * d) +{ + khm_size i; + khm_boolean need_sync = FALSE; + + khui_cw_lock_nc(d->nc); + + for (i=0; i < d->nc->n_prompts; i++) { + if ((d->nc->prompts[i]->flags & KHUI_NCPROMPT_FLAG_HIDDEN) && + d->nc->prompts[i]->hwnd_edit) { + SetWindowText(d->nc->prompts[i]->hwnd_edit, + L""); + need_sync = TRUE; + } + } + + khui_cw_unlock_nc(d->nc); + + if (need_sync) { + khui_cw_sync_prompt_values(d->nc); + } +} + +#define NC_MAXCCH_CREDTEXT 16384 +#define NC_MAXCB_CREDTEXT (NC_MAXCCH_CREDTEXT * sizeof(wchar_t)) + +static void +nc_update_credtext(khui_nc_wnd_data * d) +{ + wchar_t * ctbuf = NULL; + wchar_t * buf; + BOOL okEnable = FALSE; + BOOL validId = FALSE; + HWND hw = NULL; + size_t cch = 0; + + ctbuf = PMALLOC(NC_MAXCB_CREDTEXT); + + assert(ctbuf != NULL); + + LoadString(khm_hInstance, IDS_NC_CREDTEXT_TABS, ctbuf, NC_MAXCCH_CREDTEXT); + StringCchLength(ctbuf, NC_MAXCCH_CREDTEXT, &cch); + buf = ctbuf + cch; + nc_notify_types(d->nc, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_UPDATE_CREDTEXT), (LPARAM) d->nc); + + /* hopefully all the types have updated their credential texts */ + if(d->nc->n_identities == 1) { + wchar_t main_fmt[256]; + wchar_t id_fmt[256]; + wchar_t id_name[KCDB_IDENT_MAXCCH_NAME]; + wchar_t id_string[KCDB_IDENT_MAXCCH_NAME + 256]; + khm_size cbbuf; + khm_int32 flags; + + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_ONE, + main_fmt, (int) ARRAYLENGTH(main_fmt)); + + cbbuf = sizeof(id_name); + kcdb_identity_get_name(d->nc->identities[0], id_name, &cbbuf); + + kcdb_identity_get_flags(d->nc->identities[0], &flags); + + if (flags & KCDB_IDENT_FLAG_INVALID) { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_INVALID, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } else if(flags & KCDB_IDENT_FLAG_VALID) { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_VALID, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } else if(d->nc->subtype == KMSG_CRED_NEW_CREDS) { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_CHECKING, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } else { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_UNCHECKED, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } + + StringCbPrintf(id_string, sizeof(id_string), id_fmt, id_name); + + StringCbPrintf(buf, NC_MAXCB_CREDTEXT - cch*sizeof(wchar_t), + main_fmt, id_string); + + if (flags & KCDB_IDENT_FLAG_VALID) { + if (flags & KCDB_IDENT_FLAG_DEFAULT) + LoadString(khm_hInstance, IDS_NC_ID_DEF, + id_string, ARRAYLENGTH(id_string)); + else if (d->nc->set_default) + LoadString(khm_hInstance, IDS_NC_ID_WDEF, + id_string, ARRAYLENGTH(id_string)); + else + LoadString(khm_hInstance, IDS_NC_ID_NDEF, + id_string, ARRAYLENGTH(id_string)); + + StringCbCat(buf, NC_MAXCB_CREDTEXT - cch * sizeof(wchar_t), + id_string); + } + + } else if(d->nc->n_identities > 1) { + wchar_t *ids_string; + khm_size cb_ids_string; + + wchar_t id_name[KCDB_IDENT_MAXCCH_NAME]; + wchar_t id_fmt[256]; + wchar_t id_string[KCDB_IDENT_MAXCCH_NAME + 256]; + + wchar_t main_fmt[256]; + khm_size cbbuf; + + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_MANY, + main_fmt, (int) ARRAYLENGTH(main_fmt)); + + /* we are going to concatenate all the identity names into + a comma separated string */ + + /* d->nc->n_identities is at least 2 */ + ids_string = PMALLOC((KCDB_IDENT_MAXCB_NAME + sizeof(id_fmt)) * + (d->nc->n_identities - 1)); + cb_ids_string = + (KCDB_IDENT_MAXCB_NAME + sizeof(id_fmt)) * + (d->nc->n_identities - 1); + + assert(ids_string != NULL); + + ids_string[0] = 0; + + { + khm_size i; + khm_int32 flags; + + for(i=1; inc->n_identities; i++) { + if(i>1) { + StringCbCat(ids_string, cb_ids_string, L","); + } + + flags = 0; + + cbbuf = sizeof(id_name); + kcdb_identity_get_name(d->nc->identities[i], id_name, &cbbuf); + kcdb_identity_get_flags(d->nc->identities[i], &flags); + if(flags & KCDB_IDENT_FLAG_INVALID) { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_INVALID, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } else if(flags & KCDB_IDENT_FLAG_VALID) { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_VALID, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } else { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_UNCHECKED, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } + + StringCbPrintf(id_string, sizeof(id_string), id_fmt, id_name); + StringCbCat(ids_string, cb_ids_string, id_string); + } + + cbbuf = sizeof(id_name); + kcdb_identity_get_name(d->nc->identities[0], id_name, &cbbuf); + kcdb_identity_get_flags(d->nc->identities[0], &flags); + if(flags & KCDB_IDENT_FLAG_INVALID) { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_INVALID, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } else if(flags & KCDB_IDENT_FLAG_VALID) { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_VALID, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } else { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_UNCHECKED, + id_fmt, (int) ARRAYLENGTH(id_fmt)); + } + StringCbPrintf(id_string, sizeof(id_string), id_fmt, id_name); + + StringCbPrintf(buf, NC_MAXCB_CREDTEXT - cch*sizeof(wchar_t), + main_fmt, id_string, ids_string); + + PFREE(ids_string); + } + } else { + LoadString(khm_hInstance, IDS_NC_CREDTEXT_ID_NONE, + buf, (int)(NC_MAXCCH_CREDTEXT - cch)); + } + + /* now, append the credtext string from each of the cred types */ + { + khm_size i; + size_t cb; + wchar_t * buf; + + cb = NC_MAXCB_CREDTEXT; + buf = ctbuf; + + for(i=0; inc->n_types; i++) { + if(d->nc->types[i]->credtext != NULL) { + StringCbCatEx(buf, cb, + d->nc->types[i]->credtext, + &buf, &cb, + 0); + } + } + } + + SetDlgItemText(d->dlg_main, IDC_NC_CREDTEXT, ctbuf); + + PFREE(ctbuf); + + /* so depending on whether the primary identity was found to be + invalid, we need to disable the Ok button and set the title to + reflect this */ + + if(d->nc->n_identities > 0) { + khm_int32 flags = 0; + + if(KHM_SUCCEEDED(kcdb_identity_get_flags(d->nc->identities[0], + &flags)) && + (flags & KCDB_IDENT_FLAG_VALID)) { + validId = TRUE; + } + } + + if (d->nc->window_title == NULL) { + if(validId) { + wchar_t wpostfix[256]; + wchar_t wtitle[KCDB_IDENT_MAXCCH_NAME + 256]; + khm_size cbsize; + + cbsize = sizeof(wtitle); + kcdb_identity_get_name(d->nc->identities[0], wtitle, &cbsize); + + if (d->nc->subtype == KMSG_CRED_PASSWORD) + LoadString(khm_hInstance, IDS_WTPOST_PASSWORD, + wpostfix, (int) ARRAYLENGTH(wpostfix)); + else + LoadString(khm_hInstance, IDS_WTPOST_NEW_CREDS, + wpostfix, (int) ARRAYLENGTH(wpostfix)); + + StringCbCat(wtitle, sizeof(wtitle), wpostfix); + + SetWindowText(d->nc->hwnd, wtitle); + } else { + wchar_t wtitle[256]; + + if (d->nc->subtype == KMSG_CRED_PASSWORD) + LoadString(khm_hInstance, IDS_WT_PASSWORD, + wtitle, (int) ARRAYLENGTH(wtitle)); + else + LoadString(khm_hInstance, IDS_WT_NEW_CREDS, + wtitle, (int) ARRAYLENGTH(wtitle)); + + SetWindowText(d->nc->hwnd, wtitle); + } + } + + if (!(d->nc->response & KHUI_NC_RESPONSE_PROCESSING)) { + if(validId || d->nc->subtype == KMSG_CRED_PASSWORD) { + /* TODO: check if all the required fields have valid values + before enabling the Ok button */ + okEnable = TRUE; + } + + hw = GetDlgItem(d->dlg_main, IDOK); + EnableWindow(hw, okEnable); + hw = GetDlgItem(d->dlg_bb, IDOK); + EnableWindow(hw, okEnable); + } +} + +#define CW_PARAM DWLP_USER + +static void +nc_add_control_row(khui_nc_wnd_data * d, + HWND label, + HWND input, + khui_control_size size); + +static LRESULT +nc_handle_wm_create(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + LPCREATESTRUCT lpc; + khui_new_creds * c; + khui_nc_wnd_data * ncd; + int x, y; + int width, height; + RECT r; + + lpc = (LPCREATESTRUCT) lParam; + + ncd = PMALLOC(sizeof(*ncd)); + ZeroMemory(ncd, sizeof(*ncd)); + + c = (khui_new_creds *) lpc->lpCreateParams; + ncd->nc = c; + c->hwnd = hwnd; + +#pragma warning(push) +#pragma warning(disable: 4244) + SetWindowLongPtr(hwnd, CW_PARAM, (LONG_PTR) ncd); +#pragma warning(pop) + + /* first try to create the main dialog panel */ + + assert(c->subtype == KMSG_CRED_NEW_CREDS || + c->subtype == KMSG_CRED_PASSWORD); + + ncd->dlg_main = CreateDialogParam(khm_hInstance, + MAKEINTRESOURCE(IDD_NC_PASSWORD), + hwnd, + nc_common_dlg_proc, + (LPARAM) ncd); +#ifdef DEBUG + assert(ncd->dlg_main); +#endif + + { + RECT r_main; + RECT r_area; + RECT r_row; + HWND hw; + + /* pick out metrics for use by the custom prompter stuff */ + GetWindowRect(ncd->dlg_main, &r_main); + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_PANEL); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r_area); + OffsetRect(&r_area,-r_main.left, -r_main.top); + CopyRect(&ncd->r_area, &r_area); + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_ROW); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r); + CopyRect(&r_row, &r); + OffsetRect(&r,-r.left, -r.top); + CopyRect(&ncd->r_row, &r); + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_LABEL); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r); + OffsetRect(&r,-r_row.left, -r_row.top); + CopyRect(&ncd->r_n_label, &r); + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_INPUT); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r); + OffsetRect(&r, -r_row.left, -r_row.top); + CopyRect(&ncd->r_n_input, &r); + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_ROW_LG); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r_row); + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_LABEL_LG); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r); + OffsetRect(&r, -r_row.left, -r_row.top); + CopyRect(&ncd->r_e_label, &r); + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_TPL_INPUT_LG); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r); + OffsetRect(&r, -r_row.left, -r_row.top); + CopyRect(&ncd->r_e_input, &r); + + CopyRect(&ncd->r_credtext, &ncd->r_area); + CopyRect(&ncd->r_idspec, &ncd->r_area); + + ncd->r_idspec.bottom = ncd->r_idspec.top; + + hw = GetDlgItem(ncd->dlg_main, IDC_NC_CREDTEXT); +#ifdef DEBUG + assert(hw); +#endif + GetWindowRect(hw, &r); + OffsetRect(&r, -r_main.left, -r_main.top); + ncd->r_credtext.bottom = r.bottom; + } + + /* if the mode is 'mini'*/ + r.left = 0; + r.top = 0; + if(c->mode == KHUI_NC_MODE_MINI) { + r.right = NCDLG_WIDTH; + r.bottom = NCDLG_HEIGHT; + } else { + r.right = NCDLG_WIDTH + NCDLG_BBAR_WIDTH; + r.bottom = NCDLG_HEIGHT + NCDLG_TAB_HEIGHT; + } + + MapDialogRect(ncd->dlg_main, &r); + + ncd->r_main.left = 0; + ncd->r_main.top = 0; + ncd->r_main.right = NCDLG_WIDTH; + ncd->r_main.bottom = NCDLG_HEIGHT; + + ncd->r_ts.left = 0; + ncd->r_ts.top = ncd->r_main.bottom; + ncd->r_ts.right = ncd->r_main.right; + ncd->r_ts.bottom = ncd->r_ts.top + NCDLG_TAB_HEIGHT; + + ncd->r_bb.left = ncd->r_main.right; + ncd->r_bb.top = 0; + ncd->r_bb.right = ncd->r_bb.left + NCDLG_BBAR_WIDTH; + ncd->r_bb.bottom = ncd->r_ts.bottom; + + MapDialogRect(ncd->dlg_main, &(ncd->r_main)); + MapDialogRect(ncd->dlg_main, &(ncd->r_ts)); + MapDialogRect(ncd->dlg_main, &(ncd->r_bb)); + + /* center the new creds window over the main NetIDMgr window */ + width = r.right - r.left; + height = r.bottom - r.top; + + /* adjust width and height to accomodate NC area */ + { + RECT wr,cr; + + GetWindowRect(hwnd, &wr); + GetClientRect(hwnd, &cr); + + /* the non-client and client areas have already been calculated + at this point. We just use the difference to adjust the width + and height */ + width += (wr.right - wr.left) - (cr.right - cr.left); + height += (wr.bottom - wr.top) - (cr.bottom - cr.top); + } + + GetWindowRect(lpc->hwndParent, &r); + x = (r.right + r.left)/2 - width / 2; + y = (r.top + r.bottom)/2 - height / 2; + + MoveWindow(hwnd, x, y, width, height, FALSE); + + SetWindowPos(ncd->dlg_main, + NULL, + ncd->r_main.left, + ncd->r_main.top, + ncd->r_main.right - ncd->r_main.left, + ncd->r_main.bottom - ncd->r_main.top, + SWP_DEFERERASE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | + SWP_NOREDRAW | SWP_NOZORDER); + + /* IDD_NC_BBAR is the button bar that sits on the right of the + dialog when the new creds window is in 'expanded' mode. */ + + ncd->dlg_bb = CreateDialogParam(khm_hInstance, + MAKEINTRESOURCE(IDD_NC_BBAR), + hwnd, + nc_common_dlg_proc, + (LPARAM) ncd); + +#ifdef DEBUG + assert(ncd->dlg_bb); +#endif + + SetWindowPos(ncd->dlg_bb, + NULL, + ncd->r_bb.left, + ncd->r_bb.top, + ncd->r_bb.right - ncd->r_bb.left, + ncd->r_bb.bottom - ncd->r_bb.top, + SWP_DEFERERASE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | + SWP_NOREDRAW | SWP_NOZORDER); + + /* IDD_NC_TS is the tab strip that sits below the main panel when + the new creds window is in 'expanded' mode */ + + ncd->dlg_ts = CreateDialogParam(khm_hInstance, + MAKEINTRESOURCE(IDD_NC_TS), + hwnd, + nc_common_dlg_proc, + (LPARAM) ncd); + +#ifdef DEBUG + assert(ncd->dlg_ts); +#endif + + SetWindowPos(ncd->dlg_ts, + NULL, + ncd->r_ts.left, + ncd->r_ts.top, + ncd->r_ts.right - ncd->r_ts.left, + ncd->r_ts.bottom - ncd->r_ts.top, + SWP_DEFERERASE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | + SWP_NOREDRAW | SWP_NOZORDER); + + if(c->mode == KHUI_NC_MODE_MINI) { + /* hide and show stuff */ + ShowWindow(ncd->dlg_main, SW_SHOW); + ShowWindow(ncd->dlg_bb, SW_HIDE); + ShowWindow(ncd->dlg_ts, SW_HIDE); + + nc_position_credtext(ncd); + + } else { + /* hide and show stuff */ + ShowWindow(ncd->dlg_main, SW_SHOW); + ShowWindow(ncd->dlg_bb, SW_SHOW); + ShowWindow(ncd->dlg_ts, SW_SHOW); + + PostMessage(ncd->dlg_main, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_EXPAND), 0); + } + + /* Call the identity provider callback to set the identity + selector controls */ + c->ident_cb(c, WMNC_IDENT_INIT, NULL, 0, 0, (LPARAM) ncd->dlg_main); + +#if 0 + { + HWND hw; + wchar_t wcaption[64]; + + LoadString(khm_hInstance, IDS_NC_SETDEF, wcaption, + ARRAYLENGTH(wcaption)); + + /* Now create the set as default button */ + hw = CreateWindow + (L"BUTTON", + wcaption, + WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, + 0, 0, 100, 100, + ncd->dlg_main, + (HMENU) NC_BN_SET_DEF_ID, + khm_hInstance, + NULL); + + nc_add_control_row(ncd, NULL, hw, KHUI_CTRLSIZE_HALF); + } +#endif + /* we defer the creation of the tab buttons for later */ + + /* add this to the dialog chain */ + khm_add_dialog(hwnd); + + return TRUE; +} + +static void +nc_add_control_row(khui_nc_wnd_data * d, + HWND label, + HWND input, + khui_control_size size) +{ + RECT r_row; + RECT r_label; + RECT r_input; + HFONT hf; + + hf = (HFONT) SendMessage(d->dlg_main, WM_GETFONT, 0, 0); + SendMessage(label, WM_SETFONT, (WPARAM) hf, FALSE); + SendMessage(input, WM_SETFONT, (WPARAM) hf, FALSE); + + CopyRect(&r_row, &d->r_row); + OffsetRect(&r_row, d->r_idspec.left, d->r_idspec.bottom); + + if (size == KHUI_CTRLSIZE_SMALL) { + CopyRect(&r_label, &d->r_n_label); + CopyRect(&r_input, &d->r_n_input); + OffsetRect(&r_label, r_row.left, r_row.top); + OffsetRect(&r_input, r_row.left, r_row.top); + } else if (size == KHUI_CTRLSIZE_HALF) { + CopyRect(&r_label, &d->r_e_label); + CopyRect(&r_input, &d->r_e_input); + OffsetRect(&r_label, r_row.left, r_row.top); + OffsetRect(&r_input, r_row.left, r_row.top); + } else if (size == KHUI_CTRLSIZE_FULL) { + CopyRect(&r_label, &d->r_n_label); + r_label.right = d->r_row.right; + CopyRect(&r_input, &d->r_n_input); + OffsetRect(&r_input, r_row.left, r_row.top); + OffsetRect(&r_input, 0, r_input.bottom); + r_row.bottom += r_input.bottom; + OffsetRect(&r_label, r_row.left, r_row.top); + } else { + SetRectEmpty(&r_label); + SetRectEmpty(&r_input); +#ifdef DEBUG + assert(FALSE); +#else + return; +#endif + } + + if (label) + SetWindowPos(label, + ((d->hwnd_last_idspec != NULL)? + d->hwnd_last_idspec: + HWND_TOP), + r_label.left, r_label.top, + r_label.right - r_label.left, + r_label.bottom - r_label.top, + SWP_DEFERERASE | SWP_NOACTIVATE | + SWP_NOOWNERZORDER); + + if (input) + SetWindowPos(input, + (label ? label : ((d->hwnd_last_idspec != NULL)? + d->hwnd_last_idspec: + HWND_TOP)), + r_input.left, r_input.top, + r_input.right - r_input.left, + r_input.bottom - r_input.top, + SWP_DEFERERASE | SWP_NOACTIVATE | + SWP_NOOWNERZORDER); + + d->hwnd_last_idspec = input; + + d->r_idspec.bottom = r_row.bottom; + + d->r_credtext.top = r_row.bottom; + + nc_position_credtext(d); +} + + +static LRESULT +nc_handle_wm_destroy(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + khui_nc_wnd_data * d; + khm_size i; + + /* remove self from dialog chain */ + khm_del_dialog(hwnd); + + d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); + + d->nc->ident_cb(d->nc, WMNC_IDENT_EXIT, NULL, 0, 0, 0); + + if(d->hwnd_tc_main) + DestroyWindow(d->hwnd_tc_main); + for(i=0;inc->n_types;i++) { + if(d->nc->types[i]->hwnd_tc) { + DestroyWindow(d->nc->types[i]->hwnd_tc); + d->nc->types[i]->hwnd_tc = NULL; + } + } + + if(d->dlg_bb) + DestroyWindow(d->dlg_bb); + if(d->dlg_main) + DestroyWindow(d->dlg_main); + if(d->dlg_ts) + DestroyWindow(d->dlg_ts); + + d->dlg_bb = NULL; + d->dlg_main = NULL; + d->dlg_ts = NULL; + + PFREE(d); + + return TRUE; +} + +static LRESULT +nc_handle_wm_command(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + khui_nc_wnd_data * d; + int id; + + d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); + + switch(HIWORD(wParam)) { + case BN_CLICKED: + switch(LOWORD(wParam)) { + + case IDOK: + d->nc->result = KHUI_NC_RESULT_PROCESS; + + /* fallthrough */ + + case IDCANCEL: + /* the default value for d->nc->result is set to + KHUI_NC_RESULT_CANCEL */ + d->nc->response = KHUI_NC_RESPONSE_PROCESSING; + + nc_notify_types(d->nc, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0,WMNC_DIALOG_PREPROCESS), + (LPARAM) d->nc); + + khui_cw_sync_prompt_values(d->nc); + + khm_cred_dispatch_process_message(d->nc); + + /* we won't know whether to abort or not until we get + feedback from the plugins, even if the command was + to cancel */ + { + HWND hw; + + hw = GetDlgItem(d->dlg_main, IDOK); + EnableWindow(hw, FALSE); + hw = GetDlgItem(d->dlg_main, IDCANCEL); + EnableWindow(hw, FALSE); + hw = GetDlgItem(d->dlg_main, IDC_NC_OPTIONS); + EnableWindow(hw, FALSE); + hw = GetDlgItem(d->dlg_bb, IDOK); + EnableWindow(hw, FALSE); + hw = GetDlgItem(d->dlg_bb, IDCANCEL); + EnableWindow(hw, FALSE); + } + return FALSE; + + case IDC_NC_HELP: + khm_html_help(hwnd, NULL, HH_HELP_CONTEXT, IDH_ACTION_NEW_ID); + return FALSE; + + case IDC_NC_OPTIONS: + /* the Options button in the main window was clicked. we + respond by expanding the dialog. */ + PostMessage(hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_EXPAND), 0); + return FALSE; + + case IDC_NC_CREDTEXT: /* credtext link activated */ + { + khui_htwnd_link * l; + wchar_t sid[KHUI_MAXCCH_HTLINK_FIELD]; + wchar_t sparam[KHUI_MAXCCH_HTLINK_FIELD]; + wchar_t * colon; + + l = (khui_htwnd_link *) lParam; + + /* do we have a valid link? */ + if(l->id == NULL || l->id_len >= ARRAYLENGTH(sid)) + return TRUE; /* nope */ + + StringCchCopyN(sid, ARRAYLENGTH(sid), l->id, l->id_len); + sid[l->id_len] = L'\0'; /* just make sure */ + + if(l->param != NULL && + l->param_len < ARRAYLENGTH(sparam) && + l->param_len > 0) { + + StringCchCopyN(sparam, ARRAYLENGTH(sparam), + l->param, l->param_len); + sparam[l->param_len] = L'\0'; + + } else { + sparam[0] = L'\0'; + } + + /* If the ID is of the form ':' + and is a valid name of a credentials + type that is participating in the credentials + acquisition process, then we forward the message to + the panel that is providing the UI for that cred + type. We also switch to that panel first. */ + + colon = wcschr(sid, L':'); + if (colon != NULL) { + khm_int32 credtype; + khui_new_creds_by_type * t; + + *colon = L'\0'; + if (KHM_SUCCEEDED(kcdb_credtype_get_id(sid, &credtype)) && + KHM_SUCCEEDED(khui_cw_find_type(d->nc, credtype, &t))){ + *colon = L':'; + + if (t->ordinal != d->ctab) + PostMessage(hwnd, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(t->ordinal, + WMNC_DIALOG_SWITCH_PANEL), + 0); + + return SendMessage(t->hwnd_panel, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_CREDTEXT_LINK), + lParam); + } + } + + /* if it was for us, then we need to process the message */ + if(!_wcsicmp(sid, CTLINKID_SWITCH_PANEL)) { + khm_int32 credtype; + khui_new_creds_by_type * t; + + if (KHM_SUCCEEDED(kcdb_credtype_get_id(sparam, + &credtype)) && + KHM_SUCCEEDED(khui_cw_find_type(d->nc, + credtype, &t))) { + if (t->ordinal != d->ctab) + PostMessage(hwnd, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(t->ordinal, + WMNC_DIALOG_SWITCH_PANEL), + 0); + } + } else if (!_wcsicmp(sid, L"NotDef")) { + d->nc->set_default = FALSE; + nc_update_credtext(d); + } else if (!_wcsicmp(sid, L"MakeDef")) { + d->nc->set_default = TRUE; + nc_update_credtext(d); + } + } + return FALSE; + +#if 0 + case NC_BN_SET_DEF_ID: + { + d->nc->set_default = + (IsDlgButtonChecked(d->dlg_main, NC_BN_SET_DEF_ID) + == BST_CHECKED); + } + return FALSE; +#endif + + default: + /* if one of the tab strip buttons were pressed, then + we should switch to that panel */ + id = LOWORD(wParam); + if(id >= NC_TS_CTRL_ID_MIN && id <= NC_TS_CTRL_ID_MAX) { + id -= NC_TS_CTRL_ID_MIN; + PostMessage(hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(id, WMNC_DIALOG_SWITCH_PANEL),0); + return FALSE; + } + } + break; + } + + return TRUE; +} + +static LRESULT nc_handle_wm_moving(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + khui_nc_wnd_data * d; + + d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); + + nc_notify_types(d->nc, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_MOVE), (LPARAM) d->nc); + + return FALSE; +} + +static LRESULT nc_handle_wm_nc_notify(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + khui_nc_wnd_data * d; + RECT r; + int width, height; + khm_size id; + + d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); + + switch(HIWORD(wParam)) { + + case WMNC_DIALOG_SWITCH_PANEL: + id = LOWORD(wParam); + if(id >= 0 && id <= d->nc->n_types) { + /* one of the tab buttons were pressed */ + if(d->ctab == id) { + return TRUE; /* nothign to do */ + } + + if(d->ctab == 0) { + ShowWindow(d->dlg_main, SW_HIDE); + SendMessage(d->hwnd_tc_main, + BM_SETCHECK, BST_UNCHECKED, 0); + } else { + ShowWindow(d->nc->types[d->ctab - 1]->hwnd_panel, SW_HIDE); + SendMessage(d->nc->types[d->ctab - 1]->hwnd_tc, + BM_SETCHECK, BST_UNCHECKED, 0); + } + + d->ctab = id; + + if(d->ctab == 0) { + ShowWindow(d->dlg_main, SW_SHOW); + SendMessage(d->hwnd_tc_main, + BM_SETCHECK, BST_CHECKED, 0); + } else { + ShowWindow(d->nc->types[id - 1]->hwnd_panel, SW_SHOW); + SendMessage(d->nc->types[id - 1]->hwnd_tc, + BM_SETCHECK, BST_CHECKED, 0); + } + } + + if(d->nc->mode == KHUI_NC_MODE_EXPANDED) + return TRUE; + /*else*/ + /* fallthrough */ + + case WMNC_DIALOG_EXPAND: + /* we are expanding the dialog box */ + + /* nothing to do? */ + if (d->nc->mode == KHUI_NC_MODE_EXPANDED) + break; + + d->nc->mode = KHUI_NC_MODE_EXPANDED; + + r.top = 0; + r.left = 0; + r.right = NCDLG_WIDTH + NCDLG_BBAR_WIDTH; + r.bottom = NCDLG_HEIGHT + NCDLG_TAB_HEIGHT; + + MapDialogRect(d->dlg_main, &r); + + width = r.right - r.left; + height = r.bottom - r.top; + + /* adjust width and height to accomodate NC area */ + { + RECT wr,cr; + + GetWindowRect(hwnd, &wr); + GetClientRect(hwnd, &cr); + + /* the non-client and client areas have already been + calculated at this point. We just use the difference + to adjust the width and height */ + width += (wr.right - wr.left) - (cr.right - cr.left); + height += (wr.bottom - wr.top) - (cr.bottom - cr.top); + } + + SendMessage(d->dlg_main, + KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0,WMNC_DIALOG_EXPAND), + 0); + + SetWindowPos(hwnd, + NULL, + 0, 0, + width, height, + SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER | + SWP_NOZORDER); + + ShowWindow(d->dlg_bb, SW_SHOW); + ShowWindow(d->dlg_ts, SW_SHOW); + break; + + case WMNC_DIALOG_SETUP: + if(d->nc->n_types > 0) { + khm_size i; + for(i=0; i < d->nc->n_types;i++) { + + if (d->nc->types[i]->dlg_proc == NULL) { + d->nc->types[i]->hwnd_panel = NULL; + } else { + /* Create the dialog panel */ + d->nc->types[i]->hwnd_panel = + CreateDialogParam(d->nc->types[i]->h_module, + d->nc->types[i]->dlg_template, + d->nc->hwnd, + d->nc->types[i]->dlg_proc, + (LPARAM) d->nc); + +#ifdef DEBUG + assert(d->nc->types[i]->hwnd_panel); +#endif + } + } + } + break; + + case WMNC_DIALOG_ACTIVATE: + { + int x,y,width,height; + RECT r; + int id; + wchar_t wbuf[256]; + HFONT hf; + + /* now we create all the tab strip controls */ + r.left = 0; + r.top = 0; + r.right = NCDLG_TAB_WIDTH; + r.bottom = NCDLG_TAB_HEIGHT; + MapDialogRect(d->dlg_main, &r); + + width = r.right - r.left; + height = r.bottom - r.top; + + x = 0; + y = 0; + + id = NC_TS_CTRL_ID_MIN; + + /* if we have too many buttons than would fit on the + button bar, we have to adjust the width of the buttons. + Of course, having too many of them would be bad and + make the buttons fairly useless. This is just an + interim measure. */ + + khui_cw_lock_nc(d->nc); + + GetWindowRect(d->dlg_ts, &r); + if (x + width * d->nc->n_types > (khm_size) (r.right - r.left)) { + width = (int)(((r.right - r.left) - x) / d->nc->n_types); + } + + /* first, the control for the main panel */ + LoadString(khm_hInstance, IDS_NC_IDENTITY, + wbuf, ARRAYLENGTH(wbuf)); + + d->hwnd_tc_main = + CreateWindow(L"BUTTON", + wbuf, + WS_VISIBLE | WS_CHILD | WS_TABSTOP | + BS_PUSHLIKE | BS_CHECKBOX | BS_TEXT, + x,y,width,height, + d->dlg_ts, + (HMENU)(INT_PTR) id, + khm_hInstance, + NULL); + + hf = (HFONT) SendMessage(d->dlg_main, WM_GETFONT, 0, 0); + SendMessage(d->hwnd_tc_main, WM_SETFONT, (WPARAM) hf, 0); + SendMessage(d->hwnd_tc_main, BM_SETCHECK, BST_CHECKED, 0); + + id++; + x += width; + + if(d->nc->n_types > 0) { + khm_size i; + /* we should sort the tabs first */ + qsort(d->nc->types, + d->nc->n_types, + sizeof(*(d->nc->types)), + nc_tab_sort_func); + + for(i=0; i < d->nc->n_types;i++) { + wchar_t * name = NULL; + + d->nc->types[i]->ordinal = i + 1; + + if(d->nc->types[i]->name) + name = d->nc->types[i]->name; + else { + khm_size cbsize; + + if(kcdb_credtype_describe + (d->nc->types[i]->type, + NULL, + &cbsize, + KCDB_TS_SHORT) == KHM_ERROR_TOO_LONG) { + + name = PMALLOC(cbsize); + kcdb_credtype_describe(d->nc->types[i]->type, + name, + &cbsize, + KCDB_TS_SHORT); + } else { +#ifdef DEBUG + assert(FALSE); +#else + continue; +#endif + } + } + + d->nc->types[i]->hwnd_tc = + CreateWindow(L"BUTTON", + name, + WS_VISIBLE | WS_CHILD | WS_TABSTOP | + BS_PUSHLIKE | BS_CHECKBOX | BS_TEXT | + ((d->nc->types[i]->hwnd_panel == NULL)? + WS_DISABLED : 0), + x,y,width,height, + d->dlg_ts, + (HMENU)(INT_PTR) id, + khm_hInstance, + NULL); + + SendMessage(d->nc->types[i]->hwnd_tc, WM_SETFONT, + (WPARAM)hf, 0); + +#if 0 + if(d->nc->types[i]->flags & KHUI_NCT_FLAG_DISABLED) + SendMessage(d->nc->types[i]->hwnd_tc, + BM_SETIMAGE, + IMAGE_ICON, + LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_DISABLED))); + else + SendMessage(d->nc->types[i]->hwnd_tc, + BM_SETIMAGE, + IMAGE_ICON, + LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_ENABLED))); +#endif + + id++; + x += width; + + if(!(d->nc->types[i]->name)) + PFREE(name); + + /* Now set the position of the type panel */ + ShowWindow(d->nc->types[i]->hwnd_panel, SW_HIDE); + SetWindowPos(d->nc->types[i]->hwnd_panel, + NULL, + d->r_main.left, + d->r_main.top, + d->r_main.right - d->r_main.left, + d->r_main.bottom - d->r_main.top, + SWP_DEFERERASE | SWP_NOACTIVATE | + SWP_NOOWNERZORDER | SWP_NOREDRAW | + SWP_NOZORDER); + + } + } + + khui_cw_unlock_nc(d->nc); + + nc_update_credtext(d); + + ShowWindow(hwnd, SW_SHOW); + SetFocus(hwnd); + + if (d->nc->n_identities == 0) + break; + /* else */ + /* fallthrough */ + } + + case WMNC_IDENTITY_CHANGE: + { + BOOL okEnable = FALSE; + + nc_notify_types(d->nc, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_IDENTITY_CHANGE), (LPARAM) d->nc); + + if (d->nc->subtype == KMSG_CRED_NEW_CREDS && + d->nc->n_identities > 0 && + d->nc->identities[0]) { + khm_int32 f = 0; + + kcdb_identity_get_flags(d->nc->identities[0], &f); + + if (!(f & KCDB_IDENT_FLAG_DEFAULT)) { + d->nc->set_default = FALSE; + } + } + + nc_update_credtext(d); + + } + break; + + case WMNC_TYPE_STATE: + /* fallthrough */ + case WMNC_UPDATE_CREDTEXT: + nc_update_credtext(d); + break; + + case WMNC_CLEAR_PROMPTS: + { + khm_size i; + + khui_cw_lock_nc(d->nc); + + if(d->hwnd_banner != NULL) { + DestroyWindow(d->hwnd_banner); + d->hwnd_banner = NULL; + } + + if(d->hwnd_name != NULL) { + DestroyWindow(d->hwnd_name); + d->hwnd_name = NULL; + } + + for(i=0;inc->n_prompts;i++) { + if(!(d->nc->prompts[i]->flags & + KHUI_NCPROMPT_FLAG_STOCK)) { + if(d->nc->prompts[i]->hwnd_static != NULL) + DestroyWindow(d->nc->prompts[i]->hwnd_static); + + if(d->nc->prompts[i]->hwnd_edit != NULL) + DestroyWindow(d->nc->prompts[i]->hwnd_edit); + } + + d->nc->prompts[i]->hwnd_static = NULL; + d->nc->prompts[i]->hwnd_edit = NULL; + } + + khui_cw_unlock_nc(d->nc); + + d->r_credtext.top = d->r_idspec.bottom; + + nc_position_credtext(d); + } + break; + + case WMNC_SET_PROMPTS: + { + khm_size i; + int y; + HWND hw, hw_prev; + HFONT hf, hfold; + HDC hdc; + + /* we assume that WMNC_CLEAR_PROMPTS has already been + received */ + + khui_cw_lock_nc(d->nc); + +#if 0 + /* special case, we have one prompt and it is a password + prompt. very common */ + if(d->nc->n_prompts == 1 && + d->nc->prompts[0]->type == KHUI_NCPROMPT_TYPE_PASSWORD) { + + hw = GetDlgItem(d->dlg_main, IDC_NC_PASSWORD); + EnableWindow(hw, TRUE); + + d->nc->prompts[0]->flags |= KHUI_NCPROMPT_FLAG_STOCK; + d->nc->prompts[0]->hwnd_edit = hw; + d->nc->prompts[0]->hwnd_static = NULL; /* don't care */ + + khui_cw_unlock_nc(d->nc); + break; + } +#endif + /* for everything else */ + + /* hide the stock password controls */ +#if 0 + /* TAGREMOVE */ + hw = GetDlgItem(d->dlg_main, IDC_NC_PASSWORD); + ShowWindow(hw, SW_HIDE); + hw = GetDlgItem(d->dlg_main, IDC_NC_PASSWORD_LABEL); + ShowWindow(hw, SW_HIDE); +#endif + + y = d->r_idspec.bottom; + + hf = (HFONT) SendMessage(d->dlg_main, WM_GETFONT, 0, 0); + + if (d->nc->pname != NULL) { + hw = + CreateWindowEx + (0, + L"STATIC", + d->nc->pname, + SS_SUNKEN | WS_CHILD, + d->r_area.left, y, + d->r_row.right, + d->r_n_label.bottom - d->r_n_label.top, + d->dlg_main, + NULL, + khm_hInstance, + NULL); + +#ifdef DEBUG + assert(hw); +#endif + d->hwnd_name = hw; + SendMessage(hw, WM_SETFONT, (WPARAM)hf, (LPARAM) TRUE); + ShowWindow(hw, SW_SHOW); + + y += d->r_n_label.bottom - d->r_n_label.top; + } + + if (d->nc->banner != NULL) { + hw = + CreateWindowEx + (0, + L"STATIC", + d->nc->banner, + WS_CHILD, + d->r_area.left, y, + d->r_row.right, d->r_row.bottom, + d->dlg_main, + NULL, + khm_hInstance, + NULL); +#ifdef DEBUG + assert(hw); +#endif + d->hwnd_banner = hw; + SendMessage(hw, WM_SETFONT, (WPARAM)hf, (LPARAM)TRUE); + ShowWindow(hw, SW_SHOW); + y += d->r_row.bottom; + } + + hw_prev = d->hwnd_last_idspec; + + hdc = GetWindowDC(d->dlg_main); + hfold = SelectObject(hdc,hf); + + for(i=0; inc->n_prompts; i++) { + RECT pr, er; + SIZE s; + int dy; + + if(d->nc->prompts[i]->prompt != NULL) { + GetTextExtentPoint32(hdc, + d->nc->prompts[i]->prompt, + (int) wcslen(d->nc->prompts[i]->prompt), + &s); + if(s.cx < d->r_n_label.right - d->r_n_label.left) { + CopyRect(&pr, &d->r_n_label); + CopyRect(&er, &d->r_n_input); + dy = d->r_row.bottom; + } else if(s.cx < + d->r_e_label.right - d->r_e_label.left) { + CopyRect(&pr, &d->r_e_label); + CopyRect(&er, &d->r_e_input); + dy = d->r_row.bottom; + } else { + /* oops. the prompt doesn't fit in our + controls. we need to use up two lines */ + pr.left = 0; + pr.right = d->r_row.right; + pr.top = 0; + pr.bottom = d->r_n_label.bottom - + d->r_n_label.top; + CopyRect(&er, &d->r_n_input); + OffsetRect(&er, 0, pr.bottom); + dy = er.bottom + (d->r_row.bottom - + d->r_n_input.bottom); + } + } else { + SetRectEmpty(&pr); + CopyRect(&er, &d->r_n_input); + dy = d->r_row.bottom; + } + + if(IsRectEmpty(&pr)) { + d->nc->prompts[i]->hwnd_static = NULL; + } else { + OffsetRect(&pr, d->r_area.left, y); + + hw = CreateWindowEx + (0, + L"STATIC", + d->nc->prompts[i]->prompt, + WS_CHILD, + pr.left, pr.top, + pr.right - pr.left, pr.bottom - pr.top, + d->dlg_main, + NULL, + khm_hInstance, + NULL); +#ifdef DEBUG + assert(hw); +#endif + + SendMessage(hw, WM_SETFONT, + (WPARAM) hf, (LPARAM) TRUE); + + SetWindowPos(hw, hw_prev, + 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOMOVE | + SWP_NOOWNERZORDER | SWP_NOSIZE | + SWP_SHOWWINDOW); + + d->nc->prompts[i]->hwnd_static = hw; + hw_prev = hw; + } + + OffsetRect(&er, d->r_area.left, y); + + hw = CreateWindowEx + (0, + L"EDIT", + (d->nc->prompts[i]->def ? + d->nc->prompts[i]->def : L""), + WS_CHILD | WS_TABSTOP | + WS_BORDER | + ((d->nc->prompts[i]->flags & + KHUI_NCPROMPT_FLAG_HIDDEN)? ES_PASSWORD:0), + er.left, er.top, + er.right - er.left, er.bottom - er.top, + d->dlg_main, + NULL, + khm_hInstance, + NULL); + +#ifdef DEBUG + assert(hw); +#endif + + SendMessage(hw, WM_SETFONT, + (WPARAM) hf, (LPARAM) TRUE); + + SetWindowPos(hw, hw_prev, + 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOMOVE | + SWP_NOOWNERZORDER | SWP_NOSIZE | + SWP_SHOWWINDOW); + + SendMessage(hw, EM_SETLIMITTEXT, + KHUI_MAXCCH_PROMPT_VALUE -1, + 0); + + d->nc->prompts[i]->hwnd_edit = hw; + + hw_prev = hw; + + y += dy; + } + + SelectObject(hdc, hfold); + ReleaseDC(d->dlg_main, hdc); + + khui_cw_unlock_nc(d->nc); + + d->r_credtext.top = y; + + nc_position_credtext(d); + } + break; + + case WMNC_DIALOG_PROCESS_COMPLETE: + { + khui_new_creds * nc; + + nc = d->nc; + + nc->response &= ~KHUI_NC_RESPONSE_PROCESSING; + + if(nc->response & KHUI_NC_RESPONSE_NOEXIT) { + HWND hw; + + /* reset state */ + nc->result = KHUI_NC_RESULT_CANCEL; + + hw = GetDlgItem(d->dlg_main, IDOK); + EnableWindow(hw, TRUE); + hw = GetDlgItem(d->dlg_main, IDCANCEL); + EnableWindow(hw, TRUE); + hw = GetDlgItem(d->dlg_main, IDC_NC_OPTIONS); + EnableWindow(hw, TRUE); + hw = GetDlgItem(d->dlg_bb, IDOK); + EnableWindow(hw, TRUE); + hw = GetDlgItem(d->dlg_bb, IDCANCEL); + EnableWindow(hw, TRUE); + + nc_clear_password_fields(d); + + return TRUE; + } + + DestroyWindow(hwnd); + + kmq_post_message(KMSG_CRED, KMSG_CRED_END, 0, (void *) nc); + } + break; + + /* MUST be called with SendMessage */ + case WMNC_ADD_CONTROL_ROW: + { + khui_control_row * row; + + row = (khui_control_row *) lParam; + +#ifdef DEBUG + assert(row->label); + assert(row->input); +#endif + + nc_add_control_row(d, row->label, row->input, row->size); + } + break; + } /* switch(HIWORD(wParam)) */ + + return TRUE; +} + +static LRESULT nc_handle_wm_help(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + static DWORD ctxids[] = { + NC_TS_CTRL_ID_MIN, IDH_NC_TABMAIN, + NC_TS_CTRL_ID_MIN + 1, IDH_NC_TABBUTTON, + NC_TS_CTRL_ID_MIN + 2, IDH_NC_TABBUTTON, + NC_TS_CTRL_ID_MIN + 3, IDH_NC_TABBUTTON, + NC_TS_CTRL_ID_MIN + 4, IDH_NC_TABBUTTON, + NC_TS_CTRL_ID_MIN + 5, IDH_NC_TABBUTTON, + NC_TS_CTRL_ID_MIN + 6, IDH_NC_TABBUTTON, + NC_TS_CTRL_ID_MIN + 7, IDH_NC_TABBUTTON, + IDOK, IDH_NC_OK, + IDCANCEL, IDH_NC_CANCEL, + IDC_NC_HELP, IDH_NC_HELP, + IDC_NC_OPTIONS, IDH_NC_OPTIONS, + IDC_NC_CREDTEXT, IDH_NC_CREDWND, + 0 + }; + + HELPINFO * hlp; + HWND hw = NULL; + HWND hw_ctrl; + khui_nc_wnd_data * d; + + d = (khui_nc_wnd_data *)(LONG_PTR) GetWindowLongPtr(hwnd, CW_PARAM); + + hlp = (HELPINFO *) lParam; + + if (d->nc->subtype != KMSG_CRED_NEW_CREDS && + d->nc->subtype != KMSG_CRED_PASSWORD) + return TRUE; + + if (hlp->iContextType != HELPINFO_WINDOW) + return TRUE; + + if (hlp->hItemHandle != NULL && + hlp->hItemHandle != hwnd) { + DWORD id; + int i; + + hw_ctrl =hlp->hItemHandle; + + id = GetWindowLong(hw_ctrl, GWL_ID); + for (i=0; ctxids[i] != 0; i += 2) + if (ctxids[i] == id) + break; + + if (ctxids[i] != 0) + hw = khm_html_help(hw_ctrl, + ((d->nc->subtype == KMSG_CRED_NEW_CREDS)? + L"::popups_newcreds.txt": + L"::popups_password.txt"), + HH_TP_HELP_WM_HELP, + (DWORD_PTR) ctxids); + } + + if (hw == NULL) { + khm_html_help(hwnd, NULL, HH_HELP_CONTEXT, + ((d->nc->subtype == KMSG_CRED_NEW_CREDS)? + IDH_ACTION_NEW_ID: IDH_ACTION_PASSWD_ID)); + } + + return TRUE; +} + +static LRESULT CALLBACK nc_window_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + switch(uMsg) { + case WM_CREATE: + return nc_handle_wm_create(hwnd, uMsg, wParam, lParam); + + case WM_DESTROY: + return nc_handle_wm_destroy(hwnd, uMsg, wParam, lParam); + + case WM_COMMAND: + return nc_handle_wm_command(hwnd, uMsg, wParam, lParam); + + case WM_MOVE: + case WM_MOVING: + return nc_handle_wm_moving(hwnd, uMsg, wParam, lParam); + + case WM_HELP: + return nc_handle_wm_help(hwnd, uMsg, wParam, lParam); + + case KHUI_WM_NC_NOTIFY: + return nc_handle_wm_nc_notify(hwnd, uMsg, wParam, lParam); + } + + /* Note that this is technically a dialog box */ + return DefDlgProc(hwnd, uMsg, wParam, lParam); +} + +void khm_register_newcredwnd_class(void) +{ + WNDCLASSEX wcx; + + wcx.cbSize = sizeof(wcx); + wcx.style = CS_DBLCLKS | CS_OWNDC; + wcx.lpfnWndProc = nc_window_proc; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = DLGWINDOWEXTRA + sizeof(LONG_PTR); + wcx.hInstance = khm_hInstance; + wcx.hIcon = LoadIcon(khm_hInstance, MAKEINTRESOURCE(IDI_MAIN_APP)); + wcx.hCursor = LoadCursor((HINSTANCE) NULL, IDC_ARROW); + wcx.hbrBackground = (HBRUSH) (COLOR_BACKGROUND + 1); + wcx.lpszMenuName = NULL; + wcx.lpszClassName = KHUI_NEWCREDWND_CLASS; + wcx.hIconSm = NULL; + + khui_newcredwnd_cls = RegisterClassEx(&wcx); +} + +void khm_unregister_newcredwnd_class(void) +{ + UnregisterClass((LPWSTR) khui_newcredwnd_cls, khm_hInstance); +} + +HWND khm_create_newcredwnd(HWND parent, khui_new_creds * c) +{ + wchar_t wtitle[256]; + HWND hwnd; + + if (c->window_title == NULL) { + if (c->subtype == KMSG_CRED_PASSWORD) + LoadString(khm_hInstance, + IDS_WT_PASSWORD, + wtitle, + ARRAYLENGTH(wtitle)); + else + LoadString(khm_hInstance, + IDS_WT_NEW_CREDS, + wtitle, + ARRAYLENGTH(wtitle)); + } + + hwnd = CreateWindowEx(WS_EX_DLGMODALFRAME | WS_EX_CONTEXTHELP, + MAKEINTATOM(khui_newcredwnd_cls), + ((c->window_title)?c->window_title: wtitle), + WS_DLGFRAME | WS_POPUPWINDOW | WS_CLIPCHILDREN, + 0,0,400,400, /* bogus values. the window + is going to resize and + reposition itself + anyway */ + parent, + NULL, + khm_hInstance, + (LPVOID) c); + +#ifdef DEBUG + assert(hwnd != NULL); +#endif + + /* note that the window is not visible yet. That's because, at + this point we don't know what the panels are */ + + return hwnd; +} + +void khm_prep_newcredwnd(HWND hwnd) +{ + SendMessage(hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_SETUP), 0); +} + +void khm_show_newcredwnd(HWND hwnd) +{ + /* add all the panels in and prep UI */ + SendMessage(hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_ACTIVATE), 0); +} --- krb5-1.4.4.orig/src/windows/identity/ui/passwnd.c +++ krb5-1.4.4/src/windows/identity/ui/passwnd.c @@ -1,133 +1,133 @@ -#include - -static ATOM sAtom = 0; -static HINSTANCE shInstance = 0; - -/* Callback for the MITPasswordControl -This is a replacement for the normal edit control. It does not show the -annoying password char in the edit box so that the number of chars in the -password are not known. -*/ - -#define PASSWORDCHAR L'#' -#define DLGHT(ht) (HIWORD(GetDialogBaseUnits())*(ht)/8) -#define DLGWD(wd) (LOWORD(GetDialogBaseUnits())*(wd)/4) - -static -LRESULT -CALLBACK -MITPasswordEditProc( - HWND hWnd, - UINT message, - WPARAM wParam, - LPARAM lParam - ) -{ - static SIZE pwdcharsz; - BOOL pass_the_buck = FALSE; - - if (message > WM_USER && message < 0x7FFF) - pass_the_buck = TRUE; - - switch(message) - { - case WM_GETTEXT: - case WM_GETTEXTLENGTH: - case WM_SETTEXT: - pass_the_buck = TRUE; - break; - case WM_PAINT: - { - HDC hdc; - PAINTSTRUCT ps; - RECT r; - - hdc = BeginPaint(hWnd, &ps); - GetClientRect(hWnd, &r); - Rectangle(hdc, 0, 0, r.right, r.bottom); - EndPaint(hWnd, &ps); - } - break; - case WM_SIZE: - { - MoveWindow(GetDlgItem(hWnd, 1), DLGWD(2), DLGHT(2), - pwdcharsz.cx / 2, pwdcharsz.cy, TRUE); - } - break; - case WM_LBUTTONDOWN: - case WM_SETFOCUS: - { - SetFocus(GetDlgItem(hWnd, 1)); - } - break; - case WM_CREATE: - { - HWND heditchild; - wchar_t pwdchar = PASSWORDCHAR; - HDC hdc; - /* Create a child window of this control for default processing. */ - hdc = GetDC(hWnd); - GetTextExtentPoint32(hdc, &pwdchar, 1, &pwdcharsz); - ReleaseDC(hWnd, hdc); - - heditchild = - CreateWindow(L"edit", L"", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | - ES_LEFT | ES_PASSWORD | WS_TABSTOP, - 0, 0, 0, 0, - hWnd, - (HMENU)1, - ((LPCREATESTRUCT)lParam)->hInstance, - NULL); - SendMessage(heditchild, EM_SETPASSWORDCHAR, PASSWORDCHAR, 0L); - } - break; - } - - if (pass_the_buck) - return SendMessage(GetDlgItem(hWnd, 1), message, wParam, lParam); - return DefWindowProc(hWnd, message, wParam, lParam); -} - -khm_int32 -khm_register_passwnd_class(void) -{ - if (!sAtom) { - WNDCLASS wndclass; - - memset(&wndclass, 0, sizeof(WNDCLASS)); - - shInstance = khm_hInstance; - - wndclass.style = CS_HREDRAW | CS_VREDRAW; - wndclass.lpfnWndProc = (WNDPROC)MITPasswordEditProc; - wndclass.cbClsExtra = sizeof(HWND); - wndclass.cbWndExtra = 0; - wndclass.hInstance = shInstance; - wndclass.hbrBackground = (void *)(COLOR_WINDOW + 1); - wndclass.lpszClassName = MIT_PWD_DLL_CLASS; - wndclass.hCursor = LoadCursor((HINSTANCE)NULL, IDC_IBEAM); - - sAtom = RegisterClass(&wndclass); - } - - return (sAtom)?KHM_ERROR_SUCCESS:KHM_ERROR_UNKNOWN; -} - -khm_int32 -khm_unregister_passwnd_class(void) -{ - BOOL result = TRUE; - - if ((khm_hInstance != shInstance) || !sAtom) { - return KHM_ERROR_INVALID_OPERATION; - } - - result = UnregisterClass(MIT_PWD_DLL_CLASS, khm_hInstance); - if (result) { - sAtom = 0; - shInstance = 0; - return KHM_ERROR_SUCCESS; - } else { - return KHM_ERROR_UNKNOWN; - } -} +#include + +static ATOM sAtom = 0; +static HINSTANCE shInstance = 0; + +/* Callback for the MITPasswordControl +This is a replacement for the normal edit control. It does not show the +annoying password char in the edit box so that the number of chars in the +password are not known. +*/ + +#define PASSWORDCHAR L'#' +#define DLGHT(ht) (HIWORD(GetDialogBaseUnits())*(ht)/8) +#define DLGWD(wd) (LOWORD(GetDialogBaseUnits())*(wd)/4) + +static +LRESULT +CALLBACK +MITPasswordEditProc( + HWND hWnd, + UINT message, + WPARAM wParam, + LPARAM lParam + ) +{ + static SIZE pwdcharsz; + BOOL pass_the_buck = FALSE; + + if (message > WM_USER && message < 0x7FFF) + pass_the_buck = TRUE; + + switch(message) + { + case WM_GETTEXT: + case WM_GETTEXTLENGTH: + case WM_SETTEXT: + pass_the_buck = TRUE; + break; + case WM_PAINT: + { + HDC hdc; + PAINTSTRUCT ps; + RECT r; + + hdc = BeginPaint(hWnd, &ps); + GetClientRect(hWnd, &r); + Rectangle(hdc, 0, 0, r.right, r.bottom); + EndPaint(hWnd, &ps); + } + break; + case WM_SIZE: + { + MoveWindow(GetDlgItem(hWnd, 1), DLGWD(2), DLGHT(2), + pwdcharsz.cx / 2, pwdcharsz.cy, TRUE); + } + break; + case WM_LBUTTONDOWN: + case WM_SETFOCUS: + { + SetFocus(GetDlgItem(hWnd, 1)); + } + break; + case WM_CREATE: + { + HWND heditchild; + wchar_t pwdchar = PASSWORDCHAR; + HDC hdc; + /* Create a child window of this control for default processing. */ + hdc = GetDC(hWnd); + GetTextExtentPoint32(hdc, &pwdchar, 1, &pwdcharsz); + ReleaseDC(hWnd, hdc); + + heditchild = + CreateWindow(L"edit", L"", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | + ES_LEFT | ES_PASSWORD | WS_TABSTOP, + 0, 0, 0, 0, + hWnd, + (HMENU)1, + ((LPCREATESTRUCT)lParam)->hInstance, + NULL); + SendMessage(heditchild, EM_SETPASSWORDCHAR, PASSWORDCHAR, 0L); + } + break; + } + + if (pass_the_buck) + return SendMessage(GetDlgItem(hWnd, 1), message, wParam, lParam); + return DefWindowProc(hWnd, message, wParam, lParam); +} + +khm_int32 +khm_register_passwnd_class(void) +{ + if (!sAtom) { + WNDCLASS wndclass; + + memset(&wndclass, 0, sizeof(WNDCLASS)); + + shInstance = khm_hInstance; + + wndclass.style = CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = (WNDPROC)MITPasswordEditProc; + wndclass.cbClsExtra = sizeof(HWND); + wndclass.cbWndExtra = 0; + wndclass.hInstance = shInstance; + wndclass.hbrBackground = (void *)(COLOR_WINDOW + 1); + wndclass.lpszClassName = MIT_PWD_DLL_CLASS; + wndclass.hCursor = LoadCursor((HINSTANCE)NULL, IDC_IBEAM); + + sAtom = RegisterClass(&wndclass); + } + + return (sAtom)?KHM_ERROR_SUCCESS:KHM_ERROR_UNKNOWN; +} + +khm_int32 +khm_unregister_passwnd_class(void) +{ + BOOL result = TRUE; + + if ((khm_hInstance != shInstance) || !sAtom) { + return KHM_ERROR_INVALID_OPERATION; + } + + result = UnregisterClass(MIT_PWD_DLL_CLASS, khm_hInstance); + if (result) { + sAtom = 0; + shInstance = 0; + return KHM_ERROR_SUCCESS; + } else { + return KHM_ERROR_UNKNOWN; + } +} --- krb5-1.4.4.orig/src/windows/identity/ui/reqdaemon.c +++ krb5-1.4.4/src/windows/identity/ui/reqdaemon.c @@ -1,451 +1,451 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -ATOM reqdaemon_atom = 0; -HANDLE reqdaemon_thread = NULL; -HWND reqdaemon_hwnd = NULL; - -LRESULT CALLBACK -reqdaemonwnd_proc(HWND hwnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) { - - switch(uMsg) { - case WM_CREATE: - break; - - case WM_CLOSE: - DestroyWindow(hwnd); - break; - - case WM_DESTROY: - reqdaemon_hwnd = NULL; - PostQuitMessage(0); - break; - - /* Leash compatibility */ - case ID_OBTAIN_TGT_WITH_LPARAM: - { - wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t wmapping[ARRAYLENGTH(KHUI_REQD_MAPPING_FORMAT) + 10]; - khm_handle identity = NULL; - LPNETID_DLGINFO pdlginfo; - LRESULT lr = 1; - khm_int32 result; - HANDLE hmap = NULL; - HRESULT hr; - - hr = StringCbPrintf(wmapping, sizeof(wmapping), - KHUI_REQD_MAPPING_FORMAT, (DWORD) lParam); -#ifdef DEBUG - assert(SUCCEEDED(hr)); -#endif - hmap = CreateFileMapping(INVALID_HANDLE_VALUE, - NULL, - PAGE_READWRITE, - 0, 4096, - wmapping); - - if (hmap == NULL) { - return -1; - } else if (hmap != NULL && GetLastError() != ERROR_ALREADY_EXISTS) { - CloseHandle(hmap); - return -1; - } - - pdlginfo = MapViewOfFile(hmap, - FILE_MAP_WRITE, - 0, 0, - sizeof(*pdlginfo)); - - if (pdlginfo == NULL) { - CloseHandle(hmap); - return 1; - } - - if (pdlginfo->in.username[0] && - pdlginfo->in.realm[0] && - SUCCEEDED(StringCbPrintf(widname, - sizeof(widname), - L"%s@%s", - pdlginfo->in.username, - pdlginfo->in.realm))) { - - kcdb_identity_create(widname, - KCDB_IDENT_FLAG_CREATE, - &identity); - } - - widname[0] = 0; - - do { - if (khm_cred_is_in_dialog()) { - khm_cred_wait_for_dialog(INFINITE, NULL, NULL, 0); - } - - if (identity) - khui_context_set_ex(KHUI_SCOPE_IDENT, - identity, - KCDB_CREDTYPE_INVALID, - NULL, - NULL, - 0, - NULL, - pdlginfo, - sizeof(*pdlginfo)); - else - khui_context_reset(); - - if (pdlginfo->dlgtype == NETID_DLGTYPE_TGT) - SendMessage(khm_hwnd_main, WM_COMMAND, - MAKEWPARAM(KHUI_ACTION_NEW_CRED, 0), 0); - else if (pdlginfo->dlgtype == NETID_DLGTYPE_CHPASSWD) - SendMessage(khm_hwnd_main, WM_COMMAND, - MAKEWPARAM(KHUI_ACTION_PASSWD_ID, 0), 0); - else - break; - - if (KHM_FAILED(khm_cred_wait_for_dialog(INFINITE, &result, - widname, - sizeof(widname)))) - continue; - else { - lr = (result != KHUI_NC_RESULT_PROCESS); - break; - } - } while(TRUE); - -#ifdef DEBUG - assert(lr || pdlginfo->dlgtype != NETID_DLGTYPE_TGT || - widname[0]); -#endif - - if (!lr && pdlginfo->dlgtype == NETID_DLGTYPE_TGT && - widname[0]) { - khm_handle out_ident; - wchar_t * atsign; - - atsign = wcsrchr(widname, L'@'); - - if (atsign == NULL) - goto _exit; - - if (KHM_SUCCEEDED(kcdb_identity_create(widname, - 0, - &out_ident))) { - khm_size cb; - - pdlginfo->out.ccache[0] = 0; - - cb = sizeof(pdlginfo->out.ccache); - kcdb_identity_get_attrib(out_ident, - L"Krb5CCName", - NULL, - pdlginfo->out.ccache, - &cb); - kcdb_identity_release(out_ident); - } -#ifdef DEBUG - else { - assert(FALSE); - } -#endif - - *atsign++ = 0; - - StringCbCopy(pdlginfo->out.username, - sizeof(pdlginfo->out.username), - widname); - - StringCbCopy(pdlginfo->out.realm, - sizeof(pdlginfo->out.realm), - atsign); - } - - _exit: - - if (pdlginfo) - UnmapViewOfFile(pdlginfo); - if (hmap) - CloseHandle(hmap); - if (identity) - kcdb_identity_release(identity); - - return lr; - } - -#ifdef DEPRECATED_REMOTE_CALL - /* deprecated */ - case ID_OBTAIN_TGT_WITH_LPARAM: - { - char * param = (char *) GlobalLock((HGLOBAL) lParam); - char * username = NULL; - char * realm = NULL; - char * title = NULL; - char * ccache = NULL; - wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t wtitle[KHUI_MAXCCH_TITLE]; - size_t cch; - khm_int32 rv = KHM_ERROR_SUCCESS; - khm_handle identity = NULL; - NETID_DLGINFO dlginfo; - - if (param) { - if (*param) - title = param; - - if (FAILED(StringCchLengthA(param, KHUI_MAXCCH_TITLE, &cch))) { -#ifdef DEBUG - assert(FALSE); -#endif - rv = KHM_ERROR_INVALID_PARAM; - goto _exit_tgt_with_lparam; - } - - param += cch + 1; - - if (*param) - username = param; - - if (FAILED(StringCchLengthA(param, KCDB_IDENT_MAXCCH_NAME, &cch))) { -#ifdef DEBUG - assert(FALSE); -#endif - rv = KHM_ERROR_INVALID_PARAM; - goto _exit_tgt_with_lparam; - } - - param += cch + 1; - - if (*param) - realm = param; - - if (FAILED(StringCchLengthA(param, KCDB_IDENT_MAXCCH_NAME, &cch))) { -#ifdef DEBUG - assert(FALSE); -#endif - rv = KHM_ERROR_INVALID_PARAM; - goto _exit_tgt_with_lparam; - } - - param += cch + 1; - - if (*param) - ccache = param; - } - - if (username && realm) { - - if (FAILED(StringCbPrintf(widname, sizeof(widname), - L"%hs@%hs", username, realm))) { - rv = KHM_ERROR_INVALID_PARAM; - goto _exit_tgt_with_lparam; - } - - rv = kcdb_identity_create(widname, - KCDB_IDENT_FLAG_CREATE, - &identity); - if (KHM_FAILED(rv)) { - goto _exit_tgt_with_lparam; - } - } - - ZeroMemory(&dlginfo, sizeof(dlginfo)); - - dlginfo.size = NETID_DLGINFO_V1_SZ; - dlginfo.dlgtype = NETID_DLGTYPE_TGT; - - if (title) - StringCbCopy(dlginfo.in.title, sizeof(dlginfo.in.title), - wtitle); - if (username) - AnsiStrToUnicode(dlginfo.in.username, sizeof(dlginfo.in.username), - username); - if (realm) - AnsiStrToUnicode(dlginfo.in.realm, sizeof(dlginfo.in.realm), - realm); - - if (ccache) - AnsiStrToUnicode(dlginfo.in.ccache, sizeof(dlginfo.in.ccache), - ccache); - - dlginfo.in.use_defaults = TRUE; - - do { - if (khm_cred_is_in_dialog()) { - khm_cred_wait_for_dialog(INFINITE); - } - - khui_context_set_ex(KHUI_SCOPE_IDENT, - identity, - KCDB_CREDTYPE_INVALID, - NULL, - NULL, - 0, - NULL, - &dlginfo, - sizeof(dlginfo)); - - if (title) { - AnsiStrToUnicode(wtitle, sizeof(wtitle), - title); - - khm_cred_obtain_new_creds(wtitle); - } else { - khm_cred_obtain_new_creds(NULL); - } - - if (KHM_FAILED(khm_cred_wait_for_dialog(INFINITE))) - continue; - else - break; - } while(TRUE); - - _exit_tgt_with_lparam: - if (identity) - kcdb_identity_release(identity); - - GlobalUnlock((HGLOBAL) lParam); - } - return 0; -#endif - - } - - return DefWindowProc(hwnd, uMsg, wParam, lParam); -} - -DWORD WINAPI -khm_reqdaemon_thread_proc(LPVOID vparam) { - BOOL rv; - MSG msg; -#ifdef DEBUG - DWORD dw; -#endif - - khm_register_reqdaemonwnd_class(); - -#ifdef DEBUG - assert(reqdaemon_atom != 0); -#endif - - reqdaemon_hwnd = CreateWindowEx(0, - MAKEINTATOM(reqdaemon_atom), - KHUI_REQDAEMONWND_NAME, - 0, - 0,0,0,0, - HWND_MESSAGE, - NULL, - khm_hInstance, - NULL); - -#ifdef DEBUG - dw = GetLastError(); - assert(reqdaemon_hwnd != NULL); -#endif - - while(rv = GetMessage(&msg, NULL, 0, 0)) { - if (rv == -1) { -#ifdef DEBUG - assert(FALSE); -#endif - break; - } else { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - - reqdaemon_thread = NULL; - - khm_unregister_reqdaemonwnd_class(); - - return 0; -} - -void -khm_register_reqdaemonwnd_class(void) { - WNDCLASSEX wcx; - - ZeroMemory(&wcx, sizeof(wcx)); - - wcx.cbSize = sizeof(wcx); - wcx.style = 0; - wcx.lpfnWndProc = reqdaemonwnd_proc; - wcx.cbClsExtra = 0; - wcx.cbWndExtra = 0; - wcx.hInstance = khm_hInstance; - wcx.hIcon = NULL; - wcx.hCursor = NULL; - wcx.hbrBackground = NULL; - wcx.lpszMenuName = NULL; - wcx.lpszClassName = KHUI_REQDAEMONWND_CLASS; - wcx.hIconSm = NULL; - - reqdaemon_atom = RegisterClassEx(&wcx); - -#ifdef DEBUG - assert(reqdaemon_atom != 0); -#endif -} - -void -khm_unregister_reqdaemonwnd_class(void) { - if (reqdaemon_atom != 0) { - UnregisterClass(MAKEINTATOM(reqdaemon_atom), khm_hInstance); - reqdaemon_atom = 0; - } -} - -void -khm_init_request_daemon(void) { -#ifdef DEBUG - assert(reqdaemon_thread == NULL); -#endif - - reqdaemon_thread = CreateThread(NULL, - 0, - khm_reqdaemon_thread_proc, - NULL, - 0, - NULL); - -#ifdef DEBUG - assert(reqdaemon_thread != NULL); -#endif -} - -void -khm_exit_request_daemon(void) { - if (reqdaemon_hwnd == NULL) - return; - - SendMessage(reqdaemon_hwnd, WM_CLOSE, 0, 0); -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +ATOM reqdaemon_atom = 0; +HANDLE reqdaemon_thread = NULL; +HWND reqdaemon_hwnd = NULL; + +LRESULT CALLBACK +reqdaemonwnd_proc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) { + + switch(uMsg) { + case WM_CREATE: + break; + + case WM_CLOSE: + DestroyWindow(hwnd); + break; + + case WM_DESTROY: + reqdaemon_hwnd = NULL; + PostQuitMessage(0); + break; + + /* Leash compatibility */ + case ID_OBTAIN_TGT_WITH_LPARAM: + { + wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t wmapping[ARRAYLENGTH(KHUI_REQD_MAPPING_FORMAT) + 10]; + khm_handle identity = NULL; + LPNETID_DLGINFO pdlginfo; + LRESULT lr = 1; + khm_int32 result; + HANDLE hmap = NULL; + HRESULT hr; + + hr = StringCbPrintf(wmapping, sizeof(wmapping), + KHUI_REQD_MAPPING_FORMAT, (DWORD) lParam); +#ifdef DEBUG + assert(SUCCEEDED(hr)); +#endif + hmap = CreateFileMapping(INVALID_HANDLE_VALUE, + NULL, + PAGE_READWRITE, + 0, 4096, + wmapping); + + if (hmap == NULL) { + return -1; + } else if (hmap != NULL && GetLastError() != ERROR_ALREADY_EXISTS) { + CloseHandle(hmap); + return -1; + } + + pdlginfo = MapViewOfFile(hmap, + FILE_MAP_WRITE, + 0, 0, + sizeof(*pdlginfo)); + + if (pdlginfo == NULL) { + CloseHandle(hmap); + return 1; + } + + if (pdlginfo->in.username[0] && + pdlginfo->in.realm[0] && + SUCCEEDED(StringCbPrintf(widname, + sizeof(widname), + L"%s@%s", + pdlginfo->in.username, + pdlginfo->in.realm))) { + + kcdb_identity_create(widname, + KCDB_IDENT_FLAG_CREATE, + &identity); + } + + widname[0] = 0; + + do { + if (khm_cred_is_in_dialog()) { + khm_cred_wait_for_dialog(INFINITE, NULL, NULL, 0); + } + + if (identity) + khui_context_set_ex(KHUI_SCOPE_IDENT, + identity, + KCDB_CREDTYPE_INVALID, + NULL, + NULL, + 0, + NULL, + pdlginfo, + sizeof(*pdlginfo)); + else + khui_context_reset(); + + if (pdlginfo->dlgtype == NETID_DLGTYPE_TGT) + SendMessage(khm_hwnd_main, WM_COMMAND, + MAKEWPARAM(KHUI_ACTION_NEW_CRED, 0), 0); + else if (pdlginfo->dlgtype == NETID_DLGTYPE_CHPASSWD) + SendMessage(khm_hwnd_main, WM_COMMAND, + MAKEWPARAM(KHUI_ACTION_PASSWD_ID, 0), 0); + else + break; + + if (KHM_FAILED(khm_cred_wait_for_dialog(INFINITE, &result, + widname, + sizeof(widname)))) + continue; + else { + lr = (result != KHUI_NC_RESULT_PROCESS); + break; + } + } while(TRUE); + +#ifdef DEBUG + assert(lr || pdlginfo->dlgtype != NETID_DLGTYPE_TGT || + widname[0]); +#endif + + if (!lr && pdlginfo->dlgtype == NETID_DLGTYPE_TGT && + widname[0]) { + khm_handle out_ident; + wchar_t * atsign; + + atsign = wcsrchr(widname, L'@'); + + if (atsign == NULL) + goto _exit; + + if (KHM_SUCCEEDED(kcdb_identity_create(widname, + 0, + &out_ident))) { + khm_size cb; + + pdlginfo->out.ccache[0] = 0; + + cb = sizeof(pdlginfo->out.ccache); + kcdb_identity_get_attrib(out_ident, + L"Krb5CCName", + NULL, + pdlginfo->out.ccache, + &cb); + kcdb_identity_release(out_ident); + } +#ifdef DEBUG + else { + assert(FALSE); + } +#endif + + *atsign++ = 0; + + StringCbCopy(pdlginfo->out.username, + sizeof(pdlginfo->out.username), + widname); + + StringCbCopy(pdlginfo->out.realm, + sizeof(pdlginfo->out.realm), + atsign); + } + + _exit: + + if (pdlginfo) + UnmapViewOfFile(pdlginfo); + if (hmap) + CloseHandle(hmap); + if (identity) + kcdb_identity_release(identity); + + return lr; + } + +#ifdef DEPRECATED_REMOTE_CALL + /* deprecated */ + case ID_OBTAIN_TGT_WITH_LPARAM: + { + char * param = (char *) GlobalLock((HGLOBAL) lParam); + char * username = NULL; + char * realm = NULL; + char * title = NULL; + char * ccache = NULL; + wchar_t widname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t wtitle[KHUI_MAXCCH_TITLE]; + size_t cch; + khm_int32 rv = KHM_ERROR_SUCCESS; + khm_handle identity = NULL; + NETID_DLGINFO dlginfo; + + if (param) { + if (*param) + title = param; + + if (FAILED(StringCchLengthA(param, KHUI_MAXCCH_TITLE, &cch))) { +#ifdef DEBUG + assert(FALSE); +#endif + rv = KHM_ERROR_INVALID_PARAM; + goto _exit_tgt_with_lparam; + } + + param += cch + 1; + + if (*param) + username = param; + + if (FAILED(StringCchLengthA(param, KCDB_IDENT_MAXCCH_NAME, &cch))) { +#ifdef DEBUG + assert(FALSE); +#endif + rv = KHM_ERROR_INVALID_PARAM; + goto _exit_tgt_with_lparam; + } + + param += cch + 1; + + if (*param) + realm = param; + + if (FAILED(StringCchLengthA(param, KCDB_IDENT_MAXCCH_NAME, &cch))) { +#ifdef DEBUG + assert(FALSE); +#endif + rv = KHM_ERROR_INVALID_PARAM; + goto _exit_tgt_with_lparam; + } + + param += cch + 1; + + if (*param) + ccache = param; + } + + if (username && realm) { + + if (FAILED(StringCbPrintf(widname, sizeof(widname), + L"%hs@%hs", username, realm))) { + rv = KHM_ERROR_INVALID_PARAM; + goto _exit_tgt_with_lparam; + } + + rv = kcdb_identity_create(widname, + KCDB_IDENT_FLAG_CREATE, + &identity); + if (KHM_FAILED(rv)) { + goto _exit_tgt_with_lparam; + } + } + + ZeroMemory(&dlginfo, sizeof(dlginfo)); + + dlginfo.size = NETID_DLGINFO_V1_SZ; + dlginfo.dlgtype = NETID_DLGTYPE_TGT; + + if (title) + StringCbCopy(dlginfo.in.title, sizeof(dlginfo.in.title), + wtitle); + if (username) + AnsiStrToUnicode(dlginfo.in.username, sizeof(dlginfo.in.username), + username); + if (realm) + AnsiStrToUnicode(dlginfo.in.realm, sizeof(dlginfo.in.realm), + realm); + + if (ccache) + AnsiStrToUnicode(dlginfo.in.ccache, sizeof(dlginfo.in.ccache), + ccache); + + dlginfo.in.use_defaults = TRUE; + + do { + if (khm_cred_is_in_dialog()) { + khm_cred_wait_for_dialog(INFINITE); + } + + khui_context_set_ex(KHUI_SCOPE_IDENT, + identity, + KCDB_CREDTYPE_INVALID, + NULL, + NULL, + 0, + NULL, + &dlginfo, + sizeof(dlginfo)); + + if (title) { + AnsiStrToUnicode(wtitle, sizeof(wtitle), + title); + + khm_cred_obtain_new_creds(wtitle); + } else { + khm_cred_obtain_new_creds(NULL); + } + + if (KHM_FAILED(khm_cred_wait_for_dialog(INFINITE))) + continue; + else + break; + } while(TRUE); + + _exit_tgt_with_lparam: + if (identity) + kcdb_identity_release(identity); + + GlobalUnlock((HGLOBAL) lParam); + } + return 0; +#endif + + } + + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +DWORD WINAPI +khm_reqdaemon_thread_proc(LPVOID vparam) { + BOOL rv; + MSG msg; +#ifdef DEBUG + DWORD dw; +#endif + + khm_register_reqdaemonwnd_class(); + +#ifdef DEBUG + assert(reqdaemon_atom != 0); +#endif + + reqdaemon_hwnd = CreateWindowEx(0, + MAKEINTATOM(reqdaemon_atom), + KHUI_REQDAEMONWND_NAME, + 0, + 0,0,0,0, + HWND_MESSAGE, + NULL, + khm_hInstance, + NULL); + +#ifdef DEBUG + dw = GetLastError(); + assert(reqdaemon_hwnd != NULL); +#endif + + while(rv = GetMessage(&msg, NULL, 0, 0)) { + if (rv == -1) { +#ifdef DEBUG + assert(FALSE); +#endif + break; + } else { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + reqdaemon_thread = NULL; + + khm_unregister_reqdaemonwnd_class(); + + return 0; +} + +void +khm_register_reqdaemonwnd_class(void) { + WNDCLASSEX wcx; + + ZeroMemory(&wcx, sizeof(wcx)); + + wcx.cbSize = sizeof(wcx); + wcx.style = 0; + wcx.lpfnWndProc = reqdaemonwnd_proc; + wcx.cbClsExtra = 0; + wcx.cbWndExtra = 0; + wcx.hInstance = khm_hInstance; + wcx.hIcon = NULL; + wcx.hCursor = NULL; + wcx.hbrBackground = NULL; + wcx.lpszMenuName = NULL; + wcx.lpszClassName = KHUI_REQDAEMONWND_CLASS; + wcx.hIconSm = NULL; + + reqdaemon_atom = RegisterClassEx(&wcx); + +#ifdef DEBUG + assert(reqdaemon_atom != 0); +#endif +} + +void +khm_unregister_reqdaemonwnd_class(void) { + if (reqdaemon_atom != 0) { + UnregisterClass(MAKEINTATOM(reqdaemon_atom), khm_hInstance); + reqdaemon_atom = 0; + } +} + +void +khm_init_request_daemon(void) { +#ifdef DEBUG + assert(reqdaemon_thread == NULL); +#endif + + reqdaemon_thread = CreateThread(NULL, + 0, + khm_reqdaemon_thread_proc, + NULL, + 0, + NULL); + +#ifdef DEBUG + assert(reqdaemon_thread != NULL); +#endif +} + +void +khm_exit_request_daemon(void) { + if (reqdaemon_hwnd == NULL) + return; + + SendMessage(reqdaemon_hwnd, WM_CLOSE, 0, 0); +} --- krb5-1.4.4.orig/src/windows/identity/ui/credfuncs.c +++ krb5-1.4.4/src/windows/identity/ui/credfuncs.c @@ -1,1056 +1,1056 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#include -#include - -static BOOL in_dialog = FALSE; -static CRITICAL_SECTION cs_dialog; -static HANDLE in_dialog_evt = NULL; -static LONG init_dialog = 0; -static khm_int32 dialog_result = 0; -static wchar_t dialog_identity[KCDB_IDENT_MAXCCH_NAME]; - -static void -dialog_sync_init(void) { - if (InterlockedIncrement(&init_dialog) == 1) { -#ifdef DEBUG - assert(in_dialog_evt == NULL); - assert(in_dialog == FALSE); -#endif - - InitializeCriticalSection(&cs_dialog); - - in_dialog_evt = CreateEvent(NULL, - TRUE, - TRUE, - L"DialogCompletionEvent"); - } else { - InterlockedDecrement(&init_dialog); - if (in_dialog_evt == NULL) { - Sleep(100); - } - } -} - -BOOL -khm_cred_begin_dialog(void) { - BOOL rv; - - dialog_sync_init(); - - EnterCriticalSection(&cs_dialog); - - if (in_dialog) - rv = FALSE; - else { - rv = TRUE; - in_dialog = TRUE; - ResetEvent(in_dialog_evt); - } - - LeaveCriticalSection(&cs_dialog); - return rv; -} - -void -khm_cred_end_dialog(khui_new_creds * nc) { - dialog_sync_init(); - - EnterCriticalSection(&cs_dialog); - if (in_dialog) { - in_dialog = FALSE; - SetEvent(in_dialog_evt); - } - dialog_result = nc->result; - if (nc->subtype == KMSG_CRED_NEW_CREDS && - nc->n_identities > 0 && - nc->identities[0]) { - khm_size cb; - - cb = sizeof(dialog_identity); - if (KHM_FAILED(kcdb_identity_get_name(nc->identities[0], - dialog_identity, - &cb))) - dialog_identity[0] = 0; - } else { - dialog_identity[0] = 0; - } - LeaveCriticalSection(&cs_dialog); -} - -BOOL -khm_cred_is_in_dialog(void) { - BOOL rv; - - dialog_sync_init(); - - EnterCriticalSection(&cs_dialog); - rv = in_dialog; - LeaveCriticalSection(&cs_dialog); - - return rv; -} - -khm_int32 -khm_cred_wait_for_dialog(DWORD timeout, khm_int32 * result, - wchar_t * ident, khm_size cb_ident) { - khm_int32 rv; - - dialog_sync_init(); - - EnterCriticalSection(&cs_dialog); - if (!in_dialog) - rv = KHM_ERROR_NOT_FOUND; - else { - DWORD dw; - - do { - LeaveCriticalSection(&cs_dialog); - - dw = WaitForSingleObject(in_dialog_evt, timeout); - - EnterCriticalSection(&cs_dialog); - - if (!in_dialog) { - rv = KHM_ERROR_SUCCESS; - if (result) { - *result = dialog_result; - } - if (ident) { - StringCbCopy(ident, cb_ident, dialog_identity); - } - break; - } else if(dw == WAIT_TIMEOUT) { - rv = KHM_ERROR_TIMEOUT; - break; - } - } while(TRUE); - } - LeaveCriticalSection(&cs_dialog); - - return rv; -} - -/* completion handler for KMSG_CRED messages */ -void KHMAPI -kmsg_cred_completion(kmq_message *m) -{ - khui_new_creds * nc; - -#ifdef DEBUG - assert(m->type == KMSG_CRED); -#else - if(m->type != KMSG_CRED) - return; /* huh? */ -#endif - - switch(m->subtype) { - case KMSG_CRED_PASSWORD: - /* fallthrough */ - case KMSG_CRED_NEW_CREDS: - /* Cred types have attached themselves. Trigger the next - phase. */ - kmq_post_message(KMSG_CRED, KMSG_CRED_DIALOG_SETUP, 0, - m->vparam); - break; - - case KMSG_CRED_RENEW_CREDS: - nc = (khui_new_creds *) m->vparam; - - /* khm_cred_dispatch_process_message() deals with the case - where there are not credential types that wants to - participate in this operation. */ - khm_cred_dispatch_process_message(nc); - break; - - case KMSG_CRED_DIALOG_SETUP: - nc = (khui_new_creds *) m->vparam; - - khm_prep_newcredwnd(nc->hwnd); - - /* all the controls have been created. Now initialize them */ - if (nc->n_types > 0) { - kmq_post_subs_msg(nc->type_subs, - nc->n_types, - KMSG_CRED, - KMSG_CRED_DIALOG_PRESTART, - 0, - m->vparam); - } else { - PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_PROCESS_COMPLETE), 0); - } - break; - - case KMSG_CRED_DIALOG_PRESTART: - /* all prestart stuff is done. Now to activate the dialog */ - nc = (khui_new_creds *) m->vparam; - khm_show_newcredwnd(nc->hwnd); - - kmq_post_subs_msg(nc->type_subs, - nc->n_types, - KMSG_CRED, - KMSG_CRED_DIALOG_START, - 0, - m->vparam); - /* at this point, the dialog window takes over. We let it run - the show until KMSG_CRED_DIALOG_END is posted by the dialog - procedure. */ - break; - - case KMSG_CRED_PROCESS: - /* a wave of these messages have completed. We should check - if there's more */ - nc = (khui_new_creds *) m->vparam; - - if(!khm_cred_dispatch_process_level(nc)) { - - if(kherr_is_error()) { - khui_alert * alert; - kherr_event * evt; - kherr_context * ctx; - wchar_t ws_tfmt[512]; - wchar_t w_idname[KCDB_IDENT_MAXCCH_NAME]; - wchar_t ws_title[ARRAYLENGTH(ws_tfmt) + KCDB_IDENT_MAXCCH_NAME]; - khm_size cb; - - ctx = kherr_peek_context(); - evt = kherr_get_err_event(ctx); - kherr_evaluate_event(evt); - - khui_alert_create_empty(&alert); - - if (nc->subtype == KMSG_CRED_PASSWORD) - LoadString(khm_hInstance, IDS_NC_PWD_FAILED_TITLE, - ws_tfmt, ARRAYLENGTH(ws_tfmt)); - else if (nc->subtype == KMSG_CRED_RENEW_CREDS) - LoadString(khm_hInstance, IDS_NC_REN_FAILED_TITLE, - ws_tfmt, ARRAYLENGTH(ws_tfmt)); - else - LoadString(khm_hInstance, IDS_NC_FAILED_TITLE, - ws_tfmt, ARRAYLENGTH(ws_tfmt)); - - if (nc->n_identities > 0) { - cb = sizeof(w_idname); - if (KHM_FAILED(kcdb_identity_get_name(nc->identities[0], - w_idname, &cb))) - StringCbCopy(w_idname, sizeof(w_idname), L"(?)"); - } else { - StringCbCopy(w_idname, sizeof(w_idname), L"(?)"); - } - - StringCbPrintf(ws_title, sizeof(ws_title), ws_tfmt, w_idname); - - khui_alert_set_title(alert, ws_title); - khui_alert_set_severity(alert, evt->severity); - if(!evt->long_desc) - khui_alert_set_message(alert, evt->short_desc); - else - khui_alert_set_message(alert, evt->long_desc); - if(evt->suggestion) - khui_alert_set_suggestion(alert, evt->suggestion); - - khui_alert_show(alert); - khui_alert_release(alert); - - kherr_release_context(ctx); - - kherr_clear_error(); - } - - if (nc->subtype == KMSG_CRED_RENEW_CREDS) { - kmq_post_message(KMSG_CRED, KMSG_CRED_END, 0, - m->vparam); - } else { - PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_PROCESS_COMPLETE), - 0); - } - } - break; - - case KMSG_CRED_END: - /* all is done. */ - { - khui_new_creds * nc; - - nc = (khui_new_creds *) m->vparam; - - if (nc->subtype == KMSG_CRED_NEW_CREDS || - nc->subtype == KMSG_CRED_PASSWORD) { - - /* - if (nc->subtype == KMSG_CRED_NEW_CREDS) - khui_context_reset(); - */ - - khm_cred_end_dialog(nc); - } - - khui_cw_destroy_cred_blob(nc); - - kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, 0); - - kmq_post_message(KMSG_ACT, KMSG_ACT_CONTINUE_CMDLINE, 0, 0); - } - break; - - /* property sheet stuff */ - - case KMSG_CRED_PP_BEGIN: - /* all the pages should have been added by now. Just send out - the precreate message */ - kmq_post_message(KMSG_CRED, KMSG_CRED_PP_PRECREATE, 0, - m->vparam); - break; - - case KMSG_CRED_PP_END: - kmq_post_message(KMSG_CRED, KMSG_CRED_PP_DESTROY, 0, - m->vparam); - break; - - case KMSG_CRED_DESTROY_CREDS: -#ifdef DEBUG - assert(m->vparam != NULL); -#endif - khui_context_release((khui_action_context *) m->vparam); - PFREE(m->vparam); - - kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, 0); - - kmq_post_message(KMSG_ACT, KMSG_ACT_CONTINUE_CMDLINE, 0, 0); - break; - - case KMSG_CRED_IMPORT: - kmq_post_message(KMSG_ACT, KMSG_ACT_CONTINUE_CMDLINE, 0, 0); - break; - - case KMSG_CRED_REFRESH: - kcdb_identity_refresh_all(); - break; - } -} - -void khm_cred_import(void) -{ - _begin_task(KHERR_CF_TRANSITIVE); - _report_sr0(KHERR_NONE, IDS_CTX_IMPORT); - _describe(); - - kmq_post_message(KMSG_CRED, KMSG_CRED_IMPORT, 0, 0); - - _end_task(); -} - -void khm_cred_set_default(void) -{ - khui_action_context ctx; - khm_int32 rv; - - khui_context_get(&ctx); - - if (ctx.identity) { - rv = kcdb_identity_set_default(ctx.identity); - } - - khui_context_release(&ctx); -} - -void khm_cred_destroy_creds(khm_boolean sync, khm_boolean quiet) -{ - khui_action_context * pctx; - - pctx = PMALLOC(sizeof(*pctx)); -#ifdef DEBUG - assert(pctx); -#endif - - khui_context_get(pctx); - - if(pctx->scope == KHUI_SCOPE_NONE && !quiet) { - /* this really shouldn't be necessary once we start enabling - and disbling actions based on context */ - wchar_t title[256]; - wchar_t message[256]; - - LoadString(khm_hInstance, - IDS_ALERT_NOSEL_TITLE, - title, - ARRAYLENGTH(title)); - - LoadString(khm_hInstance, - IDS_ALERT_NOSEL, - message, - ARRAYLENGTH(message)); - - khui_alert_show_simple(title, - message, - KHERR_WARNING); - - khui_context_release(pctx); - PFREE(pctx); - - return; - } - - _begin_task(KHERR_CF_TRANSITIVE); - _report_sr0(KHERR_NONE, IDS_CTX_DESTROY_CREDS); - _describe(); - - if (sync) - kmq_send_message(KMSG_CRED, - KMSG_CRED_DESTROY_CREDS, - 0, - (void *) pctx); - else - kmq_post_message(KMSG_CRED, - KMSG_CRED_DESTROY_CREDS, - 0, - (void *) pctx); - - _end_task(); -} - -void khm_cred_renew_identity(khm_handle identity) -{ - khui_new_creds * c; - - khui_cw_create_cred_blob(&c); - - c->subtype = KMSG_CRED_RENEW_CREDS; - c->result = KHUI_NC_RESULT_PROCESS; - khui_context_create(&c->ctx, - KHUI_SCOPE_IDENT, - identity, - KCDB_CREDTYPE_INVALID, - NULL); - - _begin_task(KHERR_CF_TRANSITIVE); - _report_sr0(KHERR_NONE, IDS_CTX_RENEW_CREDS); - _describe(); - - kmq_post_message(KMSG_CRED, KMSG_CRED_RENEW_CREDS, 0, (void *) c); - - _end_task(); -} - -void khm_cred_renew_cred(khm_handle cred) -{ - khui_new_creds * c; - - khui_cw_create_cred_blob(&c); - - c->subtype = KMSG_CRED_RENEW_CREDS; - c->result = KHUI_NC_RESULT_PROCESS; - khui_context_create(&c->ctx, - KHUI_SCOPE_CRED, - NULL, - KCDB_CREDTYPE_INVALID, - cred); - - _begin_task(KHERR_CF_TRANSITIVE); - _report_sr0(KHERR_NONE, IDS_CTX_RENEW_CREDS); - _describe(); - - kmq_post_message(KMSG_CRED, KMSG_CRED_RENEW_CREDS, 0, (void *) c); - - _end_task(); -} - -void khm_cred_renew_creds(void) -{ - khui_new_creds * c; - - khui_cw_create_cred_blob(&c); - c->subtype = KMSG_CRED_RENEW_CREDS; - c->result = KHUI_NC_RESULT_PROCESS; - khui_context_get(&c->ctx); - - _begin_task(KHERR_CF_TRANSITIVE); - _report_sr0(KHERR_NONE, IDS_CTX_RENEW_CREDS); - _describe(); - - kmq_post_message(KMSG_CRED, KMSG_CRED_RENEW_CREDS, 0, (void *) c); - - _end_task(); -} - -void khm_cred_change_password(wchar_t * title) -{ - khui_new_creds * nc; - LPNETID_DLGINFO pdlginfo; - khm_size cb; - - if (!khm_cred_begin_dialog()) - return; - - khui_cw_create_cred_blob(&nc); - nc->subtype = KMSG_CRED_PASSWORD; - - khui_context_get(&nc->ctx); - - kcdb_identpro_get_ui_cb((void *) &nc->ident_cb); - - assert(nc->ident_cb); - - if (title) { - - if (SUCCEEDED(StringCbLength(title, KHUI_MAXCB_TITLE, &cb))) { - cb += sizeof(wchar_t); - - nc->window_title = PMALLOC(cb); -#ifdef DEBUG - assert(nc->window_title); -#endif - StringCbCopy(nc->window_title, cb, title); - } - } else if (nc->ctx.cb_vparam == sizeof(NETID_DLGINFO) && - (pdlginfo = nc->ctx.vparam) && - pdlginfo->size == NETID_DLGINFO_V1_SZ && - pdlginfo->in.title[0] && - SUCCEEDED(StringCchLength(pdlginfo->in.title, - NETID_TITLE_SZ, - &cb))) { - - cb = (cb + 1) * sizeof(wchar_t); - nc->window_title = PMALLOC(cb); -#ifdef DEBUG - assert(nc->window_title); -#endif - StringCbCopy(nc->window_title, cb, pdlginfo->in.title); - } - - khm_create_newcredwnd(khm_hwnd_main, nc); - - if (nc->hwnd != NULL) { - _begin_task(KHERR_CF_TRANSITIVE); - _report_sr0(KHERR_NONE, IDS_CTX_PASSWORD); - _describe(); - - kmq_post_message(KMSG_CRED, KMSG_CRED_PASSWORD, 0, - (void *) nc); - - _end_task(); - } else { - khui_cw_destroy_cred_blob(nc); - } -} - -void khm_cred_obtain_new_creds(wchar_t * title) -{ - khui_new_creds * nc; - LPNETID_DLGINFO pdlginfo; - khm_size cb; - - if (!khm_cred_begin_dialog()) - return; - - khui_cw_create_cred_blob(&nc); - nc->subtype = KMSG_CRED_NEW_CREDS; - - khui_context_get(&nc->ctx); - - kcdb_identpro_get_ui_cb((void *) &nc->ident_cb); - - if (nc->ident_cb == NULL) { - wchar_t title[256]; - wchar_t msg[512]; - wchar_t suggestion[512]; - khui_alert * a; - - LoadString(khm_hInstance, IDS_ERR_TITLE_NO_IDENTPRO, - title, ARRAYLENGTH(title)); - LoadString(khm_hInstance, IDS_ERR_MSG_NO_IDENTPRO, - msg, ARRAYLENGTH(msg)); - LoadString(khm_hInstance, IDS_ERR_SUGG_NO_IDENTPRO, - suggestion, ARRAYLENGTH(suggestion)); - - khui_alert_create_simple(title, - msg, - KHERR_ERROR, - &a); - khui_alert_set_suggestion(a, suggestion); - - khui_alert_show(a); - - khui_alert_release(a); - - khui_context_release(&nc->ctx); - nc->result = KHUI_NC_RESULT_CANCEL; - khm_cred_end_dialog(nc); - khui_cw_destroy_cred_blob(nc); - return; - } - - if (title) { - if (SUCCEEDED(StringCbLength(title, KHUI_MAXCB_TITLE, &cb))) { - cb += sizeof(wchar_t); - - nc->window_title = PMALLOC(cb); -#ifdef DEBUG - assert(nc->window_title); -#endif - StringCbCopy(nc->window_title, cb, title); - } - } else if (nc->ctx.cb_vparam == sizeof(NETID_DLGINFO) && - (pdlginfo = nc->ctx.vparam) && - pdlginfo->size == NETID_DLGINFO_V1_SZ && - pdlginfo->in.title[0] && - SUCCEEDED(StringCchLength(pdlginfo->in.title, - NETID_TITLE_SZ, - &cb))) { - - cb = (cb + 1) * sizeof(wchar_t); - nc->window_title = PMALLOC(cb); -#ifdef DEBUG - assert(nc->window_title); -#endif - StringCbCopy(nc->window_title, cb, pdlginfo->in.title); - } - - khm_create_newcredwnd(khm_hwnd_main, nc); - - if (nc->hwnd != NULL) { - _begin_task(KHERR_CF_TRANSITIVE); - _report_sr0(KHERR_NONE, IDS_CTX_NEW_CREDS); - _describe(); - - kmq_post_message(KMSG_CRED, KMSG_CRED_NEW_CREDS, 0, - (void *) nc); - - _end_task(); - } else { - khui_context_release(&nc->ctx); - nc->result = KHUI_NC_RESULT_CANCEL; - khm_cred_end_dialog(nc); - khui_cw_destroy_cred_blob(nc); - } -} - -/* this is called by khm_cred_dispatch_process_message and the - kmsg_cred_completion to initiate and continue checked broadcasts of - KMSG_CRED_DIALOG_PROCESS messages. - - Returns TRUE if more KMSG_CRED_DIALOG_PROCESS messages were - posted. */ -BOOL khm_cred_dispatch_process_level(khui_new_creds *nc) -{ - khm_size i,j; - khm_handle subs[KHUI_MAX_NCTYPES]; - int n_subs = 0; - BOOL cont = FALSE; - khui_new_creds_by_type *t, *d; - - /* at each level, we dispatch a wave of notifications to plug-ins - who's dependencies are all satisfied */ - EnterCriticalSection(&nc->cs); - - /* if any types have already completed, we mark them are processed - and skip them */ - for (i=0; i < nc->n_types; i++) { - t = nc->types[i]; - if(t->flags & KHUI_NC_RESPONSE_COMPLETED) - t->flags |= KHUI_NCT_FLAG_PROCESSED; - } - - for(i=0; in_types; i++) { - t = nc->types[i]; - - if((t->flags & KHUI_NCT_FLAG_PROCESSED) || - (t->flags & KHUI_NC_RESPONSE_COMPLETED)) - continue; - - for(j=0; jn_type_deps; j++) { - if(KHM_FAILED(khui_cw_find_type(nc, t->type_deps[j], &d))) - break; - - if(!(d->flags & KHUI_NC_RESPONSE_COMPLETED)) - break; - } - - if(jn_type_deps) /* there are unmet dependencies */ - continue; - - /* all dependencies for this type have been met. */ - subs[n_subs++] = kcdb_credtype_get_sub(t->type); - t->flags |= KHUI_NCT_FLAG_PROCESSED; - cont = TRUE; - } - - LeaveCriticalSection(&nc->cs); - - /* the reason why we are posting messages in batches is because - when the message has completed we know that all the types that - have the KHUI_NCT_FLAG_PROCESSED set have completed processing. - Otherwise we have to individually track each message and update - the type */ - if(n_subs > 0) - kmq_post_subs_msg(subs, n_subs, KMSG_CRED, KMSG_CRED_PROCESS, 0, - (void *) nc); - - return cont; -} - -void -khm_cred_dispatch_process_message(khui_new_creds *nc) -{ - khm_size i; - BOOL pending; - wchar_t wsinsert[512]; - khm_size cbsize; - - /* see if there's anything to do. We can check this without - obtaining a lock */ - if(nc->n_types == 0 || - (nc->subtype == KMSG_CRED_NEW_CREDS && - nc->n_identities == 0) || - (nc->subtype == KMSG_CRED_PASSWORD && - nc->n_identities == 0)) - goto _terminate_job; - - /* check dependencies and stuff first */ - EnterCriticalSection(&nc->cs); - for(i=0; in_types; i++) { - nc->types[i]->flags &= ~ KHUI_NCT_FLAG_PROCESSED; - } - LeaveCriticalSection(&nc->cs); - - /* Consindering all that can go wrong here and the desire to - handle errors here separately from others, we create a new task - for the purpose of tracking the credentials acquisition - process. */ - _begin_task(KHERR_CF_TRANSITIVE); - - /* Describe the context */ - if(nc->subtype == KMSG_CRED_NEW_CREDS) { - cbsize = sizeof(wsinsert); - kcdb_identity_get_name(nc->identities[0], wsinsert, &cbsize); - - _report_sr1(KHERR_NONE, IDS_CTX_PROC_NEW_CREDS, - _cstr(wsinsert)); - _resolve(); - } else if (nc->subtype == KMSG_CRED_RENEW_CREDS) { - cbsize = sizeof(wsinsert); - - if (nc->ctx.scope == KHUI_SCOPE_IDENT) - kcdb_identity_get_name(nc->ctx.identity, wsinsert, &cbsize); - else if (nc->ctx.scope == KHUI_SCOPE_CREDTYPE) { - if (nc->ctx.identity != NULL) - kcdb_identity_get_name(nc->ctx.identity, wsinsert, - &cbsize); - else - kcdb_credtype_get_name(nc->ctx.cred_type, wsinsert, - &cbsize); - } else if (nc->ctx.scope == KHUI_SCOPE_CRED) { - kcdb_cred_get_name(nc->ctx.cred, wsinsert, &cbsize); - } else { - StringCbCopy(wsinsert, sizeof(wsinsert), L"(?)"); - } - - _report_sr1(KHERR_NONE, IDS_CTX_PROC_RENEW_CREDS, - _cstr(wsinsert)); - _resolve(); - } else if (nc->subtype == KMSG_CRED_PASSWORD) { - cbsize = sizeof(wsinsert); - kcdb_identity_get_name(nc->identities[0], wsinsert, &cbsize); - - _report_sr1(KHERR_NONE, IDS_CTX_PROC_PASSWORD, - _cstr(wsinsert)); - _resolve(); - } else { - assert(FALSE); - } - - _describe(); - - pending = khm_cred_dispatch_process_level(nc); - - _end_task(); - - if(!pending) - goto _terminate_job; - - return; - - _terminate_job: - if (nc->subtype == KMSG_CRED_RENEW_CREDS) - kmq_post_message(KMSG_CRED, KMSG_CRED_END, 0, (void *) nc); - else - PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, - MAKEWPARAM(0, WMNC_DIALOG_PROCESS_COMPLETE), 0); -} - -void -khm_cred_process_startup_actions(void) { - khm_handle defident = NULL; - - if (!khm_startup.processing) - return; - - if (khm_startup.init || - khm_startup.renew || - khm_startup.destroy || - khm_startup.autoinit) { - kcdb_identity_get_default(&defident); - } - - /* For asynchronous actions, we trigger the action and then exit - the loop. Once the action completes, the completion handler - will trigger a continuation message which will result in this - function getting called again. Then we can proceed with the - rest of the startup actions. */ - do { - if (khm_startup.init) { - if (defident) - khui_context_set(KHUI_SCOPE_IDENT, - defident, - KCDB_CREDTYPE_INVALID, - NULL, NULL, 0, - NULL); - else - khui_context_reset(); - - khm_cred_obtain_new_creds(NULL); - khm_startup.init = FALSE; - break; - } - - if (khm_startup.import) { - khm_cred_import(); - khm_startup.import = FALSE; - break; - } - - if (khm_startup.renew) { - khm_size count; - - kcdb_credset_get_size(NULL, &count); - - /* if there are no credentials, we just skip over the - renew action. */ - - khm_startup.renew = FALSE; - - if (count != 0) { - if (defident) - khui_context_set(KHUI_SCOPE_IDENT, - defident, - KCDB_CREDTYPE_INVALID, - NULL, NULL, 0, - NULL); - else - khui_context_reset(); - - khm_cred_renew_creds(); - break; - } - } - - if (khm_startup.destroy) { - - khm_startup.destroy = FALSE; - - if (defident) { - khui_context_set(KHUI_SCOPE_IDENT, - defident, - KCDB_CREDTYPE_INVALID, - NULL, NULL, 0, - NULL); - - khm_cred_destroy_creds(FALSE, FALSE); - break; - } - } - - if (khm_startup.autoinit) { - khm_size count; - - khm_startup.autoinit = FALSE; - - kcdb_credset_get_size(NULL, &count); - - if (count == 0) { - if (defident) - khui_context_set(KHUI_SCOPE_IDENT, - defident, - KCDB_CREDTYPE_INVALID, - NULL, NULL, 0, - NULL); - else - khui_context_reset(); - - khm_cred_obtain_new_creds(NULL); - break; - } - } - - if (khm_startup.exit) { - PostMessage(khm_hwnd_main, - WM_COMMAND, - MAKEWPARAM(KHUI_ACTION_EXIT, 0), 0); - khm_startup.exit = FALSE; - break; - } - - /* when we get here, then we are all done with the command - line stuff */ - khm_startup.processing = FALSE; - } while(FALSE); - - if (defident) - kcdb_identity_release(defident); -} - -void -khm_cred_begin_startup_actions(void) { - khm_handle csp_cw; - - if (khm_startup.seen) - return; - - if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", 0, &csp_cw))) { - khm_int32 t = 0; - - khc_read_int32(csp_cw, L"Autoinit", &t); - if (t) - khm_startup.autoinit = TRUE; - - t = 0; - khc_read_int32(csp_cw, L"AutoImport", &t); - if (t) - khm_startup.import = TRUE; - - khc_close_space(csp_cw); - - } - - khm_startup.seen = TRUE; - khm_startup.processing = TRUE; - - khm_cred_process_startup_actions(); -} - -void -khm_cred_refresh(void) { - kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, NULL); -} - -void -khm_cred_addr_change(void) { - khm_handle csp_cw = NULL; - khm_int32 check_net = 0; - - wchar_t * ids = NULL; - wchar_t * t; - khm_size cb; - khm_size n_idents; - - FILETIME ft_now; - FILETIME ft_exp; - FILETIME ft_issue; - - if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", - 0, &csp_cw))) { - khc_read_int32(csp_cw, L"AutoDetectNet", &check_net); - - khc_close_space(csp_cw); - } - - if (!check_net) - return; - - while(TRUE) { - if (ids) - PFREE(ids); - ids = NULL; - - if (kcdb_identity_enum(KCDB_IDENT_FLAG_VALID | - KCDB_IDENT_FLAG_RENEWABLE, - KCDB_IDENT_FLAG_VALID | - KCDB_IDENT_FLAG_RENEWABLE, - NULL, - &cb, - &n_idents) != KHM_ERROR_TOO_LONG) - break; - - ids = PMALLOC(cb); - - if (KHM_SUCCEEDED - (kcdb_identity_enum(KCDB_IDENT_FLAG_VALID | - KCDB_IDENT_FLAG_RENEWABLE, - KCDB_IDENT_FLAG_VALID | - KCDB_IDENT_FLAG_RENEWABLE, - ids, - &cb, - &n_idents))) - break; - } - - if (!ids) - return; - - GetSystemTimeAsFileTime(&ft_now); - - for (t=ids; t && *t; t = multi_string_next(t)) { - khm_handle ident; - - - if (KHM_FAILED - (kcdb_identity_create(t, 0, &ident))) - continue; - - cb = sizeof(ft_issue); - - if (KHM_SUCCEEDED - (kcdb_identity_get_attr(ident, KCDB_ATTR_ISSUE, NULL, - &ft_issue, &cb)) && - - (cb = sizeof(ft_exp)) && - KHM_SUCCEEDED - (kcdb_identity_get_attr(ident, KCDB_ATTR_EXPIRE, NULL, - &ft_exp, &cb)) && - - CompareFileTime(&ft_now, &ft_exp) < 0) { - - khm_int64 i_issue; - khm_int64 i_exp; - khm_int64 i_now; - - i_issue = FtToInt(&ft_issue); - i_exp = FtToInt(&ft_exp); - i_now = FtToInt(&ft_now); - - if (i_now > (i_issue + i_exp) / 2) { - - khm_cred_renew_identity(ident); - - } - } - - kcdb_identity_release(ident); - } -} +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#include +#include + +static BOOL in_dialog = FALSE; +static CRITICAL_SECTION cs_dialog; +static HANDLE in_dialog_evt = NULL; +static LONG init_dialog = 0; +static khm_int32 dialog_result = 0; +static wchar_t dialog_identity[KCDB_IDENT_MAXCCH_NAME]; + +static void +dialog_sync_init(void) { + if (InterlockedIncrement(&init_dialog) == 1) { +#ifdef DEBUG + assert(in_dialog_evt == NULL); + assert(in_dialog == FALSE); +#endif + + InitializeCriticalSection(&cs_dialog); + + in_dialog_evt = CreateEvent(NULL, + TRUE, + TRUE, + L"DialogCompletionEvent"); + } else { + InterlockedDecrement(&init_dialog); + if (in_dialog_evt == NULL) { + Sleep(100); + } + } +} + +BOOL +khm_cred_begin_dialog(void) { + BOOL rv; + + dialog_sync_init(); + + EnterCriticalSection(&cs_dialog); + + if (in_dialog) + rv = FALSE; + else { + rv = TRUE; + in_dialog = TRUE; + ResetEvent(in_dialog_evt); + } + + LeaveCriticalSection(&cs_dialog); + return rv; +} + +void +khm_cred_end_dialog(khui_new_creds * nc) { + dialog_sync_init(); + + EnterCriticalSection(&cs_dialog); + if (in_dialog) { + in_dialog = FALSE; + SetEvent(in_dialog_evt); + } + dialog_result = nc->result; + if (nc->subtype == KMSG_CRED_NEW_CREDS && + nc->n_identities > 0 && + nc->identities[0]) { + khm_size cb; + + cb = sizeof(dialog_identity); + if (KHM_FAILED(kcdb_identity_get_name(nc->identities[0], + dialog_identity, + &cb))) + dialog_identity[0] = 0; + } else { + dialog_identity[0] = 0; + } + LeaveCriticalSection(&cs_dialog); +} + +BOOL +khm_cred_is_in_dialog(void) { + BOOL rv; + + dialog_sync_init(); + + EnterCriticalSection(&cs_dialog); + rv = in_dialog; + LeaveCriticalSection(&cs_dialog); + + return rv; +} + +khm_int32 +khm_cred_wait_for_dialog(DWORD timeout, khm_int32 * result, + wchar_t * ident, khm_size cb_ident) { + khm_int32 rv; + + dialog_sync_init(); + + EnterCriticalSection(&cs_dialog); + if (!in_dialog) + rv = KHM_ERROR_NOT_FOUND; + else { + DWORD dw; + + do { + LeaveCriticalSection(&cs_dialog); + + dw = WaitForSingleObject(in_dialog_evt, timeout); + + EnterCriticalSection(&cs_dialog); + + if (!in_dialog) { + rv = KHM_ERROR_SUCCESS; + if (result) { + *result = dialog_result; + } + if (ident) { + StringCbCopy(ident, cb_ident, dialog_identity); + } + break; + } else if(dw == WAIT_TIMEOUT) { + rv = KHM_ERROR_TIMEOUT; + break; + } + } while(TRUE); + } + LeaveCriticalSection(&cs_dialog); + + return rv; +} + +/* completion handler for KMSG_CRED messages */ +void KHMAPI +kmsg_cred_completion(kmq_message *m) +{ + khui_new_creds * nc; + +#ifdef DEBUG + assert(m->type == KMSG_CRED); +#else + if(m->type != KMSG_CRED) + return; /* huh? */ +#endif + + switch(m->subtype) { + case KMSG_CRED_PASSWORD: + /* fallthrough */ + case KMSG_CRED_NEW_CREDS: + /* Cred types have attached themselves. Trigger the next + phase. */ + kmq_post_message(KMSG_CRED, KMSG_CRED_DIALOG_SETUP, 0, + m->vparam); + break; + + case KMSG_CRED_RENEW_CREDS: + nc = (khui_new_creds *) m->vparam; + + /* khm_cred_dispatch_process_message() deals with the case + where there are not credential types that wants to + participate in this operation. */ + khm_cred_dispatch_process_message(nc); + break; + + case KMSG_CRED_DIALOG_SETUP: + nc = (khui_new_creds *) m->vparam; + + khm_prep_newcredwnd(nc->hwnd); + + /* all the controls have been created. Now initialize them */ + if (nc->n_types > 0) { + kmq_post_subs_msg(nc->type_subs, + nc->n_types, + KMSG_CRED, + KMSG_CRED_DIALOG_PRESTART, + 0, + m->vparam); + } else { + PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_PROCESS_COMPLETE), 0); + } + break; + + case KMSG_CRED_DIALOG_PRESTART: + /* all prestart stuff is done. Now to activate the dialog */ + nc = (khui_new_creds *) m->vparam; + khm_show_newcredwnd(nc->hwnd); + + kmq_post_subs_msg(nc->type_subs, + nc->n_types, + KMSG_CRED, + KMSG_CRED_DIALOG_START, + 0, + m->vparam); + /* at this point, the dialog window takes over. We let it run + the show until KMSG_CRED_DIALOG_END is posted by the dialog + procedure. */ + break; + + case KMSG_CRED_PROCESS: + /* a wave of these messages have completed. We should check + if there's more */ + nc = (khui_new_creds *) m->vparam; + + if(!khm_cred_dispatch_process_level(nc)) { + + if(kherr_is_error()) { + khui_alert * alert; + kherr_event * evt; + kherr_context * ctx; + wchar_t ws_tfmt[512]; + wchar_t w_idname[KCDB_IDENT_MAXCCH_NAME]; + wchar_t ws_title[ARRAYLENGTH(ws_tfmt) + KCDB_IDENT_MAXCCH_NAME]; + khm_size cb; + + ctx = kherr_peek_context(); + evt = kherr_get_err_event(ctx); + kherr_evaluate_event(evt); + + khui_alert_create_empty(&alert); + + if (nc->subtype == KMSG_CRED_PASSWORD) + LoadString(khm_hInstance, IDS_NC_PWD_FAILED_TITLE, + ws_tfmt, ARRAYLENGTH(ws_tfmt)); + else if (nc->subtype == KMSG_CRED_RENEW_CREDS) + LoadString(khm_hInstance, IDS_NC_REN_FAILED_TITLE, + ws_tfmt, ARRAYLENGTH(ws_tfmt)); + else + LoadString(khm_hInstance, IDS_NC_FAILED_TITLE, + ws_tfmt, ARRAYLENGTH(ws_tfmt)); + + if (nc->n_identities > 0) { + cb = sizeof(w_idname); + if (KHM_FAILED(kcdb_identity_get_name(nc->identities[0], + w_idname, &cb))) + StringCbCopy(w_idname, sizeof(w_idname), L"(?)"); + } else { + StringCbCopy(w_idname, sizeof(w_idname), L"(?)"); + } + + StringCbPrintf(ws_title, sizeof(ws_title), ws_tfmt, w_idname); + + khui_alert_set_title(alert, ws_title); + khui_alert_set_severity(alert, evt->severity); + if(!evt->long_desc) + khui_alert_set_message(alert, evt->short_desc); + else + khui_alert_set_message(alert, evt->long_desc); + if(evt->suggestion) + khui_alert_set_suggestion(alert, evt->suggestion); + + khui_alert_show(alert); + khui_alert_release(alert); + + kherr_release_context(ctx); + + kherr_clear_error(); + } + + if (nc->subtype == KMSG_CRED_RENEW_CREDS) { + kmq_post_message(KMSG_CRED, KMSG_CRED_END, 0, + m->vparam); + } else { + PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_PROCESS_COMPLETE), + 0); + } + } + break; + + case KMSG_CRED_END: + /* all is done. */ + { + khui_new_creds * nc; + + nc = (khui_new_creds *) m->vparam; + + if (nc->subtype == KMSG_CRED_NEW_CREDS || + nc->subtype == KMSG_CRED_PASSWORD) { + + /* + if (nc->subtype == KMSG_CRED_NEW_CREDS) + khui_context_reset(); + */ + + khm_cred_end_dialog(nc); + } + + khui_cw_destroy_cred_blob(nc); + + kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, 0); + + kmq_post_message(KMSG_ACT, KMSG_ACT_CONTINUE_CMDLINE, 0, 0); + } + break; + + /* property sheet stuff */ + + case KMSG_CRED_PP_BEGIN: + /* all the pages should have been added by now. Just send out + the precreate message */ + kmq_post_message(KMSG_CRED, KMSG_CRED_PP_PRECREATE, 0, + m->vparam); + break; + + case KMSG_CRED_PP_END: + kmq_post_message(KMSG_CRED, KMSG_CRED_PP_DESTROY, 0, + m->vparam); + break; + + case KMSG_CRED_DESTROY_CREDS: +#ifdef DEBUG + assert(m->vparam != NULL); +#endif + khui_context_release((khui_action_context *) m->vparam); + PFREE(m->vparam); + + kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, 0); + + kmq_post_message(KMSG_ACT, KMSG_ACT_CONTINUE_CMDLINE, 0, 0); + break; + + case KMSG_CRED_IMPORT: + kmq_post_message(KMSG_ACT, KMSG_ACT_CONTINUE_CMDLINE, 0, 0); + break; + + case KMSG_CRED_REFRESH: + kcdb_identity_refresh_all(); + break; + } +} + +void khm_cred_import(void) +{ + _begin_task(KHERR_CF_TRANSITIVE); + _report_sr0(KHERR_NONE, IDS_CTX_IMPORT); + _describe(); + + kmq_post_message(KMSG_CRED, KMSG_CRED_IMPORT, 0, 0); + + _end_task(); +} + +void khm_cred_set_default(void) +{ + khui_action_context ctx; + khm_int32 rv; + + khui_context_get(&ctx); + + if (ctx.identity) { + rv = kcdb_identity_set_default(ctx.identity); + } + + khui_context_release(&ctx); +} + +void khm_cred_destroy_creds(khm_boolean sync, khm_boolean quiet) +{ + khui_action_context * pctx; + + pctx = PMALLOC(sizeof(*pctx)); +#ifdef DEBUG + assert(pctx); +#endif + + khui_context_get(pctx); + + if(pctx->scope == KHUI_SCOPE_NONE && !quiet) { + /* this really shouldn't be necessary once we start enabling + and disbling actions based on context */ + wchar_t title[256]; + wchar_t message[256]; + + LoadString(khm_hInstance, + IDS_ALERT_NOSEL_TITLE, + title, + ARRAYLENGTH(title)); + + LoadString(khm_hInstance, + IDS_ALERT_NOSEL, + message, + ARRAYLENGTH(message)); + + khui_alert_show_simple(title, + message, + KHERR_WARNING); + + khui_context_release(pctx); + PFREE(pctx); + + return; + } + + _begin_task(KHERR_CF_TRANSITIVE); + _report_sr0(KHERR_NONE, IDS_CTX_DESTROY_CREDS); + _describe(); + + if (sync) + kmq_send_message(KMSG_CRED, + KMSG_CRED_DESTROY_CREDS, + 0, + (void *) pctx); + else + kmq_post_message(KMSG_CRED, + KMSG_CRED_DESTROY_CREDS, + 0, + (void *) pctx); + + _end_task(); +} + +void khm_cred_renew_identity(khm_handle identity) +{ + khui_new_creds * c; + + khui_cw_create_cred_blob(&c); + + c->subtype = KMSG_CRED_RENEW_CREDS; + c->result = KHUI_NC_RESULT_PROCESS; + khui_context_create(&c->ctx, + KHUI_SCOPE_IDENT, + identity, + KCDB_CREDTYPE_INVALID, + NULL); + + _begin_task(KHERR_CF_TRANSITIVE); + _report_sr0(KHERR_NONE, IDS_CTX_RENEW_CREDS); + _describe(); + + kmq_post_message(KMSG_CRED, KMSG_CRED_RENEW_CREDS, 0, (void *) c); + + _end_task(); +} + +void khm_cred_renew_cred(khm_handle cred) +{ + khui_new_creds * c; + + khui_cw_create_cred_blob(&c); + + c->subtype = KMSG_CRED_RENEW_CREDS; + c->result = KHUI_NC_RESULT_PROCESS; + khui_context_create(&c->ctx, + KHUI_SCOPE_CRED, + NULL, + KCDB_CREDTYPE_INVALID, + cred); + + _begin_task(KHERR_CF_TRANSITIVE); + _report_sr0(KHERR_NONE, IDS_CTX_RENEW_CREDS); + _describe(); + + kmq_post_message(KMSG_CRED, KMSG_CRED_RENEW_CREDS, 0, (void *) c); + + _end_task(); +} + +void khm_cred_renew_creds(void) +{ + khui_new_creds * c; + + khui_cw_create_cred_blob(&c); + c->subtype = KMSG_CRED_RENEW_CREDS; + c->result = KHUI_NC_RESULT_PROCESS; + khui_context_get(&c->ctx); + + _begin_task(KHERR_CF_TRANSITIVE); + _report_sr0(KHERR_NONE, IDS_CTX_RENEW_CREDS); + _describe(); + + kmq_post_message(KMSG_CRED, KMSG_CRED_RENEW_CREDS, 0, (void *) c); + + _end_task(); +} + +void khm_cred_change_password(wchar_t * title) +{ + khui_new_creds * nc; + LPNETID_DLGINFO pdlginfo; + khm_size cb; + + if (!khm_cred_begin_dialog()) + return; + + khui_cw_create_cred_blob(&nc); + nc->subtype = KMSG_CRED_PASSWORD; + + khui_context_get(&nc->ctx); + + kcdb_identpro_get_ui_cb((void *) &nc->ident_cb); + + assert(nc->ident_cb); + + if (title) { + + if (SUCCEEDED(StringCbLength(title, KHUI_MAXCB_TITLE, &cb))) { + cb += sizeof(wchar_t); + + nc->window_title = PMALLOC(cb); +#ifdef DEBUG + assert(nc->window_title); +#endif + StringCbCopy(nc->window_title, cb, title); + } + } else if (nc->ctx.cb_vparam == sizeof(NETID_DLGINFO) && + (pdlginfo = nc->ctx.vparam) && + pdlginfo->size == NETID_DLGINFO_V1_SZ && + pdlginfo->in.title[0] && + SUCCEEDED(StringCchLength(pdlginfo->in.title, + NETID_TITLE_SZ, + &cb))) { + + cb = (cb + 1) * sizeof(wchar_t); + nc->window_title = PMALLOC(cb); +#ifdef DEBUG + assert(nc->window_title); +#endif + StringCbCopy(nc->window_title, cb, pdlginfo->in.title); + } + + khm_create_newcredwnd(khm_hwnd_main, nc); + + if (nc->hwnd != NULL) { + _begin_task(KHERR_CF_TRANSITIVE); + _report_sr0(KHERR_NONE, IDS_CTX_PASSWORD); + _describe(); + + kmq_post_message(KMSG_CRED, KMSG_CRED_PASSWORD, 0, + (void *) nc); + + _end_task(); + } else { + khui_cw_destroy_cred_blob(nc); + } +} + +void khm_cred_obtain_new_creds(wchar_t * title) +{ + khui_new_creds * nc; + LPNETID_DLGINFO pdlginfo; + khm_size cb; + + if (!khm_cred_begin_dialog()) + return; + + khui_cw_create_cred_blob(&nc); + nc->subtype = KMSG_CRED_NEW_CREDS; + + khui_context_get(&nc->ctx); + + kcdb_identpro_get_ui_cb((void *) &nc->ident_cb); + + if (nc->ident_cb == NULL) { + wchar_t title[256]; + wchar_t msg[512]; + wchar_t suggestion[512]; + khui_alert * a; + + LoadString(khm_hInstance, IDS_ERR_TITLE_NO_IDENTPRO, + title, ARRAYLENGTH(title)); + LoadString(khm_hInstance, IDS_ERR_MSG_NO_IDENTPRO, + msg, ARRAYLENGTH(msg)); + LoadString(khm_hInstance, IDS_ERR_SUGG_NO_IDENTPRO, + suggestion, ARRAYLENGTH(suggestion)); + + khui_alert_create_simple(title, + msg, + KHERR_ERROR, + &a); + khui_alert_set_suggestion(a, suggestion); + + khui_alert_show(a); + + khui_alert_release(a); + + khui_context_release(&nc->ctx); + nc->result = KHUI_NC_RESULT_CANCEL; + khm_cred_end_dialog(nc); + khui_cw_destroy_cred_blob(nc); + return; + } + + if (title) { + if (SUCCEEDED(StringCbLength(title, KHUI_MAXCB_TITLE, &cb))) { + cb += sizeof(wchar_t); + + nc->window_title = PMALLOC(cb); +#ifdef DEBUG + assert(nc->window_title); +#endif + StringCbCopy(nc->window_title, cb, title); + } + } else if (nc->ctx.cb_vparam == sizeof(NETID_DLGINFO) && + (pdlginfo = nc->ctx.vparam) && + pdlginfo->size == NETID_DLGINFO_V1_SZ && + pdlginfo->in.title[0] && + SUCCEEDED(StringCchLength(pdlginfo->in.title, + NETID_TITLE_SZ, + &cb))) { + + cb = (cb + 1) * sizeof(wchar_t); + nc->window_title = PMALLOC(cb); +#ifdef DEBUG + assert(nc->window_title); +#endif + StringCbCopy(nc->window_title, cb, pdlginfo->in.title); + } + + khm_create_newcredwnd(khm_hwnd_main, nc); + + if (nc->hwnd != NULL) { + _begin_task(KHERR_CF_TRANSITIVE); + _report_sr0(KHERR_NONE, IDS_CTX_NEW_CREDS); + _describe(); + + kmq_post_message(KMSG_CRED, KMSG_CRED_NEW_CREDS, 0, + (void *) nc); + + _end_task(); + } else { + khui_context_release(&nc->ctx); + nc->result = KHUI_NC_RESULT_CANCEL; + khm_cred_end_dialog(nc); + khui_cw_destroy_cred_blob(nc); + } +} + +/* this is called by khm_cred_dispatch_process_message and the + kmsg_cred_completion to initiate and continue checked broadcasts of + KMSG_CRED_DIALOG_PROCESS messages. + + Returns TRUE if more KMSG_CRED_DIALOG_PROCESS messages were + posted. */ +BOOL khm_cred_dispatch_process_level(khui_new_creds *nc) +{ + khm_size i,j; + khm_handle subs[KHUI_MAX_NCTYPES]; + int n_subs = 0; + BOOL cont = FALSE; + khui_new_creds_by_type *t, *d; + + /* at each level, we dispatch a wave of notifications to plug-ins + who's dependencies are all satisfied */ + EnterCriticalSection(&nc->cs); + + /* if any types have already completed, we mark them are processed + and skip them */ + for (i=0; i < nc->n_types; i++) { + t = nc->types[i]; + if(t->flags & KHUI_NC_RESPONSE_COMPLETED) + t->flags |= KHUI_NCT_FLAG_PROCESSED; + } + + for(i=0; in_types; i++) { + t = nc->types[i]; + + if((t->flags & KHUI_NCT_FLAG_PROCESSED) || + (t->flags & KHUI_NC_RESPONSE_COMPLETED)) + continue; + + for(j=0; jn_type_deps; j++) { + if(KHM_FAILED(khui_cw_find_type(nc, t->type_deps[j], &d))) + break; + + if(!(d->flags & KHUI_NC_RESPONSE_COMPLETED)) + break; + } + + if(jn_type_deps) /* there are unmet dependencies */ + continue; + + /* all dependencies for this type have been met. */ + subs[n_subs++] = kcdb_credtype_get_sub(t->type); + t->flags |= KHUI_NCT_FLAG_PROCESSED; + cont = TRUE; + } + + LeaveCriticalSection(&nc->cs); + + /* the reason why we are posting messages in batches is because + when the message has completed we know that all the types that + have the KHUI_NCT_FLAG_PROCESSED set have completed processing. + Otherwise we have to individually track each message and update + the type */ + if(n_subs > 0) + kmq_post_subs_msg(subs, n_subs, KMSG_CRED, KMSG_CRED_PROCESS, 0, + (void *) nc); + + return cont; +} + +void +khm_cred_dispatch_process_message(khui_new_creds *nc) +{ + khm_size i; + BOOL pending; + wchar_t wsinsert[512]; + khm_size cbsize; + + /* see if there's anything to do. We can check this without + obtaining a lock */ + if(nc->n_types == 0 || + (nc->subtype == KMSG_CRED_NEW_CREDS && + nc->n_identities == 0) || + (nc->subtype == KMSG_CRED_PASSWORD && + nc->n_identities == 0)) + goto _terminate_job; + + /* check dependencies and stuff first */ + EnterCriticalSection(&nc->cs); + for(i=0; in_types; i++) { + nc->types[i]->flags &= ~ KHUI_NCT_FLAG_PROCESSED; + } + LeaveCriticalSection(&nc->cs); + + /* Consindering all that can go wrong here and the desire to + handle errors here separately from others, we create a new task + for the purpose of tracking the credentials acquisition + process. */ + _begin_task(KHERR_CF_TRANSITIVE); + + /* Describe the context */ + if(nc->subtype == KMSG_CRED_NEW_CREDS) { + cbsize = sizeof(wsinsert); + kcdb_identity_get_name(nc->identities[0], wsinsert, &cbsize); + + _report_sr1(KHERR_NONE, IDS_CTX_PROC_NEW_CREDS, + _cstr(wsinsert)); + _resolve(); + } else if (nc->subtype == KMSG_CRED_RENEW_CREDS) { + cbsize = sizeof(wsinsert); + + if (nc->ctx.scope == KHUI_SCOPE_IDENT) + kcdb_identity_get_name(nc->ctx.identity, wsinsert, &cbsize); + else if (nc->ctx.scope == KHUI_SCOPE_CREDTYPE) { + if (nc->ctx.identity != NULL) + kcdb_identity_get_name(nc->ctx.identity, wsinsert, + &cbsize); + else + kcdb_credtype_get_name(nc->ctx.cred_type, wsinsert, + &cbsize); + } else if (nc->ctx.scope == KHUI_SCOPE_CRED) { + kcdb_cred_get_name(nc->ctx.cred, wsinsert, &cbsize); + } else { + StringCbCopy(wsinsert, sizeof(wsinsert), L"(?)"); + } + + _report_sr1(KHERR_NONE, IDS_CTX_PROC_RENEW_CREDS, + _cstr(wsinsert)); + _resolve(); + } else if (nc->subtype == KMSG_CRED_PASSWORD) { + cbsize = sizeof(wsinsert); + kcdb_identity_get_name(nc->identities[0], wsinsert, &cbsize); + + _report_sr1(KHERR_NONE, IDS_CTX_PROC_PASSWORD, + _cstr(wsinsert)); + _resolve(); + } else { + assert(FALSE); + } + + _describe(); + + pending = khm_cred_dispatch_process_level(nc); + + _end_task(); + + if(!pending) + goto _terminate_job; + + return; + + _terminate_job: + if (nc->subtype == KMSG_CRED_RENEW_CREDS) + kmq_post_message(KMSG_CRED, KMSG_CRED_END, 0, (void *) nc); + else + PostMessage(nc->hwnd, KHUI_WM_NC_NOTIFY, + MAKEWPARAM(0, WMNC_DIALOG_PROCESS_COMPLETE), 0); +} + +void +khm_cred_process_startup_actions(void) { + khm_handle defident = NULL; + + if (!khm_startup.processing) + return; + + if (khm_startup.init || + khm_startup.renew || + khm_startup.destroy || + khm_startup.autoinit) { + kcdb_identity_get_default(&defident); + } + + /* For asynchronous actions, we trigger the action and then exit + the loop. Once the action completes, the completion handler + will trigger a continuation message which will result in this + function getting called again. Then we can proceed with the + rest of the startup actions. */ + do { + if (khm_startup.init) { + if (defident) + khui_context_set(KHUI_SCOPE_IDENT, + defident, + KCDB_CREDTYPE_INVALID, + NULL, NULL, 0, + NULL); + else + khui_context_reset(); + + khm_cred_obtain_new_creds(NULL); + khm_startup.init = FALSE; + break; + } + + if (khm_startup.import) { + khm_cred_import(); + khm_startup.import = FALSE; + break; + } + + if (khm_startup.renew) { + khm_size count; + + kcdb_credset_get_size(NULL, &count); + + /* if there are no credentials, we just skip over the + renew action. */ + + khm_startup.renew = FALSE; + + if (count != 0) { + if (defident) + khui_context_set(KHUI_SCOPE_IDENT, + defident, + KCDB_CREDTYPE_INVALID, + NULL, NULL, 0, + NULL); + else + khui_context_reset(); + + khm_cred_renew_creds(); + break; + } + } + + if (khm_startup.destroy) { + + khm_startup.destroy = FALSE; + + if (defident) { + khui_context_set(KHUI_SCOPE_IDENT, + defident, + KCDB_CREDTYPE_INVALID, + NULL, NULL, 0, + NULL); + + khm_cred_destroy_creds(FALSE, FALSE); + break; + } + } + + if (khm_startup.autoinit) { + khm_size count; + + khm_startup.autoinit = FALSE; + + kcdb_credset_get_size(NULL, &count); + + if (count == 0) { + if (defident) + khui_context_set(KHUI_SCOPE_IDENT, + defident, + KCDB_CREDTYPE_INVALID, + NULL, NULL, 0, + NULL); + else + khui_context_reset(); + + khm_cred_obtain_new_creds(NULL); + break; + } + } + + if (khm_startup.exit) { + PostMessage(khm_hwnd_main, + WM_COMMAND, + MAKEWPARAM(KHUI_ACTION_EXIT, 0), 0); + khm_startup.exit = FALSE; + break; + } + + /* when we get here, then we are all done with the command + line stuff */ + khm_startup.processing = FALSE; + } while(FALSE); + + if (defident) + kcdb_identity_release(defident); +} + +void +khm_cred_begin_startup_actions(void) { + khm_handle csp_cw; + + if (khm_startup.seen) + return; + + if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", 0, &csp_cw))) { + khm_int32 t = 0; + + khc_read_int32(csp_cw, L"Autoinit", &t); + if (t) + khm_startup.autoinit = TRUE; + + t = 0; + khc_read_int32(csp_cw, L"AutoImport", &t); + if (t) + khm_startup.import = TRUE; + + khc_close_space(csp_cw); + + } + + khm_startup.seen = TRUE; + khm_startup.processing = TRUE; + + khm_cred_process_startup_actions(); +} + +void +khm_cred_refresh(void) { + kmq_post_message(KMSG_CRED, KMSG_CRED_REFRESH, 0, NULL); +} + +void +khm_cred_addr_change(void) { + khm_handle csp_cw = NULL; + khm_int32 check_net = 0; + + wchar_t * ids = NULL; + wchar_t * t; + khm_size cb; + khm_size n_idents; + + FILETIME ft_now; + FILETIME ft_exp; + FILETIME ft_issue; + + if (KHM_SUCCEEDED(khc_open_space(NULL, L"CredWindow", + 0, &csp_cw))) { + khc_read_int32(csp_cw, L"AutoDetectNet", &check_net); + + khc_close_space(csp_cw); + } + + if (!check_net) + return; + + while(TRUE) { + if (ids) + PFREE(ids); + ids = NULL; + + if (kcdb_identity_enum(KCDB_IDENT_FLAG_VALID | + KCDB_IDENT_FLAG_RENEWABLE, + KCDB_IDENT_FLAG_VALID | + KCDB_IDENT_FLAG_RENEWABLE, + NULL, + &cb, + &n_idents) != KHM_ERROR_TOO_LONG) + break; + + ids = PMALLOC(cb); + + if (KHM_SUCCEEDED + (kcdb_identity_enum(KCDB_IDENT_FLAG_VALID | + KCDB_IDENT_FLAG_RENEWABLE, + KCDB_IDENT_FLAG_VALID | + KCDB_IDENT_FLAG_RENEWABLE, + ids, + &cb, + &n_idents))) + break; + } + + if (!ids) + return; + + GetSystemTimeAsFileTime(&ft_now); + + for (t=ids; t && *t; t = multi_string_next(t)) { + khm_handle ident; + + + if (KHM_FAILED + (kcdb_identity_create(t, 0, &ident))) + continue; + + cb = sizeof(ft_issue); + + if (KHM_SUCCEEDED + (kcdb_identity_get_attr(ident, KCDB_ATTR_ISSUE, NULL, + &ft_issue, &cb)) && + + (cb = sizeof(ft_exp)) && + KHM_SUCCEEDED + (kcdb_identity_get_attr(ident, KCDB_ATTR_EXPIRE, NULL, + &ft_exp, &cb)) && + + CompareFileTime(&ft_now, &ft_exp) < 0) { + + khm_int64 i_issue; + khm_int64 i_exp; + khm_int64 i_now; + + i_issue = FtToInt(&ft_issue); + i_exp = FtToInt(&ft_exp); + i_now = FtToInt(&ft_now); + + if (i_now > (i_issue + i_exp) / 2) { + + khm_cred_renew_identity(ident); + + } + } + + kcdb_identity_release(ident); + } +} --- krb5-1.4.4.orig/src/windows/identity/ui/toolbar.h +++ krb5-1.4.4/src/windows/identity/ui/toolbar.h @@ -1,52 +1,52 @@ -/* - * Copyright (c) 2005 Massachusetts Institute of Technology - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, - * modify, merge, publish, distribute, sublicense, and/or sell copies - * of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/* $Id$ */ - -#ifndef __KHIMAIRA_TOOLBAR_H -#define __KHIMAIRA_TOOLBAR_H - -extern HWND khui_hwnd_standard_toolbar; - -void khui_init_toolbar(void); -void khui_exit_toolbar(void); -LRESULT khm_toolbar_notify(LPNMHDR notice); -void khm_create_standard_toolbar(HWND rebar); -void khui_add_action_to_toolbar(HWND toolbar, khui_action * act, int opt, HIMAGELIST hiList); -void khm_update_standard_toolbar(void); - -/* options for khui_add_action_to_toolbar */ -#define KHUI_TOOLBAR_ADD_TEXT 1 -#define KHUI_TOOLBAR_ADD_BITMAP 2 -#define KHUI_TOOLBAR_ADD_LONGTEXT 5 -#define KHUI_TOOLBAR_ADD_DROPDOWN 8 -#define KHUI_TOOLBAR_ADD_SEP 16 -#define KHUI_TOOLBAR_VARSIZE 32 - -#define KHUI_TOOLBAR_IMAGE_WIDTH 29 -#define KHUI_TOOLBAR_IMAGE_HEIGHT 27 -#define KHUI_TOOLBAR_BGCOLOR RGB(0xd7,0xd7,0xd7) -#define KHUI_TOOLBAR_MAX_BTNS 64 - -#endif +/* + * Copyright (c) 2005 Massachusetts Institute of Technology + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* $Id$ */ + +#ifndef __KHIMAIRA_TOOLBAR_H +#define __KHIMAIRA_TOOLBAR_H + +extern HWND khui_hwnd_standard_toolbar; + +void khui_init_toolbar(void); +void khui_exit_toolbar(void); +LRESULT khm_toolbar_notify(LPNMHDR notice); +void khm_create_standard_toolbar(HWND rebar); +void khui_add_action_to_toolbar(HWND toolbar, khui_action * act, int opt, HIMAGELIST hiList); +void khm_update_standard_toolbar(void); + +/* options for khui_add_action_to_toolbar */ +#define KHUI_TOOLBAR_ADD_TEXT 1 +#define KHUI_TOOLBAR_ADD_BITMAP 2 +#define KHUI_TOOLBAR_ADD_LONGTEXT 5 +#define KHUI_TOOLBAR_ADD_DROPDOWN 8 +#define KHUI_TOOLBAR_ADD_SEP 16 +#define KHUI_TOOLBAR_VARSIZE 32 + +#define KHUI_TOOLBAR_IMAGE_WIDTH 29 +#define KHUI_TOOLBAR_IMAGE_HEIGHT 27 +#define KHUI_TOOLBAR_BGCOLOR RGB(0xd7,0xd7,0xd7) +#define KHUI_TOOLBAR_MAX_BTNS 64 + +#endif --- krb5-1.4.4.orig/src/windows/identity/help/Makefile +++ krb5-1.4.4/src/windows/identity/help/Makefile @@ -1,39 +1,39 @@ -# -# Copyright (c) 2004 Massachusetts Institute of Technology -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, -# including without limitation the rights to use, copy, modify, merge, -# publish, distribute, sublicense, and/or sell copies of the Software, -# and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - - -MODULE=help -!include <..\config\Makefile.w32> - -CHMFILE=$(BINDIR)\netidmgr.chm - -INCFILES=$(INCDIR)\khhelp.h - -all: mkdirs $(CHMFILE) $(INCFILES) - -$(CHMFILE): netidmgr.hhp - -$(HHC) netidmgr.hhp - $(CP) netidmgr.chm $(CHMFILE) - -clean:: +# +# Copyright (c) 2004 Massachusetts Institute of Technology +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, +# publish, distribute, sublicense, and/or sell copies of the Software, +# and to permit persons to whom the Software is furnished to do so, +# subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + + +MODULE=help +!include <..\config\Makefile.w32> + +CHMFILE=$(BINDIR)\netidmgr.chm + +INCFILES=$(INCDIR)\khhelp.h + +all: mkdirs $(CHMFILE) $(INCFILES) + +$(CHMFILE): netidmgr.hhp + -$(HHC) netidmgr.hhp + $(CP) netidmgr.chm $(CHMFILE) + +clean:: $(RM) $(CHMFILE) \ No newline at end of file --- krb5-1.4.4.orig/src/windows/identity/help/khhelp.h +++ krb5-1.4.4/src/windows/identity/help/khhelp.h @@ -1,33 +1,33 @@ -#define IDH_WELCOME 1000 -#define IDH_WIN_MAIN 1001 - -#define IDH_MENU_FILE 1501 -#define IDH_MENU_CRED 1502 -#define IDH_MENU_VIEW 1503 -#define IDH_MENU_OPTIONS 1504 -#define IDH_MENU_HELP 1505 - -#define IDH_ACTION_PROPERTIES 2000 -#define IDH_ACTION_EXIT 2001 -#define IDH_ACTION_NEW_ID 2002 -#define IDH_ACTION_SET_DEF_ID 2003 -#define IDH_ACTION_SET_SRCH_ID 2004 -#define IDH_ACTION_DESTROY_ID 2005 -#define IDH_ACTION_RENEW_ID 2006 -#define IDH_ACTION_PASSWD_ID 2007 -#define IDH_ACTION_NEW_CRED 2008 -#define IDH_ACTION_CHOOSE_COLS 2009 -#define IDH_ACTION_DEBUG_WINDOW 2010 -#define IDH_ACTION_VIEW_REFRESH 2011 -#define IDH_ACTION_OPT_KHIM 2012 -#define IDH_ACTION_OPT_INIT 2013 -#define IDH_ACTION_OPT_NOTIF 2014 - -#define IDH_NC_CREDWND 3000 -#define IDH_NC_OK 3001 -#define IDH_NC_CANCEL 3002 -#define IDH_NC_HELP 3003 -#define IDH_NC_TABBUTTON 3004 -#define IDH_NC_OPTIONS 3005 -#define IDH_NC_TABMAIN 3006 -#define IDH_NC_SETDEF 3007 +#define IDH_WELCOME 1000 +#define IDH_WIN_MAIN 1001 + +#define IDH_MENU_FILE 1501 +#define IDH_MENU_CRED 1502 +#define IDH_MENU_VIEW 1503 +#define IDH_MENU_OPTIONS 1504 +#define IDH_MENU_HELP 1505 + +#define IDH_ACTION_PROPERTIES 2000 +#define IDH_ACTION_EXIT 2001 +#define IDH_ACTION_NEW_ID 2002 +#define IDH_ACTION_SET_DEF_ID 2003 +#define IDH_ACTION_SET_SRCH_ID 2004 +#define IDH_ACTION_DESTROY_ID 2005 +#define IDH_ACTION_RENEW_ID 2006 +#define IDH_ACTION_PASSWD_ID 2007 +#define IDH_ACTION_NEW_CRED 2008 +#define IDH_ACTION_CHOOSE_COLS 2009 +#define IDH_ACTION_DEBUG_WINDOW 2010 +#define IDH_ACTION_VIEW_REFRESH 2011 +#define IDH_ACTION_OPT_KHIM 2012 +#define IDH_ACTION_OPT_INIT 2013 +#define IDH_ACTION_OPT_NOTIF 2014 + +#define IDH_NC_CREDWND 3000 +#define IDH_NC_OK 3001 +#define IDH_NC_CANCEL 3002 +#define IDH_NC_HELP 3003 +#define IDH_NC_TABBUTTON 3004 +#define IDH_NC_OPTIONS 3005 +#define IDH_NC_TABMAIN 3006 +#define IDH_NC_SETDEF 3007 --- krb5-1.4.4.orig/src/windows/lib/registry.h +++ krb5-1.4.4/src/windows/lib/registry.h @@ -3,15 +3,15 @@ * * Author: Michael Graff */ - -#ifndef LIB_WINDOWS_REGISTRY_H -#define LIB_WINDOWS_REGISTRY_H + +#ifndef LIB_WINDOWS_REGISTRY_H +#define LIB_WINDOWS_REGISTRY_H #include #include -HKEY registry_open(HKEY, char *, REGSAM); -void registry_close(HKEY); +HKEY registry_open(HKEY, char *, REGSAM); +void registry_close(HKEY); HKEY registry_key_create(HKEY, char *, REGSAM); int registry_key_delete(HKEY, char *); int registry_string_get(HKEY, char *, char **); @@ -24,17 +24,17 @@ int registry_keyval_string_set(HKEY, char *, char *, char *); int registry_value_delete(HKEY, char *); int registry_keyval_delete(HKEY, char *, char *); - -#define CYGNUS_SOLUTIONS "SOFTWARE\\Cygnus Solutions" - -#define KERBNET_SANS_VERSION CYGNUS_SOLUTIONS "\\Kerbnet" -#define KERBNET_BASE KERBNET_SANS_VERSION "\\1" - -#define KERBNET_TELNET_BASE KERBNET_BASE "\\telnet" -#define KERBNET_TELNET_HOST KERBNET_TELNET_BASE "\\hosts" - -#define KERBNET_CNS_BASE KERBNET_BASE "\\cns" - -#define KERBNET_HOME "KERBNET_HOME" - -#endif /* LIB_WINDOWS_REGISTRY_H */ + +#define CYGNUS_SOLUTIONS "SOFTWARE\\Cygnus Solutions" + +#define KERBNET_SANS_VERSION CYGNUS_SOLUTIONS "\\Kerbnet" +#define KERBNET_BASE KERBNET_SANS_VERSION "\\1" + +#define KERBNET_TELNET_BASE KERBNET_BASE "\\telnet" +#define KERBNET_TELNET_HOST KERBNET_TELNET_BASE "\\hosts" + +#define KERBNET_CNS_BASE KERBNET_BASE "\\cns" + +#define KERBNET_HOME "KERBNET_HOME" + +#endif /* LIB_WINDOWS_REGISTRY_H */ --- krb5-1.4.4.orig/src/windows/lib/registry.c +++ krb5-1.4.4/src/windows/lib/registry.c @@ -5,8 +5,8 @@ */ #include -#include - +#include + #include "registry.h" HKEY @@ -38,7 +38,7 @@ registry_key_create(HKEY hkey, char *sub, REGSAM sam) { HKEY key; - DWORD err; + DWORD err; DWORD disp; err = RegCreateKeyEx(hkey, sub, 0, 0, REG_OPTION_NON_VOLATILE, sam, @@ -51,8 +51,8 @@ int registry_key_delete(HKEY hkey, char *sub) -{ - DWORD err; +{ + DWORD err; err = RegDeleteKey(hkey, sub); if (err != ERROR_SUCCESS) @@ -206,11 +206,11 @@ int registry_value_delete(HKEY hkey, char *sub) -{ - if (RegDeleteValue(hkey, sub)) - return -1; - - return 0; +{ + if (RegDeleteValue(hkey, sub)) + return -1; + + return 0; } int --- krb5-1.4.4.orig/src/kadmin/cli/kadmin.M +++ krb5-1.4.4/src/kadmin/cli/kadmin.M @@ -212,7 +212,7 @@ .TP \fB\-policy\fP \fIpolicy\fP policy used by this principal. If no policy is supplied, then if the -policy "default" exists and the -clearpolicy is not also specified, +policy "default" exists and the \-clearpolicy is not also specified, then the policy "default" is used; otherwise, the principal will have no policy, and a warning message will be printed. .TP @@ -509,7 +509,7 @@ Key: vno 1, DES cbc mode with CRC-32, Version 4 Attributes: Policy: [none] -kadmin: getprinc -terse systest +kadmin: getprinc \-terse systest systest@BLEEP.COM 3 86400 604800 1 785926535 753241234 785900000 tlyu/admin@BLEEP.COM 786100034 0 0 @@ -639,7 +639,7 @@ Minimum number of password character classes: 2 Number of old keys kept: 5 Reference count: 17 -kadmin: get_policy -terse admin +kadmin: get_policy \-terse admin admin 15552000 0 6 2 5 17 kadmin: .TP @@ -712,7 +712,7 @@ .RS .TP EXAMPLE: -kadmin: ktadd -k /tmp/foo-new-keytab host/foo.mit.edu +kadmin: ktadd \-k /tmp/foo-new-keytab host/foo.mit.edu Entry for principal host/foo.mit.edu@ATHENA.MIT.EDU with kvno 3, encryption type DES-CBC-CRC added to keytab WRFILE:/tmp/foo-new-keytab @@ -739,7 +739,7 @@ .RS .TP EXAMPLE: -kadmin: ktremove -k /usr/local/var/krb5kdc/kadmind.keytab kadmin/admin +kadmin: ktremove \-k /usr/local/var/krb5kdc/kadmind.keytab kadmin/admin Entry for principal kadmin/admin with kvno 3 removed from keytab WRFILE:/usr/local/var/krb5kdc/kadmind.keytab. kadmin: --- krb5-1.4.4.orig/src/kadmin/server/misc.c +++ krb5-1.4.4/src/kadmin/server/misc.c @@ -171,3 +171,12 @@ return kadm5_free_principal_ent(handle->lhandle, &princ); } + +#define MAXPRINCLEN 125 + +void +trunc_name(size_t *len, char **dots) +{ + *dots = *len > MAXPRINCLEN ? "..." : ""; + *len = *len > MAXPRINCLEN ? MAXPRINCLEN : *len; +} --- krb5-1.4.4.orig/src/kadmin/server/server_stubs.c +++ krb5-1.4.4/src/kadmin/server/server_stubs.c @@ -466,12 +466,13 @@ static generic_ret ret; char *prime_arg1, *prime_arg2; - char prime_arg[BUFSIZ]; gss_buffer_desc client_name, service_name; OM_uint32 minor_stat; kadm5_server_handle_t handle; restriction_t *rp; + size_t tlen1, tlen2, clen, slen; + char *tdots1, *tdots2, *cdots, *sdots; xdr_free(xdr_generic_ret, &ret); @@ -492,7 +493,14 @@ ret.code = KADM5_BAD_PRINCIPAL; return &ret; } - sprintf(prime_arg, "%s to %s", prime_arg1, prime_arg2); + tlen1 = strlen(prime_arg1); + trunc_name(&tlen1, &tdots1); + tlen2 = strlen(prime_arg2); + trunc_name(&tlen2, &tdots2); + clen = client_name.length; + trunc_name(&clen, &cdots); + slen = service_name.length; + trunc_name(&slen, &sdots); ret.code = KADM5_OK; if (! CHANGEPW_SERVICE(rqstp)) { @@ -510,16 +518,27 @@ } else ret.code = KADM5_AUTH_INSUFFICIENT; if (ret.code != KADM5_OK) { - krb5_klog_syslog(LOG_NOTICE, LOG_UNAUTH, "kadm5_rename_principal", - prime_arg, client_name.value, service_name.value, + krb5_klog_syslog(LOG_NOTICE, + "Unauthorized request: kadm5_rename_principal, " + "%.*s%s to %.*s%s, " + "client=%.*s%s, service=%.*s%s, addr=%s", + tlen1, prime_arg1, tdots1, + tlen2, prime_arg2, tdots2, + clen, client_name.value, cdots, + slen, service_name.value, sdots, inet_ntoa(rqstp->rq_xprt->xp_raddr.sin_addr)); } else { ret.code = kadm5_rename_principal((void *)handle, arg->src, arg->dest); - krb5_klog_syslog(LOG_NOTICE, LOG_DONE, "kadm5_rename_principal", - prime_arg, ((ret.code == 0) ? "success" : - error_message(ret.code)), - client_name.value, service_name.value, + krb5_klog_syslog(LOG_NOTICE, + "Request: kadm5_rename_principal, " + "%.*s%s to %.*s%s, %s, " + "client=%.*s%s, service=%.*s%s, addr=%s", + tlen1, prime_arg1, tdots1, + tlen2, prime_arg2, tdots2, + (ret.code == 0) ? "success" : error_message(ret.code), + clen, client_name.value, cdots, + slen, service_name.value, sdots, inet_ntoa(rqstp->rq_xprt->xp_raddr.sin_addr)); } free_server_handle(handle); --- krb5-1.4.4.orig/src/kadmin/server/kadmind.M +++ krb5-1.4.4/src/kadmin/server/kadmind.M @@ -66,7 +66,7 @@ specifies that the master database password should be fetched from the keyboard rather than from a file on disk. Note that the server gets the password prior to putting itself in the background; in combination with -the -nofork option, you must place it in the background by hand. +the \-nofork option, you must place it in the background by hand. .TP .B \-nofork specifies that the server does not put itself in the background and does --- krb5-1.4.4.orig/src/kadmin/server/misc.h +++ krb5-1.4.4/src/kadmin/server/misc.h @@ -45,3 +45,5 @@ #ifdef SVC_GETARGS void kadm_1(struct svc_req *, SVCXPRT *); #endif + +void trunc_name(size_t *len, char **dots); --- krb5-1.4.4.orig/src/kadmin/server/ovsec_kadmd.c +++ krb5-1.4.4/src/kadmin/server/ovsec_kadmd.c @@ -278,14 +278,6 @@ krb5_klog_init(context, "admin_server", whoami, 1); - krb5_klog_syslog(LOG_INFO, "Seeding random number generator"); - ret = krb5_c_random_os_entropy(context, 1, NULL); - if(ret) { - krb5_klog_syslog(LOG_ERR, "Error getting random seed: %s, aborting", - error_message(ret)); - exit(1); - } - if((ret = kadm5_init("kadmind", NULL, NULL, ¶ms, KADM5_STRUCT_VERSION, @@ -602,6 +594,17 @@ exit(1); } + krb5_klog_syslog(LOG_INFO, "Seeding random number generator"); + ret = krb5_c_random_os_entropy(context, 1, NULL); + if (ret) { + krb5_klog_syslog(LOG_ERR, "Error getting random seed: %s, aborting", + error_message(ret)); + svcauth_gssapi_unset_names(); + kadm5_destroy(global_server_handle); + krb5_klog_close(context); + exit(1); + } + setup_signal_handlers(); krb5_klog_syslog(LOG_INFO, "starting"); kadm_svc_run(¶ms); --- krb5-1.4.4.orig/src/kadmin/ktutil/ktutil_funcs.c +++ krb5-1.4.4/src/kadmin/ktutil/ktutil_funcs.c @@ -35,6 +35,10 @@ #include #include +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + /* * Free a kt_list */ --- krb5-1.4.4.orig/src/slave/kprop.M +++ krb5-1.4.4/src/slave/kprop.M @@ -39,7 +39,7 @@ This is done by transmitting the dumped database file to the slave server over an encrypted, secure channel. The dump file must be created by kdb5_util, and is normally KPROP_DEFAULT_FILE -(/usr/local/var/krb5kdc/slave_datatrans). +(/var/lib/krb5kdc/slave_datatrans). .SH OPTIONS .TP \fB\-r\fP \fIrealm\fP @@ -51,7 +51,7 @@ \fB\-f\fP \fIfile\fP specifies the filename where the dumped principal database file is to be found; by default the dumped database file is KPROP_DEFAULT_FILE -(normally /usr/local/var/krb5kdc/slave_datatrans). +(normally /var/lib/krb5kdc/slave_datatrans). .TP \fB\-P\fP \fIport\fP specifies the port to use to contact the --- krb5-1.4.4.orig/src/slave/kpropd.c +++ krb5-1.4.4/src/slave/kpropd.c @@ -193,9 +193,9 @@ sp = getservbyname(KPROP_SERVICE, "tcp"); if (sp == NULL) { com_err(progname, 0, "%s/tcp: unknown service", KPROP_SERVICE); - exit(1); + my_sin.sin_port = htons(KPROP_PORT); } - my_sin.sin_port = sp->s_port; + else my_sin.sin_port = sp->s_port; } else { my_sin.sin_port = port; } --- krb5-1.4.4.orig/src/slave/kprop.h +++ krb5-1.4.4/src/slave/kprop.h @@ -29,6 +29,7 @@ #define KPROP_SERVICE_NAME "host" #define TGT_SERVICE_NAME "krbtgt" #define KPROP_SERVICE "krb5_prop" +#define KPROP_PORT 754 #define KPROP_PROT_VERSION "kprop5_01" --- krb5-1.4.4.orig/src/slave/kprop.c +++ krb5-1.4.4/src/slave/kprop.c @@ -346,13 +346,11 @@ if(!port) { sp = getservbyname(KPROP_SERVICE, "tcp"); if (sp == 0) { - (void) strncpy(Errmsg, KPROP_SERVICE, ErrmsgSz - 1); - Errmsg[ErrmsgSz - 1] = '\0'; - (void) strncat(Errmsg, "/tcp: unknown service", ErrmsgSz - 1 - strlen(Errmsg)); - *fd = -1; - return(0); + my_sin.sin_port = htons(KPROP_PORT); + + } else { + my_sin.sin_port = sp->s_port; } - my_sin.sin_port = sp->s_port; } else my_sin.sin_port = port; s = socket(AF_INET, SOCK_STREAM, 0); --- krb5-1.4.4.orig/src/slave/kpropd.M +++ krb5-1.4.4/src/slave/kpropd.M @@ -69,7 +69,7 @@ This is done by adding a line to the inetd.conf file which looks like this: -kprop stream tcp nowait root /usr/local/sbin/kpropd kpropd +krb5_prop stream tcp nowait root /usr/sbin/kpropd kpropd However, kpropd can also run as a standalone deamon, if the .B \-S @@ -87,13 +87,13 @@ \fB\-f\fP \fIfile\fP specifies the filename where the dumped principal database file is to be stored; by default the dumped database file is KPROPD_DEFAULT_FILE -(normally /usr/local/var/krb5kdc/from_master). +(normally /var/lib/krb5kdc/from_master). .TP .B \-p allows the user to specify the pathname to the .IR kdb5_util (8) program; by default the pathname used is KPROPD_DEFAULT_KDB5_UTIL -(normally /usr/local/sbin/kdb5_util). +(normally /usr/sbin/kdb5_util). .TP .B \-S turn on standalone mode. Normally, kpropd is invoked out of --- krb5-1.4.4.orig/src/util/support/threads.c +++ krb5-1.4.4/src/util/support/threads.c @@ -139,11 +139,6 @@ || &pthread_mutex_init == 0 || &pthread_self == 0 || &pthread_equal == 0 - /* This catches Solaris 9. May be redundant with the above - tests now. */ -# ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST_NP_IN_THREAD_LIB - || &pthread_mutexattr_setrobust_np == 0 -# endif /* Any program that's really multithreaded will have to be able to create threads. */ || &pthread_create == 0 --- krb5-1.4.4.orig/src/util/db2/btree/bt_open.c +++ krb5-1.4.4/src/util/db2/btree/bt_open.c @@ -66,6 +66,10 @@ #define MINPSIZE 128 #endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + static int byteorder __P((void)); static int nroot __P((BTREE *)); static int tmp __P((void)); --- krb5-1.4.4.orig/src/util/db2/hash/dbm.c +++ krb5-1.4.4/src/util/db2/hash/dbm.c @@ -58,6 +58,10 @@ #define NEED_COPY +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + /* * * This package provides dbm and ndbm compatible interfaces to DB. --- krb5-1.4.4.orig/src/util/profile/prof_parse.c +++ krb5-1.4.4/src/util/profile/prof_parse.c @@ -84,10 +84,10 @@ if (*line == 0) return 0; - if (line[0] == ';' || line[0] == '#') - return 0; - strip_line(line); cp = skip_over_blanks(line); + if (cp[0] == ';' || cp[0] == '#') + return 0; + strip_line(cp); ch = *cp; if (ch == 0) return 0; --- krb5-1.4.4.orig/src/util/pty/sane_hostname.c +++ krb5-1.4.4/src/util/pty/sane_hostname.c @@ -29,6 +29,10 @@ #include "socket-utils.h" #include "fake-addrinfo.h" +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + static void downcase (char *s) { --- krb5-1.4.4.orig/src/appl/bsd/klogind.M +++ krb5-1.4.4/src/appl/bsd/klogind.M @@ -27,29 +27,33 @@ the port indicated in /etc/inetd.conf. A typical /etc/inetd.conf configuration line for \fIklogind\fP might be: -klogin stream tcp nowait root /usr/cygnus/sbin/klogind klogind -e5c +klogin stream tcp nowait root /usr/sbin/klogind klogind \-e5c When a service request is received, the following protocol is initiated: .IP 1) Check authentication. .IP 2) -Check authorization via the access-control files \fI.k5login\fP, \fI.klogin\fP -and \fI.rhosts\fP in the user's home directory. +Check authorization via the access-control files \fI.k5login\fP and +\fI.klogin\fP in the user's home directory. .IP 3) Prompt for password if any checks fail and the \fI-p\fP option was supplied. .PP If the authentication succeeds, login the user by calling the accompanying login.krb5 or /bin/login, according to the definition of -DO_NOT_USE_K_LOGIN. +DO_NOT_USE_K_LOGIN. .PP The configuration of \fIklogind\fP is done by command line arguments passed by inetd. The options are: .IP \fB\-5\fP 10 Allow Kerberos V5 authentication with the \fI.k5login\fP access control file to be trusted. If this authentication system is used by the client -and the authorization check is passed, then the user is allowed to log -in. +and the authorization check is passed, then the user is allowed to log in. +If the user has no \fI.k5login\fP file, the login will be authorized if +the results of krb5_aname_to_localname conversion matches the account +name. Unless special rules are configured, this will be true if and only +if the Kerberos principal of the connecting user is in the default local +realm and the principal portion matches the account name. .IP \fB\-4\fP Allow Kerberos V4 authentication with the \fI.klogin\fP access control @@ -70,7 +74,7 @@ .IP \fB\-P\fP Prompt the user for a password. -If the -P option is passed, then the password is verified in addition +If the \-P option is passed, then the password is verified in addition to all other checks. .IP \fB\-e\fP @@ -103,16 +107,10 @@ ignore authenticator checksusm presented by current Kerberos clients to protect initial connection information; it is the opposite of \fB-c\fP. This option is provided because some older -clients--particularly clients predating the release of Kerberos V5 -Beta5 (May 1995)--present bogus checksums that prevent Kerberos +clients -- particularly clients predating the release of Kerberos V5 +Beta5 (May 1995) -- present bogus checksums that prevent Kerberos authentication from succeeding in the default mode. - -.PP -If the -~/.rhosts check is to be used, then the program verifies that the -client is connecting from a privileged port, before allowing login. - .PP The parent of the login process manipulates the master side of the pseduo terminal, operating as an intermediary between the login --- krb5-1.4.4.orig/src/appl/bsd/rlogin.M +++ krb5-1.4.4/src/appl/bsd/rlogin.M @@ -149,7 +149,7 @@ \fB\-4\fP Use Kerberos V4 authentication only; don't try Kerberos V5. .SH SEE ALSO -rsh(1), kerberos(3), krb_sendauth(3), krb_realmofhost(3), rlogin(1) [UCB +rsh(1), kerberos(1), krb_sendauth(3), krb_realmofhost(3), rlogin(1) [UCB version], klogind(8) .SH FILES .TP "\w'~/\&.k5login\ \ 'u" --- krb5-1.4.4.orig/src/appl/bsd/krshd.c +++ krb5-1.4.4/src/appl/bsd/krshd.c @@ -515,6 +515,11 @@ #define NCARGS 1024 #endif +#if NCARGS == INT_MAX +#undef NCARGS +#define NCARGS 4096 +#endif + #define NMAX 16 int pid; --- krb5-1.4.4.orig/src/appl/bsd/krlogin.c +++ krb5-1.4.4/src/appl/bsd/krlogin.c @@ -137,6 +137,7 @@ #include #endif #endif +#undef TIOCGLTC #ifndef TIOCPKT_NOSTOP /* These values are over-the-wire protocol, *not* local values */ --- krb5-1.4.4.orig/src/appl/bsd/login.c +++ krb5-1.4.4/src/appl/bsd/login.c @@ -132,6 +132,14 @@ #define siglongjmp longjmp #endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + #ifdef POSIX_SIGNALS typedef struct sigaction handler; #define handler_init(H,F) (sigemptyset(&(H).sa_mask), \ --- krb5-1.4.4.orig/src/appl/bsd/kshd.M +++ krb5-1.4.4/src/appl/bsd/kshd.M @@ -8,7 +8,7 @@ .SH NAME kshd \- kerberized remote shell server .SH SYNOPSIS -.B /usr/local/sbin/kshd +.B kshd [ .B \-kr45ec ] @@ -30,15 +30,15 @@ on the port indicated in /etc/inetd.conf. A typical /etc/inetd.conf configuration line for \fIkrshd\fP might be: -kshell stream tcp nowait root /usr/local/sbin/kshd kshd -5c +kshell stream tcp nowait root /usr/sbin/kshd kshd \-5c When a service request is received, the following protocol is initiated: .IP 1) Authentication is checked .IP 2) -Check authorization via the access-control files \fI.k5login\fP, \fI.klogin\fP -and \fI.rhosts\fP in the user's home directory. +Check authorization via the access-control files \fI.k5login\fP and +\fI.klogin\fP in the user's home directory. .IP 3) A null byte is returned on the initial socket and the command line is passed to the normal login @@ -53,8 +53,13 @@ .IP \fB\-5\fP 10 Allow Kerberos5 authentication with the \fI.k5login\fP access control file -to be trusted. If this authentication system is used by the client and the -authorization check is passed, then the user is allowed to log in. +to be trusted. If this authentication system is used by the client and +the authorization check is passed, then the user is allowed to log in. If +the user has no \fI.k5login\fP file, the login will be authorized if the +results of krb5_aname_to_localname conversion matches the account name. +Unless special rules are configured, this will be true if and only if the +Kerberos principal of the connecting user is in the default local realm +and the principal portion matches the account name. .IP \fB\-4\fP Allow Kerberos4 authentication with the \fI.klogin\fP access control file @@ -102,15 +107,12 @@ ignore authenticator checksusm presented by current Kerberos clients to protect initial connection information; it is the opposite of \fB-c\fP. This option is provided because some older -clients--particularly clients predating the release of Kerberos V5 -Beta5 (May 1995)--present bogus checksums that prevent Kerberos +clients -- particularly clients predating the release of Kerberos V5 +Beta5 (May 1995) -- present bogus checksums that prevent Kerberos authentication from succeeding in the default mode. .PP -If the \fB\-r\fP or \fB\-R\fP options are used, the client must -connect from a privileged port. -.PP \fIKrshd\fP supports six options which may be used for testing: .IP \fB\-S\ keytab\fP 10 @@ -126,7 +128,7 @@ Use the argument to find the Kerberos binaries. Normally a compiled in argument is used. -.IP \fB\-D\ port \fP +.IP \fB\-D\ port\fP Run in standalone mode, listening on \fBport\fP. The daemon will exit after one connection and will not background itself. --- krb5-1.4.4.orig/src/appl/bsd/krlogind.c +++ krb5-1.4.4/src/appl/bsd/krlogind.c @@ -302,6 +302,10 @@ #define MAXDNAME 256 /*per the rfc*/ #endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + char lusername[UT_NAMESIZE+1]; char rusername[UT_NAMESIZE+1]; char *krusername = 0; --- krb5-1.4.4.orig/src/appl/bsd/Makefile.in +++ krb5-1.4.4/src/appl/bsd/Makefile.in @@ -22,9 +22,9 @@ OBJS= krcp.o krlogin.o krsh.o kcmd.o forward.o compat_recv.o $(SETENVOBJ) \ login.o krshd.o krlogind.o $(V4RCPO) $(LIBOBJS) -UCB_RLOGIN = @UCB_RLOGIN@ -UCB_RSH = @UCB_RSH@ -UCB_RCP = @UCB_RCP@ +UCB_RLOGIN = /usr/bin/netkit-rlogin +UCB_RSH = /usr/bin/netkit-rsh +UCB_RCP = /usr/bin/netkit-rcp RSH= -DKRB5_PATH_RLOGIN=\"$(CLIENT_BINDIR)/rlogin\" BSD= -DUCB_RLOGIN=\"$(UCB_RLOGIN)\" \ --- krb5-1.4.4.orig/src/appl/telnet/telnetd/sys_term.c +++ krb5-1.4.4/src/appl/telnet/telnetd/sys_term.c @@ -1287,6 +1287,16 @@ #endif #if defined (AUTHENTICATION) if (auth_level >= 0 && autologin == AUTH_VALID) { + if (name[0] == '-') { + /* Authenticated and authorized to log in to an + account starting with '-'? Even if that + unlikely case comes to pass, the current login + program will not parse the resulting command + line properly. */ + syslog(LOG_ERR, "user name cannot start with '-'"); + fatal(net, "user name cannot start with '-'"); + exit(1); + } # if !defined(NO_LOGIN_F) #if defined(LOGIN_CAP_F) argv = addarg(argv, "-F"); @@ -1377,11 +1387,19 @@ } else #endif if (getenv("USER")) { - argv = addarg(argv, getenv("USER")); + char *user = getenv("USER"); + if (user[0] == '-') { + /* "telnet -l-x ..." */ + syslog(LOG_ERR, "user name cannot start with '-'"); + fatal(net, "user name cannot start with '-'"); + exit(1); + } + argv = addarg(argv, user); #if defined(LOGIN_ARGS) && defined(NO_LOGIN_P) { register char **cpp; for (cpp = environ; *cpp; cpp++) + if ((*cpp)[0] != '-') argv = addarg(argv, *cpp); } #endif --- krb5-1.4.4.orig/src/appl/telnet/telnetd/telnetd.8 +++ krb5-1.4.4/src/appl/telnet/telnetd/telnetd.8 @@ -37,7 +37,7 @@ .SM DARPA TELNET protocol server .SH SYNOPSIS -.B /usr/libexec/telnetd +.B telnetd [\fB\-a\fP \fIauthmode\fP] [\fB\-B\fP] [\fB\-D\fP] [\fIdebugmode\fP] [\fB\-e\fP] [\fB\-h\fP] [\fB\-I\fP\fIinitid\fP] [\fB\-l\fP] [\fB\-k\fP] [\fB\-n\fP] [\fB\-r\fP\fIlowpty-highpty\fP] [\fB\-s\fP] --- krb5-1.4.4.orig/src/appl/telnet/telnetd/defs.h +++ krb5-1.4.4/src/appl/telnet/telnetd/defs.h @@ -38,6 +38,7 @@ */ #include #include +#include #ifndef BSD # define BSD 43 --- krb5-1.4.4.orig/src/appl/telnet/telnetd/state.c +++ krb5-1.4.4/src/appl/telnet/telnetd/state.c @@ -1665,7 +1665,8 @@ strcmp(varp, "RESOLV_HOST_CONF") && /* linux */ strcmp(varp, "NLSPATH") && /* locale stuff */ strncmp(varp, "LC_", strlen("LC_")) && /* locale stuff */ - strcmp(varp, "IFS")) { + strcmp(varp, "IFS") && + !strchr(varp, '-')) { return 1; } else { syslog(LOG_INFO, "Rejected the attempt to modify the environment variable \"%s\"", varp); --- krb5-1.4.4.orig/src/appl/telnet/telnet/main.c +++ krb5-1.4.4/src/appl/telnet/telnet/main.c @@ -333,10 +333,14 @@ if (setjmp(toplevel) != 0) Exit(0); - if (tn(argp - args, args) == 1) - return (0); - else - return (1); + { + int ret = tn(argp - args, args); + switch (ret) { + case 1: return 0; + case 2: usage(); + default: return 1; + } + } } (void)setjmp(toplevel); for (;;) { --- krb5-1.4.4.orig/src/appl/telnet/telnet/commands.c +++ krb5-1.4.4/src/appl/telnet/telnet/commands.c @@ -2446,8 +2446,6 @@ cmd = *argv; --argc; ++argv; while (argc) { - if (isprefix(*argv, "help") || isprefix(*argv, "?")) - goto usage; if (strcmp(*argv, "-l") == 0) { --argc; ++argv; if (argc == 0) @@ -2472,8 +2470,7 @@ continue; } usage: - printf("usage: %s [-l user] [-a] host-name [port]\r\n", cmd); - return 0; + return 2; } if (hostp == 0) goto usage; --- krb5-1.4.4.orig/src/appl/telnet/telnet/sys_bsd.c +++ krb5-1.4.4/src/appl/telnet/telnet/sys_bsd.c @@ -43,6 +43,8 @@ #include #include #include +#include + #ifdef HAVE_SYS_SELECT_H #include #endif --- krb5-1.4.4.orig/src/appl/gssftp/ftp/ftp.M +++ krb5-1.4.4/src/appl/gssftp/ftp/ftp.M @@ -951,7 +951,7 @@ .IR popen (3) with the argument supplied, and reads from (writes to) stdout (stdin). If the shell command includes spaces, the argument must be quoted; e.g. -``" ls -lt"''. A particularly useful example of this mechanism is: +``" ls \-lt"''. A particularly useful example of this mechanism is: ``dir more''. .TP 3. --- krb5-1.4.4.orig/src/appl/gssftp/ftp/ftp.c +++ krb5-1.4.4/src/appl/gssftp/ftp/ftp.c @@ -153,6 +153,10 @@ #include "ftp_var.h" #include "secure.h" +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + #ifdef GSSAPI void user_gss_error (OM_uint32, OM_uint32, char *); #endif --- krb5-1.4.4.orig/src/appl/gssftp/ftp/cmds.c +++ krb5-1.4.4/src/appl/gssftp/ftp/cmds.c @@ -66,6 +66,10 @@ #include #include +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + #ifdef HAVE_GETCWD #define getwd(x) getcwd(x,MAXPATHLEN) #endif --- krb5-1.4.4.orig/src/appl/gssftp/ftp/ftp_var.h +++ krb5-1.4.4/src/appl/gssftp/ftp/ftp_var.h @@ -70,6 +70,10 @@ #define extern #endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + /* * Options and other state info. */ --- krb5-1.4.4.orig/src/appl/gssftp/ftpd/ftpd.c +++ krb5-1.4.4/src/appl/gssftp/ftpd/ftpd.c @@ -171,6 +171,14 @@ #include "ftpd_var.h" #include "secure.h" +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + extern char *crypt(); extern char version[]; extern char *home; /* pointer to home directory for glob */ --- krb5-1.4.4.orig/src/appl/gssftp/ftpd/ftpd.M +++ krb5-1.4.4/src/appl/gssftp/ftpd/ftpd.M @@ -36,7 +36,7 @@ ftpd \- DARPA Internet File Transfer Protocol server .SH SYNOPSIS .B ftpd -[\fB\-A \fP|\fB -a\fP] [\fB\-C\fP] [\fB\-c\fP] [\fB\-d\fP] [\fB-E\fP] +[\fB\-A \fP|\fB\-a\fP] [\fB\-C\fP] [\fB\-c\fP] [\fB\-d\fP] [\fB\-E\fP] [\fB\-l\fP] [\fB\-v\fP] [\fB\-T\fP \fImaxtimeout\fP] [\fB\-t\fP \fItimeout\fP] [\fB\-p\fP \fIport\fP] [\fB\-U\fP \fIftpusers-file\fP] [\fB\-u\fP \fIumask\fP] [\fB\-r\fP \fIrealm-file\fP] [\fB\-s\fP \fIsrvtab\fP] @@ -75,7 +75,7 @@ less secure connections, and should probably only be used when debugging. .TP .B \-d -Debugging information is written to the syslog. (Identical to -v) +Debugging information is written to the syslog. (Identical to \-v) .TP .B \-E Don't allow passwords to be typed across unencrypted connections. @@ -90,7 +90,7 @@ syslog as well. .TP .B \-v -Debugging information is written to the syslog. (Identical to -d) +Debugging information is written to the syslog. (Identical to \-d) .TP \fB\-T\fP \fImaxtimeout\fP A client may request a maximum timeout period allowed set to @@ -203,7 +203,7 @@ .sp -1 .TP LIST -give list files in a directory (``ls -lgA'') +give list files in a directory (``ls \-lgA'') .sp -1 .TP MIC --- krb5-1.4.4.orig/src/config/config.guess +++ krb5-1.4.4/src/config/config.guess @@ -1,9 +1,9 @@ #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -timestamp='2003-10-03' +timestamp='2006-02-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -17,13 +17,15 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. + # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. @@ -53,7 +55,7 @@ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO @@ -66,11 +68,11 @@ while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; + echo "$timestamp" ; exit ;; --version | -v ) - echo "$version" ; exit 0 ;; + echo "$version" ; exit ;; --help | --h* | -h ) - echo "$usage"; exit 0 ;; + echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. @@ -104,7 +106,7 @@ trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; @@ -123,7 +125,7 @@ ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ;' +esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) @@ -196,50 +198,32 @@ # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" - exit 0 ;; - amiga:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - arc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - hp300:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - macppc:OpenBSD:*:*) - echo powerpc-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme68k:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvme88k:OpenBSD:*:*) - echo m88k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - mvmeppc:OpenBSD:*:*) - echo powerpc-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - pmax:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sgi:OpenBSD:*:*) - echo mipseb-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - sun3:OpenBSD:*:*) - echo m68k-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; - wgrisc:OpenBSD:*:*) - echo mipsel-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; + exit ;; *:OpenBSD:*:*) - echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} - exit 0 ;; + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; alpha:OSF1:*:*) - if test $UNAME_RELEASE = "V4.0"; then + case $UNAME_RELEASE in + *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - fi + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU @@ -277,42 +261,49 @@ "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac + # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit 0 ;; - Alpha*:OpenVMS:*:*) - echo alpha-hp-vms - exit 0 ;; + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix - exit 0 ;; + exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 - exit 0 ;; + exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 - exit 0;; + exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos - exit 0 ;; + exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos - exit 0 ;; + exit ;; *:OS/390:*:*) echo i370-ibm-openedition - exit 0 ;; + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} - exit 0;; + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp - exit 0;; + exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then @@ -320,32 +311,32 @@ else echo pyramid-pyramid-bsd fi - exit 0 ;; + exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 - exit 0 ;; + exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 - exit 0 ;; - DRS?6000:UNIX_SV:4.2*:7*) + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7 && exit 0 ;; + sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; + exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; + exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; + exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; + exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) @@ -354,10 +345,10 @@ esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; + exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} - exit 0 ;; + exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 @@ -369,10 +360,10 @@ echo sparc-sun-sunos${UNAME_RELEASE} ;; esac - exit 0 ;; + exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} - exit 0 ;; + exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor @@ -383,37 +374,40 @@ # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; + exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; + exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} - exit 0 ;; + exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} - exit 0 ;; + exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} - exit 0 ;; + exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} - exit 0 ;; + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} - exit 0 ;; + exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 - exit 0 ;; + exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} - exit 0 ;; + exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} - exit 0 ;; + exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} - exit 0 ;; + exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -437,32 +431,33 @@ exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c \ - && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ - && exit 0 + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} - exit 0 ;; + exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax - exit 0 ;; + exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax - exit 0 ;; + exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax - exit 0 ;; + exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix - exit 0 ;; + exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 - exit 0 ;; + exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 - exit 0 ;; + exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 - exit 0 ;; + exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` @@ -478,29 +473,29 @@ else echo i586-dg-dgux${UNAME_RELEASE} fi - exit 0 ;; + exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 - exit 0 ;; + exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 - exit 0 ;; + exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 - exit 0 ;; + exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd - exit 0 ;; + exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit 0 ;; + exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix - exit 0 ;; + exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` @@ -508,7 +503,7 @@ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit 0 ;; + exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build @@ -523,14 +518,18 @@ exit(0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 - echo rs6000-ibm-aix3.2.5 + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi - exit 0 ;; + exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then @@ -544,28 +543,28 @@ IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit 0 ;; + exit ;; *:AIX:*:*) echo rs6000-ibm-aix - exit 0 ;; + exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 - exit 0 ;; + exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit 0 ;; # report: romp-ibm BSD 4.3 + exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx - exit 0 ;; + exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 - exit 0 ;; + exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd - exit 0 ;; + exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 - exit 0 ;; + exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in @@ -627,9 +626,19 @@ esac if [ ${HP_ARCH} = "hppa2.0w" ] then - # avoid double evaluation of $set_cc_for_build - test -n "$CC_FOR_BUILD" || eval $set_cc_for_build - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else @@ -637,11 +646,11 @@ fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit 0 ;; + exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} - exit 0 ;; + exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -669,153 +678,177 @@ exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 - exit 0 ;; + exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd - exit 0 ;; + exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd - exit 0 ;; + exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix - exit 0 ;; + exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf - exit 0 ;; + exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf - exit 0 ;; + exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi - exit 0 ;; + exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites - exit 0 ;; + exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd - exit 0 ;; + exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit 0 ;; + exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd - exit 0 ;; + exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd - exit 0 ;; + exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd - exit 0 ;; + exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + exit ;; *:UNICOS/mp:*:*) - echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit 0 ;; + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit 0 ;; + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit 0 ;; + exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; + exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) - # Determine whether the default compiler uses glibc. - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - #if __GLIBC__ >= 2 - LIBC=gnu - #else - LIBC= - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - # GNU/FreeBSD systems have a "k" prefix to indicate we are using - # FreeBSD's kernel, but not the complete OS. - case ${LIBC} in gnu) kernel_only='k' ;; esac - echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} - exit 0 ;; + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin - exit 0 ;; + exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 - exit 0 ;; + exit ;; + i*:MSYS_NT-*:*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 - exit 0 ;; - x86:Interix*:[34]*) - echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' - exit 0 ;; + exit ;; + x86:Interix*:[345]*) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T:Interix*:[345]*) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks - exit 0 ;; + exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix - exit 0 ;; + exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin - exit 0 ;; + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin - exit 0 ;; + exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; + exit ;; *:GNU:*:*) + # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit 0 ;; + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix - exit 0 ;; + exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu - exit 0 ;; + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c @@ -832,8 +865,12 @@ #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build @@ -851,15 +888,22 @@ #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` - test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu - exit 0 ;; + exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu - exit 0 ;; + exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; @@ -873,7 +917,7 @@ objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit 0 ;; + exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in @@ -881,25 +925,28 @@ PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac - exit 0 ;; + exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu - exit 0 ;; + exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux - exit 0 ;; + exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu - exit 0 ;; + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu - exit 0 ;; + exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent @@ -917,15 +964,15 @@ ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" - exit 0 ;; + exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" - exit 0 ;; + exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" - exit 0 ;; + exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build @@ -942,7 +989,7 @@ LIBC=gnulibc1 # endif #else - #ifdef __INTEL_COMPILER + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun) LIBC=gnu #else LIBC=gnuaout @@ -952,16 +999,23 @@ LIBC=dietlibc #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` - test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 - test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 - exit 0 ;; + exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... @@ -969,24 +1023,27 @@ # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit 0 ;; + exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx - exit 0 ;; + exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop - exit 0 ;; + exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos - exit 0 ;; + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit 0 ;; + exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then @@ -994,15 +1051,16 @@ else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi - exit 0 ;; - i*86:*:5:[78]*) + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit 0 ;; + exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi - exit 0 ;; + exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv - exit 0 ;; + exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv - exit 0 ;; + exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix - exit 0 ;; - M68*:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; + && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 - exit 0 ;; + exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; + exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} - exit 0 ;; + exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 - exit 0 ;; + exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 - exit 0 ;; + exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` @@ -1094,68 +1152,72 @@ else echo ns32k-sni-sysv fi - exit 0 ;; + exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 - exit 0 ;; + exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 - exit 0 ;; + exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 - exit 0 ;; + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos - exit 0 ;; + exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} - exit 0 ;; + exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 - exit 0 ;; + exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi - exit 0 ;; + exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos - exit 0 ;; + exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos - exit 0 ;; + exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos - exit 0 ;; + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} - exit 0 ;; + exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} - exit 0 ;; + exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} - exit 0 ;; + exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; + exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit 0 ;; + exit ;; *:Darwin:*:*) - case `uname -p` in - *86) UNAME_PROCESSOR=i686 ;; - powerpc) UNAME_PROCESSOR=powerpc ;; + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit 0 ;; + exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then @@ -1163,22 +1225,25 @@ UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit 0 ;; + exit ;; *:QNX:*:4*) echo i386-pc-qnx - exit 0 ;; - NSR-[DGKLNPTVWY]:NONSTOP_KERNEL:*:*) + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} - exit 0 ;; + exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux - exit 0 ;; + exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv - exit 0 ;; + exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit 0 ;; + exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 @@ -1189,28 +1254,47 @@ UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 - exit 0 ;; + exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 - exit 0 ;; + exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex - exit 0 ;; + exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 - exit 0 ;; + exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 - exit 0 ;; + exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 - exit 0 ;; + exit ;; *:ITS:*:*) echo pdp10-unknown-its - exit 0 ;; + exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} - exit 0 ;; + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 @@ -1242,7 +1326,7 @@ #endif #if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix"); exit (0); + printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) @@ -1331,11 +1415,12 @@ } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) @@ -1344,22 +1429,22 @@ case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd - exit 0 ;; + exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit 0 ;; + exit ;; c34*) echo c34-convex-bsd - exit 0 ;; + exit ;; c38*) echo c38-convex-bsd - exit 0 ;; + exit ;; c4*) echo c4-convex-bsd - exit 0 ;; + exit ;; esac fi @@ -1370,7 +1455,9 @@ the operating system you are using. It is advised that you download the most up to date version of the config scripts from - ftp://ftp.gnu.org/pub/gnu/config/ + http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess +and + http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub If the version you run ($0) is already up to date, please send the following data and any information you think might be --- krb5-1.4.4.orig/src/config/shlib.conf +++ krb5-1.4.4/src/config/shlib.conf @@ -341,10 +341,10 @@ SHLIB_EXPORT_FILE_DEP=binutils.versions # For cases where we do have dependencies on other libraries # built in this tree... - SHLIB_EXPFLAGS='-Wl,-R$(SHLIB_RDIRS) $(SHLIB_DIRS) $(SHLIB_EXPLIBS)' + SHLIB_EXPFLAGS='$(SHLIB_DIRS) $(SHLIB_EXPLIBS)' PROFFLAGS=-pg - RPATH_FLAG='-Wl,-rpath -Wl,' - CC_LINK_SHARED='$(CC) $(PROG_LIBPATH) $(RPATH_FLAG)$(PROG_RPATH) $(CFLAGS) $(LDFLAGS)' + RPATH_FLAG='' + CC_LINK_SHARED='$(CC) $(PROG_LIBPATH) $(CFLAGS) $(LDFLAGS)' CC_LINK_STATIC='$(CC) $(PROG_LIBPATH) $(CFLAGS) $(LDFLAGS)' RUN_ENV='LD_LIBRARY_PATH=`echo $(PROG_LIBPATH) | sed -e "s/-L//g" -e "s/ /:/g"`; export LD_LIBRARY_PATH;' --- krb5-1.4.4.orig/src/config/config.sub +++ krb5-1.4.4/src/config/config.sub @@ -1,9 +1,9 @@ #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. -timestamp='2003-08-18' +timestamp='2006-02-23' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software @@ -21,14 +21,15 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. + # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # @@ -70,7 +71,7 @@ version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO @@ -83,11 +84,11 @@ while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) - echo "$timestamp" ; exit 0 ;; + echo "$timestamp" ; exit ;; --version | -v ) - echo "$version" ; exit 0 ;; + echo "$version" ; exit ;; --help | --h* | -h ) - echo "$usage"; exit 0 ;; + echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. @@ -99,7 +100,7 @@ *local*) # First pass through any local machine types. echo $1 - exit 0;; + exit ;; * ) break ;; @@ -118,7 +119,9 @@ # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | kfreebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; @@ -144,7 +147,7 @@ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis) + -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; @@ -169,6 +172,10 @@ -hiux*) os=-hiuxwe2 ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` @@ -185,6 +192,10 @@ # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` @@ -230,13 +241,14 @@ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ - | m32r | m68000 | m68k | m88k | mcore \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -245,6 +257,7 @@ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ @@ -253,23 +266,29 @@ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ + | mt \ | msp430 \ + | nios | nios2 \ | ns16k | ns32k \ - | openrisc | or32 \ + | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ - | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ - | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ - | x86 | xscale | xstormy16 | xtensa \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; + m32c) + basic_machine=$basic_machine-unknown + ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown @@ -277,6 +296,9 @@ ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; + ms1) + basic_machine=mt-unknown + ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and @@ -297,9 +319,9 @@ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ - | bs2000-* \ + | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | cydra-* \ + | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ @@ -307,9 +329,9 @@ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ - | m32r-* \ + | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | mcore-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -318,6 +340,7 @@ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ @@ -325,27 +348,33 @@ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ | msp430-* \ - | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ - | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ - | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ - | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ - | xtensa-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; + m32c-*) + ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) @@ -362,6 +391,9 @@ basic_machine=a29k-amd os=-udi ;; + abacus) + basic_machine=abacus-unknown + ;; adobe68k) basic_machine=m68010-adobe os=-scout @@ -379,6 +411,9 @@ amd64) basic_machine=x86_64-pc ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; amdahl) basic_machine=580-amdahl os=-sysv @@ -438,12 +473,27 @@ basic_machine=j90-cray os=-unicos ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; crds | unos) basic_machine=m68k-crds ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; da30 | da30-*) basic_machine=m68k-da30 ;; @@ -466,6 +516,10 @@ basic_machine=m88k-motorola os=-sysv3 ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx @@ -644,10 +698,6 @@ mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; - mmix*) - basic_machine=mmix-knuth - os=-mmixware - ;; monitor) basic_machine=m68k-rom68k os=-coff @@ -660,6 +710,9 @@ basic_machine=i386-pc os=-msdos ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; mvs) basic_machine=i370-ibm os=-mvs @@ -728,10 +781,6 @@ np1) basic_machine=np1-gould ;; - nv1) - basic_machine=nv1-cray - os=-unicosmp - ;; nsr-tandem) basic_machine=nsr-tandem ;; @@ -739,9 +788,12 @@ basic_machine=hppa1.1-oki os=-proelf ;; - or32 | or32-*) + openrisc | openrisc-*) basic_machine=or32-unknown - os=-coff + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson @@ -768,6 +820,12 @@ pc532 | pc532-*) basic_machine=ns32k-pc532 ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; @@ -824,6 +882,10 @@ basic_machine=i586-unknown os=-pw32 ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; rom68k) basic_machine=m68k-rom68k os=-coff @@ -963,6 +1025,10 @@ tower | tower-32) basic_machine=m68k-ncr ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; udi29k) basic_machine=a29k-amd os=-udi @@ -1006,6 +1072,10 @@ basic_machine=hppa1.1-winbond os=-proelf ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; xps | xps100) basic_machine=xps100-honeywell ;; @@ -1036,6 +1106,9 @@ romp) basic_machine=romp-ibm ;; + mmix) + basic_machine=mmix-knuth + ;; rs6000) basic_machine=rs6000-ibm ;; @@ -1052,13 +1125,10 @@ we32k) basic_machine=we32k-att ;; - sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; - sh64) - basic_machine=sh64-unknown - ;; - sparc | sparcv9 | sparcv9b) + sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) @@ -1131,19 +1201,23 @@ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) @@ -1161,7 +1235,7 @@ os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) @@ -1182,6 +1256,9 @@ -opened*) os=-openedition ;; + -os400*) + os=-os400 + ;; -wince*) os=-wince ;; @@ -1203,6 +1280,9 @@ -atheos*) os=-atheos ;; + -syllable*) + os=-syllable + ;; -386bsd) os=-bsd ;; @@ -1225,6 +1305,9 @@ -sinix*) os=-sysv4 ;; + -tpf*) + os=-tpf + ;; -triton*) os=-sysv3 ;; @@ -1261,6 +1344,9 @@ -kaos*) os=-kaos ;; + -zvmoe) + os=-zvmoe + ;; -none) ;; *) @@ -1338,9 +1424,15 @@ *-be) os=-beos ;; + *-haiku) + os=-haiku + ;; *-ibm) os=-aix ;; + *-knuth) + os=-mmixware + ;; *-wec) os=-proelf ;; @@ -1473,9 +1565,15 @@ -mvs* | -opened*) vendor=ibm ;; + -os400*) + vendor=ibm + ;; -ptx*) vendor=sequent ;; + -tpf*) + vendor=ibm + ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; @@ -1500,7 +1598,7 @@ esac echo $basic_machine$os -exit 0 +exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) --- krb5-1.4.4.orig/src/lib/krb4/kuserok.c +++ krb5-1.4.4/src/lib/krb4/kuserok.c @@ -57,6 +57,10 @@ #define NOTOK 1 #define MAX_USERNAME 10 +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + /* * Given a Kerberos principal "kdata", and a local username "luser", * determine whether user is authorized to login according to the @@ -161,6 +165,7 @@ uid_t old_euid = geteuid(); if (seteuid(pwd->pw_uid) < 0) return NOTOK; + fp = fopen(pbuf, "r"); if (seteuid(old_euid) < 0) return NOTOK; --- krb5-1.4.4.orig/src/lib/krb4/g_phost.c +++ krb5-1.4.4/src/lib/krb4/g_phost.c @@ -48,6 +48,10 @@ * to the original "alias" argument is returned. */ +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + char * KRB5_CALLCONV krb_get_phost(alias) char *alias; --- krb5-1.4.4.orig/src/lib/krb4/tkt_string.c +++ krb5-1.4.4/src/lib/krb4/tkt_string.c @@ -44,6 +44,10 @@ uid_t getuid(void) { return 0; } #endif /* _WIN32 */ +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + /* * This routine is used to generate the name of the file that holds * the user's cache of server tickets and associated session keys. --- krb5-1.4.4.orig/src/lib/krb4/memcache.c +++ krb5-1.4.4/src/lib/krb4/memcache.c @@ -470,7 +470,7 @@ int lifetime; /* Lifetime */ int kvno; /* Key version number */ KTEXT ticket; /* The ticket itself */ - long issue_date; /* The issue time */ + KRB4_32 issue_date; /* The issue time */ KRB_UINT32 laddr; { CREDENTIALS cr; @@ -500,7 +500,7 @@ int lifetime, int kvno, KTEXT ticket, - long issue_date) + KRB4_32 issue_date) { return krb4int_save_credentials_addr(name, inst, realm, session, lifetime, kvno, ticket, --- krb5-1.4.4.orig/src/lib/krb4/tf_util.c +++ krb5-1.4.4/src/lib/krb4/tf_util.c @@ -28,6 +28,8 @@ #include "k5-int.h" #include "krb4int.h" +#include "../crypto/aes/aesopt.h" + #include #include #include @@ -43,6 +45,8 @@ #include #endif /* TKT_SHMEM */ + + #define TOO_BIG -1 #define TF_LCK_RETRY ((unsigned)2) /* seconds to sleep before * retry if ticket file is @@ -93,6 +97,165 @@ #endif #endif + +#if (PLATFORM_BYTE_ORDER == AES_LITTLE_ENDIAN) +/* This was taken from jhutz's patch for heimdal krb4. It only + * applies to little endian systems. Big endian systems have a + * less elegant solution documented below. + * + * This record is written after every real ticket, to ensure that + * both 32- and 64-bit readers will perceive the next real ticket + * as starting in the same place. This record looks like a ticket + * with the following properties: + * Field 32-bit 64-bit + * ============ ================= ================= + * sname "." "." + * sinst "" "" + * srealm ".." ".." + * session key 002E2E00 xxxxxxxx xxxxxxxx 00000000 + * lifetime 0 0 + * kvno 0 12 + * ticket 12 nulls 4 nulls + * issue 0 0 + * + * Our code always reads and writes the 32-bit format, but knows + * to skip 00000000 at the front of a record, and to completely + * ignore tickets for the special alignment principal. + */ +static unsigned char align_rec[] = { + 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0x00, 0x2e, + 0x2e, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00 +}; + +#else /* Big Endian */ + +/* These alignment records are for big endian systems. We need more + * of them because the portion of the 64-bit issue_date that overlaps + * with the start of a ticket on 32-bit systems contains an unpredictable + * number of NULL bytes. Preceeding these records is a second copy of the + * 32-bit issue_date. The srealm for the alignment records is always one of + * ".." or "?.." + */ + +/* No NULL bytes + * This is actually two alignment records since both 32- and 64-bit + * readers will agree on everything in the first record up through the + * issue_date size, except where sname starts. + * Field (1) 32-bit 64-bit + * ============ ================= ================= + * sname "????." "." + * sinst "" "" + * srealm ".." ".." + * session key 00000000 xxxxxxxx 00000000 xxxxxxxx + * lifetime 0 0 + * kvno 0 0 + * ticket 4 nulls 4 nulls + * issue 0 0 + * + * Field (2) 32-bit 64-bit + * ============ ================= ================= + * sname "." "." + * sinst "" "" + * srealm ".." ".." + * session key 002E2E00 xxxxxxxx xxxxxxxx 00000000 + * lifetime 0 0 + * kvno 0 12 + * ticket 12 nulls 4 nulls + * issue 0 0 + * + */ +static unsigned char align_rec_0[] = { + 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, + 0x00, 0x2e, 0x2e, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; + +/* One NULL byte + * Field 32-bit 64-bit + * ============ ================= ================= + * sname "x" |"xx"|"xxx" "." + * sinst "xx."|"x."|"." ".." + * srealm ".." "..." + * session key 2E2E2E00 xxxxxxxx xxxxxxxx 00000000 + * lifetime 0 0 + * kvno 0 12 + * ticket 12 nulls 4 nulls + * issue 0 0 + */ +static unsigned char align_rec_1[] = { + 0x2e, 0x00, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00 +}; + +/* Two NULL bytes + * Field 32-bit 64-bit + * ============ ================= ================= + * sname "x" |"x" |"xx" ".." + * sinst "" |"x" |"" "" + * srealm "x.."|".."|".." ".." + * session key 002E2E00 xxxxxxxx xxxxxxxx 00000000 + * lifetime 0 0 + * kvno 0 12 + * ticket 12 nulls 4 nulls + * issue 0 0 + */ + static unsigned char align_rec_2[] = { + 0x2e, 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* Three NULL bytes + * Things break here for 32-bit krb4 libraries that don't + * understand this alignment record. We can't really do + * anything about the fact that the three strings ended + * in the duplicate timestamp. The good news is that this + * only happens once every 0x1000000 seconds, once roughly + * every six and a half months. We'll live. + * + * Discussion on the krbdev list has suggested the + * issue_date be incremented by one in this case to avoid + * the problem. I'm leaving this here just in case. + * + * Field 32-bit 64-bit + * ============ ================= ================= + * sname "" "." + * sinst "" "" + * srealm "" ".." + * session key 2E00002E 2E00FFFF xxxx0000 0000xxxx + * lifetime 0 0 + * kvno 4294901760 917504 + * ticket 14 nulls 4 nulls + * issue 0 0 + */ +/* +static unsigned char align_rec_3[] = { + 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +*/ +#endif /* (PLATFORM_BYTE_ORDER == AES_LITTLE_ENDIAN) */ + /* * fd must be initialized to something that won't ever occur as a real * file descriptor. Since open(2) returns only non-negative numbers as @@ -136,7 +299,7 @@ * int lifetime * int kvno * KTEXT_ST ticket_st - * long issue_date + * KRB4_32 issue_date * * Strings are stored NUL-terminated, and read back until a NUL is * found or the indicated number of bytes have been read. (So if you @@ -519,19 +682,43 @@ * EOF - end of file encountered */ -int KRB5_CALLCONV tf_get_cred(c) +int KRB5_CALLCONV real_tf_get_cred(c) CREDENTIALS *c; { KTEXT ticket = &c->ticket_st; /* pointer to ticket */ int k_errno; - long issue_date; + unsigned char nullbuf[3]; /* used for 64-bit issue_date tf compatibility */ if (fd < 0) { if (krb_debug) fprintf(stderr, "tf_get_cred called before tf_init.\n"); return TKT_FIL_INI; } - if ((k_errno = tf_gets(c->service, SNAME_SZ)) < 2) + if ((k_errno = tf_gets(c->service, SNAME_SZ)) < 2) { + +#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) + /* If we're big endian then we can have a null service name as part of + * an alignment record. */ + if (k_errno < 2) + switch (k_errno) { + case TOO_BIG: + tf_close(); + return TKT_FIL_FMT; + case 0: + return EOF; + } +#else /* Little Endian */ + /* If we read an empty service name, it's possible that's because + * the file was written by someone who thinks issue_date should be + * 64 bits. If that is the case, there will be three more zeros, + * followed by the real record.*/ + + if (k_errno == 1 && + tf_read(nullbuf, 3) == 3 && + !nullbuf[0] && !nullbuf[1] && !nullbuf[2]) + k_errno = tf_gets(c->service, SNAME_SZ); + + if (k_errno < 2) switch (k_errno) { case TOO_BIG: case 1: /* can't be just a null */ @@ -540,6 +727,9 @@ case 0: return EOF; } +#endif /*(PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN)*/ + + } if ((k_errno = tf_gets(c->instance, INST_SZ)) < 1) switch (k_errno) { case TOO_BIG: @@ -547,7 +737,7 @@ case 0: return EOF; } - if ((k_errno = tf_gets(c->realm, REALM_SZ)) < 2) + if ((k_errno = tf_gets(c->realm, REALM_SZ)) < 2) { switch (k_errno) { case TOO_BIG: case 1: /* can't be just a null */ @@ -556,6 +746,8 @@ case 0: return EOF; } + } + if ( tf_read((char *) (c->session), KEY_SZ) < 1 || tf_read((char *) &(c->lifetime), sizeof(c->lifetime)) < 1 || @@ -565,12 +757,74 @@ /* don't try to read a silly amount into ticket->dat */ ticket->length > MAX_KTXT_LEN || tf_read((char *) (ticket->dat), ticket->length) < 1 || - tf_read((char *) &(issue_date), sizeof(issue_date)) < 1 + tf_read((char *) &(c->issue_date), sizeof(c->issue_date)) < 1 ) { tf_close(); return TKT_FIL_FMT; } - c->issue_date = issue_date; + +#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) + /* If the issue_date is 0 and we're not dealing with an alignment + record, then it's likely we've run into an issue_date written by + a 64-bit library that is using long instead of KRB4_32. Let's get + the next four bytes instead. + */ + if (0 == c->issue_date) { + int len = strlen(c->realm); + if (!(2 == len && 0 == strcmp(c->realm, "..")) && + !(3 == len && 0 == strcmp(c->realm + 1, ".."))) { + if (tf_read((char *) &(c->issue_date), sizeof(c->issue_date)) < 1) { + tf_close(); + return TKT_FIL_FMT; + } + } + } + +#endif + + return KSUCCESS; +} + +int KRB5_CALLCONV tf_get_cred(c) + CREDENTIALS *c; +{ + int k_errno; + int fake; + + do { + fake = 0; + k_errno = real_tf_get_cred(c); + if (k_errno) + return k_errno; + +#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) + /* Here we're checking to see if the realm is one of the + * alignment record realms, ".." or "?..", so we can skip it. + * If it's not, then we need to verify that the service name + * was not null as this should be a valid ticket. + */ + { + int len = strlen(c->realm); + if (2 == len && 0 == strcmp(c->realm, "..")) + fake = 1; + if (3 == len && 0 == strcmp(c->realm + 1, "..")) + fake = 1; + if (!fake && 0 == strlen(c->service)) { + tf_close(); + return TKT_FIL_FMT; + } + } +#else /* Little Endian */ + /* Here we're checking to see if the service principal is the + * special alignment record principal ".@..", so we can skip it. + */ + if (strcmp(c->service, ".") == 0 && + strcmp(c->instance, "") == 0 && + strcmp(c->realm, "..") == 0) + fake = 1; +#endif /* (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) */ + } while (fake); + #ifdef TKT_SHMEM memcpy(c->session, tmp_shm_addr, KEY_SZ); tmp_shm_addr += KEY_SZ; @@ -711,7 +965,7 @@ int lifetime; /* Lifetime */ int kvno; /* Key version number */ KTEXT ticket; /* The ticket itself */ - long issue_date; /* The issue time */ + KRB4_32 issue_date; /* The issue time */ { off_t lseek(); @@ -777,9 +1031,65 @@ if (write(fd, (char *) (ticket->dat), count) != count) goto bad; /* Issue date */ - if (write(fd, (char *) &issue_date, sizeof(long)) - != sizeof(long)) + if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) + != sizeof(KRB4_32)) + goto bad; + /* Alignment Record */ +#if (PLATFORM_BYTE_ORDER == AES_BIG_ENDIAN) + { + int null_bytes = 0; + if (0 == (issue_date & 0xff000000)) + ++null_bytes; + if (0 == (issue_date & 0x00ff0000)) + ++null_bytes; + if (0 == (issue_date & 0x0000ff00)) + ++null_bytes; + if (0 == (issue_date & 0x000000ff)) + ++null_bytes; + + switch(null_bytes) { + case 0: + /* Issue date */ + if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) + != sizeof(KRB4_32)) + goto bad; + if (write(fd, align_rec_0, sizeof(align_rec_0)) + != sizeof(align_rec_0)) + goto bad; + break; + + case 1: + if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) + != sizeof(KRB4_32)) + goto bad; + if (write(fd, align_rec_1, sizeof(align_rec_1)) + != sizeof(align_rec_1)) + goto bad; + break; + + case 3: + /* Three NULLS are troublesome but rare. We'll just pretend + * they don't exist by decrementing the issue_date. + */ + --issue_date; + case 2: + if (write(fd, (char *) &issue_date, sizeof(KRB4_32)) + != sizeof(KRB4_32)) + goto bad; + if (write(fd, align_rec_2, sizeof(align_rec_2)) + != sizeof(align_rec_2)) + goto bad; + break; + + default: + goto bad; + } + + } +#else + if (write(fd, align_rec, sizeof(align_rec)) != sizeof(align_rec)) goto bad; +#endif /* Actually, we should check each write for success */ return (KSUCCESS); --- krb5-1.4.4.orig/src/lib/krb4/RealmsConfig-glue.c +++ krb5-1.4.4/src/lib/krb4/RealmsConfig-glue.c @@ -45,6 +45,10 @@ #include "krb5.h" #undef KRB5_PRIVATE +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + /* These two *must* be kept in sync to avoid buffer overflows. */ #define SCNSCRATCH "%1023s" #define SCRATCHSZ 1024 --- krb5-1.4.4.orig/src/lib/krb4/krb4int.h +++ krb5-1.4.4/src/lib/krb4/krb4int.h @@ -90,7 +90,9 @@ char *krb_stime(long *); /* tf_util.c */ -int tf_save_cred(char *, char *, char *, C_Block, int , int, KTEXT, long); +int tf_save_cred(char *, char *, char *, C_Block, int , int, KTEXT, KRB4_32); +int KRB5_CALLCONV real_tf_get_cred(CREDENTIALS *c); + /* unix_glue.c */ int krb_start_session(char *); @@ -112,7 +114,7 @@ void krb4int_et_fini(void); int krb4int_save_credentials_addr( - char *, char *, char *, C_Block, int, int, KTEXT, long, KRB_UINT32); + char *, char *, char *, C_Block, int, int, KTEXT, KRB4_32, KRB_UINT32); int krb4int_send_to_kdc_addr(KTEXT, KTEXT, char *, struct sockaddr *, socklen_t *); --- krb5-1.4.4.orig/src/lib/krb4/send_to_kdc.c +++ krb5-1.4.4/src/lib/krb4/send_to_kdc.c @@ -55,6 +55,10 @@ static char *prog = "send_to_kdc"; #endif +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + /* * send_to_kdc() sends a message to the Kerberos authentication * server(s) in the given realm and returns the reply message. --- krb5-1.4.4.orig/src/lib/krb4/g_in_tkt.c +++ krb5-1.4.4/src/lib/krb4/g_in_tkt.c @@ -406,6 +406,8 @@ CREDENTIALS *creds; KRB_UINT32 *laddrp; { + int ok; + char key_string[BUFSIZ]; KTEXT_ST cip_st; KTEXT cip = &cip_st; /* Returned Ciphertext */ int kerror; @@ -420,6 +422,23 @@ cip, &byteorder, &local_addr); if (kerror) return kerror; + + /* If arg is null, we have to prompt for the password. decrypt_tkt, by + way of the *_passwd_to_key functions, will prompt if the password is + NULL, but that means that each separate encryption type will prompt + separately. Obtain the password first so that we can try multiple + encryption types without re-prompting. + + Don't, however, prompt on a Windows or Macintosh environment, since + that's harder. Rely on our caller to do it. */ +#if !(defined(_WIN32) || defined(USE_LOGIN_LIBRARY)) + if (arg == NULL) { + ok = des_read_pw_string(key_string, sizeof(key_string), "Password", 0); + if (ok != 0) + return ok; + arg = key_string; + } +#endif /* Attempt to decrypt the reply. Loop trying password_to_key algorithms until we succeed or we get an error other than "bad password" */ @@ -443,6 +462,7 @@ } /* stomp stomp stomp */ + memset(key_string, 0, sizeof(key_string)); memset(cip->dat, 0, (size_t)cip->length); return kerror; } --- krb5-1.4.4.orig/src/lib/krb4/g_cnffile.c +++ krb5-1.4.4/src/lib/krb4/g_cnffile.c @@ -20,6 +20,10 @@ #include "k5-int.h" #include "krb4int.h" +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + krb5_context krb5__krb4_context = 0; static FILE* --- krb5-1.4.4.orig/src/lib/krb4/save_creds.c +++ krb5-1.4.4/src/lib/krb4/save_creds.c @@ -54,7 +54,7 @@ int lifetime; /* Lifetime */ int kvno; /* Key version number */ KTEXT ticket; /* The ticket itself */ - long issue_date; /* The issue time */ + KRB4_32 issue_date; /* The issue time */ KRB_UINT32 local_addr; { int tf_status; /* return values of the tf_util calls */ @@ -83,5 +83,5 @@ { return krb4int_save_credentials_addr(service, instance, realm, session, lifetime, kvno, - ticket, issue_date, 0); + ticket, (KRB4_32)issue_date, 0); } --- krb5-1.4.4.orig/src/lib/kdb/fetch_mkey.c +++ krb5-1.4.4/src/lib/kdb/fetch_mkey.c @@ -80,6 +80,10 @@ #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + krb5_error_code krb5_db_fetch_mkey(context, mname, etype, fromkeyboard, twice, keyfile, salt, key) --- krb5-1.4.4.orig/src/lib/kadm5/logger.c +++ krb5-1.4.4/src/lib/kadm5/logger.c @@ -45,7 +45,7 @@ #include #endif /* HAVE_STDARG_H */ -#define KRB5_KLOG_MAX_ERRMSG_SIZE 1024 +#define KRB5_KLOG_MAX_ERRMSG_SIZE 2048 #ifndef MAXHOSTNAMELEN #define MAXHOSTNAMELEN 256 #endif /* MAXHOSTNAMELEN */ @@ -256,7 +256,9 @@ #endif /* HAVE_SYSLOG */ /* Now format the actual message */ -#if HAVE_VSPRINTF +#if HAVE_VSNPRINTF + vsnprintf(cp, sizeof(outbuf) - (cp - outbuf), actual_format, ap); +#elif HAVE_VSPRINTF vsprintf(cp, actual_format, ap); #else /* HAVE_VSPRINTF */ sprintf(cp, actual_format, ((int *) ap)[0], ((int *) ap)[1], @@ -843,7 +845,9 @@ syslogp = &outbuf[strlen(outbuf)]; /* Now format the actual message */ -#ifdef HAVE_VSPRINTF +#ifdef HAVE_VSNPRINTF + vsnprintf(syslogp, sizeof(outbuf) - (syslogp - outbuf), format, arglist); +#elif HAVE_VSPRINTF vsprintf(syslogp, format, arglist); #else /* HAVE_VSPRINTF */ sprintf(syslogp, format, ((int *) arglist)[0], ((int *) arglist)[1], --- krb5-1.4.4.orig/src/lib/rpc/svc_auth_gssapi.c +++ krb5-1.4.4/src/lib/rpc/svc_auth_gssapi.c @@ -148,6 +148,8 @@ rqst->rq_xprt->xp_auth = &svc_auth_none; memset((char *) &call_res, 0, sizeof(call_res)); + creds.client_handle.length = 0; + creds.client_handle.value = NULL; cred = &msg->rm_call.cb_cred; verf = &msg->rm_call.cb_verf; --- krb5-1.4.4.orig/src/lib/rpc/svc_tcp.c +++ krb5-1.4.4/src/lib/rpc/svc_tcp.c @@ -52,6 +52,14 @@ extern errno; */ +#ifndef FD_SETSIZE +#ifdef NBBY +#define NOFILE (sizeof(int) * NBBY) +#else +#define NOFILE (sizeof(int) * 8) +#endif +#endif + /* * Ops vector for TCP/IP based rpc service handle */ @@ -212,6 +220,19 @@ register SVCXPRT *xprt; register struct tcp_conn *cd; +#ifdef FD_SETSIZE + if (fd >= FD_SETSIZE) { + (void) fprintf(stderr, "svc_tcp: makefd_xprt: fd too high\n"); + xprt = NULL; + goto done; + } +#else + if (fd >= NOFILE) { + (void) fprintf(stderr, "svc_tcp: makefd_xprt: fd too high\n"); + xprt = NULL; + goto done; + } +#endif xprt = (SVCXPRT *)mem_alloc(sizeof(SVCXPRT)); if (xprt == (SVCXPRT *)NULL) { (void) fprintf(stderr, "svc_tcp: makefd_xprt: out of memory\n"); @@ -267,6 +288,10 @@ * make a new transporter (re-uses xprt) */ xprt = makefd_xprt(sock, r->sendsize, r->recvsize); + if (xprt == NULL) { + close(sock); + return (FALSE); + } xprt->xp_raddr = addr; xprt->xp_addrlen = len; xprt->xp_laddr = laddr; --- krb5-1.4.4.orig/src/lib/rpc/svc_auth_unix.c +++ krb5-1.4.4/src/lib/rpc/svc_auth_unix.c @@ -64,8 +64,7 @@ char area_machname[MAX_MACHINE_NAME+1]; int area_gids[NGRPS]; } *area; - u_int auth_len; - int str_len, gid_len; + u_int auth_len, str_len, gid_len; register int i; rqst->rq_xprt->xp_auth = &svc_auth_none; @@ -74,7 +73,9 @@ aup = &area->area_aup; aup->aup_machname = area->area_machname; aup->aup_gids = area->area_gids; - auth_len = (u_int)msg->rm_call.cb_cred.oa_length; + auth_len = msg->rm_call.cb_cred.oa_length; + if (auth_len > INT_MAX) + return AUTH_BADCRED; xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len,XDR_DECODE); buf = XDR_INLINE(&xdrs, (int)auth_len); if (buf != NULL) { @@ -84,7 +85,7 @@ stat = AUTH_BADCRED; goto done; } - memmove(aup->aup_machname, (caddr_t)buf, (u_int)str_len); + memmove(aup->aup_machname, buf, str_len); aup->aup_machname[str_len] = 0; str_len = RNDUP(str_len); buf += str_len / BYTES_PER_XDR_UNIT; @@ -104,7 +105,7 @@ * timestamp, hostname len (0), uid, gid, and gids len (0). */ if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) { - (void) printf("bad auth_len gid %d str %d auth %d\n", + (void) printf("bad auth_len gid %u str %u auth %u\n", gid_len, str_len, auth_len); stat = AUTH_BADCRED; goto done; --- krb5-1.4.4.orig/src/lib/rpc/svc_auth_gss.c +++ krb5-1.4.4/src/lib/rpc/svc_auth_gss.c @@ -355,6 +355,14 @@ memset(rpchdr, 0, sizeof(rpchdr)); /* XXX - Reconstruct RPC header for signing (from xdr_callmsg). */ + oa = &msg->rm_call.cb_cred; + if (oa->oa_length > MAX_AUTH_BYTES) + return (FALSE); + + if (sizeof(rpchdr) < (8 * BYTES_PER_XDR_UNIT + + RNDUP(oa->oa_length))) + return (FALSE); + buf = (int32_t *)(void *)rpchdr; IXDR_PUT_LONG(buf, msg->rm_xid); IXDR_PUT_ENUM(buf, msg->rm_direction); @@ -362,7 +370,6 @@ IXDR_PUT_LONG(buf, msg->rm_call.cb_prog); IXDR_PUT_LONG(buf, msg->rm_call.cb_vers); IXDR_PUT_LONG(buf, msg->rm_call.cb_proc); - oa = &msg->rm_call.cb_cred; IXDR_PUT_ENUM(buf, oa->oa_flavor); IXDR_PUT_LONG(buf, oa->oa_length); if (oa->oa_length) { --- krb5-1.4.4.orig/src/lib/rpc/svc.c +++ krb5-1.4.4/src/lib/rpc/svc.c @@ -108,15 +108,17 @@ if (sock < FD_SETSIZE) { xports[sock] = xprt; FD_SET(sock, &svc_fdset); + if (sock > svc_maxfd) + svc_maxfd = sock; } #else if (sock < NOFILE) { xports[sock] = xprt; svc_fds |= (1 << sock); + if (sock > svc_maxfd) + svc_maxfd = sock; } #endif /* def FD_SETSIZE */ - if (sock > svc_maxfd) - svc_maxfd = sock; } /* @@ -436,6 +438,8 @@ #endif } +extern struct svc_auth_ops svc_auth_gss_ops; + static void svc_do_xprt(SVCXPRT *xprt) { @@ -517,6 +521,9 @@ if ((stat = SVC_STAT(xprt)) == XPRT_DIED){ SVC_DESTROY(xprt); break; + } else if ((xprt->xp_auth != NULL) && + (xprt->xp_auth->svc_ah_ops != &svc_auth_gss_ops)) { + xprt->xp_auth = NULL; } } while (stat == XPRT_MOREREQS); --- krb5-1.4.4.orig/src/lib/krb5/keytab/kt_file.c +++ krb5-1.4.4/src/lib/krb5/keytab/kt_file.c @@ -1107,7 +1107,10 @@ } else { /* gotta verify it instead... */ if (!xfread(&kt_vno, sizeof(kt_vno), 1, KTFILEP(id))) { - kerror = errno; + if (feof(KTFILEP(id))) + kerror = KRB5_KEYTAB_BADVNO; + else + kerror = errno; (void) krb5_unlock_file(context, fileno(KTFILEP(id))); (void) fclose(KTFILEP(id)); return kerror; --- krb5-1.4.4.orig/src/lib/krb5/krb/gc_frm_kdc.c +++ krb5-1.4.4/src/lib/krb5/krb/gc_frm_kdc.c @@ -364,6 +364,7 @@ } tgt = *ret_tgts[ntgts++]; + free_tgt = 0; } /* got one as close as possible, now start all over */ @@ -412,12 +413,11 @@ krb5_free_creds(context, tgtr); tgtr = NULL; - if (free_tgt) { + if (free_tgt) krb5_free_cred_contents(context, &tgt); - free_tgt = 0; - } tgt = *ret_tgts[ntgts++]; + free_tgt = 0; /* we're done if it is the target */ --- krb5-1.4.4.orig/src/lib/krb5/krb/ChangeLog +++ krb5-1.4.4/src/lib/krb5/krb/ChangeLog @@ -1,3 +1,9 @@ +2005-11-17 Jeffrey Altman + + * gc_frm_kdc.c (krb5_get_cred_from_kdc_opt): + properly track the state of 'tgt' via 'free_tgt' so that + we can avoid double-free'ing memory when we return to + krb5_get_credentials(). 2005-12-28 Tom Yu * gc_frm_kdc.c (krb5_get_cred_from_kdc_opt): Cause free_tgt and --- krb5-1.4.4.orig/src/lib/krb5/os/kuserok.c +++ krb5-1.4.4/src/lib/krb5/os/kuserok.c @@ -40,6 +40,10 @@ #define MAX_USERNAME 65 +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif + /* * Given a Kerberos principal "principal", and a local username "luser", * determine whether user is authorized to login according to the --- krb5-1.4.4.orig/src/lib/krb5/os/sn2princ.c +++ krb5-1.4.4/src/lib/krb5/os/sn2princ.c @@ -61,6 +61,10 @@ } +#ifndef MAXHOSTNAMELEN +# define MAXHOSTNAMELEN 256 +#endif + krb5_error_code KRB5_CALLCONV krb5_sname_to_principal(krb5_context context, const char *hostname, const char *sname, krb5_int32 type, krb5_principal *ret_princ) { --- krb5-1.4.4.orig/src/lib/gssapi/mechglue/g_init_sec_context.c +++ krb5-1.4.4/src/lib/gssapi/mechglue/g_init_sec_context.c @@ -77,6 +77,8 @@ gss_cred_id_t input_cred_handle; gss_initialize(); + output_token->length = 0; + output_token->value = NULL; if (context_handle == NULL) return GSS_S_NO_CONTEXT; --- krb5-1.4.4.orig/src/lib/gssapi/krb5/k5unseal.c +++ krb5-1.4.4/src/lib/gssapi/krb5/k5unseal.c @@ -457,8 +457,11 @@ if ((ctx->initiate && direction != 0xff) || (!ctx->initiate && direction != 0)) { - if (toktype == KG_TOK_SEAL_MSG) + if (toktype == KG_TOK_SEAL_MSG) { xfree(token.value); + message_buffer->value = NULL; + message_buffer->length = 0; + } *minor_status = G_BAD_DIRECTION; return(GSS_S_BAD_SIG); } --- krb5-1.4.4.orig/src/lib/gssapi/krb5/canon_name.c +++ krb5-1.4.4/src/lib/gssapi/krb5/canon_name.c @@ -34,7 +34,8 @@ const gss_OID mech_type, gss_name_t *output_name) { - if (!g_OID_equal(gss_mech_krb5, mech_type) && + if ((GSS_C_NO_OID != mech_type) && + !g_OID_equal(gss_mech_krb5, mech_type) && !g_OID_equal(gss_mech_krb5_old, mech_type)) { *minor_status = 0; return(GSS_S_BAD_MECH); --- krb5-1.4.4.orig/src/lib/crypto/aes/test/ecb_e_m.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/ecb_e_m.txt @@ -1,6024 +1,6024 @@ - -========================= - -FILENAME: "ecb_e_m.txt" - -Electronic Codebook (ECB) Mode - ENCRYPTION -Monte Carlo Test - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========================= - -KEYSIZE=128 - -I=0 -KEY=00000000000000000000000000000000 -PT=00000000000000000000000000000000 -CT=C34C052CC0DA8D73451AFE5F03BE297F - -I=1 -KEY=C34C052CC0DA8D73451AFE5F03BE297F -PT=C34C052CC0DA8D73451AFE5F03BE297F -CT=0AC15A9AFBB24D54AD99E987208272E2 - -I=2 -KEY=C98D5FB63B68C027E88317D8233C5B9D -PT=0AC15A9AFBB24D54AD99E987208272E2 -CT=A3D43BFFA65D0E80092F67A314857870 - -I=3 -KEY=6A5964499D35CEA7E1AC707B37B923ED -PT=A3D43BFFA65D0E80092F67A314857870 -CT=355F697E8B868B65B25A04E18D782AFA - -I=4 -KEY=5F060D3716B345C253F6749ABAC10917 -PT=355F697E8B868B65B25A04E18D782AFA -CT=ACC863637868E3E068D2FD6E3508454A - -I=5 -KEY=F3CE6E546EDBA6223B2489F48FC94C5D -PT=ACC863637868E3E068D2FD6E3508454A -CT=665F9F12A824F3D52A1C71D6210D5470 - -I=6 -KEY=9591F146C6FF55F71138F822AEC4182D -PT=665F9F12A824F3D52A1C71D6210D5470 -CT=9B27361DBC8E5618E8E98036F5AD40B0 - -I=7 -KEY=0EB6C75B7A7103EFF9D178145B69589D -PT=9B27361DBC8E5618E8E98036F5AD40B0 -CT=21D9BD7EBA0163A293F2D56C316CBD36 - -I=8 -KEY=2F6F7A25C070604D6A23AD786A05E5AB -PT=21D9BD7EBA0163A293F2D56C316CBD36 -CT=3E8037A9988E28FF81F2A7154ACD91BE - -I=9 -KEY=11EF4D8C58FE48B2EBD10A6D20C87415 -PT=3E8037A9988E28FF81F2A7154ACD91BE -CT=014EE14F1AA8C0D4A47A72F197F4DCB0 - -I=10 -KEY=10A1ACC3425688664FAB789CB73CA8A5 -PT=014EE14F1AA8C0D4A47A72F197F4DCB0 -CT=0B542083DBC03A96AA00C1A5AE58C9F1 - -I=11 -KEY=1BF58C409996B2F0E5ABB93919646154 -PT=0B542083DBC03A96AA00C1A5AE58C9F1 -CT=7340B59E1E3BB9211CE167F2DEBDB090 - -I=12 -KEY=68B539DE87AD0BD1F94ADECBC7D9D1C4 -PT=7340B59E1E3BB9211CE167F2DEBDB090 -CT=67E05F75135BA834CBCDCFF068541BBE - -I=13 -KEY=0F5566AB94F6A3E53287113BAF8DCA7A -PT=67E05F75135BA834CBCDCFF068541BBE -CT=8BD5553105C3507B0A07FDB351B25B4F - -I=14 -KEY=8480339A9135F39E3880EC88FE3F9135 -PT=8BD5553105C3507B0A07FDB351B25B4F -CT=649F061F95C0A79BD3066EFFE5B27CAB - -I=15 -KEY=E01F358504F55405EB8682771B8DED9E -PT=649F061F95C0A79BD3066EFFE5B27CAB -CT=697F4EB0603340E90FE91C27B6D9CEAA - -I=16 -KEY=89607B3564C614ECE46F9E50AD542334 -PT=697F4EB0603340E90FE91C27B6D9CEAA -CT=A8CBBA624FA28A7F8637324E1E20CB9C - -I=17 -KEY=21ABC1572B649E936258AC1EB374E8A8 -PT=A8CBBA624FA28A7F8637324E1E20CB9C -CT=73B852132DE715872A40EB25B1133C00 - -I=18 -KEY=5213934406838B144818473B0267D4A8 -PT=73B852132DE715872A40EB25B1133C00 -CT=1328A1C2F386BB3E4D4BE0942B8249A2 - -I=19 -KEY=413B3286F505302A0553A7AF29E59D0A -PT=1328A1C2F386BB3E4D4BE0942B8249A2 -CT=06F72DEA0067F543AA8C342CC9191745 - -I=20 -KEY=47CC1F6CF562C569AFDF9383E0FC8A4F -PT=06F72DEA0067F543AA8C342CC9191745 -CT=110B6011B60C94382C2321BFCAA62A1C - -I=21 -KEY=56C77F7D436E515183FCB23C2A5AA053 -PT=110B6011B60C94382C2321BFCAA62A1C -CT=80C90EF6794361DFA400EFE922F45A59 - -I=22 -KEY=D60E718B3A2D308E27FC5DD508AEFA0A -PT=80C90EF6794361DFA400EFE922F45A59 -CT=F8DF0AC62EE229245DB1F300F2E5B143 - -I=23 -KEY=2ED17B4D14CF19AA7A4DAED5FA4B4B49 -PT=F8DF0AC62EE229245DB1F300F2E5B143 -CT=45390146539E773B502E84A0C29AD5B0 - -I=24 -KEY=6BE87A0B47516E912A632A7538D19EF9 -PT=45390146539E773B502E84A0C29AD5B0 -CT=B07721757865838BDFC2329998B5174F - -I=25 -KEY=DB9F5B7E3F34ED1AF5A118ECA06489B6 -PT=B07721757865838BDFC2329998B5174F -CT=B83F3B7A9FFBA35DF1D6661A0F8AD0F4 - -I=26 -KEY=63A06004A0CF4E4704777EF6AFEE5942 -PT=B83F3B7A9FFBA35DF1D6661A0F8AD0F4 -CT=7098C99B1B245DE623B78F1B07D08EBE - -I=27 -KEY=1338A99FBBEB13A127C0F1EDA83ED7FC -PT=7098C99B1B245DE623B78F1B07D08EBE -CT=58A095EF9268B923920238486D0B13E1 - -I=28 -KEY=4B983C702983AA82B5C2C9A5C535C41D -PT=58A095EF9268B923920238486D0B13E1 -CT=97DD8052CE0D87715075A42942C120ED - -I=29 -KEY=DC45BC22E78E2DF3E5B76D8C87F4E4F0 -PT=97DD8052CE0D87715075A42942C120ED -CT=F480B5A67DAFCB9524DC21453AF66FAF - -I=30 -KEY=28C509849A21E666C16B4CC9BD028B5F -PT=F480B5A67DAFCB9524DC21453AF66FAF -CT=71CE64CE8C98367F2F12E6851AC70FF3 - -I=31 -KEY=590B6D4A16B9D019EE79AA4CA7C584AC -PT=71CE64CE8C98367F2F12E6851AC70FF3 -CT=81C3AA693CC1C647399701DA17D5FDD5 - -I=32 -KEY=D8C8C7232A78165ED7EEAB96B0107979 -PT=81C3AA693CC1C647399701DA17D5FDD5 -CT=5BB93103F6DDF0415592EE2217704D41 - -I=33 -KEY=8371F620DCA5E61F827C45B4A7603438 -PT=5BB93103F6DDF0415592EE2217704D41 -CT=87B8B17FF9079829AB5C47E055FFCEE3 - -I=34 -KEY=04C9475F25A27E3629200254F29FFADB -PT=87B8B17FF9079829AB5C47E055FFCEE3 -CT=615FE7D34154F42D6CE9D647904295E0 - -I=35 -KEY=6596A08C64F68A1B45C9D41362DD6F3B -PT=615FE7D34154F42D6CE9D647904295E0 -CT=A60C213CDF9B54DF9041948F98585CE2 - -I=36 -KEY=C39A81B0BB6DDEC4D588409CFA8533D9 -PT=A60C213CDF9B54DF9041948F98585CE2 -CT=FB126C61071EB9167B6FF28E5244E624 - -I=37 -KEY=3888EDD1BC7367D2AEE7B212A8C1D5FD -PT=FB126C61071EB9167B6FF28E5244E624 -CT=8A79CE45F030B91B53D1591D10FF1B02 - -I=38 -KEY=B2F123944C43DEC9FD36EB0FB83ECEFF -PT=8A79CE45F030B91B53D1591D10FF1B02 -CT=BE20190BAE15162F43E93F67A580192B - -I=39 -KEY=0CD13A9FE256C8E6BEDFD4681DBED7D4 -PT=BE20190BAE15162F43E93F67A580192B -CT=0107D3E3511F91545D02B498A9E3C318 - -I=40 -KEY=0DD6E97CB34959B2E3DD60F0B45D14CC -PT=0107D3E3511F91545D02B498A9E3C318 -CT=2A832A1205D6B5FCF1B20126EE59DD9D - -I=41 -KEY=2755C36EB69FEC4E126F61D65A04C951 -PT=2A832A1205D6B5FCF1B20126EE59DD9D -CT=F362782F550DCBFC49CEF15C3A0ABA7A - -I=42 -KEY=D437BB41E39227B25BA1908A600E732B -PT=F362782F550DCBFC49CEF15C3A0ABA7A -CT=51A8A0C6434A3BE8C939B6DDD56EAA53 - -I=43 -KEY=859F1B87A0D81C5A92982657B560D978 -PT=51A8A0C6434A3BE8C939B6DDD56EAA53 -CT=89D3F1086F3D96C18A76C61F25A52221 - -I=44 -KEY=0C4CEA8FCFE58A9B18EEE04890C5FB59 -PT=89D3F1086F3D96C18A76C61F25A52221 -CT=A5F7E0A5FA70DDB718EF970F50EB7B86 - -I=45 -KEY=A9BB0A2A3595572C00017747C02E80DF -PT=A5F7E0A5FA70DDB718EF970F50EB7B86 -CT=7BB64305538E71AFBF993B5BD23D5523 - -I=46 -KEY=D20D492F661B2683BF984C1C1213D5FC -PT=7BB64305538E71AFBF993B5BD23D5523 -CT=E6BF8F5338568603EC668C6D15331FA5 - -I=47 -KEY=34B2C67C5E4DA08053FEC0710720CA59 -PT=E6BF8F5338568603EC668C6D15331FA5 -CT=27644649FCDF52085CDB20E3DEE1E2F6 - -I=48 -KEY=13D68035A292F2880F25E092D9C128AF -PT=27644649FCDF52085CDB20E3DEE1E2F6 -CT=7629AACAED7F49938373C83410AD1744 - -I=49 -KEY=65FF2AFF4FEDBB1B8C5628A6C96C3FEB -PT=7629AACAED7F49938373C83410AD1744 -CT=D440FC6E9A65819934FAF8641C05A17C - -I=50 -KEY=B1BFD691D5883A82B8ACD0C2D5699E97 -PT=D440FC6E9A65819934FAF8641C05A17C -CT=FBEE29FEFD725E1852B58502D3076C46 - -I=51 -KEY=4A51FF6F28FA649AEA1955C0066EF2D1 -PT=FBEE29FEFD725E1852B58502D3076C46 -CT=E345A47A6C89BE4350CDD8C9D319529D - -I=52 -KEY=A9145B154473DAD9BAD48D09D577A04C -PT=E345A47A6C89BE4350CDD8C9D319529D -CT=1C6A7CBAF21E483B6025DB6DA573C5C6 - -I=53 -KEY=B57E27AFB66D92E2DAF156647004658A -PT=1C6A7CBAF21E483B6025DB6DA573C5C6 -CT=2B05F4D8EB50D851A013798753B65A1F - -I=54 -KEY=9E7BD3775D3D4AB37AE22FE323B23F95 -PT=2B05F4D8EB50D851A013798753B65A1F -CT=CEFE04978228A0DBCCE9EE42B21DD34A - -I=55 -KEY=5085D7E0DF15EA68B60BC1A191AFECDF -PT=CEFE04978228A0DBCCE9EE42B21DD34A -CT=7B41DF8CD85B61EA800536648DBDA2AE - -I=56 -KEY=2BC4086C074E8B82360EF7C51C124E71 -PT=7B41DF8CD85B61EA800536648DBDA2AE -CT=08688872151D18CD19E2FC14B9E4C962 - -I=57 -KEY=23AC801E1253934F2FEC0BD1A5F68713 -PT=08688872151D18CD19E2FC14B9E4C962 -CT=F08C88BE5E748C4D82D2E7D7813A33AF - -I=58 -KEY=D32008A04C271F02AD3EEC0624CCB4BC -PT=F08C88BE5E748C4D82D2E7D7813A33AF -CT=319B7D38AB1AC3AEA0A0490C341F4F20 - -I=59 -KEY=E2BB7598E73DDCAC0D9EA50A10D3FB9C -PT=319B7D38AB1AC3AEA0A0490C341F4F20 -CT=EE70748772E8D88B2717D78F31F0EA86 - -I=60 -KEY=0CCB011F95D504272A8972852123111A -PT=EE70748772E8D88B2717D78F31F0EA86 -CT=A3A5DC791EA1BBB9D7A2B292572DFD5C - -I=61 -KEY=AF6EDD668B74BF9EFD2BC017760EEC46 -PT=A3A5DC791EA1BBB9D7A2B292572DFD5C -CT=255692B06B3A18498BCAF99F7B3EE374 - -I=62 -KEY=8A384FD6E04EA7D776E139880D300F32 -PT=255692B06B3A18498BCAF99F7B3EE374 -CT=500E492232891293875F50279B5DC5C3 - -I=63 -KEY=DA3606F4D2C7B544F1BE69AF966DCAF1 -PT=500E492232891293875F50279B5DC5C3 -CT=57C3FCCE9B5BA3BC19BBF7BB9B37A9AC - -I=64 -KEY=8DF5FA3A499C16F8E8059E140D5A635D -PT=57C3FCCE9B5BA3BC19BBF7BB9B37A9AC -CT=BF06FDFDB687C8B24FB0E2A6D6D37EA5 - -I=65 -KEY=32F307C7FF1BDE4AA7B57CB2DB891DF8 -PT=BF06FDFDB687C8B24FB0E2A6D6D37EA5 -CT=6D459ED545CF3C6FF2746411CD9B3E31 - -I=66 -KEY=5FB69912BAD4E22555C118A3161223C9 -PT=6D459ED545CF3C6FF2746411CD9B3E31 -CT=C74E0704A9D9EC2D90F75B34FC95CD32 - -I=67 -KEY=98F89E16130D0E08C5364397EA87EEFB -PT=C74E0704A9D9EC2D90F75B34FC95CD32 -CT=0453D4FBC2D7F8E0AD0AD90F98D1EC5C - -I=68 -KEY=9CAB4AEDD1DAF6E8683C9A98725602A7 -PT=0453D4FBC2D7F8E0AD0AD90F98D1EC5C -CT=5BBA052D6C39DC1E9553B7646CB7344B - -I=69 -KEY=C7114FC0BDE32AF6FD6F2DFC1EE136EC -PT=5BBA052D6C39DC1E9553B7646CB7344B -CT=9870FFE04984426501ECB55FFBB363CB - -I=70 -KEY=5F61B020F4676893FC8398A3E5525527 -PT=9870FFE04984426501ECB55FFBB363CB -CT=1363D65F7C943FC4512E41A717D3704D - -I=71 -KEY=4C02667F88F35757ADADD904F281256A -PT=1363D65F7C943FC4512E41A717D3704D -CT=664762AED6BC5FB74A646A928837FC83 - -I=72 -KEY=2A4504D15E4F08E0E7C9B3967AB6D9E9 -PT=664762AED6BC5FB74A646A928837FC83 -CT=655CB6BAB4B0532273689E4DC9234C42 - -I=73 -KEY=4F19B26BEAFF5BC294A12DDBB39595AB -PT=655CB6BAB4B0532273689E4DC9234C42 -CT=E8AAE0E0B9D2BE6259AEBC478DC90FD9 - -I=74 -KEY=A7B3528B532DE5A0CD0F919C3E5C9A72 -PT=E8AAE0E0B9D2BE6259AEBC478DC90FD9 -CT=FECACAF43DD920FA3078256C6A587741 - -I=75 -KEY=5979987F6EF4C55AFD77B4F05404ED33 -PT=FECACAF43DD920FA3078256C6A587741 -CT=11F3F56529B8B172D87A4C86BB90F3B6 - -I=76 -KEY=488A6D1A474C7428250DF876EF941E85 -PT=11F3F56529B8B172D87A4C86BB90F3B6 -CT=B44340D44F1ABA37CB09FE57FC771A9E - -I=77 -KEY=FCC92DCE0856CE1FEE04062113E3041B -PT=B44340D44F1ABA37CB09FE57FC771A9E -CT=C49F12B88C34A0D696FE283B01D5710C - -I=78 -KEY=38563F7684626EC978FA2E1A12367517 -PT=C49F12B88C34A0D696FE283B01D5710C -CT=58D6D2D36C14DDBDA7604AB740918D76 - -I=79 -KEY=6080EDA5E876B374DF9A64AD52A7F861 -PT=58D6D2D36C14DDBDA7604AB740918D76 -CT=21F735F77B0EAD7551CE06900A568EB3 - -I=80 -KEY=4177D85293781E018E54623D58F176D2 -PT=21F735F77B0EAD7551CE06900A568EB3 -CT=FE2E9BDB393BF6D1BBF108B8AC3B6818 - -I=81 -KEY=BF594389AA43E8D035A56A85F4CA1ECA -PT=FE2E9BDB393BF6D1BBF108B8AC3B6818 -CT=FECFCD3722C6C8E6608258341220E739 - -I=82 -KEY=41968EBE88852036552732B1E6EAF9F3 -PT=FECFCD3722C6C8E6608258341220E739 -CT=10A8BB234C9D9A22DEC7887E931F85BD - -I=83 -KEY=513E359DC418BA148BE0BACF75F57C4E -PT=10A8BB234C9D9A22DEC7887E931F85BD -CT=767EB7DBA70BC7094DF7A5BDD233EB5C - -I=84 -KEY=2740824663137D1DC6171F72A7C69712 -PT=767EB7DBA70BC7094DF7A5BDD233EB5C -CT=FCD7184F3F4DB7CA182225B9A358209D - -I=85 -KEY=DB979A095C5ECAD7DE353ACB049EB78F -PT=FCD7184F3F4DB7CA182225B9A358209D -CT=A5CD025AEBF0380EAC66EF034806179F - -I=86 -KEY=7E5A9853B7AEF2D97253D5C84C98A010 -PT=A5CD025AEBF0380EAC66EF034806179F -CT=FE46F4A72C7031FE8D900152CD20B95F - -I=87 -KEY=801C6CF49BDEC327FFC3D49A81B8194F -PT=FE46F4A72C7031FE8D900152CD20B95F -CT=CF1ACB502A4B608C61364891E34F93A0 - -I=88 -KEY=4F06A7A4B195A3AB9EF59C0B62F78AEF -PT=CF1ACB502A4B608C61364891E34F93A0 -CT=95AB1367FF6C03DE87FFA282A3E52200 - -I=89 -KEY=DAADB4C34EF9A075190A3E89C112A8EF -PT=95AB1367FF6C03DE87FFA282A3E52200 -CT=762B6393252B347F55AF3E4CA16F2FC9 - -I=90 -KEY=AC86D7506BD2940A4CA500C5607D8726 -PT=762B6393252B347F55AF3E4CA16F2FC9 -CT=A63491A22E23AD921ADAB9CC0DA20521 - -I=91 -KEY=0AB246F245F13998567FB9096DDF8207 -PT=A63491A22E23AD921ADAB9CC0DA20521 -CT=C0852A5E7CEEAFB5FA87C440B598BFD6 - -I=92 -KEY=CA376CAC391F962DACF87D49D8473DD1 -PT=C0852A5E7CEEAFB5FA87C440B598BFD6 -CT=485747C528B08033169E991E98E4CBB5 - -I=93 -KEY=82602B6911AF161EBA66E45740A3F664 -PT=485747C528B08033169E991E98E4CBB5 -CT=415B95B222161A8C9ED20CF99C26848C - -I=94 -KEY=C33BBEDB33B90C9224B4E8AEDC8572E8 -PT=415B95B222161A8C9ED20CF99C26848C -CT=7E673E6348C38CD40C9B11F4C9F3E3A0 - -I=95 -KEY=BD5C80B87B7A8046282FF95A15769148 -PT=7E673E6348C38CD40C9B11F4C9F3E3A0 -CT=B88508E55279AFF0D848C38DBEC76B2C - -I=96 -KEY=05D9885D29032FB6F0673AD7ABB1FA64 -PT=B88508E55279AFF0D848C38DBEC76B2C -CT=3902B5DC34E815BA50A53DB9C8FFAA92 - -I=97 -KEY=3CDB3D811DEB3A0CA0C2076E634E50F6 -PT=3902B5DC34E815BA50A53DB9C8FFAA92 -CT=FEF57F51360547EA6B88085B8656A1D0 - -I=98 -KEY=C22E42D02BEE7DE6CB4A0F35E518F126 -PT=FEF57F51360547EA6B88085B8656A1D0 -CT=94D052E1F097106A5B714ADD0EF79E64 - -I=99 -KEY=56FE1031DB796D8C903B45E8EBEF6F42 -PT=94D052E1F097106A5B714ADD0EF79E64 -CT=7FD3EF411360E5270F63A8BACCCC74C0 - -I=100 -KEY=292DFF70C81988AB9F58ED5227231B82 -PT=7FD3EF411360E5270F63A8BACCCC74C0 -CT=F572692DE6EFBC2309B947D1A75BE009 - -I=101 -KEY=DC5F965D2EF6348896E1AA838078FB8B -PT=F572692DE6EFBC2309B947D1A75BE009 -CT=BFD3233C513448C283C05311B8085B5C - -I=102 -KEY=638CB5617FC27C4A1521F9923870A0D7 -PT=BFD3233C513448C283C05311B8085B5C -CT=078739F570071AA1A96A1F00F31E05FD - -I=103 -KEY=640B8C940FC566EBBC4BE692CB6EA52A -PT=078739F570071AA1A96A1F00F31E05FD -CT=947CA236277CDD0AC13C194B99E8CF16 - -I=104 -KEY=F0772EA228B9BBE17D77FFD952866A3C -PT=947CA236277CDD0AC13C194B99E8CF16 -CT=34DE5F2D355BC4ACE54AD0CB8C008CB8 - -I=105 -KEY=C4A9718F1DE27F4D983D2F12DE86E684 -PT=34DE5F2D355BC4ACE54AD0CB8C008CB8 -CT=E5729CBD84C89B914F35412F902A2CA3 - -I=106 -KEY=21DBED32992AE4DCD7086E3D4EACCA27 -PT=E5729CBD84C89B914F35412F902A2CA3 -CT=EB326D6ABAFC93EADBEC9B05CE4AAF0C - -I=107 -KEY=CAE9805823D677360CE4F53880E6652B -PT=EB326D6ABAFC93EADBEC9B05CE4AAF0C -CT=9F088089F8D8E8E28A9A2A1FF50F2ED3 - -I=108 -KEY=55E100D1DB0E9FD4867EDF2775E94BF8 -PT=9F088089F8D8E8E28A9A2A1FF50F2ED3 -CT=C8D2BF3D6ADB57F478656D4808142160 - -I=109 -KEY=9D33BFECB1D5C820FE1BB26F7DFD6A98 -PT=C8D2BF3D6ADB57F478656D4808142160 -CT=062016811215B9DBDD3C794A15FBEBBA - -I=110 -KEY=9B13A96DA3C071FB2327CB2568068122 -PT=062016811215B9DBDD3C794A15FBEBBA -CT=71F9F04E9AED1C302E5ED2AD36B5C7F5 - -I=111 -KEY=EAEA5923392D6DCB0D7919885EB346D7 -PT=71F9F04E9AED1C302E5ED2AD36B5C7F5 -CT=253982568F6C3FDFDE173E46B614989C - -I=112 -KEY=CFD3DB75B6415214D36E27CEE8A7DE4B -PT=253982568F6C3FDFDE173E46B614989C -CT=6D51D51276A6FA9C933E4D4496D0455E - -I=113 -KEY=A2820E67C0E7A88840506A8A7E779B15 -PT=6D51D51276A6FA9C933E4D4496D0455E -CT=B9A6924F773CE826BBBC6DDBFA4E146A - -I=114 -KEY=1B249C28B7DB40AEFBEC075184398F7F -PT=B9A6924F773CE826BBBC6DDBFA4E146A -CT=474943C523162BC81186779A07144BC6 - -I=115 -KEY=5C6DDFED94CD6B66EA6A70CB832DC4B9 -PT=474943C523162BC81186779A07144BC6 -CT=20128A092B99B4BC212B1107C3BA1DF9 - -I=116 -KEY=7C7F55E4BF54DFDACB4161CC4097D940 -PT=20128A092B99B4BC212B1107C3BA1DF9 -CT=90330B8FB5A50E958250A953EF5145C7 - -I=117 -KEY=EC4C5E6B0AF1D14F4911C89FAFC69C87 -PT=90330B8FB5A50E958250A953EF5145C7 -CT=C1B788D0EB2C8C7B9E020CC2BEACD595 - -I=118 -KEY=2DFBD6BBE1DD5D34D713C45D116A4912 -PT=C1B788D0EB2C8C7B9E020CC2BEACD595 -CT=EF87960DABBE82F6CFA8045CE4A9EED0 - -I=119 -KEY=C27C40B64A63DFC218BBC001F5C3A7C2 -PT=EF87960DABBE82F6CFA8045CE4A9EED0 -CT=405C8408D5027DF90CBE3159701D161A - -I=120 -KEY=8220C4BE9F61A23B1405F15885DEB1D8 -PT=405C8408D5027DF90CBE3159701D161A -CT=FCAB7F88E85D6573A98D23D684A5A5F3 - -I=121 -KEY=7E8BBB36773CC748BD88D28E017B142B -PT=FCAB7F88E85D6573A98D23D684A5A5F3 -CT=191E6F1EECBF5149F4D49446E97D8820 - -I=122 -KEY=6795D4289B839601495C46C8E8069C0B -PT=191E6F1EECBF5149F4D49446E97D8820 -CT=C77128F53D48594194EFBA67E46C6B23 - -I=123 -KEY=A0E4FCDDA6CBCF40DDB3FCAF0C6AF728 -PT=C77128F53D48594194EFBA67E46C6B23 -CT=DFB898170571450CC5E2244AE4D3AF43 - -I=124 -KEY=7F5C64CAA3BA8A4C1851D8E5E8B9586B -PT=DFB898170571450CC5E2244AE4D3AF43 -CT=3BD1633B5053609A3B42CC098F9F5D87 - -I=125 -KEY=448D07F1F3E9EAD6231314EC672605EC -PT=3BD1633B5053609A3B42CC098F9F5D87 -CT=AC15B23F205AEB10470F853BA18361E0 - -I=126 -KEY=E898B5CED3B301C6641C91D7C6A5640C -PT=AC15B23F205AEB10470F853BA18361E0 -CT=2DA73BA6E01B1ADFBEEAFA2E37942078 - -I=127 -KEY=C53F8E6833A81B19DAF66BF9F1314474 -PT=2DA73BA6E01B1ADFBEEAFA2E37942078 -CT=C5B3D7089173958B32340B88D35B738B - -I=128 -KEY=008C5960A2DB8E92E8C26071226A37FF -PT=C5B3D7089173958B32340B88D35B738B -CT=8318BAA96569F3ADCD30C08D54494392 - -I=129 -KEY=8394E3C9C7B27D3F25F2A0FC7623746D -PT=8318BAA96569F3ADCD30C08D54494392 -CT=4F6F2A06A1A344B261084563BCCC5A5A - -I=130 -KEY=CCFBC9CF6611398D44FAE59FCAEF2E37 -PT=4F6F2A06A1A344B261084563BCCC5A5A -CT=07EC18166362BF049A48D146A63FF378 - -I=131 -KEY=CB17D1D905738689DEB234D96CD0DD4F -PT=07EC18166362BF049A48D146A63FF378 -CT=81CB17ABAC28A3ED135442454C212646 - -I=132 -KEY=4ADCC672A95B2564CDE6769C20F1FB09 -PT=81CB17ABAC28A3ED135442454C212646 -CT=C1CBDE45E27B9B1198CE93A51E38D9C5 - -I=133 -KEY=8B1718374B20BE755528E5393EC922CC -PT=C1CBDE45E27B9B1198CE93A51E38D9C5 -CT=8E4EB89DDFEE065784556FA0B426954A - -I=134 -KEY=0559A0AA94CEB822D17D8A998AEFB786 -PT=8E4EB89DDFEE065784556FA0B426954A -CT=6A966414CC6FE52F957E9DE7012EC4BD - -I=135 -KEY=6FCFC4BE58A15D0D4403177E8BC1733B -PT=6A966414CC6FE52F957E9DE7012EC4BD -CT=7C88474D963BFDFE61F052F51D1796EF - -I=136 -KEY=134783F3CE9AA0F325F3458B96D6E5D4 -PT=7C88474D963BFDFE61F052F51D1796EF -CT=6269F5DA04B09D442DDCB46001573AE9 - -I=137 -KEY=712E7629CA2A3DB7082FF1EB9781DF3D -PT=6269F5DA04B09D442DDCB46001573AE9 -CT=FBD2965ACE0B360A12EF39873A8F3805 - -I=138 -KEY=8AFCE07304210BBD1AC0C86CAD0EE738 -PT=FBD2965ACE0B360A12EF39873A8F3805 -CT=5B46EF12C9BE55DCD5571D82E5BC6FF1 - -I=139 -KEY=D1BA0F61CD9F5E61CF97D5EE48B288C9 -PT=5B46EF12C9BE55DCD5571D82E5BC6FF1 -CT=403DEFDB60876F3161CF02F319F5EA9A - -I=140 -KEY=9187E0BAAD183150AE58D71D51476253 -PT=403DEFDB60876F3161CF02F319F5EA9A -CT=70FD321C583C1B54ED6AD3A79721E84A - -I=141 -KEY=E17AD2A6F5242A04433204BAC6668A19 -PT=70FD321C583C1B54ED6AD3A79721E84A -CT=32AE26E948D563782532AC711BFAB644 - -I=142 -KEY=D3D4F44FBDF1497C6600A8CBDD9C3C5D -PT=32AE26E948D563782532AC711BFAB644 -CT=ECF948F5EBB98E4C7286046E0F7AF127 - -I=143 -KEY=3F2DBCBA5648C7301486ACA5D2E6CD7A -PT=ECF948F5EBB98E4C7286046E0F7AF127 -CT=818F87EFA0B5E4098E737AD44DB537BA - -I=144 -KEY=BEA23B55F6FD23399AF5D6719F53FAC0 -PT=818F87EFA0B5E4098E737AD44DB537BA -CT=029F170737413F1BFBE02C292D506E44 - -I=145 -KEY=BC3D2C52C1BC1C226115FA58B2039484 -PT=029F170737413F1BFBE02C292D506E44 -CT=77A7C520912761121373E35FD3B5AF0F - -I=146 -KEY=CB9AE972509B7D307266190761B63B8B -PT=77A7C520912761121373E35FD3B5AF0F -CT=D407B965C368E1F77195ED446BEEBA73 - -I=147 -KEY=1F9D501793F39CC703F3F4430A5881F8 -PT=D407B965C368E1F77195ED446BEEBA73 -CT=D1F304E0B3614A4840F128AA364BA6A3 - -I=148 -KEY=CE6E54F72092D68F4302DCE93C13275B -PT=D1F304E0B3614A4840F128AA364BA6A3 -CT=69B748543EE72474D0CC301BDBD50A6C - -I=149 -KEY=A7D91CA31E75F2FB93CEECF2E7C62D37 -PT=69B748543EE72474D0CC301BDBD50A6C -CT=BA471D91DBC6D27EBA7B510E67830C3F - -I=150 -KEY=1D9E0132C5B3208529B5BDFC80452108 -PT=BA471D91DBC6D27EBA7B510E67830C3F -CT=7C0CF396D078E01A741613B1E1D7A9CB - -I=151 -KEY=6192F2A415CBC09F5DA3AE4D619288C3 -PT=7C0CF396D078E01A741613B1E1D7A9CB -CT=6F670A289398F49C75ACBBE9EAC2ABFC - -I=152 -KEY=0EF5F88C86533403280F15A48B50233F -PT=6F670A289398F49C75ACBBE9EAC2ABFC -CT=C392EF479528BF1B02296E6C894E4FDD - -I=153 -KEY=CD6717CB137B8B182A267BC8021E6CE2 -PT=C392EF479528BF1B02296E6C894E4FDD -CT=C4226C8C98D5F137A4C6A239E04B0FB3 - -I=154 -KEY=09457B478BAE7A2F8EE0D9F1E2556351 -PT=C4226C8C98D5F137A4C6A239E04B0FB3 -CT=2382714FC945AD4A1E03858B63973B9E - -I=155 -KEY=2AC70A0842EBD76590E35C7A81C258CF -PT=2382714FC945AD4A1E03858B63973B9E -CT=E41F350AC9320A8A23E27C0349978168 - -I=156 -KEY=CED83F028BD9DDEFB3012079C855D9A7 -PT=E41F350AC9320A8A23E27C0349978168 -CT=7E9137997CB7676F3D0141797C6F31A8 - -I=157 -KEY=B049089BF76EBA808E006100B43AE80F -PT=7E9137997CB7676F3D0141797C6F31A8 -CT=4BF7EBC15369A757981EE4A0B7F55706 - -I=158 -KEY=FBBEE35AA4071DD7161E85A003CFBF09 -PT=4BF7EBC15369A757981EE4A0B7F55706 -CT=EC677E86A8D2A5935D33D6471A58A781 - -I=159 -KEY=17D99DDC0CD5B8444B2D53E719971888 -PT=EC677E86A8D2A5935D33D6471A58A781 -CT=F31066D48884BC9B37F218FCF385344B - -I=160 -KEY=E4C9FB08845104DF7CDF4B1BEA122CC3 -PT=F31066D48884BC9B37F218FCF385344B -CT=51CFEA4E482A7B7BCF4D31DA5CED4370 - -I=161 -KEY=B5061146CC7B7FA4B3927AC1B6FF6FB3 -PT=51CFEA4E482A7B7BCF4D31DA5CED4370 -CT=89F3CD1590669A16F8460991BFD3CF5C - -I=162 -KEY=3CF5DC535C1DE5B24BD47350092CA0EF -PT=89F3CD1590669A16F8460991BFD3CF5C -CT=9930DA8E5DBC1F6C87B0B41BD386E2E0 - -I=163 -KEY=A5C506DD01A1FADECC64C74BDAAA420F -PT=9930DA8E5DBC1F6C87B0B41BD386E2E0 -CT=41A8CB583E5B9D2BA7CDA3763B6529C0 - -I=164 -KEY=E46DCD853FFA67F56BA9643DE1CF6BCF -PT=41A8CB583E5B9D2BA7CDA3763B6529C0 -CT=53479DCFB0C69624B42B9C272B0A1A85 - -I=165 -KEY=B72A504A8F3CF1D1DF82F81ACAC5714A -PT=53479DCFB0C69624B42B9C272B0A1A85 -CT=E72F27AE86E913EF55309120358BAD35 - -I=166 -KEY=500577E409D5E23E8AB2693AFF4EDC7F -PT=E72F27AE86E913EF55309120358BAD35 -CT=9B1EF901BACC70819DBC627C7CDC8CD9 - -I=167 -KEY=CB1B8EE5B31992BF170E0B46839250A6 -PT=9B1EF901BACC70819DBC627C7CDC8CD9 -CT=9546C7B789345E4C32EE84BCE8E78C7E - -I=168 -KEY=5E5D49523A2DCCF325E08FFA6B75DCD8 -PT=9546C7B789345E4C32EE84BCE8E78C7E -CT=33700B93E03CE8202BAC7E64E3255108 - -I=169 -KEY=6D2D42C1DA1124D30E4CF19E88508DD0 -PT=33700B93E03CE8202BAC7E64E3255108 -CT=44246615BCA5C0A8DCB7E63729398F0A - -I=170 -KEY=290924D466B4E47BD2FB17A9A16902DA -PT=44246615BCA5C0A8DCB7E63729398F0A -CT=3215FC55FEE5A30BFA11F8EBBC912652 - -I=171 -KEY=1B1CD8819851477028EAEF421DF82488 -PT=3215FC55FEE5A30BFA11F8EBBC912652 -CT=796C9136407BC4F484B253DAEB206912 - -I=172 -KEY=627049B7D82A8384AC58BC98F6D84D9A -PT=796C9136407BC4F484B253DAEB206912 -CT=B18977B404F0671C10AA979389408CCA - -I=173 -KEY=D3F93E03DCDAE498BCF22B0B7F98C150 -PT=B18977B404F0671C10AA979389408CCA -CT=B2592621EE947D4ED9AD4295E0675F93 - -I=174 -KEY=61A01822324E99D6655F699E9FFF9EC3 -PT=B2592621EE947D4ED9AD4295E0675F93 -CT=62D3B7E28765DA8F83EBE19C97293C0A - -I=175 -KEY=0373AFC0B52B4359E6B4880208D6A2C9 -PT=62D3B7E28765DA8F83EBE19C97293C0A -CT=F417D650D6B7631542CFF8F95FC81C9B - -I=176 -KEY=F7647990639C204CA47B70FB571EBE52 -PT=F417D650D6B7631542CFF8F95FC81C9B -CT=700A5DE153D6B438FFF7BA902DEC32FF - -I=177 -KEY=876E2471304A94745B8CCA6B7AF28CAD -PT=700A5DE153D6B438FFF7BA902DEC32FF -CT=67DC08A48F1EC7E32121B8693BB23621 - -I=178 -KEY=E0B22CD5BF5453977AAD72024140BA8C -PT=67DC08A48F1EC7E32121B8693BB23621 -CT=90038BB156A7F7992E260E9CBFAC0D82 - -I=179 -KEY=70B1A764E9F3A40E548B7C9EFEECB70E -PT=90038BB156A7F7992E260E9CBFAC0D82 -CT=C6BB1407C2D037BF238BEC772BA95352 - -I=180 -KEY=B60AB3632B2393B1770090E9D545E45C -PT=C6BB1407C2D037BF238BEC772BA95352 -CT=8C3D249574FF74F84053977219D69F5E - -I=181 -KEY=3A3797F65FDCE7493753079BCC937B02 -PT=8C3D249574FF74F84053977219D69F5E -CT=131F7FC5A1528AD5DCB167AFAA8BFD47 - -I=182 -KEY=2928E833FE8E6D9CEBE2603466188645 -PT=131F7FC5A1528AD5DCB167AFAA8BFD47 -CT=6E68AE6FDF2C10B42B85486D3EFBCEB9 - -I=183 -KEY=4740465C21A27D28C067285958E348FC -PT=6E68AE6FDF2C10B42B85486D3EFBCEB9 -CT=26808ABFA3967D742D64A26CADF8DD70 - -I=184 -KEY=61C0CCE38234005CED038A35F51B958C -PT=26808ABFA3967D742D64A26CADF8DD70 -CT=8BBCBA5E4C219D000A2F6B701CDA09C3 - -I=185 -KEY=EA7C76BDCE159D5CE72CE145E9C19C4F -PT=8BBCBA5E4C219D000A2F6B701CDA09C3 -CT=5D707BB328BEFF51C8C1D984C1608AA0 - -I=186 -KEY=B70C0D0EE6AB620D2FED38C128A116EF -PT=5D707BB328BEFF51C8C1D984C1608AA0 -CT=8D0A485482B914FC282C2DA9F7147D0C - -I=187 -KEY=3A06455A641276F107C11568DFB56BE3 -PT=8D0A485482B914FC282C2DA9F7147D0C -CT=C5678BC12445627CBAA94177F070F736 - -I=188 -KEY=FF61CE9B4057148DBD68541F2FC59CD5 -PT=C5678BC12445627CBAA94177F070F736 -CT=EB9B50846E92C20CD6EDBA7A3A260684 - -I=189 -KEY=14FA9E1F2EC5D6816B85EE6515E39A51 -PT=EB9B50846E92C20CD6EDBA7A3A260684 -CT=E2178B471A3F72A271013C4CBE41FA1C - -I=190 -KEY=F6ED155834FAA4231A84D229ABA2604D -PT=E2178B471A3F72A271013C4CBE41FA1C -CT=C10C8084A17D90339E5ED8C638B902A4 - -I=191 -KEY=37E195DC9587341084DA0AEF931B62E9 -PT=C10C8084A17D90339E5ED8C638B902A4 -CT=03C839CCF269548279F30A1F45C30556 - -I=192 -KEY=3429AC1067EE6092FD2900F0D6D867BF -PT=03C839CCF269548279F30A1F45C30556 -CT=1C5DC5C94B5C7E332D4122A0A4FACD96 - -I=193 -KEY=287469D92CB21EA1D06822507222AA29 -PT=1C5DC5C94B5C7E332D4122A0A4FACD96 -CT=E7292B7D15E9311F242FACFAFC0B0B81 - -I=194 -KEY=CF5D42A4395B2FBEF4478EAA8E29A1A8 -PT=E7292B7D15E9311F242FACFAFC0B0B81 -CT=EA6DF86EEE09613104DB81B97B949AEC - -I=195 -KEY=2530BACAD7524E8FF09C0F13F5BD3B44 -PT=EA6DF86EEE09613104DB81B97B949AEC -CT=8FBCCDEBA43FE3FFDE4C3C279BDD4A27 - -I=196 -KEY=AA8C7721736DAD702ED033346E607163 -PT=8FBCCDEBA43FE3FFDE4C3C279BDD4A27 -CT=985971BE962C63B0F50D1004963E9BED - -I=197 -KEY=32D5069FE541CEC0DBDD2330F85EEA8E -PT=985971BE962C63B0F50D1004963E9BED -CT=F2CC0FF4B6D2F88766F1B8BE370FE463 - -I=198 -KEY=C019096B53933647BD2C9B8ECF510EED -PT=F2CC0FF4B6D2F88766F1B8BE370FE463 -CT=FE33F823B7B97FC017B35B6E22415D3E - -I=199 -KEY=3E2AF148E42A4987AA9FC0E0ED1053D3 -PT=FE33F823B7B97FC017B35B6E22415D3E -CT=465D804A6053EC2580B59F0CD645C060 - -I=200 -KEY=787771028479A5A22A2A5FEC3B5593B3 -PT=465D804A6053EC2580B59F0CD645C060 -CT=DE05AD28693E3D471B8F39BAD1803C0E - -I=201 -KEY=A672DC2AED4798E531A56656EAD5AFBD -PT=DE05AD28693E3D471B8F39BAD1803C0E -CT=61EB397D55A2FC3D78974C8A10200AC6 - -I=202 -KEY=C799E557B8E564D849322ADCFAF5A57B -PT=61EB397D55A2FC3D78974C8A10200AC6 -CT=BD95D742D81AD795AA4E10FB41F54294 - -I=203 -KEY=7A0C321560FFB34DE37C3A27BB00E7EF -PT=BD95D742D81AD795AA4E10FB41F54294 -CT=F43A1E8C6E057E68414D23DA6932DE2C - -I=204 -KEY=8E362C990EFACD25A23119FDD23239C3 -PT=F43A1E8C6E057E68414D23DA6932DE2C -CT=8EBB208032245988E851148B34B92F0E - -I=205 -KEY=008D0C193CDE94AD4A600D76E68B16CD -PT=8EBB208032245988E851148B34B92F0E -CT=2F18B4B14A360E06C50C89A4E6FE6C17 - -I=206 -KEY=2F95B8A876E89AAB8F6C84D200757ADA -PT=2F18B4B14A360E06C50C89A4E6FE6C17 -CT=681E131FA7EA5EBE10B59D3F16009582 - -I=207 -KEY=478BABB7D102C4159FD919ED1675EF58 -PT=681E131FA7EA5EBE10B59D3F16009582 -CT=376FA31CC9D18E756E96715D61403C5D - -I=208 -KEY=70E408AB18D34A60F14F68B07735D305 -PT=376FA31CC9D18E756E96715D61403C5D -CT=519E87E4A1AC61C376842F028D1BD75F - -I=209 -KEY=217A8F4FB97F2BA387CB47B2FA2E045A -PT=519E87E4A1AC61C376842F028D1BD75F -CT=BFAED9E9964967342808C6C332E02204 - -I=210 -KEY=9ED456A62F364C97AFC38171C8CE265E -PT=BFAED9E9964967342808C6C332E02204 -CT=5A9F55C61A03D6A3196FFD6879CBCA02 - -I=211 -KEY=C44B036035359A34B6AC7C19B105EC5C -PT=5A9F55C61A03D6A3196FFD6879CBCA02 -CT=0FD872478223CDE765A62036EDD6F42F - -I=212 -KEY=CB937127B71657D3D30A5C2F5CD31873 -PT=0FD872478223CDE765A62036EDD6F42F -CT=965ED2AF7D26CDA8A8B7E7B2F1ADA768 - -I=213 -KEY=5DCDA388CA309A7B7BBDBB9DAD7EBF1B -PT=965ED2AF7D26CDA8A8B7E7B2F1ADA768 -CT=05599B8D42D92457605A69200C6DC0AA - -I=214 -KEY=5894380588E9BE2C1BE7D2BDA1137FB1 -PT=05599B8D42D92457605A69200C6DC0AA -CT=3436A49EE590788F625A6FB44BF72FA3 - -I=215 -KEY=6CA29C9B6D79C6A379BDBD09EAE45012 -PT=3436A49EE590788F625A6FB44BF72FA3 -CT=DB181195EFF35E307167BADA138A837A - -I=216 -KEY=B7BA8D0E828A989308DA07D3F96ED368 -PT=DB181195EFF35E307167BADA138A837A -CT=45E06B534233447E3CB696C1DD179477 - -I=217 -KEY=F25AE65DC0B9DCED346C91122479471F -PT=45E06B534233447E3CB696C1DD179477 -CT=D2EDC4E2B4EDD671D984E8AA5BABAAD7 - -I=218 -KEY=20B722BF74540A9CEDE879B87FD2EDC8 -PT=D2EDC4E2B4EDD671D984E8AA5BABAAD7 -CT=DB92F4E9F2DD6A61E20A79CFC82CD061 - -I=219 -KEY=FB25D656868960FD0FE20077B7FE3DA9 -PT=DB92F4E9F2DD6A61E20A79CFC82CD061 -CT=79383629DF124FD94A1C36BECB711747 - -I=220 -KEY=821DE07F599B2F2445FE36C97C8F2AEE -PT=79383629DF124FD94A1C36BECB711747 -CT=3F3F592FB3DB51CF08B70E6F2174AB43 - -I=221 -KEY=BD22B950EA407EEB4D4938A65DFB81AD -PT=3F3F592FB3DB51CF08B70E6F2174AB43 -CT=D34FDA2917E9697118502CB7A6CAE07C - -I=222 -KEY=6E6D6379FDA9179A55191411FB3161D1 -PT=D34FDA2917E9697118502CB7A6CAE07C -CT=24D2C38E5C52A404DBE0D8BB6DA44AEE - -I=223 -KEY=4ABFA0F7A1FBB39E8EF9CCAA96952B3F -PT=24D2C38E5C52A404DBE0D8BB6DA44AEE -CT=2ED6A7503B3547C04E0B7B709218CD4A - -I=224 -KEY=646907A79ACEF45EC0F2B7DA048DE675 -PT=2ED6A7503B3547C04E0B7B709218CD4A -CT=4F11BE7A8B5D1A04AB82F60000BC7B50 - -I=225 -KEY=2B78B9DD1193EE5A6B7041DA04319D25 -PT=4F11BE7A8B5D1A04AB82F60000BC7B50 -CT=B98B51B76B262CB9ED157567A05770AF - -I=226 -KEY=92F3E86A7AB5C2E3866534BDA466ED8A -PT=B98B51B76B262CB9ED157567A05770AF -CT=D6CA5483F89D5AA01DBCFEBE30C26F5E - -I=227 -KEY=4439BCE9822898439BD9CA0394A482D4 -PT=D6CA5483F89D5AA01DBCFEBE30C26F5E -CT=7706922EBA53937E287084C8FDFEB33F - -I=228 -KEY=333F2EC7387B0B3DB3A94ECB695A31EB -PT=7706922EBA53937E287084C8FDFEB33F -CT=0F2DA3B8BFCB1046CA94EC9322320BF9 - -I=229 -KEY=3C128D7F87B01B7B793DA2584B683A12 -PT=0F2DA3B8BFCB1046CA94EC9322320BF9 -CT=29CAD5CDC5A2834A5D533335FED2EA81 - -I=230 -KEY=15D858B242129831246E916DB5BAD093 -PT=29CAD5CDC5A2834A5D533335FED2EA81 -CT=A48A2D319552BF02E84E4662E75884DB - -I=231 -KEY=B1527583D7402733CC20D70F52E25448 -PT=A48A2D319552BF02E84E4662E75884DB -CT=334560ECD22BB9F660BC4FFAB13891C9 - -I=232 -KEY=8217156F056B9EC5AC9C98F5E3DAC581 -PT=334560ECD22BB9F660BC4FFAB13891C9 -CT=DAAEB8436205DFB6688D9DE0A21A6B9D - -I=233 -KEY=58B9AD2C676E4173C411051541C0AE1C -PT=DAAEB8436205DFB6688D9DE0A21A6B9D -CT=E38798615C2158872704125A7CFC6540 - -I=234 -KEY=BB3E354D3B4F19F4E315174F3D3CCB5C -PT=E38798615C2158872704125A7CFC6540 -CT=BACB9EA5499A093F6595E8D1D5CF7E50 - -I=235 -KEY=01F5ABE872D510CB8680FF9EE8F3B50C -PT=BACB9EA5499A093F6595E8D1D5CF7E50 -CT=813B0D4AC4C2B8371A1A132927D24F62 - -I=236 -KEY=80CEA6A2B617A8FC9C9AECB7CF21FA6E -PT=813B0D4AC4C2B8371A1A132927D24F62 -CT=D1AD1AE650B377520EE19370D9E968A9 - -I=237 -KEY=5163BC44E6A4DFAE927B7FC716C892C7 -PT=D1AD1AE650B377520EE19370D9E968A9 -CT=3CEC25102A51A5A4C26E7391590D54ED - -I=238 -KEY=6D8F9954CCF57A0A50150C564FC5C62A -PT=3CEC25102A51A5A4C26E7391590D54ED -CT=505FD54017E89E9FAA6376E399F2FF09 - -I=239 -KEY=3DD04C14DB1DE495FA767AB5D6373923 -PT=505FD54017E89E9FAA6376E399F2FF09 -CT=1B45550B4E3AB908A2CC72FFFB38701A - -I=240 -KEY=2695191F95275D9D58BA084A2D0F4939 -PT=1B45550B4E3AB908A2CC72FFFB38701A -CT=E2469D9D2F91E3AA88DC7970C94E7237 - -I=241 -KEY=C4D38482BAB6BE37D066713AE4413B0E -PT=E2469D9D2F91E3AA88DC7970C94E7237 -CT=9352C72F2B5093D1AF52BA959963F59B - -I=242 -KEY=578143AD91E62DE67F34CBAF7D22CE95 -PT=9352C72F2B5093D1AF52BA959963F59B -CT=F26DE32F035B270BA42075574056564E - -I=243 -KEY=A5ECA08292BD0AEDDB14BEF83D7498DB -PT=F26DE32F035B270BA42075574056564E -CT=6AC08B3D91FC31A34B3A81F7C300587E - -I=244 -KEY=CF2C2BBF03413B4E902E3F0FFE74C0A5 -PT=6AC08B3D91FC31A34B3A81F7C300587E -CT=E5E6455304C3B5E2349E2372D6E4B0B8 - -I=245 -KEY=2ACA6EEC07828EACA4B01C7D2890701D -PT=E5E6455304C3B5E2349E2372D6E4B0B8 -CT=90524F27C63CCA1E4CA9674381786C30 - -I=246 -KEY=BA9821CBC1BE44B2E8197B3EA9E81C2D -PT=90524F27C63CCA1E4CA9674381786C30 -CT=44625D68290415039E2C6C05B4954896 - -I=247 -KEY=FEFA7CA3E8BA51B17635173B1D7D54BB -PT=44625D68290415039E2C6C05B4954896 -CT=EC401B0D3780FDB4A3952706B07F6CEF - -I=248 -KEY=12BA67AEDF3AAC05D5A0303DAD023854 -PT=EC401B0D3780FDB4A3952706B07F6CEF -CT=DCEDC88021F6FD1C61C08DAABF0E73BA - -I=249 -KEY=CE57AF2EFECC5119B460BD97120C4BEE -PT=DCEDC88021F6FD1C61C08DAABF0E73BA -CT=C15C85D8161B97DD61EB8B514CDCFFD5 - -I=250 -KEY=0F0B2AF6E8D7C6C4D58B36C65ED0B43B -PT=C15C85D8161B97DD61EB8B514CDCFFD5 -CT=B68B65E041C84433DEA4D9E15E9F98AB - -I=251 -KEY=B9804F16A91F82F70B2FEF27004F2C90 -PT=B68B65E041C84433DEA4D9E15E9F98AB -CT=8122505A5B6F8D985A8D9D7E9E2FF4F3 - -I=252 -KEY=38A21F4CF2700F6F51A272599E60D863 -PT=8122505A5B6F8D985A8D9D7E9E2FF4F3 -CT=8F72F8FFA71D24C900D2BBE8784B9C48 - -I=253 -KEY=B7D0E7B3556D2BA65170C9B1E62B442B -PT=8F72F8FFA71D24C900D2BBE8784B9C48 -CT=1D541D794774264680CF3689365CD845 - -I=254 -KEY=AA84FACA12190DE0D1BFFF38D0779C6E -PT=1D541D794774264680CF3689365CD845 -CT=CBAE9336C5C1F038176B5123CC205BF7 - -I=255 -KEY=612A69FCD7D8FDD8C6D4AE1B1C57C799 -PT=CBAE9336C5C1F038176B5123CC205BF7 -CT=C4CE2DC1BAE3028392BD8A005A360F56 - -I=256 -KEY=A5E4443D6D3BFF5B5469241B4661C8CF -PT=C4CE2DC1BAE3028392BD8A005A360F56 -CT=549B7075DE975B759A6DAE7D761CDC01 - -I=257 -KEY=F17F3448B3ACA42ECE048A66307D14CE -PT=549B7075DE975B759A6DAE7D761CDC01 -CT=2338FFEEE2A391B2DAFD1EBB0ECF19E3 - -I=258 -KEY=D247CBA6510F359C14F994DD3EB20D2D -PT=2338FFEEE2A391B2DAFD1EBB0ECF19E3 -CT=B27705C512C6849DE6012A490F834F36 - -I=259 -KEY=6030CE6343C9B101F2F8BE943131421B -PT=B27705C512C6849DE6012A490F834F36 -CT=33A239E0426921192F8C89C6FBCDD23C - -I=260 -KEY=5392F78301A09018DD743752CAFC9027 -PT=33A239E0426921192F8C89C6FBCDD23C -CT=90CCBE46338C7E9FB25409F82BF81234 - -I=261 -KEY=C35E49C5322CEE876F203EAAE1048213 -PT=90CCBE46338C7E9FB25409F82BF81234 -CT=873D1CAF1F2C2A56BEE419FE8A01489F - -I=262 -KEY=4463556A2D00C4D1D1C427546B05CA8C -PT=873D1CAF1F2C2A56BEE419FE8A01489F -CT=1E9ED35EB85ADD9AB88B6D85299FD8E7 - -I=263 -KEY=5AFD8634955A194B694F4AD1429A126B -PT=1E9ED35EB85ADD9AB88B6D85299FD8E7 -CT=36871F8BD629B27EEDE04E086FC539C4 - -I=264 -KEY=6C7A99BF4373AB3584AF04D92D5F2BAF -PT=36871F8BD629B27EEDE04E086FC539C4 -CT=10D10983F98D799235E8142BD67C1FD2 - -I=265 -KEY=7CAB903CBAFED2A7B14710F2FB23347D -PT=10D10983F98D799235E8142BD67C1FD2 -CT=193CEDEEE0410DE79F1B2FC077B14199 - -I=266 -KEY=65977DD25ABFDF402E5C3F328C9275E4 -PT=193CEDEEE0410DE79F1B2FC077B14199 -CT=1EC99AD6EEF155B6B5F61452D2E73A7D - -I=267 -KEY=7B5EE704B44E8AF69BAA2B605E754F99 -PT=1EC99AD6EEF155B6B5F61452D2E73A7D -CT=92DA7D1858210C87B32C6FEA1CC6A0E6 - -I=268 -KEY=E9849A1CEC6F86712886448A42B3EF7F -PT=92DA7D1858210C87B32C6FEA1CC6A0E6 -CT=A06C4ACCA35DE95CFAD365349969271D - -I=269 -KEY=49E8D0D04F326F2DD25521BEDBDAC862 -PT=A06C4ACCA35DE95CFAD365349969271D -CT=4B892CB63A35A3DED0F43BA4309CBB2E - -I=270 -KEY=0261FC667507CCF302A11A1AEB46734C -PT=4B892CB63A35A3DED0F43BA4309CBB2E -CT=E05F73446706A68A5099088279B58064 - -I=271 -KEY=E23E8F2212016A795238129892F3F328 -PT=E05F73446706A68A5099088279B58064 -CT=542D8314299AF433EC549EBFFCF2B3D9 - -I=272 -KEY=B6130C363B9B9E4ABE6C8C276E0140F1 -PT=542D8314299AF433EC549EBFFCF2B3D9 -CT=4935A91590E8A70D9F75489F6D5B70E7 - -I=273 -KEY=FF26A523AB7339472119C4B8035A3016 -PT=4935A91590E8A70D9F75489F6D5B70E7 -CT=C3A4940C6EC7D0E2F11C3CF60AB2C31D - -I=274 -KEY=3C82312FC5B4E9A5D005F84E09E8F30B -PT=C3A4940C6EC7D0E2F11C3CF60AB2C31D -CT=F109AC488D917B5FC28BA28C9720A46F - -I=275 -KEY=CD8B9D67482592FA128E5AC29EC85764 -PT=F109AC488D917B5FC28BA28C9720A46F -CT=65234934641FA21D8C3A3804D09208F3 - -I=276 -KEY=A8A8D4532C3A30E79EB462C64E5A5F97 -PT=65234934641FA21D8C3A3804D09208F3 -CT=DE015A71CB9C9A3B11C2C9B744B6B5ED - -I=277 -KEY=76A98E22E7A6AADC8F76AB710AECEA7A -PT=DE015A71CB9C9A3B11C2C9B744B6B5ED -CT=973D0C12D7826B45CC7824EF09D82BAB - -I=278 -KEY=E19482303024C199430E8F9E0334C1D1 -PT=973D0C12D7826B45CC7824EF09D82BAB -CT=EBD2D23B9D08F63385A0D21FF76FAC33 - -I=279 -KEY=0A46500BAD2C37AAC6AE5D81F45B6DE2 -PT=EBD2D23B9D08F63385A0D21FF76FAC33 -CT=A7A460A555E4C4E53457AE00FC0D9BA8 - -I=280 -KEY=ADE230AEF8C8F34FF2F9F3810856F64A -PT=A7A460A555E4C4E53457AE00FC0D9BA8 -CT=56F0329103B5238E03C781E2AB0E7A2D - -I=281 -KEY=FB12023FFB7DD0C1F13E7263A3588C67 -PT=56F0329103B5238E03C781E2AB0E7A2D -CT=0D5710472E980CF439109BAC3EAB19A8 - -I=282 -KEY=F6451278D5E5DC35C82EE9CF9DF395CF -PT=0D5710472E980CF439109BAC3EAB19A8 -CT=063CB786AD88ECADC4EAC8FE39A84286 - -I=283 -KEY=F079A5FE786D30980CC42131A45BD749 -PT=063CB786AD88ECADC4EAC8FE39A84286 -CT=825BD1E57F0E16D744C2A69233C8654B - -I=284 -KEY=7222741B0763264F480687A39793B202 -PT=825BD1E57F0E16D744C2A69233C8654B -CT=8EA54322F26DC051F831A5CBBD07A73C - -I=285 -KEY=FC873739F50EE61EB03722682A94153E -PT=8EA54322F26DC051F831A5CBBD07A73C -CT=803F3194726F4D5C5BD80D12D1284F0A - -I=286 -KEY=7CB806AD8761AB42EBEF2F7AFBBC5A34 -PT=803F3194726F4D5C5BD80D12D1284F0A -CT=5A1D90E682989AB1A84F01422CE69F82 - -I=287 -KEY=26A5964B05F931F343A02E38D75AC5B6 -PT=5A1D90E682989AB1A84F01422CE69F82 -CT=3F5AFCD41950EEFBC3D7CEF744F0C060 - -I=288 -KEY=19FF6A9F1CA9DF088077E0CF93AA05D6 -PT=3F5AFCD41950EEFBC3D7CEF744F0C060 -CT=2EE3691BD58D7645DA91CD4943F10157 - -I=289 -KEY=371C0384C924A94D5AE62D86D05B0481 -PT=2EE3691BD58D7645DA91CD4943F10157 -CT=BEF4B188364E87A9E49855CC68C02A50 - -I=290 -KEY=89E8B20CFF6A2EE4BE7E784AB89B2ED1 -PT=BEF4B188364E87A9E49855CC68C02A50 -CT=2263387A7A52AB73704774D07EA5AA69 - -I=291 -KEY=AB8B8A7685388597CE390C9AC63E84B8 -PT=2263387A7A52AB73704774D07EA5AA69 -CT=84E68DA3E9D999016D0B734DAE8C128B - -I=292 -KEY=2F6D07D56CE11C96A3327FD768B29633 -PT=84E68DA3E9D999016D0B734DAE8C128B -CT=978F5F49D7BA1189F16FC0635231DF5F - -I=293 -KEY=B8E2589CBB5B0D1F525DBFB43A83496C -PT=978F5F49D7BA1189F16FC0635231DF5F -CT=FE59B2F2BDE0AB5E1700A1771EDF8663 - -I=294 -KEY=46BBEA6E06BBA641455D1EC3245CCF0F -PT=FE59B2F2BDE0AB5E1700A1771EDF8663 -CT=A94B982DC50C338E25ABFB4113F904A8 - -I=295 -KEY=EFF07243C3B795CF60F6E58237A5CBA7 -PT=A94B982DC50C338E25ABFB4113F904A8 -CT=79A5BB282D8247192AC9F8A3DB431EA1 - -I=296 -KEY=9655C96BEE35D2D64A3F1D21ECE6D506 -PT=79A5BB282D8247192AC9F8A3DB431EA1 -CT=FC339DA0D4593CD79D407CD6F1E1E7ED - -I=297 -KEY=6A6654CB3A6CEE01D77F61F71D0732EB -PT=FC339DA0D4593CD79D407CD6F1E1E7ED -CT=08EAB51652B85C6E9BC07B718E57E144 - -I=298 -KEY=628CE1DD68D4B26F4CBF1A869350D3AF -PT=08EAB51652B85C6E9BC07B718E57E144 -CT=9EA63934609F947AAA926443D0D5BEFA - -I=299 -KEY=FC2AD8E9084B2615E62D7EC543856D55 -PT=9EA63934609F947AAA926443D0D5BEFA -CT=7FE121C45E158FF1F527BAFDDBEAE223 - -I=300 -KEY=83CBF92D565EA9E4130AC438986F8F76 -PT=7FE121C45E158FF1F527BAFDDBEAE223 -CT=B1B70D5AD08BE5DCB8126D8700F25969 - -I=301 -KEY=327CF47786D54C38AB18A9BF989DD61F -PT=B1B70D5AD08BE5DCB8126D8700F25969 -CT=389812FA2D4A6419380A2AC8961CCDA6 - -I=302 -KEY=0AE4E68DAB9F2821931283770E811BB9 -PT=389812FA2D4A6419380A2AC8961CCDA6 -CT=CEF20323EE53A2BA576F4DF86A7AC078 - -I=303 -KEY=C416E5AE45CC8A9BC47DCE8F64FBDBC1 -PT=CEF20323EE53A2BA576F4DF86A7AC078 -CT=A65611BF1901C940B883D746F1694278 - -I=304 -KEY=6240F4115CCD43DB7CFE19C9959299B9 -PT=A65611BF1901C940B883D746F1694278 -CT=7E43C2A99D11C656351B96CECD400E75 - -I=305 -KEY=1C0336B8C1DC858D49E58F0758D297CC -PT=7E43C2A99D11C656351B96CECD400E75 -CT=7DE74D06851AD329C60DD1934C34CBE4 - -I=306 -KEY=61E47BBE44C656A48FE85E9414E65C28 -PT=7DE74D06851AD329C60DD1934C34CBE4 -CT=A99B66FE5825C895DCC6BE718AB8BE34 - -I=307 -KEY=C87F1D401CE39E31532EE0E59E5EE21C -PT=A99B66FE5825C895DCC6BE718AB8BE34 -CT=4752E30DDA44BA393EF197270C111AB7 - -I=308 -KEY=8F2DFE4DC6A724086DDF77C2924FF8AB -PT=4752E30DDA44BA393EF197270C111AB7 -CT=5A3FC324D12AC30FE5BBE87FC4B655F0 - -I=309 -KEY=D5123D69178DE70788649FBD56F9AD5B -PT=5A3FC324D12AC30FE5BBE87FC4B655F0 -CT=79061587E9D9FEEF52F753AE9BCDC4B1 - -I=310 -KEY=AC1428EEFE5419E8DA93CC13CD3469EA -PT=79061587E9D9FEEF52F753AE9BCDC4B1 -CT=86C32E69874EAA0D103581199AFA813A - -I=311 -KEY=2AD70687791AB3E5CAA64D0A57CEE8D0 -PT=86C32E69874EAA0D103581199AFA813A -CT=82A924A5928570E29D18DE200F8558DD - -I=312 -KEY=A87E2222EB9FC30757BE932A584BB00D -PT=82A924A5928570E29D18DE200F8558DD -CT=2D3E0ECCC1FEA93736BD205A5217D830 - -I=313 -KEY=85402CEE2A616A306103B3700A5C683D -PT=2D3E0ECCC1FEA93736BD205A5217D830 -CT=52FA0FCF771191A4A4C4E48C7B11DC1F - -I=314 -KEY=D7BA23215D70FB94C5C757FC714DB422 -PT=52FA0FCF771191A4A4C4E48C7B11DC1F -CT=C2A47519AACA187B97C884D20ED1D825 - -I=315 -KEY=151E5638F7BAE3EF520FD32E7F9C6C07 -PT=C2A47519AACA187B97C884D20ED1D825 -CT=66F1D0799F3C473978C189F745695293 - -I=316 -KEY=73EF86416886A4D62ACE5AD93AF53E94 -PT=66F1D0799F3C473978C189F745695293 -CT=803361A1428EAC3E134B0726E5CF0754 - -I=317 -KEY=F3DCE7E02A0808E839855DFFDF3A39C0 -PT=803361A1428EAC3E134B0726E5CF0754 -CT=2CC85CEDEE03D7AB279D766D3F2BADF4 - -I=318 -KEY=DF14BB0DC40BDF431E182B92E0119434 -PT=2CC85CEDEE03D7AB279D766D3F2BADF4 -CT=706626C1CE6731DD4DBA263C4D7EAB67 - -I=319 -KEY=AF729DCC0A6CEE9E53A20DAEAD6F3F53 -PT=706626C1CE6731DD4DBA263C4D7EAB67 -CT=BD7A59659E3774B85465C91740017628 - -I=320 -KEY=1208C4A9945B9A2607C7C4B9ED6E497B -PT=BD7A59659E3774B85465C91740017628 -CT=F1778330059467556D08223682EC32AA - -I=321 -KEY=E37F479991CFFD736ACFE68F6F827BD1 -PT=F1778330059467556D08223682EC32AA -CT=7B3C6979DCEE500E3FBB2CF4E17B0A3B - -I=322 -KEY=98432EE04D21AD7D5574CA7B8EF971EA -PT=7B3C6979DCEE500E3FBB2CF4E17B0A3B -CT=AFEBC6E81B90C3D82ECE26D788AB2412 - -I=323 -KEY=37A8E80856B16EA57BBAECAC065255F8 -PT=AFEBC6E81B90C3D82ECE26D788AB2412 -CT=E4087042AB32B9C43128AADACB4F7FA6 - -I=324 -KEY=D3A0984AFD83D7614A924676CD1D2A5E -PT=E4087042AB32B9C43128AADACB4F7FA6 -CT=07E1230BC456A3DCE7DF8A4EF7265BC8 - -I=325 -KEY=D441BB4139D574BDAD4DCC383A3B7196 -PT=07E1230BC456A3DCE7DF8A4EF7265BC8 -CT=88F0C30172B9A0EA8CD657CE6847AC94 - -I=326 -KEY=5CB178404B6CD457219B9BF6527CDD02 -PT=88F0C30172B9A0EA8CD657CE6847AC94 -CT=710FE26B2DAB5A12D147D6446732B272 - -I=327 -KEY=2DBE9A2B66C78E45F0DC4DB2354E6F70 -PT=710FE26B2DAB5A12D147D6446732B272 -CT=9C30630A9ADF9B4EBF099452AB75D14A - -I=328 -KEY=B18EF921FC18150B4FD5D9E09E3BBE3A -PT=9C30630A9ADF9B4EBF099452AB75D14A -CT=77526DA4D9AE9FD4347AAC10EA4728AA - -I=329 -KEY=C6DC948525B68ADF7BAF75F0747C9690 -PT=77526DA4D9AE9FD4347AAC10EA4728AA -CT=A9EDBD1A190BC67AC91D27BB7F5A1BD1 - -I=330 -KEY=6F31299F3CBD4CA5B2B2524B0B268D41 -PT=A9EDBD1A190BC67AC91D27BB7F5A1BD1 -CT=B8700A2BAEABCB0C67251C26F82ACEF7 - -I=331 -KEY=D74123B4921687A9D5974E6DF30C43B6 -PT=B8700A2BAEABCB0C67251C26F82ACEF7 -CT=FF5F30BA14A8C49276B040B00864BE29 - -I=332 -KEY=281E130E86BE433BA3270EDDFB68FD9F -PT=FF5F30BA14A8C49276B040B00864BE29 -CT=B448E87BE1E1A41FF94353F6018929C8 - -I=333 -KEY=9C56FB75675FE7245A645D2BFAE1D457 -PT=B448E87BE1E1A41FF94353F6018929C8 -CT=9F59D422CB9265C17732E0B16DEF352A - -I=334 -KEY=030F2F57ACCD82E52D56BD9A970EE17D -PT=9F59D422CB9265C17732E0B16DEF352A -CT=06FD7DB54E62FAC3C511F4DE5C1E93B9 - -I=335 -KEY=05F252E2E2AF7826E8474944CB1072C4 -PT=06FD7DB54E62FAC3C511F4DE5C1E93B9 -CT=0DDA3E4AD600F8D3EA6B06AE465DF3BC - -I=336 -KEY=08286CA834AF80F5022C4FEA8D4D8178 -PT=0DDA3E4AD600F8D3EA6B06AE465DF3BC -CT=17305FA95D26FB72995165DA8A07FCDF - -I=337 -KEY=1F18330169897B879B7D2A30074A7DA7 -PT=17305FA95D26FB72995165DA8A07FCDF -CT=12B56FEBEE2773A2258FC6E0F9115728 - -I=338 -KEY=0DAD5CEA87AE0825BEF2ECD0FE5B2A8F -PT=12B56FEBEE2773A2258FC6E0F9115728 -CT=36440D1A561E8F77B89DF6EA3D8EC7F5 - -I=339 -KEY=3BE951F0D1B08752066F1A3AC3D5ED7A -PT=36440D1A561E8F77B89DF6EA3D8EC7F5 -CT=752C4D620413C0F4A313CF37EB34CFDD - -I=340 -KEY=4EC51C92D5A347A6A57CD50D28E122A7 -PT=752C4D620413C0F4A313CF37EB34CFDD -CT=B2A282D0B6A9EB8B7B7C962675AEC843 - -I=341 -KEY=FC679E42630AAC2DDE00432B5D4FEAE4 -PT=B2A282D0B6A9EB8B7B7C962675AEC843 -CT=D0C3D785B5507C1460DDC44B123ED5FE - -I=342 -KEY=2CA449C7D65AD039BEDD87604F713F1A -PT=D0C3D785B5507C1460DDC44B123ED5FE -CT=4DAE52B77F8001CBAB8D1949E73DD578 - -I=343 -KEY=610A1B70A9DAD1F215509E29A84CEA62 -PT=4DAE52B77F8001CBAB8D1949E73DD578 -CT=29AA82197E8158D88FFFE5BEAFC0C967 - -I=344 -KEY=48A09969D75B892A9AAF7B97078C2305 -PT=29AA82197E8158D88FFFE5BEAFC0C967 -CT=58C665AA97945F7D3AA23BE8B8DDA20D - -I=345 -KEY=1066FCC340CFD657A00D407FBF518108 -PT=58C665AA97945F7D3AA23BE8B8DDA20D -CT=5A104A7093DB3308EB4009829B5E26B1 - -I=346 -KEY=4A76B6B3D314E55F4B4D49FD240FA7B9 -PT=5A104A7093DB3308EB4009829B5E26B1 -CT=8C8EA0BEE4640F6BB6D906A7A6EA3810 - -I=347 -KEY=C6F8160D3770EA34FD944F5A82E59FA9 -PT=8C8EA0BEE4640F6BB6D906A7A6EA3810 -CT=1517ED0B6D4EC3B85479AB28DF48BFDB - -I=348 -KEY=D3EFFB065A3E298CA9EDE4725DAD2072 -PT=1517ED0B6D4EC3B85479AB28DF48BFDB -CT=9546CCBB8094E65E464C38E0809552E3 - -I=349 -KEY=46A937BDDAAACFD2EFA1DC92DD387291 -PT=9546CCBB8094E65E464C38E0809552E3 -CT=7D5AD8DEDB92F80D2B28C3458843AE84 - -I=350 -KEY=3BF3EF63013837DFC4891FD7557BDC15 -PT=7D5AD8DEDB92F80D2B28C3458843AE84 -CT=E62676E27ED61D0FD7DFE170E0938361 - -I=351 -KEY=DDD599817FEE2AD01356FEA7B5E85F74 -PT=E62676E27ED61D0FD7DFE170E0938361 -CT=DA9865198B9463681C66FB96C2C1DAA5 - -I=352 -KEY=074DFC98F47A49B80F300531772985D1 -PT=DA9865198B9463681C66FB96C2C1DAA5 -CT=62CD9DAA9487F34AF168E6E20A0684CF - -I=353 -KEY=6580613260FDBAF2FE58E3D37D2F011E -PT=62CD9DAA9487F34AF168E6E20A0684CF -CT=10BA978FDABA586691946145BE246D3C - -I=354 -KEY=753AF6BDBA47E2946FCC8296C30B6C22 -PT=10BA978FDABA586691946145BE246D3C -CT=13443CF524213B08776D7F5169B79C0F - -I=355 -KEY=667ECA489E66D99C18A1FDC7AABCF02D -PT=13443CF524213B08776D7F5169B79C0F -CT=6507336876ED4F6DB3E35D6CF5A89A2B - -I=356 -KEY=0379F920E88B96F1AB42A0AB5F146A06 -PT=6507336876ED4F6DB3E35D6CF5A89A2B -CT=B84902B5CBBC6DB8111CA45BC5F99991 - -I=357 -KEY=BB30FB952337FB49BA5E04F09AEDF397 -PT=B84902B5CBBC6DB8111CA45BC5F99991 -CT=20973140A999B8AD9982B9B706F7C32E - -I=358 -KEY=9BA7CAD58AAE43E423DCBD479C1A30B9 -PT=20973140A999B8AD9982B9B706F7C32E -CT=EE7FF1177C5E080AA03854A2A819565E - -I=359 -KEY=75D83BC2F6F04BEE83E4E9E5340366E7 -PT=EE7FF1177C5E080AA03854A2A819565E -CT=7A4F74EC2181269AC17D0E48A4DA2A88 - -I=360 -KEY=0F974F2ED7716D744299E7AD90D94C6F -PT=7A4F74EC2181269AC17D0E48A4DA2A88 -CT=5B7A7751F0FD91E203A14CE518838DD7 - -I=361 -KEY=54ED387F278CFC964138AB48885AC1B8 -PT=5B7A7751F0FD91E203A14CE518838DD7 -CT=71319FDDBACB038354A37A41F1910F94 - -I=362 -KEY=25DCA7A29D47FF15159BD10979CBCE2C -PT=71319FDDBACB038354A37A41F1910F94 -CT=81AC58FD503FC3AA78199168AE2C9085 - -I=363 -KEY=A470FF5FCD783CBF6D824061D7E75EA9 -PT=81AC58FD503FC3AA78199168AE2C9085 -CT=1F668F512038142C1155B950B0B040EC - -I=364 -KEY=BB16700EED4028937CD7F93167571E45 -PT=1F668F512038142C1155B950B0B040EC -CT=6B27D7791E9B14A5AC3D9582DBDBD929 - -I=365 -KEY=D031A777F3DB3C36D0EA6CB3BC8CC76C -PT=6B27D7791E9B14A5AC3D9582DBDBD929 -CT=9B7151FDC4E135EE93DAB2D9EB74D59C - -I=366 -KEY=4B40F68A373A09D84330DE6A57F812F0 -PT=9B7151FDC4E135EE93DAB2D9EB74D59C -CT=1F199945BCFA624B1AD3DCBBD95291B2 - -I=367 -KEY=54596FCF8BC06B9359E302D18EAA8342 -PT=1F199945BCFA624B1AD3DCBBD95291B2 -CT=E2C82FA8FE98F26283A6E0B75D0A58C6 - -I=368 -KEY=B6914067755899F1DA45E266D3A0DB84 -PT=E2C82FA8FE98F26283A6E0B75D0A58C6 -CT=5A240FFB99C3594C273B51CACF01B28B - -I=369 -KEY=ECB54F9CEC9BC0BDFD7EB3AC1CA1690F -PT=5A240FFB99C3594C273B51CACF01B28B -CT=D01847391534848FB102CA85C97749B1 - -I=370 -KEY=3CAD08A5F9AF44324C7C7929D5D620BE -PT=D01847391534848FB102CA85C97749B1 -CT=DC5CF60EBDF4A8DDDDF997E7ACA67515 - -I=371 -KEY=E0F1FEAB445BECEF9185EECE797055AB -PT=DC5CF60EBDF4A8DDDDF997E7ACA67515 -CT=749E3815FE305B307D9F4DB6A7E4658C - -I=372 -KEY=946FC6BEBA6BB7DFEC1AA378DE943027 -PT=749E3815FE305B307D9F4DB6A7E4658C -CT=8152C1E676A4FC8B0CD093FEB4B51615 - -I=373 -KEY=153D0758CCCF4B54E0CA30866A212632 -PT=8152C1E676A4FC8B0CD093FEB4B51615 -CT=0847044668710F6E5C93DD248AC921BA - -I=374 -KEY=1D7A031EA4BE443ABC59EDA2E0E80788 -PT=0847044668710F6E5C93DD248AC921BA -CT=1D6C3EFB413A59AB40F34CEFBFF25C17 - -I=375 -KEY=00163DE5E5841D91FCAAA14D5F1A5B9F -PT=1D6C3EFB413A59AB40F34CEFBFF25C17 -CT=5D7C206A79D61868FFE7AA28044996D3 - -I=376 -KEY=5D6A1D8F9C5205F9034D0B655B53CD4C -PT=5D7C206A79D61868FFE7AA28044996D3 -CT=78B4DE3B84D5D1010245CA3077A41BAC - -I=377 -KEY=25DEC3B41887D4F80108C1552CF7D6E0 -PT=78B4DE3B84D5D1010245CA3077A41BAC -CT=9E003AACEDECDBB077BDE832465F40C7 - -I=378 -KEY=BBDEF918F56B0F4876B529676AA89627 -PT=9E003AACEDECDBB077BDE832465F40C7 -CT=EEFF9E6C73E6DC5432AA446385AA1499 - -I=379 -KEY=55216774868DD31C441F6D04EF0282BE -PT=EEFF9E6C73E6DC5432AA446385AA1499 -CT=03252A19E37D9F040C56E4D712982798 - -I=380 -KEY=56044D6D65F04C18484989D3FD9AA526 -PT=03252A19E37D9F040C56E4D712982798 -CT=CF59A752BA0E14BE23AFD09437B39C65 - -I=381 -KEY=995DEA3FDFFE58A66BE65947CA293943 -PT=CF59A752BA0E14BE23AFD09437B39C65 -CT=8B08FB7974A77167DFB234F57C8DFFE1 - -I=382 -KEY=12551146AB5929C1B4546DB2B6A4C6A2 -PT=8B08FB7974A77167DFB234F57C8DFFE1 -CT=DD2A93C1106CFDAE4A1684EE02C82FE2 - -I=383 -KEY=CF7F8287BB35D46FFE42E95CB46CE940 -PT=DD2A93C1106CFDAE4A1684EE02C82FE2 -CT=38696128584F60636354E9F802590391 - -I=384 -KEY=F716E3AFE37AB40C9D1600A4B635EAD1 -PT=38696128584F60636354E9F802590391 -CT=7E552E3AD28729F642D590E3C289D598 - -I=385 -KEY=8943CD9531FD9DFADFC3904774BC3F49 -PT=7E552E3AD28729F642D590E3C289D598 -CT=17A40392AA00D7B5A6E9F59007E60C22 - -I=386 -KEY=9EE7CE079BFD4A4F792A65D7735A336B -PT=17A40392AA00D7B5A6E9F59007E60C22 -CT=A048D6755C2AD24DD8833DDCEB145BA6 - -I=387 -KEY=3EAF1872C7D79802A1A9580B984E68CD -PT=A048D6755C2AD24DD8833DDCEB145BA6 -CT=2F1CCE852396986EC4B2852E5F684CD2 - -I=388 -KEY=11B3D6F7E441006C651BDD25C726241F -PT=2F1CCE852396986EC4B2852E5F684CD2 -CT=2C28BD1E98DA63B95C0C81202BBCFE39 - -I=389 -KEY=3D9B6BE97C9B63D539175C05EC9ADA26 -PT=2C28BD1E98DA63B95C0C81202BBCFE39 -CT=6AE097A8E685B58BA2309B59D6A9EB2B - -I=390 -KEY=577BFC419A1ED65E9B27C75C3A33310D -PT=6AE097A8E685B58BA2309B59D6A9EB2B -CT=6EFC01751753999843A9BB6749097E0C - -I=391 -KEY=3987FD348D4D4FC6D88E7C3B733A4F01 -PT=6EFC01751753999843A9BB6749097E0C -CT=6B6B75F78016052E4F89C73EA826D2F2 - -I=392 -KEY=52EC88C30D5B4AE89707BB05DB1C9DF3 -PT=6B6B75F78016052E4F89C73EA826D2F2 -CT=1E9890E8F0AABCBFB8C4EDAEA0F563EF - -I=393 -KEY=4C74182BFDF1F6572FC356AB7BE9FE1C -PT=1E9890E8F0AABCBFB8C4EDAEA0F563EF -CT=143ED9FE6FD7DFB822C31DE8A3E868A9 - -I=394 -KEY=584AC1D5922629EF0D004B43D80196B5 -PT=143ED9FE6FD7DFB822C31DE8A3E868A9 -CT=9C2834AA5C95F2874DC6B267C0469E14 - -I=395 -KEY=C462F57FCEB3DB6840C6F924184708A1 -PT=9C2834AA5C95F2874DC6B267C0469E14 -CT=0720377F673352693EE2EF76D4FCFB0F - -I=396 -KEY=C342C200A98089017E241652CCBBF3AE -PT=0720377F673352693EE2EF76D4FCFB0F -CT=E83ED303F4B0ABF675C7BBC470B924FE - -I=397 -KEY=2B7C11035D3022F70BE3AD96BC02D750 -PT=E83ED303F4B0ABF675C7BBC470B924FE -CT=D87ADD68CBCAEA46DFFF99AE3723BC94 - -I=398 -KEY=F306CC6B96FAC8B1D41C34388B216BC4 -PT=D87ADD68CBCAEA46DFFF99AE3723BC94 -CT=2C290AE7C65B6E5BBAA32DE577DBA343 - -I=399 -KEY=DF2FC68C50A1A6EA6EBF19DDFCFAC887 -PT=2C290AE7C65B6E5BBAA32DE577DBA343 -CT=A04377ABE259B0D0B5BA2D40A501971B - -========================= - -KEYSIZE=192 - -I=0 -KEY=000000000000000000000000000000000000000000000000 -PT=00000000000000000000000000000000 -CT=F3F6752AE8D7831138F041560631B114 - -I=1 -KEY=AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114 -PT=F3F6752AE8D7831138F041560631B114 -CT=77BA00ED5412DFF27C8ED91F3C376172 - -I=2 -KEY=A92B07597B52873C844C75C7BCC55CE3447E98493A06D066 -PT=77BA00ED5412DFF27C8ED91F3C376172 -CT=2D92DE893574463412BD7D121A94952F - -I=3 -KEY=5FD632DA76165EDBA9DEAB4E89B11AD756C3E55B20924549 -PT=2D92DE893574463412BD7D121A94952F -CT=96650F835912F5E748422727802C6CE1 - -I=4 -KEY=984A4BEC5D3474103FBBA4CDD0A3EF301E81C27CA0BE29A8 -PT=96650F835912F5E748422727802C6CE1 -CT=5FCCD4B5F125ADC5B85A56DB32283732 - -I=5 -KEY=6B7EDEEAC755885F60777078218642F5A6DB94A792961E9A -PT=5FCCD4B5F125ADC5B85A56DB32283732 -CT=EA5B1DAE2E4F9FD254A2CC28E128EB9B - -I=6 -KEY=CA5585D8C9727F208A2C6DD60FC9DD27F279588F73BEF501 -PT=EA5B1DAE2E4F9FD254A2CC28E128EB9B -CT=BB87C0FF5DB4B2A593B93398407F823A - -I=7 -KEY=BADA7C0D4A0CDD4631ABAD29527D6F8261C06B1733C1773B -PT=BB87C0FF5DB4B2A593B93398407F823A -CT=D5AF7D56281F86E3E079BE6B9465DBB4 - -I=8 -KEY=FF98AB620A203FFCE404D07F7A62E96181B9D57CA7A4AC8F -PT=D5AF7D56281F86E3E079BE6B9465DBB4 -CT=511331CCA62B067CAC47475800EE33CD - -I=9 -KEY=1186A7F46656EA07B517E1B3DC49EF1D2DFE9224A74A9F42 -PT=511331CCA62B067CAC47475800EE33CD -CT=64ACDC3579D7871644DD585C582AF3A2 - -I=10 -KEY=313ADFF9712EABE4D1BB3D86A59E680B6923CA78FF606CE0 -PT=64ACDC3579D7871644DD585C582AF3A2 -CT=EA3C45FB8A6E548DAB14BAE07966246C - -I=11 -KEY=DDABAC02BE6C40493B87787D2FF03C86C23770988606488C -PT=EA3C45FB8A6E548DAB14BAE07966246C -CT=6BC276C465C9ADBE900049A5B58D2DCB - -I=12 -KEY=9A9F7E267C2BFCD150450EB94A3991385237393D338B6547 -PT=6BC276C465C9ADBE900049A5B58D2DCB -CT=E2F0FFA8D6DF327CA0FB80A325B21931 - -I=13 -KEY=80246B9FB6224226B2B5F1119CE6A344F2CCB99E16397C76 -PT=E2F0FFA8D6DF327CA0FB80A325B21931 -CT=ACEE4C9B8A00A7760DD9CD2F6C6DFA8C - -I=14 -KEY=60CDC3E8265B71E81E5BBD8A16E60432FF1574B17A5486FA -PT=ACEE4C9B8A00A7760DD9CD2F6C6DFA8C -CT=9579E43690FD2800FED810F7442D366B - -I=15 -KEY=9DEC584DB87D63F48B2259BC861B2C3201CD64463E79B091 -PT=9579E43690FD2800FED810F7442D366B -CT=72D4D064851A050D415FC94E3FBB6A1C - -I=16 -KEY=BBC1ED636907611EF9F689D80301293F4092AD0801C2DA8D -PT=72D4D064851A050D415FC94E3FBB6A1C -CT=0CCC3B9B35CE3584D7B78C14905BEE55 - -I=17 -KEY=AE398529289F7994F53AB24336CF1CBB9725211C919934D8 -PT=0CCC3B9B35CE3584D7B78C14905BEE55 -CT=66B6A61BF7BCC6392B8FEC12152E5363 - -I=18 -KEY=4617E60BD8AF29D5938C1458C173DA82BCAACD0E84B767BB -PT=66B6A61BF7BCC6392B8FEC12152E5363 -CT=6C2247EA3BC566A84A30BF0B30AB4EEC - -I=19 -KEY=6B762D1391AA17CBFFAE53B2FAB6BC2AF69A7205B41C2957 -PT=6C2247EA3BC566A84A30BF0B30AB4EEC -CT=C16FBCDFAE34E839BA449D697452550D - -I=20 -KEY=374499A8C09A60DA3EC1EF6D548254134CDEEF6CC04E7C5A -PT=C16FBCDFAE34E839BA449D697452550D -CT=C8B704B4AFE68AF5C91A810F2873F13F - -I=21 -KEY=09DCC638DD59F37CF676EBD9FB64DEE685C46E63E83D8D65 -PT=C8B704B4AFE68AF5C91A810F2873F13F -CT=FC9C31036B26234ED1CBA46E0BE944EE - -I=22 -KEY=CE2CEB8869D7EC160AEADADA9042FDA8540FCA0DE3D4C98B -PT=FC9C31036B26234ED1CBA46E0BE944EE -CT=DCF13203AD179CD008779F189EBC78F0 - -I=23 -KEY=505FBECF6B0B083CD61BE8D93D5561785C7855157D68B17B -PT=DCF13203AD179CD008779F189EBC78F0 -CT=24AEB937E259D44D352FF39C1A8A79E0 - -I=24 -KEY=1D1649FDB7484DD2F2B551EEDF0CB5356957A68967E2C89B -PT=24AEB937E259D44D352FF39C1A8A79E0 -CT=19016D033872CB7694A712A84DBC43F2 - -I=25 -KEY=9BE41771C0F74BDEEBB43CEDE77E7E43FDF0B4212A5E8B69 -PT=19016D033872CB7694A712A84DBC43F2 -CT=0536107FEA26AB6A4FE2667EF7FCF16A - -I=26 -KEY=FF3619AED9A1F724EE822C920D58D529B212D25FDDA27A03 -PT=0536107FEA26AB6A4FE2667EF7FCF16A -CT=5D35213390FCA53AD422DC2ED4BF674D - -I=27 -KEY=59D2F5AF4BB6F28BB3B70DA19DA4701366300E71091D1D4E -PT=5D35213390FCA53AD422DC2ED4BF674D -CT=04A6F9B1AE64AD03659C4E375A690852 - -I=28 -KEY=C8384D35CAF0074EB711F41033C0DD1003AC40465374151C -PT=04A6F9B1AE64AD03659C4E375A690852 -CT=18AB347EFC2F8F93655E16732BB509DE - -I=29 -KEY=910CE58F963B684EAFBAC06ECFEF528366F2563578C11CC2 -PT=18AB347EFC2F8F93655E16732BB509DE -CT=F6037C06C71793BD14A4FC89A05D918F - -I=30 -KEY=5D1EF94FBA1E098459B9BC6808F8C13E7256AABCD89C8D4D -PT=F6037C06C71793BD14A4FC89A05D918F -CT=75094DD9B2FDDAC96B49CAB676057288 - -I=31 -KEY=61FDA8DA3EF8949C2CB0F1B1BA051BF7191F600AAE99FFC5 -PT=75094DD9B2FDDAC96B49CAB676057288 -CT=346F9F9E70C05B53DCDAF736FE59749D - -I=32 -KEY=5C383CCC2DCAE66A18DF6E2FCAC540A4C5C5973C50C08B58 -PT=346F9F9E70C05B53DCDAF736FE59749D -CT=1DB82CC8EF5B736AAEFD1F1B9CE5B67D - -I=33 -KEY=1EC7FDBB8AE4FF05056742E7259E33CE6B388827CC253D25 -PT=1DB82CC8EF5B736AAEFD1F1B9CE5B67D -CT=31B5E80D946AE577268973AF865151EB - -I=34 -KEY=FFE21FDAB07E755034D2AAEAB1F4D6B94DB1FB884A746CCE -PT=31B5E80D946AE577268973AF865151EB -CT=9FD63EB3EC6A15FC149A4F058EDA7080 - -I=35 -KEY=7EC4053A63B2353BAB0494595D9EC345592BB48DC4AE1C4E -PT=9FD63EB3EC6A15FC149A4F058EDA7080 -CT=41730A9E9D197435AC36902C57B16588 - -I=36 -KEY=FB6D2FAFD47FE8D1EA779EC7C087B770F51D24A1931F79C6 -PT=41730A9E9D197435AC36902C57B16588 -CT=08AD282171F0772F85C0A43E8BACEC74 - -I=37 -KEY=9531B1BBE0863D44E2DAB6E6B177C05F70DD809F18B395B2 -PT=08AD282171F0772F85C0A43E8BACEC74 -CT=8561E508FA237E4170CECD3A8352CFA4 - -I=38 -KEY=0AB0CF2D1CA2957A67BB53EE4B54BE1E00134DA59BE15A16 -PT=8561E508FA237E4170CECD3A8352CFA4 -CT=4470EFA3C3172EBF64A064F59AE364A9 - -I=39 -KEY=291FD5C38E400CFA23CBBC4D884390A164B3295001023EBF -PT=4470EFA3C3172EBF64A064F59AE364A9 -CT=FCC5636DFE9E45CB7761DD14A1CF4773 - -I=40 -KEY=114E4DEF0447E1D5DF0EDF2076DDD56A13D2F444A0CD79CC -PT=FCC5636DFE9E45CB7761DD14A1CF4773 -CT=2130BA8736D4933678C3B536AEDBC500 - -I=41 -KEY=0C19F74860652278FE3E65A74009465C6B1141720E16BCCC -PT=2130BA8736D4933678C3B536AEDBC500 -CT=1725EECBA8F9A542E9956168390C82C2 - -I=42 -KEY=EF9E7E57576D8A3EE91B8B6CE8F0E31E8284201A371A3E0E -PT=1725EECBA8F9A542E9956168390C82C2 -CT=60912D3EEDC962D68A29AED73DDAA24D - -I=43 -KEY=CE6464925302B9F4898AA652053981C808AD8ECD0AC09C43 -PT=60912D3EEDC962D68A29AED73DDAA24D -CT=43A8B490BBC75DC8D2D2F060C8672E9E - -I=44 -KEY=8657F15C75C74469CA2212C2BEFEDC00DA7F7EADC2A7B2DD -PT=43A8B490BBC75DC8D2D2F060C8672E9E -CT=67D856AF692A4BA7DEC7C8C14A37BD50 - -I=45 -KEY=2D566517DCC2D4EBADFA446DD7D497A704B8B66C88900F8D -PT=67D856AF692A4BA7DEC7C8C14A37BD50 -CT=293C5A05F31E863C6CA26DB8018751CA - -I=46 -KEY=826DFA3FD5229B9B84C61E6824CA119B681ADBD489175E47 -PT=293C5A05F31E863C6CA26DB8018751CA -CT=9421BF2E7727F49C252D644B952C76C4 - -I=47 -KEY=A5A13E0D1C01D7CF10E7A14653EDE5074D37BF9F1C3B2883 -PT=9421BF2E7727F49C252D644B952C76C4 -CT=CEE8F6FCF7CAF1C5EA9F746C10BD405B - -I=48 -KEY=923D8EE015266BA8DE0F57BAA42714C2A7A8CBF30C8668D8 -PT=CEE8F6FCF7CAF1C5EA9F746C10BD405B -CT=403220B81E6E0837ACCEDA5ACB3730BE - -I=49 -KEY=B41FA03C1181401A9E3D7702BA491CF50B6611A9C7B15866 -PT=403220B81E6E0837ACCEDA5ACB3730BE -CT=8C5D05679F78F853CF83CB8E5BBEBA44 - -I=50 -KEY=00B6D7172075472F126072652531E4A6C4E5DA279C0FE222 -PT=8C5D05679F78F853CF83CB8E5BBEBA44 -CT=6F9C74C0BB40608AAD1A1202FCAF62EB - -I=51 -KEY=BEB1F890B29E8EFE7DFC06A59E71842C69FFC82560A080C9 -PT=6F9C74C0BB40608AAD1A1202FCAF62EB -CT=B812DB4E295951BB04B1636A9CE91DDB - -I=52 -KEY=9455ABC4AC495686C5EEDDEBB728D5976D4EAB4FFC499D12 -PT=B812DB4E295951BB04B1636A9CE91DDB -CT=B164574EAECAD5A06FFB4F3E6C607D61 - -I=53 -KEY=1E9CCB2A3541F810748A8AA519E2003702B5E4719029E073 -PT=B164574EAECAD5A06FFB4F3E6C607D61 -CT=1433D23C1500EDBA0EFFD03D96E18F20 - -I=54 -KEY=F4817B9409F1F1D160B958990CE2ED8D0C4A344C06C86F53 -PT=1433D23C1500EDBA0EFFD03D96E18F20 -CT=B81C889B6FAF5DA800AEBA561992853B - -I=55 -KEY=49F7CD1535080039D8A5D002634DB0250CE48E1A1F5AEA68 -PT=B81C889B6FAF5DA800AEBA561992853B -CT=5B558B7C5916CF14FA5BC9266CFE875F - -I=56 -KEY=FCD5479474EA721783F05B7E3A5B7F31F6BF473C73A46D37 -PT=5B558B7C5916CF14FA5BC9266CFE875F -CT=49BE310D74A9980E9A78B0A8BB3BA1AB - -I=57 -KEY=6A68208CC7D6782ECA4E6A734EF2E73F6CC7F794C89FCC9C -PT=49BE310D74A9980E9A78B0A8BB3BA1AB -CT=7BD5BABAD7F1EEAA56E17BF9B6678DC8 - -I=58 -KEY=38DE1A69C03EF9C1B19BD0C9990309953A268C6D7EF84154 -PT=7BD5BABAD7F1EEAA56E17BF9B6678DC8 -CT=62448A767C344E7E7CDB02112F475EFE - -I=59 -KEY=02634EC657B436A8D3DF5ABFE53747EB46FD8E7C51BF1FAA -PT=62448A767C344E7E7CDB02112F475EFE -CT=F490A20D8B5C53E34C4CF5B7B72A4591 - -I=60 -KEY=DCDAAB8CBD526850274FF8B26E6B14080AB17BCBE6955A3B -PT=F490A20D8B5C53E34C4CF5B7B72A4591 -CT=ACFFD7CD5C01B183AB92DBB62DC088F6 - -I=61 -KEY=51EB6B7172C22A248BB02F7F326AA58BA123A07DCB55D2CD -PT=ACFFD7CD5C01B183AB92DBB62DC088F6 -CT=0BEDDFA8E7A1AC84E3E164A59D599BAB - -I=62 -KEY=4796B5FA7B22626B805DF0D7D5CB090F42C2C4D8560C4966 -PT=0BEDDFA8E7A1AC84E3E164A59D599BAB -CT=9CC82E2B6B96254345C1FDBAD667275E - -I=63 -KEY=D8E112F9657BD2BF1C95DEFCBE5D2C4C07033962806B6E38 -PT=9CC82E2B6B96254345C1FDBAD667275E -CT=75926F4D3503411CD3C059DA4FFABD62 - -I=64 -KEY=A19B892107C4F8F86907B1B18B5E6D50D4C360B8CF91D35A -PT=75926F4D3503411CD3C059DA4FFABD62 -CT=1073561CF6BA28EC57F4B7E5073D27FA - -I=65 -KEY=AEFE35F52D8D54A27974E7AD7DE445BC8337D75DC8ACF4A0 -PT=1073561CF6BA28EC57F4B7E5073D27FA -CT=83E161BA51E6F3A4588C94F7A24BA81F - -I=66 -KEY=5E41A6382F88A350FA9586172C02B618DBBB43AA6AE75CBF -PT=83E161BA51E6F3A4588C94F7A24BA81F -CT=BD693B4C49378F17322D175932B87111 - -I=67 -KEY=A2D760EE839234F147FCBD5B6535390FE99654F3585F2DAE -PT=BD693B4C49378F17322D175932B87111 -CT=101A83CF8487BEDD2C93180BB5024EC9 - -I=68 -KEY=0F463C72AF8E4B5357E63E94E1B287D2C5054CF8ED5D6367 -PT=101A83CF8487BEDD2C93180BB5024EC9 -CT=757949BE62D3328D09E2F45DF2AD095A - -I=69 -KEY=C3C0A16686A5D66B229F772A8361B55FCCE7B8A51FF06A3D -PT=757949BE62D3328D09E2F45DF2AD095A -CT=63EBBF9E15BECEC1A0885BECB3D06BF8 - -I=70 -KEY=3A0B55738CF3B3E94174C8B496DF7B9E6C6FE349AC2001C5 -PT=63EBBF9E15BECEC1A0885BECB3D06BF8 -CT=E176B5C7AFCE06E8ED0C63A4CF7E3034 - -I=71 -KEY=450F848D964934DAA0027D7339117D76816380ED635E31F1 -PT=E176B5C7AFCE06E8ED0C63A4CF7E3034 -CT=97B91F0A898E5B3A77A0883140D477BC - -I=72 -KEY=F3AF781D6EA3529237BB6279B09F264CF6C308DC238A464D -PT=97B91F0A898E5B3A77A0883140D477BC -CT=346AD1C470309DFE6CB08DCC24E17470 - -I=73 -KEY=4E43AB584BF1F8C603D1B3BDC0AFBBB29A738510076B323D -PT=346AD1C470309DFE6CB08DCC24E17470 -CT=F8B462FB7D758B3AF2CDF7D9244B738F - -I=74 -KEY=5A1F023E8F0987B4FB65D146BDDA308868BE72C9232041B2 -PT=F8B462FB7D758B3AF2CDF7D9244B738F -CT=B44D090FD0B7F762146FF6301C6DBF54 - -I=75 -KEY=FFC4BB75031165DA4F28D8496D6DC7EA7CD184F93F4DFEE6 -PT=B44D090FD0B7F762146FF6301C6DBF54 -CT=15CB042313710F2CD1C3409B5F3AF419 - -I=76 -KEY=8107240E1FB855765AE3DC6A7E1CC8C6AD12C46260770AFF -PT=15CB042313710F2CD1C3409B5F3AF419 -CT=0AB01B03F415A58D52CF7A1E40856275 - -I=77 -KEY=4493743ADE27D1D85053C7698A096D4BFFDDBE7C20F2688A -PT=0AB01B03F415A58D52CF7A1E40856275 -CT=05BE037C28719B4C4EEBEA329FAC63D5 - -I=78 -KEY=F582EC062155016255EDC415A278F607B136544EBF5E0B5F -PT=05BE037C28719B4C4EEBEA329FAC63D5 -CT=74C3C4F42B3F575C6B8D5BAD9AF0191F - -I=79 -KEY=8FAF8EEAA5E2D76B212E00E18947A15BDABB0FE325AE1240 -PT=74C3C4F42B3F575C6B8D5BAD9AF0191F -CT=92CB4A3DF34E6711FB56391F26D949AD - -I=80 -KEY=1CAD393CC06BC104B3E54ADC7A09C64A21ED36FC03775BED -PT=92CB4A3DF34E6711FB56391F26D949AD -CT=3754BB3D8C3D7370EDBA842CDF17D5C0 - -I=81 -KEY=E3AB53BB36BDFBBB84B1F1E1F634B53ACC57B2D0DC608E2D -PT=3754BB3D8C3D7370EDBA842CDF17D5C0 -CT=94EAC7FD54D228619791BCCBF9F633F4 - -I=82 -KEY=480B1D923E853259105B361CA2E69D5B5BC60E1B2596BDD9 -PT=94EAC7FD54D228619791BCCBF9F633F4 -CT=CAB29222355968E9CF492D5BF08B0999 - -I=83 -KEY=D8F6791107FB3D26DAE9A43E97BFF5B2948F2340D51DB440 -PT=CAB29222355968E9CF492D5BF08B0999 -CT=00837C78B88005288DB39452F1EB8F13 - -I=84 -KEY=6521B6B771FE24B2DA6AD8462F3FF09A193CB71224F63B53 -PT=00837C78B88005288DB39452F1EB8F13 -CT=2082F77D48A63E223A79217CD4516854 - -I=85 -KEY=9D9F3198682E2476FAE82F3B6799CEB82345966EF0A75307 -PT=2082F77D48A63E223A79217CD4516854 -CT=C5074D4B3F455346B078DAFBC1327AB6 - -I=86 -KEY=61832291235DC7C33FEF627058DC9DFE933D4C95319529B1 -PT=C5074D4B3F455346B078DAFBC1327AB6 -CT=72EE56572A2B7CEC53FC4E4FC0293D63 - -I=87 -KEY=5C2877854338D45D4D01342772F7E112C0C102DAF1BC14D2 -PT=72EE56572A2B7CEC53FC4E4FC0293D63 -CT=7350039161DF9E8E45B360E6139E4226 - -I=88 -KEY=A8225CF65297BA953E5137B613287F9C8572623CE22256F4 -PT=7350039161DF9E8E45B360E6139E4226 -CT=4339288215BE1BB87E31AF8FB35DEDC1 - -I=89 -KEY=51649B52A8458F4B7D681F3406966424FB43CDB3517FBB35 -PT=4339288215BE1BB87E31AF8FB35DEDC1 -CT=4D7AB61CC2C930CBB0DF43EEE92EBA1F - -I=90 -KEY=750E4E7E9183E2FF3012A928C45F54EF4B9C8E5DB851012A -PT=4D7AB61CC2C930CBB0DF43EEE92EBA1F -CT=1090FE663EA77DC2EC30E8F89E662918 - -I=91 -KEY=B65FBDF702246E442082574EFAF8292DA7AC66A526372832 -PT=1090FE663EA77DC2EC30E8F89E662918 -CT=14307A2CC40BDFB0413DF10F961337CA - -I=92 -KEY=7BEC3480AA0A44FF34B22D623EF3F69DE69197AAB0241FF8 -PT=14307A2CC40BDFB0413DF10F961337CA -CT=8F378E272D82DE8E63EC418912EF8642 - -I=93 -KEY=63921E8700657D6ABB85A34513712813857DD623A2CB99BA -PT=8F378E272D82DE8E63EC418912EF8642 -CT=3947DDC00E3C4D958E508DF58AB4982A - -I=94 -KEY=754B2E8355FABCAF82C27E851D4D65860B2D5BD6287F0190 -PT=3947DDC00E3C4D958E508DF58AB4982A -CT=492DB375B3CC640DD8FEDBAF2C943535 - -I=95 -KEY=E8F8C2450F8597B3CBEFCDF0AE81018BD3D3807904EB34A5 -PT=492DB375B3CC640DD8FEDBAF2C943535 -CT=D74BD4118D448B674935B80E4B1BFB93 - -I=96 -KEY=34A2C5B010AE479A1CA419E123C58AEC9AE638774FF0CF36 -PT=D74BD4118D448B674935B80E4B1BFB93 -CT=E9742B41295BC3ED3AA66E80E8718665 - -I=97 -KEY=0E11D08AA9EC81A4F5D032A00A9E4901A04056F7A7814953 -PT=E9742B41295BC3ED3AA66E80E8718665 -CT=5FB17BFE146B410F90EC922B1385D0E4 - -I=98 -KEY=B15779E61FD27B02AA61495E1EF5080E30ACC4DCB40499B7 -PT=5FB17BFE146B410F90EC922B1385D0E4 -CT=1B0CCF643F19DDBC0E3ED0EEAE83ACC1 - -I=99 -KEY=861B580225193DD5B16D863A21ECD5B23E9214321A873576 -PT=1B0CCF643F19DDBC0E3ED0EEAE83ACC1 -CT=B3A7D434E30DC0CDEE4D17BBC27B855E - -I=100 -KEY=B6DF2A8726C31D6E02CA520EC2E1157FD0DF0389D8FCB028 -PT=B3A7D434E30DC0CDEE4D17BBC27B855E -CT=57DE2345D91E26A2AB7CA88AEA23A84F - -I=101 -KEY=6976D3780B5F01E25514714B1BFF33DD7BA3AB0332DF1867 -PT=57DE2345D91E26A2AB7CA88AEA23A84F -CT=7B03541D239B569FEE7ABD8980F1BD05 - -I=102 -KEY=734CAC477A2727542E1725563864654295D9168AB22EA562 -PT=7B03541D239B569FEE7ABD8980F1BD05 -CT=5CB7E72B2E6CFF8C18AEB026FE40C2FA - -I=103 -KEY=B59171BEBC7BFB8672A0C27D16089ACE8D77A6AC4C6E6798 -PT=5CB7E72B2E6CFF8C18AEB026FE40C2FA -CT=50B9186306DA92FE785D6EB9223E43A9 - -I=104 -KEY=E460BA8A2F82DBB72219DA1E10D20830F52AC8156E502431 -PT=50B9186306DA92FE785D6EB9223E43A9 -CT=B3D8CE8B04B99CF2F82571E1588C358B - -I=105 -KEY=CE7C790CD4B34C4791C11495146B94C20D0FB9F436DC11BA -PT=B3D8CE8B04B99CF2F82571E1588C358B -CT=9845F0A5681A40A6DC3D9BCA639FE786 - -I=106 -KEY=699FE59B482743180984E4307C71D464D132223E5543F63C -PT=9845F0A5681A40A6DC3D9BCA639FE786 -CT=C7EBF5CEAAD5652563A8550020EC7070 - -I=107 -KEY=FEBE2836F5099F53CE6F11FED6A4B141B29A773E75AF864C -PT=C7EBF5CEAAD5652563A8550020EC7070 -CT=DE94A376634FE9856A84E2EE6EED86E8 - -I=108 -KEY=22BCFFB0740FC30510FBB288B5EB58C4D81E95D01B4200A4 -PT=DE94A376634FE9856A84E2EE6EED86E8 -CT=64B9917E23328A4FE1F8FDB8AE43E7F3 - -I=109 -KEY=E8491AFDF41F0DFB744223F696D9D28B39E66868B501E757 -PT=64B9917E23328A4FE1F8FDB8AE43E7F3 -CT=2C59820184ABC99E82A7F51D4E3A86A8 - -I=110 -KEY=3BE5F390D72ABE6A581BA1F712721B15BB419D75FB3B61FF -PT=2C59820184ABC99E82A7F51D4E3A86A8 -CT=387ACD0BAD539773287C209A0876581F - -I=111 -KEY=B7388762F772C83560616CFCBF218C66933DBDEFF34D39E0 -PT=387ACD0BAD539773287C209A0876581F -CT=F12D3E1F21AFB9CACAB541EFB7334438 - -I=112 -KEY=FBD600191276FA5C914C52E39E8E35AC5988FC00447E7DD8 -PT=F12D3E1F21AFB9CACAB541EFB7334438 -CT=68D2FA1BB635D9D35E4BF440335CBD80 - -I=113 -KEY=1E2B19106450AA2FF99EA8F828BBEC7F07C308407722C058 -PT=68D2FA1BB635D9D35E4BF440335CBD80 -CT=4532507D5E0227054CB36CBD3C489D53 - -I=114 -KEY=C0B60F65BAD77DA4BCACF88576B9CB7A4B7064FD4B6A5D0B -PT=4532507D5E0227054CB36CBD3C489D53 -CT=6DB8FD7DE7924B7E92CF27BC0AD11D16 - -I=115 -KEY=451836B53318CC33D11405F8912B8004D9BF434141BB401D -PT=6DB8FD7DE7924B7E92CF27BC0AD11D16 -CT=A3D5F6A8D4372B66F8D3DD9FF945DECA - -I=116 -KEY=0E57235F9B527C5172C1F350451CAB62216C9EDEB8FE9ED7 -PT=A3D5F6A8D4372B66F8D3DD9FF945DECA -CT=BEDFF233AD31EEB9943EEBF52F66AABF - -I=117 -KEY=BB7E1C438E5F36A3CC1E0163E82D45DBB552752B97983468 -PT=BEDFF233AD31EEB9943EEBF52F66AABF -CT=4531EDEC06570582755199A0C4745EA5 - -I=118 -KEY=DE70EC87811AFD32892FEC8FEE7A4059C003EC8B53EC6ACD -PT=4531EDEC06570582755199A0C4745EA5 -CT=F3189383C202A472CE238571D187F8EB - -I=119 -KEY=CA2AE67397E9238A7A377F0C2C78E42B0E2069FA826B9226 -PT=F3189383C202A472CE238571D187F8EB -CT=B48952CBAC43D0114985A9035DFF0382 - -I=120 -KEY=335EF040D622E95BCEBE2DC7803B343A47A5C0F9DF9491A4 -PT=B48952CBAC43D0114985A9035DFF0382 -CT=9B71302FDFBC47DF6276AB73D4D0D8B3 - -I=121 -KEY=683CC10DFBC6C09C55CF1DE85F8773E525D36B8A0B444917 -PT=9B71302FDFBC47DF6276AB73D4D0D8B3 -CT=69EED4A0C5428005199DF12B338393E2 - -I=122 -KEY=B86C9A2F1A978E123C21C9489AC5F3E03C4E9AA138C7DAF5 -PT=69EED4A0C5428005199DF12B338393E2 -CT=D0C2ACA653E6D7D80D32F445B0DD2347 - -I=123 -KEY=EF7E3DCDF05FFA86ECE365EEC9232438317C6EE4881AF9B2 -PT=D0C2ACA653E6D7D80D32F445B0DD2347 -CT=F373D4DBD7ADAFEF582621EC8C7CD2A2 - -I=124 -KEY=B8059C7A6BA2273E1F90B1351E8E8BD7695A4F0804662B10 -PT=F373D4DBD7ADAFEF582621EC8C7CD2A2 -CT=0AD37AFC8C929513F9BDB976E69C7CF3 - -I=125 -KEY=F5C9ECCBB672D46F1543CBC9921C1EC490E7F67EE2FA57E3 -PT=0AD37AFC8C929513F9BDB976E69C7CF3 -CT=E80B118DFB34F11DB344B6AE34EDEBC8 - -I=126 -KEY=AA67DC18543A7A88FD48DA446928EFD923A340D0D617BC2B -PT=E80B118DFB34F11DB344B6AE34EDEBC8 -CT=628D5C42DDEBA9AE4983F51D339366B4 - -I=127 -KEY=BF0C30A039C0FEE89FC58606B4C346776A20B5CDE584DA9F -PT=628D5C42DDEBA9AE4983F51D339366B4 -CT=1BE2A5A8CCA8E065557F6982AF3E056F - -I=128 -KEY=A219F6B8E2FF1AA3842723AE786BA6123F5FDC4F4ABADFF0 -PT=1BE2A5A8CCA8E065557F6982AF3E056F -CT=5E1187D78AEB34780F07905A84D2EBBA - -I=129 -KEY=851DDD078D4B7802DA36A479F280926A30584C15CE68344A -PT=5E1187D78AEB34780F07905A84D2EBBA -CT=31EE3AC2EC79D14EBCA71E760326CD74 - -I=130 -KEY=E6741084FEDEEFFEEBD89EBB1EF943248CFF5263CD4EF93E -PT=31EE3AC2EC79D14EBCA71E760326CD74 -CT=298E3A00F280BBF8364CF8D6D44CF54E - -I=131 -KEY=8A41136FE9DB1FB5C256A4BBEC79F8DCBAB3AAB519020C70 -PT=298E3A00F280BBF8364CF8D6D44CF54E -CT=39B7A0416C1F9B19C7B99A1F6A70258C - -I=132 -KEY=E1F1B622EB8BC9B1FBE104FA806663C57D0A30AA737229FC -PT=39B7A0416C1F9B19C7B99A1F6A70258C -CT=B1655FA9AB2C4956E2C56F7A6C421BE5 - -I=133 -KEY=0EE0B7E1AF7093694A845B532B4A2A939FCF5FD01F303219 -PT=B1655FA9AB2C4956E2C56F7A6C421BE5 -CT=1AD9CBB1A28F7A2A6CBC7EC98EF483FC - -I=134 -KEY=180A2BD07F77D34E505D90E289C550B9F373211991C4B1E5 -PT=1AD9CBB1A28F7A2A6CBC7EC98EF483FC -CT=6363BE57D6D587EE3ABA9FE81F3D3A10 - -I=135 -KEY=848B7408CAACF02E333E2EB55F10D757C9C9BEF18EF98BF5 -PT=6363BE57D6D587EE3ABA9FE81F3D3A10 -CT=05618580D7915AA7398EF4DB7D1F1DE3 - -I=136 -KEY=E581D7B4F84F2860365FAB3588818DF0F0474A2AF3E69616 -PT=05618580D7915AA7398EF4DB7D1F1DE3 -CT=F8D0118087404FD729F96CA6551338AD - -I=137 -KEY=6C81D6873EFFF763CE8FBAB50FC1C227D9BE268CA6F5AEBB -PT=F8D0118087404FD729F96CA6551338AD -CT=784913B38D32A7395D73AF1378A0DC56 - -I=138 -KEY=D971137D872F606EB6C6A90682F3651E84CD899FDE5572ED -PT=784913B38D32A7395D73AF1378A0DC56 -CT=D07C418BD183457B6683AE99C457FC0B - -I=139 -KEY=196BBA79E35EEC7966BAE88D53702065E24E27061A028EE6 -PT=D07C418BD183457B6683AE99C457FC0B -CT=5595D16DF7668779825BC135D1408013 - -I=140 -KEY=6F140EC274635FA2332F39E0A416A71C6015E633CB420EF5 -PT=5595D16DF7668779825BC135D1408013 -CT=1AB9F5075E063403FEFD976044C89C95 - -I=141 -KEY=926F3A2AA0BD8C952996CCE7FA10931F9EE871538F8A9260 -PT=1AB9F5075E063403FEFD976044C89C95 -CT=6DF413E53FCEDA296D7ABA796179D600 - -I=142 -KEY=740F74BF0E0C38154462DF02C5DE4936F392CB2AEEF34460 -PT=6DF413E53FCEDA296D7ABA796179D600 -CT=0D0F499B0D51948A9CCBC4B6531A05F7 - -I=143 -KEY=2500C9B63042B24B496D9699C88FDDBC6F590F9CBDE94197 -PT=0D0F499B0D51948A9CCBC4B6531A05F7 -CT=85833A1072B6A0ED932D4D89D53A785A - -I=144 -KEY=FCB377C07622271FCCEEAC89BA397D51FC74421568D339CD -PT=85833A1072B6A0ED932D4D89D53A785A -CT=545EDE1A4B737F1E51CBDAE311E91D5C - -I=145 -KEY=BB108ABE391C394E98B07293F14A024FADBF98F6793A2491 -PT=545EDE1A4B737F1E51CBDAE311E91D5C -CT=DA8CC635CF1450685DDAAA5A56BC3BD9 - -I=146 -KEY=34F8623EC93A6C2A423CB4A63E5E5227F06532AC2F861F48 -PT=DA8CC635CF1450685DDAAA5A56BC3BD9 -CT=FE73162BF90B52DEE7D0EA9D73F8444D - -I=147 -KEY=5E3CB25583365D5EBC4FA28DC75500F917B5D8315C7E5B05 -PT=FE73162BF90B52DEE7D0EA9D73F8444D -CT=BC75D12F66C232E1979D0F6C3E1ED8F1 - -I=148 -KEY=EABE655116470AE1003A73A2A19732188028D75D626083F4 -PT=BC75D12F66C232E1979D0F6C3E1ED8F1 -CT=661A3FA0530BF47C266D609FE01DAF48 - -I=149 -KEY=97A1B8E97CF217C366204C02F29CC664A645B7C2827D2CBC -PT=661A3FA0530BF47C266D609FE01DAF48 -CT=791144514CF8E4CC15BC6ADE3291F9CD - -I=150 -KEY=5189DC6F535B5A091F310853BE6422A8B3F9DD1CB0ECD571 -PT=791144514CF8E4CC15BC6ADE3291F9CD -CT=4369FDB3626F399A6526C476373A52D4 - -I=151 -KEY=21CD36EDB27428AB5C58F5E0DC0B1B32D6DF196A87D687A5 -PT=4369FDB3626F399A6526C476373A52D4 -CT=4C8869494C044703CFDD09F83B2208AA - -I=152 -KEY=85C08C7D4667AE3710D09CA9900F5C3119021092BCF48F0F -PT=4C8869494C044703CFDD09F83B2208AA -CT=06BC45BDB38A7028CB2D189E9E0C3046 - -I=153 -KEY=807182BD7E1F29BE166CD91423852C19D22F080C22F8BF49 -PT=06BC45BDB38A7028CB2D189E9E0C3046 -CT=74AFD5F37F8F0712710585FB8DB22FF8 - -I=154 -KEY=1AF15D0DE00CEF3F62C30CE75C0A2B0BA32A8DF7AF4A90B1 -PT=74AFD5F37F8F0712710585FB8DB22FF8 -CT=B1A4EE894A12794E0C1A286DDBC01CFD - -I=155 -KEY=E0732BA619DCF2F5D367E26E16185245AF30A59A748A8C4C -PT=B1A4EE894A12794E0C1A286DDBC01CFD -CT=0EA90279135DFFC7F58DB959F9E8BFE1 - -I=156 -KEY=AE8779E669BFF77EDDCEE0170545AD825ABD1CC38D6233AD -PT=0EA90279135DFFC7F58DB959F9E8BFE1 -CT=3717C67E520D87778350E62525C01730 - -I=157 -KEY=79D13142BE9066A2EAD9266957482AF5D9EDFAE6A8A2249D -PT=3717C67E520D87778350E62525C01730 -CT=A8F96DA7AE81EF8810A317AB4C9B82A9 - -I=158 -KEY=597D70828E56003942204BCEF9C9C57DC94EED4DE439A634 -PT=A8F96DA7AE81EF8810A317AB4C9B82A9 -CT=8C373A065986BAC9E345475F5D83FBCF - -I=159 -KEY=96C8CF3884D5DA18CE1771C8A04F7FB42A0BAA12B9BA5DFB -PT=8C373A065986BAC9E345475F5D83FBCF -CT=8E4D562CBEDC360EFB25B857DD4C4FF2 - -I=160 -KEY=5A0A29B58F17F9F9405A27E41E9349BAD12E124564F61209 -PT=8E4D562CBEDC360EFB25B857DD4C4FF2 -CT=192CCD79E3B4C8F5617D1F55B789B7A3 - -I=161 -KEY=29A4692EDE3EAABE5976EA9DFD27814FB0530D10D37FA5AA -PT=192CCD79E3B4C8F5617D1F55B789B7A3 -CT=8A5F181E1748C98121D1C22204591B23 - -I=162 -KEY=5E5CA30210E78677D329F283EA6F48CE9182CF32D726BE89 -PT=8A5F181E1748C98121D1C22204591B23 -CT=14512A4997094A0536594E63ACC5EF4A - -I=163 -KEY=7DA5F9C99B68DFB0C778D8CA7D6602CBA7DB81517BE351C3 -PT=14512A4997094A0536594E63ACC5EF4A -CT=F91BA751D5E2ADC074FC6CC14476DE67 - -I=164 -KEY=658144C57CCFDAD83E637F9BA884AF0BD327ED903F958FA4 -PT=F91BA751D5E2ADC074FC6CC14476DE67 -CT=5F7FED22BABA25D48C95C4E2CAEDB3F4 - -I=165 -KEY=13C5D7A44396F6FD611C92B9123E8ADF5FB22972F5783C50 -PT=5F7FED22BABA25D48C95C4E2CAEDB3F4 -CT=0FCFB3CB93B2E7FDF7E156486929BD17 - -I=166 -KEY=99DBAC1D5D268DB06ED32172818C6D22A8537F3A9C518147 -PT=0FCFB3CB93B2E7FDF7E156486929BD17 -CT=3E16265A02271FF68AE6310A6BFDEE60 - -I=167 -KEY=A8876A49E2F1CC5250C5072883AB72D422B54E30F7AC6F27 -PT=3E16265A02271FF68AE6310A6BFDEE60 -CT=1657BF722B57D083D8864B6447317E05 - -I=168 -KEY=0A615A71BC2BE3E94692B85AA8FCA257FA330554B09D1122 -PT=1657BF722B57D083D8864B6447317E05 -CT=018B742E941E27C547451B9E41F245F5 - -I=169 -KEY=6AE11571E3D54C4B4719CC743CE28592BD761ECAF16F54D7 -PT=018B742E941E27C547451B9E41F245F5 -CT=8C5BB61774502B6A9C44BEE8D6C44A63 - -I=170 -KEY=DCE75079013F0865CB427A6348B2AEF82132A02227AB1EB4 -PT=8C5BB61774502B6A9C44BEE8D6C44A63 -CT=361D3B51C751298194CB1AA32C0A86EE - -I=171 -KEY=E73232D50D457866FD5F41328FE38779B5F9BA810BA1985A -PT=361D3B51C751298194CB1AA32C0A86EE -CT=7B734F34DD4F332CBE5CFC7659C390BF - -I=172 -KEY=BEEF9073227655EB862C0E0652ACB4550BA546F7526208E5 -PT=7B734F34DD4F332CBE5CFC7659C390BF -CT=63CCC9CE5DADA5B5AC68870E6C675943 - -I=173 -KEY=1E9078C198526C1DE5E0C7C80F0111E0A7CDC1F93E0551A6 -PT=63CCC9CE5DADA5B5AC68870E6C675943 -CT=7BBC6F7B62807CBE1C93CADB5E6CAE0A - -I=174 -KEY=AD26AC70784FF1B99E5CA8B36D816D5EBB5E0B226069FFAC -PT=7BBC6F7B62807CBE1C93CADB5E6CAE0A -CT=E95B0C766EF9049163D3A249E196DDB8 - -I=175 -KEY=E17835A277F1D1EE7707A4C5037869CFD88DA96B81FF2214 -PT=E95B0C766EF9049163D3A249E196DDB8 -CT=968263CBCDB4582FC9CDFD0C9FD0B4F0 - -I=176 -KEY=22F9EB31E67C62DBE185C70ECECC31E0114054671E2F96E4 -PT=968263CBCDB4582FC9CDFD0C9FD0B4F0 -CT=9F573A339DFA07B844E4034718A4FE88 - -I=177 -KEY=0FEC8766966A42DA7ED2FD3D5336365855A45720068B686C -PT=9F573A339DFA07B844E4034718A4FE88 -CT=A0809BA3A742C0EB1BDA613B7472F56A - -I=178 -KEY=98E655519C9A8A95DE52669EF474F6B34E7E361B72F99D06 -PT=A0809BA3A742C0EB1BDA613B7472F56A -CT=9BF1D85440818035FA6AC36E5A5F00A7 - -I=179 -KEY=A8D37BE0EB386F8045A3BECAB4F57686B414F57528A69DA1 -PT=9BF1D85440818035FA6AC36E5A5F00A7 -CT=924E309AC04A655C50980360914E9830 - -I=180 -KEY=7D89F156EA181E92D7ED8E5074BF13DAE48CF615B9E80591 -PT=924E309AC04A655C50980360914E9830 -CT=427819CDAE419A046D4586FF5A784A1C - -I=181 -KEY=B028A265666F69629595979DDAFE89DE89C970EAE3904F8D -PT=427819CDAE419A046D4586FF5A784A1C -CT=D8B51EEC0A6A6D17F1E476C922AD8548 - -I=182 -KEY=DF20B45B990C5E734D208971D094E4C9782D0623C13DCAC5 -PT=D8B51EEC0A6A6D17F1E476C922AD8548 -CT=7823F1BBA96105168195CDAC34AB5315 - -I=183 -KEY=AF4C64F7E4AA6DE2350378CA79F5E1DFF9B8CB8FF59699D0 -PT=7823F1BBA96105168195CDAC34AB5315 -CT=85DD0256BC29EAA867DB77C1A049574D - -I=184 -KEY=4047F74604E37A00B0DE7A9CC5DC0B779E63BC4E55DFCE9D -PT=85DD0256BC29EAA867DB77C1A049574D -CT=64C1880D34408CB1A92BBA354941D5B6 - -I=185 -KEY=9C3BF36E47110C08D41FF291F19C87C63748067B1C9E1B2B -PT=64C1880D34408CB1A92BBA354941D5B6 -CT=25B80866FE3198C775F64C412E734348 - -I=186 -KEY=FAE7368F99242159F1A7FAF70FAD1F0142BE4A3A32ED5863 -PT=25B80866FE3198C775F64C412E734348 -CT=8D3D7E9A195363C96334C48120BC343A - -I=187 -KEY=5F48BD86A9C4DC897C9A846D16FE7CC8218A8EBB12516C59 -PT=8D3D7E9A195363C96334C48120BC343A -CT=E886EEA0F2D556D693DC94FFC588D1F4 - -I=188 -KEY=B7406993C120EA20941C6ACDE42B2A1EB2561A44D7D9BDAD -PT=E886EEA0F2D556D693DC94FFC588D1F4 -CT=76CB89CBB935D422DED9784D4548A84F - -I=189 -KEY=4DB740C3FA55F4ABE2D7E3065D1EFE3C6C8F6209929115E2 -PT=76CB89CBB935D422DED9784D4548A84F -CT=93D7AC7B18A1196D5C166203C44A43D3 - -I=190 -KEY=353A0293DEFB648071004F7D45BFE7513099000A56DB5631 -PT=93D7AC7B18A1196D5C166203C44A43D3 -CT=8982BD77485524EE9E49769591E922CE - -I=191 -KEY=F6FC1F7E838CD8A7F882F20A0DEAC3BFAED0769FC73274FF -PT=8982BD77485524EE9E49769591E922CE -CT=89012A1E3F7669C76C5F5F4987108662 - -I=192 -KEY=A1AA84E01EBC3E837183D814329CAA78C28F29D64022F29D -PT=89012A1E3F7669C76C5F5F4987108662 -CT=139E37ADA17990054AF8EF5B717E884B - -I=193 -KEY=C631229E9871F2AC621DEFB993E53A7D8877C68D315C7AD6 -PT=139E37ADA17990054AF8EF5B717E884B -CT=CEC8F9C90B2E393BDA4602C2A83F953C - -I=194 -KEY=824604723CD82F95ACD5167098CB03465231C44F9963EFEA -PT=CEC8F9C90B2E393BDA4602C2A83F953C -CT=2A2E1344AE4C6BA40568E170BF67FD74 - -I=195 -KEY=2B17489FA71F683B86FB0534368768E25759253F2604129E -PT=2A2E1344AE4C6BA40568E170BF67FD74 -CT=7402AC6982DBB0BED678746E4523556C - -I=196 -KEY=DA9C0CF5A89D3D94F2F9A95DB45CD85C81215151632747F2 -PT=7402AC6982DBB0BED678746E4523556C -CT=36A36B5B55F950F00B9F3E31156BFD65 - -I=197 -KEY=543619886B56830BC45AC206E1A588AC8ABE6F60764CBA97 -PT=36A36B5B55F950F00B9F3E31156BFD65 -CT=D7B36A117E824A49A5944C37BEE27F06 - -I=198 -KEY=9494630598E7618213E9A8179F27C2E52F2A2357C8AEC591 -PT=D7B36A117E824A49A5944C37BEE27F06 -CT=2D60BC0BC950EEE7E36D50E971CF68D0 - -I=199 -KEY=B0328218DF523A0C3E89141C56772C02CC4773BEB961AD41 -PT=2D60BC0BC950EEE7E36D50E971CF68D0 -CT=49A4643E535F45A1ABDEF41ABABBE268 - -I=200 -KEY=5E3FD7ACD8EF334D772D7022052869A3679987A403DA4F29 -PT=49A4643E535F45A1ABDEF41ABABBE268 -CT=D5EEB5CC40AF8612708BAABE85685E4C - -I=201 -KEY=A232D0267D606002A2C3C5EE4587EFB117122D1A86B21165 -PT=D5EEB5CC40AF8612708BAABE85685E4C -CT=3F5B875DE202C5441165FE5C5CA2D258 - -I=202 -KEY=844ED6FAFA342BFE9D9842B3A7852AF50677D346DA10C33D -PT=3F5B875DE202C5441165FE5C5CA2D258 -CT=9B5F0210E0EC623C6ACF1C0BC06EBF51 - -I=203 -KEY=109F8CEC689E0F5306C740A3476948C96CB8CF4D1A7E7C6C -PT=9B5F0210E0EC623C6ACF1C0BC06EBF51 -CT=E57015FAB0006446E544704DB6629059 - -I=204 -KEY=D9ABCBAC4B271B04E3B75559F7692C8F89FCBF00AC1CEC35 -PT=E57015FAB0006446E544704DB6629059 -CT=85F0DF6B1ED933E87F6A9F609D516346 - -I=205 -KEY=09915869AE1F57F766478A32E9B01F67F6962060314D8F73 -PT=85F0DF6B1ED933E87F6A9F609D516346 -CT=471B931539C155478A1D4B9BA50DCE43 - -I=206 -KEY=BFB70AA6C4F05C1D215C1927D0714A207C8B6BFB94404130 -PT=471B931539C155478A1D4B9BA50DCE43 -CT=9AC55C1CC77E7B59CC9204898A38CEA7 - -I=207 -KEY=660972D79B056F14BB99453B170F3179B0196F721E788F97 -PT=9AC55C1CC77E7B59CC9204898A38CEA7 -CT=19B00FEB13145F9F356173B42184D516 - -I=208 -KEY=F09576EB17FB1A07A2294AD0041B6EE685781CC63FFC5A81 -PT=19B00FEB13145F9F356173B42184D516 -CT=5F1379E25F6DD8653B73F58E738D6243 - -I=209 -KEY=8D170BBC5E3662BEFD3A33325B76B683BE0BE9484C7138C2 -PT=5F1379E25F6DD8653B73F58E738D6243 -CT=AEF55C09E7AD76CC9BA7B83874A0A86B - -I=210 -KEY=1A7BD2572D3CDB8C53CF6F3BBCDBC04F25AC517038D190A9 -PT=AEF55C09E7AD76CC9BA7B83874A0A86B -CT=6BEF52E6D86DC15D2A03B5CB3EBAB130 - -I=211 -KEY=B4BC0603F59BE3D038203DDD64B601120FAFE4BB066B2199 -PT=6BEF52E6D86DC15D2A03B5CB3EBAB130 -CT=FDC093FFED096B7812E77E23AD9C7C71 - -I=212 -KEY=C00A0DDA74D55250C5E0AE2289BF6A6A1D489A98ABF75DE8 -PT=FDC093FFED096B7812E77E23AD9C7C71 -CT=072625CB0C022827E195DE8AB4FE7E0C - -I=213 -KEY=6534CBAB46880CE0C2C68BE985BD424DFCDD44121F0923E4 -PT=072625CB0C022827E195DE8AB4FE7E0C -CT=11AA47C5557437AEE8A8BE31A849A047 - -I=214 -KEY=C204AFE794D81224D36CCC2CD0C975E31475FA23B74083A3 -PT=11AA47C5557437AEE8A8BE31A849A047 -CT=4C91B3031567DFFC22829CBC3C419B6D - -I=215 -KEY=01A4820CC4D281B99FFD7F2FC5AEAA1F36F7669F8B0118CE -PT=4C91B3031567DFFC22829CBC3C419B6D -CT=54C0F95B0179CB753917A2592F58BD77 - -I=216 -KEY=B5C1DD77446C8FD1CB3D8674C4D7616A0FE0C4C6A459A5B9 -PT=54C0F95B0179CB753917A2592F58BD77 -CT=A2A19A98250E432131F9EF4AE473677F - -I=217 -KEY=9FDC1167AC2D1A51699C1CECE1D9224B3E192B8C402AC2C6 -PT=A2A19A98250E432131F9EF4AE473677F -CT=9B5780CA9669A92688F54887E303F2D3 - -I=218 -KEY=C734A73F4A32D311F2CB9C2677B08B6DB6EC630BA3293015 -PT=9B5780CA9669A92688F54887E303F2D3 -CT=F1750745D1E74E41A07B99482ECABAAA - -I=219 -KEY=1612B86730F487EF03BE9B63A657C52C1697FA438DE38ABF -PT=F1750745D1E74E41A07B99482ECABAAA -CT=30F510DBDDAEC6FC0D2504C11DF23CFA - -I=220 -KEY=D52E3B50F72B085D334B8BB87BF903D01BB2FE829011B645 -PT=30F510DBDDAEC6FC0D2504C11DF23CFA -CT=64998C3018185D722477A2DBFB84ABB8 - -I=221 -KEY=7F9F2A23D320792E57D2078863E15EA23FC55C596B951DFD -PT=64998C3018185D722477A2DBFB84ABB8 -CT=9293A4FF9ED5D57D81BB8A63381BF66A - -I=222 -KEY=B529B6E7080E0AE4C541A377FD348BDFBE7ED63A538EEB97 -PT=9293A4FF9ED5D57D81BB8A63381BF66A -CT=A389ABCF609B41F28CC3188B2C126915 - -I=223 -KEY=A5C4C3A89459F79566C808B89DAFCA2D32BDCEB17F9C8282 -PT=A389ABCF609B41F28CC3188B2C126915 -CT=5F4BC60608A3DF788631EBB66763E7DF - -I=224 -KEY=F59456291C6CF0C83983CEBE950C1555B48C250718FF655D -PT=5F4BC60608A3DF788631EBB66763E7DF -CT=EFDE2113118EDFD5A15D4DFA1C1E79B4 - -I=225 -KEY=9A4CD87E44EA7DEED65DEFAD8482CA8015D168FD04E11CE9 -PT=EFDE2113118EDFD5A15D4DFA1C1E79B4 -CT=2526BA56DA8A9F9A5799A9D2BE96AEBA - -I=226 -KEY=A19D5DFAEC1C9B9DF37B55FB5E08551A4248C12FBA77B253 -PT=2526BA56DA8A9F9A5799A9D2BE96AEBA -CT=83F237712EF89A7B1E84D69DEFC9B9B9 - -I=227 -KEY=C48B0103470544867089628A70F0CF615CCC17B255BE0BEA -PT=83F237712EF89A7B1E84D69DEFC9B9B9 -CT=13B7E26895FEEFE2356306D8D822DDD3 - -I=228 -KEY=B366B0FE6BB3DB17633E80E2E50E208369AF116A8D9CD639 -PT=13B7E26895FEEFE2356306D8D822DDD3 -CT=BF8C47559B230A3311543BEAA90D4DA1 - -I=229 -KEY=BE5A735484B72645DCB2C7B77E2D2AB078FB2A8024919B98 -PT=BF8C47559B230A3311543BEAA90D4DA1 -CT=D3C9AFCED64F46AC74FFF73302DE10EB - -I=230 -KEY=1DFD852FE9F131840F7B6879A8626C1C0C04DDB3264F8B73 -PT=D3C9AFCED64F46AC74FFF73302DE10EB -CT=004386EABD8F3C60971D34B5A5F220F8 - -I=231 -KEY=BB9831D80259A5A40F38EE9315ED507C9B19E90683BDAB8B -PT=004386EABD8F3C60971D34B5A5F220F8 -CT=119A244F6A3ED1947A764CFE96568213 - -I=232 -KEY=93B0F09E78E610741EA2CADC7FD381E8E16FA5F815EB2998 -PT=119A244F6A3ED1947A764CFE96568213 -CT=4C8D061BD62737E674DDCACEFC37DA11 - -I=233 -KEY=43E5036A09590404522FCCC7A9F4B60E95B26F36E9DCF389 -PT=4C8D061BD62737E674DDCACEFC37DA11 -CT=7B5EFE44536B5AB9CF75A457BB8C2417 - -I=234 -KEY=869CF7BF36FBB5D829713283FA9FECB75AC7CB615250D79E -PT=7B5EFE44536B5AB9CF75A457BB8C2417 -CT=25771915A1C0F8149634963E1C91BD26 - -I=235 -KEY=C9BD373897A760E30C062B965B5F14A3CCF35D5F4EC16AB8 -PT=25771915A1C0F8149634963E1C91BD26 -CT=8BB2BC7E7BAAEA1AAF7A9E285BEEB8F1 - -I=236 -KEY=D2EE543EACA1592687B497E820F5FEB96389C377152FD249 -PT=8BB2BC7E7BAAEA1AAF7A9E285BEEB8F1 -CT=05556B6AB68D2DABCDB32FB724D44F57 - -I=237 -KEY=9583438F7194754F82E1FC829678D312AE3AECC031FB9D1E -PT=05556B6AB68D2DABCDB32FB724D44F57 -CT=A4CE8197B0EAE6AD57D5A0630D0CABD0 - -I=238 -KEY=A5B96A3EFB2EF0C7262F7D15269235BFF9EF4CA33CF736CE -PT=A4CE8197B0EAE6AD57D5A0630D0CABD0 -CT=8E40F09865AA8EA114EA7F36E11815C3 - -I=239 -KEY=8E7A04E47969F5DBA86F8D8D4338BB1EED053395DDEF230D -PT=8E40F09865AA8EA114EA7F36E11815C3 -CT=194A76947319ED92D96D292684C29B5A - -I=240 -KEY=E52197304B446A01B125FB193021568C34681AB3592DB857 -PT=194A76947319ED92D96D292684C29B5A -CT=93526BBB6405BDEA68AC01F1C807EBF7 - -I=241 -KEY=DA4552EC2C076DC3227790A25424EB665CC41B42912A53A0 -PT=93526BBB6405BDEA68AC01F1C807EBF7 -CT=59860971F900B739B36CB97D35B082D1 - -I=242 -KEY=E7329ED9491CA8227BF199D3AD245C5FEFA8A23FA49AD171 -PT=59860971F900B739B36CB97D35B082D1 -CT=92F430D5B1F35B469ECDDFDCB2A110F5 - -I=243 -KEY=1ADC19560D9AEF09E905A9061CD7071971657DE3163BC184 -PT=92F430D5B1F35B469ECDDFDCB2A110F5 -CT=F81D2505FD9A569A71502B23894DA535 - -I=244 -KEY=6ED932F2BEBD486911188C03E14D5183003556C09F7664B1 -PT=F81D2505FD9A569A71502B23894DA535 -CT=93BACD72A0E761D34E8603FC44F6BA5E - -I=245 -KEY=F0A52339F0C68F5782A2417141AA30504EB3553CDB80DEEF -PT=93BACD72A0E761D34E8603FC44F6BA5E -CT=631DB808708B5EBB54A2DE6B62519235 - -I=246 -KEY=0B262E7EA7109C03E1BFF97931216EEB1A118B57B9D14CDA -PT=631DB808708B5EBB54A2DE6B62519235 -CT=C402023DA5F2F230FEEACE1C5F8B5390 - -I=247 -KEY=1E7EB042CA0EA74F25BDFB4494D39CDBE4FB454BE65A1F4A -PT=C402023DA5F2F230FEEACE1C5F8B5390 -CT=CAD88E79E0AB4A3B324F6D3ABBEA211C - -I=248 -KEY=215E3E970705BE3DEF65753D7478D6E0D6B428715DB03E56 -PT=CAD88E79E0AB4A3B324F6D3ABBEA211C -CT=1B2303C4FEB78105B5BF35BC1C5C2FF9 - -I=249 -KEY=512CE443B55593D9F44676F98ACF57E5630B1DCD41EC11AF -PT=1B2303C4FEB78105B5BF35BC1C5C2FF9 -CT=06CAE1EED611AF829C83216697F8AEFA - -I=250 -KEY=533251960972B2BFF28C97175CDEF867FF883CABD614BF55 -PT=06CAE1EED611AF829C83216697F8AEFA -CT=170194A7E4E85B0A339BF86460E5ABC6 - -I=251 -KEY=B484A158FBC3D31FE58D03B0B836A36DCC13C4CFB6F11493 -PT=170194A7E4E85B0A339BF86460E5ABC6 -CT=AF7014D972F55B0CD759CAFBC0D9483B - -I=252 -KEY=C470759A6962C1934AFD1769CAC3F8611B4A0E3476285CA8 -PT=AF7014D972F55B0CD759CAFBC0D9483B -CT=E8BD547419DADD980682B701CCEF3C7E - -I=253 -KEY=D27A5BF9DD3B6F61A240431DD31925F91DC8B935BAC760D6 -PT=E8BD547419DADD980682B701CCEF3C7E -CT=E8F9CFAA891A471EBBC5806F03E0E18A - -I=254 -KEY=041C2FF776BAF2334AB98CB75A0362E7A60D395AB927815C -PT=E8F9CFAA891A471EBBC5806F03E0E18A -CT=F90F888C03CEBFC9A807DF2100488B24 - -I=255 -KEY=9BB4307835C91BA4B3B6043B59CDDD2E0E0AE67BB96F0A78 -PT=F90F888C03CEBFC9A807DF2100488B24 -CT=7874C642B44810334C2CF572DA0DEF68 - -I=256 -KEY=56E742B84F293B68CBC2C279ED85CD1D422613096362E510 -PT=7874C642B44810334C2CF572DA0DEF68 -CT=064513BBD5E667B651B93502E86B6C43 - -I=257 -KEY=66E28C26E01570FCCD87D1C23863AAAB139F260B8B098953 -PT=064513BBD5E667B651B93502E86B6C43 -CT=D461A03D7D8669BBC32430D00D437E59 - -I=258 -KEY=5674831937969B7619E671FF45E5C310D0BB16DB864AF70A -PT=D461A03D7D8669BBC32430D00D437E59 -CT=0A07F858DBD1909FF970C95ED7287FB3 - -I=259 -KEY=D45BCD0FF3E14A7013E189A79E34538F29CBDF85516288B9 -PT=0A07F858DBD1909FF970C95ED7287FB3 -CT=C2E45D29C1DF02CB4D768682ADD73E6B - -I=260 -KEY=40F81EBEF03AAAABD105D48E5FEB514464BD5907FCB5B6D2 -PT=C2E45D29C1DF02CB4D768682ADD73E6B -CT=01E21E496061DAC195F24F6D1CF22B8A - -I=261 -KEY=99C8875EE8221C3FD0E7CAC73F8A8B85F14F166AE0479D58 -PT=01E21E496061DAC195F24F6D1CF22B8A -CT=71D1C35E1126F6907CDB5414B8C97E84 - -I=262 -KEY=F1582613B3466D7FA13609992EAC7D158D94427E588EE3DC -PT=71D1C35E1126F6907CDB5414B8C97E84 -CT=8B7BBAF63C993D4BBB098A22D00C5608 - -I=263 -KEY=4679A2F69656CFD32A4DB36F1235405E369DC85C8882B5D4 -PT=8B7BBAF63C993D4BBB098A22D00C5608 -CT=651B19F5C1B67FC52151E7C5F1246485 - -I=264 -KEY=A404FC3490DFC7244F56AA9AD3833F9B17CC2F9979A6D151 -PT=651B19F5C1B67FC52151E7C5F1246485 -CT=158F0AE36B5585868DFB998520318FEB - -I=265 -KEY=F7DCCA4394981F2D5AD9A079B8D6BA1D9A37B61C59975EBA -PT=158F0AE36B5585868DFB998520318FEB -CT=B62EC94231405F3FB0D160FBFF2DE27E - -I=266 -KEY=1F38711C9B6BD060ECF7693B8996E5222AE6D6E7A6BABCC4 -PT=B62EC94231405F3FB0D160FBFF2DE27E -CT=464AFFA35373CEE71523FF0AFBFB1F51 - -I=267 -KEY=6B846AAC0C448654AABD9698DAE52BC53FC529ED5D41A395 -PT=464AFFA35373CEE71523FF0AFBFB1F51 -CT=C729EA9A05D5482491CE31DBBC03CE24 - -I=268 -KEY=BD539A9B4001B6876D947C02DF3063E1AE0B1836E1426DB1 -PT=C729EA9A05D5482491CE31DBBC03CE24 -CT=C755C048ADAD22A628B077163097415F - -I=269 -KEY=18B524EEF606589DAAC1BC4A729D414786BB6F20D1D52CEE -PT=C755C048ADAD22A628B077163097415F -CT=2DADB8F8FC76D8C997627449E44D14B2 - -I=270 -KEY=3C2C6A047706E3DD876C04B28EEB998E11D91B693598385C -PT=2DADB8F8FC76D8C997627449E44D14B2 -CT=2D7109526C2F1B5D08DD356B163498D7 - -I=271 -KEY=40593D776B6C5920AA1D0DE0E2C482D319042E0223ACA08B -PT=2D7109526C2F1B5D08DD356B163498D7 -CT=D9C1D988ABD5C892B2E5BA7BF4F584D3 - -I=272 -KEY=72B53E4711B3DE9873DCD46849114A41ABE19479D7592458 -PT=D9C1D988ABD5C892B2E5BA7BF4F584D3 -CT=0A32E78440A8AE4A3FF74B20A3F5F7DE - -I=273 -KEY=C0BEF126899B305B79EE33EC09B9E40B9416DF5974ACD386 -PT=0A32E78440A8AE4A3FF74B20A3F5F7DE -CT=E7AA36688851D8E4E08E9EFE6987C571 - -I=274 -KEY=D16257EFEE63CC399E44058481E83CEF749841A71D2B16F7 -PT=E7AA36688851D8E4E08E9EFE6987C571 -CT=0E3E2E99FFA84F8A69CAA897017DD09C - -I=275 -KEY=3509E5A7A66648B9907A2B1D7E4073651D52E9301C56C66B -PT=0E3E2E99FFA84F8A69CAA897017DD09C -CT=96766B7F6E78537994466BDC62607C85 - -I=276 -KEY=46BC3EB6FA22C8AC060C40621038201C891482EC7E36BAEE -PT=96766B7F6E78537994466BDC62607C85 -CT=AA42980BBABA21DACE6D9FCD28A5B0BA - -I=277 -KEY=26FC66C5E5C6E585AC4ED869AA8201C647791D2156930A54 -PT=AA42980BBABA21DACE6D9FCD28A5B0BA -CT=EC057F10222EC91403E1B6CEFCE3556A - -I=278 -KEY=91FBDF7B24B0FEB4404BA77988ACC8D24498ABEFAA705F3E -PT=EC057F10222EC91403E1B6CEFCE3556A -CT=E6E91EC6B977C3547D08F717F6702E80 - -I=279 -KEY=5BD8360BB35CE209A6A2B9BF31DB0B8639905CF85C0071BE -PT=E6E91EC6B977C3547D08F717F6702E80 -CT=DF9BE6A5A61CC4B66C76447202CBFADA - -I=280 -KEY=E58D0EFAB72342BD79395F1A97C7CF3055E6188A5ECB8B64 -PT=DF9BE6A5A61CC4B66C76447202CBFADA -CT=8466FA526E1038CC14A2EC6D85FC4EDF - -I=281 -KEY=7EB51DD43B05BB26FD5FA548F9D7F7FC4144F4E7DB37C5BB -PT=8466FA526E1038CC14A2EC6D85FC4EDF -CT=5C5A965E386B16D50F3487D54C04AA6B - -I=282 -KEY=8F4BEBA429FE57C4A1053316C1BCE1294E70733297336FD0 -PT=5C5A965E386B16D50F3487D54C04AA6B -CT=BCD57B57FAA6E3F81660113345CD24F9 - -I=283 -KEY=4A5DA421D27E62821DD048413B1A02D158106201D2FE4B29 -PT=BCD57B57FAA6E3F81660113345CD24F9 -CT=7450D38B3A6D8C4987EE3F7F71C68FFC - -I=284 -KEY=77934AE2BB39BC4469809BCA01778E98DFFE5D7EA338C4D5 -PT=7450D38B3A6D8C4987EE3F7F71C68FFC -CT=A6D1D5A31BAB1CE9F027376539B2AAE2 - -I=285 -KEY=2C6FD4455E96F2F6CF514E691ADC92712FD96A1B9A8A6E37 -PT=A6D1D5A31BAB1CE9F027376539B2AAE2 -CT=10894E2E6275D172259D4C23332508B9 - -I=286 -KEY=2608AB9AA8CED631DFD8004778A943030A442638A9AF668E -PT=10894E2E6275D172259D4C23332508B9 -CT=53C2AB8E42B4EF7FF659D3FB251453C7 - -I=287 -KEY=68840BD9639AC3128C1AABC93A1DAC7CFC1DF5C38CBB3549 -PT=53C2AB8E42B4EF7FF659D3FB251453C7 -CT=3A9C38D026561B83B0F3E7B566C66CD2 - -I=288 -KEY=EFCDF07C0E70D051B68693191C4BB7FF4CEE1276EA7D599B -PT=3A9C38D026561B83B0F3E7B566C66CD2 -CT=B9F7E495B96BE7C0307D8F7A53200193 - -I=289 -KEY=87DFC62793B45EF60F71778CA520503F7C939D0CB95D5808 -PT=B9F7E495B96BE7C0307D8F7A53200193 -CT=2425FE8AAA7ED06A5FFEC11D7B289891 - -I=290 -KEY=5FD78DA64A9F50142B5489060F5E8055236D5C11C275C099 -PT=2425FE8AAA7ED06A5FFEC11D7B289891 -CT=93BC83BCF69DBB256C27AF250FDEFAEB - -I=291 -KEY=81C88579E065FD16B8E80ABAF9C33B704F4AF334CDAB3A72 -PT=93BC83BCF69DBB256C27AF250FDEFAEB -CT=A1AF953D4BD1A474B1173D4686EBB8CF - -I=292 -KEY=DEE7FFE9A3814D2B19479F87B2129F04FE5DCE724B4082BD -PT=A1AF953D4BD1A474B1173D4686EBB8CF -CT=00AAC1CD74952011A03714A6BB091653 - -I=293 -KEY=8331CC8136829F1E19ED5E4AC687BF155E6ADAD4F04994EE -PT=00AAC1CD74952011A03714A6BB091653 -CT=00B92CBFFC3589CEB3ECAA7D221C3F0B - -I=294 -KEY=FF862EBFECC11E93195472F53AB236DBED8670A9D255ABE5 -PT=00B92CBFFC3589CEB3ECAA7D221C3F0B -CT=2E07858E94AD300A35448EFA848A767A - -I=295 -KEY=18B8678C5497708E3753F77BAE1F06D1D8C2FE5356DFDD9F -PT=2E07858E94AD300A35448EFA848A767A -CT=B02F0C98F3B7BB7807F35F6DFD925238 - -I=296 -KEY=C90D1E18331CA38F877CFBE35DA8BDA9DF31A13EAB4D8FA7 -PT=B02F0C98F3B7BB7807F35F6DFD925238 -CT=EAACC8624146D29129ED8B904E89F04A - -I=297 -KEY=A08AD721EE869F2E6DD033811CEE6F38F6DC2AAEE5C47FED -PT=EAACC8624146D29129ED8B904E89F04A -CT=8949A5A4289B65A32C5116E8A4B55A50 - -I=298 -KEY=CED3055CB1AC48CAE499962534750A9BDA8D3C46417125BD -PT=8949A5A4289B65A32C5116E8A4B55A50 -CT=B632C5FD8EB9676B5504A8BA13E63E2D - -I=299 -KEY=AD1DA883EFFC2F3052AB53D8BACC6DF08F8994FC52971B90 -PT=B632C5FD8EB9676B5504A8BA13E63E2D -CT=EF28A1297C07A575686B3429AC9B62D1 - -I=300 -KEY=007F57339EC932CCBD83F2F1C6CBC885E7E2A0D5FE0C7941 -PT=EF28A1297C07A575686B3429AC9B62D1 -CT=C99F15E4000944120D1C3DD283D99BFF - -I=301 -KEY=3688FDD4FD7822F2741CE715C6C28C97EAFE9D077DD5E2BE -PT=C99F15E4000944120D1C3DD283D99BFF -CT=0AC0219E2BD43F9F19F3A0997FCB9FCD - -I=302 -KEY=AB54BF259C6F5CEE7EDCC68BED16B308F30D3D9E021E7D73 -PT=0AC0219E2BD43F9F19F3A0997FCB9FCD -CT=E27242BC80823BDC09C33C1BDB2EA3BE - -I=303 -KEY=9C88F101B483F8399CAE84376D9488D4FACE0185D930DECD -PT=E27242BC80823BDC09C33C1BDB2EA3BE -CT=7ABF9BD872F54E12FB7F0B11A6D10472 - -I=304 -KEY=971A26707E5B8BC2E6111FEF1F61C6C601B10A947FE1DABF -PT=7ABF9BD872F54E12FB7F0B11A6D10472 -CT=336653E5166F1B4146DBEAED74D72BB7 - -I=305 -KEY=1FFD085658F88F24D5774C0A090EDD87476AE0790B36F108 -PT=336653E5166F1B4146DBEAED74D72BB7 -CT=4849136D0509CE6C404E5685FBEEE9B8 - -I=306 -KEY=411DF55702805FE69D3E5F670C0713EB0724B6FCF0D818B0 -PT=4849136D0509CE6C404E5685FBEEE9B8 -CT=6CF8DCFD53E2ED214A449398D8BF0F6C - -I=307 -KEY=504BFF39E24E870FF1C6839A5FE5FECA4D602564286717DC -PT=6CF8DCFD53E2ED214A449398D8BF0F6C -CT=9C8326B89B3054A46ECA3BB76BC2F292 - -I=308 -KEY=E4F4B55125D2D1056D45A522C4D5AA6E23AA1ED343A5E54E -PT=9C8326B89B3054A46ECA3BB76BC2F292 -CT=C85479C9E038BA5495F67D6E8B2BEB64 - -I=309 -KEY=F2E9B605207E0FD4A511DCEB24ED103AB65C63BDC88E0E2A -PT=C85479C9E038BA5495F67D6E8B2BEB64 -CT=145607ACFFA06C08AB958DCB7BC0BDBC - -I=310 -KEY=CC0D3F478519145BB147DB47DB4D7C321DC9EE76B34EB396 -PT=145607ACFFA06C08AB958DCB7BC0BDBC -CT=ED7EE0DA132D9964BE5E7B2581C3C270 - -I=311 -KEY=EB3AFCDD9AAB59705C393B9DC860E556A3979553328D71E6 -PT=ED7EE0DA132D9964BE5E7B2581C3C270 -CT=6B576FD09F34ED38774AA383BB88B385 - -I=312 -KEY=866ECC1B3691532D376E544D5754086ED4DD36D08905C263 -PT=6B576FD09F34ED38774AA383BB88B385 -CT=E540518151453A18C29BE22B5DE84D5B - -I=313 -KEY=2B3BF12A0A10E6F9D22E05CC061132761646D4FBD4ED8F38 -PT=E540518151453A18C29BE22B5DE84D5B -CT=7865DE74099D486ECB584BE7890F3078 - -I=314 -KEY=3C6EA741634001E0AA4BDBB80F8C7A18DD1E9F1C5DE2BF40 -PT=7865DE74099D486ECB584BE7890F3078 -CT=5226B72FA16653187980D265EB6C7C6D - -I=315 -KEY=A32E19E0F06CB649F86D6C97AEEA2900A49E4D79B68EC32D -PT=5226B72FA16653187980D265EB6C7C6D -CT=CA0D39D92B042BECABF7A14115B3A307 - -I=316 -KEY=E48451707115D4A03260554E85EE02EC0F69EC38A33D602A -PT=CA0D39D92B042BECABF7A14115B3A307 -CT=EC1658D60F1D94EF514FA8EDADAB3C1D - -I=317 -KEY=89A589616229672BDE760D988AF396035E2644D50E965C37 -PT=EC1658D60F1D94EF514FA8EDADAB3C1D -CT=F278CD13BF2C6A1F2D9A9F0C1113205D - -I=318 -KEY=6013E84EFD076E402C0EC08B35DFFC1C73BCDBD91F857C6A -PT=F278CD13BF2C6A1F2D9A9F0C1113205D -CT=0B1A35F604DDB043BCD0573DC0850AF0 - -I=319 -KEY=68BCE1DC00C592E22714F57D31024C5FCF6C8CE4DF00769A -PT=0B1A35F604DDB043BCD0573DC0850AF0 -CT=EAC4FE6F8A04871AC434322CB06308E3 - -I=320 -KEY=1BE682363F216340CDD00B12BB06CB450B58BEC86F637E79 -PT=EAC4FE6F8A04871AC434322CB06308E3 -CT=64B6BA31C6B15BE040DC2C0A07FFE60F - -I=321 -KEY=2082C6C0D49B4DECA966B1237DB790A54B8492C2689C9876 -PT=64B6BA31C6B15BE040DC2C0A07FFE60F -CT=5ECDC37FEA4176145C6A308F91659D43 - -I=322 -KEY=23668EEA68987F8CF7AB725C97F6E6B117EEA24DF9F90535 -PT=5ECDC37FEA4176145C6A308F91659D43 -CT=BB25C81945A062A7D53531593D9910F6 - -I=323 -KEY=10B544566773DD5F4C8EBA45D2568416C2DB9314C46015C3 -PT=BB25C81945A062A7D53531593D9910F6 -CT=48D98FFFC4E378D42CFC785B53DFC38D - -I=324 -KEY=7F96DD27E1C0B7B7045735BA16B5FCC2EE27EB4F97BFD64E -PT=48D98FFFC4E378D42CFC785B53DFC38D -CT=7DCE20BAE8345CB68103461B4AFA9F09 - -I=325 -KEY=A73354FC47570B2679991500FE81A0746F24AD54DD454947 -PT=7DCE20BAE8345CB68103461B4AFA9F09 -CT=099B315B4DD55CAB5D02163154DA521C - -I=326 -KEY=92A57B873A1D292F7002245BB354FCDF3226BB65899F1B5B -PT=099B315B4DD55CAB5D02163154DA521C -CT=37207C17099989D3EA0D13DBD6DF7FEF - -I=327 -KEY=7048AF52E1763E8E4722584CBACD750CD82BA8BE5F4064B4 -PT=37207C17099989D3EA0D13DBD6DF7FEF -CT=7CE37081A6751A1518F03B70FBC1479D - -I=328 -KEY=24E37AF6A4BC72403BC128CD1CB86F19C0DB93CEA4812329 -PT=7CE37081A6751A1518F03B70FBC1479D -CT=201BBD8456F70ED0BB4E19A7AE36F1A6 - -I=329 -KEY=17E541A643CB8EE01BDA95494A4F61C97B958A690AB7D28F -PT=201BBD8456F70ED0BB4E19A7AE36F1A6 -CT=3384168E4F022049B0E3AD6899B71DC9 - -I=330 -KEY=31D5A160B61690A0285E83C7054D4180CB7627019300CF46 -PT=3384168E4F022049B0E3AD6899B71DC9 -CT=C83AA6AE617CB17E2977D394EBC4AD19 - -I=331 -KEY=6EBA775B83D704AAE06425696431F0FEE201F49578C4625F -PT=C83AA6AE617CB17E2977D394EBC4AD19 -CT=8AC467890AF8E729C7A86A471ADEB378 - -I=332 -KEY=C1237F715488582E6AA042E06EC917D725A99ED2621AD127 -PT=8AC467890AF8E729C7A86A471ADEB378 -CT=B89CE4F733A9D67C8E504BC4BC2F7664 - -I=333 -KEY=0A9E4BDAD3E856F1D23CA6175D60C1ABABF9D516DE35A743 -PT=B89CE4F733A9D67C8E504BC4BC2F7664 -CT=47B421469B794A5188255ACE84D89721 - -I=334 -KEY=4BE367B885F7AF9195888751C6198BFA23DC8FD85AED3062 -PT=47B421469B794A5188255ACE84D89721 -CT=B6B09DBF9E62C60951368C9C8B63A860 - -I=335 -KEY=CDFB62995E4C5D4E23381AEE587B4DF372EA0344D18E9802 -PT=B6B09DBF9E62C60951368C9C8B63A860 -CT=68933B4BD0BC23EB3178347DFE68E7F6 - -I=336 -KEY=8887EBF40DE51F064BAB21A588C76E18439237392FE67FF4 -PT=68933B4BD0BC23EB3178347DFE68E7F6 -CT=C6F16CDDF00C982A927609B559B0BCBD - -I=337 -KEY=221D949B8CA9F4C48D5A4D7878CBF632D1E43E8C7656C349 -PT=C6F16CDDF00C982A927609B559B0BCBD -CT=CBEE831F7623E3214E72AF57706525C7 - -I=338 -KEY=3D35666DACEFF3C846B4CE670EE815139F9691DB0633E68E -PT=CBEE831F7623E3214E72AF57706525C7 -CT=DFE0297AE9B69F0AD69D6189C1447333 - -I=339 -KEY=43370C9C958216DC9954E71DE75E8A19490BF052C77795BD -PT=DFE0297AE9B69F0AD69D6189C1447333 -CT=59C3B4D6055B9F73064B715CD5213C99 - -I=340 -KEY=DF43233D68EE5C4AC09753CBE205156A4F40810E1256A924 -PT=59C3B4D6055B9F73064B715CD5213C99 -CT=5373F13BB16B3653FCC138FC9A9E8A47 - -I=341 -KEY=472E0A65B06B4F4693E4A2F0536E2339B381B9F288C82363 -PT=5373F13BB16B3653FCC138FC9A9E8A47 -CT=9C7514B7FEDF2DC26B0C2C1954745077 - -I=342 -KEY=1409E4DF955583A00F91B647ADB10EFBD88D95EBDCBC7314 -PT=9C7514B7FEDF2DC26B0C2C1954745077 -CT=2480D7C35D6B0207D84A9CEFA1C2CFDC - -I=343 -KEY=458552CAB6B1A8AC2B116184F0DA0CFC00C709047D7EBCC8 -PT=2480D7C35D6B0207D84A9CEFA1C2CFDC -CT=46DE3E51F1355FA76652C8DA3642409B - -I=344 -KEY=2065D6F033E1EE2E6DCF5FD501EF535B6695C1DE4B3CFC53 -PT=46DE3E51F1355FA76652C8DA3642409B -CT=13F328173D057A64DA3917468528DB4F - -I=345 -KEY=6D30053E2C95BC5A7E3C77C23CEA293FBCACD698CE14271C -PT=13F328173D057A64DA3917468528DB4F -CT=33D71B6CD0A68B685C89C9F2D70FDFCE - -I=346 -KEY=59D69C2D25BFB6A34DEB6CAEEC4CA257E0251F6A191BF8D2 -PT=33D71B6CD0A68B685C89C9F2D70FDFCE -CT=8E9F57B5E945CD7DFC2B9FCD5AF96DFB - -I=347 -KEY=F41ABD021E5C144EC3743B1B05096F2A1C0E80A743E29529 -PT=8E9F57B5E945CD7DFC2B9FCD5AF96DFB -CT=71295B41B9E5872E1BD4D5C3C4C62D71 - -I=348 -KEY=41C1194732CD4654B25D605ABCECE80407DA55648724B858 -PT=71295B41B9E5872E1BD4D5C3C4C62D71 -CT=E704FBBAA917788CE906A54B2A56A232 - -I=349 -KEY=AF58932371569CE655599BE015FB9088EEDCF02FAD721A6A -PT=E704FBBAA917788CE906A54B2A56A232 -CT=8DBA56CF3E019B8EA80CCB772551CA5B - -I=350 -KEY=B1E68A05A144F4FAD8E3CD2F2BFA0B0646D03B588823D031 -PT=8DBA56CF3E019B8EA80CCB772551CA5B -CT=18F8A23F785AFEFC4ECD527AC6DBE609 - -I=351 -KEY=456D39FF40B1622BC01B6F1053A0F5FA081D69224EF83638 -PT=18F8A23F785AFEFC4ECD527AC6DBE609 -CT=073F93A707D6B9A82E99990CB13BD00E - -I=352 -KEY=1FF446993B6927C6C724FCB754764C522684F02EFFC3E636 -PT=073F93A707D6B9A82E99990CB13BD00E -CT=76723E1239356EDC37FB5E1EAFDF4678 - -I=353 -KEY=0DED89E36C3B06B9B156C2A56D43228E117FAE30501CA04E -PT=76723E1239356EDC37FB5E1EAFDF4678 -CT=1B57D35B4E2484D3945B82D59114A531 - -I=354 -KEY=E433448EB970D64FAA0111FE2367A65D85242CE5C108057F -PT=1B57D35B4E2484D3945B82D59114A531 -CT=4466DCB75F6B83885EE32D9FD533A902 - -I=355 -KEY=3751EC4737F029E3EE67CD497C0C25D5DBC7017A143BAC7D -PT=4466DCB75F6B83885EE32D9FD533A902 -CT=A8B62B9FCAA9331A3282899DB475AADE - -I=356 -KEY=6C1042FACD259CC346D1E6D6B6A516CFE94588E7A04E06A3 -PT=A8B62B9FCAA9331A3282899DB475AADE -CT=DFE1CB42B29F119E44F37F60A8C2BD7C - -I=357 -KEY=640D2DB3E708999A99302D94043A0751ADB6F787088CBBDF -PT=DFE1CB42B29F119E44F37F60A8C2BD7C -CT=891B211EE1BEA05AD7BA478FDFEBC507 - -I=358 -KEY=C434FF9BD02BDF6C102B0C8AE584A70B7A0CB008D7677ED8 -PT=891B211EE1BEA05AD7BA478FDFEBC507 -CT=16ABB92A1E0F433250C551F84AE177CF - -I=359 -KEY=22A76DAFC8A7748E0680B5A0FB8BE4392AC9E1F09D860917 -PT=16ABB92A1E0F433250C551F84AE177CF -CT=1A2F4BF6ED0CADB7FA3FC52F3C6AF191 - -I=360 -KEY=5DDEDF839CF5C0D11CAFFE561687498ED0F624DFA1ECF886 -PT=1A2F4BF6ED0CADB7FA3FC52F3C6AF191 -CT=16AE687EE38FB85C0F70E20F5585F750 - -I=361 -KEY=13D0157C6A30C26C0A019628F508F1D2DF86C6D0F4690FD6 -PT=16AE687EE38FB85C0F70E20F5585F750 -CT=6CD2D70F641B2A7814014177C4880107 - -I=362 -KEY=6DBFF188E61696C966D341279113DBAACB8787A730E10ED1 -PT=6CD2D70F641B2A7814014177C4880107 -CT=8CAD28041AE53AA64CE0173DBD9046C2 - -I=363 -KEY=44A13B269C44F018EA7E69238BF6E10C8767909A8D714813 -PT=8CAD28041AE53AA64CE0173DBD9046C2 -CT=FC8D4274BA1EF15CC39E750DD1848F7B - -I=364 -KEY=B7A8311B81A3B82C16F32B5731E8105044F9E5975CF5C768 -PT=FC8D4274BA1EF15CC39E750DD1848F7B -CT=01CBDAEAADE486CF655401D8F7F7E84E - -I=365 -KEY=A3AC668823C917DE1738F1BD9C0C969F21ADE44FAB022F26 -PT=01CBDAEAADE486CF655401D8F7F7E84E -CT=494C3219700E06EE9C4DCB61EF932FDF - -I=366 -KEY=05CC07DC3CBB1A4B5E74C3A4EC029071BDE02F2E449100F9 -PT=494C3219700E06EE9C4DCB61EF932FDF -CT=BB0E7D5CD93B1839DF5CAED7996F9560 - -I=367 -KEY=8768468EFC3CE954E57ABEF83539884862BC81F9DDFE9599 -PT=BB0E7D5CD93B1839DF5CAED7996F9560 -CT=CC1F9A504A67C24621ED127C63AE2A36 - -I=368 -KEY=470E251F98662CEC296524A87F5E4A0E43519385BE50BFAF -PT=CC1F9A504A67C24621ED127C63AE2A36 -CT=A48D3751956B71F925680073B35BC0A3 - -I=369 -KEY=533C67C061CE6B9E8DE813F9EA353BF7663993F60D0B7F0C -PT=A48D3751956B71F925680073B35BC0A3 -CT=80143AC021E94718146EBC7808A9DDD8 - -I=370 -KEY=0303563B9274349D0DFC2939CBDC7CEF72572F8E05A2A2D4 -PT=80143AC021E94718146EBC7808A9DDD8 -CT=B90AC6ADEE1B60228096D022EE5C681B - -I=371 -KEY=1E7D3A52CC112BDCB4F6EF9425C71CCDF2C1FFACEBFECACF -PT=B90AC6ADEE1B60228096D022EE5C681B -CT=CB8553B21250642107E824E8FB27CAEA - -I=372 -KEY=750A36009059323E7F73BC26379778ECF529DB4410D90025 -PT=CB8553B21250642107E824E8FB27CAEA -CT=9C86DA9646FCFEA7E778A5498F50E01E - -I=373 -KEY=6876C614C460B02CE3F566B0716B864B12517E0D9F89E03B -PT=9C86DA9646FCFEA7E778A5498F50E01E -CT=1481357AD5690762FD6F3809F1E5F219 - -I=374 -KEY=7CE6B00F6B651FAEF77453CAA4028129EF3E46046E6C1222 -PT=1481357AD5690762FD6F3809F1E5F219 -CT=39B64998D4370E0CB47C1DC23EDCDD03 - -I=375 -KEY=C3F72A84EF6F4A0CCEC21A5270358F255B425BC650B0CF21 -PT=39B64998D4370E0CB47C1DC23EDCDD03 -CT=EB1BA96272D7BB044A3381439BA4CD5B - -I=376 -KEY=C670185A26E7DA4A25D9B33002E234211171DA85CB14027A -PT=EB1BA96272D7BB044A3381439BA4CD5B -CT=F87EC3D7F55DA25790718E461BA2E194 - -I=377 -KEY=72ECF820AC459D8DDDA770E7F7BF9676810054C3D0B6E3EE -PT=F87EC3D7F55DA25790718E461BA2E194 -CT=AD7EA1621AD7FBA975D6BB0AB9AED116 - -I=378 -KEY=CE4ECAD1C7D17D1170D9D185ED686DDFF4D6EFC9691832F8 -PT=AD7EA1621AD7FBA975D6BB0AB9AED116 -CT=473B6484F6EAE1FC837A2710AE8D462F - -I=379 -KEY=3273752C9A8682F237E2B5011B828C2377ACC8D9C79574D7 -PT=473B6484F6EAE1FC837A2710AE8D462F -CT=0E3634529E49692762F4D80333738045 - -I=380 -KEY=8C2CFBB98A4E5E3839D4815385CBE504155810DAF4E6F492 -PT=0E3634529E49692762F4D80333738045 -CT=F8EFEBD78C115CC620F25AB66038F2A0 - -I=381 -KEY=0416DBCAFA0850D8C13B6A8409DAB9C235AA4A6C94DE0632 -PT=F8EFEBD78C115CC620F25AB66038F2A0 -CT=B4442C38E3B8E87D8AAE2C17A5571CE9 - -I=382 -KEY=7A7815A748696E99757F46BCEA6251BFBF04667B31891ADB -PT=B4442C38E3B8E87D8AAE2C17A5571CE9 -CT=576A20E194015AB069D769FCA7D842FC - -I=383 -KEY=3848903CD019B4572215665D7E630B0FD6D30F8796515827 -PT=576A20E194015AB069D769FCA7D842FC -CT=E253D9FB4075B021DF452B3AD51204D6 - -I=384 -KEY=3E468D281DF03284C046BFA63E16BB2E099624BD43435CF1 -PT=E253D9FB4075B021DF452B3AD51204D6 -CT=D9454AE62207E70A34F13B0063498A8F - -I=385 -KEY=860E4E60B132A8851903F5401C115C243D671FBD200AD67E -PT=D9454AE62207E70A34F13B0063498A8F -CT=A21F7DA8A298670D631F677D23504757 - -I=386 -KEY=27B82EDF5FFD15DDBB1C88E8BE893B295E7878C0035A9129 -PT=A21F7DA8A298670D631F677D23504757 -CT=1D239EFBABD09A029FE11C59A385C909 - -I=387 -KEY=631BCB74800FD13AA63F16131559A12BC1996499A0DF5820 -PT=1D239EFBABD09A029FE11C59A385C909 -CT=C87EB2AB019AFA608BE99CE77717B333 - -I=388 -KEY=EE1326871289985E6E41A4B814C35B4B4A70F87ED7C8EB13 -PT=C87EB2AB019AFA608BE99CE77717B333 -CT=528DBF70307431E33815D1AA44C30FA8 - -I=389 -KEY=F1D72A84C2FE044F3CCC1BC824B76AA8726529D4930BE4BB -PT=528DBF70307431E33815D1AA44C30FA8 -CT=6C8014B427ED6331A5C174CF2846B70A - -I=390 -KEY=A1610602C8DD2836504C0F7C035A0999D7A45D1BBB4D53B1 -PT=6C8014B427ED6331A5C174CF2846B70A -CT=3DF4C4BE003A13030E73026F7027ADB1 - -I=391 -KEY=B2418E725A1435DD6DB8CBC203601A9AD9D75F74CB6AFE00 -PT=3DF4C4BE003A13030E73026F7027ADB1 -CT=39C50365300DCC5B47F827054879C642 - -I=392 -KEY=761AF29E74671706547DC8A7336DD6C19E2F787183133842 -PT=39C50365300DCC5B47F827054879C642 -CT=847F488B3CEC2E1E4E1C6B9F37E4F631 - -I=393 -KEY=C912116E7B47169AD002802C0F81F8DFD03313EEB4F7CE73 -PT=847F488B3CEC2E1E4E1C6B9F37E4F631 -CT=9A581179C883C5E057CC560A3DF6CD34 - -I=394 -KEY=B08B1226353C6BD34A5A9155C7023D3F87FF45E489010347 -PT=9A581179C883C5E057CC560A3DF6CD34 -CT=799B437C3EF3663EFBD6F186EDFDF21A - -I=395 -KEY=1ECAE821E161A2C833C1D229F9F15B017C29B46264FCF15D -PT=799B437C3EF3663EFBD6F186EDFDF21A -CT=138A858B14FE28D9A47C76BB3FAE9AA1 - -I=396 -KEY=3AD2B951E451EEA8204B57A2ED0F73D8D855C2D95B526BFC -PT=138A858B14FE28D9A47C76BB3FAE9AA1 -CT=5E35BC76C5AC8765A6C396DFE5689579 - -I=397 -KEY=791E5F91477E986E7E7EEBD428A3F4BD7E965406BE3AFE85 -PT=5E35BC76C5AC8765A6C396DFE5689579 -CT=53F8361BF47A82EF27492322BA6F57AD - -I=398 -KEY=194A170B3D4FA6E62D86DDCFDCD9765259DF77240455A928 -PT=53F8361BF47A82EF27492322BA6F57AD -CT=FF626D77AE144C11480610EC1ABB5028 - -I=399 -KEY=C9DC82F000187721D2E4B0B872CD3A4311D967C81EEEF900 -PT=FF626D77AE144C11480610EC1ABB5028 -CT=4E46F8C5092B29E29A971A0CD1F610FB - -========================= - -KEYSIZE=256 - -I=0 -KEY=0000000000000000000000000000000000000000000000000000000000000000 -PT=00000000000000000000000000000000 -CT=8B79EECC93A0EE5DFF30B4EA21636DA4 - -I=1 -KEY=AD3965683E6FA98B5F38AC26653679288B79EECC93A0EE5DFF30B4EA21636DA4 -PT=8B79EECC93A0EE5DFF30B4EA21636DA4 -CT=C737317FE0846F132B23C8C2A672CE22 - -I=2 -KEY=28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386 -PT=C737317FE0846F132B23C8C2A672CE22 -CT=E58B82BFBA53C0040DC610C642121168 - -I=3 -KEY=0721E93EACF9DC6C870D8133376B7C0DA9C55D0CC977414AD9D56CEEC503B2EE -PT=E58B82BFBA53C0040DC610C642121168 -CT=10B296ABB40504995DB71DDA0B7E26FB - -I=4 -KEY=0ECE1E210ADA32EBC497AD50F516602EB977CBA77D7245D384627134CE7D9415 -PT=10B296ABB40504995DB71DDA0B7E26FB -CT=B7198D8E88BAA25234C18517E99BB70D - -I=5 -KEY=D31313ACD90A9BB7D6596DEAB752003F0E6E4629F5C8E781B0A3F42327E62318 -PT=B7198D8E88BAA25234C18517E99BB70D -CT=6125097DB5738C64513E125872EA436C - -I=6 -KEY=488B6A78D9AA23FEA7289E250928BDE36F4B4F5440BB6BE5E19DE67B550C6074 -PT=6125097DB5738C64513E125872EA436C -CT=07FF2ED24B522F1E31D46E94BE5C505B - -I=7 -KEY=03DDD56B142AD3B0E4FFD2BAC6568E5468B461860BE944FBD04988EFEB50302F -PT=07FF2ED24B522F1E31D46E94BE5C505B -CT=EB3C1E3328F840B110E934B0129F2F23 - -I=8 -KEY=20F9D92C65B2F00183464197B23BE5AF83887FB52311044AC0A0BC5FF9CF1F0C -PT=EB3C1E3328F840B110E934B0129F2F23 -CT=107CB7B403DC3F6F09EC30EC1718D183 - -I=9 -KEY=79CF0BCF8EFE3DE82E27778923D1AA1993F4C80120CD3B25C94C8CB3EED7CE8F -PT=107CB7B403DC3F6F09EC30EC1718D183 -CT=CE9DB77B1FAE0CFEC5341FA5AF4CDE8A - -I=10 -KEY=F50ADABA26525BFA7BF6EEF2402450785D697F7A3F6337DB0C789316419B1005 -PT=CE9DB77B1FAE0CFEC5341FA5AF4CDE8A -CT=157B5946862DA3E9A1A83E45857E207D - -I=11 -KEY=3B6947995411D0AE50645129D13BACC04812263CB94E9432ADD0AD53C4E53078 -PT=157B5946862DA3E9A1A83E45857E207D -CT=4AE3583491DF78918CAB3AC241286855 - -I=12 -KEY=AAD12F02F5E5681D16236B668EF2C46702F17E082891ECA3217B979185CD582D -PT=4AE3583491DF78918CAB3AC241286855 -CT=05400C32DC84F1AB486A9BADB1415B50 - -I=13 -KEY=EA02EB82D4B2112DD3BD64C1C908CEC307B1723AF4151D0869110C3C348C037D -PT=05400C32DC84F1AB486A9BADB1415B50 -CT=E4C0781A2EA68D142504739731EF396E - -I=14 -KEY=D51A1846DFEB738F0AF138F74C968DCCE3710A20DAB3901C4C157FAB05633A13 -PT=E4C0781A2EA68D142504739731EF396E -CT=44CC8A9C84E6AD66BD24F1EE1F925EC3 - -I=15 -KEY=B6401DFC35AF21E53CD254431CC639E9A7BD80BC5E553D7AF1318E451AF164D0 -PT=44CC8A9C84E6AD66BD24F1EE1F925EC3 -CT=20AF5FDDF65856D1A60ADC03567AE163 - -I=16 -KEY=D1D2E8B5644910077B3EDB245F029C0D8712DF61A80D6BAB573B52464C8B85B3 -PT=20AF5FDDF65856D1A60ADC03567AE163 -CT=CEB74DD6FBEAFDCEE54930D58AF22ACA - -I=17 -KEY=9F932DC2AB83FA5153E7081E7360ABB449A592B753E79665B2726293C679AF79 -PT=CEB74DD6FBEAFDCEE54930D58AF22ACA -CT=72FB3F7BBBDBA9C036C94531A32E937D - -I=18 -KEY=06AABCA83922297791C9D07AEB639BDD3B5EADCCE83C3FA584BB27A265573C04 -PT=72FB3F7BBBDBA9C036C94531A32E937D -CT=299B26D5D6DFA2C20824D8A84E98A244 - -I=19 -KEY=6124BC71768DE5E9C14D37915D90F1AE12C58B193EE39D678C9FFF0A2BCF9E40 -PT=299B26D5D6DFA2C20824D8A84E98A244 -CT=0A35C0D4170BDE0258D79B668C7C98F4 - -I=20 -KEY=282B067BD441670E11E576F26C4EA67D18F04BCD29E84365D448646CA7B306B4 -PT=0A35C0D4170BDE0258D79B668C7C98F4 -CT=F4E3E981FFC8B50FC9146B85A22E71D4 - -I=21 -KEY=2864E2A3986F99C55EC21C225E3498ECEC13A24CD620F66A1D5C0FE9059D7760 -PT=F4E3E981FFC8B50FC9146B85A22E71D4 -CT=130ACF4CEAFE3277DF057D4D170582ED - -I=22 -KEY=600FD4DFD03132B0DB7B2432DBE027C2FF196D003CDEC41DC25972A41298F58D -PT=130ACF4CEAFE3277DF057D4D170582ED -CT=50001D54F2EA5EAA3BE2206F3845D9A9 - -I=23 -KEY=C1CBE3A1679D6C1913EABE3400993100AF197054CE349AB7F9BB52CB2ADD2C24 -PT=50001D54F2EA5EAA3BE2206F3845D9A9 -CT=69F3EE4B230B2DB2492FE0E36B949154 - -I=24 -KEY=7C6C63E14606A0B09254A531CACB45A0C6EA9E1FED3FB705B094B2284149BD70 -PT=69F3EE4B230B2DB2492FE0E36B949154 -CT=CEEE40F3D2FD9A5521F44AD3AB55198D - -I=25 -KEY=22BB6E21BCA0450240DB117B028837AF0804DEEC3FC22D509160F8FBEA1CA4FD -PT=CEEE40F3D2FD9A5521F44AD3AB55198D -CT=1FA1F1AE7BF2A8C66A6ED6D5F276846B - -I=26 -KEY=7364D9AE40CBB0CCA6640B7E542DBA2617A52F4244308596FB0E2E2E186A2096 -PT=1FA1F1AE7BF2A8C66A6ED6D5F276846B -CT=6D5BD8391C73507D57B902AB3D58D228 - -I=27 -KEY=A2D8BF7602FCD22755ADA9979B2DD33B7AFEF77B5843D5EBACB72C852532F2BE -PT=6D5BD8391C73507D57B902AB3D58D228 -CT=15ACD05539318363F275C857FBC5D86C - -I=28 -KEY=3AD56A33CE89D8D3510C4152DEE734126F52272E617256885EC2E4D2DEF72AD2 -PT=15ACD05539318363F275C857FBC5D86C -CT=B54F8D944301A899A2A88440FE8AB631 - -I=29 -KEY=13ED08137C66C2000D3FE9E167387864DA1DAABA2273FE11FC6A6092207D9CE3 -PT=B54F8D944301A899A2A88440FE8AB631 -CT=23B4BF936BF383325F0DAF0548E32851 - -I=30 -KEY=3C2C53CCDB4721F44B6C057BF758361AF9A9152949807D23A367CF97689EB4B2 -PT=23B4BF936BF383325F0DAF0548E32851 -CT=8B4984C6F39C7FD543B4A8629EAC6740 - -I=31 -KEY=95E744B66044529E2DC2B06BF84FF3D672E091EFBA1C02F6E0D367F5F632D3F2 -PT=8B4984C6F39C7FD543B4A8629EAC6740 -CT=108834058381578E8AA7988E03942230 - -I=32 -KEY=E7715B09238876A93F9858D9548CBEA56268A5EA399D55786A74FF7BF5A6F1C2 -PT=108834058381578E8AA7988E03942230 -CT=EE3974A2ECEA5A1E6FC09535323BFF29 - -I=33 -KEY=08F25145082684F576933E4DF5C63DFE8C51D148D5770F6605B46A4EC79D0EEB -PT=EE3974A2ECEA5A1E6FC09535323BFF29 -CT=1AC80F42E3529BCA587D4EA828BD3631 - -I=34 -KEY=93D63C9069B415595934FA66C76A9CD09699DE0A362594AC5DC924E6EF2038DA -PT=1AC80F42E3529BCA587D4EA828BD3631 -CT=E196DF1E8A0DE844EBD3FD84B307EEB6 - -I=35 -KEY=0F5E4A3907A7BC56AAC2CB6F6871674C770F0114BC287CE8B61AD9625C27D66C -PT=E196DF1E8A0DE844EBD3FD84B307EEB6 -CT=917AC29C88967EE5C792E72B046A4399 - -I=36 -KEY=B935C42A3A93D1E45E94CBE1E232A135E675C38834BE020D71883E49584D95F5 -PT=917AC29C88967EE5C792E72B046A4399 -CT=9CE3D545895005F3EC432699F17FFDA2 - -I=37 -KEY=CC3C0DCF9E6E91BE48B7F7AE251D1CB37A9616CDBDEE07FE9DCB18D0A9326857 -PT=9CE3D545895005F3EC432699F17FFDA2 -CT=089F0D41397E27B04D3268834ADF932C - -I=38 -KEY=29AB63D0AB0E237BA75D250BC67E362472091B8C8490204ED0F97053E3EDFB7B -PT=089F0D41397E27B04D3268834ADF932C -CT=9C364B0CC209389C00824505226B8989 - -I=39 -KEY=7FB99ABACCC92D9C8B17CC0066F02F39EE3F5080469918D2D07B3556C18672F2 -PT=9C364B0CC209389C00824505226B8989 -CT=767FB14493BE17A29839FBF115B9B38B - -I=40 -KEY=DB08EEBD184AEEB002302A3C41E5595B9840E1C4D5270F704842CEA7D43FC179 -PT=767FB14493BE17A29839FBF115B9B38B -CT=CBEC5B7FB05D673C19EBF0F4B647CDB5 - -I=41 -KEY=F7C517C27F319857F1D9DA5D29B6B76353ACBABB657A684C51A93E5362780CCC -PT=CBEC5B7FB05D673C19EBF0F4B647CDB5 -CT=9721CB9555EF079ADD547D8DE09CC0C7 - -I=42 -KEY=47D5164E15743853C8B0E55ED3A965D6C48D712E30956FD68CFD43DE82E4CC0B -PT=9721CB9555EF079ADD547D8DE09CC0C7 -CT=5B16109122E874A08A2A48D5B5753256 - -I=43 -KEY=152E7EF1B0FAD417DA84B4FA0AB560DB9F9B61BF127D1B7606D70B0B3791FE5D -PT=5B16109122E874A08A2A48D5B5753256 -CT=198A9B7C41C225334176614A16F1D7CB - -I=44 -KEY=81BB271A9F0CE56E452C9FBE4CF09FF88611FAC353BF3E4547A16A4121602996 -PT=198A9B7C41C225334176614A16F1D7CB -CT=56E255DB999AFA713020C4E987F4433B - -I=45 -KEY=A654ABA71B351BCBFD1CB03B5F88CE1AD0F3AF18CA25C4347781AEA8A6946AAD -PT=56E255DB999AFA713020C4E987F4433B -CT=7BF8470233D197839D4FC1B365E79C8D - -I=46 -KEY=C700B39660C3C72E15E278B2D22DD528AB0BE81AF9F453B7EACE6F1BC373F620 -PT=7BF8470233D197839D4FC1B365E79C8D -CT=D7CDF94CBBE5E7EF7E47E4CE9BD5E073 - -I=47 -KEY=C49B1589810F1915998C8C79CA2382D87CC611564211B45894898BD558A61653 -PT=D7CDF94CBBE5E7EF7E47E4CE9BD5E073 -CT=A5617B71AF28E732A0B69BFA3B90F291 - -I=48 -KEY=D37A9390FD2C8D4D01704352BAFC2EE2D9A76A27ED39536A343F102F6336E4C2 -PT=A5617B71AF28E732A0B69BFA3B90F291 -CT=156D08F6A2AC3F7202DBEE15D53C8BCD - -I=49 -KEY=E4E2958608635DF83B8E39FD503356D5CCCA62D14F956C1836E4FE3AB60A6F0F -PT=156D08F6A2AC3F7202DBEE15D53C8BCD -CT=1790CB4B9B4E01F4CA3AAB588A3B7A51 - -I=50 -KEY=B0F77AF53FB1FAF66A421093111DC925DB5AA99AD4DB6DECFCDE55623C31155E -PT=1790CB4B9B4E01F4CA3AAB588A3B7A51 -CT=5E2DC515FE9BAE8F16188DC052C63A80 - -I=51 -KEY=487CA8ECBA3E2CAF61A16285005F01F685776C8F2A40C363EAC6D8A26EF72FDE -PT=5E2DC515FE9BAE8F16188DC052C63A80 -CT=A625E46D2DA293F536D25C9207090AA5 - -I=52 -KEY=410909F6119DDA628537B825D24E8DF9235288E207E25096DC14843069FE257B -PT=A625E46D2DA293F536D25C9207090AA5 -CT=FEFCF38ABD12EAAD37F3AE73BC4B4A8C - -I=53 -KEY=F1027D98B61D2F383BCF60A83D317D03DDAE7B68BAF0BA3BEBE72A43D5B56FF7 -PT=FEFCF38ABD12EAAD37F3AE73BC4B4A8C -CT=76D8221C2AAD44D226C769875A93CDA8 - -I=54 -KEY=DDA104019F122286887545C85F6B09B1AB765974905DFEE9CD2043C48F26A25F -PT=76D8221C2AAD44D226C769875A93CDA8 -CT=DE7FBEB010089D7EE0A1BD18F3461AEE - -I=55 -KEY=46CE686778BA955831B63F2ACFE397747509E7C4805563972D81FEDC7C60B8B1 -PT=DE7FBEB010089D7EE0A1BD18F3461AEE -CT=A8B0824BD1FC52D92AFA0B4B23ABDEBD - -I=56 -KEY=EF1408D365E549B808DADADE3D4CBCDADDB9658F51A9314E077BF5975FCB660C -PT=A8B0824BD1FC52D92AFA0B4B23ABDEBD -CT=93AC85EE8DE4091894F0E1800A0DF443 - -I=57 -KEY=8E8FC86B7F82A57799FE32DD1C748C8D4E15E061DC4D3856938B141755C6924F -PT=93AC85EE8DE4091894F0E1800A0DF443 -CT=0FAE963D9B74341316D7EA8862D0766F - -I=58 -KEY=D3900458ABB1ACCE0707A49565D27C4C41BB765C47390C45855CFE9F3716E420 -PT=0FAE963D9B74341316D7EA8862D0766F -CT=37930DFBC771510D0BBDCBFAB2A5852F - -I=59 -KEY=C55EE2F5633DE3E7EF3710C6C143AA7076287BA780485D488EE1356585B3610F -PT=37930DFBC771510D0BBDCBFAB2A5852F -CT=9C3B82D06CB9378F6CBBF6325B456A8B - -I=60 -KEY=AA16073435B24614EB1E9AE81FD921F0EA13F977ECF16AC7E25AC357DEF60B84 -PT=9C3B82D06CB9378F6CBBF6325B456A8B -CT=2DB135F2599323714B4D0E66562FAF48 - -I=61 -KEY=033F102BFB13F9F84A4E9FC0C6F52AC8C7A2CC85B56249B6A917CD3188D9A4CC -PT=2DB135F2599323714B4D0E66562FAF48 -CT=130D64DC60EE70F07F6A68F26A9B5E19 - -I=62 -KEY=60D36FD89196DB13031E829B54615707D4AFA859D58C3946D67DA5C3E242FAD5 -PT=130D64DC60EE70F07F6A68F26A9B5E19 -CT=E4E5C4A1E2A0DC99EEC583E311824371 - -I=63 -KEY=532BC273D1843EB5CC1DE01D28684454304A6CF8372CE5DF38B82620F3C0B9A4 -PT=E4E5C4A1E2A0DC99EEC583E311824371 -CT=72CCE240749A6BFD0A93CDCBE2589B41 - -I=64 -KEY=DAE91111E43D9DF4A0F44C27A6B1AB0842868EB843B68E22322BEBEB119822E5 -PT=72CCE240749A6BFD0A93CDCBE2589B41 -CT=300F85629B48F47444D2AA51EBAAD16C - -I=65 -KEY=5C7C95B43BEA70F20A5C490F9A9F716372890BDAD8FE7A5676F941BAFA32F389 -PT=300F85629B48F47444D2AA51EBAAD16C -CT=89278608A583E1243704B39AB9C0F30C - -I=66 -KEY=5B64FDB468399A031D5745325331C2E8FBAE8DD27D7D9B7241FDF22043F20085 -PT=89278608A583E1243704B39AB9C0F30C -CT=71B74D5FAA4558A59F3BC91AA564579A - -I=67 -KEY=0166230CCF036B4B22C63D36F71C3CF58A19C08DD738C3D7DEC63B3AE696571F -PT=71B74D5FAA4558A59F3BC91AA564579A -CT=7B433C70951E4BD140FF7A0CBF367429 - -I=68 -KEY=D7A12389D7DD5DE963841B344315ADF9F15AFCFD422688069E39413659A02336 -PT=7B433C70951E4BD140FF7A0CBF367429 -CT=B0BE67EBCD672549AF03D323AF026FFF - -I=69 -KEY=A3EC2E92C58FE150F708C6FAEB1F459E41E49B168F41AD4F313A9215F6A24CC9 -PT=B0BE67EBCD672549AF03D323AF026FFF -CT=99A829A7C5C7CD6A44C7EABA9A5421C7 - -I=70 -KEY=CC3F7485BF8460CB1EA0AA3C20553644D84CB2B14A86602575FD78AF6CF66D0E -PT=99A829A7C5C7CD6A44C7EABA9A5421C7 -CT=76E1A70AF79F89CFE68EAF15DC0E9BC5 - -I=71 -KEY=17DC64F06B3A2941A21AE58E2FFAB363AEAD15BBBD19E9EA9373D7BAB0F8F6CB -PT=76E1A70AF79F89CFE68EAF15DC0E9BC5 -CT=DB0805B5DCC1CA2CA7489C8E1237E7A2 - -I=72 -KEY=DC7128E894C9DA167D0ACED5888F846275A5100E61D823C6343B4B34A2CF1169 -PT=DB0805B5DCC1CA2CA7489C8E1237E7A2 -CT=935D409B87A85A2CFCC09DE3D2A9A294 - -I=73 -KEY=8073895C9316D299F4F32C602F2F2616E6F85095E67079EAC8FBD6D77066B3FD -PT=935D409B87A85A2CFCC09DE3D2A9A294 -CT=F22B73EFF24249CBCB31BDC7C126B735 - -I=74 -KEY=99E16793433652800ABAD7000638560914D3237A1432302103CA6B10B14004C8 -PT=F22B73EFF24249CBCB31BDC7C126B735 -CT=A16A380AE9B3F2B0AE39BB0E24BF7C0A - -I=75 -KEY=8F77C5E97DA567CC447B52F45175BC74B5B91B70FD81C291ADF3D01E95FF78C2 -PT=A16A380AE9B3F2B0AE39BB0E24BF7C0A -CT=9CF088DE60AE87687481C9F217E86A7C - -I=76 -KEY=DA1B3C2C424D2BC6A1C7A3D18D41C3F5294993AE9D2F45F9D97219EC821712BE -PT=9CF088DE60AE87687481C9F217E86A7C -CT=1C8B68951E65E32E77F1A31571351C1B - -I=77 -KEY=3D64F3D4BF8F585917273805AA43DCD735C2FB3B834AA6D7AE83BAF9F3220EA5 -PT=1C8B68951E65E32E77F1A31571351C1B -CT=4AD3F3B0C15D810F0EA0FF62C6B2D0FE - -I=78 -KEY=51D61FB1B31EB55C7AA2D918E7BE32A97F11088B421727D8A023459B3590DE5B -PT=4AD3F3B0C15D810F0EA0FF62C6B2D0FE -CT=0DFCF7CA661572E050C522AE554A4BF8 - -I=79 -KEY=B93510F7689FB9856194CF629EF63AAA72EDFF4124025538F0E6673560DA95A3 -PT=0DFCF7CA661572E050C522AE554A4BF8 -CT=7C185A5A68675DAC7A16C8DDE4B8CF8B - -I=80 -KEY=8496679D7598A1B91D2F221CF958F90B0EF5A51B4C6508948AF0AFE884625A28 -PT=7C185A5A68675DAC7A16C8DDE4B8CF8B -CT=88FDDDA7BC2B09E48598A94474C64DC7 - -I=81 -KEY=F27BCC0F919566675B129C526A4DC796860878BCF04E01700F6806ACF0A417EF -PT=88FDDDA7BC2B09E48598A94474C64DC7 -CT=35C5C98C9C774D0BE9EFFB55C90B2F9C - -I=82 -KEY=05F12B58DBF5602D31CFD0EB10313502B3CDB1306C394C7BE687FDF939AF3873 -PT=35C5C98C9C774D0BE9EFFB55C90B2F9C -CT=C3374B5C81646AC881F0F924C22A723B - -I=83 -KEY=FD05BE617555BC8184C2F46911C46B9E70FAFA6CED5D26B3677704DDFB854A48 -PT=C3374B5C81646AC881F0F924C22A723B -CT=0CE756792AF27525A088700DB66D4399 - -I=84 -KEY=3831345DFA5ADDF7CE8B5F76B5E1EBDE7C1DAC15C7AF5396C7FF74D04DE809D1 -PT=0CE756792AF27525A088700DB66D4399 -CT=401CD076E03C108A7FD79651407923E9 - -I=85 -KEY=B101FDD95C23BE560262D355E09FC39B3C017C632793431CB828E2810D912A38 -PT=401CD076E03C108A7FD79651407923E9 -CT=88614E46C416E5164F2A63CDA9DD7B89 - -I=86 -KEY=0B53859962A79D216E395830E36F8D45B4603225E385A60AF702814CA44C51B1 -PT=88614E46C416E5164F2A63CDA9DD7B89 -CT=7411856C8F14A2E5F6C5F1830302A66F - -I=87 -KEY=FE07E3B8961C2A1B3E34A50F8CFA1A45C071B7496C9104EF01C770CFA74EF7DE -PT=7411856C8F14A2E5F6C5F1830302A66F -CT=B0A815E93EBAC7A68F8BB420C8A5692D - -I=88 -KEY=9F2E0D3DB033B1929009D6C4C460B24F70D9A2A0522BC3498E4CC4EF6FEB9EF3 -PT=B0A815E93EBAC7A68F8BB420C8A5692D -CT=AA6D27BB26275F5CB3EC3D6A8AFB80BF - -I=89 -KEY=5E903EF160161E1CA79A26D28FE32175DAB4851B740C9C153DA0F985E5101E4C -PT=AA6D27BB26275F5CB3EC3D6A8AFB80BF -CT=EAF7941A7E5D3907B6F52C1106EED2CE - -I=90 -KEY=60284EF35A9246CC32002028E4969309304311010A51A5128B55D594E3FECC82 -PT=EAF7941A7E5D3907B6F52C1106EED2CE -CT=1178DD3DBDB1810E360E6FE09AA0D75C - -I=91 -KEY=300CB519F3203AD4589749651BD99AC7213BCC3CB7E0241CBD5BBA74795E1BDE -PT=1178DD3DBDB1810E360E6FE09AA0D75C -CT=584B48263DE541E93B29C6E570D4A6F4 - -I=92 -KEY=2F79EA55D0E3EAF1D0DBD364A7D64E2A7970841A8A0565F586727C91098ABD2A -PT=584B48263DE541E93B29C6E570D4A6F4 -CT=7B2EC27F2F1BC24EAD4FC0AA0519685C - -I=93 -KEY=8B46F59BF2C4B226523C203E8FD3936D025E4665A51EA7BB2B3DBC3B0C93D576 -PT=7B2EC27F2F1BC24EAD4FC0AA0519685C -CT=13404D003576493EBB36C07C6D16A1B6 - -I=94 -KEY=C7E75C30B0CE770A0075E3EBEB244811111E0B659068EE85900B7C47618574C0 -PT=13404D003576493EBB36C07C6D16A1B6 -CT=A083421A139DF68C8F863B337F3408BE - -I=95 -KEY=A957F876769BE9005DCEE4B7514FAC62B19D497F83F518091F8D47741EB17C7E -PT=A083421A139DF68C8F863B337F3408BE -CT=BF86650C9ECBD6C14B420FBE6B6E488B - -I=96 -KEY=FD4DE7532652D17C5ACCEA759C52A95C0E1B2C731D3ECEC854CF48CA75DF34F5 -PT=BF86650C9ECBD6C14B420FBE6B6E488B -CT=75CEFAE872574AB6F26B0CAF6F08D858 - -I=97 -KEY=54DBCDC0A57363DE6B3A032607E968C27BD5D69B6F69847EA6A444651AD7ECAD -PT=75CEFAE872574AB6F26B0CAF6F08D858 -CT=8A3F9C96598883E9D3760C8A8FE406C6 - -I=98 -KEY=AC10312E365401908F2C8AE371CB8C90F1EA4A0D36E1079775D248EF9533EA6B -PT=8A3F9C96598883E9D3760C8A8FE406C6 -CT=B8B372C0CC6D164F340DF26B8F832DF8 - -I=99 -KEY=64265CF02043C966C01DF5255F8D2867495938CDFA8C11D841DFBA841AB0C793 -PT=B8B372C0CC6D164F340DF26B8F832DF8 -CT=A7F6267A6F0CEB0EF7D07959EE065760 - -I=100 -KEY=CF6B88FB273B247B8D64B5A323EF5760EEAF1EB79580FAD6B60FC3DDF4B690F3 -PT=A7F6267A6F0CEB0EF7D07959EE065760 -CT=AD96ADAC9B786AB78B1B46D9E026C935 - -I=101 -KEY=4C8EEA35A90CB46AF32235997D2ADBBE4339B31B0EF890613D148504149059C6 -PT=AD96ADAC9B786AB78B1B46D9E026C935 -CT=FC7BAC9A5F64571AABF4B0A451C8D88D - -I=102 -KEY=0DD6D30191FABEC371CF0BA223BECF19BF421F81519CC77B96E035A04558814B -PT=FC7BAC9A5F64571AABF4B0A451C8D88D -CT=2B56E363834F27090FAC8061507A4787 - -I=103 -KEY=2E69324E634312611C33F695A137AFE49414FCE2D2D3E072994CB5C11522C6CC -PT=2B56E363834F27090FAC8061507A4787 -CT=FD37886E30CEFA28F8E8A5662A9EC5DC - -I=104 -KEY=8AFAC0C1507472CCB28B37CA88B7139D6923748CE21D1A5A61A410A73FBC0310 -PT=FD37886E30CEFA28F8E8A5662A9EC5DC -CT=F7F36142C000D5162F789C392971FCE7 - -I=105 -KEY=7DC5DA2A80219692F9F26C5934826DF29ED015CE221DCF4C4EDC8C9E16CDFFF7 -PT=F7F36142C000D5162F789C392971FCE7 -CT=D560607A0F0BE8320F2CEE56B155163F - -I=106 -KEY=3CC9AE3E3EB90B511C6D8CD74419D6944BB075B42D16277E41F062C8A798E9C8 -PT=D560607A0F0BE8320F2CEE56B155163F -CT=708133FEB47A226A616900D46FA85037 - -I=107 -KEY=8B84B7F96F9B3184D5B6402ECAE344CB3B31464A996C05142099621CC830B9FF -PT=708133FEB47A226A616900D46FA85037 -CT=1B2ED9348FC7A4E4AD8BFCE2A148D1AD - -I=108 -KEY=655CB7606D17582441247D23E222ECCF201F9F7E16ABA1F08D129EFE69786852 -PT=1B2ED9348FC7A4E4AD8BFCE2A148D1AD -CT=B2B726C8605A6F5CBA97F04E85A1F985 - -I=109 -KEY=E0BA77DAAD3E3502AB9A6CEBEC654D0492A8B9B676F1CEAC37856EB0ECD991D7 -PT=B2B726C8605A6F5CBA97F04E85A1F985 -CT=CD7F53BB4AEB364A1D8630E0B5C4A6A2 - -I=110 -KEY=1470D5E493B0E8212F02D4419C46A8CD5FD7EA0D3C1AF8E62A035E50591D3775 -PT=CD7F53BB4AEB364A1D8630E0B5C4A6A2 -CT=57271A960FE2170BA3F1987E694BBD16 - -I=111 -KEY=415408E88421573F93FDBE25DD4B90C208F0F09B33F8EFED89F2C62E30568A63 -PT=57271A960FE2170BA3F1987E694BBD16 -CT=E9D47C3E926475FFDB783624C3ADB17B - -I=112 -KEY=40B3017DC81EEE4BF652AE8BB8CEED1DE1248CA5A19C9A12528AF00AF3FB3B18 -PT=E9D47C3E926475FFDB783624C3ADB17B -CT=D78F96812BB55723E04BE8818C262485 - -I=113 -KEY=9EABE9B3608ACE61684BAD3F3FED5C9736AB1A248A29CD31B2C1188B7FDD1F9D -PT=D78F96812BB55723E04BE8818C262485 -CT=E2092227E1A3D2E525942090DA0A3F3E - -I=114 -KEY=B095E4F38E060016EBC4C42D3A4EFBD6D4A238036B8A1FD49755381BA5D720A3 -PT=E2092227E1A3D2E525942090DA0A3F3E -CT=95E9EE1F56A65FF85B752FC300F525AE - -I=115 -KEY=9B2841F44291552EA04DE13E4E78011B414BD61C3D2C402CCC2017D8A522050D -PT=95E9EE1F56A65FF85B752FC300F525AE -CT=32D8465F2E11A04F8984FEE8E710CD25 - -I=116 -KEY=67D8B10D0DDB61932E610EB077F0D85F73939043133DE06345A4E9304232C828 -PT=32D8465F2E11A04F8984FEE8E710CD25 -CT=2D9803ECFB95B2591FE56B3CBB4307F2 - -I=117 -KEY=B0C80A38EDE23A549EF08E5DC3CEA2F25E0B93AFE8A8523A5A41820CF971CFDA -PT=2D9803ECFB95B2591FE56B3CBB4307F2 -CT=4B19F9BCAFD471BF9014ADA19891E4E6 - -I=118 -KEY=85C6DF29F9AEBA6087E3746BA5CF6C1515126A13477C2385CA552FAD61E02B3C -PT=4B19F9BCAFD471BF9014ADA19891E4E6 -CT=53159BC4FBD06FD03ABAC028A536C4A0 - -I=119 -KEY=2D42BE0B33D92ECC40DF48CF0AE0CB764607F1D7BCAC4C55F0EFEF85C4D6EF9C -PT=53159BC4FBD06FD03ABAC028A536C4A0 -CT=BCDB1347ACD50D0084D588D4540420E3 - -I=120 -KEY=338A4DC6E729E6FCF71095BB4E6F52FEFADCE29010794155743A675190D2CF7F -PT=BCDB1347ACD50D0084D588D4540420E3 -CT=E12DC82E79554E1202DA471C3221A554 - -I=121 -KEY=47597486437CBCD33FC195C56FF972BB1BF12ABE692C0F4776E0204DA2F36A2B -PT=E12DC82E79554E1202DA471C3221A554 -CT=23A43E9D6F7C5A6C842233CCEC120EB9 - -I=122 -KEY=CEE8CF713EBF0C609E3429E5183014BB385514230650552BF2C213814EE16492 -PT=23A43E9D6F7C5A6C842233CCEC120EB9 -CT=9F3F4349BF98D3CC00DB167F0FFDC7AB - -I=123 -KEY=C9B3A1CAFA0D4F0DA942C17FFB75E333A76A576AB9C886E7F21905FE411CA339 -PT=9F3F4349BF98D3CC00DB167F0FFDC7AB -CT=C4D8B8EBEF311C11FE2404220EA65E99 - -I=124 -KEY=8360E6F464B61C4BAE31D3A72422128463B2EF8156F99AF60C3D01DC4FBAFDA0 -PT=C4D8B8EBEF311C11FE2404220EA65E99 -CT=47E3318C721E6C094763F0A18042911D - -I=125 -KEY=926B00B9767D0CAD5331CD6F0343C4A92451DE0D24E7F6FF4B5EF17DCFF86CBD -PT=47E3318C721E6C094763F0A18042911D -CT=D709FA9A1415B0FAC71B4CF52504791F - -I=126 -KEY=3F4349126EF6A51FD196742CB461D01EF358249730F246058C45BD88EAFC15A2 -PT=D709FA9A1415B0FAC71B4CF52504791F -CT=7937DD067DDB85F200A492E5824DA23C - -I=127 -KEY=4420ADF6906CFBF8421524E88517327C8A6FF9914D29C3F78CE12F6D68B1B79E -PT=7937DD067DDB85F200A492E5824DA23C -CT=B68617F1372847206BA088D7100334A4 - -I=128 -KEY=125BEB5234B89A376ABBB2185F24BDDE3CE9EE607A0184D7E741A7BA78B2833A -PT=B68617F1372847206BA088D7100334A4 -CT=390938BA9F2264484DE63D8003C15369 - -I=129 -KEY=A457831AB172D88111E87C3955D0C0F205E0D6DAE523E09FAAA79A3A7B73D053 -PT=390938BA9F2264484DE63D8003C15369 -CT=A69ED32FD728337A5C25FBC2230DC788 - -I=130 -KEY=CC7ED4183BFAE0FA0F9DD348B8E194F2A37E05F5320BD3E5F68261F8587E17DB -PT=A69ED32FD728337A5C25FBC2230DC788 -CT=EDB9D6099202FE4AE51EEC725478FB47 - -I=131 -KEY=686AB4F5C19296AED306ADEA4FD52D1A4EC7D3FCA0092DAF139C8D8A0C06EC9C -PT=EDB9D6099202FE4AE51EEC725478FB47 -CT=61059EA3BF0C953762CB37E50ED7081F - -I=132 -KEY=8115329FADEBA92AB2827BD7701A01442FC24D5F1F05B8987157BA6F02D1E483 -PT=61059EA3BF0C953762CB37E50ED7081F -CT=A683E36EF7CCDABDBCA683C2D6560D25 - -I=133 -KEY=49254E8904EED2766A6A1A615B63B97C8941AE31E8C96225CDF139ADD487E9A6 -PT=A683E36EF7CCDABDBCA683C2D6560D25 -CT=8EF424771561BFEC0058C7CAA5876EF6 - -I=134 -KEY=259194CE8701581012F5592B61BCA99507B58A46FDA8DDC9CDA9FE6771008750 -PT=8EF424771561BFEC0058C7CAA5876EF6 -CT=79AC024A7BA5FFE143D40D34F2E587A6 - -I=135 -KEY=CA0427FE28C77D0CA25D6851CCFE58C47E19880C860D22288E7DF35383E500F6 -PT=79AC024A7BA5FFE143D40D34F2E587A6 -CT=2258AB9F0E254CE21EB9B7F6EA690671 - -I=136 -KEY=DA9A4B566C9F670DF850F891A5274CC95C41239388286ECA90C444A5698C0687 -PT=2258AB9F0E254CE21EB9B7F6EA690671 -CT=55ACB73E8A45BF964BD040C799724DAD - -I=137 -KEY=9F177A6A6B524C75DB5CC0DBB6AD733209ED94AD026DD15CDB140462F0FE4B2A -PT=55ACB73E8A45BF964BD040C799724DAD -CT=3E904B15F2E5DDC934DABC25259CB3CF - -I=138 -KEY=2AD96F6874C1BA6A82C5EE80A9A2E8E5377DDFB8F0880C95EFCEB847D562F8E5 -PT=3E904B15F2E5DDC934DABC25259CB3CF -CT=3ACFF8D5B701A5BD1355DDA705D269CB - -I=139 -KEY=ADD59DF57CC01DE988C6D81E65B1D00E0DB2276D4789A928FC9B65E0D0B0912E -PT=3ACFF8D5B701A5BD1355DDA705D269CB -CT=3EF4AC14CC954FB4A9A808C7C00A2F1F - -I=140 -KEY=D3EBE43C4E9C96B37133F6AF8910A25F33468B798B1CE69C55336D2710BABE31 -PT=3EF4AC14CC954FB4A9A808C7C00A2F1F -CT=61C50D5C736AEDCF03C06FC310CC19D9 - -I=141 -KEY=FA45F434377F2E217C4A5B7A7526CC1952838625F8760B5356F302E40076A7E8 -PT=61C50D5C736AEDCF03C06FC310CC19D9 -CT=2BF543C6548ED0344262640AD95F95C9 - -I=142 -KEY=71EAD73C81ED5AE731D19B0B2B42F0E87976C5E3ACF8DB67149166EED9293221 -PT=2BF543C6548ED0344262640AD95F95C9 -CT=F8C1DBDD20317FEB1625634A451931B5 - -I=143 -KEY=3FD0019D000111D4300D2CEF39F53C0D81B71E3E8CC9A48C02B405A49C300394 -PT=F8C1DBDD20317FEB1625634A451931B5 -CT=DEDB54735B8B90C8EEC66EAECFB13ED6 - -I=144 -KEY=070976B2D3AA1E737BC24A8A794A21BE5F6C4A4DD7423444EC726B0A53813D42 -PT=DEDB54735B8B90C8EEC66EAECFB13ED6 -CT=75941A1ADA444115961E058E2D6C6396 - -I=145 -KEY=81AC2B7F073D0D06BA8A43D3381D3A3F2AF850570D0675517A6C6E847EED5ED4 -PT=75941A1ADA444115961E058E2D6C6396 -CT=7C66BE2B0354A6549E10489AF7A83424 - -I=146 -KEY=37BDD1946BB9B5616115F015E9162F5B569EEE7C0E52D305E47C261E89456AF0 -PT=7C66BE2B0354A6549E10489AF7A83424 -CT=F589769555BDEFD0B29E6A65313BD2E1 - -I=147 -KEY=CF27BD543BB4EED052B808D1EE350D35A31798E95BEF3CD556E24C7BB87EB811 -PT=F589769555BDEFD0B29E6A65313BD2E1 -CT=9B3215F70FBCC5ED9CC0D6D7E1E56F11 - -I=148 -KEY=43321308251C33234CCD9ED19E5E74AF38258D1E5453F938CA229AAC599BD700 -PT=9B3215F70FBCC5ED9CC0D6D7E1E56F11 -CT=705CCB60E0A6E997578DCC804D49D265 - -I=149 -KEY=F2152160EAD144776BA6BDED0AC49CD24879467EB4F510AF9DAF562C14D20565 -PT=705CCB60E0A6E997578DCC804D49D265 -CT=3DA4CEC68D47E55ECF21A1C5CDAFE4E6 - -I=150 -KEY=593B7EDAE946A5269EF33D088D1B297675DD88B839B2F5F1528EF7E9D97DE183 -PT=3DA4CEC68D47E55ECF21A1C5CDAFE4E6 -CT=32299EDBED49B66271107CA1822F179E - -I=151 -KEY=852E4554AD1459CE81DBA17D18DA96C447F41663D4FB4393239E8B485B52F61D -PT=32299EDBED49B66271107CA1822F179E -CT=45856FD2080FA9BBFA0857BCF7381823 - -I=152 -KEY=1D8F910508F9C08DB4DE4D5C465310F4027179B1DCF4EA28D996DCF4AC6AEE3E -PT=45856FD2080FA9BBFA0857BCF7381823 -CT=6A8C18595AF5D1E46F9F168C31566BAF - -I=153 -KEY=1A42C028C1ABA740D95A47ABD7B4F40D68FD61E886013BCCB609CA789D3C8591 -PT=6A8C18595AF5D1E46F9F168C31566BAF -CT=71A41A6B6BF9FB906B0617DCB76B4BA5 - -I=154 -KEY=3C408CB08BCAF34B2BCE6EF787A96D5219597B83EDF8C05CDD0FDDA42A57CE34 -PT=71A41A6B6BF9FB906B0617DCB76B4BA5 -CT=9105B8FC516E0B19AEDD003979F8C298 - -I=155 -KEY=804516E36B1B5E046B15CBE1D3F26EE9885CC37FBC96CB4573D2DD9D53AF0CAC -PT=9105B8FC516E0B19AEDD003979F8C298 -CT=27ACD01CC0403AD6DB45C7DF3E515EDE - -I=156 -KEY=CD8199690660BD4DBA38CE522D1A12CEAFF013637CD6F193A8971A426DFE5272 -PT=27ACD01CC0403AD6DB45C7DF3E515EDE -CT=86E2A23AC567C5F05F15A318E38360A7 - -I=157 -KEY=0AD8BB3D5B2A538DF0BDD50EB74CC1BA2912B159B9B13463F782B95A8E7D32D5 -PT=86E2A23AC567C5F05F15A318E38360A7 -CT=CB03EDA81BF211B5FE03D4A0879E9EDD - -I=158 -KEY=081040B60AE9E733243F4C39013EEDB5E2115CF1A24325D609816DFA09E3AC08 -PT=CB03EDA81BF211B5FE03D4A0879E9EDD -CT=6F1AD4AD727348DD593459E0D7661813 - -I=159 -KEY=A51E29D20BB0963DF854C898299E114A8D0B885CD0306D0B50B5341ADE85B41B -PT=6F1AD4AD727348DD593459E0D7661813 -CT=236B421E3103D4C17297D3F5C8BA1D17 - -I=160 -KEY=49D4EB9964431F42F0FC6494A47A50CCAE60CA42E133B9CA2222E7EF163FA90C -PT=236B421E3103D4C17297D3F5C8BA1D17 -CT=118AE5A5597E8DB200B26DBE11AC4BC8 - -I=161 -KEY=0F3F7298BE444450A0A07A4B73897720BFEA2FE7B84D347822908A510793E2C4 -PT=118AE5A5597E8DB200B26DBE11AC4BC8 -CT=DF02587F25CC4C59E6AECE98BCAACCB8 - -I=162 -KEY=7E30984A4C0B18D2F791858B83FC960960E877989D817821C43E44C9BB392E7C -PT=DF02587F25CC4C59E6AECE98BCAACCB8 -CT=3DA0F35FDAEF499ADBF602939FC748D4 - -I=163 -KEY=360A7168E056892E5BF0127EA3B58CAF5D4884C7476E31BB1FC8465A24FE66A8 -PT=3DA0F35FDAEF499ADBF602939FC748D4 -CT=FE462F878CEEDDDAA00855B85A81A14B - -I=164 -KEY=A75B3537E0EB98FC0F41C9E1306F6667A30EAB40CB80EC61BFC013E27E7FC7E3 -PT=FE462F878CEEDDDAA00855B85A81A14B -CT=47EA8AC561D7A9F99F64F41A9AD46E5C - -I=165 -KEY=219E71FC6D23A5103DE4DA9C5EDFA0AEE4E42185AA57459820A4E7F8E4ABA9BF -PT=47EA8AC561D7A9F99F64F41A9AD46E5C -CT=650FAE7F29A098D787F60CC3C0D77580 - -I=166 -KEY=038A888C6EA4E9502A15110832AE0DF081EB8FFA83F7DD4FA752EB3B247CDC3F -PT=650FAE7F29A098D787F60CC3C0D77580 -CT=0334BF8CA2835C71F2A283736D54E933 - -I=167 -KEY=714967419F9129B9649A13A9DA3291A582DF30762174813E55F068484928350C -PT=0334BF8CA2835C71F2A283736D54E933 -CT=1B3A09B325F3D833A3C83D941832B204 - -I=168 -KEY=BCDB12EAF8D3C95F821C0DD324FD36BB99E539C50487590DF63855DC511A8708 -PT=1B3A09B325F3D833A3C83D941832B204 -CT=CF980ED2619858290881314B7F0B9516 - -I=169 -KEY=B8FA32AE829E8AF3EF543A407E2D61BA567D3717651F0124FEB964972E11121E -PT=CF980ED2619858290881314B7F0B9516 -CT=98FF5ADA0739122DBBD241847D4A318D - -I=170 -KEY=D62592634F0ABD21AC98887A88845E2ECE826DCD62261309456B2513535B2393 -PT=98FF5ADA0739122DBBD241847D4A318D -CT=1824306B9F54BE4CE3F94F037B4B8569 - -I=171 -KEY=77005AE2FA1AD6D77D36566B9E988345D6A65DA6FD72AD45A6926A102810A6FA -PT=1824306B9F54BE4CE3F94F037B4B8569 -CT=25BA57B9035625DD268492282535960C - -I=172 -KEY=BE766696DC4458442056D89C96CAFDF0F31C0A1FFE2488988016F8380D2530F6 -PT=25BA57B9035625DD268492282535960C -CT=26AEAD4ED08CA78CE2A3358F36DA0E3F - -I=173 -KEY=1E1D3EBC714EE191EDB2A02B64EF2C23D5B2A7512EA82F1462B5CDB73BFF3EC9 -PT=26AEAD4ED08CA78CE2A3358F36DA0E3F -CT=10AB48E0CB1D72D82794E35DBDEF88F6 - -I=174 -KEY=D3EAD2DA40B4C94B506A0ED75210023BC519EFB1E5B55DCC45212EEA8610B63F -PT=10AB48E0CB1D72D82794E35DBDEF88F6 -CT=878BCAC367294B227533E1451F654960 - -I=175 -KEY=87D0B5D4A1314054EC37B67B4245BA8C42922572829C16EE3012CFAF9975FF5F -PT=878BCAC367294B227533E1451F654960 -CT=98CC3311EC8E8B75944503734DEAC00D - -I=176 -KEY=EF3FA3235BB42B1326DE67088C68E2BDDA5E16636E129D9BA457CCDCD49F3F52 -PT=98CC3311EC8E8B75944503734DEAC00D -CT=DAF5FB711E259B498918871933A2E1FD - -I=177 -KEY=2EBBBB1B070658DD43299478725AA88F00ABED12703706D22D4F4BC5E73DDEAF -PT=DAF5FB711E259B498918871933A2E1FD -CT=AACC545DEE8FF1F5C7A91A2EE3D25C1B - -I=178 -KEY=E15D1FC214F23FF93886D219B4DFCD45AA67B94F9EB8F727EAE651EB04EF82B4 -PT=AACC545DEE8FF1F5C7A91A2EE3D25C1B -CT=B844B67FBFD12E2712CCB66EBB4F7691 - -I=179 -KEY=CC3335B792121DE55FA04A4D6FEE57B012230F302169D900F82AE785BFA0F425 -PT=B844B67FBFD12E2712CCB66EBB4F7691 -CT=3E00C548BAEE6150FAA5B67986331FD5 - -I=180 -KEY=18DB585F810069C584251CA1E04A58382C23CA789B87B850028F51FC3993EBF0 -PT=3E00C548BAEE6150FAA5B67986331FD5 -CT=EB23DEEA8449E8FA0D828C12B98437AE - -I=181 -KEY=DFE08CA44B0BC4F51C43BE3631E20735C70014921FCE50AA0F0DDDEE8017DC5E -PT=EB23DEEA8449E8FA0D828C12B98437AE -CT=35BBE35CFC1D8FC40BC52F20D3FB35D5 - -I=182 -KEY=0F7DCC456D50A31AC9351794BFE6DD57F2BBF7CEE3D3DF6E04C8F2CE53ECE98B -PT=35BBE35CFC1D8FC40BC52F20D3FB35D5 -CT=DFFE7AEEAAF4762C7EB52453B1F61AD8 - -I=183 -KEY=D34FDEB3F04FB4563BC0FD204E8D459F2D458D204927A9427A7DD69DE21AF353 -PT=DFFE7AEEAAF4762C7EB52453B1F61AD8 -CT=C648DAF9EBFB4BC6166B15BF067E107F - -I=184 -KEY=5E90B747C9976A3F5050B0C51F116A81EB0D57D9A2DCE2846C16C322E464E32C -PT=C648DAF9EBFB4BC6166B15BF067E107F -CT=057258D07CAEE57807C396FAE651855A - -I=185 -KEY=52D3686BC0CD56B9DFF3A69F5073F30AEE7F0F09DE7207FC6BD555D802356676 -PT=057258D07CAEE57807C396FAE651855A -CT=B1109BE49E6E0F4C4190D8E0D717E8D0 - -I=186 -KEY=39C89286B658E006FBF97BAB1C4874025F6F94ED401C08B02A458D38D5228EA6 -PT=B1109BE49E6E0F4C4190D8E0D717E8D0 -CT=4DDE60FEEE40402058C988092603AB53 - -I=187 -KEY=562C9A004CBF05A4CA97994D48C0874C12B1F413AE5C4890728C0531F32125F5 -PT=4DDE60FEEE40402058C988092603AB53 -CT=3B18CBF83791E93D661EB269CFEAB1BE - -I=188 -KEY=F95206C4D3862E01A4DFE3676A2F297C29A93FEB99CDA1AD1492B7583CCB944B -PT=3B18CBF83791E93D661EB269CFEAB1BE -CT=0A3204DEE28B65E849136960949E4E5E - -I=189 -KEY=FEFDBE4294E46E22074E77B6BB7F964B239B3B357B46C4455D81DE38A855DA15 -PT=0A3204DEE28B65E849136960949E4E5E -CT=6C47ECB8B1478F0BBEDEF3A05A439776 - -I=190 -KEY=05858C957F861410187DD8CC2EE48E364FDCD78DCA014B4EE35F2D98F2164D63 -PT=6C47ECB8B1478F0BBEDEF3A05A439776 -CT=881188C2834B0496CB97F15F7A5C332A - -I=191 -KEY=A51CABC6D50BF9043E95CE2BC511D26DC7CD5F4F494A4FD828C8DCC7884A7E49 -PT=881188C2834B0496CB97F15F7A5C332A -CT=1FAE86251E2F615E3BFCAC545013CD12 - -I=192 -KEY=4EE1F6812CC35A16AA63F1CB39669ED7D863D96A57652E8613347093D859B35B -PT=1FAE86251E2F615E3BFCAC545013CD12 -CT=6017C6764080CB6D2BAC24C0F1BFF8F5 - -I=193 -KEY=F4F31D57DD72E6BF842D3834372AA60CB8741F1C17E5E5EB3898545329E64BAE -PT=6017C6764080CB6D2BAC24C0F1BFF8F5 -CT=10C8548253FB2BCD5D6F87CB28FAE7E7 - -I=194 -KEY=9DBB357DC99A95C240E750F1970C5C65A8BC4B9E441ECE2665F7D398011CAC49 -PT=10C8548253FB2BCD5D6F87CB28FAE7E7 -CT=20E253845A3DD51FFC16141FDAA20749 - -I=195 -KEY=A814CD8766E0BFFBD8530589D6202BE0885E181A1E231B3999E1C787DBBEAB00 -PT=20E253845A3DD51FFC16141FDAA20749 -CT=9383323218D891F9DCE7578FCD6A54A5 - -I=196 -KEY=C516C26E23E38C2B87346F759D8AEF881BDD2A2806FB8AC04506900816D4FFA5 -PT=9383323218D891F9DCE7578FCD6A54A5 -CT=9CFF8002D46EAFAAC7B035A788A37CF5 - -I=197 -KEY=9301F8120939D0E70C97F614F61F18648722AA2AD295256A82B6A5AF9E778350 -PT=9CFF8002D46EAFAAC7B035A788A37CF5 -CT=90C9F34994D5DA86406C7E82EDDD1009 - -I=198 -KEY=82B163831972D2CEF8F1780AA6B0707A17EB59634640FFECC2DADB2D73AA9359 -PT=90C9F34994D5DA86406C7E82EDDD1009 -CT=C8B5021EE84635EB7E7D0F5DBE967FD0 - -I=199 -KEY=F99FF8714EE5D822E0E25C499D7C96ACDF5E5B7DAE06CA07BCA7D470CD3CEC89 -PT=C8B5021EE84635EB7E7D0F5DBE967FD0 -CT=15CCB3C950764E24CA714707034DF9A7 - -I=200 -KEY=3529E6B83266BD558B7F33FC00AE4904CA92E8B4FE70842376D69377CE71152E -PT=15CCB3C950764E24CA714707034DF9A7 -CT=5FDA0EF6A2172D5DAA8E842F061A2E44 - -I=201 -KEY=2D77F95D8B556740CD9E2CC546CA45C99548E6425C67A97EDC581758C86B3B6A -PT=5FDA0EF6A2172D5DAA8E842F061A2E44 -CT=808781D0D10B3A02333E0A53E159287F - -I=202 -KEY=79298FD5F3C4B6378403CFAD05C3C96E15CF67928D6C937CEF661D0B29321315 -PT=808781D0D10B3A02333E0A53E159287F -CT=CC760400725FCFD37E757D99C6361B93 - -I=203 -KEY=69535F335F6AEBF452407F3F1C203410D9B96392FF335CAF91136092EF040886 -PT=CC760400725FCFD37E757D99C6361B93 -CT=247D3A6BB4C883C142C4000B085C3B79 - -I=204 -KEY=1A4F8FD7BD8DBCFB3677C708CDDDC7C4FDC459F94BFBDF6ED3D76099E75833FF -PT=247D3A6BB4C883C142C4000B085C3B79 -CT=47E4C802C61E6A1706BAE95AF75CA70D - -I=205 -KEY=A573989455A11CAD1E8642CD774806B1BA2091FB8DE5B579D56D89C3100494F2 -PT=47E4C802C61E6A1706BAE95AF75CA70D -CT=4297101350A5CE6C435FAD2725C22E46 - -I=206 -KEY=8D52414DD5600AA0CACD5AD399FD1B37F8B781E8DD407B15963224E435C6BAB4 -PT=4297101350A5CE6C435FAD2725C22E46 -CT=BEC56BF1F3B6BE60C0F4CB7AE77BF0F5 - -I=207 -KEY=49D4DF2FB3B561817F2BA6599B66C9244672EA192EF6C57556C6EF9ED2BD4A41 -PT=BEC56BF1F3B6BE60C0F4CB7AE77BF0F5 -CT=5B590F24D329BB6ED981938A4CDB9907 - -I=208 -KEY=68BD5721E2A51A184CDBAC3A035670701D2BE53DFDDF7E1B8F477C149E66D346 -PT=5B590F24D329BB6ED981938A4CDB9907 -CT=A8A15DBB79BB9B1131EF39C1E3FCFC9C - -I=209 -KEY=2CC71F1B9BE892100E8A340E61D0A128B58AB8868464E50ABEA845D57D9A2FDA -PT=A8A15DBB79BB9B1131EF39C1E3FCFC9C -CT=E8CBAB9E98D2866E779512AAC2FA2EA0 - -I=210 -KEY=EEF45CE1BB444A6BA5A029363FB9D4DB5D4113181CB66364C93D577FBF60017A -PT=E8CBAB9E98D2866E779512AAC2FA2EA0 -CT=7E4896F0A48A25FFE950B74B96F5F40E - -I=211 -KEY=151FE809785C11F8F19F31EA0246B416230985E8B83C469B206DE0342995F574 -PT=7E4896F0A48A25FFE950B74B96F5F40E -CT=E1C642B54B89822E73A695C851BC8EBE - -I=212 -KEY=14FE470CD366C580F124EA924B918BF5C2CFC75DF3B5C4B553CB75FC78297BCA -PT=E1C642B54B89822E73A695C851BC8EBE -CT=5FA2C6A2303ED7219984F30B78BE6B96 - -I=213 -KEY=92E61F4C495462354EF612492557D6AB9D6D01FFC38B1394CA4F86F70097105C -PT=5FA2C6A2303ED7219984F30B78BE6B96 -CT=3791959FBF178682A711623C2F91616C - -I=214 -KEY=6C0B6F23AC7526204C451A8ADE54D404AAFC94607C9C95166D5EE4CB2F067130 -PT=3791959FBF178682A711623C2F91616C -CT=E14FCACD5FD26FC2710776EE82317ABC - -I=215 -KEY=0DAE926E4172586817730DB9FDF2CE0B4BB35EAD234EFAD41C599225AD370B8C -PT=E14FCACD5FD26FC2710776EE82317ABC -CT=E576499EAF5365E7FE3B4961D9C74419 - -I=216 -KEY=DCD553F2977BD114B61F724ABC6AFE8EAEC517338C1D9F33E262DB4474F04F95 -PT=E576499EAF5365E7FE3B4961D9C74419 -CT=38567558119E72929F2932E6C289095E - -I=217 -KEY=6333DA8D5B655B5B5AABBCAF0B010BE89693626B9D83EDA17D4BE9A2B67946CB -PT=38567558119E72929F2932E6C289095E -CT=D20AD648F558E5507CC5C905E92CC268 - -I=218 -KEY=F9010180B464FBB8AD7C9D5E41B1E09A4499B42368DB08F1018E20A75F5584A3 -PT=D20AD648F558E5507CC5C905E92CC268 -CT=00C719F3757DDD2D2E64C3F2666FB2CB - -I=219 -KEY=8CE68ED02B4FFD9720B3D16FAE92D164445EADD01DA6D5DC2FEAE355393A3668 -PT=00C719F3757DDD2D2E64C3F2666FB2CB -CT=AEEAB9F50456CA3233A964219D2E7816 - -I=220 -KEY=57E26BA4DBD3549051B0D9436EB38D4FEAB4142519F01FEE1C438774A4144E7E -PT=AEEAB9F50456CA3233A964219D2E7816 -CT=3F02C97E127FD697AFD58BC66941F654 - -I=221 -KEY=4D0BC4A8796407C939797EF19D0CE7E3D5B6DD5B0B8FC979B3960CB2CD55B82A -PT=3F02C97E127FD697AFD58BC66941F654 -CT=BC4C0DDBCF0003B7814EEF1ABD22B6A8 - -I=222 -KEY=9C1FD1789544D2F3FF84574A216767CD69FAD080C48FCACE32D8E3A870770E82 -PT=BC4C0DDBCF0003B7814EEF1ABD22B6A8 -CT=D125D8C2920ADD3EA00103DC695A0D9D - -I=223 -KEY=ADBE97F99DBE61213892D9849B81B3FBB8DF0842568517F092D9E074192D031F -PT=D125D8C2920ADD3EA00103DC695A0D9D -CT=C0C57598639BA69E13C82E3AF24777C5 - -I=224 -KEY=A14DC5CF6CD0BD9AC9499317C509CCB4781A7DDA351EB16E8111CE4EEB6A74DA -PT=C0C57598639BA69E13C82E3AF24777C5 -CT=81E3B8F6A691BC30AA66AD70F0358881 - -I=225 -KEY=0EC479D8681AC8CA455D64A4BB34C86DF9F9C52C938F0D5E2B77633E1B5FFC5B -PT=81E3B8F6A691BC30AA66AD70F0358881 -CT=3CD03908D4ABA4B9885BCB1AC89D16C3 - -I=226 -KEY=E74102D814426E659732B303E6D44DB7C529FC244724A9E7A32CA824D3C2EA98 -PT=3CD03908D4ABA4B9885BCB1AC89D16C3 -CT=61662DD8EE676E17AE5CF2BABDC54A67 - -I=227 -KEY=EE4034F1A2EF16D7D848BB005CDA5E99A44FD1FCA943C7F00D705A9E6E07A0FF -PT=61662DD8EE676E17AE5CF2BABDC54A67 -CT=4E637432B0FF54FD665A902725B977EB - -I=228 -KEY=45E8F2DF7FC6E49FB0AF3B73788A1065EA2CA5CE19BC930D6B2ACAB94BBED714 -PT=4E637432B0FF54FD665A902725B977EB -CT=E53D1440407503B66530EEEEBBC9182B - -I=229 -KEY=0BEBC981186DEF84C01688CA16A061E00F11B18E59C990BB0E1A2457F077CF3F -PT=E53D1440407503B66530EEEEBBC9182B -CT=12134ADF5BB16D867B4EE9CE87EBE36D - -I=230 -KEY=6FADFDB92B0F888514730F17A37A81B61D02FB510278FD3D7554CD99779C2C52 -PT=12134ADF5BB16D867B4EE9CE87EBE36D -CT=310EACEF26A3EB5E4511437145DC30F9 - -I=231 -KEY=A565724F25EE29346543964864A0FFAA2C0C57BE24DB166330458EE832401CAB -PT=310EACEF26A3EB5E4511437145DC30F9 -CT=6848E5A618419EC6BACD9CD40BB42083 - -I=232 -KEY=1FAEBFE13AC7545DC742ED60241BC2E84444B2183C9A88A58A88123C39F43C28 -PT=6848E5A618419EC6BACD9CD40BB42083 -CT=C64DA25E7CB1A004E31CD37F9D4E1112 - -I=233 -KEY=A8EE2725373C48BAD9C0009C53C298A982091046402B28A16994C143A4BA2D3A -PT=C64DA25E7CB1A004E31CD37F9D4E1112 -CT=D02E6AE8FDD0C5813669080AA7B82527 - -I=234 -KEY=0770874A41ED1396940D75E6A5A09F5352277AAEBDFBED205FFDC9490302081D -PT=D02E6AE8FDD0C5813669080AA7B82527 -CT=5DDFBC75FE48D88E7D6F307E4A008BC7 - -I=235 -KEY=D7D098F85AB45E754629D2AB7DA2226C0FF8C6DB43B335AE2292F937490283DA -PT=5DDFBC75FE48D88E7D6F307E4A008BC7 -CT=E216C9AC28239E97237930079739ECE0 - -I=236 -KEY=5D6FAFF37EE7400691E504578251ECB1EDEE0F776B90AB3901EBC930DE3B6F3A -PT=E216C9AC28239E97237930079739ECE0 -CT=8D126659360D03548879000642E78029 - -I=237 -KEY=D75C5C64D94D0BC8566F568278B502D560FC692E5D9DA86D8992C9369CDCEF13 -PT=8D126659360D03548879000642E78029 -CT=9EA4C85D0F07AD618A2EBEBBE50D72B6 - -I=238 -KEY=D42BD9CDCD8BDA71E64817A2755C97C0FE58A173529A050C03BC778D79D19DA5 -PT=9EA4C85D0F07AD618A2EBEBBE50D72B6 -CT=1F525901AF1D94BA6CA3C7244E2CD885 - -I=239 -KEY=32DD1758D2EFC602EE85C58A66D0B080E10AF872FD8791B66F1FB0A937FD4520 -PT=1F525901AF1D94BA6CA3C7244E2CD885 -CT=E131C071BFA21FCE21D18DB87B522903 - -I=240 -KEY=BEC98C02D74E088458A668D0B6DDCF13003B380342258E784ECE3D114CAF6C23 -PT=E131C071BFA21FCE21D18DB87B522903 -CT=51F1B72C99C869BF73A6637D3A2E2278 - -I=241 -KEY=D368F7BE25A6A0C9AD2004E764F43A3551CA8F2FDBEDE7C73D685E6C76814E5B -PT=51F1B72C99C869BF73A6637D3A2E2278 -CT=0965CDD7A134672036F0C69774CFD380 - -I=242 -KEY=E5A7E12124540DBB4147A55C276A35B958AF42F87AD980E70B9898FB024E9DDB -PT=0965CDD7A134672036F0C69774CFD380 -CT=52ECEB721073FBF3D1BD5808351BEC5E - -I=243 -KEY=7D9702E2C8906805A580D5D85B03BBC60A43A98A6AAA7B14DA25C0F337557185 -PT=52ECEB721073FBF3D1BD5808351BEC5E -CT=493CE4E2B090DA3A2354C9DA7DB44D39 - -I=244 -KEY=8EFA5EC96F3AEF51AB38F4CCD969E5D5437F4D68DA3AA12EF97109294AE13CBC -PT=493CE4E2B090DA3A2354C9DA7DB44D39 -CT=DA64246FF65969995F9A4E8AE7C805CF - -I=245 -KEY=19C97957444E9931293047A647D7A19A991B69072C63C8B7A6EB47A3AD293973 -PT=DA64246FF65969995F9A4E8AE7C805CF -CT=CF85EBD76908CD8F8D3177E53DA3AD5E - -I=246 -KEY=7BDB3ED45BD78C131611FD9D54B8E9D2569E82D0456B05382BDA3046908A942D -PT=CF85EBD76908CD8F8D3177E53DA3AD5E -CT=45E1FDEFC98E62A841BD1D8D8236CEEF - -I=247 -KEY=19961521A42D96238D44F651E7E7D463137F7F3F8CE567906A672DCB12BC5AC2 -PT=45E1FDEFC98E62A841BD1D8D8236CEEF -CT=E056EF7B711A9CBDED8878EF74AF1671 - -I=248 -KEY=343360636E697E607319D4DCBC12B543F3299044FDFFFB2D87EF552466134CB3 -PT=E056EF7B711A9CBDED8878EF74AF1671 -CT=E4EFF77C6C3273393BE4814A16C3DF4A - -I=249 -KEY=B63D4D3D099F8E68F6A041D2EB1B1C1417C6673891CD8814BC0BD46E70D093F9 -PT=E4EFF77C6C3273393BE4814A16C3DF4A -CT=EC562E353DF8BA76699B01A6ACC8AD52 - -I=250 -KEY=EF500379EDE772968F1499F07B0B09CFFB90490DAC353262D590D5C8DC183EAB -PT=EC562E353DF8BA76699B01A6ACC8AD52 -CT=4473050ADC687112AACB86AA73CB6C6D - -I=251 -KEY=EA5CD4EDD99E64018AD3104026F0F528BFE34C07705D43707F5B5362AFD352C6 -PT=4473050ADC687112AACB86AA73CB6C6D -CT=6561A82EE86E4F18DF6965312F0C0984 - -I=252 -KEY=2ABF9529FC88D85FF68CF6D72B9A9CB5DA82E42998330C68A032365380DF5B42 -PT=6561A82EE86E4F18DF6965312F0C0984 -CT=47590CE1C90F3AC2C68B272B4A667F61 - -I=253 -KEY=A485B647790DBFF76F16C42A39F5F5559DDBE8C8513C36AA66B91178CAB92423 -PT=47590CE1C90F3AC2C68B272B4A667F61 -CT=4ED731A36BCB2672A810633E432D8922 - -I=254 -KEY=F0D0E858B597595A06458FF6C2259127D30CD96B3AF710D8CEA972468994AD01 -PT=4ED731A36BCB2672A810633E432D8922 -CT=4AC2F0D5F52762F77DB5D9EF53B76642 - -I=255 -KEY=EDDE80556ECA4CC51EFB33E23C43C04399CE29BECFD0722FB31CABA9DA23CB43 -PT=4AC2F0D5F52762F77DB5D9EF53B76642 -CT=A574FBE71E359A57D57A24A388FDF6EE - -I=256 -KEY=3C7C248C9FCE1D060D5B0664C0FF3F6B3CBAD259D1E5E87866668F0A52DE3DAD -PT=A574FBE71E359A57D57A24A388FDF6EE -CT=CCC3A011108469A7987F336C209BB84E - -I=257 -KEY=D43727570A809BE0D9EB78760FE4CDA9F0797248C16181DFFE19BC66724585E3 -PT=CCC3A011108469A7987F336C209BB84E -CT=686357D3013977390164834D4E5324DC - -I=258 -KEY=2F060E361977E544B98779AB55886D57981A259BC058F6E6FF7D3F2B3C16A13F -PT=686357D3013977390164834D4E5324DC -CT=DDDAD6FBDBF7C7BE7EBF3F036009A270 - -I=259 -KEY=A3630C05DC65905D37AFDB315B2AA4D945C0F3601BAF315881C200285C1F034F -PT=DDDAD6FBDBF7C7BE7EBF3F036009A270 -CT=237124FEDF28B4201B6D1584B93D5F7C - -I=260 -KEY=3E6ADAAEF53A36294CDEA0D94BE742C166B1D79EC48785789AAF15ACE5225C33 -PT=237124FEDF28B4201B6D1584B93D5F7C -CT=D1A9DDFB5662934AAD98B2861E50A871 - -I=261 -KEY=234615019E03C466AEA186112C4EB523B7180A6592E516323737A72AFB72F442 -PT=D1A9DDFB5662934AAD98B2861E50A871 -CT=CA18344F4C7A0F068398CA8137C056DD - -I=262 -KEY=22ED93581611798050E94CC70F6090BF7D003E2ADE9F1934B4AF6DABCCB2A29F -PT=CA18344F4C7A0F068398CA8137C056DD -CT=91FA4D62D10E852D9EDA42FAC8C34557 - -I=263 -KEY=A5981D9A37D6D3D948391D1D462B6DCFECFA73480F919C192A752F510471E7C8 -PT=91FA4D62D10E852D9EDA42FAC8C34557 -CT=B956221510135066B2B2552C4CB37642 - -I=264 -KEY=BF2E4397D0E93DFFA38D69B30F33835B55AC515D1F82CC7F98C77A7D48C2918A -PT=B956221510135066B2B2552C4CB37642 -CT=300CFCEAFED28E622CD08222D3A3B0B0 - -I=265 -KEY=55432143B807A628001F8D062CE0157265A0ADB7E150421DB417F85F9B61213A -PT=300CFCEAFED28E622CD08222D3A3B0B0 -CT=26681BCFDC630A21A684C60EF6A23747 - -I=266 -KEY=2966A6CB3BA9028583813B91FD72748D43C8B6783D33483C12933E516DC3167D -PT=26681BCFDC630A21A684C60EF6A23747 -CT=8EDD4B1B458D16841AD4525C01A8397E - -I=267 -KEY=1A22288AC28060F8E4B20C2AE0C82AEACD15FD6378BE5EB808476C0D6C6B2F03 -PT=8EDD4B1B458D16841AD4525C01A8397E -CT=BFDE412A7CAF0326AD1727996056A61C - -I=268 -KEY=C882E880508E92FF709E9BD4A555B30A72CBBC4904115D9EA5504B940C3D891F -PT=BFDE412A7CAF0326AD1727996056A61C -CT=88C039A0B395C5D08848C64DFC150C57 - -I=269 -KEY=298B3829EE60112C926E1FD583C9A2DEFA0B85E9B784984E2D188DD9F0288548 -PT=88C039A0B395C5D08848C64DFC150C57 -CT=ACDF23F2CB73FD8D3D814A79E3C94126 - -I=270 -KEY=2F2A3D0DDB2DBA8B8E3FF8A9DE765FE356D4A61B7CF765C31099C7A013E1C46E -PT=ACDF23F2CB73FD8D3D814A79E3C94126 -CT=A8BE26FE8780972650D5F384B744AC44 - -I=271 -KEY=F8CC20E8296CD38F1EF8BB2777EE1200FE6A80E5FB77F2E5404C3424A4A5682A -PT=A8BE26FE8780972650D5F384B744AC44 -CT=B5557CC20F64FCC576A6EC7BE324CE43 - -I=272 -KEY=678B5341F1BC13DB366B36D59ADADC7C4B3FFC27F4130E2036EAD85F4781A669 -PT=B5557CC20F64FCC576A6EC7BE324CE43 -CT=B59281EFF9C8D19E5D9C053CBE1F2F33 - -I=273 -KEY=E4701C9009693E38C455CE186A4B87DFFEAD7DC80DDBDFBE6B76DD63F99E895A -PT=B59281EFF9C8D19E5D9C053CBE1F2F33 -CT=7E8B1D4BFF81C5B9AA1FCA81DF8DE64F - -I=274 -KEY=C1F886CBCBF2BD920A0E68F30FCB8FCE80266083F25A1A07C16917E226136F15 -PT=7E8B1D4BFF81C5B9AA1FCA81DF8DE64F -CT=20841B35C77A109B528A1135E17D36EE - -I=275 -KEY=F05D61A9441B3C741D9D7489F2EE4A5EA0A27BB635200A9C93E306D7C76E59FB -PT=20841B35C77A109B528A1135E17D36EE -CT=C3195DC001FA1AD7C253DD3FE4A4BC7D - -I=276 -KEY=0C8E70943252DD5DC9819A9FDB375B3F63BB267634DA104B51B0DBE823CAE586 -PT=C3195DC001FA1AD7C253DD3FE4A4BC7D -CT=7E06BD1B3440DB4CA73AF1A05B33AD3F - -I=277 -KEY=84F1B5CF1AD11205E98ECD317AD670A11DBD9B6D009ACB07F68A2A4878F948B9 -PT=7E06BD1B3440DB4CA73AF1A05B33AD3F -CT=6224DBD71C1DC35A5C62777D2EA32C3E - -I=278 -KEY=E3465353AED687EF62CD1DA8D7DA3EEB7F9940BA1C87085DAAE85D35565A6487 -PT=6224DBD71C1DC35A5C62777D2EA32C3E -CT=1E4E51CD7BA1F7467AC69755F8894EF4 - -I=279 -KEY=31F715D1FFA116F58AB70E4A3EEF6E9561D711776726FF1BD02ECA60AED32A73 -PT=1E4E51CD7BA1F7467AC69755F8894EF4 -CT=4AB8AFEACB2A1B1AE9E74D647266E234 - -I=280 -KEY=487B6847CA14B04D429C81278332273F2B6FBE9DAC0CE40139C98704DCB5C847 -PT=4AB8AFEACB2A1B1AE9E74D647266E234 -CT=64C0BBA15382C142BBEE84B86B7D0BA0 - -I=281 -KEY=D1C9CA26B21945011B044EA6E29C9AD54FAF053CFF8E2543822703BCB7C8C3E7 -PT=64C0BBA15382C142BBEE84B86B7D0BA0 -CT=F82292AF614648EC6C1E9A1027167410 - -I=282 -KEY=3F585C00E187BE1B0C9E09781C9548A8B78D97939EC86DAFEE3999AC90DEB7F7 -PT=F82292AF614648EC6C1E9A1027167410 -CT=31C38ED5F207B412A14A51632D8805CE - -I=283 -KEY=340B8C115BAFF387400CD8F0EE8F8F6F864E19466CCFD9BD4F73C8CFBD56B239 -PT=31C38ED5F207B412A14A51632D8805CE -CT=3FC4CC8F4245BBBC5939A0C0A24A14DE - -I=284 -KEY=EA8EACF07402225D6C5181A8802DA515B98AD5C92E8A6201164A680F1F1CA6E7 -PT=3FC4CC8F4245BBBC5939A0C0A24A14DE -CT=23A98FA41D6C3D4CD9CFB9737A6D7872 - -I=285 -KEY=56EF7B73BF04F5F463E4D0EA0F6FC4DA9A235A6D33E65F4DCF85D17C6571DE95 -PT=23A98FA41D6C3D4CD9CFB9737A6D7872 -CT=82CC2D376B2772B7B988BEA17EFBB3D2 - -I=286 -KEY=C425E380DA91C34B73CE922C59B13C8818EF775A58C12DFA760D6FDD1B8A6D47 -PT=82CC2D376B2772B7B988BEA17EFBB3D2 -CT=5330F6218D528A32B24085EA496A05A9 - -I=287 -KEY=EA66C7FF9FCD2F9E76BCC5C6387E133E4BDF817BD593A7C8C44DEA3752E068EE -PT=5330F6218D528A32B24085EA496A05A9 -CT=7C1E082C2C89C90AD91AE81DF73F1F5F - -I=288 -KEY=C89CF336490832FB54BB536813AEE6EA37C18957F91A6EC21D57022AA5DF77B1 -PT=7C1E082C2C89C90AD91AE81DF73F1F5F -CT=2AB33673B654E2C49D6736D65A5F45C8 - -I=289 -KEY=7CC5409A9AE1F997774C3FEB74A6E9061D72BF244F4E8C06803034FCFF803279 -PT=2AB33673B654E2C49D6736D65A5F45C8 -CT=21BA6CADDCA5E0BE779D1A2651794C81 - -I=290 -KEY=E5E1873FDEE9DC066AF79C0E6027D0703CC8D38993EB6CB8F7AD2EDAAEF97EF8 -PT=21BA6CADDCA5E0BE779D1A2651794C81 -CT=8E2AF8BA54CF04812AE786C180FCFCA8 - -I=291 -KEY=844AA67914DE1C11677B5526D5B12765B2E22B33C7246839DD4AA81B2E058250 -PT=8E2AF8BA54CF04812AE786C180FCFCA8 -CT=E48A7CD35CA33B1D919B8A83ADF4C6BE - -I=292 -KEY=FE3248768ACB0AF9DBD639AF7B7EB944566857E09B8753244CD1229883F144EE -PT=E48A7CD35CA33B1D919B8A83ADF4C6BE -CT=C377A76CF43C27784CC54079744413D1 - -I=293 -KEY=709E7BC30A7DE8FADC071B3D04338FCA951FF08C6FBB745C001462E1F7B5573F -PT=C377A76CF43C27784CC54079744413D1 -CT=01D8083A9EA403A4754EF82CA29CDD5B - -I=294 -KEY=448B1AEC2F68D202679183D85C4A6D2194C7F8B6F11F77F8755A9ACD55298A64 -PT=01D8083A9EA403A4754EF82CA29CDD5B -CT=46ADC32EFF2C3EFF40B468E845EFC2E4 - -I=295 -KEY=529401616FA6193014D6A10BEF1A816FD26A3B980E33490735EEF22510C64880 -PT=46ADC32EFF2C3EFF40B468E845EFC2E4 -CT=FCC6594B1BBF40E28BE798ABC00163F1 - -I=296 -KEY=15A5E8BAF02EF91390AB7D35742CC5C12EAC62D3158C09E5BE096A8ED0C72B71 -PT=FCC6594B1BBF40E28BE798ABC00163F1 -CT=28D35B6E1140738ED1DF20FE11003B1E - -I=297 -KEY=589C04ECDF2B884807919A2018A93080067F39BD04CC7A6B6FD64A70C1C7106F -PT=28D35B6E1140738ED1DF20FE11003B1E -CT=3354C7962E19FB043FD4CD7B2C99E195 - -I=298 -KEY=A6987BEB541098C7173475B34568F36B352BFE2B2AD5816F5002870BED5EF1FA -PT=3354C7962E19FB043FD4CD7B2C99E195 -CT=EB76F282C9F10F507FACFCDEEC8BBBB8 - -I=299 -KEY=3732B395057761A8A2624F52354668CFDE5D0CA9E3248E3F2FAE7BD501D54A42 -PT=EB76F282C9F10F507FACFCDEEC8BBBB8 -CT=77A4DAE8406992C5018D6B0310195E0C - -I=300 -KEY=E24C9F98F43E840AE04ED4928133F65AA9F9D641A34D1CFA2E2310D611CC144E -PT=77A4DAE8406992C5018D6B0310195E0C -CT=655DEC1062EDB50B8B31A66071E236A2 - -I=301 -KEY=8BA207CA6E2B720810E66CCAB597E8DACCA43A51C1A0A9F1A512B6B6602E22EC -PT=655DEC1062EDB50B8B31A66071E236A2 -CT=28A22A069D8FF3DE359860B0A5B6FD1F - -I=302 -KEY=22C629C84758D553AFE4876AA739A1F0E40610575C2F5A2F908AD606C598DFF3 -PT=28A22A069D8FF3DE359860B0A5B6FD1F -CT=95DD88B4AFD0680E221C70422ADFFCD1 - -I=303 -KEY=F86A3C799AAB6884220196BF07E1643D71DB98E3F3FF3221B296A644EF472322 -PT=95DD88B4AFD0680E221C70422ADFFCD1 -CT=323475C634FD6845BAA9F371F29DC363 - -I=304 -KEY=83412E9600B279F76C93F171C469AD1943EFED25C7025A64083F55351DDAE041 -PT=323475C634FD6845BAA9F371F29DC363 -CT=61276AD535F9E73FCFB53DBF2D5D1F62 - -I=305 -KEY=01AD15137C4A572322660716B6B4EDCD22C887F0F2FBBD5BC78A688A3087FF23 -PT=61276AD535F9E73FCFB53DBF2D5D1F62 -CT=105ECB04A5CA32FC93987569A7CB46D7 - -I=306 -KEY=1CC639BA56CA0DF23E64BB3395C08BB332964CF457318FA754121DE3974CB9F4 -PT=105ECB04A5CA32FC93987569A7CB46D7 -CT=831DBB3F4BBD4343B94D54AA2B3E0620 - -I=307 -KEY=25ABCF5B8DB1A7CCB1FA49936E0AB3C8B18BF7CB1C8CCCE4ED5F4949BC72BFD4 -PT=831DBB3F4BBD4343B94D54AA2B3E0620 -CT=40B9D9C6201E639DC9A04E500BCD7F61 - -I=308 -KEY=75B34E0F371C4527732F22CF35AD923BF1322E0D3C92AF7924FF0719B7BFC0B5 -PT=40B9D9C6201E639DC9A04E500BCD7F61 -CT=A159BB0C751148C14D561E0407A9F6DB - -I=309 -KEY=1EB6E3491B431B7EFFCCC965C9041274506B95014983E7B869A9191DB016366E -PT=A159BB0C751148C14D561E0407A9F6DB -CT=2012E67815334AC48E5309DD129E0476 - -I=310 -KEY=F0BDAFB216613A6FB3819D08B17EFDC1707973795CB0AD7CE7FA10C0A2883218 -PT=2012E67815334AC48E5309DD129E0476 -CT=53E415BC0C9013F83B77298395FC9FEF - -I=311 -KEY=9C5A3B9C862E07159AB06D5B7FB585C5239D66C55020BE84DC8D39433774ADF7 -PT=53E415BC0C9013F83B77298395FC9FEF -CT=2B1EEAA13373494A2A56C15FD5ECA103 - -I=312 -KEY=9764AC349B8222394160F4896BA6761808838C646353F7CEF6DBF81CE2980CF4 -PT=2B1EEAA13373494A2A56C15FD5ECA103 -CT=2A00E873782853DC842427A03C30A81A - -I=313 -KEY=42A1614569C4DE66D6336BC082B3B9DD228364171B7BA41272FFDFBCDEA8A4EE -PT=2A00E873782853DC842427A03C30A81A -CT=5FEB74E489C4C8121A15C2BCF51046A5 - -I=314 -KEY=CED80BE0859A5863CFE41F0F2CE9F65B7D6810F392BF6C0068EA1D002BB8E24B -PT=5FEB74E489C4C8121A15C2BCF51046A5 -CT=948214D5DB68997C37A48927AA97B89A - -I=315 -KEY=178DAF533EBB695D5E57401E5345C3E8E9EA042649D7F57C5F4E9427812F5AD1 -PT=948214D5DB68997C37A48927AA97B89A -CT=AB8F3BB9917E4D1C8F1F2EDDB7070530 - -I=316 -KEY=66F4B8B5A0BD877514FDB4CD2DD04D8C42653F9FD8A9B860D051BAFA36285FE1 -PT=AB8F3BB9917E4D1C8F1F2EDDB7070530 -CT=CB5FB11C6DB1AB6BC189F0F3FB47A2A5 - -I=317 -KEY=9753278CFCEE8B059ECF573A2E0D65D6893A8E83B518130B11D84A09CD6FFD44 -PT=CB5FB11C6DB1AB6BC189F0F3FB47A2A5 -CT=F0CE65E6C5C263182E6C253F26460A1B - -I=318 -KEY=121A860A5B53C56E536DE56566F31E2079F4EB6570DA70133FB46F36EB29F75F -PT=F0CE65E6C5C263182E6C253F26460A1B -CT=9AA17B0F532814CA74FF0A046F377C48 - -I=319 -KEY=88F5E58E9522495BF7B68430946F7C0FE355906A23F264D94B4B6532841E8B17 -PT=9AA17B0F532814CA74FF0A046F377C48 -CT=52CAAEF16E55858487AEDBDBA822002D - -I=320 -KEY=D9A3D3547F215D44D80C6A5D3548D4D2B19F3E9B4DA7E15DCCE5BEE92C3C8B3A -PT=52CAAEF16E55858487AEDBDBA822002D -CT=2599545FD15C7F59A6F02CDCB95E6589 - -I=321 -KEY=6ACE86543B0F981C2D0FCB1408A42C3294066AC49CFB9E046A1592359562EEB3 -PT=2599545FD15C7F59A6F02CDCB95E6589 -CT=DC7A68313CE3E1963D31E5149CDBE22A - -I=322 -KEY=E9D6D08194DAFBB7B491124515118FA6487C02F5A0187F925724772109B90C99 -PT=DC7A68313CE3E1963D31E5149CDBE22A -CT=333B588A7354CB3229E43780AFE4738D - -I=323 -KEY=762FC93CEED1EE9C6EF702A4E3BBABD67B475A7FD34CB4A07EC040A1A65D7F14 -PT=333B588A7354CB3229E43780AFE4738D -CT=41727DC0D18725AFD2EF8FF51EAE1C2C - -I=324 -KEY=FF4EC1DF818E820424CFE5D09EE2E5423A3527BF02CB910FAC2FCF54B8F36338 -PT=41727DC0D18725AFD2EF8FF51EAE1C2C -CT=A7236B16D9937C84F37BF9D79D0251F9 - -I=325 -KEY=59BDAB706DEA2EC52AE05A2E4382A4169D164CA9DB58ED8B5F54368325F132C1 -PT=A7236B16D9937C84F37BF9D79D0251F9 -CT=B81D30EFDB86688F1DCA616EC771B9FD - -I=326 -KEY=4C008516CD614B6588A526FFE33C055B250B7C4600DE8504429E57EDE2808B3C -PT=B81D30EFDB86688F1DCA616EC771B9FD -CT=A5AD142C8F078ABF419B7CF5C86C9F83 - -I=327 -KEY=DB65698F99E4A27019ABE194A89E9BC680A6686A8FD90FBB03052B182AEC14BF -PT=A5AD142C8F078ABF419B7CF5C86C9F83 -CT=861B59E3B61A5D02F0D70DFF40EF7FF2 - -I=328 -KEY=0790C16C53A7826B4B309DDF99B5239006BD318939C352B9F3D226E76A036B4D -PT=861B59E3B61A5D02F0D70DFF40EF7FF2 -CT=B0F4C2C4D0D282BE3128AD78D34B1FA6 - -I=329 -KEY=AFE168F089E676A806DD191003777E6DB649F34DE911D007C2FA8B9FB94874EB -PT=B0F4C2C4D0D282BE3128AD78D34B1FA6 -CT=9DFCF5727851ADE8C37A9AA3AA77B20D - -I=330 -KEY=F261CDF199D9EF436C1A08EB9755A2112BB5063F91407DEF0180113C133FC6E6 -PT=9DFCF5727851ADE8C37A9AA3AA77B20D -CT=9268DBA972B72C9DEF15CF9B8041F23B - -I=331 -KEY=E0D6DCF3BA840720688456A43E849C5CB9DDDD96E3F75172EE95DEA7937E34DD -PT=9268DBA972B72C9DEF15CF9B8041F23B -CT=D45A8B321CB6D8F28167C857BC2900BF - -I=332 -KEY=B77CF3A880C2E9E66D0C98A4D88555F46D8756A4FF4189806FF216F02F573462 -PT=D45A8B321CB6D8F28167C857BC2900BF -CT=0124FE2D8BCB81E1286A18D2BABEA919 - -I=333 -KEY=7729E55EFA6B249E0207E06AAF6F09206CA3A889748A086147980E2295E99D7B -PT=0124FE2D8BCB81E1286A18D2BABEA919 -CT=A1BB0D975A50BE8BD8C2973D4BA7BF42 - -I=334 -KEY=102384784C54539084BC7181AA95F184CD18A51E2EDAB6EA9F5A991FDE4E2239 -PT=A1BB0D975A50BE8BD8C2973D4BA7BF42 -CT=15302D5DBFD8E407EADDE9896B42CB13 - -I=335 -KEY=9FF48EF1068BFC07DA38F7790D7418D2D8288843910252ED75877096B50CE92A -PT=15302D5DBFD8E407EADDE9896B42CB13 -CT=90D93B8F802CFAD3F6E682DD704B5F43 - -I=336 -KEY=84477EB9007ECDF8D1C4A6A976C76AB848F1B3CC112EA83E8361F24BC547B669 -PT=90D93B8F802CFAD3F6E682DD704B5F43 -CT=2DD7E0B91C5DDF0FD118F4CDD836A212 - -I=337 -KEY=F1CE87DE930567CE29DF313D8778358D652653750D737731527906861D71147B -PT=2DD7E0B91C5DDF0FD118F4CDD836A212 -CT=AC9D307EFF44703D6FDA621FFF8D077C - -I=338 -KEY=22D31C8F64CFB23620A70E7CD4A486D3C9BB630BF237070C3DA36499E2FC1307 -PT=AC9D307EFF44703D6FDA621FFF8D077C -CT=CC6772DE3B27CB1DB3E5A804843EB6FF - -I=339 -KEY=FC9057D2D2D28BFAC4D5E3654717188205DC11D5C910CC118E46CC9D66C2A5F8 -PT=CC6772DE3B27CB1DB3E5A804843EB6FF -CT=BDB021550FE0744090EAFEEBCF422061 - -I=340 -KEY=1EA032190E7E4CC45D2E1E138429658AB86C3080C6F0B8511EAC3276A9808599 -PT=BDB021550FE0744090EAFEEBCF422061 -CT=C6E21F9A1305C3969F2D70C11D58A1A7 - -I=341 -KEY=B633EDA212B952785755700FBDC91CA57E8E2F1AD5F57BC7818142B7B4D8243E -PT=C6E21F9A1305C3969F2D70C11D58A1A7 -CT=01BC936B7063CA9D28DB1FFCCB9C2048 - -I=342 -KEY=94A06984520AB40D74568F0D5286AEE37F32BC71A596B15AA95A5D4B7F440476 -PT=01BC936B7063CA9D28DB1FFCCB9C2048 -CT=88279D100DFA68CEBD9949F19C3333F4 - -I=343 -KEY=96A3BD621155F71A9EFB8E35F95238ACF7152161A86CD99414C314BAE3773782 -PT=88279D100DFA68CEBD9949F19C3333F4 -CT=41574A686596D4741BF5DE52B5183260 - -I=344 -KEY=185312E4301E5AADC373CEB3EBA66FB7B6426B09CDFA0DE00F36CAE8566F05E2 -PT=41574A686596D4741BF5DE52B5183260 -CT=BD9F5087C32A66A4797C7EE87355FF4A - -I=345 -KEY=BC5D60D256DCA48E88E52F05C349431A0BDD3B8E0ED06B44764AB400253AFAA8 -PT=BD9F5087C32A66A4797C7EE87355FF4A -CT=A88BC3FAF87D6C1D3F98A2884EF1D4DA - -I=346 -KEY=1485A9209167A6FA2ECD2CE6AA03DBA5A356F874F6AD075949D216886BCB2E72 -PT=A88BC3FAF87D6C1D3F98A2884EF1D4DA -CT=E514E6E34A050EB917F2382EDF92353A - -I=347 -KEY=2B62B0E29763FF09F53A2006B990E97746421E97BCA809E05E202EA6B4591B48 -PT=E514E6E34A050EB917F2382EDF92353A -CT=142EEBE72E0F56ABE5D67FCC28F957F6 - -I=348 -KEY=FC13067E362B7C9C39AA73B85F32011C526CF57092A75F4BBBF6516A9CA04CBE -PT=142EEBE72E0F56ABE5D67FCC28F957F6 -CT=24FDB7A03FE8A9288BFAA5AC2527D015 - -I=349 -KEY=8AC3B473244989EA74025FE98269BC17769142D0AD4FF663300CF4C6B9879CAB -PT=24FDB7A03FE8A9288BFAA5AC2527D015 -CT=649095ABA5F4006B7B89D20F10A37AE9 - -I=350 -KEY=FD0F4205DBFF0160203898EF02E9088E1201D77B08BBF6084B8526C9A924E642 -PT=649095ABA5F4006B7B89D20F10A37AE9 -CT=F5428E8BDDDC31FC8EF67BC7DB3201D3 - -I=351 -KEY=701AF95194FB0918BC2CA79AFD507336E74359F0D567C7F4C5735D0E7216E791 -PT=F5428E8BDDDC31FC8EF67BC7DB3201D3 -CT=A56B2014A4929373DC1F6FD5C0AC138C - -I=352 -KEY=633D0E72722E6443D4E219086D221939422879E471F55487196C32DBB2BAF41D -PT=A56B2014A4929373DC1F6FD5C0AC138C -CT=F35F9CD43144B358843A48B4D1C41882 - -I=353 -KEY=DCA79BA0184EC0A22A875E5057CA967AB177E53040B1E7DF9D567A6F637EEC9F -PT=F35F9CD43144B358843A48B4D1C41882 -CT=A572C1F98330A1C1FA91DFD5A5B76AB9 - -I=354 -KEY=A3D0FE4C3C1A1CE19CF66CF80135553D140524C9C381461E67C7A5BAC6C98626 -PT=A572C1F98330A1C1FA91DFD5A5B76AB9 -CT=23C56E065427F0409504053DD8A994CD - -I=355 -KEY=175C8D4085802768D20875CDBE6EFE2437C04ACF97A6B65EF2C3A0871E6012EB -PT=23C56E065427F0409504053DD8A994CD -CT=7E666724C1CAC0A582325381E9C98D73 - -I=356 -KEY=800EE65CA3DE8643371DA10FB0605AB649A62DEB566C76FB70F1F306F7A99F98 -PT=7E666724C1CAC0A582325381E9C98D73 -CT=B6C18D730A074196884CADF151CAC890 - -I=357 -KEY=F526E578E8978822944644B146154425FF67A0985C6B376DF8BD5EF7A6635708 -PT=B6C18D730A074196884CADF151CAC890 -CT=0068BB370419CD39748559C2DE206817 - -I=358 -KEY=7D144850BE03306F41A642442890EA20FF0F1BAF5872FA548C38073578433F1F -PT=0068BB370419CD39748559C2DE206817 -CT=56852D240F01729C4EAD0B1FFC3EDA1F - -I=359 -KEY=33B2189E3774B1A066BE522C07550F88A98A368B577388C8C2950C2A847DE500 -PT=56852D240F01729C4EAD0B1FFC3EDA1F -CT=458633A84E1F5737E9668A37388CF3C2 - -I=360 -KEY=CF53C76250347B0CC5CAC660D52199B1EC0C0523196CDFFF2BF3861DBCF116C2 -PT=458633A84E1F5737E9668A37388CF3C2 -CT=F96E181E03350F27106C8D24403A49DD - -I=361 -KEY=618676C1702531077565060B5DA0570B15621D3D1A59D0D83B9F0B39FCCB5F1F -PT=F96E181E03350F27106C8D24403A49DD -CT=B515584E252F703A4EB55E81EDA58E30 - -I=362 -KEY=D2C8CF9645CD741F67263845150FE649A07745733F76A0E2752A55B8116ED12F -PT=B515584E252F703A4EB55E81EDA58E30 -CT=54E7D10C236785AFE0A93B3971D6F237 - -I=363 -KEY=D0847F41C7940023491C2F83D02F8271F490947F1C11254D95836E8160B82318 -PT=54E7D10C236785AFE0A93B3971D6F237 -CT=937DFDE10E96030A0A8823EA3EF31B98 - -I=364 -KEY=17502FC3077EFD420D2268CE0FF26F4667ED699E128726479F0B4D6B5E4B3880 -PT=937DFDE10E96030A0A8823EA3EF31B98 -CT=93FDF0392A3391C74DBE4229792C9630 - -I=365 -KEY=4D6AA08A6C7EB7CA9CBE7AF4500C229EF41099A738B4B780D2B50F422767AEB0 -PT=93FDF0392A3391C74DBE4229792C9630 -CT=B9F80E1476658E6CE7FADBA215298958 - -I=366 -KEY=D8820A50934290C146AFE477D9D4A0224DE897B34ED139EC354FD4E0324E27E8 -PT=B9F80E1476658E6CE7FADBA215298958 -CT=87ACDCD1F1332B9961CC5E18F9009A39 - -I=367 -KEY=50E8959452DD52247A6F21A0C7BEDEB8CA444B62BFE2127554838AF8CB4EBDD1 -PT=87ACDCD1F1332B9961CC5E18F9009A39 -CT=3DD6249971FEC0FB4432236078D98D53 - -I=368 -KEY=7A1973C5B90748596A54C709D1598DA5F7926FFBCE1CD28E10B1A998B3973082 -PT=3DD6249971FEC0FB4432236078D98D53 -CT=D540F8BDE3442D17E88B524D00618309 - -I=369 -KEY=F9C08719A452CA931A62C5BD8F1D669D22D297462D58FF99F83AFBD5B3F6B38B -PT=D540F8BDE3442D17E88B524D00618309 -CT=7BB18B2DA9ED188BCE3B18C02C9B3F3B - -I=370 -KEY=5EBA35F7E58381DBE29EC4A1D9B5B9AD59631C6B84B5E7123601E3159F6D8CB0 -PT=7BB18B2DA9ED188BCE3B18C02C9B3F3B -CT=9A7380BAA169495B0FC29BB002D70E48 - -I=371 -KEY=E442442FE32FA6BDA63AF0A6AC5D5AB2C3109CD125DCAE4939C378A59DBA82F8 -PT=9A7380BAA169495B0FC29BB002D70E48 -CT=88F3FE65298F7498A788E4196F13FC80 - -I=372 -KEY=39079A8713E148703212A6F7FFD1B04D4BE362B40C53DAD19E4B9CBCF2A97E78 -PT=88F3FE65298F7498A788E4196F13FC80 -CT=A5E6361FBA6418CD9B2F50992B50A557 - -I=373 -KEY=A99A33F38B36E3EE4DEE59F8A4282A84EE0554ABB637C21C0564CC25D9F9DB2F -PT=A5E6361FBA6418CD9B2F50992B50A557 -CT=B1430F431ACC1C498FABF2D33B63CC67 - -I=374 -KEY=BC09FAC540F44949F3B8EDFE2444CA725F465BE8ACFBDE558ACF3EF6E29A1748 -PT=B1430F431ACC1C498FABF2D33B63CC67 -CT=A90D76642D8D7899DD4A85EB92C89382 - -I=375 -KEY=D26C1D07B51073C609030DC782FFAE93F64B2D8C8176A6CC5785BB1D705284CA -PT=A90D76642D8D7899DD4A85EB92C89382 -CT=57522F39211100EF248D4A34E35CE4CE - -I=376 -KEY=2D7ADCD18F615F814B8D8B07CE48B4A1A11902B5A067A6237308F129930E6004 -PT=57522F39211100EF248D4A34E35CE4CE -CT=87AED1E0C9F067C5F3F6D3D3BBCDE872 - -I=377 -KEY=CA206C3442FAEFF3CB1292C675F52C2426B7D3556997C1E680FE22FA28C38876 -PT=87AED1E0C9F067C5F3F6D3D3BBCDE872 -CT=05798F53DFAE4A78D7BEEC24BE775B55 - -I=378 -KEY=6ECC5BC346B18446D77FFBC44CCB0B1823CE5C06B6398B9E5740CEDE96B4D323 -PT=05798F53DFAE4A78D7BEEC24BE775B55 -CT=7677CE104395FFA15B51F81DAFBCAB1A - -I=379 -KEY=2E52C8E239CF1E959AB831307034FEF755B99216F5AC743F0C1136C339087839 -PT=7677CE104395FFA15B51F81DAFBCAB1A -CT=760DE53561246F944B3E6279B39373F1 - -I=380 -KEY=79B65B7D435E2134A1AB9A1CC1F08A8423B4772394881BAB472F54BA8A9B0BC8 -PT=760DE53561246F944B3E6279B39373F1 -CT=5B61CC978A9C808767C272432765EC0B - -I=381 -KEY=9EF57B89E7B8127348A9EF05E93DCC8D78D5BBB41E149B2C20ED26F9ADFEE7C3 -PT=5B61CC978A9C808767C272432765EC0B -CT=902CDF3BD5E869E9CCFF8F2A454E1D42 - -I=382 -KEY=15BB7B6BC685E4865BFA134C59CFC9C5E8F9648FCBFCF2C5EC12A9D3E8B0FA81 -PT=902CDF3BD5E869E9CCFF8F2A454E1D42 -CT=38264937B9372C316478BDF7AE578900 - -I=383 -KEY=735D93C1DDD54986ACC6C2B0DFCC5E8AD0DF2DB872CBDEF4886A142446E77381 -PT=38264937B9372C316478BDF7AE578900 -CT=3BFE31D3E909E6EC3112F88DB8FFCA45 - -I=384 -KEY=675B0E7FC5BCC3AF319B1D55C1F62CCAEB211C6B9BC23818B978ECA9FE18B9C4 -PT=3BFE31D3E909E6EC3112F88DB8FFCA45 -CT=2BFD5F6532BC1D2A8DA34481F9228B84 - -I=385 -KEY=0AB242F9783E75D04E98733E63458F53C0DC430EA97E253234DBA828073A3240 -PT=2BFD5F6532BC1D2A8DA34481F9228B84 -CT=161481003108BAEFCC02BFD335C6A89F - -I=386 -KEY=58457CB82A24222839CF20D837F168A8D6C8C20E98769FDDF8D917FB32FC9ADF -PT=161481003108BAEFCC02BFD335C6A89F -CT=8A50E98A1165C1B6137231E519EC137B - -I=387 -KEY=C2C52CEA5654AAC9BD60FA04068094EF5C982B8489135E6BEBAB261E2B1089A4 -PT=8A50E98A1165C1B6137231E519EC137B -CT=24ACAA0F045F5A6765D3B468550585B5 - -I=388 -KEY=816757A434D81AA348E0B2F4FC44F4387834818B8D4C040C8E7892767E150C11 -PT=24ACAA0F045F5A6765D3B468550585B5 -CT=9993F9CBDAD9CA98C74CCBDB3E079F50 - -I=389 -KEY=647A9F1E43B08FD15EFC17342EB8970AE1A778405795CE94493459AD40129341 -PT=9993F9CBDAD9CA98C74CCBDB3E079F50 -CT=F676785AEF58297C28035E8E065829FF - -I=390 -KEY=4BB8B5020862EA9228B663DEDB39336717D1001AB8CDE7E861370723464ABABE -PT=F676785AEF58297C28035E8E065829FF -CT=ED16C74BD4252F7B72AA37D11E198508 - -I=391 -KEY=5392AAED87CE40891A69F4690A8743FBFAC7C7516CE8C893139D30F258533FB6 -PT=ED16C74BD4252F7B72AA37D11E198508 -CT=3BE7B6A9E197598146E98B7A501A2226 - -I=392 -KEY=9D8BABE9C12E6BA3A18EB23A92205456C12071F88D7F91125574BB8808491D90 -PT=3BE7B6A9E197598146E98B7A501A2226 -CT=CC1163A3D9AF3307ED740591AB66BD81 - -I=393 -KEY=231B451E506AC98FF993A3C7AD9C37F70D31125B54D0A215B800BE19A32FA011 -PT=CC1163A3D9AF3307ED740591AB66BD81 -CT=43FB8B2B44C740956111DA816616771D - -I=394 -KEY=1699C517EE1713D02C6EA0957E4A00CE4ECA99701017E280D9116498C539D70C -PT=43FB8B2B44C740956111DA816616771D -CT=A511AEA01DB8E7E16E7C53931625BEC3 - -I=395 -KEY=2624CE7970CC5DAFAC73C881FDD5F6EBEBDB37D00DAF0561B76D370BD31C69CF -PT=A511AEA01DB8E7E16E7C53931625BEC3 -CT=82EF6D2A1FF1DBCDF39DC04BE523229F - -I=396 -KEY=60C9931E19ED0D095F8DF75AEA56689769345AFA125EDEAC44F0F740363F4B50 -PT=82EF6D2A1FF1DBCDF39DC04BE523229F -CT=A595C8AAAAAD80DD4F40693FF2D89A19 - -I=397 -KEY=D461E3605B0AD0E87F5A078ECFE25934CCA19250B8F35E710BB09E7FC4E7D149 -PT=A595C8AAAAAD80DD4F40693FF2D89A19 -CT=57B18DFEAD129795C3BB8D6C06764729 - -I=398 -KEY=0BE3FC6C21764F1C15782D52D92919A09B101FAE15E1C9E4C80B1313C2919660 -PT=57B18DFEAD129795C3BB8D6C06764729 -CT=6F8606BBA6CC03A5D0A64FE21E277B60 - -I=399 -KEY=982D617A0F737342E99123A5A573D266F4961915B32DCA4118AD5CF1DCB6ED00 -PT=6F8606BBA6CC03A5D0A64FE21E277B60 -CT=1F6763DF807A7E70960D4CD3118E601A - + +========================= + +FILENAME: "ecb_e_m.txt" + +Electronic Codebook (ECB) Mode - ENCRYPTION +Monte Carlo Test + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========================= + +KEYSIZE=128 + +I=0 +KEY=00000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=C34C052CC0DA8D73451AFE5F03BE297F + +I=1 +KEY=C34C052CC0DA8D73451AFE5F03BE297F +PT=C34C052CC0DA8D73451AFE5F03BE297F +CT=0AC15A9AFBB24D54AD99E987208272E2 + +I=2 +KEY=C98D5FB63B68C027E88317D8233C5B9D +PT=0AC15A9AFBB24D54AD99E987208272E2 +CT=A3D43BFFA65D0E80092F67A314857870 + +I=3 +KEY=6A5964499D35CEA7E1AC707B37B923ED +PT=A3D43BFFA65D0E80092F67A314857870 +CT=355F697E8B868B65B25A04E18D782AFA + +I=4 +KEY=5F060D3716B345C253F6749ABAC10917 +PT=355F697E8B868B65B25A04E18D782AFA +CT=ACC863637868E3E068D2FD6E3508454A + +I=5 +KEY=F3CE6E546EDBA6223B2489F48FC94C5D +PT=ACC863637868E3E068D2FD6E3508454A +CT=665F9F12A824F3D52A1C71D6210D5470 + +I=6 +KEY=9591F146C6FF55F71138F822AEC4182D +PT=665F9F12A824F3D52A1C71D6210D5470 +CT=9B27361DBC8E5618E8E98036F5AD40B0 + +I=7 +KEY=0EB6C75B7A7103EFF9D178145B69589D +PT=9B27361DBC8E5618E8E98036F5AD40B0 +CT=21D9BD7EBA0163A293F2D56C316CBD36 + +I=8 +KEY=2F6F7A25C070604D6A23AD786A05E5AB +PT=21D9BD7EBA0163A293F2D56C316CBD36 +CT=3E8037A9988E28FF81F2A7154ACD91BE + +I=9 +KEY=11EF4D8C58FE48B2EBD10A6D20C87415 +PT=3E8037A9988E28FF81F2A7154ACD91BE +CT=014EE14F1AA8C0D4A47A72F197F4DCB0 + +I=10 +KEY=10A1ACC3425688664FAB789CB73CA8A5 +PT=014EE14F1AA8C0D4A47A72F197F4DCB0 +CT=0B542083DBC03A96AA00C1A5AE58C9F1 + +I=11 +KEY=1BF58C409996B2F0E5ABB93919646154 +PT=0B542083DBC03A96AA00C1A5AE58C9F1 +CT=7340B59E1E3BB9211CE167F2DEBDB090 + +I=12 +KEY=68B539DE87AD0BD1F94ADECBC7D9D1C4 +PT=7340B59E1E3BB9211CE167F2DEBDB090 +CT=67E05F75135BA834CBCDCFF068541BBE + +I=13 +KEY=0F5566AB94F6A3E53287113BAF8DCA7A +PT=67E05F75135BA834CBCDCFF068541BBE +CT=8BD5553105C3507B0A07FDB351B25B4F + +I=14 +KEY=8480339A9135F39E3880EC88FE3F9135 +PT=8BD5553105C3507B0A07FDB351B25B4F +CT=649F061F95C0A79BD3066EFFE5B27CAB + +I=15 +KEY=E01F358504F55405EB8682771B8DED9E +PT=649F061F95C0A79BD3066EFFE5B27CAB +CT=697F4EB0603340E90FE91C27B6D9CEAA + +I=16 +KEY=89607B3564C614ECE46F9E50AD542334 +PT=697F4EB0603340E90FE91C27B6D9CEAA +CT=A8CBBA624FA28A7F8637324E1E20CB9C + +I=17 +KEY=21ABC1572B649E936258AC1EB374E8A8 +PT=A8CBBA624FA28A7F8637324E1E20CB9C +CT=73B852132DE715872A40EB25B1133C00 + +I=18 +KEY=5213934406838B144818473B0267D4A8 +PT=73B852132DE715872A40EB25B1133C00 +CT=1328A1C2F386BB3E4D4BE0942B8249A2 + +I=19 +KEY=413B3286F505302A0553A7AF29E59D0A +PT=1328A1C2F386BB3E4D4BE0942B8249A2 +CT=06F72DEA0067F543AA8C342CC9191745 + +I=20 +KEY=47CC1F6CF562C569AFDF9383E0FC8A4F +PT=06F72DEA0067F543AA8C342CC9191745 +CT=110B6011B60C94382C2321BFCAA62A1C + +I=21 +KEY=56C77F7D436E515183FCB23C2A5AA053 +PT=110B6011B60C94382C2321BFCAA62A1C +CT=80C90EF6794361DFA400EFE922F45A59 + +I=22 +KEY=D60E718B3A2D308E27FC5DD508AEFA0A +PT=80C90EF6794361DFA400EFE922F45A59 +CT=F8DF0AC62EE229245DB1F300F2E5B143 + +I=23 +KEY=2ED17B4D14CF19AA7A4DAED5FA4B4B49 +PT=F8DF0AC62EE229245DB1F300F2E5B143 +CT=45390146539E773B502E84A0C29AD5B0 + +I=24 +KEY=6BE87A0B47516E912A632A7538D19EF9 +PT=45390146539E773B502E84A0C29AD5B0 +CT=B07721757865838BDFC2329998B5174F + +I=25 +KEY=DB9F5B7E3F34ED1AF5A118ECA06489B6 +PT=B07721757865838BDFC2329998B5174F +CT=B83F3B7A9FFBA35DF1D6661A0F8AD0F4 + +I=26 +KEY=63A06004A0CF4E4704777EF6AFEE5942 +PT=B83F3B7A9FFBA35DF1D6661A0F8AD0F4 +CT=7098C99B1B245DE623B78F1B07D08EBE + +I=27 +KEY=1338A99FBBEB13A127C0F1EDA83ED7FC +PT=7098C99B1B245DE623B78F1B07D08EBE +CT=58A095EF9268B923920238486D0B13E1 + +I=28 +KEY=4B983C702983AA82B5C2C9A5C535C41D +PT=58A095EF9268B923920238486D0B13E1 +CT=97DD8052CE0D87715075A42942C120ED + +I=29 +KEY=DC45BC22E78E2DF3E5B76D8C87F4E4F0 +PT=97DD8052CE0D87715075A42942C120ED +CT=F480B5A67DAFCB9524DC21453AF66FAF + +I=30 +KEY=28C509849A21E666C16B4CC9BD028B5F +PT=F480B5A67DAFCB9524DC21453AF66FAF +CT=71CE64CE8C98367F2F12E6851AC70FF3 + +I=31 +KEY=590B6D4A16B9D019EE79AA4CA7C584AC +PT=71CE64CE8C98367F2F12E6851AC70FF3 +CT=81C3AA693CC1C647399701DA17D5FDD5 + +I=32 +KEY=D8C8C7232A78165ED7EEAB96B0107979 +PT=81C3AA693CC1C647399701DA17D5FDD5 +CT=5BB93103F6DDF0415592EE2217704D41 + +I=33 +KEY=8371F620DCA5E61F827C45B4A7603438 +PT=5BB93103F6DDF0415592EE2217704D41 +CT=87B8B17FF9079829AB5C47E055FFCEE3 + +I=34 +KEY=04C9475F25A27E3629200254F29FFADB +PT=87B8B17FF9079829AB5C47E055FFCEE3 +CT=615FE7D34154F42D6CE9D647904295E0 + +I=35 +KEY=6596A08C64F68A1B45C9D41362DD6F3B +PT=615FE7D34154F42D6CE9D647904295E0 +CT=A60C213CDF9B54DF9041948F98585CE2 + +I=36 +KEY=C39A81B0BB6DDEC4D588409CFA8533D9 +PT=A60C213CDF9B54DF9041948F98585CE2 +CT=FB126C61071EB9167B6FF28E5244E624 + +I=37 +KEY=3888EDD1BC7367D2AEE7B212A8C1D5FD +PT=FB126C61071EB9167B6FF28E5244E624 +CT=8A79CE45F030B91B53D1591D10FF1B02 + +I=38 +KEY=B2F123944C43DEC9FD36EB0FB83ECEFF +PT=8A79CE45F030B91B53D1591D10FF1B02 +CT=BE20190BAE15162F43E93F67A580192B + +I=39 +KEY=0CD13A9FE256C8E6BEDFD4681DBED7D4 +PT=BE20190BAE15162F43E93F67A580192B +CT=0107D3E3511F91545D02B498A9E3C318 + +I=40 +KEY=0DD6E97CB34959B2E3DD60F0B45D14CC +PT=0107D3E3511F91545D02B498A9E3C318 +CT=2A832A1205D6B5FCF1B20126EE59DD9D + +I=41 +KEY=2755C36EB69FEC4E126F61D65A04C951 +PT=2A832A1205D6B5FCF1B20126EE59DD9D +CT=F362782F550DCBFC49CEF15C3A0ABA7A + +I=42 +KEY=D437BB41E39227B25BA1908A600E732B +PT=F362782F550DCBFC49CEF15C3A0ABA7A +CT=51A8A0C6434A3BE8C939B6DDD56EAA53 + +I=43 +KEY=859F1B87A0D81C5A92982657B560D978 +PT=51A8A0C6434A3BE8C939B6DDD56EAA53 +CT=89D3F1086F3D96C18A76C61F25A52221 + +I=44 +KEY=0C4CEA8FCFE58A9B18EEE04890C5FB59 +PT=89D3F1086F3D96C18A76C61F25A52221 +CT=A5F7E0A5FA70DDB718EF970F50EB7B86 + +I=45 +KEY=A9BB0A2A3595572C00017747C02E80DF +PT=A5F7E0A5FA70DDB718EF970F50EB7B86 +CT=7BB64305538E71AFBF993B5BD23D5523 + +I=46 +KEY=D20D492F661B2683BF984C1C1213D5FC +PT=7BB64305538E71AFBF993B5BD23D5523 +CT=E6BF8F5338568603EC668C6D15331FA5 + +I=47 +KEY=34B2C67C5E4DA08053FEC0710720CA59 +PT=E6BF8F5338568603EC668C6D15331FA5 +CT=27644649FCDF52085CDB20E3DEE1E2F6 + +I=48 +KEY=13D68035A292F2880F25E092D9C128AF +PT=27644649FCDF52085CDB20E3DEE1E2F6 +CT=7629AACAED7F49938373C83410AD1744 + +I=49 +KEY=65FF2AFF4FEDBB1B8C5628A6C96C3FEB +PT=7629AACAED7F49938373C83410AD1744 +CT=D440FC6E9A65819934FAF8641C05A17C + +I=50 +KEY=B1BFD691D5883A82B8ACD0C2D5699E97 +PT=D440FC6E9A65819934FAF8641C05A17C +CT=FBEE29FEFD725E1852B58502D3076C46 + +I=51 +KEY=4A51FF6F28FA649AEA1955C0066EF2D1 +PT=FBEE29FEFD725E1852B58502D3076C46 +CT=E345A47A6C89BE4350CDD8C9D319529D + +I=52 +KEY=A9145B154473DAD9BAD48D09D577A04C +PT=E345A47A6C89BE4350CDD8C9D319529D +CT=1C6A7CBAF21E483B6025DB6DA573C5C6 + +I=53 +KEY=B57E27AFB66D92E2DAF156647004658A +PT=1C6A7CBAF21E483B6025DB6DA573C5C6 +CT=2B05F4D8EB50D851A013798753B65A1F + +I=54 +KEY=9E7BD3775D3D4AB37AE22FE323B23F95 +PT=2B05F4D8EB50D851A013798753B65A1F +CT=CEFE04978228A0DBCCE9EE42B21DD34A + +I=55 +KEY=5085D7E0DF15EA68B60BC1A191AFECDF +PT=CEFE04978228A0DBCCE9EE42B21DD34A +CT=7B41DF8CD85B61EA800536648DBDA2AE + +I=56 +KEY=2BC4086C074E8B82360EF7C51C124E71 +PT=7B41DF8CD85B61EA800536648DBDA2AE +CT=08688872151D18CD19E2FC14B9E4C962 + +I=57 +KEY=23AC801E1253934F2FEC0BD1A5F68713 +PT=08688872151D18CD19E2FC14B9E4C962 +CT=F08C88BE5E748C4D82D2E7D7813A33AF + +I=58 +KEY=D32008A04C271F02AD3EEC0624CCB4BC +PT=F08C88BE5E748C4D82D2E7D7813A33AF +CT=319B7D38AB1AC3AEA0A0490C341F4F20 + +I=59 +KEY=E2BB7598E73DDCAC0D9EA50A10D3FB9C +PT=319B7D38AB1AC3AEA0A0490C341F4F20 +CT=EE70748772E8D88B2717D78F31F0EA86 + +I=60 +KEY=0CCB011F95D504272A8972852123111A +PT=EE70748772E8D88B2717D78F31F0EA86 +CT=A3A5DC791EA1BBB9D7A2B292572DFD5C + +I=61 +KEY=AF6EDD668B74BF9EFD2BC017760EEC46 +PT=A3A5DC791EA1BBB9D7A2B292572DFD5C +CT=255692B06B3A18498BCAF99F7B3EE374 + +I=62 +KEY=8A384FD6E04EA7D776E139880D300F32 +PT=255692B06B3A18498BCAF99F7B3EE374 +CT=500E492232891293875F50279B5DC5C3 + +I=63 +KEY=DA3606F4D2C7B544F1BE69AF966DCAF1 +PT=500E492232891293875F50279B5DC5C3 +CT=57C3FCCE9B5BA3BC19BBF7BB9B37A9AC + +I=64 +KEY=8DF5FA3A499C16F8E8059E140D5A635D +PT=57C3FCCE9B5BA3BC19BBF7BB9B37A9AC +CT=BF06FDFDB687C8B24FB0E2A6D6D37EA5 + +I=65 +KEY=32F307C7FF1BDE4AA7B57CB2DB891DF8 +PT=BF06FDFDB687C8B24FB0E2A6D6D37EA5 +CT=6D459ED545CF3C6FF2746411CD9B3E31 + +I=66 +KEY=5FB69912BAD4E22555C118A3161223C9 +PT=6D459ED545CF3C6FF2746411CD9B3E31 +CT=C74E0704A9D9EC2D90F75B34FC95CD32 + +I=67 +KEY=98F89E16130D0E08C5364397EA87EEFB +PT=C74E0704A9D9EC2D90F75B34FC95CD32 +CT=0453D4FBC2D7F8E0AD0AD90F98D1EC5C + +I=68 +KEY=9CAB4AEDD1DAF6E8683C9A98725602A7 +PT=0453D4FBC2D7F8E0AD0AD90F98D1EC5C +CT=5BBA052D6C39DC1E9553B7646CB7344B + +I=69 +KEY=C7114FC0BDE32AF6FD6F2DFC1EE136EC +PT=5BBA052D6C39DC1E9553B7646CB7344B +CT=9870FFE04984426501ECB55FFBB363CB + +I=70 +KEY=5F61B020F4676893FC8398A3E5525527 +PT=9870FFE04984426501ECB55FFBB363CB +CT=1363D65F7C943FC4512E41A717D3704D + +I=71 +KEY=4C02667F88F35757ADADD904F281256A +PT=1363D65F7C943FC4512E41A717D3704D +CT=664762AED6BC5FB74A646A928837FC83 + +I=72 +KEY=2A4504D15E4F08E0E7C9B3967AB6D9E9 +PT=664762AED6BC5FB74A646A928837FC83 +CT=655CB6BAB4B0532273689E4DC9234C42 + +I=73 +KEY=4F19B26BEAFF5BC294A12DDBB39595AB +PT=655CB6BAB4B0532273689E4DC9234C42 +CT=E8AAE0E0B9D2BE6259AEBC478DC90FD9 + +I=74 +KEY=A7B3528B532DE5A0CD0F919C3E5C9A72 +PT=E8AAE0E0B9D2BE6259AEBC478DC90FD9 +CT=FECACAF43DD920FA3078256C6A587741 + +I=75 +KEY=5979987F6EF4C55AFD77B4F05404ED33 +PT=FECACAF43DD920FA3078256C6A587741 +CT=11F3F56529B8B172D87A4C86BB90F3B6 + +I=76 +KEY=488A6D1A474C7428250DF876EF941E85 +PT=11F3F56529B8B172D87A4C86BB90F3B6 +CT=B44340D44F1ABA37CB09FE57FC771A9E + +I=77 +KEY=FCC92DCE0856CE1FEE04062113E3041B +PT=B44340D44F1ABA37CB09FE57FC771A9E +CT=C49F12B88C34A0D696FE283B01D5710C + +I=78 +KEY=38563F7684626EC978FA2E1A12367517 +PT=C49F12B88C34A0D696FE283B01D5710C +CT=58D6D2D36C14DDBDA7604AB740918D76 + +I=79 +KEY=6080EDA5E876B374DF9A64AD52A7F861 +PT=58D6D2D36C14DDBDA7604AB740918D76 +CT=21F735F77B0EAD7551CE06900A568EB3 + +I=80 +KEY=4177D85293781E018E54623D58F176D2 +PT=21F735F77B0EAD7551CE06900A568EB3 +CT=FE2E9BDB393BF6D1BBF108B8AC3B6818 + +I=81 +KEY=BF594389AA43E8D035A56A85F4CA1ECA +PT=FE2E9BDB393BF6D1BBF108B8AC3B6818 +CT=FECFCD3722C6C8E6608258341220E739 + +I=82 +KEY=41968EBE88852036552732B1E6EAF9F3 +PT=FECFCD3722C6C8E6608258341220E739 +CT=10A8BB234C9D9A22DEC7887E931F85BD + +I=83 +KEY=513E359DC418BA148BE0BACF75F57C4E +PT=10A8BB234C9D9A22DEC7887E931F85BD +CT=767EB7DBA70BC7094DF7A5BDD233EB5C + +I=84 +KEY=2740824663137D1DC6171F72A7C69712 +PT=767EB7DBA70BC7094DF7A5BDD233EB5C +CT=FCD7184F3F4DB7CA182225B9A358209D + +I=85 +KEY=DB979A095C5ECAD7DE353ACB049EB78F +PT=FCD7184F3F4DB7CA182225B9A358209D +CT=A5CD025AEBF0380EAC66EF034806179F + +I=86 +KEY=7E5A9853B7AEF2D97253D5C84C98A010 +PT=A5CD025AEBF0380EAC66EF034806179F +CT=FE46F4A72C7031FE8D900152CD20B95F + +I=87 +KEY=801C6CF49BDEC327FFC3D49A81B8194F +PT=FE46F4A72C7031FE8D900152CD20B95F +CT=CF1ACB502A4B608C61364891E34F93A0 + +I=88 +KEY=4F06A7A4B195A3AB9EF59C0B62F78AEF +PT=CF1ACB502A4B608C61364891E34F93A0 +CT=95AB1367FF6C03DE87FFA282A3E52200 + +I=89 +KEY=DAADB4C34EF9A075190A3E89C112A8EF +PT=95AB1367FF6C03DE87FFA282A3E52200 +CT=762B6393252B347F55AF3E4CA16F2FC9 + +I=90 +KEY=AC86D7506BD2940A4CA500C5607D8726 +PT=762B6393252B347F55AF3E4CA16F2FC9 +CT=A63491A22E23AD921ADAB9CC0DA20521 + +I=91 +KEY=0AB246F245F13998567FB9096DDF8207 +PT=A63491A22E23AD921ADAB9CC0DA20521 +CT=C0852A5E7CEEAFB5FA87C440B598BFD6 + +I=92 +KEY=CA376CAC391F962DACF87D49D8473DD1 +PT=C0852A5E7CEEAFB5FA87C440B598BFD6 +CT=485747C528B08033169E991E98E4CBB5 + +I=93 +KEY=82602B6911AF161EBA66E45740A3F664 +PT=485747C528B08033169E991E98E4CBB5 +CT=415B95B222161A8C9ED20CF99C26848C + +I=94 +KEY=C33BBEDB33B90C9224B4E8AEDC8572E8 +PT=415B95B222161A8C9ED20CF99C26848C +CT=7E673E6348C38CD40C9B11F4C9F3E3A0 + +I=95 +KEY=BD5C80B87B7A8046282FF95A15769148 +PT=7E673E6348C38CD40C9B11F4C9F3E3A0 +CT=B88508E55279AFF0D848C38DBEC76B2C + +I=96 +KEY=05D9885D29032FB6F0673AD7ABB1FA64 +PT=B88508E55279AFF0D848C38DBEC76B2C +CT=3902B5DC34E815BA50A53DB9C8FFAA92 + +I=97 +KEY=3CDB3D811DEB3A0CA0C2076E634E50F6 +PT=3902B5DC34E815BA50A53DB9C8FFAA92 +CT=FEF57F51360547EA6B88085B8656A1D0 + +I=98 +KEY=C22E42D02BEE7DE6CB4A0F35E518F126 +PT=FEF57F51360547EA6B88085B8656A1D0 +CT=94D052E1F097106A5B714ADD0EF79E64 + +I=99 +KEY=56FE1031DB796D8C903B45E8EBEF6F42 +PT=94D052E1F097106A5B714ADD0EF79E64 +CT=7FD3EF411360E5270F63A8BACCCC74C0 + +I=100 +KEY=292DFF70C81988AB9F58ED5227231B82 +PT=7FD3EF411360E5270F63A8BACCCC74C0 +CT=F572692DE6EFBC2309B947D1A75BE009 + +I=101 +KEY=DC5F965D2EF6348896E1AA838078FB8B +PT=F572692DE6EFBC2309B947D1A75BE009 +CT=BFD3233C513448C283C05311B8085B5C + +I=102 +KEY=638CB5617FC27C4A1521F9923870A0D7 +PT=BFD3233C513448C283C05311B8085B5C +CT=078739F570071AA1A96A1F00F31E05FD + +I=103 +KEY=640B8C940FC566EBBC4BE692CB6EA52A +PT=078739F570071AA1A96A1F00F31E05FD +CT=947CA236277CDD0AC13C194B99E8CF16 + +I=104 +KEY=F0772EA228B9BBE17D77FFD952866A3C +PT=947CA236277CDD0AC13C194B99E8CF16 +CT=34DE5F2D355BC4ACE54AD0CB8C008CB8 + +I=105 +KEY=C4A9718F1DE27F4D983D2F12DE86E684 +PT=34DE5F2D355BC4ACE54AD0CB8C008CB8 +CT=E5729CBD84C89B914F35412F902A2CA3 + +I=106 +KEY=21DBED32992AE4DCD7086E3D4EACCA27 +PT=E5729CBD84C89B914F35412F902A2CA3 +CT=EB326D6ABAFC93EADBEC9B05CE4AAF0C + +I=107 +KEY=CAE9805823D677360CE4F53880E6652B +PT=EB326D6ABAFC93EADBEC9B05CE4AAF0C +CT=9F088089F8D8E8E28A9A2A1FF50F2ED3 + +I=108 +KEY=55E100D1DB0E9FD4867EDF2775E94BF8 +PT=9F088089F8D8E8E28A9A2A1FF50F2ED3 +CT=C8D2BF3D6ADB57F478656D4808142160 + +I=109 +KEY=9D33BFECB1D5C820FE1BB26F7DFD6A98 +PT=C8D2BF3D6ADB57F478656D4808142160 +CT=062016811215B9DBDD3C794A15FBEBBA + +I=110 +KEY=9B13A96DA3C071FB2327CB2568068122 +PT=062016811215B9DBDD3C794A15FBEBBA +CT=71F9F04E9AED1C302E5ED2AD36B5C7F5 + +I=111 +KEY=EAEA5923392D6DCB0D7919885EB346D7 +PT=71F9F04E9AED1C302E5ED2AD36B5C7F5 +CT=253982568F6C3FDFDE173E46B614989C + +I=112 +KEY=CFD3DB75B6415214D36E27CEE8A7DE4B +PT=253982568F6C3FDFDE173E46B614989C +CT=6D51D51276A6FA9C933E4D4496D0455E + +I=113 +KEY=A2820E67C0E7A88840506A8A7E779B15 +PT=6D51D51276A6FA9C933E4D4496D0455E +CT=B9A6924F773CE826BBBC6DDBFA4E146A + +I=114 +KEY=1B249C28B7DB40AEFBEC075184398F7F +PT=B9A6924F773CE826BBBC6DDBFA4E146A +CT=474943C523162BC81186779A07144BC6 + +I=115 +KEY=5C6DDFED94CD6B66EA6A70CB832DC4B9 +PT=474943C523162BC81186779A07144BC6 +CT=20128A092B99B4BC212B1107C3BA1DF9 + +I=116 +KEY=7C7F55E4BF54DFDACB4161CC4097D940 +PT=20128A092B99B4BC212B1107C3BA1DF9 +CT=90330B8FB5A50E958250A953EF5145C7 + +I=117 +KEY=EC4C5E6B0AF1D14F4911C89FAFC69C87 +PT=90330B8FB5A50E958250A953EF5145C7 +CT=C1B788D0EB2C8C7B9E020CC2BEACD595 + +I=118 +KEY=2DFBD6BBE1DD5D34D713C45D116A4912 +PT=C1B788D0EB2C8C7B9E020CC2BEACD595 +CT=EF87960DABBE82F6CFA8045CE4A9EED0 + +I=119 +KEY=C27C40B64A63DFC218BBC001F5C3A7C2 +PT=EF87960DABBE82F6CFA8045CE4A9EED0 +CT=405C8408D5027DF90CBE3159701D161A + +I=120 +KEY=8220C4BE9F61A23B1405F15885DEB1D8 +PT=405C8408D5027DF90CBE3159701D161A +CT=FCAB7F88E85D6573A98D23D684A5A5F3 + +I=121 +KEY=7E8BBB36773CC748BD88D28E017B142B +PT=FCAB7F88E85D6573A98D23D684A5A5F3 +CT=191E6F1EECBF5149F4D49446E97D8820 + +I=122 +KEY=6795D4289B839601495C46C8E8069C0B +PT=191E6F1EECBF5149F4D49446E97D8820 +CT=C77128F53D48594194EFBA67E46C6B23 + +I=123 +KEY=A0E4FCDDA6CBCF40DDB3FCAF0C6AF728 +PT=C77128F53D48594194EFBA67E46C6B23 +CT=DFB898170571450CC5E2244AE4D3AF43 + +I=124 +KEY=7F5C64CAA3BA8A4C1851D8E5E8B9586B +PT=DFB898170571450CC5E2244AE4D3AF43 +CT=3BD1633B5053609A3B42CC098F9F5D87 + +I=125 +KEY=448D07F1F3E9EAD6231314EC672605EC +PT=3BD1633B5053609A3B42CC098F9F5D87 +CT=AC15B23F205AEB10470F853BA18361E0 + +I=126 +KEY=E898B5CED3B301C6641C91D7C6A5640C +PT=AC15B23F205AEB10470F853BA18361E0 +CT=2DA73BA6E01B1ADFBEEAFA2E37942078 + +I=127 +KEY=C53F8E6833A81B19DAF66BF9F1314474 +PT=2DA73BA6E01B1ADFBEEAFA2E37942078 +CT=C5B3D7089173958B32340B88D35B738B + +I=128 +KEY=008C5960A2DB8E92E8C26071226A37FF +PT=C5B3D7089173958B32340B88D35B738B +CT=8318BAA96569F3ADCD30C08D54494392 + +I=129 +KEY=8394E3C9C7B27D3F25F2A0FC7623746D +PT=8318BAA96569F3ADCD30C08D54494392 +CT=4F6F2A06A1A344B261084563BCCC5A5A + +I=130 +KEY=CCFBC9CF6611398D44FAE59FCAEF2E37 +PT=4F6F2A06A1A344B261084563BCCC5A5A +CT=07EC18166362BF049A48D146A63FF378 + +I=131 +KEY=CB17D1D905738689DEB234D96CD0DD4F +PT=07EC18166362BF049A48D146A63FF378 +CT=81CB17ABAC28A3ED135442454C212646 + +I=132 +KEY=4ADCC672A95B2564CDE6769C20F1FB09 +PT=81CB17ABAC28A3ED135442454C212646 +CT=C1CBDE45E27B9B1198CE93A51E38D9C5 + +I=133 +KEY=8B1718374B20BE755528E5393EC922CC +PT=C1CBDE45E27B9B1198CE93A51E38D9C5 +CT=8E4EB89DDFEE065784556FA0B426954A + +I=134 +KEY=0559A0AA94CEB822D17D8A998AEFB786 +PT=8E4EB89DDFEE065784556FA0B426954A +CT=6A966414CC6FE52F957E9DE7012EC4BD + +I=135 +KEY=6FCFC4BE58A15D0D4403177E8BC1733B +PT=6A966414CC6FE52F957E9DE7012EC4BD +CT=7C88474D963BFDFE61F052F51D1796EF + +I=136 +KEY=134783F3CE9AA0F325F3458B96D6E5D4 +PT=7C88474D963BFDFE61F052F51D1796EF +CT=6269F5DA04B09D442DDCB46001573AE9 + +I=137 +KEY=712E7629CA2A3DB7082FF1EB9781DF3D +PT=6269F5DA04B09D442DDCB46001573AE9 +CT=FBD2965ACE0B360A12EF39873A8F3805 + +I=138 +KEY=8AFCE07304210BBD1AC0C86CAD0EE738 +PT=FBD2965ACE0B360A12EF39873A8F3805 +CT=5B46EF12C9BE55DCD5571D82E5BC6FF1 + +I=139 +KEY=D1BA0F61CD9F5E61CF97D5EE48B288C9 +PT=5B46EF12C9BE55DCD5571D82E5BC6FF1 +CT=403DEFDB60876F3161CF02F319F5EA9A + +I=140 +KEY=9187E0BAAD183150AE58D71D51476253 +PT=403DEFDB60876F3161CF02F319F5EA9A +CT=70FD321C583C1B54ED6AD3A79721E84A + +I=141 +KEY=E17AD2A6F5242A04433204BAC6668A19 +PT=70FD321C583C1B54ED6AD3A79721E84A +CT=32AE26E948D563782532AC711BFAB644 + +I=142 +KEY=D3D4F44FBDF1497C6600A8CBDD9C3C5D +PT=32AE26E948D563782532AC711BFAB644 +CT=ECF948F5EBB98E4C7286046E0F7AF127 + +I=143 +KEY=3F2DBCBA5648C7301486ACA5D2E6CD7A +PT=ECF948F5EBB98E4C7286046E0F7AF127 +CT=818F87EFA0B5E4098E737AD44DB537BA + +I=144 +KEY=BEA23B55F6FD23399AF5D6719F53FAC0 +PT=818F87EFA0B5E4098E737AD44DB537BA +CT=029F170737413F1BFBE02C292D506E44 + +I=145 +KEY=BC3D2C52C1BC1C226115FA58B2039484 +PT=029F170737413F1BFBE02C292D506E44 +CT=77A7C520912761121373E35FD3B5AF0F + +I=146 +KEY=CB9AE972509B7D307266190761B63B8B +PT=77A7C520912761121373E35FD3B5AF0F +CT=D407B965C368E1F77195ED446BEEBA73 + +I=147 +KEY=1F9D501793F39CC703F3F4430A5881F8 +PT=D407B965C368E1F77195ED446BEEBA73 +CT=D1F304E0B3614A4840F128AA364BA6A3 + +I=148 +KEY=CE6E54F72092D68F4302DCE93C13275B +PT=D1F304E0B3614A4840F128AA364BA6A3 +CT=69B748543EE72474D0CC301BDBD50A6C + +I=149 +KEY=A7D91CA31E75F2FB93CEECF2E7C62D37 +PT=69B748543EE72474D0CC301BDBD50A6C +CT=BA471D91DBC6D27EBA7B510E67830C3F + +I=150 +KEY=1D9E0132C5B3208529B5BDFC80452108 +PT=BA471D91DBC6D27EBA7B510E67830C3F +CT=7C0CF396D078E01A741613B1E1D7A9CB + +I=151 +KEY=6192F2A415CBC09F5DA3AE4D619288C3 +PT=7C0CF396D078E01A741613B1E1D7A9CB +CT=6F670A289398F49C75ACBBE9EAC2ABFC + +I=152 +KEY=0EF5F88C86533403280F15A48B50233F +PT=6F670A289398F49C75ACBBE9EAC2ABFC +CT=C392EF479528BF1B02296E6C894E4FDD + +I=153 +KEY=CD6717CB137B8B182A267BC8021E6CE2 +PT=C392EF479528BF1B02296E6C894E4FDD +CT=C4226C8C98D5F137A4C6A239E04B0FB3 + +I=154 +KEY=09457B478BAE7A2F8EE0D9F1E2556351 +PT=C4226C8C98D5F137A4C6A239E04B0FB3 +CT=2382714FC945AD4A1E03858B63973B9E + +I=155 +KEY=2AC70A0842EBD76590E35C7A81C258CF +PT=2382714FC945AD4A1E03858B63973B9E +CT=E41F350AC9320A8A23E27C0349978168 + +I=156 +KEY=CED83F028BD9DDEFB3012079C855D9A7 +PT=E41F350AC9320A8A23E27C0349978168 +CT=7E9137997CB7676F3D0141797C6F31A8 + +I=157 +KEY=B049089BF76EBA808E006100B43AE80F +PT=7E9137997CB7676F3D0141797C6F31A8 +CT=4BF7EBC15369A757981EE4A0B7F55706 + +I=158 +KEY=FBBEE35AA4071DD7161E85A003CFBF09 +PT=4BF7EBC15369A757981EE4A0B7F55706 +CT=EC677E86A8D2A5935D33D6471A58A781 + +I=159 +KEY=17D99DDC0CD5B8444B2D53E719971888 +PT=EC677E86A8D2A5935D33D6471A58A781 +CT=F31066D48884BC9B37F218FCF385344B + +I=160 +KEY=E4C9FB08845104DF7CDF4B1BEA122CC3 +PT=F31066D48884BC9B37F218FCF385344B +CT=51CFEA4E482A7B7BCF4D31DA5CED4370 + +I=161 +KEY=B5061146CC7B7FA4B3927AC1B6FF6FB3 +PT=51CFEA4E482A7B7BCF4D31DA5CED4370 +CT=89F3CD1590669A16F8460991BFD3CF5C + +I=162 +KEY=3CF5DC535C1DE5B24BD47350092CA0EF +PT=89F3CD1590669A16F8460991BFD3CF5C +CT=9930DA8E5DBC1F6C87B0B41BD386E2E0 + +I=163 +KEY=A5C506DD01A1FADECC64C74BDAAA420F +PT=9930DA8E5DBC1F6C87B0B41BD386E2E0 +CT=41A8CB583E5B9D2BA7CDA3763B6529C0 + +I=164 +KEY=E46DCD853FFA67F56BA9643DE1CF6BCF +PT=41A8CB583E5B9D2BA7CDA3763B6529C0 +CT=53479DCFB0C69624B42B9C272B0A1A85 + +I=165 +KEY=B72A504A8F3CF1D1DF82F81ACAC5714A +PT=53479DCFB0C69624B42B9C272B0A1A85 +CT=E72F27AE86E913EF55309120358BAD35 + +I=166 +KEY=500577E409D5E23E8AB2693AFF4EDC7F +PT=E72F27AE86E913EF55309120358BAD35 +CT=9B1EF901BACC70819DBC627C7CDC8CD9 + +I=167 +KEY=CB1B8EE5B31992BF170E0B46839250A6 +PT=9B1EF901BACC70819DBC627C7CDC8CD9 +CT=9546C7B789345E4C32EE84BCE8E78C7E + +I=168 +KEY=5E5D49523A2DCCF325E08FFA6B75DCD8 +PT=9546C7B789345E4C32EE84BCE8E78C7E +CT=33700B93E03CE8202BAC7E64E3255108 + +I=169 +KEY=6D2D42C1DA1124D30E4CF19E88508DD0 +PT=33700B93E03CE8202BAC7E64E3255108 +CT=44246615BCA5C0A8DCB7E63729398F0A + +I=170 +KEY=290924D466B4E47BD2FB17A9A16902DA +PT=44246615BCA5C0A8DCB7E63729398F0A +CT=3215FC55FEE5A30BFA11F8EBBC912652 + +I=171 +KEY=1B1CD8819851477028EAEF421DF82488 +PT=3215FC55FEE5A30BFA11F8EBBC912652 +CT=796C9136407BC4F484B253DAEB206912 + +I=172 +KEY=627049B7D82A8384AC58BC98F6D84D9A +PT=796C9136407BC4F484B253DAEB206912 +CT=B18977B404F0671C10AA979389408CCA + +I=173 +KEY=D3F93E03DCDAE498BCF22B0B7F98C150 +PT=B18977B404F0671C10AA979389408CCA +CT=B2592621EE947D4ED9AD4295E0675F93 + +I=174 +KEY=61A01822324E99D6655F699E9FFF9EC3 +PT=B2592621EE947D4ED9AD4295E0675F93 +CT=62D3B7E28765DA8F83EBE19C97293C0A + +I=175 +KEY=0373AFC0B52B4359E6B4880208D6A2C9 +PT=62D3B7E28765DA8F83EBE19C97293C0A +CT=F417D650D6B7631542CFF8F95FC81C9B + +I=176 +KEY=F7647990639C204CA47B70FB571EBE52 +PT=F417D650D6B7631542CFF8F95FC81C9B +CT=700A5DE153D6B438FFF7BA902DEC32FF + +I=177 +KEY=876E2471304A94745B8CCA6B7AF28CAD +PT=700A5DE153D6B438FFF7BA902DEC32FF +CT=67DC08A48F1EC7E32121B8693BB23621 + +I=178 +KEY=E0B22CD5BF5453977AAD72024140BA8C +PT=67DC08A48F1EC7E32121B8693BB23621 +CT=90038BB156A7F7992E260E9CBFAC0D82 + +I=179 +KEY=70B1A764E9F3A40E548B7C9EFEECB70E +PT=90038BB156A7F7992E260E9CBFAC0D82 +CT=C6BB1407C2D037BF238BEC772BA95352 + +I=180 +KEY=B60AB3632B2393B1770090E9D545E45C +PT=C6BB1407C2D037BF238BEC772BA95352 +CT=8C3D249574FF74F84053977219D69F5E + +I=181 +KEY=3A3797F65FDCE7493753079BCC937B02 +PT=8C3D249574FF74F84053977219D69F5E +CT=131F7FC5A1528AD5DCB167AFAA8BFD47 + +I=182 +KEY=2928E833FE8E6D9CEBE2603466188645 +PT=131F7FC5A1528AD5DCB167AFAA8BFD47 +CT=6E68AE6FDF2C10B42B85486D3EFBCEB9 + +I=183 +KEY=4740465C21A27D28C067285958E348FC +PT=6E68AE6FDF2C10B42B85486D3EFBCEB9 +CT=26808ABFA3967D742D64A26CADF8DD70 + +I=184 +KEY=61C0CCE38234005CED038A35F51B958C +PT=26808ABFA3967D742D64A26CADF8DD70 +CT=8BBCBA5E4C219D000A2F6B701CDA09C3 + +I=185 +KEY=EA7C76BDCE159D5CE72CE145E9C19C4F +PT=8BBCBA5E4C219D000A2F6B701CDA09C3 +CT=5D707BB328BEFF51C8C1D984C1608AA0 + +I=186 +KEY=B70C0D0EE6AB620D2FED38C128A116EF +PT=5D707BB328BEFF51C8C1D984C1608AA0 +CT=8D0A485482B914FC282C2DA9F7147D0C + +I=187 +KEY=3A06455A641276F107C11568DFB56BE3 +PT=8D0A485482B914FC282C2DA9F7147D0C +CT=C5678BC12445627CBAA94177F070F736 + +I=188 +KEY=FF61CE9B4057148DBD68541F2FC59CD5 +PT=C5678BC12445627CBAA94177F070F736 +CT=EB9B50846E92C20CD6EDBA7A3A260684 + +I=189 +KEY=14FA9E1F2EC5D6816B85EE6515E39A51 +PT=EB9B50846E92C20CD6EDBA7A3A260684 +CT=E2178B471A3F72A271013C4CBE41FA1C + +I=190 +KEY=F6ED155834FAA4231A84D229ABA2604D +PT=E2178B471A3F72A271013C4CBE41FA1C +CT=C10C8084A17D90339E5ED8C638B902A4 + +I=191 +KEY=37E195DC9587341084DA0AEF931B62E9 +PT=C10C8084A17D90339E5ED8C638B902A4 +CT=03C839CCF269548279F30A1F45C30556 + +I=192 +KEY=3429AC1067EE6092FD2900F0D6D867BF +PT=03C839CCF269548279F30A1F45C30556 +CT=1C5DC5C94B5C7E332D4122A0A4FACD96 + +I=193 +KEY=287469D92CB21EA1D06822507222AA29 +PT=1C5DC5C94B5C7E332D4122A0A4FACD96 +CT=E7292B7D15E9311F242FACFAFC0B0B81 + +I=194 +KEY=CF5D42A4395B2FBEF4478EAA8E29A1A8 +PT=E7292B7D15E9311F242FACFAFC0B0B81 +CT=EA6DF86EEE09613104DB81B97B949AEC + +I=195 +KEY=2530BACAD7524E8FF09C0F13F5BD3B44 +PT=EA6DF86EEE09613104DB81B97B949AEC +CT=8FBCCDEBA43FE3FFDE4C3C279BDD4A27 + +I=196 +KEY=AA8C7721736DAD702ED033346E607163 +PT=8FBCCDEBA43FE3FFDE4C3C279BDD4A27 +CT=985971BE962C63B0F50D1004963E9BED + +I=197 +KEY=32D5069FE541CEC0DBDD2330F85EEA8E +PT=985971BE962C63B0F50D1004963E9BED +CT=F2CC0FF4B6D2F88766F1B8BE370FE463 + +I=198 +KEY=C019096B53933647BD2C9B8ECF510EED +PT=F2CC0FF4B6D2F88766F1B8BE370FE463 +CT=FE33F823B7B97FC017B35B6E22415D3E + +I=199 +KEY=3E2AF148E42A4987AA9FC0E0ED1053D3 +PT=FE33F823B7B97FC017B35B6E22415D3E +CT=465D804A6053EC2580B59F0CD645C060 + +I=200 +KEY=787771028479A5A22A2A5FEC3B5593B3 +PT=465D804A6053EC2580B59F0CD645C060 +CT=DE05AD28693E3D471B8F39BAD1803C0E + +I=201 +KEY=A672DC2AED4798E531A56656EAD5AFBD +PT=DE05AD28693E3D471B8F39BAD1803C0E +CT=61EB397D55A2FC3D78974C8A10200AC6 + +I=202 +KEY=C799E557B8E564D849322ADCFAF5A57B +PT=61EB397D55A2FC3D78974C8A10200AC6 +CT=BD95D742D81AD795AA4E10FB41F54294 + +I=203 +KEY=7A0C321560FFB34DE37C3A27BB00E7EF +PT=BD95D742D81AD795AA4E10FB41F54294 +CT=F43A1E8C6E057E68414D23DA6932DE2C + +I=204 +KEY=8E362C990EFACD25A23119FDD23239C3 +PT=F43A1E8C6E057E68414D23DA6932DE2C +CT=8EBB208032245988E851148B34B92F0E + +I=205 +KEY=008D0C193CDE94AD4A600D76E68B16CD +PT=8EBB208032245988E851148B34B92F0E +CT=2F18B4B14A360E06C50C89A4E6FE6C17 + +I=206 +KEY=2F95B8A876E89AAB8F6C84D200757ADA +PT=2F18B4B14A360E06C50C89A4E6FE6C17 +CT=681E131FA7EA5EBE10B59D3F16009582 + +I=207 +KEY=478BABB7D102C4159FD919ED1675EF58 +PT=681E131FA7EA5EBE10B59D3F16009582 +CT=376FA31CC9D18E756E96715D61403C5D + +I=208 +KEY=70E408AB18D34A60F14F68B07735D305 +PT=376FA31CC9D18E756E96715D61403C5D +CT=519E87E4A1AC61C376842F028D1BD75F + +I=209 +KEY=217A8F4FB97F2BA387CB47B2FA2E045A +PT=519E87E4A1AC61C376842F028D1BD75F +CT=BFAED9E9964967342808C6C332E02204 + +I=210 +KEY=9ED456A62F364C97AFC38171C8CE265E +PT=BFAED9E9964967342808C6C332E02204 +CT=5A9F55C61A03D6A3196FFD6879CBCA02 + +I=211 +KEY=C44B036035359A34B6AC7C19B105EC5C +PT=5A9F55C61A03D6A3196FFD6879CBCA02 +CT=0FD872478223CDE765A62036EDD6F42F + +I=212 +KEY=CB937127B71657D3D30A5C2F5CD31873 +PT=0FD872478223CDE765A62036EDD6F42F +CT=965ED2AF7D26CDA8A8B7E7B2F1ADA768 + +I=213 +KEY=5DCDA388CA309A7B7BBDBB9DAD7EBF1B +PT=965ED2AF7D26CDA8A8B7E7B2F1ADA768 +CT=05599B8D42D92457605A69200C6DC0AA + +I=214 +KEY=5894380588E9BE2C1BE7D2BDA1137FB1 +PT=05599B8D42D92457605A69200C6DC0AA +CT=3436A49EE590788F625A6FB44BF72FA3 + +I=215 +KEY=6CA29C9B6D79C6A379BDBD09EAE45012 +PT=3436A49EE590788F625A6FB44BF72FA3 +CT=DB181195EFF35E307167BADA138A837A + +I=216 +KEY=B7BA8D0E828A989308DA07D3F96ED368 +PT=DB181195EFF35E307167BADA138A837A +CT=45E06B534233447E3CB696C1DD179477 + +I=217 +KEY=F25AE65DC0B9DCED346C91122479471F +PT=45E06B534233447E3CB696C1DD179477 +CT=D2EDC4E2B4EDD671D984E8AA5BABAAD7 + +I=218 +KEY=20B722BF74540A9CEDE879B87FD2EDC8 +PT=D2EDC4E2B4EDD671D984E8AA5BABAAD7 +CT=DB92F4E9F2DD6A61E20A79CFC82CD061 + +I=219 +KEY=FB25D656868960FD0FE20077B7FE3DA9 +PT=DB92F4E9F2DD6A61E20A79CFC82CD061 +CT=79383629DF124FD94A1C36BECB711747 + +I=220 +KEY=821DE07F599B2F2445FE36C97C8F2AEE +PT=79383629DF124FD94A1C36BECB711747 +CT=3F3F592FB3DB51CF08B70E6F2174AB43 + +I=221 +KEY=BD22B950EA407EEB4D4938A65DFB81AD +PT=3F3F592FB3DB51CF08B70E6F2174AB43 +CT=D34FDA2917E9697118502CB7A6CAE07C + +I=222 +KEY=6E6D6379FDA9179A55191411FB3161D1 +PT=D34FDA2917E9697118502CB7A6CAE07C +CT=24D2C38E5C52A404DBE0D8BB6DA44AEE + +I=223 +KEY=4ABFA0F7A1FBB39E8EF9CCAA96952B3F +PT=24D2C38E5C52A404DBE0D8BB6DA44AEE +CT=2ED6A7503B3547C04E0B7B709218CD4A + +I=224 +KEY=646907A79ACEF45EC0F2B7DA048DE675 +PT=2ED6A7503B3547C04E0B7B709218CD4A +CT=4F11BE7A8B5D1A04AB82F60000BC7B50 + +I=225 +KEY=2B78B9DD1193EE5A6B7041DA04319D25 +PT=4F11BE7A8B5D1A04AB82F60000BC7B50 +CT=B98B51B76B262CB9ED157567A05770AF + +I=226 +KEY=92F3E86A7AB5C2E3866534BDA466ED8A +PT=B98B51B76B262CB9ED157567A05770AF +CT=D6CA5483F89D5AA01DBCFEBE30C26F5E + +I=227 +KEY=4439BCE9822898439BD9CA0394A482D4 +PT=D6CA5483F89D5AA01DBCFEBE30C26F5E +CT=7706922EBA53937E287084C8FDFEB33F + +I=228 +KEY=333F2EC7387B0B3DB3A94ECB695A31EB +PT=7706922EBA53937E287084C8FDFEB33F +CT=0F2DA3B8BFCB1046CA94EC9322320BF9 + +I=229 +KEY=3C128D7F87B01B7B793DA2584B683A12 +PT=0F2DA3B8BFCB1046CA94EC9322320BF9 +CT=29CAD5CDC5A2834A5D533335FED2EA81 + +I=230 +KEY=15D858B242129831246E916DB5BAD093 +PT=29CAD5CDC5A2834A5D533335FED2EA81 +CT=A48A2D319552BF02E84E4662E75884DB + +I=231 +KEY=B1527583D7402733CC20D70F52E25448 +PT=A48A2D319552BF02E84E4662E75884DB +CT=334560ECD22BB9F660BC4FFAB13891C9 + +I=232 +KEY=8217156F056B9EC5AC9C98F5E3DAC581 +PT=334560ECD22BB9F660BC4FFAB13891C9 +CT=DAAEB8436205DFB6688D9DE0A21A6B9D + +I=233 +KEY=58B9AD2C676E4173C411051541C0AE1C +PT=DAAEB8436205DFB6688D9DE0A21A6B9D +CT=E38798615C2158872704125A7CFC6540 + +I=234 +KEY=BB3E354D3B4F19F4E315174F3D3CCB5C +PT=E38798615C2158872704125A7CFC6540 +CT=BACB9EA5499A093F6595E8D1D5CF7E50 + +I=235 +KEY=01F5ABE872D510CB8680FF9EE8F3B50C +PT=BACB9EA5499A093F6595E8D1D5CF7E50 +CT=813B0D4AC4C2B8371A1A132927D24F62 + +I=236 +KEY=80CEA6A2B617A8FC9C9AECB7CF21FA6E +PT=813B0D4AC4C2B8371A1A132927D24F62 +CT=D1AD1AE650B377520EE19370D9E968A9 + +I=237 +KEY=5163BC44E6A4DFAE927B7FC716C892C7 +PT=D1AD1AE650B377520EE19370D9E968A9 +CT=3CEC25102A51A5A4C26E7391590D54ED + +I=238 +KEY=6D8F9954CCF57A0A50150C564FC5C62A +PT=3CEC25102A51A5A4C26E7391590D54ED +CT=505FD54017E89E9FAA6376E399F2FF09 + +I=239 +KEY=3DD04C14DB1DE495FA767AB5D6373923 +PT=505FD54017E89E9FAA6376E399F2FF09 +CT=1B45550B4E3AB908A2CC72FFFB38701A + +I=240 +KEY=2695191F95275D9D58BA084A2D0F4939 +PT=1B45550B4E3AB908A2CC72FFFB38701A +CT=E2469D9D2F91E3AA88DC7970C94E7237 + +I=241 +KEY=C4D38482BAB6BE37D066713AE4413B0E +PT=E2469D9D2F91E3AA88DC7970C94E7237 +CT=9352C72F2B5093D1AF52BA959963F59B + +I=242 +KEY=578143AD91E62DE67F34CBAF7D22CE95 +PT=9352C72F2B5093D1AF52BA959963F59B +CT=F26DE32F035B270BA42075574056564E + +I=243 +KEY=A5ECA08292BD0AEDDB14BEF83D7498DB +PT=F26DE32F035B270BA42075574056564E +CT=6AC08B3D91FC31A34B3A81F7C300587E + +I=244 +KEY=CF2C2BBF03413B4E902E3F0FFE74C0A5 +PT=6AC08B3D91FC31A34B3A81F7C300587E +CT=E5E6455304C3B5E2349E2372D6E4B0B8 + +I=245 +KEY=2ACA6EEC07828EACA4B01C7D2890701D +PT=E5E6455304C3B5E2349E2372D6E4B0B8 +CT=90524F27C63CCA1E4CA9674381786C30 + +I=246 +KEY=BA9821CBC1BE44B2E8197B3EA9E81C2D +PT=90524F27C63CCA1E4CA9674381786C30 +CT=44625D68290415039E2C6C05B4954896 + +I=247 +KEY=FEFA7CA3E8BA51B17635173B1D7D54BB +PT=44625D68290415039E2C6C05B4954896 +CT=EC401B0D3780FDB4A3952706B07F6CEF + +I=248 +KEY=12BA67AEDF3AAC05D5A0303DAD023854 +PT=EC401B0D3780FDB4A3952706B07F6CEF +CT=DCEDC88021F6FD1C61C08DAABF0E73BA + +I=249 +KEY=CE57AF2EFECC5119B460BD97120C4BEE +PT=DCEDC88021F6FD1C61C08DAABF0E73BA +CT=C15C85D8161B97DD61EB8B514CDCFFD5 + +I=250 +KEY=0F0B2AF6E8D7C6C4D58B36C65ED0B43B +PT=C15C85D8161B97DD61EB8B514CDCFFD5 +CT=B68B65E041C84433DEA4D9E15E9F98AB + +I=251 +KEY=B9804F16A91F82F70B2FEF27004F2C90 +PT=B68B65E041C84433DEA4D9E15E9F98AB +CT=8122505A5B6F8D985A8D9D7E9E2FF4F3 + +I=252 +KEY=38A21F4CF2700F6F51A272599E60D863 +PT=8122505A5B6F8D985A8D9D7E9E2FF4F3 +CT=8F72F8FFA71D24C900D2BBE8784B9C48 + +I=253 +KEY=B7D0E7B3556D2BA65170C9B1E62B442B +PT=8F72F8FFA71D24C900D2BBE8784B9C48 +CT=1D541D794774264680CF3689365CD845 + +I=254 +KEY=AA84FACA12190DE0D1BFFF38D0779C6E +PT=1D541D794774264680CF3689365CD845 +CT=CBAE9336C5C1F038176B5123CC205BF7 + +I=255 +KEY=612A69FCD7D8FDD8C6D4AE1B1C57C799 +PT=CBAE9336C5C1F038176B5123CC205BF7 +CT=C4CE2DC1BAE3028392BD8A005A360F56 + +I=256 +KEY=A5E4443D6D3BFF5B5469241B4661C8CF +PT=C4CE2DC1BAE3028392BD8A005A360F56 +CT=549B7075DE975B759A6DAE7D761CDC01 + +I=257 +KEY=F17F3448B3ACA42ECE048A66307D14CE +PT=549B7075DE975B759A6DAE7D761CDC01 +CT=2338FFEEE2A391B2DAFD1EBB0ECF19E3 + +I=258 +KEY=D247CBA6510F359C14F994DD3EB20D2D +PT=2338FFEEE2A391B2DAFD1EBB0ECF19E3 +CT=B27705C512C6849DE6012A490F834F36 + +I=259 +KEY=6030CE6343C9B101F2F8BE943131421B +PT=B27705C512C6849DE6012A490F834F36 +CT=33A239E0426921192F8C89C6FBCDD23C + +I=260 +KEY=5392F78301A09018DD743752CAFC9027 +PT=33A239E0426921192F8C89C6FBCDD23C +CT=90CCBE46338C7E9FB25409F82BF81234 + +I=261 +KEY=C35E49C5322CEE876F203EAAE1048213 +PT=90CCBE46338C7E9FB25409F82BF81234 +CT=873D1CAF1F2C2A56BEE419FE8A01489F + +I=262 +KEY=4463556A2D00C4D1D1C427546B05CA8C +PT=873D1CAF1F2C2A56BEE419FE8A01489F +CT=1E9ED35EB85ADD9AB88B6D85299FD8E7 + +I=263 +KEY=5AFD8634955A194B694F4AD1429A126B +PT=1E9ED35EB85ADD9AB88B6D85299FD8E7 +CT=36871F8BD629B27EEDE04E086FC539C4 + +I=264 +KEY=6C7A99BF4373AB3584AF04D92D5F2BAF +PT=36871F8BD629B27EEDE04E086FC539C4 +CT=10D10983F98D799235E8142BD67C1FD2 + +I=265 +KEY=7CAB903CBAFED2A7B14710F2FB23347D +PT=10D10983F98D799235E8142BD67C1FD2 +CT=193CEDEEE0410DE79F1B2FC077B14199 + +I=266 +KEY=65977DD25ABFDF402E5C3F328C9275E4 +PT=193CEDEEE0410DE79F1B2FC077B14199 +CT=1EC99AD6EEF155B6B5F61452D2E73A7D + +I=267 +KEY=7B5EE704B44E8AF69BAA2B605E754F99 +PT=1EC99AD6EEF155B6B5F61452D2E73A7D +CT=92DA7D1858210C87B32C6FEA1CC6A0E6 + +I=268 +KEY=E9849A1CEC6F86712886448A42B3EF7F +PT=92DA7D1858210C87B32C6FEA1CC6A0E6 +CT=A06C4ACCA35DE95CFAD365349969271D + +I=269 +KEY=49E8D0D04F326F2DD25521BEDBDAC862 +PT=A06C4ACCA35DE95CFAD365349969271D +CT=4B892CB63A35A3DED0F43BA4309CBB2E + +I=270 +KEY=0261FC667507CCF302A11A1AEB46734C +PT=4B892CB63A35A3DED0F43BA4309CBB2E +CT=E05F73446706A68A5099088279B58064 + +I=271 +KEY=E23E8F2212016A795238129892F3F328 +PT=E05F73446706A68A5099088279B58064 +CT=542D8314299AF433EC549EBFFCF2B3D9 + +I=272 +KEY=B6130C363B9B9E4ABE6C8C276E0140F1 +PT=542D8314299AF433EC549EBFFCF2B3D9 +CT=4935A91590E8A70D9F75489F6D5B70E7 + +I=273 +KEY=FF26A523AB7339472119C4B8035A3016 +PT=4935A91590E8A70D9F75489F6D5B70E7 +CT=C3A4940C6EC7D0E2F11C3CF60AB2C31D + +I=274 +KEY=3C82312FC5B4E9A5D005F84E09E8F30B +PT=C3A4940C6EC7D0E2F11C3CF60AB2C31D +CT=F109AC488D917B5FC28BA28C9720A46F + +I=275 +KEY=CD8B9D67482592FA128E5AC29EC85764 +PT=F109AC488D917B5FC28BA28C9720A46F +CT=65234934641FA21D8C3A3804D09208F3 + +I=276 +KEY=A8A8D4532C3A30E79EB462C64E5A5F97 +PT=65234934641FA21D8C3A3804D09208F3 +CT=DE015A71CB9C9A3B11C2C9B744B6B5ED + +I=277 +KEY=76A98E22E7A6AADC8F76AB710AECEA7A +PT=DE015A71CB9C9A3B11C2C9B744B6B5ED +CT=973D0C12D7826B45CC7824EF09D82BAB + +I=278 +KEY=E19482303024C199430E8F9E0334C1D1 +PT=973D0C12D7826B45CC7824EF09D82BAB +CT=EBD2D23B9D08F63385A0D21FF76FAC33 + +I=279 +KEY=0A46500BAD2C37AAC6AE5D81F45B6DE2 +PT=EBD2D23B9D08F63385A0D21FF76FAC33 +CT=A7A460A555E4C4E53457AE00FC0D9BA8 + +I=280 +KEY=ADE230AEF8C8F34FF2F9F3810856F64A +PT=A7A460A555E4C4E53457AE00FC0D9BA8 +CT=56F0329103B5238E03C781E2AB0E7A2D + +I=281 +KEY=FB12023FFB7DD0C1F13E7263A3588C67 +PT=56F0329103B5238E03C781E2AB0E7A2D +CT=0D5710472E980CF439109BAC3EAB19A8 + +I=282 +KEY=F6451278D5E5DC35C82EE9CF9DF395CF +PT=0D5710472E980CF439109BAC3EAB19A8 +CT=063CB786AD88ECADC4EAC8FE39A84286 + +I=283 +KEY=F079A5FE786D30980CC42131A45BD749 +PT=063CB786AD88ECADC4EAC8FE39A84286 +CT=825BD1E57F0E16D744C2A69233C8654B + +I=284 +KEY=7222741B0763264F480687A39793B202 +PT=825BD1E57F0E16D744C2A69233C8654B +CT=8EA54322F26DC051F831A5CBBD07A73C + +I=285 +KEY=FC873739F50EE61EB03722682A94153E +PT=8EA54322F26DC051F831A5CBBD07A73C +CT=803F3194726F4D5C5BD80D12D1284F0A + +I=286 +KEY=7CB806AD8761AB42EBEF2F7AFBBC5A34 +PT=803F3194726F4D5C5BD80D12D1284F0A +CT=5A1D90E682989AB1A84F01422CE69F82 + +I=287 +KEY=26A5964B05F931F343A02E38D75AC5B6 +PT=5A1D90E682989AB1A84F01422CE69F82 +CT=3F5AFCD41950EEFBC3D7CEF744F0C060 + +I=288 +KEY=19FF6A9F1CA9DF088077E0CF93AA05D6 +PT=3F5AFCD41950EEFBC3D7CEF744F0C060 +CT=2EE3691BD58D7645DA91CD4943F10157 + +I=289 +KEY=371C0384C924A94D5AE62D86D05B0481 +PT=2EE3691BD58D7645DA91CD4943F10157 +CT=BEF4B188364E87A9E49855CC68C02A50 + +I=290 +KEY=89E8B20CFF6A2EE4BE7E784AB89B2ED1 +PT=BEF4B188364E87A9E49855CC68C02A50 +CT=2263387A7A52AB73704774D07EA5AA69 + +I=291 +KEY=AB8B8A7685388597CE390C9AC63E84B8 +PT=2263387A7A52AB73704774D07EA5AA69 +CT=84E68DA3E9D999016D0B734DAE8C128B + +I=292 +KEY=2F6D07D56CE11C96A3327FD768B29633 +PT=84E68DA3E9D999016D0B734DAE8C128B +CT=978F5F49D7BA1189F16FC0635231DF5F + +I=293 +KEY=B8E2589CBB5B0D1F525DBFB43A83496C +PT=978F5F49D7BA1189F16FC0635231DF5F +CT=FE59B2F2BDE0AB5E1700A1771EDF8663 + +I=294 +KEY=46BBEA6E06BBA641455D1EC3245CCF0F +PT=FE59B2F2BDE0AB5E1700A1771EDF8663 +CT=A94B982DC50C338E25ABFB4113F904A8 + +I=295 +KEY=EFF07243C3B795CF60F6E58237A5CBA7 +PT=A94B982DC50C338E25ABFB4113F904A8 +CT=79A5BB282D8247192AC9F8A3DB431EA1 + +I=296 +KEY=9655C96BEE35D2D64A3F1D21ECE6D506 +PT=79A5BB282D8247192AC9F8A3DB431EA1 +CT=FC339DA0D4593CD79D407CD6F1E1E7ED + +I=297 +KEY=6A6654CB3A6CEE01D77F61F71D0732EB +PT=FC339DA0D4593CD79D407CD6F1E1E7ED +CT=08EAB51652B85C6E9BC07B718E57E144 + +I=298 +KEY=628CE1DD68D4B26F4CBF1A869350D3AF +PT=08EAB51652B85C6E9BC07B718E57E144 +CT=9EA63934609F947AAA926443D0D5BEFA + +I=299 +KEY=FC2AD8E9084B2615E62D7EC543856D55 +PT=9EA63934609F947AAA926443D0D5BEFA +CT=7FE121C45E158FF1F527BAFDDBEAE223 + +I=300 +KEY=83CBF92D565EA9E4130AC438986F8F76 +PT=7FE121C45E158FF1F527BAFDDBEAE223 +CT=B1B70D5AD08BE5DCB8126D8700F25969 + +I=301 +KEY=327CF47786D54C38AB18A9BF989DD61F +PT=B1B70D5AD08BE5DCB8126D8700F25969 +CT=389812FA2D4A6419380A2AC8961CCDA6 + +I=302 +KEY=0AE4E68DAB9F2821931283770E811BB9 +PT=389812FA2D4A6419380A2AC8961CCDA6 +CT=CEF20323EE53A2BA576F4DF86A7AC078 + +I=303 +KEY=C416E5AE45CC8A9BC47DCE8F64FBDBC1 +PT=CEF20323EE53A2BA576F4DF86A7AC078 +CT=A65611BF1901C940B883D746F1694278 + +I=304 +KEY=6240F4115CCD43DB7CFE19C9959299B9 +PT=A65611BF1901C940B883D746F1694278 +CT=7E43C2A99D11C656351B96CECD400E75 + +I=305 +KEY=1C0336B8C1DC858D49E58F0758D297CC +PT=7E43C2A99D11C656351B96CECD400E75 +CT=7DE74D06851AD329C60DD1934C34CBE4 + +I=306 +KEY=61E47BBE44C656A48FE85E9414E65C28 +PT=7DE74D06851AD329C60DD1934C34CBE4 +CT=A99B66FE5825C895DCC6BE718AB8BE34 + +I=307 +KEY=C87F1D401CE39E31532EE0E59E5EE21C +PT=A99B66FE5825C895DCC6BE718AB8BE34 +CT=4752E30DDA44BA393EF197270C111AB7 + +I=308 +KEY=8F2DFE4DC6A724086DDF77C2924FF8AB +PT=4752E30DDA44BA393EF197270C111AB7 +CT=5A3FC324D12AC30FE5BBE87FC4B655F0 + +I=309 +KEY=D5123D69178DE70788649FBD56F9AD5B +PT=5A3FC324D12AC30FE5BBE87FC4B655F0 +CT=79061587E9D9FEEF52F753AE9BCDC4B1 + +I=310 +KEY=AC1428EEFE5419E8DA93CC13CD3469EA +PT=79061587E9D9FEEF52F753AE9BCDC4B1 +CT=86C32E69874EAA0D103581199AFA813A + +I=311 +KEY=2AD70687791AB3E5CAA64D0A57CEE8D0 +PT=86C32E69874EAA0D103581199AFA813A +CT=82A924A5928570E29D18DE200F8558DD + +I=312 +KEY=A87E2222EB9FC30757BE932A584BB00D +PT=82A924A5928570E29D18DE200F8558DD +CT=2D3E0ECCC1FEA93736BD205A5217D830 + +I=313 +KEY=85402CEE2A616A306103B3700A5C683D +PT=2D3E0ECCC1FEA93736BD205A5217D830 +CT=52FA0FCF771191A4A4C4E48C7B11DC1F + +I=314 +KEY=D7BA23215D70FB94C5C757FC714DB422 +PT=52FA0FCF771191A4A4C4E48C7B11DC1F +CT=C2A47519AACA187B97C884D20ED1D825 + +I=315 +KEY=151E5638F7BAE3EF520FD32E7F9C6C07 +PT=C2A47519AACA187B97C884D20ED1D825 +CT=66F1D0799F3C473978C189F745695293 + +I=316 +KEY=73EF86416886A4D62ACE5AD93AF53E94 +PT=66F1D0799F3C473978C189F745695293 +CT=803361A1428EAC3E134B0726E5CF0754 + +I=317 +KEY=F3DCE7E02A0808E839855DFFDF3A39C0 +PT=803361A1428EAC3E134B0726E5CF0754 +CT=2CC85CEDEE03D7AB279D766D3F2BADF4 + +I=318 +KEY=DF14BB0DC40BDF431E182B92E0119434 +PT=2CC85CEDEE03D7AB279D766D3F2BADF4 +CT=706626C1CE6731DD4DBA263C4D7EAB67 + +I=319 +KEY=AF729DCC0A6CEE9E53A20DAEAD6F3F53 +PT=706626C1CE6731DD4DBA263C4D7EAB67 +CT=BD7A59659E3774B85465C91740017628 + +I=320 +KEY=1208C4A9945B9A2607C7C4B9ED6E497B +PT=BD7A59659E3774B85465C91740017628 +CT=F1778330059467556D08223682EC32AA + +I=321 +KEY=E37F479991CFFD736ACFE68F6F827BD1 +PT=F1778330059467556D08223682EC32AA +CT=7B3C6979DCEE500E3FBB2CF4E17B0A3B + +I=322 +KEY=98432EE04D21AD7D5574CA7B8EF971EA +PT=7B3C6979DCEE500E3FBB2CF4E17B0A3B +CT=AFEBC6E81B90C3D82ECE26D788AB2412 + +I=323 +KEY=37A8E80856B16EA57BBAECAC065255F8 +PT=AFEBC6E81B90C3D82ECE26D788AB2412 +CT=E4087042AB32B9C43128AADACB4F7FA6 + +I=324 +KEY=D3A0984AFD83D7614A924676CD1D2A5E +PT=E4087042AB32B9C43128AADACB4F7FA6 +CT=07E1230BC456A3DCE7DF8A4EF7265BC8 + +I=325 +KEY=D441BB4139D574BDAD4DCC383A3B7196 +PT=07E1230BC456A3DCE7DF8A4EF7265BC8 +CT=88F0C30172B9A0EA8CD657CE6847AC94 + +I=326 +KEY=5CB178404B6CD457219B9BF6527CDD02 +PT=88F0C30172B9A0EA8CD657CE6847AC94 +CT=710FE26B2DAB5A12D147D6446732B272 + +I=327 +KEY=2DBE9A2B66C78E45F0DC4DB2354E6F70 +PT=710FE26B2DAB5A12D147D6446732B272 +CT=9C30630A9ADF9B4EBF099452AB75D14A + +I=328 +KEY=B18EF921FC18150B4FD5D9E09E3BBE3A +PT=9C30630A9ADF9B4EBF099452AB75D14A +CT=77526DA4D9AE9FD4347AAC10EA4728AA + +I=329 +KEY=C6DC948525B68ADF7BAF75F0747C9690 +PT=77526DA4D9AE9FD4347AAC10EA4728AA +CT=A9EDBD1A190BC67AC91D27BB7F5A1BD1 + +I=330 +KEY=6F31299F3CBD4CA5B2B2524B0B268D41 +PT=A9EDBD1A190BC67AC91D27BB7F5A1BD1 +CT=B8700A2BAEABCB0C67251C26F82ACEF7 + +I=331 +KEY=D74123B4921687A9D5974E6DF30C43B6 +PT=B8700A2BAEABCB0C67251C26F82ACEF7 +CT=FF5F30BA14A8C49276B040B00864BE29 + +I=332 +KEY=281E130E86BE433BA3270EDDFB68FD9F +PT=FF5F30BA14A8C49276B040B00864BE29 +CT=B448E87BE1E1A41FF94353F6018929C8 + +I=333 +KEY=9C56FB75675FE7245A645D2BFAE1D457 +PT=B448E87BE1E1A41FF94353F6018929C8 +CT=9F59D422CB9265C17732E0B16DEF352A + +I=334 +KEY=030F2F57ACCD82E52D56BD9A970EE17D +PT=9F59D422CB9265C17732E0B16DEF352A +CT=06FD7DB54E62FAC3C511F4DE5C1E93B9 + +I=335 +KEY=05F252E2E2AF7826E8474944CB1072C4 +PT=06FD7DB54E62FAC3C511F4DE5C1E93B9 +CT=0DDA3E4AD600F8D3EA6B06AE465DF3BC + +I=336 +KEY=08286CA834AF80F5022C4FEA8D4D8178 +PT=0DDA3E4AD600F8D3EA6B06AE465DF3BC +CT=17305FA95D26FB72995165DA8A07FCDF + +I=337 +KEY=1F18330169897B879B7D2A30074A7DA7 +PT=17305FA95D26FB72995165DA8A07FCDF +CT=12B56FEBEE2773A2258FC6E0F9115728 + +I=338 +KEY=0DAD5CEA87AE0825BEF2ECD0FE5B2A8F +PT=12B56FEBEE2773A2258FC6E0F9115728 +CT=36440D1A561E8F77B89DF6EA3D8EC7F5 + +I=339 +KEY=3BE951F0D1B08752066F1A3AC3D5ED7A +PT=36440D1A561E8F77B89DF6EA3D8EC7F5 +CT=752C4D620413C0F4A313CF37EB34CFDD + +I=340 +KEY=4EC51C92D5A347A6A57CD50D28E122A7 +PT=752C4D620413C0F4A313CF37EB34CFDD +CT=B2A282D0B6A9EB8B7B7C962675AEC843 + +I=341 +KEY=FC679E42630AAC2DDE00432B5D4FEAE4 +PT=B2A282D0B6A9EB8B7B7C962675AEC843 +CT=D0C3D785B5507C1460DDC44B123ED5FE + +I=342 +KEY=2CA449C7D65AD039BEDD87604F713F1A +PT=D0C3D785B5507C1460DDC44B123ED5FE +CT=4DAE52B77F8001CBAB8D1949E73DD578 + +I=343 +KEY=610A1B70A9DAD1F215509E29A84CEA62 +PT=4DAE52B77F8001CBAB8D1949E73DD578 +CT=29AA82197E8158D88FFFE5BEAFC0C967 + +I=344 +KEY=48A09969D75B892A9AAF7B97078C2305 +PT=29AA82197E8158D88FFFE5BEAFC0C967 +CT=58C665AA97945F7D3AA23BE8B8DDA20D + +I=345 +KEY=1066FCC340CFD657A00D407FBF518108 +PT=58C665AA97945F7D3AA23BE8B8DDA20D +CT=5A104A7093DB3308EB4009829B5E26B1 + +I=346 +KEY=4A76B6B3D314E55F4B4D49FD240FA7B9 +PT=5A104A7093DB3308EB4009829B5E26B1 +CT=8C8EA0BEE4640F6BB6D906A7A6EA3810 + +I=347 +KEY=C6F8160D3770EA34FD944F5A82E59FA9 +PT=8C8EA0BEE4640F6BB6D906A7A6EA3810 +CT=1517ED0B6D4EC3B85479AB28DF48BFDB + +I=348 +KEY=D3EFFB065A3E298CA9EDE4725DAD2072 +PT=1517ED0B6D4EC3B85479AB28DF48BFDB +CT=9546CCBB8094E65E464C38E0809552E3 + +I=349 +KEY=46A937BDDAAACFD2EFA1DC92DD387291 +PT=9546CCBB8094E65E464C38E0809552E3 +CT=7D5AD8DEDB92F80D2B28C3458843AE84 + +I=350 +KEY=3BF3EF63013837DFC4891FD7557BDC15 +PT=7D5AD8DEDB92F80D2B28C3458843AE84 +CT=E62676E27ED61D0FD7DFE170E0938361 + +I=351 +KEY=DDD599817FEE2AD01356FEA7B5E85F74 +PT=E62676E27ED61D0FD7DFE170E0938361 +CT=DA9865198B9463681C66FB96C2C1DAA5 + +I=352 +KEY=074DFC98F47A49B80F300531772985D1 +PT=DA9865198B9463681C66FB96C2C1DAA5 +CT=62CD9DAA9487F34AF168E6E20A0684CF + +I=353 +KEY=6580613260FDBAF2FE58E3D37D2F011E +PT=62CD9DAA9487F34AF168E6E20A0684CF +CT=10BA978FDABA586691946145BE246D3C + +I=354 +KEY=753AF6BDBA47E2946FCC8296C30B6C22 +PT=10BA978FDABA586691946145BE246D3C +CT=13443CF524213B08776D7F5169B79C0F + +I=355 +KEY=667ECA489E66D99C18A1FDC7AABCF02D +PT=13443CF524213B08776D7F5169B79C0F +CT=6507336876ED4F6DB3E35D6CF5A89A2B + +I=356 +KEY=0379F920E88B96F1AB42A0AB5F146A06 +PT=6507336876ED4F6DB3E35D6CF5A89A2B +CT=B84902B5CBBC6DB8111CA45BC5F99991 + +I=357 +KEY=BB30FB952337FB49BA5E04F09AEDF397 +PT=B84902B5CBBC6DB8111CA45BC5F99991 +CT=20973140A999B8AD9982B9B706F7C32E + +I=358 +KEY=9BA7CAD58AAE43E423DCBD479C1A30B9 +PT=20973140A999B8AD9982B9B706F7C32E +CT=EE7FF1177C5E080AA03854A2A819565E + +I=359 +KEY=75D83BC2F6F04BEE83E4E9E5340366E7 +PT=EE7FF1177C5E080AA03854A2A819565E +CT=7A4F74EC2181269AC17D0E48A4DA2A88 + +I=360 +KEY=0F974F2ED7716D744299E7AD90D94C6F +PT=7A4F74EC2181269AC17D0E48A4DA2A88 +CT=5B7A7751F0FD91E203A14CE518838DD7 + +I=361 +KEY=54ED387F278CFC964138AB48885AC1B8 +PT=5B7A7751F0FD91E203A14CE518838DD7 +CT=71319FDDBACB038354A37A41F1910F94 + +I=362 +KEY=25DCA7A29D47FF15159BD10979CBCE2C +PT=71319FDDBACB038354A37A41F1910F94 +CT=81AC58FD503FC3AA78199168AE2C9085 + +I=363 +KEY=A470FF5FCD783CBF6D824061D7E75EA9 +PT=81AC58FD503FC3AA78199168AE2C9085 +CT=1F668F512038142C1155B950B0B040EC + +I=364 +KEY=BB16700EED4028937CD7F93167571E45 +PT=1F668F512038142C1155B950B0B040EC +CT=6B27D7791E9B14A5AC3D9582DBDBD929 + +I=365 +KEY=D031A777F3DB3C36D0EA6CB3BC8CC76C +PT=6B27D7791E9B14A5AC3D9582DBDBD929 +CT=9B7151FDC4E135EE93DAB2D9EB74D59C + +I=366 +KEY=4B40F68A373A09D84330DE6A57F812F0 +PT=9B7151FDC4E135EE93DAB2D9EB74D59C +CT=1F199945BCFA624B1AD3DCBBD95291B2 + +I=367 +KEY=54596FCF8BC06B9359E302D18EAA8342 +PT=1F199945BCFA624B1AD3DCBBD95291B2 +CT=E2C82FA8FE98F26283A6E0B75D0A58C6 + +I=368 +KEY=B6914067755899F1DA45E266D3A0DB84 +PT=E2C82FA8FE98F26283A6E0B75D0A58C6 +CT=5A240FFB99C3594C273B51CACF01B28B + +I=369 +KEY=ECB54F9CEC9BC0BDFD7EB3AC1CA1690F +PT=5A240FFB99C3594C273B51CACF01B28B +CT=D01847391534848FB102CA85C97749B1 + +I=370 +KEY=3CAD08A5F9AF44324C7C7929D5D620BE +PT=D01847391534848FB102CA85C97749B1 +CT=DC5CF60EBDF4A8DDDDF997E7ACA67515 + +I=371 +KEY=E0F1FEAB445BECEF9185EECE797055AB +PT=DC5CF60EBDF4A8DDDDF997E7ACA67515 +CT=749E3815FE305B307D9F4DB6A7E4658C + +I=372 +KEY=946FC6BEBA6BB7DFEC1AA378DE943027 +PT=749E3815FE305B307D9F4DB6A7E4658C +CT=8152C1E676A4FC8B0CD093FEB4B51615 + +I=373 +KEY=153D0758CCCF4B54E0CA30866A212632 +PT=8152C1E676A4FC8B0CD093FEB4B51615 +CT=0847044668710F6E5C93DD248AC921BA + +I=374 +KEY=1D7A031EA4BE443ABC59EDA2E0E80788 +PT=0847044668710F6E5C93DD248AC921BA +CT=1D6C3EFB413A59AB40F34CEFBFF25C17 + +I=375 +KEY=00163DE5E5841D91FCAAA14D5F1A5B9F +PT=1D6C3EFB413A59AB40F34CEFBFF25C17 +CT=5D7C206A79D61868FFE7AA28044996D3 + +I=376 +KEY=5D6A1D8F9C5205F9034D0B655B53CD4C +PT=5D7C206A79D61868FFE7AA28044996D3 +CT=78B4DE3B84D5D1010245CA3077A41BAC + +I=377 +KEY=25DEC3B41887D4F80108C1552CF7D6E0 +PT=78B4DE3B84D5D1010245CA3077A41BAC +CT=9E003AACEDECDBB077BDE832465F40C7 + +I=378 +KEY=BBDEF918F56B0F4876B529676AA89627 +PT=9E003AACEDECDBB077BDE832465F40C7 +CT=EEFF9E6C73E6DC5432AA446385AA1499 + +I=379 +KEY=55216774868DD31C441F6D04EF0282BE +PT=EEFF9E6C73E6DC5432AA446385AA1499 +CT=03252A19E37D9F040C56E4D712982798 + +I=380 +KEY=56044D6D65F04C18484989D3FD9AA526 +PT=03252A19E37D9F040C56E4D712982798 +CT=CF59A752BA0E14BE23AFD09437B39C65 + +I=381 +KEY=995DEA3FDFFE58A66BE65947CA293943 +PT=CF59A752BA0E14BE23AFD09437B39C65 +CT=8B08FB7974A77167DFB234F57C8DFFE1 + +I=382 +KEY=12551146AB5929C1B4546DB2B6A4C6A2 +PT=8B08FB7974A77167DFB234F57C8DFFE1 +CT=DD2A93C1106CFDAE4A1684EE02C82FE2 + +I=383 +KEY=CF7F8287BB35D46FFE42E95CB46CE940 +PT=DD2A93C1106CFDAE4A1684EE02C82FE2 +CT=38696128584F60636354E9F802590391 + +I=384 +KEY=F716E3AFE37AB40C9D1600A4B635EAD1 +PT=38696128584F60636354E9F802590391 +CT=7E552E3AD28729F642D590E3C289D598 + +I=385 +KEY=8943CD9531FD9DFADFC3904774BC3F49 +PT=7E552E3AD28729F642D590E3C289D598 +CT=17A40392AA00D7B5A6E9F59007E60C22 + +I=386 +KEY=9EE7CE079BFD4A4F792A65D7735A336B +PT=17A40392AA00D7B5A6E9F59007E60C22 +CT=A048D6755C2AD24DD8833DDCEB145BA6 + +I=387 +KEY=3EAF1872C7D79802A1A9580B984E68CD +PT=A048D6755C2AD24DD8833DDCEB145BA6 +CT=2F1CCE852396986EC4B2852E5F684CD2 + +I=388 +KEY=11B3D6F7E441006C651BDD25C726241F +PT=2F1CCE852396986EC4B2852E5F684CD2 +CT=2C28BD1E98DA63B95C0C81202BBCFE39 + +I=389 +KEY=3D9B6BE97C9B63D539175C05EC9ADA26 +PT=2C28BD1E98DA63B95C0C81202BBCFE39 +CT=6AE097A8E685B58BA2309B59D6A9EB2B + +I=390 +KEY=577BFC419A1ED65E9B27C75C3A33310D +PT=6AE097A8E685B58BA2309B59D6A9EB2B +CT=6EFC01751753999843A9BB6749097E0C + +I=391 +KEY=3987FD348D4D4FC6D88E7C3B733A4F01 +PT=6EFC01751753999843A9BB6749097E0C +CT=6B6B75F78016052E4F89C73EA826D2F2 + +I=392 +KEY=52EC88C30D5B4AE89707BB05DB1C9DF3 +PT=6B6B75F78016052E4F89C73EA826D2F2 +CT=1E9890E8F0AABCBFB8C4EDAEA0F563EF + +I=393 +KEY=4C74182BFDF1F6572FC356AB7BE9FE1C +PT=1E9890E8F0AABCBFB8C4EDAEA0F563EF +CT=143ED9FE6FD7DFB822C31DE8A3E868A9 + +I=394 +KEY=584AC1D5922629EF0D004B43D80196B5 +PT=143ED9FE6FD7DFB822C31DE8A3E868A9 +CT=9C2834AA5C95F2874DC6B267C0469E14 + +I=395 +KEY=C462F57FCEB3DB6840C6F924184708A1 +PT=9C2834AA5C95F2874DC6B267C0469E14 +CT=0720377F673352693EE2EF76D4FCFB0F + +I=396 +KEY=C342C200A98089017E241652CCBBF3AE +PT=0720377F673352693EE2EF76D4FCFB0F +CT=E83ED303F4B0ABF675C7BBC470B924FE + +I=397 +KEY=2B7C11035D3022F70BE3AD96BC02D750 +PT=E83ED303F4B0ABF675C7BBC470B924FE +CT=D87ADD68CBCAEA46DFFF99AE3723BC94 + +I=398 +KEY=F306CC6B96FAC8B1D41C34388B216BC4 +PT=D87ADD68CBCAEA46DFFF99AE3723BC94 +CT=2C290AE7C65B6E5BBAA32DE577DBA343 + +I=399 +KEY=DF2FC68C50A1A6EA6EBF19DDFCFAC887 +PT=2C290AE7C65B6E5BBAA32DE577DBA343 +CT=A04377ABE259B0D0B5BA2D40A501971B + +========================= + +KEYSIZE=192 + +I=0 +KEY=000000000000000000000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=F3F6752AE8D7831138F041560631B114 + +I=1 +KEY=AAFE47EE82411A2BF3F6752AE8D7831138F041560631B114 +PT=F3F6752AE8D7831138F041560631B114 +CT=77BA00ED5412DFF27C8ED91F3C376172 + +I=2 +KEY=A92B07597B52873C844C75C7BCC55CE3447E98493A06D066 +PT=77BA00ED5412DFF27C8ED91F3C376172 +CT=2D92DE893574463412BD7D121A94952F + +I=3 +KEY=5FD632DA76165EDBA9DEAB4E89B11AD756C3E55B20924549 +PT=2D92DE893574463412BD7D121A94952F +CT=96650F835912F5E748422727802C6CE1 + +I=4 +KEY=984A4BEC5D3474103FBBA4CDD0A3EF301E81C27CA0BE29A8 +PT=96650F835912F5E748422727802C6CE1 +CT=5FCCD4B5F125ADC5B85A56DB32283732 + +I=5 +KEY=6B7EDEEAC755885F60777078218642F5A6DB94A792961E9A +PT=5FCCD4B5F125ADC5B85A56DB32283732 +CT=EA5B1DAE2E4F9FD254A2CC28E128EB9B + +I=6 +KEY=CA5585D8C9727F208A2C6DD60FC9DD27F279588F73BEF501 +PT=EA5B1DAE2E4F9FD254A2CC28E128EB9B +CT=BB87C0FF5DB4B2A593B93398407F823A + +I=7 +KEY=BADA7C0D4A0CDD4631ABAD29527D6F8261C06B1733C1773B +PT=BB87C0FF5DB4B2A593B93398407F823A +CT=D5AF7D56281F86E3E079BE6B9465DBB4 + +I=8 +KEY=FF98AB620A203FFCE404D07F7A62E96181B9D57CA7A4AC8F +PT=D5AF7D56281F86E3E079BE6B9465DBB4 +CT=511331CCA62B067CAC47475800EE33CD + +I=9 +KEY=1186A7F46656EA07B517E1B3DC49EF1D2DFE9224A74A9F42 +PT=511331CCA62B067CAC47475800EE33CD +CT=64ACDC3579D7871644DD585C582AF3A2 + +I=10 +KEY=313ADFF9712EABE4D1BB3D86A59E680B6923CA78FF606CE0 +PT=64ACDC3579D7871644DD585C582AF3A2 +CT=EA3C45FB8A6E548DAB14BAE07966246C + +I=11 +KEY=DDABAC02BE6C40493B87787D2FF03C86C23770988606488C +PT=EA3C45FB8A6E548DAB14BAE07966246C +CT=6BC276C465C9ADBE900049A5B58D2DCB + +I=12 +KEY=9A9F7E267C2BFCD150450EB94A3991385237393D338B6547 +PT=6BC276C465C9ADBE900049A5B58D2DCB +CT=E2F0FFA8D6DF327CA0FB80A325B21931 + +I=13 +KEY=80246B9FB6224226B2B5F1119CE6A344F2CCB99E16397C76 +PT=E2F0FFA8D6DF327CA0FB80A325B21931 +CT=ACEE4C9B8A00A7760DD9CD2F6C6DFA8C + +I=14 +KEY=60CDC3E8265B71E81E5BBD8A16E60432FF1574B17A5486FA +PT=ACEE4C9B8A00A7760DD9CD2F6C6DFA8C +CT=9579E43690FD2800FED810F7442D366B + +I=15 +KEY=9DEC584DB87D63F48B2259BC861B2C3201CD64463E79B091 +PT=9579E43690FD2800FED810F7442D366B +CT=72D4D064851A050D415FC94E3FBB6A1C + +I=16 +KEY=BBC1ED636907611EF9F689D80301293F4092AD0801C2DA8D +PT=72D4D064851A050D415FC94E3FBB6A1C +CT=0CCC3B9B35CE3584D7B78C14905BEE55 + +I=17 +KEY=AE398529289F7994F53AB24336CF1CBB9725211C919934D8 +PT=0CCC3B9B35CE3584D7B78C14905BEE55 +CT=66B6A61BF7BCC6392B8FEC12152E5363 + +I=18 +KEY=4617E60BD8AF29D5938C1458C173DA82BCAACD0E84B767BB +PT=66B6A61BF7BCC6392B8FEC12152E5363 +CT=6C2247EA3BC566A84A30BF0B30AB4EEC + +I=19 +KEY=6B762D1391AA17CBFFAE53B2FAB6BC2AF69A7205B41C2957 +PT=6C2247EA3BC566A84A30BF0B30AB4EEC +CT=C16FBCDFAE34E839BA449D697452550D + +I=20 +KEY=374499A8C09A60DA3EC1EF6D548254134CDEEF6CC04E7C5A +PT=C16FBCDFAE34E839BA449D697452550D +CT=C8B704B4AFE68AF5C91A810F2873F13F + +I=21 +KEY=09DCC638DD59F37CF676EBD9FB64DEE685C46E63E83D8D65 +PT=C8B704B4AFE68AF5C91A810F2873F13F +CT=FC9C31036B26234ED1CBA46E0BE944EE + +I=22 +KEY=CE2CEB8869D7EC160AEADADA9042FDA8540FCA0DE3D4C98B +PT=FC9C31036B26234ED1CBA46E0BE944EE +CT=DCF13203AD179CD008779F189EBC78F0 + +I=23 +KEY=505FBECF6B0B083CD61BE8D93D5561785C7855157D68B17B +PT=DCF13203AD179CD008779F189EBC78F0 +CT=24AEB937E259D44D352FF39C1A8A79E0 + +I=24 +KEY=1D1649FDB7484DD2F2B551EEDF0CB5356957A68967E2C89B +PT=24AEB937E259D44D352FF39C1A8A79E0 +CT=19016D033872CB7694A712A84DBC43F2 + +I=25 +KEY=9BE41771C0F74BDEEBB43CEDE77E7E43FDF0B4212A5E8B69 +PT=19016D033872CB7694A712A84DBC43F2 +CT=0536107FEA26AB6A4FE2667EF7FCF16A + +I=26 +KEY=FF3619AED9A1F724EE822C920D58D529B212D25FDDA27A03 +PT=0536107FEA26AB6A4FE2667EF7FCF16A +CT=5D35213390FCA53AD422DC2ED4BF674D + +I=27 +KEY=59D2F5AF4BB6F28BB3B70DA19DA4701366300E71091D1D4E +PT=5D35213390FCA53AD422DC2ED4BF674D +CT=04A6F9B1AE64AD03659C4E375A690852 + +I=28 +KEY=C8384D35CAF0074EB711F41033C0DD1003AC40465374151C +PT=04A6F9B1AE64AD03659C4E375A690852 +CT=18AB347EFC2F8F93655E16732BB509DE + +I=29 +KEY=910CE58F963B684EAFBAC06ECFEF528366F2563578C11CC2 +PT=18AB347EFC2F8F93655E16732BB509DE +CT=F6037C06C71793BD14A4FC89A05D918F + +I=30 +KEY=5D1EF94FBA1E098459B9BC6808F8C13E7256AABCD89C8D4D +PT=F6037C06C71793BD14A4FC89A05D918F +CT=75094DD9B2FDDAC96B49CAB676057288 + +I=31 +KEY=61FDA8DA3EF8949C2CB0F1B1BA051BF7191F600AAE99FFC5 +PT=75094DD9B2FDDAC96B49CAB676057288 +CT=346F9F9E70C05B53DCDAF736FE59749D + +I=32 +KEY=5C383CCC2DCAE66A18DF6E2FCAC540A4C5C5973C50C08B58 +PT=346F9F9E70C05B53DCDAF736FE59749D +CT=1DB82CC8EF5B736AAEFD1F1B9CE5B67D + +I=33 +KEY=1EC7FDBB8AE4FF05056742E7259E33CE6B388827CC253D25 +PT=1DB82CC8EF5B736AAEFD1F1B9CE5B67D +CT=31B5E80D946AE577268973AF865151EB + +I=34 +KEY=FFE21FDAB07E755034D2AAEAB1F4D6B94DB1FB884A746CCE +PT=31B5E80D946AE577268973AF865151EB +CT=9FD63EB3EC6A15FC149A4F058EDA7080 + +I=35 +KEY=7EC4053A63B2353BAB0494595D9EC345592BB48DC4AE1C4E +PT=9FD63EB3EC6A15FC149A4F058EDA7080 +CT=41730A9E9D197435AC36902C57B16588 + +I=36 +KEY=FB6D2FAFD47FE8D1EA779EC7C087B770F51D24A1931F79C6 +PT=41730A9E9D197435AC36902C57B16588 +CT=08AD282171F0772F85C0A43E8BACEC74 + +I=37 +KEY=9531B1BBE0863D44E2DAB6E6B177C05F70DD809F18B395B2 +PT=08AD282171F0772F85C0A43E8BACEC74 +CT=8561E508FA237E4170CECD3A8352CFA4 + +I=38 +KEY=0AB0CF2D1CA2957A67BB53EE4B54BE1E00134DA59BE15A16 +PT=8561E508FA237E4170CECD3A8352CFA4 +CT=4470EFA3C3172EBF64A064F59AE364A9 + +I=39 +KEY=291FD5C38E400CFA23CBBC4D884390A164B3295001023EBF +PT=4470EFA3C3172EBF64A064F59AE364A9 +CT=FCC5636DFE9E45CB7761DD14A1CF4773 + +I=40 +KEY=114E4DEF0447E1D5DF0EDF2076DDD56A13D2F444A0CD79CC +PT=FCC5636DFE9E45CB7761DD14A1CF4773 +CT=2130BA8736D4933678C3B536AEDBC500 + +I=41 +KEY=0C19F74860652278FE3E65A74009465C6B1141720E16BCCC +PT=2130BA8736D4933678C3B536AEDBC500 +CT=1725EECBA8F9A542E9956168390C82C2 + +I=42 +KEY=EF9E7E57576D8A3EE91B8B6CE8F0E31E8284201A371A3E0E +PT=1725EECBA8F9A542E9956168390C82C2 +CT=60912D3EEDC962D68A29AED73DDAA24D + +I=43 +KEY=CE6464925302B9F4898AA652053981C808AD8ECD0AC09C43 +PT=60912D3EEDC962D68A29AED73DDAA24D +CT=43A8B490BBC75DC8D2D2F060C8672E9E + +I=44 +KEY=8657F15C75C74469CA2212C2BEFEDC00DA7F7EADC2A7B2DD +PT=43A8B490BBC75DC8D2D2F060C8672E9E +CT=67D856AF692A4BA7DEC7C8C14A37BD50 + +I=45 +KEY=2D566517DCC2D4EBADFA446DD7D497A704B8B66C88900F8D +PT=67D856AF692A4BA7DEC7C8C14A37BD50 +CT=293C5A05F31E863C6CA26DB8018751CA + +I=46 +KEY=826DFA3FD5229B9B84C61E6824CA119B681ADBD489175E47 +PT=293C5A05F31E863C6CA26DB8018751CA +CT=9421BF2E7727F49C252D644B952C76C4 + +I=47 +KEY=A5A13E0D1C01D7CF10E7A14653EDE5074D37BF9F1C3B2883 +PT=9421BF2E7727F49C252D644B952C76C4 +CT=CEE8F6FCF7CAF1C5EA9F746C10BD405B + +I=48 +KEY=923D8EE015266BA8DE0F57BAA42714C2A7A8CBF30C8668D8 +PT=CEE8F6FCF7CAF1C5EA9F746C10BD405B +CT=403220B81E6E0837ACCEDA5ACB3730BE + +I=49 +KEY=B41FA03C1181401A9E3D7702BA491CF50B6611A9C7B15866 +PT=403220B81E6E0837ACCEDA5ACB3730BE +CT=8C5D05679F78F853CF83CB8E5BBEBA44 + +I=50 +KEY=00B6D7172075472F126072652531E4A6C4E5DA279C0FE222 +PT=8C5D05679F78F853CF83CB8E5BBEBA44 +CT=6F9C74C0BB40608AAD1A1202FCAF62EB + +I=51 +KEY=BEB1F890B29E8EFE7DFC06A59E71842C69FFC82560A080C9 +PT=6F9C74C0BB40608AAD1A1202FCAF62EB +CT=B812DB4E295951BB04B1636A9CE91DDB + +I=52 +KEY=9455ABC4AC495686C5EEDDEBB728D5976D4EAB4FFC499D12 +PT=B812DB4E295951BB04B1636A9CE91DDB +CT=B164574EAECAD5A06FFB4F3E6C607D61 + +I=53 +KEY=1E9CCB2A3541F810748A8AA519E2003702B5E4719029E073 +PT=B164574EAECAD5A06FFB4F3E6C607D61 +CT=1433D23C1500EDBA0EFFD03D96E18F20 + +I=54 +KEY=F4817B9409F1F1D160B958990CE2ED8D0C4A344C06C86F53 +PT=1433D23C1500EDBA0EFFD03D96E18F20 +CT=B81C889B6FAF5DA800AEBA561992853B + +I=55 +KEY=49F7CD1535080039D8A5D002634DB0250CE48E1A1F5AEA68 +PT=B81C889B6FAF5DA800AEBA561992853B +CT=5B558B7C5916CF14FA5BC9266CFE875F + +I=56 +KEY=FCD5479474EA721783F05B7E3A5B7F31F6BF473C73A46D37 +PT=5B558B7C5916CF14FA5BC9266CFE875F +CT=49BE310D74A9980E9A78B0A8BB3BA1AB + +I=57 +KEY=6A68208CC7D6782ECA4E6A734EF2E73F6CC7F794C89FCC9C +PT=49BE310D74A9980E9A78B0A8BB3BA1AB +CT=7BD5BABAD7F1EEAA56E17BF9B6678DC8 + +I=58 +KEY=38DE1A69C03EF9C1B19BD0C9990309953A268C6D7EF84154 +PT=7BD5BABAD7F1EEAA56E17BF9B6678DC8 +CT=62448A767C344E7E7CDB02112F475EFE + +I=59 +KEY=02634EC657B436A8D3DF5ABFE53747EB46FD8E7C51BF1FAA +PT=62448A767C344E7E7CDB02112F475EFE +CT=F490A20D8B5C53E34C4CF5B7B72A4591 + +I=60 +KEY=DCDAAB8CBD526850274FF8B26E6B14080AB17BCBE6955A3B +PT=F490A20D8B5C53E34C4CF5B7B72A4591 +CT=ACFFD7CD5C01B183AB92DBB62DC088F6 + +I=61 +KEY=51EB6B7172C22A248BB02F7F326AA58BA123A07DCB55D2CD +PT=ACFFD7CD5C01B183AB92DBB62DC088F6 +CT=0BEDDFA8E7A1AC84E3E164A59D599BAB + +I=62 +KEY=4796B5FA7B22626B805DF0D7D5CB090F42C2C4D8560C4966 +PT=0BEDDFA8E7A1AC84E3E164A59D599BAB +CT=9CC82E2B6B96254345C1FDBAD667275E + +I=63 +KEY=D8E112F9657BD2BF1C95DEFCBE5D2C4C07033962806B6E38 +PT=9CC82E2B6B96254345C1FDBAD667275E +CT=75926F4D3503411CD3C059DA4FFABD62 + +I=64 +KEY=A19B892107C4F8F86907B1B18B5E6D50D4C360B8CF91D35A +PT=75926F4D3503411CD3C059DA4FFABD62 +CT=1073561CF6BA28EC57F4B7E5073D27FA + +I=65 +KEY=AEFE35F52D8D54A27974E7AD7DE445BC8337D75DC8ACF4A0 +PT=1073561CF6BA28EC57F4B7E5073D27FA +CT=83E161BA51E6F3A4588C94F7A24BA81F + +I=66 +KEY=5E41A6382F88A350FA9586172C02B618DBBB43AA6AE75CBF +PT=83E161BA51E6F3A4588C94F7A24BA81F +CT=BD693B4C49378F17322D175932B87111 + +I=67 +KEY=A2D760EE839234F147FCBD5B6535390FE99654F3585F2DAE +PT=BD693B4C49378F17322D175932B87111 +CT=101A83CF8487BEDD2C93180BB5024EC9 + +I=68 +KEY=0F463C72AF8E4B5357E63E94E1B287D2C5054CF8ED5D6367 +PT=101A83CF8487BEDD2C93180BB5024EC9 +CT=757949BE62D3328D09E2F45DF2AD095A + +I=69 +KEY=C3C0A16686A5D66B229F772A8361B55FCCE7B8A51FF06A3D +PT=757949BE62D3328D09E2F45DF2AD095A +CT=63EBBF9E15BECEC1A0885BECB3D06BF8 + +I=70 +KEY=3A0B55738CF3B3E94174C8B496DF7B9E6C6FE349AC2001C5 +PT=63EBBF9E15BECEC1A0885BECB3D06BF8 +CT=E176B5C7AFCE06E8ED0C63A4CF7E3034 + +I=71 +KEY=450F848D964934DAA0027D7339117D76816380ED635E31F1 +PT=E176B5C7AFCE06E8ED0C63A4CF7E3034 +CT=97B91F0A898E5B3A77A0883140D477BC + +I=72 +KEY=F3AF781D6EA3529237BB6279B09F264CF6C308DC238A464D +PT=97B91F0A898E5B3A77A0883140D477BC +CT=346AD1C470309DFE6CB08DCC24E17470 + +I=73 +KEY=4E43AB584BF1F8C603D1B3BDC0AFBBB29A738510076B323D +PT=346AD1C470309DFE6CB08DCC24E17470 +CT=F8B462FB7D758B3AF2CDF7D9244B738F + +I=74 +KEY=5A1F023E8F0987B4FB65D146BDDA308868BE72C9232041B2 +PT=F8B462FB7D758B3AF2CDF7D9244B738F +CT=B44D090FD0B7F762146FF6301C6DBF54 + +I=75 +KEY=FFC4BB75031165DA4F28D8496D6DC7EA7CD184F93F4DFEE6 +PT=B44D090FD0B7F762146FF6301C6DBF54 +CT=15CB042313710F2CD1C3409B5F3AF419 + +I=76 +KEY=8107240E1FB855765AE3DC6A7E1CC8C6AD12C46260770AFF +PT=15CB042313710F2CD1C3409B5F3AF419 +CT=0AB01B03F415A58D52CF7A1E40856275 + +I=77 +KEY=4493743ADE27D1D85053C7698A096D4BFFDDBE7C20F2688A +PT=0AB01B03F415A58D52CF7A1E40856275 +CT=05BE037C28719B4C4EEBEA329FAC63D5 + +I=78 +KEY=F582EC062155016255EDC415A278F607B136544EBF5E0B5F +PT=05BE037C28719B4C4EEBEA329FAC63D5 +CT=74C3C4F42B3F575C6B8D5BAD9AF0191F + +I=79 +KEY=8FAF8EEAA5E2D76B212E00E18947A15BDABB0FE325AE1240 +PT=74C3C4F42B3F575C6B8D5BAD9AF0191F +CT=92CB4A3DF34E6711FB56391F26D949AD + +I=80 +KEY=1CAD393CC06BC104B3E54ADC7A09C64A21ED36FC03775BED +PT=92CB4A3DF34E6711FB56391F26D949AD +CT=3754BB3D8C3D7370EDBA842CDF17D5C0 + +I=81 +KEY=E3AB53BB36BDFBBB84B1F1E1F634B53ACC57B2D0DC608E2D +PT=3754BB3D8C3D7370EDBA842CDF17D5C0 +CT=94EAC7FD54D228619791BCCBF9F633F4 + +I=82 +KEY=480B1D923E853259105B361CA2E69D5B5BC60E1B2596BDD9 +PT=94EAC7FD54D228619791BCCBF9F633F4 +CT=CAB29222355968E9CF492D5BF08B0999 + +I=83 +KEY=D8F6791107FB3D26DAE9A43E97BFF5B2948F2340D51DB440 +PT=CAB29222355968E9CF492D5BF08B0999 +CT=00837C78B88005288DB39452F1EB8F13 + +I=84 +KEY=6521B6B771FE24B2DA6AD8462F3FF09A193CB71224F63B53 +PT=00837C78B88005288DB39452F1EB8F13 +CT=2082F77D48A63E223A79217CD4516854 + +I=85 +KEY=9D9F3198682E2476FAE82F3B6799CEB82345966EF0A75307 +PT=2082F77D48A63E223A79217CD4516854 +CT=C5074D4B3F455346B078DAFBC1327AB6 + +I=86 +KEY=61832291235DC7C33FEF627058DC9DFE933D4C95319529B1 +PT=C5074D4B3F455346B078DAFBC1327AB6 +CT=72EE56572A2B7CEC53FC4E4FC0293D63 + +I=87 +KEY=5C2877854338D45D4D01342772F7E112C0C102DAF1BC14D2 +PT=72EE56572A2B7CEC53FC4E4FC0293D63 +CT=7350039161DF9E8E45B360E6139E4226 + +I=88 +KEY=A8225CF65297BA953E5137B613287F9C8572623CE22256F4 +PT=7350039161DF9E8E45B360E6139E4226 +CT=4339288215BE1BB87E31AF8FB35DEDC1 + +I=89 +KEY=51649B52A8458F4B7D681F3406966424FB43CDB3517FBB35 +PT=4339288215BE1BB87E31AF8FB35DEDC1 +CT=4D7AB61CC2C930CBB0DF43EEE92EBA1F + +I=90 +KEY=750E4E7E9183E2FF3012A928C45F54EF4B9C8E5DB851012A +PT=4D7AB61CC2C930CBB0DF43EEE92EBA1F +CT=1090FE663EA77DC2EC30E8F89E662918 + +I=91 +KEY=B65FBDF702246E442082574EFAF8292DA7AC66A526372832 +PT=1090FE663EA77DC2EC30E8F89E662918 +CT=14307A2CC40BDFB0413DF10F961337CA + +I=92 +KEY=7BEC3480AA0A44FF34B22D623EF3F69DE69197AAB0241FF8 +PT=14307A2CC40BDFB0413DF10F961337CA +CT=8F378E272D82DE8E63EC418912EF8642 + +I=93 +KEY=63921E8700657D6ABB85A34513712813857DD623A2CB99BA +PT=8F378E272D82DE8E63EC418912EF8642 +CT=3947DDC00E3C4D958E508DF58AB4982A + +I=94 +KEY=754B2E8355FABCAF82C27E851D4D65860B2D5BD6287F0190 +PT=3947DDC00E3C4D958E508DF58AB4982A +CT=492DB375B3CC640DD8FEDBAF2C943535 + +I=95 +KEY=E8F8C2450F8597B3CBEFCDF0AE81018BD3D3807904EB34A5 +PT=492DB375B3CC640DD8FEDBAF2C943535 +CT=D74BD4118D448B674935B80E4B1BFB93 + +I=96 +KEY=34A2C5B010AE479A1CA419E123C58AEC9AE638774FF0CF36 +PT=D74BD4118D448B674935B80E4B1BFB93 +CT=E9742B41295BC3ED3AA66E80E8718665 + +I=97 +KEY=0E11D08AA9EC81A4F5D032A00A9E4901A04056F7A7814953 +PT=E9742B41295BC3ED3AA66E80E8718665 +CT=5FB17BFE146B410F90EC922B1385D0E4 + +I=98 +KEY=B15779E61FD27B02AA61495E1EF5080E30ACC4DCB40499B7 +PT=5FB17BFE146B410F90EC922B1385D0E4 +CT=1B0CCF643F19DDBC0E3ED0EEAE83ACC1 + +I=99 +KEY=861B580225193DD5B16D863A21ECD5B23E9214321A873576 +PT=1B0CCF643F19DDBC0E3ED0EEAE83ACC1 +CT=B3A7D434E30DC0CDEE4D17BBC27B855E + +I=100 +KEY=B6DF2A8726C31D6E02CA520EC2E1157FD0DF0389D8FCB028 +PT=B3A7D434E30DC0CDEE4D17BBC27B855E +CT=57DE2345D91E26A2AB7CA88AEA23A84F + +I=101 +KEY=6976D3780B5F01E25514714B1BFF33DD7BA3AB0332DF1867 +PT=57DE2345D91E26A2AB7CA88AEA23A84F +CT=7B03541D239B569FEE7ABD8980F1BD05 + +I=102 +KEY=734CAC477A2727542E1725563864654295D9168AB22EA562 +PT=7B03541D239B569FEE7ABD8980F1BD05 +CT=5CB7E72B2E6CFF8C18AEB026FE40C2FA + +I=103 +KEY=B59171BEBC7BFB8672A0C27D16089ACE8D77A6AC4C6E6798 +PT=5CB7E72B2E6CFF8C18AEB026FE40C2FA +CT=50B9186306DA92FE785D6EB9223E43A9 + +I=104 +KEY=E460BA8A2F82DBB72219DA1E10D20830F52AC8156E502431 +PT=50B9186306DA92FE785D6EB9223E43A9 +CT=B3D8CE8B04B99CF2F82571E1588C358B + +I=105 +KEY=CE7C790CD4B34C4791C11495146B94C20D0FB9F436DC11BA +PT=B3D8CE8B04B99CF2F82571E1588C358B +CT=9845F0A5681A40A6DC3D9BCA639FE786 + +I=106 +KEY=699FE59B482743180984E4307C71D464D132223E5543F63C +PT=9845F0A5681A40A6DC3D9BCA639FE786 +CT=C7EBF5CEAAD5652563A8550020EC7070 + +I=107 +KEY=FEBE2836F5099F53CE6F11FED6A4B141B29A773E75AF864C +PT=C7EBF5CEAAD5652563A8550020EC7070 +CT=DE94A376634FE9856A84E2EE6EED86E8 + +I=108 +KEY=22BCFFB0740FC30510FBB288B5EB58C4D81E95D01B4200A4 +PT=DE94A376634FE9856A84E2EE6EED86E8 +CT=64B9917E23328A4FE1F8FDB8AE43E7F3 + +I=109 +KEY=E8491AFDF41F0DFB744223F696D9D28B39E66868B501E757 +PT=64B9917E23328A4FE1F8FDB8AE43E7F3 +CT=2C59820184ABC99E82A7F51D4E3A86A8 + +I=110 +KEY=3BE5F390D72ABE6A581BA1F712721B15BB419D75FB3B61FF +PT=2C59820184ABC99E82A7F51D4E3A86A8 +CT=387ACD0BAD539773287C209A0876581F + +I=111 +KEY=B7388762F772C83560616CFCBF218C66933DBDEFF34D39E0 +PT=387ACD0BAD539773287C209A0876581F +CT=F12D3E1F21AFB9CACAB541EFB7334438 + +I=112 +KEY=FBD600191276FA5C914C52E39E8E35AC5988FC00447E7DD8 +PT=F12D3E1F21AFB9CACAB541EFB7334438 +CT=68D2FA1BB635D9D35E4BF440335CBD80 + +I=113 +KEY=1E2B19106450AA2FF99EA8F828BBEC7F07C308407722C058 +PT=68D2FA1BB635D9D35E4BF440335CBD80 +CT=4532507D5E0227054CB36CBD3C489D53 + +I=114 +KEY=C0B60F65BAD77DA4BCACF88576B9CB7A4B7064FD4B6A5D0B +PT=4532507D5E0227054CB36CBD3C489D53 +CT=6DB8FD7DE7924B7E92CF27BC0AD11D16 + +I=115 +KEY=451836B53318CC33D11405F8912B8004D9BF434141BB401D +PT=6DB8FD7DE7924B7E92CF27BC0AD11D16 +CT=A3D5F6A8D4372B66F8D3DD9FF945DECA + +I=116 +KEY=0E57235F9B527C5172C1F350451CAB62216C9EDEB8FE9ED7 +PT=A3D5F6A8D4372B66F8D3DD9FF945DECA +CT=BEDFF233AD31EEB9943EEBF52F66AABF + +I=117 +KEY=BB7E1C438E5F36A3CC1E0163E82D45DBB552752B97983468 +PT=BEDFF233AD31EEB9943EEBF52F66AABF +CT=4531EDEC06570582755199A0C4745EA5 + +I=118 +KEY=DE70EC87811AFD32892FEC8FEE7A4059C003EC8B53EC6ACD +PT=4531EDEC06570582755199A0C4745EA5 +CT=F3189383C202A472CE238571D187F8EB + +I=119 +KEY=CA2AE67397E9238A7A377F0C2C78E42B0E2069FA826B9226 +PT=F3189383C202A472CE238571D187F8EB +CT=B48952CBAC43D0114985A9035DFF0382 + +I=120 +KEY=335EF040D622E95BCEBE2DC7803B343A47A5C0F9DF9491A4 +PT=B48952CBAC43D0114985A9035DFF0382 +CT=9B71302FDFBC47DF6276AB73D4D0D8B3 + +I=121 +KEY=683CC10DFBC6C09C55CF1DE85F8773E525D36B8A0B444917 +PT=9B71302FDFBC47DF6276AB73D4D0D8B3 +CT=69EED4A0C5428005199DF12B338393E2 + +I=122 +KEY=B86C9A2F1A978E123C21C9489AC5F3E03C4E9AA138C7DAF5 +PT=69EED4A0C5428005199DF12B338393E2 +CT=D0C2ACA653E6D7D80D32F445B0DD2347 + +I=123 +KEY=EF7E3DCDF05FFA86ECE365EEC9232438317C6EE4881AF9B2 +PT=D0C2ACA653E6D7D80D32F445B0DD2347 +CT=F373D4DBD7ADAFEF582621EC8C7CD2A2 + +I=124 +KEY=B8059C7A6BA2273E1F90B1351E8E8BD7695A4F0804662B10 +PT=F373D4DBD7ADAFEF582621EC8C7CD2A2 +CT=0AD37AFC8C929513F9BDB976E69C7CF3 + +I=125 +KEY=F5C9ECCBB672D46F1543CBC9921C1EC490E7F67EE2FA57E3 +PT=0AD37AFC8C929513F9BDB976E69C7CF3 +CT=E80B118DFB34F11DB344B6AE34EDEBC8 + +I=126 +KEY=AA67DC18543A7A88FD48DA446928EFD923A340D0D617BC2B +PT=E80B118DFB34F11DB344B6AE34EDEBC8 +CT=628D5C42DDEBA9AE4983F51D339366B4 + +I=127 +KEY=BF0C30A039C0FEE89FC58606B4C346776A20B5CDE584DA9F +PT=628D5C42DDEBA9AE4983F51D339366B4 +CT=1BE2A5A8CCA8E065557F6982AF3E056F + +I=128 +KEY=A219F6B8E2FF1AA3842723AE786BA6123F5FDC4F4ABADFF0 +PT=1BE2A5A8CCA8E065557F6982AF3E056F +CT=5E1187D78AEB34780F07905A84D2EBBA + +I=129 +KEY=851DDD078D4B7802DA36A479F280926A30584C15CE68344A +PT=5E1187D78AEB34780F07905A84D2EBBA +CT=31EE3AC2EC79D14EBCA71E760326CD74 + +I=130 +KEY=E6741084FEDEEFFEEBD89EBB1EF943248CFF5263CD4EF93E +PT=31EE3AC2EC79D14EBCA71E760326CD74 +CT=298E3A00F280BBF8364CF8D6D44CF54E + +I=131 +KEY=8A41136FE9DB1FB5C256A4BBEC79F8DCBAB3AAB519020C70 +PT=298E3A00F280BBF8364CF8D6D44CF54E +CT=39B7A0416C1F9B19C7B99A1F6A70258C + +I=132 +KEY=E1F1B622EB8BC9B1FBE104FA806663C57D0A30AA737229FC +PT=39B7A0416C1F9B19C7B99A1F6A70258C +CT=B1655FA9AB2C4956E2C56F7A6C421BE5 + +I=133 +KEY=0EE0B7E1AF7093694A845B532B4A2A939FCF5FD01F303219 +PT=B1655FA9AB2C4956E2C56F7A6C421BE5 +CT=1AD9CBB1A28F7A2A6CBC7EC98EF483FC + +I=134 +KEY=180A2BD07F77D34E505D90E289C550B9F373211991C4B1E5 +PT=1AD9CBB1A28F7A2A6CBC7EC98EF483FC +CT=6363BE57D6D587EE3ABA9FE81F3D3A10 + +I=135 +KEY=848B7408CAACF02E333E2EB55F10D757C9C9BEF18EF98BF5 +PT=6363BE57D6D587EE3ABA9FE81F3D3A10 +CT=05618580D7915AA7398EF4DB7D1F1DE3 + +I=136 +KEY=E581D7B4F84F2860365FAB3588818DF0F0474A2AF3E69616 +PT=05618580D7915AA7398EF4DB7D1F1DE3 +CT=F8D0118087404FD729F96CA6551338AD + +I=137 +KEY=6C81D6873EFFF763CE8FBAB50FC1C227D9BE268CA6F5AEBB +PT=F8D0118087404FD729F96CA6551338AD +CT=784913B38D32A7395D73AF1378A0DC56 + +I=138 +KEY=D971137D872F606EB6C6A90682F3651E84CD899FDE5572ED +PT=784913B38D32A7395D73AF1378A0DC56 +CT=D07C418BD183457B6683AE99C457FC0B + +I=139 +KEY=196BBA79E35EEC7966BAE88D53702065E24E27061A028EE6 +PT=D07C418BD183457B6683AE99C457FC0B +CT=5595D16DF7668779825BC135D1408013 + +I=140 +KEY=6F140EC274635FA2332F39E0A416A71C6015E633CB420EF5 +PT=5595D16DF7668779825BC135D1408013 +CT=1AB9F5075E063403FEFD976044C89C95 + +I=141 +KEY=926F3A2AA0BD8C952996CCE7FA10931F9EE871538F8A9260 +PT=1AB9F5075E063403FEFD976044C89C95 +CT=6DF413E53FCEDA296D7ABA796179D600 + +I=142 +KEY=740F74BF0E0C38154462DF02C5DE4936F392CB2AEEF34460 +PT=6DF413E53FCEDA296D7ABA796179D600 +CT=0D0F499B0D51948A9CCBC4B6531A05F7 + +I=143 +KEY=2500C9B63042B24B496D9699C88FDDBC6F590F9CBDE94197 +PT=0D0F499B0D51948A9CCBC4B6531A05F7 +CT=85833A1072B6A0ED932D4D89D53A785A + +I=144 +KEY=FCB377C07622271FCCEEAC89BA397D51FC74421568D339CD +PT=85833A1072B6A0ED932D4D89D53A785A +CT=545EDE1A4B737F1E51CBDAE311E91D5C + +I=145 +KEY=BB108ABE391C394E98B07293F14A024FADBF98F6793A2491 +PT=545EDE1A4B737F1E51CBDAE311E91D5C +CT=DA8CC635CF1450685DDAAA5A56BC3BD9 + +I=146 +KEY=34F8623EC93A6C2A423CB4A63E5E5227F06532AC2F861F48 +PT=DA8CC635CF1450685DDAAA5A56BC3BD9 +CT=FE73162BF90B52DEE7D0EA9D73F8444D + +I=147 +KEY=5E3CB25583365D5EBC4FA28DC75500F917B5D8315C7E5B05 +PT=FE73162BF90B52DEE7D0EA9D73F8444D +CT=BC75D12F66C232E1979D0F6C3E1ED8F1 + +I=148 +KEY=EABE655116470AE1003A73A2A19732188028D75D626083F4 +PT=BC75D12F66C232E1979D0F6C3E1ED8F1 +CT=661A3FA0530BF47C266D609FE01DAF48 + +I=149 +KEY=97A1B8E97CF217C366204C02F29CC664A645B7C2827D2CBC +PT=661A3FA0530BF47C266D609FE01DAF48 +CT=791144514CF8E4CC15BC6ADE3291F9CD + +I=150 +KEY=5189DC6F535B5A091F310853BE6422A8B3F9DD1CB0ECD571 +PT=791144514CF8E4CC15BC6ADE3291F9CD +CT=4369FDB3626F399A6526C476373A52D4 + +I=151 +KEY=21CD36EDB27428AB5C58F5E0DC0B1B32D6DF196A87D687A5 +PT=4369FDB3626F399A6526C476373A52D4 +CT=4C8869494C044703CFDD09F83B2208AA + +I=152 +KEY=85C08C7D4667AE3710D09CA9900F5C3119021092BCF48F0F +PT=4C8869494C044703CFDD09F83B2208AA +CT=06BC45BDB38A7028CB2D189E9E0C3046 + +I=153 +KEY=807182BD7E1F29BE166CD91423852C19D22F080C22F8BF49 +PT=06BC45BDB38A7028CB2D189E9E0C3046 +CT=74AFD5F37F8F0712710585FB8DB22FF8 + +I=154 +KEY=1AF15D0DE00CEF3F62C30CE75C0A2B0BA32A8DF7AF4A90B1 +PT=74AFD5F37F8F0712710585FB8DB22FF8 +CT=B1A4EE894A12794E0C1A286DDBC01CFD + +I=155 +KEY=E0732BA619DCF2F5D367E26E16185245AF30A59A748A8C4C +PT=B1A4EE894A12794E0C1A286DDBC01CFD +CT=0EA90279135DFFC7F58DB959F9E8BFE1 + +I=156 +KEY=AE8779E669BFF77EDDCEE0170545AD825ABD1CC38D6233AD +PT=0EA90279135DFFC7F58DB959F9E8BFE1 +CT=3717C67E520D87778350E62525C01730 + +I=157 +KEY=79D13142BE9066A2EAD9266957482AF5D9EDFAE6A8A2249D +PT=3717C67E520D87778350E62525C01730 +CT=A8F96DA7AE81EF8810A317AB4C9B82A9 + +I=158 +KEY=597D70828E56003942204BCEF9C9C57DC94EED4DE439A634 +PT=A8F96DA7AE81EF8810A317AB4C9B82A9 +CT=8C373A065986BAC9E345475F5D83FBCF + +I=159 +KEY=96C8CF3884D5DA18CE1771C8A04F7FB42A0BAA12B9BA5DFB +PT=8C373A065986BAC9E345475F5D83FBCF +CT=8E4D562CBEDC360EFB25B857DD4C4FF2 + +I=160 +KEY=5A0A29B58F17F9F9405A27E41E9349BAD12E124564F61209 +PT=8E4D562CBEDC360EFB25B857DD4C4FF2 +CT=192CCD79E3B4C8F5617D1F55B789B7A3 + +I=161 +KEY=29A4692EDE3EAABE5976EA9DFD27814FB0530D10D37FA5AA +PT=192CCD79E3B4C8F5617D1F55B789B7A3 +CT=8A5F181E1748C98121D1C22204591B23 + +I=162 +KEY=5E5CA30210E78677D329F283EA6F48CE9182CF32D726BE89 +PT=8A5F181E1748C98121D1C22204591B23 +CT=14512A4997094A0536594E63ACC5EF4A + +I=163 +KEY=7DA5F9C99B68DFB0C778D8CA7D6602CBA7DB81517BE351C3 +PT=14512A4997094A0536594E63ACC5EF4A +CT=F91BA751D5E2ADC074FC6CC14476DE67 + +I=164 +KEY=658144C57CCFDAD83E637F9BA884AF0BD327ED903F958FA4 +PT=F91BA751D5E2ADC074FC6CC14476DE67 +CT=5F7FED22BABA25D48C95C4E2CAEDB3F4 + +I=165 +KEY=13C5D7A44396F6FD611C92B9123E8ADF5FB22972F5783C50 +PT=5F7FED22BABA25D48C95C4E2CAEDB3F4 +CT=0FCFB3CB93B2E7FDF7E156486929BD17 + +I=166 +KEY=99DBAC1D5D268DB06ED32172818C6D22A8537F3A9C518147 +PT=0FCFB3CB93B2E7FDF7E156486929BD17 +CT=3E16265A02271FF68AE6310A6BFDEE60 + +I=167 +KEY=A8876A49E2F1CC5250C5072883AB72D422B54E30F7AC6F27 +PT=3E16265A02271FF68AE6310A6BFDEE60 +CT=1657BF722B57D083D8864B6447317E05 + +I=168 +KEY=0A615A71BC2BE3E94692B85AA8FCA257FA330554B09D1122 +PT=1657BF722B57D083D8864B6447317E05 +CT=018B742E941E27C547451B9E41F245F5 + +I=169 +KEY=6AE11571E3D54C4B4719CC743CE28592BD761ECAF16F54D7 +PT=018B742E941E27C547451B9E41F245F5 +CT=8C5BB61774502B6A9C44BEE8D6C44A63 + +I=170 +KEY=DCE75079013F0865CB427A6348B2AEF82132A02227AB1EB4 +PT=8C5BB61774502B6A9C44BEE8D6C44A63 +CT=361D3B51C751298194CB1AA32C0A86EE + +I=171 +KEY=E73232D50D457866FD5F41328FE38779B5F9BA810BA1985A +PT=361D3B51C751298194CB1AA32C0A86EE +CT=7B734F34DD4F332CBE5CFC7659C390BF + +I=172 +KEY=BEEF9073227655EB862C0E0652ACB4550BA546F7526208E5 +PT=7B734F34DD4F332CBE5CFC7659C390BF +CT=63CCC9CE5DADA5B5AC68870E6C675943 + +I=173 +KEY=1E9078C198526C1DE5E0C7C80F0111E0A7CDC1F93E0551A6 +PT=63CCC9CE5DADA5B5AC68870E6C675943 +CT=7BBC6F7B62807CBE1C93CADB5E6CAE0A + +I=174 +KEY=AD26AC70784FF1B99E5CA8B36D816D5EBB5E0B226069FFAC +PT=7BBC6F7B62807CBE1C93CADB5E6CAE0A +CT=E95B0C766EF9049163D3A249E196DDB8 + +I=175 +KEY=E17835A277F1D1EE7707A4C5037869CFD88DA96B81FF2214 +PT=E95B0C766EF9049163D3A249E196DDB8 +CT=968263CBCDB4582FC9CDFD0C9FD0B4F0 + +I=176 +KEY=22F9EB31E67C62DBE185C70ECECC31E0114054671E2F96E4 +PT=968263CBCDB4582FC9CDFD0C9FD0B4F0 +CT=9F573A339DFA07B844E4034718A4FE88 + +I=177 +KEY=0FEC8766966A42DA7ED2FD3D5336365855A45720068B686C +PT=9F573A339DFA07B844E4034718A4FE88 +CT=A0809BA3A742C0EB1BDA613B7472F56A + +I=178 +KEY=98E655519C9A8A95DE52669EF474F6B34E7E361B72F99D06 +PT=A0809BA3A742C0EB1BDA613B7472F56A +CT=9BF1D85440818035FA6AC36E5A5F00A7 + +I=179 +KEY=A8D37BE0EB386F8045A3BECAB4F57686B414F57528A69DA1 +PT=9BF1D85440818035FA6AC36E5A5F00A7 +CT=924E309AC04A655C50980360914E9830 + +I=180 +KEY=7D89F156EA181E92D7ED8E5074BF13DAE48CF615B9E80591 +PT=924E309AC04A655C50980360914E9830 +CT=427819CDAE419A046D4586FF5A784A1C + +I=181 +KEY=B028A265666F69629595979DDAFE89DE89C970EAE3904F8D +PT=427819CDAE419A046D4586FF5A784A1C +CT=D8B51EEC0A6A6D17F1E476C922AD8548 + +I=182 +KEY=DF20B45B990C5E734D208971D094E4C9782D0623C13DCAC5 +PT=D8B51EEC0A6A6D17F1E476C922AD8548 +CT=7823F1BBA96105168195CDAC34AB5315 + +I=183 +KEY=AF4C64F7E4AA6DE2350378CA79F5E1DFF9B8CB8FF59699D0 +PT=7823F1BBA96105168195CDAC34AB5315 +CT=85DD0256BC29EAA867DB77C1A049574D + +I=184 +KEY=4047F74604E37A00B0DE7A9CC5DC0B779E63BC4E55DFCE9D +PT=85DD0256BC29EAA867DB77C1A049574D +CT=64C1880D34408CB1A92BBA354941D5B6 + +I=185 +KEY=9C3BF36E47110C08D41FF291F19C87C63748067B1C9E1B2B +PT=64C1880D34408CB1A92BBA354941D5B6 +CT=25B80866FE3198C775F64C412E734348 + +I=186 +KEY=FAE7368F99242159F1A7FAF70FAD1F0142BE4A3A32ED5863 +PT=25B80866FE3198C775F64C412E734348 +CT=8D3D7E9A195363C96334C48120BC343A + +I=187 +KEY=5F48BD86A9C4DC897C9A846D16FE7CC8218A8EBB12516C59 +PT=8D3D7E9A195363C96334C48120BC343A +CT=E886EEA0F2D556D693DC94FFC588D1F4 + +I=188 +KEY=B7406993C120EA20941C6ACDE42B2A1EB2561A44D7D9BDAD +PT=E886EEA0F2D556D693DC94FFC588D1F4 +CT=76CB89CBB935D422DED9784D4548A84F + +I=189 +KEY=4DB740C3FA55F4ABE2D7E3065D1EFE3C6C8F6209929115E2 +PT=76CB89CBB935D422DED9784D4548A84F +CT=93D7AC7B18A1196D5C166203C44A43D3 + +I=190 +KEY=353A0293DEFB648071004F7D45BFE7513099000A56DB5631 +PT=93D7AC7B18A1196D5C166203C44A43D3 +CT=8982BD77485524EE9E49769591E922CE + +I=191 +KEY=F6FC1F7E838CD8A7F882F20A0DEAC3BFAED0769FC73274FF +PT=8982BD77485524EE9E49769591E922CE +CT=89012A1E3F7669C76C5F5F4987108662 + +I=192 +KEY=A1AA84E01EBC3E837183D814329CAA78C28F29D64022F29D +PT=89012A1E3F7669C76C5F5F4987108662 +CT=139E37ADA17990054AF8EF5B717E884B + +I=193 +KEY=C631229E9871F2AC621DEFB993E53A7D8877C68D315C7AD6 +PT=139E37ADA17990054AF8EF5B717E884B +CT=CEC8F9C90B2E393BDA4602C2A83F953C + +I=194 +KEY=824604723CD82F95ACD5167098CB03465231C44F9963EFEA +PT=CEC8F9C90B2E393BDA4602C2A83F953C +CT=2A2E1344AE4C6BA40568E170BF67FD74 + +I=195 +KEY=2B17489FA71F683B86FB0534368768E25759253F2604129E +PT=2A2E1344AE4C6BA40568E170BF67FD74 +CT=7402AC6982DBB0BED678746E4523556C + +I=196 +KEY=DA9C0CF5A89D3D94F2F9A95DB45CD85C81215151632747F2 +PT=7402AC6982DBB0BED678746E4523556C +CT=36A36B5B55F950F00B9F3E31156BFD65 + +I=197 +KEY=543619886B56830BC45AC206E1A588AC8ABE6F60764CBA97 +PT=36A36B5B55F950F00B9F3E31156BFD65 +CT=D7B36A117E824A49A5944C37BEE27F06 + +I=198 +KEY=9494630598E7618213E9A8179F27C2E52F2A2357C8AEC591 +PT=D7B36A117E824A49A5944C37BEE27F06 +CT=2D60BC0BC950EEE7E36D50E971CF68D0 + +I=199 +KEY=B0328218DF523A0C3E89141C56772C02CC4773BEB961AD41 +PT=2D60BC0BC950EEE7E36D50E971CF68D0 +CT=49A4643E535F45A1ABDEF41ABABBE268 + +I=200 +KEY=5E3FD7ACD8EF334D772D7022052869A3679987A403DA4F29 +PT=49A4643E535F45A1ABDEF41ABABBE268 +CT=D5EEB5CC40AF8612708BAABE85685E4C + +I=201 +KEY=A232D0267D606002A2C3C5EE4587EFB117122D1A86B21165 +PT=D5EEB5CC40AF8612708BAABE85685E4C +CT=3F5B875DE202C5441165FE5C5CA2D258 + +I=202 +KEY=844ED6FAFA342BFE9D9842B3A7852AF50677D346DA10C33D +PT=3F5B875DE202C5441165FE5C5CA2D258 +CT=9B5F0210E0EC623C6ACF1C0BC06EBF51 + +I=203 +KEY=109F8CEC689E0F5306C740A3476948C96CB8CF4D1A7E7C6C +PT=9B5F0210E0EC623C6ACF1C0BC06EBF51 +CT=E57015FAB0006446E544704DB6629059 + +I=204 +KEY=D9ABCBAC4B271B04E3B75559F7692C8F89FCBF00AC1CEC35 +PT=E57015FAB0006446E544704DB6629059 +CT=85F0DF6B1ED933E87F6A9F609D516346 + +I=205 +KEY=09915869AE1F57F766478A32E9B01F67F6962060314D8F73 +PT=85F0DF6B1ED933E87F6A9F609D516346 +CT=471B931539C155478A1D4B9BA50DCE43 + +I=206 +KEY=BFB70AA6C4F05C1D215C1927D0714A207C8B6BFB94404130 +PT=471B931539C155478A1D4B9BA50DCE43 +CT=9AC55C1CC77E7B59CC9204898A38CEA7 + +I=207 +KEY=660972D79B056F14BB99453B170F3179B0196F721E788F97 +PT=9AC55C1CC77E7B59CC9204898A38CEA7 +CT=19B00FEB13145F9F356173B42184D516 + +I=208 +KEY=F09576EB17FB1A07A2294AD0041B6EE685781CC63FFC5A81 +PT=19B00FEB13145F9F356173B42184D516 +CT=5F1379E25F6DD8653B73F58E738D6243 + +I=209 +KEY=8D170BBC5E3662BEFD3A33325B76B683BE0BE9484C7138C2 +PT=5F1379E25F6DD8653B73F58E738D6243 +CT=AEF55C09E7AD76CC9BA7B83874A0A86B + +I=210 +KEY=1A7BD2572D3CDB8C53CF6F3BBCDBC04F25AC517038D190A9 +PT=AEF55C09E7AD76CC9BA7B83874A0A86B +CT=6BEF52E6D86DC15D2A03B5CB3EBAB130 + +I=211 +KEY=B4BC0603F59BE3D038203DDD64B601120FAFE4BB066B2199 +PT=6BEF52E6D86DC15D2A03B5CB3EBAB130 +CT=FDC093FFED096B7812E77E23AD9C7C71 + +I=212 +KEY=C00A0DDA74D55250C5E0AE2289BF6A6A1D489A98ABF75DE8 +PT=FDC093FFED096B7812E77E23AD9C7C71 +CT=072625CB0C022827E195DE8AB4FE7E0C + +I=213 +KEY=6534CBAB46880CE0C2C68BE985BD424DFCDD44121F0923E4 +PT=072625CB0C022827E195DE8AB4FE7E0C +CT=11AA47C5557437AEE8A8BE31A849A047 + +I=214 +KEY=C204AFE794D81224D36CCC2CD0C975E31475FA23B74083A3 +PT=11AA47C5557437AEE8A8BE31A849A047 +CT=4C91B3031567DFFC22829CBC3C419B6D + +I=215 +KEY=01A4820CC4D281B99FFD7F2FC5AEAA1F36F7669F8B0118CE +PT=4C91B3031567DFFC22829CBC3C419B6D +CT=54C0F95B0179CB753917A2592F58BD77 + +I=216 +KEY=B5C1DD77446C8FD1CB3D8674C4D7616A0FE0C4C6A459A5B9 +PT=54C0F95B0179CB753917A2592F58BD77 +CT=A2A19A98250E432131F9EF4AE473677F + +I=217 +KEY=9FDC1167AC2D1A51699C1CECE1D9224B3E192B8C402AC2C6 +PT=A2A19A98250E432131F9EF4AE473677F +CT=9B5780CA9669A92688F54887E303F2D3 + +I=218 +KEY=C734A73F4A32D311F2CB9C2677B08B6DB6EC630BA3293015 +PT=9B5780CA9669A92688F54887E303F2D3 +CT=F1750745D1E74E41A07B99482ECABAAA + +I=219 +KEY=1612B86730F487EF03BE9B63A657C52C1697FA438DE38ABF +PT=F1750745D1E74E41A07B99482ECABAAA +CT=30F510DBDDAEC6FC0D2504C11DF23CFA + +I=220 +KEY=D52E3B50F72B085D334B8BB87BF903D01BB2FE829011B645 +PT=30F510DBDDAEC6FC0D2504C11DF23CFA +CT=64998C3018185D722477A2DBFB84ABB8 + +I=221 +KEY=7F9F2A23D320792E57D2078863E15EA23FC55C596B951DFD +PT=64998C3018185D722477A2DBFB84ABB8 +CT=9293A4FF9ED5D57D81BB8A63381BF66A + +I=222 +KEY=B529B6E7080E0AE4C541A377FD348BDFBE7ED63A538EEB97 +PT=9293A4FF9ED5D57D81BB8A63381BF66A +CT=A389ABCF609B41F28CC3188B2C126915 + +I=223 +KEY=A5C4C3A89459F79566C808B89DAFCA2D32BDCEB17F9C8282 +PT=A389ABCF609B41F28CC3188B2C126915 +CT=5F4BC60608A3DF788631EBB66763E7DF + +I=224 +KEY=F59456291C6CF0C83983CEBE950C1555B48C250718FF655D +PT=5F4BC60608A3DF788631EBB66763E7DF +CT=EFDE2113118EDFD5A15D4DFA1C1E79B4 + +I=225 +KEY=9A4CD87E44EA7DEED65DEFAD8482CA8015D168FD04E11CE9 +PT=EFDE2113118EDFD5A15D4DFA1C1E79B4 +CT=2526BA56DA8A9F9A5799A9D2BE96AEBA + +I=226 +KEY=A19D5DFAEC1C9B9DF37B55FB5E08551A4248C12FBA77B253 +PT=2526BA56DA8A9F9A5799A9D2BE96AEBA +CT=83F237712EF89A7B1E84D69DEFC9B9B9 + +I=227 +KEY=C48B0103470544867089628A70F0CF615CCC17B255BE0BEA +PT=83F237712EF89A7B1E84D69DEFC9B9B9 +CT=13B7E26895FEEFE2356306D8D822DDD3 + +I=228 +KEY=B366B0FE6BB3DB17633E80E2E50E208369AF116A8D9CD639 +PT=13B7E26895FEEFE2356306D8D822DDD3 +CT=BF8C47559B230A3311543BEAA90D4DA1 + +I=229 +KEY=BE5A735484B72645DCB2C7B77E2D2AB078FB2A8024919B98 +PT=BF8C47559B230A3311543BEAA90D4DA1 +CT=D3C9AFCED64F46AC74FFF73302DE10EB + +I=230 +KEY=1DFD852FE9F131840F7B6879A8626C1C0C04DDB3264F8B73 +PT=D3C9AFCED64F46AC74FFF73302DE10EB +CT=004386EABD8F3C60971D34B5A5F220F8 + +I=231 +KEY=BB9831D80259A5A40F38EE9315ED507C9B19E90683BDAB8B +PT=004386EABD8F3C60971D34B5A5F220F8 +CT=119A244F6A3ED1947A764CFE96568213 + +I=232 +KEY=93B0F09E78E610741EA2CADC7FD381E8E16FA5F815EB2998 +PT=119A244F6A3ED1947A764CFE96568213 +CT=4C8D061BD62737E674DDCACEFC37DA11 + +I=233 +KEY=43E5036A09590404522FCCC7A9F4B60E95B26F36E9DCF389 +PT=4C8D061BD62737E674DDCACEFC37DA11 +CT=7B5EFE44536B5AB9CF75A457BB8C2417 + +I=234 +KEY=869CF7BF36FBB5D829713283FA9FECB75AC7CB615250D79E +PT=7B5EFE44536B5AB9CF75A457BB8C2417 +CT=25771915A1C0F8149634963E1C91BD26 + +I=235 +KEY=C9BD373897A760E30C062B965B5F14A3CCF35D5F4EC16AB8 +PT=25771915A1C0F8149634963E1C91BD26 +CT=8BB2BC7E7BAAEA1AAF7A9E285BEEB8F1 + +I=236 +KEY=D2EE543EACA1592687B497E820F5FEB96389C377152FD249 +PT=8BB2BC7E7BAAEA1AAF7A9E285BEEB8F1 +CT=05556B6AB68D2DABCDB32FB724D44F57 + +I=237 +KEY=9583438F7194754F82E1FC829678D312AE3AECC031FB9D1E +PT=05556B6AB68D2DABCDB32FB724D44F57 +CT=A4CE8197B0EAE6AD57D5A0630D0CABD0 + +I=238 +KEY=A5B96A3EFB2EF0C7262F7D15269235BFF9EF4CA33CF736CE +PT=A4CE8197B0EAE6AD57D5A0630D0CABD0 +CT=8E40F09865AA8EA114EA7F36E11815C3 + +I=239 +KEY=8E7A04E47969F5DBA86F8D8D4338BB1EED053395DDEF230D +PT=8E40F09865AA8EA114EA7F36E11815C3 +CT=194A76947319ED92D96D292684C29B5A + +I=240 +KEY=E52197304B446A01B125FB193021568C34681AB3592DB857 +PT=194A76947319ED92D96D292684C29B5A +CT=93526BBB6405BDEA68AC01F1C807EBF7 + +I=241 +KEY=DA4552EC2C076DC3227790A25424EB665CC41B42912A53A0 +PT=93526BBB6405BDEA68AC01F1C807EBF7 +CT=59860971F900B739B36CB97D35B082D1 + +I=242 +KEY=E7329ED9491CA8227BF199D3AD245C5FEFA8A23FA49AD171 +PT=59860971F900B739B36CB97D35B082D1 +CT=92F430D5B1F35B469ECDDFDCB2A110F5 + +I=243 +KEY=1ADC19560D9AEF09E905A9061CD7071971657DE3163BC184 +PT=92F430D5B1F35B469ECDDFDCB2A110F5 +CT=F81D2505FD9A569A71502B23894DA535 + +I=244 +KEY=6ED932F2BEBD486911188C03E14D5183003556C09F7664B1 +PT=F81D2505FD9A569A71502B23894DA535 +CT=93BACD72A0E761D34E8603FC44F6BA5E + +I=245 +KEY=F0A52339F0C68F5782A2417141AA30504EB3553CDB80DEEF +PT=93BACD72A0E761D34E8603FC44F6BA5E +CT=631DB808708B5EBB54A2DE6B62519235 + +I=246 +KEY=0B262E7EA7109C03E1BFF97931216EEB1A118B57B9D14CDA +PT=631DB808708B5EBB54A2DE6B62519235 +CT=C402023DA5F2F230FEEACE1C5F8B5390 + +I=247 +KEY=1E7EB042CA0EA74F25BDFB4494D39CDBE4FB454BE65A1F4A +PT=C402023DA5F2F230FEEACE1C5F8B5390 +CT=CAD88E79E0AB4A3B324F6D3ABBEA211C + +I=248 +KEY=215E3E970705BE3DEF65753D7478D6E0D6B428715DB03E56 +PT=CAD88E79E0AB4A3B324F6D3ABBEA211C +CT=1B2303C4FEB78105B5BF35BC1C5C2FF9 + +I=249 +KEY=512CE443B55593D9F44676F98ACF57E5630B1DCD41EC11AF +PT=1B2303C4FEB78105B5BF35BC1C5C2FF9 +CT=06CAE1EED611AF829C83216697F8AEFA + +I=250 +KEY=533251960972B2BFF28C97175CDEF867FF883CABD614BF55 +PT=06CAE1EED611AF829C83216697F8AEFA +CT=170194A7E4E85B0A339BF86460E5ABC6 + +I=251 +KEY=B484A158FBC3D31FE58D03B0B836A36DCC13C4CFB6F11493 +PT=170194A7E4E85B0A339BF86460E5ABC6 +CT=AF7014D972F55B0CD759CAFBC0D9483B + +I=252 +KEY=C470759A6962C1934AFD1769CAC3F8611B4A0E3476285CA8 +PT=AF7014D972F55B0CD759CAFBC0D9483B +CT=E8BD547419DADD980682B701CCEF3C7E + +I=253 +KEY=D27A5BF9DD3B6F61A240431DD31925F91DC8B935BAC760D6 +PT=E8BD547419DADD980682B701CCEF3C7E +CT=E8F9CFAA891A471EBBC5806F03E0E18A + +I=254 +KEY=041C2FF776BAF2334AB98CB75A0362E7A60D395AB927815C +PT=E8F9CFAA891A471EBBC5806F03E0E18A +CT=F90F888C03CEBFC9A807DF2100488B24 + +I=255 +KEY=9BB4307835C91BA4B3B6043B59CDDD2E0E0AE67BB96F0A78 +PT=F90F888C03CEBFC9A807DF2100488B24 +CT=7874C642B44810334C2CF572DA0DEF68 + +I=256 +KEY=56E742B84F293B68CBC2C279ED85CD1D422613096362E510 +PT=7874C642B44810334C2CF572DA0DEF68 +CT=064513BBD5E667B651B93502E86B6C43 + +I=257 +KEY=66E28C26E01570FCCD87D1C23863AAAB139F260B8B098953 +PT=064513BBD5E667B651B93502E86B6C43 +CT=D461A03D7D8669BBC32430D00D437E59 + +I=258 +KEY=5674831937969B7619E671FF45E5C310D0BB16DB864AF70A +PT=D461A03D7D8669BBC32430D00D437E59 +CT=0A07F858DBD1909FF970C95ED7287FB3 + +I=259 +KEY=D45BCD0FF3E14A7013E189A79E34538F29CBDF85516288B9 +PT=0A07F858DBD1909FF970C95ED7287FB3 +CT=C2E45D29C1DF02CB4D768682ADD73E6B + +I=260 +KEY=40F81EBEF03AAAABD105D48E5FEB514464BD5907FCB5B6D2 +PT=C2E45D29C1DF02CB4D768682ADD73E6B +CT=01E21E496061DAC195F24F6D1CF22B8A + +I=261 +KEY=99C8875EE8221C3FD0E7CAC73F8A8B85F14F166AE0479D58 +PT=01E21E496061DAC195F24F6D1CF22B8A +CT=71D1C35E1126F6907CDB5414B8C97E84 + +I=262 +KEY=F1582613B3466D7FA13609992EAC7D158D94427E588EE3DC +PT=71D1C35E1126F6907CDB5414B8C97E84 +CT=8B7BBAF63C993D4BBB098A22D00C5608 + +I=263 +KEY=4679A2F69656CFD32A4DB36F1235405E369DC85C8882B5D4 +PT=8B7BBAF63C993D4BBB098A22D00C5608 +CT=651B19F5C1B67FC52151E7C5F1246485 + +I=264 +KEY=A404FC3490DFC7244F56AA9AD3833F9B17CC2F9979A6D151 +PT=651B19F5C1B67FC52151E7C5F1246485 +CT=158F0AE36B5585868DFB998520318FEB + +I=265 +KEY=F7DCCA4394981F2D5AD9A079B8D6BA1D9A37B61C59975EBA +PT=158F0AE36B5585868DFB998520318FEB +CT=B62EC94231405F3FB0D160FBFF2DE27E + +I=266 +KEY=1F38711C9B6BD060ECF7693B8996E5222AE6D6E7A6BABCC4 +PT=B62EC94231405F3FB0D160FBFF2DE27E +CT=464AFFA35373CEE71523FF0AFBFB1F51 + +I=267 +KEY=6B846AAC0C448654AABD9698DAE52BC53FC529ED5D41A395 +PT=464AFFA35373CEE71523FF0AFBFB1F51 +CT=C729EA9A05D5482491CE31DBBC03CE24 + +I=268 +KEY=BD539A9B4001B6876D947C02DF3063E1AE0B1836E1426DB1 +PT=C729EA9A05D5482491CE31DBBC03CE24 +CT=C755C048ADAD22A628B077163097415F + +I=269 +KEY=18B524EEF606589DAAC1BC4A729D414786BB6F20D1D52CEE +PT=C755C048ADAD22A628B077163097415F +CT=2DADB8F8FC76D8C997627449E44D14B2 + +I=270 +KEY=3C2C6A047706E3DD876C04B28EEB998E11D91B693598385C +PT=2DADB8F8FC76D8C997627449E44D14B2 +CT=2D7109526C2F1B5D08DD356B163498D7 + +I=271 +KEY=40593D776B6C5920AA1D0DE0E2C482D319042E0223ACA08B +PT=2D7109526C2F1B5D08DD356B163498D7 +CT=D9C1D988ABD5C892B2E5BA7BF4F584D3 + +I=272 +KEY=72B53E4711B3DE9873DCD46849114A41ABE19479D7592458 +PT=D9C1D988ABD5C892B2E5BA7BF4F584D3 +CT=0A32E78440A8AE4A3FF74B20A3F5F7DE + +I=273 +KEY=C0BEF126899B305B79EE33EC09B9E40B9416DF5974ACD386 +PT=0A32E78440A8AE4A3FF74B20A3F5F7DE +CT=E7AA36688851D8E4E08E9EFE6987C571 + +I=274 +KEY=D16257EFEE63CC399E44058481E83CEF749841A71D2B16F7 +PT=E7AA36688851D8E4E08E9EFE6987C571 +CT=0E3E2E99FFA84F8A69CAA897017DD09C + +I=275 +KEY=3509E5A7A66648B9907A2B1D7E4073651D52E9301C56C66B +PT=0E3E2E99FFA84F8A69CAA897017DD09C +CT=96766B7F6E78537994466BDC62607C85 + +I=276 +KEY=46BC3EB6FA22C8AC060C40621038201C891482EC7E36BAEE +PT=96766B7F6E78537994466BDC62607C85 +CT=AA42980BBABA21DACE6D9FCD28A5B0BA + +I=277 +KEY=26FC66C5E5C6E585AC4ED869AA8201C647791D2156930A54 +PT=AA42980BBABA21DACE6D9FCD28A5B0BA +CT=EC057F10222EC91403E1B6CEFCE3556A + +I=278 +KEY=91FBDF7B24B0FEB4404BA77988ACC8D24498ABEFAA705F3E +PT=EC057F10222EC91403E1B6CEFCE3556A +CT=E6E91EC6B977C3547D08F717F6702E80 + +I=279 +KEY=5BD8360BB35CE209A6A2B9BF31DB0B8639905CF85C0071BE +PT=E6E91EC6B977C3547D08F717F6702E80 +CT=DF9BE6A5A61CC4B66C76447202CBFADA + +I=280 +KEY=E58D0EFAB72342BD79395F1A97C7CF3055E6188A5ECB8B64 +PT=DF9BE6A5A61CC4B66C76447202CBFADA +CT=8466FA526E1038CC14A2EC6D85FC4EDF + +I=281 +KEY=7EB51DD43B05BB26FD5FA548F9D7F7FC4144F4E7DB37C5BB +PT=8466FA526E1038CC14A2EC6D85FC4EDF +CT=5C5A965E386B16D50F3487D54C04AA6B + +I=282 +KEY=8F4BEBA429FE57C4A1053316C1BCE1294E70733297336FD0 +PT=5C5A965E386B16D50F3487D54C04AA6B +CT=BCD57B57FAA6E3F81660113345CD24F9 + +I=283 +KEY=4A5DA421D27E62821DD048413B1A02D158106201D2FE4B29 +PT=BCD57B57FAA6E3F81660113345CD24F9 +CT=7450D38B3A6D8C4987EE3F7F71C68FFC + +I=284 +KEY=77934AE2BB39BC4469809BCA01778E98DFFE5D7EA338C4D5 +PT=7450D38B3A6D8C4987EE3F7F71C68FFC +CT=A6D1D5A31BAB1CE9F027376539B2AAE2 + +I=285 +KEY=2C6FD4455E96F2F6CF514E691ADC92712FD96A1B9A8A6E37 +PT=A6D1D5A31BAB1CE9F027376539B2AAE2 +CT=10894E2E6275D172259D4C23332508B9 + +I=286 +KEY=2608AB9AA8CED631DFD8004778A943030A442638A9AF668E +PT=10894E2E6275D172259D4C23332508B9 +CT=53C2AB8E42B4EF7FF659D3FB251453C7 + +I=287 +KEY=68840BD9639AC3128C1AABC93A1DAC7CFC1DF5C38CBB3549 +PT=53C2AB8E42B4EF7FF659D3FB251453C7 +CT=3A9C38D026561B83B0F3E7B566C66CD2 + +I=288 +KEY=EFCDF07C0E70D051B68693191C4BB7FF4CEE1276EA7D599B +PT=3A9C38D026561B83B0F3E7B566C66CD2 +CT=B9F7E495B96BE7C0307D8F7A53200193 + +I=289 +KEY=87DFC62793B45EF60F71778CA520503F7C939D0CB95D5808 +PT=B9F7E495B96BE7C0307D8F7A53200193 +CT=2425FE8AAA7ED06A5FFEC11D7B289891 + +I=290 +KEY=5FD78DA64A9F50142B5489060F5E8055236D5C11C275C099 +PT=2425FE8AAA7ED06A5FFEC11D7B289891 +CT=93BC83BCF69DBB256C27AF250FDEFAEB + +I=291 +KEY=81C88579E065FD16B8E80ABAF9C33B704F4AF334CDAB3A72 +PT=93BC83BCF69DBB256C27AF250FDEFAEB +CT=A1AF953D4BD1A474B1173D4686EBB8CF + +I=292 +KEY=DEE7FFE9A3814D2B19479F87B2129F04FE5DCE724B4082BD +PT=A1AF953D4BD1A474B1173D4686EBB8CF +CT=00AAC1CD74952011A03714A6BB091653 + +I=293 +KEY=8331CC8136829F1E19ED5E4AC687BF155E6ADAD4F04994EE +PT=00AAC1CD74952011A03714A6BB091653 +CT=00B92CBFFC3589CEB3ECAA7D221C3F0B + +I=294 +KEY=FF862EBFECC11E93195472F53AB236DBED8670A9D255ABE5 +PT=00B92CBFFC3589CEB3ECAA7D221C3F0B +CT=2E07858E94AD300A35448EFA848A767A + +I=295 +KEY=18B8678C5497708E3753F77BAE1F06D1D8C2FE5356DFDD9F +PT=2E07858E94AD300A35448EFA848A767A +CT=B02F0C98F3B7BB7807F35F6DFD925238 + +I=296 +KEY=C90D1E18331CA38F877CFBE35DA8BDA9DF31A13EAB4D8FA7 +PT=B02F0C98F3B7BB7807F35F6DFD925238 +CT=EAACC8624146D29129ED8B904E89F04A + +I=297 +KEY=A08AD721EE869F2E6DD033811CEE6F38F6DC2AAEE5C47FED +PT=EAACC8624146D29129ED8B904E89F04A +CT=8949A5A4289B65A32C5116E8A4B55A50 + +I=298 +KEY=CED3055CB1AC48CAE499962534750A9BDA8D3C46417125BD +PT=8949A5A4289B65A32C5116E8A4B55A50 +CT=B632C5FD8EB9676B5504A8BA13E63E2D + +I=299 +KEY=AD1DA883EFFC2F3052AB53D8BACC6DF08F8994FC52971B90 +PT=B632C5FD8EB9676B5504A8BA13E63E2D +CT=EF28A1297C07A575686B3429AC9B62D1 + +I=300 +KEY=007F57339EC932CCBD83F2F1C6CBC885E7E2A0D5FE0C7941 +PT=EF28A1297C07A575686B3429AC9B62D1 +CT=C99F15E4000944120D1C3DD283D99BFF + +I=301 +KEY=3688FDD4FD7822F2741CE715C6C28C97EAFE9D077DD5E2BE +PT=C99F15E4000944120D1C3DD283D99BFF +CT=0AC0219E2BD43F9F19F3A0997FCB9FCD + +I=302 +KEY=AB54BF259C6F5CEE7EDCC68BED16B308F30D3D9E021E7D73 +PT=0AC0219E2BD43F9F19F3A0997FCB9FCD +CT=E27242BC80823BDC09C33C1BDB2EA3BE + +I=303 +KEY=9C88F101B483F8399CAE84376D9488D4FACE0185D930DECD +PT=E27242BC80823BDC09C33C1BDB2EA3BE +CT=7ABF9BD872F54E12FB7F0B11A6D10472 + +I=304 +KEY=971A26707E5B8BC2E6111FEF1F61C6C601B10A947FE1DABF +PT=7ABF9BD872F54E12FB7F0B11A6D10472 +CT=336653E5166F1B4146DBEAED74D72BB7 + +I=305 +KEY=1FFD085658F88F24D5774C0A090EDD87476AE0790B36F108 +PT=336653E5166F1B4146DBEAED74D72BB7 +CT=4849136D0509CE6C404E5685FBEEE9B8 + +I=306 +KEY=411DF55702805FE69D3E5F670C0713EB0724B6FCF0D818B0 +PT=4849136D0509CE6C404E5685FBEEE9B8 +CT=6CF8DCFD53E2ED214A449398D8BF0F6C + +I=307 +KEY=504BFF39E24E870FF1C6839A5FE5FECA4D602564286717DC +PT=6CF8DCFD53E2ED214A449398D8BF0F6C +CT=9C8326B89B3054A46ECA3BB76BC2F292 + +I=308 +KEY=E4F4B55125D2D1056D45A522C4D5AA6E23AA1ED343A5E54E +PT=9C8326B89B3054A46ECA3BB76BC2F292 +CT=C85479C9E038BA5495F67D6E8B2BEB64 + +I=309 +KEY=F2E9B605207E0FD4A511DCEB24ED103AB65C63BDC88E0E2A +PT=C85479C9E038BA5495F67D6E8B2BEB64 +CT=145607ACFFA06C08AB958DCB7BC0BDBC + +I=310 +KEY=CC0D3F478519145BB147DB47DB4D7C321DC9EE76B34EB396 +PT=145607ACFFA06C08AB958DCB7BC0BDBC +CT=ED7EE0DA132D9964BE5E7B2581C3C270 + +I=311 +KEY=EB3AFCDD9AAB59705C393B9DC860E556A3979553328D71E6 +PT=ED7EE0DA132D9964BE5E7B2581C3C270 +CT=6B576FD09F34ED38774AA383BB88B385 + +I=312 +KEY=866ECC1B3691532D376E544D5754086ED4DD36D08905C263 +PT=6B576FD09F34ED38774AA383BB88B385 +CT=E540518151453A18C29BE22B5DE84D5B + +I=313 +KEY=2B3BF12A0A10E6F9D22E05CC061132761646D4FBD4ED8F38 +PT=E540518151453A18C29BE22B5DE84D5B +CT=7865DE74099D486ECB584BE7890F3078 + +I=314 +KEY=3C6EA741634001E0AA4BDBB80F8C7A18DD1E9F1C5DE2BF40 +PT=7865DE74099D486ECB584BE7890F3078 +CT=5226B72FA16653187980D265EB6C7C6D + +I=315 +KEY=A32E19E0F06CB649F86D6C97AEEA2900A49E4D79B68EC32D +PT=5226B72FA16653187980D265EB6C7C6D +CT=CA0D39D92B042BECABF7A14115B3A307 + +I=316 +KEY=E48451707115D4A03260554E85EE02EC0F69EC38A33D602A +PT=CA0D39D92B042BECABF7A14115B3A307 +CT=EC1658D60F1D94EF514FA8EDADAB3C1D + +I=317 +KEY=89A589616229672BDE760D988AF396035E2644D50E965C37 +PT=EC1658D60F1D94EF514FA8EDADAB3C1D +CT=F278CD13BF2C6A1F2D9A9F0C1113205D + +I=318 +KEY=6013E84EFD076E402C0EC08B35DFFC1C73BCDBD91F857C6A +PT=F278CD13BF2C6A1F2D9A9F0C1113205D +CT=0B1A35F604DDB043BCD0573DC0850AF0 + +I=319 +KEY=68BCE1DC00C592E22714F57D31024C5FCF6C8CE4DF00769A +PT=0B1A35F604DDB043BCD0573DC0850AF0 +CT=EAC4FE6F8A04871AC434322CB06308E3 + +I=320 +KEY=1BE682363F216340CDD00B12BB06CB450B58BEC86F637E79 +PT=EAC4FE6F8A04871AC434322CB06308E3 +CT=64B6BA31C6B15BE040DC2C0A07FFE60F + +I=321 +KEY=2082C6C0D49B4DECA966B1237DB790A54B8492C2689C9876 +PT=64B6BA31C6B15BE040DC2C0A07FFE60F +CT=5ECDC37FEA4176145C6A308F91659D43 + +I=322 +KEY=23668EEA68987F8CF7AB725C97F6E6B117EEA24DF9F90535 +PT=5ECDC37FEA4176145C6A308F91659D43 +CT=BB25C81945A062A7D53531593D9910F6 + +I=323 +KEY=10B544566773DD5F4C8EBA45D2568416C2DB9314C46015C3 +PT=BB25C81945A062A7D53531593D9910F6 +CT=48D98FFFC4E378D42CFC785B53DFC38D + +I=324 +KEY=7F96DD27E1C0B7B7045735BA16B5FCC2EE27EB4F97BFD64E +PT=48D98FFFC4E378D42CFC785B53DFC38D +CT=7DCE20BAE8345CB68103461B4AFA9F09 + +I=325 +KEY=A73354FC47570B2679991500FE81A0746F24AD54DD454947 +PT=7DCE20BAE8345CB68103461B4AFA9F09 +CT=099B315B4DD55CAB5D02163154DA521C + +I=326 +KEY=92A57B873A1D292F7002245BB354FCDF3226BB65899F1B5B +PT=099B315B4DD55CAB5D02163154DA521C +CT=37207C17099989D3EA0D13DBD6DF7FEF + +I=327 +KEY=7048AF52E1763E8E4722584CBACD750CD82BA8BE5F4064B4 +PT=37207C17099989D3EA0D13DBD6DF7FEF +CT=7CE37081A6751A1518F03B70FBC1479D + +I=328 +KEY=24E37AF6A4BC72403BC128CD1CB86F19C0DB93CEA4812329 +PT=7CE37081A6751A1518F03B70FBC1479D +CT=201BBD8456F70ED0BB4E19A7AE36F1A6 + +I=329 +KEY=17E541A643CB8EE01BDA95494A4F61C97B958A690AB7D28F +PT=201BBD8456F70ED0BB4E19A7AE36F1A6 +CT=3384168E4F022049B0E3AD6899B71DC9 + +I=330 +KEY=31D5A160B61690A0285E83C7054D4180CB7627019300CF46 +PT=3384168E4F022049B0E3AD6899B71DC9 +CT=C83AA6AE617CB17E2977D394EBC4AD19 + +I=331 +KEY=6EBA775B83D704AAE06425696431F0FEE201F49578C4625F +PT=C83AA6AE617CB17E2977D394EBC4AD19 +CT=8AC467890AF8E729C7A86A471ADEB378 + +I=332 +KEY=C1237F715488582E6AA042E06EC917D725A99ED2621AD127 +PT=8AC467890AF8E729C7A86A471ADEB378 +CT=B89CE4F733A9D67C8E504BC4BC2F7664 + +I=333 +KEY=0A9E4BDAD3E856F1D23CA6175D60C1ABABF9D516DE35A743 +PT=B89CE4F733A9D67C8E504BC4BC2F7664 +CT=47B421469B794A5188255ACE84D89721 + +I=334 +KEY=4BE367B885F7AF9195888751C6198BFA23DC8FD85AED3062 +PT=47B421469B794A5188255ACE84D89721 +CT=B6B09DBF9E62C60951368C9C8B63A860 + +I=335 +KEY=CDFB62995E4C5D4E23381AEE587B4DF372EA0344D18E9802 +PT=B6B09DBF9E62C60951368C9C8B63A860 +CT=68933B4BD0BC23EB3178347DFE68E7F6 + +I=336 +KEY=8887EBF40DE51F064BAB21A588C76E18439237392FE67FF4 +PT=68933B4BD0BC23EB3178347DFE68E7F6 +CT=C6F16CDDF00C982A927609B559B0BCBD + +I=337 +KEY=221D949B8CA9F4C48D5A4D7878CBF632D1E43E8C7656C349 +PT=C6F16CDDF00C982A927609B559B0BCBD +CT=CBEE831F7623E3214E72AF57706525C7 + +I=338 +KEY=3D35666DACEFF3C846B4CE670EE815139F9691DB0633E68E +PT=CBEE831F7623E3214E72AF57706525C7 +CT=DFE0297AE9B69F0AD69D6189C1447333 + +I=339 +KEY=43370C9C958216DC9954E71DE75E8A19490BF052C77795BD +PT=DFE0297AE9B69F0AD69D6189C1447333 +CT=59C3B4D6055B9F73064B715CD5213C99 + +I=340 +KEY=DF43233D68EE5C4AC09753CBE205156A4F40810E1256A924 +PT=59C3B4D6055B9F73064B715CD5213C99 +CT=5373F13BB16B3653FCC138FC9A9E8A47 + +I=341 +KEY=472E0A65B06B4F4693E4A2F0536E2339B381B9F288C82363 +PT=5373F13BB16B3653FCC138FC9A9E8A47 +CT=9C7514B7FEDF2DC26B0C2C1954745077 + +I=342 +KEY=1409E4DF955583A00F91B647ADB10EFBD88D95EBDCBC7314 +PT=9C7514B7FEDF2DC26B0C2C1954745077 +CT=2480D7C35D6B0207D84A9CEFA1C2CFDC + +I=343 +KEY=458552CAB6B1A8AC2B116184F0DA0CFC00C709047D7EBCC8 +PT=2480D7C35D6B0207D84A9CEFA1C2CFDC +CT=46DE3E51F1355FA76652C8DA3642409B + +I=344 +KEY=2065D6F033E1EE2E6DCF5FD501EF535B6695C1DE4B3CFC53 +PT=46DE3E51F1355FA76652C8DA3642409B +CT=13F328173D057A64DA3917468528DB4F + +I=345 +KEY=6D30053E2C95BC5A7E3C77C23CEA293FBCACD698CE14271C +PT=13F328173D057A64DA3917468528DB4F +CT=33D71B6CD0A68B685C89C9F2D70FDFCE + +I=346 +KEY=59D69C2D25BFB6A34DEB6CAEEC4CA257E0251F6A191BF8D2 +PT=33D71B6CD0A68B685C89C9F2D70FDFCE +CT=8E9F57B5E945CD7DFC2B9FCD5AF96DFB + +I=347 +KEY=F41ABD021E5C144EC3743B1B05096F2A1C0E80A743E29529 +PT=8E9F57B5E945CD7DFC2B9FCD5AF96DFB +CT=71295B41B9E5872E1BD4D5C3C4C62D71 + +I=348 +KEY=41C1194732CD4654B25D605ABCECE80407DA55648724B858 +PT=71295B41B9E5872E1BD4D5C3C4C62D71 +CT=E704FBBAA917788CE906A54B2A56A232 + +I=349 +KEY=AF58932371569CE655599BE015FB9088EEDCF02FAD721A6A +PT=E704FBBAA917788CE906A54B2A56A232 +CT=8DBA56CF3E019B8EA80CCB772551CA5B + +I=350 +KEY=B1E68A05A144F4FAD8E3CD2F2BFA0B0646D03B588823D031 +PT=8DBA56CF3E019B8EA80CCB772551CA5B +CT=18F8A23F785AFEFC4ECD527AC6DBE609 + +I=351 +KEY=456D39FF40B1622BC01B6F1053A0F5FA081D69224EF83638 +PT=18F8A23F785AFEFC4ECD527AC6DBE609 +CT=073F93A707D6B9A82E99990CB13BD00E + +I=352 +KEY=1FF446993B6927C6C724FCB754764C522684F02EFFC3E636 +PT=073F93A707D6B9A82E99990CB13BD00E +CT=76723E1239356EDC37FB5E1EAFDF4678 + +I=353 +KEY=0DED89E36C3B06B9B156C2A56D43228E117FAE30501CA04E +PT=76723E1239356EDC37FB5E1EAFDF4678 +CT=1B57D35B4E2484D3945B82D59114A531 + +I=354 +KEY=E433448EB970D64FAA0111FE2367A65D85242CE5C108057F +PT=1B57D35B4E2484D3945B82D59114A531 +CT=4466DCB75F6B83885EE32D9FD533A902 + +I=355 +KEY=3751EC4737F029E3EE67CD497C0C25D5DBC7017A143BAC7D +PT=4466DCB75F6B83885EE32D9FD533A902 +CT=A8B62B9FCAA9331A3282899DB475AADE + +I=356 +KEY=6C1042FACD259CC346D1E6D6B6A516CFE94588E7A04E06A3 +PT=A8B62B9FCAA9331A3282899DB475AADE +CT=DFE1CB42B29F119E44F37F60A8C2BD7C + +I=357 +KEY=640D2DB3E708999A99302D94043A0751ADB6F787088CBBDF +PT=DFE1CB42B29F119E44F37F60A8C2BD7C +CT=891B211EE1BEA05AD7BA478FDFEBC507 + +I=358 +KEY=C434FF9BD02BDF6C102B0C8AE584A70B7A0CB008D7677ED8 +PT=891B211EE1BEA05AD7BA478FDFEBC507 +CT=16ABB92A1E0F433250C551F84AE177CF + +I=359 +KEY=22A76DAFC8A7748E0680B5A0FB8BE4392AC9E1F09D860917 +PT=16ABB92A1E0F433250C551F84AE177CF +CT=1A2F4BF6ED0CADB7FA3FC52F3C6AF191 + +I=360 +KEY=5DDEDF839CF5C0D11CAFFE561687498ED0F624DFA1ECF886 +PT=1A2F4BF6ED0CADB7FA3FC52F3C6AF191 +CT=16AE687EE38FB85C0F70E20F5585F750 + +I=361 +KEY=13D0157C6A30C26C0A019628F508F1D2DF86C6D0F4690FD6 +PT=16AE687EE38FB85C0F70E20F5585F750 +CT=6CD2D70F641B2A7814014177C4880107 + +I=362 +KEY=6DBFF188E61696C966D341279113DBAACB8787A730E10ED1 +PT=6CD2D70F641B2A7814014177C4880107 +CT=8CAD28041AE53AA64CE0173DBD9046C2 + +I=363 +KEY=44A13B269C44F018EA7E69238BF6E10C8767909A8D714813 +PT=8CAD28041AE53AA64CE0173DBD9046C2 +CT=FC8D4274BA1EF15CC39E750DD1848F7B + +I=364 +KEY=B7A8311B81A3B82C16F32B5731E8105044F9E5975CF5C768 +PT=FC8D4274BA1EF15CC39E750DD1848F7B +CT=01CBDAEAADE486CF655401D8F7F7E84E + +I=365 +KEY=A3AC668823C917DE1738F1BD9C0C969F21ADE44FAB022F26 +PT=01CBDAEAADE486CF655401D8F7F7E84E +CT=494C3219700E06EE9C4DCB61EF932FDF + +I=366 +KEY=05CC07DC3CBB1A4B5E74C3A4EC029071BDE02F2E449100F9 +PT=494C3219700E06EE9C4DCB61EF932FDF +CT=BB0E7D5CD93B1839DF5CAED7996F9560 + +I=367 +KEY=8768468EFC3CE954E57ABEF83539884862BC81F9DDFE9599 +PT=BB0E7D5CD93B1839DF5CAED7996F9560 +CT=CC1F9A504A67C24621ED127C63AE2A36 + +I=368 +KEY=470E251F98662CEC296524A87F5E4A0E43519385BE50BFAF +PT=CC1F9A504A67C24621ED127C63AE2A36 +CT=A48D3751956B71F925680073B35BC0A3 + +I=369 +KEY=533C67C061CE6B9E8DE813F9EA353BF7663993F60D0B7F0C +PT=A48D3751956B71F925680073B35BC0A3 +CT=80143AC021E94718146EBC7808A9DDD8 + +I=370 +KEY=0303563B9274349D0DFC2939CBDC7CEF72572F8E05A2A2D4 +PT=80143AC021E94718146EBC7808A9DDD8 +CT=B90AC6ADEE1B60228096D022EE5C681B + +I=371 +KEY=1E7D3A52CC112BDCB4F6EF9425C71CCDF2C1FFACEBFECACF +PT=B90AC6ADEE1B60228096D022EE5C681B +CT=CB8553B21250642107E824E8FB27CAEA + +I=372 +KEY=750A36009059323E7F73BC26379778ECF529DB4410D90025 +PT=CB8553B21250642107E824E8FB27CAEA +CT=9C86DA9646FCFEA7E778A5498F50E01E + +I=373 +KEY=6876C614C460B02CE3F566B0716B864B12517E0D9F89E03B +PT=9C86DA9646FCFEA7E778A5498F50E01E +CT=1481357AD5690762FD6F3809F1E5F219 + +I=374 +KEY=7CE6B00F6B651FAEF77453CAA4028129EF3E46046E6C1222 +PT=1481357AD5690762FD6F3809F1E5F219 +CT=39B64998D4370E0CB47C1DC23EDCDD03 + +I=375 +KEY=C3F72A84EF6F4A0CCEC21A5270358F255B425BC650B0CF21 +PT=39B64998D4370E0CB47C1DC23EDCDD03 +CT=EB1BA96272D7BB044A3381439BA4CD5B + +I=376 +KEY=C670185A26E7DA4A25D9B33002E234211171DA85CB14027A +PT=EB1BA96272D7BB044A3381439BA4CD5B +CT=F87EC3D7F55DA25790718E461BA2E194 + +I=377 +KEY=72ECF820AC459D8DDDA770E7F7BF9676810054C3D0B6E3EE +PT=F87EC3D7F55DA25790718E461BA2E194 +CT=AD7EA1621AD7FBA975D6BB0AB9AED116 + +I=378 +KEY=CE4ECAD1C7D17D1170D9D185ED686DDFF4D6EFC9691832F8 +PT=AD7EA1621AD7FBA975D6BB0AB9AED116 +CT=473B6484F6EAE1FC837A2710AE8D462F + +I=379 +KEY=3273752C9A8682F237E2B5011B828C2377ACC8D9C79574D7 +PT=473B6484F6EAE1FC837A2710AE8D462F +CT=0E3634529E49692762F4D80333738045 + +I=380 +KEY=8C2CFBB98A4E5E3839D4815385CBE504155810DAF4E6F492 +PT=0E3634529E49692762F4D80333738045 +CT=F8EFEBD78C115CC620F25AB66038F2A0 + +I=381 +KEY=0416DBCAFA0850D8C13B6A8409DAB9C235AA4A6C94DE0632 +PT=F8EFEBD78C115CC620F25AB66038F2A0 +CT=B4442C38E3B8E87D8AAE2C17A5571CE9 + +I=382 +KEY=7A7815A748696E99757F46BCEA6251BFBF04667B31891ADB +PT=B4442C38E3B8E87D8AAE2C17A5571CE9 +CT=576A20E194015AB069D769FCA7D842FC + +I=383 +KEY=3848903CD019B4572215665D7E630B0FD6D30F8796515827 +PT=576A20E194015AB069D769FCA7D842FC +CT=E253D9FB4075B021DF452B3AD51204D6 + +I=384 +KEY=3E468D281DF03284C046BFA63E16BB2E099624BD43435CF1 +PT=E253D9FB4075B021DF452B3AD51204D6 +CT=D9454AE62207E70A34F13B0063498A8F + +I=385 +KEY=860E4E60B132A8851903F5401C115C243D671FBD200AD67E +PT=D9454AE62207E70A34F13B0063498A8F +CT=A21F7DA8A298670D631F677D23504757 + +I=386 +KEY=27B82EDF5FFD15DDBB1C88E8BE893B295E7878C0035A9129 +PT=A21F7DA8A298670D631F677D23504757 +CT=1D239EFBABD09A029FE11C59A385C909 + +I=387 +KEY=631BCB74800FD13AA63F16131559A12BC1996499A0DF5820 +PT=1D239EFBABD09A029FE11C59A385C909 +CT=C87EB2AB019AFA608BE99CE77717B333 + +I=388 +KEY=EE1326871289985E6E41A4B814C35B4B4A70F87ED7C8EB13 +PT=C87EB2AB019AFA608BE99CE77717B333 +CT=528DBF70307431E33815D1AA44C30FA8 + +I=389 +KEY=F1D72A84C2FE044F3CCC1BC824B76AA8726529D4930BE4BB +PT=528DBF70307431E33815D1AA44C30FA8 +CT=6C8014B427ED6331A5C174CF2846B70A + +I=390 +KEY=A1610602C8DD2836504C0F7C035A0999D7A45D1BBB4D53B1 +PT=6C8014B427ED6331A5C174CF2846B70A +CT=3DF4C4BE003A13030E73026F7027ADB1 + +I=391 +KEY=B2418E725A1435DD6DB8CBC203601A9AD9D75F74CB6AFE00 +PT=3DF4C4BE003A13030E73026F7027ADB1 +CT=39C50365300DCC5B47F827054879C642 + +I=392 +KEY=761AF29E74671706547DC8A7336DD6C19E2F787183133842 +PT=39C50365300DCC5B47F827054879C642 +CT=847F488B3CEC2E1E4E1C6B9F37E4F631 + +I=393 +KEY=C912116E7B47169AD002802C0F81F8DFD03313EEB4F7CE73 +PT=847F488B3CEC2E1E4E1C6B9F37E4F631 +CT=9A581179C883C5E057CC560A3DF6CD34 + +I=394 +KEY=B08B1226353C6BD34A5A9155C7023D3F87FF45E489010347 +PT=9A581179C883C5E057CC560A3DF6CD34 +CT=799B437C3EF3663EFBD6F186EDFDF21A + +I=395 +KEY=1ECAE821E161A2C833C1D229F9F15B017C29B46264FCF15D +PT=799B437C3EF3663EFBD6F186EDFDF21A +CT=138A858B14FE28D9A47C76BB3FAE9AA1 + +I=396 +KEY=3AD2B951E451EEA8204B57A2ED0F73D8D855C2D95B526BFC +PT=138A858B14FE28D9A47C76BB3FAE9AA1 +CT=5E35BC76C5AC8765A6C396DFE5689579 + +I=397 +KEY=791E5F91477E986E7E7EEBD428A3F4BD7E965406BE3AFE85 +PT=5E35BC76C5AC8765A6C396DFE5689579 +CT=53F8361BF47A82EF27492322BA6F57AD + +I=398 +KEY=194A170B3D4FA6E62D86DDCFDCD9765259DF77240455A928 +PT=53F8361BF47A82EF27492322BA6F57AD +CT=FF626D77AE144C11480610EC1ABB5028 + +I=399 +KEY=C9DC82F000187721D2E4B0B872CD3A4311D967C81EEEF900 +PT=FF626D77AE144C11480610EC1ABB5028 +CT=4E46F8C5092B29E29A971A0CD1F610FB + +========================= + +KEYSIZE=256 + +I=0 +KEY=0000000000000000000000000000000000000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=8B79EECC93A0EE5DFF30B4EA21636DA4 + +I=1 +KEY=AD3965683E6FA98B5F38AC26653679288B79EECC93A0EE5DFF30B4EA21636DA4 +PT=8B79EECC93A0EE5DFF30B4EA21636DA4 +CT=C737317FE0846F132B23C8C2A672CE22 + +I=2 +KEY=28E79E2AFC5F7745FCCABE2F6257C2EF4C4EDFB37324814ED4137C288711A386 +PT=C737317FE0846F132B23C8C2A672CE22 +CT=E58B82BFBA53C0040DC610C642121168 + +I=3 +KEY=0721E93EACF9DC6C870D8133376B7C0DA9C55D0CC977414AD9D56CEEC503B2EE +PT=E58B82BFBA53C0040DC610C642121168 +CT=10B296ABB40504995DB71DDA0B7E26FB + +I=4 +KEY=0ECE1E210ADA32EBC497AD50F516602EB977CBA77D7245D384627134CE7D9415 +PT=10B296ABB40504995DB71DDA0B7E26FB +CT=B7198D8E88BAA25234C18517E99BB70D + +I=5 +KEY=D31313ACD90A9BB7D6596DEAB752003F0E6E4629F5C8E781B0A3F42327E62318 +PT=B7198D8E88BAA25234C18517E99BB70D +CT=6125097DB5738C64513E125872EA436C + +I=6 +KEY=488B6A78D9AA23FEA7289E250928BDE36F4B4F5440BB6BE5E19DE67B550C6074 +PT=6125097DB5738C64513E125872EA436C +CT=07FF2ED24B522F1E31D46E94BE5C505B + +I=7 +KEY=03DDD56B142AD3B0E4FFD2BAC6568E5468B461860BE944FBD04988EFEB50302F +PT=07FF2ED24B522F1E31D46E94BE5C505B +CT=EB3C1E3328F840B110E934B0129F2F23 + +I=8 +KEY=20F9D92C65B2F00183464197B23BE5AF83887FB52311044AC0A0BC5FF9CF1F0C +PT=EB3C1E3328F840B110E934B0129F2F23 +CT=107CB7B403DC3F6F09EC30EC1718D183 + +I=9 +KEY=79CF0BCF8EFE3DE82E27778923D1AA1993F4C80120CD3B25C94C8CB3EED7CE8F +PT=107CB7B403DC3F6F09EC30EC1718D183 +CT=CE9DB77B1FAE0CFEC5341FA5AF4CDE8A + +I=10 +KEY=F50ADABA26525BFA7BF6EEF2402450785D697F7A3F6337DB0C789316419B1005 +PT=CE9DB77B1FAE0CFEC5341FA5AF4CDE8A +CT=157B5946862DA3E9A1A83E45857E207D + +I=11 +KEY=3B6947995411D0AE50645129D13BACC04812263CB94E9432ADD0AD53C4E53078 +PT=157B5946862DA3E9A1A83E45857E207D +CT=4AE3583491DF78918CAB3AC241286855 + +I=12 +KEY=AAD12F02F5E5681D16236B668EF2C46702F17E082891ECA3217B979185CD582D +PT=4AE3583491DF78918CAB3AC241286855 +CT=05400C32DC84F1AB486A9BADB1415B50 + +I=13 +KEY=EA02EB82D4B2112DD3BD64C1C908CEC307B1723AF4151D0869110C3C348C037D +PT=05400C32DC84F1AB486A9BADB1415B50 +CT=E4C0781A2EA68D142504739731EF396E + +I=14 +KEY=D51A1846DFEB738F0AF138F74C968DCCE3710A20DAB3901C4C157FAB05633A13 +PT=E4C0781A2EA68D142504739731EF396E +CT=44CC8A9C84E6AD66BD24F1EE1F925EC3 + +I=15 +KEY=B6401DFC35AF21E53CD254431CC639E9A7BD80BC5E553D7AF1318E451AF164D0 +PT=44CC8A9C84E6AD66BD24F1EE1F925EC3 +CT=20AF5FDDF65856D1A60ADC03567AE163 + +I=16 +KEY=D1D2E8B5644910077B3EDB245F029C0D8712DF61A80D6BAB573B52464C8B85B3 +PT=20AF5FDDF65856D1A60ADC03567AE163 +CT=CEB74DD6FBEAFDCEE54930D58AF22ACA + +I=17 +KEY=9F932DC2AB83FA5153E7081E7360ABB449A592B753E79665B2726293C679AF79 +PT=CEB74DD6FBEAFDCEE54930D58AF22ACA +CT=72FB3F7BBBDBA9C036C94531A32E937D + +I=18 +KEY=06AABCA83922297791C9D07AEB639BDD3B5EADCCE83C3FA584BB27A265573C04 +PT=72FB3F7BBBDBA9C036C94531A32E937D +CT=299B26D5D6DFA2C20824D8A84E98A244 + +I=19 +KEY=6124BC71768DE5E9C14D37915D90F1AE12C58B193EE39D678C9FFF0A2BCF9E40 +PT=299B26D5D6DFA2C20824D8A84E98A244 +CT=0A35C0D4170BDE0258D79B668C7C98F4 + +I=20 +KEY=282B067BD441670E11E576F26C4EA67D18F04BCD29E84365D448646CA7B306B4 +PT=0A35C0D4170BDE0258D79B668C7C98F4 +CT=F4E3E981FFC8B50FC9146B85A22E71D4 + +I=21 +KEY=2864E2A3986F99C55EC21C225E3498ECEC13A24CD620F66A1D5C0FE9059D7760 +PT=F4E3E981FFC8B50FC9146B85A22E71D4 +CT=130ACF4CEAFE3277DF057D4D170582ED + +I=22 +KEY=600FD4DFD03132B0DB7B2432DBE027C2FF196D003CDEC41DC25972A41298F58D +PT=130ACF4CEAFE3277DF057D4D170582ED +CT=50001D54F2EA5EAA3BE2206F3845D9A9 + +I=23 +KEY=C1CBE3A1679D6C1913EABE3400993100AF197054CE349AB7F9BB52CB2ADD2C24 +PT=50001D54F2EA5EAA3BE2206F3845D9A9 +CT=69F3EE4B230B2DB2492FE0E36B949154 + +I=24 +KEY=7C6C63E14606A0B09254A531CACB45A0C6EA9E1FED3FB705B094B2284149BD70 +PT=69F3EE4B230B2DB2492FE0E36B949154 +CT=CEEE40F3D2FD9A5521F44AD3AB55198D + +I=25 +KEY=22BB6E21BCA0450240DB117B028837AF0804DEEC3FC22D509160F8FBEA1CA4FD +PT=CEEE40F3D2FD9A5521F44AD3AB55198D +CT=1FA1F1AE7BF2A8C66A6ED6D5F276846B + +I=26 +KEY=7364D9AE40CBB0CCA6640B7E542DBA2617A52F4244308596FB0E2E2E186A2096 +PT=1FA1F1AE7BF2A8C66A6ED6D5F276846B +CT=6D5BD8391C73507D57B902AB3D58D228 + +I=27 +KEY=A2D8BF7602FCD22755ADA9979B2DD33B7AFEF77B5843D5EBACB72C852532F2BE +PT=6D5BD8391C73507D57B902AB3D58D228 +CT=15ACD05539318363F275C857FBC5D86C + +I=28 +KEY=3AD56A33CE89D8D3510C4152DEE734126F52272E617256885EC2E4D2DEF72AD2 +PT=15ACD05539318363F275C857FBC5D86C +CT=B54F8D944301A899A2A88440FE8AB631 + +I=29 +KEY=13ED08137C66C2000D3FE9E167387864DA1DAABA2273FE11FC6A6092207D9CE3 +PT=B54F8D944301A899A2A88440FE8AB631 +CT=23B4BF936BF383325F0DAF0548E32851 + +I=30 +KEY=3C2C53CCDB4721F44B6C057BF758361AF9A9152949807D23A367CF97689EB4B2 +PT=23B4BF936BF383325F0DAF0548E32851 +CT=8B4984C6F39C7FD543B4A8629EAC6740 + +I=31 +KEY=95E744B66044529E2DC2B06BF84FF3D672E091EFBA1C02F6E0D367F5F632D3F2 +PT=8B4984C6F39C7FD543B4A8629EAC6740 +CT=108834058381578E8AA7988E03942230 + +I=32 +KEY=E7715B09238876A93F9858D9548CBEA56268A5EA399D55786A74FF7BF5A6F1C2 +PT=108834058381578E8AA7988E03942230 +CT=EE3974A2ECEA5A1E6FC09535323BFF29 + +I=33 +KEY=08F25145082684F576933E4DF5C63DFE8C51D148D5770F6605B46A4EC79D0EEB +PT=EE3974A2ECEA5A1E6FC09535323BFF29 +CT=1AC80F42E3529BCA587D4EA828BD3631 + +I=34 +KEY=93D63C9069B415595934FA66C76A9CD09699DE0A362594AC5DC924E6EF2038DA +PT=1AC80F42E3529BCA587D4EA828BD3631 +CT=E196DF1E8A0DE844EBD3FD84B307EEB6 + +I=35 +KEY=0F5E4A3907A7BC56AAC2CB6F6871674C770F0114BC287CE8B61AD9625C27D66C +PT=E196DF1E8A0DE844EBD3FD84B307EEB6 +CT=917AC29C88967EE5C792E72B046A4399 + +I=36 +KEY=B935C42A3A93D1E45E94CBE1E232A135E675C38834BE020D71883E49584D95F5 +PT=917AC29C88967EE5C792E72B046A4399 +CT=9CE3D545895005F3EC432699F17FFDA2 + +I=37 +KEY=CC3C0DCF9E6E91BE48B7F7AE251D1CB37A9616CDBDEE07FE9DCB18D0A9326857 +PT=9CE3D545895005F3EC432699F17FFDA2 +CT=089F0D41397E27B04D3268834ADF932C + +I=38 +KEY=29AB63D0AB0E237BA75D250BC67E362472091B8C8490204ED0F97053E3EDFB7B +PT=089F0D41397E27B04D3268834ADF932C +CT=9C364B0CC209389C00824505226B8989 + +I=39 +KEY=7FB99ABACCC92D9C8B17CC0066F02F39EE3F5080469918D2D07B3556C18672F2 +PT=9C364B0CC209389C00824505226B8989 +CT=767FB14493BE17A29839FBF115B9B38B + +I=40 +KEY=DB08EEBD184AEEB002302A3C41E5595B9840E1C4D5270F704842CEA7D43FC179 +PT=767FB14493BE17A29839FBF115B9B38B +CT=CBEC5B7FB05D673C19EBF0F4B647CDB5 + +I=41 +KEY=F7C517C27F319857F1D9DA5D29B6B76353ACBABB657A684C51A93E5362780CCC +PT=CBEC5B7FB05D673C19EBF0F4B647CDB5 +CT=9721CB9555EF079ADD547D8DE09CC0C7 + +I=42 +KEY=47D5164E15743853C8B0E55ED3A965D6C48D712E30956FD68CFD43DE82E4CC0B +PT=9721CB9555EF079ADD547D8DE09CC0C7 +CT=5B16109122E874A08A2A48D5B5753256 + +I=43 +KEY=152E7EF1B0FAD417DA84B4FA0AB560DB9F9B61BF127D1B7606D70B0B3791FE5D +PT=5B16109122E874A08A2A48D5B5753256 +CT=198A9B7C41C225334176614A16F1D7CB + +I=44 +KEY=81BB271A9F0CE56E452C9FBE4CF09FF88611FAC353BF3E4547A16A4121602996 +PT=198A9B7C41C225334176614A16F1D7CB +CT=56E255DB999AFA713020C4E987F4433B + +I=45 +KEY=A654ABA71B351BCBFD1CB03B5F88CE1AD0F3AF18CA25C4347781AEA8A6946AAD +PT=56E255DB999AFA713020C4E987F4433B +CT=7BF8470233D197839D4FC1B365E79C8D + +I=46 +KEY=C700B39660C3C72E15E278B2D22DD528AB0BE81AF9F453B7EACE6F1BC373F620 +PT=7BF8470233D197839D4FC1B365E79C8D +CT=D7CDF94CBBE5E7EF7E47E4CE9BD5E073 + +I=47 +KEY=C49B1589810F1915998C8C79CA2382D87CC611564211B45894898BD558A61653 +PT=D7CDF94CBBE5E7EF7E47E4CE9BD5E073 +CT=A5617B71AF28E732A0B69BFA3B90F291 + +I=48 +KEY=D37A9390FD2C8D4D01704352BAFC2EE2D9A76A27ED39536A343F102F6336E4C2 +PT=A5617B71AF28E732A0B69BFA3B90F291 +CT=156D08F6A2AC3F7202DBEE15D53C8BCD + +I=49 +KEY=E4E2958608635DF83B8E39FD503356D5CCCA62D14F956C1836E4FE3AB60A6F0F +PT=156D08F6A2AC3F7202DBEE15D53C8BCD +CT=1790CB4B9B4E01F4CA3AAB588A3B7A51 + +I=50 +KEY=B0F77AF53FB1FAF66A421093111DC925DB5AA99AD4DB6DECFCDE55623C31155E +PT=1790CB4B9B4E01F4CA3AAB588A3B7A51 +CT=5E2DC515FE9BAE8F16188DC052C63A80 + +I=51 +KEY=487CA8ECBA3E2CAF61A16285005F01F685776C8F2A40C363EAC6D8A26EF72FDE +PT=5E2DC515FE9BAE8F16188DC052C63A80 +CT=A625E46D2DA293F536D25C9207090AA5 + +I=52 +KEY=410909F6119DDA628537B825D24E8DF9235288E207E25096DC14843069FE257B +PT=A625E46D2DA293F536D25C9207090AA5 +CT=FEFCF38ABD12EAAD37F3AE73BC4B4A8C + +I=53 +KEY=F1027D98B61D2F383BCF60A83D317D03DDAE7B68BAF0BA3BEBE72A43D5B56FF7 +PT=FEFCF38ABD12EAAD37F3AE73BC4B4A8C +CT=76D8221C2AAD44D226C769875A93CDA8 + +I=54 +KEY=DDA104019F122286887545C85F6B09B1AB765974905DFEE9CD2043C48F26A25F +PT=76D8221C2AAD44D226C769875A93CDA8 +CT=DE7FBEB010089D7EE0A1BD18F3461AEE + +I=55 +KEY=46CE686778BA955831B63F2ACFE397747509E7C4805563972D81FEDC7C60B8B1 +PT=DE7FBEB010089D7EE0A1BD18F3461AEE +CT=A8B0824BD1FC52D92AFA0B4B23ABDEBD + +I=56 +KEY=EF1408D365E549B808DADADE3D4CBCDADDB9658F51A9314E077BF5975FCB660C +PT=A8B0824BD1FC52D92AFA0B4B23ABDEBD +CT=93AC85EE8DE4091894F0E1800A0DF443 + +I=57 +KEY=8E8FC86B7F82A57799FE32DD1C748C8D4E15E061DC4D3856938B141755C6924F +PT=93AC85EE8DE4091894F0E1800A0DF443 +CT=0FAE963D9B74341316D7EA8862D0766F + +I=58 +KEY=D3900458ABB1ACCE0707A49565D27C4C41BB765C47390C45855CFE9F3716E420 +PT=0FAE963D9B74341316D7EA8862D0766F +CT=37930DFBC771510D0BBDCBFAB2A5852F + +I=59 +KEY=C55EE2F5633DE3E7EF3710C6C143AA7076287BA780485D488EE1356585B3610F +PT=37930DFBC771510D0BBDCBFAB2A5852F +CT=9C3B82D06CB9378F6CBBF6325B456A8B + +I=60 +KEY=AA16073435B24614EB1E9AE81FD921F0EA13F977ECF16AC7E25AC357DEF60B84 +PT=9C3B82D06CB9378F6CBBF6325B456A8B +CT=2DB135F2599323714B4D0E66562FAF48 + +I=61 +KEY=033F102BFB13F9F84A4E9FC0C6F52AC8C7A2CC85B56249B6A917CD3188D9A4CC +PT=2DB135F2599323714B4D0E66562FAF48 +CT=130D64DC60EE70F07F6A68F26A9B5E19 + +I=62 +KEY=60D36FD89196DB13031E829B54615707D4AFA859D58C3946D67DA5C3E242FAD5 +PT=130D64DC60EE70F07F6A68F26A9B5E19 +CT=E4E5C4A1E2A0DC99EEC583E311824371 + +I=63 +KEY=532BC273D1843EB5CC1DE01D28684454304A6CF8372CE5DF38B82620F3C0B9A4 +PT=E4E5C4A1E2A0DC99EEC583E311824371 +CT=72CCE240749A6BFD0A93CDCBE2589B41 + +I=64 +KEY=DAE91111E43D9DF4A0F44C27A6B1AB0842868EB843B68E22322BEBEB119822E5 +PT=72CCE240749A6BFD0A93CDCBE2589B41 +CT=300F85629B48F47444D2AA51EBAAD16C + +I=65 +KEY=5C7C95B43BEA70F20A5C490F9A9F716372890BDAD8FE7A5676F941BAFA32F389 +PT=300F85629B48F47444D2AA51EBAAD16C +CT=89278608A583E1243704B39AB9C0F30C + +I=66 +KEY=5B64FDB468399A031D5745325331C2E8FBAE8DD27D7D9B7241FDF22043F20085 +PT=89278608A583E1243704B39AB9C0F30C +CT=71B74D5FAA4558A59F3BC91AA564579A + +I=67 +KEY=0166230CCF036B4B22C63D36F71C3CF58A19C08DD738C3D7DEC63B3AE696571F +PT=71B74D5FAA4558A59F3BC91AA564579A +CT=7B433C70951E4BD140FF7A0CBF367429 + +I=68 +KEY=D7A12389D7DD5DE963841B344315ADF9F15AFCFD422688069E39413659A02336 +PT=7B433C70951E4BD140FF7A0CBF367429 +CT=B0BE67EBCD672549AF03D323AF026FFF + +I=69 +KEY=A3EC2E92C58FE150F708C6FAEB1F459E41E49B168F41AD4F313A9215F6A24CC9 +PT=B0BE67EBCD672549AF03D323AF026FFF +CT=99A829A7C5C7CD6A44C7EABA9A5421C7 + +I=70 +KEY=CC3F7485BF8460CB1EA0AA3C20553644D84CB2B14A86602575FD78AF6CF66D0E +PT=99A829A7C5C7CD6A44C7EABA9A5421C7 +CT=76E1A70AF79F89CFE68EAF15DC0E9BC5 + +I=71 +KEY=17DC64F06B3A2941A21AE58E2FFAB363AEAD15BBBD19E9EA9373D7BAB0F8F6CB +PT=76E1A70AF79F89CFE68EAF15DC0E9BC5 +CT=DB0805B5DCC1CA2CA7489C8E1237E7A2 + +I=72 +KEY=DC7128E894C9DA167D0ACED5888F846275A5100E61D823C6343B4B34A2CF1169 +PT=DB0805B5DCC1CA2CA7489C8E1237E7A2 +CT=935D409B87A85A2CFCC09DE3D2A9A294 + +I=73 +KEY=8073895C9316D299F4F32C602F2F2616E6F85095E67079EAC8FBD6D77066B3FD +PT=935D409B87A85A2CFCC09DE3D2A9A294 +CT=F22B73EFF24249CBCB31BDC7C126B735 + +I=74 +KEY=99E16793433652800ABAD7000638560914D3237A1432302103CA6B10B14004C8 +PT=F22B73EFF24249CBCB31BDC7C126B735 +CT=A16A380AE9B3F2B0AE39BB0E24BF7C0A + +I=75 +KEY=8F77C5E97DA567CC447B52F45175BC74B5B91B70FD81C291ADF3D01E95FF78C2 +PT=A16A380AE9B3F2B0AE39BB0E24BF7C0A +CT=9CF088DE60AE87687481C9F217E86A7C + +I=76 +KEY=DA1B3C2C424D2BC6A1C7A3D18D41C3F5294993AE9D2F45F9D97219EC821712BE +PT=9CF088DE60AE87687481C9F217E86A7C +CT=1C8B68951E65E32E77F1A31571351C1B + +I=77 +KEY=3D64F3D4BF8F585917273805AA43DCD735C2FB3B834AA6D7AE83BAF9F3220EA5 +PT=1C8B68951E65E32E77F1A31571351C1B +CT=4AD3F3B0C15D810F0EA0FF62C6B2D0FE + +I=78 +KEY=51D61FB1B31EB55C7AA2D918E7BE32A97F11088B421727D8A023459B3590DE5B +PT=4AD3F3B0C15D810F0EA0FF62C6B2D0FE +CT=0DFCF7CA661572E050C522AE554A4BF8 + +I=79 +KEY=B93510F7689FB9856194CF629EF63AAA72EDFF4124025538F0E6673560DA95A3 +PT=0DFCF7CA661572E050C522AE554A4BF8 +CT=7C185A5A68675DAC7A16C8DDE4B8CF8B + +I=80 +KEY=8496679D7598A1B91D2F221CF958F90B0EF5A51B4C6508948AF0AFE884625A28 +PT=7C185A5A68675DAC7A16C8DDE4B8CF8B +CT=88FDDDA7BC2B09E48598A94474C64DC7 + +I=81 +KEY=F27BCC0F919566675B129C526A4DC796860878BCF04E01700F6806ACF0A417EF +PT=88FDDDA7BC2B09E48598A94474C64DC7 +CT=35C5C98C9C774D0BE9EFFB55C90B2F9C + +I=82 +KEY=05F12B58DBF5602D31CFD0EB10313502B3CDB1306C394C7BE687FDF939AF3873 +PT=35C5C98C9C774D0BE9EFFB55C90B2F9C +CT=C3374B5C81646AC881F0F924C22A723B + +I=83 +KEY=FD05BE617555BC8184C2F46911C46B9E70FAFA6CED5D26B3677704DDFB854A48 +PT=C3374B5C81646AC881F0F924C22A723B +CT=0CE756792AF27525A088700DB66D4399 + +I=84 +KEY=3831345DFA5ADDF7CE8B5F76B5E1EBDE7C1DAC15C7AF5396C7FF74D04DE809D1 +PT=0CE756792AF27525A088700DB66D4399 +CT=401CD076E03C108A7FD79651407923E9 + +I=85 +KEY=B101FDD95C23BE560262D355E09FC39B3C017C632793431CB828E2810D912A38 +PT=401CD076E03C108A7FD79651407923E9 +CT=88614E46C416E5164F2A63CDA9DD7B89 + +I=86 +KEY=0B53859962A79D216E395830E36F8D45B4603225E385A60AF702814CA44C51B1 +PT=88614E46C416E5164F2A63CDA9DD7B89 +CT=7411856C8F14A2E5F6C5F1830302A66F + +I=87 +KEY=FE07E3B8961C2A1B3E34A50F8CFA1A45C071B7496C9104EF01C770CFA74EF7DE +PT=7411856C8F14A2E5F6C5F1830302A66F +CT=B0A815E93EBAC7A68F8BB420C8A5692D + +I=88 +KEY=9F2E0D3DB033B1929009D6C4C460B24F70D9A2A0522BC3498E4CC4EF6FEB9EF3 +PT=B0A815E93EBAC7A68F8BB420C8A5692D +CT=AA6D27BB26275F5CB3EC3D6A8AFB80BF + +I=89 +KEY=5E903EF160161E1CA79A26D28FE32175DAB4851B740C9C153DA0F985E5101E4C +PT=AA6D27BB26275F5CB3EC3D6A8AFB80BF +CT=EAF7941A7E5D3907B6F52C1106EED2CE + +I=90 +KEY=60284EF35A9246CC32002028E4969309304311010A51A5128B55D594E3FECC82 +PT=EAF7941A7E5D3907B6F52C1106EED2CE +CT=1178DD3DBDB1810E360E6FE09AA0D75C + +I=91 +KEY=300CB519F3203AD4589749651BD99AC7213BCC3CB7E0241CBD5BBA74795E1BDE +PT=1178DD3DBDB1810E360E6FE09AA0D75C +CT=584B48263DE541E93B29C6E570D4A6F4 + +I=92 +KEY=2F79EA55D0E3EAF1D0DBD364A7D64E2A7970841A8A0565F586727C91098ABD2A +PT=584B48263DE541E93B29C6E570D4A6F4 +CT=7B2EC27F2F1BC24EAD4FC0AA0519685C + +I=93 +KEY=8B46F59BF2C4B226523C203E8FD3936D025E4665A51EA7BB2B3DBC3B0C93D576 +PT=7B2EC27F2F1BC24EAD4FC0AA0519685C +CT=13404D003576493EBB36C07C6D16A1B6 + +I=94 +KEY=C7E75C30B0CE770A0075E3EBEB244811111E0B659068EE85900B7C47618574C0 +PT=13404D003576493EBB36C07C6D16A1B6 +CT=A083421A139DF68C8F863B337F3408BE + +I=95 +KEY=A957F876769BE9005DCEE4B7514FAC62B19D497F83F518091F8D47741EB17C7E +PT=A083421A139DF68C8F863B337F3408BE +CT=BF86650C9ECBD6C14B420FBE6B6E488B + +I=96 +KEY=FD4DE7532652D17C5ACCEA759C52A95C0E1B2C731D3ECEC854CF48CA75DF34F5 +PT=BF86650C9ECBD6C14B420FBE6B6E488B +CT=75CEFAE872574AB6F26B0CAF6F08D858 + +I=97 +KEY=54DBCDC0A57363DE6B3A032607E968C27BD5D69B6F69847EA6A444651AD7ECAD +PT=75CEFAE872574AB6F26B0CAF6F08D858 +CT=8A3F9C96598883E9D3760C8A8FE406C6 + +I=98 +KEY=AC10312E365401908F2C8AE371CB8C90F1EA4A0D36E1079775D248EF9533EA6B +PT=8A3F9C96598883E9D3760C8A8FE406C6 +CT=B8B372C0CC6D164F340DF26B8F832DF8 + +I=99 +KEY=64265CF02043C966C01DF5255F8D2867495938CDFA8C11D841DFBA841AB0C793 +PT=B8B372C0CC6D164F340DF26B8F832DF8 +CT=A7F6267A6F0CEB0EF7D07959EE065760 + +I=100 +KEY=CF6B88FB273B247B8D64B5A323EF5760EEAF1EB79580FAD6B60FC3DDF4B690F3 +PT=A7F6267A6F0CEB0EF7D07959EE065760 +CT=AD96ADAC9B786AB78B1B46D9E026C935 + +I=101 +KEY=4C8EEA35A90CB46AF32235997D2ADBBE4339B31B0EF890613D148504149059C6 +PT=AD96ADAC9B786AB78B1B46D9E026C935 +CT=FC7BAC9A5F64571AABF4B0A451C8D88D + +I=102 +KEY=0DD6D30191FABEC371CF0BA223BECF19BF421F81519CC77B96E035A04558814B +PT=FC7BAC9A5F64571AABF4B0A451C8D88D +CT=2B56E363834F27090FAC8061507A4787 + +I=103 +KEY=2E69324E634312611C33F695A137AFE49414FCE2D2D3E072994CB5C11522C6CC +PT=2B56E363834F27090FAC8061507A4787 +CT=FD37886E30CEFA28F8E8A5662A9EC5DC + +I=104 +KEY=8AFAC0C1507472CCB28B37CA88B7139D6923748CE21D1A5A61A410A73FBC0310 +PT=FD37886E30CEFA28F8E8A5662A9EC5DC +CT=F7F36142C000D5162F789C392971FCE7 + +I=105 +KEY=7DC5DA2A80219692F9F26C5934826DF29ED015CE221DCF4C4EDC8C9E16CDFFF7 +PT=F7F36142C000D5162F789C392971FCE7 +CT=D560607A0F0BE8320F2CEE56B155163F + +I=106 +KEY=3CC9AE3E3EB90B511C6D8CD74419D6944BB075B42D16277E41F062C8A798E9C8 +PT=D560607A0F0BE8320F2CEE56B155163F +CT=708133FEB47A226A616900D46FA85037 + +I=107 +KEY=8B84B7F96F9B3184D5B6402ECAE344CB3B31464A996C05142099621CC830B9FF +PT=708133FEB47A226A616900D46FA85037 +CT=1B2ED9348FC7A4E4AD8BFCE2A148D1AD + +I=108 +KEY=655CB7606D17582441247D23E222ECCF201F9F7E16ABA1F08D129EFE69786852 +PT=1B2ED9348FC7A4E4AD8BFCE2A148D1AD +CT=B2B726C8605A6F5CBA97F04E85A1F985 + +I=109 +KEY=E0BA77DAAD3E3502AB9A6CEBEC654D0492A8B9B676F1CEAC37856EB0ECD991D7 +PT=B2B726C8605A6F5CBA97F04E85A1F985 +CT=CD7F53BB4AEB364A1D8630E0B5C4A6A2 + +I=110 +KEY=1470D5E493B0E8212F02D4419C46A8CD5FD7EA0D3C1AF8E62A035E50591D3775 +PT=CD7F53BB4AEB364A1D8630E0B5C4A6A2 +CT=57271A960FE2170BA3F1987E694BBD16 + +I=111 +KEY=415408E88421573F93FDBE25DD4B90C208F0F09B33F8EFED89F2C62E30568A63 +PT=57271A960FE2170BA3F1987E694BBD16 +CT=E9D47C3E926475FFDB783624C3ADB17B + +I=112 +KEY=40B3017DC81EEE4BF652AE8BB8CEED1DE1248CA5A19C9A12528AF00AF3FB3B18 +PT=E9D47C3E926475FFDB783624C3ADB17B +CT=D78F96812BB55723E04BE8818C262485 + +I=113 +KEY=9EABE9B3608ACE61684BAD3F3FED5C9736AB1A248A29CD31B2C1188B7FDD1F9D +PT=D78F96812BB55723E04BE8818C262485 +CT=E2092227E1A3D2E525942090DA0A3F3E + +I=114 +KEY=B095E4F38E060016EBC4C42D3A4EFBD6D4A238036B8A1FD49755381BA5D720A3 +PT=E2092227E1A3D2E525942090DA0A3F3E +CT=95E9EE1F56A65FF85B752FC300F525AE + +I=115 +KEY=9B2841F44291552EA04DE13E4E78011B414BD61C3D2C402CCC2017D8A522050D +PT=95E9EE1F56A65FF85B752FC300F525AE +CT=32D8465F2E11A04F8984FEE8E710CD25 + +I=116 +KEY=67D8B10D0DDB61932E610EB077F0D85F73939043133DE06345A4E9304232C828 +PT=32D8465F2E11A04F8984FEE8E710CD25 +CT=2D9803ECFB95B2591FE56B3CBB4307F2 + +I=117 +KEY=B0C80A38EDE23A549EF08E5DC3CEA2F25E0B93AFE8A8523A5A41820CF971CFDA +PT=2D9803ECFB95B2591FE56B3CBB4307F2 +CT=4B19F9BCAFD471BF9014ADA19891E4E6 + +I=118 +KEY=85C6DF29F9AEBA6087E3746BA5CF6C1515126A13477C2385CA552FAD61E02B3C +PT=4B19F9BCAFD471BF9014ADA19891E4E6 +CT=53159BC4FBD06FD03ABAC028A536C4A0 + +I=119 +KEY=2D42BE0B33D92ECC40DF48CF0AE0CB764607F1D7BCAC4C55F0EFEF85C4D6EF9C +PT=53159BC4FBD06FD03ABAC028A536C4A0 +CT=BCDB1347ACD50D0084D588D4540420E3 + +I=120 +KEY=338A4DC6E729E6FCF71095BB4E6F52FEFADCE29010794155743A675190D2CF7F +PT=BCDB1347ACD50D0084D588D4540420E3 +CT=E12DC82E79554E1202DA471C3221A554 + +I=121 +KEY=47597486437CBCD33FC195C56FF972BB1BF12ABE692C0F4776E0204DA2F36A2B +PT=E12DC82E79554E1202DA471C3221A554 +CT=23A43E9D6F7C5A6C842233CCEC120EB9 + +I=122 +KEY=CEE8CF713EBF0C609E3429E5183014BB385514230650552BF2C213814EE16492 +PT=23A43E9D6F7C5A6C842233CCEC120EB9 +CT=9F3F4349BF98D3CC00DB167F0FFDC7AB + +I=123 +KEY=C9B3A1CAFA0D4F0DA942C17FFB75E333A76A576AB9C886E7F21905FE411CA339 +PT=9F3F4349BF98D3CC00DB167F0FFDC7AB +CT=C4D8B8EBEF311C11FE2404220EA65E99 + +I=124 +KEY=8360E6F464B61C4BAE31D3A72422128463B2EF8156F99AF60C3D01DC4FBAFDA0 +PT=C4D8B8EBEF311C11FE2404220EA65E99 +CT=47E3318C721E6C094763F0A18042911D + +I=125 +KEY=926B00B9767D0CAD5331CD6F0343C4A92451DE0D24E7F6FF4B5EF17DCFF86CBD +PT=47E3318C721E6C094763F0A18042911D +CT=D709FA9A1415B0FAC71B4CF52504791F + +I=126 +KEY=3F4349126EF6A51FD196742CB461D01EF358249730F246058C45BD88EAFC15A2 +PT=D709FA9A1415B0FAC71B4CF52504791F +CT=7937DD067DDB85F200A492E5824DA23C + +I=127 +KEY=4420ADF6906CFBF8421524E88517327C8A6FF9914D29C3F78CE12F6D68B1B79E +PT=7937DD067DDB85F200A492E5824DA23C +CT=B68617F1372847206BA088D7100334A4 + +I=128 +KEY=125BEB5234B89A376ABBB2185F24BDDE3CE9EE607A0184D7E741A7BA78B2833A +PT=B68617F1372847206BA088D7100334A4 +CT=390938BA9F2264484DE63D8003C15369 + +I=129 +KEY=A457831AB172D88111E87C3955D0C0F205E0D6DAE523E09FAAA79A3A7B73D053 +PT=390938BA9F2264484DE63D8003C15369 +CT=A69ED32FD728337A5C25FBC2230DC788 + +I=130 +KEY=CC7ED4183BFAE0FA0F9DD348B8E194F2A37E05F5320BD3E5F68261F8587E17DB +PT=A69ED32FD728337A5C25FBC2230DC788 +CT=EDB9D6099202FE4AE51EEC725478FB47 + +I=131 +KEY=686AB4F5C19296AED306ADEA4FD52D1A4EC7D3FCA0092DAF139C8D8A0C06EC9C +PT=EDB9D6099202FE4AE51EEC725478FB47 +CT=61059EA3BF0C953762CB37E50ED7081F + +I=132 +KEY=8115329FADEBA92AB2827BD7701A01442FC24D5F1F05B8987157BA6F02D1E483 +PT=61059EA3BF0C953762CB37E50ED7081F +CT=A683E36EF7CCDABDBCA683C2D6560D25 + +I=133 +KEY=49254E8904EED2766A6A1A615B63B97C8941AE31E8C96225CDF139ADD487E9A6 +PT=A683E36EF7CCDABDBCA683C2D6560D25 +CT=8EF424771561BFEC0058C7CAA5876EF6 + +I=134 +KEY=259194CE8701581012F5592B61BCA99507B58A46FDA8DDC9CDA9FE6771008750 +PT=8EF424771561BFEC0058C7CAA5876EF6 +CT=79AC024A7BA5FFE143D40D34F2E587A6 + +I=135 +KEY=CA0427FE28C77D0CA25D6851CCFE58C47E19880C860D22288E7DF35383E500F6 +PT=79AC024A7BA5FFE143D40D34F2E587A6 +CT=2258AB9F0E254CE21EB9B7F6EA690671 + +I=136 +KEY=DA9A4B566C9F670DF850F891A5274CC95C41239388286ECA90C444A5698C0687 +PT=2258AB9F0E254CE21EB9B7F6EA690671 +CT=55ACB73E8A45BF964BD040C799724DAD + +I=137 +KEY=9F177A6A6B524C75DB5CC0DBB6AD733209ED94AD026DD15CDB140462F0FE4B2A +PT=55ACB73E8A45BF964BD040C799724DAD +CT=3E904B15F2E5DDC934DABC25259CB3CF + +I=138 +KEY=2AD96F6874C1BA6A82C5EE80A9A2E8E5377DDFB8F0880C95EFCEB847D562F8E5 +PT=3E904B15F2E5DDC934DABC25259CB3CF +CT=3ACFF8D5B701A5BD1355DDA705D269CB + +I=139 +KEY=ADD59DF57CC01DE988C6D81E65B1D00E0DB2276D4789A928FC9B65E0D0B0912E +PT=3ACFF8D5B701A5BD1355DDA705D269CB +CT=3EF4AC14CC954FB4A9A808C7C00A2F1F + +I=140 +KEY=D3EBE43C4E9C96B37133F6AF8910A25F33468B798B1CE69C55336D2710BABE31 +PT=3EF4AC14CC954FB4A9A808C7C00A2F1F +CT=61C50D5C736AEDCF03C06FC310CC19D9 + +I=141 +KEY=FA45F434377F2E217C4A5B7A7526CC1952838625F8760B5356F302E40076A7E8 +PT=61C50D5C736AEDCF03C06FC310CC19D9 +CT=2BF543C6548ED0344262640AD95F95C9 + +I=142 +KEY=71EAD73C81ED5AE731D19B0B2B42F0E87976C5E3ACF8DB67149166EED9293221 +PT=2BF543C6548ED0344262640AD95F95C9 +CT=F8C1DBDD20317FEB1625634A451931B5 + +I=143 +KEY=3FD0019D000111D4300D2CEF39F53C0D81B71E3E8CC9A48C02B405A49C300394 +PT=F8C1DBDD20317FEB1625634A451931B5 +CT=DEDB54735B8B90C8EEC66EAECFB13ED6 + +I=144 +KEY=070976B2D3AA1E737BC24A8A794A21BE5F6C4A4DD7423444EC726B0A53813D42 +PT=DEDB54735B8B90C8EEC66EAECFB13ED6 +CT=75941A1ADA444115961E058E2D6C6396 + +I=145 +KEY=81AC2B7F073D0D06BA8A43D3381D3A3F2AF850570D0675517A6C6E847EED5ED4 +PT=75941A1ADA444115961E058E2D6C6396 +CT=7C66BE2B0354A6549E10489AF7A83424 + +I=146 +KEY=37BDD1946BB9B5616115F015E9162F5B569EEE7C0E52D305E47C261E89456AF0 +PT=7C66BE2B0354A6549E10489AF7A83424 +CT=F589769555BDEFD0B29E6A65313BD2E1 + +I=147 +KEY=CF27BD543BB4EED052B808D1EE350D35A31798E95BEF3CD556E24C7BB87EB811 +PT=F589769555BDEFD0B29E6A65313BD2E1 +CT=9B3215F70FBCC5ED9CC0D6D7E1E56F11 + +I=148 +KEY=43321308251C33234CCD9ED19E5E74AF38258D1E5453F938CA229AAC599BD700 +PT=9B3215F70FBCC5ED9CC0D6D7E1E56F11 +CT=705CCB60E0A6E997578DCC804D49D265 + +I=149 +KEY=F2152160EAD144776BA6BDED0AC49CD24879467EB4F510AF9DAF562C14D20565 +PT=705CCB60E0A6E997578DCC804D49D265 +CT=3DA4CEC68D47E55ECF21A1C5CDAFE4E6 + +I=150 +KEY=593B7EDAE946A5269EF33D088D1B297675DD88B839B2F5F1528EF7E9D97DE183 +PT=3DA4CEC68D47E55ECF21A1C5CDAFE4E6 +CT=32299EDBED49B66271107CA1822F179E + +I=151 +KEY=852E4554AD1459CE81DBA17D18DA96C447F41663D4FB4393239E8B485B52F61D +PT=32299EDBED49B66271107CA1822F179E +CT=45856FD2080FA9BBFA0857BCF7381823 + +I=152 +KEY=1D8F910508F9C08DB4DE4D5C465310F4027179B1DCF4EA28D996DCF4AC6AEE3E +PT=45856FD2080FA9BBFA0857BCF7381823 +CT=6A8C18595AF5D1E46F9F168C31566BAF + +I=153 +KEY=1A42C028C1ABA740D95A47ABD7B4F40D68FD61E886013BCCB609CA789D3C8591 +PT=6A8C18595AF5D1E46F9F168C31566BAF +CT=71A41A6B6BF9FB906B0617DCB76B4BA5 + +I=154 +KEY=3C408CB08BCAF34B2BCE6EF787A96D5219597B83EDF8C05CDD0FDDA42A57CE34 +PT=71A41A6B6BF9FB906B0617DCB76B4BA5 +CT=9105B8FC516E0B19AEDD003979F8C298 + +I=155 +KEY=804516E36B1B5E046B15CBE1D3F26EE9885CC37FBC96CB4573D2DD9D53AF0CAC +PT=9105B8FC516E0B19AEDD003979F8C298 +CT=27ACD01CC0403AD6DB45C7DF3E515EDE + +I=156 +KEY=CD8199690660BD4DBA38CE522D1A12CEAFF013637CD6F193A8971A426DFE5272 +PT=27ACD01CC0403AD6DB45C7DF3E515EDE +CT=86E2A23AC567C5F05F15A318E38360A7 + +I=157 +KEY=0AD8BB3D5B2A538DF0BDD50EB74CC1BA2912B159B9B13463F782B95A8E7D32D5 +PT=86E2A23AC567C5F05F15A318E38360A7 +CT=CB03EDA81BF211B5FE03D4A0879E9EDD + +I=158 +KEY=081040B60AE9E733243F4C39013EEDB5E2115CF1A24325D609816DFA09E3AC08 +PT=CB03EDA81BF211B5FE03D4A0879E9EDD +CT=6F1AD4AD727348DD593459E0D7661813 + +I=159 +KEY=A51E29D20BB0963DF854C898299E114A8D0B885CD0306D0B50B5341ADE85B41B +PT=6F1AD4AD727348DD593459E0D7661813 +CT=236B421E3103D4C17297D3F5C8BA1D17 + +I=160 +KEY=49D4EB9964431F42F0FC6494A47A50CCAE60CA42E133B9CA2222E7EF163FA90C +PT=236B421E3103D4C17297D3F5C8BA1D17 +CT=118AE5A5597E8DB200B26DBE11AC4BC8 + +I=161 +KEY=0F3F7298BE444450A0A07A4B73897720BFEA2FE7B84D347822908A510793E2C4 +PT=118AE5A5597E8DB200B26DBE11AC4BC8 +CT=DF02587F25CC4C59E6AECE98BCAACCB8 + +I=162 +KEY=7E30984A4C0B18D2F791858B83FC960960E877989D817821C43E44C9BB392E7C +PT=DF02587F25CC4C59E6AECE98BCAACCB8 +CT=3DA0F35FDAEF499ADBF602939FC748D4 + +I=163 +KEY=360A7168E056892E5BF0127EA3B58CAF5D4884C7476E31BB1FC8465A24FE66A8 +PT=3DA0F35FDAEF499ADBF602939FC748D4 +CT=FE462F878CEEDDDAA00855B85A81A14B + +I=164 +KEY=A75B3537E0EB98FC0F41C9E1306F6667A30EAB40CB80EC61BFC013E27E7FC7E3 +PT=FE462F878CEEDDDAA00855B85A81A14B +CT=47EA8AC561D7A9F99F64F41A9AD46E5C + +I=165 +KEY=219E71FC6D23A5103DE4DA9C5EDFA0AEE4E42185AA57459820A4E7F8E4ABA9BF +PT=47EA8AC561D7A9F99F64F41A9AD46E5C +CT=650FAE7F29A098D787F60CC3C0D77580 + +I=166 +KEY=038A888C6EA4E9502A15110832AE0DF081EB8FFA83F7DD4FA752EB3B247CDC3F +PT=650FAE7F29A098D787F60CC3C0D77580 +CT=0334BF8CA2835C71F2A283736D54E933 + +I=167 +KEY=714967419F9129B9649A13A9DA3291A582DF30762174813E55F068484928350C +PT=0334BF8CA2835C71F2A283736D54E933 +CT=1B3A09B325F3D833A3C83D941832B204 + +I=168 +KEY=BCDB12EAF8D3C95F821C0DD324FD36BB99E539C50487590DF63855DC511A8708 +PT=1B3A09B325F3D833A3C83D941832B204 +CT=CF980ED2619858290881314B7F0B9516 + +I=169 +KEY=B8FA32AE829E8AF3EF543A407E2D61BA567D3717651F0124FEB964972E11121E +PT=CF980ED2619858290881314B7F0B9516 +CT=98FF5ADA0739122DBBD241847D4A318D + +I=170 +KEY=D62592634F0ABD21AC98887A88845E2ECE826DCD62261309456B2513535B2393 +PT=98FF5ADA0739122DBBD241847D4A318D +CT=1824306B9F54BE4CE3F94F037B4B8569 + +I=171 +KEY=77005AE2FA1AD6D77D36566B9E988345D6A65DA6FD72AD45A6926A102810A6FA +PT=1824306B9F54BE4CE3F94F037B4B8569 +CT=25BA57B9035625DD268492282535960C + +I=172 +KEY=BE766696DC4458442056D89C96CAFDF0F31C0A1FFE2488988016F8380D2530F6 +PT=25BA57B9035625DD268492282535960C +CT=26AEAD4ED08CA78CE2A3358F36DA0E3F + +I=173 +KEY=1E1D3EBC714EE191EDB2A02B64EF2C23D5B2A7512EA82F1462B5CDB73BFF3EC9 +PT=26AEAD4ED08CA78CE2A3358F36DA0E3F +CT=10AB48E0CB1D72D82794E35DBDEF88F6 + +I=174 +KEY=D3EAD2DA40B4C94B506A0ED75210023BC519EFB1E5B55DCC45212EEA8610B63F +PT=10AB48E0CB1D72D82794E35DBDEF88F6 +CT=878BCAC367294B227533E1451F654960 + +I=175 +KEY=87D0B5D4A1314054EC37B67B4245BA8C42922572829C16EE3012CFAF9975FF5F +PT=878BCAC367294B227533E1451F654960 +CT=98CC3311EC8E8B75944503734DEAC00D + +I=176 +KEY=EF3FA3235BB42B1326DE67088C68E2BDDA5E16636E129D9BA457CCDCD49F3F52 +PT=98CC3311EC8E8B75944503734DEAC00D +CT=DAF5FB711E259B498918871933A2E1FD + +I=177 +KEY=2EBBBB1B070658DD43299478725AA88F00ABED12703706D22D4F4BC5E73DDEAF +PT=DAF5FB711E259B498918871933A2E1FD +CT=AACC545DEE8FF1F5C7A91A2EE3D25C1B + +I=178 +KEY=E15D1FC214F23FF93886D219B4DFCD45AA67B94F9EB8F727EAE651EB04EF82B4 +PT=AACC545DEE8FF1F5C7A91A2EE3D25C1B +CT=B844B67FBFD12E2712CCB66EBB4F7691 + +I=179 +KEY=CC3335B792121DE55FA04A4D6FEE57B012230F302169D900F82AE785BFA0F425 +PT=B844B67FBFD12E2712CCB66EBB4F7691 +CT=3E00C548BAEE6150FAA5B67986331FD5 + +I=180 +KEY=18DB585F810069C584251CA1E04A58382C23CA789B87B850028F51FC3993EBF0 +PT=3E00C548BAEE6150FAA5B67986331FD5 +CT=EB23DEEA8449E8FA0D828C12B98437AE + +I=181 +KEY=DFE08CA44B0BC4F51C43BE3631E20735C70014921FCE50AA0F0DDDEE8017DC5E +PT=EB23DEEA8449E8FA0D828C12B98437AE +CT=35BBE35CFC1D8FC40BC52F20D3FB35D5 + +I=182 +KEY=0F7DCC456D50A31AC9351794BFE6DD57F2BBF7CEE3D3DF6E04C8F2CE53ECE98B +PT=35BBE35CFC1D8FC40BC52F20D3FB35D5 +CT=DFFE7AEEAAF4762C7EB52453B1F61AD8 + +I=183 +KEY=D34FDEB3F04FB4563BC0FD204E8D459F2D458D204927A9427A7DD69DE21AF353 +PT=DFFE7AEEAAF4762C7EB52453B1F61AD8 +CT=C648DAF9EBFB4BC6166B15BF067E107F + +I=184 +KEY=5E90B747C9976A3F5050B0C51F116A81EB0D57D9A2DCE2846C16C322E464E32C +PT=C648DAF9EBFB4BC6166B15BF067E107F +CT=057258D07CAEE57807C396FAE651855A + +I=185 +KEY=52D3686BC0CD56B9DFF3A69F5073F30AEE7F0F09DE7207FC6BD555D802356676 +PT=057258D07CAEE57807C396FAE651855A +CT=B1109BE49E6E0F4C4190D8E0D717E8D0 + +I=186 +KEY=39C89286B658E006FBF97BAB1C4874025F6F94ED401C08B02A458D38D5228EA6 +PT=B1109BE49E6E0F4C4190D8E0D717E8D0 +CT=4DDE60FEEE40402058C988092603AB53 + +I=187 +KEY=562C9A004CBF05A4CA97994D48C0874C12B1F413AE5C4890728C0531F32125F5 +PT=4DDE60FEEE40402058C988092603AB53 +CT=3B18CBF83791E93D661EB269CFEAB1BE + +I=188 +KEY=F95206C4D3862E01A4DFE3676A2F297C29A93FEB99CDA1AD1492B7583CCB944B +PT=3B18CBF83791E93D661EB269CFEAB1BE +CT=0A3204DEE28B65E849136960949E4E5E + +I=189 +KEY=FEFDBE4294E46E22074E77B6BB7F964B239B3B357B46C4455D81DE38A855DA15 +PT=0A3204DEE28B65E849136960949E4E5E +CT=6C47ECB8B1478F0BBEDEF3A05A439776 + +I=190 +KEY=05858C957F861410187DD8CC2EE48E364FDCD78DCA014B4EE35F2D98F2164D63 +PT=6C47ECB8B1478F0BBEDEF3A05A439776 +CT=881188C2834B0496CB97F15F7A5C332A + +I=191 +KEY=A51CABC6D50BF9043E95CE2BC511D26DC7CD5F4F494A4FD828C8DCC7884A7E49 +PT=881188C2834B0496CB97F15F7A5C332A +CT=1FAE86251E2F615E3BFCAC545013CD12 + +I=192 +KEY=4EE1F6812CC35A16AA63F1CB39669ED7D863D96A57652E8613347093D859B35B +PT=1FAE86251E2F615E3BFCAC545013CD12 +CT=6017C6764080CB6D2BAC24C0F1BFF8F5 + +I=193 +KEY=F4F31D57DD72E6BF842D3834372AA60CB8741F1C17E5E5EB3898545329E64BAE +PT=6017C6764080CB6D2BAC24C0F1BFF8F5 +CT=10C8548253FB2BCD5D6F87CB28FAE7E7 + +I=194 +KEY=9DBB357DC99A95C240E750F1970C5C65A8BC4B9E441ECE2665F7D398011CAC49 +PT=10C8548253FB2BCD5D6F87CB28FAE7E7 +CT=20E253845A3DD51FFC16141FDAA20749 + +I=195 +KEY=A814CD8766E0BFFBD8530589D6202BE0885E181A1E231B3999E1C787DBBEAB00 +PT=20E253845A3DD51FFC16141FDAA20749 +CT=9383323218D891F9DCE7578FCD6A54A5 + +I=196 +KEY=C516C26E23E38C2B87346F759D8AEF881BDD2A2806FB8AC04506900816D4FFA5 +PT=9383323218D891F9DCE7578FCD6A54A5 +CT=9CFF8002D46EAFAAC7B035A788A37CF5 + +I=197 +KEY=9301F8120939D0E70C97F614F61F18648722AA2AD295256A82B6A5AF9E778350 +PT=9CFF8002D46EAFAAC7B035A788A37CF5 +CT=90C9F34994D5DA86406C7E82EDDD1009 + +I=198 +KEY=82B163831972D2CEF8F1780AA6B0707A17EB59634640FFECC2DADB2D73AA9359 +PT=90C9F34994D5DA86406C7E82EDDD1009 +CT=C8B5021EE84635EB7E7D0F5DBE967FD0 + +I=199 +KEY=F99FF8714EE5D822E0E25C499D7C96ACDF5E5B7DAE06CA07BCA7D470CD3CEC89 +PT=C8B5021EE84635EB7E7D0F5DBE967FD0 +CT=15CCB3C950764E24CA714707034DF9A7 + +I=200 +KEY=3529E6B83266BD558B7F33FC00AE4904CA92E8B4FE70842376D69377CE71152E +PT=15CCB3C950764E24CA714707034DF9A7 +CT=5FDA0EF6A2172D5DAA8E842F061A2E44 + +I=201 +KEY=2D77F95D8B556740CD9E2CC546CA45C99548E6425C67A97EDC581758C86B3B6A +PT=5FDA0EF6A2172D5DAA8E842F061A2E44 +CT=808781D0D10B3A02333E0A53E159287F + +I=202 +KEY=79298FD5F3C4B6378403CFAD05C3C96E15CF67928D6C937CEF661D0B29321315 +PT=808781D0D10B3A02333E0A53E159287F +CT=CC760400725FCFD37E757D99C6361B93 + +I=203 +KEY=69535F335F6AEBF452407F3F1C203410D9B96392FF335CAF91136092EF040886 +PT=CC760400725FCFD37E757D99C6361B93 +CT=247D3A6BB4C883C142C4000B085C3B79 + +I=204 +KEY=1A4F8FD7BD8DBCFB3677C708CDDDC7C4FDC459F94BFBDF6ED3D76099E75833FF +PT=247D3A6BB4C883C142C4000B085C3B79 +CT=47E4C802C61E6A1706BAE95AF75CA70D + +I=205 +KEY=A573989455A11CAD1E8642CD774806B1BA2091FB8DE5B579D56D89C3100494F2 +PT=47E4C802C61E6A1706BAE95AF75CA70D +CT=4297101350A5CE6C435FAD2725C22E46 + +I=206 +KEY=8D52414DD5600AA0CACD5AD399FD1B37F8B781E8DD407B15963224E435C6BAB4 +PT=4297101350A5CE6C435FAD2725C22E46 +CT=BEC56BF1F3B6BE60C0F4CB7AE77BF0F5 + +I=207 +KEY=49D4DF2FB3B561817F2BA6599B66C9244672EA192EF6C57556C6EF9ED2BD4A41 +PT=BEC56BF1F3B6BE60C0F4CB7AE77BF0F5 +CT=5B590F24D329BB6ED981938A4CDB9907 + +I=208 +KEY=68BD5721E2A51A184CDBAC3A035670701D2BE53DFDDF7E1B8F477C149E66D346 +PT=5B590F24D329BB6ED981938A4CDB9907 +CT=A8A15DBB79BB9B1131EF39C1E3FCFC9C + +I=209 +KEY=2CC71F1B9BE892100E8A340E61D0A128B58AB8868464E50ABEA845D57D9A2FDA +PT=A8A15DBB79BB9B1131EF39C1E3FCFC9C +CT=E8CBAB9E98D2866E779512AAC2FA2EA0 + +I=210 +KEY=EEF45CE1BB444A6BA5A029363FB9D4DB5D4113181CB66364C93D577FBF60017A +PT=E8CBAB9E98D2866E779512AAC2FA2EA0 +CT=7E4896F0A48A25FFE950B74B96F5F40E + +I=211 +KEY=151FE809785C11F8F19F31EA0246B416230985E8B83C469B206DE0342995F574 +PT=7E4896F0A48A25FFE950B74B96F5F40E +CT=E1C642B54B89822E73A695C851BC8EBE + +I=212 +KEY=14FE470CD366C580F124EA924B918BF5C2CFC75DF3B5C4B553CB75FC78297BCA +PT=E1C642B54B89822E73A695C851BC8EBE +CT=5FA2C6A2303ED7219984F30B78BE6B96 + +I=213 +KEY=92E61F4C495462354EF612492557D6AB9D6D01FFC38B1394CA4F86F70097105C +PT=5FA2C6A2303ED7219984F30B78BE6B96 +CT=3791959FBF178682A711623C2F91616C + +I=214 +KEY=6C0B6F23AC7526204C451A8ADE54D404AAFC94607C9C95166D5EE4CB2F067130 +PT=3791959FBF178682A711623C2F91616C +CT=E14FCACD5FD26FC2710776EE82317ABC + +I=215 +KEY=0DAE926E4172586817730DB9FDF2CE0B4BB35EAD234EFAD41C599225AD370B8C +PT=E14FCACD5FD26FC2710776EE82317ABC +CT=E576499EAF5365E7FE3B4961D9C74419 + +I=216 +KEY=DCD553F2977BD114B61F724ABC6AFE8EAEC517338C1D9F33E262DB4474F04F95 +PT=E576499EAF5365E7FE3B4961D9C74419 +CT=38567558119E72929F2932E6C289095E + +I=217 +KEY=6333DA8D5B655B5B5AABBCAF0B010BE89693626B9D83EDA17D4BE9A2B67946CB +PT=38567558119E72929F2932E6C289095E +CT=D20AD648F558E5507CC5C905E92CC268 + +I=218 +KEY=F9010180B464FBB8AD7C9D5E41B1E09A4499B42368DB08F1018E20A75F5584A3 +PT=D20AD648F558E5507CC5C905E92CC268 +CT=00C719F3757DDD2D2E64C3F2666FB2CB + +I=219 +KEY=8CE68ED02B4FFD9720B3D16FAE92D164445EADD01DA6D5DC2FEAE355393A3668 +PT=00C719F3757DDD2D2E64C3F2666FB2CB +CT=AEEAB9F50456CA3233A964219D2E7816 + +I=220 +KEY=57E26BA4DBD3549051B0D9436EB38D4FEAB4142519F01FEE1C438774A4144E7E +PT=AEEAB9F50456CA3233A964219D2E7816 +CT=3F02C97E127FD697AFD58BC66941F654 + +I=221 +KEY=4D0BC4A8796407C939797EF19D0CE7E3D5B6DD5B0B8FC979B3960CB2CD55B82A +PT=3F02C97E127FD697AFD58BC66941F654 +CT=BC4C0DDBCF0003B7814EEF1ABD22B6A8 + +I=222 +KEY=9C1FD1789544D2F3FF84574A216767CD69FAD080C48FCACE32D8E3A870770E82 +PT=BC4C0DDBCF0003B7814EEF1ABD22B6A8 +CT=D125D8C2920ADD3EA00103DC695A0D9D + +I=223 +KEY=ADBE97F99DBE61213892D9849B81B3FBB8DF0842568517F092D9E074192D031F +PT=D125D8C2920ADD3EA00103DC695A0D9D +CT=C0C57598639BA69E13C82E3AF24777C5 + +I=224 +KEY=A14DC5CF6CD0BD9AC9499317C509CCB4781A7DDA351EB16E8111CE4EEB6A74DA +PT=C0C57598639BA69E13C82E3AF24777C5 +CT=81E3B8F6A691BC30AA66AD70F0358881 + +I=225 +KEY=0EC479D8681AC8CA455D64A4BB34C86DF9F9C52C938F0D5E2B77633E1B5FFC5B +PT=81E3B8F6A691BC30AA66AD70F0358881 +CT=3CD03908D4ABA4B9885BCB1AC89D16C3 + +I=226 +KEY=E74102D814426E659732B303E6D44DB7C529FC244724A9E7A32CA824D3C2EA98 +PT=3CD03908D4ABA4B9885BCB1AC89D16C3 +CT=61662DD8EE676E17AE5CF2BABDC54A67 + +I=227 +KEY=EE4034F1A2EF16D7D848BB005CDA5E99A44FD1FCA943C7F00D705A9E6E07A0FF +PT=61662DD8EE676E17AE5CF2BABDC54A67 +CT=4E637432B0FF54FD665A902725B977EB + +I=228 +KEY=45E8F2DF7FC6E49FB0AF3B73788A1065EA2CA5CE19BC930D6B2ACAB94BBED714 +PT=4E637432B0FF54FD665A902725B977EB +CT=E53D1440407503B66530EEEEBBC9182B + +I=229 +KEY=0BEBC981186DEF84C01688CA16A061E00F11B18E59C990BB0E1A2457F077CF3F +PT=E53D1440407503B66530EEEEBBC9182B +CT=12134ADF5BB16D867B4EE9CE87EBE36D + +I=230 +KEY=6FADFDB92B0F888514730F17A37A81B61D02FB510278FD3D7554CD99779C2C52 +PT=12134ADF5BB16D867B4EE9CE87EBE36D +CT=310EACEF26A3EB5E4511437145DC30F9 + +I=231 +KEY=A565724F25EE29346543964864A0FFAA2C0C57BE24DB166330458EE832401CAB +PT=310EACEF26A3EB5E4511437145DC30F9 +CT=6848E5A618419EC6BACD9CD40BB42083 + +I=232 +KEY=1FAEBFE13AC7545DC742ED60241BC2E84444B2183C9A88A58A88123C39F43C28 +PT=6848E5A618419EC6BACD9CD40BB42083 +CT=C64DA25E7CB1A004E31CD37F9D4E1112 + +I=233 +KEY=A8EE2725373C48BAD9C0009C53C298A982091046402B28A16994C143A4BA2D3A +PT=C64DA25E7CB1A004E31CD37F9D4E1112 +CT=D02E6AE8FDD0C5813669080AA7B82527 + +I=234 +KEY=0770874A41ED1396940D75E6A5A09F5352277AAEBDFBED205FFDC9490302081D +PT=D02E6AE8FDD0C5813669080AA7B82527 +CT=5DDFBC75FE48D88E7D6F307E4A008BC7 + +I=235 +KEY=D7D098F85AB45E754629D2AB7DA2226C0FF8C6DB43B335AE2292F937490283DA +PT=5DDFBC75FE48D88E7D6F307E4A008BC7 +CT=E216C9AC28239E97237930079739ECE0 + +I=236 +KEY=5D6FAFF37EE7400691E504578251ECB1EDEE0F776B90AB3901EBC930DE3B6F3A +PT=E216C9AC28239E97237930079739ECE0 +CT=8D126659360D03548879000642E78029 + +I=237 +KEY=D75C5C64D94D0BC8566F568278B502D560FC692E5D9DA86D8992C9369CDCEF13 +PT=8D126659360D03548879000642E78029 +CT=9EA4C85D0F07AD618A2EBEBBE50D72B6 + +I=238 +KEY=D42BD9CDCD8BDA71E64817A2755C97C0FE58A173529A050C03BC778D79D19DA5 +PT=9EA4C85D0F07AD618A2EBEBBE50D72B6 +CT=1F525901AF1D94BA6CA3C7244E2CD885 + +I=239 +KEY=32DD1758D2EFC602EE85C58A66D0B080E10AF872FD8791B66F1FB0A937FD4520 +PT=1F525901AF1D94BA6CA3C7244E2CD885 +CT=E131C071BFA21FCE21D18DB87B522903 + +I=240 +KEY=BEC98C02D74E088458A668D0B6DDCF13003B380342258E784ECE3D114CAF6C23 +PT=E131C071BFA21FCE21D18DB87B522903 +CT=51F1B72C99C869BF73A6637D3A2E2278 + +I=241 +KEY=D368F7BE25A6A0C9AD2004E764F43A3551CA8F2FDBEDE7C73D685E6C76814E5B +PT=51F1B72C99C869BF73A6637D3A2E2278 +CT=0965CDD7A134672036F0C69774CFD380 + +I=242 +KEY=E5A7E12124540DBB4147A55C276A35B958AF42F87AD980E70B9898FB024E9DDB +PT=0965CDD7A134672036F0C69774CFD380 +CT=52ECEB721073FBF3D1BD5808351BEC5E + +I=243 +KEY=7D9702E2C8906805A580D5D85B03BBC60A43A98A6AAA7B14DA25C0F337557185 +PT=52ECEB721073FBF3D1BD5808351BEC5E +CT=493CE4E2B090DA3A2354C9DA7DB44D39 + +I=244 +KEY=8EFA5EC96F3AEF51AB38F4CCD969E5D5437F4D68DA3AA12EF97109294AE13CBC +PT=493CE4E2B090DA3A2354C9DA7DB44D39 +CT=DA64246FF65969995F9A4E8AE7C805CF + +I=245 +KEY=19C97957444E9931293047A647D7A19A991B69072C63C8B7A6EB47A3AD293973 +PT=DA64246FF65969995F9A4E8AE7C805CF +CT=CF85EBD76908CD8F8D3177E53DA3AD5E + +I=246 +KEY=7BDB3ED45BD78C131611FD9D54B8E9D2569E82D0456B05382BDA3046908A942D +PT=CF85EBD76908CD8F8D3177E53DA3AD5E +CT=45E1FDEFC98E62A841BD1D8D8236CEEF + +I=247 +KEY=19961521A42D96238D44F651E7E7D463137F7F3F8CE567906A672DCB12BC5AC2 +PT=45E1FDEFC98E62A841BD1D8D8236CEEF +CT=E056EF7B711A9CBDED8878EF74AF1671 + +I=248 +KEY=343360636E697E607319D4DCBC12B543F3299044FDFFFB2D87EF552466134CB3 +PT=E056EF7B711A9CBDED8878EF74AF1671 +CT=E4EFF77C6C3273393BE4814A16C3DF4A + +I=249 +KEY=B63D4D3D099F8E68F6A041D2EB1B1C1417C6673891CD8814BC0BD46E70D093F9 +PT=E4EFF77C6C3273393BE4814A16C3DF4A +CT=EC562E353DF8BA76699B01A6ACC8AD52 + +I=250 +KEY=EF500379EDE772968F1499F07B0B09CFFB90490DAC353262D590D5C8DC183EAB +PT=EC562E353DF8BA76699B01A6ACC8AD52 +CT=4473050ADC687112AACB86AA73CB6C6D + +I=251 +KEY=EA5CD4EDD99E64018AD3104026F0F528BFE34C07705D43707F5B5362AFD352C6 +PT=4473050ADC687112AACB86AA73CB6C6D +CT=6561A82EE86E4F18DF6965312F0C0984 + +I=252 +KEY=2ABF9529FC88D85FF68CF6D72B9A9CB5DA82E42998330C68A032365380DF5B42 +PT=6561A82EE86E4F18DF6965312F0C0984 +CT=47590CE1C90F3AC2C68B272B4A667F61 + +I=253 +KEY=A485B647790DBFF76F16C42A39F5F5559DDBE8C8513C36AA66B91178CAB92423 +PT=47590CE1C90F3AC2C68B272B4A667F61 +CT=4ED731A36BCB2672A810633E432D8922 + +I=254 +KEY=F0D0E858B597595A06458FF6C2259127D30CD96B3AF710D8CEA972468994AD01 +PT=4ED731A36BCB2672A810633E432D8922 +CT=4AC2F0D5F52762F77DB5D9EF53B76642 + +I=255 +KEY=EDDE80556ECA4CC51EFB33E23C43C04399CE29BECFD0722FB31CABA9DA23CB43 +PT=4AC2F0D5F52762F77DB5D9EF53B76642 +CT=A574FBE71E359A57D57A24A388FDF6EE + +I=256 +KEY=3C7C248C9FCE1D060D5B0664C0FF3F6B3CBAD259D1E5E87866668F0A52DE3DAD +PT=A574FBE71E359A57D57A24A388FDF6EE +CT=CCC3A011108469A7987F336C209BB84E + +I=257 +KEY=D43727570A809BE0D9EB78760FE4CDA9F0797248C16181DFFE19BC66724585E3 +PT=CCC3A011108469A7987F336C209BB84E +CT=686357D3013977390164834D4E5324DC + +I=258 +KEY=2F060E361977E544B98779AB55886D57981A259BC058F6E6FF7D3F2B3C16A13F +PT=686357D3013977390164834D4E5324DC +CT=DDDAD6FBDBF7C7BE7EBF3F036009A270 + +I=259 +KEY=A3630C05DC65905D37AFDB315B2AA4D945C0F3601BAF315881C200285C1F034F +PT=DDDAD6FBDBF7C7BE7EBF3F036009A270 +CT=237124FEDF28B4201B6D1584B93D5F7C + +I=260 +KEY=3E6ADAAEF53A36294CDEA0D94BE742C166B1D79EC48785789AAF15ACE5225C33 +PT=237124FEDF28B4201B6D1584B93D5F7C +CT=D1A9DDFB5662934AAD98B2861E50A871 + +I=261 +KEY=234615019E03C466AEA186112C4EB523B7180A6592E516323737A72AFB72F442 +PT=D1A9DDFB5662934AAD98B2861E50A871 +CT=CA18344F4C7A0F068398CA8137C056DD + +I=262 +KEY=22ED93581611798050E94CC70F6090BF7D003E2ADE9F1934B4AF6DABCCB2A29F +PT=CA18344F4C7A0F068398CA8137C056DD +CT=91FA4D62D10E852D9EDA42FAC8C34557 + +I=263 +KEY=A5981D9A37D6D3D948391D1D462B6DCFECFA73480F919C192A752F510471E7C8 +PT=91FA4D62D10E852D9EDA42FAC8C34557 +CT=B956221510135066B2B2552C4CB37642 + +I=264 +KEY=BF2E4397D0E93DFFA38D69B30F33835B55AC515D1F82CC7F98C77A7D48C2918A +PT=B956221510135066B2B2552C4CB37642 +CT=300CFCEAFED28E622CD08222D3A3B0B0 + +I=265 +KEY=55432143B807A628001F8D062CE0157265A0ADB7E150421DB417F85F9B61213A +PT=300CFCEAFED28E622CD08222D3A3B0B0 +CT=26681BCFDC630A21A684C60EF6A23747 + +I=266 +KEY=2966A6CB3BA9028583813B91FD72748D43C8B6783D33483C12933E516DC3167D +PT=26681BCFDC630A21A684C60EF6A23747 +CT=8EDD4B1B458D16841AD4525C01A8397E + +I=267 +KEY=1A22288AC28060F8E4B20C2AE0C82AEACD15FD6378BE5EB808476C0D6C6B2F03 +PT=8EDD4B1B458D16841AD4525C01A8397E +CT=BFDE412A7CAF0326AD1727996056A61C + +I=268 +KEY=C882E880508E92FF709E9BD4A555B30A72CBBC4904115D9EA5504B940C3D891F +PT=BFDE412A7CAF0326AD1727996056A61C +CT=88C039A0B395C5D08848C64DFC150C57 + +I=269 +KEY=298B3829EE60112C926E1FD583C9A2DEFA0B85E9B784984E2D188DD9F0288548 +PT=88C039A0B395C5D08848C64DFC150C57 +CT=ACDF23F2CB73FD8D3D814A79E3C94126 + +I=270 +KEY=2F2A3D0DDB2DBA8B8E3FF8A9DE765FE356D4A61B7CF765C31099C7A013E1C46E +PT=ACDF23F2CB73FD8D3D814A79E3C94126 +CT=A8BE26FE8780972650D5F384B744AC44 + +I=271 +KEY=F8CC20E8296CD38F1EF8BB2777EE1200FE6A80E5FB77F2E5404C3424A4A5682A +PT=A8BE26FE8780972650D5F384B744AC44 +CT=B5557CC20F64FCC576A6EC7BE324CE43 + +I=272 +KEY=678B5341F1BC13DB366B36D59ADADC7C4B3FFC27F4130E2036EAD85F4781A669 +PT=B5557CC20F64FCC576A6EC7BE324CE43 +CT=B59281EFF9C8D19E5D9C053CBE1F2F33 + +I=273 +KEY=E4701C9009693E38C455CE186A4B87DFFEAD7DC80DDBDFBE6B76DD63F99E895A +PT=B59281EFF9C8D19E5D9C053CBE1F2F33 +CT=7E8B1D4BFF81C5B9AA1FCA81DF8DE64F + +I=274 +KEY=C1F886CBCBF2BD920A0E68F30FCB8FCE80266083F25A1A07C16917E226136F15 +PT=7E8B1D4BFF81C5B9AA1FCA81DF8DE64F +CT=20841B35C77A109B528A1135E17D36EE + +I=275 +KEY=F05D61A9441B3C741D9D7489F2EE4A5EA0A27BB635200A9C93E306D7C76E59FB +PT=20841B35C77A109B528A1135E17D36EE +CT=C3195DC001FA1AD7C253DD3FE4A4BC7D + +I=276 +KEY=0C8E70943252DD5DC9819A9FDB375B3F63BB267634DA104B51B0DBE823CAE586 +PT=C3195DC001FA1AD7C253DD3FE4A4BC7D +CT=7E06BD1B3440DB4CA73AF1A05B33AD3F + +I=277 +KEY=84F1B5CF1AD11205E98ECD317AD670A11DBD9B6D009ACB07F68A2A4878F948B9 +PT=7E06BD1B3440DB4CA73AF1A05B33AD3F +CT=6224DBD71C1DC35A5C62777D2EA32C3E + +I=278 +KEY=E3465353AED687EF62CD1DA8D7DA3EEB7F9940BA1C87085DAAE85D35565A6487 +PT=6224DBD71C1DC35A5C62777D2EA32C3E +CT=1E4E51CD7BA1F7467AC69755F8894EF4 + +I=279 +KEY=31F715D1FFA116F58AB70E4A3EEF6E9561D711776726FF1BD02ECA60AED32A73 +PT=1E4E51CD7BA1F7467AC69755F8894EF4 +CT=4AB8AFEACB2A1B1AE9E74D647266E234 + +I=280 +KEY=487B6847CA14B04D429C81278332273F2B6FBE9DAC0CE40139C98704DCB5C847 +PT=4AB8AFEACB2A1B1AE9E74D647266E234 +CT=64C0BBA15382C142BBEE84B86B7D0BA0 + +I=281 +KEY=D1C9CA26B21945011B044EA6E29C9AD54FAF053CFF8E2543822703BCB7C8C3E7 +PT=64C0BBA15382C142BBEE84B86B7D0BA0 +CT=F82292AF614648EC6C1E9A1027167410 + +I=282 +KEY=3F585C00E187BE1B0C9E09781C9548A8B78D97939EC86DAFEE3999AC90DEB7F7 +PT=F82292AF614648EC6C1E9A1027167410 +CT=31C38ED5F207B412A14A51632D8805CE + +I=283 +KEY=340B8C115BAFF387400CD8F0EE8F8F6F864E19466CCFD9BD4F73C8CFBD56B239 +PT=31C38ED5F207B412A14A51632D8805CE +CT=3FC4CC8F4245BBBC5939A0C0A24A14DE + +I=284 +KEY=EA8EACF07402225D6C5181A8802DA515B98AD5C92E8A6201164A680F1F1CA6E7 +PT=3FC4CC8F4245BBBC5939A0C0A24A14DE +CT=23A98FA41D6C3D4CD9CFB9737A6D7872 + +I=285 +KEY=56EF7B73BF04F5F463E4D0EA0F6FC4DA9A235A6D33E65F4DCF85D17C6571DE95 +PT=23A98FA41D6C3D4CD9CFB9737A6D7872 +CT=82CC2D376B2772B7B988BEA17EFBB3D2 + +I=286 +KEY=C425E380DA91C34B73CE922C59B13C8818EF775A58C12DFA760D6FDD1B8A6D47 +PT=82CC2D376B2772B7B988BEA17EFBB3D2 +CT=5330F6218D528A32B24085EA496A05A9 + +I=287 +KEY=EA66C7FF9FCD2F9E76BCC5C6387E133E4BDF817BD593A7C8C44DEA3752E068EE +PT=5330F6218D528A32B24085EA496A05A9 +CT=7C1E082C2C89C90AD91AE81DF73F1F5F + +I=288 +KEY=C89CF336490832FB54BB536813AEE6EA37C18957F91A6EC21D57022AA5DF77B1 +PT=7C1E082C2C89C90AD91AE81DF73F1F5F +CT=2AB33673B654E2C49D6736D65A5F45C8 + +I=289 +KEY=7CC5409A9AE1F997774C3FEB74A6E9061D72BF244F4E8C06803034FCFF803279 +PT=2AB33673B654E2C49D6736D65A5F45C8 +CT=21BA6CADDCA5E0BE779D1A2651794C81 + +I=290 +KEY=E5E1873FDEE9DC066AF79C0E6027D0703CC8D38993EB6CB8F7AD2EDAAEF97EF8 +PT=21BA6CADDCA5E0BE779D1A2651794C81 +CT=8E2AF8BA54CF04812AE786C180FCFCA8 + +I=291 +KEY=844AA67914DE1C11677B5526D5B12765B2E22B33C7246839DD4AA81B2E058250 +PT=8E2AF8BA54CF04812AE786C180FCFCA8 +CT=E48A7CD35CA33B1D919B8A83ADF4C6BE + +I=292 +KEY=FE3248768ACB0AF9DBD639AF7B7EB944566857E09B8753244CD1229883F144EE +PT=E48A7CD35CA33B1D919B8A83ADF4C6BE +CT=C377A76CF43C27784CC54079744413D1 + +I=293 +KEY=709E7BC30A7DE8FADC071B3D04338FCA951FF08C6FBB745C001462E1F7B5573F +PT=C377A76CF43C27784CC54079744413D1 +CT=01D8083A9EA403A4754EF82CA29CDD5B + +I=294 +KEY=448B1AEC2F68D202679183D85C4A6D2194C7F8B6F11F77F8755A9ACD55298A64 +PT=01D8083A9EA403A4754EF82CA29CDD5B +CT=46ADC32EFF2C3EFF40B468E845EFC2E4 + +I=295 +KEY=529401616FA6193014D6A10BEF1A816FD26A3B980E33490735EEF22510C64880 +PT=46ADC32EFF2C3EFF40B468E845EFC2E4 +CT=FCC6594B1BBF40E28BE798ABC00163F1 + +I=296 +KEY=15A5E8BAF02EF91390AB7D35742CC5C12EAC62D3158C09E5BE096A8ED0C72B71 +PT=FCC6594B1BBF40E28BE798ABC00163F1 +CT=28D35B6E1140738ED1DF20FE11003B1E + +I=297 +KEY=589C04ECDF2B884807919A2018A93080067F39BD04CC7A6B6FD64A70C1C7106F +PT=28D35B6E1140738ED1DF20FE11003B1E +CT=3354C7962E19FB043FD4CD7B2C99E195 + +I=298 +KEY=A6987BEB541098C7173475B34568F36B352BFE2B2AD5816F5002870BED5EF1FA +PT=3354C7962E19FB043FD4CD7B2C99E195 +CT=EB76F282C9F10F507FACFCDEEC8BBBB8 + +I=299 +KEY=3732B395057761A8A2624F52354668CFDE5D0CA9E3248E3F2FAE7BD501D54A42 +PT=EB76F282C9F10F507FACFCDEEC8BBBB8 +CT=77A4DAE8406992C5018D6B0310195E0C + +I=300 +KEY=E24C9F98F43E840AE04ED4928133F65AA9F9D641A34D1CFA2E2310D611CC144E +PT=77A4DAE8406992C5018D6B0310195E0C +CT=655DEC1062EDB50B8B31A66071E236A2 + +I=301 +KEY=8BA207CA6E2B720810E66CCAB597E8DACCA43A51C1A0A9F1A512B6B6602E22EC +PT=655DEC1062EDB50B8B31A66071E236A2 +CT=28A22A069D8FF3DE359860B0A5B6FD1F + +I=302 +KEY=22C629C84758D553AFE4876AA739A1F0E40610575C2F5A2F908AD606C598DFF3 +PT=28A22A069D8FF3DE359860B0A5B6FD1F +CT=95DD88B4AFD0680E221C70422ADFFCD1 + +I=303 +KEY=F86A3C799AAB6884220196BF07E1643D71DB98E3F3FF3221B296A644EF472322 +PT=95DD88B4AFD0680E221C70422ADFFCD1 +CT=323475C634FD6845BAA9F371F29DC363 + +I=304 +KEY=83412E9600B279F76C93F171C469AD1943EFED25C7025A64083F55351DDAE041 +PT=323475C634FD6845BAA9F371F29DC363 +CT=61276AD535F9E73FCFB53DBF2D5D1F62 + +I=305 +KEY=01AD15137C4A572322660716B6B4EDCD22C887F0F2FBBD5BC78A688A3087FF23 +PT=61276AD535F9E73FCFB53DBF2D5D1F62 +CT=105ECB04A5CA32FC93987569A7CB46D7 + +I=306 +KEY=1CC639BA56CA0DF23E64BB3395C08BB332964CF457318FA754121DE3974CB9F4 +PT=105ECB04A5CA32FC93987569A7CB46D7 +CT=831DBB3F4BBD4343B94D54AA2B3E0620 + +I=307 +KEY=25ABCF5B8DB1A7CCB1FA49936E0AB3C8B18BF7CB1C8CCCE4ED5F4949BC72BFD4 +PT=831DBB3F4BBD4343B94D54AA2B3E0620 +CT=40B9D9C6201E639DC9A04E500BCD7F61 + +I=308 +KEY=75B34E0F371C4527732F22CF35AD923BF1322E0D3C92AF7924FF0719B7BFC0B5 +PT=40B9D9C6201E639DC9A04E500BCD7F61 +CT=A159BB0C751148C14D561E0407A9F6DB + +I=309 +KEY=1EB6E3491B431B7EFFCCC965C9041274506B95014983E7B869A9191DB016366E +PT=A159BB0C751148C14D561E0407A9F6DB +CT=2012E67815334AC48E5309DD129E0476 + +I=310 +KEY=F0BDAFB216613A6FB3819D08B17EFDC1707973795CB0AD7CE7FA10C0A2883218 +PT=2012E67815334AC48E5309DD129E0476 +CT=53E415BC0C9013F83B77298395FC9FEF + +I=311 +KEY=9C5A3B9C862E07159AB06D5B7FB585C5239D66C55020BE84DC8D39433774ADF7 +PT=53E415BC0C9013F83B77298395FC9FEF +CT=2B1EEAA13373494A2A56C15FD5ECA103 + +I=312 +KEY=9764AC349B8222394160F4896BA6761808838C646353F7CEF6DBF81CE2980CF4 +PT=2B1EEAA13373494A2A56C15FD5ECA103 +CT=2A00E873782853DC842427A03C30A81A + +I=313 +KEY=42A1614569C4DE66D6336BC082B3B9DD228364171B7BA41272FFDFBCDEA8A4EE +PT=2A00E873782853DC842427A03C30A81A +CT=5FEB74E489C4C8121A15C2BCF51046A5 + +I=314 +KEY=CED80BE0859A5863CFE41F0F2CE9F65B7D6810F392BF6C0068EA1D002BB8E24B +PT=5FEB74E489C4C8121A15C2BCF51046A5 +CT=948214D5DB68997C37A48927AA97B89A + +I=315 +KEY=178DAF533EBB695D5E57401E5345C3E8E9EA042649D7F57C5F4E9427812F5AD1 +PT=948214D5DB68997C37A48927AA97B89A +CT=AB8F3BB9917E4D1C8F1F2EDDB7070530 + +I=316 +KEY=66F4B8B5A0BD877514FDB4CD2DD04D8C42653F9FD8A9B860D051BAFA36285FE1 +PT=AB8F3BB9917E4D1C8F1F2EDDB7070530 +CT=CB5FB11C6DB1AB6BC189F0F3FB47A2A5 + +I=317 +KEY=9753278CFCEE8B059ECF573A2E0D65D6893A8E83B518130B11D84A09CD6FFD44 +PT=CB5FB11C6DB1AB6BC189F0F3FB47A2A5 +CT=F0CE65E6C5C263182E6C253F26460A1B + +I=318 +KEY=121A860A5B53C56E536DE56566F31E2079F4EB6570DA70133FB46F36EB29F75F +PT=F0CE65E6C5C263182E6C253F26460A1B +CT=9AA17B0F532814CA74FF0A046F377C48 + +I=319 +KEY=88F5E58E9522495BF7B68430946F7C0FE355906A23F264D94B4B6532841E8B17 +PT=9AA17B0F532814CA74FF0A046F377C48 +CT=52CAAEF16E55858487AEDBDBA822002D + +I=320 +KEY=D9A3D3547F215D44D80C6A5D3548D4D2B19F3E9B4DA7E15DCCE5BEE92C3C8B3A +PT=52CAAEF16E55858487AEDBDBA822002D +CT=2599545FD15C7F59A6F02CDCB95E6589 + +I=321 +KEY=6ACE86543B0F981C2D0FCB1408A42C3294066AC49CFB9E046A1592359562EEB3 +PT=2599545FD15C7F59A6F02CDCB95E6589 +CT=DC7A68313CE3E1963D31E5149CDBE22A + +I=322 +KEY=E9D6D08194DAFBB7B491124515118FA6487C02F5A0187F925724772109B90C99 +PT=DC7A68313CE3E1963D31E5149CDBE22A +CT=333B588A7354CB3229E43780AFE4738D + +I=323 +KEY=762FC93CEED1EE9C6EF702A4E3BBABD67B475A7FD34CB4A07EC040A1A65D7F14 +PT=333B588A7354CB3229E43780AFE4738D +CT=41727DC0D18725AFD2EF8FF51EAE1C2C + +I=324 +KEY=FF4EC1DF818E820424CFE5D09EE2E5423A3527BF02CB910FAC2FCF54B8F36338 +PT=41727DC0D18725AFD2EF8FF51EAE1C2C +CT=A7236B16D9937C84F37BF9D79D0251F9 + +I=325 +KEY=59BDAB706DEA2EC52AE05A2E4382A4169D164CA9DB58ED8B5F54368325F132C1 +PT=A7236B16D9937C84F37BF9D79D0251F9 +CT=B81D30EFDB86688F1DCA616EC771B9FD + +I=326 +KEY=4C008516CD614B6588A526FFE33C055B250B7C4600DE8504429E57EDE2808B3C +PT=B81D30EFDB86688F1DCA616EC771B9FD +CT=A5AD142C8F078ABF419B7CF5C86C9F83 + +I=327 +KEY=DB65698F99E4A27019ABE194A89E9BC680A6686A8FD90FBB03052B182AEC14BF +PT=A5AD142C8F078ABF419B7CF5C86C9F83 +CT=861B59E3B61A5D02F0D70DFF40EF7FF2 + +I=328 +KEY=0790C16C53A7826B4B309DDF99B5239006BD318939C352B9F3D226E76A036B4D +PT=861B59E3B61A5D02F0D70DFF40EF7FF2 +CT=B0F4C2C4D0D282BE3128AD78D34B1FA6 + +I=329 +KEY=AFE168F089E676A806DD191003777E6DB649F34DE911D007C2FA8B9FB94874EB +PT=B0F4C2C4D0D282BE3128AD78D34B1FA6 +CT=9DFCF5727851ADE8C37A9AA3AA77B20D + +I=330 +KEY=F261CDF199D9EF436C1A08EB9755A2112BB5063F91407DEF0180113C133FC6E6 +PT=9DFCF5727851ADE8C37A9AA3AA77B20D +CT=9268DBA972B72C9DEF15CF9B8041F23B + +I=331 +KEY=E0D6DCF3BA840720688456A43E849C5CB9DDDD96E3F75172EE95DEA7937E34DD +PT=9268DBA972B72C9DEF15CF9B8041F23B +CT=D45A8B321CB6D8F28167C857BC2900BF + +I=332 +KEY=B77CF3A880C2E9E66D0C98A4D88555F46D8756A4FF4189806FF216F02F573462 +PT=D45A8B321CB6D8F28167C857BC2900BF +CT=0124FE2D8BCB81E1286A18D2BABEA919 + +I=333 +KEY=7729E55EFA6B249E0207E06AAF6F09206CA3A889748A086147980E2295E99D7B +PT=0124FE2D8BCB81E1286A18D2BABEA919 +CT=A1BB0D975A50BE8BD8C2973D4BA7BF42 + +I=334 +KEY=102384784C54539084BC7181AA95F184CD18A51E2EDAB6EA9F5A991FDE4E2239 +PT=A1BB0D975A50BE8BD8C2973D4BA7BF42 +CT=15302D5DBFD8E407EADDE9896B42CB13 + +I=335 +KEY=9FF48EF1068BFC07DA38F7790D7418D2D8288843910252ED75877096B50CE92A +PT=15302D5DBFD8E407EADDE9896B42CB13 +CT=90D93B8F802CFAD3F6E682DD704B5F43 + +I=336 +KEY=84477EB9007ECDF8D1C4A6A976C76AB848F1B3CC112EA83E8361F24BC547B669 +PT=90D93B8F802CFAD3F6E682DD704B5F43 +CT=2DD7E0B91C5DDF0FD118F4CDD836A212 + +I=337 +KEY=F1CE87DE930567CE29DF313D8778358D652653750D737731527906861D71147B +PT=2DD7E0B91C5DDF0FD118F4CDD836A212 +CT=AC9D307EFF44703D6FDA621FFF8D077C + +I=338 +KEY=22D31C8F64CFB23620A70E7CD4A486D3C9BB630BF237070C3DA36499E2FC1307 +PT=AC9D307EFF44703D6FDA621FFF8D077C +CT=CC6772DE3B27CB1DB3E5A804843EB6FF + +I=339 +KEY=FC9057D2D2D28BFAC4D5E3654717188205DC11D5C910CC118E46CC9D66C2A5F8 +PT=CC6772DE3B27CB1DB3E5A804843EB6FF +CT=BDB021550FE0744090EAFEEBCF422061 + +I=340 +KEY=1EA032190E7E4CC45D2E1E138429658AB86C3080C6F0B8511EAC3276A9808599 +PT=BDB021550FE0744090EAFEEBCF422061 +CT=C6E21F9A1305C3969F2D70C11D58A1A7 + +I=341 +KEY=B633EDA212B952785755700FBDC91CA57E8E2F1AD5F57BC7818142B7B4D8243E +PT=C6E21F9A1305C3969F2D70C11D58A1A7 +CT=01BC936B7063CA9D28DB1FFCCB9C2048 + +I=342 +KEY=94A06984520AB40D74568F0D5286AEE37F32BC71A596B15AA95A5D4B7F440476 +PT=01BC936B7063CA9D28DB1FFCCB9C2048 +CT=88279D100DFA68CEBD9949F19C3333F4 + +I=343 +KEY=96A3BD621155F71A9EFB8E35F95238ACF7152161A86CD99414C314BAE3773782 +PT=88279D100DFA68CEBD9949F19C3333F4 +CT=41574A686596D4741BF5DE52B5183260 + +I=344 +KEY=185312E4301E5AADC373CEB3EBA66FB7B6426B09CDFA0DE00F36CAE8566F05E2 +PT=41574A686596D4741BF5DE52B5183260 +CT=BD9F5087C32A66A4797C7EE87355FF4A + +I=345 +KEY=BC5D60D256DCA48E88E52F05C349431A0BDD3B8E0ED06B44764AB400253AFAA8 +PT=BD9F5087C32A66A4797C7EE87355FF4A +CT=A88BC3FAF87D6C1D3F98A2884EF1D4DA + +I=346 +KEY=1485A9209167A6FA2ECD2CE6AA03DBA5A356F874F6AD075949D216886BCB2E72 +PT=A88BC3FAF87D6C1D3F98A2884EF1D4DA +CT=E514E6E34A050EB917F2382EDF92353A + +I=347 +KEY=2B62B0E29763FF09F53A2006B990E97746421E97BCA809E05E202EA6B4591B48 +PT=E514E6E34A050EB917F2382EDF92353A +CT=142EEBE72E0F56ABE5D67FCC28F957F6 + +I=348 +KEY=FC13067E362B7C9C39AA73B85F32011C526CF57092A75F4BBBF6516A9CA04CBE +PT=142EEBE72E0F56ABE5D67FCC28F957F6 +CT=24FDB7A03FE8A9288BFAA5AC2527D015 + +I=349 +KEY=8AC3B473244989EA74025FE98269BC17769142D0AD4FF663300CF4C6B9879CAB +PT=24FDB7A03FE8A9288BFAA5AC2527D015 +CT=649095ABA5F4006B7B89D20F10A37AE9 + +I=350 +KEY=FD0F4205DBFF0160203898EF02E9088E1201D77B08BBF6084B8526C9A924E642 +PT=649095ABA5F4006B7B89D20F10A37AE9 +CT=F5428E8BDDDC31FC8EF67BC7DB3201D3 + +I=351 +KEY=701AF95194FB0918BC2CA79AFD507336E74359F0D567C7F4C5735D0E7216E791 +PT=F5428E8BDDDC31FC8EF67BC7DB3201D3 +CT=A56B2014A4929373DC1F6FD5C0AC138C + +I=352 +KEY=633D0E72722E6443D4E219086D221939422879E471F55487196C32DBB2BAF41D +PT=A56B2014A4929373DC1F6FD5C0AC138C +CT=F35F9CD43144B358843A48B4D1C41882 + +I=353 +KEY=DCA79BA0184EC0A22A875E5057CA967AB177E53040B1E7DF9D567A6F637EEC9F +PT=F35F9CD43144B358843A48B4D1C41882 +CT=A572C1F98330A1C1FA91DFD5A5B76AB9 + +I=354 +KEY=A3D0FE4C3C1A1CE19CF66CF80135553D140524C9C381461E67C7A5BAC6C98626 +PT=A572C1F98330A1C1FA91DFD5A5B76AB9 +CT=23C56E065427F0409504053DD8A994CD + +I=355 +KEY=175C8D4085802768D20875CDBE6EFE2437C04ACF97A6B65EF2C3A0871E6012EB +PT=23C56E065427F0409504053DD8A994CD +CT=7E666724C1CAC0A582325381E9C98D73 + +I=356 +KEY=800EE65CA3DE8643371DA10FB0605AB649A62DEB566C76FB70F1F306F7A99F98 +PT=7E666724C1CAC0A582325381E9C98D73 +CT=B6C18D730A074196884CADF151CAC890 + +I=357 +KEY=F526E578E8978822944644B146154425FF67A0985C6B376DF8BD5EF7A6635708 +PT=B6C18D730A074196884CADF151CAC890 +CT=0068BB370419CD39748559C2DE206817 + +I=358 +KEY=7D144850BE03306F41A642442890EA20FF0F1BAF5872FA548C38073578433F1F +PT=0068BB370419CD39748559C2DE206817 +CT=56852D240F01729C4EAD0B1FFC3EDA1F + +I=359 +KEY=33B2189E3774B1A066BE522C07550F88A98A368B577388C8C2950C2A847DE500 +PT=56852D240F01729C4EAD0B1FFC3EDA1F +CT=458633A84E1F5737E9668A37388CF3C2 + +I=360 +KEY=CF53C76250347B0CC5CAC660D52199B1EC0C0523196CDFFF2BF3861DBCF116C2 +PT=458633A84E1F5737E9668A37388CF3C2 +CT=F96E181E03350F27106C8D24403A49DD + +I=361 +KEY=618676C1702531077565060B5DA0570B15621D3D1A59D0D83B9F0B39FCCB5F1F +PT=F96E181E03350F27106C8D24403A49DD +CT=B515584E252F703A4EB55E81EDA58E30 + +I=362 +KEY=D2C8CF9645CD741F67263845150FE649A07745733F76A0E2752A55B8116ED12F +PT=B515584E252F703A4EB55E81EDA58E30 +CT=54E7D10C236785AFE0A93B3971D6F237 + +I=363 +KEY=D0847F41C7940023491C2F83D02F8271F490947F1C11254D95836E8160B82318 +PT=54E7D10C236785AFE0A93B3971D6F237 +CT=937DFDE10E96030A0A8823EA3EF31B98 + +I=364 +KEY=17502FC3077EFD420D2268CE0FF26F4667ED699E128726479F0B4D6B5E4B3880 +PT=937DFDE10E96030A0A8823EA3EF31B98 +CT=93FDF0392A3391C74DBE4229792C9630 + +I=365 +KEY=4D6AA08A6C7EB7CA9CBE7AF4500C229EF41099A738B4B780D2B50F422767AEB0 +PT=93FDF0392A3391C74DBE4229792C9630 +CT=B9F80E1476658E6CE7FADBA215298958 + +I=366 +KEY=D8820A50934290C146AFE477D9D4A0224DE897B34ED139EC354FD4E0324E27E8 +PT=B9F80E1476658E6CE7FADBA215298958 +CT=87ACDCD1F1332B9961CC5E18F9009A39 + +I=367 +KEY=50E8959452DD52247A6F21A0C7BEDEB8CA444B62BFE2127554838AF8CB4EBDD1 +PT=87ACDCD1F1332B9961CC5E18F9009A39 +CT=3DD6249971FEC0FB4432236078D98D53 + +I=368 +KEY=7A1973C5B90748596A54C709D1598DA5F7926FFBCE1CD28E10B1A998B3973082 +PT=3DD6249971FEC0FB4432236078D98D53 +CT=D540F8BDE3442D17E88B524D00618309 + +I=369 +KEY=F9C08719A452CA931A62C5BD8F1D669D22D297462D58FF99F83AFBD5B3F6B38B +PT=D540F8BDE3442D17E88B524D00618309 +CT=7BB18B2DA9ED188BCE3B18C02C9B3F3B + +I=370 +KEY=5EBA35F7E58381DBE29EC4A1D9B5B9AD59631C6B84B5E7123601E3159F6D8CB0 +PT=7BB18B2DA9ED188BCE3B18C02C9B3F3B +CT=9A7380BAA169495B0FC29BB002D70E48 + +I=371 +KEY=E442442FE32FA6BDA63AF0A6AC5D5AB2C3109CD125DCAE4939C378A59DBA82F8 +PT=9A7380BAA169495B0FC29BB002D70E48 +CT=88F3FE65298F7498A788E4196F13FC80 + +I=372 +KEY=39079A8713E148703212A6F7FFD1B04D4BE362B40C53DAD19E4B9CBCF2A97E78 +PT=88F3FE65298F7498A788E4196F13FC80 +CT=A5E6361FBA6418CD9B2F50992B50A557 + +I=373 +KEY=A99A33F38B36E3EE4DEE59F8A4282A84EE0554ABB637C21C0564CC25D9F9DB2F +PT=A5E6361FBA6418CD9B2F50992B50A557 +CT=B1430F431ACC1C498FABF2D33B63CC67 + +I=374 +KEY=BC09FAC540F44949F3B8EDFE2444CA725F465BE8ACFBDE558ACF3EF6E29A1748 +PT=B1430F431ACC1C498FABF2D33B63CC67 +CT=A90D76642D8D7899DD4A85EB92C89382 + +I=375 +KEY=D26C1D07B51073C609030DC782FFAE93F64B2D8C8176A6CC5785BB1D705284CA +PT=A90D76642D8D7899DD4A85EB92C89382 +CT=57522F39211100EF248D4A34E35CE4CE + +I=376 +KEY=2D7ADCD18F615F814B8D8B07CE48B4A1A11902B5A067A6237308F129930E6004 +PT=57522F39211100EF248D4A34E35CE4CE +CT=87AED1E0C9F067C5F3F6D3D3BBCDE872 + +I=377 +KEY=CA206C3442FAEFF3CB1292C675F52C2426B7D3556997C1E680FE22FA28C38876 +PT=87AED1E0C9F067C5F3F6D3D3BBCDE872 +CT=05798F53DFAE4A78D7BEEC24BE775B55 + +I=378 +KEY=6ECC5BC346B18446D77FFBC44CCB0B1823CE5C06B6398B9E5740CEDE96B4D323 +PT=05798F53DFAE4A78D7BEEC24BE775B55 +CT=7677CE104395FFA15B51F81DAFBCAB1A + +I=379 +KEY=2E52C8E239CF1E959AB831307034FEF755B99216F5AC743F0C1136C339087839 +PT=7677CE104395FFA15B51F81DAFBCAB1A +CT=760DE53561246F944B3E6279B39373F1 + +I=380 +KEY=79B65B7D435E2134A1AB9A1CC1F08A8423B4772394881BAB472F54BA8A9B0BC8 +PT=760DE53561246F944B3E6279B39373F1 +CT=5B61CC978A9C808767C272432765EC0B + +I=381 +KEY=9EF57B89E7B8127348A9EF05E93DCC8D78D5BBB41E149B2C20ED26F9ADFEE7C3 +PT=5B61CC978A9C808767C272432765EC0B +CT=902CDF3BD5E869E9CCFF8F2A454E1D42 + +I=382 +KEY=15BB7B6BC685E4865BFA134C59CFC9C5E8F9648FCBFCF2C5EC12A9D3E8B0FA81 +PT=902CDF3BD5E869E9CCFF8F2A454E1D42 +CT=38264937B9372C316478BDF7AE578900 + +I=383 +KEY=735D93C1DDD54986ACC6C2B0DFCC5E8AD0DF2DB872CBDEF4886A142446E77381 +PT=38264937B9372C316478BDF7AE578900 +CT=3BFE31D3E909E6EC3112F88DB8FFCA45 + +I=384 +KEY=675B0E7FC5BCC3AF319B1D55C1F62CCAEB211C6B9BC23818B978ECA9FE18B9C4 +PT=3BFE31D3E909E6EC3112F88DB8FFCA45 +CT=2BFD5F6532BC1D2A8DA34481F9228B84 + +I=385 +KEY=0AB242F9783E75D04E98733E63458F53C0DC430EA97E253234DBA828073A3240 +PT=2BFD5F6532BC1D2A8DA34481F9228B84 +CT=161481003108BAEFCC02BFD335C6A89F + +I=386 +KEY=58457CB82A24222839CF20D837F168A8D6C8C20E98769FDDF8D917FB32FC9ADF +PT=161481003108BAEFCC02BFD335C6A89F +CT=8A50E98A1165C1B6137231E519EC137B + +I=387 +KEY=C2C52CEA5654AAC9BD60FA04068094EF5C982B8489135E6BEBAB261E2B1089A4 +PT=8A50E98A1165C1B6137231E519EC137B +CT=24ACAA0F045F5A6765D3B468550585B5 + +I=388 +KEY=816757A434D81AA348E0B2F4FC44F4387834818B8D4C040C8E7892767E150C11 +PT=24ACAA0F045F5A6765D3B468550585B5 +CT=9993F9CBDAD9CA98C74CCBDB3E079F50 + +I=389 +KEY=647A9F1E43B08FD15EFC17342EB8970AE1A778405795CE94493459AD40129341 +PT=9993F9CBDAD9CA98C74CCBDB3E079F50 +CT=F676785AEF58297C28035E8E065829FF + +I=390 +KEY=4BB8B5020862EA9228B663DEDB39336717D1001AB8CDE7E861370723464ABABE +PT=F676785AEF58297C28035E8E065829FF +CT=ED16C74BD4252F7B72AA37D11E198508 + +I=391 +KEY=5392AAED87CE40891A69F4690A8743FBFAC7C7516CE8C893139D30F258533FB6 +PT=ED16C74BD4252F7B72AA37D11E198508 +CT=3BE7B6A9E197598146E98B7A501A2226 + +I=392 +KEY=9D8BABE9C12E6BA3A18EB23A92205456C12071F88D7F91125574BB8808491D90 +PT=3BE7B6A9E197598146E98B7A501A2226 +CT=CC1163A3D9AF3307ED740591AB66BD81 + +I=393 +KEY=231B451E506AC98FF993A3C7AD9C37F70D31125B54D0A215B800BE19A32FA011 +PT=CC1163A3D9AF3307ED740591AB66BD81 +CT=43FB8B2B44C740956111DA816616771D + +I=394 +KEY=1699C517EE1713D02C6EA0957E4A00CE4ECA99701017E280D9116498C539D70C +PT=43FB8B2B44C740956111DA816616771D +CT=A511AEA01DB8E7E16E7C53931625BEC3 + +I=395 +KEY=2624CE7970CC5DAFAC73C881FDD5F6EBEBDB37D00DAF0561B76D370BD31C69CF +PT=A511AEA01DB8E7E16E7C53931625BEC3 +CT=82EF6D2A1FF1DBCDF39DC04BE523229F + +I=396 +KEY=60C9931E19ED0D095F8DF75AEA56689769345AFA125EDEAC44F0F740363F4B50 +PT=82EF6D2A1FF1DBCDF39DC04BE523229F +CT=A595C8AAAAAD80DD4F40693FF2D89A19 + +I=397 +KEY=D461E3605B0AD0E87F5A078ECFE25934CCA19250B8F35E710BB09E7FC4E7D149 +PT=A595C8AAAAAD80DD4F40693FF2D89A19 +CT=57B18DFEAD129795C3BB8D6C06764729 + +I=398 +KEY=0BE3FC6C21764F1C15782D52D92919A09B101FAE15E1C9E4C80B1313C2919660 +PT=57B18DFEAD129795C3BB8D6C06764729 +CT=6F8606BBA6CC03A5D0A64FE21E277B60 + +I=399 +KEY=982D617A0F737342E99123A5A573D266F4961915B32DCA4118AD5CF1DCB6ED00 +PT=6F8606BBA6CC03A5D0A64FE21E277B60 +CT=1F6763DF807A7E70960D4CD3118E601A + =========== \ No newline at end of file --- krb5-1.4.4.orig/src/lib/crypto/aes/test/ecb_d_m.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/ecb_d_m.txt @@ -1,6024 +1,6024 @@ - -========================= - -FILENAME: "ecb_d_m.txt" - -Electronic Codebook (ECB) Mode - DECRYPTION -Monte Carlo Test - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========================= - -KEYSIZE=128 - -I=0 -KEY=00000000000000000000000000000000 -CT=00000000000000000000000000000000 -PT=44416AC2D1F53C583303917E6BE9EBE0 - -I=1 -KEY=44416AC2D1F53C583303917E6BE9EBE0 -CT=44416AC2D1F53C583303917E6BE9EBE0 -PT=E3FD51123B48A2E2AB1DB29894202222 - -I=2 -KEY=A7BC3BD0EABD9EBA981E23E6FFC9C9C2 -CT=E3FD51123B48A2E2AB1DB29894202222 -PT=877B88A77AEF04F05546539E17259F53 - -I=3 -KEY=20C7B37790529A4ACD587078E8EC5691 -CT=877B88A77AEF04F05546539E17259F53 -PT=C7A71C1B46261602EB1EE48FDA8155A4 - -I=4 -KEY=E760AF6CD6748C48264694F7326D0335 -CT=C7A71C1B46261602EB1EE48FDA8155A4 -PT=6B6AC8E00FAF7E045ECCFC426A137221 - -I=5 -KEY=8C0A678CD9DBF24C788A68B5587E7114 -CT=6B6AC8E00FAF7E045ECCFC426A137221 -PT=3F252821FA79AFC3F1798B343AAD41EE - -I=6 -KEY=B32F4FAD23A25D8F89F3E38162D330FA -CT=3F252821FA79AFC3F1798B343AAD41EE -PT=0B55C691E1F97205D137FF34478E5BC9 - -I=7 -KEY=B87A893CC25B2F8A58C41CB5255D6B33 -CT=0B55C691E1F97205D137FF34478E5BC9 -PT=F6CCC1CC18A3199D6427EDCA0BB2DF90 - -I=8 -KEY=4EB648F0DAF836173CE3F17F2EEFB4A3 -CT=F6CCC1CC18A3199D6427EDCA0BB2DF90 -PT=0CDD7D9734B1515C73DDA60EFF28CD89 - -I=9 -KEY=426B3567EE49674B4F3E5771D1C7792A -CT=0CDD7D9734B1515C73DDA60EFF28CD89 -PT=3E813131EDD440D9054799CEA508FF6F - -I=10 -KEY=7CEA0456039D27924A79CEBF74CF8645 -CT=3E813131EDD440D9054799CEA508FF6F -PT=8C6859BD0B6E078FAA6B686297653232 - -I=11 -KEY=F0825DEB08F3201DE012A6DDE3AAB477 -CT=8C6859BD0B6E078FAA6B686297653232 -PT=C966A4106C1DCE062D1346EB5E5133BB - -I=12 -KEY=39E4F9FB64EEEE1BCD01E036BDFB87CC -CT=C966A4106C1DCE062D1346EB5E5133BB -PT=4F4AE38B53FD7800F0E9F5C214E16F2A - -I=13 -KEY=76AE1A703713961B3DE815F4A91AE8E6 -CT=4F4AE38B53FD7800F0E9F5C214E16F2A -PT=C73A033491DC0B6A77FEA2FBCC9D305E - -I=14 -KEY=B1941944A6CF9D714A16B70F6587D8B8 -CT=C73A033491DC0B6A77FEA2FBCC9D305E -PT=C928C2A05BB44816EFBE6B13E94BC70E - -I=15 -KEY=78BCDBE4FD7BD567A5A8DC1C8CCC1FB6 -CT=C928C2A05BB44816EFBE6B13E94BC70E -PT=A7C1593E7B4BAEE5256D4081337E7CAF - -I=16 -KEY=DF7D82DA86307B8280C59C9DBFB26319 -CT=A7C1593E7B4BAEE5256D4081337E7CAF -PT=7ECD305AC27AEBFA2B8F85F9AC312638 - -I=17 -KEY=A1B0B280444A9078AB4A196413834521 -CT=7ECD305AC27AEBFA2B8F85F9AC312638 -PT=A24D1403A58B94798F5F3565ABFD3B44 - -I=18 -KEY=03FDA683E1C1040124152C01B87E7E65 -CT=A24D1403A58B94798F5F3565ABFD3B44 -PT=5B6E097B3B0E21DCC9CE9970701C7BD5 - -I=19 -KEY=5893AFF8DACF25DDEDDBB571C86205B0 -CT=5B6E097B3B0E21DCC9CE9970701C7BD5 -PT=4E21CEA52B3111AC8F6B204A1F5E65E2 - -I=20 -KEY=16B2615DF1FE347162B0953BD73C6052 -CT=4E21CEA52B3111AC8F6B204A1F5E65E2 -PT=806DDC5C37ADEEBB6FCE4730939D7A99 - -I=21 -KEY=96DFBD01C653DACA0D7ED20B44A11ACB -CT=806DDC5C37ADEEBB6FCE4730939D7A99 -PT=3462F7C6D3E071A0D3ACE7FD79149776 - -I=22 -KEY=A2BD4AC715B3AB6ADED235F63DB58DBD -CT=3462F7C6D3E071A0D3ACE7FD79149776 -PT=AF0FFF307B72284E794C8A64C30299D2 - -I=23 -KEY=0DB2B5F76EC18324A79EBF92FEB7146F -CT=AF0FFF307B72284E794C8A64C30299D2 -PT=E482B613FBCF9C4422D85E3160B1FB0F - -I=24 -KEY=E93003E4950E1F608546E1A39E06EF60 -CT=E482B613FBCF9C4422D85E3160B1FB0F -PT=FADC8EF9C95540AD69897DECAB2D50D5 - -I=25 -KEY=13EC8D1D5C5B5FCDECCF9C4F352BBFB5 -CT=FADC8EF9C95540AD69897DECAB2D50D5 -PT=2A765E237FB5230D792D455596A17118 - -I=26 -KEY=399AD33E23EE7CC095E2D91AA38ACEAD -CT=2A765E237FB5230D792D455596A17118 -PT=0887DA8012C7F95BD6ADB18D1ED3C2DB - -I=27 -KEY=311D09BE3129859B434F6897BD590C76 -CT=0887DA8012C7F95BD6ADB18D1ED3C2DB -PT=3BB831A7B6FAC3649176471012FAD1C1 - -I=28 -KEY=0AA5381987D346FFD2392F87AFA3DDB7 -CT=3BB831A7B6FAC3649176471012FAD1C1 -PT=E4F8629AB3489A0945B8B7188B953DE5 - -I=29 -KEY=EE5D5A83349BDCF69781989F2436E052 -CT=E4F8629AB3489A0945B8B7188B953DE5 -PT=1D4B0B5B321EB711939AB481239E2541 - -I=30 -KEY=F31651D806856BE7041B2C1E07A8C513 -CT=1D4B0B5B321EB711939AB481239E2541 -PT=71A368D5A33665D6FF9F33FECAFC6884 - -I=31 -KEY=82B5390DA5B30E31FB841FE0CD54AD97 -CT=71A368D5A33665D6FF9F33FECAFC6884 -PT=8ACF418080075BA23B05A52552773B84 - -I=32 -KEY=087A788D25B45593C081BAC59F239613 -CT=8ACF418080075BA23B05A52552773B84 -PT=E0E6058735F4FE765E882521D769FB41 - -I=33 -KEY=E89C7D0A1040ABE59E099FE4484A6D52 -CT=E0E6058735F4FE765E882521D769FB41 -PT=70DCE91F818DF2CDC4269F1B4EA0A465 - -I=34 -KEY=9840941591CD59285A2F00FF06EAC937 -CT=70DCE91F818DF2CDC4269F1B4EA0A465 -PT=E2F809D6DD77D72EF6DB5A82C42BF1CF - -I=35 -KEY=7AB89DC34CBA8E06ACF45A7DC2C138F8 -CT=E2F809D6DD77D72EF6DB5A82C42BF1CF -PT=0741D11DDD877957E753ECF8DB91C72B - -I=36 -KEY=7DF94CDE913DF7514BA7B6851950FFD3 -CT=0741D11DDD877957E753ECF8DB91C72B -PT=03E411012CA3B5B3CC163677D4B52456 - -I=37 -KEY=7E1D5DDFBD9E42E287B180F2CDE5DB85 -CT=03E411012CA3B5B3CC163677D4B52456 -PT=0270D90790EF8347ACFB87EB2FEC2710 - -I=38 -KEY=7C6D84D82D71C1A52B4A0719E209FC95 -CT=0270D90790EF8347ACFB87EB2FEC2710 -PT=3AE40270512374AF4022638E0A7A6D8E - -I=39 -KEY=468986A87C52B50A6B686497E873911B -CT=3AE40270512374AF4022638E0A7A6D8E -PT=8008D87E928A980FECA08CAF1EC91DDA - -I=40 -KEY=C6815ED6EED82D0587C8E838F6BA8CC1 -CT=8008D87E928A980FECA08CAF1EC91DDA -PT=1D479A54832FF1A81D30008EFDF16A34 - -I=41 -KEY=DBC6C4826DF7DCAD9AF8E8B60B4BE6F5 -CT=1D479A54832FF1A81D30008EFDF16A34 -PT=9E731FECD9A767BDA0C84B4C4D552BD3 - -I=42 -KEY=45B5DB6EB450BB103A30A3FA461ECD26 -CT=9E731FECD9A767BDA0C84B4C4D552BD3 -PT=C2211A6B16CD27C6C73A5C3C1A0132AC - -I=43 -KEY=8794C105A29D9CD6FD0AFFC65C1FFF8A -CT=C2211A6B16CD27C6C73A5C3C1A0132AC -PT=7E523DD6F25706F971F020F88FFA0CF7 - -I=44 -KEY=F9C6FCD350CA9A2F8CFADF3ED3E5F37D -CT=7E523DD6F25706F971F020F88FFA0CF7 -PT=0EDC01C6C1A8DA6A7C9EEE3587CB098E - -I=45 -KEY=F71AFD1591624045F064310B542EFAF3 -CT=0EDC01C6C1A8DA6A7C9EEE3587CB098E -PT=EE479106871DA872632794633B1ACF0E - -I=46 -KEY=195D6C13167FE8379343A5686F3435FD -CT=EE479106871DA872632794633B1ACF0E -PT=7EC1A4578D911F336184DACCCA92D943 - -I=47 -KEY=679CC8449BEEF704F2C77FA4A5A6ECBE -CT=7EC1A4578D911F336184DACCCA92D943 -PT=53715F25AE02513F181E3DECBB007803 - -I=48 -KEY=34ED976135ECA63BEAD942481EA694BD -CT=53715F25AE02513F181E3DECBB007803 -PT=304D5764B5206F8204A69D1BED11FA62 - -I=49 -KEY=04A0C00580CCC9B9EE7FDF53F3B76EDF -CT=304D5764B5206F8204A69D1BED11FA62 -PT=5A7590ADEF208BFD808499A2BFE9B011 - -I=50 -KEY=5ED550A86FEC42446EFB46F14C5EDECE -CT=5A7590ADEF208BFD808499A2BFE9B011 -PT=2502C0F68A721A93ECE8D7B6C2097BA4 - -I=51 -KEY=7BD7905EE59E58D7821391478E57A56A -CT=2502C0F68A721A93ECE8D7B6C2097BA4 -PT=1C814E26A6464086D606C7B4C6DFD85B - -I=52 -KEY=6756DE7843D81851541556F348887D31 -CT=1C814E26A6464086D606C7B4C6DFD85B -PT=9D55D6EA99BA391190068205DD9AE69C - -I=53 -KEY=FA030892DA622140C413D4F695129BAD -CT=9D55D6EA99BA391190068205DD9AE69C -PT=9D1212D0BD8C26422EEFF4DDB16B2EF3 - -I=54 -KEY=67111A4267EE0702EAFC202B2479B55E -CT=9D1212D0BD8C26422EEFF4DDB16B2EF3 -PT=54DF71E70141E1712449CDC1AC7D07F6 - -I=55 -KEY=33CE6BA566AFE673CEB5EDEA8804B2A8 -CT=54DF71E70141E1712449CDC1AC7D07F6 -PT=AF3DE6F3510978928C129CFC19FB29B4 - -I=56 -KEY=9CF38D5637A69EE142A7711691FF9B1C -CT=AF3DE6F3510978928C129CFC19FB29B4 -PT=830DB7014774C7DF870C8456BC0162AB - -I=57 -KEY=1FFE3A5770D2593EC5ABF5402DFEF9B7 -CT=830DB7014774C7DF870C8456BC0162AB -PT=6606C0A36A18BEFF33485F95B82C30E7 - -I=58 -KEY=79F8FAF41ACAE7C1F6E3AAD595D2C950 -CT=6606C0A36A18BEFF33485F95B82C30E7 -PT=4B1E64672B89056DF693E73B419E786E - -I=59 -KEY=32E69E933143E2AC00704DEED44CB13E -CT=4B1E64672B89056DF693E73B419E786E -PT=1877DEEAFF10A5A3F5E9A811BF7595BA - -I=60 -KEY=2A914079CE53470FF599E5FF6B392484 -CT=1877DEEAFF10A5A3F5E9A811BF7595BA -PT=A11A48215BF59CC53BC8A009DCA3973D - -I=61 -KEY=8B8B085895A6DBCACE5145F6B79AB3B9 -CT=A11A48215BF59CC53BC8A009DCA3973D -PT=E80535676DE8898A3624B8127EC21024 - -I=62 -KEY=638E3D3FF84E5240F875FDE4C958A39D -CT=E80535676DE8898A3624B8127EC21024 -PT=E2977A804EC9A8B03C85234AD3A95B52 - -I=63 -KEY=811947BFB687FAF0C4F0DEAE1AF1F8CF -CT=E2977A804EC9A8B03C85234AD3A95B52 -PT=D776D8BF13F736483862328571C06C61 - -I=64 -KEY=566F9F00A570CCB8FC92EC2B6B3194AE -CT=D776D8BF13F736483862328571C06C61 -PT=3AF7969F3247A0914037209556997164 - -I=65 -KEY=6C98099F97376C29BCA5CCBE3DA8E5CA -CT=3AF7969F3247A0914037209556997164 -PT=4F87DDC715CEE3A9D67645AD920DF74A - -I=66 -KEY=231FD45882F98F806AD38913AFA51280 -CT=4F87DDC715CEE3A9D67645AD920DF74A -PT=9E88CA52E6B0C160E52B23F36882DBA1 - -I=67 -KEY=BD971E0A64494EE08FF8AAE0C727C921 -CT=9E88CA52E6B0C160E52B23F36882DBA1 -PT=CAD26E5881D9D4E52C7595C773E0FDAB - -I=68 -KEY=77457052E5909A05A38D3F27B4C7348A -CT=CAD26E5881D9D4E52C7595C773E0FDAB -PT=C2D0B3D713CFCA5ABB7B9DED14429F37 - -I=69 -KEY=B595C385F65F505F18F6A2CAA085ABBD -CT=C2D0B3D713CFCA5ABB7B9DED14429F37 -PT=DD7AADA7524A4878F7C598C4CBCD9CAB - -I=70 -KEY=68EF6E22A4151827EF333A0E6B483716 -CT=DD7AADA7524A4878F7C598C4CBCD9CAB -PT=A0F33B1FCC3F4A4B0982F0823C4ED3C9 - -I=71 -KEY=C81C553D682A526CE6B1CA8C5706E4DF -CT=A0F33B1FCC3F4A4B0982F0823C4ED3C9 -PT=B22BB23CD68E8779A8C0FC9A350CB756 - -I=72 -KEY=7A37E701BEA4D5154E713616620A5389 -CT=B22BB23CD68E8779A8C0FC9A350CB756 -PT=EA4D96AC54BD8387AD36AC8C855A9D44 - -I=73 -KEY=907A71ADEA195692E3479A9AE750CECD -CT=EA4D96AC54BD8387AD36AC8C855A9D44 -PT=A3B90CFDE355723BC94999784534FA74 - -I=74 -KEY=33C37D50094C24A92A0E03E2A26434B9 -CT=A3B90CFDE355723BC94999784534FA74 -PT=55636C86A64383768CB948FF57B29322 - -I=75 -KEY=66A011D6AF0FA7DFA6B74B1DF5D6A79B -CT=55636C86A64383768CB948FF57B29322 -PT=B29CCDFD8E7BE50892F0D77DD969F97E - -I=76 -KEY=D43CDC2B217442D734479C602CBF5EE5 -CT=B29CCDFD8E7BE50892F0D77DD969F97E -PT=9CF0432822EABDF489B57EDD9CEF7FEA - -I=77 -KEY=48CC9F03039EFF23BDF2E2BDB050210F -CT=9CF0432822EABDF489B57EDD9CEF7FEA -PT=AA753B7D38E807D691005899385DC6DA - -I=78 -KEY=E2B9A47E3B76F8F52CF2BA24880DE7D5 -CT=AA753B7D38E807D691005899385DC6DA -PT=E4F0681527FA7AD3D1E7C78C03FB79FA - -I=79 -KEY=0649CC6B1C8C8226FD157DA88BF69E2F -CT=E4F0681527FA7AD3D1E7C78C03FB79FA -PT=7923AF8E50F378B9C97D2F162348025B - -I=80 -KEY=7F6A63E54C7FFA9F346852BEA8BE9C74 -CT=7923AF8E50F378B9C97D2F162348025B -PT=3BEFAB920CA31A6B8B87E11DF97B42DE - -I=81 -KEY=4485C87740DCE0F4BFEFB3A351C5DEAA -CT=3BEFAB920CA31A6B8B87E11DF97B42DE -PT=4661D6B8004611976A21C69804D102C0 - -I=82 -KEY=02E41ECF409AF163D5CE753B5514DC6A -CT=4661D6B8004611976A21C69804D102C0 -PT=B861DF2279F2AEE4FCFD7D322AD0BE2B - -I=83 -KEY=BA85C1ED39685F87293308097FC46241 -CT=B861DF2279F2AEE4FCFD7D322AD0BE2B -PT=1785745618A541F9454443FFB494F2E9 - -I=84 -KEY=AD00B5BB21CD1E7E6C774BF6CB5090A8 -CT=1785745618A541F9454443FFB494F2E9 -PT=AA7507A80B4CCF33E8B4F09E2D7004F6 - -I=85 -KEY=0775B2132A81D14D84C3BB68E620945E -CT=AA7507A80B4CCF33E8B4F09E2D7004F6 -PT=433412B8F10F81A557AC461823097FC7 - -I=86 -KEY=4441A0ABDB8E50E8D36FFD70C529EB99 -CT=433412B8F10F81A557AC461823097FC7 -PT=EC3206BDB3765876B74952C411D40373 - -I=87 -KEY=A873A61668F8089E6426AFB4D4FDE8EA -CT=EC3206BDB3765876B74952C411D40373 -PT=F7F994027D328FA3D70C9DEABD3BE733 - -I=88 -KEY=5F8A321415CA873DB32A325E69C60FD9 -CT=F7F994027D328FA3D70C9DEABD3BE733 -PT=E2A8419BF86A2408ED8D0274A5CE0E10 - -I=89 -KEY=BD22738FEDA0A3355EA7302ACC0801C9 -CT=E2A8419BF86A2408ED8D0274A5CE0E10 -PT=80FB8CD5243C89D77F503B2F16979F90 - -I=90 -KEY=3DD9FF5AC99C2AE221F70B05DA9F9E59 -CT=80FB8CD5243C89D77F503B2F16979F90 -PT=F7773137F233AE2609C2C9AC36F58224 - -I=91 -KEY=CAAECE6D3BAF84C42835C2A9EC6A1C7D -CT=F7773137F233AE2609C2C9AC36F58224 -PT=F3D0A1DADA4A009E8E4C0EF717469BCD - -I=92 -KEY=397E6FB7E1E5845AA679CC5EFB2C87B0 -CT=F3D0A1DADA4A009E8E4C0EF717469BCD -PT=0AC0FF22EB653A26A3F1F0CFE3808609 - -I=93 -KEY=33BE90950A80BE7C05883C9118AC01B9 -CT=0AC0FF22EB653A26A3F1F0CFE3808609 -PT=28FF865CE11720BB1B56EF49D7D1840D - -I=94 -KEY=1B4116C9EB979EC71EDED3D8CF7D85B4 -CT=28FF865CE11720BB1B56EF49D7D1840D -PT=001FAF58E22F5E8ED6BCC7FD581D7C2F - -I=95 -KEY=1B5EB99109B8C049C86214259760F99B -CT=001FAF58E22F5E8ED6BCC7FD581D7C2F -PT=32B41303A58AB49CB4CB2322B77383B3 - -I=96 -KEY=29EAAA92AC3274D57CA9370720137A28 -CT=32B41303A58AB49CB4CB2322B77383B3 -PT=9C52020FCDE0306C8E19CDF68FEFDF50 - -I=97 -KEY=B5B8A89D61D244B9F2B0FAF1AFFCA578 -CT=9C52020FCDE0306C8E19CDF68FEFDF50 -PT=2E3452997687D12E3A8C59B9178B09E2 - -I=98 -KEY=9B8CFA0417559597C83CA348B877AC9A -CT=2E3452997687D12E3A8C59B9178B09E2 -PT=872CF16DBB7CD6EA8EBB91A60BDE0C6F - -I=99 -KEY=1CA00B69AC29437D468732EEB3A9A0F5 -CT=872CF16DBB7CD6EA8EBB91A60BDE0C6F -PT=7862C78E3B209535E6C6BE92F5EDF42B - -I=100 -KEY=64C2CCE79709D648A0418C7C464454DE -CT=7862C78E3B209535E6C6BE92F5EDF42B -PT=9185D8487C1D2DB679A52FDA2FE5FFCD - -I=101 -KEY=F54714AFEB14FBFED9E4A3A669A1AB13 -CT=9185D8487C1D2DB679A52FDA2FE5FFCD -PT=77C3AF8C81CDB1CDEF5C0429CF3E5DA4 - -I=102 -KEY=8284BB236AD94A3336B8A78FA69FF6B7 -CT=77C3AF8C81CDB1CDEF5C0429CF3E5DA4 -PT=6F36C74290EA6332E98CD23D08AEF7F9 - -I=103 -KEY=EDB27C61FA332901DF3475B2AE31014E -CT=6F36C74290EA6332E98CD23D08AEF7F9 -PT=4A7831538FA1D32E3F8631BEFD99AA73 - -I=104 -KEY=A7CA4D327592FA2FE0B2440C53A8AB3D -CT=4A7831538FA1D32E3F8631BEFD99AA73 -PT=5D2B599D9AF9054A99C25577C9286C9E - -I=105 -KEY=FAE114AFEF6BFF657970117B9A80C7A3 -CT=5D2B599D9AF9054A99C25577C9286C9E -PT=65E4088200BCC01FCEE39C6E42082FD8 - -I=106 -KEY=9F051C2DEFD73F7AB7938D15D888E87B -CT=65E4088200BCC01FCEE39C6E42082FD8 -PT=4588E0D3AABBEFE611B9576391B903E9 - -I=107 -KEY=DA8DFCFE456CD09CA62ADA764931EB92 -CT=4588E0D3AABBEFE611B9576391B903E9 -PT=A55622F833FF271DD8A8F01CF5828FCF - -I=108 -KEY=7FDBDE067693F7817E822A6ABCB3645D -CT=A55622F833FF271DD8A8F01CF5828FCF -PT=8C954010C870B2DB7FA44E1DEBFE6DE8 - -I=109 -KEY=F34E9E16BEE3455A01266477574D09B5 -CT=8C954010C870B2DB7FA44E1DEBFE6DE8 -PT=58B7BD00ED18FC81E618807DE65305B8 - -I=110 -KEY=ABF9231653FBB9DBE73EE40AB11E0C0D -CT=58B7BD00ED18FC81E618807DE65305B8 -PT=EF82E5F4879039F2A1A4CC2F2044BD14 - -I=111 -KEY=447BC6E2D46B8029469A2825915AB119 -CT=EF82E5F4879039F2A1A4CC2F2044BD14 -PT=2B6C12307F14FD50B41D8F972B19AC76 - -I=112 -KEY=6F17D4D2AB7F7D79F287A7B2BA431D6F -CT=2B6C12307F14FD50B41D8F972B19AC76 -PT=C9B6D042CE76892D17F70D4EE00A0D79 - -I=113 -KEY=A6A104906509F454E570AAFC5A491016 -CT=C9B6D042CE76892D17F70D4EE00A0D79 -PT=1B08F9293BBFC44DDCF2C1D26A9DD00B - -I=114 -KEY=BDA9FDB95EB6301939826B2E30D4C01D -CT=1B08F9293BBFC44DDCF2C1D26A9DD00B -PT=4FD353B247048FAAA728E10C691C70CA - -I=115 -KEY=F27AAE0B19B2BFB39EAA8A2259C8B0D7 -CT=4FD353B247048FAAA728E10C691C70CA -PT=0BBB6FDBC62C428B85111BC7C93AE994 - -I=116 -KEY=F9C1C1D0DF9EFD381BBB91E590F25943 -CT=0BBB6FDBC62C428B85111BC7C93AE994 -PT=9C1A213A5772DE6C15CE7406F84BED03 - -I=117 -KEY=65DBE0EA88EC23540E75E5E368B9B440 -CT=9C1A213A5772DE6C15CE7406F84BED03 -PT=AB3DE06BBDB213D64F735CA990DC373C - -I=118 -KEY=CEE60081355E30824106B94AF865837C -CT=AB3DE06BBDB213D64F735CA990DC373C -PT=6C004A1A114E90C7903AA4A0120A2B10 - -I=119 -KEY=A2E64A9B2410A045D13C1DEAEA6FA86C -CT=6C004A1A114E90C7903AA4A0120A2B10 -PT=6405A033C294E72119A8955712548121 - -I=120 -KEY=C6E3EAA8E6844764C89488BDF83B294D -CT=6405A033C294E72119A8955712548121 -PT=AE8A3BAC7279B1BC152A5AD8EBAC3EAD - -I=121 -KEY=6869D10494FDF6D8DDBED265139717E0 -CT=AE8A3BAC7279B1BC152A5AD8EBAC3EAD -PT=4ADDA9999D2BE20D8925F39699563294 - -I=122 -KEY=22B4789D09D614D5549B21F38AC12574 -CT=4ADDA9999D2BE20D8925F39699563294 -PT=BC5CA33CB2A1A580EB92946C77A63467 - -I=123 -KEY=9EE8DBA1BB77B155BF09B59FFD671113 -CT=BC5CA33CB2A1A580EB92946C77A63467 -PT=F7ABEAD301264A3E59EABA0B9606DC92 - -I=124 -KEY=69433172BA51FB6BE6E30F946B61CD81 -CT=F7ABEAD301264A3E59EABA0B9606DC92 -PT=2566114A10BE9BF19E0910486DAB6BE5 - -I=125 -KEY=4C252038AAEF609A78EA1FDC06CAA664 -CT=2566114A10BE9BF19E0910486DAB6BE5 -PT=AF72E1B179660A1B833D9D4FC8473B6B - -I=126 -KEY=E357C189D3896A81FBD78293CE8D9D0F -CT=AF72E1B179660A1B833D9D4FC8473B6B -PT=DFF968B761D8E154B74C9D568C12008E - -I=127 -KEY=3CAEA93EB2518BD54C9B1FC5429F9D81 -CT=DFF968B761D8E154B74C9D568C12008E -PT=42DF098BCB57D0D25269E29C9BC99DE6 - -I=128 -KEY=7E71A0B579065B071EF2FD59D9560067 -CT=42DF098BCB57D0D25269E29C9BC99DE6 -PT=66C34CAAEFC2009B985D1E622FC61AB4 - -I=129 -KEY=18B2EC1F96C45B9C86AFE33BF6901AD3 -CT=66C34CAAEFC2009B985D1E622FC61AB4 -PT=150C1BF943982C5EA1A6839D94F23288 - -I=130 -KEY=0DBEF7E6D55C77C2270960A66262285B -CT=150C1BF943982C5EA1A6839D94F23288 -PT=048BFBB28879206964C5F3B41264011A - -I=131 -KEY=09350C545D2557AB43CC931270062941 -CT=048BFBB28879206964C5F3B41264011A -PT=54D2DC53B87EC949F0FA0E134EE26D50 - -I=132 -KEY=5DE7D007E55B9EE2B3369D013EE44411 -CT=54D2DC53B87EC949F0FA0E134EE26D50 -PT=1BA46AFE1AE87C4F0254BF02DF3B6D37 - -I=133 -KEY=4643BAF9FFB3E2ADB1622203E1DF2926 -CT=1BA46AFE1AE87C4F0254BF02DF3B6D37 -PT=7733E74E743C9E997AC2ED36B2E89CE8 - -I=134 -KEY=31705DB78B8F7C34CBA0CF355337B5CE -CT=7733E74E743C9E997AC2ED36B2E89CE8 -PT=670AEA160FAC67ABCECA140EB8195EB5 - -I=135 -KEY=567AB7A184231B9F056ADB3BEB2EEB7B -CT=670AEA160FAC67ABCECA140EB8195EB5 -PT=7CFD74D510AC894FF5B698280386F4FF - -I=136 -KEY=2A87C374948F92D0F0DC4313E8A81F84 -CT=7CFD74D510AC894FF5B698280386F4FF -PT=10D03F32C0694E9FFF598E101998105E - -I=137 -KEY=3A57FC4654E6DC4F0F85CD03F1300FDA -CT=10D03F32C0694E9FFF598E101998105E -PT=351D6E8D1C26F36973356F6235B8ABAD - -I=138 -KEY=0F4A92CB48C02F267CB0A261C488A477 -CT=351D6E8D1C26F36973356F6235B8ABAD -PT=0DDDA7AA09FBD986C0B9EA2B018FAE4F - -I=139 -KEY=02973561413BF6A0BC09484AC5070A38 -CT=0DDDA7AA09FBD986C0B9EA2B018FAE4F -PT=31C5B68B7A08D1B7320FAB052CC3B0D1 - -I=140 -KEY=335283EA3B3327178E06E34FE9C4BAE9 -CT=31C5B68B7A08D1B7320FAB052CC3B0D1 -PT=501B8D9EE91468522029020A39484DB5 - -I=141 -KEY=63490E74D2274F45AE2FE145D08CF75C -CT=501B8D9EE91468522029020A39484DB5 -PT=2714FBA566DFD4909B8ABF29B1D5A8E8 - -I=142 -KEY=445DF5D1B4F89BD535A55E6C61595FB4 -CT=2714FBA566DFD4909B8ABF29B1D5A8E8 -PT=94485381E5088D67BC1335C89FA5C2B8 - -I=143 -KEY=D015A65051F016B289B66BA4FEFC9D0C -CT=94485381E5088D67BC1335C89FA5C2B8 -PT=BE5BEE26D6686A0EB5838C237FEF79B7 - -I=144 -KEY=6E4E487687987CBC3C35E7878113E4BB -CT=BE5BEE26D6686A0EB5838C237FEF79B7 -PT=417F73D46CFBE3C5C9AD513BCBC6D185 - -I=145 -KEY=2F313BA2EB639F79F598B6BC4AD5353E -CT=417F73D46CFBE3C5C9AD513BCBC6D185 -PT=AE3B07350B3BE7D4F9F6FE2F95622449 - -I=146 -KEY=810A3C97E05878AD0C6E4893DFB71177 -CT=AE3B07350B3BE7D4F9F6FE2F95622449 -PT=7BD4231225A7B665953AB034E24A7C7A - -I=147 -KEY=FADE1F85C5FFCEC89954F8A73DFD6D0D -CT=7BD4231225A7B665953AB034E24A7C7A -PT=3C1FBE8F3CEB1438B4A64E59FAF291CF - -I=148 -KEY=C6C1A10AF914DAF02DF2B6FEC70FFCC2 -CT=3C1FBE8F3CEB1438B4A64E59FAF291CF -PT=ACFF7F1E71AA952CF8ADB24FEE18A7BB - -I=149 -KEY=6A3EDE1488BE4FDCD55F04B129175B79 -CT=ACFF7F1E71AA952CF8ADB24FEE18A7BB -PT=3C3A6D3FD73B36317417106A92E2B43E - -I=150 -KEY=5604B32B5F8579EDA14814DBBBF5EF47 -CT=3C3A6D3FD73B36317417106A92E2B43E -PT=F34F8C719A4A74DD8F4FA4CBC520827A - -I=151 -KEY=A54B3F5AC5CF0D302E07B0107ED56D3D -CT=F34F8C719A4A74DD8F4FA4CBC520827A -PT=6A5D56FB6C7EBA15112AF8A093F3E1E1 - -I=152 -KEY=CF1669A1A9B1B7253F2D48B0ED268CDC -CT=6A5D56FB6C7EBA15112AF8A093F3E1E1 -PT=8BF39EE3B8ED0F6A6EA92319A81B10E6 - -I=153 -KEY=44E5F742115CB84F51846BA9453D9C3A -CT=8BF39EE3B8ED0F6A6EA92319A81B10E6 -PT=2BC796D320C444BBBAD466D686F460F6 - -I=154 -KEY=6F2261913198FCF4EB500D7FC3C9FCCC -CT=2BC796D320C444BBBAD466D686F460F6 -PT=2CF595F424ED50B1A146E387B128CBA3 - -I=155 -KEY=43D7F4651575AC454A16EEF872E1376F -CT=2CF595F424ED50B1A146E387B128CBA3 -PT=56F2E856045BAE66EA003A6C39205344 - -I=156 -KEY=15251C33112E0223A016D4944BC1642B -CT=56F2E856045BAE66EA003A6C39205344 -PT=31C83401BD83424BA6E94C0D6D453D9A - -I=157 -KEY=24ED2832ACAD406806FF9899268459B1 -CT=31C83401BD83424BA6E94C0D6D453D9A -PT=A687F05992CCB57CDE61AFF8878913ED - -I=158 -KEY=826AD86B3E61F514D89E3761A10D4A5C -CT=A687F05992CCB57CDE61AFF8878913ED -PT=16E771193C2473502F415C27FB101D94 - -I=159 -KEY=948DA97202458644F7DF6B465A1D57C8 -CT=16E771193C2473502F415C27FB101D94 -PT=C69CDBA29C9EDC3407C1C73A756A0B6E - -I=160 -KEY=521172D09EDB5A70F01EAC7C2F775CA6 -CT=C69CDBA29C9EDC3407C1C73A756A0B6E -PT=566D82281F48E3217F3852115CF2E944 - -I=161 -KEY=047CF0F88193B9518F26FE6D7385B5E2 -CT=566D82281F48E3217F3852115CF2E944 -PT=B3FEBC8F8F0F0B652C4358BCC9BF54DF - -I=162 -KEY=B7824C770E9CB234A365A6D1BA3AE13D -CT=B3FEBC8F8F0F0B652C4358BCC9BF54DF -PT=BBB84877094B3EB86203D17C92CF5168 - -I=163 -KEY=0C3A040007D78C8CC16677AD28F5B055 -CT=BBB84877094B3EB86203D17C92CF5168 -PT=2C45E5A3F8C564862DA4D8AD428D3E67 - -I=164 -KEY=207FE1A3FF12E80AECC2AF006A788E32 -CT=2C45E5A3F8C564862DA4D8AD428D3E67 -PT=10ADC2AF56600D95AD8BB579EF5170C9 - -I=165 -KEY=30D2230CA972E59F41491A798529FEFB -CT=10ADC2AF56600D95AD8BB579EF5170C9 -PT=1854BB8AC568F3599153BE1AC60BA78D - -I=166 -KEY=288698866C1A16C6D01AA46343225976 -CT=1854BB8AC568F3599153BE1AC60BA78D -PT=E641765C80D8812A1A0F4606C639642E - -I=167 -KEY=CEC7EEDAECC297ECCA15E265851B3D58 -CT=E641765C80D8812A1A0F4606C639642E -PT=317AC70CEAA87AE66A15C22BD5E534E5 - -I=168 -KEY=FFBD29D6066AED0AA000204E50FE09BD -CT=317AC70CEAA87AE66A15C22BD5E534E5 -PT=BFFB8D7B3D9F54727944ABC3F6474362 - -I=169 -KEY=4046A4AD3BF5B978D9448B8DA6B94ADF -CT=BFFB8D7B3D9F54727944ABC3F6474362 -PT=060765D1D9D289B862DA274CFDB4D7A0 - -I=170 -KEY=4641C17CE22730C0BB9EACC15B0D9D7F -CT=060765D1D9D289B862DA274CFDB4D7A0 -PT=FBAFA4C1D6CEF2A45E9E084311FDF858 - -I=171 -KEY=BDEE65BD34E9C264E500A4824AF06527 -CT=FBAFA4C1D6CEF2A45E9E084311FDF858 -PT=F7F36BFDA77362B470B0B074241C58E9 - -I=172 -KEY=4A1D0E40939AA0D095B014F66EEC3DCE -CT=F7F36BFDA77362B470B0B074241C58E9 -PT=2FC236EDCD573A6DCFBA7930E9CF4698 - -I=173 -KEY=65DF38AD5ECD9ABD5A0A6DC687237B56 -CT=2FC236EDCD573A6DCFBA7930E9CF4698 -PT=949A9994DC976595BFACA5F31116A165 - -I=174 -KEY=F145A139825AFF28E5A6C8359635DA33 -CT=949A9994DC976595BFACA5F31116A165 -PT=19373CA9D519BF83EAA4C17E1EE8225C - -I=175 -KEY=E8729D90574340AB0F02094B88DDF86F -CT=19373CA9D519BF83EAA4C17E1EE8225C -PT=685C783918997A7572B0A09315F1F2DB - -I=176 -KEY=802EE5A94FDA3ADE7DB2A9D89D2C0AB4 -CT=685C783918997A7572B0A09315F1F2DB -PT=FC0CB1792EADB7E8DECB021A435DE1E7 - -I=177 -KEY=7C2254D061778D36A379ABC2DE71EB53 -CT=FC0CB1792EADB7E8DECB021A435DE1E7 -PT=797C5E5B4F3B38E7C72FF7AAAB270E86 - -I=178 -KEY=055E0A8B2E4CB5D164565C687556E5D5 -CT=797C5E5B4F3B38E7C72FF7AAAB270E86 -PT=A5AB675262EA186F777681647B6AA1F9 - -I=179 -KEY=A0F56DD94CA6ADBE1320DD0C0E3C442C -CT=A5AB675262EA186F777681647B6AA1F9 -PT=08CDF6AF55BBB247D0DE1A69CD041A78 - -I=180 -KEY=A8389B76191D1FF9C3FEC765C3385E54 -CT=08CDF6AF55BBB247D0DE1A69CD041A78 -PT=DED1F3C30AB5EC3455C7B6A756E5FF03 - -I=181 -KEY=76E968B513A8F3CD963971C295DDA157 -CT=DED1F3C30AB5EC3455C7B6A756E5FF03 -PT=C759A17B354D668D1BA5541D16241D9F - -I=182 -KEY=B1B0C9CE26E595408D9C25DF83F9BCC8 -CT=C759A17B354D668D1BA5541D16241D9F -PT=97E011FE7B327B8292270D4CD18BD9AC - -I=183 -KEY=2650D8305DD7EEC21FBB289352726564 -CT=97E011FE7B327B8292270D4CD18BD9AC -PT=9F004E4282F790C06681F16262EF78CF - -I=184 -KEY=B9509672DF207E02793AD9F1309D1DAB -CT=9F004E4282F790C06681F16262EF78CF -PT=6B34AA95EFD874915DAE275CE34A04B9 - -I=185 -KEY=D2643CE730F80A932494FEADD3D71912 -CT=6B34AA95EFD874915DAE275CE34A04B9 -PT=96966D118C50B67849F93B109492B5EB - -I=186 -KEY=44F251F6BCA8BCEB6D6DC5BD4745ACF9 -CT=96966D118C50B67849F93B109492B5EB -PT=2CA6F85E4F29BE884392A0FEDD08D5A7 - -I=187 -KEY=6854A9A8F38102632EFF65439A4D795E -CT=2CA6F85E4F29BE884392A0FEDD08D5A7 -PT=21B71D4F23DDC002CAAFB7426009BD27 - -I=188 -KEY=49E3B4E7D05CC261E450D201FA44C479 -CT=21B71D4F23DDC002CAAFB7426009BD27 -PT=BF059F1945E9E51B22B308849757B475 - -I=189 -KEY=F6E62BFE95B5277AC6E3DA856D13700C -CT=BF059F1945E9E51B22B308849757B475 -PT=434F4E756A3178472E12B80A1C2ED83E - -I=190 -KEY=B5A9658BFF845F3DE8F1628F713DA832 -CT=434F4E756A3178472E12B80A1C2ED83E -PT=37DB2B0D5967700CDE348FB60661A6D4 - -I=191 -KEY=82724E86A6E32F3136C5ED39775C0EE6 -CT=37DB2B0D5967700CDE348FB60661A6D4 -PT=D31C5130F8F217AC0014B5F37B9BB86B - -I=192 -KEY=516E1FB65E11389D36D158CA0CC7B68D -CT=D31C5130F8F217AC0014B5F37B9BB86B -PT=3B8CD15967907F9C617697EBEF395B16 - -I=193 -KEY=6AE2CEEF3981470157A7CF21E3FEED9B -CT=3B8CD15967907F9C617697EBEF395B16 -PT=AF17B5E5236BF46576379CD4E5AF8A34 - -I=194 -KEY=C5F57B0A1AEAB364219053F5065167AF -CT=AF17B5E5236BF46576379CD4E5AF8A34 -PT=88286D6FB237181EC239C1D70C0D6675 - -I=195 -KEY=4DDD1665A8DDAB7AE3A992220A5C01DA -CT=88286D6FB237181EC239C1D70C0D6675 -PT=8A5207BB1283343B3692045183451A7D - -I=196 -KEY=C78F11DEBA5E9F41D53B967389191BA7 -CT=8A5207BB1283343B3692045183451A7D -PT=53C12FAC4B0185AA0CE067FC67EC5B9C - -I=197 -KEY=944E3E72F15F1AEBD9DBF18FEEF5403B -CT=53C12FAC4B0185AA0CE067FC67EC5B9C -PT=BBA2BB9B1CA48D2E97E0C39E500EB9C0 - -I=198 -KEY=2FEC85E9EDFB97C54E3B3211BEFBF9FB -CT=BBA2BB9B1CA48D2E97E0C39E500EB9C0 -PT=8BA2341064B7B5184CD7E7A40FA0358E - -I=199 -KEY=A44EB1F9894C22DD02ECD5B5B15BCC75 -CT=8BA2341064B7B5184CD7E7A40FA0358E -PT=97121EEEA68CC6200FBC0B311849E625 - -I=200 -KEY=335CAF172FC0E4FD0D50DE84A9122A50 -CT=97121EEEA68CC6200FBC0B311849E625 -PT=027FA370A9412B342043A15F19294961 - -I=201 -KEY=31230C678681CFC92D137FDBB03B6331 -CT=027FA370A9412B342043A15F19294961 -PT=72CFBE6BA03AB28A53A6727717D1199A - -I=202 -KEY=43ECB20C26BB7D437EB50DACA7EA7AAB -CT=72CFBE6BA03AB28A53A6727717D1199A -PT=7A15B1B4B4ED35F9C208500FE7C4C1C7 - -I=203 -KEY=39F903B8925648BABCBD5DA3402EBB6C -CT=7A15B1B4B4ED35F9C208500FE7C4C1C7 -PT=AF46496D09254FAB5F381E93EEB4FBB0 - -I=204 -KEY=96BF4AD59B730711E3854330AE9A40DC -CT=AF46496D09254FAB5F381E93EEB4FBB0 -PT=ADA064E0F4324E8B0C062F6E33C7D016 - -I=205 -KEY=3B1F2E356F41499AEF836C5E9D5D90CA -CT=ADA064E0F4324E8B0C062F6E33C7D016 -PT=7723A61733BD5BBFAB8C559ED379B8B5 - -I=206 -KEY=4C3C88225CFC1225440F39C04E24287F -CT=7723A61733BD5BBFAB8C559ED379B8B5 -PT=5D210E8F35DD863316E89FADA70E8392 - -I=207 -KEY=111D86AD6921941652E7A66DE92AABED -CT=5D210E8F35DD863316E89FADA70E8392 -PT=92B1D20E7D87787950990052DE2ABA4F - -I=208 -KEY=83AC54A314A6EC6F027EA63F370011A2 -CT=92B1D20E7D87787950990052DE2ABA4F -PT=178E494D23AA6AC13AC180727C47FD2A - -I=209 -KEY=94221DEE370C86AE38BF264D4B47EC88 -CT=178E494D23AA6AC13AC180727C47FD2A -PT=CB9C10817C059D5BE4F123576FF459C6 - -I=210 -KEY=5FBE0D6F4B091BF5DC4E051A24B3B54E -CT=CB9C10817C059D5BE4F123576FF459C6 -PT=4934C56CC7BAF0A8DEBB62CFB2B0DEBF - -I=211 -KEY=168AC8038CB3EB5D02F567D596036BF1 -CT=4934C56CC7BAF0A8DEBB62CFB2B0DEBF -PT=F6F2A4B90B357D88401702C968D9EC02 - -I=212 -KEY=E0786CBA878696D542E2651CFEDA87F3 -CT=F6F2A4B90B357D88401702C968D9EC02 -PT=06A35CAD7B36751BEE345C33112EB6D1 - -I=213 -KEY=E6DB3017FCB0E3CEACD6392FEFF43122 -CT=06A35CAD7B36751BEE345C33112EB6D1 -PT=3244CDE10DF48795DA702CD8C2F4CABD - -I=214 -KEY=D49FFDF6F144645B76A615F72D00FB9F -CT=3244CDE10DF48795DA702CD8C2F4CABD -PT=47C06F5BEA8C3503512E0E200966C546 - -I=215 -KEY=935F92AD1BC8515827881BD724663ED9 -CT=47C06F5BEA8C3503512E0E200966C546 -PT=68A077D25CBEA7F76B88D8C6A414D0CE - -I=216 -KEY=FBFFE57F4776F6AF4C00C3118072EE17 -CT=68A077D25CBEA7F76B88D8C6A414D0CE -PT=DDF110C2C79B46C5132CCEF654280D7E - -I=217 -KEY=260EF5BD80EDB06A5F2C0DE7D45AE369 -CT=DDF110C2C79B46C5132CCEF654280D7E -PT=0AB610A0082813076D052011C12DC924 - -I=218 -KEY=2CB8E51D88C5A36D32292DF615772A4D -CT=0AB610A0082813076D052011C12DC924 -PT=8C42F49EDAE1BD6B631E74B68B1B8444 - -I=219 -KEY=A0FA118352241E06513759409E6CAE09 -CT=8C42F49EDAE1BD6B631E74B68B1B8444 -PT=B5A5B6E50B3A066D16DF883F353019FE - -I=220 -KEY=155FA766591E186B47E8D17FAB5CB7F7 -CT=B5A5B6E50B3A066D16DF883F353019FE -PT=70CFA25AFC9919937E2FC90900F0B398 - -I=221 -KEY=6590053CA58701F839C71876ABAC046F -CT=70CFA25AFC9919937E2FC90900F0B398 -PT=B927A5911AE33DEAB619DAFEE22CD0DF - -I=222 -KEY=DCB7A0ADBF643C128FDEC2884980D4B0 -CT=B927A5911AE33DEAB619DAFEE22CD0DF -PT=10C548438C5B976EDD624129B2102D7A - -I=223 -KEY=CC72E8EE333FAB7C52BC83A1FB90F9CA -CT=10C548438C5B976EDD624129B2102D7A -PT=4549E45DA2F8FE82972DC7DF3548CAFF - -I=224 -KEY=893B0CB391C755FEC591447ECED83335 -CT=4549E45DA2F8FE82972DC7DF3548CAFF -PT=2B85505E64089FEB6B5763011E778C96 - -I=225 -KEY=A2BE5CEDF5CFCA15AEC6277FD0AFBFA3 -CT=2B85505E64089FEB6B5763011E778C96 -PT=4B157930F9A6EBE3D9D6AC9FADDEB35C - -I=226 -KEY=E9AB25DD0C6921F677108BE07D710CFF -CT=4B157930F9A6EBE3D9D6AC9FADDEB35C -PT=12341C0FE9EB6757BFFCC4BC1A8F2585 - -I=227 -KEY=FB9F39D2E58246A1C8EC4F5C67FE297A -CT=12341C0FE9EB6757BFFCC4BC1A8F2585 -PT=5422D62D794B02FC04BE01198EE23ACE - -I=228 -KEY=AFBDEFFF9CC9445DCC524E45E91C13B4 -CT=5422D62D794B02FC04BE01198EE23ACE -PT=42D43022FD6DB571BCB2FDE653C9068C - -I=229 -KEY=ED69DFDD61A4F12C70E0B3A3BAD51538 -CT=42D43022FD6DB571BCB2FDE653C9068C -PT=80BD3AAED5D519B75D22BF060EF1DFC6 - -I=230 -KEY=6DD4E573B471E89B2DC20CA5B424CAFE -CT=80BD3AAED5D519B75D22BF060EF1DFC6 -PT=B72973F9016A348CDDCCFFC2DD291B5A - -I=231 -KEY=DAFD968AB51BDC17F00EF367690DD1A4 -CT=B72973F9016A348CDDCCFFC2DD291B5A -PT=5692E61C86A7B2C043ABBED712390361 - -I=232 -KEY=8C6F709633BC6ED7B3A54DB07B34D2C5 -CT=5692E61C86A7B2C043ABBED712390361 -PT=75138737269AA27855C2CFD2DCEDEFC4 - -I=233 -KEY=F97CF7A11526CCAFE6678262A7D93D01 -CT=75138737269AA27855C2CFD2DCEDEFC4 -PT=A022AA28CECC4BB5EB28BA5B7828AB6E - -I=234 -KEY=595E5D89DBEA871A0D4F3839DFF1966F -CT=A022AA28CECC4BB5EB28BA5B7828AB6E -PT=17B0BF87EE02AA44705B1B1B4DF7D3F4 - -I=235 -KEY=4EEEE20E35E82D5E7D1423229206459B -CT=17B0BF87EE02AA44705B1B1B4DF7D3F4 -PT=095A5A041C43DCFEB5D0DF3E7659344A - -I=236 -KEY=47B4B80A29ABF1A0C8C4FC1CE45F71D1 -CT=095A5A041C43DCFEB5D0DF3E7659344A -PT=9DCE0D1C572509F3367EE952B89044E5 - -I=237 -KEY=DA7AB5167E8EF853FEBA154E5CCF3534 -CT=9DCE0D1C572509F3367EE952B89044E5 -PT=E6075BCC82399A91E52034EA2F197058 - -I=238 -KEY=3C7DEEDAFCB762C21B9A21A473D6456C -CT=E6075BCC82399A91E52034EA2F197058 -PT=431D243CEE96B424B0FA4FEC5E707036 - -I=239 -KEY=7F60CAE61221D6E6AB606E482DA6355A -CT=431D243CEE96B424B0FA4FEC5E707036 -PT=5EF70106A2EA454CA9405A8AA1B54EF0 - -I=240 -KEY=2197CBE0B0CB93AA022034C28C137BAA -CT=5EF70106A2EA454CA9405A8AA1B54EF0 -PT=09B003CB7E2ADDD587A2ABCDD03D234F - -I=241 -KEY=2827C82BCEE14E7F85829F0F5C2E58E5 -CT=09B003CB7E2ADDD587A2ABCDD03D234F -PT=3647FAC6EF758113DC768E7737098DE9 - -I=242 -KEY=1E6032ED2194CF6C59F411786B27D50C -CT=3647FAC6EF758113DC768E7737098DE9 -PT=C043BD96A88492C85431B72C708C3C60 - -I=243 -KEY=DE238F7B89105DA40DC5A6541BABE96C -CT=C043BD96A88492C85431B72C708C3C60 -PT=299A25142A6B5D334158D359DD9CD574 - -I=244 -KEY=F7B9AA6FA37B00974C9D750DC6373C18 -CT=299A25142A6B5D334158D359DD9CD574 -PT=21E56C2202C8D6F81EDC63A8A1EA4B6A - -I=245 -KEY=D65CC64DA1B3D66F524116A567DD7772 -CT=21E56C2202C8D6F81EDC63A8A1EA4B6A -PT=FD3565957E3845065B7AEF27A900FDD5 - -I=246 -KEY=2B69A3D8DF8B9369093BF982CEDD8AA7 -CT=FD3565957E3845065B7AEF27A900FDD5 -PT=A4DB9120D1ED0419342AFC2CBF114647 - -I=247 -KEY=8FB232F80E6697703D1105AE71CCCCE0 -CT=A4DB9120D1ED0419342AFC2CBF114647 -PT=27FDDEA1E746BD217CFB4CD7A511BACE - -I=248 -KEY=A84FEC59E9202A5141EA4979D4DD762E -CT=27FDDEA1E746BD217CFB4CD7A511BACE -PT=6A9189FD46E47B22F151A213D023442B - -I=249 -KEY=C2DE65A4AFC45173B0BBEB6A04FE3205 -CT=6A9189FD46E47B22F151A213D023442B -PT=1C729701404C76D5D7A156C39CF52542 - -I=250 -KEY=DEACF2A5EF8827A6671ABDA9980B1747 -CT=1C729701404C76D5D7A156C39CF52542 -PT=6F97CB4564E0783DFE962DCB13FEDF72 - -I=251 -KEY=B13B39E08B685F9B998C90628BF5C835 -CT=6F97CB4564E0783DFE962DCB13FEDF72 -PT=F818140A280299B182CDA37CBE9B27AB - -I=252 -KEY=49232DEAA36AC62A1B41331E356EEF9E -CT=F818140A280299B182CDA37CBE9B27AB -PT=20E9F2BE7017C2945005FD8A420A5B7D - -I=253 -KEY=69CADF54D37D04BE4B44CE947764B4E3 -CT=20E9F2BE7017C2945005FD8A420A5B7D -PT=60BB97C634161EF6A36056193B6EDDB0 - -I=254 -KEY=09714892E76B1A48E824988D4C0A6953 -CT=60BB97C634161EF6A36056193B6EDDB0 -PT=E4B9777B7390EF430A93FF7DD0B68CD4 - -I=255 -KEY=EDC83FE994FBF50BE2B767F09CBCE587 -CT=E4B9777B7390EF430A93FF7DD0B68CD4 -PT=E5E3BD960CF15BBDB8A6C08711A884CF - -I=256 -KEY=082B827F980AAEB65A11A7778D146148 -CT=E5E3BD960CF15BBDB8A6C08711A884CF -PT=71A6AEFD0181DCE69A116585044C7F66 - -I=257 -KEY=798D2C82998B7250C000C2F289581E2E -CT=71A6AEFD0181DCE69A116585044C7F66 -PT=8E9C1CFFDB8972617D74DA0E9ED065D1 - -I=258 -KEY=F711307D42020031BD7418FC17887BFF -CT=8E9C1CFFDB8972617D74DA0E9ED065D1 -PT=CE7882AB901A199910FC463A4D1D626A - -I=259 -KEY=3969B2D6D21819A8AD885EC65A951995 -CT=CE7882AB901A199910FC463A4D1D626A -PT=2334546032E850D0029CB1AD6AFCEA7A - -I=260 -KEY=1A5DE6B6E0F04978AF14EF6B3069F3EF -CT=2334546032E850D0029CB1AD6AFCEA7A -PT=88B4CF0D4AB7BD00BE98DA1626063A69 - -I=261 -KEY=92E929BBAA47F478118C357D166FC986 -CT=88B4CF0D4AB7BD00BE98DA1626063A69 -PT=5A7FF831F28E5EC4A11DA524E2323925 - -I=262 -KEY=C896D18A58C9AABCB0919059F45DF0A3 -CT=5A7FF831F28E5EC4A11DA524E2323925 -PT=DF000551EF9BBD914969BD1B353BDC8C - -I=263 -KEY=1796D4DBB752172DF9F82D42C1662C2F -CT=DF000551EF9BBD914969BD1B353BDC8C -PT=1EECBC47697208193C354E28D23E8CE9 - -I=264 -KEY=097A689CDE201F34C5CD636A1358A0C6 -CT=1EECBC47697208193C354E28D23E8CE9 -PT=DF85CD4B3F821A7411F9F5D1FDF9DB85 - -I=265 -KEY=D6FFA5D7E1A20540D43496BBEEA17B43 -CT=DF85CD4B3F821A7411F9F5D1FDF9DB85 -PT=038E765F1910D8C0C1251254605218F2 - -I=266 -KEY=D571D388F8B2DD80151184EF8EF363B1 -CT=038E765F1910D8C0C1251254605218F2 -PT=FBA8FE850294EEAEE75F56C974BF7DE4 - -I=267 -KEY=2ED92D0DFA26332EF24ED226FA4C1E55 -CT=FBA8FE850294EEAEE75F56C974BF7DE4 -PT=47F9D6F7A3E2A1BFA360EA1BA8B0450E - -I=268 -KEY=6920FBFA59C49291512E383D52FC5B5B -CT=47F9D6F7A3E2A1BFA360EA1BA8B0450E -PT=FD6F4A4825DE5E776BFD569223CB5A2C - -I=269 -KEY=944FB1B27C1ACCE63AD36EAF71370177 -CT=FD6F4A4825DE5E776BFD569223CB5A2C -PT=10430ED7EE0FDB8FBC348F8E08286622 - -I=270 -KEY=840CBF659215176986E7E121791F6755 -CT=10430ED7EE0FDB8FBC348F8E08286622 -PT=4B75D5C573185303B01EB649884758B1 - -I=271 -KEY=CF796AA0E10D446A36F95768F1583FE4 -CT=4B75D5C573185303B01EB649884758B1 -PT=85CCA4271A941517D55D05B4F29527C3 - -I=272 -KEY=4AB5CE87FB99517DE3A452DC03CD1827 -CT=85CCA4271A941517D55D05B4F29527C3 -PT=615EA2D44C52D639B6AD05D621B4A1A6 - -I=273 -KEY=2BEB6C53B7CB87445509570A2279B981 -CT=615EA2D44C52D639B6AD05D621B4A1A6 -PT=1DFD1E93D34ABFE45BA6BF6BD3FBF30E - -I=274 -KEY=361672C0648138A00EAFE861F1824A8F -CT=1DFD1E93D34ABFE45BA6BF6BD3FBF30E -PT=B65C3F09FFFF752DEE2F8F2D441A51CA - -I=275 -KEY=804A4DC99B7E4D8DE080674CB5981B45 -CT=B65C3F09FFFF752DEE2F8F2D441A51CA -PT=3B36D6FD4F7ACAD4681FF4398AC7AFB3 - -I=276 -KEY=BB7C9B34D4048759889F93753F5FB4F6 -CT=3B36D6FD4F7ACAD4681FF4398AC7AFB3 -PT=F3CDEFABE450D887CD585C280BB22367 - -I=277 -KEY=48B1749F30545FDE45C7CF5D34ED9791 -CT=F3CDEFABE450D887CD585C280BB22367 -PT=ECC49251BAD79981CA1B1F683A843531 - -I=278 -KEY=A475E6CE8A83C65F8FDCD0350E69A2A0 -CT=ECC49251BAD79981CA1B1F683A843531 -PT=8BE43F0A30663108513A0E5F49F9152C - -I=279 -KEY=2F91D9C4BAE5F757DEE6DE6A4790B78C -CT=8BE43F0A30663108513A0E5F49F9152C -PT=DB3D559FCEBE0FAF3B218161BA6B3F07 - -I=280 -KEY=F4AC8C5B745BF8F8E5C75F0BFDFB888B -CT=DB3D559FCEBE0FAF3B218161BA6B3F07 -PT=8F0C3AE11B03433C07CABD26BF47A430 - -I=281 -KEY=7BA0B6BA6F58BBC4E20DE22D42BC2CBB -CT=8F0C3AE11B03433C07CABD26BF47A430 -PT=73578DC3464CE3EE0314B206E1E9504C - -I=282 -KEY=08F73B792914582AE119502BA3557CF7 -CT=73578DC3464CE3EE0314B206E1E9504C -PT=60DA2C12B296804C608348A54EE1C60D - -I=283 -KEY=682D176B9B82D866819A188EEDB4BAFA -CT=60DA2C12B296804C608348A54EE1C60D -PT=A960934724BDC61E5429E59856FC1902 - -I=284 -KEY=C14D842CBF3F1E78D5B3FD16BB48A3F8 -CT=A960934724BDC61E5429E59856FC1902 -PT=6B7E71535C6B7B09BDF19AF79CD58C95 - -I=285 -KEY=AA33F57FE3546571684267E1279D2F6D -CT=6B7E71535C6B7B09BDF19AF79CD58C95 -PT=B95E0126EF320F1E6F288366DB7F2773 - -I=286 -KEY=136DF4590C666A6F076AE487FCE2081E -CT=B95E0126EF320F1E6F288366DB7F2773 -PT=6403B99D6FE0F85128FDD1F05B81AA6E - -I=287 -KEY=776E4DC46386923E2F973577A763A270 -CT=6403B99D6FE0F85128FDD1F05B81AA6E -PT=9EBA25F2D6CE5817F4317F3AFE6421E7 - -I=288 -KEY=E9D46836B548CA29DBA64A4D59078397 -CT=9EBA25F2D6CE5817F4317F3AFE6421E7 -PT=5E77AAE8A3C5EEAF4732BB310DAC3771 - -I=289 -KEY=B7A3C2DE168D24869C94F17C54ABB4E6 -CT=5E77AAE8A3C5EEAF4732BB310DAC3771 -PT=5FD00675371300B60C30EFCEE0171080 - -I=290 -KEY=E873C4AB219E243090A41EB2B4BCA466 -CT=5FD00675371300B60C30EFCEE0171080 -PT=482D701DBCE3AE108F65836C12A41C2C - -I=291 -KEY=A05EB4B69D7D8A201FC19DDEA618B84A -CT=482D701DBCE3AE108F65836C12A41C2C -PT=2966D81642542925891D8F7409051E4A - -I=292 -KEY=89386CA0DF29A30596DC12AAAF1DA600 -CT=2966D81642542925891D8F7409051E4A -PT=2FD6F3DB9DD1DEDED9F32D1806AE69D6 - -I=293 -KEY=A6EE9F7B42F87DDB4F2F3FB2A9B3CFD6 -CT=2FD6F3DB9DD1DEDED9F32D1806AE69D6 -PT=9B59277165B792790E29ADB53ADE60DB - -I=294 -KEY=3DB7B80A274FEFA241069207936DAF0D -CT=9B59277165B792790E29ADB53ADE60DB -PT=A4873C5246044200B56C25FFADAB15D6 - -I=295 -KEY=99308458614BADA2F46AB7F83EC6BADB -CT=A4873C5246044200B56C25FFADAB15D6 -PT=9E2BBBD65649EB2A0CD974AD32BF382F - -I=296 -KEY=071B3F8E37024688F8B3C3550C7982F4 -CT=9E2BBBD65649EB2A0CD974AD32BF382F -PT=F83F4408675892DADA4833A43F22FFC8 - -I=297 -KEY=FF247B86505AD45222FBF0F1335B7D3C -CT=F83F4408675892DADA4833A43F22FFC8 -PT=19C337CCBF8D06DC68D9A16DB294EF44 - -I=298 -KEY=E6E74C4AEFD7D28E4A22519C81CF9278 -CT=19C337CCBF8D06DC68D9A16DB294EF44 -PT=433578E0901A4F4B134E6DCF68249FC7 - -I=299 -KEY=A5D234AA7FCD9DC5596C3C53E9EB0DBF -CT=433578E0901A4F4B134E6DCF68249FC7 -PT=7F317CB0B3279C894B8A08289797FFF1 - -I=300 -KEY=DAE3481ACCEA014C12E6347B7E7CF24E -CT=7F317CB0B3279C894B8A08289797FFF1 -PT=AFFB4CA21A2A36FD24BB18C5AED17789 - -I=301 -KEY=751804B8D6C037B1365D2CBED0AD85C7 -CT=AFFB4CA21A2A36FD24BB18C5AED17789 -PT=394DA5EC353A68B844D1BC24A468DA5C - -I=302 -KEY=4C55A154E3FA5F09728C909A74C55F9B -CT=394DA5EC353A68B844D1BC24A468DA5C -PT=C649C174B98A06351F26C117D14FF290 - -I=303 -KEY=8A1C60205A70593C6DAA518DA58AAD0B -CT=C649C174B98A06351F26C117D14FF290 -PT=2E122AA7C90B57304A80C19480627DD7 - -I=304 -KEY=A40E4A87937B0E0C272A901925E8D0DC -CT=2E122AA7C90B57304A80C19480627DD7 -PT=9841ADE6A65834CE89959EFE8F059ED6 - -I=305 -KEY=3C4FE76135233AC2AEBF0EE7AAED4E0A -CT=9841ADE6A65834CE89959EFE8F059ED6 -PT=6B70D74762A4BEFBD15B9EC6835CB69B - -I=306 -KEY=573F3026578784397FE4902129B1F891 -CT=6B70D74762A4BEFBD15B9EC6835CB69B -PT=2E8B5DEF53E2294C0C953A9B8BD9399D - -I=307 -KEY=79B46DC90465AD757371AABAA268C10C -CT=2E8B5DEF53E2294C0C953A9B8BD9399D -PT=D32D00F78BA00F6CEA792598B89779E4 - -I=308 -KEY=AA996D3E8FC5A21999088F221AFFB8E8 -CT=D32D00F78BA00F6CEA792598B89779E4 -PT=7059DCC6CB8D295B95F2978F25927B31 - -I=309 -KEY=DAC0B1F844488B420CFA18AD3F6DC3D9 -CT=7059DCC6CB8D295B95F2978F25927B31 -PT=833A1AFA7DC4CAF54F5B36981A98D7E3 - -I=310 -KEY=59FAAB02398C41B743A12E3525F5143A -CT=833A1AFA7DC4CAF54F5B36981A98D7E3 -PT=4CC5A526400B493AAA28909A2F4932BF - -I=311 -KEY=153F0E247987088DE989BEAF0ABC2685 -CT=4CC5A526400B493AAA28909A2F4932BF -PT=D7134DEE2967104D161876A0802B3727 - -I=312 -KEY=C22C43CA50E018C0FF91C80F8A9711A2 -CT=D7134DEE2967104D161876A0802B3727 -PT=C45DB7BC52D7A0D53399B91EFB686D32 - -I=313 -KEY=0671F4760237B815CC08711171FF7C90 -CT=C45DB7BC52D7A0D53399B91EFB686D32 -PT=2F49EA2A8D7F44909BCF41C3640FD0AB - -I=314 -KEY=29381E5C8F48FC8557C730D215F0AC3B -CT=2F49EA2A8D7F44909BCF41C3640FD0AB -PT=6D416059758F4AC555A05D83E9CFC4DE - -I=315 -KEY=44797E05FAC7B64002676D51FC3F68E5 -CT=6D416059758F4AC555A05D83E9CFC4DE -PT=2721015DDF85EC87ED8480A87705CD37 - -I=316 -KEY=63587F5825425AC7EFE3EDF98B3AA5D2 -CT=2721015DDF85EC87ED8480A87705CD37 -PT=3B045F5DD5ADC6E5D341E2E6A5B919D3 - -I=317 -KEY=585C2005F0EF9C223CA20F1F2E83BC01 -CT=3B045F5DD5ADC6E5D341E2E6A5B919D3 -PT=85DA9719FF16899B343BE56FDF9F86BF - -I=318 -KEY=DD86B71C0FF915B90899EA70F11C3ABE -CT=85DA9719FF16899B343BE56FDF9F86BF -PT=67FD32AC2783C381E77AE0BB8ACEECCD - -I=319 -KEY=BA7B85B0287AD638EFE30ACB7BD2D673 -CT=67FD32AC2783C381E77AE0BB8ACEECCD -PT=D8BEC715849E6A2A164F0139B8EC038E - -I=320 -KEY=62C542A5ACE4BC12F9AC0BF2C33ED5FD -CT=D8BEC715849E6A2A164F0139B8EC038E -PT=6ECA9375A207148E36203C8BD885A520 - -I=321 -KEY=0C0FD1D00EE3A89CCF8C37791BBB70DD -CT=6ECA9375A207148E36203C8BD885A520 -PT=A96877A8369B7086EF76D8281C066068 - -I=322 -KEY=A567A6783878D81A20FAEF5107BD10B5 -CT=A96877A8369B7086EF76D8281C066068 -PT=2D6DDF2C136F5ACDC12D33D52ECD6397 - -I=323 -KEY=880A79542B1782D7E1D7DC8429707322 -CT=2D6DDF2C136F5ACDC12D33D52ECD6397 -PT=E2F3EFF780EEDAD7B820CF57F946AB21 - -I=324 -KEY=6AF996A3ABF9580059F713D3D036D803 -CT=E2F3EFF780EEDAD7B820CF57F946AB21 -PT=D083829AB624DC46BF55F15C2ACA2CDC - -I=325 -KEY=BA7A14391DDD8446E6A2E28FFAFCF4DF -CT=D083829AB624DC46BF55F15C2ACA2CDC -PT=637A1328711A701F011B0D66953A11FC - -I=326 -KEY=D90007116CC7F459E7B9EFE96FC6E523 -CT=637A1328711A701F011B0D66953A11FC -PT=9230F9E8C4AA7D697641B4E800AECE8B - -I=327 -KEY=4B30FEF9A86D893091F85B016F682BA8 -CT=9230F9E8C4AA7D697641B4E800AECE8B -PT=CABC2F3EBCB87AEF4550060FB6F95C7D - -I=328 -KEY=818CD1C714D5F3DFD4A85D0ED99177D5 -CT=CABC2F3EBCB87AEF4550060FB6F95C7D -PT=25C93DA609BEDFD48D88B7E005EA9D4D - -I=329 -KEY=A445EC611D6B2C0B5920EAEEDC7BEA98 -CT=25C93DA609BEDFD48D88B7E005EA9D4D -PT=E445C1B43DC6AA0D47C766675676CA29 - -I=330 -KEY=40002DD520AD86061EE78C898A0D20B1 -CT=E445C1B43DC6AA0D47C766675676CA29 -PT=3F8A99E9D556F0CE0B0F3B4FE89A7C15 - -I=331 -KEY=7F8AB43CF5FB76C815E8B7C662975CA4 -CT=3F8A99E9D556F0CE0B0F3B4FE89A7C15 -PT=BE04197CADBDBC917AB288D85C554D4A - -I=332 -KEY=C18EAD405846CA596F5A3F1E3EC211EE -CT=BE04197CADBDBC917AB288D85C554D4A -PT=2CF8FE59EED67AF15BD6C09C8DA37882 - -I=333 -KEY=ED765319B690B0A8348CFF82B361696C -CT=2CF8FE59EED67AF15BD6C09C8DA37882 -PT=FF8CBF98D0B15198ACDC53D7247511C5 - -I=334 -KEY=12FAEC816621E1309850AC55971478A9 -CT=FF8CBF98D0B15198ACDC53D7247511C5 -PT=27794678855BAE2BDE7EB75487813E28 - -I=335 -KEY=3583AAF9E37A4F1B462E1B0110954681 -CT=27794678855BAE2BDE7EB75487813E28 -PT=5681B2CECDE71663A864D0288607D86B - -I=336 -KEY=630218372E9D5978EE4ACB2996929EEA -CT=5681B2CECDE71663A864D0288607D86B -PT=8936EB6E65F2CD2B3AFD1310B5B2D6C8 - -I=337 -KEY=EA34F3594B6F9453D4B7D83923204822 -CT=8936EB6E65F2CD2B3AFD1310B5B2D6C8 -PT=16045490148187B05CC46B80099A4530 - -I=338 -KEY=FC30A7C95FEE13E38873B3B92ABA0D12 -CT=16045490148187B05CC46B80099A4530 -PT=FE909FFB1D490B028867288FE682EEE9 - -I=339 -KEY=02A0383242A718E100149B36CC38E3FB -CT=FE909FFB1D490B028867288FE682EEE9 -PT=7B3E5C0017089A7842866ABA6364FFEA - -I=340 -KEY=799E643255AF82994292F18CAF5C1C11 -CT=7B3E5C0017089A7842866ABA6364FFEA -PT=CC263F129618975F204AE499F115C69B - -I=341 -KEY=B5B85B20C3B715C662D815155E49DA8A -CT=CC263F129618975F204AE499F115C69B -PT=997ACE7EABF6EBF9CC7BBCC2670CF1A0 - -I=342 -KEY=2CC2955E6841FE3FAEA3A9D739452B2A -CT=997ACE7EABF6EBF9CC7BBCC2670CF1A0 -PT=88D4A74B19278ED442068D0954DFA8B2 - -I=343 -KEY=A4163215716670EBECA524DE6D9A8398 -CT=88D4A74B19278ED442068D0954DFA8B2 -PT=F1CC6407AB254178DEFEF983112D6AC5 - -I=344 -KEY=55DA5612DA433193325BDD5D7CB7E95D -CT=F1CC6407AB254178DEFEF983112D6AC5 -PT=689A0E429CDAF1BD1197C160BF962544 - -I=345 -KEY=3D4058504699C02E23CC1C3DC321CC19 -CT=689A0E429CDAF1BD1197C160BF962544 -PT=54CF618196D978C0460CF8051DF5BE18 - -I=346 -KEY=698F39D1D040B8EE65C0E438DED47201 -CT=54CF618196D978C0460CF8051DF5BE18 -PT=4AA0EF106F23B43C3DD371C66404C602 - -I=347 -KEY=232FD6C1BF630CD2581395FEBAD0B403 -CT=4AA0EF106F23B43C3DD371C66404C602 -PT=A5185CAE1718143FC6CC329D9F233E17 - -I=348 -KEY=86378A6FA87B18ED9EDFA76325F38A14 -CT=A5185CAE1718143FC6CC329D9F233E17 -PT=A2A7E8855D25A0C475961E9B7ED7BE35 - -I=349 -KEY=249062EAF55EB829EB49B9F85B243421 -CT=A2A7E8855D25A0C475961E9B7ED7BE35 -PT=E0B7536B335FB98F197F762B3B97CECE - -I=350 -KEY=C4273181C60101A6F236CFD360B3FAEF -CT=E0B7536B335FB98F197F762B3B97CECE -PT=C45C38164083871528D8B3BA7423BFEA - -I=351 -KEY=007B0997868286B3DAEE7C6914904505 -CT=C45C38164083871528D8B3BA7423BFEA -PT=017AEBDEF43CF9664C582356A4A0C374 - -I=352 -KEY=0101E24972BE7FD596B65F3FB0308671 -CT=017AEBDEF43CF9664C582356A4A0C374 -PT=BBB48EA21B5EDCCF5346A7B4E6796BED - -I=353 -KEY=BAB56CEB69E0A31AC5F0F88B5649ED9C -CT=BBB48EA21B5EDCCF5346A7B4E6796BED -PT=3A53DFCB6067F9E98653136A44A4B537 - -I=354 -KEY=80E6B32009875AF343A3EBE112ED58AB -CT=3A53DFCB6067F9E98653136A44A4B537 -PT=951BA0E2272E46FC8CC3990E002EEFF0 - -I=355 -KEY=15FD13C22EA91C0FCF6072EF12C3B75B -CT=951BA0E2272E46FC8CC3990E002EEFF0 -PT=249202E40BC5892B9CEE96279E69432A - -I=356 -KEY=316F1126256C9524538EE4C88CAAF471 -CT=249202E40BC5892B9CEE96279E69432A -PT=B90CE5BF126163B37F75032A88AFD615 - -I=357 -KEY=8863F499370DF6972CFBE7E204052264 -CT=B90CE5BF126163B37F75032A88AFD615 -PT=E0BDD9E1FF493D82777BD7FB4035D309 - -I=358 -KEY=68DE2D78C844CB155B8030194430F16D -CT=E0BDD9E1FF493D82777BD7FB4035D309 -PT=0A3A5E377CDB2D1F6CB09E200494F578 - -I=359 -KEY=62E4734FB49FE60A3730AE3940A40415 -CT=0A3A5E377CDB2D1F6CB09E200494F578 -PT=483DF6E2936389D1FC09921497AF8AE7 - -I=360 -KEY=2AD985AD27FC6FDBCB393C2DD70B8EF2 -CT=483DF6E2936389D1FC09921497AF8AE7 -PT=7A90B7B1E493109323A54AD285090EC6 - -I=361 -KEY=5049321CC36F7F48E89C76FF52028034 -CT=7A90B7B1E493109323A54AD285090EC6 -PT=B6471BF36A24B5B0CAC19BDD4C83DC50 - -I=362 -KEY=E60E29EFA94BCAF8225DED221E815C64 -CT=B6471BF36A24B5B0CAC19BDD4C83DC50 -PT=EFBDC6ECADCE6AA5DBD302E7A0647700 - -I=363 -KEY=09B3EF030485A05DF98EEFC5BEE52B64 -CT=EFBDC6ECADCE6AA5DBD302E7A0647700 -PT=783A89B88CC875F743B645BA1449CEE7 - -I=364 -KEY=718966BB884DD5AABA38AA7FAAACE583 -CT=783A89B88CC875F743B645BA1449CEE7 -PT=EAD61D2577852D4EA276F3699EFB2BDC - -I=365 -KEY=9B5F7B9EFFC8F8E4184E59163457CE5F -CT=EAD61D2577852D4EA276F3699EFB2BDC -PT=9E804D8814AF4FC67BA931D1C72774C7 - -I=366 -KEY=05DF3616EB67B72263E768C7F370BA98 -CT=9E804D8814AF4FC67BA931D1C72774C7 -PT=7C383CC27D8C2B117AC72088EB334FD9 - -I=367 -KEY=79E70AD496EB9C331920484F1843F541 -CT=7C383CC27D8C2B117AC72088EB334FD9 -PT=9D4BE61ECECB2E60EC621A6320C0E844 - -I=368 -KEY=E4ACECCA5820B253F542522C38831D05 -CT=9D4BE61ECECB2E60EC621A6320C0E844 -PT=227992ADFC526D9AA99BA629E7523198 - -I=369 -KEY=C6D57E67A472DFC95CD9F405DFD12C9D -CT=227992ADFC526D9AA99BA629E7523198 -PT=93A265FB7650BE75CBDD8732F65F09A5 - -I=370 -KEY=55771B9CD22261BC97047337298E2538 -CT=93A265FB7650BE75CBDD8732F65F09A5 -PT=5AB3354B8D28F041C5A7FDAB828996BC - -I=371 -KEY=0FC42ED75F0A91FD52A38E9CAB07B384 -CT=5AB3354B8D28F041C5A7FDAB828996BC -PT=BA5C6566701BD3791C2DA51CDC5AB6DD - -I=372 -KEY=B5984BB12F1142844E8E2B80775D0559 -CT=BA5C6566701BD3791C2DA51CDC5AB6DD -PT=2C96CE0653EFB1113C6E822DD4AE6200 - -I=373 -KEY=990E85B77CFEF39572E0A9ADA3F36759 -CT=2C96CE0653EFB1113C6E822DD4AE6200 -PT=1065F5519472C78BADAB79EC00BBCABA - -I=374 -KEY=896B70E6E88C341EDF4BD041A348ADE3 -CT=1065F5519472C78BADAB79EC00BBCABA -PT=049AA7D4B4C1A59C1A16E3E5D8B46515 - -I=375 -KEY=8DF1D7325C4D9182C55D33A47BFCC8F6 -CT=049AA7D4B4C1A59C1A16E3E5D8B46515 -PT=C8F1C4179DD8FCD6942D07AF7392F481 - -I=376 -KEY=45001325C1956D545170340B086E3C77 -CT=C8F1C4179DD8FCD6942D07AF7392F481 -PT=9C9AE90AFE18822197EA47FE2F48813F - -I=377 -KEY=D99AFA2F3F8DEF75C69A73F52726BD48 -CT=9C9AE90AFE18822197EA47FE2F48813F -PT=DFBABE8688391CC868CDE134DDFFE1F0 - -I=378 -KEY=062044A9B7B4F3BDAE5792C1FAD95CB8 -CT=DFBABE8688391CC868CDE134DDFFE1F0 -PT=72BE585F98DA4DC03998B5820D5230A9 - -I=379 -KEY=749E1CF62F6EBE7D97CF2743F78B6C11 -CT=72BE585F98DA4DC03998B5820D5230A9 -PT=BCF3D47B888599A27AD63D6EFD8FB86F - -I=380 -KEY=C86DC88DA7EB27DFED191A2D0A04D47E -CT=BCF3D47B888599A27AD63D6EFD8FB86F -PT=62F7A2AD05BB46CB81B9601129100455 - -I=381 -KEY=AA9A6A20A25061146CA07A3C2314D02B -CT=62F7A2AD05BB46CB81B9601129100455 -PT=FA4D3B82232D19BE14A57422012C7751 - -I=382 -KEY=50D751A2817D78AA78050E1E2238A77A -CT=FA4D3B82232D19BE14A57422012C7751 -PT=40953AAA3D6C1BBE375A1E275754C98C - -I=383 -KEY=10426B08BC1163144F5F1039756C6EF6 -CT=40953AAA3D6C1BBE375A1E275754C98C -PT=CE9123C6A5A66AF788A8515721D646A0 - -I=384 -KEY=DED348CE19B709E3C7F7416E54BA2856 -CT=CE9123C6A5A66AF788A8515721D646A0 -PT=E45F3483E343F5C3C0AC77E955369AB3 - -I=385 -KEY=3A8C7C4DFAF4FC20075B3687018CB2E5 -CT=E45F3483E343F5C3C0AC77E955369AB3 -PT=6E7CE5F4BE070EC870691CDD494A767E - -I=386 -KEY=54F099B944F3F2E877322A5A48C6C49B -CT=6E7CE5F4BE070EC870691CDD494A767E -PT=2BB1EE551920A632E90EB9E462280365 - -I=387 -KEY=7F4177EC5DD354DA9E3C93BE2AEEC7FE -CT=2BB1EE551920A632E90EB9E462280365 -PT=692E0FA8B1C39CB96A11E21EA1B3365E - -I=388 -KEY=166F7844EC10C863F42D71A08B5DF1A0 -CT=692E0FA8B1C39CB96A11E21EA1B3365E -PT=345C0DE98A9F472B6BCBE241BB346590 - -I=389 -KEY=223375AD668F8F489FE693E130699430 -CT=345C0DE98A9F472B6BCBE241BB346590 -PT=D9D9313DC80FB90608614ECCC962207F - -I=390 -KEY=FBEA4490AE80364E9787DD2DF90BB44F -CT=D9D9313DC80FB90608614ECCC962207F -PT=7AEE31C488D1DD54B9AD8EE3AEFE546C - -I=391 -KEY=810475542651EB1A2E2A53CE57F5E023 -CT=7AEE31C488D1DD54B9AD8EE3AEFE546C -PT=9CF27E1202080D9F3A9B5E02290204EA - -I=392 -KEY=1DF60B462459E68514B10DCC7EF7E4C9 -CT=9CF27E1202080D9F3A9B5E02290204EA -PT=670085C6D3B95C6017DB9163B9D2D565 - -I=393 -KEY=7AF68E80F7E0BAE5036A9CAFC72531AC -CT=670085C6D3B95C6017DB9163B9D2D565 -PT=2A36E88DF74BA4B24283FEE52DDE5AA4 - -I=394 -KEY=50C0660D00AB1E5741E9624AEAFB6B08 -CT=2A36E88DF74BA4B24283FEE52DDE5AA4 -PT=81B75B31F130467F4A1FA6CA4A329E5E - -I=395 -KEY=D1773D3CF19B58280BF6C480A0C9F556 -CT=81B75B31F130467F4A1FA6CA4A329E5E -PT=D0A0347102BD11F9E2BD8E8A72D53ADC - -I=396 -KEY=01D7094DF32649D1E94B4A0AD21CCF8A -CT=D0A0347102BD11F9E2BD8E8A72D53ADC -PT=97F0187509608DF1D9B27AB5D005E505 - -I=397 -KEY=96271138FA46C42030F930BF02192A8F -CT=97F0187509608DF1D9B27AB5D005E505 -PT=E60139E36ECD7B24C7C98772C92A1E87 - -I=398 -KEY=702628DB948BBF04F730B7CDCB333408 -CT=E60139E36ECD7B24C7C98772C92A1E87 -PT=7E92E19E07A469E7D49D3D07EF719157 - -I=399 -KEY=0EB4C945932FD6E323AD8ACA2442A55F -CT=7E92E19E07A469E7D49D3D07EF719157 -PT=F5BF8B37136F2E1F6BEC6F572021E3BA - -========================= - -KEYSIZE=192 - -I=0 -KEY=000000000000000000000000000000000000000000000000 -CT=00000000000000000000000000000000 -PT=48E31E9E256718F29229319C19F15BA4 - -I=1 -KEY=9643D8334A63DF4D48E31E9E256718F29229319C19F15BA4 -CT=48E31E9E256718F29229319C19F15BA4 -PT=CC01684BE9B29ED01EA7923E7D2380AA - -I=2 -KEY=EF334C87288C43DE84E276D5CCD586228C8EA3A264D2DB0E -CT=CC01684BE9B29ED01EA7923E7D2380AA -PT=8726B4E66D6B8FBAA22D42981A5A40CC - -I=3 -KEY=0891A045BB044B9D03C4C233A1BE09982EA3E13A7E889BC2 -CT=8726B4E66D6B8FBAA22D42981A5A40CC -PT=83B9A21A0710FDB9C603797613772ED6 - -I=4 -KEY=A5233519DE914717807D6029A6AEF421E8A0984C6DFFB514 -CT=83B9A21A0710FDB9C603797613772ED6 -PT=F15479A2B2C250F7E5C11D333D867CBD - -I=5 -KEY=A1CB19726DB4C2C77129198B146CA4D60D61857F5079C9A9 -CT=F15479A2B2C250F7E5C11D333D867CBD -PT=C1AF401BD4E62D8BA15BEC3690F2FB25 - -I=6 -KEY=04B03C15DB8324B3B0865990C08A895DAC3A6949C08B328C -CT=C1AF401BD4E62D8BA15BEC3690F2FB25 -PT=01E01E3B10470286035EBD7502EF11A0 - -I=7 -KEY=A1CB0164AB1E88EDB16647ABD0CD8BDBAF64D43CC264232C -CT=01E01E3B10470286035EBD7502EF11A0 -PT=A681127825B718411291106AB416779A - -I=8 -KEY=27BFD9CB824C525617E755D3F57A939ABDF5C456767254B6 -CT=A681127825B718411291106AB416779A -PT=5C2EBA728589A9CAA15E28E7D8E59AA0 - -I=9 -KEY=B308E0DCE108194C4BC9EFA170F33A501CABECB1AE97CE16 -CT=5C2EBA728589A9CAA15E28E7D8E59AA0 -PT=E738305279BE636648B6D5FFA3E97E4A - -I=10 -KEY=FE787701EE66664BACF1DFF3094D5936541D394E0D7EB05C -CT=E738305279BE636648B6D5FFA3E97E4A -PT=5AF7D4C9439C7412FD7236E7685659DF - -I=11 -KEY=DD93D742AFA0B19CF6060B3A4AD12D24A96F0FA96528E983 -CT=5AF7D4C9439C7412FD7236E7685659DF -PT=30D0681D4060E24D1427D1AAC498DB1B - -I=12 -KEY=D5D19C2FEA9DC94BC6D663270AB1CF69BD48DE03A1B03298 -CT=30D0681D4060E24D1427D1AAC498DB1B -PT=FC9B6752064B1CCE75EBFBE91AF8F2CD - -I=13 -KEY=EB0954ECE44620833A4D04750CFAD3A7C8A325EABB48C055 -CT=FC9B6752064B1CCE75EBFBE91AF8F2CD -PT=61E6AE6E035BCC3C94EF00101216904A - -I=14 -KEY=E6E5AB38545B6DF75BABAA1B0FA11F9B5C4C25FAA95E501F -CT=61E6AE6E035BCC3C94EF00101216904A -PT=BF738A4E55F036126CC9B56DED530B8C - -I=15 -KEY=E8C670F71E5B62B6E4D820555A51298930859097440D5B93 -CT=BF738A4E55F036126CC9B56DED530B8C -PT=6B9CD4C227FC30C14FD881B838D9F8F5 - -I=16 -KEY=23FF647DD75770418F44F4977DAD19487F5D112F7CD4A366 -CT=6B9CD4C227FC30C14FD881B838D9F8F5 -PT=6173EF2B5C9B569A1BD4B62C7C913844 - -I=17 -KEY=DB94124B11CC03D9EE371BBC21364FD26489A70300459B22 -CT=6173EF2B5C9B569A1BD4B62C7C913844 -PT=709EF90F853E55123A917FB258E900F9 - -I=18 -KEY=4821CA96B50ACA049EA9E2B3A4081AC05E18D8B158AC9BDB -CT=709EF90F853E55123A917FB258E900F9 -PT=5D73D99E47B1DB28E0ED9B9D1C212CFA - -I=19 -KEY=FA47C5BF5E688F8BC3DA3B2DE3B9C1E8BEF5432C448DB721 -CT=5D73D99E47B1DB28E0ED9B9D1C212CFA -PT=32016FFCB2AA5EA6EA0C808F60613CA2 - -I=20 -KEY=C66A73E0D1261C2CF1DB54D151139F4E54F9C3A324EC8B83 -CT=32016FFCB2AA5EA6EA0C808F60613CA2 -PT=CAA3704F7FD76EBACB1D2A266A0899FF - -I=21 -KEY=FAE8E04094E572A33B78249E2EC4F1F49FE4E9854EE4127C -CT=CAA3704F7FD76EBACB1D2A266A0899FF -PT=E32DBD027A1A36B2EC8D0A98C9293E7E - -I=22 -KEY=8F2FBF9E40182950D855999C54DEC7467369E31D87CD2C02 -CT=E32DBD027A1A36B2EC8D0A98C9293E7E -PT=1C117311882C0D5159A9DFD5C3C68D95 - -I=23 -KEY=F6FB8F6DFAA034BFC444EA8DDCF2CA172AC03CC8440BA197 -CT=1C117311882C0D5159A9DFD5C3C68D95 -PT=5E379C2471DB04582CD861E6F8A419D7 - -I=24 -KEY=699DCA67F4EF50C49A7376A9AD29CE4F06185D2EBCAFB840 -CT=5E379C2471DB04582CD861E6F8A419D7 -PT=5932A84C6ACBD8452EE9AC47CE4B6BD8 - -I=25 -KEY=F568B4F126486CE4C341DEE5C7E2160A28F1F16972E4D398 -CT=5932A84C6ACBD8452EE9AC47CE4B6BD8 -PT=00634EED1D18C84AE0A8198CF791DE81 - -I=26 -KEY=C49E5E8D366B6FE7C3229008DAFADE40C859E8E585750D19 -CT=00634EED1D18C84AE0A8198CF791DE81 -PT=E10C93B1C466FFF0B6EB6DB50AF271EC - -I=27 -KEY=22B07DB9ED443A9D222E03B91E9C21B07EB285508F877CF5 -CT=E10C93B1C466FFF0B6EB6DB50AF271EC -PT=58A0C680F565E63A7E41C6EAC50A3B01 - -I=28 -KEY=2BDF4CCE2B4CAFDD7A8EC539EBF9C78A00F343BA4A8D47F4 -CT=58A0C680F565E63A7E41C6EAC50A3B01 -PT=92921B2AA7FC6367199A4C42FAE0E2A4 - -I=29 -KEY=E2BE29F6905D41C5E81CDE134C05A4ED19690FF8B06DA550 -CT=92921B2AA7FC6367199A4C42FAE0E2A4 -PT=B6EC2A692D2657E5506F2C3BA1912799 - -I=30 -KEY=E43634FD3DB719C75EF0F47A6123F308490623C311FC82C9 -CT=B6EC2A692D2657E5506F2C3BA1912799 -PT=23ECD0813B1A7090CF9BE874D6B0846C - -I=31 -KEY=ACA2F21EF46E30B57D1C24FB5A398398869DCBB7C74C06A5 -CT=23ECD0813B1A7090CF9BE874D6B0846C -PT=04BD52F4C1AB8DF4816A6E11F8B54452 - -I=32 -KEY=0130B37AFE24D66079A1760F9B920E6C07F7A5A63FF942F7 -CT=04BD52F4C1AB8DF4816A6E11F8B54452 -PT=DFA0074DEFEDB44D0D96AD6020D1A37D - -I=33 -KEY=00AC6BF5E3AD20FFA6017142747FBA210A6108C61F28E18A -CT=DFA0074DEFEDB44D0D96AD6020D1A37D -PT=5AB15057E05F73FAAF12C0EC26D3F02F - -I=34 -KEY=E3A70EBF3D9167AAFCB021159420C9DBA573C82A39FB11A5 -CT=5AB15057E05F73FAAF12C0EC26D3F02F -PT=6ECC2F23AB7854E97F215C52EF1E62E0 - -I=35 -KEY=CBCD9116DC78FA64927C0E363F589D32DA529478D6E57345 -CT=6ECC2F23AB7854E97F215C52EF1E62E0 -PT=930B3EBDE0989049056022E83FC9EF1E - -I=36 -KEY=FBB5E5462DE715180177308BDFC00D7BDF32B690E92C9C5B -CT=930B3EBDE0989049056022E83FC9EF1E -PT=1EE4ABB9ACD70B93A83BCD8751F858DE - -I=37 -KEY=E5D2B1ACD8BE6DF21F939B32731706E877097B17B8D4C485 -CT=1EE4ABB9ACD70B93A83BCD8751F858DE -PT=FCAC610EA0D309C6D36EED5A4BC04036 - -I=38 -KEY=54DD0B6CB083BDE8E33FFA3CD3C40F2EA467964DF31484B3 -CT=FCAC610EA0D309C6D36EED5A4BC04036 -PT=161D5EE8F50A3F69A11ADFEAF1A2A2AA - -I=39 -KEY=28309F7EB99AAEE1F522A4D426CE3047057D49A702B62619 -CT=161D5EE8F50A3F69A11ADFEAF1A2A2AA -PT=D9D365B061D2F3BF9DF94181837621B4 - -I=40 -KEY=E55ECDDFAE95A2C92CF1C164471CC3F89884082681C007AD -CT=D9D365B061D2F3BF9DF94181837621B4 -PT=938647A6AAD455D89A6DFEFE60D62331 - -I=41 -KEY=C9CEE1C9D89DF76ABF7786C2EDC8962002E9F6D8E116249C -CT=938647A6AAD455D89A6DFEFE60D62331 -PT=06A002DDC7DC4F22F9B1D5734C312AAA - -I=42 -KEY=B26709109B66C916B9D7841F2A14D902FB5823ABAD270E36 -CT=06A002DDC7DC4F22F9B1D5734C312AAA -PT=BB45E9BE2237E3288F56EDD0D9AD6734 - -I=43 -KEY=2FAD2FF32E10680502926DA108233A2A740ECE7B748A6902 -CT=BB45E9BE2237E3288F56EDD0D9AD6734 -PT=CF5A1338F5FA7ED4C77F6EA3836F079A - -I=44 -KEY=63D3D62540C790D1CDC87E99FDD944FEB371A0D8F7E56E98 -CT=CF5A1338F5FA7ED4C77F6EA3836F079A -PT=32F2D628117ADB46383FC101B58E95A6 - -I=45 -KEY=0DF38CE71CF26A19FF3AA8B1ECA39FB88B4E61D9426BFB3E -CT=32F2D628117ADB46383FC101B58E95A6 -PT=3A3CCEA99D43887AC64498AB4EFC87DD - -I=46 -KEY=7EEEB78A0C9BAA9FC506661871E017C24D0AF9720C977CE3 -CT=3A3CCEA99D43887AC64498AB4EFC87DD -PT=787DC1C632C4AA77D42324338C510146 - -I=47 -KEY=4DF02EE427AE29A1BD7BA7DE4324BDB59929DD4180C67DA5 -CT=787DC1C632C4AA77D42324338C510146 -PT=BB0635A471D26B80E5E387E4F14A1626 - -I=48 -KEY=D6983F5E8BE728D9067D927A32F6D6357CCA5AA5718C6B83 -CT=BB0635A471D26B80E5E387E4F14A1626 -PT=14A9AA3EE6343C2D57E0F2ED7A05DC0D - -I=49 -KEY=BD84A7CD471613B512D43844D4C2EA182B2AA8480B89B78E -CT=14A9AA3EE6343C2D57E0F2ED7A05DC0D -PT=25E254AD6C33908BC07B3DEC4052F549 - -I=50 -KEY=E54A2146242AADFB37366CE9B8F17A93EB5195A44BDB42C7 -CT=25E254AD6C33908BC07B3DEC4052F549 -PT=10E09F426E6F33CD21DF1EB748A46088 - -I=51 -KEY=0517B745BCE24E0527D6F3ABD69E495ECA8E8B13037F224F -CT=10E09F426E6F33CD21DF1EB748A46088 -PT=B65D2FFE83F9469AA2B1ABC559EAAB87 - -I=52 -KEY=8297790C75E8931C918BDC5555670FC4683F20D65A9589C8 -CT=B65D2FFE83F9469AA2B1ABC559EAAB87 -PT=E743F6441CCF9703FF4B8E3F4921ACDF - -I=53 -KEY=7EC47C0C5663CD4C76C82A1149A898C79774AEE913B42517 -CT=E743F6441CCF9703FF4B8E3F4921ACDF -PT=BECC5CF2F2C62A9E7D3CF979A9E96F94 - -I=54 -KEY=FBB1F10529FABEB3C80476E3BB6EB259EA485790BA5D4A83 -CT=BECC5CF2F2C62A9E7D3CF979A9E96F94 -PT=3718199958EAA473B980B95F9C76E03F - -I=55 -KEY=EE4113D30720269DFF1C6F7AE384162A53C8EECF262BAABC -CT=3718199958EAA473B980B95F9C76E03F -PT=D15525B8BBB6D209E0BB3B6F5ACB2556 - -I=56 -KEY=488286944DC6B0842E494AC25832C423B373D5A07CE08FEA -CT=D15525B8BBB6D209E0BB3B6F5ACB2556 -PT=0270AF07DDA52DF7CA7B0EE7DF098A80 - -I=57 -KEY=A32A880A84E7EDB82C39E5C58597E9D47908DB47A3E9056A -CT=0270AF07DDA52DF7CA7B0EE7DF098A80 -PT=2D380F99A182CD14CFFEF5E88B93B416 - -I=58 -KEY=DBD0FD5053BC52C60101EA5C241524C0B6F62EAF287AB17C -CT=2D380F99A182CD14CFFEF5E88B93B416 -PT=47FE8C67DCBC616E4C984D323EA4A45B - -I=59 -KEY=D79F78A4726F5FCA46FF663BF8A945AEFA6E639D16DE1527 -CT=47FE8C67DCBC616E4C984D323EA4A45B -PT=FA595C69C3286771FB8C921DFBBFFC2E - -I=60 -KEY=0C88AAD46F951FB6BCA63A523B8122DF01E2F180ED61E909 -CT=FA595C69C3286771FB8C921DFBBFFC2E -PT=8FA64C511FCE6FC987B327D12EBDADAD - -I=61 -KEY=762EEA21D382067E33007603244F4D168651D651C3DC44A4 -CT=8FA64C511FCE6FC987B327D12EBDADAD -PT=8F52C709508408B40C241FD38E515E76 - -I=62 -KEY=EA05788C20FB364EBC52B10A74CB45A28A75C9824D8D1AD2 -CT=8F52C709508408B40C241FD38E515E76 -PT=7CFD332B306684AC92279CE06F1287D8 - -I=63 -KEY=D4B2582B094D874DC0AF822144ADC10E18525562229F9D0A -CT=7CFD332B306684AC92279CE06F1287D8 -PT=0DA14F6619665E0128044355481BD658 - -I=64 -KEY=C080E7033FDF1BCFCD0ECD475DCB9F0F305616376A844B52 -CT=0DA14F6619665E0128044355481BD658 -PT=FEDEBE73AA4047AF27E86A8B9E8E2ED7 - -I=65 -KEY=C5BA9667999CF2D633D07334F78BD8A017BE7CBCF40A6585 -CT=FEDEBE73AA4047AF27E86A8B9E8E2ED7 -PT=12CD6896129E376AAB9C0E980F3B7CD2 - -I=66 -KEY=65FF092A539C4600211D1BA2E515EFCABC227224FB311957 -CT=12CD6896129E376AAB9C0E980F3B7CD2 -PT=04E7939B352F7B5C38B7EC5784EC78C2 - -I=67 -KEY=F98E7062F9EBE61C25FA8839D03A949684959E737FDD6195 -CT=04E7939B352F7B5C38B7EC5784EC78C2 -PT=0184996278A57E36E608E95616C46964 - -I=68 -KEY=306FBEFB3BF4E241247E115BA89FEAA0629D7725691908F1 -CT=0184996278A57E36E608E95616C46964 -PT=92179E392E05C8B96A0CFAC36109B09E - -I=69 -KEY=EE641F5DB58F9057B6698F62869A221908918DE60810B86F -CT=92179E392E05C8B96A0CFAC36109B09E -PT=7F197B01172C809635198E6B156D13BC - -I=70 -KEY=EADB8B255F98FD9DC970F46391B6A28F3D88038D1D7DABD3 -CT=7F197B01172C809635198E6B156D13BC -PT=46F6DD79AD079DCFBC451B24ECDDA4FA - -I=71 -KEY=47225D75FE68FFA08F86291A3CB13F4081CD18A9F1A00F29 -CT=46F6DD79AD079DCFBC451B24ECDDA4FA -PT=B5DAA09E3545F92FF44176187A1F9179 - -I=72 -KEY=7CDECC21E72E54F43A5C898409F4C66F758C6EB18BBF9E50 -CT=B5DAA09E3545F92FF44176187A1F9179 -PT=F51A35F3DD410132EEC9E9F22A6F6FAB - -I=73 -KEY=75D1AAFDBFE72C94CF46BC77D4B5C75D9B458743A1D0F1FB -CT=F51A35F3DD410132EEC9E9F22A6F6FAB -PT=D1CC6D95B58793C342CF14AF250D5E40 - -I=74 -KEY=41874C54BD58757A1E8AD1E26132549ED98A93EC84DDAFBB -CT=D1CC6D95B58793C342CF14AF250D5E40 -PT=A1FAB3B352A887A829357528FED4B80E - -I=75 -KEY=1D94704F4A51A5CABF706251339AD336F0BFE6C47A0917B5 -CT=A1FAB3B352A887A829357528FED4B80E -PT=CBC6473B3AA4DE2D64EED554CA241EAC - -I=76 -KEY=A41B52E0AE7E568074B6256A093E0D1B94513390B02D0919 -CT=CBC6473B3AA4DE2D64EED554CA241EAC -PT=19DC6E89D71DCE5DCECD1A6F85C3FBD6 - -I=77 -KEY=85F21BCD70691F596D6A4BE3DE23C3465A9C29FF35EEF2CF -CT=19DC6E89D71DCE5DCECD1A6F85C3FBD6 -PT=EC6974E51B21F26A100E66183C68FD15 - -I=78 -KEY=CAD0B254A88B669681033F06C502312C4A924FE709860FDA -CT=EC6974E51B21F26A100E66183C68FD15 -PT=A16B6F78009B6E30CB758E87AD4D8034 - -I=79 -KEY=8AC49B19582BFCF32068507EC5995F1C81E7C160A4CB8FEE -CT=A16B6F78009B6E30CB758E87AD4D8034 -PT=CB5C20AAFA898193BC34FF3EE460B313 - -I=80 -KEY=988F8D4F3A66AC99EB3470D43F10DE8F3DD33E5E40AB3CFD -CT=CB5C20AAFA898193BC34FF3EE460B313 -PT=397F92C8E69E0916E30DC6889779799E - -I=81 -KEY=DE2D26C6130E006ED24BE21CD98ED799DEDEF8D6D7D24563 -CT=397F92C8E69E0916E30DC6889779799E -PT=9A9CBD9380E2187855CAE5A73D58480F - -I=82 -KEY=BF6BE6D55C04977348D75F8F596CCFE18B141D71EA8A0D6C -CT=9A9CBD9380E2187855CAE5A73D58480F -PT=B67B360EE0FF297D3662F5B7CDB82CB9 - -I=83 -KEY=6582BCA895FA1221FEAC6981B993E69CBD76E8C6273221D5 -CT=B67B360EE0FF297D3662F5B7CDB82CB9 -PT=2D146ED9236082D2D71810969A1AB1FB - -I=84 -KEY=6AC68BB8BBC7F520D3B807589AF3644E6A6EF850BD28902E -CT=2D146ED9236082D2D71810969A1AB1FB -PT=4B9F55652C40B6DA963A98D875ADACE4 - -I=85 -KEY=180DAB1B14A92DB29827523DB6B3D294FC546088C8853CCA -CT=4B9F55652C40B6DA963A98D875ADACE4 -PT=FC0A8A3D511F5FAFF0A3DD13B49E5A13 - -I=86 -KEY=7ABD7440D5EE5FE2642DD800E7AC8D3B0CF7BD9B7C1B66D9 -CT=FC0A8A3D511F5FAFF0A3DD13B49E5A13 -PT=4231C02AD3231C3EB7AEB9135B95AC4B - -I=87 -KEY=54ACAE182B5FDACF261C182A348F9105BB590488278ECA92 -CT=4231C02AD3231C3EB7AEB9135B95AC4B -PT=4C3A949ACCCBB55F9415C81B1413FD9D - -I=88 -KEY=015706F99E81CC026A268CB0F844245A2F4CCC93339D370F -CT=4C3A949ACCCBB55F9415C81B1413FD9D -PT=E9B1CEAF77B64A88CC3E020B16E1BF7E - -I=89 -KEY=929BD0A1CC6450E78397421F8FF26ED2E372CE98257C8871 -CT=E9B1CEAF77B64A88CC3E020B16E1BF7E -PT=98FFEA0827068CB0B508CA520D8B43F7 - -I=90 -KEY=9B81EC47D8442D311B68A817A8F4E262567A04CA28F7CB86 -CT=98FFEA0827068CB0B508CA520D8B43F7 -PT=BEDA572C3CA3FEF97F7071DA35414EA1 - -I=91 -KEY=93B211B869CBECCBA5B2FF3B94571C9B290A75101DB68527 -CT=BEDA572C3CA3FEF97F7071DA35414EA1 -PT=35E8CB8302748C8623A09980909FB516 - -I=92 -KEY=BC5320E4025EB960905A34B89623901D0AAAEC908D293031 -CT=35E8CB8302748C8623A09980909FB516 -PT=E136148B2FA5AF5CD3F8BC3883566CB8 - -I=93 -KEY=C4EC937F948D0B5A716C2033B9863F41D95250A80E7F5C89 -CT=E136148B2FA5AF5CD3F8BC3883566CB8 -PT=B7CE40E3E3D30191CDF4AB5BE98F347A - -I=94 -KEY=6D381856C149D9DCC6A260D05A553ED014A6FBF3E7F068F3 -CT=B7CE40E3E3D30191CDF4AB5BE98F347A -PT=A821E934DAAE37FF3136E769DAC315FB - -I=95 -KEY=A3679C5957C656DE6E8389E480FB092F25901C9A3D337D08 -CT=A821E934DAAE37FF3136E769DAC315FB -PT=4227B96A0CC6CA1C21BCF8B1ADB3BDE1 - -I=96 -KEY=BE7112453B1DF3EC2CA4308E8C3DC333042CE42B9080C0E9 -CT=4227B96A0CC6CA1C21BCF8B1ADB3BDE1 -PT=EE36BBFDDF19165F9E64AE79B4CF06A9 - -I=97 -KEY=AEA4A2D5CD0A2FC7C2928B735324D56C9A484A52244FC640 -CT=EE36BBFDDF19165F9E64AE79B4CF06A9 -PT=C3DFE088C6767BC939F492C1FA9604CD - -I=98 -KEY=A16FC5F22F03984F014D6BFB9552AEA5A3BCD893DED9C28D -CT=C3DFE088C6767BC939F492C1FA9604CD -PT=DB1202E468119D977868F6E294E3CC3A - -I=99 -KEY=A4E0565DD419BDD1DA5F691FFD433332DBD42E714A3A0EB7 -CT=DB1202E468119D977868F6E294E3CC3A -PT=6F2F682BA4F95EB8C5B883C7660B2653 - -I=100 -KEY=3CAEE44D0E85058EB570013459BA6D8A1E6CADB62C3128E4 -CT=6F2F682BA4F95EB8C5B883C7660B2653 -PT=1036B4AA6C897D36DFE6658A953E5075 - -I=101 -KEY=4E883A500CA89963A546B59E353310BCC18AC83CB90F7891 -CT=1036B4AA6C897D36DFE6658A953E5075 -PT=04FCB3A81E5319A16CCF212719906229 - -I=102 -KEY=ADED5A405C5C095AA1BA06362B60091DAD45E91BA09F1AB8 -CT=04FCB3A81E5319A16CCF212719906229 -PT=CD79BAC069BB58605D43005B927816E5 - -I=103 -KEY=5499B441405D16B06CC3BCF642DB517DF006E94032E70C5D -CT=CD79BAC069BB58605D43005B927816E5 -PT=DB5B3C625D1F66CF28A86CC100472398 - -I=104 -KEY=D31221246382CA8EB79880941FC437B2D8AE858132A02FC5 -CT=DB5B3C625D1F66CF28A86CC100472398 -PT=D8732A2C16EC6AE202371AF03A6F91E8 - -I=105 -KEY=CDF928E97051F08B6FEBAAB809285D50DA999F7108CFBE2D -CT=D8732A2C16EC6AE202371AF03A6F91E8 -PT=F0A1A353A8AB9A893F621F0BEA3B4F01 - -I=106 -KEY=10CC2EED0ECBD1E69F4A09EBA183C7D9E5FB807AE2F4F12C -CT=F0A1A353A8AB9A893F621F0BEA3B4F01 -PT=27E4451BD15E43F301E138713DC12E78 - -I=107 -KEY=03C4F5E1FD3D34D1B8AE4CF070DD842AE41AB80BDF35DF54 -CT=27E4451BD15E43F301E138713DC12E78 -PT=C7FA931DA414CB37A9BDB6F128E082EE - -I=108 -KEY=CC5D7D36D085E3257F54DFEDD4C94F1D4DA70EFAF7D55DBA -CT=C7FA931DA414CB37A9BDB6F128E082EE -PT=A6777D51A0A1C94DD74A18795341015F - -I=109 -KEY=9F4EE4750FF3F53AD923A2BC746886509AED1683A4945CE5 -CT=A6777D51A0A1C94DD74A18795341015F -PT=32A4D930A5597E02D7076E399D18D895 - -I=110 -KEY=8525417BB6D8095BEB877B8CD131F8524DEA78BA398C8470 -CT=32A4D930A5597E02D7076E399D18D895 -PT=1B78FCF274EEB1E597998EE4EFFF9F8B - -I=111 -KEY=54EFA98071F1EF62F0FF877EA5DF49B7DA73F65ED6731BFB -CT=1B78FCF274EEB1E597998EE4EFFF9F8B -PT=2997FEE2823CC84DA14E8439449F5C7C - -I=112 -KEY=2505931CE4D41D16D968799C27E381FA7B3D726792EC4787 -CT=2997FEE2823CC84DA14E8439449F5C7C -PT=810534A9E8DB2808FEE681B13C04411D - -I=113 -KEY=C2DF863BEB4F27AB586D4D35CF38A9F285DBF3D6AEE8069A -CT=810534A9E8DB2808FEE681B13C04411D -PT=BE2380994365F1D7FC8278E86C8B497D - -I=114 -KEY=036C0C95D0C26B66E64ECDAC8C5D582579598B3EC2634FE7 -CT=BE2380994365F1D7FC8278E86C8B497D -PT=EFEC3977D5A21DC4AC786E786CA3ECE9 - -I=115 -KEY=BD05AD63A0A9F1B509A2F4DB59FF45E1D521E546AEC0A30E -CT=EFEC3977D5A21DC4AC786E786CA3ECE9 -PT=22A7280D8231895EA4F0B6A39AC583C3 - -I=116 -KEY=A16DFA00981597B42B05DCD6DBCECCBF71D153E5340520CD -CT=22A7280D8231895EA4F0B6A39AC583C3 -PT=0CC61E91B3CBCD0E190D52059E27647A - -I=117 -KEY=ABC1AD453235832727C3C247680501B168DC01E0AA2244B7 -CT=0CC61E91B3CBCD0E190D52059E27647A -PT=5CE91F77F7C8F0AB1BBA802D2FFF0E9B - -I=118 -KEY=64D40ACA0F526EC67B2ADD309FCDF11A736681CD85DD4A2C -CT=5CE91F77F7C8F0AB1BBA802D2FFF0E9B -PT=255459BE5A27E08942A049F6EC44582E - -I=119 -KEY=8BB5C7D8B2B177855E7E848EC5EA119331C6C83B69991202 -CT=255459BE5A27E08942A049F6EC44582E -PT=28E2E20115C3665D9D88CB74681301EA - -I=120 -KEY=4E30FCC4C182F471769C668FD02977CEAC4E034F018A13E8 -CT=28E2E20115C3665D9D88CB74681301EA -PT=2E96E6BBCD999F4B1507C7EC9E4B8430 - -I=121 -KEY=906B361E9D72E107580A80341DB0E885B949C4A39FC197D8 -CT=2E96E6BBCD999F4B1507C7EC9E4B8430 -PT=03DED0A95164E5FA215E9C49C433E95B - -I=122 -KEY=F656F5D9D973C02C5BD4509D4CD40D7F981758EA5BF27E83 -CT=03DED0A95164E5FA215E9C49C433E95B -PT=AD9C16D2567B73FCA4866FE16CF09CDA - -I=123 -KEY=8811A4ACDF37A140F648464F1AAF7E833C91370B3702E259 -CT=AD9C16D2567B73FCA4866FE16CF09CDA -PT=68539BFF0F8CC23A0A3267796A11B75C - -I=124 -KEY=E5AF2E8CDBAD01589E1BDDB01523BCB936A350725D135505 -CT=68539BFF0F8CC23A0A3267796A11B75C -PT=B15F623E5A7D73452A419EB04AFCF72E - -I=125 -KEY=C9E743CAD731A62E2F44BF8E4F5ECFFC1CE2CEC217EFA22B -CT=B15F623E5A7D73452A419EB04AFCF72E -PT=520142AFDA69E9CFA98D8DD59CCB12BC - -I=126 -KEY=6CF6C656FFBB77807D45FD2195372633B56F43178B24B097 -CT=520142AFDA69E9CFA98D8DD59CCB12BC -PT=7EC2A8430F23A5E183E0032DAB5232C5 - -I=127 -KEY=772CEE9F934D57D4038755629A1483D2368F403A20768252 -CT=7EC2A8430F23A5E183E0032DAB5232C5 -PT=E5E3A5D968B1FF774B55CCA06BE3BD65 - -I=128 -KEY=9A4DAB93F3C74EBBE664F0BBF2A57CA57DDA8C9A4B953F37 -CT=E5E3A5D968B1FF774B55CCA06BE3BD65 -PT=9608643D0A34DA28372A7E7E34427E1B - -I=129 -KEY=EF0F60BCBA3374E0706C9486F891A68D4AF0F2E47FD7412C -CT=9608643D0A34DA28372A7E7E34427E1B -PT=B22BD410584F29610801B18EDAB1BD19 - -I=130 -KEY=DE013A6C3440AFF3C2474096A0DE8FEC42F1436AA566FC35 -CT=B22BD410584F29610801B18EDAB1BD19 -PT=ADEC4519F1A7AD74BCCECABEDCF20D73 - -I=131 -KEY=2B5B547A934A5A376FAB058F51792298FE3F89D47994F146 -CT=ADEC4519F1A7AD74BCCECABEDCF20D73 -PT=E04D4FF54191BEEEF5B295A32DA2ADE5 - -I=132 -KEY=BF356F2FFC2C538F8FE64A7A10E89C760B8D1C7754365CA3 -CT=E04D4FF54191BEEEF5B295A32DA2ADE5 -PT=3F9531EDD5072F7A9F2A62ECC2CCE50A - -I=133 -KEY=7CEBD7310CC4791AB0737B97C5EFB30C94A77E9B96FAB9A9 -CT=3F9531EDD5072F7A9F2A62ECC2CCE50A -PT=C3DC95781FAE7BB6C02BD08B3617DDF1 - -I=134 -KEY=192741D2AB9C887673AFEEEFDA41C8BA548CAE10A0ED6458 -CT=C3DC95781FAE7BB6C02BD08B3617DDF1 -PT=F69B837F168B9A9E637E7357B65F2B60 - -I=135 -KEY=38552740A79FB5BF85346D90CCCA522437F2DD4716B24F38 -CT=F69B837F168B9A9E637E7357B65F2B60 -PT=40DCDF58E7EFDD62C114A83F8AC898BB - -I=136 -KEY=A0AED2C07C2168B6C5E8B2C82B258F46F6E675789C7AD783 -CT=40DCDF58E7EFDD62C114A83F8AC898BB -PT=27F78F3BD8E04A8646EBF364155A71ED - -I=137 -KEY=2B4FAEBF17993E12E21F3DF3F3C5C5C0B00D861C8920A66E -CT=27F78F3BD8E04A8646EBF364155A71ED -PT=F305DFC8EAD44E786F59B0551C7104F5 - -I=138 -KEY=96819F6E9738209F111AE23B19118BB8DF5436499551A29B -CT=F305DFC8EAD44E786F59B0551C7104F5 -PT=2E47F833BE7C06ED1E42AC11366F4BEF - -I=139 -KEY=AAEA16BAC3E84DD73F5D1A08A76D8D55C1169A58A33EE974 -CT=2E47F833BE7C06ED1E42AC11366F4BEF -PT=A9D3A511C3D76779B607AAB2556823AD - -I=140 -KEY=F66BA47C56AC5A36968EBF1964BAEA2C771130EAF656CAD9 -CT=A9D3A511C3D76779B607AAB2556823AD -PT=153A7CC2387C05289F759C85076CDD88 - -I=141 -KEY=1D892BCCFAF3DA1083B4C3DB5CC6EF04E864AC6FF13A1751 -CT=153A7CC2387C05289F759C85076CDD88 -PT=76B6089030D914F0F4C6078193207A7D - -I=142 -KEY=DAEBAF980095A397F502CB4B6C1FFBF41CA2ABEE621A6D2C -CT=76B6089030D914F0F4C6078193207A7D -PT=EB71D127848BA397451D45801830461E - -I=143 -KEY=85F86FADA92076AB1E731A6CE894586359BFEE6E7A2A2B32 -CT=EB71D127848BA397451D45801830461E -PT=B79D9BE1B2DB808B412413C203C710DF - -I=144 -KEY=BEADDA5CE1E7F3D4A9EE818D5A4FD8E8189BFDAC79ED3BED -CT=B79D9BE1B2DB808B412413C203C710DF -PT=E6423467C3CA69D94C944FA2A97BB61F - -I=145 -KEY=D4664C8DCFA8304D4FACB5EA9985B131540FB20ED0968DF2 -CT=E6423467C3CA69D94C944FA2A97BB61F -PT=18EFF53B7D62A9D9ED8AB9ABE67FC110 - -I=146 -KEY=9CCF1EEAF55FEA5A574340D1E4E718E8B9850BA536E94CE2 -CT=18EFF53B7D62A9D9ED8AB9ABE67FC110 -PT=8E6A4AC577153D806ED71A07319CAB67 - -I=147 -KEY=7D840184CB9D3A05D9290A1493F22568D75211A20775E785 -CT=8E6A4AC577153D806ED71A07319CAB67 -PT=B7B23D8E7D344F39B3EA0D67CCF37377 - -I=148 -KEY=D72F35B6DD825B656E9B379AEEC66A5164B81CC5CB8694F2 -CT=B7B23D8E7D344F39B3EA0D67CCF37377 -PT=3385AD0503AF68BFBFBEAA89B1C87736 - -I=149 -KEY=48335F06D7C27C955D1E9A9FED6902EEDB06B64C7A4EE3C4 -CT=3385AD0503AF68BFBFBEAA89B1C87736 -PT=9FC40A6B984BEEC182AB650B05CEF38C - -I=150 -KEY=A66149286535FD6EC2DA90F47522EC2F59ADD3477F801048 -CT=9FC40A6B984BEEC182AB650B05CEF38C -PT=4CEC52C9DE143486DFC9D098637DFBB5 - -I=151 -KEY=7EA78450FAEEF8BF8E36C23DAB36D8A9866403DF1CFDEBFD -CT=4CEC52C9DE143486DFC9D098637DFBB5 -PT=EB8E40333ACD18EFB04DC0A857DDCD7A - -I=152 -KEY=197DDF842BAEF36E65B8820E91FBC0463629C3774B202687 -CT=EB8E40333ACD18EFB04DC0A857DDCD7A -PT=F1AFF04058F819B0F191398C8022130F - -I=153 -KEY=D68841CF848B0F619417724EC903D9F6C7B8FAFBCB023588 -CT=F1AFF04058F819B0F191398C8022130F -PT=6DF4A95D8D602C0E53F5A5C350D3EB64 - -I=154 -KEY=6DFA0F7B01A2F011F9E3DB134463F5F8944D5F389BD1DEEC -CT=6DF4A95D8D602C0E53F5A5C350D3EB64 -PT=057D8F9BE9260BB3A0382CD2EF7D1FCA - -I=155 -KEY=88227C4AD1CBC8F0FC9E5488AD45FE4B347573EA74ACC126 -CT=057D8F9BE9260BB3A0382CD2EF7D1FCA -PT=D4EDACCB9B7B35F2A0690E22C91E25AE - -I=156 -KEY=848B8E3213D366B22873F843363ECBB9941C7DC8BDB2E488 -CT=D4EDACCB9B7B35F2A0690E22C91E25AE -PT=A2F61B5BDD9F580B26C329B878BAFA3C - -I=157 -KEY=FA3A476D1C6E33FD8A85E318EBA193B2B2DF5470C5081EB4 -CT=A2F61B5BDD9F580B26C329B878BAFA3C -PT=5A0616880CD40B72B58CF268EC8F934B - -I=158 -KEY=C9F77D58F58D5FEDD083F590E77598C00753A61829878DFF -CT=5A0616880CD40B72B58CF268EC8F934B -PT=0E42047D7EDE2A5FBB37767A69A45B9B - -I=159 -KEY=00A523C700FBB663DEC1F1ED99ABB29FBC64D0624023D664 -CT=0E42047D7EDE2A5FBB37767A69A45B9B -PT=2AFA823A10BB436A7B00816C80A52711 - -I=160 -KEY=660275323A59E807F43B73D78910F1F5C764510EC086F175 -CT=2AFA823A10BB436A7B00816C80A52711 -PT=B2406F3F9160E25DF7C9AA81AF6EB449 - -I=161 -KEY=47A4FCDB97D4A383467B1CE8187013A830ADFB8F6FE8453C -CT=B2406F3F9160E25DF7C9AA81AF6EB449 -PT=B1E01D2A401495F8DDAEAB7B04BEB23D - -I=162 -KEY=2BDD5B54D4EB236AF79B01C258648650ED0350F46B56F701 -CT=B1E01D2A401495F8DDAEAB7B04BEB23D -PT=390572A9ECE28A0E0BBDC729DBE5F79A - -I=163 -KEY=328202460B65D004CE9E736BB4860C5EE6BE97DDB0B3009B -CT=390572A9ECE28A0E0BBDC729DBE5F79A -PT=5D41665811702124C597DB4E3BD950E1 - -I=164 -KEY=94457C0A759DF4E993DF1533A5F62D7A23294C938B6A507A -CT=5D41665811702124C597DB4E3BD950E1 -PT=689EB1CB1586D127696E8725DEE49E58 - -I=165 -KEY=4E0226CA850DDC79FB41A4F8B070FC5D4A47CBB6558ECE22 -CT=689EB1CB1586D127696E8725DEE49E58 -PT=A2D9DF62AC8BF8A93E7A954416864052 - -I=166 -KEY=659C817A1C10A24D59987B9A1CFB04F4743D5EF243088E70 -CT=A2D9DF62AC8BF8A93E7A954416864052 -PT=507835696F1920BD4A05797563DF5769 - -I=167 -KEY=92192D9175187FB409E04EF373E224493E38278720D7D919 -CT=507835696F1920BD4A05797563DF5769 -PT=2070413F5103482B6C83129304E5AC87 - -I=168 -KEY=6959063FBA59CCEC29900FCC22E16C6252BB35142432759E -CT=2070413F5103482B6C83129304E5AC87 -PT=BF7FD1E21B41B1F1C2625C1097F1BCB8 - -I=169 -KEY=5722993710D811B196EFDE2E39A0DD9390D96904B3C3C926 -CT=BF7FD1E21B41B1F1C2625C1097F1BCB8 -PT=6E2236654F2999545F50FA9CF63F9F2E - -I=170 -KEY=038FA98E7A226A9FF8CDE84B768944C7CF89939845FC5608 -CT=6E2236654F2999545F50FA9CF63F9F2E -PT=3F370291CEDCB115C8EE409A8EEB46D6 - -I=171 -KEY=CACF0199725D5466C7FAEADAB855F5D20767D302CB1710DE -CT=3F370291CEDCB115C8EE409A8EEB46D6 -PT=84023DB96D373EC8315AE78A3B7E82FB - -I=172 -KEY=7B40321CB11520D143F8D763D562CB1A363D3488F0699225 -CT=84023DB96D373EC8315AE78A3B7E82FB -PT=C35064D82A3016FE2C2E2CC0627E7B5C - -I=173 -KEY=F045CFEC2A6BC7E580A8B3BBFF52DDE41A1318489217E979 -CT=C35064D82A3016FE2C2E2CC0627E7B5C -PT=D78DFFE87C0F95856C31A07BADA23084 - -I=174 -KEY=86B3CA5F50CEF6C557254C53835D48617622B8333FB5D9FD -CT=D78DFFE87C0F95856C31A07BADA23084 -PT=5B5B5D3CA5C6E5CF18F3E4EE802BE82B - -I=175 -KEY=E6D99DC0C58655B70C7E116F269BADAE6ED15CDDBF9E31D6 -CT=5B5B5D3CA5C6E5CF18F3E4EE802BE82B -PT=DB65A82F6EB7A410A367165900E85117 - -I=176 -KEY=B8F770CFBE47D070D71BB940482C09BECDB64A84BF7660C1 -CT=DB65A82F6EB7A410A367165900E85117 -PT=FE8BE8484D925043102238FF63FDAC57 - -I=177 -KEY=FF09ADB06FE587192990510805BE59FDDD94727BDC8BCC96 -CT=FE8BE8484D925043102238FF63FDAC57 -PT=AC36E01A7AD482A8D89703D2A6528720 - -I=178 -KEY=B5C937A4019CDAD185A6B1127F6ADB55050371A97AD94BB6 -CT=AC36E01A7AD482A8D89703D2A6528720 -PT=9F3698CE06C6497C89B58CA723F7ECAA - -I=179 -KEY=F60CAF8FB99B63B21A9029DC79AC92298CB6FD0E592EA71C -CT=9F3698CE06C6497C89B58CA723F7ECAA -PT=FB8CE2E1D332FE4557B6C5CF1676F2FB - -I=180 -KEY=B7CF2BABD58B5FDCE11CCB3DAA9E6C6CDB0038C14F5855E7 -CT=FB8CE2E1D332FE4557B6C5CF1676F2FB -PT=A2631F612698318AD454E9DB10319DA6 - -I=181 -KEY=FD99B4137CAFC47F437FD45C8C065DE60F54D11A5F69C841 -CT=A2631F612698318AD454E9DB10319DA6 -PT=FCA42B332B5974EE6DFA54B54EC89AC7 - -I=182 -KEY=271CEEF189AD367DBFDBFF6FA75F290862AE85AF11A15286 -CT=FCA42B332B5974EE6DFA54B54EC89AC7 -PT=A70DBBDFCE54B8648C3FC4A8A58CCDF8 - -I=183 -KEY=7B78F7ECC9B28EC718D644B0690B916CEE914107B42D9F7E -CT=A70DBBDFCE54B8648C3FC4A8A58CCDF8 -PT=C90CE914F9310F9C3EE065DD95281A51 - -I=184 -KEY=762F521ADF6C5F24D1DAADA4903A9EF0D07124DA2105852F -CT=C90CE914F9310F9C3EE065DD95281A51 -PT=63E8430CE22F531E4A4D4583533F6FC4 - -I=185 -KEY=A88A493EB3C28C49B232EEA87215CDEE9A3C6159723AEAEB -CT=63E8430CE22F531E4A4D4583533F6FC4 -PT=E7562DC647910A052F4AFBF165A68A3A - -I=186 -KEY=1C97343A60EE05035564C36E3584C7EBB5769AA8179C60D1 -CT=E7562DC647910A052F4AFBF165A68A3A -PT=3E070B3F65FD01B49849513B556DB199 - -I=187 -KEY=C5110692100A332E6B63C8515079C65F2D3FCB9342F1D148 -CT=3E070B3F65FD01B49849513B556DB199 -PT=3DE5A45B2CAA4FAFAC3032F89F15195D - -I=188 -KEY=D94D8CAA9EBD67F056866C0A7CD389F0810FF96BDDE4C815 -CT=3DE5A45B2CAA4FAFAC3032F89F15195D -PT=A36A163E8806B1E053EBE439B0D1302F - -I=189 -KEY=1C1D7A3E9358048CF5EC7A34F4D53810D2E41D526D35F83A -CT=A36A163E8806B1E053EBE439B0D1302F -PT=67CA4B988CCABA4E4DBEE6C387562762 - -I=190 -KEY=9182E40D14973087922631AC781F825E9F5AFB91EA63DF58 -CT=67CA4B988CCABA4E4DBEE6C387562762 -PT=9F404F0E1A9FE5A988CE6E4A54FE9E23 - -I=191 -KEY=7D89ECFC0DCFFE0A0D667EA2628067F7179495DBBE9D417B -CT=9F404F0E1A9FE5A988CE6E4A54FE9E23 -PT=D71EFD794457C71614E4266C77193444 - -I=192 -KEY=AC7A11D29CDA0FB6DA7883DB26D7A0E10370B3B7C984753F -CT=D71EFD794457C71614E4266C77193444 -PT=185DBF418A6834CD118B16EAF381F3CB - -I=193 -KEY=1029D5FA3D38927EC2253C9AACBF942C12FBA55D3A0586F4 -CT=185DBF418A6834CD118B16EAF381F3CB -PT=737A502DEE68DDFA3FEECD42ACE124EA - -I=194 -KEY=F261B484C642750CB15F6CB742D749D62D15681F96E4A21E -CT=737A502DEE68DDFA3FEECD42ACE124EA -PT=FD11B0F356455913E892928B5B16946B - -I=195 -KEY=BCCFAF05FF47A5EC4C4EDC44149210C5C587FA94CDF23675 -CT=FD11B0F356455913E892928B5B16946B -PT=4B06F6D6D149BAF25D4C76E46EFF8571 - -I=196 -KEY=1000A15983B73D6807482A92C5DBAA3798CB8C70A30DB304 -CT=4B06F6D6D149BAF25D4C76E46EFF8571 -PT=450713DA24492403C48CB16D2F39744E - -I=197 -KEY=306F097E64B634AC424F3948E1928E345C473D1D8C34C74A -CT=450713DA24492403C48CB16D2F39744E -PT=998CA5E3C80B66EB11EAD376FA358A92 - -I=198 -KEY=13965208C3EF77E1DBC39CAB2999E8DF4DADEE6B76014DD8 -CT=998CA5E3C80B66EB11EAD376FA358A92 -PT=F54A34F6F0833CA808D60A8F75BB0585 - -I=199 -KEY=1A6DC3FDD0D1F97C2E89A85DD91AD477457BE4E403BA485D -CT=F54A34F6F0833CA808D60A8F75BB0585 -PT=8760D5CBD1DA48807BAEAF7F781680F2 - -I=200 -KEY=228897B4E2F16967A9E97D9608C09CF73ED54B9B7BACC8AF -CT=8760D5CBD1DA48807BAEAF7F781680F2 -PT=EF57DF7161E1BC0F7B466A50C576691A - -I=201 -KEY=D0E8190E72A305C946BEA2E7692120F8459321CBBEDAA1B5 -CT=EF57DF7161E1BC0F7B466A50C576691A -PT=E01ECA338A93EA38E43B2F364314C121 - -I=202 -KEY=087F0486B80659F0A6A068D4E3B2CAC0A1A80EFDFDCE6094 -CT=E01ECA338A93EA38E43B2F364314C121 -PT=A7683273638D02272FF6A311BB94256F - -I=203 -KEY=1D807E4730DDA3EB01C85AA7803FC8E78E5EADEC465A45FB -CT=A7683273638D02272FF6A311BB94256F -PT=1BCC3DF6B07BD2615C13E381F5F877C3 - -I=204 -KEY=D4D4F2780D52D7521A04675130441A86D24D4E6DB3A23238 -CT=1BCC3DF6B07BD2615C13E381F5F877C3 -PT=D1B3B793D1377E82A2DE5D46E53791FB - -I=205 -KEY=86D08D85652DB662CBB7D0C2E17364047093132B5695A3C3 -CT=D1B3B793D1377E82A2DE5D46E53791FB -PT=9AC7AF9B82621E18E4FF613EAA609F46 - -I=206 -KEY=C03996907AC99A7A51707F5963117A1C946C7215FCF53C85 -CT=9AC7AF9B82621E18E4FF613EAA609F46 -PT=57F3FA35A42C29F33DEC4671140264A4 - -I=207 -KEY=F8CA52D95C587EF80683856CC73D53EFA9803464E8F75821 -CT=57F3FA35A42C29F33DEC4671140264A4 -PT=A887ED8BF6C19F5012F317A4FCF3D7BF - -I=208 -KEY=DE99CC8F9756C1DCAE0468E731FCCCBFBB7323C014048F9E -CT=A887ED8BF6C19F5012F317A4FCF3D7BF -PT=A29C8D764BCF211C789158A9B8EB330C - -I=209 -KEY=9228DB1B61E0D8670C98E5917A33EDA3C3E27B69ACEFBC92 -CT=A29C8D764BCF211C789158A9B8EB330C -PT=EB6AFD9B36315DB322EC8C4243043F50 - -I=210 -KEY=24AFE14097C2A217E7F2180A4C02B010E10EF72BEFEB83C2 -CT=EB6AFD9B36315DB322EC8C4243043F50 -PT=05C8AC90CCD00E2A3809C68C11D6D65A - -I=211 -KEY=32810943F9313BD0E23AB49A80D2BE3AD90731A7FE3D5598 -CT=05C8AC90CCD00E2A3809C68C11D6D65A -PT=E39991B58C52154166AD09367B04C67A - -I=212 -KEY=FBEC72A177254EA501A3252F0C80AB7BBFAA3891853993E2 -CT=E39991B58C52154166AD09367B04C67A -PT=CBC8974F72F77A1821FC69B29FE2DB60 - -I=213 -KEY=C706D206DE538439CA6BB2607E77D1639E5651231ADB4882 -CT=CBC8974F72F77A1821FC69B29FE2DB60 -PT=1D08F4E2B8DFED1032B6CA5211B3E34C - -I=214 -KEY=9A7EB0A4F8E67F87D7634682C6A83C73ACE09B710B68ABCE -CT=1D08F4E2B8DFED1032B6CA5211B3E34C -PT=1888CEC22449EFF96BDC2C7A242BBBDC - -I=215 -KEY=70CA2CAD6A50D22BCFEB8840E2E1D38AC73CB70B2F431012 -CT=1888CEC22449EFF96BDC2C7A242BBBDC -PT=032E6155677B6A72D7F94C7A9A9AA53F - -I=216 -KEY=B16697FEA247CDB9CCC5E915859AB9F810C5FB71B5D9B52D -CT=032E6155677B6A72D7F94C7A9A9AA53F -PT=9B43BBD1C0CEBF7593E9BC0ABB626E96 - -I=217 -KEY=7A3E844BEB897A63578652C44554068D832C477B0EBBDBBB -CT=9B43BBD1C0CEBF7593E9BC0ABB626E96 -PT=8D661E03C61C28D5786EBCEBE0D5B63D - -I=218 -KEY=E7A1B96EFC4D5FB5DAE04CC783482E58FB42FB90EE6E6D86 -CT=8D661E03C61C28D5786EBCEBE0D5B63D -PT=F61D5DCBF8F2F3F0EAB387149790E079 - -I=219 -KEY=0EDA761C06FBA0A02CFD110C7BBADDA811F17C8479FE8DFF -CT=F61D5DCBF8F2F3F0EAB387149790E079 -PT=1F03E0957B6892533BBEAB06EB35AD4F - -I=220 -KEY=E242AD5B7141916133FEF19900D24FFB2A4FD78292CB20B0 -CT=1F03E0957B6892533BBEAB06EB35AD4F -PT=BB9E7343035F88764B229D506E7ADC7B - -I=221 -KEY=D901A6CF874A6A77886082DA038DC78D616D4AD2FCB1FCCB -CT=BB9E7343035F88764B229D506E7ADC7B -PT=3934EBF7AD2243C0D09734E30B41C0E4 - -I=222 -KEY=0F488E86E7D92F29B154692DAEAF844DB1FA7E31F7F03C2F -CT=3934EBF7AD2243C0D09734E30B41C0E4 -PT=B9CE1A1A9595E7235F5B10FBA29ACCD2 - -I=223 -KEY=A7E2CF991692247A089A73373B3A636EEEA16ECA556AF0FD -CT=B9CE1A1A9595E7235F5B10FBA29ACCD2 -PT=624EBA65EE9E3E1BDF8C5AA7E1283A65 - -I=224 -KEY=1DE03E09395E56CE6AD4C952D5A45D75312D346DB442CA98 -CT=624EBA65EE9E3E1BDF8C5AA7E1283A65 -PT=375132E5F47DA19E80CC8652BE5A3692 - -I=225 -KEY=51B6813629EFE53C5D85FBB721D9FCEBB1E1B23F0A18FC0A -CT=375132E5F47DA19E80CC8652BE5A3692 -PT=8165A4126FE75EFC6AFF7BFD732F94A6 - -I=226 -KEY=8DD50DFF93624339DCE05FA54E3EA217DB1EC9C2793768AC -CT=8165A4126FE75EFC6AFF7BFD732F94A6 -PT=35012FABD289E6B7FB07946591D18F0D - -I=227 -KEY=C7A4F75CB74C7F3DE9E1700E9CB744A020195DA7E8E6E7A1 -CT=35012FABD289E6B7FB07946591D18F0D -PT=C26F37D700677ED72F4FC2C8F6AEADE2 - -I=228 -KEY=198B572CD0E711352B8E47D99CD03A770F569F6F1E484A43 -CT=C26F37D700677ED72F4FC2C8F6AEADE2 -PT=CB29ECE41596736B72AED2460AEEFBA2 - -I=229 -KEY=0A1FB41CA720E357E0A7AB3D8946491C7DF84D2914A6B1E1 -CT=CB29ECE41596736B72AED2460AEEFBA2 -PT=7F7BD6FAF9C37D5522A3BF480CCEBF20 - -I=230 -KEY=7E383601899DEA729FDC7DC7708534495F5BF26118680EC1 -CT=7F7BD6FAF9C37D5522A3BF480CCEBF20 -PT=C501E371005DF57E0037F41A744D026F - -I=231 -KEY=13ACF410865B41E15ADD9EB670D8C1375F6C067B6C250CAE -CT=C501E371005DF57E0037F41A744D026F -PT=624EF8749580108CDC7A020179F81D0F - -I=232 -KEY=75F025072AA2406F389366C2E558D1BB8316047A15DD11A1 -CT=624EF8749580108CDC7A020179F81D0F -PT=40D72550603522C67180DE6EC3D30139 - -I=233 -KEY=C5ED76F88EA65C3D78444392856DF37DF296DA14D60E1098 -CT=40D72550603522C67180DE6EC3D30139 -PT=96C6F647AFB90F804431F9E2F1780F29 - -I=234 -KEY=E827DFF88D0B1A43EE82B5D52AD4FCFDB6A723F627761FB1 -CT=96C6F647AFB90F804431F9E2F1780F29 -PT=CCB934A501DDAD11E994938A214EB189 - -I=235 -KEY=F0777D1BFF12EE42223B81702B0951EC5F33B07C0638AE38 -CT=CCB934A501DDAD11E994938A214EB189 -PT=07825F2D35E761C76893B697E30E4D08 - -I=236 -KEY=6912B59C06C90D3725B9DE5D1EEE302B37A006EBE536E330 -CT=07825F2D35E761C76893B697E30E4D08 -PT=1F674E97F88EB1DA1DD24C0AB4321258 - -I=237 -KEY=AE24933526FAE5F83ADE90CAE66081F12A724AE15104F168 -CT=1F674E97F88EB1DA1DD24C0AB4321258 -PT=B6DE499EBE0B3C30F1DAC8E40FE9F10C - -I=238 -KEY=F348F88852CF356C8C00D954586BBDC1DBA882055EED0064 -CT=B6DE499EBE0B3C30F1DAC8E40FE9F10C -PT=105E31DBDE33764B098862AF6D0B6CD2 - -I=239 -KEY=83B06CC00A17D3149C5EE88F8658CB8AD220E0AA33E66CB6 -CT=105E31DBDE33764B098862AF6D0B6CD2 -PT=697D6537677B20C188246FBF4997C7CB - -I=240 -KEY=A5381A9C91D61A01F5238DB8E123EB4B5A048F157A71AB7D -CT=697D6537677B20C188246FBF4997C7CB -PT=4FBFB0EFBA92C1E0189E2C3097AA35BA - -I=241 -KEY=FDF831A7D1345AFEBA9C3D575BB12AAB429AA325EDDB9EC7 -CT=4FBFB0EFBA92C1E0189E2C3097AA35BA -PT=600288531DCEB99B69A7890CE804FA9F - -I=242 -KEY=A10ED54E7B2B2B2BDA9EB504467F93302B3D2A2905DF6458 -CT=600288531DCEB99B69A7890CE804FA9F -PT=EE94D4376D9332C8DCD05C695EDB124F - -I=243 -KEY=2F69F01250D7745F340A61332BECA1F8F7ED76405B047617 -CT=EE94D4376D9332C8DCD05C695EDB124F -PT=7EDC3182C36DC5A172B170A919524888 - -I=244 -KEY=FCD5F8FAB347624E4AD650B1E8816459855C06E942563E9F -CT=7EDC3182C36DC5A172B170A919524888 -PT=95FA03C96DFCB9ABCFF23B5ABFBABCDE - -I=245 -KEY=A9307E62197A747EDF2C5378857DDDF24AAE3DB3FDEC8241 -CT=95FA03C96DFCB9ABCFF23B5ABFBABCDE -PT=6CE2C6CFC61667965C20B0BE11B55DDE - -I=246 -KEY=DA3B03896DDFDE08B3CE95B7436BBA64168E8D0DEC59DF9F -CT=6CE2C6CFC61667965C20B0BE11B55DDE -PT=3DBDFBE63A6FAE7572C778108A62A27C - -I=247 -KEY=7D766BAD6E536CE38E736E51790414116449F51D663B7DE3 -CT=3DBDFBE63A6FAE7572C778108A62A27C -PT=1C197D3449FED6ED6924E14B43A17BF0 - -I=248 -KEY=36F69C30B0272CAB926A136530FAC2FC0D6D1456259A0613 -CT=1C197D3449FED6ED6924E14B43A17BF0 -PT=0B0CCC6F508C18168284F7976AD81BEE - -I=249 -KEY=632661C312B2EB5D9966DF0A6076DAEA8FE9E3C14F421DFD -CT=0B0CCC6F508C18168284F7976AD81BEE -PT=F437B8FD92CE37D8D74550C5BE29BF99 - -I=250 -KEY=5FB1BDFC29EFE2DA6D5167F7F2B8ED3258ACB304F16BA264 -CT=F437B8FD92CE37D8D74550C5BE29BF99 -PT=78F6E6F6480A04F5632EA112170F928C - -I=251 -KEY=2B24C5188F4A2E7B15A78101BAB2E9C73B821216E66430E8 -CT=78F6E6F6480A04F5632EA112170F928C -PT=2FD38831EE4D09DD8DB9A84B5825B528 - -I=252 -KEY=F816FB720A08828C3A74093054FFE01AB63BBA5DBE4185C0 -CT=2FD38831EE4D09DD8DB9A84B5825B528 -PT=ED307697B51CFAD7052A3A7B3A564990 - -I=253 -KEY=776B08F4778FAB96D7447FA7E1E31ACDB31180268417CC50 -CT=ED307697B51CFAD7052A3A7B3A564990 -PT=DB9952A98F0D4B045C624EFA5619CAF9 - -I=254 -KEY=C7A944C9BA2D5F740CDD2D0E6EEE51C9EF73CEDCD20E06A9 -CT=DB9952A98F0D4B045C624EFA5619CAF9 -PT=DADA40BF0E367AF50874BB2628251AA3 - -I=255 -KEY=69B8688D9C1ECD95D6076DB160D82B3CE70775FAFA2B1C0A -CT=DADA40BF0E367AF50874BB2628251AA3 -PT=35DFA85D3F2D7F47DD7865EA0BC73A5C - -I=256 -KEY=7E6C7E90EDE36F44E3D8C5EC5FF5547B3A7F1010F1EC2656 -CT=35DFA85D3F2D7F47DD7865EA0BC73A5C -PT=EE0231F994C2DB6C7C04746170F03E54 - -I=257 -KEY=0E56C8FD184AB5D40DDAF415CB378F17467B6471811C1802 -CT=EE0231F994C2DB6C7C04746170F03E54 -PT=D9F314FEAD11122CE8F532ED0C0B129C - -I=258 -KEY=267BC5325796002BD429E0EB66269D3BAE8E569C8D170A9E -CT=D9F314FEAD11122CE8F532ED0C0B129C -PT=74A32BDFF53A59F09AAFB328977E05B1 - -I=259 -KEY=889B6087CAAD1B43A08ACB34931CC4CB3421E5B41A690F2F -CT=74A32BDFF53A59F09AAFB328977E05B1 -PT=D4CCC3077C15EE470D5EFCF815A48410 - -I=260 -KEY=F9AE78D077E3F98574460833EF092A8C397F194C0FCD8B3F -CT=D4CCC3077C15EE470D5EFCF815A48410 -PT=29284B0E7776DFB8BB536B3C16399D62 - -I=261 -KEY=71BBCD4B1F4B04265D6E433D987FF534822C727019F4165D -CT=29284B0E7776DFB8BB536B3C16399D62 -PT=202326CEAD57A5C13592FFBFFD5BF508 - -I=262 -KEY=F6F461C7931CF0317D4D65F3352850F5B7BE8DCFE4AFE355 -CT=202326CEAD57A5C13592FFBFFD5BF508 -PT=B9AFAD0658E1A4A1EECAA25B2863AD53 - -I=263 -KEY=BC0D82D3B7909D54C4E2C8F56DC9F45459742F94CCCC4E06 -CT=B9AFAD0658E1A4A1EECAA25B2863AD53 -PT=DE7AC7F7381DD34F3148911F306F4161 - -I=264 -KEY=339FFE2E01AB1D621A980F0255D4271B683CBE8BFCA30F67 -CT=DE7AC7F7381DD34F3148911F306F4161 -PT=F197DE9FED1EA08F6C17E631BF5449FE - -I=265 -KEY=EC908F9A4F266644EB0FD19DB8CA8794042B58BA43F74699 -CT=F197DE9FED1EA08F6C17E631BF5449FE -PT=7E1416C06ED3F56782DB5CB536B9B56E - -I=266 -KEY=CFE36CCCC94F8A5B951BC75DD61972F386F0040F754EF3F7 -CT=7E1416C06ED3F56782DB5CB536B9B56E -PT=BE1FE1F7B4CFF55D15BBCB6D9313729D - -I=267 -KEY=90690906407FB8AC2B0426AA62D687AE934BCF62E65D816A -CT=BE1FE1F7B4CFF55D15BBCB6D9313729D -PT=50E6818C06583D3D1C99C4A127D118CF - -I=268 -KEY=5D2A712578EC47217BE2A726648EBA938FD20BC3C18C99A5 -CT=50E6818C06583D3D1C99C4A127D118CF -PT=E1BFD3ED18E9A6D7BF383D590DA23B59 - -I=269 -KEY=3CA141EE57D7E0FC9A5D74CB7C671C4430EA369ACC2EA2FC -CT=E1BFD3ED18E9A6D7BF383D590DA23B59 -PT=03961127347C141C01F5276CB9BB31F7 - -I=270 -KEY=65E9B8AE22DC52A599CB65EC481B0858311F11F67595930B -CT=03961127347C141C01F5276CB9BB31F7 -PT=E9A8336DC0B530A86988B2DE74EDFFA1 - -I=271 -KEY=870A30E0F3B836FA7063568188AE38F05897A32801786CAA -CT=E9A8336DC0B530A86988B2DE74EDFFA1 -PT=B5FA5E388CFFFE2BA33436CC39A73972 - -I=272 -KEY=4B81E55C765F570CC59908B90451C6DBFBA395E438DF55D8 -CT=B5FA5E388CFFFE2BA33436CC39A73972 -PT=CEF4896BBC86F1E02312479C40D96DAE - -I=273 -KEY=0FAB0DCFB6E3E7940B6D81D2B8D7373BD8B1D27878063876 -CT=CEF4896BBC86F1E02312479C40D96DAE -PT=F195F5321FCAA68B0B0CBA83978A8084 - -I=274 -KEY=F860076D3847A80BFAF874E0A71D91B0D3BD68FBEF8CB8F2 -CT=F195F5321FCAA68B0B0CBA83978A8084 -PT=861575205386223EBC6B48B22C35A2A6 - -I=275 -KEY=B2DB77DC3E18C3A77CED01C0F49BB38E6FD62049C3B91A54 -CT=861575205386223EBC6B48B22C35A2A6 -PT=DC074F3D41C62DA9D609A982DEB9E074 - -I=276 -KEY=E632B0C6EE68910EA0EA4EFDB55D9E27B9DF89CB1D00FA20 -CT=DC074F3D41C62DA9D609A982DEB9E074 -PT=6933F4F193B028A22B913453B0B4C9A2 - -I=277 -KEY=88AA3FEE5FDFA336C9D9BA0C26EDB685924EBD98ADB43382 -CT=6933F4F193B028A22B913453B0B4C9A2 -PT=56811E665DDFBEA07A7C2C762F0D5C73 - -I=278 -KEY=2A0A1FE31ADFC64F9F58A46A7B320825E83291EE82B96FF1 -CT=56811E665DDFBEA07A7C2C762F0D5C73 -PT=CFF92E47C8C973ADA7B57D9FE320B356 - -I=279 -KEY=7958F9D10B6DC91050A18A2DB3FB7B884F87EC716199DCA7 -CT=CFF92E47C8C973ADA7B57D9FE320B356 -PT=A55A4F827552761580DC27E0712051B1 - -I=280 -KEY=ADDB73FE13D439CAF5FBC5AFC6A90D9DCF5BCB9110B98D16 -CT=A55A4F827552761580DC27E0712051B1 -PT=734B095C3C54FCDE26C33659C82CACCB - -I=281 -KEY=E979AF9C739F60AE86B0CCF3FAFDF143E998FDC8D89521DD -CT=734B095C3C54FCDE26C33659C82CACCB -PT=122A4F2ADE6C69364943658517A56587 - -I=282 -KEY=E05BDC75E94EB2A8949A83D924919875A0DB984DCF30445A -CT=122A4F2ADE6C69364943658517A56587 -PT=C6EF3170C5EF69B479AC6653E8B7E979 - -I=283 -KEY=67AF0BE0DE572F595275B2A9E17EF1C1D977FE1E2787AD23 -CT=C6EF3170C5EF69B479AC6653E8B7E979 -PT=51113FF8A1000A5449F24E8E5363FB72 - -I=284 -KEY=7C8DCBB512AE775603648D51407EFB959085B09074E45651 -CT=51113FF8A1000A5449F24E8E5363FB72 -PT=B9341E24A41C9D9CE56D6E4F17A7A311 - -I=285 -KEY=EEBE49DAF88030F5BA509375E462660975E8DEDF6343F540 -CT=B9341E24A41C9D9CE56D6E4F17A7A311 -PT=26A135C466B061791DE40A40E9366FC6 - -I=286 -KEY=A06A0B9127769EF79CF1A6B182D20770680CD49F8A759A86 -CT=26A135C466B061791DE40A40E9366FC6 -PT=AE832B68C147CF8A70A8E5CCC3FF05F2 - -I=287 -KEY=CD394B7808099B2832728DD94395C8FA18A43153498A9F74 -CT=AE832B68C147CF8A70A8E5CCC3FF05F2 -PT=72747F478E3AE57C6C7D6D4E5C4FCE71 - -I=288 -KEY=80D4A1BD538D11434006F29ECDAF2D8674D95C1D15C55105 -CT=72747F478E3AE57C6C7D6D4E5C4FCE71 -PT=21539022400BEE401E8FE7E9F0F7AAC3 - -I=289 -KEY=C8BCB868E11B46E3615562BC8DA4C3C66A56BBF4E532FBC6 -CT=21539022400BEE401E8FE7E9F0F7AAC3 -PT=44149C7C375F07B7169C8A9A14133C8C - -I=290 -KEY=DFC35DD4FAD95C2A2541FEC0BAFBC4717CCA316EF121C74A -CT=44149C7C375F07B7169C8A9A14133C8C -PT=2A7FA9D2EACC0C5444510E7D69EB3FD6 - -I=291 -KEY=73B0B53EE6D591140F3E57125037C825389B3F1398CAF89C -CT=2A7FA9D2EACC0C5444510E7D69EB3FD6 -PT=9949145B8C88D03BBA46FEBE9856B732 - -I=292 -KEY=7BFBD6A0A317DEE996774349DCBF181E82DDC1AD009C4FAE -CT=9949145B8C88D03BBA46FEBE9856B732 -PT=714E072347ECDEA4F8EB2B02746FBC66 - -I=293 -KEY=CA326A1D191B2BC6E739446A9B53C6BA7A36EAAF74F3F3C8 -CT=714E072347ECDEA4F8EB2B02746FBC66 -PT=CCF2295814759A5004E8C3E2B97C4958 - -I=294 -KEY=428400F7196D32C62BCB6D328F265CEA7EDE294DCD8FBA90 -CT=CCF2295814759A5004E8C3E2B97C4958 -PT=12108AB0753EAAE007DEFF2EBA8A3EF0 - -I=295 -KEY=3E38F6FA3F49742339DBE782FA18F60A7900D66377058460 -CT=12108AB0753EAAE007DEFF2EBA8A3EF0 -PT=0109AC127FB55B91BC922EDFF3C43819 - -I=296 -KEY=07C585ABD1C227D638D24B9085ADAD9BC592F8BC84C1BC79 -CT=0109AC127FB55B91BC922EDFF3C43819 -PT=33FF03F6966E81EE28889CFA0B9BA8B9 - -I=297 -KEY=FB823872148252C20B2D486613C32C75ED1A64468F5A14C0 -CT=33FF03F6966E81EE28889CFA0B9BA8B9 -PT=D8468C180BAC0F6D703611DDAD951014 - -I=298 -KEY=F81900EAD21ECE3BD36BC47E186F23189D2C759B22CF04D4 -CT=D8468C180BAC0F6D703611DDAD951014 -PT=07994906A8377D64F2D32DB4BB170EF1 - -I=299 -KEY=2ADC8C0244307531D4F28D78B0585E7C6FFF582F99D80A25 -CT=07994906A8377D64F2D32DB4BB170EF1 -PT=48382015F82AA7EC8944C40275595CEF - -I=300 -KEY=2E917F5C5BAB80939CCAAD6D4872F990E6BB9C2DEC8156CA -CT=48382015F82AA7EC8944C40275595CEF -PT=D4EEE0A1A56118EB8F6AE16FE16F70ED - -I=301 -KEY=126D396B29E0252248244DCCED13E17B69D17D420DEE2627 -CT=D4EEE0A1A56118EB8F6AE16FE16F70ED -PT=358E5FAE4A4ED6B1058E32942AE030DB - -I=302 -KEY=D390A60684F5C9147DAA1262A75D37CA6C5F4FD6270E16FC -CT=358E5FAE4A4ED6B1058E32942AE030DB -PT=B9730D311EA8312DAC34F444A4560DDC - -I=303 -KEY=0B2A03E62FCD9B06C4D91F53B9F506E7C06BBB9283581B20 -CT=B9730D311EA8312DAC34F444A4560DDC -PT=D64F286B32B4058A51B73844BCA93DDA - -I=304 -KEY=5858183C5713BBD6129637388B41036D91DC83D63FF126FA -CT=D64F286B32B4058A51B73844BCA93DDA -PT=78425B7FE64D972C642ED17369ED8844 - -I=305 -KEY=C555D9DC23D3A1846AD46C476D0C9441F5F252A5561CAEBE -CT=78425B7FE64D972C642ED17369ED8844 -PT=2DE9202F4CD7F67C7B7F94CF7F3B9B5A - -I=306 -KEY=7BA871DA6E336CFA473D4C6821DB623D8E8DC66A292735E4 -CT=2DE9202F4CD7F67C7B7F94CF7F3B9B5A -PT=A30322EC9A51266B50153995BCEBC846 - -I=307 -KEY=55BF35687EBA169AE43E6E84BB8A4456DE98FFFF95CCFDA2 -CT=A30322EC9A51266B50153995BCEBC846 -PT=14754B0469683F36E4791FD9B8B1C585 - -I=308 -KEY=0404CAE90360F118F04B2580D2E27B603AE1E0262D7D3827 -CT=14754B0469683F36E4791FD9B8B1C585 -PT=E8592DC147A1DC4F48D43E365B9D63FF - -I=309 -KEY=109E16AA717A4EF4181208419543A72F7235DE1076E05BD8 -CT=E8592DC147A1DC4F48D43E365B9D63FF -PT=47A3BF0743562C7D412563C94C2CD717 - -I=310 -KEY=0A8DC7647F8C06D15FB1B746D6158B523310BDD93ACC8CCF -CT=47A3BF0743562C7D412563C94C2CD717 -PT=63F8C6A062937471364050815D856793 - -I=311 -KEY=CC9B8854C13F73623C4971E6B486FF230550ED586749EB5C -CT=63F8C6A062937471364050815D856793 -PT=E70443AF44BF549607251A86CD83A4D3 - -I=312 -KEY=2D067D896DF1E749DB4D3249F039ABB50275F7DEAACA4F8F -CT=E70443AF44BF549607251A86CD83A4D3 -PT=ACEF2AE95CA660AEE513BF48BCF7D125 - -I=313 -KEY=DEC45DD3C0DAD30A77A218A0AC9FCB1BE7664896163D9EAA -CT=ACEF2AE95CA660AEE513BF48BCF7D125 -PT=859E9E4001245A50ED76055539672F1A - -I=314 -KEY=6F208E93D9C89CE8F23C86E0ADBB914B0A104DC32F5AB1B0 -CT=859E9E4001245A50ED76055539672F1A -PT=42B059061FE4C86C7AC2B7C8B62820C2 - -I=315 -KEY=86EC7CE558994E8EB08CDFE6B25F592770D2FA0B99729172 -CT=42B059061FE4C86C7AC2B7C8B62820C2 -PT=01C6296F1532450F182D6A3FC8249DD7 - -I=316 -KEY=C74B31CEC9B31130B14AF689A76D1C2868FF903451560CA5 -CT=01C6296F1532450F182D6A3FC8249DD7 -PT=14334054946821E3FE8D72D1EF402EE1 - -I=317 -KEY=AC636B2AD3699560A579B6DD33053DCB9672E2E5BE162244 -CT=14334054946821E3FE8D72D1EF402EE1 -PT=F09B2FE9A8F17CD847532D4979D2A8C4 - -I=318 -KEY=6F956E3680FC783155E299349BF44113D121CFACC7C48A80 -CT=F09B2FE9A8F17CD847532D4979D2A8C4 -PT=4C97BD8822E63C7A2EE0E444563AF1C8 - -I=319 -KEY=C69B2FB718C41B1A197524BCB9127D69FFC12BE891FE7B48 -CT=4C97BD8822E63C7A2EE0E444563AF1C8 -PT=344E85BE2C8B36430C8058B310062171 - -I=320 -KEY=BFFA143B8A18CACF2D3BA10295994B2AF341735B81F85A39 -CT=344E85BE2C8B36430C8058B310062171 -PT=FF3F882CB22D13A8631DCA6DD702D0E0 - -I=321 -KEY=22F58A0FC077AB5FD204292E27B45882905CB93656FA8AD9 -CT=FF3F882CB22D13A8631DCA6DD702D0E0 -PT=866B2E52CF71505973D9D6642C8178BB - -I=322 -KEY=DC8CE7A9130F3662546F077CE8C508DBE3856F527A7BF262 -CT=866B2E52CF71505973D9D6642C8178BB -PT=4802741ADF67A3811A8AEC7008D8827E - -I=323 -KEY=743B09AA8FD3C6A01C6D736637A2AB5AF90F832272A3701C -CT=4802741ADF67A3811A8AEC7008D8827E -PT=FD3701579815D02BE878C74ABB98C59B - -I=324 -KEY=865B3EC9EFBE27D0E15A7231AFB77B7111774468C93BB587 -CT=FD3701579815D02BE878C74ABB98C59B -PT=99BCA8250D54F3A9A72054AF5578F842 - -I=325 -KEY=041C037E08923FFF78E6DA14A2E388D8B65710C79C434DC5 -CT=99BCA8250D54F3A9A72054AF5578F842 -PT=F0DA5C0E446547356D5027BA346A831C - -I=326 -KEY=FBABCE025CF5FF3D883C861AE686CFEDDB07377DA829CED9 -CT=F0DA5C0E446547356D5027BA346A831C -PT=EED0140AF408652DD879E3289536C389 - -I=327 -KEY=3F12399A3E5C0F9566EC9210128EAAC0037ED4553D1F0D50 -CT=EED0140AF408652DD879E3289536C389 -PT=FDC7299A95BDB941A299478B7B409EF8 - -I=328 -KEY=D541517B701036E39B2BBB8A87331381A1E793DE465F93A8 -CT=FDC7299A95BDB941A299478B7B409EF8 -PT=5BE5AEC30578CD03BA7B17E8B16AAFBF - -I=329 -KEY=6657840FF425DD8AC0CE1549824BDE821B9C8436F7353C17 -CT=5BE5AEC30578CD03BA7B17E8B16AAFBF -PT=3C7A9745F48DA61CF7875A449E24C735 - -I=330 -KEY=52D29BBD64550DFBFCB4820C76C6789EEC1BDE726911FB22 -CT=3C7A9745F48DA61CF7875A449E24C735 -PT=69516DE0343F3552830D28CE8B9A282C - -I=331 -KEY=3699B16BB0349B9195E5EFEC42F94DCC6F16F6BCE28BD30E -CT=69516DE0343F3552830D28CE8B9A282C -PT=EB09EE300286690EA65A30526A43B86B - -I=332 -KEY=60E79B9E7C41814E7EEC01DC407F24C2C94CC6EE88C86B65 -CT=EB09EE300286690EA65A30526A43B86B -PT=A235384FE517A5F455BBE6B850C05E33 - -I=333 -KEY=11F650282BBCB584DCD93993A56881369CF72056D8083556 -CT=A235384FE517A5F455BBE6B850C05E33 -PT=41E297350390E91EC00FF875B3CA60BA - -I=334 -KEY=11B449F7EE983AB89D3BAEA6A6F868285CF8D8236BC255EC -CT=41E297350390E91EC00FF875B3CA60BA -PT=5FB9F6408D54401A9A76288AE3A04944 - -I=335 -KEY=54CBA9A5782ED91FC28258E62BAC2832C68EF0A988621CA8 -CT=5FB9F6408D54401A9A76288AE3A04944 -PT=7C9CD2510E96FF37BF75E57E84098535 - -I=336 -KEY=871169F28E704C95BE1E8AB7253AD70579FB15D70C6B999D -CT=7C9CD2510E96FF37BF75E57E84098535 -PT=8E041B8C74A84D747B02714452B34F11 - -I=337 -KEY=7F44ED6AA755957A301A913B51929A7102F964935ED8D68C -CT=8E041B8C74A84D747B02714452B34F11 -PT=3698639F56657A40D52B9B8015448C2A - -I=338 -KEY=EEAF09001996BA6E0682F2A407F7E031D7D2FF134B9C5AA6 -CT=3698639F56657A40D52B9B8015448C2A -PT=79FB5E4A065D29E1CA3E15897B60032F - -I=339 -KEY=D21CCA06254A64C97F79ACEE01AAC9D01DECEA9A30FC5989 -CT=79FB5E4A065D29E1CA3E15897B60032F -PT=C582F5F8D9D2E9323C769B2B1AE369BD - -I=340 -KEY=29D2F84E4568BA6FBAFB5916D87820E2219A71B12A1F3034 -CT=C582F5F8D9D2E9323C769B2B1AE369BD -PT=916405DC8F2AD50548997D87BCCADBFB - -I=341 -KEY=43AC4D54A8A0222F2B9F5CCA5752F5E769030C3696D5EBCF -CT=916405DC8F2AD50548997D87BCCADBFB -PT=0E9FF0E147A47056EC6B09837C9E0E62 - -I=342 -KEY=9AF110B8274794772500AC2B10F685B1856805B5EA4BE5AD -CT=0E9FF0E147A47056EC6B09837C9E0E62 -PT=3B6E3CAAC358427980E66E3D30D39E4F - -I=343 -KEY=49F910E7957BC95C1E6E9081D3AEC7C8058E6B88DA987BE2 -CT=3B6E3CAAC358427980E66E3D30D39E4F -PT=25CBE5AB4C6785C0F2847CF89F2635AB - -I=344 -KEY=64D90092DD97AC3C3BA5752A9FC94208F70A177045BE4E49 -CT=25CBE5AB4C6785C0F2847CF89F2635AB -PT=3D9200D39461D8B2CE7874DA20BFD9DA - -I=345 -KEY=C7A8403AFB011673063775F90BA89ABA397263AA65019793 -CT=3D9200D39461D8B2CE7874DA20BFD9DA -PT=E61E7E06A1E1F656AE8F8C29C96E5A16 - -I=346 -KEY=071AF635AF7A9602E0290BFFAA496CEC97FDEF83AC6FCD85 -CT=E61E7E06A1E1F656AE8F8C29C96E5A16 -PT=7488BB35F06E94F31A744D1EA95E71D0 - -I=347 -KEY=A4B5ECB7047E08D694A1B0CA5A27F81F8D89A29D0531BC55 -CT=7488BB35F06E94F31A744D1EA95E71D0 -PT=3912DC00C0AB79C473CA2CC8F69262F0 - -I=348 -KEY=BD4478B38A0E9347ADB36CCA9A8C81DBFE438E55F3A3DEA5 -CT=3912DC00C0AB79C473CA2CC8F69262F0 -PT=C4B546F134A016DADA8E7C478B1E7D45 - -I=349 -KEY=F7B6F476517483AD69062A3BAE2C970124CDF21278BDA3E0 -CT=C4B546F134A016DADA8E7C478B1E7D45 -PT=298524C5D468EBFA97DEFEC7B80EE752 - -I=350 -KEY=8E0C5244F7417C2440830EFE7A447CFBB3130CD5C0B344B2 -CT=298524C5D468EBFA97DEFEC7B80EE752 -PT=B27EFB90BA3A27A1077C6742D5B68396 - -I=351 -KEY=C6E8F264FA0C9A9AF2FDF56EC07E5B5AB46F6B971505C724 -CT=B27EFB90BA3A27A1077C6742D5B68396 -PT=D02C27A94DD3B772B338C7462379B009 - -I=352 -KEY=AD694D243DCC6B7B22D1D2C78DADEC280757ACD1367C772D -CT=D02C27A94DD3B772B338C7462379B009 -PT=1CED06084E67BA4BAD3C331F4074B9FF - -I=353 -KEY=68AEF48D86D395583E3CD4CFC3CA5663AA6B9FCE7608CED2 -CT=1CED06084E67BA4BAD3C331F4074B9FF -PT=C0D7811FE8630B3E7C3A60DA9042A6B2 - -I=354 -KEY=670A8D40573F598AFEEB55D02BA95D5DD651FF14E64A6860 -CT=C0D7811FE8630B3E7C3A60DA9042A6B2 -PT=45F92C84CE2AEC6E7953C8AAC5901D0F - -I=355 -KEY=D44FD97B0D59C923BB127954E583B133AF0237BE23DA756F -CT=45F92C84CE2AEC6E7953C8AAC5901D0F -PT=23A4863C994EFE93E7CE1C89FE14143D - -I=356 -KEY=4E08C6A539C74A6598B6FF687CCD4FA048CC2B37DDCE6152 -CT=23A4863C994EFE93E7CE1C89FE14143D -PT=85EB5F46988211E3077FDBE38F1EBE6B - -I=357 -KEY=21B17D5E461224B31D5DA02EE44F5E434FB3F0D452D0DF39 -CT=85EB5F46988211E3077FDBE38F1EBE6B -PT=59CF6CCC81A8BC17A52D7550B40C7514 - -I=358 -KEY=6CC595309F161F3E4492CCE265E7E254EA9E8584E6DCAA2D -CT=59CF6CCC81A8BC17A52D7550B40C7514 -PT=13DF4C2AA74A4B9123B3A57FE94F85BE - -I=359 -KEY=77B90151B41B1B7D574D80C8C2ADA9C5C92D20FB0F932F93 -CT=13DF4C2AA74A4B9123B3A57FE94F85BE -PT=6DEDE53AD5DC2A87744DA0EA561977A3 - -I=360 -KEY=8E1683C57C1817C23AA065F217718342BD608011598A5830 -CT=6DEDE53AD5DC2A87744DA0EA561977A3 -PT=F9D912AAB5ED1ACBD0475411DF98F49C - -I=361 -KEY=E9FDD94AE4B4FABAC3797758A29C99896D27D4008612ACAC -CT=F9D912AAB5ED1ACBD0475411DF98F49C -PT=853C907D9FD35B61D2ABBE5C1A89DB4B - -I=362 -KEY=BCC524DF4D452AE14645E7253D4FC2E8BF8C6A5C9C9B77E7 -CT=853C907D9FD35B61D2ABBE5C1A89DB4B -PT=874C4BC1993FBA12136443B57F9523BE - -I=363 -KEY=9F5EFA7196589240C109ACE4A47078FAACE829E9E30E5459 -CT=874C4BC1993FBA12136443B57F9523BE -PT=E6B6E9133DD0EC2844EF3CC0C2F9E4AC - -I=364 -KEY=2F0731DB4FA3024127BF45F799A094D2E807152921F7B0F5 -CT=E6B6E9133DD0EC2844EF3CC0C2F9E4AC -PT=20B41EE01134041DF8D11BB7F86928EA - -I=365 -KEY=7E44D240F06AAA5E070B5B17889490CF10D60E9ED99E981F -CT=20B41EE01134041DF8D11BB7F86928EA -PT=BF6B03096DCDC052B1325CC34BF6E56C - -I=366 -KEY=D8D3E3D538C8CA34B860581EE559509DA1E4525D92687D73 -CT=BF6B03096DCDC052B1325CC34BF6E56C -PT=5ED3E40FB5C34DD1F370C3AD72C7C24D - -I=367 -KEY=F3DF20767CDA5E0CE6B3BC11509A1D4C529491F0E0AFBF3E -CT=5ED3E40FB5C34DD1F370C3AD72C7C24D -PT=3EA6BCE2317C5D696DF8240C481B34DD - -I=368 -KEY=484932A15D75173FD81500F361E640253F6CB5FCA8B48BE3 -CT=3EA6BCE2317C5D696DF8240C481B34DD -PT=41D6E077746FE1A9307E1107631A5D2C - -I=369 -KEY=EF960956685DE1CE99C3E0841589A18C0F12A4FBCBAED6CF -CT=41D6E077746FE1A9307E1107631A5D2C -PT=D0C6DDEF0A623686BA303C278D445964 - -I=370 -KEY=82477D8D682C1D4849053D6B1FEB970AB52298DC46EA8FAB -CT=D0C6DDEF0A623686BA303C278D445964 -PT=EEFFA6025D6CAFBF9DC18E5B1B99A6ED - -I=371 -KEY=15D8DCF80A26856AA7FA9B69428738B528E316875D732946 -CT=EEFFA6025D6CAFBF9DC18E5B1B99A6ED -PT=38E222ABAA07CDAE9CC02FAC84EC0FC1 - -I=372 -KEY=556151278277D7579F18B9C2E880F51BB423392BD99F2687 -CT=38E222ABAA07CDAE9CC02FAC84EC0FC1 -PT=B00C719E6A320E4385794EB7F23C0D80 - -I=373 -KEY=777F91003E4410572F14C85C82B2FB58315A779C2BA32B07 -CT=B00C719E6A320E4385794EB7F23C0D80 -PT=0E667CA932023D2EFD8DDBDED5A43D78 - -I=374 -KEY=130507FC817F14432172B4F5B0B0C676CCD7AC42FE07167F -CT=0E667CA932023D2EFD8DDBDED5A43D78 -PT=6B15DA892F0B5916F31BB74FC7D03F9A - -I=375 -KEY=D045A84BBF62DE2E4A676E7C9FBB9F603FCC1B0D39D729E5 -CT=6B15DA892F0B5916F31BB74FC7D03F9A -PT=EBEF6DC298D63BF6E6E46F833B217033 - -I=376 -KEY=7742FB68CDF60735A18803BE076DA496D928748E02F659D6 -CT=EBEF6DC298D63BF6E6E46F833B217033 -PT=48DC6F65F193AFCCE559EA6F04FBD79A - -I=377 -KEY=5CE32BC22C77B664E9546CDBF6FE0B5A3C719EE1060D8E4C -CT=48DC6F65F193AFCCE559EA6F04FBD79A -PT=D0596880F92716C51E41519C640AEFDA - -I=378 -KEY=2DA6B73C5131E24C390D045B0FD91D9F2230CF7D62076196 -CT=D0596880F92716C51E41519C640AEFDA -PT=ABB7C3E499086F53C4DB97640168943B - -I=379 -KEY=E41C1A826978491892BAC7BF96D172CCE6EB5819636FF5AD -CT=ABB7C3E499086F53C4DB97640168943B -PT=0CC58B3D0370317E1025E1AF97962646 - -I=380 -KEY=501012EE411DCDC59E7F4C8295A143B2F6CEB9B6F4F9D3EB -CT=0CC58B3D0370317E1025E1AF97962646 -PT=28920AED2B644C4346FC146903887244 - -I=381 -KEY=97B7E8C1147A5062B6ED466FBEC50FF1B032ADDFF771A1AF -CT=28920AED2B644C4346FC146903887244 -PT=E7A28DA5EC871DAF8C2D196C7ED8977F - -I=382 -KEY=988B9928402BCD63514FCBCA5242125E3C1FB4B389A936D0 -CT=E7A28DA5EC871DAF8C2D196C7ED8977F -PT=013876A92413AED2E360A241FE021B25 - -I=383 -KEY=3432357430ACC9135077BD637651BC8CDF7F16F277AB2DF5 -CT=013876A92413AED2E360A241FE021B25 -PT=10F1A56A8CFDA1D5044D5D0E53F6A773 - -I=384 -KEY=CE94F859CD3E85F440861809FAAC1D59DB324BFC245D8A86 -CT=10F1A56A8CFDA1D5044D5D0E53F6A773 -PT=941C717EE6642DD474719F099AEEB1EB - -I=385 -KEY=A1BFA52EA232FDF0D49A69771CC8308DAF43D4F5BEB33B6D -CT=941C717EE6642DD474719F099AEEB1EB -PT=F31B47230ABC94977E14E1080528C1C9 - -I=386 -KEY=37B36A8E7A3B4F2A27812E541674A41AD15735FDBB9BFAA4 -CT=F31B47230ABC94977E14E1080528C1C9 -PT=A91264221890CA93541B662F64A11C62 - -I=387 -KEY=04F603F98A9D1AC78E934A760EE46E89854C53D2DF3AE6C6 -CT=A91264221890CA93541B662F64A11C62 -PT=05F5171B639825EC67A37B3671F2F884 - -I=388 -KEY=A294EBBBD53D18DD8B665D6D6D7C4B65E2EF28E4AEC81E42 -CT=05F5171B639825EC67A37B3671F2F884 -PT=B6FE84EB2987DE956953DEBA6FD2E029 - -I=389 -KEY=E0E38A82F60E8EED3D98D98644FB95F08BBCF65EC11AFE6B -CT=B6FE84EB2987DE956953DEBA6FD2E029 -PT=2741338CF00FBC70C4B1C67C97E85B97 - -I=390 -KEY=2193D386143F6D761AD9EA0AB4F429804F0D302256F2A5FC -CT=2741338CF00FBC70C4B1C67C97E85B97 -PT=E56C7C453E2E13028AD812F9CDB78E2F - -I=391 -KEY=05AD3BC4F1B29F17FFB5964F8ADA3A82C5D522DB9B452BD3 -CT=E56C7C453E2E13028AD812F9CDB78E2F -PT=9A9B49AC0691F1576D515E935F042229 - -I=392 -KEY=1588C005075F4674652EDFE38C4BCBD5A8847C48C44109FA -CT=9A9B49AC0691F1576D515E935F042229 -PT=143E5F64AD38373D3B54FA24CC7C0AF5 - -I=393 -KEY=731083CCCB22E7CF711080872173FCE893D0866C083D030F -CT=143E5F64AD38373D3B54FA24CC7C0AF5 -PT=61F6AF426601588CB7C525255EC1A06D - -I=394 -KEY=DACEE3906B98DFC110E62FC54772A4642415A34956FCA362 -CT=61F6AF426601588CB7C525255EC1A06D -PT=DB5DC1C3B3413F653D72F8744C2DD881 - -I=395 -KEY=D9ACA0F56DCA4FC0CBBBEE06F4339B0119675B3D1AD17BE3 -CT=DB5DC1C3B3413F653D72F8744C2DD881 -PT=4E9D548DA49E992AD3123F53558909C9 - -I=396 -KEY=12C2FE0C57D21C208526BA8B50AD022BCA75646E4F58722A -CT=4E9D548DA49E992AD3123F53558909C9 -PT=EB2E835192E64ABC30C3F2662B703C47 - -I=397 -KEY=7A43322D6174BA786E0839DAC24B4897FAB6960864284E6D -CT=EB2E835192E64ABC30C3F2662B703C47 -PT=CD0690863F63F2B263D4C11190A7985B - -I=398 -KEY=EBC6D71978D39185A30EA95CFD28BA2599625719F48FD636 -CT=CD0690863F63F2B263D4C11190A7985B -PT=C044E800B65CA78559D0642C370C7D3E - -I=399 -KEY=A1B6CE2EEC5FC386634A415C4B741DA0C0B23335C383AB08 -CT=C044E800B65CA78559D0642C370C7D3E -PT=F1A81B68F6E5A6271A8CB24E7D9491EF - -========================= - -KEYSIZE=256 - -I=0 -KEY=0000000000000000000000000000000000000000000000000000000000000000 -CT=00000000000000000000000000000000 -PT=058CCFFDBBCB382D1F6F56585D8A4ADE - -I=1 -KEY=85C6B2BB2300148F945AEBF1F021CF79058CCFFDBBCB382D1F6F56585D8A4ADE -CT=058CCFFDBBCB382D1F6F56585D8A4ADE -PT=15173A0EB65F5CC05E704EFE61D9E346 - -I=2 -KEY=2447EC44111548FBB670B98F182D5DEE109BF5F30D9464ED411F18A63C53A998 -CT=15173A0EB65F5CC05E704EFE61D9E346 -PT=85F083ACC676D91EDD1ABFB43935237A - -I=3 -KEY=85D3E1D750CAA89BEE274AA7C32C2207956B765FCBE2BDF39C05A71205668AE2 -CT=85F083ACC676D91EDD1ABFB43935237A -PT=42C8F0ABC58E0BEAC32911D2DD9FA8C8 - -I=4 -KEY=CE86B24954745B2BAAF27010202EE7FAD7A386F40E6CB6195F2CB6C0D8F9222A -CT=42C8F0ABC58E0BEAC32911D2DD9FA8C8 -PT=5E44123D2CA07981B073BB2749F557D6 - -I=5 -KEY=CD7BCBBA4555A0D034FD7B528A1D042C89E794C922CCCF98EF5F0DE7910C75FC -CT=5E44123D2CA07981B073BB2749F557D6 -PT=8B649458EA90F4F7E13467E509B7F164 - -I=6 -KEY=EF28DFAED7794B1C7B892F3C98FCDC9602830091C85C3B6F0E6B6A0298BB8498 -CT=8B649458EA90F4F7E13467E509B7F164 -PT=F240D1F579DA2CA8839F7072DF52EBA3 - -I=7 -KEY=C66605EC92F96B49F08CBC6276A0DC68F0C3D164B18617C78DF41A7047E96F3B -CT=F240D1F579DA2CA8839F7072DF52EBA3 -PT=B05297490A394B4A1736DE7F8DC12969 - -I=8 -KEY=347403B6E6344E1525B8D2BD4DCA343F4091462DBBBF5C8D9AC2C40FCA284652 -CT=B05297490A394B4A1736DE7F8DC12969 -PT=8BA49D44B98E67501235CE1C2F26BB28 - -I=9 -KEY=B932CD0C70488602C56F92A0DA57BE27CB35DB6902313BDD88F70A13E50EFD7A -CT=8BA49D44B98E67501235CE1C2F26BB28 -PT=86CE4E4D040C49F2717407157454162E - -I=10 -KEY=28F8B6B4AB2B0B81F3676F6E422D438C4DFB9524063D722FF9830D06915AEB54 -CT=86CE4E4D040C49F2717407157454162E -PT=4E9CA7FB0FF9F38FC821CA91052483F9 - -I=11 -KEY=5CD19F4D3C5B58602B101E15B39F51E4036732DF09C481A031A2C797947E68AD -CT=4E9CA7FB0FF9F38FC821CA91052483F9 -PT=55E49ED59245C1850CB0C17C1CEEA05E - -I=12 -KEY=E822BB0D1F25F3DCA6FE0CB1A8AF39F15683AC0A9B8140253D1206EB8890C8F3 -CT=55E49ED59245C1850CB0C17C1CEEA05E -PT=F7F0BFA319AC289C9F64E6FCDD531B44 - -I=13 -KEY=8B64FF354C6E303F14EA34C9F667FEC9A17313A9822D68B9A276E01755C3D3B7 -CT=F7F0BFA319AC289C9F64E6FCDD531B44 -PT=6ACB8A177226AE47E2170F77D2FE4923 - -I=14 -KEY=1A9D440EBAC3F3625E229B66C5D9249CCBB899BEF00BC6FE4061EF60873D9A94 -CT=6ACB8A177226AE47E2170F77D2FE4923 -PT=BAA9BB819332A87D6004164927EAC699 - -I=15 -KEY=97F92B9AD44A3182FF10E07747C560B37111223F63396E832065F929A0D75C0D -CT=BAA9BB819332A87D6004164927EAC699 -PT=EB84793E2D68632900B0517392EC4B94 - -I=16 -KEY=2AEEBA2AC59870A7B4274B80FE74D55A9A955B014E510DAA20D5A85A323B1799 -CT=EB84793E2D68632900B0517392EC4B94 -PT=6C662FBE2B22394CC1D45453772C72BA - -I=17 -KEY=EEA4B3C4F96C42E3B7DF5A3870C85B69F6F374BF657334E6E101FC0945176523 -CT=6C662FBE2B22394CC1D45453772C72BA -PT=70D2BBC1FA7D49848D94112DA93A3C3C - -I=18 -KEY=F930D1529C654F31549809C6CD5CC4608621CF7E9F0E7D626C95ED24EC2D591F -CT=70D2BBC1FA7D49848D94112DA93A3C3C -PT=1AFF91E67039133946638E4E505310C2 - -I=19 -KEY=5D0F461C1A5FF7BA5C93F0CED9DD49FF9CDE5E98EF376E5B2AF6636ABC7E49DD -CT=1AFF91E67039133946638E4E505310C2 -PT=8E4358B22DE7BCDC8B8409E6250633BF - -I=20 -KEY=AA4B475845EB19F601856A40AB517594129D062AC2D0D287A1726A8C99787A62 -CT=8E4358B22DE7BCDC8B8409E6250633BF -PT=2A79FE5A222C9503954346D6C15AC679 - -I=21 -KEY=9703F4DD85A3BE85343FFD15950A266B38E4F870E0FC478434312C5A5822BC1B -CT=2A79FE5A222C9503954346D6C15AC679 -PT=0FF812C5B863282C294D7069F830EE86 - -I=22 -KEY=3DD1B2ACBC6568851E767D20D82AD324371CEAB5589F6FA81D7C5C33A012529D -CT=0FF812C5B863282C294D7069F830EE86 -PT=D449218625DE49D2B9514E032CA096E7 - -I=23 -KEY=95CC16235D3DFF4F7DB2116D2B380F39E355CB337D41267AA42D12308CB2C47A -CT=D449218625DE49D2B9514E032CA096E7 -PT=F951EAC3BC78DB0AE13FDC33048D2D81 - -I=24 -KEY=A6F55AFBDA7EA939F6F2A28530C416781A0421F0C139FD704512CE03883FE9FB -CT=F951EAC3BC78DB0AE13FDC33048D2D81 -PT=7D5A03A955F6403F918AC915AC22B797 - -I=25 -KEY=7C5D39885F4C0F4FCF672321B711C5B7675E225994CFBD4FD4980716241D5E6C -CT=7D5A03A955F6403F918AC915AC22B797 -PT=CA2E1C274073AD2A3AE35C60ECA52A58 - -I=26 -KEY=4E7B914B84BFA1A2D7BD409AFADD2EDCAD703E7ED4BC1065EE7B5B76C8B87434 -CT=CA2E1C274073AD2A3AE35C60ECA52A58 -PT=C5048FA0148CED10A06E107269DA9C95 - -I=27 -KEY=F62D8C4822C5F89D51E3C68695D91CA66874B1DEC030FD754E154B04A162E8A1 -CT=C5048FA0148CED10A06E107269DA9C95 -PT=CB9B457A7A24577DA71AC335F0572DAB - -I=28 -KEY=C37AAD7CB20087F4B98390C59D3ECFB2A3EFF4A4BA14AA08E90F88315135C50A -CT=CB9B457A7A24577DA71AC335F0572DAB -PT=FA60BFF170DD30C29DF1807C1612CD67 - -I=29 -KEY=1A2C6858B37D0341BF8796FB72D00B72598F4B55CAC99ACA74FE084D4727086D -CT=FA60BFF170DD30C29DF1807C1612CD67 -PT=E2FACFB5DF4E69C911838FCC546D0C8E - -I=30 -KEY=039B73E3A8DCF3C678FBC246AAECDAECBB7584E01587F303657D8781134A04E3 -CT=E2FACFB5DF4E69C911838FCC546D0C8E -PT=749AB2B9176AFDB8B6714DF44BBF2B58 - -I=31 -KEY=773D90EA7ECA29DFD9141A42EB2BBC64CFEF365902ED0EBBD30CCA7558F52FBB -CT=749AB2B9176AFDB8B6714DF44BBF2B58 -PT=0285E58D09A8D33FB196FD16A8DF37C0 - -I=32 -KEY=598262B046B44784D977F6BE2553C6ACCD6AD3D40B45DD84629A3763F02A187B -CT=0285E58D09A8D33FB196FD16A8DF37C0 -PT=1C952C46AE829D8805031A44F9D85521 - -I=33 -KEY=AFAE657D3220CD1E6199A49754525F4AD1FFFF92A5C7400C67992D2709F24D5A -CT=1C952C46AE829D8805031A44F9D85521 -PT=EED0A47E63FF354B4D9C53F7FD75D720 - -I=34 -KEY=A61F583BCFD120B8CABE1E4C616F4FC73F2F5BECC63875472A057ED0F4879A7A -CT=EED0A47E63FF354B4D9C53F7FD75D720 -PT=10C1F0F7C32AD36F03AEA8DCE6AAE7BC - -I=35 -KEY=FB76D4B83A7F50482A92F5A92CB60F522FEEAB1B0512A62829ABD60C122D7DC6 -CT=10C1F0F7C32AD36F03AEA8DCE6AAE7BC -PT=372488DF6543180F1F2AE15E5B0C8785 - -I=36 -KEY=35EAC2BA73F55570CB727220C027FE6218CA23C46051BE27368137524921FA43 -CT=372488DF6543180F1F2AE15E5B0C8785 -PT=3DE420FF3699D68DB69966F57D09045A - -I=37 -KEY=48B6E08B9FD9B5C130E1829CD4540D9C252E033B56C868AA801851A73428FE19 -CT=3DE420FF3699D68DB69966F57D09045A -PT=7858F396DC520131C789CB8F8C919CCD - -I=38 -KEY=DB39C13F29241FF29C5BEB839705AD5B5D76F0AD8A9A699B47919A28B8B962D4 -CT=7858F396DC520131C789CB8F8C919CCD -PT=07BE8BBF9FCD7D04888E61935DD7222F - -I=39 -KEY=A5F9B675531AB58C1FFC316C9359EA335AC87B121557149FCF1FFBBBE56E40FB -CT=07BE8BBF9FCD7D04888E61935DD7222F -PT=EDD619B7C12E2AF6BDAA953B2E7871EF - -I=40 -KEY=A02D1F14A64BBC67DD7EE9EAB3FB0EADB71E62A5D4793E6972B56E80CB163114 -CT=EDD619B7C12E2AF6BDAA953B2E7871EF -PT=C748CDB645F1A1E44A63FAF00B2C3A45 - -I=41 -KEY=177D7A6843B5ABBEB212E68734A7A05C7056AF1391889F8D38D69470C03A0B51 -CT=C748CDB645F1A1E44A63FAF00B2C3A45 -PT=BD3ED4C8CD7DBF4299AC63FE119D291E - -I=42 -KEY=BD9BDC6BD09DEED3E75C918BE55E5332CD687BDB5CF520CFA17AF78ED1A7224F -CT=BD3ED4C8CD7DBF4299AC63FE119D291E -PT=A16B82F958441E90A965427C854EECBB - -I=43 -KEY=E6325C33EC76F8EDE02707A3AE82F1096C03F92204B13E5F081FB5F254E9CEF4 -CT=A16B82F958441E90A965427C854EECBB -PT=E04E642689D1AB78E7CDE26D0563901C - -I=44 -KEY=B8543DB3071AB9F0802D4106FBDA59648C4D9D048D609527EFD2579F518A5EE8 -CT=E04E642689D1AB78E7CDE26D0563901C -PT=08E59C72C13C030DA3C50300861EA097 - -I=45 -KEY=ECDD43A6B225DB325BFFE5462B66E97884A801764C5C962A4C17549FD794FE7F -CT=08E59C72C13C030DA3C50300861EA097 -PT=C224B2EFEE07AAC33F1F6EB1295D9A50 - -I=46 -KEY=741D627C8B47BED4497C71FDC9854912468CB399A25B3CE973083A2EFEC9642F -CT=C224B2EFEE07AAC33F1F6EB1295D9A50 -PT=1653CE734D27B44369D4FE582E7A885F - -I=47 -KEY=A47BDC62B1D80815AC6BF04481C5601F50DF7DEAEF7C88AA1ADCC476D0B3EC70 -CT=1653CE734D27B44369D4FE582E7A885F -PT=CADC89828B6147FAEC581DDCFF3C0960 - -I=48 -KEY=CB91E738F51C111DAC2E0A3BF7B076A39A03F468641DCF50F684D9AA2F8FE510 -CT=CADC89828B6147FAEC581DDCFF3C0960 -PT=49402F0F4AFA2518D57C5D1CFCECC0F2 - -I=49 -KEY=BDA1FFAEE7B93EDFCA4374871A149550D343DB672EE7EA4823F884B6D36325E2 -CT=49402F0F4AFA2518D57C5D1CFCECC0F2 -PT=EBFF53AB449DE5A53EDC6E595AA47B10 - -I=50 -KEY=18D865B8E8C779268D3876C22AF479FB38BC88CC6A7A0FED1D24EAEF89C75EF2 -CT=EBFF53AB449DE5A53EDC6E595AA47B10 -PT=30073458509F9AC9DA21B2DF566AB3BE - -I=51 -KEY=967E2580238300563A34A6E70D84B4FF08BBBC943AE59524C7055830DFADED4C -CT=30073458509F9AC9DA21B2DF566AB3BE -PT=5AB9F90CC2A7603A68E2ACA95A2DE55D - -I=52 -KEY=A469A4E2F0B3847F3B52886FAD7DBAF652024598F842F51EAFE7F49985800811 -CT=5AB9F90CC2A7603A68E2ACA95A2DE55D -PT=F22A13F395B6064172CA9DC572C26B2E - -I=53 -KEY=9EA4946ED73FF8BB8700C18967C01968A028566B6DF4F35FDD2D695CF742633F -CT=F22A13F395B6064172CA9DC572C26B2E -PT=26E44B9F3DEBA8EE3531DDFA42F1DC14 - -I=54 -KEY=3D25EEEACEF18702FD3896283CFF8A8386CC1DF4501F5BB1E81CB4A6B5B3BF2B -CT=26E44B9F3DEBA8EE3531DDFA42F1DC14 -PT=32D9F05174FFF34594E952B7ADE09737 - -I=55 -KEY=8BF2A692F6A35980C0CF02FF4650871BB415EDA524E0A8F47CF5E6111853281C -CT=32D9F05174FFF34594E952B7ADE09737 -PT=7BEF027DEB1FF22774CE8A8A101DD41B - -I=56 -KEY=C90BF0E1A8B615B4C8BD318260BB80AECFFAEFD8CFFF5AD3083B6C9B084EFC07 -CT=7BEF027DEB1FF22774CE8A8A101DD41B -PT=CF6B2444DFBBFE5B6A1CA99F2D13DE9A - -I=57 -KEY=C2A4C82B4AAEE0A22315026C6FE396900091CB9C1044A4886227C504255D229D -CT=CF6B2444DFBBFE5B6A1CA99F2D13DE9A -PT=14AD8C7B0F0460A3F48D5CD2CFFB385C - -I=58 -KEY=BF76E610192E2AEF42FF8F487CDDC318143C47E71F40C42B96AA99D6EAA61AC1 -CT=14AD8C7B0F0460A3F48D5CD2CFFB385C -PT=A5A850FC44A09C5985CE9661AF84F186 - -I=59 -KEY=1E42AEC368C600F18CBFA305EB559946B194171B5BE0587213640FB74522EB47 -CT=A5A850FC44A09C5985CE9661AF84F186 -PT=E2895D416951FDA66B695ABFA313F89D - -I=60 -KEY=4E9BC121E32849DAA501BEA4E534D9C2531D4A5A32B1A5D4780D5508E63113DA -CT=E2895D416951FDA66B695ABFA313F89D -PT=91E93AAECC5FB253F7463F101B2A4132 - -I=61 -KEY=ACC045A67F680F14D3F8DA454C922071C2F470F4FEEE17878F4B6A18FD1B52E8 -CT=91E93AAECC5FB253F7463F101B2A4132 -PT=F0F339022B4001E72F3BCC1A140603AD - -I=62 -KEY=4B47D2639B4A04D3C87D35DB4E63E563320749F6D5AE1660A070A602E91D5145 -CT=F0F339022B4001E72F3BCC1A140603AD -PT=DBECAFF90EDD4555A5D9A23817520D51 - -I=63 -KEY=C73B1C617BE90F2710DFF2C3AC60E0F9E9EBE60FDB73533505A9043AFE4F5C14 -CT=DBECAFF90EDD4555A5D9A23817520D51 -PT=73315A63A8889095AFED497AEFE657B4 - -I=64 -KEY=7F368758F7B303DE356481ED8EBFA46F9ADABC6C73FBC3A0AA444D4011A90BA0 -CT=73315A63A8889095AFED497AEFE657B4 -PT=3AB7E2F81D24D857308A1FC785559333 - -I=65 -KEY=6D7EF76412498AB3C70AA3006CC87188A06D5E946EDF1BF79ACE528794FC9893 -CT=3AB7E2F81D24D857308A1FC785559333 -PT=7EAA2814E372F674AB0B6E0E428D1AF4 - -I=66 -KEY=D626AD50A7B86153BF9215A6A8F7E908DEC776808DADED8331C53C89D6718267 -CT=7EAA2814E372F674AB0B6E0E428D1AF4 -PT=ADD212A59AC9EF6A55AEAC22D35A1BFE - -I=67 -KEY=4B9C7ED9AC7835C87DAB8BEF3ED6878B73156425176402E9646B90AB052B9999 -CT=ADD212A59AC9EF6A55AEAC22D35A1BFE -PT=203ECD34AE1BB2F23BC673DBD74FA07B - -I=68 -KEY=E34FBDEF9D81B464DD1138093F132051532BA911B97FB01B5FADE370D26439E2 -CT=203ECD34AE1BB2F23BC673DBD74FA07B -PT=0A18AFD5EEBBD338299897EA1F01324C - -I=69 -KEY=77BD51D39775121C22343FFC66D40F0B593306C457C463237635749ACD650BAE -CT=0A18AFD5EEBBD338299897EA1F01324C -PT=2892A6AE9517642A0977942360FB8104 - -I=70 -KEY=2761BF5478726AF184C86B45AE331A7E71A1A06AC2D307097F42E0B9AD9E8AAA -CT=2892A6AE9517642A0977942360FB8104 -PT=8A4CD7685B9A1E663C3130C34BC418B9 - -I=71 -KEY=DD168B81E90D806FF468BE5E551F3344FBED77029949196F4373D07AE65A9213 -CT=8A4CD7685B9A1E663C3130C34BC418B9 -PT=C7C0A15A1A22363B378D5DD27A69D4C2 - -I=72 -KEY=3442C07C0E98F523F9278D934F424BD83C2DD658836B2F5474FE8DA89C3346D1 -CT=C7C0A15A1A22363B378D5DD27A69D4C2 -PT=55A8EF8CAE213FE3FD6AA77E7415400A - -I=73 -KEY=291BD1577921B2947BC470C19727F0BD698539D42D4A10B789942AD6E82606DB -CT=55A8EF8CAE213FE3FD6AA77E7415400A -PT=0B07BEB71461356645936996AC45EB87 - -I=74 -KEY=46475B4C21F0F4895FEFCC67632DBCDC62828763392B25D1CC0743404463ED5C -CT=0B07BEB71461356645936996AC45EB87 -PT=6DFA5978F740C18CEE6F70FF50008BFD - -I=75 -KEY=CF89BDDE5D363B3C44DB6FED2DAB47AA0F78DE1BCE6BE45D226833BF146366A1 -CT=6DFA5978F740C18CEE6F70FF50008BFD -PT=6F58747F0336A2C4D2A397511E06D703 - -I=76 -KEY=85F7D4A4503F7C3D52998384F8B29BEF6020AA64CD5D4699F0CBA4EE0A65B1A2 -CT=6F58747F0336A2C4D2A397511E06D703 -PT=32AC7B1B8FFA7D411F46C129EEFFAF13 - -I=77 -KEY=CDE87D2DFB6198CFC737D93433419757528CD17F42A73BD8EF8D65C7E49A1EB1 -CT=32AC7B1B8FFA7D411F46C129EEFFAF13 -PT=CF5D039714814E72ECE7B9D5D1B27D11 - -I=78 -KEY=BCB9F75F11496AABFE2633E393B59B449DD1D2E8562675AA036ADC12352863A0 -CT=CF5D039714814E72ECE7B9D5D1B27D11 -PT=3455F997002A1818967E2679A07C1D56 - -I=79 -KEY=99E143B3524E724A009533AEC659E15BA9842B7F560C6DB29514FA6B95547EF6 -CT=3455F997002A1818967E2679A07C1D56 -PT=1F2113D44E290F1379A3CEC6D57D6279 - -I=80 -KEY=90086C83794D6878FF2CE748ECA6EDF4B6A538AB182562A1ECB734AD40291C8F -CT=1F2113D44E290F1379A3CEC6D57D6279 -PT=88866DB676AA3B21954AFDE0A0F33007 - -I=81 -KEY=FA254EB868F6CD5965346ACAE326BD2A3E23551D6E8F598079FDC94DE0DA2C88 -CT=88866DB676AA3B21954AFDE0A0F33007 -PT=A1665AD0252764E2691E65FEFB609CDA - -I=82 -KEY=92032C92FEEB0A5CD5D71AAF1BF5F47D9F450FCD4BA83D6210E3ACB31BBAB052 -CT=A1665AD0252764E2691E65FEFB609CDA -PT=988CE348430A206546379A8C684C00F1 - -I=83 -KEY=CF32144187F7B98256B5B4204DFABC8807C9EC8508A21D0756D4363F73F6B0A3 -CT=988CE348430A206546379A8C684C00F1 -PT=60289F0B6A9ADD08BF8924AA6D7F4D12 - -I=84 -KEY=A7BD244360E3C325F3EA315C86959DD867E1738E6238C00FE95D12951E89FDB1 -CT=60289F0B6A9ADD08BF8924AA6D7F4D12 -PT=FA3EA122499D7E083D81F147D9D68B09 - -I=85 -KEY=86213610EDC35A883A3364E8D529C6459DDFD2AC2BA5BE07D4DCE3D2C75F76B8 -CT=FA3EA122499D7E083D81F147D9D68B09 -PT=8E0B2452EF0515FC554A0AADF107714D - -I=86 -KEY=92CC3AE4A2A68CD93634075E902C66CB13D4F6FEC4A0ABFB8196E97F365807F5 -CT=8E0B2452EF0515FC554A0AADF107714D -PT=463CEAE83A50BA54280E792AB6B29B94 - -I=87 -KEY=6D86FA00DBB949A29D4A6166F1EF531E55E81C16FEF011AFA998905580EA9C61 -CT=463CEAE83A50BA54280E792AB6B29B94 -PT=416CA710B874E50CC98DF842B3435AD1 - -I=88 -KEY=C9400C98A04F5041BE1C6090A866F7DA1484BB064684F4A36015681733A9C6B0 -CT=416CA710B874E50CC98DF842B3435AD1 -PT=3BA8BB5C572C0404E4B8199528825904 - -I=89 -KEY=ED5043E9699B37844033E8BD170588342F2C005A11A8F0A784AD71821B2B9FB4 -CT=3BA8BB5C572C0404E4B8199528825904 -PT=1D2812DE70AA2D59894DA4DA7FE906FC - -I=90 -KEY=1964C6C301EEEF60B34E8E35175CAF8D320412846102DDFE0DE0D55864C29948 -CT=1D2812DE70AA2D59894DA4DA7FE906FC -PT=2735CAAFE653442FFC2E878AE2829998 - -I=91 -KEY=567B1E0737D0F72F82EB3A47D17209191531D82B875199D1F1CE52D2864000D0 -CT=2735CAAFE653442FFC2E878AE2829998 -PT=07B5FA4835E5DFC67E02F490A497145D - -I=92 -KEY=89AAD6DCA6A8973580D02768EBC8372412842263B2B446178FCCA64222D7148D -CT=07B5FA4835E5DFC67E02F490A497145D -PT=A31272EC8623213B015811FAE12330CE - -I=93 -KEY=4B4AB47A0DBA39907D8E919767E69518B196508F3497672C8E94B7B8C3F42443 -CT=A31272EC8623213B015811FAE12330CE -PT=9132AB51C9738A62CABDE4977947E0BF - -I=94 -KEY=BEC71999AEE5517C243B65830D30DEBB20A4FBDEFDE4ED4E4429532FBAB3C4FC -CT=9132AB51C9738A62CABDE4977947E0BF -PT=689375EA83B61894631E6EFA2D509531 - -I=95 -KEY=77CE2C97A458300D7C95C6871CEB56D648378E347E52F5DA27373DD597E351CD -CT=689375EA83B61894631E6EFA2D509531 -PT=AAA5C6C5917DFC103383DE6C79EB2BA6 - -I=96 -KEY=0AD691774612F7EFA41FE39B8B3A2D14E29248F1EF2F09CA14B4E3B9EE087A6B -CT=AAA5C6C5917DFC103383DE6C79EB2BA6 -PT=29D9945BDB3770ED2A41D2760D0DC51D - -I=97 -KEY=4E1D42ADC4CEF6BAE3A5B9E08F7ACD65CB4BDCAA341879273EF531CFE305BF76 -CT=29D9945BDB3770ED2A41D2760D0DC51D -PT=2F9B3C4E1FDCDC8F7D5DFBEA342284F2 - -I=98 -KEY=2D76A3E35C075DB14E40A59F46E07A81E4D0E0E42BC4A5A843A8CA25D7273B84 -CT=2F9B3C4E1FDCDC8F7D5DFBEA342284F2 -PT=ED4CFCF1C8D226EBACCC8FF11B1C81B8 - -I=99 -KEY=E7364D0D17D723A69C0BA956778BD0E9099C1C15E3168343EF6445D4CC3BBA3C -CT=ED4CFCF1C8D226EBACCC8FF11B1C81B8 -PT=2F9B5E1392B767E8497F849D00E98193 - -I=100 -KEY=709380C7012CB4272A69F6D4936B163E2607420671A1E4ABA61BC149CCD23BAF -CT=2F9B5E1392B767E8497F849D00E98193 -PT=3BE783A4A38EFB44150AA7A08E1888F6 - -I=101 -KEY=98FF27B8AB7B91F690231E24608076EF1DE0C1A2D22F1FEFB31166E942CAB359 -CT=3BE783A4A38EFB44150AA7A08E1888F6 -PT=F35AED9C83E53D2EADDE507345096218 - -I=102 -KEY=24F9D2FF633EE9AAED7321CFCF4D1D20EEBA2C3E51CA22C11ECF369A07C3D141 -CT=F35AED9C83E53D2EADDE507345096218 -PT=A22BF93FD521A6E59C196022FF252DC2 - -I=103 -KEY=70E491840BC5C42A878655E18E9AAAA74C91D50184EB842482D656B8F8E6FC83 -CT=A22BF93FD521A6E59C196022FF252DC2 -PT=11E67B52F8CD97D63268485EB546E1FE - -I=104 -KEY=098FF2D6DE55FF5C66D5AD7D5949643A5D77AE537C2613F2B0BE1EE64DA01D7D -CT=11E67B52F8CD97D63268485EB546E1FE -PT=1E67AF3F7E7FDEFB868696E96F718ACC - -I=105 -KEY=B89EA7CBAE57B8AD39F23B22A8F651A44310016C0259CD093638880F22D197B1 -CT=1E67AF3F7E7FDEFB868696E96F718ACC -PT=332B0045710B2DD6EC3D619051580C7F - -I=106 -KEY=39F71BC56EBFA91088499DC41A0C5B5B703B01297352E0DFDA05E99F73899BCE -CT=332B0045710B2DD6EC3D619051580C7F -PT=86F3D75D18F7AB31C6C52C19B0C35023 - -I=107 -KEY=417147DB03FDA0B26BEED7FE8A9487D5F6C8D6746BA54BEE1CC0C586C34ACBED -CT=86F3D75D18F7AB31C6C52C19B0C35023 -PT=452E6C2DA8B93A1E282F1A86AECB9F15 - -I=108 -KEY=C4336C26C20AD7811578044800A51E8EB3E6BA59C31C71F034EFDF006D8154F8 -CT=452E6C2DA8B93A1E282F1A86AECB9F15 -PT=637F010BAC28AC108331F4E26B262D3A - -I=109 -KEY=D0369C75D40EEF29CF7588FB87EE2ED2D099BB526F34DDE0B7DE2BE206A779C2 -CT=637F010BAC28AC108331F4E26B262D3A -PT=3F3DCA8B4C2DDFD556880A17FB575E7B - -I=110 -KEY=4DE25218630A678C287EC42F93985D22EFA471D923190235E15621F5FDF027B9 -CT=3F3DCA8B4C2DDFD556880A17FB575E7B -PT=3DA8C1D40B51A8BC6E728D7A1E6B3B2E - -I=111 -KEY=C0526C3096805B532433C0248E153A00D20CB00D2848AA898F24AC8FE39B1C97 -CT=3DA8C1D40B51A8BC6E728D7A1E6B3B2E -PT=449B050578191E4C156F7040EF27D5EC - -I=112 -KEY=6A1B7384328BAA25B6A857FB12A90FD49697B5085051B4C59A4BDCCF0CBCC97B -CT=449B050578191E4C156F7040EF27D5EC -PT=D58ACA128F936803BDD5EC1E6DECAB04 - -I=113 -KEY=44B7F3EB0EF0EF4325353D30F35C4D71431D7F1ADFC2DCC6279E30D16150627F -CT=D58ACA128F936803BDD5EC1E6DECAB04 -PT=77F1011F968AD46338CA68D5DF37959E - -I=114 -KEY=E1E6BBD70AEAC4D65159422B3DFE82DF34EC7E05494808A51F545804BE67F7E1 -CT=77F1011F968AD46338CA68D5DF37959E -PT=FC692161766A29C9E6A86C353E2F3FE5 - -I=115 -KEY=5C33A88179175BB12593D6574245A6A6C8855F643F22216CF9FC34318048C804 -CT=FC692161766A29C9E6A86C353E2F3FE5 -PT=F5FD2F77BC4908F470142417048C6233 - -I=116 -KEY=E6A3CDD47570AEC4FC3B3453F78F253F3D787013836B299889E8102684C4AA37 -CT=F5FD2F77BC4908F470142417048C6233 -PT=FBDC2774D7E426CBD8B62ABD0E0EAA6F - -I=117 -KEY=4F5B3EDC53366D4C74D94663E17CBDB6C6A45767548F0F53515E3A9B8ACA0058 -CT=FBDC2774D7E426CBD8B62ABD0E0EAA6F -PT=796D978C9D724C1C9445EC5BD272CEB0 - -I=118 -KEY=9119AD19E78100B3D04BED87FF5C22B5BFC9C0EBC9FD434FC51BD6C058B8CEE8 -CT=796D978C9D724C1C9445EC5BD272CEB0 -PT=15ECF7D3F516D3CBA0307959287A5BAB - -I=119 -KEY=600B4D7604FF2650611C453A50D02275AA2537383CEB9084652BAF9970C29543 -CT=15ECF7D3F516D3CBA0307959287A5BAB -PT=DA67996084E9C74C143310FC3CF207DD - -I=120 -KEY=3B8E0B73BBF745BB360EA50E7DA9B3297042AE58B80257C87118BF654C30929E -CT=DA67996084E9C74C143310FC3CF207DD -PT=6E9BC50580D45D54FEEC74830C0D9516 - -I=121 -KEY=231592D0CE761359AE2E85CC4E4156A01ED96B5D38D60A9C8FF4CBE6403D0788 -CT=6E9BC50580D45D54FEEC74830C0D9516 -PT=A4B0F6A50C72C5EE755FA5595334DF2E - -I=122 -KEY=7ABD82D278910B909B0D6219EF5E0D98BA699DF834A4CF72FAAB6EBF1309D8A6 -CT=A4B0F6A50C72C5EE755FA5595334DF2E -PT=24CDAEEB54A1EB7E2D4A0BEE526EA6E0 - -I=123 -KEY=5C8F7B23850BD287F011E257D691F8979EA433136005240CD7E1655141677E46 -CT=24CDAEEB54A1EB7E2D4A0BEE526EA6E0 -PT=84F24CDC0AA63CEA2DDE8F94C8776765 - -I=124 -KEY=DF8EEE46309021F6E7D7D41908B6CABE1A567FCF6AA318E6FA3FEAC589101923 -CT=84F24CDC0AA63CEA2DDE8F94C8776765 -PT=EEA20542DEDB0B99A2144942FFEAC820 - -I=125 -KEY=8634A663D618B3BB54F44A5849170ACDF4F47A8DB478137F582BA38776FAD103 -CT=EEA20542DEDB0B99A2144942FFEAC820 -PT=CDD91737753BE9F672A60DD722202127 - -I=126 -KEY=E41913E97F21A4E6A948ABEB45279E0D392D6DBAC143FA892A8DAE5054DAF024 -CT=CDD91737753BE9F672A60DD722202127 -PT=E6E2F7846E06BB90F19B21521DD4D238 - -I=127 -KEY=1E63624B5EADBE7D42255F208CC7D348DFCF9A3EAF454119DB168F02490E221C -CT=E6E2F7846E06BB90F19B21521DD4D238 -PT=0110CA2647D43C8BD012976113EFB860 - -I=128 -KEY=8476329019AA4D0D91C71E0DFFF47906DEDF5018E8917D920B0418635AE19A7C -CT=0110CA2647D43C8BD012976113EFB860 -PT=CC9AACC98876387D09565F1A20D329AF - -I=129 -KEY=DB1C0803BC1AD91C5621FA8C54AA83EF1245FCD160E745EF025247797A32B3D3 -CT=CC9AACC98876387D09565F1A20D329AF -PT=55AB296D67DEEBA179AD8093C1952CC2 - -I=130 -KEY=5C0887FF7C888D7800C43BC9E88D9B3B47EED5BC0739AE4E7BFFC7EABBA79F11 -CT=55AB296D67DEEBA179AD8093C1952CC2 -PT=27016691505182706848CD5D7A2C5CAB - -I=131 -KEY=0FFBE12ADFA17F3BF26622C20311D38960EFB32D57682C3E13B70AB7C18BC3BA -CT=27016691505182706848CD5D7A2C5CAB -PT=5E6C9FAF480FFE51D7687ADE203D5367 - -I=132 -KEY=C4C12330BC21062618E2E83EC3755DAC3E832C821F67D26FC4DF7069E1B690DD -CT=5E6C9FAF480FFE51D7687ADE203D5367 -PT=082FF20DC6AFBA3888348E5724F5C526 - -I=133 -KEY=3F6BF56A0136C1058924FCD831A65EBC36ACDE8FD9C868574CEBFE3EC54355FB -CT=082FF20DC6AFBA3888348E5724F5C526 -PT=67AE68CDDA349A067339F28FA216A188 - -I=134 -KEY=4AB9E8E9B5BB84353006AB43065C6B8F5102B64203FCF2513FD20CB16755F473 -CT=67AE68CDDA349A067339F28FA216A188 -PT=3316F37F97D679B78A537A0E107923AB - -I=135 -KEY=E04DE045508423D735B20168C7974CC26214453D942A8BE6B58176BF772CD7D8 -CT=3316F37F97D679B78A537A0E107923AB -PT=00AEB331686999C5F5FB1E7C6CCF1072 - -I=136 -KEY=D4D19E570760468E9703F0E49C4AC9F262BAF60CFC431223407A68C31BE3C7AA -CT=00AEB331686999C5F5FB1E7C6CCF1072 -PT=29A5DB93D2AE9B1ED9714213EAD9AA1C - -I=137 -KEY=6D6789354D2CC3EFA9ABFC466F21A6E24B1F2D9F2EED893D990B2AD0F13A6DB6 -CT=29A5DB93D2AE9B1ED9714213EAD9AA1C -PT=E98426CB0F858A084EB66311188D9200 - -I=138 -KEY=06ED66801B81943BF1640AAE222A23C7A29B0B5421680335D7BD49C1E9B7FFB6 -CT=E98426CB0F858A084EB66311188D9200 -PT=21527326577425261F2D40268C428E29 - -I=139 -KEY=2232758279A806C21870C85273C12FA883C97872761C2613C89009E765F5719F -CT=21527326577425261F2D40268C428E29 -PT=CC9393A43B8A8194C0EC29F989E597A6 - -I=140 -KEY=E7E22C2A6E6D4A1BFE7B706047094AF44F5AEBD64D96A787087C201EEC10E639 -CT=CC9393A43B8A8194C0EC29F989E597A6 -PT=714846062B262A823B24164900DF91AD - -I=141 -KEY=89A78F64BCAEE02CAC92928134C2567C3E12ADD066B08D0533583657ECCF7794 -CT=714846062B262A823B24164900DF91AD -PT=1D0AC79D1E9BB36A6A6A8E49538C08FF - -I=142 -KEY=4F6E8D81296C95FAA0FE6F2D324A392223186A4D782B3E6F5932B81EBF437F6B -CT=1D0AC79D1E9BB36A6A6A8E49538C08FF -PT=403D8B10E0AB31493589AFFA8E8B1BEE - -I=143 -KEY=24E398291CF018E4666728F4F635F74D6325E15D98800F266CBB17E431C86485 -CT=403D8B10E0AB31493589AFFA8E8B1BEE -PT=9E0516EDA401DAAF6AC013841C0D63C8 - -I=144 -KEY=F80CF8AF1FA463D2ED7C7F59C1B239B0FD20F7B03C81D589067B04602DC5074D -CT=9E0516EDA401DAAF6AC013841C0D63C8 -PT=74B2B200922B21AA20A0C5860CFB7E4D - -I=145 -KEY=577A5456424E1A76C3E113EB82CCDF34899245B0AEAAF42326DBC1E6213E7900 -CT=74B2B200922B21AA20A0C5860CFB7E4D -PT=25AFF27E13888A638CDA2673D7F16AFD - -I=146 -KEY=7C623BBD4777E6EF9BC058DF5BA27BEAAC3DB7CEBD227E40AA01E795F6CF13FD -CT=25AFF27E13888A638CDA2673D7F16AFD -PT=A54F400AB9C52913D7302BA36BF217DD - -I=147 -KEY=A8B33E433720C4B925C4F0315DDB73B00972F7C404E757537D31CC369D3D0420 -CT=A54F400AB9C52913D7302BA36BF217DD -PT=48A263A07112AA95EA1414CE03545790 - -I=148 -KEY=DA864B91AED3E2FAC25782F4A50C13C841D0946475F5FDC69725D8F89E6953B0 -CT=48A263A07112AA95EA1414CE03545790 -PT=541547E924522E59C1721D130B64D92F - -I=149 -KEY=EEB5FF6F9C435510E12934F5E806553E15C5D38D51A7D39F5657C5EB950D8A9F -CT=541547E924522E59C1721D130B64D92F -PT=5830544939EB4607145538388840248B - -I=150 -KEY=24E609AD29E4C601189CB2FE119767884DF587C4684C95984202FDD31D4DAE14 -CT=5830544939EB4607145538388840248B -PT=CBE1F82FD3318448AA36ADB5967EF865 - -I=151 -KEY=5A7EBB76C38C2E5F038612A06E84BB2C86147FEBBB7D11D0E83450668B335671 -CT=CBE1F82FD3318448AA36ADB5967EF865 -PT=3B104547D2D620879E3CB2B5774C0FB4 - -I=152 -KEY=827EFCB7BC862C2466B8C79FC297AD3DBD043AAC69AB31577608E2D3FC7F59C5 -CT=3B104547D2D620879E3CB2B5774C0FB4 -PT=B667F7544FE49A07611A160E3312F69A - -I=153 -KEY=9BC6C18805144F98CAEA7B252B3EE2930B63CDF8264FAB501712F4DDCF6DAF5F -CT=B667F7544FE49A07611A160E3312F69A -PT=C3E928FDEB5D7DDF7CF32C4DBCFE32F3 - -I=154 -KEY=2BC00DF6D26F9A968C3BFF47AE761718C88AE505CD12D68F6BE1D89073939DAC -CT=C3E928FDEB5D7DDF7CF32C4DBCFE32F3 -PT=72A9CF7AA2EDAF1907D77D10A02A45DE - -I=155 -KEY=15A0EE054E2D5E7EDCF3FC766860ACCDBA232A7F6FFF79966C36A580D3B9D872 -CT=72A9CF7AA2EDAF1907D77D10A02A45DE -PT=97ABFAAD506940F88FDC8F55AD7EA919 - -I=156 -KEY=C56C11F3A96852119C16751963C24CD42D88D0D23F96396EE3EA2AD57EC7716B -CT=97ABFAAD506940F88FDC8F55AD7EA919 -PT=DD55A02B1EB01EB091CA6337D0BEB5BD - -I=157 -KEY=8634CC7B3416FCE337AAFA39791D1545F0DD70F9212627DE722049E2AE79C4D6 -CT=DD55A02B1EB01EB091CA6337D0BEB5BD -PT=C5EB3DF5A328B267F3895CECD4A828AF - -I=158 -KEY=DDC1361E1432CCAC3551E2478A321A0035364D0C820E95B981A9150E7AD1EC79 -CT=C5EB3DF5A328B267F3895CECD4A828AF -PT=49952DACD97FD5583A7D9C4FF515EC17 - -I=159 -KEY=52658EEC2A7441D866CFA15944BB12857CA360A05B7140E1BBD489418FC4006E -CT=49952DACD97FD5583A7D9C4FF515EC17 -PT=4971EEEF871E935AC470BD770802B04B - -I=160 -KEY=05FC7A181B1935EA8DCEC961B0DFC14B35D28E4FDC6FD3BB7FA4343687C6B025 -CT=4971EEEF871E935AC470BD770802B04B -PT=3DB5E9165C24EC3790DC3E53E5E5D2DE - -I=161 -KEY=8D2793B7BDCF80338AA39C86008361BC08676759804B3F8CEF780A65622362FB -CT=3DB5E9165C24EC3790DC3E53E5E5D2DE -PT=1FDB5D4FBB59F082B3B617C8A23734F1 - -I=162 -KEY=37BE37961B77866869826907BB9E9C1717BC3A163B12CF0E5CCE1DADC014560A -CT=1FDB5D4FBB59F082B3B617C8A23734F1 -PT=8C59775AD3FF7C337B22C8E785321E25 - -I=163 -KEY=F3184EA1C8FFE3D436BEE076AA999B659BE54D4CE8EDB33D27ECD54A4526482F -CT=8C59775AD3FF7C337B22C8E785321E25 -PT=0CB834FCC0CFDAECAF4AFC5A2E38DF23 - -I=164 -KEY=CACF50D99B066EB84CBFAEEC9B0D6769975D79B0282269D188A629106B1E970C -CT=0CB834FCC0CFDAECAF4AFC5A2E38DF23 -PT=229EB7B6A97D91921BCD8C95A0D7C17B - -I=165 -KEY=3FA80E4FB785B9FC3B058CC62D289958B5C3CE06815FF843936BA585CBC95677 -CT=229EB7B6A97D91921BCD8C95A0D7C17B -PT=0D7692C281DD4FF35D9B1620E1385C34 - -I=166 -KEY=CE2A3A893C96A4F1AA81AD52EBCC3C23B8B55CC40082B7B0CEF0B3A52AF10A43 -CT=0D7692C281DD4FF35D9B1620E1385C34 -PT=D3C5FE594F5C8C5A359235448EB20146 - -I=167 -KEY=FC8642DB8CB42D1B1251CB7FE6AFF90D6B70A29D4FDE3BEAFB6286E1A4430B05 -CT=D3C5FE594F5C8C5A359235448EB20146 -PT=8C0F88460C700D96847249807B84223F - -I=168 -KEY=2A9C9FD184A5B2418FD415A228A5C0AFE77F2ADB43AE367C7F10CF61DFC7293A -CT=8C0F88460C700D96847249807B84223F -PT=5A4237A5C2DABDCDA6389D5FC66032F6 - -I=169 -KEY=FDB533163E989D2FA32CCA5D3CC5D376BD3D1D7E81748BB1D928523E19A71BCC -CT=5A4237A5C2DABDCDA6389D5FC66032F6 -PT=BF8AAC6B1536CCCCECCC9D6BE970EB3E - -I=170 -KEY=3C4B3CF0FD0C4292B2497175D4400F8902B7B1159442477D35E4CF55F0D7F0F2 -CT=BF8AAC6B1536CCCCECCC9D6BE970EB3E -PT=97CE58407FD26D63C86765CB05EA6277 - -I=171 -KEY=367862F3E2C5520EA2269392B6139E9C9579E955EB902A1EFD83AA9EF53D9285 -CT=97CE58407FD26D63C86765CB05EA6277 -PT=B411687B044B624077A92D8C130697B9 - -I=172 -KEY=0300AF491DAF6C607417FB1FD9B1EC612168812EEFDB485E8A2A8712E63B053C -CT=B411687B044B624077A92D8C130697B9 -PT=D22E92A5132EA85F4FB25EE19C248008 - -I=173 -KEY=7C92EF49A7D27E97F1884299B635F0ADF346138BFCF5E001C598D9F37A1F8534 -CT=D22E92A5132EA85F4FB25EE19C248008 -PT=FD6817CD680A2A8CE93E4B4F9CAA72AA - -I=174 -KEY=80EABB1D8C9B5F769FCAC87ED8D0C9CA0E2E044694FFCA8D2CA692BCE6B5F79E -CT=FD6817CD680A2A8CE93E4B4F9CAA72AA -PT=8DDD9B3B9278D2DE3453EA6769E1C39C - -I=175 -KEY=FB345E2D7BBBED527259FAEAEA79C05D83F39F7D0687185318F578DB8F543402 -CT=8DDD9B3B9278D2DE3453EA6769E1C39C -PT=AE69F5CD8D342E74113E979ACE3539F2 - -I=176 -KEY=7D93DC33FF2266770291160CD317C65E2D9A6AB08BB3362709CBEF4141610DF0 -CT=AE69F5CD8D342E74113E979ACE3539F2 -PT=30E19A4E84997172486DAE4FB4C41E58 - -I=177 -KEY=82362FF3E9C1AD93474CF4CABD354E7E1D7BF0FE0F2A475541A6410EF5A513A8 -CT=30E19A4E84997172486DAE4FB4C41E58 -PT=75B3D07617EB189512DC5161908940C1 - -I=178 -KEY=8EFD0FCB3855CCC16BD919FBD17596C768C8208818C15FC0537A106F652C5369 -CT=75B3D07617EB189512DC5161908940C1 -PT=FD13E89107FAFA44998721AD726C620F - -I=179 -KEY=2299D22282C798107F489637DCD479C395DBC8191F3BA584CAFD31C217403166 -CT=FD13E89107FAFA44998721AD726C620F -PT=C1B0210C0387864717BD7D02063B6A69 - -I=180 -KEY=75E05597A2BBDF23E5BD172C83548C9B546BE9151CBC23C3DD404CC0117B5B0F -CT=C1B0210C0387864717BD7D02063B6A69 -PT=0E442B38E9024CCA5DC43A7B8D5F6FCF - -I=181 -KEY=4DBC8DCB8C25B5F4AD374BA3064216555A2FC22DF5BE6F09808476BB9C2434C0 -CT=0E442B38E9024CCA5DC43A7B8D5F6FCF -PT=8FD213EC19D62FD2C19E6C91B97E56A0 - -I=182 -KEY=E393BAD07E955EBC1446B847DE5A891ED5FDD1C1EC6840DB411A1A2A255A6260 -CT=8FD213EC19D62FD2C19E6C91B97E56A0 -PT=F52ADFD33A68EE198F33708E676D0CE9 - -I=183 -KEY=3F33A76F87DB0388C2D66C7F2EFAA1B820D70E12D600AEC2CE296AA442376E89 -CT=F52ADFD33A68EE198F33708E676D0CE9 -PT=7649EB4283505EEEE1BE16DB6677B3F5 - -I=184 -KEY=04BC65DE70C9E01EEEDA5A507C218C8D569EE5505550F02C2F977C7F2440DD7C -CT=7649EB4283505EEEE1BE16DB6677B3F5 -PT=6FB1C4AD8A5B8A606621A8BF4277F3DC - -I=185 -KEY=8A6EF9710F4AE10EB60C8D25A8F67C50392F21FDDF0B7A4C49B6D4C066372EA0 -CT=6FB1C4AD8A5B8A606621A8BF4277F3DC -PT=22C2CF9572D708F688291056E2F8E120 - -I=186 -KEY=ED6D084D5F8AA4F201F9C20EA26A90E81BEDEE68ADDC72BAC19FC49684CFCF80 -CT=22C2CF9572D708F688291056E2F8E120 -PT=28AC7257911ECEB549D910BFA0905AE5 - -I=187 -KEY=BA2735927D6A76B952C08A219FBB572233419C3F3CC2BC0F8846D429245F9565 -CT=28AC7257911ECEB549D910BFA0905AE5 -PT=2A1F3842DF988CDA0C6415450A657DB2 - -I=188 -KEY=53BCC06CCCBC31A5BEE2CE88E6EAEFAC195EA47DE35A30D58422C16C2E3AE8D7 -CT=2A1F3842DF988CDA0C6415450A657DB2 -PT=6055EB3A24DE4D87C6BA5073A5BAC919 - -I=189 -KEY=DF88C3CEC31C7B88D8AC0C7AAA2CED99790B4F47C7847D524298911F8B8021CE -CT=6055EB3A24DE4D87C6BA5073A5BAC919 -PT=CC051CCD37068B41935FD14538DFEF82 - -I=190 -KEY=265B351B93FF456D5A1EAADD2BEA1296B50E538AF082F613D1C7405AB35FCE4C -CT=CC051CCD37068B41935FD14538DFEF82 -PT=225B63F455DD72EC87CF6FD5DF0FDAF3 - -I=191 -KEY=BAC4C541E0A693CF8A3892A82F67CD959755307EA55F84FF56082F8F6C5014BF -CT=225B63F455DD72EC87CF6FD5DF0FDAF3 -PT=64027F6B72F0A11628F66D5C502658E8 - -I=192 -KEY=E8F68EF4909A128F331DFEFAE8560EBCF3574F15D7AF25E97EFE42D33C764C57 -CT=64027F6B72F0A11628F66D5C502658E8 -PT=529AAF9163EDA1BC39E66D2556BE938B - -I=193 -KEY=1951B1A50BED04096C17E816D4EC6225A1CDE084B442845547182FF66AC8DFDC -CT=529AAF9163EDA1BC39E66D2556BE938B -PT=F93E85D98EB9BDDD7D3844421235FBAB - -I=194 -KEY=D39AF070909FBC0E3226E28041B0286158F3655D3AFB39883A206BB478FD2477 -CT=F93E85D98EB9BDDD7D3844421235FBAB -PT=16B6B3CC08003BA36C9E84B1EE9CD7CC - -I=195 -KEY=B705C6CCD010B980E386B8690C83E96C4E45D69132FB022B56BEEF059661F3BB -CT=16B6B3CC08003BA36C9E84B1EE9CD7CC -PT=301AFE66055149FA5775A9CE19F1FF63 - -I=196 -KEY=B3C813D4FCBD31ED95E7E71CEC15153E7E5F28F737AA4BD101CB46CB8F900CD8 -CT=301AFE66055149FA5775A9CE19F1FF63 -PT=1090E68F7C8400861589E304A5B815CD - -I=197 -KEY=0EBC30ADB6946B6415C0309D636C79F46ECFCE784B2E4B571442A5CF2A281915 -CT=1090E68F7C8400861589E304A5B815CD -PT=2778F0C712804C0B8D085B196A4D73C4 - -I=198 -KEY=9C5815C6705B39DEECB8BDDDC9329A0D49B73EBF59AE075C994AFED640656AD1 -CT=2778F0C712804C0B8D085B196A4D73C4 -PT=14FECB137DC9C38A04D92B60A177A61D - -I=199 -KEY=9D83B41F8F415B5F3B2C08682383471B5D49F5AC2467C4D69D93D5B6E112CCCC -CT=14FECB137DC9C38A04D92B60A177A61D -PT=0EF1321EA52EAA7624E3F2EFD0C886AF - -I=200 -KEY=2960CEE0AF043ED1A549BA223F6C1CF153B8C7B281496EA0B970275931DA4A63 -CT=0EF1321EA52EAA7624E3F2EFD0C886AF -PT=AFA8B2129577EC178B59D42D1B92D313 - -I=201 -KEY=51E0DECF48A151021C70EC3EE3CE9008FC1075A0143E82B73229F3742A489970 -CT=AFA8B2129577EC178B59D42D1B92D313 -PT=3351631344E6EF86712327D3C05EBDEB - -I=202 -KEY=5F34A789B0B1185BA7D1BB3EF2677060CF4116B350D86D31430AD4A7EA16249B -CT=3351631344E6EF86712327D3C05EBDEB -PT=C299D0556B0D15014627CADBCCC3DC33 - -I=203 -KEY=FC3E420F84F4C75802DCF68ABF0030E70DD8C6E63BD57830052D1E7C26D5F8A8 -CT=C299D0556B0D15014627CADBCCC3DC33 -PT=CEB83A2B9DD76B649BAAE48A8B772A5C - -I=204 -KEY=C04448AD77DBF33F22A2346C7A40F813C360FCCDA60213549E87FAF6ADA2D2F4 -CT=CEB83A2B9DD76B649BAAE48A8B772A5C -PT=A8C6AEC94E82BC68AC8E29A8CB9504F6 - -I=205 -KEY=3FA863ECC4AFA141DD7349C44F94FEE16BA65204E880AF3C3209D35E6637D602 -CT=A8C6AEC94E82BC68AC8E29A8CB9504F6 -PT=1EDED55C8D3309F828C17AF072C79D7A - -I=206 -KEY=8893E5FB27191AE09E4AB5F062289F117578875865B3A6C41AC8A9AE14F04B78 -CT=1EDED55C8D3309F828C17AF072C79D7A -PT=FD2AC22891FB294EB0AD2BADFE759C29 - -I=207 -KEY=90BA1205BB7927E86F9895855648D3EB88524570F4488F8AAA658203EA85D751 -CT=FD2AC22891FB294EB0AD2BADFE759C29 -PT=2FE6AE59ACD516EE1567A7A1C43FDE2A - -I=208 -KEY=278FD88834EA67564F301785C4045D6FA7B4EB29589D9964BF0225A22EBA097B -CT=2FE6AE59ACD516EE1567A7A1C43FDE2A -PT=35BEC13F159F61C7EF4C860AD3B41A75 - -I=209 -KEY=E9D2F23C213D02724737A5E907BFBDF0920A2A164D02F8A3504EA3A8FD0E130E -CT=35BEC13F159F61C7EF4C860AD3B41A75 -PT=650D65D6ED716DA515EAAF1A7447C3FB - -I=210 -KEY=4A0A997634E2D9305795FC90291F6FD9F7074FC0A073950645A40CB28949D0F5 -CT=650D65D6ED716DA515EAAF1A7447C3FB -PT=7AFE0D2F234A6CDEDD7103DA09147285 - -I=211 -KEY=BD671DD81F8FCD9D472564589AA13F5D8DF942EF8339F9D898D50F68805DA270 -CT=7AFE0D2F234A6CDEDD7103DA09147285 -PT=40627620B17313AF42EA7DD6CFD900F9 - -I=212 -KEY=5668F777C46BF78DC664E72186626BF5CD9B34CF324AEA77DA3F72BE4F84A289 -CT=40627620B17313AF42EA7DD6CFD900F9 -PT=0C62985837C8C6FB468BD6E3928F8497 - -I=213 -KEY=B82B5D4C3DEF62CFAE064CFDB5D904EFC1F9AC9705822C8C9CB4A45DDD0B261E -CT=0C62985837C8C6FB468BD6E3928F8497 -PT=A1FFF4635AAF2AD8AE6EA8C70858EF3B - -I=214 -KEY=6A179EF63528EFA2B12DBA23D1EC8D21600658F45F2D065432DA0C9AD553C925 -CT=A1FFF4635AAF2AD8AE6EA8C70858EF3B -PT=403F8E2D050E2976487BBEDD6466357E - -I=215 -KEY=6857720AC4DDCFFE8A96B455C973901A2039D6D95A232F227AA1B247B135FC5B -CT=403F8E2D050E2976487BBEDD6466357E -PT=2DD7EB8476988C850E8D95DC598FC61A - -I=216 -KEY=5B938E230BFE9056471E7C83A6ED03930DEE3D5D2CBBA3A7742C279BE8BA3A41 -CT=2DD7EB8476988C850E8D95DC598FC61A -PT=676B96F400AE18138B302FD3D70D490E - -I=217 -KEY=4CE7ECA340DEC23715C53343EB9162DA6A85ABA92C15BBB4FF1C08483FB7734F -CT=676B96F400AE18138B302FD3D70D490E -PT=620AAA14B94BF6B60A83129085BCF02B - -I=218 -KEY=1024ECE618D140CAE8B9DFC8EB1DE137088F01BD955E4D02F59F1AD8BA0B8364 -CT=620AAA14B94BF6B60A83129085BCF02B -PT=B701A38325DC282045C6F914394B9F70 - -I=219 -KEY=6B8C6DA855E1E72E4A6AC44601B24D60BF8EA23EB0826522B059E3CC83401C14 -CT=B701A38325DC282045C6F914394B9F70 -PT=808D0B334B775C59F8C34A3524CB4126 - -I=220 -KEY=C50A625A89465321DACCB9EB40DEF57D3F03A90DFBF5397B489AA9F9A78B5D32 -CT=808D0B334B775C59F8C34A3524CB4126 -PT=4E29C921CC295F6A3082C1BC02ACDA70 - -I=221 -KEY=973341A4E3DB315FA97C7EEDF493EA71712A602C37DC661178186845A5278742 -CT=4E29C921CC295F6A3082C1BC02ACDA70 -PT=77BC204E50EFCA2AEBDC16D3F3C3D739 - -I=222 -KEY=639EB8FB16B34B55550705FDCFF7C8CC069640626733AC3B93C47E9656E4507B -CT=77BC204E50EFCA2AEBDC16D3F3C3D739 -PT=A677A7B55AA03EB0587EE00123D047F3 - -I=223 -KEY=610A9602B725E4D87AB2904E91050D90A0E1E7D73D93928BCBBA9E9775341788 -CT=A677A7B55AA03EB0587EE00123D047F3 -PT=09AF5421548AC11466370484F8C556DE - -I=224 -KEY=314A6E0BD202458489059738917B6678A94EB3F66919539FAD8D9A138DF14156 -CT=09AF5421548AC11466370484F8C556DE -PT=B6CDD2336AB8735EE7A9946A1FE7EE0C - -I=225 -KEY=73658C0F88490F7C3B9F2B7B39551BBF1F8361C503A120C14A240E799216AF5A -CT=B6CDD2336AB8735EE7A9946A1FE7EE0C -PT=B5A2F3B47E4AC87BC06612587253930E - -I=226 -KEY=968794DEC3E866DE4F999C860E9851E9AA2192717DEBE8BA8A421C21E0453C54 -CT=B5A2F3B47E4AC87BC06612587253930E -PT=09C9C38BB3348147EB284FFA24D87244 - -I=227 -KEY=205605E66A4BE2CF61E13243E104FED9A3E851FACEDF69FD616A53DBC49D4E10 -CT=09C9C38BB3348147EB284FFA24D87244 -PT=9D1EDCA2674E5A30416DF7CC2938DC63 - -I=228 -KEY=9CA7508C83DB6E56EFF3489F2BD30C573EF68D58A99133CD2007A417EDA59273 -CT=9D1EDCA2674E5A30416DF7CC2938DC63 -PT=E8A2282B47DAB6A666A4607BBC857FC6 - -I=229 -KEY=0F98884E85FEB533CFC281C2F4437915D654A573EE4B856B46A3C46C5120EDB5 -CT=E8A2282B47DAB6A666A4607BBC857FC6 -PT=B6675D2263DC1C1E0F04A9A9BC666D2D - -I=230 -KEY=3F3ED6DC6E08DF2515D08273832429286033F8518D97997549A76DC5ED468098 -CT=B6675D2263DC1C1E0F04A9A9BC666D2D -PT=D6FF2642FD84C80674EAF8674242248D - -I=231 -KEY=67910C06B57CD52767674B70F59337D8B6CCDE13701351733D4D95A2AF04A415 -CT=D6FF2642FD84C80674EAF8674242248D -PT=47D4419A669253C39A0CC96C7CD612C0 - -I=232 -KEY=43EE254E414DB89044EE2F703B340F6AF1189F89168102B0A7415CCED3D2B6D5 -CT=47D4419A669253C39A0CC96C7CD612C0 -PT=B2B3FD7A1D4B0695B3499430F2E44CEA - -I=233 -KEY=89C9881E6D6CEFF00DDFC5618655FA4543AB62F30BCA04251408C8FE2136FA3F -CT=B2B3FD7A1D4B0695B3499430F2E44CEA -PT=4AAD0AE20AFF0675CF78992DFD2B685C - -I=234 -KEY=2C24846D047677F89EF73B917962D0FA0906681101350250DB7051D3DC1D9263 -CT=4AAD0AE20AFF0675CF78992DFD2B685C -PT=C90343412CFE70201CE22D9AD2222788 - -I=235 -KEY=770637F8F8F32915BF7630919D0726AEC0052B502DCB7270C7927C490E3FB5EB -CT=C90343412CFE70201CE22D9AD2222788 -PT=923FE89134FAF362802C5A2EBF399D2C - -I=236 -KEY=426891CF6B068FAC7FFB5A04874AEC78523AC3C11931811247BE2667B10628C7 -CT=923FE89134FAF362802C5A2EBF399D2C -PT=9C08F05026196BA3550A2496049B720B - -I=237 -KEY=B66BCCA5EFAF3F448BDD52DC48F2B904CE3233913F28EAB112B402F1B59D5ACC -CT=9C08F05026196BA3550A2496049B720B -PT=7B487FD67D0C2D987C3DEFD335C2EF17 - -I=238 -KEY=079CCBC13FCFB0D032293FDFEC563F86B57A4C474224C7296E89ED22805FB5DB -CT=7B487FD67D0C2D987C3DEFD335C2EF17 -PT=CEC12158856704CE8ABF0CA6C6F3006B - -I=239 -KEY=998AFEF458902CA632D60843A88D36637BBB6D1FC743C3E7E436E18446ACB5B0 -CT=CEC12158856704CE8ABF0CA6C6F3006B -PT=DA19C7C7283ADD9C5145ABBA53F1E7E1 - -I=240 -KEY=95EDAF196289EE6D24AA752DF489DEFCA1A2AAD8EF791E7BB5734A3E155D5251 -CT=DA19C7C7283ADD9C5145ABBA53F1E7E1 -PT=F043A57E686C1FE7DACB858F0C3E6857 - -I=241 -KEY=3050D2C04C0860414427BF5B19792D7651E10FA68715019C6FB8CFB119633A06 -CT=F043A57E686C1FE7DACB858F0C3E6857 -PT=2FB7B264BB4B3FAFA01A6BB93CC2958D - -I=242 -KEY=26186DD7BE83659550BA3B52D99975037E56BDC23C5E3E33CFA2A40825A1AF8B -CT=2FB7B264BB4B3FAFA01A6BB93CC2958D -PT=D46BBD3ABD958DA722F3591578C30F5E - -I=243 -KEY=DE1D625B9C840580FDDE57EDE82419D1AA3D00F881CBB394ED51FD1D5D62A0D5 -CT=D46BBD3ABD958DA722F3591578C30F5E -PT=3D69379AB60535902C38AB5E121DD035 - -I=244 -KEY=FF9396CB65FFB9D47EF4E0253FD98BBA9754376237CE8604C16956434F7F70E0 -CT=3D69379AB60535902C38AB5E121DD035 -PT=A5767F4E6C8482290BC7B76D23EEF145 - -I=245 -KEY=B98B5F1CA9752B1B07514B72C3D585F23222482C5B4A042DCAAEE12E6C9181A5 -CT=A5767F4E6C8482290BC7B76D23EEF145 -PT=9388736A82C99337C49BB4F32437B1DA - -I=246 -KEY=5F130919FB4ED29397E4781550B1D444A1AA3B46D983971A0E3555DD48A6307F -CT=9388736A82C99337C49BB4F32437B1DA -PT=915C6C5181E797DADC289F8FFF60CD19 - -I=247 -KEY=D3F202F140D38545C8A04EC2D0993E2B30F65717586400C0D21DCA52B7C6FD66 -CT=915C6C5181E797DADC289F8FFF60CD19 -PT=A61167CDBE95ABFAD9C1A58BDA90F0D4 - -I=248 -KEY=FBFA83B249C3B13C83E8FC111611391296E730DAE6F1AB3A0BDC6FD96D560DB2 -CT=A61167CDBE95ABFAD9C1A58BDA90F0D4 -PT=9AF2B4CF00B037976D0F5CAC4201885D - -I=249 -KEY=CC24CC54D0889912C7AD2473EBA8BBB30C158415E6419CAD66D333752F5785EF -CT=9AF2B4CF00B037976D0F5CAC4201885D -PT=A9B74046119B6699FD5EFD1E476BEE64 - -I=250 -KEY=F520F18D9FACA98E5F57226127FA9B6BA5A2C453F7DAFA349B8DCE6B683C6B8B -CT=A9B74046119B6699FD5EFD1E476BEE64 -PT=CD7EAA1EF3B91B69FD3E54FCC5A802E9 - -I=251 -KEY=9BFD59A9F78FB1BE6F13B701D7EB0F6268DC6E4D0463E15D66B39A97AD946962 -CT=CD7EAA1EF3B91B69FD3E54FCC5A802E9 -PT=FD7095C419E2722425E6D4CA1A393D8C - -I=252 -KEY=C1C39AC5158C8CDBE82CF37D00B7896995ACFB891D81937943554E5DB7AD54EE -CT=FD7095C419E2722425E6D4CA1A393D8C -PT=9963CE47EB0322135C5D20B923FC341A - -I=253 -KEY=C9E26AE18D08643029C92F11BD3E8AA40CCF35CEF682B16A1F086EE4945160F4 -CT=9963CE47EB0322135C5D20B923FC341A -PT=11589A1BDD037FABABBB9BF5AAC859A7 - -I=254 -KEY=2183FF3C1EB1DF48DB8FA5F87F279F891D97AFD52B81CEC1B4B3F5113E993953 -CT=11589A1BDD037FABABBB9BF5AAC859A7 -PT=B6CEE1CD709BE6E055041FC2E1A87539 - -I=255 -KEY=738690954B4B92CE2367567B3A960E8DAB594E185B1A2821E1B7EAD3DF314C6A -CT=B6CEE1CD709BE6E055041FC2E1A87539 -PT=D776658F01CCEC460FA7145C6C6CBD42 - -I=256 -KEY=71AB2DBD9923F08E516D8DF0CF57CC227C2F2B975AD6C467EE10FE8FB35DF128 -CT=D776658F01CCEC460FA7145C6C6CBD42 -PT=0C6D2578060A0A1024230D838AA45234 - -I=257 -KEY=1C0E18C83D74E46DDF65BFC3335CFF0D70420EEF5CDCCE77CA33F30C39F9A31C -CT=0C6D2578060A0A1024230D838AA45234 -PT=BFD55D67EF4883200FDAEEA5D44F0302 - -I=258 -KEY=7DA814BD80D8CBBEE778E030682E7F34CF975388B3944D57C5E91DA9EDB6A01E -CT=BFD55D67EF4883200FDAEEA5D44F0302 -PT=E821629542650FAFEF08D94AC889078A - -I=259 -KEY=10490CD6F16D915CE9891C69E10884D827B6311DF1F142F82AE1C4E3253FA794 -CT=E821629542650FAFEF08D94AC889078A -PT=F2F81CD9CBD3E932686B6195A97EE13A - -I=260 -KEY=F0114F7C7101931F6A4595A6C3D2F34AD54E2DC43A22ABCA428AA5768C4146AE -CT=F2F81CD9CBD3E932686B6195A97EE13A -PT=C90348C14450EE3D9BFA30377D4B2440 - -I=261 -KEY=C5802B19BA4921D3750A590F02658F621C4D65057E7245F7D9709541F10A62EE -CT=C90348C14450EE3D9BFA30377D4B2440 -PT=619E907C4E7FD3A723E34B8D3880D71B - -I=262 -KEY=236500CE70AC49E98907DC4EDAE41CCA7DD3F579300D9650FA93DECCC98AB5F5 -CT=619E907C4E7FD3A723E34B8D3880D71B -PT=932A17E8FDA853F6DB1C9271EC4FBF56 - -I=263 -KEY=7BB7D14473E7E2D70F3C8C90D4B1035CEEF9E291CDA5C5A6218F4CBD25C50AA3 -CT=932A17E8FDA853F6DB1C9271EC4FBF56 -PT=549CB80C490E592E18ACC04FAA933489 - -I=264 -KEY=415AD8391B32F6E61A861B4C8A4BBC6DBA655A9D84AB9C8839238CF28F563E2A -CT=549CB80C490E592E18ACC04FAA933489 -PT=BF6337BEDE116D5A60B06DA8B270159C - -I=265 -KEY=058F24C125EB3E94B54BB6F1F099501C05066D235ABAF1D25993E15A3D262BB6 -CT=BF6337BEDE116D5A60B06DA8B270159C -PT=CBD3D52496E6DF0DBD065BD924C5001F - -I=266 -KEY=B85B96EC639098C392FD33D11A49251ECED5B807CC5C2EDFE495BA8319E32BA9 -CT=CBD3D52496E6DF0DBD065BD924C5001F -PT=AF8879C67DF265E118096478FBA003AD - -I=267 -KEY=526BF9DCAF4A4DFD05FAD0EA3B58131D615DC1C1B1AE4B3EFC9CDEFBE2432804 -CT=AF8879C67DF265E118096478FBA003AD -PT=C627176029E2D22A51F5630B129A1095 - -I=268 -KEY=553316781F120EE83A2D083D97D19F99A77AD6A1984C9914AD69BDF0F0D93891 -CT=C627176029E2D22A51F5630B129A1095 -PT=F46AC5870C65636D6C200312F2A15BE6 - -I=269 -KEY=E9A37578C1402447D6CC1161F126D5C7531013269429FA79C149BEE202786377 -CT=F46AC5870C65636D6C200312F2A15BE6 -PT=4FBBFF3856FC0DEC7EE18585FFA4AC16 - -I=270 -KEY=78521B42D0FBE8EA8BB6D44D66AE476D1CABEC1EC2D5F795BFA83B67FDDCCF61 -CT=4FBBFF3856FC0DEC7EE18585FFA4AC16 -PT=8711DAE7DD9B3F6D9FAD03669C1C8F5E - -I=271 -KEY=851C9A078620280FBCDDFB4FD3745C749BBA36F91F4EC8F82005380161C0403F -CT=8711DAE7DD9B3F6D9FAD03669C1C8F5E -PT=050E884136E09368DEFBC43F6B3182CC - -I=272 -KEY=50CCAA51D781B7090285D907E68B1F7A9EB4BEB829AE5B90FEFEFC3E0AF1C2F3 -CT=050E884136E09368DEFBC43F6B3182CC -PT=CEC37197CEE3E0D797F441CC0541B851 - -I=273 -KEY=DAB5ECB43982EAE8412102E2B7BC7CEA5077CF2FE74DBB47690ABDF20FB07AA2 -CT=CEC37197CEE3E0D797F441CC0541B851 -PT=197ECC091E5620DCA63BA2E6CFBC9F43 - -I=274 -KEY=57974D1C4BBF761C9E09B8DAD3E510DF49090326F91B9B9BCF311F14C00CE5E1 -CT=197ECC091E5620DCA63BA2E6CFBC9F43 -PT=F2E836DEE9668E81D74A3C0F03CF3C10 - -I=275 -KEY=E37677110C5A9A59EC06E0968BF5D14EBBE135F8107D151A187B231BC3C3D9F1 -CT=F2E836DEE9668E81D74A3C0F03CF3C10 -PT=DD581BB9F4A7BEC66CAC7916871F55C8 - -I=276 -KEY=2CD760C245E62EA5B477BDA094B3AD5166B92E41E4DAABDC74D75A0D44DC8C39 -CT=DD581BB9F4A7BEC66CAC7916871F55C8 -PT=7B05D43A3BE733E0DE6E2CE494141B46 - -I=277 -KEY=DE35BF6BC48E8B8E6A30DB886C9D75DD1DBCFA7BDF3D983CAAB976E9D0C8977F -CT=7B05D43A3BE733E0DE6E2CE494141B46 -PT=1D561DCAA42E92568DD6ACD583FF7BCE - -I=278 -KEY=8AD7FCADA5D092DD5D221532EED3FD1000EAE7B17B130A6A276FDA3C5337ECB1 -CT=1D561DCAA42E92568DD6ACD583FF7BCE -PT=1E9AB09A76FD91CC33B85390BDE631F8 - -I=279 -KEY=534EEF6B1450693335980E00CD3CDE361E70572B0DEE9BA614D789ACEED1DD49 -CT=1E9AB09A76FD91CC33B85390BDE631F8 -PT=CBD0E3A07952EAC118A81B76D09276FD - -I=280 -KEY=8A39C2221622785E4DA9B14DAAE6ADF3D5A0B48B74BC71670C7F92DA3E43ABB4 -CT=CBD0E3A07952EAC118A81B76D09276FD -PT=AC20057B857E6C34F7E68A5765573538 - -I=281 -KEY=50887AD2D325CBC04B5FD69518318BAD7980B1F0F1C21D53FB99188D5B149E8C -CT=AC20057B857E6C34F7E68A5765573538 -PT=DDFFD26BA5B33AEA36A0A6D75EAA047C - -I=282 -KEY=9613965C1776C5BAEA3CEE6154AABC9FA47F639B547127B9CD39BE5A05BE9AF0 -CT=DDFFD26BA5B33AEA36A0A6D75EAA047C -PT=F0883B6DD3CA0515CB9F1ABA646CCB69 - -I=283 -KEY=E7F6DB8A94597956CEE07447F9BB5CA454F758F687BB22AC06A6A4E061D25199 -CT=F0883B6DD3CA0515CB9F1ABA646CCB69 -PT=F4E27CA9E27B3E81B981298738C01FDA - -I=284 -KEY=0CB665943D6E6E32886A94C070366FB2A015245F65C01C2DBF278D6759124E43 -CT=F4E27CA9E27B3E81B981298738C01FDA -PT=B03B2EB7A1E13E1A17C51FF5684E2A72 - -I=285 -KEY=1EA698290E4B1D41B0CC4F3B9A9398FF102E0AE8C4212237A8E29292315C6431 -CT=B03B2EB7A1E13E1A17C51FF5684E2A72 -PT=BE133CCCE406C1C0BC1707115B5B0C84 - -I=286 -KEY=BA38F49FA3D4A74ED41F8DA958A953C7AE3D36242027E3F714F595836A0768B5 -CT=BE133CCCE406C1C0BC1707115B5B0C84 -PT=A15B1C9BCF319AEF262E366C142A0DCF - -I=287 -KEY=935F2CEECBBCF3465DB9B0DB927AF4310F662ABFEF16791832DBA3EF7E2D657A -CT=A15B1C9BCF319AEF262E366C142A0DCF -PT=7A8DA23874D28EB75261D87D57451EAE - -I=288 -KEY=B8E67B884E3E229EBB516065499F790275EB88879BC4F7AF60BA7B9229687BD4 -CT=7A8DA23874D28EB75261D87D57451EAE -PT=9331C989A7E291FD94BA4C945A79126E - -I=289 -KEY=CFB51BE6CDA499D66E7B36CAAC220FB7E6DA410E3C266652F4003706731169BA -CT=9331C989A7E291FD94BA4C945A79126E -PT=70A2F921A8BB0548D91A114478308448 - -I=290 -KEY=19821B21FED0C1659AF4E16F49F63B699678B82F949D631A2D1A26420B21EDF2 -CT=70A2F921A8BB0548D91A114478308448 -PT=8ED8FC98045BA0EF9C15E9565EECE5BB - -I=291 -KEY=27DA5E31E794D670BDB701F361B8977018A044B790C6C3F5B10FCF1455CD0849 -CT=8ED8FC98045BA0EF9C15E9565EECE5BB -PT=F6621989AFC0427E3E84039B6C6C2E75 - -I=292 -KEY=64E8F7C4292DF7D0B01BED3FAE08DA4FEEC25D3E3F06818B8F8BCC8F39A1263C -CT=F6621989AFC0427E3E84039B6C6C2E75 -PT=68F4804D1E8D383FAF4E76F80FB8F92B - -I=293 -KEY=EE626AFFE4997C11CAE2714FF96D84B18636DD73218BB9B420C5BA773619DF17 -CT=68F4804D1E8D383FAF4E76F80FB8F92B -PT=2D61F123E2479D56AE5C327A57F6A28B - -I=294 -KEY=EA24B2DB953084C818B0E6F34BA1584DAB572C50C3CC24E28E99880D61EF7D9C -CT=2D61F123E2479D56AE5C327A57F6A28B -PT=C6CD16E7A122D105EE398E6C7F15B4EF - -I=295 -KEY=F209D1ADE0869F674F6FEDCD3DB7D2EB6D9A3AB762EEF5E760A006611EFAC973 -CT=C6CD16E7A122D105EE398E6C7F15B4EF -PT=EDD6BBA5787DA2BF6A1ADF297DB98281 - -I=296 -KEY=302BEB9AA2ACB3594D7E50859C187294804C81121A9357580ABAD94863434BF2 -CT=EDD6BBA5787DA2BF6A1ADF297DB98281 -PT=4A51E54F4F81469A06F6001F2F32F4AC - -I=297 -KEY=3270FC87B4DC04FDD3F20C01407BE123CA1D645D551211C20C4CD9574C71BF5E -CT=4A51E54F4F81469A06F6001F2F32F4AC -PT=F7A2303EA59907BCC32AA4FC5A6DE448 - -I=298 -KEY=C85326465BF46A442BC1E544F9041C4A3DBF5463F08B167ECF667DAB161C5B16 -CT=F7A2303EA59907BCC32AA4FC5A6DE448 -PT=2274E43F9F8A7081DF74D5225EC28AD8 - -I=299 -KEY=A54E889A4D9FFBF993C53A9DD3B951391FCBB05C6F0166FF1012A88948DED1CE -CT=2274E43F9F8A7081DF74D5225EC28AD8 -PT=0C8358EC431313223B59126BDBB36571 - -I=300 -KEY=FA14699C20CFFE7DB68786E6117F95851348E8B02C1275DD2B4BBAE2936DB4BF -CT=0C8358EC431313223B59126BDBB36571 -PT=03237A81EEA2EAFBB5AC0B3E635CC1AC - -I=301 -KEY=B3744022A5397A735A4271261A2C96DF106B9231C2B09F269EE7B1DCF0317513 -CT=03237A81EEA2EAFBB5AC0B3E635CC1AC -PT=409EBF7DF31FD9557118B1B5CAB5EBE3 - -I=302 -KEY=8C7A22A934DCBC5E084E472DBAE4848350F52D4C31AF4673EFFF00693A849EF0 -CT=409EBF7DF31FD9557118B1B5CAB5EBE3 -PT=6CF5C9CF4A62C668B6481F7A12EE43DB - -I=303 -KEY=DB0497ED308C95BC9703265174B654D23C00E4837BCD801B59B71F13286ADD2B -CT=6CF5C9CF4A62C668B6481F7A12EE43DB -PT=D8A84E93CFF3EB9DC891333BDA5F3560 - -I=304 -KEY=7A88D30D4CC9AB8EFA76139B68F0028AE4A8AA10B43E6B8691262C28F235E84B -CT=D8A84E93CFF3EB9DC891333BDA5F3560 -PT=009E0C2454E321326336CC56D0660F91 - -I=305 -KEY=55A78B8839B395B552630641648DFCE5E436A634E0DD4AB4F210E07E2253E7DA -CT=009E0C2454E321326336CC56D0660F91 -PT=EBC89334F29560D9B9AEAE2F1D9DC65B - -I=306 -KEY=B41A907C82EDE32C6C1FD0DFED0A232D0FFE350012482A6D4BBE4E513FCE2181 -CT=EBC89334F29560D9B9AEAE2F1D9DC65B -PT=4DA63E94EBB4DA255800C9B25068E47E - -I=307 -KEY=3E428E8A77067008EFDE7BD6174B05B742580B94F9FCF04813BE87E36FA6C5FF -CT=4DA63E94EBB4DA255800C9B25068E47E -PT=6833E2CEFA8CF4B5B4607FA49D7B658D - -I=308 -KEY=39D17AE8C7232386F8339427E4A79AAC2A6BE95A037004FDA7DEF847F2DDA072 -CT=6833E2CEFA8CF4B5B4607FA49D7B658D -PT=41D882B653BEFEEEB9AE354F5ABCC058 - -I=309 -KEY=E8D52C97FA4149312A45D3EFE0A326086BB36BEC50CEFA131E70CD08A861602A -CT=41D882B653BEFEEEB9AE354F5ABCC058 -PT=D54A329BCF56B703BE0F02EE3AACB933 - -I=310 -KEY=D36FAED6CF436A491111890449BC3C66BEF959779F984D10A07FCFE692CDD919 -CT=D54A329BCF56B703BE0F02EE3AACB933 -PT=5FAAEB95E0F9D0C3C43BF725DADC9595 - -I=311 -KEY=9D7BCBB15816A0A941BBB787D2EEA155E153B2E27F619DD3644438C348114C8C -CT=5FAAEB95E0F9D0C3C43BF725DADC9595 -PT=BC699D5E82FD43B45A7B925E8C1A2F3C - -I=312 -KEY=F2EB78917ECAC2E77C19B892E846AE715D3A2FBCFD9CDE673E3FAA9DC40B63B0 -CT=BC699D5E82FD43B45A7B925E8C1A2F3C -PT=773D115B40F0E9EF780B2D10846FA684 - -I=313 -KEY=B10B9F0CECA554749EC178F3C63547DD2A073EE7BD6C37884634878D4064C534 -CT=773D115B40F0E9EF780B2D10846FA684 -PT=50095809CC96520EB8E3A66F499EE147 - -I=314 -KEY=E86E52AEB04DE0D3DC85A91E9B10D2677A0E66EE71FA6586FED721E209FA2473 -CT=50095809CC96520EB8E3A66F499EE147 -PT=6994CF8BA4C731CA33DAFE33D2A0BF94 - -I=315 -KEY=44C3C8A2F0F931926AC73F3E5351B114139AA965D53D544CCD0DDFD1DB5A9BE7 -CT=6994CF8BA4C731CA33DAFE33D2A0BF94 -PT=981902A8FD71DF8B67D52E6FC2813B90 - -I=316 -KEY=2D309D3D2603EC7E7B4EA626E9BDECFE8B83ABCD284C8BC7AAD8F1BE19DBA077 -CT=981902A8FD71DF8B67D52E6FC2813B90 -PT=35FA9A93AE142F562E62771991752B78 - -I=317 -KEY=E80939BCB4DB83768EBAD3CF2DD3F270BE79315E8658A49184BA86A788AE8B0F -CT=35FA9A93AE142F562E62771991752B78 -PT=A3651DBF8585004F0729AF4CA615C674 - -I=318 -KEY=BF1A4C57D4434FA59A2E45DB589AA16F1D1C2CE103DDA4DE839329EB2EBB4D7B -CT=A3651DBF8585004F0729AF4CA615C674 -PT=AF31F082CACEB768627B93A4D3E5349A - -I=319 -KEY=6EB47730BACAAB2207A3D12B0652B0CDB22DDC63C91313B6E1E8BA4FFD5E79E1 -CT=AF31F082CACEB768627B93A4D3E5349A -PT=57B75D2B640F45DB2D4A1F71F08545A5 - -I=320 -KEY=3EB0F3D31E648E260FE9F6FA8812ADD1E59A8148AD1C566DCCA2A53E0DDB3C44 -CT=57B75D2B640F45DB2D4A1F71F08545A5 -PT=A812DA38D7B82DF310366FA62FFD11E6 - -I=321 -KEY=0409A87F024E710C27E456CA170B60184D885B707AA47B9EDC94CA9822262DA2 -CT=A812DA38D7B82DF310366FA62FFD11E6 -PT=447F235914368F2BECD5FF98D1A34205 - -I=322 -KEY=7DE3A1E7234BF755908324E13DF413EB09F778296E92F4B530413500F3856FA7 -CT=447F235914368F2BECD5FF98D1A34205 -PT=5205860E4562B5CD6748EF89BF2791E9 - -I=323 -KEY=12EE9519335A2D827649D4EB047EB5255BF2FE272BF041785709DA894CA2FE4E -CT=5205860E4562B5CD6748EF89BF2791E9 -PT=30C0229AFDFF59E24426ACAD8D4AEFDB - -I=324 -KEY=78FF32A055D51E0A9D6E77D838AE72AD6B32DCBDD60F189A132F7624C1E81195 -CT=30C0229AFDFF59E24426ACAD8D4AEFDB -PT=FF467C6E0F82F5D2F9487DDBDB43EFB3 - -I=325 -KEY=6E49FA4CDEFC70619F739B488DD434969474A0D3D98DED48EA670BFF1AABFE26 -CT=FF467C6E0F82F5D2F9487DDBDB43EFB3 -PT=7E375B3D13871B09CA4D3357AC5EBB0E - -I=326 -KEY=90791666C996FF15EED1E20BAFB6B4B3EA43FBEECA0AF641202A38A8B6F54528 -CT=7E375B3D13871B09CA4D3357AC5EBB0E -PT=E64A319F6FBD96BD799760C4077F9713 - -I=327 -KEY=7F0D0CAB938585CF65726A6CB01DE8B00C09CA71A5B760FC59BD586CB18AD23B -CT=E64A319F6FBD96BD799760C4077F9713 -PT=1487C8488C675BD46FAF2EEC0BC7AE7E - -I=328 -KEY=7B429E6D59D4D65E16ED325F49E93D9C188E023929D03B2836127680BA4D7C45 -CT=1487C8488C675BD46FAF2EEC0BC7AE7E -PT=1F103E64A4F5239C9157E70487C50941 - -I=329 -KEY=AF20B02C3C5BD4E33E34359B86BBF2CF079E3C5D8D2518B4A74591843D887504 -CT=1F103E64A4F5239C9157E70487C50941 -PT=24C8481DD1A2245735597A18A2433E41 - -I=330 -KEY=E4F3CE6AFF9926837BAAB04C311F72A7235674405C873CE3921CEB9C9FCB4B45 -CT=24C8481DD1A2245735597A18A2433E41 -PT=3D9E715A686DE9AF8EE37AF54F82AA8A - -I=331 -KEY=A9BACBEC55AA453A83FF82CFDDB7F2F91EC8051A34EAD54C1CFF9169D049E1CF -CT=3D9E715A686DE9AF8EE37AF54F82AA8A -PT=B330735D9AB5B96501CDAF61A8EAD19F - -I=332 -KEY=5826BE9127DB557D401AF4DE6343F8AFADF87647AE5F6C291D323E0878A33050 -CT=B330735D9AB5B96501CDAF61A8EAD19F -PT=61AE40475EA11DBCC364F5377673CE37 - -I=333 -KEY=A8F0146E46A5391D0663380DF9F1FD6FCC563600F0FE7195DE56CB3F0ED0FE67 -CT=61AE40475EA11DBCC364F5377673CE37 -PT=525C1ED538B23D7CFA4A43114CF35BD4 - -I=334 -KEY=20F90A51E7A0BB9B88AE1DD28C8B484A9E0A28D5C84C4CE9241C882E4223A5B3 -CT=525C1ED538B23D7CFA4A43114CF35BD4 -PT=C2957E002E35236D455F53006495E4B7 - -I=335 -KEY=A71CC695B7AEB0D5148FA622536669385C9F56D5E6796F846143DB2E26B64104 -CT=C2957E002E35236D455F53006495E4B7 -PT=76F9C97A4B414E5DE532082BB12F5362 - -I=336 -KEY=617CF5726F26BD9A3B52FC0D902A97AD2A669FAFAD3821D98471D30597991266 -CT=76F9C97A4B414E5DE532082BB12F5362 -PT=F4D9E814D4C61B2FB1D7CDCCBAF14AA1 - -I=337 -KEY=D4DBBCC269A61933E4D63C3BDA5F522EDEBF77BB79FE3AF635A61EC92D6858C7 -CT=F4D9E814D4C61B2FB1D7CDCCBAF14AA1 -PT=6B51AF38B42F226D62474A97BD001FFF - -I=338 -KEY=512FAF06A5885D032A885EC030AF3C18B5EED883CDD1189B57E1545E90684738 -CT=6B51AF38B42F226D62474A97BD001FFF -PT=868C58D6B805CF8F9EB04A8BA123371A - -I=339 -KEY=BDD2CB78E9B554FC7FEEEC05D02309F23362805575D4D714C9511ED5314B7022 -CT=868C58D6B805CF8F9EB04A8BA123371A -PT=1752558A1F90975140CA41F68BE5333F - -I=340 -KEY=15CC46826BFD5B45ABAE9B0B2756D39C2430D5DF6A444045899B5F23BAAE431D -CT=1752558A1F90975140CA41F68BE5333F -PT=68801EAB4042E7390E64AA53C38C1D15 - -I=341 -KEY=DF5FB425C5B25E15EA717736D8ABE6644CB0CB742A06A77C87FFF57079225E08 -CT=68801EAB4042E7390E64AA53C38C1D15 -PT=02FE87211909D8954EC90EF53100F26D - -I=342 -KEY=CD73FCED5EBA6038DD8B8A000111BEF94E4E4C55330F7FE9C936FB854822AC65 -CT=02FE87211909D8954EC90EF53100F26D -PT=3A51FAFD22A2CC95B532023A37BBF0FE - -I=343 -KEY=EF890ED47D9F1581CC98C88F3BF7F88D741FB6A811ADB37C7C04F9BF7F995C9B -CT=3A51FAFD22A2CC95B532023A37BBF0FE -PT=D233A6BBC315BA5F4630AE7F99F77116 - -I=344 -KEY=AA9CA1A7DFA24E1936E49D34054F7749A62C1013D2B809233A3457C0E66E2D8D -CT=D233A6BBC315BA5F4630AE7F99F77116 -PT=E6B9619D7B0E1DF6CFE79FD51533406B - -I=345 -KEY=ADC4161B346687F98D4CB5B661662A8A4095718EA9B614D5F5D3C815F35D6DE6 -CT=E6B9619D7B0E1DF6CFE79FD51533406B -PT=A746D31BCB29F7512E3F6E5EFD14FDAD - -I=346 -KEY=9C1CA3776C9ED13D220453C8AEFA0ECDE7D3A295629FE384DBECA64B0E49904B -CT=A746D31BCB29F7512E3F6E5EFD14FDAD -PT=B2489A51878848EC37E6782FB2110122 - -I=347 -KEY=B64A5B45ABFDEC3EF8164FCEAE89919E559B38C4E517AB68EC0ADE64BC589169 -CT=B2489A51878848EC37E6782FB2110122 -PT=EF77F9367A063FDB874C9FC96983EAD1 - -I=348 -KEY=AEFFDEE2501961FEEB985134E2B651EDBAECC1F29F1194B36B4641ADD5DB7BB8 -CT=EF77F9367A063FDB874C9FC96983EAD1 -PT=4ECFF4DA51BB2BE1EF8E85C4BBE51C69 - -I=349 -KEY=6B28BA96CEB25B3862F413A2CBED4889F4233528CEAABF5284C8C4696E3E67D1 -CT=4ECFF4DA51BB2BE1EF8E85C4BBE51C69 -PT=0CAEAF484505A1AF13BB0ADCC665F91C - -I=350 -KEY=2062889724A47DD541F1F0A3FC8C5952F88D9A608BAF1EFD9773CEB5A85B9ECD -CT=0CAEAF484505A1AF13BB0ADCC665F91C -PT=6C75CA469CACCCE29CAE88202E02727C - -I=351 -KEY=C2115A8A6EE164B944A8C8128EBAB8E694F850261703D21F0BDD46958659ECB1 -CT=6C75CA469CACCCE29CAE88202E02727C -PT=567060CEFF3AEDDE8AB5823450E35967 - -I=352 -KEY=C3D2704E15936C6916073E234D0012CCC28830E8E8393FC18168C4A1D6BAB5D6 -CT=567060CEFF3AEDDE8AB5823450E35967 -PT=E04F927E409060080EC530D5C344CA24 - -I=353 -KEY=49173A9FB3283181B71264E3FB5591FA22C7A296A8A95FC98FADF47415FE7FF2 -CT=E04F927E409060080EC530D5C344CA24 -PT=4D473408396C17D4BA3DBB63B46E7727 - -I=354 -KEY=8BF3DDDC9217496E29F46E61233D62B66F80969E91C5481D35904F17A19008D5 -CT=4D473408396C17D4BA3DBB63B46E7727 -PT=BB6779933AC9E435C637CDA146A04284 - -I=355 -KEY=6ACA3C31248BFBB5BB9FD54C4B31BC21D4E7EF0DAB0CAC28F3A782B6E7304A51 -CT=BB6779933AC9E435C637CDA146A04284 -PT=5C2129A55114540ED68591C60E45D6CF - -I=356 -KEY=1A270DAD402DC752332671216A6C3BFF88C6C6A8FA18F82625221370E9759C9E -CT=5C2129A55114540ED68591C60E45D6CF -PT=57790B87F69BF1C007E563A82987EEAE - -I=357 -KEY=6E39E75268AC2C51ABE11CE3CE16CAF3DFBFCD2F0C8309E622C770D8C0F27230 -CT=57790B87F69BF1C007E563A82987EEAE -PT=58790B192C8B90B76F34990E28A6689A - -I=358 -KEY=2367A67114D722A79F9434B5A418BEEB87C6C636200899514DF3E9D6E8541AAA -CT=58790B192C8B90B76F34990E28A6689A -PT=599CA8B58EFE301A87CE72540CCB4067 - -I=359 -KEY=A4CE195518F7E36D7E0D5C9666802411DE5A6E83AEF6A94BCA3D9B82E49F5ACD -CT=599CA8B58EFE301A87CE72540CCB4067 -PT=4483131C7E03089F898166A5B3E85E3A - -I=360 -KEY=73C5204211D3648DAAF5FE071186C0E99AD97D9FD0F5A1D443BCFD27577704F7 -CT=4483131C7E03089F898166A5B3E85E3A -PT=DBF64C5A0897B343BAF7047A6C564D02 - -I=361 -KEY=1A3831AFF223BB2FE79C8EF8845E553C412F31C5D8621297F94BF95D3B2149F5 -CT=DBF64C5A0897B343BAF7047A6C564D02 -PT=B24420DA45E3620B619978CB09F1860C - -I=362 -KEY=31EF243EF87C32148751F8F299151042F36B111F9D81709C98D2819632D0CFF9 -CT=B24420DA45E3620B619978CB09F1860C -PT=12B466EF6AE6F28AF78AC184DB8B3C83 - -I=363 -KEY=9E935E6F5D76BEE2E639F2880C8352EEE1DF77F0F76782166F584012E95BF37A -CT=12B466EF6AE6F28AF78AC184DB8B3C83 -PT=518E89A35CF55D591DE8BB924D8F96E7 - -I=364 -KEY=C6398957838B02B5948A95DCBFBF2813B051FE53AB92DF4F72B0FB80A4D4659D -CT=518E89A35CF55D591DE8BB924D8F96E7 -PT=1FDF7FE52BD46EF54F1F7A6242B04BD8 - -I=365 -KEY=5764E84D9000518C185717581E0D70E5AF8E81B68046B1BA3DAF81E2E6642E45 -CT=1FDF7FE52BD46EF54F1F7A6242B04BD8 -PT=2C68E67C37B50056E80DC09B9ED84AA8 - -I=366 -KEY=5F8CB51BF30B954B4AC09620B0A20FCA83E667CAB7F3B1ECD5A2417978BC64ED -CT=2C68E67C37B50056E80DC09B9ED84AA8 -PT=14CC2D821B03BE21355A779B9066BE41 - -I=367 -KEY=50B32E6D62EE3B8CE2DD5797BA70D8D2972A4A48ACF00FCDE0F836E2E8DADAAC -CT=14CC2D821B03BE21355A779B9066BE41 -PT=BB09D339888C27294E73326E64AC3B21 - -I=368 -KEY=E1B2199CAF1C3FA78E973ACF5C3AC8702C239971247C28E4AE8B048C8C76E18D -CT=BB09D339888C27294E73326E64AC3B21 -PT=BCFBD8255802CC8233AEA86E49089328 - -I=369 -KEY=3403D2498A4562E73734D065E9B44AD890D841547C7EE4669D25ACE2C57E72A5 -CT=BCFBD8255802CC8233AEA86E49089328 -PT=5A919AC72F12DB1FAB8E4876FBA8842B - -I=370 -KEY=B979FA15F93E5ACA1F6E452C9053751BCA49DB93536C3F7936ABE4943ED6F68E -CT=5A919AC72F12DB1FAB8E4876FBA8842B -PT=BDB03BD29FD3828AF1AE8C729F37F88A - -I=371 -KEY=A8CDF9FE3C0227A9107C700C404AE39777F9E041CCBFBDF3C70568E6A1E10E04 -CT=BDB03BD29FD3828AF1AE8C729F37F88A -PT=0AAC43CE316476F3A532D44B4DFBF4B8 - -I=372 -KEY=B4D497FBD5DE2CA68FF60C701E208A257D55A38FFDDBCB006237BCADEC1AFABC -CT=0AAC43CE316476F3A532D44B4DFBF4B8 -PT=853A5EE7CB3C4BB3F0120BB2CFFB4436 - -I=373 -KEY=A019DCC09A4CAAA3772BF4C54C8828E9F86FFD6836E780B39225B71F23E1BE8A -CT=853A5EE7CB3C4BB3F0120BB2CFFB4436 -PT=B525599C918446AF4EA9F6965F3971EA - -I=374 -KEY=238BF8B851B0864F9BEC8E242B7795D14D4AA4F4A763C61CDC8C41897CD8CF60 -CT=B525599C918446AF4EA9F6965F3971EA -PT=A8377EC293D41F74A0A2DB66BA7D3D2F - -I=375 -KEY=AF9E313988F294AE6A8155BC76F2514BE57DDA3634B7D9687C2E9AEFC6A5F24F -CT=A8377EC293D41F74A0A2DB66BA7D3D2F -PT=301BD4D318101A02166EBC23DED9C12D - -I=376 -KEY=3B6186F7ACE8E9B022DDE0ECF5D808D3D5660EE52CA7C36A6A4026CC187C3362 -CT=301BD4D318101A02166EBC23DED9C12D -PT=05BD0686BE53B94FB1B42AE407BE081C - -I=377 -KEY=EADED20A0F405D9E3AAE404FB074162ED0DB086392F47A25DBF40C281FC23B7E -CT=05BD0686BE53B94FB1B42AE407BE081C -PT=7A3AF681F2043806EDB761F65D9A6C3A - -I=378 -KEY=AA6F474F5F5FF513FC992E4232061B75AAE1FEE260F0422336436DDE42585744 -CT=7A3AF681F2043806EDB761F65D9A6C3A -PT=3C297DE35CCF4E6E0A800B9A3EE37C95 - -I=379 -KEY=68BFE30863F135A09B81BE2800CBBC3796C883013C3F0C4D3CC366447CBB2BD1 -CT=3C297DE35CCF4E6E0A800B9A3EE37C95 -PT=5F8AAC15C74CC7EA87A1AC185103A9D7 - -I=380 -KEY=9093DEBE66D714180BEB8FE51C4807ADC9422F14FB73CBA7BB62CA5C2DB88206 -CT=5F8AAC15C74CC7EA87A1AC185103A9D7 -PT=083AF3AF30961FD5A077F5564D55E9E9 - -I=381 -KEY=A1E1049159A94DF638092C90F7707CD7C178DCBBCBE5D4721B153F0A60ED6BEF -CT=083AF3AF30961FD5A077F5564D55E9E9 -PT=89BEFF6AB40B18ECD9413446E848253A - -I=382 -KEY=7C506732A8863DB1BF61EFC710F22D2348C623D17FEECC9EC2540B4C88A54ED5 -CT=89BEFF6AB40B18ECD9413446E848253A -PT=095B2C04636C9C5BF9735BCA21211EAA - -I=383 -KEY=7283413612863BA1E1B5AE93DF1318F5419D0FD51C8250C53B275086A984507F -CT=095B2C04636C9C5BF9735BCA21211EAA -PT=E95DB3DB1E3A478C8A31212B28E0E7BC - -I=384 -KEY=BE861CED86D725162D938727D7AEFC1BA8C0BC0E02B81749B11671AD8164B7C3 -CT=E95DB3DB1E3A478C8A31212B28E0E7BC -PT=9927F1D7EF0631500E1DF058932BF320 - -I=385 -KEY=45AA89CBCE192CEEC22BF5F33DDE0E8D31E74DD9EDBE2619BF0B81F5124F44E3 -CT=9927F1D7EF0631500E1DF058932BF320 -PT=4B1147179F2AF27E5C9DBB7F01CC56A8 - -I=386 -KEY=B08A08DABC52884E9EBB310236815BFE7AF60ACE7294D467E3963A8A1383124B -CT=4B1147179F2AF27E5C9DBB7F01CC56A8 -PT=E9752A7D47734DACAC6E74A1A3EC4956 - -I=387 -KEY=34B4424CE75A4A1BCE9E6C825F5F0DC1938320B335E799CB4FF84E2BB06F5B1D -CT=E9752A7D47734DACAC6E74A1A3EC4956 -PT=AB2D652BCEE42804C5155980DA02CECC - -I=388 -KEY=F9954BB1A793565A79AA2B9DF408A34A38AE4598FB03B1CF8AED17AB6A6D95D1 -CT=AB2D652BCEE42804C5155980DA02CECC -PT=3C6651362E89F6C6B28C04CA22F110EC - -I=389 -KEY=9548931715FB259E318020E30D68165604C814AED58A470938611361489C853D -CT=3C6651362E89F6C6B28C04CA22F110EC -PT=15598364698838475AB96F95CFCF3342 - -I=390 -KEY=1CDB0706417BBE66B559237109353221119197CABC027F4E62D87CF48753B67F -CT=15598364698838475AB96F95CFCF3342 -PT=D8B3BB941893206E1CA6654B81F403E4 - -I=391 -KEY=8C4AD897B595252B0987673F45EE73F2C9222C5EA4915F207E7E19BF06A7B59B -CT=D8B3BB941893206E1CA6654B81F403E4 -PT=ECE471CC2FF45C26C7143C41702F90D2 - -I=392 -KEY=A6D3DF3279B7405256C0D22DA240524125C65D928B650306B96A25FE76882549 -CT=ECE471CC2FF45C26C7143C41702F90D2 -PT=AB387AE5A5FC892C311D97C22467940D - -I=393 -KEY=36F250F7C3906C7E0020055422CDB8B28EFE27772E998A2A8877B23C52EFB144 -CT=AB387AE5A5FC892C311D97C22467940D -PT=FF48C2C77D5F52DF27C4060DF7F895D7 - -I=394 -KEY=4FF045275860B943EDE02C802F34B71B71B6E5B053C6D8F5AFB3B431A5172493 -CT=FF48C2C77D5F52DF27C4060DF7F895D7 -PT=221BC444E2A6A7F8DE9DA16AB01EB2AC - -I=395 -KEY=E15B4E0E242FBABF1D47E9DBE6D0660253AD21F4B1607F0D712E155B1509963F -CT=221BC444E2A6A7F8DE9DA16AB01EB2AC -PT=DE252D19973ABD9F182049D39455784B - -I=396 -KEY=401023A611A3133C895A3684AB3E7C9D8D880CED265AC292690E5C88815CEE74 -CT=DE252D19973ABD9F182049D39455784B -PT=843163BD101982EE948039915C8F60D8 - -I=397 -KEY=B9DDF52C271F143E523532E45E6F368D09B96F503643407CFD8E6519DDD38EAC -CT=843163BD101982EE948039915C8F60D8 -PT=6FD9D36B751854C3417F29E8F3B654D9 - -I=398 -KEY=AC7F45F8630CE02525F9F4941B4E13206660BC3B435B14BFBCF14CF12E65DA75 -CT=6FD9D36B751854C3417F29E8F3B654D9 -PT=E1268BA8A1473DEDE6CA64DDF2C8B805 - -I=399 -KEY=DE11FF0A429E1CD3DE016DAC294F771187463793E21C29525A3B282CDCAD6270 -CT=E1268BA8A1473DEDE6CA64DDF2C8B805 -PT=4DE0C6DF7CB1697284604D60271BC59A - + +========================= + +FILENAME: "ecb_d_m.txt" + +Electronic Codebook (ECB) Mode - DECRYPTION +Monte Carlo Test + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========================= + +KEYSIZE=128 + +I=0 +KEY=00000000000000000000000000000000 +CT=00000000000000000000000000000000 +PT=44416AC2D1F53C583303917E6BE9EBE0 + +I=1 +KEY=44416AC2D1F53C583303917E6BE9EBE0 +CT=44416AC2D1F53C583303917E6BE9EBE0 +PT=E3FD51123B48A2E2AB1DB29894202222 + +I=2 +KEY=A7BC3BD0EABD9EBA981E23E6FFC9C9C2 +CT=E3FD51123B48A2E2AB1DB29894202222 +PT=877B88A77AEF04F05546539E17259F53 + +I=3 +KEY=20C7B37790529A4ACD587078E8EC5691 +CT=877B88A77AEF04F05546539E17259F53 +PT=C7A71C1B46261602EB1EE48FDA8155A4 + +I=4 +KEY=E760AF6CD6748C48264694F7326D0335 +CT=C7A71C1B46261602EB1EE48FDA8155A4 +PT=6B6AC8E00FAF7E045ECCFC426A137221 + +I=5 +KEY=8C0A678CD9DBF24C788A68B5587E7114 +CT=6B6AC8E00FAF7E045ECCFC426A137221 +PT=3F252821FA79AFC3F1798B343AAD41EE + +I=6 +KEY=B32F4FAD23A25D8F89F3E38162D330FA +CT=3F252821FA79AFC3F1798B343AAD41EE +PT=0B55C691E1F97205D137FF34478E5BC9 + +I=7 +KEY=B87A893CC25B2F8A58C41CB5255D6B33 +CT=0B55C691E1F97205D137FF34478E5BC9 +PT=F6CCC1CC18A3199D6427EDCA0BB2DF90 + +I=8 +KEY=4EB648F0DAF836173CE3F17F2EEFB4A3 +CT=F6CCC1CC18A3199D6427EDCA0BB2DF90 +PT=0CDD7D9734B1515C73DDA60EFF28CD89 + +I=9 +KEY=426B3567EE49674B4F3E5771D1C7792A +CT=0CDD7D9734B1515C73DDA60EFF28CD89 +PT=3E813131EDD440D9054799CEA508FF6F + +I=10 +KEY=7CEA0456039D27924A79CEBF74CF8645 +CT=3E813131EDD440D9054799CEA508FF6F +PT=8C6859BD0B6E078FAA6B686297653232 + +I=11 +KEY=F0825DEB08F3201DE012A6DDE3AAB477 +CT=8C6859BD0B6E078FAA6B686297653232 +PT=C966A4106C1DCE062D1346EB5E5133BB + +I=12 +KEY=39E4F9FB64EEEE1BCD01E036BDFB87CC +CT=C966A4106C1DCE062D1346EB5E5133BB +PT=4F4AE38B53FD7800F0E9F5C214E16F2A + +I=13 +KEY=76AE1A703713961B3DE815F4A91AE8E6 +CT=4F4AE38B53FD7800F0E9F5C214E16F2A +PT=C73A033491DC0B6A77FEA2FBCC9D305E + +I=14 +KEY=B1941944A6CF9D714A16B70F6587D8B8 +CT=C73A033491DC0B6A77FEA2FBCC9D305E +PT=C928C2A05BB44816EFBE6B13E94BC70E + +I=15 +KEY=78BCDBE4FD7BD567A5A8DC1C8CCC1FB6 +CT=C928C2A05BB44816EFBE6B13E94BC70E +PT=A7C1593E7B4BAEE5256D4081337E7CAF + +I=16 +KEY=DF7D82DA86307B8280C59C9DBFB26319 +CT=A7C1593E7B4BAEE5256D4081337E7CAF +PT=7ECD305AC27AEBFA2B8F85F9AC312638 + +I=17 +KEY=A1B0B280444A9078AB4A196413834521 +CT=7ECD305AC27AEBFA2B8F85F9AC312638 +PT=A24D1403A58B94798F5F3565ABFD3B44 + +I=18 +KEY=03FDA683E1C1040124152C01B87E7E65 +CT=A24D1403A58B94798F5F3565ABFD3B44 +PT=5B6E097B3B0E21DCC9CE9970701C7BD5 + +I=19 +KEY=5893AFF8DACF25DDEDDBB571C86205B0 +CT=5B6E097B3B0E21DCC9CE9970701C7BD5 +PT=4E21CEA52B3111AC8F6B204A1F5E65E2 + +I=20 +KEY=16B2615DF1FE347162B0953BD73C6052 +CT=4E21CEA52B3111AC8F6B204A1F5E65E2 +PT=806DDC5C37ADEEBB6FCE4730939D7A99 + +I=21 +KEY=96DFBD01C653DACA0D7ED20B44A11ACB +CT=806DDC5C37ADEEBB6FCE4730939D7A99 +PT=3462F7C6D3E071A0D3ACE7FD79149776 + +I=22 +KEY=A2BD4AC715B3AB6ADED235F63DB58DBD +CT=3462F7C6D3E071A0D3ACE7FD79149776 +PT=AF0FFF307B72284E794C8A64C30299D2 + +I=23 +KEY=0DB2B5F76EC18324A79EBF92FEB7146F +CT=AF0FFF307B72284E794C8A64C30299D2 +PT=E482B613FBCF9C4422D85E3160B1FB0F + +I=24 +KEY=E93003E4950E1F608546E1A39E06EF60 +CT=E482B613FBCF9C4422D85E3160B1FB0F +PT=FADC8EF9C95540AD69897DECAB2D50D5 + +I=25 +KEY=13EC8D1D5C5B5FCDECCF9C4F352BBFB5 +CT=FADC8EF9C95540AD69897DECAB2D50D5 +PT=2A765E237FB5230D792D455596A17118 + +I=26 +KEY=399AD33E23EE7CC095E2D91AA38ACEAD +CT=2A765E237FB5230D792D455596A17118 +PT=0887DA8012C7F95BD6ADB18D1ED3C2DB + +I=27 +KEY=311D09BE3129859B434F6897BD590C76 +CT=0887DA8012C7F95BD6ADB18D1ED3C2DB +PT=3BB831A7B6FAC3649176471012FAD1C1 + +I=28 +KEY=0AA5381987D346FFD2392F87AFA3DDB7 +CT=3BB831A7B6FAC3649176471012FAD1C1 +PT=E4F8629AB3489A0945B8B7188B953DE5 + +I=29 +KEY=EE5D5A83349BDCF69781989F2436E052 +CT=E4F8629AB3489A0945B8B7188B953DE5 +PT=1D4B0B5B321EB711939AB481239E2541 + +I=30 +KEY=F31651D806856BE7041B2C1E07A8C513 +CT=1D4B0B5B321EB711939AB481239E2541 +PT=71A368D5A33665D6FF9F33FECAFC6884 + +I=31 +KEY=82B5390DA5B30E31FB841FE0CD54AD97 +CT=71A368D5A33665D6FF9F33FECAFC6884 +PT=8ACF418080075BA23B05A52552773B84 + +I=32 +KEY=087A788D25B45593C081BAC59F239613 +CT=8ACF418080075BA23B05A52552773B84 +PT=E0E6058735F4FE765E882521D769FB41 + +I=33 +KEY=E89C7D0A1040ABE59E099FE4484A6D52 +CT=E0E6058735F4FE765E882521D769FB41 +PT=70DCE91F818DF2CDC4269F1B4EA0A465 + +I=34 +KEY=9840941591CD59285A2F00FF06EAC937 +CT=70DCE91F818DF2CDC4269F1B4EA0A465 +PT=E2F809D6DD77D72EF6DB5A82C42BF1CF + +I=35 +KEY=7AB89DC34CBA8E06ACF45A7DC2C138F8 +CT=E2F809D6DD77D72EF6DB5A82C42BF1CF +PT=0741D11DDD877957E753ECF8DB91C72B + +I=36 +KEY=7DF94CDE913DF7514BA7B6851950FFD3 +CT=0741D11DDD877957E753ECF8DB91C72B +PT=03E411012CA3B5B3CC163677D4B52456 + +I=37 +KEY=7E1D5DDFBD9E42E287B180F2CDE5DB85 +CT=03E411012CA3B5B3CC163677D4B52456 +PT=0270D90790EF8347ACFB87EB2FEC2710 + +I=38 +KEY=7C6D84D82D71C1A52B4A0719E209FC95 +CT=0270D90790EF8347ACFB87EB2FEC2710 +PT=3AE40270512374AF4022638E0A7A6D8E + +I=39 +KEY=468986A87C52B50A6B686497E873911B +CT=3AE40270512374AF4022638E0A7A6D8E +PT=8008D87E928A980FECA08CAF1EC91DDA + +I=40 +KEY=C6815ED6EED82D0587C8E838F6BA8CC1 +CT=8008D87E928A980FECA08CAF1EC91DDA +PT=1D479A54832FF1A81D30008EFDF16A34 + +I=41 +KEY=DBC6C4826DF7DCAD9AF8E8B60B4BE6F5 +CT=1D479A54832FF1A81D30008EFDF16A34 +PT=9E731FECD9A767BDA0C84B4C4D552BD3 + +I=42 +KEY=45B5DB6EB450BB103A30A3FA461ECD26 +CT=9E731FECD9A767BDA0C84B4C4D552BD3 +PT=C2211A6B16CD27C6C73A5C3C1A0132AC + +I=43 +KEY=8794C105A29D9CD6FD0AFFC65C1FFF8A +CT=C2211A6B16CD27C6C73A5C3C1A0132AC +PT=7E523DD6F25706F971F020F88FFA0CF7 + +I=44 +KEY=F9C6FCD350CA9A2F8CFADF3ED3E5F37D +CT=7E523DD6F25706F971F020F88FFA0CF7 +PT=0EDC01C6C1A8DA6A7C9EEE3587CB098E + +I=45 +KEY=F71AFD1591624045F064310B542EFAF3 +CT=0EDC01C6C1A8DA6A7C9EEE3587CB098E +PT=EE479106871DA872632794633B1ACF0E + +I=46 +KEY=195D6C13167FE8379343A5686F3435FD +CT=EE479106871DA872632794633B1ACF0E +PT=7EC1A4578D911F336184DACCCA92D943 + +I=47 +KEY=679CC8449BEEF704F2C77FA4A5A6ECBE +CT=7EC1A4578D911F336184DACCCA92D943 +PT=53715F25AE02513F181E3DECBB007803 + +I=48 +KEY=34ED976135ECA63BEAD942481EA694BD +CT=53715F25AE02513F181E3DECBB007803 +PT=304D5764B5206F8204A69D1BED11FA62 + +I=49 +KEY=04A0C00580CCC9B9EE7FDF53F3B76EDF +CT=304D5764B5206F8204A69D1BED11FA62 +PT=5A7590ADEF208BFD808499A2BFE9B011 + +I=50 +KEY=5ED550A86FEC42446EFB46F14C5EDECE +CT=5A7590ADEF208BFD808499A2BFE9B011 +PT=2502C0F68A721A93ECE8D7B6C2097BA4 + +I=51 +KEY=7BD7905EE59E58D7821391478E57A56A +CT=2502C0F68A721A93ECE8D7B6C2097BA4 +PT=1C814E26A6464086D606C7B4C6DFD85B + +I=52 +KEY=6756DE7843D81851541556F348887D31 +CT=1C814E26A6464086D606C7B4C6DFD85B +PT=9D55D6EA99BA391190068205DD9AE69C + +I=53 +KEY=FA030892DA622140C413D4F695129BAD +CT=9D55D6EA99BA391190068205DD9AE69C +PT=9D1212D0BD8C26422EEFF4DDB16B2EF3 + +I=54 +KEY=67111A4267EE0702EAFC202B2479B55E +CT=9D1212D0BD8C26422EEFF4DDB16B2EF3 +PT=54DF71E70141E1712449CDC1AC7D07F6 + +I=55 +KEY=33CE6BA566AFE673CEB5EDEA8804B2A8 +CT=54DF71E70141E1712449CDC1AC7D07F6 +PT=AF3DE6F3510978928C129CFC19FB29B4 + +I=56 +KEY=9CF38D5637A69EE142A7711691FF9B1C +CT=AF3DE6F3510978928C129CFC19FB29B4 +PT=830DB7014774C7DF870C8456BC0162AB + +I=57 +KEY=1FFE3A5770D2593EC5ABF5402DFEF9B7 +CT=830DB7014774C7DF870C8456BC0162AB +PT=6606C0A36A18BEFF33485F95B82C30E7 + +I=58 +KEY=79F8FAF41ACAE7C1F6E3AAD595D2C950 +CT=6606C0A36A18BEFF33485F95B82C30E7 +PT=4B1E64672B89056DF693E73B419E786E + +I=59 +KEY=32E69E933143E2AC00704DEED44CB13E +CT=4B1E64672B89056DF693E73B419E786E +PT=1877DEEAFF10A5A3F5E9A811BF7595BA + +I=60 +KEY=2A914079CE53470FF599E5FF6B392484 +CT=1877DEEAFF10A5A3F5E9A811BF7595BA +PT=A11A48215BF59CC53BC8A009DCA3973D + +I=61 +KEY=8B8B085895A6DBCACE5145F6B79AB3B9 +CT=A11A48215BF59CC53BC8A009DCA3973D +PT=E80535676DE8898A3624B8127EC21024 + +I=62 +KEY=638E3D3FF84E5240F875FDE4C958A39D +CT=E80535676DE8898A3624B8127EC21024 +PT=E2977A804EC9A8B03C85234AD3A95B52 + +I=63 +KEY=811947BFB687FAF0C4F0DEAE1AF1F8CF +CT=E2977A804EC9A8B03C85234AD3A95B52 +PT=D776D8BF13F736483862328571C06C61 + +I=64 +KEY=566F9F00A570CCB8FC92EC2B6B3194AE +CT=D776D8BF13F736483862328571C06C61 +PT=3AF7969F3247A0914037209556997164 + +I=65 +KEY=6C98099F97376C29BCA5CCBE3DA8E5CA +CT=3AF7969F3247A0914037209556997164 +PT=4F87DDC715CEE3A9D67645AD920DF74A + +I=66 +KEY=231FD45882F98F806AD38913AFA51280 +CT=4F87DDC715CEE3A9D67645AD920DF74A +PT=9E88CA52E6B0C160E52B23F36882DBA1 + +I=67 +KEY=BD971E0A64494EE08FF8AAE0C727C921 +CT=9E88CA52E6B0C160E52B23F36882DBA1 +PT=CAD26E5881D9D4E52C7595C773E0FDAB + +I=68 +KEY=77457052E5909A05A38D3F27B4C7348A +CT=CAD26E5881D9D4E52C7595C773E0FDAB +PT=C2D0B3D713CFCA5ABB7B9DED14429F37 + +I=69 +KEY=B595C385F65F505F18F6A2CAA085ABBD +CT=C2D0B3D713CFCA5ABB7B9DED14429F37 +PT=DD7AADA7524A4878F7C598C4CBCD9CAB + +I=70 +KEY=68EF6E22A4151827EF333A0E6B483716 +CT=DD7AADA7524A4878F7C598C4CBCD9CAB +PT=A0F33B1FCC3F4A4B0982F0823C4ED3C9 + +I=71 +KEY=C81C553D682A526CE6B1CA8C5706E4DF +CT=A0F33B1FCC3F4A4B0982F0823C4ED3C9 +PT=B22BB23CD68E8779A8C0FC9A350CB756 + +I=72 +KEY=7A37E701BEA4D5154E713616620A5389 +CT=B22BB23CD68E8779A8C0FC9A350CB756 +PT=EA4D96AC54BD8387AD36AC8C855A9D44 + +I=73 +KEY=907A71ADEA195692E3479A9AE750CECD +CT=EA4D96AC54BD8387AD36AC8C855A9D44 +PT=A3B90CFDE355723BC94999784534FA74 + +I=74 +KEY=33C37D50094C24A92A0E03E2A26434B9 +CT=A3B90CFDE355723BC94999784534FA74 +PT=55636C86A64383768CB948FF57B29322 + +I=75 +KEY=66A011D6AF0FA7DFA6B74B1DF5D6A79B +CT=55636C86A64383768CB948FF57B29322 +PT=B29CCDFD8E7BE50892F0D77DD969F97E + +I=76 +KEY=D43CDC2B217442D734479C602CBF5EE5 +CT=B29CCDFD8E7BE50892F0D77DD969F97E +PT=9CF0432822EABDF489B57EDD9CEF7FEA + +I=77 +KEY=48CC9F03039EFF23BDF2E2BDB050210F +CT=9CF0432822EABDF489B57EDD9CEF7FEA +PT=AA753B7D38E807D691005899385DC6DA + +I=78 +KEY=E2B9A47E3B76F8F52CF2BA24880DE7D5 +CT=AA753B7D38E807D691005899385DC6DA +PT=E4F0681527FA7AD3D1E7C78C03FB79FA + +I=79 +KEY=0649CC6B1C8C8226FD157DA88BF69E2F +CT=E4F0681527FA7AD3D1E7C78C03FB79FA +PT=7923AF8E50F378B9C97D2F162348025B + +I=80 +KEY=7F6A63E54C7FFA9F346852BEA8BE9C74 +CT=7923AF8E50F378B9C97D2F162348025B +PT=3BEFAB920CA31A6B8B87E11DF97B42DE + +I=81 +KEY=4485C87740DCE0F4BFEFB3A351C5DEAA +CT=3BEFAB920CA31A6B8B87E11DF97B42DE +PT=4661D6B8004611976A21C69804D102C0 + +I=82 +KEY=02E41ECF409AF163D5CE753B5514DC6A +CT=4661D6B8004611976A21C69804D102C0 +PT=B861DF2279F2AEE4FCFD7D322AD0BE2B + +I=83 +KEY=BA85C1ED39685F87293308097FC46241 +CT=B861DF2279F2AEE4FCFD7D322AD0BE2B +PT=1785745618A541F9454443FFB494F2E9 + +I=84 +KEY=AD00B5BB21CD1E7E6C774BF6CB5090A8 +CT=1785745618A541F9454443FFB494F2E9 +PT=AA7507A80B4CCF33E8B4F09E2D7004F6 + +I=85 +KEY=0775B2132A81D14D84C3BB68E620945E +CT=AA7507A80B4CCF33E8B4F09E2D7004F6 +PT=433412B8F10F81A557AC461823097FC7 + +I=86 +KEY=4441A0ABDB8E50E8D36FFD70C529EB99 +CT=433412B8F10F81A557AC461823097FC7 +PT=EC3206BDB3765876B74952C411D40373 + +I=87 +KEY=A873A61668F8089E6426AFB4D4FDE8EA +CT=EC3206BDB3765876B74952C411D40373 +PT=F7F994027D328FA3D70C9DEABD3BE733 + +I=88 +KEY=5F8A321415CA873DB32A325E69C60FD9 +CT=F7F994027D328FA3D70C9DEABD3BE733 +PT=E2A8419BF86A2408ED8D0274A5CE0E10 + +I=89 +KEY=BD22738FEDA0A3355EA7302ACC0801C9 +CT=E2A8419BF86A2408ED8D0274A5CE0E10 +PT=80FB8CD5243C89D77F503B2F16979F90 + +I=90 +KEY=3DD9FF5AC99C2AE221F70B05DA9F9E59 +CT=80FB8CD5243C89D77F503B2F16979F90 +PT=F7773137F233AE2609C2C9AC36F58224 + +I=91 +KEY=CAAECE6D3BAF84C42835C2A9EC6A1C7D +CT=F7773137F233AE2609C2C9AC36F58224 +PT=F3D0A1DADA4A009E8E4C0EF717469BCD + +I=92 +KEY=397E6FB7E1E5845AA679CC5EFB2C87B0 +CT=F3D0A1DADA4A009E8E4C0EF717469BCD +PT=0AC0FF22EB653A26A3F1F0CFE3808609 + +I=93 +KEY=33BE90950A80BE7C05883C9118AC01B9 +CT=0AC0FF22EB653A26A3F1F0CFE3808609 +PT=28FF865CE11720BB1B56EF49D7D1840D + +I=94 +KEY=1B4116C9EB979EC71EDED3D8CF7D85B4 +CT=28FF865CE11720BB1B56EF49D7D1840D +PT=001FAF58E22F5E8ED6BCC7FD581D7C2F + +I=95 +KEY=1B5EB99109B8C049C86214259760F99B +CT=001FAF58E22F5E8ED6BCC7FD581D7C2F +PT=32B41303A58AB49CB4CB2322B77383B3 + +I=96 +KEY=29EAAA92AC3274D57CA9370720137A28 +CT=32B41303A58AB49CB4CB2322B77383B3 +PT=9C52020FCDE0306C8E19CDF68FEFDF50 + +I=97 +KEY=B5B8A89D61D244B9F2B0FAF1AFFCA578 +CT=9C52020FCDE0306C8E19CDF68FEFDF50 +PT=2E3452997687D12E3A8C59B9178B09E2 + +I=98 +KEY=9B8CFA0417559597C83CA348B877AC9A +CT=2E3452997687D12E3A8C59B9178B09E2 +PT=872CF16DBB7CD6EA8EBB91A60BDE0C6F + +I=99 +KEY=1CA00B69AC29437D468732EEB3A9A0F5 +CT=872CF16DBB7CD6EA8EBB91A60BDE0C6F +PT=7862C78E3B209535E6C6BE92F5EDF42B + +I=100 +KEY=64C2CCE79709D648A0418C7C464454DE +CT=7862C78E3B209535E6C6BE92F5EDF42B +PT=9185D8487C1D2DB679A52FDA2FE5FFCD + +I=101 +KEY=F54714AFEB14FBFED9E4A3A669A1AB13 +CT=9185D8487C1D2DB679A52FDA2FE5FFCD +PT=77C3AF8C81CDB1CDEF5C0429CF3E5DA4 + +I=102 +KEY=8284BB236AD94A3336B8A78FA69FF6B7 +CT=77C3AF8C81CDB1CDEF5C0429CF3E5DA4 +PT=6F36C74290EA6332E98CD23D08AEF7F9 + +I=103 +KEY=EDB27C61FA332901DF3475B2AE31014E +CT=6F36C74290EA6332E98CD23D08AEF7F9 +PT=4A7831538FA1D32E3F8631BEFD99AA73 + +I=104 +KEY=A7CA4D327592FA2FE0B2440C53A8AB3D +CT=4A7831538FA1D32E3F8631BEFD99AA73 +PT=5D2B599D9AF9054A99C25577C9286C9E + +I=105 +KEY=FAE114AFEF6BFF657970117B9A80C7A3 +CT=5D2B599D9AF9054A99C25577C9286C9E +PT=65E4088200BCC01FCEE39C6E42082FD8 + +I=106 +KEY=9F051C2DEFD73F7AB7938D15D888E87B +CT=65E4088200BCC01FCEE39C6E42082FD8 +PT=4588E0D3AABBEFE611B9576391B903E9 + +I=107 +KEY=DA8DFCFE456CD09CA62ADA764931EB92 +CT=4588E0D3AABBEFE611B9576391B903E9 +PT=A55622F833FF271DD8A8F01CF5828FCF + +I=108 +KEY=7FDBDE067693F7817E822A6ABCB3645D +CT=A55622F833FF271DD8A8F01CF5828FCF +PT=8C954010C870B2DB7FA44E1DEBFE6DE8 + +I=109 +KEY=F34E9E16BEE3455A01266477574D09B5 +CT=8C954010C870B2DB7FA44E1DEBFE6DE8 +PT=58B7BD00ED18FC81E618807DE65305B8 + +I=110 +KEY=ABF9231653FBB9DBE73EE40AB11E0C0D +CT=58B7BD00ED18FC81E618807DE65305B8 +PT=EF82E5F4879039F2A1A4CC2F2044BD14 + +I=111 +KEY=447BC6E2D46B8029469A2825915AB119 +CT=EF82E5F4879039F2A1A4CC2F2044BD14 +PT=2B6C12307F14FD50B41D8F972B19AC76 + +I=112 +KEY=6F17D4D2AB7F7D79F287A7B2BA431D6F +CT=2B6C12307F14FD50B41D8F972B19AC76 +PT=C9B6D042CE76892D17F70D4EE00A0D79 + +I=113 +KEY=A6A104906509F454E570AAFC5A491016 +CT=C9B6D042CE76892D17F70D4EE00A0D79 +PT=1B08F9293BBFC44DDCF2C1D26A9DD00B + +I=114 +KEY=BDA9FDB95EB6301939826B2E30D4C01D +CT=1B08F9293BBFC44DDCF2C1D26A9DD00B +PT=4FD353B247048FAAA728E10C691C70CA + +I=115 +KEY=F27AAE0B19B2BFB39EAA8A2259C8B0D7 +CT=4FD353B247048FAAA728E10C691C70CA +PT=0BBB6FDBC62C428B85111BC7C93AE994 + +I=116 +KEY=F9C1C1D0DF9EFD381BBB91E590F25943 +CT=0BBB6FDBC62C428B85111BC7C93AE994 +PT=9C1A213A5772DE6C15CE7406F84BED03 + +I=117 +KEY=65DBE0EA88EC23540E75E5E368B9B440 +CT=9C1A213A5772DE6C15CE7406F84BED03 +PT=AB3DE06BBDB213D64F735CA990DC373C + +I=118 +KEY=CEE60081355E30824106B94AF865837C +CT=AB3DE06BBDB213D64F735CA990DC373C +PT=6C004A1A114E90C7903AA4A0120A2B10 + +I=119 +KEY=A2E64A9B2410A045D13C1DEAEA6FA86C +CT=6C004A1A114E90C7903AA4A0120A2B10 +PT=6405A033C294E72119A8955712548121 + +I=120 +KEY=C6E3EAA8E6844764C89488BDF83B294D +CT=6405A033C294E72119A8955712548121 +PT=AE8A3BAC7279B1BC152A5AD8EBAC3EAD + +I=121 +KEY=6869D10494FDF6D8DDBED265139717E0 +CT=AE8A3BAC7279B1BC152A5AD8EBAC3EAD +PT=4ADDA9999D2BE20D8925F39699563294 + +I=122 +KEY=22B4789D09D614D5549B21F38AC12574 +CT=4ADDA9999D2BE20D8925F39699563294 +PT=BC5CA33CB2A1A580EB92946C77A63467 + +I=123 +KEY=9EE8DBA1BB77B155BF09B59FFD671113 +CT=BC5CA33CB2A1A580EB92946C77A63467 +PT=F7ABEAD301264A3E59EABA0B9606DC92 + +I=124 +KEY=69433172BA51FB6BE6E30F946B61CD81 +CT=F7ABEAD301264A3E59EABA0B9606DC92 +PT=2566114A10BE9BF19E0910486DAB6BE5 + +I=125 +KEY=4C252038AAEF609A78EA1FDC06CAA664 +CT=2566114A10BE9BF19E0910486DAB6BE5 +PT=AF72E1B179660A1B833D9D4FC8473B6B + +I=126 +KEY=E357C189D3896A81FBD78293CE8D9D0F +CT=AF72E1B179660A1B833D9D4FC8473B6B +PT=DFF968B761D8E154B74C9D568C12008E + +I=127 +KEY=3CAEA93EB2518BD54C9B1FC5429F9D81 +CT=DFF968B761D8E154B74C9D568C12008E +PT=42DF098BCB57D0D25269E29C9BC99DE6 + +I=128 +KEY=7E71A0B579065B071EF2FD59D9560067 +CT=42DF098BCB57D0D25269E29C9BC99DE6 +PT=66C34CAAEFC2009B985D1E622FC61AB4 + +I=129 +KEY=18B2EC1F96C45B9C86AFE33BF6901AD3 +CT=66C34CAAEFC2009B985D1E622FC61AB4 +PT=150C1BF943982C5EA1A6839D94F23288 + +I=130 +KEY=0DBEF7E6D55C77C2270960A66262285B +CT=150C1BF943982C5EA1A6839D94F23288 +PT=048BFBB28879206964C5F3B41264011A + +I=131 +KEY=09350C545D2557AB43CC931270062941 +CT=048BFBB28879206964C5F3B41264011A +PT=54D2DC53B87EC949F0FA0E134EE26D50 + +I=132 +KEY=5DE7D007E55B9EE2B3369D013EE44411 +CT=54D2DC53B87EC949F0FA0E134EE26D50 +PT=1BA46AFE1AE87C4F0254BF02DF3B6D37 + +I=133 +KEY=4643BAF9FFB3E2ADB1622203E1DF2926 +CT=1BA46AFE1AE87C4F0254BF02DF3B6D37 +PT=7733E74E743C9E997AC2ED36B2E89CE8 + +I=134 +KEY=31705DB78B8F7C34CBA0CF355337B5CE +CT=7733E74E743C9E997AC2ED36B2E89CE8 +PT=670AEA160FAC67ABCECA140EB8195EB5 + +I=135 +KEY=567AB7A184231B9F056ADB3BEB2EEB7B +CT=670AEA160FAC67ABCECA140EB8195EB5 +PT=7CFD74D510AC894FF5B698280386F4FF + +I=136 +KEY=2A87C374948F92D0F0DC4313E8A81F84 +CT=7CFD74D510AC894FF5B698280386F4FF +PT=10D03F32C0694E9FFF598E101998105E + +I=137 +KEY=3A57FC4654E6DC4F0F85CD03F1300FDA +CT=10D03F32C0694E9FFF598E101998105E +PT=351D6E8D1C26F36973356F6235B8ABAD + +I=138 +KEY=0F4A92CB48C02F267CB0A261C488A477 +CT=351D6E8D1C26F36973356F6235B8ABAD +PT=0DDDA7AA09FBD986C0B9EA2B018FAE4F + +I=139 +KEY=02973561413BF6A0BC09484AC5070A38 +CT=0DDDA7AA09FBD986C0B9EA2B018FAE4F +PT=31C5B68B7A08D1B7320FAB052CC3B0D1 + +I=140 +KEY=335283EA3B3327178E06E34FE9C4BAE9 +CT=31C5B68B7A08D1B7320FAB052CC3B0D1 +PT=501B8D9EE91468522029020A39484DB5 + +I=141 +KEY=63490E74D2274F45AE2FE145D08CF75C +CT=501B8D9EE91468522029020A39484DB5 +PT=2714FBA566DFD4909B8ABF29B1D5A8E8 + +I=142 +KEY=445DF5D1B4F89BD535A55E6C61595FB4 +CT=2714FBA566DFD4909B8ABF29B1D5A8E8 +PT=94485381E5088D67BC1335C89FA5C2B8 + +I=143 +KEY=D015A65051F016B289B66BA4FEFC9D0C +CT=94485381E5088D67BC1335C89FA5C2B8 +PT=BE5BEE26D6686A0EB5838C237FEF79B7 + +I=144 +KEY=6E4E487687987CBC3C35E7878113E4BB +CT=BE5BEE26D6686A0EB5838C237FEF79B7 +PT=417F73D46CFBE3C5C9AD513BCBC6D185 + +I=145 +KEY=2F313BA2EB639F79F598B6BC4AD5353E +CT=417F73D46CFBE3C5C9AD513BCBC6D185 +PT=AE3B07350B3BE7D4F9F6FE2F95622449 + +I=146 +KEY=810A3C97E05878AD0C6E4893DFB71177 +CT=AE3B07350B3BE7D4F9F6FE2F95622449 +PT=7BD4231225A7B665953AB034E24A7C7A + +I=147 +KEY=FADE1F85C5FFCEC89954F8A73DFD6D0D +CT=7BD4231225A7B665953AB034E24A7C7A +PT=3C1FBE8F3CEB1438B4A64E59FAF291CF + +I=148 +KEY=C6C1A10AF914DAF02DF2B6FEC70FFCC2 +CT=3C1FBE8F3CEB1438B4A64E59FAF291CF +PT=ACFF7F1E71AA952CF8ADB24FEE18A7BB + +I=149 +KEY=6A3EDE1488BE4FDCD55F04B129175B79 +CT=ACFF7F1E71AA952CF8ADB24FEE18A7BB +PT=3C3A6D3FD73B36317417106A92E2B43E + +I=150 +KEY=5604B32B5F8579EDA14814DBBBF5EF47 +CT=3C3A6D3FD73B36317417106A92E2B43E +PT=F34F8C719A4A74DD8F4FA4CBC520827A + +I=151 +KEY=A54B3F5AC5CF0D302E07B0107ED56D3D +CT=F34F8C719A4A74DD8F4FA4CBC520827A +PT=6A5D56FB6C7EBA15112AF8A093F3E1E1 + +I=152 +KEY=CF1669A1A9B1B7253F2D48B0ED268CDC +CT=6A5D56FB6C7EBA15112AF8A093F3E1E1 +PT=8BF39EE3B8ED0F6A6EA92319A81B10E6 + +I=153 +KEY=44E5F742115CB84F51846BA9453D9C3A +CT=8BF39EE3B8ED0F6A6EA92319A81B10E6 +PT=2BC796D320C444BBBAD466D686F460F6 + +I=154 +KEY=6F2261913198FCF4EB500D7FC3C9FCCC +CT=2BC796D320C444BBBAD466D686F460F6 +PT=2CF595F424ED50B1A146E387B128CBA3 + +I=155 +KEY=43D7F4651575AC454A16EEF872E1376F +CT=2CF595F424ED50B1A146E387B128CBA3 +PT=56F2E856045BAE66EA003A6C39205344 + +I=156 +KEY=15251C33112E0223A016D4944BC1642B +CT=56F2E856045BAE66EA003A6C39205344 +PT=31C83401BD83424BA6E94C0D6D453D9A + +I=157 +KEY=24ED2832ACAD406806FF9899268459B1 +CT=31C83401BD83424BA6E94C0D6D453D9A +PT=A687F05992CCB57CDE61AFF8878913ED + +I=158 +KEY=826AD86B3E61F514D89E3761A10D4A5C +CT=A687F05992CCB57CDE61AFF8878913ED +PT=16E771193C2473502F415C27FB101D94 + +I=159 +KEY=948DA97202458644F7DF6B465A1D57C8 +CT=16E771193C2473502F415C27FB101D94 +PT=C69CDBA29C9EDC3407C1C73A756A0B6E + +I=160 +KEY=521172D09EDB5A70F01EAC7C2F775CA6 +CT=C69CDBA29C9EDC3407C1C73A756A0B6E +PT=566D82281F48E3217F3852115CF2E944 + +I=161 +KEY=047CF0F88193B9518F26FE6D7385B5E2 +CT=566D82281F48E3217F3852115CF2E944 +PT=B3FEBC8F8F0F0B652C4358BCC9BF54DF + +I=162 +KEY=B7824C770E9CB234A365A6D1BA3AE13D +CT=B3FEBC8F8F0F0B652C4358BCC9BF54DF +PT=BBB84877094B3EB86203D17C92CF5168 + +I=163 +KEY=0C3A040007D78C8CC16677AD28F5B055 +CT=BBB84877094B3EB86203D17C92CF5168 +PT=2C45E5A3F8C564862DA4D8AD428D3E67 + +I=164 +KEY=207FE1A3FF12E80AECC2AF006A788E32 +CT=2C45E5A3F8C564862DA4D8AD428D3E67 +PT=10ADC2AF56600D95AD8BB579EF5170C9 + +I=165 +KEY=30D2230CA972E59F41491A798529FEFB +CT=10ADC2AF56600D95AD8BB579EF5170C9 +PT=1854BB8AC568F3599153BE1AC60BA78D + +I=166 +KEY=288698866C1A16C6D01AA46343225976 +CT=1854BB8AC568F3599153BE1AC60BA78D +PT=E641765C80D8812A1A0F4606C639642E + +I=167 +KEY=CEC7EEDAECC297ECCA15E265851B3D58 +CT=E641765C80D8812A1A0F4606C639642E +PT=317AC70CEAA87AE66A15C22BD5E534E5 + +I=168 +KEY=FFBD29D6066AED0AA000204E50FE09BD +CT=317AC70CEAA87AE66A15C22BD5E534E5 +PT=BFFB8D7B3D9F54727944ABC3F6474362 + +I=169 +KEY=4046A4AD3BF5B978D9448B8DA6B94ADF +CT=BFFB8D7B3D9F54727944ABC3F6474362 +PT=060765D1D9D289B862DA274CFDB4D7A0 + +I=170 +KEY=4641C17CE22730C0BB9EACC15B0D9D7F +CT=060765D1D9D289B862DA274CFDB4D7A0 +PT=FBAFA4C1D6CEF2A45E9E084311FDF858 + +I=171 +KEY=BDEE65BD34E9C264E500A4824AF06527 +CT=FBAFA4C1D6CEF2A45E9E084311FDF858 +PT=F7F36BFDA77362B470B0B074241C58E9 + +I=172 +KEY=4A1D0E40939AA0D095B014F66EEC3DCE +CT=F7F36BFDA77362B470B0B074241C58E9 +PT=2FC236EDCD573A6DCFBA7930E9CF4698 + +I=173 +KEY=65DF38AD5ECD9ABD5A0A6DC687237B56 +CT=2FC236EDCD573A6DCFBA7930E9CF4698 +PT=949A9994DC976595BFACA5F31116A165 + +I=174 +KEY=F145A139825AFF28E5A6C8359635DA33 +CT=949A9994DC976595BFACA5F31116A165 +PT=19373CA9D519BF83EAA4C17E1EE8225C + +I=175 +KEY=E8729D90574340AB0F02094B88DDF86F +CT=19373CA9D519BF83EAA4C17E1EE8225C +PT=685C783918997A7572B0A09315F1F2DB + +I=176 +KEY=802EE5A94FDA3ADE7DB2A9D89D2C0AB4 +CT=685C783918997A7572B0A09315F1F2DB +PT=FC0CB1792EADB7E8DECB021A435DE1E7 + +I=177 +KEY=7C2254D061778D36A379ABC2DE71EB53 +CT=FC0CB1792EADB7E8DECB021A435DE1E7 +PT=797C5E5B4F3B38E7C72FF7AAAB270E86 + +I=178 +KEY=055E0A8B2E4CB5D164565C687556E5D5 +CT=797C5E5B4F3B38E7C72FF7AAAB270E86 +PT=A5AB675262EA186F777681647B6AA1F9 + +I=179 +KEY=A0F56DD94CA6ADBE1320DD0C0E3C442C +CT=A5AB675262EA186F777681647B6AA1F9 +PT=08CDF6AF55BBB247D0DE1A69CD041A78 + +I=180 +KEY=A8389B76191D1FF9C3FEC765C3385E54 +CT=08CDF6AF55BBB247D0DE1A69CD041A78 +PT=DED1F3C30AB5EC3455C7B6A756E5FF03 + +I=181 +KEY=76E968B513A8F3CD963971C295DDA157 +CT=DED1F3C30AB5EC3455C7B6A756E5FF03 +PT=C759A17B354D668D1BA5541D16241D9F + +I=182 +KEY=B1B0C9CE26E595408D9C25DF83F9BCC8 +CT=C759A17B354D668D1BA5541D16241D9F +PT=97E011FE7B327B8292270D4CD18BD9AC + +I=183 +KEY=2650D8305DD7EEC21FBB289352726564 +CT=97E011FE7B327B8292270D4CD18BD9AC +PT=9F004E4282F790C06681F16262EF78CF + +I=184 +KEY=B9509672DF207E02793AD9F1309D1DAB +CT=9F004E4282F790C06681F16262EF78CF +PT=6B34AA95EFD874915DAE275CE34A04B9 + +I=185 +KEY=D2643CE730F80A932494FEADD3D71912 +CT=6B34AA95EFD874915DAE275CE34A04B9 +PT=96966D118C50B67849F93B109492B5EB + +I=186 +KEY=44F251F6BCA8BCEB6D6DC5BD4745ACF9 +CT=96966D118C50B67849F93B109492B5EB +PT=2CA6F85E4F29BE884392A0FEDD08D5A7 + +I=187 +KEY=6854A9A8F38102632EFF65439A4D795E +CT=2CA6F85E4F29BE884392A0FEDD08D5A7 +PT=21B71D4F23DDC002CAAFB7426009BD27 + +I=188 +KEY=49E3B4E7D05CC261E450D201FA44C479 +CT=21B71D4F23DDC002CAAFB7426009BD27 +PT=BF059F1945E9E51B22B308849757B475 + +I=189 +KEY=F6E62BFE95B5277AC6E3DA856D13700C +CT=BF059F1945E9E51B22B308849757B475 +PT=434F4E756A3178472E12B80A1C2ED83E + +I=190 +KEY=B5A9658BFF845F3DE8F1628F713DA832 +CT=434F4E756A3178472E12B80A1C2ED83E +PT=37DB2B0D5967700CDE348FB60661A6D4 + +I=191 +KEY=82724E86A6E32F3136C5ED39775C0EE6 +CT=37DB2B0D5967700CDE348FB60661A6D4 +PT=D31C5130F8F217AC0014B5F37B9BB86B + +I=192 +KEY=516E1FB65E11389D36D158CA0CC7B68D +CT=D31C5130F8F217AC0014B5F37B9BB86B +PT=3B8CD15967907F9C617697EBEF395B16 + +I=193 +KEY=6AE2CEEF3981470157A7CF21E3FEED9B +CT=3B8CD15967907F9C617697EBEF395B16 +PT=AF17B5E5236BF46576379CD4E5AF8A34 + +I=194 +KEY=C5F57B0A1AEAB364219053F5065167AF +CT=AF17B5E5236BF46576379CD4E5AF8A34 +PT=88286D6FB237181EC239C1D70C0D6675 + +I=195 +KEY=4DDD1665A8DDAB7AE3A992220A5C01DA +CT=88286D6FB237181EC239C1D70C0D6675 +PT=8A5207BB1283343B3692045183451A7D + +I=196 +KEY=C78F11DEBA5E9F41D53B967389191BA7 +CT=8A5207BB1283343B3692045183451A7D +PT=53C12FAC4B0185AA0CE067FC67EC5B9C + +I=197 +KEY=944E3E72F15F1AEBD9DBF18FEEF5403B +CT=53C12FAC4B0185AA0CE067FC67EC5B9C +PT=BBA2BB9B1CA48D2E97E0C39E500EB9C0 + +I=198 +KEY=2FEC85E9EDFB97C54E3B3211BEFBF9FB +CT=BBA2BB9B1CA48D2E97E0C39E500EB9C0 +PT=8BA2341064B7B5184CD7E7A40FA0358E + +I=199 +KEY=A44EB1F9894C22DD02ECD5B5B15BCC75 +CT=8BA2341064B7B5184CD7E7A40FA0358E +PT=97121EEEA68CC6200FBC0B311849E625 + +I=200 +KEY=335CAF172FC0E4FD0D50DE84A9122A50 +CT=97121EEEA68CC6200FBC0B311849E625 +PT=027FA370A9412B342043A15F19294961 + +I=201 +KEY=31230C678681CFC92D137FDBB03B6331 +CT=027FA370A9412B342043A15F19294961 +PT=72CFBE6BA03AB28A53A6727717D1199A + +I=202 +KEY=43ECB20C26BB7D437EB50DACA7EA7AAB +CT=72CFBE6BA03AB28A53A6727717D1199A +PT=7A15B1B4B4ED35F9C208500FE7C4C1C7 + +I=203 +KEY=39F903B8925648BABCBD5DA3402EBB6C +CT=7A15B1B4B4ED35F9C208500FE7C4C1C7 +PT=AF46496D09254FAB5F381E93EEB4FBB0 + +I=204 +KEY=96BF4AD59B730711E3854330AE9A40DC +CT=AF46496D09254FAB5F381E93EEB4FBB0 +PT=ADA064E0F4324E8B0C062F6E33C7D016 + +I=205 +KEY=3B1F2E356F41499AEF836C5E9D5D90CA +CT=ADA064E0F4324E8B0C062F6E33C7D016 +PT=7723A61733BD5BBFAB8C559ED379B8B5 + +I=206 +KEY=4C3C88225CFC1225440F39C04E24287F +CT=7723A61733BD5BBFAB8C559ED379B8B5 +PT=5D210E8F35DD863316E89FADA70E8392 + +I=207 +KEY=111D86AD6921941652E7A66DE92AABED +CT=5D210E8F35DD863316E89FADA70E8392 +PT=92B1D20E7D87787950990052DE2ABA4F + +I=208 +KEY=83AC54A314A6EC6F027EA63F370011A2 +CT=92B1D20E7D87787950990052DE2ABA4F +PT=178E494D23AA6AC13AC180727C47FD2A + +I=209 +KEY=94221DEE370C86AE38BF264D4B47EC88 +CT=178E494D23AA6AC13AC180727C47FD2A +PT=CB9C10817C059D5BE4F123576FF459C6 + +I=210 +KEY=5FBE0D6F4B091BF5DC4E051A24B3B54E +CT=CB9C10817C059D5BE4F123576FF459C6 +PT=4934C56CC7BAF0A8DEBB62CFB2B0DEBF + +I=211 +KEY=168AC8038CB3EB5D02F567D596036BF1 +CT=4934C56CC7BAF0A8DEBB62CFB2B0DEBF +PT=F6F2A4B90B357D88401702C968D9EC02 + +I=212 +KEY=E0786CBA878696D542E2651CFEDA87F3 +CT=F6F2A4B90B357D88401702C968D9EC02 +PT=06A35CAD7B36751BEE345C33112EB6D1 + +I=213 +KEY=E6DB3017FCB0E3CEACD6392FEFF43122 +CT=06A35CAD7B36751BEE345C33112EB6D1 +PT=3244CDE10DF48795DA702CD8C2F4CABD + +I=214 +KEY=D49FFDF6F144645B76A615F72D00FB9F +CT=3244CDE10DF48795DA702CD8C2F4CABD +PT=47C06F5BEA8C3503512E0E200966C546 + +I=215 +KEY=935F92AD1BC8515827881BD724663ED9 +CT=47C06F5BEA8C3503512E0E200966C546 +PT=68A077D25CBEA7F76B88D8C6A414D0CE + +I=216 +KEY=FBFFE57F4776F6AF4C00C3118072EE17 +CT=68A077D25CBEA7F76B88D8C6A414D0CE +PT=DDF110C2C79B46C5132CCEF654280D7E + +I=217 +KEY=260EF5BD80EDB06A5F2C0DE7D45AE369 +CT=DDF110C2C79B46C5132CCEF654280D7E +PT=0AB610A0082813076D052011C12DC924 + +I=218 +KEY=2CB8E51D88C5A36D32292DF615772A4D +CT=0AB610A0082813076D052011C12DC924 +PT=8C42F49EDAE1BD6B631E74B68B1B8444 + +I=219 +KEY=A0FA118352241E06513759409E6CAE09 +CT=8C42F49EDAE1BD6B631E74B68B1B8444 +PT=B5A5B6E50B3A066D16DF883F353019FE + +I=220 +KEY=155FA766591E186B47E8D17FAB5CB7F7 +CT=B5A5B6E50B3A066D16DF883F353019FE +PT=70CFA25AFC9919937E2FC90900F0B398 + +I=221 +KEY=6590053CA58701F839C71876ABAC046F +CT=70CFA25AFC9919937E2FC90900F0B398 +PT=B927A5911AE33DEAB619DAFEE22CD0DF + +I=222 +KEY=DCB7A0ADBF643C128FDEC2884980D4B0 +CT=B927A5911AE33DEAB619DAFEE22CD0DF +PT=10C548438C5B976EDD624129B2102D7A + +I=223 +KEY=CC72E8EE333FAB7C52BC83A1FB90F9CA +CT=10C548438C5B976EDD624129B2102D7A +PT=4549E45DA2F8FE82972DC7DF3548CAFF + +I=224 +KEY=893B0CB391C755FEC591447ECED83335 +CT=4549E45DA2F8FE82972DC7DF3548CAFF +PT=2B85505E64089FEB6B5763011E778C96 + +I=225 +KEY=A2BE5CEDF5CFCA15AEC6277FD0AFBFA3 +CT=2B85505E64089FEB6B5763011E778C96 +PT=4B157930F9A6EBE3D9D6AC9FADDEB35C + +I=226 +KEY=E9AB25DD0C6921F677108BE07D710CFF +CT=4B157930F9A6EBE3D9D6AC9FADDEB35C +PT=12341C0FE9EB6757BFFCC4BC1A8F2585 + +I=227 +KEY=FB9F39D2E58246A1C8EC4F5C67FE297A +CT=12341C0FE9EB6757BFFCC4BC1A8F2585 +PT=5422D62D794B02FC04BE01198EE23ACE + +I=228 +KEY=AFBDEFFF9CC9445DCC524E45E91C13B4 +CT=5422D62D794B02FC04BE01198EE23ACE +PT=42D43022FD6DB571BCB2FDE653C9068C + +I=229 +KEY=ED69DFDD61A4F12C70E0B3A3BAD51538 +CT=42D43022FD6DB571BCB2FDE653C9068C +PT=80BD3AAED5D519B75D22BF060EF1DFC6 + +I=230 +KEY=6DD4E573B471E89B2DC20CA5B424CAFE +CT=80BD3AAED5D519B75D22BF060EF1DFC6 +PT=B72973F9016A348CDDCCFFC2DD291B5A + +I=231 +KEY=DAFD968AB51BDC17F00EF367690DD1A4 +CT=B72973F9016A348CDDCCFFC2DD291B5A +PT=5692E61C86A7B2C043ABBED712390361 + +I=232 +KEY=8C6F709633BC6ED7B3A54DB07B34D2C5 +CT=5692E61C86A7B2C043ABBED712390361 +PT=75138737269AA27855C2CFD2DCEDEFC4 + +I=233 +KEY=F97CF7A11526CCAFE6678262A7D93D01 +CT=75138737269AA27855C2CFD2DCEDEFC4 +PT=A022AA28CECC4BB5EB28BA5B7828AB6E + +I=234 +KEY=595E5D89DBEA871A0D4F3839DFF1966F +CT=A022AA28CECC4BB5EB28BA5B7828AB6E +PT=17B0BF87EE02AA44705B1B1B4DF7D3F4 + +I=235 +KEY=4EEEE20E35E82D5E7D1423229206459B +CT=17B0BF87EE02AA44705B1B1B4DF7D3F4 +PT=095A5A041C43DCFEB5D0DF3E7659344A + +I=236 +KEY=47B4B80A29ABF1A0C8C4FC1CE45F71D1 +CT=095A5A041C43DCFEB5D0DF3E7659344A +PT=9DCE0D1C572509F3367EE952B89044E5 + +I=237 +KEY=DA7AB5167E8EF853FEBA154E5CCF3534 +CT=9DCE0D1C572509F3367EE952B89044E5 +PT=E6075BCC82399A91E52034EA2F197058 + +I=238 +KEY=3C7DEEDAFCB762C21B9A21A473D6456C +CT=E6075BCC82399A91E52034EA2F197058 +PT=431D243CEE96B424B0FA4FEC5E707036 + +I=239 +KEY=7F60CAE61221D6E6AB606E482DA6355A +CT=431D243CEE96B424B0FA4FEC5E707036 +PT=5EF70106A2EA454CA9405A8AA1B54EF0 + +I=240 +KEY=2197CBE0B0CB93AA022034C28C137BAA +CT=5EF70106A2EA454CA9405A8AA1B54EF0 +PT=09B003CB7E2ADDD587A2ABCDD03D234F + +I=241 +KEY=2827C82BCEE14E7F85829F0F5C2E58E5 +CT=09B003CB7E2ADDD587A2ABCDD03D234F +PT=3647FAC6EF758113DC768E7737098DE9 + +I=242 +KEY=1E6032ED2194CF6C59F411786B27D50C +CT=3647FAC6EF758113DC768E7737098DE9 +PT=C043BD96A88492C85431B72C708C3C60 + +I=243 +KEY=DE238F7B89105DA40DC5A6541BABE96C +CT=C043BD96A88492C85431B72C708C3C60 +PT=299A25142A6B5D334158D359DD9CD574 + +I=244 +KEY=F7B9AA6FA37B00974C9D750DC6373C18 +CT=299A25142A6B5D334158D359DD9CD574 +PT=21E56C2202C8D6F81EDC63A8A1EA4B6A + +I=245 +KEY=D65CC64DA1B3D66F524116A567DD7772 +CT=21E56C2202C8D6F81EDC63A8A1EA4B6A +PT=FD3565957E3845065B7AEF27A900FDD5 + +I=246 +KEY=2B69A3D8DF8B9369093BF982CEDD8AA7 +CT=FD3565957E3845065B7AEF27A900FDD5 +PT=A4DB9120D1ED0419342AFC2CBF114647 + +I=247 +KEY=8FB232F80E6697703D1105AE71CCCCE0 +CT=A4DB9120D1ED0419342AFC2CBF114647 +PT=27FDDEA1E746BD217CFB4CD7A511BACE + +I=248 +KEY=A84FEC59E9202A5141EA4979D4DD762E +CT=27FDDEA1E746BD217CFB4CD7A511BACE +PT=6A9189FD46E47B22F151A213D023442B + +I=249 +KEY=C2DE65A4AFC45173B0BBEB6A04FE3205 +CT=6A9189FD46E47B22F151A213D023442B +PT=1C729701404C76D5D7A156C39CF52542 + +I=250 +KEY=DEACF2A5EF8827A6671ABDA9980B1747 +CT=1C729701404C76D5D7A156C39CF52542 +PT=6F97CB4564E0783DFE962DCB13FEDF72 + +I=251 +KEY=B13B39E08B685F9B998C90628BF5C835 +CT=6F97CB4564E0783DFE962DCB13FEDF72 +PT=F818140A280299B182CDA37CBE9B27AB + +I=252 +KEY=49232DEAA36AC62A1B41331E356EEF9E +CT=F818140A280299B182CDA37CBE9B27AB +PT=20E9F2BE7017C2945005FD8A420A5B7D + +I=253 +KEY=69CADF54D37D04BE4B44CE947764B4E3 +CT=20E9F2BE7017C2945005FD8A420A5B7D +PT=60BB97C634161EF6A36056193B6EDDB0 + +I=254 +KEY=09714892E76B1A48E824988D4C0A6953 +CT=60BB97C634161EF6A36056193B6EDDB0 +PT=E4B9777B7390EF430A93FF7DD0B68CD4 + +I=255 +KEY=EDC83FE994FBF50BE2B767F09CBCE587 +CT=E4B9777B7390EF430A93FF7DD0B68CD4 +PT=E5E3BD960CF15BBDB8A6C08711A884CF + +I=256 +KEY=082B827F980AAEB65A11A7778D146148 +CT=E5E3BD960CF15BBDB8A6C08711A884CF +PT=71A6AEFD0181DCE69A116585044C7F66 + +I=257 +KEY=798D2C82998B7250C000C2F289581E2E +CT=71A6AEFD0181DCE69A116585044C7F66 +PT=8E9C1CFFDB8972617D74DA0E9ED065D1 + +I=258 +KEY=F711307D42020031BD7418FC17887BFF +CT=8E9C1CFFDB8972617D74DA0E9ED065D1 +PT=CE7882AB901A199910FC463A4D1D626A + +I=259 +KEY=3969B2D6D21819A8AD885EC65A951995 +CT=CE7882AB901A199910FC463A4D1D626A +PT=2334546032E850D0029CB1AD6AFCEA7A + +I=260 +KEY=1A5DE6B6E0F04978AF14EF6B3069F3EF +CT=2334546032E850D0029CB1AD6AFCEA7A +PT=88B4CF0D4AB7BD00BE98DA1626063A69 + +I=261 +KEY=92E929BBAA47F478118C357D166FC986 +CT=88B4CF0D4AB7BD00BE98DA1626063A69 +PT=5A7FF831F28E5EC4A11DA524E2323925 + +I=262 +KEY=C896D18A58C9AABCB0919059F45DF0A3 +CT=5A7FF831F28E5EC4A11DA524E2323925 +PT=DF000551EF9BBD914969BD1B353BDC8C + +I=263 +KEY=1796D4DBB752172DF9F82D42C1662C2F +CT=DF000551EF9BBD914969BD1B353BDC8C +PT=1EECBC47697208193C354E28D23E8CE9 + +I=264 +KEY=097A689CDE201F34C5CD636A1358A0C6 +CT=1EECBC47697208193C354E28D23E8CE9 +PT=DF85CD4B3F821A7411F9F5D1FDF9DB85 + +I=265 +KEY=D6FFA5D7E1A20540D43496BBEEA17B43 +CT=DF85CD4B3F821A7411F9F5D1FDF9DB85 +PT=038E765F1910D8C0C1251254605218F2 + +I=266 +KEY=D571D388F8B2DD80151184EF8EF363B1 +CT=038E765F1910D8C0C1251254605218F2 +PT=FBA8FE850294EEAEE75F56C974BF7DE4 + +I=267 +KEY=2ED92D0DFA26332EF24ED226FA4C1E55 +CT=FBA8FE850294EEAEE75F56C974BF7DE4 +PT=47F9D6F7A3E2A1BFA360EA1BA8B0450E + +I=268 +KEY=6920FBFA59C49291512E383D52FC5B5B +CT=47F9D6F7A3E2A1BFA360EA1BA8B0450E +PT=FD6F4A4825DE5E776BFD569223CB5A2C + +I=269 +KEY=944FB1B27C1ACCE63AD36EAF71370177 +CT=FD6F4A4825DE5E776BFD569223CB5A2C +PT=10430ED7EE0FDB8FBC348F8E08286622 + +I=270 +KEY=840CBF659215176986E7E121791F6755 +CT=10430ED7EE0FDB8FBC348F8E08286622 +PT=4B75D5C573185303B01EB649884758B1 + +I=271 +KEY=CF796AA0E10D446A36F95768F1583FE4 +CT=4B75D5C573185303B01EB649884758B1 +PT=85CCA4271A941517D55D05B4F29527C3 + +I=272 +KEY=4AB5CE87FB99517DE3A452DC03CD1827 +CT=85CCA4271A941517D55D05B4F29527C3 +PT=615EA2D44C52D639B6AD05D621B4A1A6 + +I=273 +KEY=2BEB6C53B7CB87445509570A2279B981 +CT=615EA2D44C52D639B6AD05D621B4A1A6 +PT=1DFD1E93D34ABFE45BA6BF6BD3FBF30E + +I=274 +KEY=361672C0648138A00EAFE861F1824A8F +CT=1DFD1E93D34ABFE45BA6BF6BD3FBF30E +PT=B65C3F09FFFF752DEE2F8F2D441A51CA + +I=275 +KEY=804A4DC99B7E4D8DE080674CB5981B45 +CT=B65C3F09FFFF752DEE2F8F2D441A51CA +PT=3B36D6FD4F7ACAD4681FF4398AC7AFB3 + +I=276 +KEY=BB7C9B34D4048759889F93753F5FB4F6 +CT=3B36D6FD4F7ACAD4681FF4398AC7AFB3 +PT=F3CDEFABE450D887CD585C280BB22367 + +I=277 +KEY=48B1749F30545FDE45C7CF5D34ED9791 +CT=F3CDEFABE450D887CD585C280BB22367 +PT=ECC49251BAD79981CA1B1F683A843531 + +I=278 +KEY=A475E6CE8A83C65F8FDCD0350E69A2A0 +CT=ECC49251BAD79981CA1B1F683A843531 +PT=8BE43F0A30663108513A0E5F49F9152C + +I=279 +KEY=2F91D9C4BAE5F757DEE6DE6A4790B78C +CT=8BE43F0A30663108513A0E5F49F9152C +PT=DB3D559FCEBE0FAF3B218161BA6B3F07 + +I=280 +KEY=F4AC8C5B745BF8F8E5C75F0BFDFB888B +CT=DB3D559FCEBE0FAF3B218161BA6B3F07 +PT=8F0C3AE11B03433C07CABD26BF47A430 + +I=281 +KEY=7BA0B6BA6F58BBC4E20DE22D42BC2CBB +CT=8F0C3AE11B03433C07CABD26BF47A430 +PT=73578DC3464CE3EE0314B206E1E9504C + +I=282 +KEY=08F73B792914582AE119502BA3557CF7 +CT=73578DC3464CE3EE0314B206E1E9504C +PT=60DA2C12B296804C608348A54EE1C60D + +I=283 +KEY=682D176B9B82D866819A188EEDB4BAFA +CT=60DA2C12B296804C608348A54EE1C60D +PT=A960934724BDC61E5429E59856FC1902 + +I=284 +KEY=C14D842CBF3F1E78D5B3FD16BB48A3F8 +CT=A960934724BDC61E5429E59856FC1902 +PT=6B7E71535C6B7B09BDF19AF79CD58C95 + +I=285 +KEY=AA33F57FE3546571684267E1279D2F6D +CT=6B7E71535C6B7B09BDF19AF79CD58C95 +PT=B95E0126EF320F1E6F288366DB7F2773 + +I=286 +KEY=136DF4590C666A6F076AE487FCE2081E +CT=B95E0126EF320F1E6F288366DB7F2773 +PT=6403B99D6FE0F85128FDD1F05B81AA6E + +I=287 +KEY=776E4DC46386923E2F973577A763A270 +CT=6403B99D6FE0F85128FDD1F05B81AA6E +PT=9EBA25F2D6CE5817F4317F3AFE6421E7 + +I=288 +KEY=E9D46836B548CA29DBA64A4D59078397 +CT=9EBA25F2D6CE5817F4317F3AFE6421E7 +PT=5E77AAE8A3C5EEAF4732BB310DAC3771 + +I=289 +KEY=B7A3C2DE168D24869C94F17C54ABB4E6 +CT=5E77AAE8A3C5EEAF4732BB310DAC3771 +PT=5FD00675371300B60C30EFCEE0171080 + +I=290 +KEY=E873C4AB219E243090A41EB2B4BCA466 +CT=5FD00675371300B60C30EFCEE0171080 +PT=482D701DBCE3AE108F65836C12A41C2C + +I=291 +KEY=A05EB4B69D7D8A201FC19DDEA618B84A +CT=482D701DBCE3AE108F65836C12A41C2C +PT=2966D81642542925891D8F7409051E4A + +I=292 +KEY=89386CA0DF29A30596DC12AAAF1DA600 +CT=2966D81642542925891D8F7409051E4A +PT=2FD6F3DB9DD1DEDED9F32D1806AE69D6 + +I=293 +KEY=A6EE9F7B42F87DDB4F2F3FB2A9B3CFD6 +CT=2FD6F3DB9DD1DEDED9F32D1806AE69D6 +PT=9B59277165B792790E29ADB53ADE60DB + +I=294 +KEY=3DB7B80A274FEFA241069207936DAF0D +CT=9B59277165B792790E29ADB53ADE60DB +PT=A4873C5246044200B56C25FFADAB15D6 + +I=295 +KEY=99308458614BADA2F46AB7F83EC6BADB +CT=A4873C5246044200B56C25FFADAB15D6 +PT=9E2BBBD65649EB2A0CD974AD32BF382F + +I=296 +KEY=071B3F8E37024688F8B3C3550C7982F4 +CT=9E2BBBD65649EB2A0CD974AD32BF382F +PT=F83F4408675892DADA4833A43F22FFC8 + +I=297 +KEY=FF247B86505AD45222FBF0F1335B7D3C +CT=F83F4408675892DADA4833A43F22FFC8 +PT=19C337CCBF8D06DC68D9A16DB294EF44 + +I=298 +KEY=E6E74C4AEFD7D28E4A22519C81CF9278 +CT=19C337CCBF8D06DC68D9A16DB294EF44 +PT=433578E0901A4F4B134E6DCF68249FC7 + +I=299 +KEY=A5D234AA7FCD9DC5596C3C53E9EB0DBF +CT=433578E0901A4F4B134E6DCF68249FC7 +PT=7F317CB0B3279C894B8A08289797FFF1 + +I=300 +KEY=DAE3481ACCEA014C12E6347B7E7CF24E +CT=7F317CB0B3279C894B8A08289797FFF1 +PT=AFFB4CA21A2A36FD24BB18C5AED17789 + +I=301 +KEY=751804B8D6C037B1365D2CBED0AD85C7 +CT=AFFB4CA21A2A36FD24BB18C5AED17789 +PT=394DA5EC353A68B844D1BC24A468DA5C + +I=302 +KEY=4C55A154E3FA5F09728C909A74C55F9B +CT=394DA5EC353A68B844D1BC24A468DA5C +PT=C649C174B98A06351F26C117D14FF290 + +I=303 +KEY=8A1C60205A70593C6DAA518DA58AAD0B +CT=C649C174B98A06351F26C117D14FF290 +PT=2E122AA7C90B57304A80C19480627DD7 + +I=304 +KEY=A40E4A87937B0E0C272A901925E8D0DC +CT=2E122AA7C90B57304A80C19480627DD7 +PT=9841ADE6A65834CE89959EFE8F059ED6 + +I=305 +KEY=3C4FE76135233AC2AEBF0EE7AAED4E0A +CT=9841ADE6A65834CE89959EFE8F059ED6 +PT=6B70D74762A4BEFBD15B9EC6835CB69B + +I=306 +KEY=573F3026578784397FE4902129B1F891 +CT=6B70D74762A4BEFBD15B9EC6835CB69B +PT=2E8B5DEF53E2294C0C953A9B8BD9399D + +I=307 +KEY=79B46DC90465AD757371AABAA268C10C +CT=2E8B5DEF53E2294C0C953A9B8BD9399D +PT=D32D00F78BA00F6CEA792598B89779E4 + +I=308 +KEY=AA996D3E8FC5A21999088F221AFFB8E8 +CT=D32D00F78BA00F6CEA792598B89779E4 +PT=7059DCC6CB8D295B95F2978F25927B31 + +I=309 +KEY=DAC0B1F844488B420CFA18AD3F6DC3D9 +CT=7059DCC6CB8D295B95F2978F25927B31 +PT=833A1AFA7DC4CAF54F5B36981A98D7E3 + +I=310 +KEY=59FAAB02398C41B743A12E3525F5143A +CT=833A1AFA7DC4CAF54F5B36981A98D7E3 +PT=4CC5A526400B493AAA28909A2F4932BF + +I=311 +KEY=153F0E247987088DE989BEAF0ABC2685 +CT=4CC5A526400B493AAA28909A2F4932BF +PT=D7134DEE2967104D161876A0802B3727 + +I=312 +KEY=C22C43CA50E018C0FF91C80F8A9711A2 +CT=D7134DEE2967104D161876A0802B3727 +PT=C45DB7BC52D7A0D53399B91EFB686D32 + +I=313 +KEY=0671F4760237B815CC08711171FF7C90 +CT=C45DB7BC52D7A0D53399B91EFB686D32 +PT=2F49EA2A8D7F44909BCF41C3640FD0AB + +I=314 +KEY=29381E5C8F48FC8557C730D215F0AC3B +CT=2F49EA2A8D7F44909BCF41C3640FD0AB +PT=6D416059758F4AC555A05D83E9CFC4DE + +I=315 +KEY=44797E05FAC7B64002676D51FC3F68E5 +CT=6D416059758F4AC555A05D83E9CFC4DE +PT=2721015DDF85EC87ED8480A87705CD37 + +I=316 +KEY=63587F5825425AC7EFE3EDF98B3AA5D2 +CT=2721015DDF85EC87ED8480A87705CD37 +PT=3B045F5DD5ADC6E5D341E2E6A5B919D3 + +I=317 +KEY=585C2005F0EF9C223CA20F1F2E83BC01 +CT=3B045F5DD5ADC6E5D341E2E6A5B919D3 +PT=85DA9719FF16899B343BE56FDF9F86BF + +I=318 +KEY=DD86B71C0FF915B90899EA70F11C3ABE +CT=85DA9719FF16899B343BE56FDF9F86BF +PT=67FD32AC2783C381E77AE0BB8ACEECCD + +I=319 +KEY=BA7B85B0287AD638EFE30ACB7BD2D673 +CT=67FD32AC2783C381E77AE0BB8ACEECCD +PT=D8BEC715849E6A2A164F0139B8EC038E + +I=320 +KEY=62C542A5ACE4BC12F9AC0BF2C33ED5FD +CT=D8BEC715849E6A2A164F0139B8EC038E +PT=6ECA9375A207148E36203C8BD885A520 + +I=321 +KEY=0C0FD1D00EE3A89CCF8C37791BBB70DD +CT=6ECA9375A207148E36203C8BD885A520 +PT=A96877A8369B7086EF76D8281C066068 + +I=322 +KEY=A567A6783878D81A20FAEF5107BD10B5 +CT=A96877A8369B7086EF76D8281C066068 +PT=2D6DDF2C136F5ACDC12D33D52ECD6397 + +I=323 +KEY=880A79542B1782D7E1D7DC8429707322 +CT=2D6DDF2C136F5ACDC12D33D52ECD6397 +PT=E2F3EFF780EEDAD7B820CF57F946AB21 + +I=324 +KEY=6AF996A3ABF9580059F713D3D036D803 +CT=E2F3EFF780EEDAD7B820CF57F946AB21 +PT=D083829AB624DC46BF55F15C2ACA2CDC + +I=325 +KEY=BA7A14391DDD8446E6A2E28FFAFCF4DF +CT=D083829AB624DC46BF55F15C2ACA2CDC +PT=637A1328711A701F011B0D66953A11FC + +I=326 +KEY=D90007116CC7F459E7B9EFE96FC6E523 +CT=637A1328711A701F011B0D66953A11FC +PT=9230F9E8C4AA7D697641B4E800AECE8B + +I=327 +KEY=4B30FEF9A86D893091F85B016F682BA8 +CT=9230F9E8C4AA7D697641B4E800AECE8B +PT=CABC2F3EBCB87AEF4550060FB6F95C7D + +I=328 +KEY=818CD1C714D5F3DFD4A85D0ED99177D5 +CT=CABC2F3EBCB87AEF4550060FB6F95C7D +PT=25C93DA609BEDFD48D88B7E005EA9D4D + +I=329 +KEY=A445EC611D6B2C0B5920EAEEDC7BEA98 +CT=25C93DA609BEDFD48D88B7E005EA9D4D +PT=E445C1B43DC6AA0D47C766675676CA29 + +I=330 +KEY=40002DD520AD86061EE78C898A0D20B1 +CT=E445C1B43DC6AA0D47C766675676CA29 +PT=3F8A99E9D556F0CE0B0F3B4FE89A7C15 + +I=331 +KEY=7F8AB43CF5FB76C815E8B7C662975CA4 +CT=3F8A99E9D556F0CE0B0F3B4FE89A7C15 +PT=BE04197CADBDBC917AB288D85C554D4A + +I=332 +KEY=C18EAD405846CA596F5A3F1E3EC211EE +CT=BE04197CADBDBC917AB288D85C554D4A +PT=2CF8FE59EED67AF15BD6C09C8DA37882 + +I=333 +KEY=ED765319B690B0A8348CFF82B361696C +CT=2CF8FE59EED67AF15BD6C09C8DA37882 +PT=FF8CBF98D0B15198ACDC53D7247511C5 + +I=334 +KEY=12FAEC816621E1309850AC55971478A9 +CT=FF8CBF98D0B15198ACDC53D7247511C5 +PT=27794678855BAE2BDE7EB75487813E28 + +I=335 +KEY=3583AAF9E37A4F1B462E1B0110954681 +CT=27794678855BAE2BDE7EB75487813E28 +PT=5681B2CECDE71663A864D0288607D86B + +I=336 +KEY=630218372E9D5978EE4ACB2996929EEA +CT=5681B2CECDE71663A864D0288607D86B +PT=8936EB6E65F2CD2B3AFD1310B5B2D6C8 + +I=337 +KEY=EA34F3594B6F9453D4B7D83923204822 +CT=8936EB6E65F2CD2B3AFD1310B5B2D6C8 +PT=16045490148187B05CC46B80099A4530 + +I=338 +KEY=FC30A7C95FEE13E38873B3B92ABA0D12 +CT=16045490148187B05CC46B80099A4530 +PT=FE909FFB1D490B028867288FE682EEE9 + +I=339 +KEY=02A0383242A718E100149B36CC38E3FB +CT=FE909FFB1D490B028867288FE682EEE9 +PT=7B3E5C0017089A7842866ABA6364FFEA + +I=340 +KEY=799E643255AF82994292F18CAF5C1C11 +CT=7B3E5C0017089A7842866ABA6364FFEA +PT=CC263F129618975F204AE499F115C69B + +I=341 +KEY=B5B85B20C3B715C662D815155E49DA8A +CT=CC263F129618975F204AE499F115C69B +PT=997ACE7EABF6EBF9CC7BBCC2670CF1A0 + +I=342 +KEY=2CC2955E6841FE3FAEA3A9D739452B2A +CT=997ACE7EABF6EBF9CC7BBCC2670CF1A0 +PT=88D4A74B19278ED442068D0954DFA8B2 + +I=343 +KEY=A4163215716670EBECA524DE6D9A8398 +CT=88D4A74B19278ED442068D0954DFA8B2 +PT=F1CC6407AB254178DEFEF983112D6AC5 + +I=344 +KEY=55DA5612DA433193325BDD5D7CB7E95D +CT=F1CC6407AB254178DEFEF983112D6AC5 +PT=689A0E429CDAF1BD1197C160BF962544 + +I=345 +KEY=3D4058504699C02E23CC1C3DC321CC19 +CT=689A0E429CDAF1BD1197C160BF962544 +PT=54CF618196D978C0460CF8051DF5BE18 + +I=346 +KEY=698F39D1D040B8EE65C0E438DED47201 +CT=54CF618196D978C0460CF8051DF5BE18 +PT=4AA0EF106F23B43C3DD371C66404C602 + +I=347 +KEY=232FD6C1BF630CD2581395FEBAD0B403 +CT=4AA0EF106F23B43C3DD371C66404C602 +PT=A5185CAE1718143FC6CC329D9F233E17 + +I=348 +KEY=86378A6FA87B18ED9EDFA76325F38A14 +CT=A5185CAE1718143FC6CC329D9F233E17 +PT=A2A7E8855D25A0C475961E9B7ED7BE35 + +I=349 +KEY=249062EAF55EB829EB49B9F85B243421 +CT=A2A7E8855D25A0C475961E9B7ED7BE35 +PT=E0B7536B335FB98F197F762B3B97CECE + +I=350 +KEY=C4273181C60101A6F236CFD360B3FAEF +CT=E0B7536B335FB98F197F762B3B97CECE +PT=C45C38164083871528D8B3BA7423BFEA + +I=351 +KEY=007B0997868286B3DAEE7C6914904505 +CT=C45C38164083871528D8B3BA7423BFEA +PT=017AEBDEF43CF9664C582356A4A0C374 + +I=352 +KEY=0101E24972BE7FD596B65F3FB0308671 +CT=017AEBDEF43CF9664C582356A4A0C374 +PT=BBB48EA21B5EDCCF5346A7B4E6796BED + +I=353 +KEY=BAB56CEB69E0A31AC5F0F88B5649ED9C +CT=BBB48EA21B5EDCCF5346A7B4E6796BED +PT=3A53DFCB6067F9E98653136A44A4B537 + +I=354 +KEY=80E6B32009875AF343A3EBE112ED58AB +CT=3A53DFCB6067F9E98653136A44A4B537 +PT=951BA0E2272E46FC8CC3990E002EEFF0 + +I=355 +KEY=15FD13C22EA91C0FCF6072EF12C3B75B +CT=951BA0E2272E46FC8CC3990E002EEFF0 +PT=249202E40BC5892B9CEE96279E69432A + +I=356 +KEY=316F1126256C9524538EE4C88CAAF471 +CT=249202E40BC5892B9CEE96279E69432A +PT=B90CE5BF126163B37F75032A88AFD615 + +I=357 +KEY=8863F499370DF6972CFBE7E204052264 +CT=B90CE5BF126163B37F75032A88AFD615 +PT=E0BDD9E1FF493D82777BD7FB4035D309 + +I=358 +KEY=68DE2D78C844CB155B8030194430F16D +CT=E0BDD9E1FF493D82777BD7FB4035D309 +PT=0A3A5E377CDB2D1F6CB09E200494F578 + +I=359 +KEY=62E4734FB49FE60A3730AE3940A40415 +CT=0A3A5E377CDB2D1F6CB09E200494F578 +PT=483DF6E2936389D1FC09921497AF8AE7 + +I=360 +KEY=2AD985AD27FC6FDBCB393C2DD70B8EF2 +CT=483DF6E2936389D1FC09921497AF8AE7 +PT=7A90B7B1E493109323A54AD285090EC6 + +I=361 +KEY=5049321CC36F7F48E89C76FF52028034 +CT=7A90B7B1E493109323A54AD285090EC6 +PT=B6471BF36A24B5B0CAC19BDD4C83DC50 + +I=362 +KEY=E60E29EFA94BCAF8225DED221E815C64 +CT=B6471BF36A24B5B0CAC19BDD4C83DC50 +PT=EFBDC6ECADCE6AA5DBD302E7A0647700 + +I=363 +KEY=09B3EF030485A05DF98EEFC5BEE52B64 +CT=EFBDC6ECADCE6AA5DBD302E7A0647700 +PT=783A89B88CC875F743B645BA1449CEE7 + +I=364 +KEY=718966BB884DD5AABA38AA7FAAACE583 +CT=783A89B88CC875F743B645BA1449CEE7 +PT=EAD61D2577852D4EA276F3699EFB2BDC + +I=365 +KEY=9B5F7B9EFFC8F8E4184E59163457CE5F +CT=EAD61D2577852D4EA276F3699EFB2BDC +PT=9E804D8814AF4FC67BA931D1C72774C7 + +I=366 +KEY=05DF3616EB67B72263E768C7F370BA98 +CT=9E804D8814AF4FC67BA931D1C72774C7 +PT=7C383CC27D8C2B117AC72088EB334FD9 + +I=367 +KEY=79E70AD496EB9C331920484F1843F541 +CT=7C383CC27D8C2B117AC72088EB334FD9 +PT=9D4BE61ECECB2E60EC621A6320C0E844 + +I=368 +KEY=E4ACECCA5820B253F542522C38831D05 +CT=9D4BE61ECECB2E60EC621A6320C0E844 +PT=227992ADFC526D9AA99BA629E7523198 + +I=369 +KEY=C6D57E67A472DFC95CD9F405DFD12C9D +CT=227992ADFC526D9AA99BA629E7523198 +PT=93A265FB7650BE75CBDD8732F65F09A5 + +I=370 +KEY=55771B9CD22261BC97047337298E2538 +CT=93A265FB7650BE75CBDD8732F65F09A5 +PT=5AB3354B8D28F041C5A7FDAB828996BC + +I=371 +KEY=0FC42ED75F0A91FD52A38E9CAB07B384 +CT=5AB3354B8D28F041C5A7FDAB828996BC +PT=BA5C6566701BD3791C2DA51CDC5AB6DD + +I=372 +KEY=B5984BB12F1142844E8E2B80775D0559 +CT=BA5C6566701BD3791C2DA51CDC5AB6DD +PT=2C96CE0653EFB1113C6E822DD4AE6200 + +I=373 +KEY=990E85B77CFEF39572E0A9ADA3F36759 +CT=2C96CE0653EFB1113C6E822DD4AE6200 +PT=1065F5519472C78BADAB79EC00BBCABA + +I=374 +KEY=896B70E6E88C341EDF4BD041A348ADE3 +CT=1065F5519472C78BADAB79EC00BBCABA +PT=049AA7D4B4C1A59C1A16E3E5D8B46515 + +I=375 +KEY=8DF1D7325C4D9182C55D33A47BFCC8F6 +CT=049AA7D4B4C1A59C1A16E3E5D8B46515 +PT=C8F1C4179DD8FCD6942D07AF7392F481 + +I=376 +KEY=45001325C1956D545170340B086E3C77 +CT=C8F1C4179DD8FCD6942D07AF7392F481 +PT=9C9AE90AFE18822197EA47FE2F48813F + +I=377 +KEY=D99AFA2F3F8DEF75C69A73F52726BD48 +CT=9C9AE90AFE18822197EA47FE2F48813F +PT=DFBABE8688391CC868CDE134DDFFE1F0 + +I=378 +KEY=062044A9B7B4F3BDAE5792C1FAD95CB8 +CT=DFBABE8688391CC868CDE134DDFFE1F0 +PT=72BE585F98DA4DC03998B5820D5230A9 + +I=379 +KEY=749E1CF62F6EBE7D97CF2743F78B6C11 +CT=72BE585F98DA4DC03998B5820D5230A9 +PT=BCF3D47B888599A27AD63D6EFD8FB86F + +I=380 +KEY=C86DC88DA7EB27DFED191A2D0A04D47E +CT=BCF3D47B888599A27AD63D6EFD8FB86F +PT=62F7A2AD05BB46CB81B9601129100455 + +I=381 +KEY=AA9A6A20A25061146CA07A3C2314D02B +CT=62F7A2AD05BB46CB81B9601129100455 +PT=FA4D3B82232D19BE14A57422012C7751 + +I=382 +KEY=50D751A2817D78AA78050E1E2238A77A +CT=FA4D3B82232D19BE14A57422012C7751 +PT=40953AAA3D6C1BBE375A1E275754C98C + +I=383 +KEY=10426B08BC1163144F5F1039756C6EF6 +CT=40953AAA3D6C1BBE375A1E275754C98C +PT=CE9123C6A5A66AF788A8515721D646A0 + +I=384 +KEY=DED348CE19B709E3C7F7416E54BA2856 +CT=CE9123C6A5A66AF788A8515721D646A0 +PT=E45F3483E343F5C3C0AC77E955369AB3 + +I=385 +KEY=3A8C7C4DFAF4FC20075B3687018CB2E5 +CT=E45F3483E343F5C3C0AC77E955369AB3 +PT=6E7CE5F4BE070EC870691CDD494A767E + +I=386 +KEY=54F099B944F3F2E877322A5A48C6C49B +CT=6E7CE5F4BE070EC870691CDD494A767E +PT=2BB1EE551920A632E90EB9E462280365 + +I=387 +KEY=7F4177EC5DD354DA9E3C93BE2AEEC7FE +CT=2BB1EE551920A632E90EB9E462280365 +PT=692E0FA8B1C39CB96A11E21EA1B3365E + +I=388 +KEY=166F7844EC10C863F42D71A08B5DF1A0 +CT=692E0FA8B1C39CB96A11E21EA1B3365E +PT=345C0DE98A9F472B6BCBE241BB346590 + +I=389 +KEY=223375AD668F8F489FE693E130699430 +CT=345C0DE98A9F472B6BCBE241BB346590 +PT=D9D9313DC80FB90608614ECCC962207F + +I=390 +KEY=FBEA4490AE80364E9787DD2DF90BB44F +CT=D9D9313DC80FB90608614ECCC962207F +PT=7AEE31C488D1DD54B9AD8EE3AEFE546C + +I=391 +KEY=810475542651EB1A2E2A53CE57F5E023 +CT=7AEE31C488D1DD54B9AD8EE3AEFE546C +PT=9CF27E1202080D9F3A9B5E02290204EA + +I=392 +KEY=1DF60B462459E68514B10DCC7EF7E4C9 +CT=9CF27E1202080D9F3A9B5E02290204EA +PT=670085C6D3B95C6017DB9163B9D2D565 + +I=393 +KEY=7AF68E80F7E0BAE5036A9CAFC72531AC +CT=670085C6D3B95C6017DB9163B9D2D565 +PT=2A36E88DF74BA4B24283FEE52DDE5AA4 + +I=394 +KEY=50C0660D00AB1E5741E9624AEAFB6B08 +CT=2A36E88DF74BA4B24283FEE52DDE5AA4 +PT=81B75B31F130467F4A1FA6CA4A329E5E + +I=395 +KEY=D1773D3CF19B58280BF6C480A0C9F556 +CT=81B75B31F130467F4A1FA6CA4A329E5E +PT=D0A0347102BD11F9E2BD8E8A72D53ADC + +I=396 +KEY=01D7094DF32649D1E94B4A0AD21CCF8A +CT=D0A0347102BD11F9E2BD8E8A72D53ADC +PT=97F0187509608DF1D9B27AB5D005E505 + +I=397 +KEY=96271138FA46C42030F930BF02192A8F +CT=97F0187509608DF1D9B27AB5D005E505 +PT=E60139E36ECD7B24C7C98772C92A1E87 + +I=398 +KEY=702628DB948BBF04F730B7CDCB333408 +CT=E60139E36ECD7B24C7C98772C92A1E87 +PT=7E92E19E07A469E7D49D3D07EF719157 + +I=399 +KEY=0EB4C945932FD6E323AD8ACA2442A55F +CT=7E92E19E07A469E7D49D3D07EF719157 +PT=F5BF8B37136F2E1F6BEC6F572021E3BA + +========================= + +KEYSIZE=192 + +I=0 +KEY=000000000000000000000000000000000000000000000000 +CT=00000000000000000000000000000000 +PT=48E31E9E256718F29229319C19F15BA4 + +I=1 +KEY=9643D8334A63DF4D48E31E9E256718F29229319C19F15BA4 +CT=48E31E9E256718F29229319C19F15BA4 +PT=CC01684BE9B29ED01EA7923E7D2380AA + +I=2 +KEY=EF334C87288C43DE84E276D5CCD586228C8EA3A264D2DB0E +CT=CC01684BE9B29ED01EA7923E7D2380AA +PT=8726B4E66D6B8FBAA22D42981A5A40CC + +I=3 +KEY=0891A045BB044B9D03C4C233A1BE09982EA3E13A7E889BC2 +CT=8726B4E66D6B8FBAA22D42981A5A40CC +PT=83B9A21A0710FDB9C603797613772ED6 + +I=4 +KEY=A5233519DE914717807D6029A6AEF421E8A0984C6DFFB514 +CT=83B9A21A0710FDB9C603797613772ED6 +PT=F15479A2B2C250F7E5C11D333D867CBD + +I=5 +KEY=A1CB19726DB4C2C77129198B146CA4D60D61857F5079C9A9 +CT=F15479A2B2C250F7E5C11D333D867CBD +PT=C1AF401BD4E62D8BA15BEC3690F2FB25 + +I=6 +KEY=04B03C15DB8324B3B0865990C08A895DAC3A6949C08B328C +CT=C1AF401BD4E62D8BA15BEC3690F2FB25 +PT=01E01E3B10470286035EBD7502EF11A0 + +I=7 +KEY=A1CB0164AB1E88EDB16647ABD0CD8BDBAF64D43CC264232C +CT=01E01E3B10470286035EBD7502EF11A0 +PT=A681127825B718411291106AB416779A + +I=8 +KEY=27BFD9CB824C525617E755D3F57A939ABDF5C456767254B6 +CT=A681127825B718411291106AB416779A +PT=5C2EBA728589A9CAA15E28E7D8E59AA0 + +I=9 +KEY=B308E0DCE108194C4BC9EFA170F33A501CABECB1AE97CE16 +CT=5C2EBA728589A9CAA15E28E7D8E59AA0 +PT=E738305279BE636648B6D5FFA3E97E4A + +I=10 +KEY=FE787701EE66664BACF1DFF3094D5936541D394E0D7EB05C +CT=E738305279BE636648B6D5FFA3E97E4A +PT=5AF7D4C9439C7412FD7236E7685659DF + +I=11 +KEY=DD93D742AFA0B19CF6060B3A4AD12D24A96F0FA96528E983 +CT=5AF7D4C9439C7412FD7236E7685659DF +PT=30D0681D4060E24D1427D1AAC498DB1B + +I=12 +KEY=D5D19C2FEA9DC94BC6D663270AB1CF69BD48DE03A1B03298 +CT=30D0681D4060E24D1427D1AAC498DB1B +PT=FC9B6752064B1CCE75EBFBE91AF8F2CD + +I=13 +KEY=EB0954ECE44620833A4D04750CFAD3A7C8A325EABB48C055 +CT=FC9B6752064B1CCE75EBFBE91AF8F2CD +PT=61E6AE6E035BCC3C94EF00101216904A + +I=14 +KEY=E6E5AB38545B6DF75BABAA1B0FA11F9B5C4C25FAA95E501F +CT=61E6AE6E035BCC3C94EF00101216904A +PT=BF738A4E55F036126CC9B56DED530B8C + +I=15 +KEY=E8C670F71E5B62B6E4D820555A51298930859097440D5B93 +CT=BF738A4E55F036126CC9B56DED530B8C +PT=6B9CD4C227FC30C14FD881B838D9F8F5 + +I=16 +KEY=23FF647DD75770418F44F4977DAD19487F5D112F7CD4A366 +CT=6B9CD4C227FC30C14FD881B838D9F8F5 +PT=6173EF2B5C9B569A1BD4B62C7C913844 + +I=17 +KEY=DB94124B11CC03D9EE371BBC21364FD26489A70300459B22 +CT=6173EF2B5C9B569A1BD4B62C7C913844 +PT=709EF90F853E55123A917FB258E900F9 + +I=18 +KEY=4821CA96B50ACA049EA9E2B3A4081AC05E18D8B158AC9BDB +CT=709EF90F853E55123A917FB258E900F9 +PT=5D73D99E47B1DB28E0ED9B9D1C212CFA + +I=19 +KEY=FA47C5BF5E688F8BC3DA3B2DE3B9C1E8BEF5432C448DB721 +CT=5D73D99E47B1DB28E0ED9B9D1C212CFA +PT=32016FFCB2AA5EA6EA0C808F60613CA2 + +I=20 +KEY=C66A73E0D1261C2CF1DB54D151139F4E54F9C3A324EC8B83 +CT=32016FFCB2AA5EA6EA0C808F60613CA2 +PT=CAA3704F7FD76EBACB1D2A266A0899FF + +I=21 +KEY=FAE8E04094E572A33B78249E2EC4F1F49FE4E9854EE4127C +CT=CAA3704F7FD76EBACB1D2A266A0899FF +PT=E32DBD027A1A36B2EC8D0A98C9293E7E + +I=22 +KEY=8F2FBF9E40182950D855999C54DEC7467369E31D87CD2C02 +CT=E32DBD027A1A36B2EC8D0A98C9293E7E +PT=1C117311882C0D5159A9DFD5C3C68D95 + +I=23 +KEY=F6FB8F6DFAA034BFC444EA8DDCF2CA172AC03CC8440BA197 +CT=1C117311882C0D5159A9DFD5C3C68D95 +PT=5E379C2471DB04582CD861E6F8A419D7 + +I=24 +KEY=699DCA67F4EF50C49A7376A9AD29CE4F06185D2EBCAFB840 +CT=5E379C2471DB04582CD861E6F8A419D7 +PT=5932A84C6ACBD8452EE9AC47CE4B6BD8 + +I=25 +KEY=F568B4F126486CE4C341DEE5C7E2160A28F1F16972E4D398 +CT=5932A84C6ACBD8452EE9AC47CE4B6BD8 +PT=00634EED1D18C84AE0A8198CF791DE81 + +I=26 +KEY=C49E5E8D366B6FE7C3229008DAFADE40C859E8E585750D19 +CT=00634EED1D18C84AE0A8198CF791DE81 +PT=E10C93B1C466FFF0B6EB6DB50AF271EC + +I=27 +KEY=22B07DB9ED443A9D222E03B91E9C21B07EB285508F877CF5 +CT=E10C93B1C466FFF0B6EB6DB50AF271EC +PT=58A0C680F565E63A7E41C6EAC50A3B01 + +I=28 +KEY=2BDF4CCE2B4CAFDD7A8EC539EBF9C78A00F343BA4A8D47F4 +CT=58A0C680F565E63A7E41C6EAC50A3B01 +PT=92921B2AA7FC6367199A4C42FAE0E2A4 + +I=29 +KEY=E2BE29F6905D41C5E81CDE134C05A4ED19690FF8B06DA550 +CT=92921B2AA7FC6367199A4C42FAE0E2A4 +PT=B6EC2A692D2657E5506F2C3BA1912799 + +I=30 +KEY=E43634FD3DB719C75EF0F47A6123F308490623C311FC82C9 +CT=B6EC2A692D2657E5506F2C3BA1912799 +PT=23ECD0813B1A7090CF9BE874D6B0846C + +I=31 +KEY=ACA2F21EF46E30B57D1C24FB5A398398869DCBB7C74C06A5 +CT=23ECD0813B1A7090CF9BE874D6B0846C +PT=04BD52F4C1AB8DF4816A6E11F8B54452 + +I=32 +KEY=0130B37AFE24D66079A1760F9B920E6C07F7A5A63FF942F7 +CT=04BD52F4C1AB8DF4816A6E11F8B54452 +PT=DFA0074DEFEDB44D0D96AD6020D1A37D + +I=33 +KEY=00AC6BF5E3AD20FFA6017142747FBA210A6108C61F28E18A +CT=DFA0074DEFEDB44D0D96AD6020D1A37D +PT=5AB15057E05F73FAAF12C0EC26D3F02F + +I=34 +KEY=E3A70EBF3D9167AAFCB021159420C9DBA573C82A39FB11A5 +CT=5AB15057E05F73FAAF12C0EC26D3F02F +PT=6ECC2F23AB7854E97F215C52EF1E62E0 + +I=35 +KEY=CBCD9116DC78FA64927C0E363F589D32DA529478D6E57345 +CT=6ECC2F23AB7854E97F215C52EF1E62E0 +PT=930B3EBDE0989049056022E83FC9EF1E + +I=36 +KEY=FBB5E5462DE715180177308BDFC00D7BDF32B690E92C9C5B +CT=930B3EBDE0989049056022E83FC9EF1E +PT=1EE4ABB9ACD70B93A83BCD8751F858DE + +I=37 +KEY=E5D2B1ACD8BE6DF21F939B32731706E877097B17B8D4C485 +CT=1EE4ABB9ACD70B93A83BCD8751F858DE +PT=FCAC610EA0D309C6D36EED5A4BC04036 + +I=38 +KEY=54DD0B6CB083BDE8E33FFA3CD3C40F2EA467964DF31484B3 +CT=FCAC610EA0D309C6D36EED5A4BC04036 +PT=161D5EE8F50A3F69A11ADFEAF1A2A2AA + +I=39 +KEY=28309F7EB99AAEE1F522A4D426CE3047057D49A702B62619 +CT=161D5EE8F50A3F69A11ADFEAF1A2A2AA +PT=D9D365B061D2F3BF9DF94181837621B4 + +I=40 +KEY=E55ECDDFAE95A2C92CF1C164471CC3F89884082681C007AD +CT=D9D365B061D2F3BF9DF94181837621B4 +PT=938647A6AAD455D89A6DFEFE60D62331 + +I=41 +KEY=C9CEE1C9D89DF76ABF7786C2EDC8962002E9F6D8E116249C +CT=938647A6AAD455D89A6DFEFE60D62331 +PT=06A002DDC7DC4F22F9B1D5734C312AAA + +I=42 +KEY=B26709109B66C916B9D7841F2A14D902FB5823ABAD270E36 +CT=06A002DDC7DC4F22F9B1D5734C312AAA +PT=BB45E9BE2237E3288F56EDD0D9AD6734 + +I=43 +KEY=2FAD2FF32E10680502926DA108233A2A740ECE7B748A6902 +CT=BB45E9BE2237E3288F56EDD0D9AD6734 +PT=CF5A1338F5FA7ED4C77F6EA3836F079A + +I=44 +KEY=63D3D62540C790D1CDC87E99FDD944FEB371A0D8F7E56E98 +CT=CF5A1338F5FA7ED4C77F6EA3836F079A +PT=32F2D628117ADB46383FC101B58E95A6 + +I=45 +KEY=0DF38CE71CF26A19FF3AA8B1ECA39FB88B4E61D9426BFB3E +CT=32F2D628117ADB46383FC101B58E95A6 +PT=3A3CCEA99D43887AC64498AB4EFC87DD + +I=46 +KEY=7EEEB78A0C9BAA9FC506661871E017C24D0AF9720C977CE3 +CT=3A3CCEA99D43887AC64498AB4EFC87DD +PT=787DC1C632C4AA77D42324338C510146 + +I=47 +KEY=4DF02EE427AE29A1BD7BA7DE4324BDB59929DD4180C67DA5 +CT=787DC1C632C4AA77D42324338C510146 +PT=BB0635A471D26B80E5E387E4F14A1626 + +I=48 +KEY=D6983F5E8BE728D9067D927A32F6D6357CCA5AA5718C6B83 +CT=BB0635A471D26B80E5E387E4F14A1626 +PT=14A9AA3EE6343C2D57E0F2ED7A05DC0D + +I=49 +KEY=BD84A7CD471613B512D43844D4C2EA182B2AA8480B89B78E +CT=14A9AA3EE6343C2D57E0F2ED7A05DC0D +PT=25E254AD6C33908BC07B3DEC4052F549 + +I=50 +KEY=E54A2146242AADFB37366CE9B8F17A93EB5195A44BDB42C7 +CT=25E254AD6C33908BC07B3DEC4052F549 +PT=10E09F426E6F33CD21DF1EB748A46088 + +I=51 +KEY=0517B745BCE24E0527D6F3ABD69E495ECA8E8B13037F224F +CT=10E09F426E6F33CD21DF1EB748A46088 +PT=B65D2FFE83F9469AA2B1ABC559EAAB87 + +I=52 +KEY=8297790C75E8931C918BDC5555670FC4683F20D65A9589C8 +CT=B65D2FFE83F9469AA2B1ABC559EAAB87 +PT=E743F6441CCF9703FF4B8E3F4921ACDF + +I=53 +KEY=7EC47C0C5663CD4C76C82A1149A898C79774AEE913B42517 +CT=E743F6441CCF9703FF4B8E3F4921ACDF +PT=BECC5CF2F2C62A9E7D3CF979A9E96F94 + +I=54 +KEY=FBB1F10529FABEB3C80476E3BB6EB259EA485790BA5D4A83 +CT=BECC5CF2F2C62A9E7D3CF979A9E96F94 +PT=3718199958EAA473B980B95F9C76E03F + +I=55 +KEY=EE4113D30720269DFF1C6F7AE384162A53C8EECF262BAABC +CT=3718199958EAA473B980B95F9C76E03F +PT=D15525B8BBB6D209E0BB3B6F5ACB2556 + +I=56 +KEY=488286944DC6B0842E494AC25832C423B373D5A07CE08FEA +CT=D15525B8BBB6D209E0BB3B6F5ACB2556 +PT=0270AF07DDA52DF7CA7B0EE7DF098A80 + +I=57 +KEY=A32A880A84E7EDB82C39E5C58597E9D47908DB47A3E9056A +CT=0270AF07DDA52DF7CA7B0EE7DF098A80 +PT=2D380F99A182CD14CFFEF5E88B93B416 + +I=58 +KEY=DBD0FD5053BC52C60101EA5C241524C0B6F62EAF287AB17C +CT=2D380F99A182CD14CFFEF5E88B93B416 +PT=47FE8C67DCBC616E4C984D323EA4A45B + +I=59 +KEY=D79F78A4726F5FCA46FF663BF8A945AEFA6E639D16DE1527 +CT=47FE8C67DCBC616E4C984D323EA4A45B +PT=FA595C69C3286771FB8C921DFBBFFC2E + +I=60 +KEY=0C88AAD46F951FB6BCA63A523B8122DF01E2F180ED61E909 +CT=FA595C69C3286771FB8C921DFBBFFC2E +PT=8FA64C511FCE6FC987B327D12EBDADAD + +I=61 +KEY=762EEA21D382067E33007603244F4D168651D651C3DC44A4 +CT=8FA64C511FCE6FC987B327D12EBDADAD +PT=8F52C709508408B40C241FD38E515E76 + +I=62 +KEY=EA05788C20FB364EBC52B10A74CB45A28A75C9824D8D1AD2 +CT=8F52C709508408B40C241FD38E515E76 +PT=7CFD332B306684AC92279CE06F1287D8 + +I=63 +KEY=D4B2582B094D874DC0AF822144ADC10E18525562229F9D0A +CT=7CFD332B306684AC92279CE06F1287D8 +PT=0DA14F6619665E0128044355481BD658 + +I=64 +KEY=C080E7033FDF1BCFCD0ECD475DCB9F0F305616376A844B52 +CT=0DA14F6619665E0128044355481BD658 +PT=FEDEBE73AA4047AF27E86A8B9E8E2ED7 + +I=65 +KEY=C5BA9667999CF2D633D07334F78BD8A017BE7CBCF40A6585 +CT=FEDEBE73AA4047AF27E86A8B9E8E2ED7 +PT=12CD6896129E376AAB9C0E980F3B7CD2 + +I=66 +KEY=65FF092A539C4600211D1BA2E515EFCABC227224FB311957 +CT=12CD6896129E376AAB9C0E980F3B7CD2 +PT=04E7939B352F7B5C38B7EC5784EC78C2 + +I=67 +KEY=F98E7062F9EBE61C25FA8839D03A949684959E737FDD6195 +CT=04E7939B352F7B5C38B7EC5784EC78C2 +PT=0184996278A57E36E608E95616C46964 + +I=68 +KEY=306FBEFB3BF4E241247E115BA89FEAA0629D7725691908F1 +CT=0184996278A57E36E608E95616C46964 +PT=92179E392E05C8B96A0CFAC36109B09E + +I=69 +KEY=EE641F5DB58F9057B6698F62869A221908918DE60810B86F +CT=92179E392E05C8B96A0CFAC36109B09E +PT=7F197B01172C809635198E6B156D13BC + +I=70 +KEY=EADB8B255F98FD9DC970F46391B6A28F3D88038D1D7DABD3 +CT=7F197B01172C809635198E6B156D13BC +PT=46F6DD79AD079DCFBC451B24ECDDA4FA + +I=71 +KEY=47225D75FE68FFA08F86291A3CB13F4081CD18A9F1A00F29 +CT=46F6DD79AD079DCFBC451B24ECDDA4FA +PT=B5DAA09E3545F92FF44176187A1F9179 + +I=72 +KEY=7CDECC21E72E54F43A5C898409F4C66F758C6EB18BBF9E50 +CT=B5DAA09E3545F92FF44176187A1F9179 +PT=F51A35F3DD410132EEC9E9F22A6F6FAB + +I=73 +KEY=75D1AAFDBFE72C94CF46BC77D4B5C75D9B458743A1D0F1FB +CT=F51A35F3DD410132EEC9E9F22A6F6FAB +PT=D1CC6D95B58793C342CF14AF250D5E40 + +I=74 +KEY=41874C54BD58757A1E8AD1E26132549ED98A93EC84DDAFBB +CT=D1CC6D95B58793C342CF14AF250D5E40 +PT=A1FAB3B352A887A829357528FED4B80E + +I=75 +KEY=1D94704F4A51A5CABF706251339AD336F0BFE6C47A0917B5 +CT=A1FAB3B352A887A829357528FED4B80E +PT=CBC6473B3AA4DE2D64EED554CA241EAC + +I=76 +KEY=A41B52E0AE7E568074B6256A093E0D1B94513390B02D0919 +CT=CBC6473B3AA4DE2D64EED554CA241EAC +PT=19DC6E89D71DCE5DCECD1A6F85C3FBD6 + +I=77 +KEY=85F21BCD70691F596D6A4BE3DE23C3465A9C29FF35EEF2CF +CT=19DC6E89D71DCE5DCECD1A6F85C3FBD6 +PT=EC6974E51B21F26A100E66183C68FD15 + +I=78 +KEY=CAD0B254A88B669681033F06C502312C4A924FE709860FDA +CT=EC6974E51B21F26A100E66183C68FD15 +PT=A16B6F78009B6E30CB758E87AD4D8034 + +I=79 +KEY=8AC49B19582BFCF32068507EC5995F1C81E7C160A4CB8FEE +CT=A16B6F78009B6E30CB758E87AD4D8034 +PT=CB5C20AAFA898193BC34FF3EE460B313 + +I=80 +KEY=988F8D4F3A66AC99EB3470D43F10DE8F3DD33E5E40AB3CFD +CT=CB5C20AAFA898193BC34FF3EE460B313 +PT=397F92C8E69E0916E30DC6889779799E + +I=81 +KEY=DE2D26C6130E006ED24BE21CD98ED799DEDEF8D6D7D24563 +CT=397F92C8E69E0916E30DC6889779799E +PT=9A9CBD9380E2187855CAE5A73D58480F + +I=82 +KEY=BF6BE6D55C04977348D75F8F596CCFE18B141D71EA8A0D6C +CT=9A9CBD9380E2187855CAE5A73D58480F +PT=B67B360EE0FF297D3662F5B7CDB82CB9 + +I=83 +KEY=6582BCA895FA1221FEAC6981B993E69CBD76E8C6273221D5 +CT=B67B360EE0FF297D3662F5B7CDB82CB9 +PT=2D146ED9236082D2D71810969A1AB1FB + +I=84 +KEY=6AC68BB8BBC7F520D3B807589AF3644E6A6EF850BD28902E +CT=2D146ED9236082D2D71810969A1AB1FB +PT=4B9F55652C40B6DA963A98D875ADACE4 + +I=85 +KEY=180DAB1B14A92DB29827523DB6B3D294FC546088C8853CCA +CT=4B9F55652C40B6DA963A98D875ADACE4 +PT=FC0A8A3D511F5FAFF0A3DD13B49E5A13 + +I=86 +KEY=7ABD7440D5EE5FE2642DD800E7AC8D3B0CF7BD9B7C1B66D9 +CT=FC0A8A3D511F5FAFF0A3DD13B49E5A13 +PT=4231C02AD3231C3EB7AEB9135B95AC4B + +I=87 +KEY=54ACAE182B5FDACF261C182A348F9105BB590488278ECA92 +CT=4231C02AD3231C3EB7AEB9135B95AC4B +PT=4C3A949ACCCBB55F9415C81B1413FD9D + +I=88 +KEY=015706F99E81CC026A268CB0F844245A2F4CCC93339D370F +CT=4C3A949ACCCBB55F9415C81B1413FD9D +PT=E9B1CEAF77B64A88CC3E020B16E1BF7E + +I=89 +KEY=929BD0A1CC6450E78397421F8FF26ED2E372CE98257C8871 +CT=E9B1CEAF77B64A88CC3E020B16E1BF7E +PT=98FFEA0827068CB0B508CA520D8B43F7 + +I=90 +KEY=9B81EC47D8442D311B68A817A8F4E262567A04CA28F7CB86 +CT=98FFEA0827068CB0B508CA520D8B43F7 +PT=BEDA572C3CA3FEF97F7071DA35414EA1 + +I=91 +KEY=93B211B869CBECCBA5B2FF3B94571C9B290A75101DB68527 +CT=BEDA572C3CA3FEF97F7071DA35414EA1 +PT=35E8CB8302748C8623A09980909FB516 + +I=92 +KEY=BC5320E4025EB960905A34B89623901D0AAAEC908D293031 +CT=35E8CB8302748C8623A09980909FB516 +PT=E136148B2FA5AF5CD3F8BC3883566CB8 + +I=93 +KEY=C4EC937F948D0B5A716C2033B9863F41D95250A80E7F5C89 +CT=E136148B2FA5AF5CD3F8BC3883566CB8 +PT=B7CE40E3E3D30191CDF4AB5BE98F347A + +I=94 +KEY=6D381856C149D9DCC6A260D05A553ED014A6FBF3E7F068F3 +CT=B7CE40E3E3D30191CDF4AB5BE98F347A +PT=A821E934DAAE37FF3136E769DAC315FB + +I=95 +KEY=A3679C5957C656DE6E8389E480FB092F25901C9A3D337D08 +CT=A821E934DAAE37FF3136E769DAC315FB +PT=4227B96A0CC6CA1C21BCF8B1ADB3BDE1 + +I=96 +KEY=BE7112453B1DF3EC2CA4308E8C3DC333042CE42B9080C0E9 +CT=4227B96A0CC6CA1C21BCF8B1ADB3BDE1 +PT=EE36BBFDDF19165F9E64AE79B4CF06A9 + +I=97 +KEY=AEA4A2D5CD0A2FC7C2928B735324D56C9A484A52244FC640 +CT=EE36BBFDDF19165F9E64AE79B4CF06A9 +PT=C3DFE088C6767BC939F492C1FA9604CD + +I=98 +KEY=A16FC5F22F03984F014D6BFB9552AEA5A3BCD893DED9C28D +CT=C3DFE088C6767BC939F492C1FA9604CD +PT=DB1202E468119D977868F6E294E3CC3A + +I=99 +KEY=A4E0565DD419BDD1DA5F691FFD433332DBD42E714A3A0EB7 +CT=DB1202E468119D977868F6E294E3CC3A +PT=6F2F682BA4F95EB8C5B883C7660B2653 + +I=100 +KEY=3CAEE44D0E85058EB570013459BA6D8A1E6CADB62C3128E4 +CT=6F2F682BA4F95EB8C5B883C7660B2653 +PT=1036B4AA6C897D36DFE6658A953E5075 + +I=101 +KEY=4E883A500CA89963A546B59E353310BCC18AC83CB90F7891 +CT=1036B4AA6C897D36DFE6658A953E5075 +PT=04FCB3A81E5319A16CCF212719906229 + +I=102 +KEY=ADED5A405C5C095AA1BA06362B60091DAD45E91BA09F1AB8 +CT=04FCB3A81E5319A16CCF212719906229 +PT=CD79BAC069BB58605D43005B927816E5 + +I=103 +KEY=5499B441405D16B06CC3BCF642DB517DF006E94032E70C5D +CT=CD79BAC069BB58605D43005B927816E5 +PT=DB5B3C625D1F66CF28A86CC100472398 + +I=104 +KEY=D31221246382CA8EB79880941FC437B2D8AE858132A02FC5 +CT=DB5B3C625D1F66CF28A86CC100472398 +PT=D8732A2C16EC6AE202371AF03A6F91E8 + +I=105 +KEY=CDF928E97051F08B6FEBAAB809285D50DA999F7108CFBE2D +CT=D8732A2C16EC6AE202371AF03A6F91E8 +PT=F0A1A353A8AB9A893F621F0BEA3B4F01 + +I=106 +KEY=10CC2EED0ECBD1E69F4A09EBA183C7D9E5FB807AE2F4F12C +CT=F0A1A353A8AB9A893F621F0BEA3B4F01 +PT=27E4451BD15E43F301E138713DC12E78 + +I=107 +KEY=03C4F5E1FD3D34D1B8AE4CF070DD842AE41AB80BDF35DF54 +CT=27E4451BD15E43F301E138713DC12E78 +PT=C7FA931DA414CB37A9BDB6F128E082EE + +I=108 +KEY=CC5D7D36D085E3257F54DFEDD4C94F1D4DA70EFAF7D55DBA +CT=C7FA931DA414CB37A9BDB6F128E082EE +PT=A6777D51A0A1C94DD74A18795341015F + +I=109 +KEY=9F4EE4750FF3F53AD923A2BC746886509AED1683A4945CE5 +CT=A6777D51A0A1C94DD74A18795341015F +PT=32A4D930A5597E02D7076E399D18D895 + +I=110 +KEY=8525417BB6D8095BEB877B8CD131F8524DEA78BA398C8470 +CT=32A4D930A5597E02D7076E399D18D895 +PT=1B78FCF274EEB1E597998EE4EFFF9F8B + +I=111 +KEY=54EFA98071F1EF62F0FF877EA5DF49B7DA73F65ED6731BFB +CT=1B78FCF274EEB1E597998EE4EFFF9F8B +PT=2997FEE2823CC84DA14E8439449F5C7C + +I=112 +KEY=2505931CE4D41D16D968799C27E381FA7B3D726792EC4787 +CT=2997FEE2823CC84DA14E8439449F5C7C +PT=810534A9E8DB2808FEE681B13C04411D + +I=113 +KEY=C2DF863BEB4F27AB586D4D35CF38A9F285DBF3D6AEE8069A +CT=810534A9E8DB2808FEE681B13C04411D +PT=BE2380994365F1D7FC8278E86C8B497D + +I=114 +KEY=036C0C95D0C26B66E64ECDAC8C5D582579598B3EC2634FE7 +CT=BE2380994365F1D7FC8278E86C8B497D +PT=EFEC3977D5A21DC4AC786E786CA3ECE9 + +I=115 +KEY=BD05AD63A0A9F1B509A2F4DB59FF45E1D521E546AEC0A30E +CT=EFEC3977D5A21DC4AC786E786CA3ECE9 +PT=22A7280D8231895EA4F0B6A39AC583C3 + +I=116 +KEY=A16DFA00981597B42B05DCD6DBCECCBF71D153E5340520CD +CT=22A7280D8231895EA4F0B6A39AC583C3 +PT=0CC61E91B3CBCD0E190D52059E27647A + +I=117 +KEY=ABC1AD453235832727C3C247680501B168DC01E0AA2244B7 +CT=0CC61E91B3CBCD0E190D52059E27647A +PT=5CE91F77F7C8F0AB1BBA802D2FFF0E9B + +I=118 +KEY=64D40ACA0F526EC67B2ADD309FCDF11A736681CD85DD4A2C +CT=5CE91F77F7C8F0AB1BBA802D2FFF0E9B +PT=255459BE5A27E08942A049F6EC44582E + +I=119 +KEY=8BB5C7D8B2B177855E7E848EC5EA119331C6C83B69991202 +CT=255459BE5A27E08942A049F6EC44582E +PT=28E2E20115C3665D9D88CB74681301EA + +I=120 +KEY=4E30FCC4C182F471769C668FD02977CEAC4E034F018A13E8 +CT=28E2E20115C3665D9D88CB74681301EA +PT=2E96E6BBCD999F4B1507C7EC9E4B8430 + +I=121 +KEY=906B361E9D72E107580A80341DB0E885B949C4A39FC197D8 +CT=2E96E6BBCD999F4B1507C7EC9E4B8430 +PT=03DED0A95164E5FA215E9C49C433E95B + +I=122 +KEY=F656F5D9D973C02C5BD4509D4CD40D7F981758EA5BF27E83 +CT=03DED0A95164E5FA215E9C49C433E95B +PT=AD9C16D2567B73FCA4866FE16CF09CDA + +I=123 +KEY=8811A4ACDF37A140F648464F1AAF7E833C91370B3702E259 +CT=AD9C16D2567B73FCA4866FE16CF09CDA +PT=68539BFF0F8CC23A0A3267796A11B75C + +I=124 +KEY=E5AF2E8CDBAD01589E1BDDB01523BCB936A350725D135505 +CT=68539BFF0F8CC23A0A3267796A11B75C +PT=B15F623E5A7D73452A419EB04AFCF72E + +I=125 +KEY=C9E743CAD731A62E2F44BF8E4F5ECFFC1CE2CEC217EFA22B +CT=B15F623E5A7D73452A419EB04AFCF72E +PT=520142AFDA69E9CFA98D8DD59CCB12BC + +I=126 +KEY=6CF6C656FFBB77807D45FD2195372633B56F43178B24B097 +CT=520142AFDA69E9CFA98D8DD59CCB12BC +PT=7EC2A8430F23A5E183E0032DAB5232C5 + +I=127 +KEY=772CEE9F934D57D4038755629A1483D2368F403A20768252 +CT=7EC2A8430F23A5E183E0032DAB5232C5 +PT=E5E3A5D968B1FF774B55CCA06BE3BD65 + +I=128 +KEY=9A4DAB93F3C74EBBE664F0BBF2A57CA57DDA8C9A4B953F37 +CT=E5E3A5D968B1FF774B55CCA06BE3BD65 +PT=9608643D0A34DA28372A7E7E34427E1B + +I=129 +KEY=EF0F60BCBA3374E0706C9486F891A68D4AF0F2E47FD7412C +CT=9608643D0A34DA28372A7E7E34427E1B +PT=B22BD410584F29610801B18EDAB1BD19 + +I=130 +KEY=DE013A6C3440AFF3C2474096A0DE8FEC42F1436AA566FC35 +CT=B22BD410584F29610801B18EDAB1BD19 +PT=ADEC4519F1A7AD74BCCECABEDCF20D73 + +I=131 +KEY=2B5B547A934A5A376FAB058F51792298FE3F89D47994F146 +CT=ADEC4519F1A7AD74BCCECABEDCF20D73 +PT=E04D4FF54191BEEEF5B295A32DA2ADE5 + +I=132 +KEY=BF356F2FFC2C538F8FE64A7A10E89C760B8D1C7754365CA3 +CT=E04D4FF54191BEEEF5B295A32DA2ADE5 +PT=3F9531EDD5072F7A9F2A62ECC2CCE50A + +I=133 +KEY=7CEBD7310CC4791AB0737B97C5EFB30C94A77E9B96FAB9A9 +CT=3F9531EDD5072F7A9F2A62ECC2CCE50A +PT=C3DC95781FAE7BB6C02BD08B3617DDF1 + +I=134 +KEY=192741D2AB9C887673AFEEEFDA41C8BA548CAE10A0ED6458 +CT=C3DC95781FAE7BB6C02BD08B3617DDF1 +PT=F69B837F168B9A9E637E7357B65F2B60 + +I=135 +KEY=38552740A79FB5BF85346D90CCCA522437F2DD4716B24F38 +CT=F69B837F168B9A9E637E7357B65F2B60 +PT=40DCDF58E7EFDD62C114A83F8AC898BB + +I=136 +KEY=A0AED2C07C2168B6C5E8B2C82B258F46F6E675789C7AD783 +CT=40DCDF58E7EFDD62C114A83F8AC898BB +PT=27F78F3BD8E04A8646EBF364155A71ED + +I=137 +KEY=2B4FAEBF17993E12E21F3DF3F3C5C5C0B00D861C8920A66E +CT=27F78F3BD8E04A8646EBF364155A71ED +PT=F305DFC8EAD44E786F59B0551C7104F5 + +I=138 +KEY=96819F6E9738209F111AE23B19118BB8DF5436499551A29B +CT=F305DFC8EAD44E786F59B0551C7104F5 +PT=2E47F833BE7C06ED1E42AC11366F4BEF + +I=139 +KEY=AAEA16BAC3E84DD73F5D1A08A76D8D55C1169A58A33EE974 +CT=2E47F833BE7C06ED1E42AC11366F4BEF +PT=A9D3A511C3D76779B607AAB2556823AD + +I=140 +KEY=F66BA47C56AC5A36968EBF1964BAEA2C771130EAF656CAD9 +CT=A9D3A511C3D76779B607AAB2556823AD +PT=153A7CC2387C05289F759C85076CDD88 + +I=141 +KEY=1D892BCCFAF3DA1083B4C3DB5CC6EF04E864AC6FF13A1751 +CT=153A7CC2387C05289F759C85076CDD88 +PT=76B6089030D914F0F4C6078193207A7D + +I=142 +KEY=DAEBAF980095A397F502CB4B6C1FFBF41CA2ABEE621A6D2C +CT=76B6089030D914F0F4C6078193207A7D +PT=EB71D127848BA397451D45801830461E + +I=143 +KEY=85F86FADA92076AB1E731A6CE894586359BFEE6E7A2A2B32 +CT=EB71D127848BA397451D45801830461E +PT=B79D9BE1B2DB808B412413C203C710DF + +I=144 +KEY=BEADDA5CE1E7F3D4A9EE818D5A4FD8E8189BFDAC79ED3BED +CT=B79D9BE1B2DB808B412413C203C710DF +PT=E6423467C3CA69D94C944FA2A97BB61F + +I=145 +KEY=D4664C8DCFA8304D4FACB5EA9985B131540FB20ED0968DF2 +CT=E6423467C3CA69D94C944FA2A97BB61F +PT=18EFF53B7D62A9D9ED8AB9ABE67FC110 + +I=146 +KEY=9CCF1EEAF55FEA5A574340D1E4E718E8B9850BA536E94CE2 +CT=18EFF53B7D62A9D9ED8AB9ABE67FC110 +PT=8E6A4AC577153D806ED71A07319CAB67 + +I=147 +KEY=7D840184CB9D3A05D9290A1493F22568D75211A20775E785 +CT=8E6A4AC577153D806ED71A07319CAB67 +PT=B7B23D8E7D344F39B3EA0D67CCF37377 + +I=148 +KEY=D72F35B6DD825B656E9B379AEEC66A5164B81CC5CB8694F2 +CT=B7B23D8E7D344F39B3EA0D67CCF37377 +PT=3385AD0503AF68BFBFBEAA89B1C87736 + +I=149 +KEY=48335F06D7C27C955D1E9A9FED6902EEDB06B64C7A4EE3C4 +CT=3385AD0503AF68BFBFBEAA89B1C87736 +PT=9FC40A6B984BEEC182AB650B05CEF38C + +I=150 +KEY=A66149286535FD6EC2DA90F47522EC2F59ADD3477F801048 +CT=9FC40A6B984BEEC182AB650B05CEF38C +PT=4CEC52C9DE143486DFC9D098637DFBB5 + +I=151 +KEY=7EA78450FAEEF8BF8E36C23DAB36D8A9866403DF1CFDEBFD +CT=4CEC52C9DE143486DFC9D098637DFBB5 +PT=EB8E40333ACD18EFB04DC0A857DDCD7A + +I=152 +KEY=197DDF842BAEF36E65B8820E91FBC0463629C3774B202687 +CT=EB8E40333ACD18EFB04DC0A857DDCD7A +PT=F1AFF04058F819B0F191398C8022130F + +I=153 +KEY=D68841CF848B0F619417724EC903D9F6C7B8FAFBCB023588 +CT=F1AFF04058F819B0F191398C8022130F +PT=6DF4A95D8D602C0E53F5A5C350D3EB64 + +I=154 +KEY=6DFA0F7B01A2F011F9E3DB134463F5F8944D5F389BD1DEEC +CT=6DF4A95D8D602C0E53F5A5C350D3EB64 +PT=057D8F9BE9260BB3A0382CD2EF7D1FCA + +I=155 +KEY=88227C4AD1CBC8F0FC9E5488AD45FE4B347573EA74ACC126 +CT=057D8F9BE9260BB3A0382CD2EF7D1FCA +PT=D4EDACCB9B7B35F2A0690E22C91E25AE + +I=156 +KEY=848B8E3213D366B22873F843363ECBB9941C7DC8BDB2E488 +CT=D4EDACCB9B7B35F2A0690E22C91E25AE +PT=A2F61B5BDD9F580B26C329B878BAFA3C + +I=157 +KEY=FA3A476D1C6E33FD8A85E318EBA193B2B2DF5470C5081EB4 +CT=A2F61B5BDD9F580B26C329B878BAFA3C +PT=5A0616880CD40B72B58CF268EC8F934B + +I=158 +KEY=C9F77D58F58D5FEDD083F590E77598C00753A61829878DFF +CT=5A0616880CD40B72B58CF268EC8F934B +PT=0E42047D7EDE2A5FBB37767A69A45B9B + +I=159 +KEY=00A523C700FBB663DEC1F1ED99ABB29FBC64D0624023D664 +CT=0E42047D7EDE2A5FBB37767A69A45B9B +PT=2AFA823A10BB436A7B00816C80A52711 + +I=160 +KEY=660275323A59E807F43B73D78910F1F5C764510EC086F175 +CT=2AFA823A10BB436A7B00816C80A52711 +PT=B2406F3F9160E25DF7C9AA81AF6EB449 + +I=161 +KEY=47A4FCDB97D4A383467B1CE8187013A830ADFB8F6FE8453C +CT=B2406F3F9160E25DF7C9AA81AF6EB449 +PT=B1E01D2A401495F8DDAEAB7B04BEB23D + +I=162 +KEY=2BDD5B54D4EB236AF79B01C258648650ED0350F46B56F701 +CT=B1E01D2A401495F8DDAEAB7B04BEB23D +PT=390572A9ECE28A0E0BBDC729DBE5F79A + +I=163 +KEY=328202460B65D004CE9E736BB4860C5EE6BE97DDB0B3009B +CT=390572A9ECE28A0E0BBDC729DBE5F79A +PT=5D41665811702124C597DB4E3BD950E1 + +I=164 +KEY=94457C0A759DF4E993DF1533A5F62D7A23294C938B6A507A +CT=5D41665811702124C597DB4E3BD950E1 +PT=689EB1CB1586D127696E8725DEE49E58 + +I=165 +KEY=4E0226CA850DDC79FB41A4F8B070FC5D4A47CBB6558ECE22 +CT=689EB1CB1586D127696E8725DEE49E58 +PT=A2D9DF62AC8BF8A93E7A954416864052 + +I=166 +KEY=659C817A1C10A24D59987B9A1CFB04F4743D5EF243088E70 +CT=A2D9DF62AC8BF8A93E7A954416864052 +PT=507835696F1920BD4A05797563DF5769 + +I=167 +KEY=92192D9175187FB409E04EF373E224493E38278720D7D919 +CT=507835696F1920BD4A05797563DF5769 +PT=2070413F5103482B6C83129304E5AC87 + +I=168 +KEY=6959063FBA59CCEC29900FCC22E16C6252BB35142432759E +CT=2070413F5103482B6C83129304E5AC87 +PT=BF7FD1E21B41B1F1C2625C1097F1BCB8 + +I=169 +KEY=5722993710D811B196EFDE2E39A0DD9390D96904B3C3C926 +CT=BF7FD1E21B41B1F1C2625C1097F1BCB8 +PT=6E2236654F2999545F50FA9CF63F9F2E + +I=170 +KEY=038FA98E7A226A9FF8CDE84B768944C7CF89939845FC5608 +CT=6E2236654F2999545F50FA9CF63F9F2E +PT=3F370291CEDCB115C8EE409A8EEB46D6 + +I=171 +KEY=CACF0199725D5466C7FAEADAB855F5D20767D302CB1710DE +CT=3F370291CEDCB115C8EE409A8EEB46D6 +PT=84023DB96D373EC8315AE78A3B7E82FB + +I=172 +KEY=7B40321CB11520D143F8D763D562CB1A363D3488F0699225 +CT=84023DB96D373EC8315AE78A3B7E82FB +PT=C35064D82A3016FE2C2E2CC0627E7B5C + +I=173 +KEY=F045CFEC2A6BC7E580A8B3BBFF52DDE41A1318489217E979 +CT=C35064D82A3016FE2C2E2CC0627E7B5C +PT=D78DFFE87C0F95856C31A07BADA23084 + +I=174 +KEY=86B3CA5F50CEF6C557254C53835D48617622B8333FB5D9FD +CT=D78DFFE87C0F95856C31A07BADA23084 +PT=5B5B5D3CA5C6E5CF18F3E4EE802BE82B + +I=175 +KEY=E6D99DC0C58655B70C7E116F269BADAE6ED15CDDBF9E31D6 +CT=5B5B5D3CA5C6E5CF18F3E4EE802BE82B +PT=DB65A82F6EB7A410A367165900E85117 + +I=176 +KEY=B8F770CFBE47D070D71BB940482C09BECDB64A84BF7660C1 +CT=DB65A82F6EB7A410A367165900E85117 +PT=FE8BE8484D925043102238FF63FDAC57 + +I=177 +KEY=FF09ADB06FE587192990510805BE59FDDD94727BDC8BCC96 +CT=FE8BE8484D925043102238FF63FDAC57 +PT=AC36E01A7AD482A8D89703D2A6528720 + +I=178 +KEY=B5C937A4019CDAD185A6B1127F6ADB55050371A97AD94BB6 +CT=AC36E01A7AD482A8D89703D2A6528720 +PT=9F3698CE06C6497C89B58CA723F7ECAA + +I=179 +KEY=F60CAF8FB99B63B21A9029DC79AC92298CB6FD0E592EA71C +CT=9F3698CE06C6497C89B58CA723F7ECAA +PT=FB8CE2E1D332FE4557B6C5CF1676F2FB + +I=180 +KEY=B7CF2BABD58B5FDCE11CCB3DAA9E6C6CDB0038C14F5855E7 +CT=FB8CE2E1D332FE4557B6C5CF1676F2FB +PT=A2631F612698318AD454E9DB10319DA6 + +I=181 +KEY=FD99B4137CAFC47F437FD45C8C065DE60F54D11A5F69C841 +CT=A2631F612698318AD454E9DB10319DA6 +PT=FCA42B332B5974EE6DFA54B54EC89AC7 + +I=182 +KEY=271CEEF189AD367DBFDBFF6FA75F290862AE85AF11A15286 +CT=FCA42B332B5974EE6DFA54B54EC89AC7 +PT=A70DBBDFCE54B8648C3FC4A8A58CCDF8 + +I=183 +KEY=7B78F7ECC9B28EC718D644B0690B916CEE914107B42D9F7E +CT=A70DBBDFCE54B8648C3FC4A8A58CCDF8 +PT=C90CE914F9310F9C3EE065DD95281A51 + +I=184 +KEY=762F521ADF6C5F24D1DAADA4903A9EF0D07124DA2105852F +CT=C90CE914F9310F9C3EE065DD95281A51 +PT=63E8430CE22F531E4A4D4583533F6FC4 + +I=185 +KEY=A88A493EB3C28C49B232EEA87215CDEE9A3C6159723AEAEB +CT=63E8430CE22F531E4A4D4583533F6FC4 +PT=E7562DC647910A052F4AFBF165A68A3A + +I=186 +KEY=1C97343A60EE05035564C36E3584C7EBB5769AA8179C60D1 +CT=E7562DC647910A052F4AFBF165A68A3A +PT=3E070B3F65FD01B49849513B556DB199 + +I=187 +KEY=C5110692100A332E6B63C8515079C65F2D3FCB9342F1D148 +CT=3E070B3F65FD01B49849513B556DB199 +PT=3DE5A45B2CAA4FAFAC3032F89F15195D + +I=188 +KEY=D94D8CAA9EBD67F056866C0A7CD389F0810FF96BDDE4C815 +CT=3DE5A45B2CAA4FAFAC3032F89F15195D +PT=A36A163E8806B1E053EBE439B0D1302F + +I=189 +KEY=1C1D7A3E9358048CF5EC7A34F4D53810D2E41D526D35F83A +CT=A36A163E8806B1E053EBE439B0D1302F +PT=67CA4B988CCABA4E4DBEE6C387562762 + +I=190 +KEY=9182E40D14973087922631AC781F825E9F5AFB91EA63DF58 +CT=67CA4B988CCABA4E4DBEE6C387562762 +PT=9F404F0E1A9FE5A988CE6E4A54FE9E23 + +I=191 +KEY=7D89ECFC0DCFFE0A0D667EA2628067F7179495DBBE9D417B +CT=9F404F0E1A9FE5A988CE6E4A54FE9E23 +PT=D71EFD794457C71614E4266C77193444 + +I=192 +KEY=AC7A11D29CDA0FB6DA7883DB26D7A0E10370B3B7C984753F +CT=D71EFD794457C71614E4266C77193444 +PT=185DBF418A6834CD118B16EAF381F3CB + +I=193 +KEY=1029D5FA3D38927EC2253C9AACBF942C12FBA55D3A0586F4 +CT=185DBF418A6834CD118B16EAF381F3CB +PT=737A502DEE68DDFA3FEECD42ACE124EA + +I=194 +KEY=F261B484C642750CB15F6CB742D749D62D15681F96E4A21E +CT=737A502DEE68DDFA3FEECD42ACE124EA +PT=FD11B0F356455913E892928B5B16946B + +I=195 +KEY=BCCFAF05FF47A5EC4C4EDC44149210C5C587FA94CDF23675 +CT=FD11B0F356455913E892928B5B16946B +PT=4B06F6D6D149BAF25D4C76E46EFF8571 + +I=196 +KEY=1000A15983B73D6807482A92C5DBAA3798CB8C70A30DB304 +CT=4B06F6D6D149BAF25D4C76E46EFF8571 +PT=450713DA24492403C48CB16D2F39744E + +I=197 +KEY=306F097E64B634AC424F3948E1928E345C473D1D8C34C74A +CT=450713DA24492403C48CB16D2F39744E +PT=998CA5E3C80B66EB11EAD376FA358A92 + +I=198 +KEY=13965208C3EF77E1DBC39CAB2999E8DF4DADEE6B76014DD8 +CT=998CA5E3C80B66EB11EAD376FA358A92 +PT=F54A34F6F0833CA808D60A8F75BB0585 + +I=199 +KEY=1A6DC3FDD0D1F97C2E89A85DD91AD477457BE4E403BA485D +CT=F54A34F6F0833CA808D60A8F75BB0585 +PT=8760D5CBD1DA48807BAEAF7F781680F2 + +I=200 +KEY=228897B4E2F16967A9E97D9608C09CF73ED54B9B7BACC8AF +CT=8760D5CBD1DA48807BAEAF7F781680F2 +PT=EF57DF7161E1BC0F7B466A50C576691A + +I=201 +KEY=D0E8190E72A305C946BEA2E7692120F8459321CBBEDAA1B5 +CT=EF57DF7161E1BC0F7B466A50C576691A +PT=E01ECA338A93EA38E43B2F364314C121 + +I=202 +KEY=087F0486B80659F0A6A068D4E3B2CAC0A1A80EFDFDCE6094 +CT=E01ECA338A93EA38E43B2F364314C121 +PT=A7683273638D02272FF6A311BB94256F + +I=203 +KEY=1D807E4730DDA3EB01C85AA7803FC8E78E5EADEC465A45FB +CT=A7683273638D02272FF6A311BB94256F +PT=1BCC3DF6B07BD2615C13E381F5F877C3 + +I=204 +KEY=D4D4F2780D52D7521A04675130441A86D24D4E6DB3A23238 +CT=1BCC3DF6B07BD2615C13E381F5F877C3 +PT=D1B3B793D1377E82A2DE5D46E53791FB + +I=205 +KEY=86D08D85652DB662CBB7D0C2E17364047093132B5695A3C3 +CT=D1B3B793D1377E82A2DE5D46E53791FB +PT=9AC7AF9B82621E18E4FF613EAA609F46 + +I=206 +KEY=C03996907AC99A7A51707F5963117A1C946C7215FCF53C85 +CT=9AC7AF9B82621E18E4FF613EAA609F46 +PT=57F3FA35A42C29F33DEC4671140264A4 + +I=207 +KEY=F8CA52D95C587EF80683856CC73D53EFA9803464E8F75821 +CT=57F3FA35A42C29F33DEC4671140264A4 +PT=A887ED8BF6C19F5012F317A4FCF3D7BF + +I=208 +KEY=DE99CC8F9756C1DCAE0468E731FCCCBFBB7323C014048F9E +CT=A887ED8BF6C19F5012F317A4FCF3D7BF +PT=A29C8D764BCF211C789158A9B8EB330C + +I=209 +KEY=9228DB1B61E0D8670C98E5917A33EDA3C3E27B69ACEFBC92 +CT=A29C8D764BCF211C789158A9B8EB330C +PT=EB6AFD9B36315DB322EC8C4243043F50 + +I=210 +KEY=24AFE14097C2A217E7F2180A4C02B010E10EF72BEFEB83C2 +CT=EB6AFD9B36315DB322EC8C4243043F50 +PT=05C8AC90CCD00E2A3809C68C11D6D65A + +I=211 +KEY=32810943F9313BD0E23AB49A80D2BE3AD90731A7FE3D5598 +CT=05C8AC90CCD00E2A3809C68C11D6D65A +PT=E39991B58C52154166AD09367B04C67A + +I=212 +KEY=FBEC72A177254EA501A3252F0C80AB7BBFAA3891853993E2 +CT=E39991B58C52154166AD09367B04C67A +PT=CBC8974F72F77A1821FC69B29FE2DB60 + +I=213 +KEY=C706D206DE538439CA6BB2607E77D1639E5651231ADB4882 +CT=CBC8974F72F77A1821FC69B29FE2DB60 +PT=1D08F4E2B8DFED1032B6CA5211B3E34C + +I=214 +KEY=9A7EB0A4F8E67F87D7634682C6A83C73ACE09B710B68ABCE +CT=1D08F4E2B8DFED1032B6CA5211B3E34C +PT=1888CEC22449EFF96BDC2C7A242BBBDC + +I=215 +KEY=70CA2CAD6A50D22BCFEB8840E2E1D38AC73CB70B2F431012 +CT=1888CEC22449EFF96BDC2C7A242BBBDC +PT=032E6155677B6A72D7F94C7A9A9AA53F + +I=216 +KEY=B16697FEA247CDB9CCC5E915859AB9F810C5FB71B5D9B52D +CT=032E6155677B6A72D7F94C7A9A9AA53F +PT=9B43BBD1C0CEBF7593E9BC0ABB626E96 + +I=217 +KEY=7A3E844BEB897A63578652C44554068D832C477B0EBBDBBB +CT=9B43BBD1C0CEBF7593E9BC0ABB626E96 +PT=8D661E03C61C28D5786EBCEBE0D5B63D + +I=218 +KEY=E7A1B96EFC4D5FB5DAE04CC783482E58FB42FB90EE6E6D86 +CT=8D661E03C61C28D5786EBCEBE0D5B63D +PT=F61D5DCBF8F2F3F0EAB387149790E079 + +I=219 +KEY=0EDA761C06FBA0A02CFD110C7BBADDA811F17C8479FE8DFF +CT=F61D5DCBF8F2F3F0EAB387149790E079 +PT=1F03E0957B6892533BBEAB06EB35AD4F + +I=220 +KEY=E242AD5B7141916133FEF19900D24FFB2A4FD78292CB20B0 +CT=1F03E0957B6892533BBEAB06EB35AD4F +PT=BB9E7343035F88764B229D506E7ADC7B + +I=221 +KEY=D901A6CF874A6A77886082DA038DC78D616D4AD2FCB1FCCB +CT=BB9E7343035F88764B229D506E7ADC7B +PT=3934EBF7AD2243C0D09734E30B41C0E4 + +I=222 +KEY=0F488E86E7D92F29B154692DAEAF844DB1FA7E31F7F03C2F +CT=3934EBF7AD2243C0D09734E30B41C0E4 +PT=B9CE1A1A9595E7235F5B10FBA29ACCD2 + +I=223 +KEY=A7E2CF991692247A089A73373B3A636EEEA16ECA556AF0FD +CT=B9CE1A1A9595E7235F5B10FBA29ACCD2 +PT=624EBA65EE9E3E1BDF8C5AA7E1283A65 + +I=224 +KEY=1DE03E09395E56CE6AD4C952D5A45D75312D346DB442CA98 +CT=624EBA65EE9E3E1BDF8C5AA7E1283A65 +PT=375132E5F47DA19E80CC8652BE5A3692 + +I=225 +KEY=51B6813629EFE53C5D85FBB721D9FCEBB1E1B23F0A18FC0A +CT=375132E5F47DA19E80CC8652BE5A3692 +PT=8165A4126FE75EFC6AFF7BFD732F94A6 + +I=226 +KEY=8DD50DFF93624339DCE05FA54E3EA217DB1EC9C2793768AC +CT=8165A4126FE75EFC6AFF7BFD732F94A6 +PT=35012FABD289E6B7FB07946591D18F0D + +I=227 +KEY=C7A4F75CB74C7F3DE9E1700E9CB744A020195DA7E8E6E7A1 +CT=35012FABD289E6B7FB07946591D18F0D +PT=C26F37D700677ED72F4FC2C8F6AEADE2 + +I=228 +KEY=198B572CD0E711352B8E47D99CD03A770F569F6F1E484A43 +CT=C26F37D700677ED72F4FC2C8F6AEADE2 +PT=CB29ECE41596736B72AED2460AEEFBA2 + +I=229 +KEY=0A1FB41CA720E357E0A7AB3D8946491C7DF84D2914A6B1E1 +CT=CB29ECE41596736B72AED2460AEEFBA2 +PT=7F7BD6FAF9C37D5522A3BF480CCEBF20 + +I=230 +KEY=7E383601899DEA729FDC7DC7708534495F5BF26118680EC1 +CT=7F7BD6FAF9C37D5522A3BF480CCEBF20 +PT=C501E371005DF57E0037F41A744D026F + +I=231 +KEY=13ACF410865B41E15ADD9EB670D8C1375F6C067B6C250CAE +CT=C501E371005DF57E0037F41A744D026F +PT=624EF8749580108CDC7A020179F81D0F + +I=232 +KEY=75F025072AA2406F389366C2E558D1BB8316047A15DD11A1 +CT=624EF8749580108CDC7A020179F81D0F +PT=40D72550603522C67180DE6EC3D30139 + +I=233 +KEY=C5ED76F88EA65C3D78444392856DF37DF296DA14D60E1098 +CT=40D72550603522C67180DE6EC3D30139 +PT=96C6F647AFB90F804431F9E2F1780F29 + +I=234 +KEY=E827DFF88D0B1A43EE82B5D52AD4FCFDB6A723F627761FB1 +CT=96C6F647AFB90F804431F9E2F1780F29 +PT=CCB934A501DDAD11E994938A214EB189 + +I=235 +KEY=F0777D1BFF12EE42223B81702B0951EC5F33B07C0638AE38 +CT=CCB934A501DDAD11E994938A214EB189 +PT=07825F2D35E761C76893B697E30E4D08 + +I=236 +KEY=6912B59C06C90D3725B9DE5D1EEE302B37A006EBE536E330 +CT=07825F2D35E761C76893B697E30E4D08 +PT=1F674E97F88EB1DA1DD24C0AB4321258 + +I=237 +KEY=AE24933526FAE5F83ADE90CAE66081F12A724AE15104F168 +CT=1F674E97F88EB1DA1DD24C0AB4321258 +PT=B6DE499EBE0B3C30F1DAC8E40FE9F10C + +I=238 +KEY=F348F88852CF356C8C00D954586BBDC1DBA882055EED0064 +CT=B6DE499EBE0B3C30F1DAC8E40FE9F10C +PT=105E31DBDE33764B098862AF6D0B6CD2 + +I=239 +KEY=83B06CC00A17D3149C5EE88F8658CB8AD220E0AA33E66CB6 +CT=105E31DBDE33764B098862AF6D0B6CD2 +PT=697D6537677B20C188246FBF4997C7CB + +I=240 +KEY=A5381A9C91D61A01F5238DB8E123EB4B5A048F157A71AB7D +CT=697D6537677B20C188246FBF4997C7CB +PT=4FBFB0EFBA92C1E0189E2C3097AA35BA + +I=241 +KEY=FDF831A7D1345AFEBA9C3D575BB12AAB429AA325EDDB9EC7 +CT=4FBFB0EFBA92C1E0189E2C3097AA35BA +PT=600288531DCEB99B69A7890CE804FA9F + +I=242 +KEY=A10ED54E7B2B2B2BDA9EB504467F93302B3D2A2905DF6458 +CT=600288531DCEB99B69A7890CE804FA9F +PT=EE94D4376D9332C8DCD05C695EDB124F + +I=243 +KEY=2F69F01250D7745F340A61332BECA1F8F7ED76405B047617 +CT=EE94D4376D9332C8DCD05C695EDB124F +PT=7EDC3182C36DC5A172B170A919524888 + +I=244 +KEY=FCD5F8FAB347624E4AD650B1E8816459855C06E942563E9F +CT=7EDC3182C36DC5A172B170A919524888 +PT=95FA03C96DFCB9ABCFF23B5ABFBABCDE + +I=245 +KEY=A9307E62197A747EDF2C5378857DDDF24AAE3DB3FDEC8241 +CT=95FA03C96DFCB9ABCFF23B5ABFBABCDE +PT=6CE2C6CFC61667965C20B0BE11B55DDE + +I=246 +KEY=DA3B03896DDFDE08B3CE95B7436BBA64168E8D0DEC59DF9F +CT=6CE2C6CFC61667965C20B0BE11B55DDE +PT=3DBDFBE63A6FAE7572C778108A62A27C + +I=247 +KEY=7D766BAD6E536CE38E736E51790414116449F51D663B7DE3 +CT=3DBDFBE63A6FAE7572C778108A62A27C +PT=1C197D3449FED6ED6924E14B43A17BF0 + +I=248 +KEY=36F69C30B0272CAB926A136530FAC2FC0D6D1456259A0613 +CT=1C197D3449FED6ED6924E14B43A17BF0 +PT=0B0CCC6F508C18168284F7976AD81BEE + +I=249 +KEY=632661C312B2EB5D9966DF0A6076DAEA8FE9E3C14F421DFD +CT=0B0CCC6F508C18168284F7976AD81BEE +PT=F437B8FD92CE37D8D74550C5BE29BF99 + +I=250 +KEY=5FB1BDFC29EFE2DA6D5167F7F2B8ED3258ACB304F16BA264 +CT=F437B8FD92CE37D8D74550C5BE29BF99 +PT=78F6E6F6480A04F5632EA112170F928C + +I=251 +KEY=2B24C5188F4A2E7B15A78101BAB2E9C73B821216E66430E8 +CT=78F6E6F6480A04F5632EA112170F928C +PT=2FD38831EE4D09DD8DB9A84B5825B528 + +I=252 +KEY=F816FB720A08828C3A74093054FFE01AB63BBA5DBE4185C0 +CT=2FD38831EE4D09DD8DB9A84B5825B528 +PT=ED307697B51CFAD7052A3A7B3A564990 + +I=253 +KEY=776B08F4778FAB96D7447FA7E1E31ACDB31180268417CC50 +CT=ED307697B51CFAD7052A3A7B3A564990 +PT=DB9952A98F0D4B045C624EFA5619CAF9 + +I=254 +KEY=C7A944C9BA2D5F740CDD2D0E6EEE51C9EF73CEDCD20E06A9 +CT=DB9952A98F0D4B045C624EFA5619CAF9 +PT=DADA40BF0E367AF50874BB2628251AA3 + +I=255 +KEY=69B8688D9C1ECD95D6076DB160D82B3CE70775FAFA2B1C0A +CT=DADA40BF0E367AF50874BB2628251AA3 +PT=35DFA85D3F2D7F47DD7865EA0BC73A5C + +I=256 +KEY=7E6C7E90EDE36F44E3D8C5EC5FF5547B3A7F1010F1EC2656 +CT=35DFA85D3F2D7F47DD7865EA0BC73A5C +PT=EE0231F994C2DB6C7C04746170F03E54 + +I=257 +KEY=0E56C8FD184AB5D40DDAF415CB378F17467B6471811C1802 +CT=EE0231F994C2DB6C7C04746170F03E54 +PT=D9F314FEAD11122CE8F532ED0C0B129C + +I=258 +KEY=267BC5325796002BD429E0EB66269D3BAE8E569C8D170A9E +CT=D9F314FEAD11122CE8F532ED0C0B129C +PT=74A32BDFF53A59F09AAFB328977E05B1 + +I=259 +KEY=889B6087CAAD1B43A08ACB34931CC4CB3421E5B41A690F2F +CT=74A32BDFF53A59F09AAFB328977E05B1 +PT=D4CCC3077C15EE470D5EFCF815A48410 + +I=260 +KEY=F9AE78D077E3F98574460833EF092A8C397F194C0FCD8B3F +CT=D4CCC3077C15EE470D5EFCF815A48410 +PT=29284B0E7776DFB8BB536B3C16399D62 + +I=261 +KEY=71BBCD4B1F4B04265D6E433D987FF534822C727019F4165D +CT=29284B0E7776DFB8BB536B3C16399D62 +PT=202326CEAD57A5C13592FFBFFD5BF508 + +I=262 +KEY=F6F461C7931CF0317D4D65F3352850F5B7BE8DCFE4AFE355 +CT=202326CEAD57A5C13592FFBFFD5BF508 +PT=B9AFAD0658E1A4A1EECAA25B2863AD53 + +I=263 +KEY=BC0D82D3B7909D54C4E2C8F56DC9F45459742F94CCCC4E06 +CT=B9AFAD0658E1A4A1EECAA25B2863AD53 +PT=DE7AC7F7381DD34F3148911F306F4161 + +I=264 +KEY=339FFE2E01AB1D621A980F0255D4271B683CBE8BFCA30F67 +CT=DE7AC7F7381DD34F3148911F306F4161 +PT=F197DE9FED1EA08F6C17E631BF5449FE + +I=265 +KEY=EC908F9A4F266644EB0FD19DB8CA8794042B58BA43F74699 +CT=F197DE9FED1EA08F6C17E631BF5449FE +PT=7E1416C06ED3F56782DB5CB536B9B56E + +I=266 +KEY=CFE36CCCC94F8A5B951BC75DD61972F386F0040F754EF3F7 +CT=7E1416C06ED3F56782DB5CB536B9B56E +PT=BE1FE1F7B4CFF55D15BBCB6D9313729D + +I=267 +KEY=90690906407FB8AC2B0426AA62D687AE934BCF62E65D816A +CT=BE1FE1F7B4CFF55D15BBCB6D9313729D +PT=50E6818C06583D3D1C99C4A127D118CF + +I=268 +KEY=5D2A712578EC47217BE2A726648EBA938FD20BC3C18C99A5 +CT=50E6818C06583D3D1C99C4A127D118CF +PT=E1BFD3ED18E9A6D7BF383D590DA23B59 + +I=269 +KEY=3CA141EE57D7E0FC9A5D74CB7C671C4430EA369ACC2EA2FC +CT=E1BFD3ED18E9A6D7BF383D590DA23B59 +PT=03961127347C141C01F5276CB9BB31F7 + +I=270 +KEY=65E9B8AE22DC52A599CB65EC481B0858311F11F67595930B +CT=03961127347C141C01F5276CB9BB31F7 +PT=E9A8336DC0B530A86988B2DE74EDFFA1 + +I=271 +KEY=870A30E0F3B836FA7063568188AE38F05897A32801786CAA +CT=E9A8336DC0B530A86988B2DE74EDFFA1 +PT=B5FA5E388CFFFE2BA33436CC39A73972 + +I=272 +KEY=4B81E55C765F570CC59908B90451C6DBFBA395E438DF55D8 +CT=B5FA5E388CFFFE2BA33436CC39A73972 +PT=CEF4896BBC86F1E02312479C40D96DAE + +I=273 +KEY=0FAB0DCFB6E3E7940B6D81D2B8D7373BD8B1D27878063876 +CT=CEF4896BBC86F1E02312479C40D96DAE +PT=F195F5321FCAA68B0B0CBA83978A8084 + +I=274 +KEY=F860076D3847A80BFAF874E0A71D91B0D3BD68FBEF8CB8F2 +CT=F195F5321FCAA68B0B0CBA83978A8084 +PT=861575205386223EBC6B48B22C35A2A6 + +I=275 +KEY=B2DB77DC3E18C3A77CED01C0F49BB38E6FD62049C3B91A54 +CT=861575205386223EBC6B48B22C35A2A6 +PT=DC074F3D41C62DA9D609A982DEB9E074 + +I=276 +KEY=E632B0C6EE68910EA0EA4EFDB55D9E27B9DF89CB1D00FA20 +CT=DC074F3D41C62DA9D609A982DEB9E074 +PT=6933F4F193B028A22B913453B0B4C9A2 + +I=277 +KEY=88AA3FEE5FDFA336C9D9BA0C26EDB685924EBD98ADB43382 +CT=6933F4F193B028A22B913453B0B4C9A2 +PT=56811E665DDFBEA07A7C2C762F0D5C73 + +I=278 +KEY=2A0A1FE31ADFC64F9F58A46A7B320825E83291EE82B96FF1 +CT=56811E665DDFBEA07A7C2C762F0D5C73 +PT=CFF92E47C8C973ADA7B57D9FE320B356 + +I=279 +KEY=7958F9D10B6DC91050A18A2DB3FB7B884F87EC716199DCA7 +CT=CFF92E47C8C973ADA7B57D9FE320B356 +PT=A55A4F827552761580DC27E0712051B1 + +I=280 +KEY=ADDB73FE13D439CAF5FBC5AFC6A90D9DCF5BCB9110B98D16 +CT=A55A4F827552761580DC27E0712051B1 +PT=734B095C3C54FCDE26C33659C82CACCB + +I=281 +KEY=E979AF9C739F60AE86B0CCF3FAFDF143E998FDC8D89521DD +CT=734B095C3C54FCDE26C33659C82CACCB +PT=122A4F2ADE6C69364943658517A56587 + +I=282 +KEY=E05BDC75E94EB2A8949A83D924919875A0DB984DCF30445A +CT=122A4F2ADE6C69364943658517A56587 +PT=C6EF3170C5EF69B479AC6653E8B7E979 + +I=283 +KEY=67AF0BE0DE572F595275B2A9E17EF1C1D977FE1E2787AD23 +CT=C6EF3170C5EF69B479AC6653E8B7E979 +PT=51113FF8A1000A5449F24E8E5363FB72 + +I=284 +KEY=7C8DCBB512AE775603648D51407EFB959085B09074E45651 +CT=51113FF8A1000A5449F24E8E5363FB72 +PT=B9341E24A41C9D9CE56D6E4F17A7A311 + +I=285 +KEY=EEBE49DAF88030F5BA509375E462660975E8DEDF6343F540 +CT=B9341E24A41C9D9CE56D6E4F17A7A311 +PT=26A135C466B061791DE40A40E9366FC6 + +I=286 +KEY=A06A0B9127769EF79CF1A6B182D20770680CD49F8A759A86 +CT=26A135C466B061791DE40A40E9366FC6 +PT=AE832B68C147CF8A70A8E5CCC3FF05F2 + +I=287 +KEY=CD394B7808099B2832728DD94395C8FA18A43153498A9F74 +CT=AE832B68C147CF8A70A8E5CCC3FF05F2 +PT=72747F478E3AE57C6C7D6D4E5C4FCE71 + +I=288 +KEY=80D4A1BD538D11434006F29ECDAF2D8674D95C1D15C55105 +CT=72747F478E3AE57C6C7D6D4E5C4FCE71 +PT=21539022400BEE401E8FE7E9F0F7AAC3 + +I=289 +KEY=C8BCB868E11B46E3615562BC8DA4C3C66A56BBF4E532FBC6 +CT=21539022400BEE401E8FE7E9F0F7AAC3 +PT=44149C7C375F07B7169C8A9A14133C8C + +I=290 +KEY=DFC35DD4FAD95C2A2541FEC0BAFBC4717CCA316EF121C74A +CT=44149C7C375F07B7169C8A9A14133C8C +PT=2A7FA9D2EACC0C5444510E7D69EB3FD6 + +I=291 +KEY=73B0B53EE6D591140F3E57125037C825389B3F1398CAF89C +CT=2A7FA9D2EACC0C5444510E7D69EB3FD6 +PT=9949145B8C88D03BBA46FEBE9856B732 + +I=292 +KEY=7BFBD6A0A317DEE996774349DCBF181E82DDC1AD009C4FAE +CT=9949145B8C88D03BBA46FEBE9856B732 +PT=714E072347ECDEA4F8EB2B02746FBC66 + +I=293 +KEY=CA326A1D191B2BC6E739446A9B53C6BA7A36EAAF74F3F3C8 +CT=714E072347ECDEA4F8EB2B02746FBC66 +PT=CCF2295814759A5004E8C3E2B97C4958 + +I=294 +KEY=428400F7196D32C62BCB6D328F265CEA7EDE294DCD8FBA90 +CT=CCF2295814759A5004E8C3E2B97C4958 +PT=12108AB0753EAAE007DEFF2EBA8A3EF0 + +I=295 +KEY=3E38F6FA3F49742339DBE782FA18F60A7900D66377058460 +CT=12108AB0753EAAE007DEFF2EBA8A3EF0 +PT=0109AC127FB55B91BC922EDFF3C43819 + +I=296 +KEY=07C585ABD1C227D638D24B9085ADAD9BC592F8BC84C1BC79 +CT=0109AC127FB55B91BC922EDFF3C43819 +PT=33FF03F6966E81EE28889CFA0B9BA8B9 + +I=297 +KEY=FB823872148252C20B2D486613C32C75ED1A64468F5A14C0 +CT=33FF03F6966E81EE28889CFA0B9BA8B9 +PT=D8468C180BAC0F6D703611DDAD951014 + +I=298 +KEY=F81900EAD21ECE3BD36BC47E186F23189D2C759B22CF04D4 +CT=D8468C180BAC0F6D703611DDAD951014 +PT=07994906A8377D64F2D32DB4BB170EF1 + +I=299 +KEY=2ADC8C0244307531D4F28D78B0585E7C6FFF582F99D80A25 +CT=07994906A8377D64F2D32DB4BB170EF1 +PT=48382015F82AA7EC8944C40275595CEF + +I=300 +KEY=2E917F5C5BAB80939CCAAD6D4872F990E6BB9C2DEC8156CA +CT=48382015F82AA7EC8944C40275595CEF +PT=D4EEE0A1A56118EB8F6AE16FE16F70ED + +I=301 +KEY=126D396B29E0252248244DCCED13E17B69D17D420DEE2627 +CT=D4EEE0A1A56118EB8F6AE16FE16F70ED +PT=358E5FAE4A4ED6B1058E32942AE030DB + +I=302 +KEY=D390A60684F5C9147DAA1262A75D37CA6C5F4FD6270E16FC +CT=358E5FAE4A4ED6B1058E32942AE030DB +PT=B9730D311EA8312DAC34F444A4560DDC + +I=303 +KEY=0B2A03E62FCD9B06C4D91F53B9F506E7C06BBB9283581B20 +CT=B9730D311EA8312DAC34F444A4560DDC +PT=D64F286B32B4058A51B73844BCA93DDA + +I=304 +KEY=5858183C5713BBD6129637388B41036D91DC83D63FF126FA +CT=D64F286B32B4058A51B73844BCA93DDA +PT=78425B7FE64D972C642ED17369ED8844 + +I=305 +KEY=C555D9DC23D3A1846AD46C476D0C9441F5F252A5561CAEBE +CT=78425B7FE64D972C642ED17369ED8844 +PT=2DE9202F4CD7F67C7B7F94CF7F3B9B5A + +I=306 +KEY=7BA871DA6E336CFA473D4C6821DB623D8E8DC66A292735E4 +CT=2DE9202F4CD7F67C7B7F94CF7F3B9B5A +PT=A30322EC9A51266B50153995BCEBC846 + +I=307 +KEY=55BF35687EBA169AE43E6E84BB8A4456DE98FFFF95CCFDA2 +CT=A30322EC9A51266B50153995BCEBC846 +PT=14754B0469683F36E4791FD9B8B1C585 + +I=308 +KEY=0404CAE90360F118F04B2580D2E27B603AE1E0262D7D3827 +CT=14754B0469683F36E4791FD9B8B1C585 +PT=E8592DC147A1DC4F48D43E365B9D63FF + +I=309 +KEY=109E16AA717A4EF4181208419543A72F7235DE1076E05BD8 +CT=E8592DC147A1DC4F48D43E365B9D63FF +PT=47A3BF0743562C7D412563C94C2CD717 + +I=310 +KEY=0A8DC7647F8C06D15FB1B746D6158B523310BDD93ACC8CCF +CT=47A3BF0743562C7D412563C94C2CD717 +PT=63F8C6A062937471364050815D856793 + +I=311 +KEY=CC9B8854C13F73623C4971E6B486FF230550ED586749EB5C +CT=63F8C6A062937471364050815D856793 +PT=E70443AF44BF549607251A86CD83A4D3 + +I=312 +KEY=2D067D896DF1E749DB4D3249F039ABB50275F7DEAACA4F8F +CT=E70443AF44BF549607251A86CD83A4D3 +PT=ACEF2AE95CA660AEE513BF48BCF7D125 + +I=313 +KEY=DEC45DD3C0DAD30A77A218A0AC9FCB1BE7664896163D9EAA +CT=ACEF2AE95CA660AEE513BF48BCF7D125 +PT=859E9E4001245A50ED76055539672F1A + +I=314 +KEY=6F208E93D9C89CE8F23C86E0ADBB914B0A104DC32F5AB1B0 +CT=859E9E4001245A50ED76055539672F1A +PT=42B059061FE4C86C7AC2B7C8B62820C2 + +I=315 +KEY=86EC7CE558994E8EB08CDFE6B25F592770D2FA0B99729172 +CT=42B059061FE4C86C7AC2B7C8B62820C2 +PT=01C6296F1532450F182D6A3FC8249DD7 + +I=316 +KEY=C74B31CEC9B31130B14AF689A76D1C2868FF903451560CA5 +CT=01C6296F1532450F182D6A3FC8249DD7 +PT=14334054946821E3FE8D72D1EF402EE1 + +I=317 +KEY=AC636B2AD3699560A579B6DD33053DCB9672E2E5BE162244 +CT=14334054946821E3FE8D72D1EF402EE1 +PT=F09B2FE9A8F17CD847532D4979D2A8C4 + +I=318 +KEY=6F956E3680FC783155E299349BF44113D121CFACC7C48A80 +CT=F09B2FE9A8F17CD847532D4979D2A8C4 +PT=4C97BD8822E63C7A2EE0E444563AF1C8 + +I=319 +KEY=C69B2FB718C41B1A197524BCB9127D69FFC12BE891FE7B48 +CT=4C97BD8822E63C7A2EE0E444563AF1C8 +PT=344E85BE2C8B36430C8058B310062171 + +I=320 +KEY=BFFA143B8A18CACF2D3BA10295994B2AF341735B81F85A39 +CT=344E85BE2C8B36430C8058B310062171 +PT=FF3F882CB22D13A8631DCA6DD702D0E0 + +I=321 +KEY=22F58A0FC077AB5FD204292E27B45882905CB93656FA8AD9 +CT=FF3F882CB22D13A8631DCA6DD702D0E0 +PT=866B2E52CF71505973D9D6642C8178BB + +I=322 +KEY=DC8CE7A9130F3662546F077CE8C508DBE3856F527A7BF262 +CT=866B2E52CF71505973D9D6642C8178BB +PT=4802741ADF67A3811A8AEC7008D8827E + +I=323 +KEY=743B09AA8FD3C6A01C6D736637A2AB5AF90F832272A3701C +CT=4802741ADF67A3811A8AEC7008D8827E +PT=FD3701579815D02BE878C74ABB98C59B + +I=324 +KEY=865B3EC9EFBE27D0E15A7231AFB77B7111774468C93BB587 +CT=FD3701579815D02BE878C74ABB98C59B +PT=99BCA8250D54F3A9A72054AF5578F842 + +I=325 +KEY=041C037E08923FFF78E6DA14A2E388D8B65710C79C434DC5 +CT=99BCA8250D54F3A9A72054AF5578F842 +PT=F0DA5C0E446547356D5027BA346A831C + +I=326 +KEY=FBABCE025CF5FF3D883C861AE686CFEDDB07377DA829CED9 +CT=F0DA5C0E446547356D5027BA346A831C +PT=EED0140AF408652DD879E3289536C389 + +I=327 +KEY=3F12399A3E5C0F9566EC9210128EAAC0037ED4553D1F0D50 +CT=EED0140AF408652DD879E3289536C389 +PT=FDC7299A95BDB941A299478B7B409EF8 + +I=328 +KEY=D541517B701036E39B2BBB8A87331381A1E793DE465F93A8 +CT=FDC7299A95BDB941A299478B7B409EF8 +PT=5BE5AEC30578CD03BA7B17E8B16AAFBF + +I=329 +KEY=6657840FF425DD8AC0CE1549824BDE821B9C8436F7353C17 +CT=5BE5AEC30578CD03BA7B17E8B16AAFBF +PT=3C7A9745F48DA61CF7875A449E24C735 + +I=330 +KEY=52D29BBD64550DFBFCB4820C76C6789EEC1BDE726911FB22 +CT=3C7A9745F48DA61CF7875A449E24C735 +PT=69516DE0343F3552830D28CE8B9A282C + +I=331 +KEY=3699B16BB0349B9195E5EFEC42F94DCC6F16F6BCE28BD30E +CT=69516DE0343F3552830D28CE8B9A282C +PT=EB09EE300286690EA65A30526A43B86B + +I=332 +KEY=60E79B9E7C41814E7EEC01DC407F24C2C94CC6EE88C86B65 +CT=EB09EE300286690EA65A30526A43B86B +PT=A235384FE517A5F455BBE6B850C05E33 + +I=333 +KEY=11F650282BBCB584DCD93993A56881369CF72056D8083556 +CT=A235384FE517A5F455BBE6B850C05E33 +PT=41E297350390E91EC00FF875B3CA60BA + +I=334 +KEY=11B449F7EE983AB89D3BAEA6A6F868285CF8D8236BC255EC +CT=41E297350390E91EC00FF875B3CA60BA +PT=5FB9F6408D54401A9A76288AE3A04944 + +I=335 +KEY=54CBA9A5782ED91FC28258E62BAC2832C68EF0A988621CA8 +CT=5FB9F6408D54401A9A76288AE3A04944 +PT=7C9CD2510E96FF37BF75E57E84098535 + +I=336 +KEY=871169F28E704C95BE1E8AB7253AD70579FB15D70C6B999D +CT=7C9CD2510E96FF37BF75E57E84098535 +PT=8E041B8C74A84D747B02714452B34F11 + +I=337 +KEY=7F44ED6AA755957A301A913B51929A7102F964935ED8D68C +CT=8E041B8C74A84D747B02714452B34F11 +PT=3698639F56657A40D52B9B8015448C2A + +I=338 +KEY=EEAF09001996BA6E0682F2A407F7E031D7D2FF134B9C5AA6 +CT=3698639F56657A40D52B9B8015448C2A +PT=79FB5E4A065D29E1CA3E15897B60032F + +I=339 +KEY=D21CCA06254A64C97F79ACEE01AAC9D01DECEA9A30FC5989 +CT=79FB5E4A065D29E1CA3E15897B60032F +PT=C582F5F8D9D2E9323C769B2B1AE369BD + +I=340 +KEY=29D2F84E4568BA6FBAFB5916D87820E2219A71B12A1F3034 +CT=C582F5F8D9D2E9323C769B2B1AE369BD +PT=916405DC8F2AD50548997D87BCCADBFB + +I=341 +KEY=43AC4D54A8A0222F2B9F5CCA5752F5E769030C3696D5EBCF +CT=916405DC8F2AD50548997D87BCCADBFB +PT=0E9FF0E147A47056EC6B09837C9E0E62 + +I=342 +KEY=9AF110B8274794772500AC2B10F685B1856805B5EA4BE5AD +CT=0E9FF0E147A47056EC6B09837C9E0E62 +PT=3B6E3CAAC358427980E66E3D30D39E4F + +I=343 +KEY=49F910E7957BC95C1E6E9081D3AEC7C8058E6B88DA987BE2 +CT=3B6E3CAAC358427980E66E3D30D39E4F +PT=25CBE5AB4C6785C0F2847CF89F2635AB + +I=344 +KEY=64D90092DD97AC3C3BA5752A9FC94208F70A177045BE4E49 +CT=25CBE5AB4C6785C0F2847CF89F2635AB +PT=3D9200D39461D8B2CE7874DA20BFD9DA + +I=345 +KEY=C7A8403AFB011673063775F90BA89ABA397263AA65019793 +CT=3D9200D39461D8B2CE7874DA20BFD9DA +PT=E61E7E06A1E1F656AE8F8C29C96E5A16 + +I=346 +KEY=071AF635AF7A9602E0290BFFAA496CEC97FDEF83AC6FCD85 +CT=E61E7E06A1E1F656AE8F8C29C96E5A16 +PT=7488BB35F06E94F31A744D1EA95E71D0 + +I=347 +KEY=A4B5ECB7047E08D694A1B0CA5A27F81F8D89A29D0531BC55 +CT=7488BB35F06E94F31A744D1EA95E71D0 +PT=3912DC00C0AB79C473CA2CC8F69262F0 + +I=348 +KEY=BD4478B38A0E9347ADB36CCA9A8C81DBFE438E55F3A3DEA5 +CT=3912DC00C0AB79C473CA2CC8F69262F0 +PT=C4B546F134A016DADA8E7C478B1E7D45 + +I=349 +KEY=F7B6F476517483AD69062A3BAE2C970124CDF21278BDA3E0 +CT=C4B546F134A016DADA8E7C478B1E7D45 +PT=298524C5D468EBFA97DEFEC7B80EE752 + +I=350 +KEY=8E0C5244F7417C2440830EFE7A447CFBB3130CD5C0B344B2 +CT=298524C5D468EBFA97DEFEC7B80EE752 +PT=B27EFB90BA3A27A1077C6742D5B68396 + +I=351 +KEY=C6E8F264FA0C9A9AF2FDF56EC07E5B5AB46F6B971505C724 +CT=B27EFB90BA3A27A1077C6742D5B68396 +PT=D02C27A94DD3B772B338C7462379B009 + +I=352 +KEY=AD694D243DCC6B7B22D1D2C78DADEC280757ACD1367C772D +CT=D02C27A94DD3B772B338C7462379B009 +PT=1CED06084E67BA4BAD3C331F4074B9FF + +I=353 +KEY=68AEF48D86D395583E3CD4CFC3CA5663AA6B9FCE7608CED2 +CT=1CED06084E67BA4BAD3C331F4074B9FF +PT=C0D7811FE8630B3E7C3A60DA9042A6B2 + +I=354 +KEY=670A8D40573F598AFEEB55D02BA95D5DD651FF14E64A6860 +CT=C0D7811FE8630B3E7C3A60DA9042A6B2 +PT=45F92C84CE2AEC6E7953C8AAC5901D0F + +I=355 +KEY=D44FD97B0D59C923BB127954E583B133AF0237BE23DA756F +CT=45F92C84CE2AEC6E7953C8AAC5901D0F +PT=23A4863C994EFE93E7CE1C89FE14143D + +I=356 +KEY=4E08C6A539C74A6598B6FF687CCD4FA048CC2B37DDCE6152 +CT=23A4863C994EFE93E7CE1C89FE14143D +PT=85EB5F46988211E3077FDBE38F1EBE6B + +I=357 +KEY=21B17D5E461224B31D5DA02EE44F5E434FB3F0D452D0DF39 +CT=85EB5F46988211E3077FDBE38F1EBE6B +PT=59CF6CCC81A8BC17A52D7550B40C7514 + +I=358 +KEY=6CC595309F161F3E4492CCE265E7E254EA9E8584E6DCAA2D +CT=59CF6CCC81A8BC17A52D7550B40C7514 +PT=13DF4C2AA74A4B9123B3A57FE94F85BE + +I=359 +KEY=77B90151B41B1B7D574D80C8C2ADA9C5C92D20FB0F932F93 +CT=13DF4C2AA74A4B9123B3A57FE94F85BE +PT=6DEDE53AD5DC2A87744DA0EA561977A3 + +I=360 +KEY=8E1683C57C1817C23AA065F217718342BD608011598A5830 +CT=6DEDE53AD5DC2A87744DA0EA561977A3 +PT=F9D912AAB5ED1ACBD0475411DF98F49C + +I=361 +KEY=E9FDD94AE4B4FABAC3797758A29C99896D27D4008612ACAC +CT=F9D912AAB5ED1ACBD0475411DF98F49C +PT=853C907D9FD35B61D2ABBE5C1A89DB4B + +I=362 +KEY=BCC524DF4D452AE14645E7253D4FC2E8BF8C6A5C9C9B77E7 +CT=853C907D9FD35B61D2ABBE5C1A89DB4B +PT=874C4BC1993FBA12136443B57F9523BE + +I=363 +KEY=9F5EFA7196589240C109ACE4A47078FAACE829E9E30E5459 +CT=874C4BC1993FBA12136443B57F9523BE +PT=E6B6E9133DD0EC2844EF3CC0C2F9E4AC + +I=364 +KEY=2F0731DB4FA3024127BF45F799A094D2E807152921F7B0F5 +CT=E6B6E9133DD0EC2844EF3CC0C2F9E4AC +PT=20B41EE01134041DF8D11BB7F86928EA + +I=365 +KEY=7E44D240F06AAA5E070B5B17889490CF10D60E9ED99E981F +CT=20B41EE01134041DF8D11BB7F86928EA +PT=BF6B03096DCDC052B1325CC34BF6E56C + +I=366 +KEY=D8D3E3D538C8CA34B860581EE559509DA1E4525D92687D73 +CT=BF6B03096DCDC052B1325CC34BF6E56C +PT=5ED3E40FB5C34DD1F370C3AD72C7C24D + +I=367 +KEY=F3DF20767CDA5E0CE6B3BC11509A1D4C529491F0E0AFBF3E +CT=5ED3E40FB5C34DD1F370C3AD72C7C24D +PT=3EA6BCE2317C5D696DF8240C481B34DD + +I=368 +KEY=484932A15D75173FD81500F361E640253F6CB5FCA8B48BE3 +CT=3EA6BCE2317C5D696DF8240C481B34DD +PT=41D6E077746FE1A9307E1107631A5D2C + +I=369 +KEY=EF960956685DE1CE99C3E0841589A18C0F12A4FBCBAED6CF +CT=41D6E077746FE1A9307E1107631A5D2C +PT=D0C6DDEF0A623686BA303C278D445964 + +I=370 +KEY=82477D8D682C1D4849053D6B1FEB970AB52298DC46EA8FAB +CT=D0C6DDEF0A623686BA303C278D445964 +PT=EEFFA6025D6CAFBF9DC18E5B1B99A6ED + +I=371 +KEY=15D8DCF80A26856AA7FA9B69428738B528E316875D732946 +CT=EEFFA6025D6CAFBF9DC18E5B1B99A6ED +PT=38E222ABAA07CDAE9CC02FAC84EC0FC1 + +I=372 +KEY=556151278277D7579F18B9C2E880F51BB423392BD99F2687 +CT=38E222ABAA07CDAE9CC02FAC84EC0FC1 +PT=B00C719E6A320E4385794EB7F23C0D80 + +I=373 +KEY=777F91003E4410572F14C85C82B2FB58315A779C2BA32B07 +CT=B00C719E6A320E4385794EB7F23C0D80 +PT=0E667CA932023D2EFD8DDBDED5A43D78 + +I=374 +KEY=130507FC817F14432172B4F5B0B0C676CCD7AC42FE07167F +CT=0E667CA932023D2EFD8DDBDED5A43D78 +PT=6B15DA892F0B5916F31BB74FC7D03F9A + +I=375 +KEY=D045A84BBF62DE2E4A676E7C9FBB9F603FCC1B0D39D729E5 +CT=6B15DA892F0B5916F31BB74FC7D03F9A +PT=EBEF6DC298D63BF6E6E46F833B217033 + +I=376 +KEY=7742FB68CDF60735A18803BE076DA496D928748E02F659D6 +CT=EBEF6DC298D63BF6E6E46F833B217033 +PT=48DC6F65F193AFCCE559EA6F04FBD79A + +I=377 +KEY=5CE32BC22C77B664E9546CDBF6FE0B5A3C719EE1060D8E4C +CT=48DC6F65F193AFCCE559EA6F04FBD79A +PT=D0596880F92716C51E41519C640AEFDA + +I=378 +KEY=2DA6B73C5131E24C390D045B0FD91D9F2230CF7D62076196 +CT=D0596880F92716C51E41519C640AEFDA +PT=ABB7C3E499086F53C4DB97640168943B + +I=379 +KEY=E41C1A826978491892BAC7BF96D172CCE6EB5819636FF5AD +CT=ABB7C3E499086F53C4DB97640168943B +PT=0CC58B3D0370317E1025E1AF97962646 + +I=380 +KEY=501012EE411DCDC59E7F4C8295A143B2F6CEB9B6F4F9D3EB +CT=0CC58B3D0370317E1025E1AF97962646 +PT=28920AED2B644C4346FC146903887244 + +I=381 +KEY=97B7E8C1147A5062B6ED466FBEC50FF1B032ADDFF771A1AF +CT=28920AED2B644C4346FC146903887244 +PT=E7A28DA5EC871DAF8C2D196C7ED8977F + +I=382 +KEY=988B9928402BCD63514FCBCA5242125E3C1FB4B389A936D0 +CT=E7A28DA5EC871DAF8C2D196C7ED8977F +PT=013876A92413AED2E360A241FE021B25 + +I=383 +KEY=3432357430ACC9135077BD637651BC8CDF7F16F277AB2DF5 +CT=013876A92413AED2E360A241FE021B25 +PT=10F1A56A8CFDA1D5044D5D0E53F6A773 + +I=384 +KEY=CE94F859CD3E85F440861809FAAC1D59DB324BFC245D8A86 +CT=10F1A56A8CFDA1D5044D5D0E53F6A773 +PT=941C717EE6642DD474719F099AEEB1EB + +I=385 +KEY=A1BFA52EA232FDF0D49A69771CC8308DAF43D4F5BEB33B6D +CT=941C717EE6642DD474719F099AEEB1EB +PT=F31B47230ABC94977E14E1080528C1C9 + +I=386 +KEY=37B36A8E7A3B4F2A27812E541674A41AD15735FDBB9BFAA4 +CT=F31B47230ABC94977E14E1080528C1C9 +PT=A91264221890CA93541B662F64A11C62 + +I=387 +KEY=04F603F98A9D1AC78E934A760EE46E89854C53D2DF3AE6C6 +CT=A91264221890CA93541B662F64A11C62 +PT=05F5171B639825EC67A37B3671F2F884 + +I=388 +KEY=A294EBBBD53D18DD8B665D6D6D7C4B65E2EF28E4AEC81E42 +CT=05F5171B639825EC67A37B3671F2F884 +PT=B6FE84EB2987DE956953DEBA6FD2E029 + +I=389 +KEY=E0E38A82F60E8EED3D98D98644FB95F08BBCF65EC11AFE6B +CT=B6FE84EB2987DE956953DEBA6FD2E029 +PT=2741338CF00FBC70C4B1C67C97E85B97 + +I=390 +KEY=2193D386143F6D761AD9EA0AB4F429804F0D302256F2A5FC +CT=2741338CF00FBC70C4B1C67C97E85B97 +PT=E56C7C453E2E13028AD812F9CDB78E2F + +I=391 +KEY=05AD3BC4F1B29F17FFB5964F8ADA3A82C5D522DB9B452BD3 +CT=E56C7C453E2E13028AD812F9CDB78E2F +PT=9A9B49AC0691F1576D515E935F042229 + +I=392 +KEY=1588C005075F4674652EDFE38C4BCBD5A8847C48C44109FA +CT=9A9B49AC0691F1576D515E935F042229 +PT=143E5F64AD38373D3B54FA24CC7C0AF5 + +I=393 +KEY=731083CCCB22E7CF711080872173FCE893D0866C083D030F +CT=143E5F64AD38373D3B54FA24CC7C0AF5 +PT=61F6AF426601588CB7C525255EC1A06D + +I=394 +KEY=DACEE3906B98DFC110E62FC54772A4642415A34956FCA362 +CT=61F6AF426601588CB7C525255EC1A06D +PT=DB5DC1C3B3413F653D72F8744C2DD881 + +I=395 +KEY=D9ACA0F56DCA4FC0CBBBEE06F4339B0119675B3D1AD17BE3 +CT=DB5DC1C3B3413F653D72F8744C2DD881 +PT=4E9D548DA49E992AD3123F53558909C9 + +I=396 +KEY=12C2FE0C57D21C208526BA8B50AD022BCA75646E4F58722A +CT=4E9D548DA49E992AD3123F53558909C9 +PT=EB2E835192E64ABC30C3F2662B703C47 + +I=397 +KEY=7A43322D6174BA786E0839DAC24B4897FAB6960864284E6D +CT=EB2E835192E64ABC30C3F2662B703C47 +PT=CD0690863F63F2B263D4C11190A7985B + +I=398 +KEY=EBC6D71978D39185A30EA95CFD28BA2599625719F48FD636 +CT=CD0690863F63F2B263D4C11190A7985B +PT=C044E800B65CA78559D0642C370C7D3E + +I=399 +KEY=A1B6CE2EEC5FC386634A415C4B741DA0C0B23335C383AB08 +CT=C044E800B65CA78559D0642C370C7D3E +PT=F1A81B68F6E5A6271A8CB24E7D9491EF + +========================= + +KEYSIZE=256 + +I=0 +KEY=0000000000000000000000000000000000000000000000000000000000000000 +CT=00000000000000000000000000000000 +PT=058CCFFDBBCB382D1F6F56585D8A4ADE + +I=1 +KEY=85C6B2BB2300148F945AEBF1F021CF79058CCFFDBBCB382D1F6F56585D8A4ADE +CT=058CCFFDBBCB382D1F6F56585D8A4ADE +PT=15173A0EB65F5CC05E704EFE61D9E346 + +I=2 +KEY=2447EC44111548FBB670B98F182D5DEE109BF5F30D9464ED411F18A63C53A998 +CT=15173A0EB65F5CC05E704EFE61D9E346 +PT=85F083ACC676D91EDD1ABFB43935237A + +I=3 +KEY=85D3E1D750CAA89BEE274AA7C32C2207956B765FCBE2BDF39C05A71205668AE2 +CT=85F083ACC676D91EDD1ABFB43935237A +PT=42C8F0ABC58E0BEAC32911D2DD9FA8C8 + +I=4 +KEY=CE86B24954745B2BAAF27010202EE7FAD7A386F40E6CB6195F2CB6C0D8F9222A +CT=42C8F0ABC58E0BEAC32911D2DD9FA8C8 +PT=5E44123D2CA07981B073BB2749F557D6 + +I=5 +KEY=CD7BCBBA4555A0D034FD7B528A1D042C89E794C922CCCF98EF5F0DE7910C75FC +CT=5E44123D2CA07981B073BB2749F557D6 +PT=8B649458EA90F4F7E13467E509B7F164 + +I=6 +KEY=EF28DFAED7794B1C7B892F3C98FCDC9602830091C85C3B6F0E6B6A0298BB8498 +CT=8B649458EA90F4F7E13467E509B7F164 +PT=F240D1F579DA2CA8839F7072DF52EBA3 + +I=7 +KEY=C66605EC92F96B49F08CBC6276A0DC68F0C3D164B18617C78DF41A7047E96F3B +CT=F240D1F579DA2CA8839F7072DF52EBA3 +PT=B05297490A394B4A1736DE7F8DC12969 + +I=8 +KEY=347403B6E6344E1525B8D2BD4DCA343F4091462DBBBF5C8D9AC2C40FCA284652 +CT=B05297490A394B4A1736DE7F8DC12969 +PT=8BA49D44B98E67501235CE1C2F26BB28 + +I=9 +KEY=B932CD0C70488602C56F92A0DA57BE27CB35DB6902313BDD88F70A13E50EFD7A +CT=8BA49D44B98E67501235CE1C2F26BB28 +PT=86CE4E4D040C49F2717407157454162E + +I=10 +KEY=28F8B6B4AB2B0B81F3676F6E422D438C4DFB9524063D722FF9830D06915AEB54 +CT=86CE4E4D040C49F2717407157454162E +PT=4E9CA7FB0FF9F38FC821CA91052483F9 + +I=11 +KEY=5CD19F4D3C5B58602B101E15B39F51E4036732DF09C481A031A2C797947E68AD +CT=4E9CA7FB0FF9F38FC821CA91052483F9 +PT=55E49ED59245C1850CB0C17C1CEEA05E + +I=12 +KEY=E822BB0D1F25F3DCA6FE0CB1A8AF39F15683AC0A9B8140253D1206EB8890C8F3 +CT=55E49ED59245C1850CB0C17C1CEEA05E +PT=F7F0BFA319AC289C9F64E6FCDD531B44 + +I=13 +KEY=8B64FF354C6E303F14EA34C9F667FEC9A17313A9822D68B9A276E01755C3D3B7 +CT=F7F0BFA319AC289C9F64E6FCDD531B44 +PT=6ACB8A177226AE47E2170F77D2FE4923 + +I=14 +KEY=1A9D440EBAC3F3625E229B66C5D9249CCBB899BEF00BC6FE4061EF60873D9A94 +CT=6ACB8A177226AE47E2170F77D2FE4923 +PT=BAA9BB819332A87D6004164927EAC699 + +I=15 +KEY=97F92B9AD44A3182FF10E07747C560B37111223F63396E832065F929A0D75C0D +CT=BAA9BB819332A87D6004164927EAC699 +PT=EB84793E2D68632900B0517392EC4B94 + +I=16 +KEY=2AEEBA2AC59870A7B4274B80FE74D55A9A955B014E510DAA20D5A85A323B1799 +CT=EB84793E2D68632900B0517392EC4B94 +PT=6C662FBE2B22394CC1D45453772C72BA + +I=17 +KEY=EEA4B3C4F96C42E3B7DF5A3870C85B69F6F374BF657334E6E101FC0945176523 +CT=6C662FBE2B22394CC1D45453772C72BA +PT=70D2BBC1FA7D49848D94112DA93A3C3C + +I=18 +KEY=F930D1529C654F31549809C6CD5CC4608621CF7E9F0E7D626C95ED24EC2D591F +CT=70D2BBC1FA7D49848D94112DA93A3C3C +PT=1AFF91E67039133946638E4E505310C2 + +I=19 +KEY=5D0F461C1A5FF7BA5C93F0CED9DD49FF9CDE5E98EF376E5B2AF6636ABC7E49DD +CT=1AFF91E67039133946638E4E505310C2 +PT=8E4358B22DE7BCDC8B8409E6250633BF + +I=20 +KEY=AA4B475845EB19F601856A40AB517594129D062AC2D0D287A1726A8C99787A62 +CT=8E4358B22DE7BCDC8B8409E6250633BF +PT=2A79FE5A222C9503954346D6C15AC679 + +I=21 +KEY=9703F4DD85A3BE85343FFD15950A266B38E4F870E0FC478434312C5A5822BC1B +CT=2A79FE5A222C9503954346D6C15AC679 +PT=0FF812C5B863282C294D7069F830EE86 + +I=22 +KEY=3DD1B2ACBC6568851E767D20D82AD324371CEAB5589F6FA81D7C5C33A012529D +CT=0FF812C5B863282C294D7069F830EE86 +PT=D449218625DE49D2B9514E032CA096E7 + +I=23 +KEY=95CC16235D3DFF4F7DB2116D2B380F39E355CB337D41267AA42D12308CB2C47A +CT=D449218625DE49D2B9514E032CA096E7 +PT=F951EAC3BC78DB0AE13FDC33048D2D81 + +I=24 +KEY=A6F55AFBDA7EA939F6F2A28530C416781A0421F0C139FD704512CE03883FE9FB +CT=F951EAC3BC78DB0AE13FDC33048D2D81 +PT=7D5A03A955F6403F918AC915AC22B797 + +I=25 +KEY=7C5D39885F4C0F4FCF672321B711C5B7675E225994CFBD4FD4980716241D5E6C +CT=7D5A03A955F6403F918AC915AC22B797 +PT=CA2E1C274073AD2A3AE35C60ECA52A58 + +I=26 +KEY=4E7B914B84BFA1A2D7BD409AFADD2EDCAD703E7ED4BC1065EE7B5B76C8B87434 +CT=CA2E1C274073AD2A3AE35C60ECA52A58 +PT=C5048FA0148CED10A06E107269DA9C95 + +I=27 +KEY=F62D8C4822C5F89D51E3C68695D91CA66874B1DEC030FD754E154B04A162E8A1 +CT=C5048FA0148CED10A06E107269DA9C95 +PT=CB9B457A7A24577DA71AC335F0572DAB + +I=28 +KEY=C37AAD7CB20087F4B98390C59D3ECFB2A3EFF4A4BA14AA08E90F88315135C50A +CT=CB9B457A7A24577DA71AC335F0572DAB +PT=FA60BFF170DD30C29DF1807C1612CD67 + +I=29 +KEY=1A2C6858B37D0341BF8796FB72D00B72598F4B55CAC99ACA74FE084D4727086D +CT=FA60BFF170DD30C29DF1807C1612CD67 +PT=E2FACFB5DF4E69C911838FCC546D0C8E + +I=30 +KEY=039B73E3A8DCF3C678FBC246AAECDAECBB7584E01587F303657D8781134A04E3 +CT=E2FACFB5DF4E69C911838FCC546D0C8E +PT=749AB2B9176AFDB8B6714DF44BBF2B58 + +I=31 +KEY=773D90EA7ECA29DFD9141A42EB2BBC64CFEF365902ED0EBBD30CCA7558F52FBB +CT=749AB2B9176AFDB8B6714DF44BBF2B58 +PT=0285E58D09A8D33FB196FD16A8DF37C0 + +I=32 +KEY=598262B046B44784D977F6BE2553C6ACCD6AD3D40B45DD84629A3763F02A187B +CT=0285E58D09A8D33FB196FD16A8DF37C0 +PT=1C952C46AE829D8805031A44F9D85521 + +I=33 +KEY=AFAE657D3220CD1E6199A49754525F4AD1FFFF92A5C7400C67992D2709F24D5A +CT=1C952C46AE829D8805031A44F9D85521 +PT=EED0A47E63FF354B4D9C53F7FD75D720 + +I=34 +KEY=A61F583BCFD120B8CABE1E4C616F4FC73F2F5BECC63875472A057ED0F4879A7A +CT=EED0A47E63FF354B4D9C53F7FD75D720 +PT=10C1F0F7C32AD36F03AEA8DCE6AAE7BC + +I=35 +KEY=FB76D4B83A7F50482A92F5A92CB60F522FEEAB1B0512A62829ABD60C122D7DC6 +CT=10C1F0F7C32AD36F03AEA8DCE6AAE7BC +PT=372488DF6543180F1F2AE15E5B0C8785 + +I=36 +KEY=35EAC2BA73F55570CB727220C027FE6218CA23C46051BE27368137524921FA43 +CT=372488DF6543180F1F2AE15E5B0C8785 +PT=3DE420FF3699D68DB69966F57D09045A + +I=37 +KEY=48B6E08B9FD9B5C130E1829CD4540D9C252E033B56C868AA801851A73428FE19 +CT=3DE420FF3699D68DB69966F57D09045A +PT=7858F396DC520131C789CB8F8C919CCD + +I=38 +KEY=DB39C13F29241FF29C5BEB839705AD5B5D76F0AD8A9A699B47919A28B8B962D4 +CT=7858F396DC520131C789CB8F8C919CCD +PT=07BE8BBF9FCD7D04888E61935DD7222F + +I=39 +KEY=A5F9B675531AB58C1FFC316C9359EA335AC87B121557149FCF1FFBBBE56E40FB +CT=07BE8BBF9FCD7D04888E61935DD7222F +PT=EDD619B7C12E2AF6BDAA953B2E7871EF + +I=40 +KEY=A02D1F14A64BBC67DD7EE9EAB3FB0EADB71E62A5D4793E6972B56E80CB163114 +CT=EDD619B7C12E2AF6BDAA953B2E7871EF +PT=C748CDB645F1A1E44A63FAF00B2C3A45 + +I=41 +KEY=177D7A6843B5ABBEB212E68734A7A05C7056AF1391889F8D38D69470C03A0B51 +CT=C748CDB645F1A1E44A63FAF00B2C3A45 +PT=BD3ED4C8CD7DBF4299AC63FE119D291E + +I=42 +KEY=BD9BDC6BD09DEED3E75C918BE55E5332CD687BDB5CF520CFA17AF78ED1A7224F +CT=BD3ED4C8CD7DBF4299AC63FE119D291E +PT=A16B82F958441E90A965427C854EECBB + +I=43 +KEY=E6325C33EC76F8EDE02707A3AE82F1096C03F92204B13E5F081FB5F254E9CEF4 +CT=A16B82F958441E90A965427C854EECBB +PT=E04E642689D1AB78E7CDE26D0563901C + +I=44 +KEY=B8543DB3071AB9F0802D4106FBDA59648C4D9D048D609527EFD2579F518A5EE8 +CT=E04E642689D1AB78E7CDE26D0563901C +PT=08E59C72C13C030DA3C50300861EA097 + +I=45 +KEY=ECDD43A6B225DB325BFFE5462B66E97884A801764C5C962A4C17549FD794FE7F +CT=08E59C72C13C030DA3C50300861EA097 +PT=C224B2EFEE07AAC33F1F6EB1295D9A50 + +I=46 +KEY=741D627C8B47BED4497C71FDC9854912468CB399A25B3CE973083A2EFEC9642F +CT=C224B2EFEE07AAC33F1F6EB1295D9A50 +PT=1653CE734D27B44369D4FE582E7A885F + +I=47 +KEY=A47BDC62B1D80815AC6BF04481C5601F50DF7DEAEF7C88AA1ADCC476D0B3EC70 +CT=1653CE734D27B44369D4FE582E7A885F +PT=CADC89828B6147FAEC581DDCFF3C0960 + +I=48 +KEY=CB91E738F51C111DAC2E0A3BF7B076A39A03F468641DCF50F684D9AA2F8FE510 +CT=CADC89828B6147FAEC581DDCFF3C0960 +PT=49402F0F4AFA2518D57C5D1CFCECC0F2 + +I=49 +KEY=BDA1FFAEE7B93EDFCA4374871A149550D343DB672EE7EA4823F884B6D36325E2 +CT=49402F0F4AFA2518D57C5D1CFCECC0F2 +PT=EBFF53AB449DE5A53EDC6E595AA47B10 + +I=50 +KEY=18D865B8E8C779268D3876C22AF479FB38BC88CC6A7A0FED1D24EAEF89C75EF2 +CT=EBFF53AB449DE5A53EDC6E595AA47B10 +PT=30073458509F9AC9DA21B2DF566AB3BE + +I=51 +KEY=967E2580238300563A34A6E70D84B4FF08BBBC943AE59524C7055830DFADED4C +CT=30073458509F9AC9DA21B2DF566AB3BE +PT=5AB9F90CC2A7603A68E2ACA95A2DE55D + +I=52 +KEY=A469A4E2F0B3847F3B52886FAD7DBAF652024598F842F51EAFE7F49985800811 +CT=5AB9F90CC2A7603A68E2ACA95A2DE55D +PT=F22A13F395B6064172CA9DC572C26B2E + +I=53 +KEY=9EA4946ED73FF8BB8700C18967C01968A028566B6DF4F35FDD2D695CF742633F +CT=F22A13F395B6064172CA9DC572C26B2E +PT=26E44B9F3DEBA8EE3531DDFA42F1DC14 + +I=54 +KEY=3D25EEEACEF18702FD3896283CFF8A8386CC1DF4501F5BB1E81CB4A6B5B3BF2B +CT=26E44B9F3DEBA8EE3531DDFA42F1DC14 +PT=32D9F05174FFF34594E952B7ADE09737 + +I=55 +KEY=8BF2A692F6A35980C0CF02FF4650871BB415EDA524E0A8F47CF5E6111853281C +CT=32D9F05174FFF34594E952B7ADE09737 +PT=7BEF027DEB1FF22774CE8A8A101DD41B + +I=56 +KEY=C90BF0E1A8B615B4C8BD318260BB80AECFFAEFD8CFFF5AD3083B6C9B084EFC07 +CT=7BEF027DEB1FF22774CE8A8A101DD41B +PT=CF6B2444DFBBFE5B6A1CA99F2D13DE9A + +I=57 +KEY=C2A4C82B4AAEE0A22315026C6FE396900091CB9C1044A4886227C504255D229D +CT=CF6B2444DFBBFE5B6A1CA99F2D13DE9A +PT=14AD8C7B0F0460A3F48D5CD2CFFB385C + +I=58 +KEY=BF76E610192E2AEF42FF8F487CDDC318143C47E71F40C42B96AA99D6EAA61AC1 +CT=14AD8C7B0F0460A3F48D5CD2CFFB385C +PT=A5A850FC44A09C5985CE9661AF84F186 + +I=59 +KEY=1E42AEC368C600F18CBFA305EB559946B194171B5BE0587213640FB74522EB47 +CT=A5A850FC44A09C5985CE9661AF84F186 +PT=E2895D416951FDA66B695ABFA313F89D + +I=60 +KEY=4E9BC121E32849DAA501BEA4E534D9C2531D4A5A32B1A5D4780D5508E63113DA +CT=E2895D416951FDA66B695ABFA313F89D +PT=91E93AAECC5FB253F7463F101B2A4132 + +I=61 +KEY=ACC045A67F680F14D3F8DA454C922071C2F470F4FEEE17878F4B6A18FD1B52E8 +CT=91E93AAECC5FB253F7463F101B2A4132 +PT=F0F339022B4001E72F3BCC1A140603AD + +I=62 +KEY=4B47D2639B4A04D3C87D35DB4E63E563320749F6D5AE1660A070A602E91D5145 +CT=F0F339022B4001E72F3BCC1A140603AD +PT=DBECAFF90EDD4555A5D9A23817520D51 + +I=63 +KEY=C73B1C617BE90F2710DFF2C3AC60E0F9E9EBE60FDB73533505A9043AFE4F5C14 +CT=DBECAFF90EDD4555A5D9A23817520D51 +PT=73315A63A8889095AFED497AEFE657B4 + +I=64 +KEY=7F368758F7B303DE356481ED8EBFA46F9ADABC6C73FBC3A0AA444D4011A90BA0 +CT=73315A63A8889095AFED497AEFE657B4 +PT=3AB7E2F81D24D857308A1FC785559333 + +I=65 +KEY=6D7EF76412498AB3C70AA3006CC87188A06D5E946EDF1BF79ACE528794FC9893 +CT=3AB7E2F81D24D857308A1FC785559333 +PT=7EAA2814E372F674AB0B6E0E428D1AF4 + +I=66 +KEY=D626AD50A7B86153BF9215A6A8F7E908DEC776808DADED8331C53C89D6718267 +CT=7EAA2814E372F674AB0B6E0E428D1AF4 +PT=ADD212A59AC9EF6A55AEAC22D35A1BFE + +I=67 +KEY=4B9C7ED9AC7835C87DAB8BEF3ED6878B73156425176402E9646B90AB052B9999 +CT=ADD212A59AC9EF6A55AEAC22D35A1BFE +PT=203ECD34AE1BB2F23BC673DBD74FA07B + +I=68 +KEY=E34FBDEF9D81B464DD1138093F132051532BA911B97FB01B5FADE370D26439E2 +CT=203ECD34AE1BB2F23BC673DBD74FA07B +PT=0A18AFD5EEBBD338299897EA1F01324C + +I=69 +KEY=77BD51D39775121C22343FFC66D40F0B593306C457C463237635749ACD650BAE +CT=0A18AFD5EEBBD338299897EA1F01324C +PT=2892A6AE9517642A0977942360FB8104 + +I=70 +KEY=2761BF5478726AF184C86B45AE331A7E71A1A06AC2D307097F42E0B9AD9E8AAA +CT=2892A6AE9517642A0977942360FB8104 +PT=8A4CD7685B9A1E663C3130C34BC418B9 + +I=71 +KEY=DD168B81E90D806FF468BE5E551F3344FBED77029949196F4373D07AE65A9213 +CT=8A4CD7685B9A1E663C3130C34BC418B9 +PT=C7C0A15A1A22363B378D5DD27A69D4C2 + +I=72 +KEY=3442C07C0E98F523F9278D934F424BD83C2DD658836B2F5474FE8DA89C3346D1 +CT=C7C0A15A1A22363B378D5DD27A69D4C2 +PT=55A8EF8CAE213FE3FD6AA77E7415400A + +I=73 +KEY=291BD1577921B2947BC470C19727F0BD698539D42D4A10B789942AD6E82606DB +CT=55A8EF8CAE213FE3FD6AA77E7415400A +PT=0B07BEB71461356645936996AC45EB87 + +I=74 +KEY=46475B4C21F0F4895FEFCC67632DBCDC62828763392B25D1CC0743404463ED5C +CT=0B07BEB71461356645936996AC45EB87 +PT=6DFA5978F740C18CEE6F70FF50008BFD + +I=75 +KEY=CF89BDDE5D363B3C44DB6FED2DAB47AA0F78DE1BCE6BE45D226833BF146366A1 +CT=6DFA5978F740C18CEE6F70FF50008BFD +PT=6F58747F0336A2C4D2A397511E06D703 + +I=76 +KEY=85F7D4A4503F7C3D52998384F8B29BEF6020AA64CD5D4699F0CBA4EE0A65B1A2 +CT=6F58747F0336A2C4D2A397511E06D703 +PT=32AC7B1B8FFA7D411F46C129EEFFAF13 + +I=77 +KEY=CDE87D2DFB6198CFC737D93433419757528CD17F42A73BD8EF8D65C7E49A1EB1 +CT=32AC7B1B8FFA7D411F46C129EEFFAF13 +PT=CF5D039714814E72ECE7B9D5D1B27D11 + +I=78 +KEY=BCB9F75F11496AABFE2633E393B59B449DD1D2E8562675AA036ADC12352863A0 +CT=CF5D039714814E72ECE7B9D5D1B27D11 +PT=3455F997002A1818967E2679A07C1D56 + +I=79 +KEY=99E143B3524E724A009533AEC659E15BA9842B7F560C6DB29514FA6B95547EF6 +CT=3455F997002A1818967E2679A07C1D56 +PT=1F2113D44E290F1379A3CEC6D57D6279 + +I=80 +KEY=90086C83794D6878FF2CE748ECA6EDF4B6A538AB182562A1ECB734AD40291C8F +CT=1F2113D44E290F1379A3CEC6D57D6279 +PT=88866DB676AA3B21954AFDE0A0F33007 + +I=81 +KEY=FA254EB868F6CD5965346ACAE326BD2A3E23551D6E8F598079FDC94DE0DA2C88 +CT=88866DB676AA3B21954AFDE0A0F33007 +PT=A1665AD0252764E2691E65FEFB609CDA + +I=82 +KEY=92032C92FEEB0A5CD5D71AAF1BF5F47D9F450FCD4BA83D6210E3ACB31BBAB052 +CT=A1665AD0252764E2691E65FEFB609CDA +PT=988CE348430A206546379A8C684C00F1 + +I=83 +KEY=CF32144187F7B98256B5B4204DFABC8807C9EC8508A21D0756D4363F73F6B0A3 +CT=988CE348430A206546379A8C684C00F1 +PT=60289F0B6A9ADD08BF8924AA6D7F4D12 + +I=84 +KEY=A7BD244360E3C325F3EA315C86959DD867E1738E6238C00FE95D12951E89FDB1 +CT=60289F0B6A9ADD08BF8924AA6D7F4D12 +PT=FA3EA122499D7E083D81F147D9D68B09 + +I=85 +KEY=86213610EDC35A883A3364E8D529C6459DDFD2AC2BA5BE07D4DCE3D2C75F76B8 +CT=FA3EA122499D7E083D81F147D9D68B09 +PT=8E0B2452EF0515FC554A0AADF107714D + +I=86 +KEY=92CC3AE4A2A68CD93634075E902C66CB13D4F6FEC4A0ABFB8196E97F365807F5 +CT=8E0B2452EF0515FC554A0AADF107714D +PT=463CEAE83A50BA54280E792AB6B29B94 + +I=87 +KEY=6D86FA00DBB949A29D4A6166F1EF531E55E81C16FEF011AFA998905580EA9C61 +CT=463CEAE83A50BA54280E792AB6B29B94 +PT=416CA710B874E50CC98DF842B3435AD1 + +I=88 +KEY=C9400C98A04F5041BE1C6090A866F7DA1484BB064684F4A36015681733A9C6B0 +CT=416CA710B874E50CC98DF842B3435AD1 +PT=3BA8BB5C572C0404E4B8199528825904 + +I=89 +KEY=ED5043E9699B37844033E8BD170588342F2C005A11A8F0A784AD71821B2B9FB4 +CT=3BA8BB5C572C0404E4B8199528825904 +PT=1D2812DE70AA2D59894DA4DA7FE906FC + +I=90 +KEY=1964C6C301EEEF60B34E8E35175CAF8D320412846102DDFE0DE0D55864C29948 +CT=1D2812DE70AA2D59894DA4DA7FE906FC +PT=2735CAAFE653442FFC2E878AE2829998 + +I=91 +KEY=567B1E0737D0F72F82EB3A47D17209191531D82B875199D1F1CE52D2864000D0 +CT=2735CAAFE653442FFC2E878AE2829998 +PT=07B5FA4835E5DFC67E02F490A497145D + +I=92 +KEY=89AAD6DCA6A8973580D02768EBC8372412842263B2B446178FCCA64222D7148D +CT=07B5FA4835E5DFC67E02F490A497145D +PT=A31272EC8623213B015811FAE12330CE + +I=93 +KEY=4B4AB47A0DBA39907D8E919767E69518B196508F3497672C8E94B7B8C3F42443 +CT=A31272EC8623213B015811FAE12330CE +PT=9132AB51C9738A62CABDE4977947E0BF + +I=94 +KEY=BEC71999AEE5517C243B65830D30DEBB20A4FBDEFDE4ED4E4429532FBAB3C4FC +CT=9132AB51C9738A62CABDE4977947E0BF +PT=689375EA83B61894631E6EFA2D509531 + +I=95 +KEY=77CE2C97A458300D7C95C6871CEB56D648378E347E52F5DA27373DD597E351CD +CT=689375EA83B61894631E6EFA2D509531 +PT=AAA5C6C5917DFC103383DE6C79EB2BA6 + +I=96 +KEY=0AD691774612F7EFA41FE39B8B3A2D14E29248F1EF2F09CA14B4E3B9EE087A6B +CT=AAA5C6C5917DFC103383DE6C79EB2BA6 +PT=29D9945BDB3770ED2A41D2760D0DC51D + +I=97 +KEY=4E1D42ADC4CEF6BAE3A5B9E08F7ACD65CB4BDCAA341879273EF531CFE305BF76 +CT=29D9945BDB3770ED2A41D2760D0DC51D +PT=2F9B3C4E1FDCDC8F7D5DFBEA342284F2 + +I=98 +KEY=2D76A3E35C075DB14E40A59F46E07A81E4D0E0E42BC4A5A843A8CA25D7273B84 +CT=2F9B3C4E1FDCDC8F7D5DFBEA342284F2 +PT=ED4CFCF1C8D226EBACCC8FF11B1C81B8 + +I=99 +KEY=E7364D0D17D723A69C0BA956778BD0E9099C1C15E3168343EF6445D4CC3BBA3C +CT=ED4CFCF1C8D226EBACCC8FF11B1C81B8 +PT=2F9B5E1392B767E8497F849D00E98193 + +I=100 +KEY=709380C7012CB4272A69F6D4936B163E2607420671A1E4ABA61BC149CCD23BAF +CT=2F9B5E1392B767E8497F849D00E98193 +PT=3BE783A4A38EFB44150AA7A08E1888F6 + +I=101 +KEY=98FF27B8AB7B91F690231E24608076EF1DE0C1A2D22F1FEFB31166E942CAB359 +CT=3BE783A4A38EFB44150AA7A08E1888F6 +PT=F35AED9C83E53D2EADDE507345096218 + +I=102 +KEY=24F9D2FF633EE9AAED7321CFCF4D1D20EEBA2C3E51CA22C11ECF369A07C3D141 +CT=F35AED9C83E53D2EADDE507345096218 +PT=A22BF93FD521A6E59C196022FF252DC2 + +I=103 +KEY=70E491840BC5C42A878655E18E9AAAA74C91D50184EB842482D656B8F8E6FC83 +CT=A22BF93FD521A6E59C196022FF252DC2 +PT=11E67B52F8CD97D63268485EB546E1FE + +I=104 +KEY=098FF2D6DE55FF5C66D5AD7D5949643A5D77AE537C2613F2B0BE1EE64DA01D7D +CT=11E67B52F8CD97D63268485EB546E1FE +PT=1E67AF3F7E7FDEFB868696E96F718ACC + +I=105 +KEY=B89EA7CBAE57B8AD39F23B22A8F651A44310016C0259CD093638880F22D197B1 +CT=1E67AF3F7E7FDEFB868696E96F718ACC +PT=332B0045710B2DD6EC3D619051580C7F + +I=106 +KEY=39F71BC56EBFA91088499DC41A0C5B5B703B01297352E0DFDA05E99F73899BCE +CT=332B0045710B2DD6EC3D619051580C7F +PT=86F3D75D18F7AB31C6C52C19B0C35023 + +I=107 +KEY=417147DB03FDA0B26BEED7FE8A9487D5F6C8D6746BA54BEE1CC0C586C34ACBED +CT=86F3D75D18F7AB31C6C52C19B0C35023 +PT=452E6C2DA8B93A1E282F1A86AECB9F15 + +I=108 +KEY=C4336C26C20AD7811578044800A51E8EB3E6BA59C31C71F034EFDF006D8154F8 +CT=452E6C2DA8B93A1E282F1A86AECB9F15 +PT=637F010BAC28AC108331F4E26B262D3A + +I=109 +KEY=D0369C75D40EEF29CF7588FB87EE2ED2D099BB526F34DDE0B7DE2BE206A779C2 +CT=637F010BAC28AC108331F4E26B262D3A +PT=3F3DCA8B4C2DDFD556880A17FB575E7B + +I=110 +KEY=4DE25218630A678C287EC42F93985D22EFA471D923190235E15621F5FDF027B9 +CT=3F3DCA8B4C2DDFD556880A17FB575E7B +PT=3DA8C1D40B51A8BC6E728D7A1E6B3B2E + +I=111 +KEY=C0526C3096805B532433C0248E153A00D20CB00D2848AA898F24AC8FE39B1C97 +CT=3DA8C1D40B51A8BC6E728D7A1E6B3B2E +PT=449B050578191E4C156F7040EF27D5EC + +I=112 +KEY=6A1B7384328BAA25B6A857FB12A90FD49697B5085051B4C59A4BDCCF0CBCC97B +CT=449B050578191E4C156F7040EF27D5EC +PT=D58ACA128F936803BDD5EC1E6DECAB04 + +I=113 +KEY=44B7F3EB0EF0EF4325353D30F35C4D71431D7F1ADFC2DCC6279E30D16150627F +CT=D58ACA128F936803BDD5EC1E6DECAB04 +PT=77F1011F968AD46338CA68D5DF37959E + +I=114 +KEY=E1E6BBD70AEAC4D65159422B3DFE82DF34EC7E05494808A51F545804BE67F7E1 +CT=77F1011F968AD46338CA68D5DF37959E +PT=FC692161766A29C9E6A86C353E2F3FE5 + +I=115 +KEY=5C33A88179175BB12593D6574245A6A6C8855F643F22216CF9FC34318048C804 +CT=FC692161766A29C9E6A86C353E2F3FE5 +PT=F5FD2F77BC4908F470142417048C6233 + +I=116 +KEY=E6A3CDD47570AEC4FC3B3453F78F253F3D787013836B299889E8102684C4AA37 +CT=F5FD2F77BC4908F470142417048C6233 +PT=FBDC2774D7E426CBD8B62ABD0E0EAA6F + +I=117 +KEY=4F5B3EDC53366D4C74D94663E17CBDB6C6A45767548F0F53515E3A9B8ACA0058 +CT=FBDC2774D7E426CBD8B62ABD0E0EAA6F +PT=796D978C9D724C1C9445EC5BD272CEB0 + +I=118 +KEY=9119AD19E78100B3D04BED87FF5C22B5BFC9C0EBC9FD434FC51BD6C058B8CEE8 +CT=796D978C9D724C1C9445EC5BD272CEB0 +PT=15ECF7D3F516D3CBA0307959287A5BAB + +I=119 +KEY=600B4D7604FF2650611C453A50D02275AA2537383CEB9084652BAF9970C29543 +CT=15ECF7D3F516D3CBA0307959287A5BAB +PT=DA67996084E9C74C143310FC3CF207DD + +I=120 +KEY=3B8E0B73BBF745BB360EA50E7DA9B3297042AE58B80257C87118BF654C30929E +CT=DA67996084E9C74C143310FC3CF207DD +PT=6E9BC50580D45D54FEEC74830C0D9516 + +I=121 +KEY=231592D0CE761359AE2E85CC4E4156A01ED96B5D38D60A9C8FF4CBE6403D0788 +CT=6E9BC50580D45D54FEEC74830C0D9516 +PT=A4B0F6A50C72C5EE755FA5595334DF2E + +I=122 +KEY=7ABD82D278910B909B0D6219EF5E0D98BA699DF834A4CF72FAAB6EBF1309D8A6 +CT=A4B0F6A50C72C5EE755FA5595334DF2E +PT=24CDAEEB54A1EB7E2D4A0BEE526EA6E0 + +I=123 +KEY=5C8F7B23850BD287F011E257D691F8979EA433136005240CD7E1655141677E46 +CT=24CDAEEB54A1EB7E2D4A0BEE526EA6E0 +PT=84F24CDC0AA63CEA2DDE8F94C8776765 + +I=124 +KEY=DF8EEE46309021F6E7D7D41908B6CABE1A567FCF6AA318E6FA3FEAC589101923 +CT=84F24CDC0AA63CEA2DDE8F94C8776765 +PT=EEA20542DEDB0B99A2144942FFEAC820 + +I=125 +KEY=8634A663D618B3BB54F44A5849170ACDF4F47A8DB478137F582BA38776FAD103 +CT=EEA20542DEDB0B99A2144942FFEAC820 +PT=CDD91737753BE9F672A60DD722202127 + +I=126 +KEY=E41913E97F21A4E6A948ABEB45279E0D392D6DBAC143FA892A8DAE5054DAF024 +CT=CDD91737753BE9F672A60DD722202127 +PT=E6E2F7846E06BB90F19B21521DD4D238 + +I=127 +KEY=1E63624B5EADBE7D42255F208CC7D348DFCF9A3EAF454119DB168F02490E221C +CT=E6E2F7846E06BB90F19B21521DD4D238 +PT=0110CA2647D43C8BD012976113EFB860 + +I=128 +KEY=8476329019AA4D0D91C71E0DFFF47906DEDF5018E8917D920B0418635AE19A7C +CT=0110CA2647D43C8BD012976113EFB860 +PT=CC9AACC98876387D09565F1A20D329AF + +I=129 +KEY=DB1C0803BC1AD91C5621FA8C54AA83EF1245FCD160E745EF025247797A32B3D3 +CT=CC9AACC98876387D09565F1A20D329AF +PT=55AB296D67DEEBA179AD8093C1952CC2 + +I=130 +KEY=5C0887FF7C888D7800C43BC9E88D9B3B47EED5BC0739AE4E7BFFC7EABBA79F11 +CT=55AB296D67DEEBA179AD8093C1952CC2 +PT=27016691505182706848CD5D7A2C5CAB + +I=131 +KEY=0FFBE12ADFA17F3BF26622C20311D38960EFB32D57682C3E13B70AB7C18BC3BA +CT=27016691505182706848CD5D7A2C5CAB +PT=5E6C9FAF480FFE51D7687ADE203D5367 + +I=132 +KEY=C4C12330BC21062618E2E83EC3755DAC3E832C821F67D26FC4DF7069E1B690DD +CT=5E6C9FAF480FFE51D7687ADE203D5367 +PT=082FF20DC6AFBA3888348E5724F5C526 + +I=133 +KEY=3F6BF56A0136C1058924FCD831A65EBC36ACDE8FD9C868574CEBFE3EC54355FB +CT=082FF20DC6AFBA3888348E5724F5C526 +PT=67AE68CDDA349A067339F28FA216A188 + +I=134 +KEY=4AB9E8E9B5BB84353006AB43065C6B8F5102B64203FCF2513FD20CB16755F473 +CT=67AE68CDDA349A067339F28FA216A188 +PT=3316F37F97D679B78A537A0E107923AB + +I=135 +KEY=E04DE045508423D735B20168C7974CC26214453D942A8BE6B58176BF772CD7D8 +CT=3316F37F97D679B78A537A0E107923AB +PT=00AEB331686999C5F5FB1E7C6CCF1072 + +I=136 +KEY=D4D19E570760468E9703F0E49C4AC9F262BAF60CFC431223407A68C31BE3C7AA +CT=00AEB331686999C5F5FB1E7C6CCF1072 +PT=29A5DB93D2AE9B1ED9714213EAD9AA1C + +I=137 +KEY=6D6789354D2CC3EFA9ABFC466F21A6E24B1F2D9F2EED893D990B2AD0F13A6DB6 +CT=29A5DB93D2AE9B1ED9714213EAD9AA1C +PT=E98426CB0F858A084EB66311188D9200 + +I=138 +KEY=06ED66801B81943BF1640AAE222A23C7A29B0B5421680335D7BD49C1E9B7FFB6 +CT=E98426CB0F858A084EB66311188D9200 +PT=21527326577425261F2D40268C428E29 + +I=139 +KEY=2232758279A806C21870C85273C12FA883C97872761C2613C89009E765F5719F +CT=21527326577425261F2D40268C428E29 +PT=CC9393A43B8A8194C0EC29F989E597A6 + +I=140 +KEY=E7E22C2A6E6D4A1BFE7B706047094AF44F5AEBD64D96A787087C201EEC10E639 +CT=CC9393A43B8A8194C0EC29F989E597A6 +PT=714846062B262A823B24164900DF91AD + +I=141 +KEY=89A78F64BCAEE02CAC92928134C2567C3E12ADD066B08D0533583657ECCF7794 +CT=714846062B262A823B24164900DF91AD +PT=1D0AC79D1E9BB36A6A6A8E49538C08FF + +I=142 +KEY=4F6E8D81296C95FAA0FE6F2D324A392223186A4D782B3E6F5932B81EBF437F6B +CT=1D0AC79D1E9BB36A6A6A8E49538C08FF +PT=403D8B10E0AB31493589AFFA8E8B1BEE + +I=143 +KEY=24E398291CF018E4666728F4F635F74D6325E15D98800F266CBB17E431C86485 +CT=403D8B10E0AB31493589AFFA8E8B1BEE +PT=9E0516EDA401DAAF6AC013841C0D63C8 + +I=144 +KEY=F80CF8AF1FA463D2ED7C7F59C1B239B0FD20F7B03C81D589067B04602DC5074D +CT=9E0516EDA401DAAF6AC013841C0D63C8 +PT=74B2B200922B21AA20A0C5860CFB7E4D + +I=145 +KEY=577A5456424E1A76C3E113EB82CCDF34899245B0AEAAF42326DBC1E6213E7900 +CT=74B2B200922B21AA20A0C5860CFB7E4D +PT=25AFF27E13888A638CDA2673D7F16AFD + +I=146 +KEY=7C623BBD4777E6EF9BC058DF5BA27BEAAC3DB7CEBD227E40AA01E795F6CF13FD +CT=25AFF27E13888A638CDA2673D7F16AFD +PT=A54F400AB9C52913D7302BA36BF217DD + +I=147 +KEY=A8B33E433720C4B925C4F0315DDB73B00972F7C404E757537D31CC369D3D0420 +CT=A54F400AB9C52913D7302BA36BF217DD +PT=48A263A07112AA95EA1414CE03545790 + +I=148 +KEY=DA864B91AED3E2FAC25782F4A50C13C841D0946475F5FDC69725D8F89E6953B0 +CT=48A263A07112AA95EA1414CE03545790 +PT=541547E924522E59C1721D130B64D92F + +I=149 +KEY=EEB5FF6F9C435510E12934F5E806553E15C5D38D51A7D39F5657C5EB950D8A9F +CT=541547E924522E59C1721D130B64D92F +PT=5830544939EB4607145538388840248B + +I=150 +KEY=24E609AD29E4C601189CB2FE119767884DF587C4684C95984202FDD31D4DAE14 +CT=5830544939EB4607145538388840248B +PT=CBE1F82FD3318448AA36ADB5967EF865 + +I=151 +KEY=5A7EBB76C38C2E5F038612A06E84BB2C86147FEBBB7D11D0E83450668B335671 +CT=CBE1F82FD3318448AA36ADB5967EF865 +PT=3B104547D2D620879E3CB2B5774C0FB4 + +I=152 +KEY=827EFCB7BC862C2466B8C79FC297AD3DBD043AAC69AB31577608E2D3FC7F59C5 +CT=3B104547D2D620879E3CB2B5774C0FB4 +PT=B667F7544FE49A07611A160E3312F69A + +I=153 +KEY=9BC6C18805144F98CAEA7B252B3EE2930B63CDF8264FAB501712F4DDCF6DAF5F +CT=B667F7544FE49A07611A160E3312F69A +PT=C3E928FDEB5D7DDF7CF32C4DBCFE32F3 + +I=154 +KEY=2BC00DF6D26F9A968C3BFF47AE761718C88AE505CD12D68F6BE1D89073939DAC +CT=C3E928FDEB5D7DDF7CF32C4DBCFE32F3 +PT=72A9CF7AA2EDAF1907D77D10A02A45DE + +I=155 +KEY=15A0EE054E2D5E7EDCF3FC766860ACCDBA232A7F6FFF79966C36A580D3B9D872 +CT=72A9CF7AA2EDAF1907D77D10A02A45DE +PT=97ABFAAD506940F88FDC8F55AD7EA919 + +I=156 +KEY=C56C11F3A96852119C16751963C24CD42D88D0D23F96396EE3EA2AD57EC7716B +CT=97ABFAAD506940F88FDC8F55AD7EA919 +PT=DD55A02B1EB01EB091CA6337D0BEB5BD + +I=157 +KEY=8634CC7B3416FCE337AAFA39791D1545F0DD70F9212627DE722049E2AE79C4D6 +CT=DD55A02B1EB01EB091CA6337D0BEB5BD +PT=C5EB3DF5A328B267F3895CECD4A828AF + +I=158 +KEY=DDC1361E1432CCAC3551E2478A321A0035364D0C820E95B981A9150E7AD1EC79 +CT=C5EB3DF5A328B267F3895CECD4A828AF +PT=49952DACD97FD5583A7D9C4FF515EC17 + +I=159 +KEY=52658EEC2A7441D866CFA15944BB12857CA360A05B7140E1BBD489418FC4006E +CT=49952DACD97FD5583A7D9C4FF515EC17 +PT=4971EEEF871E935AC470BD770802B04B + +I=160 +KEY=05FC7A181B1935EA8DCEC961B0DFC14B35D28E4FDC6FD3BB7FA4343687C6B025 +CT=4971EEEF871E935AC470BD770802B04B +PT=3DB5E9165C24EC3790DC3E53E5E5D2DE + +I=161 +KEY=8D2793B7BDCF80338AA39C86008361BC08676759804B3F8CEF780A65622362FB +CT=3DB5E9165C24EC3790DC3E53E5E5D2DE +PT=1FDB5D4FBB59F082B3B617C8A23734F1 + +I=162 +KEY=37BE37961B77866869826907BB9E9C1717BC3A163B12CF0E5CCE1DADC014560A +CT=1FDB5D4FBB59F082B3B617C8A23734F1 +PT=8C59775AD3FF7C337B22C8E785321E25 + +I=163 +KEY=F3184EA1C8FFE3D436BEE076AA999B659BE54D4CE8EDB33D27ECD54A4526482F +CT=8C59775AD3FF7C337B22C8E785321E25 +PT=0CB834FCC0CFDAECAF4AFC5A2E38DF23 + +I=164 +KEY=CACF50D99B066EB84CBFAEEC9B0D6769975D79B0282269D188A629106B1E970C +CT=0CB834FCC0CFDAECAF4AFC5A2E38DF23 +PT=229EB7B6A97D91921BCD8C95A0D7C17B + +I=165 +KEY=3FA80E4FB785B9FC3B058CC62D289958B5C3CE06815FF843936BA585CBC95677 +CT=229EB7B6A97D91921BCD8C95A0D7C17B +PT=0D7692C281DD4FF35D9B1620E1385C34 + +I=166 +KEY=CE2A3A893C96A4F1AA81AD52EBCC3C23B8B55CC40082B7B0CEF0B3A52AF10A43 +CT=0D7692C281DD4FF35D9B1620E1385C34 +PT=D3C5FE594F5C8C5A359235448EB20146 + +I=167 +KEY=FC8642DB8CB42D1B1251CB7FE6AFF90D6B70A29D4FDE3BEAFB6286E1A4430B05 +CT=D3C5FE594F5C8C5A359235448EB20146 +PT=8C0F88460C700D96847249807B84223F + +I=168 +KEY=2A9C9FD184A5B2418FD415A228A5C0AFE77F2ADB43AE367C7F10CF61DFC7293A +CT=8C0F88460C700D96847249807B84223F +PT=5A4237A5C2DABDCDA6389D5FC66032F6 + +I=169 +KEY=FDB533163E989D2FA32CCA5D3CC5D376BD3D1D7E81748BB1D928523E19A71BCC +CT=5A4237A5C2DABDCDA6389D5FC66032F6 +PT=BF8AAC6B1536CCCCECCC9D6BE970EB3E + +I=170 +KEY=3C4B3CF0FD0C4292B2497175D4400F8902B7B1159442477D35E4CF55F0D7F0F2 +CT=BF8AAC6B1536CCCCECCC9D6BE970EB3E +PT=97CE58407FD26D63C86765CB05EA6277 + +I=171 +KEY=367862F3E2C5520EA2269392B6139E9C9579E955EB902A1EFD83AA9EF53D9285 +CT=97CE58407FD26D63C86765CB05EA6277 +PT=B411687B044B624077A92D8C130697B9 + +I=172 +KEY=0300AF491DAF6C607417FB1FD9B1EC612168812EEFDB485E8A2A8712E63B053C +CT=B411687B044B624077A92D8C130697B9 +PT=D22E92A5132EA85F4FB25EE19C248008 + +I=173 +KEY=7C92EF49A7D27E97F1884299B635F0ADF346138BFCF5E001C598D9F37A1F8534 +CT=D22E92A5132EA85F4FB25EE19C248008 +PT=FD6817CD680A2A8CE93E4B4F9CAA72AA + +I=174 +KEY=80EABB1D8C9B5F769FCAC87ED8D0C9CA0E2E044694FFCA8D2CA692BCE6B5F79E +CT=FD6817CD680A2A8CE93E4B4F9CAA72AA +PT=8DDD9B3B9278D2DE3453EA6769E1C39C + +I=175 +KEY=FB345E2D7BBBED527259FAEAEA79C05D83F39F7D0687185318F578DB8F543402 +CT=8DDD9B3B9278D2DE3453EA6769E1C39C +PT=AE69F5CD8D342E74113E979ACE3539F2 + +I=176 +KEY=7D93DC33FF2266770291160CD317C65E2D9A6AB08BB3362709CBEF4141610DF0 +CT=AE69F5CD8D342E74113E979ACE3539F2 +PT=30E19A4E84997172486DAE4FB4C41E58 + +I=177 +KEY=82362FF3E9C1AD93474CF4CABD354E7E1D7BF0FE0F2A475541A6410EF5A513A8 +CT=30E19A4E84997172486DAE4FB4C41E58 +PT=75B3D07617EB189512DC5161908940C1 + +I=178 +KEY=8EFD0FCB3855CCC16BD919FBD17596C768C8208818C15FC0537A106F652C5369 +CT=75B3D07617EB189512DC5161908940C1 +PT=FD13E89107FAFA44998721AD726C620F + +I=179 +KEY=2299D22282C798107F489637DCD479C395DBC8191F3BA584CAFD31C217403166 +CT=FD13E89107FAFA44998721AD726C620F +PT=C1B0210C0387864717BD7D02063B6A69 + +I=180 +KEY=75E05597A2BBDF23E5BD172C83548C9B546BE9151CBC23C3DD404CC0117B5B0F +CT=C1B0210C0387864717BD7D02063B6A69 +PT=0E442B38E9024CCA5DC43A7B8D5F6FCF + +I=181 +KEY=4DBC8DCB8C25B5F4AD374BA3064216555A2FC22DF5BE6F09808476BB9C2434C0 +CT=0E442B38E9024CCA5DC43A7B8D5F6FCF +PT=8FD213EC19D62FD2C19E6C91B97E56A0 + +I=182 +KEY=E393BAD07E955EBC1446B847DE5A891ED5FDD1C1EC6840DB411A1A2A255A6260 +CT=8FD213EC19D62FD2C19E6C91B97E56A0 +PT=F52ADFD33A68EE198F33708E676D0CE9 + +I=183 +KEY=3F33A76F87DB0388C2D66C7F2EFAA1B820D70E12D600AEC2CE296AA442376E89 +CT=F52ADFD33A68EE198F33708E676D0CE9 +PT=7649EB4283505EEEE1BE16DB6677B3F5 + +I=184 +KEY=04BC65DE70C9E01EEEDA5A507C218C8D569EE5505550F02C2F977C7F2440DD7C +CT=7649EB4283505EEEE1BE16DB6677B3F5 +PT=6FB1C4AD8A5B8A606621A8BF4277F3DC + +I=185 +KEY=8A6EF9710F4AE10EB60C8D25A8F67C50392F21FDDF0B7A4C49B6D4C066372EA0 +CT=6FB1C4AD8A5B8A606621A8BF4277F3DC +PT=22C2CF9572D708F688291056E2F8E120 + +I=186 +KEY=ED6D084D5F8AA4F201F9C20EA26A90E81BEDEE68ADDC72BAC19FC49684CFCF80 +CT=22C2CF9572D708F688291056E2F8E120 +PT=28AC7257911ECEB549D910BFA0905AE5 + +I=187 +KEY=BA2735927D6A76B952C08A219FBB572233419C3F3CC2BC0F8846D429245F9565 +CT=28AC7257911ECEB549D910BFA0905AE5 +PT=2A1F3842DF988CDA0C6415450A657DB2 + +I=188 +KEY=53BCC06CCCBC31A5BEE2CE88E6EAEFAC195EA47DE35A30D58422C16C2E3AE8D7 +CT=2A1F3842DF988CDA0C6415450A657DB2 +PT=6055EB3A24DE4D87C6BA5073A5BAC919 + +I=189 +KEY=DF88C3CEC31C7B88D8AC0C7AAA2CED99790B4F47C7847D524298911F8B8021CE +CT=6055EB3A24DE4D87C6BA5073A5BAC919 +PT=CC051CCD37068B41935FD14538DFEF82 + +I=190 +KEY=265B351B93FF456D5A1EAADD2BEA1296B50E538AF082F613D1C7405AB35FCE4C +CT=CC051CCD37068B41935FD14538DFEF82 +PT=225B63F455DD72EC87CF6FD5DF0FDAF3 + +I=191 +KEY=BAC4C541E0A693CF8A3892A82F67CD959755307EA55F84FF56082F8F6C5014BF +CT=225B63F455DD72EC87CF6FD5DF0FDAF3 +PT=64027F6B72F0A11628F66D5C502658E8 + +I=192 +KEY=E8F68EF4909A128F331DFEFAE8560EBCF3574F15D7AF25E97EFE42D33C764C57 +CT=64027F6B72F0A11628F66D5C502658E8 +PT=529AAF9163EDA1BC39E66D2556BE938B + +I=193 +KEY=1951B1A50BED04096C17E816D4EC6225A1CDE084B442845547182FF66AC8DFDC +CT=529AAF9163EDA1BC39E66D2556BE938B +PT=F93E85D98EB9BDDD7D3844421235FBAB + +I=194 +KEY=D39AF070909FBC0E3226E28041B0286158F3655D3AFB39883A206BB478FD2477 +CT=F93E85D98EB9BDDD7D3844421235FBAB +PT=16B6B3CC08003BA36C9E84B1EE9CD7CC + +I=195 +KEY=B705C6CCD010B980E386B8690C83E96C4E45D69132FB022B56BEEF059661F3BB +CT=16B6B3CC08003BA36C9E84B1EE9CD7CC +PT=301AFE66055149FA5775A9CE19F1FF63 + +I=196 +KEY=B3C813D4FCBD31ED95E7E71CEC15153E7E5F28F737AA4BD101CB46CB8F900CD8 +CT=301AFE66055149FA5775A9CE19F1FF63 +PT=1090E68F7C8400861589E304A5B815CD + +I=197 +KEY=0EBC30ADB6946B6415C0309D636C79F46ECFCE784B2E4B571442A5CF2A281915 +CT=1090E68F7C8400861589E304A5B815CD +PT=2778F0C712804C0B8D085B196A4D73C4 + +I=198 +KEY=9C5815C6705B39DEECB8BDDDC9329A0D49B73EBF59AE075C994AFED640656AD1 +CT=2778F0C712804C0B8D085B196A4D73C4 +PT=14FECB137DC9C38A04D92B60A177A61D + +I=199 +KEY=9D83B41F8F415B5F3B2C08682383471B5D49F5AC2467C4D69D93D5B6E112CCCC +CT=14FECB137DC9C38A04D92B60A177A61D +PT=0EF1321EA52EAA7624E3F2EFD0C886AF + +I=200 +KEY=2960CEE0AF043ED1A549BA223F6C1CF153B8C7B281496EA0B970275931DA4A63 +CT=0EF1321EA52EAA7624E3F2EFD0C886AF +PT=AFA8B2129577EC178B59D42D1B92D313 + +I=201 +KEY=51E0DECF48A151021C70EC3EE3CE9008FC1075A0143E82B73229F3742A489970 +CT=AFA8B2129577EC178B59D42D1B92D313 +PT=3351631344E6EF86712327D3C05EBDEB + +I=202 +KEY=5F34A789B0B1185BA7D1BB3EF2677060CF4116B350D86D31430AD4A7EA16249B +CT=3351631344E6EF86712327D3C05EBDEB +PT=C299D0556B0D15014627CADBCCC3DC33 + +I=203 +KEY=FC3E420F84F4C75802DCF68ABF0030E70DD8C6E63BD57830052D1E7C26D5F8A8 +CT=C299D0556B0D15014627CADBCCC3DC33 +PT=CEB83A2B9DD76B649BAAE48A8B772A5C + +I=204 +KEY=C04448AD77DBF33F22A2346C7A40F813C360FCCDA60213549E87FAF6ADA2D2F4 +CT=CEB83A2B9DD76B649BAAE48A8B772A5C +PT=A8C6AEC94E82BC68AC8E29A8CB9504F6 + +I=205 +KEY=3FA863ECC4AFA141DD7349C44F94FEE16BA65204E880AF3C3209D35E6637D602 +CT=A8C6AEC94E82BC68AC8E29A8CB9504F6 +PT=1EDED55C8D3309F828C17AF072C79D7A + +I=206 +KEY=8893E5FB27191AE09E4AB5F062289F117578875865B3A6C41AC8A9AE14F04B78 +CT=1EDED55C8D3309F828C17AF072C79D7A +PT=FD2AC22891FB294EB0AD2BADFE759C29 + +I=207 +KEY=90BA1205BB7927E86F9895855648D3EB88524570F4488F8AAA658203EA85D751 +CT=FD2AC22891FB294EB0AD2BADFE759C29 +PT=2FE6AE59ACD516EE1567A7A1C43FDE2A + +I=208 +KEY=278FD88834EA67564F301785C4045D6FA7B4EB29589D9964BF0225A22EBA097B +CT=2FE6AE59ACD516EE1567A7A1C43FDE2A +PT=35BEC13F159F61C7EF4C860AD3B41A75 + +I=209 +KEY=E9D2F23C213D02724737A5E907BFBDF0920A2A164D02F8A3504EA3A8FD0E130E +CT=35BEC13F159F61C7EF4C860AD3B41A75 +PT=650D65D6ED716DA515EAAF1A7447C3FB + +I=210 +KEY=4A0A997634E2D9305795FC90291F6FD9F7074FC0A073950645A40CB28949D0F5 +CT=650D65D6ED716DA515EAAF1A7447C3FB +PT=7AFE0D2F234A6CDEDD7103DA09147285 + +I=211 +KEY=BD671DD81F8FCD9D472564589AA13F5D8DF942EF8339F9D898D50F68805DA270 +CT=7AFE0D2F234A6CDEDD7103DA09147285 +PT=40627620B17313AF42EA7DD6CFD900F9 + +I=212 +KEY=5668F777C46BF78DC664E72186626BF5CD9B34CF324AEA77DA3F72BE4F84A289 +CT=40627620B17313AF42EA7DD6CFD900F9 +PT=0C62985837C8C6FB468BD6E3928F8497 + +I=213 +KEY=B82B5D4C3DEF62CFAE064CFDB5D904EFC1F9AC9705822C8C9CB4A45DDD0B261E +CT=0C62985837C8C6FB468BD6E3928F8497 +PT=A1FFF4635AAF2AD8AE6EA8C70858EF3B + +I=214 +KEY=6A179EF63528EFA2B12DBA23D1EC8D21600658F45F2D065432DA0C9AD553C925 +CT=A1FFF4635AAF2AD8AE6EA8C70858EF3B +PT=403F8E2D050E2976487BBEDD6466357E + +I=215 +KEY=6857720AC4DDCFFE8A96B455C973901A2039D6D95A232F227AA1B247B135FC5B +CT=403F8E2D050E2976487BBEDD6466357E +PT=2DD7EB8476988C850E8D95DC598FC61A + +I=216 +KEY=5B938E230BFE9056471E7C83A6ED03930DEE3D5D2CBBA3A7742C279BE8BA3A41 +CT=2DD7EB8476988C850E8D95DC598FC61A +PT=676B96F400AE18138B302FD3D70D490E + +I=217 +KEY=4CE7ECA340DEC23715C53343EB9162DA6A85ABA92C15BBB4FF1C08483FB7734F +CT=676B96F400AE18138B302FD3D70D490E +PT=620AAA14B94BF6B60A83129085BCF02B + +I=218 +KEY=1024ECE618D140CAE8B9DFC8EB1DE137088F01BD955E4D02F59F1AD8BA0B8364 +CT=620AAA14B94BF6B60A83129085BCF02B +PT=B701A38325DC282045C6F914394B9F70 + +I=219 +KEY=6B8C6DA855E1E72E4A6AC44601B24D60BF8EA23EB0826522B059E3CC83401C14 +CT=B701A38325DC282045C6F914394B9F70 +PT=808D0B334B775C59F8C34A3524CB4126 + +I=220 +KEY=C50A625A89465321DACCB9EB40DEF57D3F03A90DFBF5397B489AA9F9A78B5D32 +CT=808D0B334B775C59F8C34A3524CB4126 +PT=4E29C921CC295F6A3082C1BC02ACDA70 + +I=221 +KEY=973341A4E3DB315FA97C7EEDF493EA71712A602C37DC661178186845A5278742 +CT=4E29C921CC295F6A3082C1BC02ACDA70 +PT=77BC204E50EFCA2AEBDC16D3F3C3D739 + +I=222 +KEY=639EB8FB16B34B55550705FDCFF7C8CC069640626733AC3B93C47E9656E4507B +CT=77BC204E50EFCA2AEBDC16D3F3C3D739 +PT=A677A7B55AA03EB0587EE00123D047F3 + +I=223 +KEY=610A9602B725E4D87AB2904E91050D90A0E1E7D73D93928BCBBA9E9775341788 +CT=A677A7B55AA03EB0587EE00123D047F3 +PT=09AF5421548AC11466370484F8C556DE + +I=224 +KEY=314A6E0BD202458489059738917B6678A94EB3F66919539FAD8D9A138DF14156 +CT=09AF5421548AC11466370484F8C556DE +PT=B6CDD2336AB8735EE7A9946A1FE7EE0C + +I=225 +KEY=73658C0F88490F7C3B9F2B7B39551BBF1F8361C503A120C14A240E799216AF5A +CT=B6CDD2336AB8735EE7A9946A1FE7EE0C +PT=B5A2F3B47E4AC87BC06612587253930E + +I=226 +KEY=968794DEC3E866DE4F999C860E9851E9AA2192717DEBE8BA8A421C21E0453C54 +CT=B5A2F3B47E4AC87BC06612587253930E +PT=09C9C38BB3348147EB284FFA24D87244 + +I=227 +KEY=205605E66A4BE2CF61E13243E104FED9A3E851FACEDF69FD616A53DBC49D4E10 +CT=09C9C38BB3348147EB284FFA24D87244 +PT=9D1EDCA2674E5A30416DF7CC2938DC63 + +I=228 +KEY=9CA7508C83DB6E56EFF3489F2BD30C573EF68D58A99133CD2007A417EDA59273 +CT=9D1EDCA2674E5A30416DF7CC2938DC63 +PT=E8A2282B47DAB6A666A4607BBC857FC6 + +I=229 +KEY=0F98884E85FEB533CFC281C2F4437915D654A573EE4B856B46A3C46C5120EDB5 +CT=E8A2282B47DAB6A666A4607BBC857FC6 +PT=B6675D2263DC1C1E0F04A9A9BC666D2D + +I=230 +KEY=3F3ED6DC6E08DF2515D08273832429286033F8518D97997549A76DC5ED468098 +CT=B6675D2263DC1C1E0F04A9A9BC666D2D +PT=D6FF2642FD84C80674EAF8674242248D + +I=231 +KEY=67910C06B57CD52767674B70F59337D8B6CCDE13701351733D4D95A2AF04A415 +CT=D6FF2642FD84C80674EAF8674242248D +PT=47D4419A669253C39A0CC96C7CD612C0 + +I=232 +KEY=43EE254E414DB89044EE2F703B340F6AF1189F89168102B0A7415CCED3D2B6D5 +CT=47D4419A669253C39A0CC96C7CD612C0 +PT=B2B3FD7A1D4B0695B3499430F2E44CEA + +I=233 +KEY=89C9881E6D6CEFF00DDFC5618655FA4543AB62F30BCA04251408C8FE2136FA3F +CT=B2B3FD7A1D4B0695B3499430F2E44CEA +PT=4AAD0AE20AFF0675CF78992DFD2B685C + +I=234 +KEY=2C24846D047677F89EF73B917962D0FA0906681101350250DB7051D3DC1D9263 +CT=4AAD0AE20AFF0675CF78992DFD2B685C +PT=C90343412CFE70201CE22D9AD2222788 + +I=235 +KEY=770637F8F8F32915BF7630919D0726AEC0052B502DCB7270C7927C490E3FB5EB +CT=C90343412CFE70201CE22D9AD2222788 +PT=923FE89134FAF362802C5A2EBF399D2C + +I=236 +KEY=426891CF6B068FAC7FFB5A04874AEC78523AC3C11931811247BE2667B10628C7 +CT=923FE89134FAF362802C5A2EBF399D2C +PT=9C08F05026196BA3550A2496049B720B + +I=237 +KEY=B66BCCA5EFAF3F448BDD52DC48F2B904CE3233913F28EAB112B402F1B59D5ACC +CT=9C08F05026196BA3550A2496049B720B +PT=7B487FD67D0C2D987C3DEFD335C2EF17 + +I=238 +KEY=079CCBC13FCFB0D032293FDFEC563F86B57A4C474224C7296E89ED22805FB5DB +CT=7B487FD67D0C2D987C3DEFD335C2EF17 +PT=CEC12158856704CE8ABF0CA6C6F3006B + +I=239 +KEY=998AFEF458902CA632D60843A88D36637BBB6D1FC743C3E7E436E18446ACB5B0 +CT=CEC12158856704CE8ABF0CA6C6F3006B +PT=DA19C7C7283ADD9C5145ABBA53F1E7E1 + +I=240 +KEY=95EDAF196289EE6D24AA752DF489DEFCA1A2AAD8EF791E7BB5734A3E155D5251 +CT=DA19C7C7283ADD9C5145ABBA53F1E7E1 +PT=F043A57E686C1FE7DACB858F0C3E6857 + +I=241 +KEY=3050D2C04C0860414427BF5B19792D7651E10FA68715019C6FB8CFB119633A06 +CT=F043A57E686C1FE7DACB858F0C3E6857 +PT=2FB7B264BB4B3FAFA01A6BB93CC2958D + +I=242 +KEY=26186DD7BE83659550BA3B52D99975037E56BDC23C5E3E33CFA2A40825A1AF8B +CT=2FB7B264BB4B3FAFA01A6BB93CC2958D +PT=D46BBD3ABD958DA722F3591578C30F5E + +I=243 +KEY=DE1D625B9C840580FDDE57EDE82419D1AA3D00F881CBB394ED51FD1D5D62A0D5 +CT=D46BBD3ABD958DA722F3591578C30F5E +PT=3D69379AB60535902C38AB5E121DD035 + +I=244 +KEY=FF9396CB65FFB9D47EF4E0253FD98BBA9754376237CE8604C16956434F7F70E0 +CT=3D69379AB60535902C38AB5E121DD035 +PT=A5767F4E6C8482290BC7B76D23EEF145 + +I=245 +KEY=B98B5F1CA9752B1B07514B72C3D585F23222482C5B4A042DCAAEE12E6C9181A5 +CT=A5767F4E6C8482290BC7B76D23EEF145 +PT=9388736A82C99337C49BB4F32437B1DA + +I=246 +KEY=5F130919FB4ED29397E4781550B1D444A1AA3B46D983971A0E3555DD48A6307F +CT=9388736A82C99337C49BB4F32437B1DA +PT=915C6C5181E797DADC289F8FFF60CD19 + +I=247 +KEY=D3F202F140D38545C8A04EC2D0993E2B30F65717586400C0D21DCA52B7C6FD66 +CT=915C6C5181E797DADC289F8FFF60CD19 +PT=A61167CDBE95ABFAD9C1A58BDA90F0D4 + +I=248 +KEY=FBFA83B249C3B13C83E8FC111611391296E730DAE6F1AB3A0BDC6FD96D560DB2 +CT=A61167CDBE95ABFAD9C1A58BDA90F0D4 +PT=9AF2B4CF00B037976D0F5CAC4201885D + +I=249 +KEY=CC24CC54D0889912C7AD2473EBA8BBB30C158415E6419CAD66D333752F5785EF +CT=9AF2B4CF00B037976D0F5CAC4201885D +PT=A9B74046119B6699FD5EFD1E476BEE64 + +I=250 +KEY=F520F18D9FACA98E5F57226127FA9B6BA5A2C453F7DAFA349B8DCE6B683C6B8B +CT=A9B74046119B6699FD5EFD1E476BEE64 +PT=CD7EAA1EF3B91B69FD3E54FCC5A802E9 + +I=251 +KEY=9BFD59A9F78FB1BE6F13B701D7EB0F6268DC6E4D0463E15D66B39A97AD946962 +CT=CD7EAA1EF3B91B69FD3E54FCC5A802E9 +PT=FD7095C419E2722425E6D4CA1A393D8C + +I=252 +KEY=C1C39AC5158C8CDBE82CF37D00B7896995ACFB891D81937943554E5DB7AD54EE +CT=FD7095C419E2722425E6D4CA1A393D8C +PT=9963CE47EB0322135C5D20B923FC341A + +I=253 +KEY=C9E26AE18D08643029C92F11BD3E8AA40CCF35CEF682B16A1F086EE4945160F4 +CT=9963CE47EB0322135C5D20B923FC341A +PT=11589A1BDD037FABABBB9BF5AAC859A7 + +I=254 +KEY=2183FF3C1EB1DF48DB8FA5F87F279F891D97AFD52B81CEC1B4B3F5113E993953 +CT=11589A1BDD037FABABBB9BF5AAC859A7 +PT=B6CEE1CD709BE6E055041FC2E1A87539 + +I=255 +KEY=738690954B4B92CE2367567B3A960E8DAB594E185B1A2821E1B7EAD3DF314C6A +CT=B6CEE1CD709BE6E055041FC2E1A87539 +PT=D776658F01CCEC460FA7145C6C6CBD42 + +I=256 +KEY=71AB2DBD9923F08E516D8DF0CF57CC227C2F2B975AD6C467EE10FE8FB35DF128 +CT=D776658F01CCEC460FA7145C6C6CBD42 +PT=0C6D2578060A0A1024230D838AA45234 + +I=257 +KEY=1C0E18C83D74E46DDF65BFC3335CFF0D70420EEF5CDCCE77CA33F30C39F9A31C +CT=0C6D2578060A0A1024230D838AA45234 +PT=BFD55D67EF4883200FDAEEA5D44F0302 + +I=258 +KEY=7DA814BD80D8CBBEE778E030682E7F34CF975388B3944D57C5E91DA9EDB6A01E +CT=BFD55D67EF4883200FDAEEA5D44F0302 +PT=E821629542650FAFEF08D94AC889078A + +I=259 +KEY=10490CD6F16D915CE9891C69E10884D827B6311DF1F142F82AE1C4E3253FA794 +CT=E821629542650FAFEF08D94AC889078A +PT=F2F81CD9CBD3E932686B6195A97EE13A + +I=260 +KEY=F0114F7C7101931F6A4595A6C3D2F34AD54E2DC43A22ABCA428AA5768C4146AE +CT=F2F81CD9CBD3E932686B6195A97EE13A +PT=C90348C14450EE3D9BFA30377D4B2440 + +I=261 +KEY=C5802B19BA4921D3750A590F02658F621C4D65057E7245F7D9709541F10A62EE +CT=C90348C14450EE3D9BFA30377D4B2440 +PT=619E907C4E7FD3A723E34B8D3880D71B + +I=262 +KEY=236500CE70AC49E98907DC4EDAE41CCA7DD3F579300D9650FA93DECCC98AB5F5 +CT=619E907C4E7FD3A723E34B8D3880D71B +PT=932A17E8FDA853F6DB1C9271EC4FBF56 + +I=263 +KEY=7BB7D14473E7E2D70F3C8C90D4B1035CEEF9E291CDA5C5A6218F4CBD25C50AA3 +CT=932A17E8FDA853F6DB1C9271EC4FBF56 +PT=549CB80C490E592E18ACC04FAA933489 + +I=264 +KEY=415AD8391B32F6E61A861B4C8A4BBC6DBA655A9D84AB9C8839238CF28F563E2A +CT=549CB80C490E592E18ACC04FAA933489 +PT=BF6337BEDE116D5A60B06DA8B270159C + +I=265 +KEY=058F24C125EB3E94B54BB6F1F099501C05066D235ABAF1D25993E15A3D262BB6 +CT=BF6337BEDE116D5A60B06DA8B270159C +PT=CBD3D52496E6DF0DBD065BD924C5001F + +I=266 +KEY=B85B96EC639098C392FD33D11A49251ECED5B807CC5C2EDFE495BA8319E32BA9 +CT=CBD3D52496E6DF0DBD065BD924C5001F +PT=AF8879C67DF265E118096478FBA003AD + +I=267 +KEY=526BF9DCAF4A4DFD05FAD0EA3B58131D615DC1C1B1AE4B3EFC9CDEFBE2432804 +CT=AF8879C67DF265E118096478FBA003AD +PT=C627176029E2D22A51F5630B129A1095 + +I=268 +KEY=553316781F120EE83A2D083D97D19F99A77AD6A1984C9914AD69BDF0F0D93891 +CT=C627176029E2D22A51F5630B129A1095 +PT=F46AC5870C65636D6C200312F2A15BE6 + +I=269 +KEY=E9A37578C1402447D6CC1161F126D5C7531013269429FA79C149BEE202786377 +CT=F46AC5870C65636D6C200312F2A15BE6 +PT=4FBBFF3856FC0DEC7EE18585FFA4AC16 + +I=270 +KEY=78521B42D0FBE8EA8BB6D44D66AE476D1CABEC1EC2D5F795BFA83B67FDDCCF61 +CT=4FBBFF3856FC0DEC7EE18585FFA4AC16 +PT=8711DAE7DD9B3F6D9FAD03669C1C8F5E + +I=271 +KEY=851C9A078620280FBCDDFB4FD3745C749BBA36F91F4EC8F82005380161C0403F +CT=8711DAE7DD9B3F6D9FAD03669C1C8F5E +PT=050E884136E09368DEFBC43F6B3182CC + +I=272 +KEY=50CCAA51D781B7090285D907E68B1F7A9EB4BEB829AE5B90FEFEFC3E0AF1C2F3 +CT=050E884136E09368DEFBC43F6B3182CC +PT=CEC37197CEE3E0D797F441CC0541B851 + +I=273 +KEY=DAB5ECB43982EAE8412102E2B7BC7CEA5077CF2FE74DBB47690ABDF20FB07AA2 +CT=CEC37197CEE3E0D797F441CC0541B851 +PT=197ECC091E5620DCA63BA2E6CFBC9F43 + +I=274 +KEY=57974D1C4BBF761C9E09B8DAD3E510DF49090326F91B9B9BCF311F14C00CE5E1 +CT=197ECC091E5620DCA63BA2E6CFBC9F43 +PT=F2E836DEE9668E81D74A3C0F03CF3C10 + +I=275 +KEY=E37677110C5A9A59EC06E0968BF5D14EBBE135F8107D151A187B231BC3C3D9F1 +CT=F2E836DEE9668E81D74A3C0F03CF3C10 +PT=DD581BB9F4A7BEC66CAC7916871F55C8 + +I=276 +KEY=2CD760C245E62EA5B477BDA094B3AD5166B92E41E4DAABDC74D75A0D44DC8C39 +CT=DD581BB9F4A7BEC66CAC7916871F55C8 +PT=7B05D43A3BE733E0DE6E2CE494141B46 + +I=277 +KEY=DE35BF6BC48E8B8E6A30DB886C9D75DD1DBCFA7BDF3D983CAAB976E9D0C8977F +CT=7B05D43A3BE733E0DE6E2CE494141B46 +PT=1D561DCAA42E92568DD6ACD583FF7BCE + +I=278 +KEY=8AD7FCADA5D092DD5D221532EED3FD1000EAE7B17B130A6A276FDA3C5337ECB1 +CT=1D561DCAA42E92568DD6ACD583FF7BCE +PT=1E9AB09A76FD91CC33B85390BDE631F8 + +I=279 +KEY=534EEF6B1450693335980E00CD3CDE361E70572B0DEE9BA614D789ACEED1DD49 +CT=1E9AB09A76FD91CC33B85390BDE631F8 +PT=CBD0E3A07952EAC118A81B76D09276FD + +I=280 +KEY=8A39C2221622785E4DA9B14DAAE6ADF3D5A0B48B74BC71670C7F92DA3E43ABB4 +CT=CBD0E3A07952EAC118A81B76D09276FD +PT=AC20057B857E6C34F7E68A5765573538 + +I=281 +KEY=50887AD2D325CBC04B5FD69518318BAD7980B1F0F1C21D53FB99188D5B149E8C +CT=AC20057B857E6C34F7E68A5765573538 +PT=DDFFD26BA5B33AEA36A0A6D75EAA047C + +I=282 +KEY=9613965C1776C5BAEA3CEE6154AABC9FA47F639B547127B9CD39BE5A05BE9AF0 +CT=DDFFD26BA5B33AEA36A0A6D75EAA047C +PT=F0883B6DD3CA0515CB9F1ABA646CCB69 + +I=283 +KEY=E7F6DB8A94597956CEE07447F9BB5CA454F758F687BB22AC06A6A4E061D25199 +CT=F0883B6DD3CA0515CB9F1ABA646CCB69 +PT=F4E27CA9E27B3E81B981298738C01FDA + +I=284 +KEY=0CB665943D6E6E32886A94C070366FB2A015245F65C01C2DBF278D6759124E43 +CT=F4E27CA9E27B3E81B981298738C01FDA +PT=B03B2EB7A1E13E1A17C51FF5684E2A72 + +I=285 +KEY=1EA698290E4B1D41B0CC4F3B9A9398FF102E0AE8C4212237A8E29292315C6431 +CT=B03B2EB7A1E13E1A17C51FF5684E2A72 +PT=BE133CCCE406C1C0BC1707115B5B0C84 + +I=286 +KEY=BA38F49FA3D4A74ED41F8DA958A953C7AE3D36242027E3F714F595836A0768B5 +CT=BE133CCCE406C1C0BC1707115B5B0C84 +PT=A15B1C9BCF319AEF262E366C142A0DCF + +I=287 +KEY=935F2CEECBBCF3465DB9B0DB927AF4310F662ABFEF16791832DBA3EF7E2D657A +CT=A15B1C9BCF319AEF262E366C142A0DCF +PT=7A8DA23874D28EB75261D87D57451EAE + +I=288 +KEY=B8E67B884E3E229EBB516065499F790275EB88879BC4F7AF60BA7B9229687BD4 +CT=7A8DA23874D28EB75261D87D57451EAE +PT=9331C989A7E291FD94BA4C945A79126E + +I=289 +KEY=CFB51BE6CDA499D66E7B36CAAC220FB7E6DA410E3C266652F4003706731169BA +CT=9331C989A7E291FD94BA4C945A79126E +PT=70A2F921A8BB0548D91A114478308448 + +I=290 +KEY=19821B21FED0C1659AF4E16F49F63B699678B82F949D631A2D1A26420B21EDF2 +CT=70A2F921A8BB0548D91A114478308448 +PT=8ED8FC98045BA0EF9C15E9565EECE5BB + +I=291 +KEY=27DA5E31E794D670BDB701F361B8977018A044B790C6C3F5B10FCF1455CD0849 +CT=8ED8FC98045BA0EF9C15E9565EECE5BB +PT=F6621989AFC0427E3E84039B6C6C2E75 + +I=292 +KEY=64E8F7C4292DF7D0B01BED3FAE08DA4FEEC25D3E3F06818B8F8BCC8F39A1263C +CT=F6621989AFC0427E3E84039B6C6C2E75 +PT=68F4804D1E8D383FAF4E76F80FB8F92B + +I=293 +KEY=EE626AFFE4997C11CAE2714FF96D84B18636DD73218BB9B420C5BA773619DF17 +CT=68F4804D1E8D383FAF4E76F80FB8F92B +PT=2D61F123E2479D56AE5C327A57F6A28B + +I=294 +KEY=EA24B2DB953084C818B0E6F34BA1584DAB572C50C3CC24E28E99880D61EF7D9C +CT=2D61F123E2479D56AE5C327A57F6A28B +PT=C6CD16E7A122D105EE398E6C7F15B4EF + +I=295 +KEY=F209D1ADE0869F674F6FEDCD3DB7D2EB6D9A3AB762EEF5E760A006611EFAC973 +CT=C6CD16E7A122D105EE398E6C7F15B4EF +PT=EDD6BBA5787DA2BF6A1ADF297DB98281 + +I=296 +KEY=302BEB9AA2ACB3594D7E50859C187294804C81121A9357580ABAD94863434BF2 +CT=EDD6BBA5787DA2BF6A1ADF297DB98281 +PT=4A51E54F4F81469A06F6001F2F32F4AC + +I=297 +KEY=3270FC87B4DC04FDD3F20C01407BE123CA1D645D551211C20C4CD9574C71BF5E +CT=4A51E54F4F81469A06F6001F2F32F4AC +PT=F7A2303EA59907BCC32AA4FC5A6DE448 + +I=298 +KEY=C85326465BF46A442BC1E544F9041C4A3DBF5463F08B167ECF667DAB161C5B16 +CT=F7A2303EA59907BCC32AA4FC5A6DE448 +PT=2274E43F9F8A7081DF74D5225EC28AD8 + +I=299 +KEY=A54E889A4D9FFBF993C53A9DD3B951391FCBB05C6F0166FF1012A88948DED1CE +CT=2274E43F9F8A7081DF74D5225EC28AD8 +PT=0C8358EC431313223B59126BDBB36571 + +I=300 +KEY=FA14699C20CFFE7DB68786E6117F95851348E8B02C1275DD2B4BBAE2936DB4BF +CT=0C8358EC431313223B59126BDBB36571 +PT=03237A81EEA2EAFBB5AC0B3E635CC1AC + +I=301 +KEY=B3744022A5397A735A4271261A2C96DF106B9231C2B09F269EE7B1DCF0317513 +CT=03237A81EEA2EAFBB5AC0B3E635CC1AC +PT=409EBF7DF31FD9557118B1B5CAB5EBE3 + +I=302 +KEY=8C7A22A934DCBC5E084E472DBAE4848350F52D4C31AF4673EFFF00693A849EF0 +CT=409EBF7DF31FD9557118B1B5CAB5EBE3 +PT=6CF5C9CF4A62C668B6481F7A12EE43DB + +I=303 +KEY=DB0497ED308C95BC9703265174B654D23C00E4837BCD801B59B71F13286ADD2B +CT=6CF5C9CF4A62C668B6481F7A12EE43DB +PT=D8A84E93CFF3EB9DC891333BDA5F3560 + +I=304 +KEY=7A88D30D4CC9AB8EFA76139B68F0028AE4A8AA10B43E6B8691262C28F235E84B +CT=D8A84E93CFF3EB9DC891333BDA5F3560 +PT=009E0C2454E321326336CC56D0660F91 + +I=305 +KEY=55A78B8839B395B552630641648DFCE5E436A634E0DD4AB4F210E07E2253E7DA +CT=009E0C2454E321326336CC56D0660F91 +PT=EBC89334F29560D9B9AEAE2F1D9DC65B + +I=306 +KEY=B41A907C82EDE32C6C1FD0DFED0A232D0FFE350012482A6D4BBE4E513FCE2181 +CT=EBC89334F29560D9B9AEAE2F1D9DC65B +PT=4DA63E94EBB4DA255800C9B25068E47E + +I=307 +KEY=3E428E8A77067008EFDE7BD6174B05B742580B94F9FCF04813BE87E36FA6C5FF +CT=4DA63E94EBB4DA255800C9B25068E47E +PT=6833E2CEFA8CF4B5B4607FA49D7B658D + +I=308 +KEY=39D17AE8C7232386F8339427E4A79AAC2A6BE95A037004FDA7DEF847F2DDA072 +CT=6833E2CEFA8CF4B5B4607FA49D7B658D +PT=41D882B653BEFEEEB9AE354F5ABCC058 + +I=309 +KEY=E8D52C97FA4149312A45D3EFE0A326086BB36BEC50CEFA131E70CD08A861602A +CT=41D882B653BEFEEEB9AE354F5ABCC058 +PT=D54A329BCF56B703BE0F02EE3AACB933 + +I=310 +KEY=D36FAED6CF436A491111890449BC3C66BEF959779F984D10A07FCFE692CDD919 +CT=D54A329BCF56B703BE0F02EE3AACB933 +PT=5FAAEB95E0F9D0C3C43BF725DADC9595 + +I=311 +KEY=9D7BCBB15816A0A941BBB787D2EEA155E153B2E27F619DD3644438C348114C8C +CT=5FAAEB95E0F9D0C3C43BF725DADC9595 +PT=BC699D5E82FD43B45A7B925E8C1A2F3C + +I=312 +KEY=F2EB78917ECAC2E77C19B892E846AE715D3A2FBCFD9CDE673E3FAA9DC40B63B0 +CT=BC699D5E82FD43B45A7B925E8C1A2F3C +PT=773D115B40F0E9EF780B2D10846FA684 + +I=313 +KEY=B10B9F0CECA554749EC178F3C63547DD2A073EE7BD6C37884634878D4064C534 +CT=773D115B40F0E9EF780B2D10846FA684 +PT=50095809CC96520EB8E3A66F499EE147 + +I=314 +KEY=E86E52AEB04DE0D3DC85A91E9B10D2677A0E66EE71FA6586FED721E209FA2473 +CT=50095809CC96520EB8E3A66F499EE147 +PT=6994CF8BA4C731CA33DAFE33D2A0BF94 + +I=315 +KEY=44C3C8A2F0F931926AC73F3E5351B114139AA965D53D544CCD0DDFD1DB5A9BE7 +CT=6994CF8BA4C731CA33DAFE33D2A0BF94 +PT=981902A8FD71DF8B67D52E6FC2813B90 + +I=316 +KEY=2D309D3D2603EC7E7B4EA626E9BDECFE8B83ABCD284C8BC7AAD8F1BE19DBA077 +CT=981902A8FD71DF8B67D52E6FC2813B90 +PT=35FA9A93AE142F562E62771991752B78 + +I=317 +KEY=E80939BCB4DB83768EBAD3CF2DD3F270BE79315E8658A49184BA86A788AE8B0F +CT=35FA9A93AE142F562E62771991752B78 +PT=A3651DBF8585004F0729AF4CA615C674 + +I=318 +KEY=BF1A4C57D4434FA59A2E45DB589AA16F1D1C2CE103DDA4DE839329EB2EBB4D7B +CT=A3651DBF8585004F0729AF4CA615C674 +PT=AF31F082CACEB768627B93A4D3E5349A + +I=319 +KEY=6EB47730BACAAB2207A3D12B0652B0CDB22DDC63C91313B6E1E8BA4FFD5E79E1 +CT=AF31F082CACEB768627B93A4D3E5349A +PT=57B75D2B640F45DB2D4A1F71F08545A5 + +I=320 +KEY=3EB0F3D31E648E260FE9F6FA8812ADD1E59A8148AD1C566DCCA2A53E0DDB3C44 +CT=57B75D2B640F45DB2D4A1F71F08545A5 +PT=A812DA38D7B82DF310366FA62FFD11E6 + +I=321 +KEY=0409A87F024E710C27E456CA170B60184D885B707AA47B9EDC94CA9822262DA2 +CT=A812DA38D7B82DF310366FA62FFD11E6 +PT=447F235914368F2BECD5FF98D1A34205 + +I=322 +KEY=7DE3A1E7234BF755908324E13DF413EB09F778296E92F4B530413500F3856FA7 +CT=447F235914368F2BECD5FF98D1A34205 +PT=5205860E4562B5CD6748EF89BF2791E9 + +I=323 +KEY=12EE9519335A2D827649D4EB047EB5255BF2FE272BF041785709DA894CA2FE4E +CT=5205860E4562B5CD6748EF89BF2791E9 +PT=30C0229AFDFF59E24426ACAD8D4AEFDB + +I=324 +KEY=78FF32A055D51E0A9D6E77D838AE72AD6B32DCBDD60F189A132F7624C1E81195 +CT=30C0229AFDFF59E24426ACAD8D4AEFDB +PT=FF467C6E0F82F5D2F9487DDBDB43EFB3 + +I=325 +KEY=6E49FA4CDEFC70619F739B488DD434969474A0D3D98DED48EA670BFF1AABFE26 +CT=FF467C6E0F82F5D2F9487DDBDB43EFB3 +PT=7E375B3D13871B09CA4D3357AC5EBB0E + +I=326 +KEY=90791666C996FF15EED1E20BAFB6B4B3EA43FBEECA0AF641202A38A8B6F54528 +CT=7E375B3D13871B09CA4D3357AC5EBB0E +PT=E64A319F6FBD96BD799760C4077F9713 + +I=327 +KEY=7F0D0CAB938585CF65726A6CB01DE8B00C09CA71A5B760FC59BD586CB18AD23B +CT=E64A319F6FBD96BD799760C4077F9713 +PT=1487C8488C675BD46FAF2EEC0BC7AE7E + +I=328 +KEY=7B429E6D59D4D65E16ED325F49E93D9C188E023929D03B2836127680BA4D7C45 +CT=1487C8488C675BD46FAF2EEC0BC7AE7E +PT=1F103E64A4F5239C9157E70487C50941 + +I=329 +KEY=AF20B02C3C5BD4E33E34359B86BBF2CF079E3C5D8D2518B4A74591843D887504 +CT=1F103E64A4F5239C9157E70487C50941 +PT=24C8481DD1A2245735597A18A2433E41 + +I=330 +KEY=E4F3CE6AFF9926837BAAB04C311F72A7235674405C873CE3921CEB9C9FCB4B45 +CT=24C8481DD1A2245735597A18A2433E41 +PT=3D9E715A686DE9AF8EE37AF54F82AA8A + +I=331 +KEY=A9BACBEC55AA453A83FF82CFDDB7F2F91EC8051A34EAD54C1CFF9169D049E1CF +CT=3D9E715A686DE9AF8EE37AF54F82AA8A +PT=B330735D9AB5B96501CDAF61A8EAD19F + +I=332 +KEY=5826BE9127DB557D401AF4DE6343F8AFADF87647AE5F6C291D323E0878A33050 +CT=B330735D9AB5B96501CDAF61A8EAD19F +PT=61AE40475EA11DBCC364F5377673CE37 + +I=333 +KEY=A8F0146E46A5391D0663380DF9F1FD6FCC563600F0FE7195DE56CB3F0ED0FE67 +CT=61AE40475EA11DBCC364F5377673CE37 +PT=525C1ED538B23D7CFA4A43114CF35BD4 + +I=334 +KEY=20F90A51E7A0BB9B88AE1DD28C8B484A9E0A28D5C84C4CE9241C882E4223A5B3 +CT=525C1ED538B23D7CFA4A43114CF35BD4 +PT=C2957E002E35236D455F53006495E4B7 + +I=335 +KEY=A71CC695B7AEB0D5148FA622536669385C9F56D5E6796F846143DB2E26B64104 +CT=C2957E002E35236D455F53006495E4B7 +PT=76F9C97A4B414E5DE532082BB12F5362 + +I=336 +KEY=617CF5726F26BD9A3B52FC0D902A97AD2A669FAFAD3821D98471D30597991266 +CT=76F9C97A4B414E5DE532082BB12F5362 +PT=F4D9E814D4C61B2FB1D7CDCCBAF14AA1 + +I=337 +KEY=D4DBBCC269A61933E4D63C3BDA5F522EDEBF77BB79FE3AF635A61EC92D6858C7 +CT=F4D9E814D4C61B2FB1D7CDCCBAF14AA1 +PT=6B51AF38B42F226D62474A97BD001FFF + +I=338 +KEY=512FAF06A5885D032A885EC030AF3C18B5EED883CDD1189B57E1545E90684738 +CT=6B51AF38B42F226D62474A97BD001FFF +PT=868C58D6B805CF8F9EB04A8BA123371A + +I=339 +KEY=BDD2CB78E9B554FC7FEEEC05D02309F23362805575D4D714C9511ED5314B7022 +CT=868C58D6B805CF8F9EB04A8BA123371A +PT=1752558A1F90975140CA41F68BE5333F + +I=340 +KEY=15CC46826BFD5B45ABAE9B0B2756D39C2430D5DF6A444045899B5F23BAAE431D +CT=1752558A1F90975140CA41F68BE5333F +PT=68801EAB4042E7390E64AA53C38C1D15 + +I=341 +KEY=DF5FB425C5B25E15EA717736D8ABE6644CB0CB742A06A77C87FFF57079225E08 +CT=68801EAB4042E7390E64AA53C38C1D15 +PT=02FE87211909D8954EC90EF53100F26D + +I=342 +KEY=CD73FCED5EBA6038DD8B8A000111BEF94E4E4C55330F7FE9C936FB854822AC65 +CT=02FE87211909D8954EC90EF53100F26D +PT=3A51FAFD22A2CC95B532023A37BBF0FE + +I=343 +KEY=EF890ED47D9F1581CC98C88F3BF7F88D741FB6A811ADB37C7C04F9BF7F995C9B +CT=3A51FAFD22A2CC95B532023A37BBF0FE +PT=D233A6BBC315BA5F4630AE7F99F77116 + +I=344 +KEY=AA9CA1A7DFA24E1936E49D34054F7749A62C1013D2B809233A3457C0E66E2D8D +CT=D233A6BBC315BA5F4630AE7F99F77116 +PT=E6B9619D7B0E1DF6CFE79FD51533406B + +I=345 +KEY=ADC4161B346687F98D4CB5B661662A8A4095718EA9B614D5F5D3C815F35D6DE6 +CT=E6B9619D7B0E1DF6CFE79FD51533406B +PT=A746D31BCB29F7512E3F6E5EFD14FDAD + +I=346 +KEY=9C1CA3776C9ED13D220453C8AEFA0ECDE7D3A295629FE384DBECA64B0E49904B +CT=A746D31BCB29F7512E3F6E5EFD14FDAD +PT=B2489A51878848EC37E6782FB2110122 + +I=347 +KEY=B64A5B45ABFDEC3EF8164FCEAE89919E559B38C4E517AB68EC0ADE64BC589169 +CT=B2489A51878848EC37E6782FB2110122 +PT=EF77F9367A063FDB874C9FC96983EAD1 + +I=348 +KEY=AEFFDEE2501961FEEB985134E2B651EDBAECC1F29F1194B36B4641ADD5DB7BB8 +CT=EF77F9367A063FDB874C9FC96983EAD1 +PT=4ECFF4DA51BB2BE1EF8E85C4BBE51C69 + +I=349 +KEY=6B28BA96CEB25B3862F413A2CBED4889F4233528CEAABF5284C8C4696E3E67D1 +CT=4ECFF4DA51BB2BE1EF8E85C4BBE51C69 +PT=0CAEAF484505A1AF13BB0ADCC665F91C + +I=350 +KEY=2062889724A47DD541F1F0A3FC8C5952F88D9A608BAF1EFD9773CEB5A85B9ECD +CT=0CAEAF484505A1AF13BB0ADCC665F91C +PT=6C75CA469CACCCE29CAE88202E02727C + +I=351 +KEY=C2115A8A6EE164B944A8C8128EBAB8E694F850261703D21F0BDD46958659ECB1 +CT=6C75CA469CACCCE29CAE88202E02727C +PT=567060CEFF3AEDDE8AB5823450E35967 + +I=352 +KEY=C3D2704E15936C6916073E234D0012CCC28830E8E8393FC18168C4A1D6BAB5D6 +CT=567060CEFF3AEDDE8AB5823450E35967 +PT=E04F927E409060080EC530D5C344CA24 + +I=353 +KEY=49173A9FB3283181B71264E3FB5591FA22C7A296A8A95FC98FADF47415FE7FF2 +CT=E04F927E409060080EC530D5C344CA24 +PT=4D473408396C17D4BA3DBB63B46E7727 + +I=354 +KEY=8BF3DDDC9217496E29F46E61233D62B66F80969E91C5481D35904F17A19008D5 +CT=4D473408396C17D4BA3DBB63B46E7727 +PT=BB6779933AC9E435C637CDA146A04284 + +I=355 +KEY=6ACA3C31248BFBB5BB9FD54C4B31BC21D4E7EF0DAB0CAC28F3A782B6E7304A51 +CT=BB6779933AC9E435C637CDA146A04284 +PT=5C2129A55114540ED68591C60E45D6CF + +I=356 +KEY=1A270DAD402DC752332671216A6C3BFF88C6C6A8FA18F82625221370E9759C9E +CT=5C2129A55114540ED68591C60E45D6CF +PT=57790B87F69BF1C007E563A82987EEAE + +I=357 +KEY=6E39E75268AC2C51ABE11CE3CE16CAF3DFBFCD2F0C8309E622C770D8C0F27230 +CT=57790B87F69BF1C007E563A82987EEAE +PT=58790B192C8B90B76F34990E28A6689A + +I=358 +KEY=2367A67114D722A79F9434B5A418BEEB87C6C636200899514DF3E9D6E8541AAA +CT=58790B192C8B90B76F34990E28A6689A +PT=599CA8B58EFE301A87CE72540CCB4067 + +I=359 +KEY=A4CE195518F7E36D7E0D5C9666802411DE5A6E83AEF6A94BCA3D9B82E49F5ACD +CT=599CA8B58EFE301A87CE72540CCB4067 +PT=4483131C7E03089F898166A5B3E85E3A + +I=360 +KEY=73C5204211D3648DAAF5FE071186C0E99AD97D9FD0F5A1D443BCFD27577704F7 +CT=4483131C7E03089F898166A5B3E85E3A +PT=DBF64C5A0897B343BAF7047A6C564D02 + +I=361 +KEY=1A3831AFF223BB2FE79C8EF8845E553C412F31C5D8621297F94BF95D3B2149F5 +CT=DBF64C5A0897B343BAF7047A6C564D02 +PT=B24420DA45E3620B619978CB09F1860C + +I=362 +KEY=31EF243EF87C32148751F8F299151042F36B111F9D81709C98D2819632D0CFF9 +CT=B24420DA45E3620B619978CB09F1860C +PT=12B466EF6AE6F28AF78AC184DB8B3C83 + +I=363 +KEY=9E935E6F5D76BEE2E639F2880C8352EEE1DF77F0F76782166F584012E95BF37A +CT=12B466EF6AE6F28AF78AC184DB8B3C83 +PT=518E89A35CF55D591DE8BB924D8F96E7 + +I=364 +KEY=C6398957838B02B5948A95DCBFBF2813B051FE53AB92DF4F72B0FB80A4D4659D +CT=518E89A35CF55D591DE8BB924D8F96E7 +PT=1FDF7FE52BD46EF54F1F7A6242B04BD8 + +I=365 +KEY=5764E84D9000518C185717581E0D70E5AF8E81B68046B1BA3DAF81E2E6642E45 +CT=1FDF7FE52BD46EF54F1F7A6242B04BD8 +PT=2C68E67C37B50056E80DC09B9ED84AA8 + +I=366 +KEY=5F8CB51BF30B954B4AC09620B0A20FCA83E667CAB7F3B1ECD5A2417978BC64ED +CT=2C68E67C37B50056E80DC09B9ED84AA8 +PT=14CC2D821B03BE21355A779B9066BE41 + +I=367 +KEY=50B32E6D62EE3B8CE2DD5797BA70D8D2972A4A48ACF00FCDE0F836E2E8DADAAC +CT=14CC2D821B03BE21355A779B9066BE41 +PT=BB09D339888C27294E73326E64AC3B21 + +I=368 +KEY=E1B2199CAF1C3FA78E973ACF5C3AC8702C239971247C28E4AE8B048C8C76E18D +CT=BB09D339888C27294E73326E64AC3B21 +PT=BCFBD8255802CC8233AEA86E49089328 + +I=369 +KEY=3403D2498A4562E73734D065E9B44AD890D841547C7EE4669D25ACE2C57E72A5 +CT=BCFBD8255802CC8233AEA86E49089328 +PT=5A919AC72F12DB1FAB8E4876FBA8842B + +I=370 +KEY=B979FA15F93E5ACA1F6E452C9053751BCA49DB93536C3F7936ABE4943ED6F68E +CT=5A919AC72F12DB1FAB8E4876FBA8842B +PT=BDB03BD29FD3828AF1AE8C729F37F88A + +I=371 +KEY=A8CDF9FE3C0227A9107C700C404AE39777F9E041CCBFBDF3C70568E6A1E10E04 +CT=BDB03BD29FD3828AF1AE8C729F37F88A +PT=0AAC43CE316476F3A532D44B4DFBF4B8 + +I=372 +KEY=B4D497FBD5DE2CA68FF60C701E208A257D55A38FFDDBCB006237BCADEC1AFABC +CT=0AAC43CE316476F3A532D44B4DFBF4B8 +PT=853A5EE7CB3C4BB3F0120BB2CFFB4436 + +I=373 +KEY=A019DCC09A4CAAA3772BF4C54C8828E9F86FFD6836E780B39225B71F23E1BE8A +CT=853A5EE7CB3C4BB3F0120BB2CFFB4436 +PT=B525599C918446AF4EA9F6965F3971EA + +I=374 +KEY=238BF8B851B0864F9BEC8E242B7795D14D4AA4F4A763C61CDC8C41897CD8CF60 +CT=B525599C918446AF4EA9F6965F3971EA +PT=A8377EC293D41F74A0A2DB66BA7D3D2F + +I=375 +KEY=AF9E313988F294AE6A8155BC76F2514BE57DDA3634B7D9687C2E9AEFC6A5F24F +CT=A8377EC293D41F74A0A2DB66BA7D3D2F +PT=301BD4D318101A02166EBC23DED9C12D + +I=376 +KEY=3B6186F7ACE8E9B022DDE0ECF5D808D3D5660EE52CA7C36A6A4026CC187C3362 +CT=301BD4D318101A02166EBC23DED9C12D +PT=05BD0686BE53B94FB1B42AE407BE081C + +I=377 +KEY=EADED20A0F405D9E3AAE404FB074162ED0DB086392F47A25DBF40C281FC23B7E +CT=05BD0686BE53B94FB1B42AE407BE081C +PT=7A3AF681F2043806EDB761F65D9A6C3A + +I=378 +KEY=AA6F474F5F5FF513FC992E4232061B75AAE1FEE260F0422336436DDE42585744 +CT=7A3AF681F2043806EDB761F65D9A6C3A +PT=3C297DE35CCF4E6E0A800B9A3EE37C95 + +I=379 +KEY=68BFE30863F135A09B81BE2800CBBC3796C883013C3F0C4D3CC366447CBB2BD1 +CT=3C297DE35CCF4E6E0A800B9A3EE37C95 +PT=5F8AAC15C74CC7EA87A1AC185103A9D7 + +I=380 +KEY=9093DEBE66D714180BEB8FE51C4807ADC9422F14FB73CBA7BB62CA5C2DB88206 +CT=5F8AAC15C74CC7EA87A1AC185103A9D7 +PT=083AF3AF30961FD5A077F5564D55E9E9 + +I=381 +KEY=A1E1049159A94DF638092C90F7707CD7C178DCBBCBE5D4721B153F0A60ED6BEF +CT=083AF3AF30961FD5A077F5564D55E9E9 +PT=89BEFF6AB40B18ECD9413446E848253A + +I=382 +KEY=7C506732A8863DB1BF61EFC710F22D2348C623D17FEECC9EC2540B4C88A54ED5 +CT=89BEFF6AB40B18ECD9413446E848253A +PT=095B2C04636C9C5BF9735BCA21211EAA + +I=383 +KEY=7283413612863BA1E1B5AE93DF1318F5419D0FD51C8250C53B275086A984507F +CT=095B2C04636C9C5BF9735BCA21211EAA +PT=E95DB3DB1E3A478C8A31212B28E0E7BC + +I=384 +KEY=BE861CED86D725162D938727D7AEFC1BA8C0BC0E02B81749B11671AD8164B7C3 +CT=E95DB3DB1E3A478C8A31212B28E0E7BC +PT=9927F1D7EF0631500E1DF058932BF320 + +I=385 +KEY=45AA89CBCE192CEEC22BF5F33DDE0E8D31E74DD9EDBE2619BF0B81F5124F44E3 +CT=9927F1D7EF0631500E1DF058932BF320 +PT=4B1147179F2AF27E5C9DBB7F01CC56A8 + +I=386 +KEY=B08A08DABC52884E9EBB310236815BFE7AF60ACE7294D467E3963A8A1383124B +CT=4B1147179F2AF27E5C9DBB7F01CC56A8 +PT=E9752A7D47734DACAC6E74A1A3EC4956 + +I=387 +KEY=34B4424CE75A4A1BCE9E6C825F5F0DC1938320B335E799CB4FF84E2BB06F5B1D +CT=E9752A7D47734DACAC6E74A1A3EC4956 +PT=AB2D652BCEE42804C5155980DA02CECC + +I=388 +KEY=F9954BB1A793565A79AA2B9DF408A34A38AE4598FB03B1CF8AED17AB6A6D95D1 +CT=AB2D652BCEE42804C5155980DA02CECC +PT=3C6651362E89F6C6B28C04CA22F110EC + +I=389 +KEY=9548931715FB259E318020E30D68165604C814AED58A470938611361489C853D +CT=3C6651362E89F6C6B28C04CA22F110EC +PT=15598364698838475AB96F95CFCF3342 + +I=390 +KEY=1CDB0706417BBE66B559237109353221119197CABC027F4E62D87CF48753B67F +CT=15598364698838475AB96F95CFCF3342 +PT=D8B3BB941893206E1CA6654B81F403E4 + +I=391 +KEY=8C4AD897B595252B0987673F45EE73F2C9222C5EA4915F207E7E19BF06A7B59B +CT=D8B3BB941893206E1CA6654B81F403E4 +PT=ECE471CC2FF45C26C7143C41702F90D2 + +I=392 +KEY=A6D3DF3279B7405256C0D22DA240524125C65D928B650306B96A25FE76882549 +CT=ECE471CC2FF45C26C7143C41702F90D2 +PT=AB387AE5A5FC892C311D97C22467940D + +I=393 +KEY=36F250F7C3906C7E0020055422CDB8B28EFE27772E998A2A8877B23C52EFB144 +CT=AB387AE5A5FC892C311D97C22467940D +PT=FF48C2C77D5F52DF27C4060DF7F895D7 + +I=394 +KEY=4FF045275860B943EDE02C802F34B71B71B6E5B053C6D8F5AFB3B431A5172493 +CT=FF48C2C77D5F52DF27C4060DF7F895D7 +PT=221BC444E2A6A7F8DE9DA16AB01EB2AC + +I=395 +KEY=E15B4E0E242FBABF1D47E9DBE6D0660253AD21F4B1607F0D712E155B1509963F +CT=221BC444E2A6A7F8DE9DA16AB01EB2AC +PT=DE252D19973ABD9F182049D39455784B + +I=396 +KEY=401023A611A3133C895A3684AB3E7C9D8D880CED265AC292690E5C88815CEE74 +CT=DE252D19973ABD9F182049D39455784B +PT=843163BD101982EE948039915C8F60D8 + +I=397 +KEY=B9DDF52C271F143E523532E45E6F368D09B96F503643407CFD8E6519DDD38EAC +CT=843163BD101982EE948039915C8F60D8 +PT=6FD9D36B751854C3417F29E8F3B654D9 + +I=398 +KEY=AC7F45F8630CE02525F9F4941B4E13206660BC3B435B14BFBCF14CF12E65DA75 +CT=6FD9D36B751854C3417F29E8F3B654D9 +PT=E1268BA8A1473DEDE6CA64DDF2C8B805 + +I=399 +KEY=DE11FF0A429E1CD3DE016DAC294F771187463793E21C29525A3B282CDCAD6270 +CT=E1268BA8A1473DEDE6CA64DDF2C8B805 +PT=4DE0C6DF7CB1697284604D60271BC59A + =========== \ No newline at end of file --- krb5-1.4.4.orig/src/lib/crypto/aes/test/ecb_tbl.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/ecb_tbl.txt @@ -1,1955 +1,1955 @@ -/* Description of what tables are tested: - The provided implementations each use a different set of tables - - Java implementation: uses no tables - - reference C implementation: uses Logtable, Alogtable, S, Si, rcon - - fast C implementation: uses Logtable, Alogtable, rcon - and additionally, T1, T2, T3, T4, T5, T6, T7, T8 - and (for the inverse key schedule only) U1, U2, U3, U4. - All these tables are tested. - -========================= - -FILENAME: "ecb_tbl.txt" - -Electronic Codebook (ECB) Mode -Tables Known Answer Tests - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========== - -KEYSIZE=128 - - -I=1 -KEY=00010203050607080A0B0C0D0F101112 -PT=506812A45F08C889B97F5980038B8359 -CT=D8F532538289EF7D06B506A4FD5BE9C9 - -I=2 -KEY=14151617191A1B1C1E1F202123242526 -PT=5C6D71CA30DE8B8B00549984D2EC7D4B -CT=59AB30F4D4EE6E4FF9907EF65B1FB68C - -I=3 -KEY=28292A2B2D2E2F30323334353738393A -PT=53F3F4C64F8616E4E7C56199F48F21F6 -CT=BF1ED2FCB2AF3FD41443B56D85025CB1 - -I=4 -KEY=3C3D3E3F41424344464748494B4C4D4E -PT=A1EB65A3487165FB0F1C27FF9959F703 -CT=7316632D5C32233EDCB0780560EAE8B2 - -I=5 -KEY=50515253555657585A5B5C5D5F606162 -PT=3553ECF0B1739558B08E350A98A39BFA -CT=408C073E3E2538072B72625E68B8364B - -I=6 -KEY=64656667696A6B6C6E6F707173747576 -PT=67429969490B9711AE2B01DC497AFDE8 -CT=E1F94DFA776597BEACA262F2F6366FEA - -I=7 -KEY=78797A7B7D7E7F80828384858788898A -PT=93385C1F2AEC8BED192F5A8E161DD508 -CT=F29E986C6A1C27D7B29FFD7EE92B75F1 - -I=8 -KEY=8C8D8E8F91929394969798999B9C9D9E -PT=B5BF946BE19BEB8DB3983B5F4C6E8DDB -CT=131C886A57F8C2E713ABA6955E2B55B5 - -I=9 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 -PT=41321EE10E21BD907227C4450FF42324 -CT=D2AB7662DF9B8C740210E5EEB61C199D - -I=10 -KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 -PT=00A82F59C91C8486D12C0A80124F6089 -CT=14C10554B2859C484CAB5869BBE7C470 - -I=11 -KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA -PT=7CE0FD076754691B4BBD9FAF8A1372FE -CT=DB4D498F0A49CF55445D502C1F9AB3B5 - -I=12 -KEY=DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=23605A8243D07764541BC5AD355B3129 -CT=6D96FEF7D66590A77A77BB2056667F7F - -I=13 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE010002 -PT=12A8CFA23EA764FD876232B4E842BC44 -CT=316FB68EDBA736C53E78477BF913725C - -I=14 -KEY=04050607090A0B0C0E0F101113141516 -PT=BCAF32415E8308B3723E5FDD853CCC80 -CT=6936F2B93AF8397FD3A771FC011C8C37 - -I=15 -KEY=2C2D2E2F31323334363738393B3C3D3E -PT=89AFAE685D801AD747ACE91FC49ADDE0 -CT=F3F92F7A9C59179C1FCC2C2BA0B082CD - -I=16 -KEY=40414243454647484A4B4C4D4F505152 -PT=F521D07B484357C4A69E76124A634216 -CT=6A95EA659EE3889158E7A9152FF04EBC - -I=17 -KEY=54555657595A5B5C5E5F606163646566 -PT=3E23B3BC065BCC152407E23896D77783 -CT=1959338344E945670678A5D432C90B93 - -I=18 -KEY=68696A6B6D6E6F70727374757778797A -PT=79F0FBA002BE1744670E7E99290D8F52 -CT=E49BDDD2369B83EE66E6C75A1161B394 - -I=19 -KEY=7C7D7E7F81828384868788898B8C8D8E -PT=DA23FE9D5BD63E1D72E3DAFBE21A6C2A -CT=D3388F19057FF704B70784164A74867D - -I=20 -KEY=A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -PT=E3F5698BA90B6A022EFD7DB2C7E6C823 -CT=23AA03E2D5E4CD24F3217E596480D1E1 - -I=21 -KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 -PT=BDC2691D4F1B73D2700679C3BCBF9C6E -CT=C84113D68B666AB2A50A8BDB222E91B9 - -I=22 -KEY=08090A0B0D0E0F10121314151718191A -PT=BA74E02093217EE1BA1B42BD5624349A -CT=AC02403981CD4340B507963DB65CB7B6 - -I=23 -KEY=6C6D6E6F71727374767778797B7C7D7E -PT=B5C593B5851C57FBF8B3F57715E8F680 -CT=8D1299236223359474011F6BF5088414 - -I=24 -KEY=80818283858687888A8B8C8D8F909192 -PT=3DA9BD9CEC072381788F9387C3BBF4EE -CT=5A1D6AB8605505F7977E55B9A54D9B90 - -I=25 -KEY=94959697999A9B9C9E9FA0A1A3A4A5A6 -PT=4197F3051121702AB65D316B3C637374 -CT=72E9C2D519CF555E4208805AABE3B258 - -I=26 -KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA -PT=9F46C62EC4F6EE3F6E8C62554BC48AB7 -CT=A8F3E81C4A23A39EF4D745DFFE026E80 - -I=27 -KEY=BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE -PT=0220673FE9E699A4EBC8E0DBEB6979C8 -CT=546F646449D31458F9EB4EF5483AEE6C - -I=28 -KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 -PT=B2B99171337DED9BC8C2C23FF6F18867 -CT=4DBE4BC84AC797C0EE4EFB7F1A07401C - -I=29 -KEY=E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -PT=A7FACF4E301E984E5EFEEFD645B23505 -CT=25E10BFB411BBD4D625AC8795C8CA3B3 - -I=30 -KEY=F8F9FAFBFDFEFE00020304050708090A -PT=F7C762E4A9819160FD7ACFB6C4EEDCDD -CT=315637405054EC803614E43DEF177579 - -I=31 -KEY=0C0D0E0F11121314161718191B1C1D1E -PT=9B64FC21EA08709F4915436FAA70F1BE -CT=60C5BC8A1410247295C6386C59E572A8 - -I=32 -KEY=20212223252627282A2B2C2D2F303132 -PT=52AF2C3DE07EE6777F55A4ABFC100B3F -CT=01366FC8CA52DFE055D6A00A76471BA6 - -I=33 -KEY=34353637393A3B3C3E3F404143444546 -PT=2FCA001224386C57AA3F968CBE2C816F -CT=ECC46595516EC612449C3F581E7D42FF - -I=34 -KEY=48494A4B4D4E4F50525354555758595A -PT=4149C73658A4A9C564342755EE2C132F -CT=6B7FFE4C602A154B06EE9C7DAB5331C9 - -I=35 -KEY=5C5D5E5F61626364666768696B6C6D6E -PT=AF60005A00A1772F7C07A48A923C23D2 -CT=7DA234C14039A240DD02DD0FBF84EB67 - -I=36 -KEY=70717273757677787A7B7C7D7F808182 -PT=6FCCBC28363759914B6F0280AFAF20C6 -CT=C7DC217D9E3604FFE7E91F080ECD5A3A - -I=37 -KEY=84858687898A8B8C8E8F909193949596 -PT=7D82A43DDF4FEFA2FC5947499884D386 -CT=37785901863F5C81260EA41E7580CDA5 - -I=38 -KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AA -PT=5D5A990EAAB9093AFE4CE254DFA49EF9 -CT=A07B9338E92ED105E6AD720FCCCE9FE4 - -I=39 -KEY=ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -PT=4CD1E2FD3F4434B553AAE453F0ED1A02 -CT=AE0FB9722418CC21A7DA816BBC61322C - -I=40 -KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 -PT=5A2C9A9641D4299125FA1B9363104B5E -CT=C826A193080FF91FFB21F71D3373C877 - -I=41 -KEY=D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -PT=B517FE34C0FA217D341740BFD4FE8DD4 -CT=1181B11B0E494E8D8B0AA6B1D5AC2C48 - -I=42 -KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA -PT=014BAF2278A69D331D5180103643E99A -CT=6743C3D1519AB4F2CD9A78AB09A511BD - -I=43 -KEY=FCFDFEFF01020304060708090B0C0D0E -PT=B529BD8164F20D0AA443D4932116841C -CT=DC55C076D52BACDF2EEFD952946A439D - -I=44 -KEY=10111213151617181A1B1C1D1F202122 -PT=2E596DCBB2F33D4216A1176D5BD1E456 -CT=711B17B590FFC72B5C8E342B601E8003 - -I=45 -KEY=24252627292A2B2C2E2F303133343536 -PT=7274A1EA2B7EE2424E9A0E4673689143 -CT=19983BB0950783A537E1339F4AA21C75 - -I=46 -KEY=38393A3B3D3E3F40424344454748494A -PT=AE20020BD4F13E9D90140BEE3B5D26AF -CT=3BA7762E15554169C0F4FA39164C410C - -I=47 -KEY=4C4D4E4F51525354565758595B5C5D5E -PT=BAAC065DA7AC26E855E79C8849D75A02 -CT=A0564C41245AFCA7AF8AA2E0E588EA89 - -I=48 -KEY=60616263656667686A6B6C6D6F707172 -PT=7C917D8D1D45FAB9E2540E28832540CC -CT=5E36A42A2E099F54AE85ECD92E2381ED - -I=49 -KEY=74757677797A7B7C7E7F808183848586 -PT=BDE6F89E16DAADB0E847A2A614566A91 -CT=770036F878CD0F6CA2268172F106F2FE - -I=50 -KEY=88898A8B8D8E8F90929394959798999A -PT=C9DE163725F1F5BE44EBB1DB51D07FBC -CT=7E4E03908B716116443CCF7C94E7C259 - -I=51 -KEY=9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -PT=3AF57A58F0C07DFFA669572B521E2B92 -CT=482735A48C30613A242DD494C7F9185D - -I=52 -KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 -PT=3D5EBAC306DDE4604F1B4FBBBFCDAE55 -CT=B4C0F6C9D4D7079ADDF9369FC081061D - -I=53 -KEY=C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -PT=C2DFA91BCEB76A1183C995020AC0B556 -CT=D5810FE0509AC53EDCD74F89962E6270 - -I=54 -KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA -PT=C70F54305885E9A0746D01EC56C8596B -CT=03F17A16B3F91848269ECDD38EBB2165 - -I=55 -KEY=ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -PT=C4F81B610E98012CE000182050C0C2B2 -CT=DA1248C3180348BAD4A93B4D9856C9DF - -I=56 -KEY=00010203050607080A0B0C0D0F101112 -PT=EAAB86B1D02A95D7404EFF67489F97D4 -CT=3D10D7B63F3452C06CDF6CCE18BE0C2C - -I=57 -KEY=14151617191A1B1C1E1F202123242526 -PT=7C55BDB40B88870B52BEC3738DE82886 -CT=4AB823E7477DFDDC0E6789018FCB6258 - -I=58 -KEY=28292A2B2D2E2F30323334353738393A -PT=BA6EAA88371FF0A3BD875E3F2A975CE0 -CT=E6478BA56A77E70CFDAA5C843ABDE30E - -I=59 -KEY=3C3D3E3F41424344464748494B4C4D4E -PT=08059130C4C24BD30CF0575E4E0373DC -CT=1673064895FBEAF7F09C5429FF75772D - -I=60 -KEY=50515253555657585A5B5C5D5F606162 -PT=9A8EAB004EF53093DFCF96F57E7EDA82 -CT=4488033AE9F2EFD0CA9383BFCA1A94E9 - -I=61 -KEY=64656667696A6B6C6E6F707173747576 -PT=0745B589E2400C25F117B1D796C28129 -CT=978F3B8C8F9D6F46626CAC3C0BCB9217 - -I=62 -KEY=78797A7B7D7E7F80828384858788898A -PT=2F1777781216CEC3F044F134B1B92BBE -CT=E08C8A7E582E15E5527F1D9E2EECB236 - -I=63 -KEY=8C8D8E8F91929394969798999B9C9D9E -PT=353A779FFC541B3A3805D90CE17580FC -CT=CEC155B76AC5FFDA4CF4F9CA91E49A7A - -I=64 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 -PT=1A1EAE4415CEFCF08C4AC1C8F68BEA8F -CT=D5AC7165763225DD2A38CDC6862C29AD - -I=65 -KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 -PT=E6E7E4E5B0B3B2B5D4D5AAAB16111013 -CT=03680FE19F7CE7275452020BE70E8204 - -I=66 -KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA -PT=F8F9FAFBFBF8F9E677767170EFE0E1E2 -CT=461DF740C9781C388E94BB861CEB54F6 - -I=67 -KEY=DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=63626160A1A2A3A445444B4A75727370 -CT=451BD60367F96483042742219786A074 - -I=68 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE010002 -PT=717073720605040B2D2C2B2A05FAFBF9 -CT=E4DFA42671A02E57EF173B85C0EA9F2B - -I=69 -KEY=04050607090A0B0C0E0F101113141516 -PT=78797A7BEAE9E8EF3736292891969794 -CT=ED11B89E76274282227D854700A78B9E - -I=70 -KEY=18191A1B1D1E1F20222324252728292A -PT=838281803231300FDDDCDBDAA0AFAEAD -CT=433946EAA51EA47AF33895F2B90B3B75 - -I=71 -KEY=2C2D2E2F31323334363738393B3C3D3E -PT=18191A1BBFBCBDBA75747B7A7F78797A -CT=6BC6D616A5D7D0284A5910AB35022528 - -I=72 -KEY=40414243454647484A4B4C4D4F505152 -PT=848586879B989996A3A2A5A4849B9A99 -CT=D2A920ECFE919D354B5F49EAE9719C98 - -I=73 -KEY=54555657595A5B5C5E5F606163646566 -PT=0001020322212027CACBF4F551565754 -CT=3A061B17F6A92885EFBD0676985B373D - -I=74 -KEY=68696A6B6D6E6F70727374757778797A -PT=CECFCCCDAFACADB2515057564A454447 -CT=FADEEC16E33EA2F4688499D157E20D8F - -I=75 -KEY=7C7D7E7F81828384868788898B8C8D8E -PT=92939091CDCECFC813121D1C80878685 -CT=5CDEFEDE59601AA3C3CDA36FA6B1FA13 - -I=76 -KEY=90919293959697989A9B9C9D9FA0A1A2 -PT=D2D3D0D16F6C6D6259585F5ED1EEEFEC -CT=9574B00039844D92EBBA7EE8719265F8 - -I=77 -KEY=A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -PT=ACADAEAF878485820F0E1110D5D2D3D0 -CT=9A9CF33758671787E5006928188643FA - -I=78 -KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA -PT=9091929364676619E6E7E0E1757A7B78 -CT=2CDDD634C846BA66BB46CBFEA4A674F9 - -I=79 -KEY=CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE -PT=BABBB8B98A89888F74757A7B92959497 -CT=D28BAE029393C3E7E26E9FAFBBB4B98F - -I=80 -KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 -PT=8D8C8F8E6E6D6C633B3A3D3CCAD5D4D7 -CT=EC27529B1BEE0A9AB6A0D73EBC82E9B7 - -I=81 -KEY=F4F5F6F7F9FAFBFCFEFE010103040506 -PT=86878485010203040808F7F767606162 -CT=3CB25C09472AFF6EE7E2B47CCD7CCB17 - -I=82 -KEY=08090A0B0D0E0F10121314151718191A -PT=8E8F8C8D656667788A8B8C8D010E0F0C -CT=DEE33103A7283370D725E44CA38F8FE5 - -I=83 -KEY=1C1D1E1F21222324262728292B2C2D2E -PT=C8C9CACB858687807A7B7475E7E0E1E2 -CT=27F9BCD1AAC64BFFC11E7815702C1A69 - -I=84 -KEY=30313233353637383A3B3C3D3F404142 -PT=6D6C6F6E5053525D8C8D8A8BADD2D3D0 -CT=5DF534FFAD4ED0749A9988E9849D0021 - -I=85 -KEY=44454647494A4B4C4E4F505153545556 -PT=28292A2B393A3B3C0607181903040506 -CT=A48BEE75DB04FB60CA2B80F752A8421B - -I=86 -KEY=58595A5B5D5E5F60626364656768696A -PT=A5A4A7A6B0B3B28DDBDADDDCBDB2B3B0 -CT=024C8CF70BC86EE5CE03678CB7AF45F9 - -I=87 -KEY=6C6D6E6F71727374767778797B7C7D7E -PT=323330316467666130313E3F2C2B2A29 -CT=3C19AC0F8A3A3862CE577831301E166B - -I=88 -KEY=80818283858687888A8B8C8D8F909192 -PT=27262524080B0A05171611100B141516 -CT=C5E355B796A57421D59CA6BE82E73BCA - -I=89 -KEY=94959697999A9B9C9E9FA0A1A3A4A5A6 -PT=040506074142434435340B0AA3A4A5A6 -CT=D94033276417ABFB05A69D15B6E386E2 - -I=90 -KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA -PT=242526271112130C61606766BDB2B3B0 -CT=24B36559EA3A9B9B958FE6DA3E5B8D85 - -I=91 -KEY=BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE -PT=4B4A4948252627209E9F9091CEC9C8CB -CT=20FD4FEAA0E8BF0CCE7861D74EF4CB72 - -I=92 -KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 -PT=68696A6B6665646B9F9E9998D9E6E7E4 -CT=350E20D5174277B9EC314C501570A11D - -I=93 -KEY=E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -PT=34353637C5C6C7C0F0F1EEEF7C7B7A79 -CT=87A29D61B7C604D238FE73045A7EFD57 - -I=94 -KEY=F8F9FAFBFDFEFE00020304050708090A -PT=32333031C2C1C13F0D0C0B0A050A0B08 -CT=2C3164C1CC7D0064816BDC0FAA362C52 - -I=95 -KEY=0C0D0E0F11121314161718191B1C1D1E -PT=CDCCCFCEBEBDBCBBABAAA5A4181F1E1D -CT=195FE5E8A05A2ED594F6E4400EEE10B3 - -I=96 -KEY=20212223252627282A2B2C2D2F303132 -PT=212023223635343BA0A1A6A7445B5A59 -CT=E4663DF19B9A21A5A284C2BD7F905025 - -I=97 -KEY=34353637393A3B3C3E3F404143444546 -PT=0E0F0C0DA8ABAAAD2F2E515002050407 -CT=21B88714CFB4E2A933BD281A2C4743FD - -I=98 -KEY=48494A4B4D4E4F50525354555758595A -PT=070605042A2928378E8F8889BDB2B3B0 -CT=CBFC3980D704FD0FC54378AB84E17870 - -I=99 -KEY=5C5D5E5F61626364666768696B6C6D6E -PT=CBCAC9C893909196A9A8A7A6A5A2A3A0 -CT=BC5144BAA48BDEB8B63E22E03DA418EF - -I=100 -KEY=70717273757677787A7B7C7D7F808182 -PT=80818283C1C2C3CC9C9D9A9B0CF3F2F1 -CT=5A1DBAEF1EE2984B8395DA3BDFFA3CCC - -I=101 -KEY=84858687898A8B8C8E8F909193949596 -PT=1213101125262720FAFBE4E5B1B6B7B4 -CT=F0B11CD0729DFCC80CEC903D97159574 - -I=102 -KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AA -PT=7F7E7D7C3033320D97969190222D2C2F -CT=9F95314ACFDDC6D1914B7F19A9CC8209 - -I=103 -KEY=ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -PT=4E4F4C4D484B4A4D81808F8E53545556 -CT=595736F6F0F70914A94E9E007F022519 - -I=104 -KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 -PT=DCDDDEDFB0B3B2BD15141312A1BEBFBC -CT=1F19F57892CAE586FCDFB4C694DEB183 - -I=105 -KEY=D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -PT=93929190282B2A2DC4C5FAFB92959497 -CT=540700EE1F6F3DAB0B3EDDF6CAEE1EF5 - -I=106 -KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA -PT=F5F4F7F6C4C7C6D9373631307E717073 -CT=14A342A91019A331687A2254E6626CA2 - -I=107 -KEY=FCFDFEFF01020304060708090B0C0D0E -PT=93929190B6B5B4B364656A6B05020300 -CT=7B25F3C3B2EEA18D743EF283140F29FF - -I=108 -KEY=10111213151617181A1B1C1D1F202122 -PT=BABBB8B90D0E0F00A4A5A2A3043B3A39 -CT=46C2587D66E5E6FA7F7CA6411AD28047 - -I=109 -KEY=24252627292A2B2C2E2F303133343536 -PT=D8D9DADB7F7C7D7A10110E0F787F7E7D -CT=09470E72229D954ED5EE73886DFEEBA9 - -I=110 -KEY=38393A3B3D3E3F40424344454748494A -PT=FEFFFCFDEFECED923B3A3D3C6768696A -CT=D77C03DE92D4D0D79EF8D4824EF365EB - -I=111 -KEY=4C4D4E4F51525354565758595B5C5D5E -PT=D6D7D4D58A89888F96979899A5A2A3A0 -CT=1D190219F290E0F1715D152D41A23593 - -I=112 -KEY=60616263656667686A6B6C6D6F707172 -PT=18191A1BA8ABAAA5303136379B848586 -CT=A2CD332CE3A0818769616292E87F757B - -I=113 -KEY=74757677797A7B7C7E7F808183848586 -PT=6B6A6968A4A7A6A1D6D72829B0B7B6B5 -CT=D54AFA6CE60FBF9341A3690E21385102 - -I=114 -KEY=88898A8B8D8E8F90929394959798999A -PT=000102038A89889755545352A6A9A8AB -CT=06E5C364DED628A3F5E05E613E356F46 - -I=115 -KEY=9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -PT=2D2C2F2EB3B0B1B6B6B7B8B9F2F5F4F7 -CT=EAE63C0E62556DAC85D221099896355A - -I=116 -KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 -PT=979695943536373856575051E09F9E9D -CT=1FED060E2C6FC93EE764403A889985A2 - -I=117 -KEY=C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -PT=A4A5A6A7989B9A9DB1B0AFAE7A7D7C7F -CT=C25235C1A30FDEC1C7CB5C5737B2A588 - -I=118 -KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA -PT=C1C0C3C2686B6A55A8A9AEAFEAE5E4E7 -CT=796DBEF95147D4D30873AD8B7B92EFC0 - -I=119 -KEY=ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -PT=C1C0C3C2141716118C8D828364636261 -CT=CBCF0FB34D98D0BD5C22CE37211A46BF - -I=120 -KEY=00010203050607080A0B0C0D0F101112 -PT=93929190CCCFCEC196979091E0FFFEFD -CT=94B44DA6466126CAFA7C7FD09063FC24 - -I=121 -KEY=14151617191A1B1C1E1F202123242526 -PT=B4B5B6B7F9FAFBFC25241B1A6E69686B -CT=D78C5B5EBF9B4DBDA6AE506C5074C8FE - -I=122 -KEY=28292A2B2D2E2F30323334353738393A -PT=868784850704051AC7C6C1C08788898A -CT=6C27444C27204B043812CF8CF95F9769 - -I=123 -KEY=3C3D3E3F41424344464748494B4C4D4E -PT=F4F5F6F7AAA9A8AFFDFCF3F277707172 -CT=BE94524EE5A2AA50BBA8B75F4C0AEBCF - -I=124 -KEY=50515253555657585A5B5C5D5F606162 -PT=D3D2D1D00605040BC3C2C5C43E010003 -CT=A0AEAAE91BA9F31F51AEB3588CF3A39E - -I=125 -KEY=64656667696A6B6C6E6F707173747576 -PT=73727170424140476A6B74750D0A0B08 -CT=275297779C28266EF9FE4C6A13C08488 - -I=126 -KEY=78797A7B7D7E7F80828384858788898A -PT=C2C3C0C10A0908F754555253A1AEAFAC -CT=86523D92BB8672CB01CF4A77FD725882 - -I=127 -KEY=8C8D8E8F91929394969798999B9C9D9E -PT=6D6C6F6EF8FBFAFD82838C8DF8FFFEFD -CT=4B8327640E9F33322A04DD96FCBF9A36 - -I=128 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 -PT=F5F4F7F684878689A6A7A0A1D2CDCCCF -CT=CE52AF650D088CA559425223F4D32694 - -========== - -KEYSIZE=192 - - -I=1 -KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C -PT=2D33EEF2C0430A8A9EBF45E809C40BB6 -CT=DFF4945E0336DF4C1C56BC700EFF837F - -I=2 -KEY=1E1F20212324252628292A2B2D2E2F30323334353738393A -PT=6AA375D1FA155A61FB72353E0A5A8756 -CT=B6FDDEF4752765E347D5D2DC196D1252 - -I=3 -KEY=3C3D3E3F41424344464748494B4C4D4E5051525355565758 -PT=BC3736518B9490DCB8ED60EB26758ED4 -CT=D23684E3D963B3AFCF1A114ACA90CBD6 - -I=4 -KEY=5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -PT=AA214402B46CFFB9F761EC11263A311E -CT=3A7AC027753E2A18C2CEAB9E17C11FD0 - -I=5 -KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 -PT=02AEA86E572EEAB66B2C3AF5E9A46FD6 -CT=8F6786BD007528BA26603C1601CDD0D8 - -I=6 -KEY=969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 -PT=E2AEF6ACC33B965C4FA1F91C75FF6F36 -CT=D17D073B01E71502E28B47AB551168B3 - -I=7 -KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 -PT=0659DF46427162B9434865DD9499F91D -CT=A469DA517119FAB95876F41D06D40FFA - -I=8 -KEY=D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=49A44239C748FEB456F59C276A5658DF -CT=6091AA3B695C11F5C0B6AD26D3D862FF - -I=9 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C -PT=66208F6E9D04525BDEDB2733B6A6BE37 -CT=70F9E67F9F8DF1294131662DC6E69364 - -I=10 -KEY=0E0F10111314151618191A1B1D1E1F20222324252728292A -PT=3393F8DFC729C97F5480B950BC9666B0 -CT=D154DCAFAD8B207FA5CBC95E9996B559 - -I=11 -KEY=2C2D2E2F31323334363738393B3C3D3E4041424345464748 -PT=606834C8CE063F3234CF1145325DBD71 -CT=4934D541E8B46FA339C805A7AEB9E5DA - -I=12 -KEY=4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 -PT=FEC1C04F529BBD17D8CECFCC4718B17F -CT=62564C738F3EFE186E1A127A0C4D3C61 - -I=13 -KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 -PT=32DF99B431ED5DC5ACF8CAF6DC6CE475 -CT=07805AA043986EB23693E23BEF8F3438 - -I=14 -KEY=868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 -PT=7FDC2B746F3F665296943B83710D1F82 -CT=DF0B4931038BADE848DEE3B4B85AA44B - -I=15 -KEY=A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 -PT=8FBA1510A3C5B87E2EAA3F7A91455CA2 -CT=592D5FDED76582E4143C65099309477C - -I=16 -KEY=C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE -PT=2C9B468B1C2EED92578D41B0716B223B -CT=C9B8D6545580D3DFBCDD09B954ED4E92 - -I=17 -KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC -PT=0A2BBF0EFC6BC0034F8A03433FCA1B1A -CT=5DCCD5D6EB7C1B42ACB008201DF707A0 - -I=18 -KEY=FEFE01010304050608090A0B0D0E0F10121314151718191A -PT=25260E1F31F4104D387222E70632504B -CT=A2A91682FFEB6ED1D34340946829E6F9 - -I=19 -KEY=1C1D1E1F21222324262728292B2C2D2E3031323335363738 -PT=C527D25A49F08A5228D338642AE65137 -CT=E45D185B797000348D9267960A68435D - -I=20 -KEY=3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 -PT=3B49FC081432F5890D0E3D87E884A69E -CT=45E060DAE5901CDA8089E10D4F4C246B - -I=21 -KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 -PT=D173F9ED1E57597E166931DF2754A083 -CT=F6951AFACC0079A369C71FDCFF45DF50 - -I=22 -KEY=767778797B7C7D7E80818283858687888A8B8C8D8F909192 -PT=8C2B7CAFA5AFE7F13562DAEAE1ADEDE0 -CT=9E95E00F351D5B3AC3D0E22E626DDAD6 - -I=23 -KEY=94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 -PT=AAF4EC8C1A815AEB826CAB741339532C -CT=9CB566FF26D92DAD083B51FDC18C173C - -I=24 -KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC -PT=40BE8C5D9108E663F38F1A2395279ECF -CT=C9C82766176A9B228EB9A974A010B4FB - -I=25 -KEY=2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 -PT=0C8AD9BC32D43E04716753AA4CFBE351 -CT=D8E26AA02945881D5137F1C1E1386E88 - -I=26 -KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 -PT=1407B1D5F87D63357C8DC7EBBAEBBFEE -CT=C0E024CCD68FF5FFA4D139C355A77C55 - -I=27 -KEY=84858687898A8B8C8E8F90919394959698999A9B9D9E9FA0 -PT=E62734D1AE3378C4549E939E6F123416 -CT=0B18B3D16F491619DA338640DF391D43 - -I=28 -KEY=A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -PT=5A752CFF2A176DB1A1DE77F2D2CDEE41 -CT=DBE09AC8F66027BF20CB6E434F252EFC - -I=29 -KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDC -PT=A9C8C3A4EABEDC80C64730DDD018CD88 -CT=6D04E5E43C5B9CBE05FEB9606B6480FE - -I=30 -KEY=1A1B1C1D1F20212224252627292A2B2C2E2F303133343536 -PT=EE9B3DBBDB86180072130834D305999A -CT=DD1D6553B96BE526D9FEE0FBD7176866 - -I=31 -KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354 -PT=A7FA8C3586B8EBDE7568EAD6F634A879 -CT=0260CA7E3F979FD015B0DD4690E16D2A - -I=32 -KEY=929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -PT=37E0F4A87F127D45AC936FE7AD88C10A -CT=9893734DE10EDCC8A67C3B110B8B8CC6 - -I=33 -KEY=464748494B4C4D4E50515253555657585A5B5C5D5F606162 -PT=3F77D8B5D92BAC148E4E46F697A535C5 -CT=93B30B750516B2D18808D710C2EE84EF - -I=34 -KEY=828384858788898A8C8D8E8F91929394969798999B9C9D9E -PT=D25EBB686C40F7E2C4DA1014936571CA -CT=16F65FA47BE3CB5E6DFE7C6C37016C0E - -I=35 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBC -PT=4F1C769D1E5B0552C7ECA84DEA26A549 -CT=F3847210D5391E2360608E5ACB560581 - -I=36 -KEY=BEBFC0C1C3C4C5C6C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA -PT=8548E2F882D7584D0FAFC54372B6633A -CT=8754462CD223366D0753913E6AF2643D - -I=37 -KEY=DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8 -PT=87D7A336CB476F177CD2A51AF2A62CDF -CT=1EA20617468D1B806A1FD58145462017 - -I=38 -KEY=FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 -PT=03B1FEAC668C4E485C1065DFC22B44EE -CT=3B155D927355D737C6BE9DDA60136E2E - -I=39 -KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334 -PT=BDA15E66819FA72D653A6866AA287962 -CT=26144F7B66DAA91B6333DBD3850502B3 - -I=40 -KEY=363738393B3C3D3E40414243454647484A4B4C4D4F505152 -PT=4D0C7A0D2505B80BF8B62CEB12467F0A -CT=E4F9A4AB52CED8134C649BF319EBCC90 - -I=41 -KEY=54555657595A5B5C5E5F60616364656668696A6B6D6E6F70 -PT=626D34C9429B37211330986466B94E5F -CT=B9DDD29AC6128A6CAB121E34A4C62B36 - -I=42 -KEY=727374757778797A7C7D7E7F81828384868788898B8C8D8E -PT=333C3E6BF00656B088A17E5FF0E7F60A -CT=6FCDDAD898F2CE4EFF51294F5EAAF5C9 - -I=43 -KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABAC -PT=687ED0CDC0D2A2BC8C466D05EF9D2891 -CT=C9A6FE2BF4028080BEA6F7FC417BD7E3 - -I=44 -KEY=AEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA -PT=487830E78CC56C1693E64B2A6660C7B6 -CT=6A2026846D8609D60F298A9C0673127F - -I=45 -KEY=CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8 -PT=7A48D6B7B52B29392AA2072A32B66160 -CT=2CB25C005E26EFEA44336C4C97A4240B - -I=46 -KEY=EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 -PT=907320E64C8C5314D10F8D7A11C8618D -CT=496967AB8680DDD73D09A0E4C7DCC8AA - -I=47 -KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324 -PT=B561F2CA2D6E65A4A98341F3ED9FF533 -CT=D5AF94DE93487D1F3A8C577CB84A66A4 - -I=48 -KEY=262728292B2C2D2E30313233353637383A3B3C3D3F404142 -PT=DF769380D212792D026F049E2E3E48EF -CT=84BDAC569CAE2828705F267CC8376E90 - -I=49 -KEY=44454647494A4B4C4E4F50515354555658595A5B5D5E5F60 -PT=79F374BC445BDABF8FCCB8843D6054C6 -CT=F7401DDA5AD5AB712B7EB5D10C6F99B6 - -I=50 -KEY=626364656768696A6C6D6E6F71727374767778797B7C7D7E -PT=4E02F1242FA56B05C68DBAE8FE44C9D6 -CT=1C9D54318539EBD4C3B5B7E37BF119F0 - -I=51 -KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C -PT=CF73C93CBFF57AC635A6F4AD2A4A1545 -CT=ACA572D65FB2764CFFD4A6ECA090EA0D - -I=52 -KEY=9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA -PT=9923548E2875750725B886566784C625 -CT=36D9C627B8C2A886A10CCB36EAE3DFBB - -I=53 -KEY=BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8 -PT=4888336B723A022C9545320F836A4207 -CT=010EDBF5981E143A81D646E597A4A568 - -I=54 -KEY=DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -PT=F84D9A5561B0608B1160DEE000C41BA8 -CT=8DB44D538DC20CC2F40F3067FD298E60 - -I=55 -KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314 -PT=C23192A0418E30A19B45AE3E3625BF22 -CT=930EB53BC71E6AC4B82972BDCD5AAFB3 - -I=56 -KEY=161718191B1C1D1E20212223252627282A2B2C2D2F303132 -PT=B84E0690B28B0025381AD82A15E501A7 -CT=6C42A81EDCBC9517CCD89C30C95597B4 - -I=57 -KEY=34353637393A3B3C3E3F40414344454648494A4B4D4E4F50 -PT=ACEF5E5C108876C4F06269F865B8F0B0 -CT=DA389847AD06DF19D76EE119C71E1DD3 - -I=58 -KEY=525354555758595A5C5D5E5F61626364666768696B6C6D6E -PT=0F1B3603E0F5DDEA4548246153A5E064 -CT=E018FDAE13D3118F9A5D1A647A3F0462 - -I=59 -KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C -PT=FBB63893450D42B58C6D88CD3C1809E3 -CT=2AA65DB36264239D3846180FABDFAD20 - -I=60 -KEY=8E8F90919394959698999A9B9D9E9FA0A2A3A4A5A7A8A9AA -PT=4BEF736DF150259DAE0C91354E8A5F92 -CT=1472163E9A4F780F1CEB44B07ECF4FDB - -I=61 -KEY=ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8 -PT=7D2D46242056EF13D3C3FC93C128F4C7 -CT=C8273FDC8F3A9F72E91097614B62397C - -I=62 -KEY=CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -PT=E9C1BA2DF415657A256EDB33934680FD -CT=66C8427DCD733AAF7B3470CB7D976E3F - -I=63 -KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304 -PT=E23EE277B0AA0A1DFB81F7527C3514F1 -CT=146131CB17F1424D4F8DA91E6F80C1D0 - -I=64 -KEY=060708090B0C0D0E10111213151617181A1B1C1D1F202122 -PT=3E7445B0B63CAAF75E4A911E12106B4C -CT=2610D0AD83659081AE085266A88770DC - -I=65 -KEY=24252627292A2B2C2E2F30313334353638393A3B3D3E3F40 -PT=767774752023222544455A5BE6E1E0E3 -CT=38A2B5A974B0575C5D733917FB0D4570 - -I=66 -KEY=424344454748494A4C4D4E4F51525354565758595B5C5D5E -PT=72737475717E7F7CE9E8EBEA696A6B6C -CT=E21D401EBC60DE20D6C486E4F39A588B - -I=67 -KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C -PT=DFDEDDDC25262728C9C8CFCEF1EEEFEC -CT=E51D5F88C670B079C0CA1F0C2C4405A2 - -I=68 -KEY=7E7F80818384858688898A8B8D8E8F90929394959798999A -PT=FFFE0100707776755F5E5D5C7675746B -CT=246A94788A642FB3D1B823C8762380C8 - -I=69 -KEY=9C9D9E9FA1A2A3A4A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8 -PT=E0E1E2E3424140479F9E9190292E2F2C -CT=B80C391C5C41A4C3B30C68E0E3D7550F - -I=70 -KEY=BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -PT=2120272690EFEEED3B3A39384E4D4C4B -CT=B77C4754FC64EB9A1154A9AF0BB1F21C - -I=71 -KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4 -PT=ECEDEEEF5350516EA1A0A7A6A3ACADAE -CT=FB554DE520D159A06BF219FC7F34A02F - -I=72 -KEY=F6F7F8F9FBFCFDFE00010203050607080A0B0C0D0F101112 -PT=32333C3D25222320E9E8EBEACECDCCC3 -CT=A89FBA152D76B4927BEED160DDB76C57 - -I=73 -KEY=14151617191A1B1C1E1F20212324252628292A2B2D2E2F30 -PT=40414243626160678A8BB4B511161714 -CT=5676EAB4A98D2E8473B3F3D46424247C - -I=74 -KEY=323334353738393A3C3D3E3F41424344464748494B4C4D4E -PT=94959293F5FAFBF81F1E1D1C7C7F7E79 -CT=4E8F068BD7EDE52A639036EC86C33568 - -I=75 -KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C -PT=BEBFBCBD191A1B14CFCEC9C8546B6A69 -CT=F0193C4D7AFF1791EE4C07EB4A1824FC - -I=76 -KEY=6E6F70717374757678797A7B7D7E7F80828384858788898A -PT=2C2D3233898E8F8CBBBAB9B8333031CE -CT=AC8686EECA9BA761AFE82D67B928C33F - -I=77 -KEY=8C8D8E8F91929394969798999B9C9D9EA0A1A2A3A5A6A7A8 -PT=84858687BFBCBDBA37363938FDFAFBF8 -CT=5FAF8573E33B145B6A369CD3606AB2C9 - -I=78 -KEY=AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 -PT=828384857669686B909192930B08090E -CT=31587E9944AB1C16B844ECAD0DF2E7DA - -I=79 -KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4 -PT=BEBFBCBD9695948B707176779E919093 -CT=D017FECD91148ABA37F6F3068AA67D8A - -I=80 -KEY=E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8FAFBFCFDFE010002 -PT=8B8A85846067666521202322D0D3D2DD -CT=788EF2F021A73CBA2794B616078A8500 - -I=81 -KEY=04050607090A0B0C0E0F10111314151618191A1B1D1E1F20 -PT=76777475F1F2F3F4F8F9E6E777707172 -CT=5D1EF20DCED6BCBC12131AC7C54788AA - -I=82 -KEY=222324252728292A2C2D2E2F31323334363738393B3C3D3E -PT=A4A5A2A34F404142B4B5B6B727242522 -CT=B3C8CF961FAF9EA05FDDE6D1E4D8F663 - -I=83 -KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C -PT=94959697E1E2E3EC16171011839C9D9E -CT=143075C70605861C7FAC6526199E459F - -I=84 -KEY=5E5F60616364656668696A6B6D6E6F70727374757778797A -PT=03023D3C06010003DEDFDCDDFFFCFDE2 -CT=A5AE12EADE9A87268D898BFC8FC0252A - -I=85 -KEY=7C7D7E7F81828384868788898B8C8D8E9091929395969798 -PT=10111213F1F2F3F4CECFC0C1DBDCDDDE -CT=0924F7CF2E877A4819F5244A360DCEA9 - -I=86 -KEY=9A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -PT=67666160724D4C4F1D1C1F1E73707176 -CT=3D9E9635AFCC3E291CC7AB3F27D1C99A - -I=87 -KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4 -PT=E6E7E4E5A8ABAAD584858283909F9E9D -CT=9D80FEEBF87510E2B8FB98BB54FD788C - -I=88 -KEY=D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 -PT=71707F7E565150537D7C7F7E6162636C -CT=5F9D1A082A1A37985F174002ECA01309 - -I=89 -KEY=F4F5F6F7F9FAFBFCFEFE01010304050608090A0B0D0E0F10 -PT=64656667212223245555AAAA03040506 -CT=A390EBB1D1403930184A44B4876646E4 - -I=90 -KEY=121314151718191A1C1D1E1F21222324262728292B2C2D2E -PT=9E9F9899ABA4A5A6CFCECDCC2B28292E -CT=700FE918981C3195BB6C4BCB46B74E29 - -I=91 -KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C -PT=C7C6C5C4D1D2D3DC626364653A454447 -CT=907984406F7BF2D17FB1EB15B673D747 - -I=92 -KEY=4E4F50515354555658595A5B5D5E5F60626364656768696A -PT=F6F7E8E9E0E7E6E51D1C1F1E5B585966 -CT=C32A956DCFC875C2AC7C7CC8B8CC26E1 - -I=93 -KEY=6C6D6E6F71727374767778797B7C7D7E8081828385868788 -PT=BCBDBEBF5D5E5F5868696667F4F3F2F1 -CT=02646E2EBFA9B820CF8424E9B9B6EB51 - -I=94 -KEY=8A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 -PT=40414647B0AFAEAD9B9A99989B98999E -CT=621FDA3A5BBD54C6D3C685816BD4EAD8 - -I=95 -KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4 -PT=69686B6A0201001F0F0E0908B4BBBAB9 -CT=D4E216040426DFAF18B152469BC5AC2F - -I=96 -KEY=C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 -PT=C7C6C9C8D8DFDEDD5A5B5859BEBDBCB3 -CT=9D0635B9D33B6CDBD71F5D246EA17CC8 - -I=97 -KEY=E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6F8F9FAFBFDFEFE00 -PT=DEDFDCDD787B7A7DFFFEE1E0B2B5B4B7 -CT=10ABAD1BD9BAE5448808765583A2CC1A - -I=98 -KEY=020304050708090A0C0D0E0F11121314161718191B1C1D1E -PT=4D4C4B4A606F6E6DD0D1D2D3FBF8F9FE -CT=6891889E16544E355FF65A793C39C9A8 - -I=99 -KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C -PT=B7B6B5B4D7D4D5DAE5E4E3E2E1FEFFFC -CT=CC735582E68072C163CD9DDF46B91279 - -I=100 -KEY=3E3F40414344454648494A4B4D4E4F50525354555758595A -PT=CECFB0B1F7F0F1F2AEAFACAD3E3D3C23 -CT=C5C68B9AEEB7F878DF578EFA562F9574 - -I=101 -KEY=5C5D5E5F61626364666768696B6C6D6E7071727375767778 -PT=CACBC8C9CDCECFC812131C1D494E4F4C -CT=5F4764395A667A47D73452955D0D2CE8 - -I=102 -KEY=7A7B7C7D7F80818284858687898A8B8C8E8F909193949596 -PT=9D9C9B9AD22D2C2FB1B0B3B20C0F0E09 -CT=701448331F66106CEFDDF1EB8267C357 - -I=103 -KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4 -PT=7A7B787964676659959493924F404142 -CT=CB3EE56D2E14B4E1941666F13379D657 - -I=104 -KEY=B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 -PT=AAABA4A5CEC9C8CB1F1E1D1CABA8A9A6 -CT=9FE16EFD18AB6E1981191851FEDB0764 - -I=105 -KEY=D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6E8E9EAEBEDEEEFF0 -PT=93929190282B2A2DC4C5FAFB92959497 -CT=3DC9BA24E1B223589B147ADCEB4C8E48 - -I=106 -KEY=F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E -PT=EFEEE9E8DED1D0D339383B3A888B8A8D -CT=1C333032682E7D4DE5E5AFC05C3E483C - -I=107 -KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C -PT=7F7E7D7CA2A1A0AF78797E7F112E2F2C -CT=D593CC99A95AFEF7E92038E05A59D00A - -I=108 -KEY=2E2F30313334353638393A3B3D3E3F40424344454748494A -PT=84859A9B2B2C2D2E868784852625245B -CT=51E7F96F53B4353923452C222134E1EC - -I=109 -KEY=4C4D4E4F51525354565758595B5C5D5E6061626365666768 -PT=B0B1B2B3070405026869666710171615 -CT=4075B357A1A2B473400C3B25F32F81A4 - -I=110 -KEY=6A6B6C6D6F70717274757677797A7B7C7E7F808183848586 -PT=ACADAAABBDA2A3A00D0C0F0E595A5B5C -CT=302E341A3EBCD74F0D55F61714570284 - -I=111 -KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4 -PT=121310115655544B5253545569666764 -CT=57ABDD8231280DA01C5042B78CF76522 - -I=112 -KEY=A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 -PT=DEDFD0D166616063EAEBE8E94142434C -CT=17F9EA7EEA17AC1ADF0E190FEF799E92 - -I=113 -KEY=C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6D8D9DADBDDDEDFE0 -PT=DBDAD9D81417161166677879E0E7E6E5 -CT=2E1BDD563DD87EE5C338DD6D098D0A7A - -I=114 -KEY=E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -PT=6A6B6C6DE0EFEEED2B2A2928C0C3C2C5 -CT=EB869996E6F8BFB2BFDD9E0C4504DBB2 - -I=115 -KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C -PT=B1B0B3B21714151A1A1B1C1D5649484B -CT=C2E01549E9DECF317468B3E018C61BA8 - -I=116 -KEY=1E1F20212324252628292A2B2D2E2F30323334353738393A -PT=39380706A3A4A5A6C4C5C6C77271706F -CT=8DA875D033C01DD463B244A1770F4A22 - -I=117 -KEY=3C3D3E3F41424344464748494B4C4D4E5051525355565758 -PT=5C5D5E5F1013121539383736E2E5E4E7 -CT=8BA0DCF3A186844F026D022F8839D696 - -I=118 -KEY=5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -PT=43424544EAD5D4D72E2F2C2D64676661 -CT=E9691FF9A6CC6970E51670A0FD5B88C1 - -I=119 -KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 -PT=55545756989B9A65F8F9FEFF18171615 -CT=F2BAEC06FAEED30F88EE63BA081A6E5B - -I=120 -KEY=969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 -PT=05040B0A525554573C3D3E3F4A494847 -CT=9C39D4C459AE5753394D6094ADC21E78 - -I=121 -KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 -PT=14151617595A5B5C8584FBFA8E89888B -CT=6345B532A11904502EA43BA99C6BD2B2 - -I=122 -KEY=D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=7C7D7A7BFDF2F3F029282B2A51525354 -CT=5FFAE3061A95172E4070CEDCE1E428C8 - -I=123 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C -PT=38393A3B1E1D1C1341404746C23D3C3E -CT=0A4566BE4CDF9ADCE5DEC865B5AB34CD - -I=124 -KEY=0E0F10111314151618191A1B1D1E1F20222324252728292A -PT=8D8C939240474645818083827C7F7E41 -CT=CA17FCCE79B7404F2559B22928F126FB - -I=125 -KEY=2C2D2E2F31323334363738393B3C3D3E4041424345464748 -PT=3B3A39381A19181F32333C3D45424340 -CT=97CA39B849ED73A6470A97C821D82F58 - -I=126 -KEY=4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 -PT=F0F1F6F738272625828380817F7C7D7A -CT=8198CB06BC684C6D3E9B7989428DCF7A - -I=127 -KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 -PT=89888B8A0407061966676061141B1A19 -CT=F53C464C705EE0F28D9A4C59374928BD - -I=128 -KEY=868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 -PT=D3D2DDDCAAADACAF9C9D9E9FE8EBEAE5 -CT=9ADB3D4CCA559BB98C3E2ED73DBF1154 - -========== - -KEYSIZE=256 - - -I=1 -KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 -PT=834EADFCCAC7E1B30664B1ABA44815AB -CT=1946DABF6A03A2A2C3D0B05080AED6FC - -I=2 -KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E -PT=D9DC4DBA3021B05D67C0518F72B62BF1 -CT=5ED301D747D3CC715445EBDEC62F2FB4 - -I=3 -KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -PT=A291D86301A4A739F7392173AA3C604C -CT=6585C8F43D13A6BEAB6419FC5935B9D0 - -I=4 -KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E -PT=4264B2696498DE4DF79788A9F83E9390 -CT=2A5B56A596680FCC0E05F5E0F151ECAE - -I=5 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 -PT=EE9932B3721804D5A83EF5949245B6F6 -CT=F5D6FF414FD2C6181494D20C37F2B8C4 - -I=6 -KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=E6248F55C5FDCBCA9CBBB01C88A2EA77 -CT=85399C01F59FFFB5204F19F8482F00B8 - -I=7 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 -PT=B8358E41B9DFF65FD461D55A99266247 -CT=92097B4C88A041DDF98144BC8D22E8E7 - -I=8 -KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E -PT=F0E2D72260AF58E21E015AB3A4C0D906 -CT=89BD5B73B356AB412AEF9F76CEA2D65C - -I=9 -KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 -PT=475B8B823CE8893DB3C44A9F2A379FF7 -CT=2536969093C55FF9454692F2FAC2F530 - -I=10 -KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E -PT=688F5281945812862F5F3076CF80412F -CT=07FC76A872843F3F6E0081EE9396D637 - -I=11 -KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -PT=08D1D2BC750AF553365D35E75AFACEAA -CT=E38BA8EC2AA741358DCC93E8F141C491 - -I=12 -KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE -PT=8707121F47CC3EFCECA5F9A8474950A1 -CT=D028EE23E4A89075D0B03E868D7D3A42 - -I=13 -KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 -PT=E51AA0B135DBA566939C3B6359A980C5 -CT=8CD9423DFC459E547155C5D1D522E540 - -I=14 -KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E -PT=069A007FC76A459F98BAF917FEDF9521 -CT=080E9517EB1677719ACF728086040AE3 - -I=15 -KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 -PT=726165C1723FBCF6C026D7D00B091027 -CT=7C1700211A3991FC0ECDED0AB3E576B0 - -I=16 -KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E -PT=D7C544DE91D55CFCDE1F84CA382200CE -CT=DABCBCC855839251DB51E224FBE87435 - -I=17 -KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 -PT=FED3C9A161B9B5B2BD611B41DC9DA357 -CT=68D56FAD0406947A4DD27A7448C10F1D - -I=18 -KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE -PT=4F634CDC6551043409F30B635832CF82 -CT=DA9A11479844D1FFEE24BBF3719A9925 - -I=19 -KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -PT=109CE98DB0DFB36734D9F3394711B4E6 -CT=5E4BA572F8D23E738DA9B05BA24B8D81 - -I=20 -KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 -PT=4EA6DFABA2D8A02FFDFFA89835987242 -CT=A115A2065D667E3F0B883837A6E903F8 - -I=21 -KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -PT=5AE094F54AF58E6E3CDBF976DAC6D9EF -CT=3E9E90DC33EAC2437D86AD30B137E66E - -I=22 -KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -PT=764D8E8E0F29926DBE5122E66354FDBE -CT=01CE82D8FBCDAE824CB3C48E495C3692 - -I=23 -KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E -PT=3F0418F888CDF29A982BF6B75410D6A9 -CT=0C9CFF163CE936FAAF083CFD3DEA3117 - -I=24 -KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 -PT=E4A3E7CB12CDD56AA4A75197A9530220 -CT=5131BA9BD48F2BBA85560680DF504B52 - -I=25 -KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E -PT=211677684AAC1EC1A160F44C4EBF3F26 -CT=9DC503BBF09823AEC8A977A5AD26CCB2 - -I=26 -KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 -PT=D21E439FF749AC8F18D6D4B105E03895 -CT=9A6DB0C0862E506A9E397225884041D7 - -I=27 -KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -PT=D9F6FF44646C4725BD4C0103FF5552A7 -CT=430BF9570804185E1AB6365FC6A6860C - -I=28 -KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -PT=0B1256C2A00B976250CFC5B0C37ED382 -CT=3525EBC02F4886E6A5A3762813E8CE8A - -I=29 -KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -PT=B056447FFC6DC4523A36CC2E972A3A79 -CT=07FA265C763779CCE224C7BAD671027B - -I=30 -KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 -PT=5E25CA78F0DE55802524D38DA3FE4456 -CT=E8B72B4E8BE243438C9FFF1F0E205872 - -I=31 -KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E -PT=A5BCF4728FA5EAAD8567C0DC24675F83 -CT=109D4F999A0E11ACE1F05E6B22CBCB50 - -I=32 -KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -PT=814E59F97ED84646B78B2CA022E9CA43 -CT=45A5E8D4C3ED58403FF08D68A0CC4029 - -I=33 -KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E -PT=15478BEEC58F4775C7A7F5D4395514D7 -CT=196865964DB3D417B6BD4D586BCB7634 - -I=34 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 -PT=253548FFCA461C67C8CBC78CD59F4756 -CT=60436AD45AC7D30D99195F815D98D2AE - -I=35 -KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=FD7AD8D73B9B0F8CC41600640F503D65 -CT=BB07A23F0B61014B197620C185E2CD75 - -I=36 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 -PT=06199DE52C6CBF8AF954CD65830BCD56 -CT=5BC0B2850129C854423AFF0751FE343B - -I=37 -KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E -PT=F17C4FFE48E44C61BD891E257E725794 -CT=7541A78F96738E6417D2A24BD2BECA40 - -I=38 -KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 -PT=9A5B4A402A3E8A59BE6BF5CD8154F029 -CT=B0A303054412882E464591F1546C5B9E - -I=39 -KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E -PT=79BD40B91A7E07DC939D441782AE6B17 -CT=778C06D8A355EEEE214FCEA14B4E0EEF - -I=40 -KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -PT=D8CEAAF8976E5FBE1012D8C84F323799 -CT=09614206D15CBACE63227D06DB6BEEBB - -I=41 -KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE -PT=3316E2751E2E388B083DA23DD6AC3FBE -CT=41B97FB20E427A9FDBBB358D9262255D - -I=42 -KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 -PT=8B7CFBE37DE7DCA793521819242C5816 -CT=C1940F703D845F957652C2D64ABD7ADF - -I=43 -KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E -PT=F23F033C0EEBF8EC55752662FD58CE68 -CT=D2D44FCDAE5332343366DB297EFCF21B - -I=44 -KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 -PT=59EB34F6C8BDBACC5FC6AD73A59A1301 -CT=EA8196B79DBE167B6AA9896E287EED2B - -I=45 -KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E -PT=DCDE8B6BD5CF7CC22D9505E3CE81261A -CT=D6B0B0C4BA6C7DBE5ED467A1E3F06C2D - -I=46 -KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 -PT=E33CF7E524FED781E7042FF9F4B35DC7 -CT=EC51EB295250C22C2FB01816FB72BCAE - -I=47 -KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE -PT=27963C8FACDF73062867D164DF6D064C -CT=ADED6630A07CE9C7408A155D3BD0D36F - -I=48 -KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -PT=77B1CE386B551B995F2F2A1DA994EEF8 -CT=697C9245B9937F32F5D1C82319F0363A - -I=49 -KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E -PT=F083388B013679EFCF0BB9B15D52AE5C -CT=AAD5AD50C6262AAEC30541A1B7B5B19C - -I=50 -KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 -PT=C5009E0DAB55DB0ABDB636F2600290C8 -CT=7D34B893855341EC625BD6875AC18C0D - -I=51 -KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E -PT=7804881E26CD532D8514D3683F00F1B9 -CT=7EF05105440F83862F5D780E88F02B41 - -I=52 -KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 -PT=46CDDCD73D1EB53E675CA012870A92A3 -CT=C377C06403382061AF2C9C93A8E70DF6 - -I=53 -KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -PT=A9FB44062BB07FE130A8E8299EACB1AB -CT=1DBDB3FFDC052DACC83318853ABC6DE5 - -I=54 -KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -PT=2B6FF8D7A5CC3A28A22D5A6F221AF26B -CT=69A6EAB00432517D0BF483C91C0963C7 - -I=55 -KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E -PT=1A9527C29B8ADD4B0E3E656DBB2AF8B4 -CT=0797F41DC217C80446E1D514BD6AB197 - -I=56 -KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 -PT=7F99CF2C75244DF015EB4B0C1050AEAE -CT=9DFD76575902A637C01343C58E011A03 - -I=57 -KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E -PT=E84FF85B0D9454071909C1381646C4ED -CT=ACF4328AE78F34B9FA9B459747CC2658 - -I=58 -KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 -PT=89AFD40F99521280D5399B12404F6DB4 -CT=B0479AEA12BAC4FE2384CF98995150C6 - -I=59 -KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -PT=A09EF32DBC5119A35AB7FA38656F0329 -CT=9DD52789EFE3FFB99F33B3DA5030109A - -I=60 -KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -PT=61773457F068C376C7829B93E696E716 -CT=ABBB755E4621EF8F1214C19F649FB9FD - -I=61 -KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -PT=A34F0CAE726CCE41DD498747D891B967 -CT=DA27FB8174357BCE2BED0E7354F380F9 - -I=62 -KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 -PT=856F59496C7388EE2D2B1A27B7697847 -CT=C59A0663F0993838F6E5856593BDC5EF - -I=63 -KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E -PT=CB090C593EF7720BD95908FB93B49DF4 -CT=ED60B264B5213E831607A99C0CE5E57E - -I=64 -KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -PT=A0AC75CD2F1923D460FC4D457AD95BAF -CT=E50548746846F3EB77B8C520640884ED - -I=65 -KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E -PT=2A2B282974777689E8E9EEEF525D5C5F -CT=28282CC7D21D6A2923641E52D188EF0C - -I=66 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 -PT=909192939390919E0F0E09089788898A -CT=0DFA5B02ABB18E5A815305216D6D4F8E - -I=67 -KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=777675748D8E8F907170777649464744 -CT=7359635C0EECEFE31D673395FB46FB99 - -I=68 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 -PT=717073720605040B2D2C2B2A05FAFBF9 -CT=73C679F7D5AEF2745C9737BB4C47FB36 - -I=69 -KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E -PT=64656667FEFDFCC31B1A1D1CA5AAABA8 -CT=B192BD472A4D2EAFB786E97458967626 - -I=70 -KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 -PT=DBDAD9D86A696867B5B4B3B2C8D7D6D5 -CT=0EC327F6C8A2B147598CA3FDE61DC6A4 - -I=71 -KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E -PT=5C5D5E5FE3E0E1FE31303736333C3D3E -CT=FC418EB3C41B859B38D4B6F646629729 - -I=72 -KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -PT=545556574B48494673727574546B6A69 -CT=30249E5AC282B1C981EA64B609F3A154 - -I=73 -KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE -PT=ECEDEEEFC6C5C4BB56575051F5FAFBF8 -CT=5E6E08646D12150776BB43C2D78A9703 - -I=74 -KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 -PT=464744452724252AC9C8CFCED2CDCCCF -CT=FAEB3D5DE652CD3447DCEB343F30394A - -I=75 -KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E -PT=E6E7E4E54142435C878681801C131211 -CT=A8E88706823F6993EF80D05C1C7B2CF0 - -I=76 -KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 -PT=72737071CFCCCDC2F9F8FFFE710E0F0C -CT=8CED86677E6E00A1A1B15968F2D3CCE6 - -I=77 -KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E -PT=505152537370714EC3C2C5C4010E0F0C -CT=9FC7C23858BE03BDEBB84E90DB6786A9 - -I=78 -KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 -PT=A8A9AAAB5C5F5E51AEAFA8A93D222320 -CT=B4FBD65B33F70D8CF7F1111AC4649C36 - -I=79 -KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE -PT=DEDFDCDDF6F5F4EB10111617FEF1F0F3 -CT=C5C32D5ED03C4B53CC8C1BD0EF0DBBF6 - -I=80 -KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -PT=BDBCBFBE5E5D5C530B0A0D0CFAC5C4C7 -CT=D1A7F03B773E5C212464B63709C6A891 - -I=81 -KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E -PT=8A8B8889050606F8F4F5F2F3636C6D6E -CT=6B7161D8745947AC6950438EA138D028 - -I=82 -KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 -PT=A6A7A4A54D4E4F40B2B3B4B539262724 -CT=FD47A9F7E366EE7A09BC508B00460661 - -I=83 -KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E -PT=9C9D9E9FE9EAEBF40E0F08099B949596 -CT=00D40B003DC3A0D9310B659B98C7E416 - -I=84 -KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 -PT=2D2C2F2E1013121DCCCDCACBED121310 -CT=EEA4C79DCC8E2BDA691F20AC48BE0717 - -I=85 -KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -PT=F4F5F6F7EDEEEFD0EAEBECEDF7F8F9FA -CT=E78F43B11C204403E5751F89D05A2509 - -I=86 -KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -PT=3D3C3F3E282B2A2573727574150A0B08 -CT=D0F0E3D1F1244BB979931E38DD1786EF - -I=87 -KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E -PT=B6B7B4B5F8FBFAE5B4B5B2B3A0AFAEAD -CT=042E639DC4E1E4DDE7B75B749EA6F765 - -I=88 -KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 -PT=B7B6B5B4989B9A95878681809BA4A5A6 -CT=BC032FDD0EFE29503A980A7D07AB46A8 - -I=89 -KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E -PT=A8A9AAABE5E6E798E9E8EFEE4748494A -CT=0C93AC949C0DA6446EFFB86183B6C910 - -I=90 -KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 -PT=ECEDEEEFD9DADBD4B9B8BFBE657A7B78 -CT=E0D343E14DA75C917B4A5CEC4810D7C2 - -I=91 -KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -PT=7F7E7D7C696A6B74CACBCCCD929D9C9F -CT=0EAFB821748408279B937B626792E619 - -I=92 -KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -PT=08090A0B0605040BFFFEF9F8B9C6C7C4 -CT=FA1AC6E02D23B106A1FEF18B274A553F - -I=93 -KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -PT=08090A0BF1F2F3CCFCFDFAFB68676665 -CT=0DADFE019CD12368075507DF33C1A1E9 - -I=94 -KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 -PT=CACBC8C93A393837050403020D121310 -CT=3A0879B414465D9FFBAF86B33A63A1B9 - -I=95 -KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E -PT=E9E8EBEA8281809F8F8E8988343B3A39 -CT=62199FADC76D0BE1805D3BA0B7D914BF - -I=96 -KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -PT=515053524645444BD0D1D6D7340B0A09 -CT=1B06D6C5D333E742730130CF78E719B4 - -I=97 -KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E -PT=42434041ECEFEE1193929594C6C9C8CB -CT=F1F848824C32E9DCDCBF21580F069329 - -I=98 -KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 -PT=EFEEEDECC2C1C0CF76777071455A5B58 -CT=1A09050CBD684F784D8E965E0782F28A - -I=99 -KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE -PT=5F5E5D5C3F3C3D221D1C1B1A19161714 -CT=79C2969E7DED2BA7D088F3F320692360 - -I=100 -KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 -PT=000102034142434C1C1D1A1B8D727371 -CT=091A658A2F7444C16ACCB669450C7B63 - -I=101 -KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E -PT=8E8F8C8DB1B2B38C56575051050A0B08 -CT=97C1E3A72CCA65FA977D5ED0E8A7BBFC - -I=102 -KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 -PT=A7A6A5A4E8EBEAE57F7E7978CAD5D4D7 -CT=70C430C6DB9A17828937305A2DF91A2A - -I=103 -KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E -PT=8A8B888994979689454443429F909192 -CT=629553457FBE2479098571C7C903FDE8 - -I=104 -KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 -PT=8C8D8E8FE0E3E2ED45444342F1CECFCC -CT=A25B25A61F612669E7D91265C7D476BA - -I=105 -KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE -PT=FFFEFDFC4C4F4E31D8D9DEDFB6B9B8BB -CT=EB7E4E49B8AE0F024570DDA293254FED - -I=106 -KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 -PT=FDFCFFFECCCFCEC12F2E29286679787B -CT=38FE15D61CCA84516E924ADCE5014F67 - -I=107 -KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E -PT=67666564BAB9B8A77071767719161714 -CT=3AD208492249108C9F3EBEB167AD0583 - -I=108 -KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 -PT=9A9B98992D2E2F2084858283245B5A59 -CT=299BA9F9BF5AB05C3580FC26EDD1ED12 - -I=109 -KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E -PT=A4A5A6A70B0809365C5D5A5B2C232221 -CT=19DC705B857A60FB07717B2EA5717781 - -I=110 -KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 -PT=464744455754555AF3F2F5F4AFB0B1B2 -CT=FFC8AEB885B5EFCAD06B6DBEBF92E76B - -I=111 -KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE -PT=323330317675746B7273747549464744 -CT=F58900C5E0B385253FF2546250A0142B - -I=112 -KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 -PT=A8A9AAAB181B1A15808186872B141516 -CT=2EE67B56280BC462429CEE6E3370CBC1 - -I=113 -KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E -PT=E7E6E5E4202323DDAAABACAD343B3A39 -CT=20DB650A9C8E9A84AB4D25F7EDC8F03F - -I=114 -KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 -PT=A8A9AAAB2221202FEDECEBEA1E010003 -CT=3C36DA169525CF818843805F25B78AE5 - -I=115 -KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E -PT=F9F8FBFA5F5C5D42424344450E010003 -CT=9A781D960DB9E45E37779042FEA51922 - -I=116 -KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 -PT=57565554F5F6F7F89697909120DFDEDD -CT=6560395EC269C672A3C288226EFDBA77 - -I=117 -KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE -PT=F8F9FAFBCCCFCEF1DDDCDBDA0E010003 -CT=8C772B7A189AC544453D5916EBB27B9A - -I=118 -KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 -PT=D9D8DBDA7073727D80818687C2DDDCDF -CT=77CA5468CC48E843D05F78EED9D6578F - -I=119 -KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E -PT=C5C4C7C6080B0A1588898E8F68676665 -CT=72CDCC71DC82C60D4429C9E2D8195BAA - -I=120 -KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 -PT=83828180DCDFDED186878081F0CFCECD -CT=8080D68CE60E94B40B5B8B69EEB35AFA - -I=121 -KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E -PT=98999A9BDDDEDFA079787F7E0A050407 -CT=44222D3CDE299C04369D58AC0EBA1E8E - -I=122 -KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 -PT=CECFCCCD4F4C4D429F9E9998DFC0C1C2 -CT=9B8721B0A8DFC691C5BC5885DBFCB27A - -I=123 -KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE -PT=404142436665647B29282F2EABA4A5A6 -CT=0DC015CE9A3A3414B5E62EC643384183 - -I=124 -KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 -PT=33323130E6E5E4EB23222524DEA1A0A3 -CT=705715448A8DA412025CE38345C2A148 - -I=125 -KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE -PT=CFCECDCCF6F5F4CBE6E7E0E199969794 -CT=C32B5B0B6FBAE165266C569F4B6ECF0B - -I=126 -KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 -PT=BABBB8B97271707FDCDDDADB29363734 -CT=4DCA6C75192A01DDCA9476AF2A521E87 - -I=127 -KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E -PT=C9C8CBCA4447465926272021545B5A59 -CT=058691E627ECBC36AC07B6DB423BD698 - -I=128 -KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 -PT=050407067477767956575051221D1C1F -CT=7444527095838FE080FC2BCDD30847EB - +/* Description of what tables are tested: + The provided implementations each use a different set of tables + - Java implementation: uses no tables + - reference C implementation: uses Logtable, Alogtable, S, Si, rcon + - fast C implementation: uses Logtable, Alogtable, rcon + and additionally, T1, T2, T3, T4, T5, T6, T7, T8 + and (for the inverse key schedule only) U1, U2, U3, U4. + All these tables are tested. + +========================= + +FILENAME: "ecb_tbl.txt" + +Electronic Codebook (ECB) Mode +Tables Known Answer Tests + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========== + +KEYSIZE=128 + + +I=1 +KEY=00010203050607080A0B0C0D0F101112 +PT=506812A45F08C889B97F5980038B8359 +CT=D8F532538289EF7D06B506A4FD5BE9C9 + +I=2 +KEY=14151617191A1B1C1E1F202123242526 +PT=5C6D71CA30DE8B8B00549984D2EC7D4B +CT=59AB30F4D4EE6E4FF9907EF65B1FB68C + +I=3 +KEY=28292A2B2D2E2F30323334353738393A +PT=53F3F4C64F8616E4E7C56199F48F21F6 +CT=BF1ED2FCB2AF3FD41443B56D85025CB1 + +I=4 +KEY=3C3D3E3F41424344464748494B4C4D4E +PT=A1EB65A3487165FB0F1C27FF9959F703 +CT=7316632D5C32233EDCB0780560EAE8B2 + +I=5 +KEY=50515253555657585A5B5C5D5F606162 +PT=3553ECF0B1739558B08E350A98A39BFA +CT=408C073E3E2538072B72625E68B8364B + +I=6 +KEY=64656667696A6B6C6E6F707173747576 +PT=67429969490B9711AE2B01DC497AFDE8 +CT=E1F94DFA776597BEACA262F2F6366FEA + +I=7 +KEY=78797A7B7D7E7F80828384858788898A +PT=93385C1F2AEC8BED192F5A8E161DD508 +CT=F29E986C6A1C27D7B29FFD7EE92B75F1 + +I=8 +KEY=8C8D8E8F91929394969798999B9C9D9E +PT=B5BF946BE19BEB8DB3983B5F4C6E8DDB +CT=131C886A57F8C2E713ABA6955E2B55B5 + +I=9 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 +PT=41321EE10E21BD907227C4450FF42324 +CT=D2AB7662DF9B8C740210E5EEB61C199D + +I=10 +KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 +PT=00A82F59C91C8486D12C0A80124F6089 +CT=14C10554B2859C484CAB5869BBE7C470 + +I=11 +KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA +PT=7CE0FD076754691B4BBD9FAF8A1372FE +CT=DB4D498F0A49CF55445D502C1F9AB3B5 + +I=12 +KEY=DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=23605A8243D07764541BC5AD355B3129 +CT=6D96FEF7D66590A77A77BB2056667F7F + +I=13 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE010002 +PT=12A8CFA23EA764FD876232B4E842BC44 +CT=316FB68EDBA736C53E78477BF913725C + +I=14 +KEY=04050607090A0B0C0E0F101113141516 +PT=BCAF32415E8308B3723E5FDD853CCC80 +CT=6936F2B93AF8397FD3A771FC011C8C37 + +I=15 +KEY=2C2D2E2F31323334363738393B3C3D3E +PT=89AFAE685D801AD747ACE91FC49ADDE0 +CT=F3F92F7A9C59179C1FCC2C2BA0B082CD + +I=16 +KEY=40414243454647484A4B4C4D4F505152 +PT=F521D07B484357C4A69E76124A634216 +CT=6A95EA659EE3889158E7A9152FF04EBC + +I=17 +KEY=54555657595A5B5C5E5F606163646566 +PT=3E23B3BC065BCC152407E23896D77783 +CT=1959338344E945670678A5D432C90B93 + +I=18 +KEY=68696A6B6D6E6F70727374757778797A +PT=79F0FBA002BE1744670E7E99290D8F52 +CT=E49BDDD2369B83EE66E6C75A1161B394 + +I=19 +KEY=7C7D7E7F81828384868788898B8C8D8E +PT=DA23FE9D5BD63E1D72E3DAFBE21A6C2A +CT=D3388F19057FF704B70784164A74867D + +I=20 +KEY=A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +PT=E3F5698BA90B6A022EFD7DB2C7E6C823 +CT=23AA03E2D5E4CD24F3217E596480D1E1 + +I=21 +KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 +PT=BDC2691D4F1B73D2700679C3BCBF9C6E +CT=C84113D68B666AB2A50A8BDB222E91B9 + +I=22 +KEY=08090A0B0D0E0F10121314151718191A +PT=BA74E02093217EE1BA1B42BD5624349A +CT=AC02403981CD4340B507963DB65CB7B6 + +I=23 +KEY=6C6D6E6F71727374767778797B7C7D7E +PT=B5C593B5851C57FBF8B3F57715E8F680 +CT=8D1299236223359474011F6BF5088414 + +I=24 +KEY=80818283858687888A8B8C8D8F909192 +PT=3DA9BD9CEC072381788F9387C3BBF4EE +CT=5A1D6AB8605505F7977E55B9A54D9B90 + +I=25 +KEY=94959697999A9B9C9E9FA0A1A3A4A5A6 +PT=4197F3051121702AB65D316B3C637374 +CT=72E9C2D519CF555E4208805AABE3B258 + +I=26 +KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA +PT=9F46C62EC4F6EE3F6E8C62554BC48AB7 +CT=A8F3E81C4A23A39EF4D745DFFE026E80 + +I=27 +KEY=BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +PT=0220673FE9E699A4EBC8E0DBEB6979C8 +CT=546F646449D31458F9EB4EF5483AEE6C + +I=28 +KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 +PT=B2B99171337DED9BC8C2C23FF6F18867 +CT=4DBE4BC84AC797C0EE4EFB7F1A07401C + +I=29 +KEY=E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +PT=A7FACF4E301E984E5EFEEFD645B23505 +CT=25E10BFB411BBD4D625AC8795C8CA3B3 + +I=30 +KEY=F8F9FAFBFDFEFE00020304050708090A +PT=F7C762E4A9819160FD7ACFB6C4EEDCDD +CT=315637405054EC803614E43DEF177579 + +I=31 +KEY=0C0D0E0F11121314161718191B1C1D1E +PT=9B64FC21EA08709F4915436FAA70F1BE +CT=60C5BC8A1410247295C6386C59E572A8 + +I=32 +KEY=20212223252627282A2B2C2D2F303132 +PT=52AF2C3DE07EE6777F55A4ABFC100B3F +CT=01366FC8CA52DFE055D6A00A76471BA6 + +I=33 +KEY=34353637393A3B3C3E3F404143444546 +PT=2FCA001224386C57AA3F968CBE2C816F +CT=ECC46595516EC612449C3F581E7D42FF + +I=34 +KEY=48494A4B4D4E4F50525354555758595A +PT=4149C73658A4A9C564342755EE2C132F +CT=6B7FFE4C602A154B06EE9C7DAB5331C9 + +I=35 +KEY=5C5D5E5F61626364666768696B6C6D6E +PT=AF60005A00A1772F7C07A48A923C23D2 +CT=7DA234C14039A240DD02DD0FBF84EB67 + +I=36 +KEY=70717273757677787A7B7C7D7F808182 +PT=6FCCBC28363759914B6F0280AFAF20C6 +CT=C7DC217D9E3604FFE7E91F080ECD5A3A + +I=37 +KEY=84858687898A8B8C8E8F909193949596 +PT=7D82A43DDF4FEFA2FC5947499884D386 +CT=37785901863F5C81260EA41E7580CDA5 + +I=38 +KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AA +PT=5D5A990EAAB9093AFE4CE254DFA49EF9 +CT=A07B9338E92ED105E6AD720FCCCE9FE4 + +I=39 +KEY=ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +PT=4CD1E2FD3F4434B553AAE453F0ED1A02 +CT=AE0FB9722418CC21A7DA816BBC61322C + +I=40 +KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 +PT=5A2C9A9641D4299125FA1B9363104B5E +CT=C826A193080FF91FFB21F71D3373C877 + +I=41 +KEY=D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +PT=B517FE34C0FA217D341740BFD4FE8DD4 +CT=1181B11B0E494E8D8B0AA6B1D5AC2C48 + +I=42 +KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA +PT=014BAF2278A69D331D5180103643E99A +CT=6743C3D1519AB4F2CD9A78AB09A511BD + +I=43 +KEY=FCFDFEFF01020304060708090B0C0D0E +PT=B529BD8164F20D0AA443D4932116841C +CT=DC55C076D52BACDF2EEFD952946A439D + +I=44 +KEY=10111213151617181A1B1C1D1F202122 +PT=2E596DCBB2F33D4216A1176D5BD1E456 +CT=711B17B590FFC72B5C8E342B601E8003 + +I=45 +KEY=24252627292A2B2C2E2F303133343536 +PT=7274A1EA2B7EE2424E9A0E4673689143 +CT=19983BB0950783A537E1339F4AA21C75 + +I=46 +KEY=38393A3B3D3E3F40424344454748494A +PT=AE20020BD4F13E9D90140BEE3B5D26AF +CT=3BA7762E15554169C0F4FA39164C410C + +I=47 +KEY=4C4D4E4F51525354565758595B5C5D5E +PT=BAAC065DA7AC26E855E79C8849D75A02 +CT=A0564C41245AFCA7AF8AA2E0E588EA89 + +I=48 +KEY=60616263656667686A6B6C6D6F707172 +PT=7C917D8D1D45FAB9E2540E28832540CC +CT=5E36A42A2E099F54AE85ECD92E2381ED + +I=49 +KEY=74757677797A7B7C7E7F808183848586 +PT=BDE6F89E16DAADB0E847A2A614566A91 +CT=770036F878CD0F6CA2268172F106F2FE + +I=50 +KEY=88898A8B8D8E8F90929394959798999A +PT=C9DE163725F1F5BE44EBB1DB51D07FBC +CT=7E4E03908B716116443CCF7C94E7C259 + +I=51 +KEY=9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +PT=3AF57A58F0C07DFFA669572B521E2B92 +CT=482735A48C30613A242DD494C7F9185D + +I=52 +KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 +PT=3D5EBAC306DDE4604F1B4FBBBFCDAE55 +CT=B4C0F6C9D4D7079ADDF9369FC081061D + +I=53 +KEY=C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +PT=C2DFA91BCEB76A1183C995020AC0B556 +CT=D5810FE0509AC53EDCD74F89962E6270 + +I=54 +KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA +PT=C70F54305885E9A0746D01EC56C8596B +CT=03F17A16B3F91848269ECDD38EBB2165 + +I=55 +KEY=ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +PT=C4F81B610E98012CE000182050C0C2B2 +CT=DA1248C3180348BAD4A93B4D9856C9DF + +I=56 +KEY=00010203050607080A0B0C0D0F101112 +PT=EAAB86B1D02A95D7404EFF67489F97D4 +CT=3D10D7B63F3452C06CDF6CCE18BE0C2C + +I=57 +KEY=14151617191A1B1C1E1F202123242526 +PT=7C55BDB40B88870B52BEC3738DE82886 +CT=4AB823E7477DFDDC0E6789018FCB6258 + +I=58 +KEY=28292A2B2D2E2F30323334353738393A +PT=BA6EAA88371FF0A3BD875E3F2A975CE0 +CT=E6478BA56A77E70CFDAA5C843ABDE30E + +I=59 +KEY=3C3D3E3F41424344464748494B4C4D4E +PT=08059130C4C24BD30CF0575E4E0373DC +CT=1673064895FBEAF7F09C5429FF75772D + +I=60 +KEY=50515253555657585A5B5C5D5F606162 +PT=9A8EAB004EF53093DFCF96F57E7EDA82 +CT=4488033AE9F2EFD0CA9383BFCA1A94E9 + +I=61 +KEY=64656667696A6B6C6E6F707173747576 +PT=0745B589E2400C25F117B1D796C28129 +CT=978F3B8C8F9D6F46626CAC3C0BCB9217 + +I=62 +KEY=78797A7B7D7E7F80828384858788898A +PT=2F1777781216CEC3F044F134B1B92BBE +CT=E08C8A7E582E15E5527F1D9E2EECB236 + +I=63 +KEY=8C8D8E8F91929394969798999B9C9D9E +PT=353A779FFC541B3A3805D90CE17580FC +CT=CEC155B76AC5FFDA4CF4F9CA91E49A7A + +I=64 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 +PT=1A1EAE4415CEFCF08C4AC1C8F68BEA8F +CT=D5AC7165763225DD2A38CDC6862C29AD + +I=65 +KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 +PT=E6E7E4E5B0B3B2B5D4D5AAAB16111013 +CT=03680FE19F7CE7275452020BE70E8204 + +I=66 +KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA +PT=F8F9FAFBFBF8F9E677767170EFE0E1E2 +CT=461DF740C9781C388E94BB861CEB54F6 + +I=67 +KEY=DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=63626160A1A2A3A445444B4A75727370 +CT=451BD60367F96483042742219786A074 + +I=68 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE010002 +PT=717073720605040B2D2C2B2A05FAFBF9 +CT=E4DFA42671A02E57EF173B85C0EA9F2B + +I=69 +KEY=04050607090A0B0C0E0F101113141516 +PT=78797A7BEAE9E8EF3736292891969794 +CT=ED11B89E76274282227D854700A78B9E + +I=70 +KEY=18191A1B1D1E1F20222324252728292A +PT=838281803231300FDDDCDBDAA0AFAEAD +CT=433946EAA51EA47AF33895F2B90B3B75 + +I=71 +KEY=2C2D2E2F31323334363738393B3C3D3E +PT=18191A1BBFBCBDBA75747B7A7F78797A +CT=6BC6D616A5D7D0284A5910AB35022528 + +I=72 +KEY=40414243454647484A4B4C4D4F505152 +PT=848586879B989996A3A2A5A4849B9A99 +CT=D2A920ECFE919D354B5F49EAE9719C98 + +I=73 +KEY=54555657595A5B5C5E5F606163646566 +PT=0001020322212027CACBF4F551565754 +CT=3A061B17F6A92885EFBD0676985B373D + +I=74 +KEY=68696A6B6D6E6F70727374757778797A +PT=CECFCCCDAFACADB2515057564A454447 +CT=FADEEC16E33EA2F4688499D157E20D8F + +I=75 +KEY=7C7D7E7F81828384868788898B8C8D8E +PT=92939091CDCECFC813121D1C80878685 +CT=5CDEFEDE59601AA3C3CDA36FA6B1FA13 + +I=76 +KEY=90919293959697989A9B9C9D9FA0A1A2 +PT=D2D3D0D16F6C6D6259585F5ED1EEEFEC +CT=9574B00039844D92EBBA7EE8719265F8 + +I=77 +KEY=A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +PT=ACADAEAF878485820F0E1110D5D2D3D0 +CT=9A9CF33758671787E5006928188643FA + +I=78 +KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA +PT=9091929364676619E6E7E0E1757A7B78 +CT=2CDDD634C846BA66BB46CBFEA4A674F9 + +I=79 +KEY=CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +PT=BABBB8B98A89888F74757A7B92959497 +CT=D28BAE029393C3E7E26E9FAFBBB4B98F + +I=80 +KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 +PT=8D8C8F8E6E6D6C633B3A3D3CCAD5D4D7 +CT=EC27529B1BEE0A9AB6A0D73EBC82E9B7 + +I=81 +KEY=F4F5F6F7F9FAFBFCFEFE010103040506 +PT=86878485010203040808F7F767606162 +CT=3CB25C09472AFF6EE7E2B47CCD7CCB17 + +I=82 +KEY=08090A0B0D0E0F10121314151718191A +PT=8E8F8C8D656667788A8B8C8D010E0F0C +CT=DEE33103A7283370D725E44CA38F8FE5 + +I=83 +KEY=1C1D1E1F21222324262728292B2C2D2E +PT=C8C9CACB858687807A7B7475E7E0E1E2 +CT=27F9BCD1AAC64BFFC11E7815702C1A69 + +I=84 +KEY=30313233353637383A3B3C3D3F404142 +PT=6D6C6F6E5053525D8C8D8A8BADD2D3D0 +CT=5DF534FFAD4ED0749A9988E9849D0021 + +I=85 +KEY=44454647494A4B4C4E4F505153545556 +PT=28292A2B393A3B3C0607181903040506 +CT=A48BEE75DB04FB60CA2B80F752A8421B + +I=86 +KEY=58595A5B5D5E5F60626364656768696A +PT=A5A4A7A6B0B3B28DDBDADDDCBDB2B3B0 +CT=024C8CF70BC86EE5CE03678CB7AF45F9 + +I=87 +KEY=6C6D6E6F71727374767778797B7C7D7E +PT=323330316467666130313E3F2C2B2A29 +CT=3C19AC0F8A3A3862CE577831301E166B + +I=88 +KEY=80818283858687888A8B8C8D8F909192 +PT=27262524080B0A05171611100B141516 +CT=C5E355B796A57421D59CA6BE82E73BCA + +I=89 +KEY=94959697999A9B9C9E9FA0A1A3A4A5A6 +PT=040506074142434435340B0AA3A4A5A6 +CT=D94033276417ABFB05A69D15B6E386E2 + +I=90 +KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA +PT=242526271112130C61606766BDB2B3B0 +CT=24B36559EA3A9B9B958FE6DA3E5B8D85 + +I=91 +KEY=BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +PT=4B4A4948252627209E9F9091CEC9C8CB +CT=20FD4FEAA0E8BF0CCE7861D74EF4CB72 + +I=92 +KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 +PT=68696A6B6665646B9F9E9998D9E6E7E4 +CT=350E20D5174277B9EC314C501570A11D + +I=93 +KEY=E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +PT=34353637C5C6C7C0F0F1EEEF7C7B7A79 +CT=87A29D61B7C604D238FE73045A7EFD57 + +I=94 +KEY=F8F9FAFBFDFEFE00020304050708090A +PT=32333031C2C1C13F0D0C0B0A050A0B08 +CT=2C3164C1CC7D0064816BDC0FAA362C52 + +I=95 +KEY=0C0D0E0F11121314161718191B1C1D1E +PT=CDCCCFCEBEBDBCBBABAAA5A4181F1E1D +CT=195FE5E8A05A2ED594F6E4400EEE10B3 + +I=96 +KEY=20212223252627282A2B2C2D2F303132 +PT=212023223635343BA0A1A6A7445B5A59 +CT=E4663DF19B9A21A5A284C2BD7F905025 + +I=97 +KEY=34353637393A3B3C3E3F404143444546 +PT=0E0F0C0DA8ABAAAD2F2E515002050407 +CT=21B88714CFB4E2A933BD281A2C4743FD + +I=98 +KEY=48494A4B4D4E4F50525354555758595A +PT=070605042A2928378E8F8889BDB2B3B0 +CT=CBFC3980D704FD0FC54378AB84E17870 + +I=99 +KEY=5C5D5E5F61626364666768696B6C6D6E +PT=CBCAC9C893909196A9A8A7A6A5A2A3A0 +CT=BC5144BAA48BDEB8B63E22E03DA418EF + +I=100 +KEY=70717273757677787A7B7C7D7F808182 +PT=80818283C1C2C3CC9C9D9A9B0CF3F2F1 +CT=5A1DBAEF1EE2984B8395DA3BDFFA3CCC + +I=101 +KEY=84858687898A8B8C8E8F909193949596 +PT=1213101125262720FAFBE4E5B1B6B7B4 +CT=F0B11CD0729DFCC80CEC903D97159574 + +I=102 +KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AA +PT=7F7E7D7C3033320D97969190222D2C2F +CT=9F95314ACFDDC6D1914B7F19A9CC8209 + +I=103 +KEY=ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +PT=4E4F4C4D484B4A4D81808F8E53545556 +CT=595736F6F0F70914A94E9E007F022519 + +I=104 +KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 +PT=DCDDDEDFB0B3B2BD15141312A1BEBFBC +CT=1F19F57892CAE586FCDFB4C694DEB183 + +I=105 +KEY=D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +PT=93929190282B2A2DC4C5FAFB92959497 +CT=540700EE1F6F3DAB0B3EDDF6CAEE1EF5 + +I=106 +KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FA +PT=F5F4F7F6C4C7C6D9373631307E717073 +CT=14A342A91019A331687A2254E6626CA2 + +I=107 +KEY=FCFDFEFF01020304060708090B0C0D0E +PT=93929190B6B5B4B364656A6B05020300 +CT=7B25F3C3B2EEA18D743EF283140F29FF + +I=108 +KEY=10111213151617181A1B1C1D1F202122 +PT=BABBB8B90D0E0F00A4A5A2A3043B3A39 +CT=46C2587D66E5E6FA7F7CA6411AD28047 + +I=109 +KEY=24252627292A2B2C2E2F303133343536 +PT=D8D9DADB7F7C7D7A10110E0F787F7E7D +CT=09470E72229D954ED5EE73886DFEEBA9 + +I=110 +KEY=38393A3B3D3E3F40424344454748494A +PT=FEFFFCFDEFECED923B3A3D3C6768696A +CT=D77C03DE92D4D0D79EF8D4824EF365EB + +I=111 +KEY=4C4D4E4F51525354565758595B5C5D5E +PT=D6D7D4D58A89888F96979899A5A2A3A0 +CT=1D190219F290E0F1715D152D41A23593 + +I=112 +KEY=60616263656667686A6B6C6D6F707172 +PT=18191A1BA8ABAAA5303136379B848586 +CT=A2CD332CE3A0818769616292E87F757B + +I=113 +KEY=74757677797A7B7C7E7F808183848586 +PT=6B6A6968A4A7A6A1D6D72829B0B7B6B5 +CT=D54AFA6CE60FBF9341A3690E21385102 + +I=114 +KEY=88898A8B8D8E8F90929394959798999A +PT=000102038A89889755545352A6A9A8AB +CT=06E5C364DED628A3F5E05E613E356F46 + +I=115 +KEY=9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +PT=2D2C2F2EB3B0B1B6B6B7B8B9F2F5F4F7 +CT=EAE63C0E62556DAC85D221099896355A + +I=116 +KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 +PT=979695943536373856575051E09F9E9D +CT=1FED060E2C6FC93EE764403A889985A2 + +I=117 +KEY=C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +PT=A4A5A6A7989B9A9DB1B0AFAE7A7D7C7F +CT=C25235C1A30FDEC1C7CB5C5737B2A588 + +I=118 +KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EA +PT=C1C0C3C2686B6A55A8A9AEAFEAE5E4E7 +CT=796DBEF95147D4D30873AD8B7B92EFC0 + +I=119 +KEY=ECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +PT=C1C0C3C2141716118C8D828364636261 +CT=CBCF0FB34D98D0BD5C22CE37211A46BF + +I=120 +KEY=00010203050607080A0B0C0D0F101112 +PT=93929190CCCFCEC196979091E0FFFEFD +CT=94B44DA6466126CAFA7C7FD09063FC24 + +I=121 +KEY=14151617191A1B1C1E1F202123242526 +PT=B4B5B6B7F9FAFBFC25241B1A6E69686B +CT=D78C5B5EBF9B4DBDA6AE506C5074C8FE + +I=122 +KEY=28292A2B2D2E2F30323334353738393A +PT=868784850704051AC7C6C1C08788898A +CT=6C27444C27204B043812CF8CF95F9769 + +I=123 +KEY=3C3D3E3F41424344464748494B4C4D4E +PT=F4F5F6F7AAA9A8AFFDFCF3F277707172 +CT=BE94524EE5A2AA50BBA8B75F4C0AEBCF + +I=124 +KEY=50515253555657585A5B5C5D5F606162 +PT=D3D2D1D00605040BC3C2C5C43E010003 +CT=A0AEAAE91BA9F31F51AEB3588CF3A39E + +I=125 +KEY=64656667696A6B6C6E6F707173747576 +PT=73727170424140476A6B74750D0A0B08 +CT=275297779C28266EF9FE4C6A13C08488 + +I=126 +KEY=78797A7B7D7E7F80828384858788898A +PT=C2C3C0C10A0908F754555253A1AEAFAC +CT=86523D92BB8672CB01CF4A77FD725882 + +I=127 +KEY=8C8D8E8F91929394969798999B9C9D9E +PT=6D6C6F6EF8FBFAFD82838C8DF8FFFEFD +CT=4B8327640E9F33322A04DD96FCBF9A36 + +I=128 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2 +PT=F5F4F7F684878689A6A7A0A1D2CDCCCF +CT=CE52AF650D088CA559425223F4D32694 + +========== + +KEYSIZE=192 + + +I=1 +KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C +PT=2D33EEF2C0430A8A9EBF45E809C40BB6 +CT=DFF4945E0336DF4C1C56BC700EFF837F + +I=2 +KEY=1E1F20212324252628292A2B2D2E2F30323334353738393A +PT=6AA375D1FA155A61FB72353E0A5A8756 +CT=B6FDDEF4752765E347D5D2DC196D1252 + +I=3 +KEY=3C3D3E3F41424344464748494B4C4D4E5051525355565758 +PT=BC3736518B9490DCB8ED60EB26758ED4 +CT=D23684E3D963B3AFCF1A114ACA90CBD6 + +I=4 +KEY=5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +PT=AA214402B46CFFB9F761EC11263A311E +CT=3A7AC027753E2A18C2CEAB9E17C11FD0 + +I=5 +KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 +PT=02AEA86E572EEAB66B2C3AF5E9A46FD6 +CT=8F6786BD007528BA26603C1601CDD0D8 + +I=6 +KEY=969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 +PT=E2AEF6ACC33B965C4FA1F91C75FF6F36 +CT=D17D073B01E71502E28B47AB551168B3 + +I=7 +KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 +PT=0659DF46427162B9434865DD9499F91D +CT=A469DA517119FAB95876F41D06D40FFA + +I=8 +KEY=D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=49A44239C748FEB456F59C276A5658DF +CT=6091AA3B695C11F5C0B6AD26D3D862FF + +I=9 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C +PT=66208F6E9D04525BDEDB2733B6A6BE37 +CT=70F9E67F9F8DF1294131662DC6E69364 + +I=10 +KEY=0E0F10111314151618191A1B1D1E1F20222324252728292A +PT=3393F8DFC729C97F5480B950BC9666B0 +CT=D154DCAFAD8B207FA5CBC95E9996B559 + +I=11 +KEY=2C2D2E2F31323334363738393B3C3D3E4041424345464748 +PT=606834C8CE063F3234CF1145325DBD71 +CT=4934D541E8B46FA339C805A7AEB9E5DA + +I=12 +KEY=4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +PT=FEC1C04F529BBD17D8CECFCC4718B17F +CT=62564C738F3EFE186E1A127A0C4D3C61 + +I=13 +KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 +PT=32DF99B431ED5DC5ACF8CAF6DC6CE475 +CT=07805AA043986EB23693E23BEF8F3438 + +I=14 +KEY=868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 +PT=7FDC2B746F3F665296943B83710D1F82 +CT=DF0B4931038BADE848DEE3B4B85AA44B + +I=15 +KEY=A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0 +PT=8FBA1510A3C5B87E2EAA3F7A91455CA2 +CT=592D5FDED76582E4143C65099309477C + +I=16 +KEY=C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +PT=2C9B468B1C2EED92578D41B0716B223B +CT=C9B8D6545580D3DFBCDD09B954ED4E92 + +I=17 +KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFC +PT=0A2BBF0EFC6BC0034F8A03433FCA1B1A +CT=5DCCD5D6EB7C1B42ACB008201DF707A0 + +I=18 +KEY=FEFE01010304050608090A0B0D0E0F10121314151718191A +PT=25260E1F31F4104D387222E70632504B +CT=A2A91682FFEB6ED1D34340946829E6F9 + +I=19 +KEY=1C1D1E1F21222324262728292B2C2D2E3031323335363738 +PT=C527D25A49F08A5228D338642AE65137 +CT=E45D185B797000348D9267960A68435D + +I=20 +KEY=3A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +PT=3B49FC081432F5890D0E3D87E884A69E +CT=45E060DAE5901CDA8089E10D4F4C246B + +I=21 +KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374 +PT=D173F9ED1E57597E166931DF2754A083 +CT=F6951AFACC0079A369C71FDCFF45DF50 + +I=22 +KEY=767778797B7C7D7E80818283858687888A8B8C8D8F909192 +PT=8C2B7CAFA5AFE7F13562DAEAE1ADEDE0 +CT=9E95E00F351D5B3AC3D0E22E626DDAD6 + +I=23 +KEY=94959697999A9B9C9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0 +PT=AAF4EC8C1A815AEB826CAB741339532C +CT=9CB566FF26D92DAD083B51FDC18C173C + +I=24 +KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBEC +PT=40BE8C5D9108E663F38F1A2395279ECF +CT=C9C82766176A9B228EB9A974A010B4FB + +I=25 +KEY=2A2B2C2D2F30313234353637393A3B3C3E3F404143444546 +PT=0C8AD9BC32D43E04716753AA4CFBE351 +CT=D8E26AA02945881D5137F1C1E1386E88 + +I=26 +KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364 +PT=1407B1D5F87D63357C8DC7EBBAEBBFEE +CT=C0E024CCD68FF5FFA4D139C355A77C55 + +I=27 +KEY=84858687898A8B8C8E8F90919394959698999A9B9D9E9FA0 +PT=E62734D1AE3378C4549E939E6F123416 +CT=0B18B3D16F491619DA338640DF391D43 + +I=28 +KEY=A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +PT=5A752CFF2A176DB1A1DE77F2D2CDEE41 +CT=DBE09AC8F66027BF20CB6E434F252EFC + +I=29 +KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDC +PT=A9C8C3A4EABEDC80C64730DDD018CD88 +CT=6D04E5E43C5B9CBE05FEB9606B6480FE + +I=30 +KEY=1A1B1C1D1F20212224252627292A2B2C2E2F303133343536 +PT=EE9B3DBBDB86180072130834D305999A +CT=DD1D6553B96BE526D9FEE0FBD7176866 + +I=31 +KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354 +PT=A7FA8C3586B8EBDE7568EAD6F634A879 +CT=0260CA7E3F979FD015B0DD4690E16D2A + +I=32 +KEY=929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +PT=37E0F4A87F127D45AC936FE7AD88C10A +CT=9893734DE10EDCC8A67C3B110B8B8CC6 + +I=33 +KEY=464748494B4C4D4E50515253555657585A5B5C5D5F606162 +PT=3F77D8B5D92BAC148E4E46F697A535C5 +CT=93B30B750516B2D18808D710C2EE84EF + +I=34 +KEY=828384858788898A8C8D8E8F91929394969798999B9C9D9E +PT=D25EBB686C40F7E2C4DA1014936571CA +CT=16F65FA47BE3CB5E6DFE7C6C37016C0E + +I=35 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBC +PT=4F1C769D1E5B0552C7ECA84DEA26A549 +CT=F3847210D5391E2360608E5ACB560581 + +I=36 +KEY=BEBFC0C1C3C4C5C6C8C9CACBCDCECFD0D2D3D4D5D7D8D9DA +PT=8548E2F882D7584D0FAFC54372B6633A +CT=8754462CD223366D0753913E6AF2643D + +I=37 +KEY=DCDDDEDFE1E2E3E4E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8 +PT=87D7A336CB476F177CD2A51AF2A62CDF +CT=1EA20617468D1B806A1FD58145462017 + +I=38 +KEY=FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 +PT=03B1FEAC668C4E485C1065DFC22B44EE +CT=3B155D927355D737C6BE9DDA60136E2E + +I=39 +KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334 +PT=BDA15E66819FA72D653A6866AA287962 +CT=26144F7B66DAA91B6333DBD3850502B3 + +I=40 +KEY=363738393B3C3D3E40414243454647484A4B4C4D4F505152 +PT=4D0C7A0D2505B80BF8B62CEB12467F0A +CT=E4F9A4AB52CED8134C649BF319EBCC90 + +I=41 +KEY=54555657595A5B5C5E5F60616364656668696A6B6D6E6F70 +PT=626D34C9429B37211330986466B94E5F +CT=B9DDD29AC6128A6CAB121E34A4C62B36 + +I=42 +KEY=727374757778797A7C7D7E7F81828384868788898B8C8D8E +PT=333C3E6BF00656B088A17E5FF0E7F60A +CT=6FCDDAD898F2CE4EFF51294F5EAAF5C9 + +I=43 +KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABAC +PT=687ED0CDC0D2A2BC8C466D05EF9D2891 +CT=C9A6FE2BF4028080BEA6F7FC417BD7E3 + +I=44 +KEY=AEAFB0B1B3B4B5B6B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CA +PT=487830E78CC56C1693E64B2A6660C7B6 +CT=6A2026846D8609D60F298A9C0673127F + +I=45 +KEY=CCCDCECFD1D2D3D4D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8 +PT=7A48D6B7B52B29392AA2072A32B66160 +CT=2CB25C005E26EFEA44336C4C97A4240B + +I=46 +KEY=EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 +PT=907320E64C8C5314D10F8D7A11C8618D +CT=496967AB8680DDD73D09A0E4C7DCC8AA + +I=47 +KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324 +PT=B561F2CA2D6E65A4A98341F3ED9FF533 +CT=D5AF94DE93487D1F3A8C577CB84A66A4 + +I=48 +KEY=262728292B2C2D2E30313233353637383A3B3C3D3F404142 +PT=DF769380D212792D026F049E2E3E48EF +CT=84BDAC569CAE2828705F267CC8376E90 + +I=49 +KEY=44454647494A4B4C4E4F50515354555658595A5B5D5E5F60 +PT=79F374BC445BDABF8FCCB8843D6054C6 +CT=F7401DDA5AD5AB712B7EB5D10C6F99B6 + +I=50 +KEY=626364656768696A6C6D6E6F71727374767778797B7C7D7E +PT=4E02F1242FA56B05C68DBAE8FE44C9D6 +CT=1C9D54318539EBD4C3B5B7E37BF119F0 + +I=51 +KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C +PT=CF73C93CBFF57AC635A6F4AD2A4A1545 +CT=ACA572D65FB2764CFFD4A6ECA090EA0D + +I=52 +KEY=9E9FA0A1A3A4A5A6A8A9AAABADAEAFB0B2B3B4B5B7B8B9BA +PT=9923548E2875750725B886566784C625 +CT=36D9C627B8C2A886A10CCB36EAE3DFBB + +I=53 +KEY=BCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8 +PT=4888336B723A022C9545320F836A4207 +CT=010EDBF5981E143A81D646E597A4A568 + +I=54 +KEY=DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +PT=F84D9A5561B0608B1160DEE000C41BA8 +CT=8DB44D538DC20CC2F40F3067FD298E60 + +I=55 +KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314 +PT=C23192A0418E30A19B45AE3E3625BF22 +CT=930EB53BC71E6AC4B82972BDCD5AAFB3 + +I=56 +KEY=161718191B1C1D1E20212223252627282A2B2C2D2F303132 +PT=B84E0690B28B0025381AD82A15E501A7 +CT=6C42A81EDCBC9517CCD89C30C95597B4 + +I=57 +KEY=34353637393A3B3C3E3F40414344454648494A4B4D4E4F50 +PT=ACEF5E5C108876C4F06269F865B8F0B0 +CT=DA389847AD06DF19D76EE119C71E1DD3 + +I=58 +KEY=525354555758595A5C5D5E5F61626364666768696B6C6D6E +PT=0F1B3603E0F5DDEA4548246153A5E064 +CT=E018FDAE13D3118F9A5D1A647A3F0462 + +I=59 +KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C +PT=FBB63893450D42B58C6D88CD3C1809E3 +CT=2AA65DB36264239D3846180FABDFAD20 + +I=60 +KEY=8E8F90919394959698999A9B9D9E9FA0A2A3A4A5A7A8A9AA +PT=4BEF736DF150259DAE0C91354E8A5F92 +CT=1472163E9A4F780F1CEB44B07ECF4FDB + +I=61 +KEY=ACADAEAFB1B2B3B4B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8 +PT=7D2D46242056EF13D3C3FC93C128F4C7 +CT=C8273FDC8F3A9F72E91097614B62397C + +I=62 +KEY=CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +PT=E9C1BA2DF415657A256EDB33934680FD +CT=66C8427DCD733AAF7B3470CB7D976E3F + +I=63 +KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304 +PT=E23EE277B0AA0A1DFB81F7527C3514F1 +CT=146131CB17F1424D4F8DA91E6F80C1D0 + +I=64 +KEY=060708090B0C0D0E10111213151617181A1B1C1D1F202122 +PT=3E7445B0B63CAAF75E4A911E12106B4C +CT=2610D0AD83659081AE085266A88770DC + +I=65 +KEY=24252627292A2B2C2E2F30313334353638393A3B3D3E3F40 +PT=767774752023222544455A5BE6E1E0E3 +CT=38A2B5A974B0575C5D733917FB0D4570 + +I=66 +KEY=424344454748494A4C4D4E4F51525354565758595B5C5D5E +PT=72737475717E7F7CE9E8EBEA696A6B6C +CT=E21D401EBC60DE20D6C486E4F39A588B + +I=67 +KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C +PT=DFDEDDDC25262728C9C8CFCEF1EEEFEC +CT=E51D5F88C670B079C0CA1F0C2C4405A2 + +I=68 +KEY=7E7F80818384858688898A8B8D8E8F90929394959798999A +PT=FFFE0100707776755F5E5D5C7675746B +CT=246A94788A642FB3D1B823C8762380C8 + +I=69 +KEY=9C9D9E9FA1A2A3A4A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8 +PT=E0E1E2E3424140479F9E9190292E2F2C +CT=B80C391C5C41A4C3B30C68E0E3D7550F + +I=70 +KEY=BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +PT=2120272690EFEEED3B3A39384E4D4C4B +CT=B77C4754FC64EB9A1154A9AF0BB1F21C + +I=71 +KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4 +PT=ECEDEEEF5350516EA1A0A7A6A3ACADAE +CT=FB554DE520D159A06BF219FC7F34A02F + +I=72 +KEY=F6F7F8F9FBFCFDFE00010203050607080A0B0C0D0F101112 +PT=32333C3D25222320E9E8EBEACECDCCC3 +CT=A89FBA152D76B4927BEED160DDB76C57 + +I=73 +KEY=14151617191A1B1C1E1F20212324252628292A2B2D2E2F30 +PT=40414243626160678A8BB4B511161714 +CT=5676EAB4A98D2E8473B3F3D46424247C + +I=74 +KEY=323334353738393A3C3D3E3F41424344464748494B4C4D4E +PT=94959293F5FAFBF81F1E1D1C7C7F7E79 +CT=4E8F068BD7EDE52A639036EC86C33568 + +I=75 +KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C +PT=BEBFBCBD191A1B14CFCEC9C8546B6A69 +CT=F0193C4D7AFF1791EE4C07EB4A1824FC + +I=76 +KEY=6E6F70717374757678797A7B7D7E7F80828384858788898A +PT=2C2D3233898E8F8CBBBAB9B8333031CE +CT=AC8686EECA9BA761AFE82D67B928C33F + +I=77 +KEY=8C8D8E8F91929394969798999B9C9D9EA0A1A2A3A5A6A7A8 +PT=84858687BFBCBDBA37363938FDFAFBF8 +CT=5FAF8573E33B145B6A369CD3606AB2C9 + +I=78 +KEY=AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 +PT=828384857669686B909192930B08090E +CT=31587E9944AB1C16B844ECAD0DF2E7DA + +I=79 +KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4 +PT=BEBFBCBD9695948B707176779E919093 +CT=D017FECD91148ABA37F6F3068AA67D8A + +I=80 +KEY=E6E7E8E9EBECEDEEF0F1F2F3F5F6F7F8FAFBFCFDFE010002 +PT=8B8A85846067666521202322D0D3D2DD +CT=788EF2F021A73CBA2794B616078A8500 + +I=81 +KEY=04050607090A0B0C0E0F10111314151618191A1B1D1E1F20 +PT=76777475F1F2F3F4F8F9E6E777707172 +CT=5D1EF20DCED6BCBC12131AC7C54788AA + +I=82 +KEY=222324252728292A2C2D2E2F31323334363738393B3C3D3E +PT=A4A5A2A34F404142B4B5B6B727242522 +CT=B3C8CF961FAF9EA05FDDE6D1E4D8F663 + +I=83 +KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C +PT=94959697E1E2E3EC16171011839C9D9E +CT=143075C70605861C7FAC6526199E459F + +I=84 +KEY=5E5F60616364656668696A6B6D6E6F70727374757778797A +PT=03023D3C06010003DEDFDCDDFFFCFDE2 +CT=A5AE12EADE9A87268D898BFC8FC0252A + +I=85 +KEY=7C7D7E7F81828384868788898B8C8D8E9091929395969798 +PT=10111213F1F2F3F4CECFC0C1DBDCDDDE +CT=0924F7CF2E877A4819F5244A360DCEA9 + +I=86 +KEY=9A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +PT=67666160724D4C4F1D1C1F1E73707176 +CT=3D9E9635AFCC3E291CC7AB3F27D1C99A + +I=87 +KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4 +PT=E6E7E4E5A8ABAAD584858283909F9E9D +CT=9D80FEEBF87510E2B8FB98BB54FD788C + +I=88 +KEY=D6D7D8D9DBDCDDDEE0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2 +PT=71707F7E565150537D7C7F7E6162636C +CT=5F9D1A082A1A37985F174002ECA01309 + +I=89 +KEY=F4F5F6F7F9FAFBFCFEFE01010304050608090A0B0D0E0F10 +PT=64656667212223245555AAAA03040506 +CT=A390EBB1D1403930184A44B4876646E4 + +I=90 +KEY=121314151718191A1C1D1E1F21222324262728292B2C2D2E +PT=9E9F9899ABA4A5A6CFCECDCC2B28292E +CT=700FE918981C3195BB6C4BCB46B74E29 + +I=91 +KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C +PT=C7C6C5C4D1D2D3DC626364653A454447 +CT=907984406F7BF2D17FB1EB15B673D747 + +I=92 +KEY=4E4F50515354555658595A5B5D5E5F60626364656768696A +PT=F6F7E8E9E0E7E6E51D1C1F1E5B585966 +CT=C32A956DCFC875C2AC7C7CC8B8CC26E1 + +I=93 +KEY=6C6D6E6F71727374767778797B7C7D7E8081828385868788 +PT=BCBDBEBF5D5E5F5868696667F4F3F2F1 +CT=02646E2EBFA9B820CF8424E9B9B6EB51 + +I=94 +KEY=8A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 +PT=40414647B0AFAEAD9B9A99989B98999E +CT=621FDA3A5BBD54C6D3C685816BD4EAD8 + +I=95 +KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4 +PT=69686B6A0201001F0F0E0908B4BBBAB9 +CT=D4E216040426DFAF18B152469BC5AC2F + +I=96 +KEY=C6C7C8C9CBCCCDCED0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2 +PT=C7C6C9C8D8DFDEDD5A5B5859BEBDBCB3 +CT=9D0635B9D33B6CDBD71F5D246EA17CC8 + +I=97 +KEY=E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6F8F9FAFBFDFEFE00 +PT=DEDFDCDD787B7A7DFFFEE1E0B2B5B4B7 +CT=10ABAD1BD9BAE5448808765583A2CC1A + +I=98 +KEY=020304050708090A0C0D0E0F11121314161718191B1C1D1E +PT=4D4C4B4A606F6E6DD0D1D2D3FBF8F9FE +CT=6891889E16544E355FF65A793C39C9A8 + +I=99 +KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C +PT=B7B6B5B4D7D4D5DAE5E4E3E2E1FEFFFC +CT=CC735582E68072C163CD9DDF46B91279 + +I=100 +KEY=3E3F40414344454648494A4B4D4E4F50525354555758595A +PT=CECFB0B1F7F0F1F2AEAFACAD3E3D3C23 +CT=C5C68B9AEEB7F878DF578EFA562F9574 + +I=101 +KEY=5C5D5E5F61626364666768696B6C6D6E7071727375767778 +PT=CACBC8C9CDCECFC812131C1D494E4F4C +CT=5F4764395A667A47D73452955D0D2CE8 + +I=102 +KEY=7A7B7C7D7F80818284858687898A8B8C8E8F909193949596 +PT=9D9C9B9AD22D2C2FB1B0B3B20C0F0E09 +CT=701448331F66106CEFDDF1EB8267C357 + +I=103 +KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4 +PT=7A7B787964676659959493924F404142 +CT=CB3EE56D2E14B4E1941666F13379D657 + +I=104 +KEY=B6B7B8B9BBBCBDBEC0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2 +PT=AAABA4A5CEC9C8CB1F1E1D1CABA8A9A6 +CT=9FE16EFD18AB6E1981191851FEDB0764 + +I=105 +KEY=D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6E8E9EAEBEDEEEFF0 +PT=93929190282B2A2DC4C5FAFB92959497 +CT=3DC9BA24E1B223589B147ADCEB4C8E48 + +I=106 +KEY=F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E +PT=EFEEE9E8DED1D0D339383B3A888B8A8D +CT=1C333032682E7D4DE5E5AFC05C3E483C + +I=107 +KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C +PT=7F7E7D7CA2A1A0AF78797E7F112E2F2C +CT=D593CC99A95AFEF7E92038E05A59D00A + +I=108 +KEY=2E2F30313334353638393A3B3D3E3F40424344454748494A +PT=84859A9B2B2C2D2E868784852625245B +CT=51E7F96F53B4353923452C222134E1EC + +I=109 +KEY=4C4D4E4F51525354565758595B5C5D5E6061626365666768 +PT=B0B1B2B3070405026869666710171615 +CT=4075B357A1A2B473400C3B25F32F81A4 + +I=110 +KEY=6A6B6C6D6F70717274757677797A7B7C7E7F808183848586 +PT=ACADAAABBDA2A3A00D0C0F0E595A5B5C +CT=302E341A3EBCD74F0D55F61714570284 + +I=111 +KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4 +PT=121310115655544B5253545569666764 +CT=57ABDD8231280DA01C5042B78CF76522 + +I=112 +KEY=A6A7A8A9ABACADAEB0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2 +PT=DEDFD0D166616063EAEBE8E94142434C +CT=17F9EA7EEA17AC1ADF0E190FEF799E92 + +I=113 +KEY=C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6D8D9DADBDDDEDFE0 +PT=DBDAD9D81417161166677879E0E7E6E5 +CT=2E1BDD563DD87EE5C338DD6D098D0A7A + +I=114 +KEY=E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +PT=6A6B6C6DE0EFEEED2B2A2928C0C3C2C5 +CT=EB869996E6F8BFB2BFDD9E0C4504DBB2 + +I=115 +KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C +PT=B1B0B3B21714151A1A1B1C1D5649484B +CT=C2E01549E9DECF317468B3E018C61BA8 + +I=116 +KEY=1E1F20212324252628292A2B2D2E2F30323334353738393A +PT=39380706A3A4A5A6C4C5C6C77271706F +CT=8DA875D033C01DD463B244A1770F4A22 + +I=117 +KEY=3C3D3E3F41424344464748494B4C4D4E5051525355565758 +PT=5C5D5E5F1013121539383736E2E5E4E7 +CT=8BA0DCF3A186844F026D022F8839D696 + +I=118 +KEY=5A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +PT=43424544EAD5D4D72E2F2C2D64676661 +CT=E9691FF9A6CC6970E51670A0FD5B88C1 + +I=119 +KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394 +PT=55545756989B9A65F8F9FEFF18171615 +CT=F2BAEC06FAEED30F88EE63BA081A6E5B + +I=120 +KEY=969798999B9C9D9EA0A1A2A3A5A6A7A8AAABACADAFB0B1B2 +PT=05040B0A525554573C3D3E3F4A494847 +CT=9C39D4C459AE5753394D6094ADC21E78 + +I=121 +KEY=B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6C8C9CACBCDCECFD0 +PT=14151617595A5B5C8584FBFA8E89888B +CT=6345B532A11904502EA43BA99C6BD2B2 + +I=122 +KEY=D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=7C7D7A7BFDF2F3F029282B2A51525354 +CT=5FFAE3061A95172E4070CEDCE1E428C8 + +I=123 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C +PT=38393A3B1E1D1C1341404746C23D3C3E +CT=0A4566BE4CDF9ADCE5DEC865B5AB34CD + +I=124 +KEY=0E0F10111314151618191A1B1D1E1F20222324252728292A +PT=8D8C939240474645818083827C7F7E41 +CT=CA17FCCE79B7404F2559B22928F126FB + +I=125 +KEY=2C2D2E2F31323334363738393B3C3D3E4041424345464748 +PT=3B3A39381A19181F32333C3D45424340 +CT=97CA39B849ED73A6470A97C821D82F58 + +I=126 +KEY=4A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +PT=F0F1F6F738272625828380817F7C7D7A +CT=8198CB06BC684C6D3E9B7989428DCF7A + +I=127 +KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384 +PT=89888B8A0407061966676061141B1A19 +CT=F53C464C705EE0F28D9A4C59374928BD + +I=128 +KEY=868788898B8C8D8E90919293959697989A9B9C9D9FA0A1A2 +PT=D3D2DDDCAAADACAF9C9D9E9FE8EBEAE5 +CT=9ADB3D4CCA559BB98C3E2ED73DBF1154 + +========== + +KEYSIZE=256 + + +I=1 +KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 +PT=834EADFCCAC7E1B30664B1ABA44815AB +CT=1946DABF6A03A2A2C3D0B05080AED6FC + +I=2 +KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E +PT=D9DC4DBA3021B05D67C0518F72B62BF1 +CT=5ED301D747D3CC715445EBDEC62F2FB4 + +I=3 +KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +PT=A291D86301A4A739F7392173AA3C604C +CT=6585C8F43D13A6BEAB6419FC5935B9D0 + +I=4 +KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E +PT=4264B2696498DE4DF79788A9F83E9390 +CT=2A5B56A596680FCC0E05F5E0F151ECAE + +I=5 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 +PT=EE9932B3721804D5A83EF5949245B6F6 +CT=F5D6FF414FD2C6181494D20C37F2B8C4 + +I=6 +KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=E6248F55C5FDCBCA9CBBB01C88A2EA77 +CT=85399C01F59FFFB5204F19F8482F00B8 + +I=7 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 +PT=B8358E41B9DFF65FD461D55A99266247 +CT=92097B4C88A041DDF98144BC8D22E8E7 + +I=8 +KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E +PT=F0E2D72260AF58E21E015AB3A4C0D906 +CT=89BD5B73B356AB412AEF9F76CEA2D65C + +I=9 +KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +PT=475B8B823CE8893DB3C44A9F2A379FF7 +CT=2536969093C55FF9454692F2FAC2F530 + +I=10 +KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E +PT=688F5281945812862F5F3076CF80412F +CT=07FC76A872843F3F6E0081EE9396D637 + +I=11 +KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +PT=08D1D2BC750AF553365D35E75AFACEAA +CT=E38BA8EC2AA741358DCC93E8F141C491 + +I=12 +KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +PT=8707121F47CC3EFCECA5F9A8474950A1 +CT=D028EE23E4A89075D0B03E868D7D3A42 + +I=13 +KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 +PT=E51AA0B135DBA566939C3B6359A980C5 +CT=8CD9423DFC459E547155C5D1D522E540 + +I=14 +KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E +PT=069A007FC76A459F98BAF917FEDF9521 +CT=080E9517EB1677719ACF728086040AE3 + +I=15 +KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +PT=726165C1723FBCF6C026D7D00B091027 +CT=7C1700211A3991FC0ECDED0AB3E576B0 + +I=16 +KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E +PT=D7C544DE91D55CFCDE1F84CA382200CE +CT=DABCBCC855839251DB51E224FBE87435 + +I=17 +KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 +PT=FED3C9A161B9B5B2BD611B41DC9DA357 +CT=68D56FAD0406947A4DD27A7448C10F1D + +I=18 +KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +PT=4F634CDC6551043409F30B635832CF82 +CT=DA9A11479844D1FFEE24BBF3719A9925 + +I=19 +KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +PT=109CE98DB0DFB36734D9F3394711B4E6 +CT=5E4BA572F8D23E738DA9B05BA24B8D81 + +I=20 +KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 +PT=4EA6DFABA2D8A02FFDFFA89835987242 +CT=A115A2065D667E3F0B883837A6E903F8 + +I=21 +KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +PT=5AE094F54AF58E6E3CDBF976DAC6D9EF +CT=3E9E90DC33EAC2437D86AD30B137E66E + +I=22 +KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +PT=764D8E8E0F29926DBE5122E66354FDBE +CT=01CE82D8FBCDAE824CB3C48E495C3692 + +I=23 +KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E +PT=3F0418F888CDF29A982BF6B75410D6A9 +CT=0C9CFF163CE936FAAF083CFD3DEA3117 + +I=24 +KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 +PT=E4A3E7CB12CDD56AA4A75197A9530220 +CT=5131BA9BD48F2BBA85560680DF504B52 + +I=25 +KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E +PT=211677684AAC1EC1A160F44C4EBF3F26 +CT=9DC503BBF09823AEC8A977A5AD26CCB2 + +I=26 +KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 +PT=D21E439FF749AC8F18D6D4B105E03895 +CT=9A6DB0C0862E506A9E397225884041D7 + +I=27 +KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +PT=D9F6FF44646C4725BD4C0103FF5552A7 +CT=430BF9570804185E1AB6365FC6A6860C + +I=28 +KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +PT=0B1256C2A00B976250CFC5B0C37ED382 +CT=3525EBC02F4886E6A5A3762813E8CE8A + +I=29 +KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +PT=B056447FFC6DC4523A36CC2E972A3A79 +CT=07FA265C763779CCE224C7BAD671027B + +I=30 +KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 +PT=5E25CA78F0DE55802524D38DA3FE4456 +CT=E8B72B4E8BE243438C9FFF1F0E205872 + +I=31 +KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E +PT=A5BCF4728FA5EAAD8567C0DC24675F83 +CT=109D4F999A0E11ACE1F05E6B22CBCB50 + +I=32 +KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +PT=814E59F97ED84646B78B2CA022E9CA43 +CT=45A5E8D4C3ED58403FF08D68A0CC4029 + +I=33 +KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E +PT=15478BEEC58F4775C7A7F5D4395514D7 +CT=196865964DB3D417B6BD4D586BCB7634 + +I=34 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 +PT=253548FFCA461C67C8CBC78CD59F4756 +CT=60436AD45AC7D30D99195F815D98D2AE + +I=35 +KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=FD7AD8D73B9B0F8CC41600640F503D65 +CT=BB07A23F0B61014B197620C185E2CD75 + +I=36 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 +PT=06199DE52C6CBF8AF954CD65830BCD56 +CT=5BC0B2850129C854423AFF0751FE343B + +I=37 +KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E +PT=F17C4FFE48E44C61BD891E257E725794 +CT=7541A78F96738E6417D2A24BD2BECA40 + +I=38 +KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +PT=9A5B4A402A3E8A59BE6BF5CD8154F029 +CT=B0A303054412882E464591F1546C5B9E + +I=39 +KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E +PT=79BD40B91A7E07DC939D441782AE6B17 +CT=778C06D8A355EEEE214FCEA14B4E0EEF + +I=40 +KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +PT=D8CEAAF8976E5FBE1012D8C84F323799 +CT=09614206D15CBACE63227D06DB6BEEBB + +I=41 +KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +PT=3316E2751E2E388B083DA23DD6AC3FBE +CT=41B97FB20E427A9FDBBB358D9262255D + +I=42 +KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 +PT=8B7CFBE37DE7DCA793521819242C5816 +CT=C1940F703D845F957652C2D64ABD7ADF + +I=43 +KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E +PT=F23F033C0EEBF8EC55752662FD58CE68 +CT=D2D44FCDAE5332343366DB297EFCF21B + +I=44 +KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +PT=59EB34F6C8BDBACC5FC6AD73A59A1301 +CT=EA8196B79DBE167B6AA9896E287EED2B + +I=45 +KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E +PT=DCDE8B6BD5CF7CC22D9505E3CE81261A +CT=D6B0B0C4BA6C7DBE5ED467A1E3F06C2D + +I=46 +KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 +PT=E33CF7E524FED781E7042FF9F4B35DC7 +CT=EC51EB295250C22C2FB01816FB72BCAE + +I=47 +KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +PT=27963C8FACDF73062867D164DF6D064C +CT=ADED6630A07CE9C7408A155D3BD0D36F + +I=48 +KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +PT=77B1CE386B551B995F2F2A1DA994EEF8 +CT=697C9245B9937F32F5D1C82319F0363A + +I=49 +KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E +PT=F083388B013679EFCF0BB9B15D52AE5C +CT=AAD5AD50C6262AAEC30541A1B7B5B19C + +I=50 +KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 +PT=C5009E0DAB55DB0ABDB636F2600290C8 +CT=7D34B893855341EC625BD6875AC18C0D + +I=51 +KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E +PT=7804881E26CD532D8514D3683F00F1B9 +CT=7EF05105440F83862F5D780E88F02B41 + +I=52 +KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 +PT=46CDDCD73D1EB53E675CA012870A92A3 +CT=C377C06403382061AF2C9C93A8E70DF6 + +I=53 +KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +PT=A9FB44062BB07FE130A8E8299EACB1AB +CT=1DBDB3FFDC052DACC83318853ABC6DE5 + +I=54 +KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +PT=2B6FF8D7A5CC3A28A22D5A6F221AF26B +CT=69A6EAB00432517D0BF483C91C0963C7 + +I=55 +KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E +PT=1A9527C29B8ADD4B0E3E656DBB2AF8B4 +CT=0797F41DC217C80446E1D514BD6AB197 + +I=56 +KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 +PT=7F99CF2C75244DF015EB4B0C1050AEAE +CT=9DFD76575902A637C01343C58E011A03 + +I=57 +KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E +PT=E84FF85B0D9454071909C1381646C4ED +CT=ACF4328AE78F34B9FA9B459747CC2658 + +I=58 +KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 +PT=89AFD40F99521280D5399B12404F6DB4 +CT=B0479AEA12BAC4FE2384CF98995150C6 + +I=59 +KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +PT=A09EF32DBC5119A35AB7FA38656F0329 +CT=9DD52789EFE3FFB99F33B3DA5030109A + +I=60 +KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +PT=61773457F068C376C7829B93E696E716 +CT=ABBB755E4621EF8F1214C19F649FB9FD + +I=61 +KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +PT=A34F0CAE726CCE41DD498747D891B967 +CT=DA27FB8174357BCE2BED0E7354F380F9 + +I=62 +KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 +PT=856F59496C7388EE2D2B1A27B7697847 +CT=C59A0663F0993838F6E5856593BDC5EF + +I=63 +KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E +PT=CB090C593EF7720BD95908FB93B49DF4 +CT=ED60B264B5213E831607A99C0CE5E57E + +I=64 +KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +PT=A0AC75CD2F1923D460FC4D457AD95BAF +CT=E50548746846F3EB77B8C520640884ED + +I=65 +KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E +PT=2A2B282974777689E8E9EEEF525D5C5F +CT=28282CC7D21D6A2923641E52D188EF0C + +I=66 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 +PT=909192939390919E0F0E09089788898A +CT=0DFA5B02ABB18E5A815305216D6D4F8E + +I=67 +KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=777675748D8E8F907170777649464744 +CT=7359635C0EECEFE31D673395FB46FB99 + +I=68 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 +PT=717073720605040B2D2C2B2A05FAFBF9 +CT=73C679F7D5AEF2745C9737BB4C47FB36 + +I=69 +KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E +PT=64656667FEFDFCC31B1A1D1CA5AAABA8 +CT=B192BD472A4D2EAFB786E97458967626 + +I=70 +KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +PT=DBDAD9D86A696867B5B4B3B2C8D7D6D5 +CT=0EC327F6C8A2B147598CA3FDE61DC6A4 + +I=71 +KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E +PT=5C5D5E5FE3E0E1FE31303736333C3D3E +CT=FC418EB3C41B859B38D4B6F646629729 + +I=72 +KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +PT=545556574B48494673727574546B6A69 +CT=30249E5AC282B1C981EA64B609F3A154 + +I=73 +KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +PT=ECEDEEEFC6C5C4BB56575051F5FAFBF8 +CT=5E6E08646D12150776BB43C2D78A9703 + +I=74 +KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 +PT=464744452724252AC9C8CFCED2CDCCCF +CT=FAEB3D5DE652CD3447DCEB343F30394A + +I=75 +KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E +PT=E6E7E4E54142435C878681801C131211 +CT=A8E88706823F6993EF80D05C1C7B2CF0 + +I=76 +KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +PT=72737071CFCCCDC2F9F8FFFE710E0F0C +CT=8CED86677E6E00A1A1B15968F2D3CCE6 + +I=77 +KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E +PT=505152537370714EC3C2C5C4010E0F0C +CT=9FC7C23858BE03BDEBB84E90DB6786A9 + +I=78 +KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 +PT=A8A9AAAB5C5F5E51AEAFA8A93D222320 +CT=B4FBD65B33F70D8CF7F1111AC4649C36 + +I=79 +KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +PT=DEDFDCDDF6F5F4EB10111617FEF1F0F3 +CT=C5C32D5ED03C4B53CC8C1BD0EF0DBBF6 + +I=80 +KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +PT=BDBCBFBE5E5D5C530B0A0D0CFAC5C4C7 +CT=D1A7F03B773E5C212464B63709C6A891 + +I=81 +KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E +PT=8A8B8889050606F8F4F5F2F3636C6D6E +CT=6B7161D8745947AC6950438EA138D028 + +I=82 +KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 +PT=A6A7A4A54D4E4F40B2B3B4B539262724 +CT=FD47A9F7E366EE7A09BC508B00460661 + +I=83 +KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E +PT=9C9D9E9FE9EAEBF40E0F08099B949596 +CT=00D40B003DC3A0D9310B659B98C7E416 + +I=84 +KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 +PT=2D2C2F2E1013121DCCCDCACBED121310 +CT=EEA4C79DCC8E2BDA691F20AC48BE0717 + +I=85 +KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +PT=F4F5F6F7EDEEEFD0EAEBECEDF7F8F9FA +CT=E78F43B11C204403E5751F89D05A2509 + +I=86 +KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +PT=3D3C3F3E282B2A2573727574150A0B08 +CT=D0F0E3D1F1244BB979931E38DD1786EF + +I=87 +KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E +PT=B6B7B4B5F8FBFAE5B4B5B2B3A0AFAEAD +CT=042E639DC4E1E4DDE7B75B749EA6F765 + +I=88 +KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 +PT=B7B6B5B4989B9A95878681809BA4A5A6 +CT=BC032FDD0EFE29503A980A7D07AB46A8 + +I=89 +KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E +PT=A8A9AAABE5E6E798E9E8EFEE4748494A +CT=0C93AC949C0DA6446EFFB86183B6C910 + +I=90 +KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 +PT=ECEDEEEFD9DADBD4B9B8BFBE657A7B78 +CT=E0D343E14DA75C917B4A5CEC4810D7C2 + +I=91 +KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +PT=7F7E7D7C696A6B74CACBCCCD929D9C9F +CT=0EAFB821748408279B937B626792E619 + +I=92 +KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +PT=08090A0B0605040BFFFEF9F8B9C6C7C4 +CT=FA1AC6E02D23B106A1FEF18B274A553F + +I=93 +KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +PT=08090A0BF1F2F3CCFCFDFAFB68676665 +CT=0DADFE019CD12368075507DF33C1A1E9 + +I=94 +KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 +PT=CACBC8C93A393837050403020D121310 +CT=3A0879B414465D9FFBAF86B33A63A1B9 + +I=95 +KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E +PT=E9E8EBEA8281809F8F8E8988343B3A39 +CT=62199FADC76D0BE1805D3BA0B7D914BF + +I=96 +KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +PT=515053524645444BD0D1D6D7340B0A09 +CT=1B06D6C5D333E742730130CF78E719B4 + +I=97 +KEY=78797A7B7D7E7F80828384858788898A8C8D8E8F91929394969798999B9C9D9E +PT=42434041ECEFEE1193929594C6C9C8CB +CT=F1F848824C32E9DCDCBF21580F069329 + +I=98 +KEY=A0A1A2A3A5A6A7A8AAABACADAFB0B1B2B4B5B6B7B9BABBBCBEBFC0C1C3C4C5C6 +PT=EFEEEDECC2C1C0CF76777071455A5B58 +CT=1A09050CBD684F784D8E965E0782F28A + +I=99 +KEY=C8C9CACBCDCECFD0D2D3D4D5D7D8D9DADCDDDEDFE1E2E3E4E6E7E8E9EBECEDEE +PT=5F5E5D5C3F3C3D221D1C1B1A19161714 +CT=79C2969E7DED2BA7D088F3F320692360 + +I=100 +KEY=F0F1F2F3F5F6F7F8FAFBFCFDFE01000204050607090A0B0C0E0F101113141516 +PT=000102034142434C1C1D1A1B8D727371 +CT=091A658A2F7444C16ACCB669450C7B63 + +I=101 +KEY=18191A1B1D1E1F20222324252728292A2C2D2E2F31323334363738393B3C3D3E +PT=8E8F8C8DB1B2B38C56575051050A0B08 +CT=97C1E3A72CCA65FA977D5ED0E8A7BBFC + +I=102 +KEY=40414243454647484A4B4C4D4F50515254555657595A5B5C5E5F606163646566 +PT=A7A6A5A4E8EBEAE57F7E7978CAD5D4D7 +CT=70C430C6DB9A17828937305A2DF91A2A + +I=103 +KEY=68696A6B6D6E6F70727374757778797A7C7D7E7F81828384868788898B8C8D8E +PT=8A8B888994979689454443429F909192 +CT=629553457FBE2479098571C7C903FDE8 + +I=104 +KEY=90919293959697989A9B9C9D9FA0A1A2A4A5A6A7A9AAABACAEAFB0B1B3B4B5B6 +PT=8C8D8E8FE0E3E2ED45444342F1CECFCC +CT=A25B25A61F612669E7D91265C7D476BA + +I=105 +KEY=B8B9BABBBDBEBFC0C2C3C4C5C7C8C9CACCCDCECFD1D2D3D4D6D7D8D9DBDCDDDE +PT=FFFEFDFC4C4F4E31D8D9DEDFB6B9B8BB +CT=EB7E4E49B8AE0F024570DDA293254FED + +I=106 +KEY=E0E1E2E3E5E6E7E8EAEBECEDEFF0F1F2F4F5F6F7F9FAFBFCFEFE010103040506 +PT=FDFCFFFECCCFCEC12F2E29286679787B +CT=38FE15D61CCA84516E924ADCE5014F67 + +I=107 +KEY=08090A0B0D0E0F10121314151718191A1C1D1E1F21222324262728292B2C2D2E +PT=67666564BAB9B8A77071767719161714 +CT=3AD208492249108C9F3EBEB167AD0583 + +I=108 +KEY=30313233353637383A3B3C3D3F40414244454647494A4B4C4E4F505153545556 +PT=9A9B98992D2E2F2084858283245B5A59 +CT=299BA9F9BF5AB05C3580FC26EDD1ED12 + +I=109 +KEY=58595A5B5D5E5F60626364656768696A6C6D6E6F71727374767778797B7C7D7E +PT=A4A5A6A70B0809365C5D5A5B2C232221 +CT=19DC705B857A60FB07717B2EA5717781 + +I=110 +KEY=80818283858687888A8B8C8D8F90919294959697999A9B9C9E9FA0A1A3A4A5A6 +PT=464744455754555AF3F2F5F4AFB0B1B2 +CT=FFC8AEB885B5EFCAD06B6DBEBF92E76B + +I=111 +KEY=A8A9AAABADAEAFB0B2B3B4B5B7B8B9BABCBDBEBFC1C2C3C4C6C7C8C9CBCCCDCE +PT=323330317675746B7273747549464744 +CT=F58900C5E0B385253FF2546250A0142B + +I=112 +KEY=D0D1D2D3D5D6D7D8DADBDCDDDFE0E1E2E4E5E6E7E9EAEBECEEEFF0F1F3F4F5F6 +PT=A8A9AAAB181B1A15808186872B141516 +CT=2EE67B56280BC462429CEE6E3370CBC1 + +I=113 +KEY=F8F9FAFBFDFEFE00020304050708090A0C0D0E0F11121314161718191B1C1D1E +PT=E7E6E5E4202323DDAAABACAD343B3A39 +CT=20DB650A9C8E9A84AB4D25F7EDC8F03F + +I=114 +KEY=20212223252627282A2B2C2D2F30313234353637393A3B3C3E3F404143444546 +PT=A8A9AAAB2221202FEDECEBEA1E010003 +CT=3C36DA169525CF818843805F25B78AE5 + +I=115 +KEY=48494A4B4D4E4F50525354555758595A5C5D5E5F61626364666768696B6C6D6E +PT=F9F8FBFA5F5C5D42424344450E010003 +CT=9A781D960DB9E45E37779042FEA51922 + +I=116 +KEY=70717273757677787A7B7C7D7F80818284858687898A8B8C8E8F909193949596 +PT=57565554F5F6F7F89697909120DFDEDD +CT=6560395EC269C672A3C288226EFDBA77 + +I=117 +KEY=98999A9B9D9E9FA0A2A3A4A5A7A8A9AAACADAEAFB1B2B3B4B6B7B8B9BBBCBDBE +PT=F8F9FAFBCCCFCEF1DDDCDBDA0E010003 +CT=8C772B7A189AC544453D5916EBB27B9A + +I=118 +KEY=C0C1C2C3C5C6C7C8CACBCCCDCFD0D1D2D4D5D6D7D9DADBDCDEDFE0E1E3E4E5E6 +PT=D9D8DBDA7073727D80818687C2DDDCDF +CT=77CA5468CC48E843D05F78EED9D6578F + +I=119 +KEY=E8E9EAEBEDEEEFF0F2F3F4F5F7F8F9FAFCFDFEFF01020304060708090B0C0D0E +PT=C5C4C7C6080B0A1588898E8F68676665 +CT=72CDCC71DC82C60D4429C9E2D8195BAA + +I=120 +KEY=10111213151617181A1B1C1D1F20212224252627292A2B2C2E2F303133343536 +PT=83828180DCDFDED186878081F0CFCECD +CT=8080D68CE60E94B40B5B8B69EEB35AFA + +I=121 +KEY=38393A3B3D3E3F40424344454748494A4C4D4E4F51525354565758595B5C5D5E +PT=98999A9BDDDEDFA079787F7E0A050407 +CT=44222D3CDE299C04369D58AC0EBA1E8E + +I=122 +KEY=60616263656667686A6B6C6D6F70717274757677797A7B7C7E7F808183848586 +PT=CECFCCCD4F4C4D429F9E9998DFC0C1C2 +CT=9B8721B0A8DFC691C5BC5885DBFCB27A + +I=123 +KEY=88898A8B8D8E8F90929394959798999A9C9D9E9FA1A2A3A4A6A7A8A9ABACADAE +PT=404142436665647B29282F2EABA4A5A6 +CT=0DC015CE9A3A3414B5E62EC643384183 + +I=124 +KEY=B0B1B2B3B5B6B7B8BABBBCBDBFC0C1C2C4C5C6C7C9CACBCCCECFD0D1D3D4D5D6 +PT=33323130E6E5E4EB23222524DEA1A0A3 +CT=705715448A8DA412025CE38345C2A148 + +I=125 +KEY=D8D9DADBDDDEDFE0E2E3E4E5E7E8E9EAECEDEEEFF1F2F3F4F6F7F8F9FBFCFDFE +PT=CFCECDCCF6F5F4CBE6E7E0E199969794 +CT=C32B5B0B6FBAE165266C569F4B6ECF0B + +I=126 +KEY=00010203050607080A0B0C0D0F10111214151617191A1B1C1E1F202123242526 +PT=BABBB8B97271707FDCDDDADB29363734 +CT=4DCA6C75192A01DDCA9476AF2A521E87 + +I=127 +KEY=28292A2B2D2E2F30323334353738393A3C3D3E3F41424344464748494B4C4D4E +PT=C9C8CBCA4447465926272021545B5A59 +CT=058691E627ECBC36AC07B6DB423BD698 + +I=128 +KEY=50515253555657585A5B5C5D5F60616264656667696A6B6C6E6F707173747576 +PT=050407067477767956575051221D1C1F +CT=7444527095838FE080FC2BCDD30847EB + ========== \ No newline at end of file --- krb5-1.4.4.orig/src/lib/crypto/aes/test/ecb_vk.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/ecb_vk.txt @@ -1,2334 +1,2334 @@ - -========================= - -FILENAME: "ecb_vk.txt" - -Electronic Codebook (ECB) Mode -Variable Key Known Answer Tests - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========== - -KEYSIZE=128 - -PT=00000000000000000000000000000000 - -I=1 -KEY=80000000000000000000000000000000 -CT=0EDD33D3C621E546455BD8BA1418BEC8 - -I=2 -KEY=40000000000000000000000000000000 -CT=C0CC0C5DA5BD63ACD44A80774FAD5222 - -I=3 -KEY=20000000000000000000000000000000 -CT=2F0B4B71BC77851B9CA56D42EB8FF080 - -I=4 -KEY=10000000000000000000000000000000 -CT=6B1E2FFFE8A114009D8FE22F6DB5F876 - -I=5 -KEY=08000000000000000000000000000000 -CT=9AA042C315F94CBB97B62202F83358F5 - -I=6 -KEY=04000000000000000000000000000000 -CT=DBE01DE67E346A800C4C4B4880311DE4 - -I=7 -KEY=02000000000000000000000000000000 -CT=C117D2238D53836ACD92DDCDB85D6A21 - -I=8 -KEY=01000000000000000000000000000000 -CT=DC0ED85DF9611ABB7249CDD168C5467E - -I=9 -KEY=00800000000000000000000000000000 -CT=807D678FFF1F56FA92DE3381904842F2 - -I=10 -KEY=00400000000000000000000000000000 -CT=0E53B3FCAD8E4B130EF73AEB957FB402 - -I=11 -KEY=00200000000000000000000000000000 -CT=969FFD3B7C35439417E7BDE923035D65 - -I=12 -KEY=00100000000000000000000000000000 -CT=A99B512C19CA56070491166A1503BF15 - -I=13 -KEY=00080000000000000000000000000000 -CT=6E9985252126EE344D26AE369D2327E3 - -I=14 -KEY=00040000000000000000000000000000 -CT=B85F4809F904C275491FCDCD1610387E - -I=15 -KEY=00020000000000000000000000000000 -CT=ED365B8D7D20C1F5D53FB94DD211DF7B - -I=16 -KEY=00010000000000000000000000000000 -CT=B3A575E86A8DB4A7135D604C43304896 - -I=17 -KEY=00008000000000000000000000000000 -CT=89704BCB8E69F846259EB0ACCBC7F8A2 - -I=18 -KEY=00004000000000000000000000000000 -CT=C56EE7C92197861F10D7A92B90882055 - -I=19 -KEY=00002000000000000000000000000000 -CT=92F296F6846E0EAF9422A5A24A08B069 - -I=20 -KEY=00001000000000000000000000000000 -CT=E67E32BB8F11DEB8699318BEE9E91A60 - -I=21 -KEY=00000800000000000000000000000000 -CT=B08EEF85EAF626DD91B65C4C3A97D92B - -I=22 -KEY=00000400000000000000000000000000 -CT=661083A6ADDCE79BB4E0859AB5538013 - -I=23 -KEY=00000200000000000000000000000000 -CT=55DFE2941E0EB10AFC0B333BD34DE1FE - -I=24 -KEY=00000100000000000000000000000000 -CT=6BFE5945E715C9662609770F8846087A - -I=25 -KEY=00000080000000000000000000000000 -CT=79848E9C30C2F8CDA8B325F7FED2B139 - -I=26 -KEY=00000040000000000000000000000000 -CT=7A713A53B99FEF34AC04DEEF80965BD0 - -I=27 -KEY=00000020000000000000000000000000 -CT=18144A2B46620D32C3C32CE52D49257F - -I=28 -KEY=00000010000000000000000000000000 -CT=872E827C70887C80749F7B8BB1847C7E - -I=29 -KEY=00000008000000000000000000000000 -CT=6B86C6A4FE6A60C59B1A3102F8DE49F3 - -I=30 -KEY=00000004000000000000000000000000 -CT=9848BB3DFDF6F532F094679A4C231A20 - -I=31 -KEY=00000002000000000000000000000000 -CT=925AD528E852E329B2091CD3F1C2BCEE - -I=32 -KEY=00000001000000000000000000000000 -CT=80DF436544B0DD596722E46792A40CD8 - -I=33 -KEY=00000000800000000000000000000000 -CT=525DAF18F93E83E1E74BBBDDE4263BBA - -I=34 -KEY=00000000400000000000000000000000 -CT=F65C9D2EE485D24701FFA3313B9D5BE6 - -I=35 -KEY=00000000200000000000000000000000 -CT=E4FC8D8BCA06425BDF94AFA40FCC14BA - -I=36 -KEY=00000000100000000000000000000000 -CT=A53F0A5CA1E4E6440BB975FF320DE6F8 - -I=37 -KEY=00000000080000000000000000000000 -CT=D55313B9394080462E87E02899B553F0 - -I=38 -KEY=00000000040000000000000000000000 -CT=34A71D761F71BCD344384C7F97D27906 - -I=39 -KEY=00000000020000000000000000000000 -CT=233F3D819599612EBC89580245C996A8 - -I=40 -KEY=00000000010000000000000000000000 -CT=B4F1374E5268DBCB676E447529E53F89 - -I=41 -KEY=00000000008000000000000000000000 -CT=0816BD27861D2BA891D1044E39951E96 - -I=42 -KEY=00000000004000000000000000000000 -CT=F3BE9EA3F10C73CA64FDE5DB13A951D1 - -I=43 -KEY=00000000002000000000000000000000 -CT=2448086A8106FBD03048DDF857D3F1C8 - -I=44 -KEY=00000000001000000000000000000000 -CT=670756E65BEC8B68F03D77CDCDCE7B91 - -I=45 -KEY=00000000000800000000000000000000 -CT=EF968CF0D36FD6C6EFFD225F6FB44CA9 - -I=46 -KEY=00000000000400000000000000000000 -CT=2E8767157922E3826DDCEC1B0CC1E105 - -I=47 -KEY=00000000000200000000000000000000 -CT=78CE7EEC670E45A967BAB17E26A1AD36 - -I=48 -KEY=00000000000100000000000000000000 -CT=3C5CEE825655F098F6E81A2F417DA3FB - -I=49 -KEY=00000000000080000000000000000000 -CT=67BFDB431DCE1292200BC6F5207ADB12 - -I=50 -KEY=00000000000040000000000000000000 -CT=7540FD38E447C0779228548747843A6F - -I=51 -KEY=00000000000020000000000000000000 -CT=B85E513301F8A936EA9EC8A21A85B5E6 - -I=52 -KEY=00000000000010000000000000000000 -CT=04C67DBF16C11427D507A455DE2C9BC5 - -I=53 -KEY=00000000000008000000000000000000 -CT=03F75EB8959E55079CFFB4FF149A37B6 - -I=54 -KEY=00000000000004000000000000000000 -CT=74550287F666C63BB9BC7838433434B0 - -I=55 -KEY=00000000000002000000000000000000 -CT=7D537200195EBC3AEFD1EAAB1C385221 - -I=56 -KEY=00000000000001000000000000000000 -CT=CE24E4D40C68A82B535CBD3C8E21652A - -I=57 -KEY=00000000000000800000000000000000 -CT=AB20072405AA8FC40265C6F1F3DC8BC0 - -I=58 -KEY=00000000000000400000000000000000 -CT=6CFD2CF688F566B093F67B9B3839E80A - -I=59 -KEY=00000000000000200000000000000000 -CT=BD95977E6B7239D407A012C5544BF584 - -I=60 -KEY=00000000000000100000000000000000 -CT=DF9C0130AC77E7C72C997F587B46DBE0 - -I=61 -KEY=00000000000000080000000000000000 -CT=E7F1B82CADC53A648798945B34EFEFF2 - -I=62 -KEY=00000000000000040000000000000000 -CT=932C6DBF69255CF13EDCDB72233ACEA3 - -I=63 -KEY=00000000000000020000000000000000 -CT=5C76002BC7206560EFE550C80B8F12CC - -I=64 -KEY=00000000000000010000000000000000 -CT=F6B7BDD1CAEEBAB574683893C4475484 - -I=65 -KEY=00000000000000008000000000000000 -CT=A920E37CC6DC6B31DA8C0169569F5034 - -I=66 -KEY=00000000000000004000000000000000 -CT=919380ECD9C778BC513148B0C28D65FD - -I=67 -KEY=00000000000000002000000000000000 -CT=EE67308DD3F2D9E6C2170755E5784BE1 - -I=68 -KEY=00000000000000001000000000000000 -CT=3CC73E53B85609023A05E149B223AE09 - -I=69 -KEY=00000000000000000800000000000000 -CT=983E8AF7CF05EBB28D71EB841C9406E6 - -I=70 -KEY=00000000000000000400000000000000 -CT=0F3099B2D31FA5299EE5BF43193287FC - -I=71 -KEY=00000000000000000200000000000000 -CT=B763D84F38C27FE6931DCEB6715D4DB6 - -I=72 -KEY=00000000000000000100000000000000 -CT=5AE3C9B0E3CC29C0C61565CD01F8A248 - -I=73 -KEY=00000000000000000080000000000000 -CT=F58083572CD90981958565D48D2DEE25 - -I=74 -KEY=00000000000000000040000000000000 -CT=7E6255EEF8F70C0EF10337AAB1CCCEF8 - -I=75 -KEY=00000000000000000020000000000000 -CT=AAD4BAC34DB22821841CE2F631961902 - -I=76 -KEY=00000000000000000010000000000000 -CT=D7431C0409BB1441BA9C6858DC7D4E81 - -I=77 -KEY=00000000000000000008000000000000 -CT=EF9298C65E339F6E801A59C626456993 - -I=78 -KEY=00000000000000000004000000000000 -CT=53FE29F68FF541ABC3F0EF3350B72F7E - -I=79 -KEY=00000000000000000002000000000000 -CT=F6BBA5C10DB02529E2C2DA3FB582CC14 - -I=80 -KEY=00000000000000000001000000000000 -CT=E4239AA37FC531A386DAD1126FC0E9CD - -I=81 -KEY=00000000000000000000800000000000 -CT=8F7758F857D15BBE7BFD0E416404C365 - -I=82 -KEY=00000000000000000000400000000000 -CT=D273EB57C687BCD1B4EA7218A509E7B8 - -I=83 -KEY=00000000000000000000200000000000 -CT=65D64F8D76E8B3423FA25C4EB58A210A - -I=84 -KEY=00000000000000000000100000000000 -CT=623D802B4EC450D66A16625702FCDBE0 - -I=85 -KEY=00000000000000000000080000000000 -CT=7496460CB28E5791BAEAF9B68FB00022 - -I=86 -KEY=00000000000000000000040000000000 -CT=34EA600F18BB0694B41681A49D510C1D - -I=87 -KEY=00000000000000000000020000000000 -CT=5F8FF0D47D5766D29B5D6E8F46423BD8 - -I=88 -KEY=00000000000000000000010000000000 -CT=225F9286C5928BF09F84D3F93F541959 - -I=89 -KEY=00000000000000000000008000000000 -CT=B21E90D25DF383416A5F072CEBEB1FFB - -I=90 -KEY=00000000000000000000004000000000 -CT=4AEFCDA089318125453EB9E8EB5E492E - -I=91 -KEY=00000000000000000000002000000000 -CT=4D3E75C6CD40EC4869BC85158591ADB8 - -I=92 -KEY=00000000000000000000001000000000 -CT=63A8B904405436A1B99D7751866771B7 - -I=93 -KEY=00000000000000000000000800000000 -CT=64F0DAAE47529199792EAE172BA53293 - -I=94 -KEY=00000000000000000000000400000000 -CT=C3EEF84BEA18225D515A8C852A9047EE - -I=95 -KEY=00000000000000000000000200000000 -CT=A44AC422B47D47B81AF73B3E9AC9596E - -I=96 -KEY=00000000000000000000000100000000 -CT=D16E04A8FBC435094F8D53ADF25F5084 - -I=97 -KEY=00000000000000000000000080000000 -CT=EF13DC34BAB03E124EEAD8B6BF44B532 - -I=98 -KEY=00000000000000000000000040000000 -CT=D94799075C24DCC067AF0D392049250D - -I=99 -KEY=00000000000000000000000020000000 -CT=14F431771EDDCE4764C21A2254B5E3C8 - -I=100 -KEY=00000000000000000000000010000000 -CT=7039329F36F2ED682B02991F28D64679 - -I=101 -KEY=00000000000000000000000008000000 -CT=124EE24EDE5551639DB8B8B941F6141D - -I=102 -KEY=00000000000000000000000004000000 -CT=C2852879A34D5184E478EC918B993FEE - -I=103 -KEY=00000000000000000000000002000000 -CT=86A806A3525B93E432053C9AB5ABBEDF - -I=104 -KEY=00000000000000000000000001000000 -CT=C1609BF5A4F07E37C17A36366EC23ECC - -I=105 -KEY=00000000000000000000000000800000 -CT=7E81E7CB92159A51FFCEA331B1E8EA53 - -I=106 -KEY=00000000000000000000000000400000 -CT=37A7BE002856C5A59A6E03EAFCE7729A - -I=107 -KEY=00000000000000000000000000200000 -CT=BDF98A5A4F91E890C9A1D1E5FAAB138F - -I=108 -KEY=00000000000000000000000000100000 -CT=4E96ACB66E051F2BC739CC3D3E34A26B - -I=109 -KEY=00000000000000000000000000080000 -CT=EE996CDD120EB86E21ECFA49E8E1FCF1 - -I=110 -KEY=00000000000000000000000000040000 -CT=61B9E6B579DBF6070C351A1440DD85FF - -I=111 -KEY=00000000000000000000000000020000 -CT=AC369E484316440B40DFC83AA96E28E7 - -I=112 -KEY=00000000000000000000000000010000 -CT=0A2D16DE985C76D45C579C1159413BBE - -I=113 -KEY=00000000000000000000000000008000 -CT=DA3FDC38DA1D374FA4802CDA1A1C6B0F - -I=114 -KEY=00000000000000000000000000004000 -CT=B842523D4C41C2211AFE43A5800ADCE3 - -I=115 -KEY=00000000000000000000000000002000 -CT=9E2CDA90D8E992DBA6C73D8229567192 - -I=116 -KEY=00000000000000000000000000001000 -CT=D49583B781D9E20F5BE101415957FC49 - -I=117 -KEY=00000000000000000000000000000800 -CT=EF09DA5C12B376E458B9B8670032498E - -I=118 -KEY=00000000000000000000000000000400 -CT=A96BE0463DA774461A5E1D5A9DD1AC10 - -I=119 -KEY=00000000000000000000000000000200 -CT=32CEE3341060790D2D4B1362EF397090 - -I=120 -KEY=00000000000000000000000000000100 -CT=21CEA416A3D3359D2C4D58FB6A035F06 - -I=121 -KEY=00000000000000000000000000000080 -CT=172AEAB3D507678ECAF455C12587ADB7 - -I=122 -KEY=00000000000000000000000000000040 -CT=B6F897941EF8EBFF9FE80A567EF38478 - -I=123 -KEY=00000000000000000000000000000020 -CT=A9723259D94A7DC662FB0C782CA3F1DD - -I=124 -KEY=00000000000000000000000000000010 -CT=2F91C984B9A4839F30001B9F430493B4 - -I=125 -KEY=00000000000000000000000000000008 -CT=0472406345A610B048CB99EE0EF3FA0F - -I=126 -KEY=00000000000000000000000000000004 -CT=F5F39086646F8C05ED16EFA4B617957C - -I=127 -KEY=00000000000000000000000000000002 -CT=26D50F485A30408D5AF47A5736292450 - -I=128 -KEY=00000000000000000000000000000001 -CT=0545AAD56DA2A97C3663D1432A3D1C84 - -========== - -KEYSIZE=192 - -PT=00000000000000000000000000000000 - -I=1 -KEY=800000000000000000000000000000000000000000000000 -CT=DE885DC87F5A92594082D02CC1E1B42C - -I=2 -KEY=400000000000000000000000000000000000000000000000 -CT=C749194F94673F9DD2AA1932849630C1 - -I=3 -KEY=200000000000000000000000000000000000000000000000 -CT=0CEF643313912934D310297B90F56ECC - -I=4 -KEY=100000000000000000000000000000000000000000000000 -CT=C4495D39D4A553B225FBA02A7B1B87E1 - -I=5 -KEY=080000000000000000000000000000000000000000000000 -CT=636D10B1A0BCAB541D680A7970ADC830 - -I=6 -KEY=040000000000000000000000000000000000000000000000 -CT=07CF045786BD6AFCC147D99E45A901A7 - -I=7 -KEY=020000000000000000000000000000000000000000000000 -CT=6A8E3F425A7599348F95398448827976 - -I=8 -KEY=010000000000000000000000000000000000000000000000 -CT=5518276836148A00D91089A20D8BFF57 - -I=9 -KEY=008000000000000000000000000000000000000000000000 -CT=F267E07B5E87E3BC20B969C61D4FCB06 - -I=10 -KEY=004000000000000000000000000000000000000000000000 -CT=5A1CDE69571D401BFCD20DEBADA2212C - -I=11 -KEY=002000000000000000000000000000000000000000000000 -CT=70A9057263254701D12ADD7D74CD509E - -I=12 -KEY=001000000000000000000000000000000000000000000000 -CT=35713A7E108031279388A33A0FE2E190 - -I=13 -KEY=000800000000000000000000000000000000000000000000 -CT=E74EDE82B1254714F0C7B4B243108655 - -I=14 -KEY=000400000000000000000000000000000000000000000000 -CT=39272E3100FAA37B55B862320D1B3EB3 - -I=15 -KEY=000200000000000000000000000000000000000000000000 -CT=6D6E24C659FC5AEF712F77BCA19C9DD0 - -I=16 -KEY=000100000000000000000000000000000000000000000000 -CT=76D18212F972370D3CC2C6C372C6CF2F - -I=17 -KEY=000080000000000000000000000000000000000000000000 -CT=B21A1F0BAE39E55C7594ED570A7783EA - -I=18 -KEY=000040000000000000000000000000000000000000000000 -CT=77DE202111895AC48DD1C974B358B458 - -I=19 -KEY=000020000000000000000000000000000000000000000000 -CT=67810B311969012AAF7B504FFAF39FD1 - -I=20 -KEY=000010000000000000000000000000000000000000000000 -CT=C22EA2344D3E9417A6BA07843E713AEA - -I=21 -KEY=000008000000000000000000000000000000000000000000 -CT=C79CAF4B97BEE0BD0630AB354539D653 - -I=22 -KEY=000004000000000000000000000000000000000000000000 -CT=135FD1AF761D9AE23DF4AA6B86760DB4 - -I=23 -KEY=000002000000000000000000000000000000000000000000 -CT=D4659D0B06ACD4D56AB8D11A16FD83B9 - -I=24 -KEY=000001000000000000000000000000000000000000000000 -CT=F7D270028FC188E4E4F35A4AAA25D4D4 - -I=25 -KEY=000000800000000000000000000000000000000000000000 -CT=345CAE5A8C9620A9913D5473985852FF - -I=26 -KEY=000000400000000000000000000000000000000000000000 -CT=4E8980ADDE60B0E42C0B287FEA41E729 - -I=27 -KEY=000000200000000000000000000000000000000000000000 -CT=F11B6D74E1F15155633DC39743C1A527 - -I=28 -KEY=000000100000000000000000000000000000000000000000 -CT=9C87916C0180064F9D3179C6F5DD8C35 - -I=29 -KEY=000000080000000000000000000000000000000000000000 -CT=71AB186BCAEA518E461D4F7FAD230E6A - -I=30 -KEY=000000040000000000000000000000000000000000000000 -CT=C4A31BBC3DAAF742F9141C2A5001A49C - -I=31 -KEY=000000020000000000000000000000000000000000000000 -CT=E7C47B7B1D40F182A8928C8A55671D07 - -I=32 -KEY=000000010000000000000000000000000000000000000000 -CT=8E17F294B28FA373C6249538868A7EEF - -I=33 -KEY=000000008000000000000000000000000000000000000000 -CT=754404096A5CBC08AF09491BE249141A - -I=34 -KEY=000000004000000000000000000000000000000000000000 -CT=101CB56E55F05D86369B6D1069204F0A - -I=35 -KEY=000000002000000000000000000000000000000000000000 -CT=73F19BB6604205C6EE227B9759791E41 - -I=36 -KEY=000000001000000000000000000000000000000000000000 -CT=6270C0028F0D136C37A56B2CB64D24D6 - -I=37 -KEY=000000000800000000000000000000000000000000000000 -CT=A3BF7C2C38D1114A087ECF212E694346 - -I=38 -KEY=000000000400000000000000000000000000000000000000 -CT=49CABFF2CEF7D9F95F5EFB1F7A1A7DDE - -I=39 -KEY=000000000200000000000000000000000000000000000000 -CT=EC7F8A47CC59B849469255AD49F62752 - -I=40 -KEY=000000000100000000000000000000000000000000000000 -CT=68FAE55A13EFAF9B07B3552A8A0DC9D1 - -I=41 -KEY=000000000080000000000000000000000000000000000000 -CT=211E6B19C69FAEF481F64F24099CDA65 - -I=42 -KEY=000000000040000000000000000000000000000000000000 -CT=DBB918C75BC5732416F79FB0C8EE4C5C - -I=43 -KEY=000000000020000000000000000000000000000000000000 -CT=98D494E5D963A6C8B92536D3EC35E3FD - -I=44 -KEY=000000000010000000000000000000000000000000000000 -CT=C9A873404D403D6F074190851D67781A - -I=45 -KEY=000000000008000000000000000000000000000000000000 -CT=073AEF4A7C77D921928CB0DD9D27CAE7 - -I=46 -KEY=000000000004000000000000000000000000000000000000 -CT=89BDE25CEE36FDE769A10E52298CF90F - -I=47 -KEY=000000000002000000000000000000000000000000000000 -CT=26D0842D37EAD38557C65E0A5E5F122E - -I=48 -KEY=000000000001000000000000000000000000000000000000 -CT=F8294BA375AF46B3F22905BBAFFAB107 - -I=49 -KEY=000000000000800000000000000000000000000000000000 -CT=2AD63EB4D0D43813B979CF72B35BDB94 - -I=50 -KEY=000000000000400000000000000000000000000000000000 -CT=7710C171EE0F4EFA39BE4C995180181D - -I=51 -KEY=000000000000200000000000000000000000000000000000 -CT=C0CB2B40DBA7BE8C0698FAE1E4B80FF8 - -I=52 -KEY=000000000000100000000000000000000000000000000000 -CT=97970E505194622FD955CA1B80B784E9 - -I=53 -KEY=000000000000080000000000000000000000000000000000 -CT=7CB1824B29F850900DF2CAD9CF04C1CF - -I=54 -KEY=000000000000040000000000000000000000000000000000 -CT=FDF4F036BB988E42F2F62DE63FE19A64 - -I=55 -KEY=000000000000020000000000000000000000000000000000 -CT=08908CFE2C82606B2C15DF61B75CF3E2 - -I=56 -KEY=000000000000010000000000000000000000000000000000 -CT=B3AA689EF2D07FF365ACB9ADBA2AF07A - -I=57 -KEY=000000000000008000000000000000000000000000000000 -CT=F2672CD8EAA3B98776660D0263656F5C - -I=58 -KEY=000000000000004000000000000000000000000000000000 -CT=5BDEAC00E986687B9E1D94A0DA7BF452 - -I=59 -KEY=000000000000002000000000000000000000000000000000 -CT=E6D57BD66EA1627363EE0C4B711B0B21 - -I=60 -KEY=000000000000001000000000000000000000000000000000 -CT=03730DD6ACB4AD9996A63BE7765EC06F - -I=61 -KEY=000000000000000800000000000000000000000000000000 -CT=A470E361AA5437B2BE8586D2F78DE582 - -I=62 -KEY=000000000000000400000000000000000000000000000000 -CT=7567FEEFA559911FD479670246B484E3 - -I=63 -KEY=000000000000000200000000000000000000000000000000 -CT=29829DEA15A4E7A4C049045E7B106E29 - -I=64 -KEY=000000000000000100000000000000000000000000000000 -CT=A407834C3D89D48A2CB7A152208FA4ED - -I=65 -KEY=000000000000000080000000000000000000000000000000 -CT=68F948053F78FEF0D8F9FE7EF3A89819 - -I=66 -KEY=000000000000000040000000000000000000000000000000 -CT=B605174CAB13AD8FE3B20DA3AE7B0234 - -I=67 -KEY=000000000000000020000000000000000000000000000000 -CT=CCAB8F0AEBFF032893996D383CBFDBFA - -I=68 -KEY=000000000000000010000000000000000000000000000000 -CT=AF14BB8428C9730B7DC17B6C1CBEBCC8 - -I=69 -KEY=000000000000000008000000000000000000000000000000 -CT=5A41A21332040877EB7B89E8E80D19FE - -I=70 -KEY=000000000000000004000000000000000000000000000000 -CT=AC1BA52EFCDDE368B1596F2F0AD893A0 - -I=71 -KEY=000000000000000002000000000000000000000000000000 -CT=41B890E31B9045E6ECDC1BC3F2DB9BCC - -I=72 -KEY=000000000000000001000000000000000000000000000000 -CT=4D54A549728E55B19A23660424A0F146 - -I=73 -KEY=000000000000000000800000000000000000000000000000 -CT=A917581F41C47C7DDCFFD5285E2D6A61 - -I=74 -KEY=000000000000000000400000000000000000000000000000 -CT=604DF24BA6099B93A7405A524D764FCB - -I=75 -KEY=000000000000000000200000000000000000000000000000 -CT=78D9D156F28B190E232D1B7AE7FC730A - -I=76 -KEY=000000000000000000100000000000000000000000000000 -CT=5A12C39E442CD7F27B3CD77F5D029582 - -I=77 -KEY=000000000000000000080000000000000000000000000000 -CT=FF2BF2F47CF7B0F28EE25AF95DBF790D - -I=78 -KEY=000000000000000000040000000000000000000000000000 -CT=1863BB7D193BDA39DF090659EB8AE48B - -I=79 -KEY=000000000000000000020000000000000000000000000000 -CT=38178F2FB4CFCF31E87E1ABCDC023EB5 - -I=80 -KEY=000000000000000000010000000000000000000000000000 -CT=F5B13DC690CC0D541C6BA533023DC8C9 - -I=81 -KEY=000000000000000000008000000000000000000000000000 -CT=48EC05238D7375D126DC9D08884D4827 - -I=82 -KEY=000000000000000000004000000000000000000000000000 -CT=ACD0D81139691B310B92A6E377BACC87 - -I=83 -KEY=000000000000000000002000000000000000000000000000 -CT=9A4AA43578B55CE9CC178F0D2E162C79 - -I=84 -KEY=000000000000000000001000000000000000000000000000 -CT=08AD94BC737DB3C87D49B9E01B720D81 - -I=85 -KEY=000000000000000000000800000000000000000000000000 -CT=3BCFB2D5D210E8332900C5991D551A2A - -I=86 -KEY=000000000000000000000400000000000000000000000000 -CT=C5F0C6B9397ACB29635CE1A0DA2D8D96 - -I=87 -KEY=000000000000000000000200000000000000000000000000 -CT=844A29EFC693E2FA9900F87FBF5DCD5F - -I=88 -KEY=000000000000000000000100000000000000000000000000 -CT=5126A1C41051FEA158BE41200E1EA59D - -I=89 -KEY=000000000000000000000080000000000000000000000000 -CT=302123CA7B4F46D667FFFB0EB6AA7703 - -I=90 -KEY=000000000000000000000040000000000000000000000000 -CT=A9D16BCE7DB5C024277709EE2A88D91A - -I=91 -KEY=000000000000000000000020000000000000000000000000 -CT=F013C5EC123A26CFC34B598C992A996B - -I=92 -KEY=000000000000000000000010000000000000000000000000 -CT=E38A825CD971A1D2E56FB1DBA248F2A8 - -I=93 -KEY=000000000000000000000008000000000000000000000000 -CT=6E701773C0311E0BD4C5A097406D22B3 - -I=94 -KEY=000000000000000000000004000000000000000000000000 -CT=754262CEF0C64BE4C3E67C35ABE439F7 - -I=95 -KEY=000000000000000000000002000000000000000000000000 -CT=C9C2D4C47DF7D55CFA0EE5F1FE5070F4 - -I=96 -KEY=000000000000000000000001000000000000000000000000 -CT=6AB4BEA85B172573D8BD2D5F4329F13D - -I=97 -KEY=000000000000000000000000800000000000000000000000 -CT=11F03EF28E2CC9AE5165C587F7396C8C - -I=98 -KEY=000000000000000000000000400000000000000000000000 -CT=0682F2EB1A68BAC7949922C630DD27FA - -I=99 -KEY=000000000000000000000000200000000000000000000000 -CT=ABB0FEC0413D659AFE8E3DCF6BA873BB - -I=100 -KEY=000000000000000000000000100000000000000000000000 -CT=FE86A32E19F805D6569B2EFADD9C92AA - -I=101 -KEY=000000000000000000000000080000000000000000000000 -CT=E434E472275D1837D3D717F2EECC88C3 - -I=102 -KEY=000000000000000000000000040000000000000000000000 -CT=74E57DCD12A21D26EF8ADAFA5E60469A - -I=103 -KEY=000000000000000000000000020000000000000000000000 -CT=C275429D6DAD45DDD423FA63C816A9C1 - -I=104 -KEY=000000000000000000000000010000000000000000000000 -CT=7F6EC1A9AE729E86F7744AED4B8F4F07 - -I=105 -KEY=000000000000000000000000008000000000000000000000 -CT=48B5A71AB9292BD4F9E608EF102636B2 - -I=106 -KEY=000000000000000000000000004000000000000000000000 -CT=076FB95D5F536C78CBED3181BCCF3CF1 - -I=107 -KEY=000000000000000000000000002000000000000000000000 -CT=BFA76BEA1E684FD3BF9256119EE0BC0F - -I=108 -KEY=000000000000000000000000001000000000000000000000 -CT=7D395923D56577F3FF8670998F8C4A71 - -I=109 -KEY=000000000000000000000000000800000000000000000000 -CT=BA02C986E529AC18A882C34BA389625F - -I=110 -KEY=000000000000000000000000000400000000000000000000 -CT=3DFCF2D882AFE75D3A191193013A84B5 - -I=111 -KEY=000000000000000000000000000200000000000000000000 -CT=FAD1FDE1D0241784B63080D2C74D236C - -I=112 -KEY=000000000000000000000000000100000000000000000000 -CT=7D6C80D39E41F007A14FB9CD2B2C15CD - -I=113 -KEY=000000000000000000000000000080000000000000000000 -CT=7975F401FC10637BB33EA2DB058FF6EC - -I=114 -KEY=000000000000000000000000000040000000000000000000 -CT=657983865C55A818F02B7FCD52ED7E99 - -I=115 -KEY=000000000000000000000000000020000000000000000000 -CT=B32BEB1776F9827FF4C3AC9997E84B20 - -I=116 -KEY=000000000000000000000000000010000000000000000000 -CT=2AE2C7C374F0A41E3D46DBC3E66BB59F - -I=117 -KEY=000000000000000000000000000008000000000000000000 -CT=4D835E4ABDD4BDC6B88316A6E931A07F - -I=118 -KEY=000000000000000000000000000004000000000000000000 -CT=E07EFABFF1C353F7384EBB87B435A3F3 - -I=119 -KEY=000000000000000000000000000002000000000000000000 -CT=ED3088DC3FAF89AD87B4356FF1BB09C2 - -I=120 -KEY=000000000000000000000000000001000000000000000000 -CT=4324D01140C156FC898C2E32BA03FB05 - -I=121 -KEY=000000000000000000000000000000800000000000000000 -CT=BE15D016FACB5BAFBC24FA9289132166 - -I=122 -KEY=000000000000000000000000000000400000000000000000 -CT=AC9B7048EDB1ACF4D97A5B0B3F50884B - -I=123 -KEY=000000000000000000000000000000200000000000000000 -CT=448BECE1F86C7845DFA9A4BB2A016FB3 - -I=124 -KEY=000000000000000000000000000000100000000000000000 -CT=10DD445E87686EB46EA9B1ABC49257F0 - -I=125 -KEY=000000000000000000000000000000080000000000000000 -CT=B7FCCF7659FA756D4B7303EEA6C07458 - -I=126 -KEY=000000000000000000000000000000040000000000000000 -CT=289117115CA3513BAA7640B1004872C2 - -I=127 -KEY=000000000000000000000000000000020000000000000000 -CT=57CB42F7EE7186051F50B93FFA7B35BF - -I=128 -KEY=000000000000000000000000000000010000000000000000 -CT=F2741BFBFB81663B9136802FB9C3126A - -I=129 -KEY=000000000000000000000000000000008000000000000000 -CT=E32DDDC5C7398C096E3BD535B31DB5CE - -I=130 -KEY=000000000000000000000000000000004000000000000000 -CT=81D3C204E608AF9CC713EAEBCB72433F - -I=131 -KEY=000000000000000000000000000000002000000000000000 -CT=D4DEEF4BFC36AAA579496E6935F8F98E - -I=132 -KEY=000000000000000000000000000000001000000000000000 -CT=C356DB082B97802B038571C392C5C8F6 - -I=133 -KEY=000000000000000000000000000000000800000000000000 -CT=A3919ECD4861845F2527B77F06AC6A4E - -I=134 -KEY=000000000000000000000000000000000400000000000000 -CT=A53858E17A2F802A20E40D44494FFDA0 - -I=135 -KEY=000000000000000000000000000000000200000000000000 -CT=5D989E122B78C758921EDBEEB827F0C0 - -I=136 -KEY=000000000000000000000000000000000100000000000000 -CT=4B1C0C8F9E7830CC3C4BE7BD226FA8DE - -I=137 -KEY=000000000000000000000000000000000080000000000000 -CT=82C40C5FD897FBCA7B899C70713573A1 - -I=138 -KEY=000000000000000000000000000000000040000000000000 -CT=ED13EE2D45E00F75CCDB51EA8E3E36AD - -I=139 -KEY=000000000000000000000000000000000020000000000000 -CT=F121799EEFE8432423176A3CCF6462BB - -I=140 -KEY=000000000000000000000000000000000010000000000000 -CT=4FA0C06F07997E98271DD86F7B355C50 - -I=141 -KEY=000000000000000000000000000000000008000000000000 -CT=849EB364B4E81D058649DC5B1BF029B9 - -I=142 -KEY=000000000000000000000000000000000004000000000000 -CT=F48F9E0DE8DE7AD944A207809335D9B1 - -I=143 -KEY=000000000000000000000000000000000002000000000000 -CT=E59E9205B5A81A4FD26DFCF308966022 - -I=144 -KEY=000000000000000000000000000000000001000000000000 -CT=3A91A1BE14AAE9ED700BDF9D70018804 - -I=145 -KEY=000000000000000000000000000000000000800000000000 -CT=8ABAD78DCB79A48D79070E7DA89664EC - -I=146 -KEY=000000000000000000000000000000000000400000000000 -CT=B68377D98AAE6044938A7457F6C649D9 - -I=147 -KEY=000000000000000000000000000000000000200000000000 -CT=E4E1275C42F5F1B63D662C099D6CE33D - -I=148 -KEY=000000000000000000000000000000000000100000000000 -CT=7DEF32A34C6BE668F17DA1BB193B06EF - -I=149 -KEY=000000000000000000000000000000000000080000000000 -CT=78B6000CC3D30CB3A74B68D0EDBD2B53 - -I=150 -KEY=000000000000000000000000000000000000040000000000 -CT=0A47531DE88DD8AE5C23EAE4F7D1F2D5 - -I=151 -KEY=000000000000000000000000000000000000020000000000 -CT=667B24E8000CF68231EC484581D922E5 - -I=152 -KEY=000000000000000000000000000000000000010000000000 -CT=39DAA5EBD4AACAE130E9C33236C52024 - -I=153 -KEY=000000000000000000000000000000000000008000000000 -CT=E3C88760B3CB21360668A63E55BB45D1 - -I=154 -KEY=000000000000000000000000000000000000004000000000 -CT=F131EE903C1CDB49D416866FD5D8DE51 - -I=155 -KEY=000000000000000000000000000000000000002000000000 -CT=7A1916135B0447CF4033FC13047A583A - -I=156 -KEY=000000000000000000000000000000000000001000000000 -CT=F7D55FB27991143DCDFA90DDF0424FCB - -I=157 -KEY=000000000000000000000000000000000000000800000000 -CT=EA93E7D1CA1111DBD8F7EC111A848C0C - -I=158 -KEY=000000000000000000000000000000000000000400000000 -CT=2A689E39DFD3CBCBE221326E95888779 - -I=159 -KEY=000000000000000000000000000000000000000200000000 -CT=C1CE399CA762318AC2C40D1928B4C57D - -I=160 -KEY=000000000000000000000000000000000000000100000000 -CT=D43FB6F2B2879C8BFAF0092DA2CA63ED - -I=161 -KEY=000000000000000000000000000000000000000080000000 -CT=224563E617158DF97650AF5D130E78A5 - -I=162 -KEY=000000000000000000000000000000000000000040000000 -CT=6562FDF6833B7C4F7484AE6EBCC243DD - -I=163 -KEY=000000000000000000000000000000000000000020000000 -CT=93D58BA7BED22615D661D002885A7457 - -I=164 -KEY=000000000000000000000000000000000000000010000000 -CT=9A0EF559003AD9E52D3E09ED3C1D3320 - -I=165 -KEY=000000000000000000000000000000000000000008000000 -CT=96BAF5A7DC6F3DD27EB4C717A85D261C - -I=166 -KEY=000000000000000000000000000000000000000004000000 -CT=B8762E06884900E8452293190E19CCDB - -I=167 -KEY=000000000000000000000000000000000000000002000000 -CT=785416A22BD63CBABF4B1789355197D3 - -I=168 -KEY=000000000000000000000000000000000000000001000000 -CT=A0D20CE1489BAA69A3612DCE90F7ABF6 - -I=169 -KEY=000000000000000000000000000000000000000000800000 -CT=700244E93DC94230CC607FFBA0E48F32 - -I=170 -KEY=000000000000000000000000000000000000000000400000 -CT=85329E476829F872A2B4A7E59F91FF2D - -I=171 -KEY=000000000000000000000000000000000000000000200000 -CT=E4219B4935D988DB719B8B8B2B53D247 - -I=172 -KEY=000000000000000000000000000000000000000000100000 -CT=6ACDD04FD13D4DB4409FE8DD13FD737B - -I=173 -KEY=000000000000000000000000000000000000000000080000 -CT=9EB7A670AB59E15BE582378701C1EC14 - -I=174 -KEY=000000000000000000000000000000000000000000040000 -CT=29DF2D6935FE657763BC7A9F22D3D492 - -I=175 -KEY=000000000000000000000000000000000000000000020000 -CT=99303359D4A13AFDBE6C784028CE533A - -I=176 -KEY=000000000000000000000000000000000000000000010000 -CT=FF5C70A6334545F33B9DBF7BEA0417CA - -I=177 -KEY=000000000000000000000000000000000000000000008000 -CT=289F58A17E4C50EDA4269EFB3DF55815 - -I=178 -KEY=000000000000000000000000000000000000000000004000 -CT=EA35DCB416E9E1C2861D1682F062B5EB - -I=179 -KEY=000000000000000000000000000000000000000000002000 -CT=3A47BF354BE775383C50B0C0A83E3A58 - -I=180 -KEY=000000000000000000000000000000000000000000001000 -CT=BF6C1DC069FB95D05D43B01D8206D66B - -I=181 -KEY=000000000000000000000000000000000000000000000800 -CT=046D1D580D5898DA6595F32FD1F0C33D - -I=182 -KEY=000000000000000000000000000000000000000000000400 -CT=5F57803B7B82A110F7E9855D6A546082 - -I=183 -KEY=000000000000000000000000000000000000000000000200 -CT=25336ECF34E7BE97862CDFF715FF05A8 - -I=184 -KEY=000000000000000000000000000000000000000000000100 -CT=ACBAA2A943D8078022D693890E8C4FEF - -I=185 -KEY=000000000000000000000000000000000000000000000080 -CT=3947597879F6B58E4E2F0DF825A83A38 - -I=186 -KEY=000000000000000000000000000000000000000000000040 -CT=4EB8CC3335496130655BF3CA570A4FC0 - -I=187 -KEY=000000000000000000000000000000000000000000000020 -CT=BBDA7769AD1FDA425E18332D97868824 - -I=188 -KEY=000000000000000000000000000000000000000000000010 -CT=5E7532D22DDB0829A29C868198397154 - -I=189 -KEY=000000000000000000000000000000000000000000000008 -CT=E66DA67B630AB7AE3E682855E1A1698E - -I=190 -KEY=000000000000000000000000000000000000000000000004 -CT=4D93800F671B48559A64D1EA030A590A - -I=191 -KEY=000000000000000000000000000000000000000000000002 -CT=F33159FCC7D9AE30C062CD3B322AC764 - -I=192 -KEY=000000000000000000000000000000000000000000000001 -CT=8BAE4EFB70D33A9792EEA9BE70889D72 - -========== - -KEYSIZE=256 - -PT=00000000000000000000000000000000 - -I=1 -KEY=8000000000000000000000000000000000000000000000000000000000000000 -CT=E35A6DCB19B201A01EBCFA8AA22B5759 - -I=2 -KEY=4000000000000000000000000000000000000000000000000000000000000000 -CT=5075C2405B76F22F553488CAE47CE90B - -I=3 -KEY=2000000000000000000000000000000000000000000000000000000000000000 -CT=49DF95D844A0145A7DE01C91793302D3 - -I=4 -KEY=1000000000000000000000000000000000000000000000000000000000000000 -CT=E7396D778E940B8418A86120E5F421FE - -I=5 -KEY=0800000000000000000000000000000000000000000000000000000000000000 -CT=05F535C36FCEDE4657BE37F4087DB1EF - -I=6 -KEY=0400000000000000000000000000000000000000000000000000000000000000 -CT=D0C1DDDD10DA777C68AB36AF51F2C204 - -I=7 -KEY=0200000000000000000000000000000000000000000000000000000000000000 -CT=1C55FB811B5C6464C4E5DE1535A75514 - -I=8 -KEY=0100000000000000000000000000000000000000000000000000000000000000 -CT=52917F3AE957D5230D3A2AF57C7B5A71 - -I=9 -KEY=0080000000000000000000000000000000000000000000000000000000000000 -CT=C6E3D5501752DD5E9AEF086D6B45D705 - -I=10 -KEY=0040000000000000000000000000000000000000000000000000000000000000 -CT=A24A9C7AF1D9B1E17E1C9A3E711B3FA7 - -I=11 -KEY=0020000000000000000000000000000000000000000000000000000000000000 -CT=B881ECA724A6D43DBC6B96F6F59A0D20 - -I=12 -KEY=0010000000000000000000000000000000000000000000000000000000000000 -CT=EC524D9A24DFFF2A9639879B83B8E137 - -I=13 -KEY=0008000000000000000000000000000000000000000000000000000000000000 -CT=34C4F345F5466215A037F443635D6F75 - -I=14 -KEY=0004000000000000000000000000000000000000000000000000000000000000 -CT=5BA5055BEDB8895F672E29F2EB5A355D - -I=15 -KEY=0002000000000000000000000000000000000000000000000000000000000000 -CT=B3F692AA3A435259EBBEF9B51AD1E08D - -I=16 -KEY=0001000000000000000000000000000000000000000000000000000000000000 -CT=414FEB4376F2C64A5D2FBB2ED531BA7D - -I=17 -KEY=0000800000000000000000000000000000000000000000000000000000000000 -CT=A20D519E3BCA3303F07E81719F61605E - -I=18 -KEY=0000400000000000000000000000000000000000000000000000000000000000 -CT=A08D10E520AF811F45BD60A2DC0DC4B1 - -I=19 -KEY=0000200000000000000000000000000000000000000000000000000000000000 -CT=B06893A8C563C430E6F3858826EFBBE4 - -I=20 -KEY=0000100000000000000000000000000000000000000000000000000000000000 -CT=0FFEE26AE2D3929C6BD9C6BEDFF84409 - -I=21 -KEY=0000080000000000000000000000000000000000000000000000000000000000 -CT=4D0F5E906ED77801FC0EF53EDC5F9E2B - -I=22 -KEY=0000040000000000000000000000000000000000000000000000000000000000 -CT=8B6EC00119AD8B026DCE56EA7DEFE930 - -I=23 -KEY=0000020000000000000000000000000000000000000000000000000000000000 -CT=69026591D43363EE9D83B5007F0B484E - -I=24 -KEY=0000010000000000000000000000000000000000000000000000000000000000 -CT=27135D86950C6A2F86872706279A4761 - -I=25 -KEY=0000008000000000000000000000000000000000000000000000000000000000 -CT=35E6DB8723F281DA410C3AC8535ED77C - -I=26 -KEY=0000004000000000000000000000000000000000000000000000000000000000 -CT=57427CF214B8C28E4BBF487CCB8D0E09 - -I=27 -KEY=0000002000000000000000000000000000000000000000000000000000000000 -CT=6DF01BF56E5131AC87F96E99CAB86367 - -I=28 -KEY=0000001000000000000000000000000000000000000000000000000000000000 -CT=3856C5B55790B768BBF7D43031579BCF - -I=29 -KEY=0000000800000000000000000000000000000000000000000000000000000000 -CT=1E6ED8FB7C15BC4D2F63BA7037ED44D0 - -I=30 -KEY=0000000400000000000000000000000000000000000000000000000000000000 -CT=E1B2ED6CD8D93D455534E401156D4BCF - -I=31 -KEY=0000000200000000000000000000000000000000000000000000000000000000 -CT=EFBCCA5BDFDAD10E875F02336212CE36 - -I=32 -KEY=0000000100000000000000000000000000000000000000000000000000000000 -CT=0B777F02FD18DCE2646DCFE868DFAFAD - -I=33 -KEY=0000000080000000000000000000000000000000000000000000000000000000 -CT=C8A104B5693D1B14F5BF1F10100BF508 - -I=34 -KEY=0000000040000000000000000000000000000000000000000000000000000000 -CT=4CCE6615244AFCB38408FECE219962EA - -I=35 -KEY=0000000020000000000000000000000000000000000000000000000000000000 -CT=F99E7845D3A255B394C9C050CBA258B1 - -I=36 -KEY=0000000010000000000000000000000000000000000000000000000000000000 -CT=B4AFBB787F9BCFB7B55FDF447F611295 - -I=37 -KEY=0000000008000000000000000000000000000000000000000000000000000000 -CT=AE1C426A697FAF2808B7EF6ADDB5C020 - -I=38 -KEY=0000000004000000000000000000000000000000000000000000000000000000 -CT=7572F92811A85B9BDD38DEAD9945BCAE - -I=39 -KEY=0000000002000000000000000000000000000000000000000000000000000000 -CT=71BC7AA46E43FB95A181527D9F6A360F - -I=40 -KEY=0000000001000000000000000000000000000000000000000000000000000000 -CT=5542EF2923066F1EC8F546DD0D8E7CA8 - -I=41 -KEY=0000000000800000000000000000000000000000000000000000000000000000 -CT=6B92317C7D623790B748FDD7EFC42422 - -I=42 -KEY=0000000000400000000000000000000000000000000000000000000000000000 -CT=0FE7C097E899C71EF045360F8D6C25CF - -I=43 -KEY=0000000000200000000000000000000000000000000000000000000000000000 -CT=4ECE7EE107D0264D04693151C25B9DF6 - -I=44 -KEY=0000000000100000000000000000000000000000000000000000000000000000 -CT=FD6AE687CBFCA9E301045888D3BB9605 - -I=45 -KEY=0000000000080000000000000000000000000000000000000000000000000000 -CT=476B579C8556C7254424902CC1D6D36E - -I=46 -KEY=0000000000040000000000000000000000000000000000000000000000000000 -CT=4133CBCDFDD6B8860A1FC18665D6D71B - -I=47 -KEY=0000000000020000000000000000000000000000000000000000000000000000 -CT=3B36EC2664798C108B816812C65DFDC7 - -I=48 -KEY=0000000000010000000000000000000000000000000000000000000000000000 -CT=364E20A234FEA385D48DC5A09C9E70CF - -I=49 -KEY=0000000000008000000000000000000000000000000000000000000000000000 -CT=4A4BA25969DE3F5EE5642C71AAD0EFD1 - -I=50 -KEY=0000000000004000000000000000000000000000000000000000000000000000 -CT=E42CBAAE43297F67A76C1C501BB79E36 - -I=51 -KEY=0000000000002000000000000000000000000000000000000000000000000000 -CT=23CEDEDA4C15B4C037E8C61492217937 - -I=52 -KEY=0000000000001000000000000000000000000000000000000000000000000000 -CT=A1719147A1F4A1A1180BD16E8593DCDE - -I=53 -KEY=0000000000000800000000000000000000000000000000000000000000000000 -CT=AB82337E9FB0EC60D1F25A1D0014192C - -I=54 -KEY=0000000000000400000000000000000000000000000000000000000000000000 -CT=74BF2D8FC5A8388DF1A3A4D7D33FC164 - -I=55 -KEY=0000000000000200000000000000000000000000000000000000000000000000 -CT=D5B493317E6FBC6FFFD664B3C491368A - -I=56 -KEY=0000000000000100000000000000000000000000000000000000000000000000 -CT=BA767381586DA56A2A8D503D5F7ADA0B - -I=57 -KEY=0000000000000080000000000000000000000000000000000000000000000000 -CT=E8E6BC57DFE9CCADB0DECABF4E5CF91F - -I=58 -KEY=0000000000000040000000000000000000000000000000000000000000000000 -CT=3C8E5A5CDC9CEED90815D1F84BB2998C - -I=59 -KEY=0000000000000020000000000000000000000000000000000000000000000000 -CT=283843020BA38F056001B2FD585F7CC9 - -I=60 -KEY=0000000000000010000000000000000000000000000000000000000000000000 -CT=D8ADC7426F623ECE8741A70621D28870 - -I=61 -KEY=0000000000000008000000000000000000000000000000000000000000000000 -CT=D7C5C215592D06F00E6A80DA69A28EA9 - -I=62 -KEY=0000000000000004000000000000000000000000000000000000000000000000 -CT=52CF6FA433C3C870CAC70190358F7F16 - -I=63 -KEY=0000000000000002000000000000000000000000000000000000000000000000 -CT=F63D442A584DA71786ADEC9F3346DF75 - -I=64 -KEY=0000000000000001000000000000000000000000000000000000000000000000 -CT=549078F4B0CA7079B45F9A5ADAFAFD99 - -I=65 -KEY=0000000000000000800000000000000000000000000000000000000000000000 -CT=F2A5986EE4E9984BE2BAFB79EA8152FA - -I=66 -KEY=0000000000000000400000000000000000000000000000000000000000000000 -CT=8A74535017B4DB2776668A1FAE64384C - -I=67 -KEY=0000000000000000200000000000000000000000000000000000000000000000 -CT=E613342F57A97FD95DC088711A5D0ECD - -I=68 -KEY=0000000000000000100000000000000000000000000000000000000000000000 -CT=3FFAEBF6B22CF1DC82AE17CD48175B01 - -I=69 -KEY=0000000000000000080000000000000000000000000000000000000000000000 -CT=BAFD52EFA15C248CCBF9757735E6B1CE - -I=70 -KEY=0000000000000000040000000000000000000000000000000000000000000000 -CT=7AF94BC018D9DDD4539D2DD1C6F4000F - -I=71 -KEY=0000000000000000020000000000000000000000000000000000000000000000 -CT=FE177AD61CA0FDB281086FBA8FE76803 - -I=72 -KEY=0000000000000000010000000000000000000000000000000000000000000000 -CT=74DBEA15E2E9285BAD163D7D534251B6 - -I=73 -KEY=0000000000000000008000000000000000000000000000000000000000000000 -CT=23DD21331B3A92F200FE56FF050FFE74 - -I=74 -KEY=0000000000000000004000000000000000000000000000000000000000000000 -CT=A69C5AA34AB20A858CAFA766EACED6D8 - -I=75 -KEY=0000000000000000002000000000000000000000000000000000000000000000 -CT=3F72BB4DF2A4F941A4A09CB78F04B97A - -I=76 -KEY=0000000000000000001000000000000000000000000000000000000000000000 -CT=72CC43577E1FD5FD14622D24D97FCDCC - -I=77 -KEY=0000000000000000000800000000000000000000000000000000000000000000 -CT=D83AF8EBE93E0B6B99CAFADE224937D1 - -I=78 -KEY=0000000000000000000400000000000000000000000000000000000000000000 -CT=44042329128D56CAA8D084C8BD769D1E - -I=79 -KEY=0000000000000000000200000000000000000000000000000000000000000000 -CT=14102D72290DE4F2C430ADD1ED64BA1D - -I=80 -KEY=0000000000000000000100000000000000000000000000000000000000000000 -CT=449124097B1ECD0AE7065206DF06F03C - -I=81 -KEY=0000000000000000000080000000000000000000000000000000000000000000 -CT=D060A99F8CC153A42E11E5F97BD7584A - -I=82 -KEY=0000000000000000000040000000000000000000000000000000000000000000 -CT=65605B3EA9261488D53E48602ADEA299 - -I=83 -KEY=0000000000000000000020000000000000000000000000000000000000000000 -CT=C5E5CAD7A208DE8EA6BE049EFE5C7346 - -I=84 -KEY=0000000000000000000010000000000000000000000000000000000000000000 -CT=4C280C46D2181646048DD5BC0C0831A5 - -I=85 -KEY=0000000000000000000008000000000000000000000000000000000000000000 -CT=5DD65CF37F2A0929559AABAFDA08E730 - -I=86 -KEY=0000000000000000000004000000000000000000000000000000000000000000 -CT=31F2335CAAF264172F69A693225E6D22 - -I=87 -KEY=0000000000000000000002000000000000000000000000000000000000000000 -CT=3E28B35F99A72662590DA96426DD377F - -I=88 -KEY=0000000000000000000001000000000000000000000000000000000000000000 -CT=570F40F5D7B20441486578ED344343BE - -I=89 -KEY=0000000000000000000000800000000000000000000000000000000000000000 -CT=C54308AD1C9E3B19F8B7417873045A8C - -I=90 -KEY=0000000000000000000000400000000000000000000000000000000000000000 -CT=CBF335E39CE13ADE2B696179E8FD0CE1 - -I=91 -KEY=0000000000000000000000200000000000000000000000000000000000000000 -CT=9C2FBF422355D8293083D51F4A3C18A9 - -I=92 -KEY=0000000000000000000000100000000000000000000000000000000000000000 -CT=5ED8B5A31ECEFAB16C9AA6986DA67BCE - -I=93 -KEY=0000000000000000000000080000000000000000000000000000000000000000 -CT=627815DCFC814ABC75900041B1DD7B59 - -I=94 -KEY=0000000000000000000000040000000000000000000000000000000000000000 -CT=9EF3E82A50A59F166260494F7A7F2CC3 - -I=95 -KEY=0000000000000000000000020000000000000000000000000000000000000000 -CT=878CD0D8D920888B5935D6C351128737 - -I=96 -KEY=0000000000000000000000010000000000000000000000000000000000000000 -CT=E44429474D6FC3084EB2A6B8B46AF754 - -I=97 -KEY=0000000000000000000000008000000000000000000000000000000000000000 -CT=EBAACF9641D54E1FB18D0A2BE4F19BE5 - -I=98 -KEY=0000000000000000000000004000000000000000000000000000000000000000 -CT=13B3BF497CEE780E123C7E193DEA3A01 - -I=99 -KEY=0000000000000000000000002000000000000000000000000000000000000000 -CT=6E8F381DE00A41161F0DF03B4155BFD4 - -I=100 -KEY=0000000000000000000000001000000000000000000000000000000000000000 -CT=35E4F29BBA2BAE01144910783C3FEF49 - -I=101 -KEY=0000000000000000000000000800000000000000000000000000000000000000 -CT=55B17BD66788CEAC366398A31F289FFB - -I=102 -KEY=0000000000000000000000000400000000000000000000000000000000000000 -CT=11341F56C0D6D1008D28741DAA7679CE - -I=103 -KEY=0000000000000000000000000200000000000000000000000000000000000000 -CT=4DF7253DF421D83358BDBE924745D98C - -I=104 -KEY=0000000000000000000000000100000000000000000000000000000000000000 -CT=BAE2EE651116D93EDC8E83B5F3347BE1 - -I=105 -KEY=0000000000000000000000000080000000000000000000000000000000000000 -CT=F9721ABD06709157183AF3965A659D9D - -I=106 -KEY=0000000000000000000000000040000000000000000000000000000000000000 -CT=19A1C252A613FE2860A4AE6D75CE6FA3 - -I=107 -KEY=0000000000000000000000000020000000000000000000000000000000000000 -CT=B5DDB2F5D9752C949FBDE3FFF5556C6E - -I=108 -KEY=0000000000000000000000000010000000000000000000000000000000000000 -CT=81B044FCFFC78ECCFCD171AAD0405C66 - -I=109 -KEY=0000000000000000000000000008000000000000000000000000000000000000 -CT=C640566D3C06020EB2C42F1D62E56A9B - -I=110 -KEY=0000000000000000000000000004000000000000000000000000000000000000 -CT=EA6C4BCF425291679FDFFD26A424FBCC - -I=111 -KEY=0000000000000000000000000002000000000000000000000000000000000000 -CT=57F6901465D9440D9F15EE2CBA5A4090 - -I=112 -KEY=0000000000000000000000000001000000000000000000000000000000000000 -CT=FBCFA74CADC7406260F63D96C8AAB6B1 - -I=113 -KEY=0000000000000000000000000000800000000000000000000000000000000000 -CT=DFF4F096CEA211D4BBDACA033D0EC7D1 - -I=114 -KEY=0000000000000000000000000000400000000000000000000000000000000000 -CT=1EE5190D551F0F42F675227A381296A9 - -I=115 -KEY=0000000000000000000000000000200000000000000000000000000000000000 -CT=F98E1905012E580F097623C10B93054F - -I=116 -KEY=0000000000000000000000000000100000000000000000000000000000000000 -CT=E7D43743D21DD3C9F168C86856558B9A - -I=117 -KEY=0000000000000000000000000000080000000000000000000000000000000000 -CT=632A9DDA730DAB67593C5D08D8AC1059 - -I=118 -KEY=0000000000000000000000000000040000000000000000000000000000000000 -CT=E084317000715B9057BC9DE9F3AB6124 - -I=119 -KEY=0000000000000000000000000000020000000000000000000000000000000000 -CT=61F9EF33A0BB4E666C2ED99101919FAB - -I=120 -KEY=0000000000000000000000000000010000000000000000000000000000000000 -CT=6DC1D68A11834657D46703C22578D59A - -I=121 -KEY=0000000000000000000000000000008000000000000000000000000000000000 -CT=53AC1548863D3D16F1D4DC7242E05F2C - -I=122 -KEY=0000000000000000000000000000004000000000000000000000000000000000 -CT=E82CD587A408306AD78CEAE0916B9F8C - -I=123 -KEY=0000000000000000000000000000002000000000000000000000000000000000 -CT=0FD2D40EA6AD17A3A767F0A8600D6295 - -I=124 -KEY=0000000000000000000000000000001000000000000000000000000000000000 -CT=AD84CC8255ADB39DFCA23F92761AE7E9 - -I=125 -KEY=0000000000000000000000000000000800000000000000000000000000000000 -CT=F4F20CF7D51BEE7DA024A2B11A7ECA0B - -I=126 -KEY=0000000000000000000000000000000400000000000000000000000000000000 -CT=5057691B85D9CE93A193214DB0A016B6 - -I=127 -KEY=0000000000000000000000000000000200000000000000000000000000000000 -CT=0F58C960876390BDEF4BB6BE95CAA1EE - -I=128 -KEY=0000000000000000000000000000000100000000000000000000000000000000 -CT=9A3E66EEBC21BC0BD9430B341EF465FA - -I=129 -KEY=0000000000000000000000000000000080000000000000000000000000000000 -CT=20415035F34B8BCBCB28ABF07F78F0D4 - -I=130 -KEY=0000000000000000000000000000000040000000000000000000000000000000 -CT=AC89FC7BA10479EBF10DE65BCEF89B3C - -I=131 -KEY=0000000000000000000000000000000020000000000000000000000000000000 -CT=068FA75A30BE443171AF3F6FEB1A20D2 - -I=132 -KEY=0000000000000000000000000000000010000000000000000000000000000000 -CT=50E02F213246C525A8C27700CA34B502 - -I=133 -KEY=0000000000000000000000000000000008000000000000000000000000000000 -CT=227DA47D5A0906DB3AB042BB0A695FB6 - -I=134 -KEY=0000000000000000000000000000000004000000000000000000000000000000 -CT=8663AC30ED12514F1DE46777F4514BFC - -I=135 -KEY=0000000000000000000000000000000002000000000000000000000000000000 -CT=A987D4BC12E1DE9F4B6DF43567C34A8B - -I=136 -KEY=0000000000000000000000000000000001000000000000000000000000000000 -CT=6D5A0370F599ACA605F63B04E5143D0C - -I=137 -KEY=0000000000000000000000000000000000800000000000000000000000000000 -CT=9809266E378B07B7AFDB3BAA97B7E442 - -I=138 -KEY=0000000000000000000000000000000000400000000000000000000000000000 -CT=8F753252B30CCCACE12D9A301F4D5090 - -I=139 -KEY=0000000000000000000000000000000000200000000000000000000000000000 -CT=032465F6C0CE34D41962F561692A1AFF - -I=140 -KEY=0000000000000000000000000000000000100000000000000000000000000000 -CT=C50E9AD5BEB8F3B00821DD47FF8AC093 - -I=141 -KEY=0000000000000000000000000000000000080000000000000000000000000000 -CT=9C6FEA3D46268D54A6829B2AD25BB276 - -I=142 -KEY=0000000000000000000000000000000000040000000000000000000000000000 -CT=0FD8575E87706F561343D7B3A41E044A - -I=143 -KEY=0000000000000000000000000000000000020000000000000000000000000000 -CT=BEE9BEB3739540D88CBCE77925F0A114 - -I=144 -KEY=0000000000000000000000000000000000010000000000000000000000000000 -CT=D24EAEE7FFFBAC3D6F26C2DCE0DCDE28 - -I=145 -KEY=0000000000000000000000000000000000008000000000000000000000000000 -CT=47771A90398FF0F7FA821C2F8F5E1398 - -I=146 -KEY=0000000000000000000000000000000000004000000000000000000000000000 -CT=4639741B6F84B135AD118C8249B64ED0 - -I=147 -KEY=0000000000000000000000000000000000002000000000000000000000000000 -CT=8EE5505EC85567697A3306F250A27720 - -I=148 -KEY=0000000000000000000000000000000000001000000000000000000000000000 -CT=7C8A19AC1AEFBC5E0119D91A5F05D4C2 - -I=149 -KEY=0000000000000000000000000000000000000800000000000000000000000000 -CT=5141B9B672E54773B672E3A6C424887B - -I=150 -KEY=0000000000000000000000000000000000000400000000000000000000000000 -CT=B5A2D3CD206653C6402F34FB0AE3613D - -I=151 -KEY=0000000000000000000000000000000000000200000000000000000000000000 -CT=0F5BD9408738231D114B0A82753279A3 - -I=152 -KEY=0000000000000000000000000000000000000100000000000000000000000000 -CT=FEF033FF4268EA487FC74C5E43A45338 - -I=153 -KEY=0000000000000000000000000000000000000080000000000000000000000000 -CT=A3EDC09DCD529B113910D904AD855581 - -I=154 -KEY=0000000000000000000000000000000000000040000000000000000000000000 -CT=AB8FBB6F27A0AC7C55B59FDD36B72F1C - -I=155 -KEY=0000000000000000000000000000000000000020000000000000000000000000 -CT=EEA44D5ED4D769CC930CD83D8999EC46 - -I=156 -KEY=0000000000000000000000000000000000000010000000000000000000000000 -CT=6972276803AE9AA7C6F431AB10979C34 - -I=157 -KEY=0000000000000000000000000000000000000008000000000000000000000000 -CT=86DEAA9F39244101818178474D7DBDE9 - -I=158 -KEY=0000000000000000000000000000000000000004000000000000000000000000 -CT=88C6B466EA361D662D8D08CBF181F4FE - -I=159 -KEY=0000000000000000000000000000000000000002000000000000000000000000 -CT=91AB2C6B7C63FF59F7CBEEBF91B20B95 - -I=160 -KEY=0000000000000000000000000000000000000001000000000000000000000000 -CT=2DFE6C146AD5B3D8C3C1718F13B48E01 - -I=161 -KEY=0000000000000000000000000000000000000000800000000000000000000000 -CT=C7CFF1623451711391A302EEC3584AAA - -I=162 -KEY=0000000000000000000000000000000000000000400000000000000000000000 -CT=089FE845CC05011686C66019D18BE050 - -I=163 -KEY=0000000000000000000000000000000000000000200000000000000000000000 -CT=08C8410B9B427211A67124B0DCCEAD48 - -I=164 -KEY=0000000000000000000000000000000000000000100000000000000000000000 -CT=8D91592F5566085254784606334D7629 - -I=165 -KEY=0000000000000000000000000000000000000000080000000000000000000000 -CT=3298FEAAF2E1201D6299FF8846639C97 - -I=166 -KEY=0000000000000000000000000000000000000000040000000000000000000000 -CT=C497CB9F0BDFE0EFC8C2F3F90760AA72 - -I=167 -KEY=0000000000000000000000000000000000000000020000000000000000000000 -CT=2788AFD046E0309CBE4424690DA2AB89 - -I=168 -KEY=0000000000000000000000000000000000000000010000000000000000000000 -CT=E9891707F25EF29FEE372890D4258982 - -I=169 -KEY=0000000000000000000000000000000000000000008000000000000000000000 -CT=DB041D94A23D45D4D4DCED5A030CAF61 - -I=170 -KEY=0000000000000000000000000000000000000000004000000000000000000000 -CT=FFAFDBF0ECB18DF9EA02C27077448E6D - -I=171 -KEY=0000000000000000000000000000000000000000002000000000000000000000 -CT=2DAAA42A7D0A1D3B0E4761D99CF2150A - -I=172 -KEY=0000000000000000000000000000000000000000001000000000000000000000 -CT=3B7A54CB7CF30ABE263DD6ED5BFE8D63 - -I=173 -KEY=0000000000000000000000000000000000000000000800000000000000000000 -CT=EEFA090174C590C448A55D43648F534A - -I=174 -KEY=0000000000000000000000000000000000000000000400000000000000000000 -CT=9E15798731ED42F43EA2740A691DA872 - -I=175 -KEY=0000000000000000000000000000000000000000000200000000000000000000 -CT=31FBD661540A5DEAAD1017CFD3909EC8 - -I=176 -KEY=0000000000000000000000000000000000000000000100000000000000000000 -CT=CDA9AE05F224140E28CB951721B44D6A - -I=177 -KEY=0000000000000000000000000000000000000000000080000000000000000000 -CT=0C5BC512C60A1EAC3434EFB1A8FBB182 - -I=178 -KEY=0000000000000000000000000000000000000000000040000000000000000000 -CT=AA863610DEEEEB62D045E87EA30B59B5 - -I=179 -KEY=0000000000000000000000000000000000000000000020000000000000000000 -CT=6AC2448DE568D279C7EEBE1DF403920C - -I=180 -KEY=0000000000000000000000000000000000000000000010000000000000000000 -CT=E2011E3D292B26888AE801215FD0CB40 - -I=181 -KEY=0000000000000000000000000000000000000000000008000000000000000000 -CT=E06F3E15EE3A61672D1C99BADE5B9DBE - -I=182 -KEY=0000000000000000000000000000000000000000000004000000000000000000 -CT=BB7027F0548CF6712CEB4C7A4B28E178 - -I=183 -KEY=0000000000000000000000000000000000000000000002000000000000000000 -CT=061EC21FB70FADBDF87C3BD2AE23825B - -I=184 -KEY=0000000000000000000000000000000000000000000001000000000000000000 -CT=4C21F26FE94ABBAC381352375314C3EB - -I=185 -KEY=0000000000000000000000000000000000000000000000800000000000000000 -CT=F7CEE6DD99909C2B569EEDA61ED8942E - -I=186 -KEY=0000000000000000000000000000000000000000000000400000000000000000 -CT=CE98C4A876C65E4CCB261EBB1D9DF7F5 - -I=187 -KEY=0000000000000000000000000000000000000000000000200000000000000000 -CT=A5491881CF833C3604ABC08044F402AC - -I=188 -KEY=0000000000000000000000000000000000000000000000100000000000000000 -CT=A1BA16E64CCCB3087D57A768507B0BFC - -I=189 -KEY=0000000000000000000000000000000000000000000000080000000000000000 -CT=D55951E202D2949EBD3BE43120C738BF - -I=190 -KEY=0000000000000000000000000000000000000000000000040000000000000000 -CT=EBB8E43069E69F450EFEC65DCD52B7FD - -I=191 -KEY=0000000000000000000000000000000000000000000000020000000000000000 -CT=2B292135663B4AA5ABFE9423D57E7EE9 - -I=192 -KEY=0000000000000000000000000000000000000000000000010000000000000000 -CT=E91BF974B3BE3AD966249D8655292A85 - -I=193 -KEY=0000000000000000000000000000000000000000000000008000000000000000 -CT=384365998EAA9562236CC58F6ADF9610 - -I=194 -KEY=0000000000000000000000000000000000000000000000004000000000000000 -CT=C2E997012AA3D4D8D359C9A947CBE69F - -I=195 -KEY=0000000000000000000000000000000000000000000000002000000000000000 -CT=F49421204148BA213BE87E2D5C22B0BF - -I=196 -KEY=0000000000000000000000000000000000000000000000001000000000000000 -CT=82ED0ED9953AA92E4DF30929CA65C00F - -I=197 -KEY=0000000000000000000000000000000000000000000000000800000000000000 -CT=291EB1D11653C8479437C74A977F5106 - -I=198 -KEY=0000000000000000000000000000000000000000000000000400000000000000 -CT=BCB997B1939B8983ABD550D6025683E3 - -I=199 -KEY=0000000000000000000000000000000000000000000000000200000000000000 -CT=1FBA2592C6F489775CAADA71F9B983E9 - -I=200 -KEY=0000000000000000000000000000000000000000000000000100000000000000 -CT=969F66F217AF1A3DB9E41C1B29039824 - -I=201 -KEY=0000000000000000000000000000000000000000000000000080000000000000 -CT=A54BB7D6B17E423AC0A7744C19073CB8 - -I=202 -KEY=0000000000000000000000000000000000000000000000000040000000000000 -CT=B0AC6E6578D1021F47DCF9748A32EAD5 - -I=203 -KEY=0000000000000000000000000000000000000000000000000020000000000000 -CT=B87B361C3B7B194C77A4358D4669153E - -I=204 -KEY=0000000000000000000000000000000000000000000000000010000000000000 -CT=46A133847F96EAA8282A799DC8899D58 - -I=205 -KEY=0000000000000000000000000000000000000000000000000008000000000000 -CT=2265EC3A9F2D5C9547A091CC8CFB18EA - -I=206 -KEY=0000000000000000000000000000000000000000000000000004000000000000 -CT=54CBF3A6FC4FE56D426117AA1FFD1DDE - -I=207 -KEY=0000000000000000000000000000000000000000000000000002000000000000 -CT=5312877CCEAB6CFB0905394A370A8003 - -I=208 -KEY=0000000000000000000000000000000000000000000000000001000000000000 -CT=7190BD6EC613FE38B84ECFE28F702FE4 - -I=209 -KEY=0000000000000000000000000000000000000000000000000000800000000000 -CT=D1FA5B9CA89A43B04C05F0EF29EF68CD - -I=210 -KEY=0000000000000000000000000000000000000000000000000000400000000000 -CT=808285751548ED934FD1056D2D9AE8BA - -I=211 -KEY=0000000000000000000000000000000000000000000000000000200000000000 -CT=2758DEF3E7B95A9AE89777BE64D5A6CF - -I=212 -KEY=0000000000000000000000000000000000000000000000000000100000000000 -CT=07D81F87DB3E0ACC82B01E08FB22F3C1 - -I=213 -KEY=0000000000000000000000000000000000000000000000000000080000000000 -CT=8DA250E5553D650711A75EE1CB4FD1C7 - -I=214 -KEY=0000000000000000000000000000000000000000000000000000040000000000 -CT=A93D946BD0E87F32719DF5F158CEE669 - -I=215 -KEY=0000000000000000000000000000000000000000000000000000020000000000 -CT=03945236EC2A4D4EAF30B8ABEB54330D - -I=216 -KEY=0000000000000000000000000000000000000000000000000000010000000000 -CT=11CC35301F24B79DDE31AEA2D1354F88 - -I=217 -KEY=0000000000000000000000000000000000000000000000000000008000000000 -CT=E73715B3E8D9A290F44AE6FFBF247E5D - -I=218 -KEY=0000000000000000000000000000000000000000000000000000004000000000 -CT=7345E07732B71CB158BBF64CCA5C5B96 - -I=219 -KEY=0000000000000000000000000000000000000000000000000000002000000000 -CT=6E128F296D24705A1924FD9B70C4ED04 - -I=220 -KEY=0000000000000000000000000000000000000000000000000000001000000000 -CT=95A789776F036783FBD330947083F54F - -I=221 -KEY=0000000000000000000000000000000000000000000000000000000800000000 -CT=360DEC2533EA4AA2E3E54FD3DE2906EB - -I=222 -KEY=0000000000000000000000000000000000000000000000000000000400000000 -CT=E68EFD7FECF4D601EA22727BD764965B - -I=223 -KEY=0000000000000000000000000000000000000000000000000000000200000000 -CT=9065C64A8BFF44AC33EDBB611CF83D7B - -I=224 -KEY=0000000000000000000000000000000000000000000000000000000100000000 -CT=8F33C8DF2A7A51CE8090E8F123BC3723 - -I=225 -KEY=0000000000000000000000000000000000000000000000000000000080000000 -CT=807F391FFBA8291BA625623210F99018 - -I=226 -KEY=0000000000000000000000000000000000000000000000000000000040000000 -CT=5E8B3F3A701522CE5CAA761C929D6292 - -I=227 -KEY=0000000000000000000000000000000000000000000000000000000020000000 -CT=3BA404DC38735A78289E3809E8364835 - -I=228 -KEY=0000000000000000000000000000000000000000000000000000000010000000 -CT=D23BEDBAD229F8305DC425B6B759DCC9 - -I=229 -KEY=0000000000000000000000000000000000000000000000000000000008000000 -CT=44880F21CF5913040AE376AEE2A10AD8 - -I=230 -KEY=0000000000000000000000000000000000000000000000000000000004000000 -CT=9BC98E29D057C0E828C3B5CCE69256C1 - -I=231 -KEY=0000000000000000000000000000000000000000000000000000000002000000 -CT=B293CC7A975DA141A68279368057CC41 - -I=232 -KEY=0000000000000000000000000000000000000000000000000000000001000000 -CT=8D60FB87ACD91385B313BE5F1D7BD30F - -I=233 -KEY=0000000000000000000000000000000000000000000000000000000000800000 -CT=2C8E56132D70291B303C48FDF75543CD - -I=234 -KEY=0000000000000000000000000000000000000000000000000000000000400000 -CT=D1F80035B826791F6CE4E59B7DB1BB0D - -I=235 -KEY=0000000000000000000000000000000000000000000000000000000000200000 -CT=42CE6224FC36469339A133DD08173BD4 - -I=236 -KEY=0000000000000000000000000000000000000000000000000000000000100000 -CT=61817155EA41BCBA2AF7F06AE7CBF585 - -I=237 -KEY=0000000000000000000000000000000000000000000000000000000000080000 -CT=D1923A9866068D2EF5FB77D57C3315B6 - -I=238 -KEY=0000000000000000000000000000000000000000000000000000000000040000 -CT=B37CBDB5D719F49691CA968EF2E84140 - -I=239 -KEY=0000000000000000000000000000000000000000000000000000000000020000 -CT=EC974E653A055D7F8F22171030F68E1D - -I=240 -KEY=0000000000000000000000000000000000000000000000000000000000010000 -CT=DDE5D3B9AAD9C32213BB3675A822499C - -I=241 -KEY=0000000000000000000000000000000000000000000000000000000000008000 -CT=D3B6E9216EA1AE57EB1C628A3C38AB78 - -I=242 -KEY=0000000000000000000000000000000000000000000000000000000000004000 -CT=82C99ECC69472B7E96324B042AE8B87A - -I=243 -KEY=0000000000000000000000000000000000000000000000000000000000002000 -CT=97144DC5338C43600F84439C0AA0D147 - -I=244 -KEY=0000000000000000000000000000000000000000000000000000000000001000 -CT=400AC4A0BBADA1DB2121EB144C7E5209 - -I=245 -KEY=0000000000000000000000000000000000000000000000000000000000000800 -CT=EFD9D550EB419ED278F4885A490AB54C - -I=246 -KEY=0000000000000000000000000000000000000000000000000000000000000400 -CT=2AB7816E149B7C0404C88A8857793670 - -I=247 -KEY=0000000000000000000000000000000000000000000000000000000000000200 -CT=5B591DFF9E8DEE15BAD24C025DBCA481 - -I=248 -KEY=0000000000000000000000000000000000000000000000000000000000000100 -CT=0C06633E30721C3749F49AD8CBF2B754 - -I=249 -KEY=0000000000000000000000000000000000000000000000000000000000000080 -CT=96D6D31A41B5123B2035FD91A921D4CA - -I=250 -KEY=0000000000000000000000000000000000000000000000000000000000000040 -CT=E7F6C34D86668BC2805CA7793C5E86AD - -I=251 -KEY=0000000000000000000000000000000000000000000000000000000000000020 -CT=F46DFF5FF500D6879C4D3E45CF0CF0F3 - -I=252 -KEY=0000000000000000000000000000000000000000000000000000000000000010 -CT=60D842D9C61DA7495C116197B7CECBBE - -I=253 -KEY=0000000000000000000000000000000000000000000000000000000000000008 -CT=D45B24EDB673353EBDF248B8FA06B67A - -I=254 -KEY=0000000000000000000000000000000000000000000000000000000000000004 -CT=119EAEBCC165D0BD02C0D35DC82EF992 - -I=255 -KEY=0000000000000000000000000000000000000000000000000000000000000002 -CT=E673143680414ADA301D0ED34626B9FE - -I=256 -KEY=0000000000000000000000000000000000000000000000000000000000000001 -CT=6B6CFE160A6263631B292F879EEFF926 - + +========================= + +FILENAME: "ecb_vk.txt" + +Electronic Codebook (ECB) Mode +Variable Key Known Answer Tests + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========== + +KEYSIZE=128 + +PT=00000000000000000000000000000000 + +I=1 +KEY=80000000000000000000000000000000 +CT=0EDD33D3C621E546455BD8BA1418BEC8 + +I=2 +KEY=40000000000000000000000000000000 +CT=C0CC0C5DA5BD63ACD44A80774FAD5222 + +I=3 +KEY=20000000000000000000000000000000 +CT=2F0B4B71BC77851B9CA56D42EB8FF080 + +I=4 +KEY=10000000000000000000000000000000 +CT=6B1E2FFFE8A114009D8FE22F6DB5F876 + +I=5 +KEY=08000000000000000000000000000000 +CT=9AA042C315F94CBB97B62202F83358F5 + +I=6 +KEY=04000000000000000000000000000000 +CT=DBE01DE67E346A800C4C4B4880311DE4 + +I=7 +KEY=02000000000000000000000000000000 +CT=C117D2238D53836ACD92DDCDB85D6A21 + +I=8 +KEY=01000000000000000000000000000000 +CT=DC0ED85DF9611ABB7249CDD168C5467E + +I=9 +KEY=00800000000000000000000000000000 +CT=807D678FFF1F56FA92DE3381904842F2 + +I=10 +KEY=00400000000000000000000000000000 +CT=0E53B3FCAD8E4B130EF73AEB957FB402 + +I=11 +KEY=00200000000000000000000000000000 +CT=969FFD3B7C35439417E7BDE923035D65 + +I=12 +KEY=00100000000000000000000000000000 +CT=A99B512C19CA56070491166A1503BF15 + +I=13 +KEY=00080000000000000000000000000000 +CT=6E9985252126EE344D26AE369D2327E3 + +I=14 +KEY=00040000000000000000000000000000 +CT=B85F4809F904C275491FCDCD1610387E + +I=15 +KEY=00020000000000000000000000000000 +CT=ED365B8D7D20C1F5D53FB94DD211DF7B + +I=16 +KEY=00010000000000000000000000000000 +CT=B3A575E86A8DB4A7135D604C43304896 + +I=17 +KEY=00008000000000000000000000000000 +CT=89704BCB8E69F846259EB0ACCBC7F8A2 + +I=18 +KEY=00004000000000000000000000000000 +CT=C56EE7C92197861F10D7A92B90882055 + +I=19 +KEY=00002000000000000000000000000000 +CT=92F296F6846E0EAF9422A5A24A08B069 + +I=20 +KEY=00001000000000000000000000000000 +CT=E67E32BB8F11DEB8699318BEE9E91A60 + +I=21 +KEY=00000800000000000000000000000000 +CT=B08EEF85EAF626DD91B65C4C3A97D92B + +I=22 +KEY=00000400000000000000000000000000 +CT=661083A6ADDCE79BB4E0859AB5538013 + +I=23 +KEY=00000200000000000000000000000000 +CT=55DFE2941E0EB10AFC0B333BD34DE1FE + +I=24 +KEY=00000100000000000000000000000000 +CT=6BFE5945E715C9662609770F8846087A + +I=25 +KEY=00000080000000000000000000000000 +CT=79848E9C30C2F8CDA8B325F7FED2B139 + +I=26 +KEY=00000040000000000000000000000000 +CT=7A713A53B99FEF34AC04DEEF80965BD0 + +I=27 +KEY=00000020000000000000000000000000 +CT=18144A2B46620D32C3C32CE52D49257F + +I=28 +KEY=00000010000000000000000000000000 +CT=872E827C70887C80749F7B8BB1847C7E + +I=29 +KEY=00000008000000000000000000000000 +CT=6B86C6A4FE6A60C59B1A3102F8DE49F3 + +I=30 +KEY=00000004000000000000000000000000 +CT=9848BB3DFDF6F532F094679A4C231A20 + +I=31 +KEY=00000002000000000000000000000000 +CT=925AD528E852E329B2091CD3F1C2BCEE + +I=32 +KEY=00000001000000000000000000000000 +CT=80DF436544B0DD596722E46792A40CD8 + +I=33 +KEY=00000000800000000000000000000000 +CT=525DAF18F93E83E1E74BBBDDE4263BBA + +I=34 +KEY=00000000400000000000000000000000 +CT=F65C9D2EE485D24701FFA3313B9D5BE6 + +I=35 +KEY=00000000200000000000000000000000 +CT=E4FC8D8BCA06425BDF94AFA40FCC14BA + +I=36 +KEY=00000000100000000000000000000000 +CT=A53F0A5CA1E4E6440BB975FF320DE6F8 + +I=37 +KEY=00000000080000000000000000000000 +CT=D55313B9394080462E87E02899B553F0 + +I=38 +KEY=00000000040000000000000000000000 +CT=34A71D761F71BCD344384C7F97D27906 + +I=39 +KEY=00000000020000000000000000000000 +CT=233F3D819599612EBC89580245C996A8 + +I=40 +KEY=00000000010000000000000000000000 +CT=B4F1374E5268DBCB676E447529E53F89 + +I=41 +KEY=00000000008000000000000000000000 +CT=0816BD27861D2BA891D1044E39951E96 + +I=42 +KEY=00000000004000000000000000000000 +CT=F3BE9EA3F10C73CA64FDE5DB13A951D1 + +I=43 +KEY=00000000002000000000000000000000 +CT=2448086A8106FBD03048DDF857D3F1C8 + +I=44 +KEY=00000000001000000000000000000000 +CT=670756E65BEC8B68F03D77CDCDCE7B91 + +I=45 +KEY=00000000000800000000000000000000 +CT=EF968CF0D36FD6C6EFFD225F6FB44CA9 + +I=46 +KEY=00000000000400000000000000000000 +CT=2E8767157922E3826DDCEC1B0CC1E105 + +I=47 +KEY=00000000000200000000000000000000 +CT=78CE7EEC670E45A967BAB17E26A1AD36 + +I=48 +KEY=00000000000100000000000000000000 +CT=3C5CEE825655F098F6E81A2F417DA3FB + +I=49 +KEY=00000000000080000000000000000000 +CT=67BFDB431DCE1292200BC6F5207ADB12 + +I=50 +KEY=00000000000040000000000000000000 +CT=7540FD38E447C0779228548747843A6F + +I=51 +KEY=00000000000020000000000000000000 +CT=B85E513301F8A936EA9EC8A21A85B5E6 + +I=52 +KEY=00000000000010000000000000000000 +CT=04C67DBF16C11427D507A455DE2C9BC5 + +I=53 +KEY=00000000000008000000000000000000 +CT=03F75EB8959E55079CFFB4FF149A37B6 + +I=54 +KEY=00000000000004000000000000000000 +CT=74550287F666C63BB9BC7838433434B0 + +I=55 +KEY=00000000000002000000000000000000 +CT=7D537200195EBC3AEFD1EAAB1C385221 + +I=56 +KEY=00000000000001000000000000000000 +CT=CE24E4D40C68A82B535CBD3C8E21652A + +I=57 +KEY=00000000000000800000000000000000 +CT=AB20072405AA8FC40265C6F1F3DC8BC0 + +I=58 +KEY=00000000000000400000000000000000 +CT=6CFD2CF688F566B093F67B9B3839E80A + +I=59 +KEY=00000000000000200000000000000000 +CT=BD95977E6B7239D407A012C5544BF584 + +I=60 +KEY=00000000000000100000000000000000 +CT=DF9C0130AC77E7C72C997F587B46DBE0 + +I=61 +KEY=00000000000000080000000000000000 +CT=E7F1B82CADC53A648798945B34EFEFF2 + +I=62 +KEY=00000000000000040000000000000000 +CT=932C6DBF69255CF13EDCDB72233ACEA3 + +I=63 +KEY=00000000000000020000000000000000 +CT=5C76002BC7206560EFE550C80B8F12CC + +I=64 +KEY=00000000000000010000000000000000 +CT=F6B7BDD1CAEEBAB574683893C4475484 + +I=65 +KEY=00000000000000008000000000000000 +CT=A920E37CC6DC6B31DA8C0169569F5034 + +I=66 +KEY=00000000000000004000000000000000 +CT=919380ECD9C778BC513148B0C28D65FD + +I=67 +KEY=00000000000000002000000000000000 +CT=EE67308DD3F2D9E6C2170755E5784BE1 + +I=68 +KEY=00000000000000001000000000000000 +CT=3CC73E53B85609023A05E149B223AE09 + +I=69 +KEY=00000000000000000800000000000000 +CT=983E8AF7CF05EBB28D71EB841C9406E6 + +I=70 +KEY=00000000000000000400000000000000 +CT=0F3099B2D31FA5299EE5BF43193287FC + +I=71 +KEY=00000000000000000200000000000000 +CT=B763D84F38C27FE6931DCEB6715D4DB6 + +I=72 +KEY=00000000000000000100000000000000 +CT=5AE3C9B0E3CC29C0C61565CD01F8A248 + +I=73 +KEY=00000000000000000080000000000000 +CT=F58083572CD90981958565D48D2DEE25 + +I=74 +KEY=00000000000000000040000000000000 +CT=7E6255EEF8F70C0EF10337AAB1CCCEF8 + +I=75 +KEY=00000000000000000020000000000000 +CT=AAD4BAC34DB22821841CE2F631961902 + +I=76 +KEY=00000000000000000010000000000000 +CT=D7431C0409BB1441BA9C6858DC7D4E81 + +I=77 +KEY=00000000000000000008000000000000 +CT=EF9298C65E339F6E801A59C626456993 + +I=78 +KEY=00000000000000000004000000000000 +CT=53FE29F68FF541ABC3F0EF3350B72F7E + +I=79 +KEY=00000000000000000002000000000000 +CT=F6BBA5C10DB02529E2C2DA3FB582CC14 + +I=80 +KEY=00000000000000000001000000000000 +CT=E4239AA37FC531A386DAD1126FC0E9CD + +I=81 +KEY=00000000000000000000800000000000 +CT=8F7758F857D15BBE7BFD0E416404C365 + +I=82 +KEY=00000000000000000000400000000000 +CT=D273EB57C687BCD1B4EA7218A509E7B8 + +I=83 +KEY=00000000000000000000200000000000 +CT=65D64F8D76E8B3423FA25C4EB58A210A + +I=84 +KEY=00000000000000000000100000000000 +CT=623D802B4EC450D66A16625702FCDBE0 + +I=85 +KEY=00000000000000000000080000000000 +CT=7496460CB28E5791BAEAF9B68FB00022 + +I=86 +KEY=00000000000000000000040000000000 +CT=34EA600F18BB0694B41681A49D510C1D + +I=87 +KEY=00000000000000000000020000000000 +CT=5F8FF0D47D5766D29B5D6E8F46423BD8 + +I=88 +KEY=00000000000000000000010000000000 +CT=225F9286C5928BF09F84D3F93F541959 + +I=89 +KEY=00000000000000000000008000000000 +CT=B21E90D25DF383416A5F072CEBEB1FFB + +I=90 +KEY=00000000000000000000004000000000 +CT=4AEFCDA089318125453EB9E8EB5E492E + +I=91 +KEY=00000000000000000000002000000000 +CT=4D3E75C6CD40EC4869BC85158591ADB8 + +I=92 +KEY=00000000000000000000001000000000 +CT=63A8B904405436A1B99D7751866771B7 + +I=93 +KEY=00000000000000000000000800000000 +CT=64F0DAAE47529199792EAE172BA53293 + +I=94 +KEY=00000000000000000000000400000000 +CT=C3EEF84BEA18225D515A8C852A9047EE + +I=95 +KEY=00000000000000000000000200000000 +CT=A44AC422B47D47B81AF73B3E9AC9596E + +I=96 +KEY=00000000000000000000000100000000 +CT=D16E04A8FBC435094F8D53ADF25F5084 + +I=97 +KEY=00000000000000000000000080000000 +CT=EF13DC34BAB03E124EEAD8B6BF44B532 + +I=98 +KEY=00000000000000000000000040000000 +CT=D94799075C24DCC067AF0D392049250D + +I=99 +KEY=00000000000000000000000020000000 +CT=14F431771EDDCE4764C21A2254B5E3C8 + +I=100 +KEY=00000000000000000000000010000000 +CT=7039329F36F2ED682B02991F28D64679 + +I=101 +KEY=00000000000000000000000008000000 +CT=124EE24EDE5551639DB8B8B941F6141D + +I=102 +KEY=00000000000000000000000004000000 +CT=C2852879A34D5184E478EC918B993FEE + +I=103 +KEY=00000000000000000000000002000000 +CT=86A806A3525B93E432053C9AB5ABBEDF + +I=104 +KEY=00000000000000000000000001000000 +CT=C1609BF5A4F07E37C17A36366EC23ECC + +I=105 +KEY=00000000000000000000000000800000 +CT=7E81E7CB92159A51FFCEA331B1E8EA53 + +I=106 +KEY=00000000000000000000000000400000 +CT=37A7BE002856C5A59A6E03EAFCE7729A + +I=107 +KEY=00000000000000000000000000200000 +CT=BDF98A5A4F91E890C9A1D1E5FAAB138F + +I=108 +KEY=00000000000000000000000000100000 +CT=4E96ACB66E051F2BC739CC3D3E34A26B + +I=109 +KEY=00000000000000000000000000080000 +CT=EE996CDD120EB86E21ECFA49E8E1FCF1 + +I=110 +KEY=00000000000000000000000000040000 +CT=61B9E6B579DBF6070C351A1440DD85FF + +I=111 +KEY=00000000000000000000000000020000 +CT=AC369E484316440B40DFC83AA96E28E7 + +I=112 +KEY=00000000000000000000000000010000 +CT=0A2D16DE985C76D45C579C1159413BBE + +I=113 +KEY=00000000000000000000000000008000 +CT=DA3FDC38DA1D374FA4802CDA1A1C6B0F + +I=114 +KEY=00000000000000000000000000004000 +CT=B842523D4C41C2211AFE43A5800ADCE3 + +I=115 +KEY=00000000000000000000000000002000 +CT=9E2CDA90D8E992DBA6C73D8229567192 + +I=116 +KEY=00000000000000000000000000001000 +CT=D49583B781D9E20F5BE101415957FC49 + +I=117 +KEY=00000000000000000000000000000800 +CT=EF09DA5C12B376E458B9B8670032498E + +I=118 +KEY=00000000000000000000000000000400 +CT=A96BE0463DA774461A5E1D5A9DD1AC10 + +I=119 +KEY=00000000000000000000000000000200 +CT=32CEE3341060790D2D4B1362EF397090 + +I=120 +KEY=00000000000000000000000000000100 +CT=21CEA416A3D3359D2C4D58FB6A035F06 + +I=121 +KEY=00000000000000000000000000000080 +CT=172AEAB3D507678ECAF455C12587ADB7 + +I=122 +KEY=00000000000000000000000000000040 +CT=B6F897941EF8EBFF9FE80A567EF38478 + +I=123 +KEY=00000000000000000000000000000020 +CT=A9723259D94A7DC662FB0C782CA3F1DD + +I=124 +KEY=00000000000000000000000000000010 +CT=2F91C984B9A4839F30001B9F430493B4 + +I=125 +KEY=00000000000000000000000000000008 +CT=0472406345A610B048CB99EE0EF3FA0F + +I=126 +KEY=00000000000000000000000000000004 +CT=F5F39086646F8C05ED16EFA4B617957C + +I=127 +KEY=00000000000000000000000000000002 +CT=26D50F485A30408D5AF47A5736292450 + +I=128 +KEY=00000000000000000000000000000001 +CT=0545AAD56DA2A97C3663D1432A3D1C84 + +========== + +KEYSIZE=192 + +PT=00000000000000000000000000000000 + +I=1 +KEY=800000000000000000000000000000000000000000000000 +CT=DE885DC87F5A92594082D02CC1E1B42C + +I=2 +KEY=400000000000000000000000000000000000000000000000 +CT=C749194F94673F9DD2AA1932849630C1 + +I=3 +KEY=200000000000000000000000000000000000000000000000 +CT=0CEF643313912934D310297B90F56ECC + +I=4 +KEY=100000000000000000000000000000000000000000000000 +CT=C4495D39D4A553B225FBA02A7B1B87E1 + +I=5 +KEY=080000000000000000000000000000000000000000000000 +CT=636D10B1A0BCAB541D680A7970ADC830 + +I=6 +KEY=040000000000000000000000000000000000000000000000 +CT=07CF045786BD6AFCC147D99E45A901A7 + +I=7 +KEY=020000000000000000000000000000000000000000000000 +CT=6A8E3F425A7599348F95398448827976 + +I=8 +KEY=010000000000000000000000000000000000000000000000 +CT=5518276836148A00D91089A20D8BFF57 + +I=9 +KEY=008000000000000000000000000000000000000000000000 +CT=F267E07B5E87E3BC20B969C61D4FCB06 + +I=10 +KEY=004000000000000000000000000000000000000000000000 +CT=5A1CDE69571D401BFCD20DEBADA2212C + +I=11 +KEY=002000000000000000000000000000000000000000000000 +CT=70A9057263254701D12ADD7D74CD509E + +I=12 +KEY=001000000000000000000000000000000000000000000000 +CT=35713A7E108031279388A33A0FE2E190 + +I=13 +KEY=000800000000000000000000000000000000000000000000 +CT=E74EDE82B1254714F0C7B4B243108655 + +I=14 +KEY=000400000000000000000000000000000000000000000000 +CT=39272E3100FAA37B55B862320D1B3EB3 + +I=15 +KEY=000200000000000000000000000000000000000000000000 +CT=6D6E24C659FC5AEF712F77BCA19C9DD0 + +I=16 +KEY=000100000000000000000000000000000000000000000000 +CT=76D18212F972370D3CC2C6C372C6CF2F + +I=17 +KEY=000080000000000000000000000000000000000000000000 +CT=B21A1F0BAE39E55C7594ED570A7783EA + +I=18 +KEY=000040000000000000000000000000000000000000000000 +CT=77DE202111895AC48DD1C974B358B458 + +I=19 +KEY=000020000000000000000000000000000000000000000000 +CT=67810B311969012AAF7B504FFAF39FD1 + +I=20 +KEY=000010000000000000000000000000000000000000000000 +CT=C22EA2344D3E9417A6BA07843E713AEA + +I=21 +KEY=000008000000000000000000000000000000000000000000 +CT=C79CAF4B97BEE0BD0630AB354539D653 + +I=22 +KEY=000004000000000000000000000000000000000000000000 +CT=135FD1AF761D9AE23DF4AA6B86760DB4 + +I=23 +KEY=000002000000000000000000000000000000000000000000 +CT=D4659D0B06ACD4D56AB8D11A16FD83B9 + +I=24 +KEY=000001000000000000000000000000000000000000000000 +CT=F7D270028FC188E4E4F35A4AAA25D4D4 + +I=25 +KEY=000000800000000000000000000000000000000000000000 +CT=345CAE5A8C9620A9913D5473985852FF + +I=26 +KEY=000000400000000000000000000000000000000000000000 +CT=4E8980ADDE60B0E42C0B287FEA41E729 + +I=27 +KEY=000000200000000000000000000000000000000000000000 +CT=F11B6D74E1F15155633DC39743C1A527 + +I=28 +KEY=000000100000000000000000000000000000000000000000 +CT=9C87916C0180064F9D3179C6F5DD8C35 + +I=29 +KEY=000000080000000000000000000000000000000000000000 +CT=71AB186BCAEA518E461D4F7FAD230E6A + +I=30 +KEY=000000040000000000000000000000000000000000000000 +CT=C4A31BBC3DAAF742F9141C2A5001A49C + +I=31 +KEY=000000020000000000000000000000000000000000000000 +CT=E7C47B7B1D40F182A8928C8A55671D07 + +I=32 +KEY=000000010000000000000000000000000000000000000000 +CT=8E17F294B28FA373C6249538868A7EEF + +I=33 +KEY=000000008000000000000000000000000000000000000000 +CT=754404096A5CBC08AF09491BE249141A + +I=34 +KEY=000000004000000000000000000000000000000000000000 +CT=101CB56E55F05D86369B6D1069204F0A + +I=35 +KEY=000000002000000000000000000000000000000000000000 +CT=73F19BB6604205C6EE227B9759791E41 + +I=36 +KEY=000000001000000000000000000000000000000000000000 +CT=6270C0028F0D136C37A56B2CB64D24D6 + +I=37 +KEY=000000000800000000000000000000000000000000000000 +CT=A3BF7C2C38D1114A087ECF212E694346 + +I=38 +KEY=000000000400000000000000000000000000000000000000 +CT=49CABFF2CEF7D9F95F5EFB1F7A1A7DDE + +I=39 +KEY=000000000200000000000000000000000000000000000000 +CT=EC7F8A47CC59B849469255AD49F62752 + +I=40 +KEY=000000000100000000000000000000000000000000000000 +CT=68FAE55A13EFAF9B07B3552A8A0DC9D1 + +I=41 +KEY=000000000080000000000000000000000000000000000000 +CT=211E6B19C69FAEF481F64F24099CDA65 + +I=42 +KEY=000000000040000000000000000000000000000000000000 +CT=DBB918C75BC5732416F79FB0C8EE4C5C + +I=43 +KEY=000000000020000000000000000000000000000000000000 +CT=98D494E5D963A6C8B92536D3EC35E3FD + +I=44 +KEY=000000000010000000000000000000000000000000000000 +CT=C9A873404D403D6F074190851D67781A + +I=45 +KEY=000000000008000000000000000000000000000000000000 +CT=073AEF4A7C77D921928CB0DD9D27CAE7 + +I=46 +KEY=000000000004000000000000000000000000000000000000 +CT=89BDE25CEE36FDE769A10E52298CF90F + +I=47 +KEY=000000000002000000000000000000000000000000000000 +CT=26D0842D37EAD38557C65E0A5E5F122E + +I=48 +KEY=000000000001000000000000000000000000000000000000 +CT=F8294BA375AF46B3F22905BBAFFAB107 + +I=49 +KEY=000000000000800000000000000000000000000000000000 +CT=2AD63EB4D0D43813B979CF72B35BDB94 + +I=50 +KEY=000000000000400000000000000000000000000000000000 +CT=7710C171EE0F4EFA39BE4C995180181D + +I=51 +KEY=000000000000200000000000000000000000000000000000 +CT=C0CB2B40DBA7BE8C0698FAE1E4B80FF8 + +I=52 +KEY=000000000000100000000000000000000000000000000000 +CT=97970E505194622FD955CA1B80B784E9 + +I=53 +KEY=000000000000080000000000000000000000000000000000 +CT=7CB1824B29F850900DF2CAD9CF04C1CF + +I=54 +KEY=000000000000040000000000000000000000000000000000 +CT=FDF4F036BB988E42F2F62DE63FE19A64 + +I=55 +KEY=000000000000020000000000000000000000000000000000 +CT=08908CFE2C82606B2C15DF61B75CF3E2 + +I=56 +KEY=000000000000010000000000000000000000000000000000 +CT=B3AA689EF2D07FF365ACB9ADBA2AF07A + +I=57 +KEY=000000000000008000000000000000000000000000000000 +CT=F2672CD8EAA3B98776660D0263656F5C + +I=58 +KEY=000000000000004000000000000000000000000000000000 +CT=5BDEAC00E986687B9E1D94A0DA7BF452 + +I=59 +KEY=000000000000002000000000000000000000000000000000 +CT=E6D57BD66EA1627363EE0C4B711B0B21 + +I=60 +KEY=000000000000001000000000000000000000000000000000 +CT=03730DD6ACB4AD9996A63BE7765EC06F + +I=61 +KEY=000000000000000800000000000000000000000000000000 +CT=A470E361AA5437B2BE8586D2F78DE582 + +I=62 +KEY=000000000000000400000000000000000000000000000000 +CT=7567FEEFA559911FD479670246B484E3 + +I=63 +KEY=000000000000000200000000000000000000000000000000 +CT=29829DEA15A4E7A4C049045E7B106E29 + +I=64 +KEY=000000000000000100000000000000000000000000000000 +CT=A407834C3D89D48A2CB7A152208FA4ED + +I=65 +KEY=000000000000000080000000000000000000000000000000 +CT=68F948053F78FEF0D8F9FE7EF3A89819 + +I=66 +KEY=000000000000000040000000000000000000000000000000 +CT=B605174CAB13AD8FE3B20DA3AE7B0234 + +I=67 +KEY=000000000000000020000000000000000000000000000000 +CT=CCAB8F0AEBFF032893996D383CBFDBFA + +I=68 +KEY=000000000000000010000000000000000000000000000000 +CT=AF14BB8428C9730B7DC17B6C1CBEBCC8 + +I=69 +KEY=000000000000000008000000000000000000000000000000 +CT=5A41A21332040877EB7B89E8E80D19FE + +I=70 +KEY=000000000000000004000000000000000000000000000000 +CT=AC1BA52EFCDDE368B1596F2F0AD893A0 + +I=71 +KEY=000000000000000002000000000000000000000000000000 +CT=41B890E31B9045E6ECDC1BC3F2DB9BCC + +I=72 +KEY=000000000000000001000000000000000000000000000000 +CT=4D54A549728E55B19A23660424A0F146 + +I=73 +KEY=000000000000000000800000000000000000000000000000 +CT=A917581F41C47C7DDCFFD5285E2D6A61 + +I=74 +KEY=000000000000000000400000000000000000000000000000 +CT=604DF24BA6099B93A7405A524D764FCB + +I=75 +KEY=000000000000000000200000000000000000000000000000 +CT=78D9D156F28B190E232D1B7AE7FC730A + +I=76 +KEY=000000000000000000100000000000000000000000000000 +CT=5A12C39E442CD7F27B3CD77F5D029582 + +I=77 +KEY=000000000000000000080000000000000000000000000000 +CT=FF2BF2F47CF7B0F28EE25AF95DBF790D + +I=78 +KEY=000000000000000000040000000000000000000000000000 +CT=1863BB7D193BDA39DF090659EB8AE48B + +I=79 +KEY=000000000000000000020000000000000000000000000000 +CT=38178F2FB4CFCF31E87E1ABCDC023EB5 + +I=80 +KEY=000000000000000000010000000000000000000000000000 +CT=F5B13DC690CC0D541C6BA533023DC8C9 + +I=81 +KEY=000000000000000000008000000000000000000000000000 +CT=48EC05238D7375D126DC9D08884D4827 + +I=82 +KEY=000000000000000000004000000000000000000000000000 +CT=ACD0D81139691B310B92A6E377BACC87 + +I=83 +KEY=000000000000000000002000000000000000000000000000 +CT=9A4AA43578B55CE9CC178F0D2E162C79 + +I=84 +KEY=000000000000000000001000000000000000000000000000 +CT=08AD94BC737DB3C87D49B9E01B720D81 + +I=85 +KEY=000000000000000000000800000000000000000000000000 +CT=3BCFB2D5D210E8332900C5991D551A2A + +I=86 +KEY=000000000000000000000400000000000000000000000000 +CT=C5F0C6B9397ACB29635CE1A0DA2D8D96 + +I=87 +KEY=000000000000000000000200000000000000000000000000 +CT=844A29EFC693E2FA9900F87FBF5DCD5F + +I=88 +KEY=000000000000000000000100000000000000000000000000 +CT=5126A1C41051FEA158BE41200E1EA59D + +I=89 +KEY=000000000000000000000080000000000000000000000000 +CT=302123CA7B4F46D667FFFB0EB6AA7703 + +I=90 +KEY=000000000000000000000040000000000000000000000000 +CT=A9D16BCE7DB5C024277709EE2A88D91A + +I=91 +KEY=000000000000000000000020000000000000000000000000 +CT=F013C5EC123A26CFC34B598C992A996B + +I=92 +KEY=000000000000000000000010000000000000000000000000 +CT=E38A825CD971A1D2E56FB1DBA248F2A8 + +I=93 +KEY=000000000000000000000008000000000000000000000000 +CT=6E701773C0311E0BD4C5A097406D22B3 + +I=94 +KEY=000000000000000000000004000000000000000000000000 +CT=754262CEF0C64BE4C3E67C35ABE439F7 + +I=95 +KEY=000000000000000000000002000000000000000000000000 +CT=C9C2D4C47DF7D55CFA0EE5F1FE5070F4 + +I=96 +KEY=000000000000000000000001000000000000000000000000 +CT=6AB4BEA85B172573D8BD2D5F4329F13D + +I=97 +KEY=000000000000000000000000800000000000000000000000 +CT=11F03EF28E2CC9AE5165C587F7396C8C + +I=98 +KEY=000000000000000000000000400000000000000000000000 +CT=0682F2EB1A68BAC7949922C630DD27FA + +I=99 +KEY=000000000000000000000000200000000000000000000000 +CT=ABB0FEC0413D659AFE8E3DCF6BA873BB + +I=100 +KEY=000000000000000000000000100000000000000000000000 +CT=FE86A32E19F805D6569B2EFADD9C92AA + +I=101 +KEY=000000000000000000000000080000000000000000000000 +CT=E434E472275D1837D3D717F2EECC88C3 + +I=102 +KEY=000000000000000000000000040000000000000000000000 +CT=74E57DCD12A21D26EF8ADAFA5E60469A + +I=103 +KEY=000000000000000000000000020000000000000000000000 +CT=C275429D6DAD45DDD423FA63C816A9C1 + +I=104 +KEY=000000000000000000000000010000000000000000000000 +CT=7F6EC1A9AE729E86F7744AED4B8F4F07 + +I=105 +KEY=000000000000000000000000008000000000000000000000 +CT=48B5A71AB9292BD4F9E608EF102636B2 + +I=106 +KEY=000000000000000000000000004000000000000000000000 +CT=076FB95D5F536C78CBED3181BCCF3CF1 + +I=107 +KEY=000000000000000000000000002000000000000000000000 +CT=BFA76BEA1E684FD3BF9256119EE0BC0F + +I=108 +KEY=000000000000000000000000001000000000000000000000 +CT=7D395923D56577F3FF8670998F8C4A71 + +I=109 +KEY=000000000000000000000000000800000000000000000000 +CT=BA02C986E529AC18A882C34BA389625F + +I=110 +KEY=000000000000000000000000000400000000000000000000 +CT=3DFCF2D882AFE75D3A191193013A84B5 + +I=111 +KEY=000000000000000000000000000200000000000000000000 +CT=FAD1FDE1D0241784B63080D2C74D236C + +I=112 +KEY=000000000000000000000000000100000000000000000000 +CT=7D6C80D39E41F007A14FB9CD2B2C15CD + +I=113 +KEY=000000000000000000000000000080000000000000000000 +CT=7975F401FC10637BB33EA2DB058FF6EC + +I=114 +KEY=000000000000000000000000000040000000000000000000 +CT=657983865C55A818F02B7FCD52ED7E99 + +I=115 +KEY=000000000000000000000000000020000000000000000000 +CT=B32BEB1776F9827FF4C3AC9997E84B20 + +I=116 +KEY=000000000000000000000000000010000000000000000000 +CT=2AE2C7C374F0A41E3D46DBC3E66BB59F + +I=117 +KEY=000000000000000000000000000008000000000000000000 +CT=4D835E4ABDD4BDC6B88316A6E931A07F + +I=118 +KEY=000000000000000000000000000004000000000000000000 +CT=E07EFABFF1C353F7384EBB87B435A3F3 + +I=119 +KEY=000000000000000000000000000002000000000000000000 +CT=ED3088DC3FAF89AD87B4356FF1BB09C2 + +I=120 +KEY=000000000000000000000000000001000000000000000000 +CT=4324D01140C156FC898C2E32BA03FB05 + +I=121 +KEY=000000000000000000000000000000800000000000000000 +CT=BE15D016FACB5BAFBC24FA9289132166 + +I=122 +KEY=000000000000000000000000000000400000000000000000 +CT=AC9B7048EDB1ACF4D97A5B0B3F50884B + +I=123 +KEY=000000000000000000000000000000200000000000000000 +CT=448BECE1F86C7845DFA9A4BB2A016FB3 + +I=124 +KEY=000000000000000000000000000000100000000000000000 +CT=10DD445E87686EB46EA9B1ABC49257F0 + +I=125 +KEY=000000000000000000000000000000080000000000000000 +CT=B7FCCF7659FA756D4B7303EEA6C07458 + +I=126 +KEY=000000000000000000000000000000040000000000000000 +CT=289117115CA3513BAA7640B1004872C2 + +I=127 +KEY=000000000000000000000000000000020000000000000000 +CT=57CB42F7EE7186051F50B93FFA7B35BF + +I=128 +KEY=000000000000000000000000000000010000000000000000 +CT=F2741BFBFB81663B9136802FB9C3126A + +I=129 +KEY=000000000000000000000000000000008000000000000000 +CT=E32DDDC5C7398C096E3BD535B31DB5CE + +I=130 +KEY=000000000000000000000000000000004000000000000000 +CT=81D3C204E608AF9CC713EAEBCB72433F + +I=131 +KEY=000000000000000000000000000000002000000000000000 +CT=D4DEEF4BFC36AAA579496E6935F8F98E + +I=132 +KEY=000000000000000000000000000000001000000000000000 +CT=C356DB082B97802B038571C392C5C8F6 + +I=133 +KEY=000000000000000000000000000000000800000000000000 +CT=A3919ECD4861845F2527B77F06AC6A4E + +I=134 +KEY=000000000000000000000000000000000400000000000000 +CT=A53858E17A2F802A20E40D44494FFDA0 + +I=135 +KEY=000000000000000000000000000000000200000000000000 +CT=5D989E122B78C758921EDBEEB827F0C0 + +I=136 +KEY=000000000000000000000000000000000100000000000000 +CT=4B1C0C8F9E7830CC3C4BE7BD226FA8DE + +I=137 +KEY=000000000000000000000000000000000080000000000000 +CT=82C40C5FD897FBCA7B899C70713573A1 + +I=138 +KEY=000000000000000000000000000000000040000000000000 +CT=ED13EE2D45E00F75CCDB51EA8E3E36AD + +I=139 +KEY=000000000000000000000000000000000020000000000000 +CT=F121799EEFE8432423176A3CCF6462BB + +I=140 +KEY=000000000000000000000000000000000010000000000000 +CT=4FA0C06F07997E98271DD86F7B355C50 + +I=141 +KEY=000000000000000000000000000000000008000000000000 +CT=849EB364B4E81D058649DC5B1BF029B9 + +I=142 +KEY=000000000000000000000000000000000004000000000000 +CT=F48F9E0DE8DE7AD944A207809335D9B1 + +I=143 +KEY=000000000000000000000000000000000002000000000000 +CT=E59E9205B5A81A4FD26DFCF308966022 + +I=144 +KEY=000000000000000000000000000000000001000000000000 +CT=3A91A1BE14AAE9ED700BDF9D70018804 + +I=145 +KEY=000000000000000000000000000000000000800000000000 +CT=8ABAD78DCB79A48D79070E7DA89664EC + +I=146 +KEY=000000000000000000000000000000000000400000000000 +CT=B68377D98AAE6044938A7457F6C649D9 + +I=147 +KEY=000000000000000000000000000000000000200000000000 +CT=E4E1275C42F5F1B63D662C099D6CE33D + +I=148 +KEY=000000000000000000000000000000000000100000000000 +CT=7DEF32A34C6BE668F17DA1BB193B06EF + +I=149 +KEY=000000000000000000000000000000000000080000000000 +CT=78B6000CC3D30CB3A74B68D0EDBD2B53 + +I=150 +KEY=000000000000000000000000000000000000040000000000 +CT=0A47531DE88DD8AE5C23EAE4F7D1F2D5 + +I=151 +KEY=000000000000000000000000000000000000020000000000 +CT=667B24E8000CF68231EC484581D922E5 + +I=152 +KEY=000000000000000000000000000000000000010000000000 +CT=39DAA5EBD4AACAE130E9C33236C52024 + +I=153 +KEY=000000000000000000000000000000000000008000000000 +CT=E3C88760B3CB21360668A63E55BB45D1 + +I=154 +KEY=000000000000000000000000000000000000004000000000 +CT=F131EE903C1CDB49D416866FD5D8DE51 + +I=155 +KEY=000000000000000000000000000000000000002000000000 +CT=7A1916135B0447CF4033FC13047A583A + +I=156 +KEY=000000000000000000000000000000000000001000000000 +CT=F7D55FB27991143DCDFA90DDF0424FCB + +I=157 +KEY=000000000000000000000000000000000000000800000000 +CT=EA93E7D1CA1111DBD8F7EC111A848C0C + +I=158 +KEY=000000000000000000000000000000000000000400000000 +CT=2A689E39DFD3CBCBE221326E95888779 + +I=159 +KEY=000000000000000000000000000000000000000200000000 +CT=C1CE399CA762318AC2C40D1928B4C57D + +I=160 +KEY=000000000000000000000000000000000000000100000000 +CT=D43FB6F2B2879C8BFAF0092DA2CA63ED + +I=161 +KEY=000000000000000000000000000000000000000080000000 +CT=224563E617158DF97650AF5D130E78A5 + +I=162 +KEY=000000000000000000000000000000000000000040000000 +CT=6562FDF6833B7C4F7484AE6EBCC243DD + +I=163 +KEY=000000000000000000000000000000000000000020000000 +CT=93D58BA7BED22615D661D002885A7457 + +I=164 +KEY=000000000000000000000000000000000000000010000000 +CT=9A0EF559003AD9E52D3E09ED3C1D3320 + +I=165 +KEY=000000000000000000000000000000000000000008000000 +CT=96BAF5A7DC6F3DD27EB4C717A85D261C + +I=166 +KEY=000000000000000000000000000000000000000004000000 +CT=B8762E06884900E8452293190E19CCDB + +I=167 +KEY=000000000000000000000000000000000000000002000000 +CT=785416A22BD63CBABF4B1789355197D3 + +I=168 +KEY=000000000000000000000000000000000000000001000000 +CT=A0D20CE1489BAA69A3612DCE90F7ABF6 + +I=169 +KEY=000000000000000000000000000000000000000000800000 +CT=700244E93DC94230CC607FFBA0E48F32 + +I=170 +KEY=000000000000000000000000000000000000000000400000 +CT=85329E476829F872A2B4A7E59F91FF2D + +I=171 +KEY=000000000000000000000000000000000000000000200000 +CT=E4219B4935D988DB719B8B8B2B53D247 + +I=172 +KEY=000000000000000000000000000000000000000000100000 +CT=6ACDD04FD13D4DB4409FE8DD13FD737B + +I=173 +KEY=000000000000000000000000000000000000000000080000 +CT=9EB7A670AB59E15BE582378701C1EC14 + +I=174 +KEY=000000000000000000000000000000000000000000040000 +CT=29DF2D6935FE657763BC7A9F22D3D492 + +I=175 +KEY=000000000000000000000000000000000000000000020000 +CT=99303359D4A13AFDBE6C784028CE533A + +I=176 +KEY=000000000000000000000000000000000000000000010000 +CT=FF5C70A6334545F33B9DBF7BEA0417CA + +I=177 +KEY=000000000000000000000000000000000000000000008000 +CT=289F58A17E4C50EDA4269EFB3DF55815 + +I=178 +KEY=000000000000000000000000000000000000000000004000 +CT=EA35DCB416E9E1C2861D1682F062B5EB + +I=179 +KEY=000000000000000000000000000000000000000000002000 +CT=3A47BF354BE775383C50B0C0A83E3A58 + +I=180 +KEY=000000000000000000000000000000000000000000001000 +CT=BF6C1DC069FB95D05D43B01D8206D66B + +I=181 +KEY=000000000000000000000000000000000000000000000800 +CT=046D1D580D5898DA6595F32FD1F0C33D + +I=182 +KEY=000000000000000000000000000000000000000000000400 +CT=5F57803B7B82A110F7E9855D6A546082 + +I=183 +KEY=000000000000000000000000000000000000000000000200 +CT=25336ECF34E7BE97862CDFF715FF05A8 + +I=184 +KEY=000000000000000000000000000000000000000000000100 +CT=ACBAA2A943D8078022D693890E8C4FEF + +I=185 +KEY=000000000000000000000000000000000000000000000080 +CT=3947597879F6B58E4E2F0DF825A83A38 + +I=186 +KEY=000000000000000000000000000000000000000000000040 +CT=4EB8CC3335496130655BF3CA570A4FC0 + +I=187 +KEY=000000000000000000000000000000000000000000000020 +CT=BBDA7769AD1FDA425E18332D97868824 + +I=188 +KEY=000000000000000000000000000000000000000000000010 +CT=5E7532D22DDB0829A29C868198397154 + +I=189 +KEY=000000000000000000000000000000000000000000000008 +CT=E66DA67B630AB7AE3E682855E1A1698E + +I=190 +KEY=000000000000000000000000000000000000000000000004 +CT=4D93800F671B48559A64D1EA030A590A + +I=191 +KEY=000000000000000000000000000000000000000000000002 +CT=F33159FCC7D9AE30C062CD3B322AC764 + +I=192 +KEY=000000000000000000000000000000000000000000000001 +CT=8BAE4EFB70D33A9792EEA9BE70889D72 + +========== + +KEYSIZE=256 + +PT=00000000000000000000000000000000 + +I=1 +KEY=8000000000000000000000000000000000000000000000000000000000000000 +CT=E35A6DCB19B201A01EBCFA8AA22B5759 + +I=2 +KEY=4000000000000000000000000000000000000000000000000000000000000000 +CT=5075C2405B76F22F553488CAE47CE90B + +I=3 +KEY=2000000000000000000000000000000000000000000000000000000000000000 +CT=49DF95D844A0145A7DE01C91793302D3 + +I=4 +KEY=1000000000000000000000000000000000000000000000000000000000000000 +CT=E7396D778E940B8418A86120E5F421FE + +I=5 +KEY=0800000000000000000000000000000000000000000000000000000000000000 +CT=05F535C36FCEDE4657BE37F4087DB1EF + +I=6 +KEY=0400000000000000000000000000000000000000000000000000000000000000 +CT=D0C1DDDD10DA777C68AB36AF51F2C204 + +I=7 +KEY=0200000000000000000000000000000000000000000000000000000000000000 +CT=1C55FB811B5C6464C4E5DE1535A75514 + +I=8 +KEY=0100000000000000000000000000000000000000000000000000000000000000 +CT=52917F3AE957D5230D3A2AF57C7B5A71 + +I=9 +KEY=0080000000000000000000000000000000000000000000000000000000000000 +CT=C6E3D5501752DD5E9AEF086D6B45D705 + +I=10 +KEY=0040000000000000000000000000000000000000000000000000000000000000 +CT=A24A9C7AF1D9B1E17E1C9A3E711B3FA7 + +I=11 +KEY=0020000000000000000000000000000000000000000000000000000000000000 +CT=B881ECA724A6D43DBC6B96F6F59A0D20 + +I=12 +KEY=0010000000000000000000000000000000000000000000000000000000000000 +CT=EC524D9A24DFFF2A9639879B83B8E137 + +I=13 +KEY=0008000000000000000000000000000000000000000000000000000000000000 +CT=34C4F345F5466215A037F443635D6F75 + +I=14 +KEY=0004000000000000000000000000000000000000000000000000000000000000 +CT=5BA5055BEDB8895F672E29F2EB5A355D + +I=15 +KEY=0002000000000000000000000000000000000000000000000000000000000000 +CT=B3F692AA3A435259EBBEF9B51AD1E08D + +I=16 +KEY=0001000000000000000000000000000000000000000000000000000000000000 +CT=414FEB4376F2C64A5D2FBB2ED531BA7D + +I=17 +KEY=0000800000000000000000000000000000000000000000000000000000000000 +CT=A20D519E3BCA3303F07E81719F61605E + +I=18 +KEY=0000400000000000000000000000000000000000000000000000000000000000 +CT=A08D10E520AF811F45BD60A2DC0DC4B1 + +I=19 +KEY=0000200000000000000000000000000000000000000000000000000000000000 +CT=B06893A8C563C430E6F3858826EFBBE4 + +I=20 +KEY=0000100000000000000000000000000000000000000000000000000000000000 +CT=0FFEE26AE2D3929C6BD9C6BEDFF84409 + +I=21 +KEY=0000080000000000000000000000000000000000000000000000000000000000 +CT=4D0F5E906ED77801FC0EF53EDC5F9E2B + +I=22 +KEY=0000040000000000000000000000000000000000000000000000000000000000 +CT=8B6EC00119AD8B026DCE56EA7DEFE930 + +I=23 +KEY=0000020000000000000000000000000000000000000000000000000000000000 +CT=69026591D43363EE9D83B5007F0B484E + +I=24 +KEY=0000010000000000000000000000000000000000000000000000000000000000 +CT=27135D86950C6A2F86872706279A4761 + +I=25 +KEY=0000008000000000000000000000000000000000000000000000000000000000 +CT=35E6DB8723F281DA410C3AC8535ED77C + +I=26 +KEY=0000004000000000000000000000000000000000000000000000000000000000 +CT=57427CF214B8C28E4BBF487CCB8D0E09 + +I=27 +KEY=0000002000000000000000000000000000000000000000000000000000000000 +CT=6DF01BF56E5131AC87F96E99CAB86367 + +I=28 +KEY=0000001000000000000000000000000000000000000000000000000000000000 +CT=3856C5B55790B768BBF7D43031579BCF + +I=29 +KEY=0000000800000000000000000000000000000000000000000000000000000000 +CT=1E6ED8FB7C15BC4D2F63BA7037ED44D0 + +I=30 +KEY=0000000400000000000000000000000000000000000000000000000000000000 +CT=E1B2ED6CD8D93D455534E401156D4BCF + +I=31 +KEY=0000000200000000000000000000000000000000000000000000000000000000 +CT=EFBCCA5BDFDAD10E875F02336212CE36 + +I=32 +KEY=0000000100000000000000000000000000000000000000000000000000000000 +CT=0B777F02FD18DCE2646DCFE868DFAFAD + +I=33 +KEY=0000000080000000000000000000000000000000000000000000000000000000 +CT=C8A104B5693D1B14F5BF1F10100BF508 + +I=34 +KEY=0000000040000000000000000000000000000000000000000000000000000000 +CT=4CCE6615244AFCB38408FECE219962EA + +I=35 +KEY=0000000020000000000000000000000000000000000000000000000000000000 +CT=F99E7845D3A255B394C9C050CBA258B1 + +I=36 +KEY=0000000010000000000000000000000000000000000000000000000000000000 +CT=B4AFBB787F9BCFB7B55FDF447F611295 + +I=37 +KEY=0000000008000000000000000000000000000000000000000000000000000000 +CT=AE1C426A697FAF2808B7EF6ADDB5C020 + +I=38 +KEY=0000000004000000000000000000000000000000000000000000000000000000 +CT=7572F92811A85B9BDD38DEAD9945BCAE + +I=39 +KEY=0000000002000000000000000000000000000000000000000000000000000000 +CT=71BC7AA46E43FB95A181527D9F6A360F + +I=40 +KEY=0000000001000000000000000000000000000000000000000000000000000000 +CT=5542EF2923066F1EC8F546DD0D8E7CA8 + +I=41 +KEY=0000000000800000000000000000000000000000000000000000000000000000 +CT=6B92317C7D623790B748FDD7EFC42422 + +I=42 +KEY=0000000000400000000000000000000000000000000000000000000000000000 +CT=0FE7C097E899C71EF045360F8D6C25CF + +I=43 +KEY=0000000000200000000000000000000000000000000000000000000000000000 +CT=4ECE7EE107D0264D04693151C25B9DF6 + +I=44 +KEY=0000000000100000000000000000000000000000000000000000000000000000 +CT=FD6AE687CBFCA9E301045888D3BB9605 + +I=45 +KEY=0000000000080000000000000000000000000000000000000000000000000000 +CT=476B579C8556C7254424902CC1D6D36E + +I=46 +KEY=0000000000040000000000000000000000000000000000000000000000000000 +CT=4133CBCDFDD6B8860A1FC18665D6D71B + +I=47 +KEY=0000000000020000000000000000000000000000000000000000000000000000 +CT=3B36EC2664798C108B816812C65DFDC7 + +I=48 +KEY=0000000000010000000000000000000000000000000000000000000000000000 +CT=364E20A234FEA385D48DC5A09C9E70CF + +I=49 +KEY=0000000000008000000000000000000000000000000000000000000000000000 +CT=4A4BA25969DE3F5EE5642C71AAD0EFD1 + +I=50 +KEY=0000000000004000000000000000000000000000000000000000000000000000 +CT=E42CBAAE43297F67A76C1C501BB79E36 + +I=51 +KEY=0000000000002000000000000000000000000000000000000000000000000000 +CT=23CEDEDA4C15B4C037E8C61492217937 + +I=52 +KEY=0000000000001000000000000000000000000000000000000000000000000000 +CT=A1719147A1F4A1A1180BD16E8593DCDE + +I=53 +KEY=0000000000000800000000000000000000000000000000000000000000000000 +CT=AB82337E9FB0EC60D1F25A1D0014192C + +I=54 +KEY=0000000000000400000000000000000000000000000000000000000000000000 +CT=74BF2D8FC5A8388DF1A3A4D7D33FC164 + +I=55 +KEY=0000000000000200000000000000000000000000000000000000000000000000 +CT=D5B493317E6FBC6FFFD664B3C491368A + +I=56 +KEY=0000000000000100000000000000000000000000000000000000000000000000 +CT=BA767381586DA56A2A8D503D5F7ADA0B + +I=57 +KEY=0000000000000080000000000000000000000000000000000000000000000000 +CT=E8E6BC57DFE9CCADB0DECABF4E5CF91F + +I=58 +KEY=0000000000000040000000000000000000000000000000000000000000000000 +CT=3C8E5A5CDC9CEED90815D1F84BB2998C + +I=59 +KEY=0000000000000020000000000000000000000000000000000000000000000000 +CT=283843020BA38F056001B2FD585F7CC9 + +I=60 +KEY=0000000000000010000000000000000000000000000000000000000000000000 +CT=D8ADC7426F623ECE8741A70621D28870 + +I=61 +KEY=0000000000000008000000000000000000000000000000000000000000000000 +CT=D7C5C215592D06F00E6A80DA69A28EA9 + +I=62 +KEY=0000000000000004000000000000000000000000000000000000000000000000 +CT=52CF6FA433C3C870CAC70190358F7F16 + +I=63 +KEY=0000000000000002000000000000000000000000000000000000000000000000 +CT=F63D442A584DA71786ADEC9F3346DF75 + +I=64 +KEY=0000000000000001000000000000000000000000000000000000000000000000 +CT=549078F4B0CA7079B45F9A5ADAFAFD99 + +I=65 +KEY=0000000000000000800000000000000000000000000000000000000000000000 +CT=F2A5986EE4E9984BE2BAFB79EA8152FA + +I=66 +KEY=0000000000000000400000000000000000000000000000000000000000000000 +CT=8A74535017B4DB2776668A1FAE64384C + +I=67 +KEY=0000000000000000200000000000000000000000000000000000000000000000 +CT=E613342F57A97FD95DC088711A5D0ECD + +I=68 +KEY=0000000000000000100000000000000000000000000000000000000000000000 +CT=3FFAEBF6B22CF1DC82AE17CD48175B01 + +I=69 +KEY=0000000000000000080000000000000000000000000000000000000000000000 +CT=BAFD52EFA15C248CCBF9757735E6B1CE + +I=70 +KEY=0000000000000000040000000000000000000000000000000000000000000000 +CT=7AF94BC018D9DDD4539D2DD1C6F4000F + +I=71 +KEY=0000000000000000020000000000000000000000000000000000000000000000 +CT=FE177AD61CA0FDB281086FBA8FE76803 + +I=72 +KEY=0000000000000000010000000000000000000000000000000000000000000000 +CT=74DBEA15E2E9285BAD163D7D534251B6 + +I=73 +KEY=0000000000000000008000000000000000000000000000000000000000000000 +CT=23DD21331B3A92F200FE56FF050FFE74 + +I=74 +KEY=0000000000000000004000000000000000000000000000000000000000000000 +CT=A69C5AA34AB20A858CAFA766EACED6D8 + +I=75 +KEY=0000000000000000002000000000000000000000000000000000000000000000 +CT=3F72BB4DF2A4F941A4A09CB78F04B97A + +I=76 +KEY=0000000000000000001000000000000000000000000000000000000000000000 +CT=72CC43577E1FD5FD14622D24D97FCDCC + +I=77 +KEY=0000000000000000000800000000000000000000000000000000000000000000 +CT=D83AF8EBE93E0B6B99CAFADE224937D1 + +I=78 +KEY=0000000000000000000400000000000000000000000000000000000000000000 +CT=44042329128D56CAA8D084C8BD769D1E + +I=79 +KEY=0000000000000000000200000000000000000000000000000000000000000000 +CT=14102D72290DE4F2C430ADD1ED64BA1D + +I=80 +KEY=0000000000000000000100000000000000000000000000000000000000000000 +CT=449124097B1ECD0AE7065206DF06F03C + +I=81 +KEY=0000000000000000000080000000000000000000000000000000000000000000 +CT=D060A99F8CC153A42E11E5F97BD7584A + +I=82 +KEY=0000000000000000000040000000000000000000000000000000000000000000 +CT=65605B3EA9261488D53E48602ADEA299 + +I=83 +KEY=0000000000000000000020000000000000000000000000000000000000000000 +CT=C5E5CAD7A208DE8EA6BE049EFE5C7346 + +I=84 +KEY=0000000000000000000010000000000000000000000000000000000000000000 +CT=4C280C46D2181646048DD5BC0C0831A5 + +I=85 +KEY=0000000000000000000008000000000000000000000000000000000000000000 +CT=5DD65CF37F2A0929559AABAFDA08E730 + +I=86 +KEY=0000000000000000000004000000000000000000000000000000000000000000 +CT=31F2335CAAF264172F69A693225E6D22 + +I=87 +KEY=0000000000000000000002000000000000000000000000000000000000000000 +CT=3E28B35F99A72662590DA96426DD377F + +I=88 +KEY=0000000000000000000001000000000000000000000000000000000000000000 +CT=570F40F5D7B20441486578ED344343BE + +I=89 +KEY=0000000000000000000000800000000000000000000000000000000000000000 +CT=C54308AD1C9E3B19F8B7417873045A8C + +I=90 +KEY=0000000000000000000000400000000000000000000000000000000000000000 +CT=CBF335E39CE13ADE2B696179E8FD0CE1 + +I=91 +KEY=0000000000000000000000200000000000000000000000000000000000000000 +CT=9C2FBF422355D8293083D51F4A3C18A9 + +I=92 +KEY=0000000000000000000000100000000000000000000000000000000000000000 +CT=5ED8B5A31ECEFAB16C9AA6986DA67BCE + +I=93 +KEY=0000000000000000000000080000000000000000000000000000000000000000 +CT=627815DCFC814ABC75900041B1DD7B59 + +I=94 +KEY=0000000000000000000000040000000000000000000000000000000000000000 +CT=9EF3E82A50A59F166260494F7A7F2CC3 + +I=95 +KEY=0000000000000000000000020000000000000000000000000000000000000000 +CT=878CD0D8D920888B5935D6C351128737 + +I=96 +KEY=0000000000000000000000010000000000000000000000000000000000000000 +CT=E44429474D6FC3084EB2A6B8B46AF754 + +I=97 +KEY=0000000000000000000000008000000000000000000000000000000000000000 +CT=EBAACF9641D54E1FB18D0A2BE4F19BE5 + +I=98 +KEY=0000000000000000000000004000000000000000000000000000000000000000 +CT=13B3BF497CEE780E123C7E193DEA3A01 + +I=99 +KEY=0000000000000000000000002000000000000000000000000000000000000000 +CT=6E8F381DE00A41161F0DF03B4155BFD4 + +I=100 +KEY=0000000000000000000000001000000000000000000000000000000000000000 +CT=35E4F29BBA2BAE01144910783C3FEF49 + +I=101 +KEY=0000000000000000000000000800000000000000000000000000000000000000 +CT=55B17BD66788CEAC366398A31F289FFB + +I=102 +KEY=0000000000000000000000000400000000000000000000000000000000000000 +CT=11341F56C0D6D1008D28741DAA7679CE + +I=103 +KEY=0000000000000000000000000200000000000000000000000000000000000000 +CT=4DF7253DF421D83358BDBE924745D98C + +I=104 +KEY=0000000000000000000000000100000000000000000000000000000000000000 +CT=BAE2EE651116D93EDC8E83B5F3347BE1 + +I=105 +KEY=0000000000000000000000000080000000000000000000000000000000000000 +CT=F9721ABD06709157183AF3965A659D9D + +I=106 +KEY=0000000000000000000000000040000000000000000000000000000000000000 +CT=19A1C252A613FE2860A4AE6D75CE6FA3 + +I=107 +KEY=0000000000000000000000000020000000000000000000000000000000000000 +CT=B5DDB2F5D9752C949FBDE3FFF5556C6E + +I=108 +KEY=0000000000000000000000000010000000000000000000000000000000000000 +CT=81B044FCFFC78ECCFCD171AAD0405C66 + +I=109 +KEY=0000000000000000000000000008000000000000000000000000000000000000 +CT=C640566D3C06020EB2C42F1D62E56A9B + +I=110 +KEY=0000000000000000000000000004000000000000000000000000000000000000 +CT=EA6C4BCF425291679FDFFD26A424FBCC + +I=111 +KEY=0000000000000000000000000002000000000000000000000000000000000000 +CT=57F6901465D9440D9F15EE2CBA5A4090 + +I=112 +KEY=0000000000000000000000000001000000000000000000000000000000000000 +CT=FBCFA74CADC7406260F63D96C8AAB6B1 + +I=113 +KEY=0000000000000000000000000000800000000000000000000000000000000000 +CT=DFF4F096CEA211D4BBDACA033D0EC7D1 + +I=114 +KEY=0000000000000000000000000000400000000000000000000000000000000000 +CT=1EE5190D551F0F42F675227A381296A9 + +I=115 +KEY=0000000000000000000000000000200000000000000000000000000000000000 +CT=F98E1905012E580F097623C10B93054F + +I=116 +KEY=0000000000000000000000000000100000000000000000000000000000000000 +CT=E7D43743D21DD3C9F168C86856558B9A + +I=117 +KEY=0000000000000000000000000000080000000000000000000000000000000000 +CT=632A9DDA730DAB67593C5D08D8AC1059 + +I=118 +KEY=0000000000000000000000000000040000000000000000000000000000000000 +CT=E084317000715B9057BC9DE9F3AB6124 + +I=119 +KEY=0000000000000000000000000000020000000000000000000000000000000000 +CT=61F9EF33A0BB4E666C2ED99101919FAB + +I=120 +KEY=0000000000000000000000000000010000000000000000000000000000000000 +CT=6DC1D68A11834657D46703C22578D59A + +I=121 +KEY=0000000000000000000000000000008000000000000000000000000000000000 +CT=53AC1548863D3D16F1D4DC7242E05F2C + +I=122 +KEY=0000000000000000000000000000004000000000000000000000000000000000 +CT=E82CD587A408306AD78CEAE0916B9F8C + +I=123 +KEY=0000000000000000000000000000002000000000000000000000000000000000 +CT=0FD2D40EA6AD17A3A767F0A8600D6295 + +I=124 +KEY=0000000000000000000000000000001000000000000000000000000000000000 +CT=AD84CC8255ADB39DFCA23F92761AE7E9 + +I=125 +KEY=0000000000000000000000000000000800000000000000000000000000000000 +CT=F4F20CF7D51BEE7DA024A2B11A7ECA0B + +I=126 +KEY=0000000000000000000000000000000400000000000000000000000000000000 +CT=5057691B85D9CE93A193214DB0A016B6 + +I=127 +KEY=0000000000000000000000000000000200000000000000000000000000000000 +CT=0F58C960876390BDEF4BB6BE95CAA1EE + +I=128 +KEY=0000000000000000000000000000000100000000000000000000000000000000 +CT=9A3E66EEBC21BC0BD9430B341EF465FA + +I=129 +KEY=0000000000000000000000000000000080000000000000000000000000000000 +CT=20415035F34B8BCBCB28ABF07F78F0D4 + +I=130 +KEY=0000000000000000000000000000000040000000000000000000000000000000 +CT=AC89FC7BA10479EBF10DE65BCEF89B3C + +I=131 +KEY=0000000000000000000000000000000020000000000000000000000000000000 +CT=068FA75A30BE443171AF3F6FEB1A20D2 + +I=132 +KEY=0000000000000000000000000000000010000000000000000000000000000000 +CT=50E02F213246C525A8C27700CA34B502 + +I=133 +KEY=0000000000000000000000000000000008000000000000000000000000000000 +CT=227DA47D5A0906DB3AB042BB0A695FB6 + +I=134 +KEY=0000000000000000000000000000000004000000000000000000000000000000 +CT=8663AC30ED12514F1DE46777F4514BFC + +I=135 +KEY=0000000000000000000000000000000002000000000000000000000000000000 +CT=A987D4BC12E1DE9F4B6DF43567C34A8B + +I=136 +KEY=0000000000000000000000000000000001000000000000000000000000000000 +CT=6D5A0370F599ACA605F63B04E5143D0C + +I=137 +KEY=0000000000000000000000000000000000800000000000000000000000000000 +CT=9809266E378B07B7AFDB3BAA97B7E442 + +I=138 +KEY=0000000000000000000000000000000000400000000000000000000000000000 +CT=8F753252B30CCCACE12D9A301F4D5090 + +I=139 +KEY=0000000000000000000000000000000000200000000000000000000000000000 +CT=032465F6C0CE34D41962F561692A1AFF + +I=140 +KEY=0000000000000000000000000000000000100000000000000000000000000000 +CT=C50E9AD5BEB8F3B00821DD47FF8AC093 + +I=141 +KEY=0000000000000000000000000000000000080000000000000000000000000000 +CT=9C6FEA3D46268D54A6829B2AD25BB276 + +I=142 +KEY=0000000000000000000000000000000000040000000000000000000000000000 +CT=0FD8575E87706F561343D7B3A41E044A + +I=143 +KEY=0000000000000000000000000000000000020000000000000000000000000000 +CT=BEE9BEB3739540D88CBCE77925F0A114 + +I=144 +KEY=0000000000000000000000000000000000010000000000000000000000000000 +CT=D24EAEE7FFFBAC3D6F26C2DCE0DCDE28 + +I=145 +KEY=0000000000000000000000000000000000008000000000000000000000000000 +CT=47771A90398FF0F7FA821C2F8F5E1398 + +I=146 +KEY=0000000000000000000000000000000000004000000000000000000000000000 +CT=4639741B6F84B135AD118C8249B64ED0 + +I=147 +KEY=0000000000000000000000000000000000002000000000000000000000000000 +CT=8EE5505EC85567697A3306F250A27720 + +I=148 +KEY=0000000000000000000000000000000000001000000000000000000000000000 +CT=7C8A19AC1AEFBC5E0119D91A5F05D4C2 + +I=149 +KEY=0000000000000000000000000000000000000800000000000000000000000000 +CT=5141B9B672E54773B672E3A6C424887B + +I=150 +KEY=0000000000000000000000000000000000000400000000000000000000000000 +CT=B5A2D3CD206653C6402F34FB0AE3613D + +I=151 +KEY=0000000000000000000000000000000000000200000000000000000000000000 +CT=0F5BD9408738231D114B0A82753279A3 + +I=152 +KEY=0000000000000000000000000000000000000100000000000000000000000000 +CT=FEF033FF4268EA487FC74C5E43A45338 + +I=153 +KEY=0000000000000000000000000000000000000080000000000000000000000000 +CT=A3EDC09DCD529B113910D904AD855581 + +I=154 +KEY=0000000000000000000000000000000000000040000000000000000000000000 +CT=AB8FBB6F27A0AC7C55B59FDD36B72F1C + +I=155 +KEY=0000000000000000000000000000000000000020000000000000000000000000 +CT=EEA44D5ED4D769CC930CD83D8999EC46 + +I=156 +KEY=0000000000000000000000000000000000000010000000000000000000000000 +CT=6972276803AE9AA7C6F431AB10979C34 + +I=157 +KEY=0000000000000000000000000000000000000008000000000000000000000000 +CT=86DEAA9F39244101818178474D7DBDE9 + +I=158 +KEY=0000000000000000000000000000000000000004000000000000000000000000 +CT=88C6B466EA361D662D8D08CBF181F4FE + +I=159 +KEY=0000000000000000000000000000000000000002000000000000000000000000 +CT=91AB2C6B7C63FF59F7CBEEBF91B20B95 + +I=160 +KEY=0000000000000000000000000000000000000001000000000000000000000000 +CT=2DFE6C146AD5B3D8C3C1718F13B48E01 + +I=161 +KEY=0000000000000000000000000000000000000000800000000000000000000000 +CT=C7CFF1623451711391A302EEC3584AAA + +I=162 +KEY=0000000000000000000000000000000000000000400000000000000000000000 +CT=089FE845CC05011686C66019D18BE050 + +I=163 +KEY=0000000000000000000000000000000000000000200000000000000000000000 +CT=08C8410B9B427211A67124B0DCCEAD48 + +I=164 +KEY=0000000000000000000000000000000000000000100000000000000000000000 +CT=8D91592F5566085254784606334D7629 + +I=165 +KEY=0000000000000000000000000000000000000000080000000000000000000000 +CT=3298FEAAF2E1201D6299FF8846639C97 + +I=166 +KEY=0000000000000000000000000000000000000000040000000000000000000000 +CT=C497CB9F0BDFE0EFC8C2F3F90760AA72 + +I=167 +KEY=0000000000000000000000000000000000000000020000000000000000000000 +CT=2788AFD046E0309CBE4424690DA2AB89 + +I=168 +KEY=0000000000000000000000000000000000000000010000000000000000000000 +CT=E9891707F25EF29FEE372890D4258982 + +I=169 +KEY=0000000000000000000000000000000000000000008000000000000000000000 +CT=DB041D94A23D45D4D4DCED5A030CAF61 + +I=170 +KEY=0000000000000000000000000000000000000000004000000000000000000000 +CT=FFAFDBF0ECB18DF9EA02C27077448E6D + +I=171 +KEY=0000000000000000000000000000000000000000002000000000000000000000 +CT=2DAAA42A7D0A1D3B0E4761D99CF2150A + +I=172 +KEY=0000000000000000000000000000000000000000001000000000000000000000 +CT=3B7A54CB7CF30ABE263DD6ED5BFE8D63 + +I=173 +KEY=0000000000000000000000000000000000000000000800000000000000000000 +CT=EEFA090174C590C448A55D43648F534A + +I=174 +KEY=0000000000000000000000000000000000000000000400000000000000000000 +CT=9E15798731ED42F43EA2740A691DA872 + +I=175 +KEY=0000000000000000000000000000000000000000000200000000000000000000 +CT=31FBD661540A5DEAAD1017CFD3909EC8 + +I=176 +KEY=0000000000000000000000000000000000000000000100000000000000000000 +CT=CDA9AE05F224140E28CB951721B44D6A + +I=177 +KEY=0000000000000000000000000000000000000000000080000000000000000000 +CT=0C5BC512C60A1EAC3434EFB1A8FBB182 + +I=178 +KEY=0000000000000000000000000000000000000000000040000000000000000000 +CT=AA863610DEEEEB62D045E87EA30B59B5 + +I=179 +KEY=0000000000000000000000000000000000000000000020000000000000000000 +CT=6AC2448DE568D279C7EEBE1DF403920C + +I=180 +KEY=0000000000000000000000000000000000000000000010000000000000000000 +CT=E2011E3D292B26888AE801215FD0CB40 + +I=181 +KEY=0000000000000000000000000000000000000000000008000000000000000000 +CT=E06F3E15EE3A61672D1C99BADE5B9DBE + +I=182 +KEY=0000000000000000000000000000000000000000000004000000000000000000 +CT=BB7027F0548CF6712CEB4C7A4B28E178 + +I=183 +KEY=0000000000000000000000000000000000000000000002000000000000000000 +CT=061EC21FB70FADBDF87C3BD2AE23825B + +I=184 +KEY=0000000000000000000000000000000000000000000001000000000000000000 +CT=4C21F26FE94ABBAC381352375314C3EB + +I=185 +KEY=0000000000000000000000000000000000000000000000800000000000000000 +CT=F7CEE6DD99909C2B569EEDA61ED8942E + +I=186 +KEY=0000000000000000000000000000000000000000000000400000000000000000 +CT=CE98C4A876C65E4CCB261EBB1D9DF7F5 + +I=187 +KEY=0000000000000000000000000000000000000000000000200000000000000000 +CT=A5491881CF833C3604ABC08044F402AC + +I=188 +KEY=0000000000000000000000000000000000000000000000100000000000000000 +CT=A1BA16E64CCCB3087D57A768507B0BFC + +I=189 +KEY=0000000000000000000000000000000000000000000000080000000000000000 +CT=D55951E202D2949EBD3BE43120C738BF + +I=190 +KEY=0000000000000000000000000000000000000000000000040000000000000000 +CT=EBB8E43069E69F450EFEC65DCD52B7FD + +I=191 +KEY=0000000000000000000000000000000000000000000000020000000000000000 +CT=2B292135663B4AA5ABFE9423D57E7EE9 + +I=192 +KEY=0000000000000000000000000000000000000000000000010000000000000000 +CT=E91BF974B3BE3AD966249D8655292A85 + +I=193 +KEY=0000000000000000000000000000000000000000000000008000000000000000 +CT=384365998EAA9562236CC58F6ADF9610 + +I=194 +KEY=0000000000000000000000000000000000000000000000004000000000000000 +CT=C2E997012AA3D4D8D359C9A947CBE69F + +I=195 +KEY=0000000000000000000000000000000000000000000000002000000000000000 +CT=F49421204148BA213BE87E2D5C22B0BF + +I=196 +KEY=0000000000000000000000000000000000000000000000001000000000000000 +CT=82ED0ED9953AA92E4DF30929CA65C00F + +I=197 +KEY=0000000000000000000000000000000000000000000000000800000000000000 +CT=291EB1D11653C8479437C74A977F5106 + +I=198 +KEY=0000000000000000000000000000000000000000000000000400000000000000 +CT=BCB997B1939B8983ABD550D6025683E3 + +I=199 +KEY=0000000000000000000000000000000000000000000000000200000000000000 +CT=1FBA2592C6F489775CAADA71F9B983E9 + +I=200 +KEY=0000000000000000000000000000000000000000000000000100000000000000 +CT=969F66F217AF1A3DB9E41C1B29039824 + +I=201 +KEY=0000000000000000000000000000000000000000000000000080000000000000 +CT=A54BB7D6B17E423AC0A7744C19073CB8 + +I=202 +KEY=0000000000000000000000000000000000000000000000000040000000000000 +CT=B0AC6E6578D1021F47DCF9748A32EAD5 + +I=203 +KEY=0000000000000000000000000000000000000000000000000020000000000000 +CT=B87B361C3B7B194C77A4358D4669153E + +I=204 +KEY=0000000000000000000000000000000000000000000000000010000000000000 +CT=46A133847F96EAA8282A799DC8899D58 + +I=205 +KEY=0000000000000000000000000000000000000000000000000008000000000000 +CT=2265EC3A9F2D5C9547A091CC8CFB18EA + +I=206 +KEY=0000000000000000000000000000000000000000000000000004000000000000 +CT=54CBF3A6FC4FE56D426117AA1FFD1DDE + +I=207 +KEY=0000000000000000000000000000000000000000000000000002000000000000 +CT=5312877CCEAB6CFB0905394A370A8003 + +I=208 +KEY=0000000000000000000000000000000000000000000000000001000000000000 +CT=7190BD6EC613FE38B84ECFE28F702FE4 + +I=209 +KEY=0000000000000000000000000000000000000000000000000000800000000000 +CT=D1FA5B9CA89A43B04C05F0EF29EF68CD + +I=210 +KEY=0000000000000000000000000000000000000000000000000000400000000000 +CT=808285751548ED934FD1056D2D9AE8BA + +I=211 +KEY=0000000000000000000000000000000000000000000000000000200000000000 +CT=2758DEF3E7B95A9AE89777BE64D5A6CF + +I=212 +KEY=0000000000000000000000000000000000000000000000000000100000000000 +CT=07D81F87DB3E0ACC82B01E08FB22F3C1 + +I=213 +KEY=0000000000000000000000000000000000000000000000000000080000000000 +CT=8DA250E5553D650711A75EE1CB4FD1C7 + +I=214 +KEY=0000000000000000000000000000000000000000000000000000040000000000 +CT=A93D946BD0E87F32719DF5F158CEE669 + +I=215 +KEY=0000000000000000000000000000000000000000000000000000020000000000 +CT=03945236EC2A4D4EAF30B8ABEB54330D + +I=216 +KEY=0000000000000000000000000000000000000000000000000000010000000000 +CT=11CC35301F24B79DDE31AEA2D1354F88 + +I=217 +KEY=0000000000000000000000000000000000000000000000000000008000000000 +CT=E73715B3E8D9A290F44AE6FFBF247E5D + +I=218 +KEY=0000000000000000000000000000000000000000000000000000004000000000 +CT=7345E07732B71CB158BBF64CCA5C5B96 + +I=219 +KEY=0000000000000000000000000000000000000000000000000000002000000000 +CT=6E128F296D24705A1924FD9B70C4ED04 + +I=220 +KEY=0000000000000000000000000000000000000000000000000000001000000000 +CT=95A789776F036783FBD330947083F54F + +I=221 +KEY=0000000000000000000000000000000000000000000000000000000800000000 +CT=360DEC2533EA4AA2E3E54FD3DE2906EB + +I=222 +KEY=0000000000000000000000000000000000000000000000000000000400000000 +CT=E68EFD7FECF4D601EA22727BD764965B + +I=223 +KEY=0000000000000000000000000000000000000000000000000000000200000000 +CT=9065C64A8BFF44AC33EDBB611CF83D7B + +I=224 +KEY=0000000000000000000000000000000000000000000000000000000100000000 +CT=8F33C8DF2A7A51CE8090E8F123BC3723 + +I=225 +KEY=0000000000000000000000000000000000000000000000000000000080000000 +CT=807F391FFBA8291BA625623210F99018 + +I=226 +KEY=0000000000000000000000000000000000000000000000000000000040000000 +CT=5E8B3F3A701522CE5CAA761C929D6292 + +I=227 +KEY=0000000000000000000000000000000000000000000000000000000020000000 +CT=3BA404DC38735A78289E3809E8364835 + +I=228 +KEY=0000000000000000000000000000000000000000000000000000000010000000 +CT=D23BEDBAD229F8305DC425B6B759DCC9 + +I=229 +KEY=0000000000000000000000000000000000000000000000000000000008000000 +CT=44880F21CF5913040AE376AEE2A10AD8 + +I=230 +KEY=0000000000000000000000000000000000000000000000000000000004000000 +CT=9BC98E29D057C0E828C3B5CCE69256C1 + +I=231 +KEY=0000000000000000000000000000000000000000000000000000000002000000 +CT=B293CC7A975DA141A68279368057CC41 + +I=232 +KEY=0000000000000000000000000000000000000000000000000000000001000000 +CT=8D60FB87ACD91385B313BE5F1D7BD30F + +I=233 +KEY=0000000000000000000000000000000000000000000000000000000000800000 +CT=2C8E56132D70291B303C48FDF75543CD + +I=234 +KEY=0000000000000000000000000000000000000000000000000000000000400000 +CT=D1F80035B826791F6CE4E59B7DB1BB0D + +I=235 +KEY=0000000000000000000000000000000000000000000000000000000000200000 +CT=42CE6224FC36469339A133DD08173BD4 + +I=236 +KEY=0000000000000000000000000000000000000000000000000000000000100000 +CT=61817155EA41BCBA2AF7F06AE7CBF585 + +I=237 +KEY=0000000000000000000000000000000000000000000000000000000000080000 +CT=D1923A9866068D2EF5FB77D57C3315B6 + +I=238 +KEY=0000000000000000000000000000000000000000000000000000000000040000 +CT=B37CBDB5D719F49691CA968EF2E84140 + +I=239 +KEY=0000000000000000000000000000000000000000000000000000000000020000 +CT=EC974E653A055D7F8F22171030F68E1D + +I=240 +KEY=0000000000000000000000000000000000000000000000000000000000010000 +CT=DDE5D3B9AAD9C32213BB3675A822499C + +I=241 +KEY=0000000000000000000000000000000000000000000000000000000000008000 +CT=D3B6E9216EA1AE57EB1C628A3C38AB78 + +I=242 +KEY=0000000000000000000000000000000000000000000000000000000000004000 +CT=82C99ECC69472B7E96324B042AE8B87A + +I=243 +KEY=0000000000000000000000000000000000000000000000000000000000002000 +CT=97144DC5338C43600F84439C0AA0D147 + +I=244 +KEY=0000000000000000000000000000000000000000000000000000000000001000 +CT=400AC4A0BBADA1DB2121EB144C7E5209 + +I=245 +KEY=0000000000000000000000000000000000000000000000000000000000000800 +CT=EFD9D550EB419ED278F4885A490AB54C + +I=246 +KEY=0000000000000000000000000000000000000000000000000000000000000400 +CT=2AB7816E149B7C0404C88A8857793670 + +I=247 +KEY=0000000000000000000000000000000000000000000000000000000000000200 +CT=5B591DFF9E8DEE15BAD24C025DBCA481 + +I=248 +KEY=0000000000000000000000000000000000000000000000000000000000000100 +CT=0C06633E30721C3749F49AD8CBF2B754 + +I=249 +KEY=0000000000000000000000000000000000000000000000000000000000000080 +CT=96D6D31A41B5123B2035FD91A921D4CA + +I=250 +KEY=0000000000000000000000000000000000000000000000000000000000000040 +CT=E7F6C34D86668BC2805CA7793C5E86AD + +I=251 +KEY=0000000000000000000000000000000000000000000000000000000000000020 +CT=F46DFF5FF500D6879C4D3E45CF0CF0F3 + +I=252 +KEY=0000000000000000000000000000000000000000000000000000000000000010 +CT=60D842D9C61DA7495C116197B7CECBBE + +I=253 +KEY=0000000000000000000000000000000000000000000000000000000000000008 +CT=D45B24EDB673353EBDF248B8FA06B67A + +I=254 +KEY=0000000000000000000000000000000000000000000000000000000000000004 +CT=119EAEBCC165D0BD02C0D35DC82EF992 + +I=255 +KEY=0000000000000000000000000000000000000000000000000000000000000002 +CT=E673143680414ADA301D0ED34626B9FE + +I=256 +KEY=0000000000000000000000000000000000000000000000000000000000000001 +CT=6B6CFE160A6263631B292F879EEFF926 + ========== \ No newline at end of file --- krb5-1.4.4.orig/src/lib/crypto/aes/test/cbc_d_m.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/cbc_d_m.txt @@ -1,7224 +1,7224 @@ - -========================= - -FILENAME: "cbc_d_m.txt" - -Cipher Block Chaining (CBC) Mode - DECRYPTION -Monte Carlo Test - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========== - -KEYSIZE=128 - -I=0 -KEY=00000000000000000000000000000000 -IV=00000000000000000000000000000000 -CT=00000000000000000000000000000000 -PT=FACA37E0B0C85373DF706E73F7C9AF86 - -I=1 -KEY=FACA37E0B0C85373DF706E73F7C9AF86 -IV=52D0C29FF8793A519BD6A8289FC80E6A -CT=FACA37E0B0C85373DF706E73F7C9AF86 -PT=F5372F9735C5685F1DA362AF6ECB2940 - -I=2 -KEY=0FFD1877850D3B2CC2D30CDC990286C6 -IV=DD74BB1AC6F0F866C7992C61F59D5594 -CT=F5372F9735C5685F1DA362AF6ECB2940 -PT=5496A4C29C7670F61B5D5DF6181F5947 - -I=3 -KEY=5B6BBCB5197B4BDAD98E512A811DDF81 -IV=3795C88134F7C011433397D1443FEB3A -CT=5496A4C29C7670F61B5D5DF6181F5947 -PT=940CC5A2AF4F1F8D1862B47BCF63E4CA - -I=4 -KEY=CF677917B6345457C1ECE5514E7E3B4B -IV=0FC1413900225B47AF9E139E1650EA23 -CT=940CC5A2AF4F1F8D1862B47BCF63E4CA -PT=08832415D97820DE305A58A9AD111A9E - -I=5 -KEY=C7E45D026F4C7489F1B6BDF8E36F21D5 -IV=3032F64674FA243D61DF8C16313D81F3 -CT=08832415D97820DE305A58A9AD111A9E -PT=BD4089775FD1BDB0A6C4F36D1DDAA93E - -I=6 -KEY=7AA4D475309DC93957724E95FEB588EB -IV=47D7F440B43888F173AE5A492F1A99F8 -CT=BD4089775FD1BDB0A6C4F36D1DDAA93E -PT=AB9955F74612859267D61FEA85A75ADC - -I=7 -KEY=D13D8182768F4CAB30A4517F7B12D237 -IV=6D9E57242195D27771D1C7A748378AB0 -CT=AB9955F74612859267D61FEA85A75ADC -PT=168F213FB678D8A46D0E55EFD1C49BB3 - -I=8 -KEY=C7B2A0BDC0F7940F5DAA0490AAD64984 -IV=1B98968FB5ABD95930525C1257DEB364 -CT=168F213FB678D8A46D0E55EFD1C49BB3 -PT=3C4CEECFF9560501C5D8C901D87C8E7B - -I=9 -KEY=FBFE4E7239A1910E9872CD9172AAC7FF -IV=35EB7B6D3F63AAE927C5346C9C2CB91D -CT=3C4CEECFF9560501C5D8C901D87C8E7B -PT=9D206BE0CC60296BF3A486A8C69778EF - -I=10 -KEY=66DE2592F5C1B8656BD64B39B43DBF10 -IV=226646B36D8E9B9279F94378CCBF8FBA -CT=9D206BE0CC60296BF3A486A8C69778EF -PT=9DA7B8094BD0F0BEA26848C84B8E083C - -I=11 -KEY=FB799D9BBE1148DBC9BE03F1FFB3B72C -IV=3E3A2B0E1C70A19BCD7222708AA94F26 -CT=9DA7B8094BD0F0BEA26848C84B8E083C -PT=6A93B2F318C14C2D3E58455B86A4F5D7 - -I=12 -KEY=91EA2F68A6D004F6F7E646AA791742FB -IV=1F256942B3CD691858A20664BB24545E -CT=6A93B2F318C14C2D3E58455B86A4F5D7 -PT=4A19AC6C6FEB654D3675A2BE32E5A820 - -I=13 -KEY=DBF38304C93B61BBC193E4144BF2EADB -IV=631F2EDE05C1C950BCE67DF53BA53ED6 -CT=4A19AC6C6FEB654D3675A2BE32E5A820 -PT=799EAB8E9C864A13490FD6B089F764C5 - -I=14 -KEY=A26D288A55BD2BA8889C32A4C2058E1E -IV=F6AD064E0DBF4AF4AA5165E1FE0E86FA -CT=799EAB8E9C864A13490FD6B089F764C5 -PT=2FA3F38CA1216C6D911C1779F333413E - -I=15 -KEY=8DCEDB06F49C47C5198025DD3136CF20 -IV=DA039AC5F4EDCD84472B23CFA1252EC3 -CT=2FA3F38CA1216C6D911C1779F333413E -PT=2FC703AD6A7DAF8B0BDDD8586C1D67D0 - -I=16 -KEY=A209D8AB9EE1E84E125DFD855D2BA8F0 -IV=341B5FDA8AB434461A7B7A87EF0C530C -CT=2FC703AD6A7DAF8B0BDDD8586C1D67D0 -PT=54723CABFBE32DEEDFEBF4292A5710FA - -I=17 -KEY=F67BE4006502C5A0CDB609AC777CB80A -IV=2C42AD577B0BE057555C3FCB6FC0089E -CT=54723CABFBE32DEEDFEBF4292A5710FA -PT=6B1E2A8C1A9CBB95D1B34AAFE15A78D3 - -I=18 -KEY=9D65CE8C7F9E7E351C0543039626C0D9 -IV=E5E06583A834BF16118ED5FA401A2D6F -CT=6B1E2A8C1A9CBB95D1B34AAFE15A78D3 -PT=F4E57BFAB65375B3AD49CD78814F0C16 - -I=19 -KEY=6980B576C9CD0B86B14C8E7B1769CCCF -IV=71E59389FF6F992225B32960593F9362 -CT=F4E57BFAB65375B3AD49CD78814F0C16 -PT=90A31B5934FCF6822526C973114BD953 - -I=20 -KEY=F923AE2FFD31FD04946A47080622159C -IV=2A4B31492B9BAEC402C255978BB96D40 -CT=90A31B5934FCF6822526C973114BD953 -PT=61F88BA8D438A0FD23F0101465C7FD4E - -I=21 -KEY=98DB258729095DF9B79A571C63E5E8D2 -IV=607640CEA12DCF7F188B2B65C7F4153D -CT=61F88BA8D438A0FD23F0101465C7FD4E -PT=F62D206DF53F41CA898F3A8EB6A843FF - -I=22 -KEY=6EF605EADC361C333E156D92D54DAB2D -IV=D69C32E12303361B465BE9A484BCA723 -CT=F62D206DF53F41CA898F3A8EB6A843FF -PT=364BC3F9FDA5FB1AEEA7691550A58320 - -I=23 -KEY=58BDC6132193E729D0B2048785E8280D -IV=C207B8347B8DB8BC6845827BB6986B0E -CT=364BC3F9FDA5FB1AEEA7691550A58320 -PT=DAA6386A073CD1653E9A9DB0A97970BA - -I=24 -KEY=821BFE7926AF364CEE2899372C9158B7 -IV=6C5D2B186393280253D6922A8421C3A9 -CT=DAA6386A073CD1653E9A9DB0A97970BA -PT=AAF74F0E0A0141A811853AE8B120BC00 - -I=25 -KEY=28ECB1772CAE77E4FFADA3DF9DB1E4B7 -IV=3CB62EF0E649027DDDB76206D0F4D355 -CT=AAF74F0E0A0141A811853AE8B120BC00 -PT=22A0F9611447C1A85F397DD79E3206F9 - -I=26 -KEY=0A4C481638E9B64CA094DE080383E24E -IV=C4320FA90686AE0F9E979CBF1391F6D6 -CT=22A0F9611447C1A85F397DD79E3206F9 -PT=1871ABDEAA7E057E76D41ED9191FAC39 - -I=27 -KEY=123DE3C89297B332D640C0D11A9C4E77 -IV=FBFD18AADF7C5E8E96EB976A535BF312 -CT=1871ABDEAA7E057E76D41ED9191FAC39 -PT=BF52994F41B1DEF78C6A057642C52D89 - -I=28 -KEY=AD6F7A87D3266DC55A2AC5A7585963FE -IV=C195141578ADF4C92113C8A9A63FF072 -CT=BF52994F41B1DEF78C6A057642C52D89 -PT=3EAFB00E3B4A0E6DF74743A7EDAD0FE4 - -I=29 -KEY=93C0CA89E86C63A8AD6D8600B5F46C1A -IV=D1C4E98C4A9AC79B7CCBC052ACF78913 -CT=3EAFB00E3B4A0E6DF74743A7EDAD0FE4 -PT=4393544AB2387A93496D683C2B8970C7 - -I=30 -KEY=D0539EC35A54193BE400EE3C9E7D1CDD -IV=80517C6341DAF4DCBCCAE452F3040147 -CT=4393544AB2387A93496D683C2B8970C7 -PT=51DAC594293708A918E9EFC04F7F2F1C - -I=31 -KEY=81895B5773631192FCE901FCD10233C1 -IV=69DE50406B4E3E8A94C1367E1E3D5464 -CT=51DAC594293708A918E9EFC04F7F2F1C -PT=035B64F06C8166000C82BF15CC88446D - -I=32 -KEY=82D23FA71FE27792F06BBEE91D8A77AC -IV=8EA2E38145BBD79881B7EB31B8818A21 -CT=035B64F06C8166000C82BF15CC88446D -PT=F3EFFA770A21741551F309E1967CC2E4 - -I=33 -KEY=713DC5D015C30387A198B7088BF6B548 -IV=0DCAA309668E11509828152553FF2306 -CT=F3EFFA770A21741551F309E1967CC2E4 -PT=62BA0548E7AD136BEB4E38AECD7942D9 - -I=34 -KEY=1387C098F26E10EC4AD68FA6468FF791 -IV=D031FCA5F3C88926CC3BDDC448537B69 -CT=62BA0548E7AD136BEB4E38AECD7942D9 -PT=38E3D4C7AF0C3E494F1D580AC5430634 - -I=35 -KEY=2B64145F5D622EA505CBD7AC83CCF1A5 -IV=6FFA5A45EDA60294B0224EEB8C36C455 -CT=38E3D4C7AF0C3E494F1D580AC5430634 -PT=2231EB6A6588CBCB56B930B7F1CF9E04 - -I=36 -KEY=0955FF3538EAE56E5372E71B72036FA1 -IV=B5375674631ECC3334A318993CB81F9A -CT=2231EB6A6588CBCB56B930B7F1CF9E04 -PT=59692274C130D6820287EA10F7E64602 - -I=37 -KEY=503CDD41F9DA33EC51F50D0B85E529A3 -IV=A93D6E028B5C2BD17A29C6CA1617A0A2 -CT=59692274C130D6820287EA10F7E64602 -PT=5975A95327DE7749EA8DEDC580E5E8C7 - -I=38 -KEY=09497412DE0444A5BB78E0CE0500C164 -IV=26E00CB161145FCD00C39BC4FB1E5CBB -CT=5975A95327DE7749EA8DEDC580E5E8C7 -PT=D1F7E36BC8FF4439820CB617E745A9CC - -I=39 -KEY=D8BE977916FB009C397456D9E24568A8 -IV=72E78D9E15C8FBA864C6C40CEBB190B8 -CT=D1F7E36BC8FF4439820CB617E745A9CC -PT=76FB4F20C902E9AA89854440631092B5 - -I=40 -KEY=AE45D859DFF9E936B0F112998155FA1D -IV=4B6C585FEF52490EA62BAAD08FAA3DCF -CT=76FB4F20C902E9AA89854440631092B5 -PT=6D7D4487DCD624B2FC5002DFE7D2D347 - -I=41 -KEY=C3389CDE032FCD844CA110466687295A -IV=E94FD23A598DDE077CD1DAEE97FDADD9 -CT=6D7D4487DCD624B2FC5002DFE7D2D347 -PT=7297F8F85B21E1A5CB902DCC5F6738F9 - -I=42 -KEY=B1AF6426580E2C2187313D8A39E011A3 -IV=86E495D31EEFCBC30064414FBD78FAE5 -CT=7297F8F85B21E1A5CB902DCC5F6738F9 -PT=4A6978AACC6968931FB1B83D53D31FEF - -I=43 -KEY=FBC61C8C946744B2988085B76A330E4C -IV=6BA7664AB5ED4F7956D6C3FAA7C42961 -CT=4A6978AACC6968931FB1B83D53D31FEF -PT=6B63FAAF9DB43A2B6025F29B1D6A331C - -I=44 -KEY=90A5E62309D37E99F8A5772C77593D50 -IV=37D17D1702EA34A3C75376AA0F9D24AD -CT=6B63FAAF9DB43A2B6025F29B1D6A331C -PT=8317A07BEE0BF16B88D7D197884AC6CF - -I=45 -KEY=13B24658E7D88FF27072A6BBFF13FB9F -IV=29B89B238062495C260AF44C63AA809F -CT=8317A07BEE0BF16B88D7D197884AC6CF -PT=0443BFEBCA7C85CBD0CB66AB9D75425D - -I=46 -KEY=17F1F9B32DA40A39A0B9C0106266B9C2 -IV=08CF82854AE07429C4A866AA727CEA2E -CT=0443BFEBCA7C85CBD0CB66AB9D75425D -PT=6B1EB033CB844F9BDD96BA2C67D139C7 - -I=47 -KEY=7CEF4980E62045A27D2F7A3C05B78005 -IV=05579F3E0017EBF6083756DC0A50A2E9 -CT=6B1EB033CB844F9BDD96BA2C67D139C7 -PT=E7904CBFB41EBE4178B4D633AFC9B311 - -I=48 -KEY=9B7F053F523EFBE3059BAC0FAA7E3314 -IV=E6B2CB0CE57E02A230DCD16C08614823 -CT=E7904CBFB41EBE4178B4D633AFC9B311 -PT=96EAAA148F05FAD1F0FC06E135EC5DF8 - -I=49 -KEY=0D95AF2BDD3B0132F567AAEE9F926EEC -IV=4268294B10AD58BE9E570A9485963682 -CT=96EAAA148F05FAD1F0FC06E135EC5DF8 -PT=9F2F712F62DE747EE479A0A74384B196 - -I=50 -KEY=92BADE04BFE5754C111E0A49DC16DF7A -IV=A5C558F5D4658089CD9FB295EDAE64DB -CT=9F2F712F62DE747EE479A0A74384B196 -PT=9CF7F00094C4E2D96D752C2312FC135E - -I=51 -KEY=0E4D2E042B2197957C6B266ACEEACC24 -IV=1CE301F294BDF4C906E5F0A6FA7C22BB -CT=9CF7F00094C4E2D96D752C2312FC135E -PT=ABA58D548DB6E9BE977FDDC85E16C2DE - -I=52 -KEY=A5E8A350A6977E2BEB14FBA290FC0EFA -IV=66C1FF1E4B52A3542B48306EC33F171D -CT=ABA58D548DB6E9BE977FDDC85E16C2DE -PT=802948E1A5177FBE97ABA26B996FDF1B - -I=53 -KEY=25C1EBB1038001957CBF59C90993D1E1 -IV=197A546DEB2E19E17507276B9ED95135 -CT=802948E1A5177FBE97ABA26B996FDF1B -PT=67D931C0946ECDF2F8E41000726D1A56 - -I=54 -KEY=4218DA7197EECC67845B49C97BFECBB7 -IV=D11DA3CE92ADA0686F7BF12A4796D9F7 -CT=67D931C0946ECDF2F8E41000726D1A56 -PT=386C68821385E8CFCDD5678FE2AA89F8 - -I=55 -KEY=7A74B2F3846B24A8498E2E469954424F -IV=4DDE413EBC3F30E2F3A9F48DA1258DAF -CT=386C68821385E8CFCDD5678FE2AA89F8 -PT=1638C741EFE3B1CC45C7754783350825 - -I=56 -KEY=6C4C75B26B8895640C495B011A614A6A -IV=5B4F013B085E3A04A16A409E8C3BB270 -CT=1638C741EFE3B1CC45C7754783350825 -PT=91AB00C3828D3DF72BEC487EF4652567 - -I=57 -KEY=FDE77571E905A89327A5137FEE046F0D -IV=98074F522144682FF1498C61581F8B0E -CT=91AB00C3828D3DF72BEC487EF4652567 -PT=BC5BA874D2F3039837528993FB275EBA - -I=58 -KEY=41BCDD053BF6AB0B10F79AEC152331B7 -IV=B65C1A6F80CA024B92176D57061ECDFE -CT=BC5BA874D2F3039837528993FB275EBA -PT=B7DE1BEE1867F4DC3F974E0D8B416DB0 - -I=59 -KEY=F662C6EB23915FD72F60D4E19E625C07 -IV=7268C08FA807D83C9830F54A59F32662 -CT=B7DE1BEE1867F4DC3F974E0D8B416DB0 -PT=19769B9EB30B8DE5FD640ACE78F01F0A - -I=60 -KEY=EF145D75909AD232D204DE2FE692430D -IV=B260792BAB22BAAB6CCF3AE1DD3A0F85 -CT=19769B9EB30B8DE5FD640ACE78F01F0A -PT=2079F2C0A0DE164CD41FCE29D8CE3178 - -I=61 -KEY=CF6DAFB53044C47E061B10063E5C7275 -IV=6ABCE7B41E112B91B8E6BC0DBE37600C -CT=2079F2C0A0DE164CD41FCE29D8CE3178 -PT=0D3A678FAB06E743A9134C103B39B61D - -I=62 -KEY=C257C83A9B42233DAF085C160565C468 -IV=CEB1E776DBEF46BF8B949C0AF0EBEAD2 -CT=0D3A678FAB06E743A9134C103B39B61D -PT=80339ADB34BCDE3384D66170373AEEAC - -I=63 -KEY=426452E1AFFEFD0E2BDE3D66325F2AC4 -IV=EAAC373FCA05E610C1C5D4437AFD5631 -CT=80339ADB34BCDE3384D66170373AEEAC -PT=38D52D75E5783A08FBFE622633D6CF47 - -I=64 -KEY=7AB17F944A86C706D0205F400189E583 -IV=2A25ED6933CAAA95569ADA1AC7480942 -CT=38D52D75E5783A08FBFE622633D6CF47 -PT=3204F1EACBB520A69F0939F45BC82041 - -I=65 -KEY=48B58E7E8133E7A04F2966B45A41C5C2 -IV=9C6819799DAF61111ACC3C0ECEB0F8BF -CT=3204F1EACBB520A69F0939F45BC82041 -PT=16BD33EE541798BEE114E9D7F9141A9C - -I=66 -KEY=5E08BD90D5247F1EAE3D8F63A355DF5E -IV=C181F4DF1EE0E13BF76044A3DA5E3BC4 -CT=16BD33EE541798BEE114E9D7F9141A9C -PT=A0A68CF016C6AD8DAC4D5634EAADEBE5 - -I=67 -KEY=FEAE3160C3E2D2930270D95749F834BB -IV=2A4EE2CD011AF421616789DB790354FD -CT=A0A68CF016C6AD8DAC4D5634EAADEBE5 -PT=FCE7D92FD0B3A1C7920558F653E1019B - -I=68 -KEY=0249E84F13517354907581A11A193520 -IV=A7F7E2B701F34F308C0F28514DFAA15F -CT=FCE7D92FD0B3A1C7920558F653E1019B -PT=F16A084B2DE16D5E3E5405665DE3C623 - -I=69 -KEY=F323E0043EB01E0AAE2184C747FAF303 -IV=6D319828AAA75DFE99BEEDD21B983C7D -CT=F16A084B2DE16D5E3E5405665DE3C623 -PT=CE20AE629887DF02064F2D9DB092E1DB - -I=70 -KEY=3D034E66A637C108A86EA95AF76812D8 -IV=9484E76149F41901AF8AFD3152C56506 -CT=CE20AE629887DF02064F2D9DB092E1DB -PT=B457A655282213C1B7C5C2A206C7FCB9 - -I=71 -KEY=8954E8338E15D2C91FAB6BF8F1AFEE61 -IV=329E089DC915BD71B1F8D0713BFC4F97 -CT=B457A655282213C1B7C5C2A206C7FCB9 -PT=A89B8F7541FFF719A3C7DE1577CE1C3F - -I=72 -KEY=21CF6746CFEA25D0BC6CB5ED8661F25E -IV=FA381CAC5777234E6DF8A28A4E6671D8 -CT=A89B8F7541FFF719A3C7DE1577CE1C3F -PT=C4E73D25647350527C1F93F6C1D90296 - -I=73 -KEY=E5285A63AB997582C073261B47B8F0C8 -IV=082ACF3D2661514F0E00BDABC9015946 -CT=C4E73D25647350527C1F93F6C1D90296 -PT=34BF6DECECFE1C9AE3AA34B6DB3741EF - -I=74 -KEY=D197378F4767691823D912AD9C8FB127 -IV=3E56B658F899B6DBBA4EAF6E629F3555 -CT=34BF6DECECFE1C9AE3AA34B6DB3741EF -PT=FD86C78538176DC5D48BE2EC6B89D581 - -I=75 -KEY=2C11F00A7F7004DDF752F041F70664A6 -IV=765B823193F2738E6CACBB0154C941B1 -CT=FD86C78538176DC5D48BE2EC6B89D581 -PT=524E035AB9DEB29E467B9586A90F3A42 - -I=76 -KEY=7E5FF350C6AEB643B12965C75E095EE4 -IV=DE2B3EC0A3FF29EC67BBE1B124E9451A -CT=524E035AB9DEB29E467B9586A90F3A42 -PT=83DE1E768EED94BA09E623845A057834 - -I=77 -KEY=FD81ED26484322F9B8CF4643040C26D0 -IV=A5CF4D996D8460E71DDA938461BB884B -CT=83DE1E768EED94BA09E623845A057834 -PT=D8381D17B9BCF942F408DBB2B7B2D6B7 - -I=78 -KEY=25B9F031F1FFDBBB4CC79DF1B3BEF067 -IV=899696B8EDC4E8B60489742A2559C909 -CT=D8381D17B9BCF942F408DBB2B7B2D6B7 -PT=BF1D8175015D0A0341427DE1F7DDE379 - -I=79 -KEY=9AA47144F0A2D1B80D85E0104463131E -IV=AD76D13B2F2A3F938F5C810A38A83D09 -CT=BF1D8175015D0A0341427DE1F7DDE379 -PT=58114DEFF8CFF10F06B390EB01B13394 - -I=80 -KEY=C2B53CAB086D20B70B3670FB45D2208A -IV=9EC540C144AB57D4E5A9185F55E71E50 -CT=58114DEFF8CFF10F06B390EB01B13394 -PT=53E72B9603CE221F0160791DF51F6B3E - -I=81 -KEY=9152173D0BA302A80A5609E6B0CD4BB4 -IV=B780257238CA60FD998819B2D04CEB92 -CT=53E72B9603CE221F0160791DF51F6B3E -PT=AF0238554AAFFB0FB5DFAC35E3CE8F4C - -I=82 -KEY=3E502F68410CF9A7BF89A5D35303C4F8 -IV=3509BC884089ADEB90137A39AEA75CFC -CT=AF0238554AAFFB0FB5DFAC35E3CE8F4C -PT=20844D3F4F637B974D38B7E5F1C84205 - -I=83 -KEY=1ED462570E6F8230F2B11236A2CB86FD -IV=52BAB07EB72804630E4BD769F0172FDA -CT=20844D3F4F637B974D38B7E5F1C84205 -PT=68404E006D2F16572EDFAE636A62C537 - -I=84 -KEY=76942C5763409467DC6EBC55C8A943CA -IV=E4B417D85F36F3A25CF04AB05157F247 -CT=68404E006D2F16572EDFAE636A62C537 -PT=13C8DF4117D4EA3645F1825700F8FFA5 - -I=85 -KEY=655CF31674947E51999F3E02C851BC6F -IV=3FE0683442B6B5DF515209DE16F8FD4B -CT=13C8DF4117D4EA3645F1825700F8FFA5 -PT=42307D929439F2723202A5206D640431 - -I=86 -KEY=276C8E84E0AD8C23AB9D9B22A535B85E -IV=33FAD11D9D4057E7ED989F1520450C32 -CT=42307D929439F2723202A5206D640431 -PT=5ED8AF875ACF37BE8FAAC16D4AB8072B - -I=87 -KEY=79B42103BA62BB9D24375A4FEF8DBF75 -IV=807852E5AD0EB5E0C3A2AAF18DFB14F9 -CT=5ED8AF875ACF37BE8FAAC16D4AB8072B -PT=79C950A45ECDC8B676A5CFF324A81DA8 - -I=88 -KEY=007D71A7E4AF732B529295BCCB25A2DD -IV=516BC35B52C26C99E21C0147CB7DD99E -CT=79C950A45ECDC8B676A5CFF324A81DA8 -PT=595C3DDCFBD90661A3A70B94C470A26B - -I=89 -KEY=59214C7B1F76754AF1359E280F5500B6 -IV=FDABDD4BD60725F5E640629416F417D3 -CT=595C3DDCFBD90661A3A70B94C470A26B -PT=7957CF3989083D25B54C6890EC58DB0C - -I=90 -KEY=20768342967E486F4479F6B8E30DDBBA -IV=CADFADF417898DE3786D5DF869396611 -CT=7957CF3989083D25B54C6890EC58DB0C -PT=6C1E8DF34FC80DD2ECA00A1EDC5FC239 - -I=91 -KEY=4C680EB1D9B645BDA8D9FCA63F521983 -IV=A7DF9FA44AA2B49B9E26C6148CCAF36F -CT=6C1E8DF34FC80DD2ECA00A1EDC5FC239 -PT=72B5A426C9DC3B336756FB10B00626CE - -I=92 -KEY=3EDDAA97106A7E8ECF8F07B68F543F4D -IV=50FF574915D407A97A74CC399DE2D901 -CT=72B5A426C9DC3B336756FB10B00626CE -PT=194826159D7FAB9166D64F1DD6F627B0 - -I=93 -KEY=27958C828D15D51FA95948AB59A218FD -IV=A1E3BC848C019B6FC3F7072F9A866C52 -CT=194826159D7FAB9166D64F1DD6F627B0 -PT=0186B2316FC29104D3549C49F92AE414 - -I=94 -KEY=26133EB3E2D7441B7A0DD4E2A088FCE9 -IV=4DBA42F1031AE32016524C7F86781528 -CT=0186B2316FC29104D3549C49F92AE414 -PT=373384DB7383D3A4914C0141BB104B81 - -I=95 -KEY=1120BA68915497BFEB41D5A31B98B768 -IV=FFCB87107AC596D71BA807902D524247 -CT=373384DB7383D3A4914C0141BB104B81 -PT=25465CE5FA2AD65D75586064A18516A8 - -I=96 -KEY=3466E68D6B7E41E29E19B5C7BA1DA1C0 -IV=55879596C3F0A295FA00CFEF1B056248 -CT=25465CE5FA2AD65D75586064A18516A8 -PT=2311A52CEC4A16B5F4FCA613BC0BDB83 - -I=97 -KEY=177743A1873457576AE513D406167A43 -IV=B1A7DABF3D2384BF8754B829659B3989 -CT=2311A52CEC4A16B5F4FCA613BC0BDB83 -PT=357F4BF62308CD5C48F34E9E644DD515 - -I=98 -KEY=22080857A43C9A0B22165D4A625BAF56 -IV=72BF477FE8CF428CFA856323E18B3135 -CT=357F4BF62308CD5C48F34E9E644DD515 -PT=17758539D1896B92BFB811D30C9BA134 - -I=99 -KEY=357D8D6E75B5F1999DAE4C996EC00E62 -IV=4CBA048DFA50910EC94FE5D6AA5DD502 -CT=17758539D1896B92BFB811D30C9BA134 -PT=372B6DCEE44D18D3791C4E8FB0A91971 - -I=100 -KEY=0256E0A091F8E94AE4B20216DE691713 -IV=86F4F670CA3B191B860D6C8A9A35A872 -CT=372B6DCEE44D18D3791C4E8FB0A91971 -PT=66D3FABC4885C1F4897D9160C152D570 - -I=101 -KEY=64851A1CD97D28BE6DCF93761F3BC263 -IV=08490B2E8588FE564F0112D76D6108E9 -CT=66D3FABC4885C1F4897D9160C152D570 -PT=926278E71894F32B5E2A5A1F5FA695E7 - -I=102 -KEY=F6E762FBC1E9DB9533E5C969409D5784 -IV=D3A2E4AFFDD8A7CC1498EF0E812087B7 -CT=926278E71894F32B5E2A5A1F5FA695E7 -PT=A455F5D65D91563D9C15E6B745F29531 - -I=103 -KEY=52B2972D9C788DA8AFF02FDE056FC2B5 -IV=6CB8822EA67C247A6A0CBAD830B3562C -CT=A455F5D65D91563D9C15E6B745F29531 -PT=4544371A5E3A8E7AD9885AECD3868AF3 - -I=104 -KEY=17F6A037C24203D276787532D6E94846 -IV=93E3CAD8BE023F6451ADAA525988A974 -CT=4544371A5E3A8E7AD9885AECD3868AF3 -PT=8473F4F1D77AC1F46706EBD108CB48A5 - -I=105 -KEY=938554C61538C226117E9EE3DE2200E3 -IV=A7E7B354606EF4C1D00BF4F128CCE966 -CT=8473F4F1D77AC1F46706EBD108CB48A5 -PT=787ADE453DCE2FA7F6F24CD33C9A5CDC - -I=106 -KEY=EBFF8A8328F6ED81E78CD230E2B85C3F -IV=97A2CF706C1871B502D15B028C5F0D80 -CT=787ADE453DCE2FA7F6F24CD33C9A5CDC -PT=E6A7E5B65DC124FBE1C1FFFE18A34D8A - -I=107 -KEY=0D586F357537C97A064D2DCEFA1B11B5 -IV=9BBDCAF2A3CC7FC5BF6285631A4636FD -CT=E6A7E5B65DC124FBE1C1FFFE18A34D8A -PT=6A391E9F475546720836312BBEB0B3A9 - -I=108 -KEY=676171AA32628F080E7B1CE544ABA21C -IV=603EEDE91F925A2228537E8BDD26C96B -CT=6A391E9F475546720836312BBEB0B3A9 -PT=D75086BA446563AAB1873FDEBE611D67 - -I=109 -KEY=B031F7107607ECA2BFFC233BFACABF7B -IV=546B8CA37AACE2BC2C85014F2ACD6315 -CT=D75086BA446563AAB1873FDEBE611D67 -PT=63A4D826625CBD9F10083E62330BCFBC - -I=110 -KEY=D3952F36145B513DAFF41D59C9C170C7 -IV=BC2E6E9DD10152C8281B798F711A9334 -CT=63A4D826625CBD9F10083E62330BCFBC -PT=41275EFDFC86B5BDCCCDCA2BBFA5B90D - -I=111 -KEY=92B271CBE8DDE4806339D7727664C9CA -IV=D940A8D1B3448AA9148C7F6DFC266B00 -CT=41275EFDFC86B5BDCCCDCA2BBFA5B90D -PT=56AC1BCB285044710D26EFC42A0ABA56 - -I=112 -KEY=C41E6A00C08DA0F16E1F38B65C6E739C -IV=214238FF5F4D01F3A6694EC80E15BCF7 -CT=56AC1BCB285044710D26EFC42A0ABA56 -PT=5AF2877973AB9787E42202AC0C6E7538 - -I=113 -KEY=9EECED79B32637768A3D3A1A500006A4 -IV=561B4934904E327F3B3639CED6C7A995 -CT=5AF2877973AB9787E42202AC0C6E7538 -PT=787F52F6D9CD9085D782B95FD68F70F8 - -I=114 -KEY=E693BF8F6AEBA7F35DBF8345868F765C -IV=06B93FB1A99BD387A091509B8C6D3482 -CT=787F52F6D9CD9085D782B95FD68F70F8 -PT=E7B1DB917C92E488C6B02AC4C42AFD79 - -I=115 -KEY=0122641E1679437B9B0FA98142A58B25 -IV=1D57A61FED51218BD8C1357CE58F21EB -CT=E7B1DB917C92E488C6B02AC4C42AFD79 -PT=2FBAB770D511EACA849F654DE429DE84 - -I=116 -KEY=2E98D36EC368A9B11F90CCCCA68C55A1 -IV=CB311C43EC32D59941CEF81BB9CF4E57 -CT=2FBAB770D511EACA849F654DE429DE84 -PT=A8FE17AEA961C2A450DD5EAABAA19613 - -I=117 -KEY=8666C4C06A096B154F4D92661C2DC3B2 -IV=B9D7B74D62DD89A01EE3093A5C2A0470 -CT=A8FE17AEA961C2A450DD5EAABAA19613 -PT=D9E598A4DBAF82BDF9474BE13B997FF5 - -I=118 -KEY=5F835C64B1A6E9A8B60AD98727B4BC47 -IV=6398D8A38C38A9B54DCF18C0D76758BA -CT=D9E598A4DBAF82BDF9474BE13B997FF5 -PT=291DB2BC325CD7A94032E7C1208921A5 - -I=119 -KEY=769EEED883FA3E01F6383E46073D9DE2 -IV=4774C7E1BB97117BCA26A897B9302EFA -CT=291DB2BC325CD7A94032E7C1208921A5 -PT=DFC55866F85055F06E752E04AAC4C36A - -I=120 -KEY=A95BB6BE7BAA6BF1984D1042ADF95E88 -IV=BDA0616700CD2817FE4425F6F541E8C1 -CT=DFC55866F85055F06E752E04AAC4C36A -PT=7CACB3A88E7114F7737B05D0FB3AF7F3 - -I=121 -KEY=D5F70516F5DB7F06EB36159256C3A97B -IV=1EF4836BD363B89EE73911B14EBE9262 -CT=7CACB3A88E7114F7737B05D0FB3AF7F3 -PT=3282F1F6B3C04E325FB13E85D18CDBBC - -I=122 -KEY=E775F4E0461B3134B4872B17874F72C7 -IV=E35D47CEDBD30701A64FE504C6BC4199 -CT=3282F1F6B3C04E325FB13E85D18CDBBC -PT=BFB9748A3C825CDA3EA5D001F6AD305F - -I=123 -KEY=58CC806A7A996DEE8A22FB1671E24298 -IV=7A3676377E0B4F815B4B8C9A98DCAB4D -CT=BFB9748A3C825CDA3EA5D001F6AD305F -PT=B33787380A4C3BD5B32EC335916F9229 - -I=124 -KEY=EBFB075270D5563B390C3823E08DD0B1 -IV=B3E40B27DBF6D985D4F57BD4D2899DC8 -CT=B33787380A4C3BD5B32EC335916F9229 -PT=BCD5E40A3B4885ACA82BEC952BA8A973 - -I=125 -KEY=572EE3584B9DD3979127D4B6CB2579C2 -IV=897608FE3238F80CD24192CC64F4F695 -CT=BCD5E40A3B4885ACA82BEC952BA8A973 -PT=793E22E0B01FFE63E89C84A0D0FE1216 - -I=126 -KEY=2E10C1B8FB822DF479BB50161BDB6BD4 -IV=D84401CF83566FEA8FB859C446C22632 -CT=793E22E0B01FFE63E89C84A0D0FE1216 -PT=96858A96FEB19712B10A44FBF8E633D9 - -I=127 -KEY=B8954B2E0533BAE6C8B114EDE33D580D -IV=7210E127BFB706EF9CD24139C0927E01 -CT=96858A96FEB19712B10A44FBF8E633D9 -PT=28A34CC75A215117331D6B88387E16F8 - -I=128 -KEY=903607E95F12EBF1FBAC7F65DB434EF5 -IV=744B8DD281919F79FC529DA15AA0F18F -CT=28A34CC75A215117331D6B88387E16F8 -PT=43FE41DC9FFB88F93ADC43D41BA3E4B2 - -I=129 -KEY=D3C84635C0E96308C1703CB1C0E0AA47 -IV=5C7379A90F1E47F88C7424E8CD31E55D -CT=43FE41DC9FFB88F93ADC43D41BA3E4B2 -PT=66D6D0E84CEB8672D38DDE557CCCFFF6 - -I=130 -KEY=B51E96DD8C02E57A12FDE2E4BC2C55B1 -IV=529B92CD068415627C4BE49874347F98 -CT=66D6D0E84CEB8672D38DDE557CCCFFF6 -PT=F817D013CB041CA41B6D611ED261FAE9 - -I=131 -KEY=4D0946CE4706F9DE099083FA6E4DAF58 -IV=9B4452DD48C3EECEFDB6A6CFAE670117 -CT=F817D013CB041CA41B6D611ED261FAE9 -PT=56420C70CC459A131CD531EDC39ED6E9 - -I=132 -KEY=1B4B4ABE8B4363CD1545B217ADD379B1 -IV=264ABBC30CC98DA3C06B935B1364A317 -CT=56420C70CC459A131CD531EDC39ED6E9 -PT=650DA8C4CB11E4ABFE8841D20443BB04 - -I=133 -KEY=7E46E27A40528766EBCDF3C5A990C2B5 -IV=DBABF7B18568FED50C69DA0C9AA5395D -CT=650DA8C4CB11E4ABFE8841D20443BB04 -PT=94E6CE02AE253F3BE4A59775CAB7B11B - -I=134 -KEY=EAA02C78EE77B85D0F6864B0632773AE -IV=F0D2E456CE063CB68988C1C397038480 -CT=94E6CE02AE253F3BE4A59775CAB7B11B -PT=124F09DAC6A45E6077DCECE971B24ED1 - -I=135 -KEY=F8EF25A228D3E63D78B4885912953D7F -IV=C19A6D2D35E606E552580B002023C966 -CT=124F09DAC6A45E6077DCECE971B24ED1 -PT=AAD649FD1168DFCB431A7216571ED4C1 - -I=136 -KEY=52396C5F39BB39F63BAEFA4F458BE9BE -IV=DF1A307B1D25BC2751ECDC791EC51B16 -CT=AAD649FD1168DFCB431A7216571ED4C1 -PT=992749C940CBBB0944F5248E8D65268C - -I=137 -KEY=CB1E2596797082FF7F5BDEC1C8EECF32 -IV=D8B0466FC4344C6BF4E57584E5F48A36 -CT=992749C940CBBB0944F5248E8D65268C -PT=FF16B9246C325A3B96250875A9D5C4BE - -I=138 -KEY=34089CB21542D8C4E97ED6B4613B0B8C -IV=B8C3E4ECF57631CE1EEA74AD99545BA2 -CT=FF16B9246C325A3B96250875A9D5C4BE -PT=72EDB906165FE6A19E02435AC6457C9A - -I=139 -KEY=46E525B4031D3E65777C95EEA77E7716 -IV=9C4F78D05257C64D752C576B5BB16245 -CT=72EDB906165FE6A19E02435AC6457C9A -PT=0C2F00362B8733D343DCAF884A6BFD46 - -I=140 -KEY=4ACA2582289A0DB634A03A66ED158A50 -IV=C51122198D2FD566ACA1BD07C28BCC7A -CT=0C2F00362B8733D343DCAF884A6BFD46 -PT=C7F5C00F42695CF7870240DA73D487F7 - -I=141 -KEY=8D3FE58D6AF35141B3A27ABC9EC10DA7 -IV=14769B7962371925822C42F0411BDC65 -CT=C7F5C00F42695CF7870240DA73D487F7 -PT=F4BC8A4310A4CD2F396F43B81BD060EB - -I=142 -KEY=79836FCE7A579C6E8ACD390485116D4C -IV=CDA4414DF23427B937D586C1A8164479 -CT=F4BC8A4310A4CD2F396F43B81BD060EB -PT=1B996A525174C35466103BCBD53ECB9C - -I=143 -KEY=621A059C2B235F3AECDD02CF502FA6D0 -IV=1DA9E7C02BE868E118E4B9BF5928BFCF -CT=1B996A525174C35466103BCBD53ECB9C -PT=2B4EC5CB9DE50257B5901C6D49B5EB54 - -I=144 -KEY=4954C057B6C65D6D594D1EA2199A4D84 -IV=55433149AA93215BF53CB8FE66CD683A -CT=2B4EC5CB9DE50257B5901C6D49B5EB54 -PT=5A5B9ACA3BDA951DC4C4DFB7DD15AD18 - -I=145 -KEY=130F5A9D8D1CC8709D89C115C48FE09C -IV=695C69EA8C4257D2758364AFF6387DA0 -CT=5A5B9ACA3BDA951DC4C4DFB7DD15AD18 -PT=5BB08593BA52E94F07CB14FF564AF299 - -I=146 -KEY=48BFDF0E374E213F9A42D5EA92C51205 -IV=665463164601CD0045C684729CDD5E7D -CT=5BB08593BA52E94F07CB14FF564AF299 -PT=DB1840467889551150026A90E3FC272F - -I=147 -KEY=93A79F484FC7742ECA40BF7A7139352A -IV=355C4B87A682712460C80ABA630F7BE8 -CT=DB1840467889551150026A90E3FC272F -PT=9F7BD8EF96A1ECC75B4E3031E65FE8FC - -I=148 -KEY=0CDC47A7D96698E9910E8F4B9766DDD6 -IV=FBF20FEC0A9E9B530DD3745955A1960C -CT=9F7BD8EF96A1ECC75B4E3031E65FE8FC -PT=DCF003E1DDD4B52F5B680568B42EEECF - -I=149 -KEY=D02C444604B22DC6CA668A2323483319 -IV=04EADC638E309466B9500B1C3A308856 -CT=DCF003E1DDD4B52F5B680568B42EEECF -PT=DDD2F2AEFEF4A4641747699170DF0129 - -I=150 -KEY=0DFEB6E8FA4689A2DD21E3B253973230 -IV=FB521123E5BB45F1AC7083C382B95E10 -CT=DDD2F2AEFEF4A4641747699170DF0129 -PT=7D6C54E4369E965513DE1E95E8A37433 - -I=151 -KEY=7092E20CCCD81FF7CEFFFD27BB344603 -IV=0E71300101915AEE97563493B4B2EFB9 -CT=7D6C54E4369E965513DE1E95E8A37433 -PT=B7F5C4275EF7D3A23E8E9A4BC2BCA700 - -I=152 -KEY=C767262B922FCC55F071676C7988E103 -IV=8BBC970D4E24F6F1A92859BBAE70B757 -CT=B7F5C4275EF7D3A23E8E9A4BC2BCA700 -PT=679FA9A8AB3EE2F0663D4DC95FEC3847 - -I=153 -KEY=A0F88F8339112EA5964C2AA52664D944 -IV=B8D28B6903859465F996A0DF491DDAAA -CT=679FA9A8AB3EE2F0663D4DC95FEC3847 -PT=914DCEAC5B00940A415C2144DAA1EF03 - -I=154 -KEY=31B5412F6211BAAFD7100BE1FCC53647 -IV=06E1FF99E63E0EDDA1D95682B541D026 -CT=914DCEAC5B00940A415C2144DAA1EF03 -PT=A718031A531395DA071B828A10A2B9DC - -I=155 -KEY=96AD423531022F75D00B896BEC678F9B -IV=F18546028693CC0A72E218460AC932E9 -CT=A718031A531395DA071B828A10A2B9DC -PT=19D996B9FF549029D800CF977C0E0A88 - -I=156 -KEY=8F74D48CCE56BF5C080B46FC90698513 -IV=7E98DAFA8DE35537A0B0AA8FA32E01DF -CT=19D996B9FF549029D800CF977C0E0A88 -PT=6A7D514FBE9963987E0EE5DD22FDC8BD - -I=157 -KEY=E50985C370CFDCC47605A321B2944DAE -IV=071F44277D12AD6E653FB747C11BEFB7 -CT=6A7D514FBE9963987E0EE5DD22FDC8BD -PT=AB07C464DF72DF58411A7CBF906F43A6 - -I=158 -KEY=4E0E41A7AFBD039C371FDF9E22FB0E08 -IV=BDA8979A0DE78999AE0659D2744BC21B -CT=AB07C464DF72DF58411A7CBF906F43A6 -PT=A8ABC34FF51FD998427A7837BB0F22BB - -I=159 -KEY=E6A582E85AA2DA047565A7A999F42CB3 -IV=3CA763C4375A6C70F072B52C42A02560 -CT=A8ABC34FF51FD998427A7837BB0F22BB -PT=9E82A41AB2A2748695663075C5BF1C09 - -I=160 -KEY=782726F2E800AE82E00397DC5C4B30BA -IV=B1DD4DC8715CA0B8BA3426395B61ABA4 -CT=9E82A41AB2A2748695663075C5BF1C09 -PT=3C891AEFC6645F3C23A2E3A2E1A522EF - -I=161 -KEY=44AE3C1D2E64F1BEC3A1747EBDEE1255 -IV=932F28E3FC0F85A0E703AD6079A68CC0 -CT=3C891AEFC6645F3C23A2E3A2E1A522EF -PT=D4FDD9C3D36E80E0AFA95ABEC2E62FB9 - -I=162 -KEY=9053E5DEFD0A715E6C082EC07F083DEC -IV=1AD1530DE6274BBA3A097004D85DF8FA -CT=D4FDD9C3D36E80E0AFA95ABEC2E62FB9 -PT=9FACBB106FBF34D9B25A83AD4F45AA38 - -I=163 -KEY=0FFF5ECE92B54587DE52AD6D304D97D4 -IV=8412EAA361AB8193AD529FA36944FE3D -CT=9FACBB106FBF34D9B25A83AD4F45AA38 -PT=E95628B6A14326AC153B228C0DD25063 - -I=164 -KEY=E6A9767833F6632BCB698FE13D9FC7B7 -IV=9F1D906FD25CCCA7565D82CDA44B4A57 -CT=E95628B6A14326AC153B228C0DD25063 -PT=7B1ECD07E452D593D00E326F8FD9F2B5 - -I=165 -KEY=9DB7BB7FD7A4B6B81B67BD8EB2463502 -IV=9C91B12734A86451492400EE5759C190 -CT=7B1ECD07E452D593D00E326F8FD9F2B5 -PT=A99874C1ECA463D335B37179348AEF4F - -I=166 -KEY=342FCFBE3B00D56B2ED4CCF786CCDA4D -IV=9060C6E8E2B51E5F1000860ECB5A608C -CT=A99874C1ECA463D335B37179348AEF4F -PT=F9296E658C3048C58FE6404AB6E0186C - -I=167 -KEY=CD06A1DBB7309DAEA1328CBD302CC221 -IV=ADCB427405EDF8078622AFC6C731D3EF -CT=F9296E658C3048C58FE6404AB6E0186C -PT=8D3A4ABFB8F57AEBB1284B78BFDD240D - -I=168 -KEY=403CEB640FC5E745101AC7C58FF1E62C -IV=4CED30477756892A49FE6358700F5DE7 -CT=8D3A4ABFB8F57AEBB1284B78BFDD240D -PT=7C71310D5241B8B461847FA7E2B4D506 - -I=169 -KEY=3C4DDA695D845FF1719EB8626D45332A -IV=52A3B8E21588368AA3AD2131B283B34C -CT=7C71310D5241B8B461847FA7E2B4D506 -PT=380A1E2925FC8061FBC69B08B4C7C6C8 - -I=170 -KEY=0447C4407878DF908A58236AD982F5E2 -IV=B7AD265DF50ABD77C1D1D02BAF06CEBD -CT=380A1E2925FC8061FBC69B08B4C7C6C8 -PT=6931E262570F27732A75629A384492CA - -I=171 -KEY=6D7626222F77F8E3A02D41F0E1C66728 -IV=DD7D3CA7F6CE54775836734B10685A99 -CT=6931E262570F27732A75629A384492CA -PT=336D0AB3F9A793469C544E98CFDC8AD6 - -I=172 -KEY=5E1B2C91D6D06BA53C790F682E1AEDFE -IV=54087C05437049FBAFC9BF6C56AD16CC -CT=336D0AB3F9A793469C544E98CFDC8AD6 -PT=0098A640F1D04E5557F748B80215082A - -I=173 -KEY=5E838AD1270025F06B8E47D02C0FE5D4 -IV=DD13A93C7FAEF14820D6A168AF9969DB -CT=0098A640F1D04E5557F748B80215082A -PT=48660EDDC3ACAC1A814AE088650DE007 - -I=174 -KEY=16E5840CE4AC89EAEAC4A758490205D3 -IV=589C43A680F7AE6E15DE25FD50F18BED -CT=48660EDDC3ACAC1A814AE088650DE007 -PT=047740C48160A14563C0049316C7B78E - -I=175 -KEY=1292C4C865CC28AF8904A3CB5FC5B25D -IV=22DB095AF8268D37AC536FDA3A81B7C2 -CT=047740C48160A14563C0049316C7B78E -PT=D9679ABB1AED1524E8DA2ECA89172853 - -I=176 -KEY=CBF55E737F213D8B61DE8D01D6D29A0E -IV=77FDCCC9BAB3B7E81D7B9D14540ED3A7 -CT=D9679ABB1AED1524E8DA2ECA89172853 -PT=C774AD9EF683A59747AB41DA044471C4 - -I=177 -KEY=0C81F3ED89A2981C2675CCDBD296EBCA -IV=2E266970512C0F6D404367978C70B5C6 -CT=C774AD9EF683A59747AB41DA044471C4 -PT=927C98AFDE6F108268A306A1A818EE89 - -I=178 -KEY=9EFD6B4257CD889E4ED6CA7A7A8E0543 -IV=E2B0A0F146E931136932D8188B7DC980 -CT=927C98AFDE6F108268A306A1A818EE89 -PT=D3C11AF1EF255D65EAAEE5B5C5BF3CD9 - -I=179 -KEY=4D3C71B3B8E8D5FBA4782FCFBF31399A -IV=ABA118A590A8A69D41D20ED13F7DA4C9 -CT=D3C11AF1EF255D65EAAEE5B5C5BF3CD9 -PT=760B1C47EB476A246CE41163B7425C7B - -I=180 -KEY=3B376DF453AFBFDFC89C3EAC087365E1 -IV=8A395FFEE93FF820FBC086932216324F -CT=760B1C47EB476A246CE41163B7425C7B -PT=4EEAE25D1654A461D6A56896EDFFEAB7 - -I=181 -KEY=75DD8FA945FB1BBE1E39563AE58C8F56 -IV=82D68DE458D38127E2A17DA736BC1651 -CT=4EEAE25D1654A461D6A56896EDFFEAB7 -PT=BD7ABD27F3515B9FD337ADADBA5E9EC9 - -I=182 -KEY=C8A7328EB6AA4021CD0EFB975FD2119F -IV=95757C38F4CB26C29DF174FD8B1F35E8 -CT=BD7ABD27F3515B9FD337ADADBA5E9EC9 -PT=E32EF56DE91CC21C158822BDB841A02C - -I=183 -KEY=2B89C7E35FB6823DD886D92AE793B1B3 -IV=AFFB434005E300E99E815A8E5B46E159 -CT=E32EF56DE91CC21C158822BDB841A02C -PT=578B7692D68BD4D65A159C9CCDC81F64 - -I=184 -KEY=7C02B171893D56EB829345B62A5BAED7 -IV=15E783551969F275EF25A429F68BA0DB -CT=578B7692D68BD4D65A159C9CCDC81F64 -PT=0F70D77F31DE8F0010628377C8E4A1C3 - -I=185 -KEY=7372660EB8E3D9EB92F1C6C1E2BF0F14 -IV=078B6E3FC7C79D52A5C49847A7C5D0BB -CT=0F70D77F31DE8F0010628377C8E4A1C3 -PT=A4F29F6A50A4A15789D4647774C96997 - -I=186 -KEY=D780F964E84778BC1B25A2B696766683 -IV=C9B2C903F131856C0D8218146479513A -CT=A4F29F6A50A4A15789D4647774C96997 -PT=7AD4F764911F8F1E8C9356F00B1468EE - -I=187 -KEY=AD540E007958F7A297B6F4469D620E6D -IV=780DAD9DBA12DDC713ECF44057B8B56E -CT=7AD4F764911F8F1E8C9356F00B1468EE -PT=A00EAFD28A95C7F39137773F28F9A0D3 - -I=188 -KEY=0D5AA1D2F3CD305106818379B59BAEBE -IV=6643BF26488FB21BCDAA7D4FABAA5BC3 -CT=A00EAFD28A95C7F39137773F28F9A0D3 -PT=FC884EEEB73B2F66C97D742A441B0463 - -I=189 -KEY=F1D2EF3C44F61F37CFFCF753F180AADD -IV=7B707442550BF1FA4C1B74F0DC3237FC -CT=FC884EEEB73B2F66C97D742A441B0463 -PT=9C260AA82C6902B068495B4844507F7D - -I=190 -KEY=6DF4E594689F1D87A7B5AC1BB5D0D5A0 -IV=8329E8DE2980225DA61158BF467B1D79 -CT=9C260AA82C6902B068495B4844507F7D -PT=1C12FEAA35AD2DD21DE6411C3A3BB6D5 - -I=191 -KEY=71E61B3E5D323055BA53ED078FEB6375 -IV=EFD514D7CF3FAC49DBB5BB3505B9B18F -CT=1C12FEAA35AD2DD21DE6411C3A3BB6D5 -PT=15F26D34E8E1037A5A2393CEA5DB396B - -I=192 -KEY=6414760AB5D3332FE0707EC92A305A1E -IV=9EFC37C295552B965B29A23AC2788D8B -CT=15F26D34E8E1037A5A2393CEA5DB396B -PT=76F0C79955566A0A091AA46E0C59455E - -I=193 -KEY=12E4B193E0855925E96ADAA726691F40 -IV=5BA54E33128A7526A9130E632BE00D65 -CT=76F0C79955566A0A091AA46E0C59455E -PT=1EA06231EBEEB995E2F94B88A4004333 - -I=194 -KEY=0C44D3A20B6BE0B00B93912F82695C73 -IV=9B1C6FA42510E530D2282BF8C5516DCE -CT=1EA06231EBEEB995E2F94B88A4004333 -PT=16C36348884B32AC1CB1DE2D3C158981 - -I=195 -KEY=1A87B0EA8320D21C17224F02BE7CD5F2 -IV=F755F641EED4C828DCBECC327D93F4AF -CT=16C36348884B32AC1CB1DE2D3C158981 -PT=6581A3FB5F61C6C1904F35E787BF552D - -I=196 -KEY=7F061311DC4114DD876D7AE539C380DF -IV=5D799F356C1672707716C47DA4384C01 -CT=6581A3FB5F61C6C1904F35E787BF552D -PT=0BA11F8EE845E03641928825B3344994 - -I=197 -KEY=74A70C9F3404F4EBC6FFF2C08AF7C94B -IV=89A5592031795CEAECF1C1F274813818 -CT=0BA11F8EE845E03641928825B3344994 -PT=1CF907A6C8A33C7806819EB97B854588 - -I=198 -KEY=685E0B39FCA7C893C07E6C79F1728CC3 -IV=BBE87558AF456066B9CE3EBB8729D554 -CT=1CF907A6C8A33C7806819EB97B854588 -PT=722BB2E53CE7846F40B5EA18AF1430B0 - -I=199 -KEY=1A75B9DCC0404CFC80CB86615E66BC73 -IV=2CC42E6DA36883482ACB5D9D92823186 -CT=722BB2E53CE7846F40B5EA18AF1430B0 -PT=E667D6A95E9C56BB56E4436CC1B69874 - -I=200 -KEY=FC126F759EDC1A47D62FC50D9FD02407 -IV=F18DD0388BF5692B7394BAFDC4854308 -CT=E667D6A95E9C56BB56E4436CC1B69874 -PT=3C9A76798C468470EEBC5F7B915879A3 - -I=201 -KEY=C088190C129A9E3738939A760E885DA4 -IV=8262D8603FE0F4AE8BF5795690992F1C -CT=3C9A76798C468470EEBC5F7B915879A3 -PT=3CAFB994BDEF76370D8A5129B63BECDB - -I=202 -KEY=FC27A098AF75E8003519CB5FB8B3B17F -IV=AB090F7A86CFD9A7C1BD8869BBB4D27B -CT=3CAFB994BDEF76370D8A5129B63BECDB -PT=50D037733D2C3242024BD322ADDF01CB - -I=203 -KEY=ACF797EB9259DA423752187D156CB0B4 -IV=3581D6724722C3892C712B2AA1066824 -CT=50D037733D2C3242024BD322ADDF01CB -PT=0D7CB755305EF09692FCED530CCC1336 - -I=204 -KEY=A18B20BEA2072AD4A5AEF52E19A0A382 -IV=9D0DAD6448895ECBE05F8DC73E014E3C -CT=0D7CB755305EF09692FCED530CCC1336 -PT=D66389E01F44C60B26BCF3F9B39DAB55 - -I=205 -KEY=77E8A95EBD43ECDF831206D7AA3D08D7 -IV=7BDC3CD62CD79C7E6CB8FAE104175DE4 -CT=D66389E01F44C60B26BCF3F9B39DAB55 -PT=CC9F59409D636BE5C555AC2841650CD7 - -I=206 -KEY=BB77F01E2020873A4647AAFFEB580400 -IV=A4FBE42983B236097E40C1E244B14748 -CT=CC9F59409D636BE5C555AC2841650CD7 -PT=34804672FCEF79481269B1D254DDCAF9 - -I=207 -KEY=8FF7B66CDCCFFE72542E1B2DBF85CEF9 -IV=700B37E771E88E5DCD9C81D6FD16B995 -CT=34804672FCEF79481269B1D254DDCAF9 -PT=62FC00FDF1F6BF44FFBEB5BED5589A64 - -I=208 -KEY=ED0BB6912D394136AB90AE936ADD549D -IV=F3A9954079382ACD97C3EC198522AE69 -CT=62FC00FDF1F6BF44FFBEB5BED5589A64 -PT=F7901904A02544E064400A2625121C4C - -I=209 -KEY=1A9BAF958D1C05D6CFD0A4B54FCF48D1 -IV=3799F5DEF76C56F8B0A69889B85760AA -CT=F7901904A02544E064400A2625121C4C -PT=A915D55AE8E14497F2693A55F83041F5 - -I=210 -KEY=B38E7ACF65FD41413DB99EE0B7FF0924 -IV=5421F3F4CDD3C6F9BF38184BC61904AA -CT=A915D55AE8E14497F2693A55F83041F5 -PT=66EA0D0968631F3BDA46921078E495C1 - -I=211 -KEY=D56477C60D9E5E7AE7FF0CF0CF1B9CE5 -IV=3B87243EE38BD474E4CBF34A7C592CFC -CT=66EA0D0968631F3BDA46921078E495C1 -PT=283826367D00718849A6539EE8CAD8BF - -I=212 -KEY=FD5C51F0709E2FF2AE595F6E27D1445A -IV=0FB53077D2BC27C544CD400A28212291 -CT=283826367D00718849A6539EE8CAD8BF -PT=B15EA2718FB406D457C8B96530EDC014 - -I=213 -KEY=4C02F381FF2A2926F991E60B173C844E -IV=8BFE654E422E9BCCE7F1357053E1130C -CT=B15EA2718FB406D457C8B96530EDC014 -PT=44238CE0F1765C7983BF408D5ECFA2BA - -I=214 -KEY=08217F610E5C755F7A2EA68649F326F4 -IV=86841D597FA91F54CBAD3C57FC1FC492 -CT=44238CE0F1765C7983BF408D5ECFA2BA -PT=BB6408099CA64F1216D204865449E967 - -I=215 -KEY=B345776892FA3A4D6CFCA2001DBACF93 -IV=849198CEA19F4AD76013D172867A0D20 -CT=BB6408099CA64F1216D204865449E967 -PT=B7E109C6813E686ADA396DDB277AD960 - -I=216 -KEY=04A47EAE13C45227B6C5CFDB3AC016F3 -IV=9C5E0182124701DA958CF68E1B9F8CC1 -CT=B7E109C6813E686ADA396DDB277AD960 -PT=65C77CB822CA10AE1F95B91F0A3F6436 - -I=217 -KEY=61630216310E4289A95076C430FF72C5 -IV=2BB9026F793A64A325E02B922E3A51DD -CT=65C77CB822CA10AE1F95B91F0A3F6436 -PT=48E9DB9FC3F883AD28A0299561444197 - -I=218 -KEY=298AD989F2F6C12481F05F5151BB3352 -IV=6BE0B03639C858D8F2CAE00EFE8FECCA -CT=48E9DB9FC3F883AD28A0299561444197 -PT=02B277AB327BCB5C91831BD376DC5211 - -I=219 -KEY=2B38AE22C08D0A781073448227676143 -IV=ADC033E3EEC3705031D2FB24205823A2 -CT=02B277AB327BCB5C91831BD376DC5211 -PT=FE288D6703CF6AB1635483305A82F192 - -I=220 -KEY=D5102345C34260C97327C7B27DE590D1 -IV=F637C38CB5DF86458225143E157B9415 -CT=FE288D6703CF6AB1635483305A82F192 -PT=B07BF02F795D13D972D5D6E556E8BA37 - -I=221 -KEY=656BD36ABA1F731001F211572B0D2AE6 -IV=824B7BBB3A339BF045C3CFEA9FD842B9 -CT=B07BF02F795D13D972D5D6E556E8BA37 -PT=D4661C2E102C6644724DA54BE291215D - -I=222 -KEY=B10DCF44AA33155473BFB41CC99C0BBB -IV=21FA242B2B9FFF0C7DC6B712A38A333B -CT=D4661C2E102C6644724DA54BE291215D -PT=F7EDEE448559A6ACD68815B6EEAF6E38 - -I=223 -KEY=46E021002F6AB3F8A537A1AA27336583 -IV=390906ECE51C92800D620E1CD1FD3574 -CT=F7EDEE448559A6ACD68815B6EEAF6E38 -PT=07257C91424F65E6752470A6960DF6D9 - -I=224 -KEY=41C55D916D25D61ED013D10CB13E935A -IV=918A010EC2B106DE32A220315999DF7D -CT=07257C91424F65E6752470A6960DF6D9 -PT=CCB4F3FCFFDEE9E93DD3AB4CC2DB870E - -I=225 -KEY=8D71AE6D92FB3FF7EDC07A4073E51454 -IV=7CF6B4948C4E04ED235F2CC96B0A6B49 -CT=CCB4F3FCFFDEE9E93DD3AB4CC2DB870E -PT=C455220E8C8847FF2592074A53104105 - -I=226 -KEY=49248C631E737808C8527D0A20F55551 -IV=4839E74C868786D0A109603CF98F1100 -CT=C455220E8C8847FF2592074A53104105 -PT=B4D0F5B4C15D7AD556ED4964A94C898F - -I=227 -KEY=FDF479D7DF2E02DD9EBF346E89B9DCDE -IV=5C6D9649E47FAA8A2DCAFB317B6BC0EA -CT=B4D0F5B4C15D7AD556ED4964A94C898F -PT=B515D2904555793DDC142618DCFF8464 - -I=228 -KEY=48E1AB479A7B7BE042AB1276554658BA -IV=E3573B4137C13BBA6CDD10D71042B8F6 -CT=B515D2904555793DDC142618DCFF8464 -PT=2C272D6589E2E6EE09067882795E9FB9 - -I=229 -KEY=64C6862213999D0E4BAD6AF42C18C703 -IV=08E335104FC5D18E2C11EF34B805F060 -CT=2C272D6589E2E6EE09067882795E9FB9 -PT=B38E39322245C4A2E170EBF36D764AD5 - -I=230 -KEY=D748BF1031DC59ACAADD8107416E8DD6 -IV=E134D0DEA38A23983766DA18DADA70E0 -CT=B38E39322245C4A2E170EBF36D764AD5 -PT=E7556255602B48D7CAC710A004FFFD2E - -I=231 -KEY=301DDD4551F7117B601A91A7459170F8 -IV=301C2808833418F45D5F97FB09A99504 -CT=E7556255602B48D7CAC710A004FFFD2E -PT=D4356D51B1C486AAC8BCF2F65312758C - -I=232 -KEY=E428B014E03397D1A8A6635116830574 -IV=264D556FA9A9D73510F562BBF983A4F7 -CT=D4356D51B1C486AAC8BCF2F65312758C -PT=B4D003D6C542B576A3EAEC8F1B017F5B - -I=233 -KEY=50F8B3C2257122A70B4C8FDE0D827A2F -IV=8821647AD3E9E529909E60D0F75DA400 -CT=B4D003D6C542B576A3EAEC8F1B017F5B -PT=10056819F314FF21114BE6209AB5508C - -I=234 -KEY=40FDDBDBD665DD861A0769FE97372AA3 -IV=CBD574F4DB1EFEE4E2EC9485D1192E04 -CT=10056819F314FF21114BE6209AB5508C -PT=6E7AA061FE85B6F8972CB0E793BE0CB0 - -I=235 -KEY=2E877BBA28E06B7E8D2BD91904892613 -IV=4F98EE1501681EC0E7834FE941DF6C6B -CT=6E7AA061FE85B6F8972CB0E793BE0CB0 -PT=45E0C0014219D77686E82E74E60608CA - -I=236 -KEY=6B67BBBB6AF9BC080BC3F76DE28F2ED9 -IV=1D34CAB2FF836A7E6568823784519170 -CT=45E0C0014219D77686E82E74E60608CA -PT=ACF686F9D6723EAFDBFE512AB3A8C6B1 - -I=237 -KEY=C7913D42BC8B82A7D03DA6475127E868 -IV=BEA74B4435F9F79D39B8CCE1F090D4B8 -CT=ACF686F9D6723EAFDBFE512AB3A8C6B1 -PT=F11FE34D158D40DEA10033BCE0253F30 - -I=238 -KEY=368EDE0FA906C279713D95FBB102D758 -IV=DF30EE5D8CA298BE630DDE4B6D8AD7AA -CT=F11FE34D158D40DEA10033BCE0253F30 -PT=4E970ACAB8B19C942C85FAA7825C5E67 - -I=239 -KEY=7819D4C511B75EED5DB86F5C335E893F -IV=DC3CCC928C02710EE91391032A3B557D -CT=4E970ACAB8B19C942C85FAA7825C5E67 -PT=0FF6C292507CF135036E04A391210466 - -I=240 -KEY=77EF165741CBAFD85ED66BFFA27F8D59 -IV=7CC57A486E05E36F852278450C03D39F -CT=0FF6C292507CF135036E04A391210466 -PT=BBEF94C8179E7A124492A252507D58E7 - -I=241 -KEY=CC00829F5655D5CA1A44C9ADF202D5BE -IV=BBB92F65197F8D6B388191E78E90A858 -CT=BBEF94C8179E7A124492A252507D58E7 -PT=BAF11150DD418ED7C28072A718815954 - -I=242 -KEY=76F193CF8B145B1DD8C4BB0AEA838CEA -IV=99DA5A29F934BE23EB74B6DE4E8CC740 -CT=BAF11150DD418ED7C28072A718815954 -PT=A935099B91A35655C850939D2FED1569 - -I=243 -KEY=DFC49A541AB70D4810942897C56E9983 -IV=92401B7E92A49FA5A6905E51E49D51C2 -CT=A935099B91A35655C850939D2FED1569 -PT=F60E1B5D10CDA17FC762798B86B8708D - -I=244 -KEY=29CA81090A7AAC37D7F6511C43D6E90E -IV=C2A57521674EB0FB3E46DE2CC1DCF419 -CT=F60E1B5D10CDA17FC762798B86B8708D -PT=0B976079B61F46E7F3CCCD17E23D872F - -I=245 -KEY=225DE170BC65EAD0243A9C0BA1EB6E21 -IV=66970AE807FED1E3581496C9FBE5FF50 -CT=0B976079B61F46E7F3CCCD17E23D872F -PT=FB44F0094A5FC03BD0A27391E58D0AA3 - -I=246 -KEY=D9191179F63A2AEBF498EF9A44666482 -IV=ED7B2ED1AFF7DB9B514D6E4DFAEA484B -CT=FB44F0094A5FC03BD0A27391E58D0AA3 -PT=41A534A69AD25FEB39BB9F754F15D8FE - -I=247 -KEY=98BC25DF6CE87500CD2370EF0B73BC7C -IV=B7E8C7F08BCE1CF1CC2568E18C18C92B -CT=41A534A69AD25FEB39BB9F754F15D8FE -PT=022B28D4F7355E14F99F654B6C35BC16 - -I=248 -KEY=9A970D0B9BDD2B1434BC15A46746006A -IV=F2EF32464FC7E5F3D397C259CB963B7F -CT=022B28D4F7355E14F99F654B6C35BC16 -PT=28F18EA03ADEB36C40FD8FBC590EC6C8 - -I=249 -KEY=B26683ABA103987874419A183E48C6A2 -IV=687E822CCFC5800E88E59ED7DEC1409D -CT=28F18EA03ADEB36C40FD8FBC590EC6C8 -PT=661F9AEA300100333D64FCDD1212C663 - -I=250 -KEY=D47919419102984B492566C52C5A00C1 -IV=3922BB08EE1B4CC75881D1D6F66B8EE0 -CT=661F9AEA300100333D64FCDD1212C663 -PT=11C4D360F585EDF544D5479AE1ABDBE6 - -I=251 -KEY=C5BDCA21648775BE0DF0215FCDF1DB27 -IV=9B7C0D7D0EA8CAD77B331F2E0CA1E639 -CT=11C4D360F585EDF544D5479AE1ABDBE6 -PT=2E4695733B01CC78993E6EB464784223 - -I=252 -KEY=EBFB5F525F86B9C694CE4FEBA9899904 -IV=A2BF273F12FE1F4B2F56A86CAFD9C5BF -CT=2E4695733B01CC78993E6EB464784223 -PT=1CC514E9F4B13FFEF3B076DAC8C62877 - -I=253 -KEY=F73E4BBBAB378638677E3931614FB173 -IV=1D4960EBE667AC5DE5ED767183838846 -CT=1CC514E9F4B13FFEF3B076DAC8C62877 -PT=3B1A7D179DDED66A37F3053B8B231EEA - -I=254 -KEY=CC2436AC36E95052508D3C0AEA6CAF99 -IV=974643FDFDB695A44B7EF8676A2B87DD -CT=3B1A7D179DDED66A37F3053B8B231EEA -PT=620A4E7A25E8D05779C0FB8CEBA55A74 - -I=255 -KEY=AE2E78D613018005294DC78601C9F5ED -IV=C9A1D92DB7D553DCAEB3BB81B489257A -CT=620A4E7A25E8D05779C0FB8CEBA55A74 -PT=93508503278ECECE65D67B5F50962C4E - -I=256 -KEY=3D7EFDD5348F4ECB4C9BBCD9515FD9A3 -IV=108E736F1DCD178A8648F6AA6D527732 -CT=93508503278ECECE65D67B5F50962C4E -PT=EA9E953D8B62FFAFF9FAFB97F614D65C - -I=257 -KEY=D7E068E8BFEDB164B561474EA74B0FFF -IV=B893A94302C0DAFB19D7B6656085DCA9 -CT=EA9E953D8B62FFAFF9FAFB97F614D65C -PT=1452ED26E774029EF30D272F8548C2F8 - -I=258 -KEY=C3B285CE5899B3FA466C60612203CD07 -IV=668FF6719E5A29A99876227EEDE5818F -CT=1452ED26E774029EF30D272F8548C2F8 -PT=4083167E5ED1A1A449C1825B84F321E1 - -I=259 -KEY=833193B00648125E0FADE23AA6F0ECE6 -IV=9F6375A022543AB8303368A235813F02 -CT=4083167E5ED1A1A449C1825B84F321E1 -PT=9206639D076685FD2078F9B984B7A03F - -I=260 -KEY=1137F02D012E97A32FD51B8322474CD9 -IV=1B95128E90B110AED9D543D2A996271F -CT=9206639D076685FD2078F9B984B7A03F -PT=AAA3F2BD0126DFD5007DD2835CCB0109 - -I=261 -KEY=BB940290000848762FA8C9007E8C4DD0 -IV=BB2E26A9CDEF9D1B2940EFFBA1971A5D -CT=AAA3F2BD0126DFD5007DD2835CCB0109 -PT=B58BB3761519C1726D75AE96313FB7DE - -I=262 -KEY=0E1FB1E61511890442DD67964FB3FA0E -IV=68D3EC37EE43E3F24072F69F2DFA768D -CT=B58BB3761519C1726D75AE96313FB7DE -PT=4558CD47C012B7293396D7EDFE3CEA85 - -I=263 -KEY=4B477CA1D5033E2D714BB07BB18F108B -IV=F7E107DBF4DDBF7974B699536A4E2803 -CT=4558CD47C012B7293396D7EDFE3CEA85 -PT=6F43B6B28AEF5DD1B66279ACAAB9A589 - -I=264 -KEY=2404CA135FEC63FCC729C9D71B36B502 -IV=B3E6DA8DE5DDF7ED6F832D1306A1C04A -CT=6F43B6B28AEF5DD1B66279ACAAB9A589 -PT=1BA743E148BC164C4C8324D665B5A3BD - -I=265 -KEY=3FA389F2175075B08BAAED017E8316BF -IV=8BBBB56B39893C8F286561EF6E47E66A -CT=1BA743E148BC164C4C8324D665B5A3BD -PT=49A40365092DD1360D916AAEAFD03FC1 - -I=266 -KEY=76078A971E7DA486863B87AFD153297E -IV=48BA08703A306F772E78F660173A26B3 -CT=49A40365092DD1360D916AAEAFD03FC1 -PT=DF7DEB5968D683AAA274B0D5D3F9AA03 - -I=267 -KEY=A97A61CE76AB272C244F377A02AA837D -IV=0C7832F9CDF65DADA7FA809B8DE709C3 -CT=DF7DEB5968D683AAA274B0D5D3F9AA03 -PT=69689E97E9B166DA53E25BDFBCAF4A97 - -I=268 -KEY=C012FF599F1A41F677AD6CA5BE05C9EA -IV=05BC03F59CD8C5FAE4A7240E6168CF41 -CT=69689E97E9B166DA53E25BDFBCAF4A97 -PT=5F87DC71EF2918F75A94E43007FF50E6 - -I=269 -KEY=9F952328703359012D398895B9FA990C -IV=4233E654802B55155E158B650B64718E -CT=5F87DC71EF2918F75A94E43007FF50E6 -PT=4F170790775A6A147E99D251C401969A - -I=270 -KEY=D08224B80769331553A05AC47DFB0F96 -IV=4AEAE53003D5085F5963CC36C4589941 -CT=4F170790775A6A147E99D251C401969A -PT=E566D46360EF38E5CFF0C2E7E7E0D679 - -I=271 -KEY=35E4F0DB67860BF09C5098239A1BD9EF -IV=F6CBFF51F6E59B7AAA9EB1261707429A -CT=E566D46360EF38E5CFF0C2E7E7E0D679 -PT=F7189C4B9E1048ED66D9B7CCD089C5F9 - -I=272 -KEY=C2FC6C90F996431DFA892FEF4A921C16 -IV=0A05A4BFBBCC8B3E218C123A95FFF475 -CT=F7189C4B9E1048ED66D9B7CCD089C5F9 -PT=68FB0909789DBFA672BEEF5DF0017B63 - -I=273 -KEY=AA076599810BFCBB8837C0B2BA936775 -IV=DF1A3AF147E72C2CEAE5D8713D52F572 -CT=68FB0909789DBFA672BEEF5DF0017B63 -PT=AF2784590089186BED3A48ADC1B68562 - -I=274 -KEY=0520E1C08182E4D0650D881F7B25E217 -IV=BFDC5ECF596F5F3CFFEAAF4B961209FA -CT=AF2784590089186BED3A48ADC1B68562 -PT=E8C29D3C129AB8FA797EFDCE4CE4D4F2 - -I=275 -KEY=EDE27CFC93185C2A1C7375D137C136E5 -IV=49195E71516D5117C26814F98FD94C31 -CT=E8C29D3C129AB8FA797EFDCE4CE4D4F2 -PT=6ACF2AE12C38DB520F49E6C90D4B8F03 - -I=276 -KEY=872D561DBF208778133A93183A8AB9E6 -IV=E4FA7788D6E7AFBD08884BFCFA74D30C -CT=6ACF2AE12C38DB520F49E6C90D4B8F03 -PT=78FEA3B57D6176C44CE753FB01416CA6 - -I=277 -KEY=FFD3F5A8C241F1BC5FDDC0E33BCBD540 -IV=08E333F43615229D95E7C425A04EA2B7 -CT=78FEA3B57D6176C44CE753FB01416CA6 -PT=5030D7131ABBD7AC323BA31B602B776E - -I=278 -KEY=AFE322BBD8FA26106DE663F85BE0A22E -IV=64BDE35106D9A66A4216EA20F6C52D06 -CT=5030D7131ABBD7AC323BA31B602B776E -PT=14B32E8BD3BD9D82613E32536E6A9F91 - -I=279 -KEY=BB500C300B47BB920CD851AB358A3DBF -IV=8FB9E6BDCD50610E97CF731216CFE698 -CT=14B32E8BD3BD9D82613E32536E6A9F91 -PT=1F22542AFCE63AA92CCDAF45F8DAEEF0 - -I=280 -KEY=A472581AF7A1813B2015FEEECD50D34F -IV=E18B3C5EDA8CDA9E94A376CEEF687D9F -CT=1F22542AFCE63AA92CCDAF45F8DAEEF0 -PT=FC986510E3ED40994D1C33201D0EDB27 - -I=281 -KEY=58EA3D0A144CC1A26D09CDCED05E0868 -IV=D1828C9DDB263064AD259A2360B3DFBA -CT=FC986510E3ED40994D1C33201D0EDB27 -PT=06C1CE557C9AC5D40560CF2D40DCC47C - -I=282 -KEY=5E2BF35F68D60476686902E39082CC14 -IV=3454FD0698CC8CD949970509C23E50F6 -CT=06C1CE557C9AC5D40560CF2D40DCC47C -PT=4287FA420FD9AFCAB7E290273BDF4054 - -I=283 -KEY=1CAC091D670FABBCDF8B92C4AB5D8C40 -IV=C2F0C044A975ADBD20DE56858A074886 -CT=4287FA420FD9AFCAB7E290273BDF4054 -PT=447AFDD3ACF0DEEB0385799789FBAFF0 - -I=284 -KEY=58D6F4CECBFF7557DC0EEB5322A623B0 -IV=299C337821B0779A7ADC3A04316A6373 -CT=447AFDD3ACF0DEEB0385799789FBAFF0 -PT=BA0BBC980827E87EEA51E66C92C96B31 - -I=285 -KEY=E2DD4856C3D89D29365F0D3FB06F4881 -IV=2368291AD179C3C143E636898EB3E104 -CT=BA0BBC980827E87EEA51E66C92C96B31 -PT=77A6131415B251049423FFFB1F3A8A3A - -I=286 -KEY=957B5B42D66ACC2DA27CF2C4AF55C2BB -IV=14300EA81B57E102AEDD97CCD466E18A -CT=77A6131415B251049423FFFB1F3A8A3A -PT=A7AEC0CC599D56347A72D934DDAC7899 - -I=287 -KEY=32D59B8E8FF79A19D80E2BF072F9BA22 -IV=FD62415C90DACCD22EC364877DB0CB24 -CT=A7AEC0CC599D56347A72D934DDAC7899 -PT=1B1100FCB9F85D8CCFDEC5865083B44D - -I=288 -KEY=29C49B72360FC79517D0EE76227A0E6F -IV=6CB24892D26E43E63819C372D5EB4F6D -CT=1B1100FCB9F85D8CCFDEC5865083B44D -PT=33E9BBD018604F301C2543878FCCCA5C - -I=289 -KEY=1A2D20A22E6F88A50BF5ADF1ADB6C433 -IV=50D84A03998B897D1AE217FEA9A955C4 -CT=33E9BBD018604F301C2543878FCCCA5C -PT=07163D652DB035C091830042D6047DF3 - -I=290 -KEY=1D3B1DC703DFBD659A76ADB37BB2B9C0 -IV=092DF26C855F07690836203E3E1790D0 -CT=07163D652DB035C091830042D6047DF3 -PT=AD6647AF8EFCD4F3B2ECDB4D6FFFC1EB - -I=291 -KEY=B05D5A688D236996289A76FE144D782B -IV=68634C941957E3F58F71BE37D7C5C78B -CT=AD6647AF8EFCD4F3B2ECDB4D6FFFC1EB -PT=D2B51122154D10F67D2C07BD75D5E8E2 - -I=292 -KEY=62E84B4A986E796055B67143619890C9 -IV=3C85044F6438FAA021BB7985A63A959D -CT=D2B51122154D10F67D2C07BD75D5E8E2 -PT=4131E9296FECD2DF35EDFBF0CBD0E54B - -I=293 -KEY=23D9A263F782ABBF605B8AB3AA487582 -IV=46D47F3F12B6ADD5580CE8CE7C7359CD -CT=4131E9296FECD2DF35EDFBF0CBD0E54B -PT=5AEA3E73A6EC0D9D683A3526AC1C0E58 - -I=294 -KEY=79339C10516EA6220861BF9506547BDA -IV=D3C58B190FDA0838C770C2185C553D97 -CT=5AEA3E73A6EC0D9D683A3526AC1C0E58 -PT=A21B17CB4588C30CAD6DF25A5E83E273 - -I=295 -KEY=DB288BDB14E6652EA50C4DCF58D799A9 -IV=870E7F0E3109712E84C58BEC0E7032F6 -CT=A21B17CB4588C30CAD6DF25A5E83E273 -PT=0021FF3BB8336E607B8DE10117005230 - -I=296 -KEY=DB0974E0ACD50B4EDE81ACCE4FD7CB99 -IV=2FC82B298A60FC40DA3EFD4E800DB063 -CT=0021FF3BB8336E607B8DE10117005230 -PT=2EFA32680ECD84891B447393F7C1AC88 - -I=297 -KEY=F5F34688A2188FC7C5C5DF5DB8166711 -IV=E1B86C9FC466B72BE40F65973FC41FC4 -CT=2EFA32680ECD84891B447393F7C1AC88 -PT=722117C1EE83FBA840EFEE86A930579F - -I=298 -KEY=87D251494C9B746F852A31DB1126308E -IV=48E347A705B6E322153BFE567931346F -CT=722117C1EE83FBA840EFEE86A930579F -PT=A684344231EC4C03726A0DC20EADA36D - -I=299 -KEY=2156650B7D77386CF7403C191F8B93E3 -IV=4CD618E5F959FC4C66602263F6C5C652 -CT=A684344231EC4C03726A0DC20EADA36D -PT=F40BFBEAC1C1BD1621FBAE1B605BD092 - -I=300 -KEY=D55D9EE1BCB6857AD6BB92027FD04371 -IV=5A41E8952E6B1C551C4691DE9C0A4B6D -CT=F40BFBEAC1C1BD1621FBAE1B605BD092 -PT=6ECDBFB3947C7E81C7BD4BE93B603728 - -I=301 -KEY=BB90215228CAFBFB1106D9EB44B07459 -IV=52E2726B0855F993E1075077B3AB1E77 -CT=6ECDBFB3947C7E81C7BD4BE93B603728 -PT=71E051375A3B974FE523DA47862E24AE - -I=302 -KEY=CA70706572F16CB4F42503ACC29E50F7 -IV=76B6637161FBE4760FCE90E9868B441A -CT=71E051375A3B974FE523DA47862E24AE -PT=CC6CFBCF9A62A3AE55F6B040673B25B3 - -I=303 -KEY=061C8BAAE893CF1AA1D3B3ECA5A57544 -IV=5563B0C2350A4ED76EE0C322480884FB -CT=CC6CFBCF9A62A3AE55F6B040673B25B3 -PT=DA71B26C4EE3FB1FD413FD0757B379E6 - -I=304 -KEY=DC6D39C6A670340575C04EEBF2160CA2 -IV=45C1C5DAF8DE9170C01E554DD36C564E -CT=DA71B26C4EE3FB1FD413FD0757B379E6 -PT=BCD4BC394FFB46207EF0A8EC9883BD55 - -I=305 -KEY=60B985FFE98B72250B30E6076A95B1F7 -IV=38E5B69E6D82A760BFD65CBAACC56F8A -CT=BCD4BC394FFB46207EF0A8EC9883BD55 -PT=FD997E7A7B77E5DF637182399779AF75 - -I=306 -KEY=9D20FB8592FC97FA6841643EFDEC1E82 -IV=8EB39B261910419E43B178DCD6803572 -CT=FD997E7A7B77E5DF637182399779AF75 -PT=71749C51136457B604CD8B4C193928A8 - -I=307 -KEY=EC5467D48198C04C6C8CEF72E4D5362A -IV=6DFA447305215066A0B5671E5AB80951 -CT=71749C51136457B604CD8B4C193928A8 -PT=DF48D76E54B4264304B0EC036DFDADDE - -I=308 -KEY=331CB0BAD52CE60F683C037189289BF4 -IV=8C2B316ECA96DB57322853E07BE47AB3 -CT=DF48D76E54B4264304B0EC036DFDADDE -PT=5E2BD374B9856C573A4DEBF1B8F453EC - -I=309 -KEY=6D3763CE6CA98A585271E88031DCC818 -IV=E541AC59CFDBEA97D1AE5221F849838E -CT=5E2BD374B9856C573A4DEBF1B8F453EC -PT=D7F97B76A8D3076D343A22459EC4765D - -I=310 -KEY=BACE18B8C47A8D35664BCAC5AF18BE45 -IV=B359889A22B9502571E4817C47BC5348 -CT=D7F97B76A8D3076D343A22459EC4765D -PT=E24F05EEE812BD3389AC0AAC4172F5C6 - -I=311 -KEY=58811D562C683006EFE7C069EE6A4B83 -IV=33F8D881A783051987103096B6C734C3 -CT=E24F05EEE812BD3389AC0AAC4172F5C6 -PT=A2AB44CC9C41A8748201DA6F9429AB39 - -I=312 -KEY=FA2A599AB02998726DE61A067A43E0BA -IV=2028704442AE252BCF1D081C5EE2D80B -CT=A2AB44CC9C41A8748201DA6F9429AB39 -PT=E8FA100D1D28186196BAF990A80109AA - -I=313 -KEY=12D04997AD018013FB5CE396D242E910 -IV=6384E3612062BC6850C94C3B14934A6F -CT=E8FA100D1D28186196BAF990A80109AA -PT=683AEF47A8990E2F8AAD8813789069B1 - -I=314 -KEY=7AEAA6D005988E3C71F16B85AAD280A1 -IV=12F78728F3B0EFAC7D304257E47ED5C8 -CT=683AEF47A8990E2F8AAD8813789069B1 -PT=F3121C95A5BACDEAEFA87C4EE40B6C6D - -I=315 -KEY=89F8BA45A02243D69E5917CB4ED9ECCC -IV=FE654BC69677E13383C4206BFB7896A6 -CT=F3121C95A5BACDEAEFA87C4EE40B6C6D -PT=AE9701378E128847A2669B516795D586 - -I=316 -KEY=276FBB722E30CB913C3F8C9A294C394A -IV=E79D5C468BCBA36A79B74F32F28FA635 -CT=AE9701378E128847A2669B516795D586 -PT=D97D988A40C5B323794F160FE8639262 - -I=317 -KEY=FE1223F86EF578B245709A95C12FAB28 -IV=4F3055450C627AD4712E042666AC0812 -CT=D97D988A40C5B323794F160FE8639262 -PT=32381BA55D5C0C91D683D57593772496 - -I=318 -KEY=CC2A385D33A9742393F34FE052588FBE -IV=172165B468B83B62B41A2B4310461193 -CT=32381BA55D5C0C91D683D57593772496 -PT=4D555F31A60F1007B96FBB458B06A619 - -I=319 -KEY=817F676C95A664242A9CF4A5D95E29A7 -IV=5D5EEBEA67DCD5F7851619F1BAA6414E -CT=4D555F31A60F1007B96FBB458B06A619 -PT=23D1AC0F18C20FCE7E5CC4619F8376D5 - -I=320 -KEY=A2AECB638D646BEA54C030C446DD5F72 -IV=54154B82B5820D5892DABD15B403345D -CT=23D1AC0F18C20FCE7E5CC4619F8376D5 -PT=2E55905A38F818CC04D8A792D2007332 - -I=321 -KEY=8CFB5B39B59C73265018975694DD2C40 -IV=AC47D7619A587DC8213B749918FCFEA8 -CT=2E55905A38F818CC04D8A792D2007332 -PT=010F3396885F8F6BF15170B8E6D221BD - -I=322 -KEY=8DF468AF3DC3FC4DA149E7EE720F0DFD -IV=6CE249D2E89C61ACD029AA3C122427D1 -CT=010F3396885F8F6BF15170B8E6D221BD -PT=4DB3972D9851B8A4B3150A43210D36F0 - -I=323 -KEY=C047FF82A59244E9125CEDAD53023B0D -IV=07A578889914E113C1C4DE01DC4B1DE4 -CT=4DB3972D9851B8A4B3150A43210D36F0 -PT=84F64CFFD705E82704FF3DA4FC074B34 - -I=324 -KEY=44B1B37D7297ACCE16A3D009AF057039 -IV=CE73ADCD7BCF1807C084276EDD765256 -CT=84F64CFFD705E82704FF3DA4FC074B34 -PT=5964DF8E8D656846EE574635787F7B18 - -I=325 -KEY=1DD56CF3FFF2C488F8F4963CD77A0B21 -IV=679903574013011E62CC5798B9633607 -CT=5964DF8E8D656846EE574635787F7B18 -PT=E28E7E3AA93802BEEFE258F38F5D2E5C - -I=326 -KEY=FF5B12C956CAC6361716CECF5827257D -IV=678D8583A022C60BCE2C227627A548B2 -CT=E28E7E3AA93802BEEFE258F38F5D2E5C -PT=D297684A7C50765C413BFA37B5E1E256 - -I=327 -KEY=2DCC7A832A9AB06A562D34F8EDC6C72B -IV=4EF9AACC21733B65B4DD0B1F105D4037 -CT=D297684A7C50765C413BFA37B5E1E256 -PT=9EF5F9A2B14B090A201DE74E4CF714C8 - -I=328 -KEY=B33983219BD1B9607630D3B6A131D3E3 -IV=5CC41FCC9EC19619BA06D10BBC6E1F5F -CT=9EF5F9A2B14B090A201DE74E4CF714C8 -PT=81EF000CF6CA737E0F449927E66F6392 - -I=329 -KEY=32D6832D6D1BCA1E79744A91475EB071 -IV=6DE60CE2986CF80C5D588FA1F9A8C3A0 -CT=81EF000CF6CA737E0F449927E66F6392 -PT=3BE177EE9F8F7BE3BCE0FAA70C0A5025 - -I=330 -KEY=0937F4C3F294B1FDC594B0364B54E054 -IV=BE2F86A52BEED4497790D6134CF0D64E -CT=3BE177EE9F8F7BE3BCE0FAA70C0A5025 -PT=DD313134DB126529F349808B3E766795 - -I=331 -KEY=D406C5F72986D4D436DD30BD752287C1 -IV=A89E52478FDEF91AF151097CED84579C -CT=DD313134DB126529F349808B3E766795 -PT=330203EA36484C8E091F00CD2255E599 - -I=332 -KEY=E704C61D1FCE985A3FC2307057776258 -IV=1AEF7BA63A3E3B6D2EB8EB1980D3E581 -CT=330203EA36484C8E091F00CD2255E599 -PT=E28A47CDB7DB0351006C1D9FB227FCEF - -I=333 -KEY=058E81D0A8159B0B3FAE2DEFE5509EB7 -IV=F67C7FCF8C5AA1574A165D8CBE694BF4 -CT=E28A47CDB7DB0351006C1D9FB227FCEF -PT=ACF869797690853BE142BB7BAC735FC8 - -I=334 -KEY=A976E8A9DE851E30DEEC96944923C17F -IV=636F181C4735E700897928BFC60A43EB -CT=ACF869797690853BE142BB7BAC735FC8 -PT=60FF9BF36809DAEB94F823FC6458B26A - -I=335 -KEY=C989735AB68CC4DB4A14B5682D7B7315 -IV=0829C0EE6B170C490C7A73401761CEAA -CT=60FF9BF36809DAEB94F823FC6458B26A -PT=17630CBEAB904F7996301515F24A1F27 - -I=336 -KEY=DEEA7FE41D1C8BA2DC24A07DDF316C32 -IV=A4E0624D86F1098D2DD4D0408897ACED -CT=17630CBEAB904F7996301515F24A1F27 -PT=A1E35C3E2FA1B1DB11DB96E7DD58AB37 - -I=337 -KEY=7F0923DA32BD3A79CDFF369A0269C705 -IV=D3639A296FF168ED773785CFCACD1015 -CT=A1E35C3E2FA1B1DB11DB96E7DD58AB37 -PT=14F5408460708A69A22A2023B01969CE - -I=338 -KEY=6BFC635E52CDB0106FD516B9B270AECB -IV=37CD0428A0C08CC6AABAAA05D8830557 -CT=14F5408460708A69A22A2023B01969CE -PT=516991CA6530D20AB121394F51288880 - -I=339 -KEY=3A95F29437FD621ADEF42FF6E358264B -IV=FB52F5A95F2E3665D44F0AEACB88B108 -CT=516991CA6530D20AB121394F51288880 -PT=FB0C32B66729736F8E5EC8C92D80FDC5 - -I=340 -KEY=C199C02250D4117550AAE73FCED8DB8E -IV=403B43C740215D94E8FBAE22846D3B0A -CT=FB0C32B66729736F8E5EC8C92D80FDC5 -PT=C243054D022E7E9EFC21F965C71D63EB - -I=341 -KEY=03DAC56F52FA6FEBAC8B1E5A09C5B865 -IV=663796B211E7F6E05B4A107B16A904B0 -CT=C243054D022E7E9EFC21F965C71D63EB -PT=6CA56F6792355B2A7A60A4467A85F71E - -I=342 -KEY=6F7FAA08C0CF34C1D6EBBA1C73404F7B -IV=A23B73DF1477EC98202135164C6EF1AB -CT=6CA56F6792355B2A7A60A4467A85F71E -PT=BC590C8B427B013F873B2F5F8D66D5D1 - -I=343 -KEY=D326A68382B435FE51D09543FE269AAA -IV=E84DF462C62D594AAD94C33C446E18FC -CT=BC590C8B427B013F873B2F5F8D66D5D1 -PT=D37CAA9BEA300FF6219349DBA25DA0A6 - -I=344 -KEY=005A0C1868843A087043DC985C7B3A0C -IV=9AAD322884EBE93D0FA084E144600174 -CT=D37CAA9BEA300FF6219349DBA25DA0A6 -PT=AE50C328AFFC39A103C767C1FD337449 - -I=345 -KEY=AE0ACF30C77803A97384BB59A1484E45 -IV=9CEE91362FB0D50ABCEB58EF49EC3614 -CT=AE50C328AFFC39A103C767C1FD337449 -PT=882939453C6E156CD023B468EDD16C95 - -I=346 -KEY=2623F675FB1616C5A3A70F314C9922D0 -IV=5626126CC424BF26D92C822442E4221E -CT=882939453C6E156CD023B468EDD16C95 -PT=B9A97FE0DEF66604F6CE928AAB532EC2 - -I=347 -KEY=9F8A899525E070C155699DBBE7CA0C12 -IV=E5BB374C14E36FD0C2D5F9191C967EC7 -CT=B9A97FE0DEF66604F6CE928AAB532EC2 -PT=6ED0FF2FE8DA900A33AE20F7C1C2E457 - -I=348 -KEY=F15A76BACD3AE0CB66C7BD4C2608E845 -IV=4493B9F0FF63D392273302B6932C8F77 -CT=6ED0FF2FE8DA900A33AE20F7C1C2E457 -PT=B7583A56BED55067A520B4F5E5C1528F - -I=349 -KEY=46024CEC73EFB0ACC3E709B9C3C9BACA -IV=12E2BFD3EAB69E5132E3CDF8BAFBD45E -CT=B7583A56BED55067A520B4F5E5C1528F -PT=28874485575E292B0C83E1B568019BF0 - -I=350 -KEY=6E85086924B19987CF64E80CABC8213A -IV=3CEFDC726C919CA265CD6C28A05DE542 -CT=28874485575E292B0C83E1B568019BF0 -PT=A35D16BBB96BF3F9E06D96EDA9BB44BB - -I=351 -KEY=CDD81ED29DDA6A7E2F097EE102736581 -IV=4AE79901700F018D1E5D95A9FAD762F2 -CT=A35D16BBB96BF3F9E06D96EDA9BB44BB -PT=367E6880D369D482E7E64CFCD1BCC870 - -I=352 -KEY=FBA676524EB3BEFCC8EF321DD3CFADF1 -IV=52EEDB058A8E1FE7C651D484F86F941F -CT=367E6880D369D482E7E64CFCD1BCC870 -PT=32B33E97C94953392A738A964DB121FC - -I=353 -KEY=C91548C587FAEDC5E29CB88B9E7E8C0D -IV=B3704291187E9D55901DD237EC1E2F24 -CT=32B33E97C94953392A738A964DB121FC -PT=965A9A0C0287AB8535436E95CC9BFB99 - -I=354 -KEY=5F4FD2C9857D4640D7DFD61E52E57794 -IV=B3878FC256FA4F9ED0BA05FF51C0CE2A -CT=965A9A0C0287AB8535436E95CC9BFB99 -PT=367A5C93099ACF72353DAC320A3B766E - -I=355 -KEY=69358E5A8CE78932E2E27A2C58DE01FA -IV=774EA78AECAF5A1D7CC1785DE91CAB01 -CT=367A5C93099ACF72353DAC320A3B766E -PT=116EDEB1D0E6F8D1BB58AF648429B792 - -I=356 -KEY=785B50EB5C0171E359BAD548DCF7B668 -IV=FB1EC4218C5F733A54DEA7F753F45D68 -CT=116EDEB1D0E6F8D1BB58AF648429B792 -PT=EF3C679822E3A906F380CD07EBE65F09 - -I=357 -KEY=976737737EE2D8E5AA3A184F3711E961 -IV=8BBE09AFE41C5A78EBA0524212AC570F -CT=EF3C679822E3A906F380CD07EBE65F09 -PT=291B066A30A3B11681D414A4BB5311D5 - -I=358 -KEY=BE7C31194E4169F32BEE0CEB8C42F8B4 -IV=4E8F651C06778A964AA7D43999E41FD6 -CT=291B066A30A3B11681D414A4BB5311D5 -PT=764F8FD22FE0BD98852F259EA6DC6F7C - -I=359 -KEY=C833BECB61A1D46BAEC129752A9E97C8 -IV=E90A35007EE7F001D1F5982BF2477C82 -CT=764F8FD22FE0BD98852F259EA6DC6F7C -PT=66016373A6B1A3797A1B2D2B19B73126 - -I=360 -KEY=AE32DDB8C7107712D4DA045E3329A6EE -IV=46FF289808B1AF6B290CB5AF05747085 -CT=66016373A6B1A3797A1B2D2B19B73126 -PT=3367064ECF5CA978001887DBDE40DE5A - -I=361 -KEY=9D55DBF6084CDE6AD4C28385ED6978B4 -IV=9BAC8819E1CA613CFAA730FBC2034168 -CT=3367064ECF5CA978001887DBDE40DE5A -PT=5C4F01D47C9DA94DE95FC26763CC1146 - -I=362 -KEY=C11ADA2274D177273D9D41E28EA569F2 -IV=A5CE34A846E1D0A737963C49FAD6378E -CT=5C4F01D47C9DA94DE95FC26763CC1146 -PT=D41D854E42863F161E76A2397020C321 - -I=363 -KEY=15075F6C3657483123EBE3DBFE85AAD3 -IV=2CC823722DD3E8F15035875ED43513E2 -CT=D41D854E42863F161E76A2397020C321 -PT=1C542DC0B54A053471AF583C909AB3C4 - -I=364 -KEY=095372AC831D4D055244BBE76E1F1917 -IV=9799D03B6AD46BECD981279B35DF707C -CT=1C542DC0B54A053471AF583C909AB3C4 -PT=958D0254D7AFE1E678A9844DF4F4D18D - -I=365 -KEY=9CDE70F854B2ACE32AED3FAA9AEBC89A -IV=E0E401C7BA5E319F0D60AB765CBEE176 -CT=958D0254D7AFE1E678A9844DF4F4D18D -PT=C54888169B30587E732BD7213EE5B1A3 - -I=366 -KEY=5996F8EECF82F49D59C6E88BA40E7939 -IV=711DA6521732E6868111DCC1C835F9DF -CT=C54888169B30587E732BD7213EE5B1A3 -PT=446F234FCADA809A8B2E167A86C9EB36 - -I=367 -KEY=1DF9DBA105587407D2E8FEF122C7920F -IV=B7008BC907C546A56743C292185C2B02 -CT=446F234FCADA809A8B2E167A86C9EB36 -PT=6AD93BC7E18B48810664CD1C528BA6C4 - -I=368 -KEY=7720E066E4D33C86D48C33ED704C34CB -IV=4D7DD98183E56F71D72DB76187FC5F95 -CT=6AD93BC7E18B48810664CD1C528BA6C4 -PT=0D75BD2B8683FB819EB7F71E2E0836A7 - -I=369 -KEY=7A555D4D6250C7074A3BC4F35E44026C -IV=F4DCFB73BBE7EB5348D56F81BCBC0971 -CT=0D75BD2B8683FB819EB7F71E2E0836A7 -PT=8CBE14862E93FE011A4F45518C7258FA - -I=370 -KEY=F6EB49CB4CC33906507481A2D2365A96 -IV=5432FBF1480AA398F09CA5AF375FA394 -CT=8CBE14862E93FE011A4F45518C7258FA -PT=4026D669905762F0790B6497646A2D4D - -I=371 -KEY=B6CD9FA2DC945BF6297FE535B65C77DB -IV=CA462DC9F029A8311CA45A4116DADC1D -CT=4026D669905762F0790B6497646A2D4D -PT=A8CD2E187CF274756E5736D420853435 - -I=372 -KEY=1E00B1BAA0662F834728D3E196D943EE -IV=4FC9E7688352F4700C5F380BFD1F4FB2 -CT=A8CD2E187CF274756E5736D420853435 -PT=A99410B60322340E279C87D3D26793AA - -I=373 -KEY=B794A10CA3441B8D60B4543244BED044 -IV=4D90B1A30EB7E957FAE3DC8C132F4F42 -CT=A99410B60322340E279C87D3D26793AA -PT=D136F990196C667EC35E3A0492C39968 - -I=374 -KEY=66A2589CBA287DF3A3EA6E36D67D492C -IV=6FAD87F358F0C702C5E9E599093219ED -CT=D136F990196C667EC35E3A0492C39968 -PT=8CE49C1BAACAB69432DDA2FF4250C7B2 - -I=375 -KEY=EA46C48710E2CB679137CCC9942D8E9E -IV=2B6FF495B7E482360E31949C7C9B2E2B -CT=8CE49C1BAACAB69432DDA2FF4250C7B2 -PT=7942B80F57EA24FA200451B37899F9E2 - -I=376 -KEY=93047C884708EF9DB1339D7AECB4777C -IV=21FDC4C9B03A1A9A3F87FF9AAC80FAAE -CT=7942B80F57EA24FA200451B37899F9E2 -PT=DE156D56E199FDBB2600DBF9FC254003 - -I=377 -KEY=4D1111DEA6911226973346831091377F -IV=387612E399C62916B394A9FC6BC0F059 -CT=DE156D56E199FDBB2600DBF9FC254003 -PT=C302C494D910640271695324E64B0992 - -I=378 -KEY=8E13D54A7F817624E65A15A7F6DA3EED -IV=34BCABDE4646BCC05CAF7E61CBF1F8D2 -CT=C302C494D910640271695324E64B0992 -PT=110CE84E5B81867CE4FCCD1BBB5FD792 - -I=379 -KEY=9F1F3D042400F05802A6D8BC4D85E97F -IV=C7898DA9ABF2A3D364C228A83525B04F -CT=110CE84E5B81867CE4FCCD1BBB5FD792 -PT=7B94C0E4849AD65291F0F7BD464C544C - -I=380 -KEY=E48BFDE0A09A260A93562F010BC9BD33 -IV=00E079EEBC47AF3ED3796DBF4A2B55FC -CT=7B94C0E4849AD65291F0F7BD464C544C -PT=D6518596BB53E44452393BD4440D805C - -I=381 -KEY=32DA78761BC9C24EC16F14D54FC43D6F -IV=03E168F8AF2303593E0F936648D253DC -CT=D6518596BB53E44452393BD4440D805C -PT=0C4B51FB33380BB215F29F3FCE7CA0DA - -I=382 -KEY=3E91298D28F1C9FCD49D8BEA81B89DB5 -IV=15E1ECD59BC092C974FA4738C66D9604 -CT=0C4B51FB33380BB215F29F3FCE7CA0DA -PT=3FC98D86A558B711807930AAA391C9BF - -I=383 -KEY=0158A40B8DA97EED54E4BB402229540A -IV=303BD4A407015A9E899816E0FABF288D -CT=3FC98D86A558B711807930AAA391C9BF -PT=85D77D90C312FE938F6C1983014BD572 - -I=384 -KEY=848FD99B4EBB807EDB88A2C323628178 -IV=E018FA96FD433CFD162E8E67D4F37015 -CT=85D77D90C312FE938F6C1983014BD572 -PT=4F49C1740EA88B5767CE36C95158DD63 - -I=385 -KEY=CBC618EF40130B29BC46940A723A5C1B -IV=84013D3E2AA0C77650644CD6862096A7 -CT=4F49C1740EA88B5767CE36C95158DD63 -PT=E6F1409ABA890AC3A50FC4AAD82E1872 - -I=386 -KEY=2D375875FA9A01EA194950A0AA144469 -IV=8BFD137593BFF254414349F1147B9BFF -CT=E6F1409ABA890AC3A50FC4AAD82E1872 -PT=66F6E29696CFDC72EE905636614D2A72 - -I=387 -KEY=4BC1BAE36C55DD98F7D90696CB596E1B -IV=8EC295602FB66C4A2DCA65F66B07E010 -CT=66F6E29696CFDC72EE905636614D2A72 -PT=553B45792AE0625B357C4B68A4BB767F - -I=388 -KEY=1EFAFF9A46B5BFC3C2A54DFE6FE21864 -IV=5999E221475D06295451E52FF88F9F97 -CT=553B45792AE0625B357C4B68A4BB767F -PT=FAB6F53166BFDB89DF68D46D423C243E - -I=389 -KEY=E44C0AAB200A644A1DCD99932DDE3C5A -IV=49D1944CBD7BE00C671B8E996F9A3EB9 -CT=FAB6F53166BFDB89DF68D46D423C243E -PT=308DDB3FE0415C46AE450C78FC5F2558 - -I=390 -KEY=D4C1D194C04B380CB38895EBD1811902 -IV=9785FEE180794318514967B4199CFB93 -CT=308DDB3FE0415C46AE450C78FC5F2558 -PT=6659969D1BD493A3851E75981BACCCB0 - -I=391 -KEY=B2984709DB9FABAF3696E073CA2DD5B2 -IV=4FD1DAE14DB75AC0E6C94388805AC3B5 -CT=6659969D1BD493A3851E75981BACCCB0 -PT=B56B950D84DCA131FD8A5E2601037B36 - -I=392 -KEY=07F3D2045F430A9ECB1CBE55CB2EAE84 -IV=3ED415E7DDDADD2DC7F0376E6CA42EFE -CT=B56B950D84DCA131FD8A5E2601037B36 -PT=8648F40FA13018563E6F1A799D9FCD91 - -I=393 -KEY=81BB260BFE7312C8F573A42C56B16315 -IV=FEAF76717C0905A601509BD68C6D08E5 -CT=8648F40FA13018563E6F1A799D9FCD91 -PT=66DE6D7A74B36C7EE2737DA526F5C8CD - -I=394 -KEY=E7654B718AC07EB61700D9897044ABD8 -IV=2B808C340320DD64AB9278A9D9A3E247 -CT=66DE6D7A74B36C7EE2737DA526F5C8CD -PT=9BB0D29CDA21452F60B5897186F3FAFB - -I=395 -KEY=7CD599ED50E13B9977B550F8F6B75123 -IV=D2EB48117E2E9FB2058800DE1A442799 -CT=9BB0D29CDA21452F60B5897186F3FAFB -PT=489CDC3A2C1AE7510E03AE36D5EAB0E5 - -I=396 -KEY=344945D77CFBDCC879B6FECE235DE1C6 -IV=427765E0671AA6D32634447687E9B209 -CT=489CDC3A2C1AE7510E03AE36D5EAB0E5 -PT=1D65D0E1235AE47DBCC2C65B59892C4C - -I=397 -KEY=292C95365FA138B5C57438957AD4CD8A -IV=D75E9F074D965FE902287B3BB1483315 -CT=1D65D0E1235AE47DBCC2C65B59892C4C -PT=E75B7AE5A8C3B93F15D0E3EBD04E1B4B - -I=398 -KEY=CE77EFD3F762818AD0A4DB7EAA9AD6C1 -IV=5455FD9A01E04E48CA777CF8185697ED -CT=E75B7AE5A8C3B93F15D0E3EBD04E1B4B -PT=11F4A35F6C225A9DF1CA6BAF92E11B07 - -I=399 -KEY=DF834C8C9B40DB17216EB0D1387BCDC6 -IV=3C608F664492626B2208DC92E819411A -CT=11F4A35F6C225A9DF1CA6BAF92E11B07 -PT=9B8FB71E035CEFF9CBFA1346E5ACEFE0 - -========== - -KEYSIZE=192 - -I=0 -KEY=000000000000000000000000000000000000000000000000 -IV=00000000000000000000000000000000 -CT=00000000000000000000000000000000 -PT=5DF678DD17BA4E75B61768C6ADEF7C7B - -I=1 -KEY=8AB601AF30C47B225DF678DD17BA4E75B61768C6ADEF7C7B -IV=3B243F1A9BA094EE8AB601AF30C47B22 -CT=5DF678DD17BA4E75B61768C6ADEF7C7B -PT=F9604074F8FA45AC71959888DD056F9F - -I=2 -KEY=D443B8E25A882D05A49638A9EF400BD9C782F04E70EA13E4 -IV=467E32A79443B0735EF5B94D6A4C5627 -CT=F9604074F8FA45AC71959888DD056F9F -PT=98A957EA6DBE623B7E08F919812A3898 - -I=3 -KEY=5742DCD38C8FD46D3C3F6F4382FE69E2B98A0957F1C02B7C -IV=B9E1062EEDD9A1ED83016431D607F968 -CT=98A957EA6DBE623B7E08F919812A3898 -PT=AD6D29D6482764BB4BC27A87AE5CD877 - -I=4 -KEY=B33625F7872DE4A191524695CAD90D59F24873D05F9CF30B -IV=BD1AAC94D2D39445E474F9240BA230CC -CT=AD6D29D6482764BB4BC27A87AE5CD877 -PT=DA5EB591FDC48F0D9E4EBD373E5717A3 - -I=5 -KEY=35DA9F0A5DB187964B0CF304371D82546C06CEE761CBE4A8 -IV=4782561ED717916986ECBAFDDA9C6337 -CT=DA5EB591FDC48F0D9E4EBD373E5717A3 -PT=3F6E771434E26D4FA5A57CEF9DEE05D6 - -I=6 -KEY=A8182E4F8FD8C7987462841003FFEF1BC9A3B208FC25E17E -IV=093273C6E96EA5399DC2B145D269400E -CT=3F6E771434E26D4FA5A57CEF9DEE05D6 -PT=F8FBFC8CBDD4AA8E8DA58DEA7F2F344C - -I=7 -KEY=71A581F408C35DA48C99789CBE2B459544063FE2830AD532 -IV=3900E8650CA62A25D9BDAFBB871B9A3C -CT=F8FBFC8CBDD4AA8E8DA58DEA7F2F344C -PT=B969AA871D3B35C260D8B36C7E9E8913 - -I=8 -KEY=BCD0E4B5F0B7FB5035F0D21BA310705724DE8C8EFD945C21 -IV=0E2BCF13C2A18FF5CD756541F874A6F4 -CT=B969AA871D3B35C260D8B36C7E9E8913 -PT=6205EECCDD965D45339A2DFE85F52AD7 - -I=9 -KEY=A2796321044D9F5557F53CD77E862D121744A170786176F6 -IV=8B935AB4C17D24D21EA98794F4FA6405 -CT=6205EECCDD965D45339A2DFE85F52AD7 -PT=6BC27204DA1B9BC27E463D0E71557D99 - -I=10 -KEY=AD4506295D5309603C374ED3A49DB6D069029C7E09340B6F -IV=A9AF68AB4EFDB7770F3C6508591E9635 -CT=6BC27204DA1B9BC27E463D0E71557D99 -PT=DB1576A8F1BD88F73E6938E72F9C6DCD - -I=11 -KEY=61ECB6C8660E5E20E722387B55203E27576BA49926A866A2 -IV=DF83746D72419F65CCA9B0E13B5D5740 -CT=DB1576A8F1BD88F73E6938E72F9C6DCD -PT=150D14977B15FD304890D7B9C4F8536E - -I=12 -KEY=03679C91B6C57828F22F2CEC2E35C3171FFB7320E25035CC -IV=59D101131EA2FD7F628B2A59D0CB2608 -CT=150D14977B15FD304890D7B9C4F8536E -PT=7AE22B73B412A81D0BCF422C68DA37F8 - -I=13 -KEY=9A087B9DBC37B12988CD079F9A276B0A1434310C8A8A0234 -IV=F26F03A3C84A49F0996FE70C0AF2C901 -CT=7AE22B73B412A81D0BCF422C68DA37F8 -PT=2D1584CE9B85E7264228A8AFF8FAFF01 - -I=14 -KEY=07489932E5335B38A5D8835101A28C2C561C99A37270FD35 -IV=E76AB1C798119F5D9D40E2AF5904EA11 -CT=2D1584CE9B85E7264228A8AFF8FAFF01 -PT=C1067030225453E808F1FF324C44BE7F - -I=15 -KEY=DC3726E33013BC9964DEF36123F6DFC45EED66913E34434A -IV=55010D6199E792E3DB7FBFD1D520E7A1 -CT=C1067030225453E808F1FF324C44BE7F -PT=3AD7DBD96BB69D63BE39B9A16574AC74 - -I=16 -KEY=EDD4EC10B074A36C5E0928B8484042A7E0D4DF305B40EF3E -IV=18C6FE6D0A2FDD7E31E3CAF380671FF5 -CT=3AD7DBD96BB69D63BE39B9A16574AC74 -PT=3D5D82A4C06B9DDCCC8A6B8BF228482F - -I=17 -KEY=23824573BD3CE30D6354AA1C882BDF7B2C5EB4BBA968A711 -IV=E1DEAECBCFC06BCCCE56A9630D484061 -CT=3D5D82A4C06B9DDCCC8A6B8BF228482F -PT=C0E5F9618F2FAB97EA82F8164DC89860 - -I=18 -KEY=AAA43BC528933502A3B1537D070474ECC6DC4CADE4A03F71 -IV=2CE22FDF7E87B7CC89267EB695AFD60F -CT=C0E5F9618F2FAB97EA82F8164DC89860 -PT=6942155FC9EF8F7CFE37CD6FED03CECF - -I=19 -KEY=A2686C442D636D31CAF34622CEEBFB9038EB81C209A3F1BE -IV=B7772CF7B44B856308CC578105F05833 -CT=6942155FC9EF8F7CFE37CD6FED03CECF -PT=6BA4C261F5173862A6789FB026099571 - -I=20 -KEY=29F645A446D84EACA15784433BFCC3F29E931E722FAA64CF -IV=15CA23A60D99FFF68B9E29E06BBB239D -CT=6BA4C261F5173862A6789FB026099571 -PT=AA9E8C6497CAC6B0C8CC92F8DFE7B455 - -I=21 -KEY=5E9165527010387F0BC90827AC360542565F8C8AF04DD09A -IV=53193227307BBE49776720F636C876D3 -CT=AA9E8C6497CAC6B0C8CC92F8DFE7B455 -PT=7DA426C712E7F2F35087D6AA31CF56AB - -I=22 -KEY=92DC0EEE09F5169E766D2EE0BED1F7B106D85A20C1828631 -IV=85A3D20949963F95CC4D6BBC79E52EE1 -CT=7DA426C712E7F2F35087D6AA31CF56AB -PT=09B9FF5E5833B6CE0010C3D0C4A84C19 - -I=23 -KEY=C45B938E7C18B4107FD4D1BEE6E2417F06C899F0052ACA28 -IV=292A007187D730B956879D6075EDA28E -CT=09B9FF5E5833B6CE0010C3D0C4A84C19 -PT=178F7AC0FF63C33683A001F5C4171316 - -I=24 -KEY=03D99546E931B761685BAB7E1981824985689805C13DD93E -IV=A8D8CD3B96215FCDC78206C895290371 -CT=178F7AC0FF63C33683A001F5C4171316 -PT=C39B82763CF6901170902BE6DC1B9305 - -I=25 -KEY=B52384CAC0B230F5ABC0290825771258F5F8B3E31D264A3B -IV=451968C3AA8D0319B6FA118C29838794 -CT=C39B82763CF6901170902BE6DC1B9305 -PT=85D827F61EC17FD00B10356292C863E2 - -I=26 -KEY=DCF617A990AC4CBB2E180EFE3BB66D88FEE886818FEE29D9 -IV=575103DAEFD233E269D59363501E7C4E -CT=85D827F61EC17FD00B10356292C863E2 -PT=535BAC956D5CAB917E1A1BC28E82F28F - -I=27 -KEY=14D0FCAFFD961CFD7D43A26B56EAC61980F29D43016CDB56 -IV=7DE780ACCF9F1896C826EB066D3A5046 -CT=535BAC956D5CAB917E1A1BC28E82F28F -PT=7E73E89F187EA6D5F5A3044A19C85941 - -I=28 -KEY=AF5BFBC086F1392203304AF44E9460CC7551990918A48217 -IV=633F0251217DECEDBB8B076F7B6725DF -CT=7E73E89F187EA6D5F5A3044A19C85941 -PT=B0976DFD4F0620203AC4ED89D395BAFF - -I=29 -KEY=79FFB93DCF243047B3A72709019240EC4F957480CB3138E8 -IV=C1AAE3E35613DAADD6A442FD49D50965 -CT=B0976DFD4F0620203AC4ED89D395BAFF -PT=5ECB838EC7F9F2E7ADBD719599F829B9 - -I=30 -KEY=681F54ADA7685555ED6CA487C66BB20BE228051552C91151 -IV=4F00D9CD31BE1CC611E0ED90684C6512 -CT=5ECB838EC7F9F2E7ADBD719599F829B9 -PT=8DDA96BD88D3D756306D249ABF99F5F9 - -I=31 -KEY=8663BEBF11817A3060B6323A4EB8655DD245218FED50E4A8 -IV=7CC24DC4B003DE90EE7CEA12B6E92F65 -CT=8DDA96BD88D3D756306D249ABF99F5F9 -PT=479E96E558540B71508FEF3173A6FC68 - -I=32 -KEY=831519BE48B0021A2728A4DF16EC6E2C82CACEBE9EF618C0 -IV=59FFA792DC8618070576A7015931782A -CT=479E96E558540B71508FEF3173A6FC68 -PT=080EA053745BEEBDBC5F7D964EEBD2F7 - -I=33 -KEY=AFC20AF72699543A2F26048C62B780913E95B328D01DCA37 -IV=4E5BDD875324CAC02CD713496E295620 -CT=080EA053745BEEBDBC5F7D964EEBD2F7 -PT=B5A58D345C0260A9E274E2E593B76C44 - -I=34 -KEY=46AEAF002B9A297E9A8389B83EB5E038DCE151CD43AAA673 -IV=C67419FDA89E68B1E96CA5F70D037D44 -CT=B5A58D345C0260A9E274E2E593B76C44 -PT=5200F2D475CA388841CB0DD02C7EB7F6 - -I=35 -KEY=1598E4DD7DA3D7B0C8837B6C4B7FD8B09D2A5C1D6FD41185 -IV=9F5C74A1FE2DFF2153364BDD5639FECE -CT=5200F2D475CA388841CB0DD02C7EB7F6 -PT=B2639C2D26BF2CAF2371CA3A4F3D3476 - -I=36 -KEY=FE63AA4A158B41AE7AE0E7416DC0F41FBE5B962720E925F3 -IV=2DC59704D531C890EBFB4E976828961E -CT=B2639C2D26BF2CAF2371CA3A4F3D3476 -PT=C758ADC41E334CCBF34C40E2AEAA3852 - -I=37 -KEY=86B214FA7F89CE06BDB84A8573F3B8D44D17D6C58E431DA1 -IV=D0982ADEECE45CCC78D1BEB06A028FA8 -CT=C758ADC41E334CCBF34C40E2AEAA3852 -PT=F8E0AA1E780F18A50371CBCB1B63E83F - -I=38 -KEY=C0C34A59DC653DCE4558E09B0BFCA0714E661D0E9520F59E -IV=A252B0F29766A24B46715EA3A3ECF3C8 -CT=F8E0AA1E780F18A50371CBCB1B63E83F -PT=554B524391A7A1679210CFC0152A65CE - -I=39 -KEY=3CF3D7DDFFF704231013B2D89A5B0116DC76D2CE800A9050 -IV=42EE716B821C18FCFC309D84239239ED -CT=554B524391A7A1679210CFC0152A65CE -PT=3273E6C51751407B7E4ECDED7970746D - -I=40 -KEY=7FCC684C43B958F02260541D8D0A416DA2381F23F97AE43D -IV=A4FCB2B8AB7158B9433FBF91BC4E5CD3 -CT=3273E6C51751407B7E4ECDED7970746D -PT=D90B75848AC14ACA3CAD9AF2A15F315F - -I=41 -KEY=240724B451241314FB6B219907CB0BA79E9585D15825D562 -IV=5C4FA1918B04D5F85BCB4CF8129D4BE4 -CT=D90B75848AC14ACA3CAD9AF2A15F315F -PT=753C59B87C45B21D527527C6C2DDEB0D - -I=42 -KEY=F0BEECC2DB5D16F98E5778217B8EB9BACCE0A2179AF83E6F -IV=4E41A4AB69AEE73FD4B9C8768A7905ED -CT=753C59B87C45B21D527527C6C2DDEB0D -PT=156E851810ADB0BF2D28B6150D32CAC7 - -I=43 -KEY=C2FB954C95633B5B9B39FD396B230905E1C8140297CAF4A8 -IV=983906FA7F156CF33245798E4E3E2DA2 -CT=156E851810ADB0BF2D28B6150D32CAC7 -PT=26E671DACE32070A601796207BD045B5 - -I=44 -KEY=BF0BD4C6DDBE22DABDDF8CE3A5110E0F81DF8222EC1AB11D -IV=B3188D29356783AF7DF0418A48DD1981 -CT=26E671DACE32070A601796207BD045B5 -PT=ADAD9072859250A8590F6F54C24E5A77 - -I=45 -KEY=2E4F07AD61768CC010721C9120835EA7D8D0ED762E54EB6A -IV=639F27016A9D99B99144D36BBCC8AE1A -CT=ADAD9072859250A8590F6F54C24E5A77 -PT=AC8AD3933D51D5D71CA90FB73A53F6AD - -I=46 -KEY=9963998A6F982462BCF8CF021DD28B70C479E2C114071DC7 -IV=B2A3ACB0CE942F13B72C9E270EEEA8A2 -CT=AC8AD3933D51D5D71CA90FB73A53F6AD -PT=7319F2825648168F07D525618DA9979A - -I=47 -KEY=417FD42690AAE310CFE13D804B9A9DFFC3ACC7A099AE8A5D -IV=EBB0EF7CE1ACF152D81C4DACFF32C772 -CT=7319F2825648168F07D525618DA9979A -PT=4FC19392439D6CBE6699419355E0590B - -I=48 -KEY=30CD3A2A0910C7268020AE120807F141A5358633CC4ED356 -IV=4DCACE79E4C3ADFE71B2EE0C99BA2436 -CT=4FC19392439D6CBE6699419355E0590B -PT=047FF92A523900A3C46D906163927DDD - -I=49 -KEY=F13EE3ACC9C19E4C845F57385A3EF1E261581652AFDCAE8B -IV=E260680204844E6FC1F3D986C0D1596A -CT=047FF92A523900A3C46D906163927DDD -PT=2DAE78D178D069918CCC11D675E09655 - -I=50 -KEY=91556C720DC982D5A9F12FE922EE9873ED940784DA3C38DE -IV=A4E4973E74B61315606B8FDEC4081C99 -CT=2DAE78D178D069918CCC11D675E09655 -PT=6315A6A029ED7FC5AB3CD38D8DAE561A - -I=51 -KEY=9120A23E63AF3BC2CAE489490B03E7B646A8D40957926EC4 -IV=C02DA24531C794BD0075CE4C6E66B917 -CT=6315A6A029ED7FC5AB3CD38D8DAE561A -PT=65A796C69B769E59D34AD19803F117C6 - -I=52 -KEY=5C6847E25C66145DAF431F8F907579EF95E2059154637902 -IV=0D72A6B0F3959C89CD48E5DC3FC92F9F -CT=65A796C69B769E59D34AD19803F117C6 -PT=70770D19D03DF488FB627F460A225F39 - -I=53 -KEY=F5ECA4C905FF0EC2DF34129640488D676E807AD75E41263B -IV=2F60424B5062D978A984E32B59991A9F -CT=70770D19D03DF488FB627F460A225F39 -PT=C8A66A2CD18286D2148230BAB7D81E11 - -I=54 -KEY=FF86E251C5EC6129179278BA91CA0BB57A024A6DE999382A -IV=CC7330AE077936B10A6A4698C0136FEB -CT=C8A66A2CD18286D2148230BAB7D81E11 -PT=FC0B47BA3E51927A632F457A919818DC - -I=55 -KEY=5C0A7344D6FD6983EB993F00AF9B99CF192D0F17780120F6 -IV=CA119AEE5576E06EA38C9115131108AA -CT=FC0B47BA3E51927A632F457A919818DC -PT=AEEDB360C58C4CDC7ACE87AA1A4B785B - -I=56 -KEY=426948BD499E8A9845748C606A17D51363E388BD624A58AD -IV=920C491DE39D52501E633BF99F63E31B -CT=AEEDB360C58C4CDC7ACE87AA1A4B785B -PT=737ECC4294FF69495DC37DC795EC13CE - -I=57 -KEY=F8AD0E545AA212E6360A4022FEE8BC5A3E20F57AF7A64B63 -IV=B975B70450A41A2DBAC446E9133C987E -CT=737ECC4294FF69495DC37DC795EC13CE -PT=3E7CDC26CCC69E02D08248224A22961E - -I=58 -KEY=C2834233A26DCD8A08769C04322E2258EEA2BD58BD84DD7D -IV=A88326DC57AB80FC3A2E4C67F8CFDF6C -CT=3E7CDC26CCC69E02D08248224A22961E -PT=88177B6502254344A364023BCAD29E79 - -I=59 -KEY=962D892D6CDED6798061E761300B611C4DC6BF6377564304 -IV=D95CFF470B1796D754AECB1ECEB31BF3 -CT=88177B6502254344A364023BCAD29E79 -PT=A10FA825EB6DA0E242D9A381F607472D - -I=60 -KEY=3ADA98C76065214A216E4F44DB66C1FE0F1F1CE281510429 -IV=FBD25798351AF35DACF711EA0CBBF733 -CT=A10FA825EB6DA0E242D9A381F607472D -PT=6B5EE3A222DF46560A12E91C006D303F - -I=61 -KEY=C6AB975CF71B6DDF4A30ACE6F9B987A8050DF5FE813C3416 -IV=6CDB3875008754DAFC710F9B977E4C95 -CT=6B5EE3A222DF46560A12E91C006D303F -PT=A0047B92A93ACF32138A818B6E32B3EE - -I=62 -KEY=FFD0E16A5C955EBAEA34D7745083489A16877475EF0E87F8 -IV=F7061CA37B11E445397B7636AB8E3365 -CT=A0047B92A93ACF32138A818B6E32B3EE -PT=1707FC063700E98FF5FDA98A07A8A1C7 - -I=63 -KEY=AA71EC7061FA246CFD332B726783A115E37ADDFFE8A6263F -IV=1853E27FC0689E6755A10D1A3D6F7AD6 -CT=1707FC063700E98FF5FDA98A07A8A1C7 -PT=06320FA4C0E2F42B364B991243FA053D - -I=64 -KEY=D8685685696CBF5CFB0124D6A761553ED53144EDAB5C2302 -IV=E19A3BEC7EBCA3C87219BAF508969B30 -CT=06320FA4C0E2F42B364B991243FA053D -PT=BB70503E9715D653710C0630211755A7 - -I=65 -KEY=28C2AFFA406EF763407174E83074836DA43D42DD8A4B76A5 -IV=5F3BCA36562AFA82F0AAF97F2902483F -CT=BB70503E9715D653710C0630211755A7 -PT=D632FEF42560770DF318C570AFC85285 - -I=66 -KEY=260B8E0723E9AF3D96438A1C1514F460572587AD25832420 -IV=328A42D3898A81C20EC921FD6387585E -CT=D632FEF42560770DF318C570AFC85285 -PT=B1C847FFF455D002E55FCFAF4A4F69A4 - -I=67 -KEY=F39D3CD6A68DC6BC278BCDE3E1412462B27A48026FCC4D84 -IV=C89E7B4C1BAED0FAD596B2D185646981 -CT=B1C847FFF455D002E55FCFAF4A4F69A4 -PT=9C484252E1FE52CD2DFCCAA3E0118F07 - -I=68 -KEY=61A9714C87B94F27BBC38FB100BF76AF9F8682A18FDDC283 -IV=56B7D716EC6F9A6D92344D9A2134899B -CT=9C484252E1FE52CD2DFCCAA3E0118F07 -PT=85A142323B9877E86F3A5874EA613E87 - -I=69 -KEY=B504BE17C673E81F3E62CD833B270147F0BCDAD565BCFC04 -IV=BEF2C82884510475D4ADCF5B41CAA738 -CT=85A142323B9877E86F3A5874EA613E87 -PT=53D0EF74268F55C1B6CA84415E5A2F6F - -I=70 -KEY=1A63CC27BE45C5106DB222F71DA8548646765E943BE6D36B -IV=CC958CC3874510F0AF67723078362D0F -CT=53D0EF74268F55C1B6CA84415E5A2F6F -PT=7B7DB0F3EFAD244FFCC6991452001DF6 - -I=71 -KEY=4B17520C49F46EAF16CF9204F20570C9BAB0C78069E6CE9D -IV=48D7C0690532AFCC51749E2BF7B1ABBF -CT=7B7DB0F3EFAD244FFCC6991452001DF6 -PT=DD0661DCA2BE8C20E95B3A84CCACDB10 - -I=72 -KEY=1ADE412393310021CBC9F3D850BBFCE953EBFD04A54A158D -IV=4B96B2D0CCADFF7D51C9132FDAC56E8E -CT=DD0661DCA2BE8C20E95B3A84CCACDB10 -PT=E505435777F3781121A4A374684E3268 - -I=73 -KEY=493467065AE405B82ECCB08F274884F8724F5E70CD0427E5 -IV=1E8116EB95B94AFC53EA2625C9D50599 -CT=E505435777F3781121A4A374684E3268 -PT=EF4B4E997DA0DCCBDBB36C020D03E8B5 - -I=74 -KEY=4C94816DF6EBDEF5C187FE165AE85833A9FC3272C007CF50 -IV=29094410F6017E5805A0E66BAC0FDB4D -CT=EF4B4E997DA0DCCBDBB36C020D03E8B5 -PT=FA9BAB377C654ED894024BEBDCED2FA0 - -I=75 -KEY=697A0BC179C07A633B1C5521268D16EB3DFE79991CEAE0F0 -IV=83DD12597A405FB725EE8AAC8F2BA496 -CT=FA9BAB377C654ED894024BEBDCED2FA0 -PT=DD1FDA63382552D007F6F8E995820640 - -I=76 -KEY=D40786ED2A6C15E8E6038F421EA8443B3A0881708968E6B0 -IV=2F3AE5594D9CCEDCBD7D8D2C53AC6F8B -CT=DD1FDA63382552D007F6F8E995820640 -PT=C5FF0EB50BA651F436D0566385860ADA - -I=77 -KEY=9D47680C0159F69A23FC81F7150E15CF0CD8D7130CEEEC6A -IV=1BCFAD6802C41B9A4940EEE12B35E372 -CT=C5FF0EB50BA651F436D0566385860ADA -PT=67AE61A77D77CBFD48C080B21313BBAB - -I=78 -KEY=86E61E031542D2DB4452E0506879DE32441857A11FFD57C1 -IV=3DF4DA1F65C739511BA1760F141B2441 -CT=67AE61A77D77CBFD48C080B21313BBAB -PT=68C8512217CB9C3BBF28011FA5BED044 - -I=79 -KEY=4F93757DE614CB1D2C9AB1727FB24209FB3056BEBA438785 -IV=B2C15424EF4E4637C9756B7EF35619C6 -CT=68C8512217CB9C3BBF28011FA5BED044 -PT=233898C850826172965695499748A1B0 - -I=80 -KEY=C56E54BBB54B22CC0FA229BA2F30237B6D66C3F72D0B2635 -IV=DC2FF5992D9383EF8AFD21C6535FE9D1 -CT=233898C850826172965695499748A1B0 -PT=70069F5E963A820D640B40697BD24716 - -I=81 -KEY=A1EF05CB5AAE7A977FA4B6E4B90AA176096D839E56D96123 -IV=EE8CB982124A394C64815170EFE5585B -CT=70069F5E963A820D640B40697BD24716 -PT=B136CA2EF42A9CFF53410554B28A8F65 - -I=82 -KEY=ACEC084A8CED2F4FCE927CCA4D203D895A2C86CAE453EE46 -IV=515D8B6C167EC8570D030D81D64355D8 -CT=B136CA2EF42A9CFF53410554B28A8F65 -PT=123600CD1B5A664430413021DDC8CBBE - -I=83 -KEY=8325A9391B4E106ADCA47C07567A5BCD6A6DB6EB399B25F8 -IV=5A55A24EC8154E532FC9A17397A33F25 -CT=123600CD1B5A664430413021DDC8CBBE -PT=8ECCA03E10D415557C4E7D92DDBFD791 - -I=84 -KEY=DB877966BE0E84575268DC3946AE4E981623CB79E424F269 -IV=659705F3774E141758A2D05FA540943D -CT=8ECCA03E10D415557C4E7D92DDBFD791 -PT=CB70B675AC6BF92237F1C479516E7E6A - -I=85 -KEY=59027658DEC2B5DE99186A4CEAC5B7BA21D20F00B54A8C03 -IV=C9B803CE2D57D26F82850F3E60CC3189 -CT=CB70B675AC6BF92237F1C479516E7E6A -PT=5D99D06E9BEB82AB1CE22201E8467DBC - -I=86 -KEY=652E430F984201E0C481BA22712E35113D302D015D0CF1BF -IV=1838FACBEAC13CF73C2C35574680B43E -CT=5D99D06E9BEB82AB1CE22201E8467DBC -PT=11D7AED0B552D62677DEB874BF7CF8ED - -I=87 -KEY=8377A2C11B73082DD55614F2C47CE3374AEE9575E2700952 -IV=068170C7E11427DFE659E1CE833109CD -CT=11D7AED0B552D62677DEB874BF7CF8ED -PT=74B108D32ABE8401D22F2C3FB008F670 - -I=88 -KEY=7B89A5C45B0A22BBA1E71C21EEC2673698C1B94A5278FF22 -IV=5283DAD6FA2B605DF8FE070540792A96 -CT=74B108D32ABE8401D22F2C3FB008F670 -PT=7883BD8C4DA81C21C4A5847AD801B7AE - -I=89 -KEY=101261A4D23FDA13D964A1ADA36A7B175C643D308A79488C -IV=E2ED92DE4829CB526B9BC4608935F8A8 -CT=7883BD8C4DA81C21C4A5847AD801B7AE -PT=C865B27C21F6F6E681759C318607D2B9 - -I=90 -KEY=E6A6A13B7A64EB51110113D1829C8DF1DD11A1010C7E9A35 -IV=AB325AD4F1FF1C52F6B4C09FA85B3142 -CT=C865B27C21F6F6E681759C318607D2B9 -PT=E31D7AC0E8ADB302BC6C23A0B1D693ED - -I=91 -KEY=64D366C4F61E139BF21C69116A313EF3617D82A1BDA809D8 -IV=A5201D1770A12A898275C7FF8C7AF8CA -CT=E31D7AC0E8ADB302BC6C23A0B1D693ED -PT=CAE6A97EE64228EEEF02E135944C5C62 - -I=92 -KEY=B006CEF05093DE2238FAC06F8C73161D8E7F639429E455BA -IV=62BD7E3EA22E26BAD4D5A834A68DCDB9 -CT=CAE6A97EE64228EEEF02E135944C5C62 -PT=B7AEF117099F799BB0752C7260A2DFB5 - -I=93 -KEY=160AFF18C06B6C4A8F54317885EC6F863E0A4FE649468A0F -IV=AEBB967838133F64A60C31E890F8B268 -CT=B7AEF117099F799BB0752C7260A2DFB5 -PT=81CCC6EDAD41D9C7986D4E175C71551D - -I=94 -KEY=21112CBE896259CE0E98F79528ADB641A66701F11537DF12 -IV=B695BBE7FA331039371BD3A649093584 -CT=81CCC6EDAD41D9C7986D4E175C71551D -PT=9039E01C6485040A2EDAF4C27FE93870 - -I=95 -KEY=60272333C1B4CCC39EA117894C28B24B88BDF5336ADEE762 -IV=4EE830907337D60241360F8D48D6950D -CT=9039E01C6485040A2EDAF4C27FE93870 -PT=44D359DBE4BE436D5133CD81B72DB5C7 - -I=96 -KEY=25C676A781511A98DA724E52A896F126D98E38B2DDF352A5 -IV=38491C9FD517260445E1559440E5D65B -CT=44D359DBE4BE436D5133CD81B72DB5C7 -PT=7B47F95ED30563BE218E40DB4EAAE836 - -I=97 -KEY=59A7B7512B5DC429A135B70C7B939298F80078699359BA93 -IV=1FD8B8BA8B0492E67C61C1F6AA0CDEB1 -CT=7B47F95ED30563BE218E40DB4EAAE836 -PT=C417F6A6824B165D4C26D631F77E45AC - -I=98 -KEY=82E6CF234BC0AA10652241AAF9D884C5B426AE586427FF3F -IV=5FB017B65FE4AF34DB417872609D6E39 -CT=C417F6A6824B165D4C26D631F77E45AC -PT=41EC9A06B318A4D06636ED5403F46CB7 - -I=99 -KEY=82D69A1D747CF6E024CEDBAC4AC02015D210430C67D39388 -IV=1CC1F56321366F420030553E3FBC5CF0 -CT=41EC9A06B318A4D06636ED5403F46CB7 -PT=38E467F81D919F0A1704E9F5CDF4D5FC - -I=100 -KEY=29EFCA26B9C67E141C2ABC545751BF1FC514AAF9AA274674 -IV=A83BDBF4326AE806AB39503BCDBA88F4 -CT=38E467F81D919F0A1704E9F5CDF4D5FC -PT=A08359A20D6F405018F8180A3E8D0FD1 - -I=101 -KEY=AB20AC8C3C5DA5BEBCA9E5F65A3EFF4FDDECB2F394AA49A5 -IV=A14B10E1A998B04E82CF66AA859BDBAA -CT=A08359A20D6F405018F8180A3E8D0FD1 -PT=A16C303138057144A3ECA63E7398DC93 - -I=102 -KEY=86C5E861B9CEAF041DC5D5C7623B8E0B7E0014CDE7329536 -IV=181D943EA950561D2DE544ED85930ABA -CT=A16C303138057144A3ECA63E7398DC93 -PT=EA1A2E30D890D01979D2BCE1EBE6C922 - -I=103 -KEY=90321C401E4B6B30F7DFFBF7BAAB5E1207D2A82C0CD45C14 -IV=12BDB944D898BC5A16F7F421A785C434 -CT=EA1A2E30D890D01979D2BCE1EBE6C922 -PT=C0D620FCF33031DAD617ADBE8F6D13AC - -I=104 -KEY=84964C3B41FE8E4F3709DB0B499B6FC8D1C5059283B94FB8 -IV=0615AD27B29C55F814A4507B5FB5E57F -CT=C0D620FCF33031DAD617ADBE8F6D13AC -PT=EC4B9AEDBE44C4B74B693D08AA1D175A - -I=105 -KEY=6C6361F2C87BC168DB4241E6F7DFAB7F9AAC389A29A458E2 -IV=E79F33FFCD79681CE8F52DC989854F27 -CT=EC4B9AEDBE44C4B74B693D08AA1D175A -PT=F34D426225ADEC3BD2580BF21EF24B3E - -I=106 -KEY=FDA3FB79F1A16865280F0384D272474448F43368375613DC -IV=1DFE18B10032D35F91C09A8B39DAA90D -CT=F34D426225ADEC3BD2580BF21EF24B3E -PT=E14841B0D0CC1E698DE8053B9F1621E1 - -I=107 -KEY=562D3BF792909255C947423402BE592DC51C3653A840323D -IV=247A46C43AE54F1FAB8EC08E6331FA30 -CT=E14841B0D0CC1E698DE8053B9F1621E1 -PT=D21381B5032426EC3582BBD23739E04E - -I=108 -KEY=9D375E6E32C30A801B54C381019A7FC1F09E8D819F79D273 -IV=E05018C26DC38BBDCB1A6599A05398D5 -CT=D21381B5032426EC3582BBD23739E04E -PT=82034FF505FE67B94373770348A934E5 - -I=109 -KEY=7D1A900B515478DB99578C7404641878B3EDFA82D7D0E696 -IV=498AEA38AB55250CE02DCE656397725B -CT=82034FF505FE67B94373770348A934E5 -PT=018B5B1787138D222F6B39C1291ECD2C - -I=110 -KEY=E74B55A39F67C54298DCD7638377955A9C86C343FECE2BBA -IV=DD89DF396236F9A59A51C5A8CE33BD99 -CT=018B5B1787138D222F6B39C1291ECD2C -PT=CABCB7EA14E821726602272A46CEB825 - -I=111 -KEY=D3FFFE0F27D9200352606089979FB428FA84E469B800939F -IV=A707D154BAC28BDC34B4ABACB8BEE541 -CT=CABCB7EA14E821726602272A46CEB825 -PT=0840D09DF2B14ED4B340D32101D68A54 - -I=112 -KEY=485EC313821A37095A20B014652EFAFC49C43748B9D619CB -IV=ADEF6A8A49BF208B9BA13D1CA5C3170A -CT=0840D09DF2B14ED4B340D32101D68A54 -PT=5EB0166FB04AF38F9EA60929FD641844 - -I=113 -KEY=E841074638A154D90490A67BD5640973D7623E6144B2018F -IV=B1956D86A4F79E40A01FC455BABB63D0 -CT=5EB0166FB04AF38F9EA60929FD641844 -PT=2ECBDAFBD0336A436D89FC12944750EC - -I=114 -KEY=17E86798DB7A64E42A5B7C8005576330BAEBC273D0F55163 -IV=0AFFE19CA1425218FFA960DEE3DB303D -CT=2ECBDAFBD0336A436D89FC12944750EC -PT=A326D8C07EF7A21302A3C6A9C67C371A - -I=115 -KEY=D1A6F2AB7C130A60897DA4407BA0C123B84804DA16896679 -IV=6F630069CD0333BDC64E9533A7696E84 -CT=A326D8C07EF7A21302A3C6A9C67C371A -PT=6D06DDFB9B12A71298E32318F582EF72 - -I=116 -KEY=C7D58104581CB5C5E47B79BBE0B2663120AB27C2E30B890B -IV=80E47BA8410247C5167373AF240FBFA5 -CT=6D06DDFB9B12A71298E32318F582EF72 -PT=E1391A50F140E255A9B2E628F25B9B1D - -I=117 -KEY=00D8EEC433F7D68E054263EB11F284648919C1EA11501216 -IV=96F652822C5D4496C70D6FC06BEB634B -CT=E1391A50F140E255A9B2E628F25B9B1D -PT=1418A2DC8D6DBA4942932D6944011D8A - -I=118 -KEY=71D444358CCCF986115AC1379C9F3E2DCB8AEC8355510F9C -IV=410374DE0D8A79FA710CAAF1BF3B2F08 -CT=1418A2DC8D6DBA4942932D6944011D8A -PT=A70A2C48CF5786868844274B8C493C56 - -I=119 -KEY=B9FD9626EC74A129B650ED7F53C8B8AB43CECBC8D91833CA -IV=8362FAE290801C25C829D21360B858AF -CT=A70A2C48CF5786868844274B8C493C56 -PT=3484BA42558B199E8477B8F8280CDE91 - -I=120 -KEY=94CAEE912A7B443582D4573D0643A135C7B97330F114ED5B -IV=F6ABE3F0A7FFC9E02D3778B7C60FE51C -CT=3484BA42558B199E8477B8F8280CDE91 -PT=5D79433F85C7D4C258487080E340F049 - -I=121 -KEY=1D2F762CF08FAE0ADFAD1402838475F79FF103B012541D12 -IV=A0C57652FBF9107C89E598BDDAF4EA3F -CT=5D79433F85C7D4C258487080E340F049 -PT=C51891EA2E68BC60E84912A91F470201 - -I=122 -KEY=9E691D03A3AEB6491AB585E8ADECC99777B811190D131F13 -IV=8426C338234DB9E183466B2F53211843 -CT=C51891EA2E68BC60E84912A91F470201 -PT=F946FD67DD7F92A7A6B93B4F71F70243 - -I=123 -KEY=61EA6FD274C07ADDE3F3788F70935B30D1012A567CE41D50 -IV=2C2AF70B07E9E6F9FF8372D1D76ECC94 -CT=F946FD67DD7F92A7A6B93B4F71F70243 -PT=B4CB0EFF14F8CDC693CC8E7DCEE8E0B0 - -I=124 -KEY=84F27E5BF8B55DA657387670646B96F642CDA42BB20CFDE0 -IV=693782638B439464E51811898C75277B -CT=B4CB0EFF14F8CDC693CC8E7DCEE8E0B0 -PT=EF6DDB56AAE9CFFE128FB3776DD94D20 - -I=125 -KEY=5B1111EADAECDD73B855AD26CE8259085042175CDFD5B0C0 -IV=A14AAEF7A1BF063BDFE36FB1225980D5 -CT=EF6DDB56AAE9CFFE128FB3776DD94D20 -PT=4ACC6AF28293A647093AE788BA778835 - -I=126 -KEY=A924DC707FB16DF1F299C7D44C11FF4F5978F0D465A238F5 -IV=3F7E73BFA24B0C02F235CD9AA55DB082 -CT=4ACC6AF28293A647093AE788BA778835 -PT=5A7989DC61AD6B66B3E83A29168BEDB9 - -I=127 -KEY=164FBEF9EBAEEF03A8E04E082DBC9429EA90CAFD7329D54C -IV=2FB4F1A000B78156BF6B6289941F82F2 -CT=5A7989DC61AD6B66B3E83A29168BEDB9 -PT=246A94AB8488B39C52DE68E8CA5AE0D2 - -I=128 -KEY=B1F4A368B64A78EC8C8ADAA3A93427B5B84EA215B973359E -IV=5D178EC8305B804FA7BB1D915DE497EF -CT=246A94AB8488B39C52DE68E8CA5AE0D2 -PT=F7C758F8DC8FC0891907EBBF299F70B8 - -I=129 -KEY=9161A39C256814AA7B4D825B75BBE73CA14949AA90EC4526 -IV=C87E61A9434EB29F209500F493226C46 -CT=F7C758F8DC8FC0891907EBBF299F70B8 -PT=E2D82C5506BEFA7D7BF032E4C72141CF - -I=130 -KEY=0BFDA1B2CF4B15199995AE0E73051D41DAB97B4E57CD04E9 -IV=5D00992780D9832B9A9C022EEA2301B3 -CT=E2D82C5506BEFA7D7BF032E4C72141CF -PT=F3A0DF1793FC88117E87478FD9E5A1A8 - -I=131 -KEY=F8F5F6016FECDCAF6A357119E0F99550A43E3CC18E28A541 -IV=2800EECA83EB078CF30857B3A0A7C9B6 -CT=F3A0DF1793FC88117E87478FD9E5A1A8 -PT=BEB572C53E9985218ED9012BAB4A9F5B - -I=132 -KEY=84F3E0D153E140D6D48003DCDE6010712AE73DEA25623A1A -IV=E2BEAF80F4A1DDA27C0616D03C0D9C79 -CT=BEB572C53E9985218ED9012BAB4A9F5B -PT=7F4B21C4B7466149CB890B77AC538752 - -I=133 -KEY=B69E5A72FE9B1B85ABCB221869267138E16E369D8931BD48 -IV=FE0A667B9B2BDD29326DBAA3AD7A5B53 -CT=7F4B21C4B7466149CB890B77AC538752 -PT=4B239C8F83F0A10DC6A3497CC3CF9C8E - -I=134 -KEY=0BCF87D2538E0EADE0E8BE97EAD6D03527CD7FE14AFE21C6 -IV=878250C5EA7834CFBD51DDA0AD151528 -CT=4B239C8F83F0A10DC6A3497CC3CF9C8E -PT=89F2B4B8C5AB2988CDEA61F4D4A1BCD4 - -I=135 -KEY=97A4FDCD2E0C993E691A0A2F2F7DF9BDEA271E159E5F9D12 -IV=95E34D44C3E2FE319C6B7A1F7D829793 -CT=89F2B4B8C5AB2988CDEA61F4D4A1BCD4 -PT=C622E28004842564F193C0E58AB40FCB - -I=136 -KEY=38F0A45980CEF0B9AF38E8AF2BF9DCD91BB4DEF014EB92D9 -IV=1BC195727D154539AF545994AEC26987 -CT=C622E28004842564F193C0E58AB40FCB -PT=DF360FBC1607BCC1E6EE9088AEE62EC7 - -I=137 -KEY=6638E0333D7A6765700EE7133DFE6018FD5A4E78BA0DBC1E -IV=F0AB65A69AA4486A5EC8446ABDB497DC -CT=DF360FBC1607BCC1E6EE9088AEE62EC7 -PT=9A8E5BFE223FA9D747164FC1C98B9CDC - -I=138 -KEY=5103611D32D7A1EFEA80BCED1FC1C9CFBA4C01B9738620C2 -IV=A6617B5DA41B2A32373B812E0FADC68A -CT=9A8E5BFE223FA9D747164FC1C98B9CDC -PT=F0143DD4EC3A85F9FA4D5579BD7268A1 - -I=139 -KEY=64FD310AF27CF98C1A948139F3FB4C36400154C0CEF44863 -IV=EBCB744B477F25E635FE5017C0AB5863 -CT=F0143DD4EC3A85F9FA4D5579BD7268A1 -PT=C5C1FED629BF81EE343E4DAEE6BC4D44 - -I=140 -KEY=9390B012FA7D48D9DF557FEFDA44CDD8743F196E28480527 -IV=7AF352D33C08F3FEF76D81180801B155 -CT=C5C1FED629BF81EE343E4DAEE6BC4D44 -PT=26C4460F0B79E16263C38C240C276E5C - -I=141 -KEY=F578E5DF6818CB58F99139E0D13D2CBA17FC954A246F6B7B -IV=05DA148A4EB4D12966E855CD92658381 -CT=26C4460F0B79E16263C38C240C276E5C -PT=E0E249ADB3A39EE2BB48959426874123 - -I=142 -KEY=F23F67282BAFE10E1973704D629EB258ACB400DE02E82A58 -IV=7748B1652DE54EF9074782F743B72A56 -CT=E0E249ADB3A39EE2BB48959426874123 -PT=C2299AAE24C941DC44E5D492BC492FED - -I=143 -KEY=5CAC16BD99EC5067DB5AEAE34657F384E851D44CBEA105B5 -IV=4F599B9C20378305AE937195B243B169 -CT=C2299AAE24C941DC44E5D492BC492FED -PT=780DA1D6FD961DA4756375A15B8BA620 - -I=144 -KEY=9FF7C1766F7F6F9FA3574B35BBC1EE209D32A1EDE52AA395 -IV=044A8C7FFE220414C35BD7CBF6933FF8 -CT=780DA1D6FD961DA4756375A15B8BA620 -PT=E63FE8BE6566E9ECCCDBEC442BCCCBD5 - -I=145 -KEY=3EA408C4CD15E6F24568A38BDEA707CC51E94DA9CEE66840 -IV=05DE81CD5892F1FEA153C9B2A26A896D -CT=E63FE8BE6566E9ECCCDBEC442BCCCBD5 -PT=19F5E5DDDF0F6FABA9B16B732C6058B8 - -I=146 -KEY=29FF0DD567A810385C9D465601A86867F85826DAE28630F8 -IV=0A2A8BF3BE53E2B5175B0511AABDF6CA -CT=19F5E5DDDF0F6FABA9B16B732C6058B8 -PT=41FCD9F8972431F43669863F37B4A18C - -I=147 -KEY=842E4C2F46849E731D619FAE968C5993CE31A0E5D5329174 -IV=1EABD419CA4C0D0BADD141FA212C8E4B -CT=41FCD9F8972431F43669863F37B4A18C -PT=9857CFE1CFE1046F88DF3EB8ECC92E40 - -I=148 -KEY=8EE3344CCB9DE2038536504F596D5DFC46EE9E5D39FBBF34 -IV=FA266CF1AF82A2250ACD78638D197C70 -CT=9857CFE1CFE1046F88DF3EB8ECC92E40 -PT=DE4C55865FB82BDA1FC0D024791C1B22 - -I=149 -KEY=DEEEC86215A6098D5B7A05C906D57626592E4E7940E7A416 -IV=F9B4CFCA36A1B0AB500DFC2EDE3BEB8E -CT=DE4C55865FB82BDA1FC0D024791C1B22 -PT=077F866BF30097D12650855C71B7DB9C - -I=150 -KEY=50872D11A2E463D65C0583A2F5D5E1F77F7ECB2531507F8A -IV=53D4E4CE2C06FCC38E69E573B7426A5B -CT=077F866BF30097D12650855C71B7DB9C -PT=670BBCB81CDE03B883D9B784124F5851 - -I=151 -KEY=7DE3AF7C8550901C3B0E3F1AE90BE24FFCA77CA1231F27DB -IV=C26330B1219C4B4A2D64826D27B4F3CA -CT=670BBCB81CDE03B883D9B784124F5851 -PT=D6141C300F5E5119E1B5F4BBF415A6DD - -I=152 -KEY=BB126D64220A8DB9ED1A232AE655B3561D12881AD70A8106 -IV=74D773D0F053239CC6F1C218A75A1DA5 -CT=D6141C300F5E5119E1B5F4BBF415A6DD -PT=8F742130206F1047FE9CAAE4F2C31B19 - -I=153 -KEY=9845C3A02214A55D626E021AC63AA311E38E22FE25C99A1F -IV=7EC0B4E8BD4BD3EB2357AEC4001E28E4 -CT=8F742130206F1047FE9CAAE4F2C31B19 -PT=47D0D28AF3164CC77FBAB5C015CAC1C9 - -I=154 -KEY=BBC47FAB874E0ED425BED090352CEFD69C34973E30035BD6 -IV=833EC00D894BD8502381BC0BA55AAB89 -CT=47D0D28AF3164CC77FBAB5C015CAC1C9 -PT=3202B04CFC260747BF839FF754A01E26 - -I=155 -KEY=BCC028DA5F286DE017BC60DCC90AE89123B708C964A345F0 -IV=8BCC8079D2175F4407045771D8666334 -CT=3202B04CFC260747BF839FF754A01E26 -PT=75E9FBADAD8885FB2398427EE94C5899 - -I=156 -KEY=352B0CD3E3BA0EB462559B7164826D6A002F4AB78DEF1D69 -IV=0B159F18C1F33EA389EB2409BC926354 -CT=75E9FBADAD8885FB2398427EE94C5899 -PT=90DA906982058C84D2E75B5DAE0EA756 - -I=157 -KEY=6F32D4393B37EA77F28F0B18E687E1EED2C811EA23E1BA3F -IV=2F5C35DA76038E4F5A19D8EAD88DE4C3 -CT=90DA906982058C84D2E75B5DAE0EA756 -PT=705C22072FDFB807A49BAE0FD4D254AF - -I=158 -KEY=5740616769DDF57482D3291FC95859E97653BFE5F733EE90 -IV=B276B0CE56828D683872B55E52EA1F03 -CT=705C22072FDFB807A49BAE0FD4D254AF -PT=A966EE217CF2BDBC17A0BB55AE769FEB - -I=159 -KEY=C9E379BDBC05CC402BB5C73EB5AAE45561F304B05945717B -IV=E1F41EF2147CB5CE9EA318DAD5D83934 -CT=A966EE217CF2BDBC17A0BB55AE769FEB -PT=239D761F1F0437935464C4959546B6BB - -I=160 -KEY=7B2C4F503FCC91AE0828B121AAAED3C63597C025CC03C7C0 -IV=6F90097C7822030DB2CF36ED83C95DEE -CT=239D761F1F0437935464C4959546B6BB -PT=499477B6476BA58CAEF81290ABDD46C4 - -I=161 -KEY=42BC1C4F29D1801D41BCC697EDC5764A9B6FD2B567DE8104 -IV=1571EE53AE1ACAEF3990531F161D11B3 -CT=499477B6476BA58CAEF81290ABDD46C4 -PT=ACC1FB947EB4C7F115871859CD254D96 - -I=162 -KEY=9BE24C041BF4DEECED7D3D039371B1BB8EE8CAECAAFBCC92 -IV=E24F4DBEF2122A73D95E504B32255EF1 -CT=ACC1FB947EB4C7F115871859CD254D96 -PT=85DC9D7ADF342B0733CF9812CFD58F0A - -I=163 -KEY=83BEBEB5727649F268A1A0794C459ABCBD2752FE652E4398 -IV=AF0690E77B1F140B185CF2B16982971E -CT=85DC9D7ADF342B0733CF9812CFD58F0A -PT=7ED8B4DCBD1D13BEA5C819E99ECF75AA - -I=164 -KEY=7020802D561D88AD167914A5F158890218EF4B17FBE13632 -IV=F0AC93D8DDD31D5BF39E3E98246BC15F -CT=7ED8B4DCBD1D13BEA5C819E99ECF75AA -PT=C81F0464C2DE212229370C7A4ED2E890 - -I=165 -KEY=39F8EA2D638410ABDE6610C13386A82031D8476DB533DEA2 -IV=FD6338FAE6F6B00B49D86A0035999806 -CT=C81F0464C2DE212229370C7A4ED2E890 -PT=23A0FA99C632BCC62A035A09514C3EBA - -I=166 -KEY=52FA33F30EFD8D0FFDC6EA58F5B414E61BDB1D64E47FE018 -IV=04C6E0136D8E04C16B02D9DE6D799DA4 -CT=23A0FA99C632BCC62A035A09514C3EBA -PT=9F7F1081AE4B6AD51D395D764D2D5B68 - -I=167 -KEY=95C21BD9257B233A62B9FAD95BFF7E3306E24012A952BB70 -IV=72410E03AAE65889C738282A2B86AE35 -CT=9F7F1081AE4B6AD51D395D764D2D5B68 -PT=5F088092968BF4AF04BF862A6721DF2B - -I=168 -KEY=058F749326AE1DD53DB17A4BCD748A9C025DC638CE73645B -IV=D678325E266D12D7904D6F4A03D53EEF -CT=5F088092968BF4AF04BF862A6721DF2B -PT=15670F60D1D70E129418AC14A425DD70 - -I=169 -KEY=23D2D59C5EF4AF3D28D6752B1CA3848E96456A2C6A56B92B -IV=BB7B672A91E9A61A265DA10F785AB2E8 -CT=15670F60D1D70E129418AC14A425DD70 -PT=3273AC9D250F729AE790A941739C79BF - -I=170 -KEY=E11B1F94517914C81AA5D9B639ACF61471D5C36D19CAC094 -IV=AB84F623EFA11728C2C9CA080F8DBBF5 -CT=3273AC9D250F729AE790A941739C79BF -PT=9B135880CB56A8E6CF3A364CC6E02175 - -I=171 -KEY=66F867085DBE626581B68136F2FA5EF2BEEFF521DF2AE1E1 -IV=01ED899C8DC9C09E87E3789C0CC776AD -CT=9B135880CB56A8E6CF3A364CC6E02175 -PT=681D6FC5447CCFE1152156CFF6172B6A - -I=172 -KEY=98505FCD27DAB39EE9ABEEF3B6869113ABCEA3EE293DCA8B -IV=A58C8285C31035B1FEA838C57A64D1FB -CT=681D6FC5447CCFE1152156CFF6172B6A -PT=6E30DF3FBD67A5FD491E315EF3A268A0 - -I=173 -KEY=9F904A41C19B57A9879B31CC0BE134EEE2D092B0DA9FA22B -IV=6F46DCB3A84FD96907C0158CE641E437 -CT=6E30DF3FBD67A5FD491E315EF3A268A0 -PT=5B4980E24D8F9CABE017991326FBBE95 - -I=174 -KEY=A330D5A6779731D6DCD2B12E466EA84502C70BA3FC641CBE -IV=C5BDAB77E0CA95463CA09FE7B60C667F -CT=5B4980E24D8F9CABE017991326FBBE95 -PT=7324530BF94BD80D286C9BE2FE4113D3 - -I=175 -KEY=20F008DE76D7968AAFF6E225BF2570482AAB904102250F6D -IV=32F5EC4AEBB997C583C0DD780140A75C -CT=7324530BF94BD80D286C9BE2FE4113D3 -PT=B163425AB21DF6AFBD2C7000E777E902 - -I=176 -KEY=0F48153B232E71F41E95A07F0D3886E79787E041E552E66F -IV=3D1854E0C481B28E2FB81DE555F9E77E -CT=B163425AB21DF6AFBD2C7000E777E902 -PT=EB1A6C86C3811E3081325F35BA7F2DCA - -I=177 -KEY=96EE2134FD40CA34F58FCCF9CEB998D716B5BF745F2DCBA5 -IV=8629366A8B8E266499A6340FDE6EBBC0 -CT=EB1A6C86C3811E3081325F35BA7F2DCA -PT=E9675AF0035C3F8E9D5E58D0652BF5C7 - -I=178 -KEY=BF754C828BFE309B1CE89609CDE5A7598BEBE7A43A063E62 -IV=566D5FCEC3FF7D43299B6DB676BEFAAF -CT=E9675AF0035C3F8E9D5E58D0652BF5C7 -PT=24B4DA85EEFAA123948C6B5E0E07EB08 - -I=179 -KEY=F0223B4AF5C885B4385C4C8C231F067A1F678CFA3401D56A -IV=67B98EC651B057104F5777C87E36B52F -CT=24B4DA85EEFAA123948C6B5E0E07EB08 -PT=753CFEBBB9E623453B8BB2976B8D7BD4 - -I=180 -KEY=04665169E091DEF74D60B2379AF9253F24EC3E6D5F8CAEBE -IV=BC3806A9E56A1DACF4446A2315595B43 -CT=753CFEBBB9E623453B8BB2976B8D7BD4 -PT=6949284723B4F795D530B366FAE70876 - -I=181 -KEY=9CABB1CFD4E46F8324299A70B94DD2AAF1DC8D0BA56BA6C8 -IV=8C864563BB8D45A098CDE0A63475B174 -CT=6949284723B4F795D530B366FAE70876 -PT=D43FED9A25C62349787F0336BFFBBFEB - -I=182 -KEY=4407065E88AE79D9F01677EA9C8BF1E389A38E3D1A901923 -IV=539CC5888B34198FD8ACB7915C4A165A -CT=D43FED9A25C62349787F0336BFFBBFEB -PT=030733E175916579F582A778B261DA1C - -I=183 -KEY=84D1EE80E8FA54DEF311440BE91A949A7C212945A8F1C33F -IV=78306F4F56DEF759C0D6E8DE60542D07 -CT=030733E175916579F582A778B261DA1C -PT=F7B1ABE4B4AE3CB726F9A88B06D4552A - -I=184 -KEY=E885BEA6176A75D804A0EFEF5DB4A82D5AD881CEAE259615 -IV=3AC80B78F744208A6C545026FF902106 -CT=F7B1ABE4B4AE3CB726F9A88B06D4552A -PT=DA984A2C346A4B758E066EB509079168 - -I=185 -KEY=2E0317B2DB3F9893DE38A5C369DEE358D4DEEF7BA722077D -IV=FC74E03B1068A6FEC686A914CC55ED4B -CT=DA984A2C346A4B758E066EB509079168 -PT=21F473636EF27B91F29BB1CE67908763 - -I=186 -KEY=850E1B37E1F7DD89FFCCD6A0072C98C926455EB5C0B2801E -IV=7DFD76EE7EF97796AB0D0C853AC8451A -CT=21F473636EF27B91F29BB1CE67908763 -PT=9EEF6E211CC8EDBD3C4FBE3E14B13C70 - -I=187 -KEY=655D365D66CAA5C36123B8811BE475741A0AE08BD403BC6E -IV=33318C04CC0B3CBDE0532D6A873D784A -CT=9EEF6E211CC8EDBD3C4FBE3E14B13C70 -PT=8AB49333CA7B2E58E7B24536BB34DEE7 - -I=188 -KEY=BE3C315647F981DCEB972BB2D19F5B2CFDB8A5BD6F376289 -IV=79D06A0D66B5C2B1DB61070B2133241F -CT=8AB49333CA7B2E58E7B24536BB34DEE7 -PT=323D1E775FD729005DA7A2853A855ED4 - -I=189 -KEY=3126E544A65724C4D9AA35C58E48722CA01F073855B23C5D -IV=CC5C9D95685AF1228F1AD412E1AEA518 -CT=323D1E775FD729005DA7A2853A855ED4 -PT=E283016FEDADEBA2BEC7ADB5A8DEA8B9 - -I=190 -KEY=BCF052AFAFA4852D3B2934AA63E5998E1ED8AA8DFD6C94E4 -IV=2753144E0A26D9FE8DD6B7EB09F3A1E9 -CT=E283016FEDADEBA2BEC7ADB5A8DEA8B9 -PT=9A9BB977D53BBD47550DC60A49AFA0FA - -I=191 -KEY=ECB724A85CBC7B58A1B28DDDB6DE24C94BD56C87B4C3341E -IV=27F910046A94AA3B50477607F318FE75 -CT=9A9BB977D53BBD47550DC60A49AFA0FA -PT=AF4C7AC3B02C1B077E8F97B59AE52A21 - -I=192 -KEY=BCA9E9794F9004AB0EFEF71E06F23FCE355AFB322E261E3F -IV=8AF06705FE272571501ECDD1132C7FF3 -CT=AF4C7AC3B02C1B077E8F97B59AE52A21 -PT=A97DEE2A64DFA7C198B6A4F21E80F7DF - -I=193 -KEY=10DCC14B9A309E25A7831934622D980FADEC5FC030A6E9E0 -IV=B04E1C6FC657B8AEAC752832D5A09A8E -CT=A97DEE2A64DFA7C198B6A4F21E80F7DF -PT=34E8228A24C7A16F9ED3F4B9A94AA70D - -I=194 -KEY=9CB6EE6AAEFAFBED936B3BBE46EA3960333FAB7999EC4EED -IV=6A966EBB8F80A1608C6A2F2134CA65C8 -CT=34E8228A24C7A16F9ED3F4B9A94AA70D -PT=99E6CA896906CBAA9B8D01155D1DB162 - -I=195 -KEY=461916712E8BD6F10A8DF1372FECF2CAA8B2AA6CC4F1FF8F -IV=EAF849974783FAA7DAAFF81B80712D1C -CT=99E6CA896906CBAA9B8D01155D1DB162 -PT=6009B53EB4690C1F1F10639F1FD7640A - -I=196 -KEY=5B9B91A966F9CE146A8444099B85FED5B7A2C9F3DB269B85 -IV=3FB045D182F781EB1D8287D8487218E5 -CT=6009B53EB4690C1F1F10639F1FD7640A -PT=88ED4BC34A27F4C4B480B99857EBF541 - -I=197 -KEY=404F7D8B0E966F02E2690FCAD1A20A110322706B8CCD6EC4 -IV=49C0F4571BAEBE4C1BD4EC22686FA116 -CT=88ED4BC34A27F4C4B480B99857EBF541 -PT=B88F0E3E01FEDF97766AC6B762D2EBC3 - -I=198 -KEY=CB2EA99F330A3A865AE601F4D05CD5867548B6DCEE1F8507 -IV=2518DA0D88C02EC38B61D4143D9C5584 -CT=B88F0E3E01FEDF97766AC6B762D2EBC3 -PT=C1C167FF37E89937DCB8D79C9BC9EC74 - -I=199 -KEY=913C795CF72CD1219B27660BE7B44CB1A9F0614075D66973 -IV=37769A59390261FB5A12D0C3C426EBA7 -CT=C1C167FF37E89937DCB8D79C9BC9EC74 -PT=64D912270A1E60192CDAAD8168219E56 - -I=200 -KEY=05F19DF919E44144FFFE742CEDAA2CA8852ACCC11DF7F725 -IV=63E9D4D1BDD7FEAD94CDE4A5EEC89065 -CT=64D912270A1E60192CDAAD8168219E56 -PT=C9AD2DBB1C686A67A3E21A5659576A2B - -I=201 -KEY=099D0DCE5E4E194236535997F1C246CF26C8D69744A09D0E -IV=A01E3F917EF4652F0C6C903747AA5806 -CT=C9AD2DBB1C686A67A3E21A5659576A2B -PT=244C740B4B136C6C480D0147163868D1 - -I=202 -KEY=EA1F242E9C75C712121F2D9CBAD12AA36EC5D7D05298F5DF -IV=C9D2288C473BCB3EE38229E0C23BDE50 -CT=244C740B4B136C6C480D0147163868D1 -PT=A6B125A9C570CC3ECBB5D302ADB96E34 - -I=203 -KEY=CD5D7C91FBDC81A1B4AE08357FA1E69DA57004D2FF219BEB -IV=871F525F8ED73B7F274258BF67A946B3 -CT=A6B125A9C570CC3ECBB5D302ADB96E34 -PT=0F9862A4A21E1FB365135C07577FB3EE - -I=204 -KEY=F7D9B8C22BDC8005BB366A91DDBFF92EC06358D5A85E2805 -IV=01BB0A9A8737C19D3A84C453D00001A4 -CT=0F9862A4A21E1FB365135C07577FB3EE -PT=D833DB436E1751B882D03FADF683690B - -I=205 -KEY=83F81E3CED72F22F6305B1D2B3A8A89642B367785EDD410E -IV=80E0E7001CCA60CA7421A6FEC6AE722A -CT=D833DB436E1751B882D03FADF683690B -PT=0AE2C64D2C577C420F26F2F48AA58D62 - -I=206 -KEY=63310E5F2F8F0E0769E7779F9FFFD4D44D95958CD478CC6C -IV=57E54995CDC9417DE0C91063C2FDFC28 -CT=0AE2C64D2C577C420F26F2F48AA58D62 -PT=B0E2976AA3891A2C71AFEB063E3C4383 - -I=207 -KEY=F3AE2989B3980DC9D905E0F53C76CEF83C3A7E8AEA448FEF -IV=999DD6C2B1C528E2909F27D69C1703CE -CT=B0E2976AA3891A2C71AFEB063E3C4383 -PT=16F8A305177ECDBA15403FE5D8EEF60D - -I=208 -KEY=52CF17D8DEA4CE5ACFFD43F02B080342297A416F32AA79E2 -IV=C9F5BC961057F845A1613E516D3CC393 -CT=16F8A305177ECDBA15403FE5D8EEF60D -PT=A607A3EE165E82711B30B44CF4E0C4CF - -I=209 -KEY=E22ADE79E75FE58E69FAE01E3D568133324AF523C64ABD2D -IV=E153F25DD207351AB0E5C9A139FB2BD4 -CT=A607A3EE165E82711B30B44CF4E0C4CF -PT=5191CDD0D077AD6BE956AF8E8E39FECA - -I=210 -KEY=38C58EA4EA1E8D4C386B2DCEED212C58DB1C5AAD487343E7 -IV=F55357187F06B142DAEF50DD0D4168C2 -CT=5191CDD0D077AD6BE956AF8E8E39FECA -PT=F63A42508522E5F09C31F160298E8E6F - -I=211 -KEY=8C29CD4F1330EF25CE516F9E6803C9A8472DABCD61FDCD88 -IV=2CBD520E6F6F89C7B4EC43EBF92E6269 -CT=F63A42508522E5F09C31F160298E8E6F -PT=E58ED2EA8671DC5D527CDE01C6D9655D - -I=212 -KEY=3650C9671F38CD752BDFBD74EE7215F5155175CCA724A8D5 -IV=73CA969AECA5574BBA7904280C082250 -CT=E58ED2EA8671DC5D527CDE01C6D9655D -PT=5FFCACC68357B6709F5B10D48C65EA40 - -I=213 -KEY=6F68A078A75FF5A1742311B26D25A3858A0A65182B414295 -IV=DEA2D7D8F9FE3E7D5938691FB86738D4 -CT=5FFCACC68357B6709F5B10D48C65EA40 -PT=10BBA695F25C1F9412DB80F59F937F84 - -I=214 -KEY=9E08E5F9EEC5A7606498B7279F79BC1198D1E5EDB4D23D11 -IV=20E4DE61513233E5F1604581499A52C1 -CT=10BBA695F25C1F9412DB80F59F937F84 -PT=36CAF539734BCAF8250595E5E5DB3E94 - -I=215 -KEY=F72A5636B3A2D23B5252421EEC3276E9BDD4700851090385 -IV=9DEBE05128A2A1A06922B3CF5D67755B -CT=36CAF539734BCAF8250595E5E5DB3E94 -PT=C64074C9A34850C6FD1B12CD8AE9EF30 - -I=216 -KEY=D74FABF587AB10AA941236D74F7A262F40CF62C5DBE0ECB5 -IV=DEF3A637247B78C02065FDC33409C291 -CT=C64074C9A34850C6FD1B12CD8AE9EF30 -PT=DF663CE4199BC64ACB9B6F99D69EC679 - -I=217 -KEY=8D12BAEA80612A284B740A3356E1E0658B540D5C0D7E2ACC -IV=7D9C0365E66F1A355A5D111F07CA3A82 -CT=DF663CE4199BC64ACB9B6F99D69EC679 -PT=CD1BCBDCE7F8C008177E25B83604EE83 - -I=218 -KEY=57B4196767474175866FC1EFB119206D9C2A28E43B7AC44F -IV=41846FA05FC28ABCDAA6A38DE7266B5D -CT=CD1BCBDCE7F8C008177E25B83604EE83 -PT=CD7E96FE44368C4AD22E9D4F6BE3C2C2 - -I=219 -KEY=CBA15BF34D728F0E4B115711F52FAC274E04B5AB5099068D -IV=873A6522E20108C09C1542942A35CE7B -CT=CD7E96FE44368C4AD22E9D4F6BE3C2C2 -PT=BCC88D6EAF2E41D9AA6E7C91DADCF92E - -I=220 -KEY=D3071140E7C7E244F7D9DA7F5A01EDFEE46AC93A8A45FFA3 -IV=A50F782EA949C2A718A64AB3AAB56D4A -CT=BCC88D6EAF2E41D9AA6E7C91DADCF92E -PT=1FFD3EC8E0D0AD8F3D23961703C0C445 - -I=221 -KEY=3F44AB6E12394D24E824E4B7BAD14071D9495F2D89853BE6 -IV=501500DC8A97D00BEC43BA2EF5FEAF60 -CT=1FFD3EC8E0D0AD8F3D23961703C0C445 -PT=1D3D85A9A4BF101E12CC79640D716AC6 - -I=222 -KEY=D6B97A7D0CEBEA71F519611E1E6E506FCB85264984F45120 -IV=84933D2D2F1F6C13E9FDD1131ED2A755 -CT=1D3D85A9A4BF101E12CC79640D716AC6 -PT=A2228D0483F9CF74CAA301FD30D7DB68 - -I=223 -KEY=E86CCBF22BAF7B31573BEC1A9D979F1B012627B4B4238A48 -IV=4AE5BFEB7168981E3ED5B18F27449140 -CT=A2228D0483F9CF74CAA301FD30D7DB68 -PT=D43E1D2C7447B7C08BCA25F8371AEECF - -I=224 -KEY=0279786975DB97998305F136E9D028DB8AEC024C83396487 -IV=2FC19D77503C0296EA15B39B5E74ECA8 -CT=D43E1D2C7447B7C08BCA25F8371AEECF -PT=4F97B6C0B7D10763CD5CE3A45855FEC0 - -I=225 -KEY=7F842708B71AD43BCC9247F65E012FB847B0E1E8DB6C9A47 -IV=BAC3ED277430C4537DFD5F61C2C143A2 -CT=4F97B6C0B7D10763CD5CE3A45855FEC0 -PT=067B1521895AE654CA0C20492A9714B8 - -I=226 -KEY=2FA21F709793A1C7CAE952D7D75BC9EC8DBCC1A1F1FB8EFF -IV=66014BDC0AD70ABB50263878208975FC -CT=067B1521895AE654CA0C20492A9714B8 -PT=E07E7A1D3F39E45E3A755A82EE3C2EBC - -I=227 -KEY=671468BAD93EDBD32A9728CAE8622DB2B7C99B231FC7A043 -IV=47BFF88E3EC2E8DC48B677CA4EAD7A14 -CT=E07E7A1D3F39E45E3A755A82EE3C2EBC -PT=0933D51670E8918147A56816B838BC74 - -I=228 -KEY=9749A2F6B448445023A4FDDC988ABC33F06CF335A7FF1C37 -IV=58F8C33F4725EED2F05DCA4C6D769F83 -CT=0933D51670E8918147A56816B838BC74 -PT=E90570CDFC2CDCC99826780CA7CD7A1C - -I=229 -KEY=C43D753C2489B403CAA18D1164A660FA684A8B390032662B -IV=C4027E5BF29E96A65374D7CA90C1F053 -CT=E90570CDFC2CDCC99826780CA7CD7A1C -PT=65B6C303491459554CDDA630AAB36C12 - -I=230 -KEY=32F2C804DF89C908AF174E122DB239AF24972D09AA810A39 -IV=51DE94724DCE9B10F6CFBD38FB007D0B -CT=65B6C303491459554CDDA630AAB36C12 -PT=A0B1694685785EFBDD6DB8E4FC312BC4 - -I=231 -KEY=9431549183D690920FA62754A8CA6754F9FA95ED56B021FD -IV=5CBDC9F06F45D2F5A6C39C955C5F599A -CT=A0B1694685785EFBDD6DB8E4FC312BC4 -PT=C271A8F639D1A293F4B8899428F618C2 - -I=232 -KEY=0AA1211F2A2134DACDD78FA2911BC5C70D421C797E46393F -IV=E52D7ACAF5DFAF799E90758EA9F7A448 -CT=C271A8F639D1A293F4B8899428F618C2 -PT=AB7968C2A1859D5AEBFAEB201910B672 - -I=233 -KEY=88BFBDDC6D21FC0E66AEE760309E589DE6B8F75967568F4D -IV=15AF9C49191BF995821E9CC34700C8D4 -CT=AB7968C2A1859D5AEBFAEB201910B672 -PT=59D394BB9C41BE21C050A9DF2DD94C2B - -I=234 -KEY=05AB922FA8B6F5FF3F7D73DBACDFE6BC26E85E864A8FC366 -IV=0FB568270892E7A98D142FF3C59709F1 -CT=59D394BB9C41BE21C050A9DF2DD94C2B -PT=43F89BAE0DCCB0EAF30411E6239A753C - -I=235 -KEY=7A7ED7932DED53767C85E875A1135656D5EC4F606915B65A -IV=48F1E1DAEE9C16CD7FD545BC855BA689 -CT=43F89BAE0DCCB0EAF30411E6239A753C -PT=8196A2F49E2508443F86B294D71A5D5E - -I=236 -KEY=8955F595C21BF3AAFD134A813F365E12EA6AFDF4BE0FEB04 -IV=B3DEB1ED557CB477F32B2206EFF6A0DC -CT=8196A2F49E2508443F86B294D71A5D5E -PT=5ED45F8741E7FC5C77CAACA9D3DFA26D - -I=237 -KEY=09205C9C2A528A5BA3C715067ED1A24E9DA0515D6DD04969 -IV=3742941BC0992AAC8075A909E84979F1 -CT=5ED45F8741E7FC5C77CAACA9D3DFA26D -PT=F60C9F9616A03B40655CB733EE1C3B68 - -I=238 -KEY=46DAA0A9A034745355CB8A906871990EF8FCE66E83CC7201 -IV=A3E1EA7D9E5BA6CE4FFAFC358A66FE08 -CT=F60C9F9616A03B40655CB733EE1C3B68 -PT=E73F7E14A3A245B1E594F659D996ED06 - -I=239 -KEY=DA145A69C9D459E1B2F4F484CBD3DCBF1D6810375A5A9F07 -IV=F5D4EB0EAB3486D29CCEFAC069E02DB2 -CT=E73F7E14A3A245B1E594F659D996ED06 -PT=52651C2039168170765B235D85BF6CEC - -I=240 -KEY=61CD045E05969B9FE091E8A4F2C55DCF6B33336ADFE5F3EB -IV=F7162437A85A186ABBD95E37CC42C27E -CT=52651C2039168170765B235D85BF6CEC -PT=665C920C4BB95B5C716D60AE9C30DB1B - -I=241 -KEY=BDF9F289D095660D86CD7AA8B97C06931A5E53C443D528F0 -IV=ADD7416105DB0CF0DC34F6D7D503FD92 -CT=665C920C4BB95B5C716D60AE9C30DB1B -PT=F6E1D36CF7D41F70885587A85B897EA2 - -I=242 -KEY=4CBAF7692571D8C5702CA9C44EA819E3920BD46C185C5652 -IV=9FBF3815905FCD9FF14305E0F5E4BEC8 -CT=F6E1D36CF7D41F70885587A85B897EA2 -PT=137DB7F20F98671E37F55E401D0482E2 - -I=243 -KEY=CEBF572BB09CC72963511E3641307EFDA5FE8A2C0558D4B0 -IV=0C3951BDCA9582CA8205A04295ED1FEC -CT=137DB7F20F98671E37F55E401D0482E2 -PT=72125C79A48573158496EFCC5CA552D4 - -I=244 -KEY=0D8978CF8179CBBF1143424FE5B50DE8216865E059FD8664 -IV=898422AB0DB951B1C3362FE431E50C96 -CT=72125C79A48573158496EFCC5CA552D4 -PT=6B12016832DE435A963FFFA857824CF7 - -I=245 -KEY=180D2DA794FEAF777A514327D76B4EB2B7579A480E7FCA93 -IV=0B47A508EAD8008015845568158764C8 -CT=6B12016832DE435A963FFFA857824CF7 -PT=18693A241FB5687CF3A793B9B7EE4B15 - -I=246 -KEY=3D6C36453DCA611462387903C8DE26CE44F009F1B9918186 -IV=857CC19C3E72C1AD25611BE2A934CE63 -CT=18693A241FB5687CF3A793B9B7EE4B15 -PT=4E04BD363AFC26BDDD3D98892A7C705A - -I=247 -KEY=8B626E8D8E075BCE2C3CC435F222007399CD917893EDF1DC -IV=6E4FCD034F6E2AF5B60E58C8B3CD3ADA -CT=4E04BD363AFC26BDDD3D98892A7C705A -PT=06FB2C371C3F54518AA0A2766CE1CCF3 - -I=248 -KEY=A5ECEB5BAE22C2E72AC7E802EE1D5422136D330EFF0C3D2F -IV=4A23E1EFBB43855E2E8E85D620259929 -CT=06FB2C371C3F54518AA0A2766CE1CCF3 -PT=D7DE2C298EB1EF273A6386986BDEC555 - -I=249 -KEY=B25537EEFD5BDA7AFD19C42B60ACBB05290EB59694D2F87A -IV=9034BBDBF74A369E17B9DCB55379189D -CT=D7DE2C298EB1EF273A6386986BDEC555 -PT=0F4A1CEA83DA845DEC063ADFF173F424 - -I=250 -KEY=39FEF1C45697DABCF253D8C1E3763F58C5088F4965A10C5E -IV=2B5EF64E50A2CF5F8BABC62AABCC00C6 -CT=0F4A1CEA83DA845DEC063ADFF173F424 -PT=CE27F8AF55009D3658D166B960CA12D6 - -I=251 -KEY=5657BBA1106032F13C74206EB676A26E9DD9E9F0056B1E88 -IV=CE96953F749BBFD66FA94A6546F7E84D -CT=CE27F8AF55009D3658D166B960CA12D6 -PT=BF1458E052637EFC0EEF352621606029 - -I=252 -KEY=A1BC53DEFD62921A8360788EE415DC929336DCD6240B7EA1 -IV=B944FC42142E4940F7EBE87FED02A0EB -CT=BF1458E052637EFC0EEF352621606029 -PT=E4D96706DB5B0DA8FA429BB65BFBE4D8 - -I=253 -KEY=DAC8C0328BA4104167B91F883F4ED13A697447607FF09A79 -IV=A8D8E3A3BB687ECC7B7493EC76C6825B -CT=E4D96706DB5B0DA8FA429BB65BFBE4D8 -PT=1B11FF1367FE94F7759D1BEC40B8FDCC - -I=254 -KEY=03AE3AA5E62CA4927CA8E09B58B045CD1CE95C8C3F4867B5 -IV=35D7DB1466E14E3ED966FA976D88B4D3 -CT=1B11FF1367FE94F7759D1BEC40B8FDCC -PT=0989D688C947C616AC13B63892E35E74 - -I=255 -KEY=EAD5A60BB601C1147521361391F783DBB0FAEAB4ADAB39C1 -IV=59BA56CC11EFA9A2E97B9CAE502D6586 -CT=0989D688C947C616AC13B63892E35E74 -PT=978C150575871FB2C8847AA0CB092108 - -I=256 -KEY=C608EE8A971A0383E2AD2316E4709C69787E901466A218C9 -IV=253A79448D79B0B72CDD4881211BC297 -CT=978C150575871FB2C8847AA0CB092108 -PT=D08629CCCF6B869B10768DE9E2984B2E - -I=257 -KEY=D8EB4FC4230D3E39322B0ADA2B1B1AF268081DFD843A53E7 -IV=E9A7FDB26A37B6601EE3A14EB4173DBA -CT=D08629CCCF6B869B10768DE9E2984B2E -PT=E320AECF3803401AB95E09EB50A6EDA5 - -I=258 -KEY=E3F18E12233B5A30D10BA41513185AE8D1561416D49CBE42 -IV=4C6B62E3E6658BE73B1AC1D600366409 -CT=E320AECF3803401AB95E09EB50A6EDA5 -PT=D29E97683C9989C75D5D73EAADC23EE2 - -I=259 -KEY=7D9DEAA58D97A2FC0395337D2F81D32F8C0B67FC795E80A0 -IV=414A2961119CE4D79E6C64B7AEACF8CC -CT=D29E97683C9989C75D5D73EAADC23EE2 -PT=8D859D878DF32FDD26AF4984D48A1BD2 - -I=260 -KEY=E4A19E3554E8D73B8E10AEFAA272FCF2AAA42E78ADD49B72 -IV=9DF8066FCF854065993C7490D97F75C7 -CT=8D859D878DF32FDD26AF4984D48A1BD2 -PT=7B524B71439722F0555D4681F7EEAAC9 - -I=261 -KEY=0C93CDDA4435E903F542E58BE1E5DE02FFF968F95A3A31BB -IV=9529BF1B1ACEEDA5E83253EF10DD3E38 -CT=7B524B71439722F0555D4681F7EEAAC9 -PT=8C8ECC9829F06F73497EA90D48CD7FC5 - -I=262 -KEY=637747C6EF7B72B579CC2913C815B171B687C1F412F74E7E -IV=ADC9666D259469516FE48A1CAB4E9BB6 -CT=8C8ECC9829F06F73497EA90D48CD7FC5 -PT=6E416C2563212821F0D8E7D75297B11F - -I=263 -KEY=7E4BB22E1A7C4E25178D4536AB349950465F26234060FF61 -IV=C3BE9A54FDDA99731D3CF5E8F5073C90 -CT=6E416C2563212821F0D8E7D75297B11F -PT=EFC73DFA5FB87EA16284E25D22360C2F - -I=264 -KEY=62B7D329DC5EA208F84A78CCF48CE7F124DBC47E6256F34E -IV=E2145312DF24CBDB1CFC6107C622EC2D -CT=EFC73DFA5FB87EA16284E25D22360C2F -PT=1191FC5E2EFA9F19004C7D00E1F4D8B1 - -I=265 -KEY=039B0E1DE399831EE9DB8492DA7678E82497B97E83A22BFF -IV=0931D0D100EEB87D612CDD343FC72116 -CT=1191FC5E2EFA9F19004C7D00E1F4D8B1 -PT=717B1B902086B97296B7E97BC01C259E - -I=266 -KEY=CB02B3C8CA4A0C9498A09F02FAF0C19AB220500543BE0E61 -IV=65D0C1DFC85C7FB9C899BDD529D38F8A -CT=717B1B902086B97296B7E97BC01C259E -PT=569097DA8C43871CC5A55AC150ABCD31 - -I=267 -KEY=5FFAEE959D35C247CE3008D876B3468677850AC41315C350 -IV=7A4A448600ACA08994F85D5D577FCED3 -CT=569097DA8C43871CC5A55AC150ABCD31 -PT=4046F3DF53DFC1B56400501F08200FE0 - -I=268 -KEY=0CA33FAAA4B25FEB8E76FB07256C873313855ADB1B35CCB0 -IV=C83E2121AA25A5295359D13F39879DAC -CT=4046F3DF53DFC1B56400501F08200FE0 -PT=87C5362AAF3F31B05C92189E38FD9C66 - -I=269 -KEY=5B782B675EE9A8A509B3CD2D8A53B6834F17424523C850D6 -IV=567E0CD5EAFC699457DB14CDFA5BF74E -CT=87C5362AAF3F31B05C92189E38FD9C66 -PT=03A5CD79734810F4D9559FDC97A4B1A1 - -I=270 -KEY=B069B5DCAADA727F0A160054F91BA6779642DD99B46CE177 -IV=5397ED8A6DF7641EEB119EBBF433DADA -CT=03A5CD79734810F4D9559FDC97A4B1A1 -PT=1B1ECDDFD726C66594DF7B050F6758FF - -I=271 -KEY=52477DE5EFBAE2621108CD8B2E3D6012029DA69CBB0BB988 -IV=52151355DA4369C8E22EC8394560901D -CT=1B1ECDDFD726C66594DF7B050F6758FF -PT=26E9A7A560DD36D9767A51DA06301BBD - -I=272 -KEY=6E59FF11BED37F8837E16A2E4EE056CB74E7F746BD3BA235 -IV=FB1A5F8FA1C3D1F43C1E82F451699DEA -CT=26E9A7A560DD36D9767A51DA06301BBD -PT=C2FAB5CDDB329F2EA1E1459251A3CB1B - -I=273 -KEY=504DE2EC58CE17BBF51BDFE395D2C9E5D506B2D4EC98692E -IV=6BCD90C4D648AB783E141DFDE61D6833 -CT=C2FAB5CDDB329F2EA1E1459251A3CB1B -PT=4293D0A26E81DBE9FED6113B1954D59F - -I=274 -KEY=CC6C6C4150E763AAB7880F41FB53120C2BD0A3EFF5CCBCB1 -IV=0F61DAA62B7E95A79C218EAD08297411 -CT=4293D0A26E81DBE9FED6113B1954D59F -PT=5DC81F054088DB9B3D1F8AD4BACC2039 - -I=275 -KEY=BD3B4967A596578FEA401044BBDBC99716CF293B4F009C88 -IV=0C6435697122955071572526F5713425 -CT=5DC81F054088DB9B3D1F8AD4BACC2039 -PT=B6FB950586C671E968FFC709B79E8AF8 - -I=276 -KEY=9A08B753E07CD6535CBB85413D1DB87E7E30EE32F89E1670 -IV=377A670B7487B3EB2733FE3445EA81DC -CT=B6FB950586C671E968FFC709B79E8AF8 -PT=ED69B1E52F5F095EFF0AC73A76039B65 - -I=277 -KEY=E5FAA83242346B4EB1D234A41242B120813A29088E9D8D15 -IV=DBEEED8784AD80B57FF21F61A248BD1D -CT=ED69B1E52F5F095EFF0AC73A76039B65 -PT=FBC0C9A6FBC2CCD02BF5A009B43FE903 - -I=278 -KEY=44770F6B1653E2754A12FD02E9807DF0AACF89013AA26416 -IV=7D9B061A6209E0FAA18DA7595467893B -CT=FBC0C9A6FBC2CCD02BF5A009B43FE903 -PT=ADBE2B6C2C979C90E019991C5E81F69E - -I=279 -KEY=89A3B49BBE885D34E7ACD66EC517E1604AD6101D64239288 -IV=5495C29E4DDA4E26CDD4BBF0A8DBBF41 -CT=ADBE2B6C2C979C90E019991C5E81F69E -PT=E382D6611C0B2591BE9B7B6BC66D479D - -I=280 -KEY=457D838277C2797B042E000FD91CC4F1F44D6B76A24ED515 -IV=0303BB8A65CCE419CCDE3719C94A244F -CT=E382D6611C0B2591BE9B7B6BC66D479D -PT=7A39D5BFC7ADB6B7539A1AA45A31A7E5 - -I=281 -KEY=814AD70FBAF9D8AA7E17D5B01EB17246A7D771D2F87F72F0 -IV=550BD125E57ADE94C437548DCD3BA1D1 -CT=7A39D5BFC7ADB6B7539A1AA45A31A7E5 -PT=3CB8FF426FF48FA93EFAEDC559833C86 - -I=282 -KEY=89599F584B46337342AF2AF27145FDEF992D9C17A1FC4E76 -IV=45800DE7659A8FD008134857F1BFEBD9 -CT=3CB8FF426FF48FA93EFAEDC559833C86 -PT=2F5C7660310DE65B1C5254E2176A15CA - -I=283 -KEY=8EF84BDE14C7412B6DF35C9240481BB4857FC8F5B6965BBC -IV=5142FFEADEC300C107A1D4865F817258 -CT=2F5C7660310DE65B1C5254E2176A15CA -PT=7A3056742CF8CFDE9CBEAE32607E8DE3 - -I=284 -KEY=F076085EE3EA165617C30AE66CB0D46A19C166C7D6E8D65F -IV=02FBB83EDCB092957E8E4380F72D577D -CT=7A3056742CF8CFDE9CBEAE32607E8DE3 -PT=B2B7B7551B2A1D59601003C6EDD70A78 - -I=285 -KEY=7D74D286D9CEC1C3A574BDB3779AC93379D165013B3FDC27 -IV=890E42EAA4C59B078D02DAD83A24D795 -CT=B2B7B7551B2A1D59601003C6EDD70A78 -PT=8B617CCD9B1289F485167DC13126795C - -I=286 -KEY=8BA3AA3C04001B9D2E15C17EEC8840C7FCC718C00A19A57B -IV=F96182D81751ECCAF6D778BADDCEDA5E -CT=8B617CCD9B1289F485167DC13126795C -PT=D4800EE4A5E29A18C655AD5CE23063F9 - -I=287 -KEY=E51B3BF1DF7B0D54FA95CF9A496ADADF3A92B59CE829C682 -IV=46297563D303DF226EB891CDDB7B16C9 -CT=D4800EE4A5E29A18C655AD5CE23063F9 -PT=4A6008072DCEB7602BF120F0984FF1D6 - -I=288 -KEY=82091A039C558D36B0F5C79D64A46DBF1163956C70663754 -IV=28E82D15BAC860EA671221F2432E8062 -CT=4A6008072DCEB7602BF120F0984FF1D6 -PT=B05CD61BC646851726441B147FBB1AD3 - -I=289 -KEY=C503B4B113DE349700A91186A2E2E8A837278E780FDD2D87 -IV=342F9FDEEEBE130A470AAEB28F8BB9A1 -CT=B05CD61BC646851726441B147FBB1AD3 -PT=33E1834199EE6CD5C6F950D4823B2337 - -I=290 -KEY=4B06065B748AFB69334892C73B0C847DF1DEDEAC8DE60EB0 -IV=02928C43C0FF24968E05B2EA6754CFFE -CT=33E1834199EE6CD5C6F950D4823B2337 -PT=BA0BD1FFA54258361D3A8BD9F3C689E4 - -I=291 -KEY=AD0B10216B5D496B894343389E4EDC4BECE455757E208754 -IV=50DC56062E88C9CAE60D167A1FD7B202 -CT=BA0BD1FFA54258361D3A8BD9F3C689E4 -PT=4911046D8F1D2BCF54F22B5A83AF5AE1 - -I=292 -KEY=AF6CC229A2618121C05247551153F784B8167E2FFD8FDDB5 -IV=A7CC6A2B280A9DE80267D208C93CC84A -CT=4911046D8F1D2BCF54F22B5A83AF5AE1 -PT=254CA1983D7B794911B455E857CE902B - -I=293 -KEY=66413E8C7D11836FE51EE6CD2C288ECDA9A22BC7AA414D9E -IV=D01066ADC643A032C92DFCA5DF70024E -CT=254CA1983D7B794911B455E857CE902B -PT=B0A100E60D0404D123D10AE78E9CFFCB - -I=294 -KEY=D13AF271F9C3337455BFE62B212C8A1C8A73212024DDB255 -IV=20D00A218F07ECEDB77BCCFD84D2B01B -CT=B0A100E60D0404D123D10AE78E9CFFCB -PT=D4CD0CC7D2EBAB050108E94365D34FAA - -I=295 -KEY=8B3C7094C3AD8B018172EAECF3C721198B7BC863410EFDFF -IV=EC5F46869A00FFC25A0682E53A6EB875 -CT=D4CD0CC7D2EBAB050108E94365D34FAA -PT=DF913CC34675469401CCA41DB50BFBA4 - -I=296 -KEY=7DCF9D4559C3EA3A5EE3D62FB5B2678D8AB76C7EF405065B -IV=8718728B7105A417F6F3EDD19A6E613B -CT=DF913CC34675469401CCA41DB50BFBA4 -PT=5B09F0AF91EA41851A232543E97A6ED4 - -I=297 -KEY=C3E6C2A9975117B605EA2680245826089094493D1D7F688F -IV=21D001128A401EBFBE295FECCE92FD8C -CT=5B09F0AF91EA41851A232543E97A6ED4 -PT=8544DFD1E46D14FF1B0E9CF43A7E9EB6 - -I=298 -KEY=54C6D7971066FDD380AEF951C03532F78B9AD5C92701F639 -IV=F861E1C66C3F21779720153E8737EA65 -CT=8544DFD1E46D14FF1B0E9CF43A7E9EB6 -PT=586696A67E355CCDC41AD16D87786773 - -I=299 -KEY=B47A128050D1FC84D8C86FF7BE006E3A4F8004A4A079914A -IV=55A87D49D3640887E0BCC51740B70157 -CT=586696A67E355CCDC41AD16D87786773 -PT=6C7FF8D2F033B33C729C556E0731ACFF - -I=300 -KEY=C66EA18D75351D93B4B797254E33DD063D1C51CAA7483DB5 -IV=7224A11A5D122A607214B30D25E4E117 -CT=6C7FF8D2F033B33C729C556E0731ACFF -PT=BC031D9B497C64B15EE143CF4D2130B1 - -I=301 -KEY=00432A82295B2C6708B48ABE074FB9B763FD1205EA690D04 -IV=61D8239BE618CC39C62D8B0F5C6E31F4 -CT=BC031D9B497C64B15EE143CF4D2130B1 -PT=325D14CCDE09311A8069C5522FD050FD - -I=302 -KEY=E03B01935511FA7E3AE99E72D94688ADE394D757C5B95DF9 -IV=339B83266B282A96E0782B117C4AD619 -CT=325D14CCDE09311A8069C5522FD050FD -PT=FA25D0913004A26A3232F743ACC7677E - -I=303 -KEY=47F79639F27D47E9C0CC4EE3E9422AC7D1A62014697E3A87 -IV=C5F60E2EC86A0971A7CC97AAA76CBD97 -CT=FA25D0913004A26A3232F743ACC7677E -PT=61AA67B567F1CE94326B4711F8115727 - -I=304 -KEY=EE86C028A3B01E7EA16629568EB3E453E3CD6705916F6DA0 -IV=4037462A5B08A27FA971561151CD5997 -CT=61AA67B567F1CE94326B4711F8115727 -PT=35D0FD8AFF6CBDF34065CED4796D9D27 - -I=305 -KEY=EE88DBE9CCC930CB94B6D4DC71DF59A0A3A8A9D1E802F087 -IV=20CB619D26A05953000E1BC16F792EB5 -CT=35D0FD8AFF6CBDF34065CED4796D9D27 -PT=DD69B839EAE7D0DF79F5D06140D54325 - -I=306 -KEY=C77ADB703861D01649DF6CE59B38897FDA5D79B0A8D7B3A2 -IV=16CFCF6A4F3272EA29F20099F4A8E0DD -CT=DD69B839EAE7D0DF79F5D06140D54325 -PT=CA93E79E612893AA0D979ABDF5CA788A - -I=307 -KEY=3F486F048B5D9716834C8B7BFA101AD5D7CAE30D5D1DCB28 -IV=58332C3A8F187A96F832B474B33C4700 -CT=CA93E79E612893AA0D979ABDF5CA788A -PT=39974A1C62DF12F62EC9F75704B0EFA8 - -I=308 -KEY=B9022C8EA2C6FEF4BADBC16798CF0823F903145A59AD2480 -IV=3C09D97EFC480CD6864A438A299B69E2 -CT=39974A1C62DF12F62EC9F75704B0EFA8 -PT=B840EFC34BCD941BF551E437D633BB3A - -I=309 -KEY=D22317E3BB60B9FA029B2EA4D3029C380C52F06D8F9E9FBA -IV=C755A4CF1FAD90046B213B6D19A6470E -CT=B840EFC34BCD941BF551E437D633BB3A -PT=979F6217FD73CAB73A1DE1FACF68542C - -I=310 -KEY=E196EBBFCDA64F7095044CB32E71568F364F119740F6CB96 -IV=D342A7B4EF6CB49F33B5FC5C76C6F68A -CT=979F6217FD73CAB73A1DE1FACF68542C -PT=A290A25CFBCB1BEE137AFB860BB2CF29 - -I=311 -KEY=B756B878A99088B83794EEEFD5BA4D612535EA114B4404BF -IV=D92C9835E799541056C053C76436C7C8 -CT=A290A25CFBCB1BEE137AFB860BB2CF29 -PT=7E99249836CA5167C88BD3431C78C2E0 - -I=312 -KEY=2515F524203B507E490DCA77E3701C06EDBE3952573CC65F -IV=FD7219F6C131C4BD92434D5C89ABD8C6 -CT=7E99249836CA5167C88BD3431C78C2E0 -PT=5B7DAB9C2148A2B7ACCE4723D1D63B3F - -I=313 -KEY=28A33899811FE9B7127061EBC238BEB141707E7186EAFD60 -IV=F6B29A78141D8F8A0DB6CDBDA124B9C9 -CT=5B7DAB9C2148A2B7ACCE4723D1D63B3F -PT=12BAE3836257C52B88ECEEAAE8DE3B80 - -I=314 -KEY=85C6089FEF19163500CA8268A06F7B9AC99C90DB6E34C6E0 -IV=AE11E9BE14B4ECB1AD6530066E06FF82 -CT=12BAE3836257C52B88ECEEAAE8DE3B80 -PT=71C5D9F8747D428DE30736C4DD33E3E5 - -I=315 -KEY=86665ED5DA56FE90710F5B90D41239172A9BA61FB3072505 -IV=2CBAA91201D1980B03A0564A354FE8A5 -CT=71C5D9F8747D428DE30736C4DD33E3E5 -PT=D824A3FB80554CCD519D730D25EED2AF - -I=316 -KEY=F6D0840D75423D5CA92BF86B544775DA7B06D51296E9F7AA -IV=66AA086063C3768C70B6DAD8AF14C3CC -CT=D824A3FB80554CCD519D730D25EED2AF -PT=C974BCBE88ACA9D29312192BE52885BD - -I=317 -KEY=56F2FDAAB52A8691605F44D5DCEBDC08E814CC3973C17217 -IV=14D16CCEDE70F435A02279A7C068BBCD -CT=C974BCBE88ACA9D29312192BE52885BD -PT=23B74C4B5E661FA157F571F4C13AA3AE - -I=318 -KEY=676109782F02525643E8089E828DC3A9BFE1BDCDB2FBD1B9 -IV=46BB517768227D1D3193F4D29A28D4C7 -CT=23B74C4B5E661FA157F571F4C13AA3AE -PT=BDF2A1A79D553C85F5867B2BD5259A82 - -I=319 -KEY=D21B20B085B317EDFE1AA9391FD8FF2C4A67C6E667DE4B3B -IV=054B26F10A7F2D69B57A29C8AAB145BB -CT=BDF2A1A79D553C85F5867B2BD5259A82 -PT=1E02970BE31FEE63C9BCCC79FB41F670 - -I=320 -KEY=3CF3F93D44647FB7E0183E32FCC7114F83DB0A9F9C9FBD4B -IV=C44342FC579F9083EEE8D98DC1D7685A -CT=1E02970BE31FEE63C9BCCC79FB41F670 -PT=70F71372F64174D7C8757F043812439F - -I=321 -KEY=2C83CB76D99E054E90EF2D400A8665984BAE759BA48DFED4 -IV=884B46D9FBE7D99C1070324B9DFA7AF9 -CT=70F71372F64174D7C8757F043812439F -PT=46B20E91579B5CC0ADE9327478DF25FA - -I=322 -KEY=0ADEA18FAA36E94BD65D23D15D1D3958E64747EFDC52DB2E -IV=F256BC3206E11E9C265D6AF973A8EC05 -CT=46B20E91579B5CC0ADE9327478DF25FA -PT=51FE245369F67740615E159E28C2D56C - -I=323 -KEY=E0C00F8BFD4ADCD087A3078234EB4E1887195271F4900E42 -IV=836F6756B9EC572DEA1EAE04577C359B -CT=51FE245369F67740615E159E28C2D56C -PT=58A1B407358C1F9783A05C0A43D5B4FB - -I=324 -KEY=EEA0B17E70A6FC53DF02B3850167518F04B90E7BB745BAB9 -IV=0E584BF6D72F08310E60BEF58DEC2083 -CT=58A1B407358C1F9783A05C0A43D5B4FB -PT=6212DD8752996CC4D747790D5F2BC7E7 - -I=325 -KEY=B6E49EEA07D03112BD106E0253FE3D4BD3FE7776E86E7D5E -IV=2BA760FB0CC14D1858442F947776CD41 -CT=6212DD8752996CC4D747790D5F2BC7E7 -PT=DB16C25BDE0B95F4EC7B34FA2096E6A6 - -I=326 -KEY=F64DCEBA5E71D73E6606AC598DF5A8BF3F85438CC8F89BF8 -IV=674AA4866EE9988E40A9505059A1E62C -CT=DB16C25BDE0B95F4EC7B34FA2096E6A6 -PT=BB98BBB3289F3B5A96C5D3DA92F8CD0F - -I=327 -KEY=23CBCCA3D63DABB8DD9E17EAA56A93E5A94090565A0056F7 -IV=E3D676539CBD9676D5860219884C7C86 -CT=BB98BBB3289F3B5A96C5D3DA92F8CD0F -PT=324C1661B1E289EA3DAC27AF14E026C5 - -I=328 -KEY=D6F7C4A098C4E809EFD2018B14881A0F94ECB7F94EE07032 -IV=E7FB3F340E160FB5F53C08034EF943B1 -CT=324C1661B1E289EA3DAC27AF14E026C5 -PT=6EDA104789445C38F66EC2562F95FBDB - -I=329 -KEY=4B795FAB98879223810811CC9DCC4637628275AF61758BE9 -IV=C5E830814D72E9449D8E9B0B00437A2A -CT=6EDA104789445C38F66EC2562F95FBDB -PT=C834C54858181891C7D654A7502C0B60 - -I=330 -KEY=AA317465E376BAF2493CD484C5D45EA6A554210831598089 -IV=2388FCCDB47CB5DBE1482BCE7BF128D1 -CT=C834C54858181891C7D654A7502C0B60 -PT=9C5F5599557D176050BBAC4258B87F66 - -I=331 -KEY=B601C39C0E5F02DED563811D90A949C6F5EF8D4A69E1FFEF -IV=10C2528D377387311C30B7F9ED29B82C -CT=9C5F5599557D176050BBAC4258B87F66 -PT=ED5F51A6AFA843D467E21F6C68992273 - -I=332 -KEY=44A1FE3F8349D500383CD0BB3F010A12920D92260178DD9C -IV=9E73D9FB1D2471E8F2A03DA38D16D7DE -CT=ED5F51A6AFA843D467E21F6C68992273 -PT=D7A5F18382F892264008F75707254D95 - -I=333 -KEY=568F031D75B9B48FEF992138BDF99834D2056571065D9009 -IV=DEC9B60FA5A91887122EFD22F6F0618F -CT=D7A5F18382F892264008F75707254D95 -PT=D13A34D9F57884ECEE2FA1A412584BE4 - -I=334 -KEY=72CFCCE9FE5EB48A3EA315E148811CD83C2AC4D51405DBED -IV=75C70261D0C49D692440CFF48BE70005 -CT=D13A34D9F57884ECEE2FA1A412584BE4 -PT=064D550098F0813D145A2AA296064CCF - -I=335 -KEY=58448186BD1ED1FC38EE40E1D0719DE52870EE7782039722 -IV=754A1B79A75BD3B32A8B4D6F43406576 -CT=064D550098F0813D145A2AA296064CCF -PT=D7CD7D2B23E42F7A9808D48C28982743 - -I=336 -KEY=6FF7BCC770079D57EF233DCAF395B29FB0783AFBAA9BB061 -IV=25EE1F4D8F257C6437B33D41CD194CAB -CT=D7CD7D2B23E42F7A9808D48C28982743 -PT=6F55D4C7A13F08A1D936C5F0177040CA - -I=337 -KEY=7ECBB104AA3505E58076E90D52AABA3E694EFF0BBDEBF0AB -IV=E21F1527B69B89C8113C0DC3DA3298B2 -CT=6F55D4C7A13F08A1D936C5F0177040CA -PT=7F061908571CDDBC1F8F82A31A3AF1F9 - -I=338 -KEY=135D99B5F2482FFAFF70F00505B6678276C17DA8A7D10152 -IV=5DA54CDB26A0DC2D6D9628B1587D2A1F -CT=7F061908571CDDBC1F8F82A31A3AF1F9 -PT=30AB085953DE3E8027DE0C8A185A7D02 - -I=339 -KEY=3C76458A987B66F0CFDBF85C56685902511F7122BF8B7C50 -IV=E0614E072D2563DD2F2BDC3F6A33490A -CT=30AB085953DE3E8027DE0C8A185A7D02 -PT=92C915E98AEBF6265C43A66AC5B40787 - -I=340 -KEY=EBD41B4484EA67A05D12EDB5DC83AF240D5CD7487A3F7BD7 -IV=6EA27DF02FA0A9A9D7A25ECE1C910150 -CT=92C915E98AEBF6265C43A66AC5B40787 -PT=E9AC0996F97FFBA0F7C860A089CDF99F - -I=341 -KEY=85B6BBBC8E2243D3B4BEE42325FC5484FA94B7E8F3F28248 -IV=46D915F802932C936E62A0F80AC82473 -CT=E9AC0996F97FFBA0F7C860A089CDF99F -PT=BA1D082EDB28E255CB37AFEDB497D43A - -I=342 -KEY=BDA8736E56DDB34F0EA3EC0DFED4B6D131A3180547655672 -IV=0A7B9BCBE89E4CDE381EC8D2D8FFF09C -CT=BA1D082EDB28E255CB37AFEDB497D43A -PT=63298FE15A14C4A4E582C57772A0581E - -I=343 -KEY=9B5DC0C3B097B7CE6D8A63ECA4C07275D421DD7235C50E6C -IV=81F4666446CB470526F5B3ADE64A0481 -CT=63298FE15A14C4A4E582C57772A0581E -PT=AE79390C6789DFCF7110BA93281E9895 - -I=344 -KEY=E64DDC6A55048E35C3F35AE0C349ADBAA53167E11DDB96F9 -IV=DB4439803A1ACA807D101CA9E59339FB -CT=AE79390C6789DFCF7110BA93281E9895 -PT=2C9DF2ED511595756E5CF6D33442D3A3 - -I=345 -KEY=9C75AC9CBA0918CDEF6EA80D925C38CFCB6D91322999455A -IV=B73DBACA0C10AD0A7A3870F6EF0D96F8 -CT=2C9DF2ED511595756E5CF6D33442D3A3 -PT=90FDAEAEDC379128B73515CB2AAC9B7A - -I=346 -KEY=A045744F6BB9205F7F9306A34E6BA9E77C5884F90335DE20 -IV=356BBCDD4EBDA8F93C30D8D3D1B03892 -CT=90FDAEAEDC379128B73515CB2AAC9B7A -PT=E66EA385E1F20791090CA24ADB250AFC - -I=347 -KEY=48E94FAC40CFC94B99FDA526AF99AE76755426B3D810D4DC -IV=ABAF17EBE3658829E8AC3BE32B76E914 -CT=E66EA385E1F20791090CA24ADB250AFC -PT=A17C6802F4322D97C6966B523B54CF88 - -I=348 -KEY=3FC9CD7847FF49D73881CD245BAB83E1B3C24DE1E3441B54 -IV=7D25F4EE8B874E2D772082D40730809C -CT=A17C6802F4322D97C6966B523B54CF88 -PT=CBEC825D143BF30C58B608B58ABFB618 - -I=349 -KEY=D4464B5CD3CFAD06F36D4F794F9070EDEB74455469FBAD4C -IV=93D0E88641960F8EEB8F86249430E4D1 -CT=CBEC825D143BF30C58B608B58ABFB618 -PT=D7A8E224DAA4DB7629790D3D4D5A8560 - -I=350 -KEY=73DD2DA38114D0BD24C5AD5D9534AB9BC20D486924A1282C -IV=3E6B8F8084BAA391A79B66FF52DB7DBB -CT=D7A8E224DAA4DB7629790D3D4D5A8560 -PT=EB7EAD5CF27BA091DEF8D7839EFD7C90 - -I=351 -KEY=CDA609EB23BB90EBCFBB0001674F0B0A1CF59FEABA5C54BC -IV=8EEE61573B01F1E4BE7B2448A2AF4056 -CT=EB7EAD5CF27BA091DEF8D7839EFD7C90 -PT=2EFA41B666ECBBB1D699C1FB8CA9E175 - -I=352 -KEY=768FCC098B8F48FFE14141B701A3B0BBCA6C5E1136F5B5C9 -IV=60BC671273707E17BB29C5E2A834D814 -CT=2EFA41B666ECBBB1D699C1FB8CA9E175 -PT=44D7245914CF3BF73831D4225BD32FDD - -I=353 -KEY=91F2FFA6BB520FD1A59665EE156C8B4CF25D8A336D269A14 -IV=21187FBCFC5E01BEE77D33AF30DD472E -CT=44D7245914CF3BF73831D4225BD32FDD -PT=E9FA049C77C326A4F03D2C9E740DE4A1 - -I=354 -KEY=2FC9C39B5DBC560E4C6C617262AFADE80260A6AD192B7EB5 -IV=72912E59A0095846BE3B3C3DE6EE59DF -CT=E9FA049C77C326A4F03D2C9E740DE4A1 -PT=9A62281465C72FDAA73E00E343A99BC3 - -I=355 -KEY=F401ED3768BC72D4D60E496607688232A55EA64E5A82E576 -IV=88022668FE843060DBC82EAC350024DA -CT=9A62281465C72FDAA73E00E343A99BC3 -PT=FAD9ADA4B98A4141A2857F93F6F71DEB - -I=356 -KEY=1AD741BDF8A18D8E2CD7E4C2BEE2C37307DBD9DDAC75F89D -IV=F98FECC470C84631EED6AC8A901DFF5A -CT=FAD9ADA4B98A4141A2857F93F6F71DEB -PT=630453171FEE434834490229830E1C1A - -I=357 -KEY=24F7B99681335EAD4FD3B7D5A10C803B3392DBF42F7BE487 -IV=5D69B4D81847DABD3E20F82B7992D323 -CT=630453171FEE434834490229830E1C1A -PT=DE613189001598BA6AE67F259F9FD349 - -I=358 -KEY=60E401E96083FF2291B2865CA11918815974A4D1B0E437CE -IV=AADE84AD4127FCDA4413B87FE1B0A18F -CT=DE613189001598BA6AE67F259F9FD349 -PT=CA18925634072DEC80F2F724A0F24235 - -I=359 -KEY=66831E7F4FC51DB95BAA140A951E356DD98653F5101675FB -IV=1C1E2F698C5DD62006671F962F46E29B -CT=CA18925634072DEC80F2F724A0F24235 -PT=B289F06551C56B77F5CDF7B321E0E8E3 - -I=360 -KEY=48FB1A5B41F634D5E923E46FC4DB5E1A2C4BA44631F69D18 -IV=6A872620ED13A14B2E7804240E33296C -CT=B289F06551C56B77F5CDF7B321E0E8E3 -PT=13B1F93DD388A192D6FB836C90E0E022 - -I=361 -KEY=F13FA6E33170F596FA921D521753FF88FAB0272AA1167D3A -IV=40BF714207DA180BB9C4BCB87086C143 -CT=13B1F93DD388A192D6FB836C90E0E022 -PT=298B7B19A27EA1BE9574588A5885F64B - -I=362 -KEY=CE171639A4DDA77DD319664BB52D5E366FC47FA0F9938B71 -IV=8FB32729166E154F3F28B0DA95AD52EB -CT=298B7B19A27EA1BE9574588A5885F64B -PT=11FA000C73485654A8918360DF3C1F5E - -I=363 -KEY=9322B0E9AE4D6B20C2E36647C6650862C755FCC026AF942F -IV=809DE75B169C56BE5D35A6D00A90CC5D -CT=11FA000C73485654A8918360DF3C1F5E -PT=05533E642958E2F6F29BB1848BE225CB - -I=364 -KEY=21B86D89874D627FC7B05823EF3DEA9435CE4D44AD4DB1E4 -IV=81CF24C876471695B29ADD602900095F -CT=05533E642958E2F6F29BB1848BE225CB -PT=613DB485B9565B4889887282A3C8CFB5 - -I=365 -KEY=6E5AD95BDDA04D12A68DECA6566BB1DCBC463FC60E857E51 -IV=7E3AC16D28733BD84FE2B4D25AED2F6D -CT=613DB485B9565B4889887282A3C8CFB5 -PT=0CDDDA3B3375430B601BA1CCBD567284 - -I=366 -KEY=807937B80E55E814AA50369D651EF2D7DC5D9E0AB3D30CD5 -IV=C49324EE3A928684EE23EEE3D3F5A506 -CT=0CDDDA3B3375430B601BA1CCBD567284 -PT=C47A6E22A123AB6397F9C2AFFA6D45AB - -I=367 -KEY=20B3595EFE3D3DA76E2A58BFC43D59B44BA45CA549BE497E -IV=B188E4D3A2AC3F42A0CA6EE6F068D5B3 -CT=C47A6E22A123AB6397F9C2AFFA6D45AB -PT=71592AFCA1FEEE8AB6D6CEF22C14A21D - -I=368 -KEY=A97EAD081EDF66D11F73724365C3B73EFD72925765AAEB63 -IV=0DFF90FA3722469289CDF456E0E25B76 -CT=71592AFCA1FEEE8AB6D6CEF22C14A21D -PT=F4E0C4BCF8B386CF1BD457BD1FB65646 - -I=369 -KEY=DA90448D67D59E3CEB93B6FF9D7031F1E6A6C5EA7A1CBD25 -IV=154DB6488872217073EEE985790AF8ED -CT=F4E0C4BCF8B386CF1BD457BD1FB65646 -PT=9ED1119909322C280FE92B7840792605 - -I=370 -KEY=CF62D3016C8507F17542A76694421DD9E94FEE923A659B20 -IV=ED45F0A7D33FC08515F2978C0B5099CD -CT=9ED1119909322C280FE92B7840792605 -PT=F812615F1BE701E74FCEEFC288303C7C - -I=371 -KEY=C2681849C663E45A8D50C6398FA51C3EA6810150B255A75C -IV=19E09027253115100D0ACB48AAE6E3AB -CT=F812615F1BE701E74FCEEFC288303C7C -PT=25897C51C5FEDBFDC630BF8E9F3B2875 - -I=372 -KEY=F47C452077541CEEA8D9BA684A5BC7C360B1BEDE2D6E8F29 -IV=2C2EE28C518163DF36145D69B137F8B4 -CT=25897C51C5FEDBFDC630BF8E9F3B2875 -PT=9929E5E9F0CA00D0E02022E2FCFAFC3F - -I=373 -KEY=F7BF8679C8D86E2C31F05F81BA91C71380919C3CD1947316 -IV=FCF0C5D85049463103C3C359BF8C72C2 -CT=9929E5E9F0CA00D0E02022E2FCFAFC3F -PT=3B603A3FDAA669E7C965708C9789E329 - -I=374 -KEY=9312EDA0B14017910A9065BE6037AEF449F4ECB0461D903F -IV=364CDACF5762B18864AD6BD9799879BD -CT=3B603A3FDAA669E7C965708C9789E329 -PT=AC33F7B1A778C36617668C98E20B318A - -I=375 -KEY=D5BC989407D78D82A6A3920FC74F6D925E926028A416A1B5 -IV=5FB00506C71711D046AE7534B6979A13 -CT=AC33F7B1A778C36617668C98E20B318A -PT=B408AF5509EF45E0AEDF12570FAE3651 - -I=376 -KEY=6BBB14591C12578112AB3D5ACEA02872F04D727FABB897E4 -IV=D41F58F192CF60D6BE078CCD1BC5DA03 -CT=B408AF5509EF45E0AEDF12570FAE3651 -PT=39EB055E027AC0DEA5992B7BA3753AB5 - -I=377 -KEY=3F71566EA7D07EBF2B403804CCDAE8AC55D4590408CDAD51 -IV=7E495DEC2224696554CA4237BBC2293E -CT=39EB055E027AC0DEA5992B7BA3753AB5 -PT=832B01D2AD4F0EE077244CF9B6ABE31C - -I=378 -KEY=0BDC563CE47527D1A86B39D66195E64C22F015FDBE664E4D -IV=4FE13E98163C3F7734AD005243A5596E -CT=832B01D2AD4F0EE077244CF9B6ABE31C -PT=926EB7E17FA4262D1D390D83CDAC6FB2 - -I=379 -KEY=07D4D606747858B63A058E371E31C0613FC9187E73CA21FF -IV=12D459160DCFFEFE0C08803A900D7F67 -CT=926EB7E17FA4262D1D390D83CDAC6FB2 -PT=DBFBC3313F86C26BA54B9F69BA93C665 - -I=380 -KEY=84BE014D4BFA8ACCE1FE4D0621B7020A9A828717C959E79A -IV=179322B7D19F3A38836AD74B3F82D27A -CT=DBFBC3313F86C26BA54B9F69BA93C665 -PT=39B00A1A655B298F56271B2BDBA6B16B - -I=381 -KEY=A921F537F5F324CAD84E471C44EC2B85CCA59C3C12FF56F1 -IV=D4B03D3AB6FF79D22D9FF47ABE09AE06 -CT=39B00A1A655B298F56271B2BDBA6B16B -PT=7C5DABBF7C7951808DCD35DB2617B763 - -I=382 -KEY=3BB6AACEEEC21A9FA413ECA338957A054168A9E734E8E192 -IV=5C92A3C4C3C8567792975FF91B313E55 -CT=7C5DABBF7C7951808DCD35DB2617B763 -PT=BD88FB3B815415503D4F9264AFEA7887 - -I=383 -KEY=008F402C3524BCA8199B1798B9C16F557C273B839B029915 -IV=08360D06E31B3AA43B39EAE2DBE6A637 -CT=BD88FB3B815415503D4F9264AFEA7887 -PT=B2813AFBC477618F4C6A436C97AA26F2 - -I=384 -KEY=8AB9F9FC4EE8B2D4AB1A2D637DB60EDA304D78EF0CA8BFE7 -IV=DCF7EF19F68916268A36B9D07BCC0E7C -CT=B2813AFBC477618F4C6A436C97AA26F2 -PT=1E96D52E46B1D73EB00778B203946F28 - -I=385 -KEY=CA9D4CE917399619B58CF84D3B07D9E4804A005D0F3CD0CF -IV=63A112DB63DDECB54024B51559D124CD -CT=1E96D52E46B1D73EB00778B203946F28 -PT=C03D770FE4B1733C5E59DD68F0060D5A - -I=386 -KEY=1D8268F833FC772575B18F42DFB6AAD8DE13DD35FF3ADD95 -IV=8B7AC769F85BA650D71F241124C5E13C -CT=C03D770FE4B1733C5E59DD68F0060D5A -PT=6495A8A3667DEDE2CAB58BA3B2F7034E - -I=387 -KEY=CCCEE884786AF28A112427E1B9CB473A14A656964DCDDEDB -IV=280C5BD88E3B88ACD14C807C4B9685AF -CT=6495A8A3667DEDE2CAB58BA3B2F7034E -PT=4CC3C2AC85EBD619E708988C9FEC60C6 - -I=388 -KEY=8B85284B2B06874D5DE7E54D3C209123F3AECE1AD221BE1D -IV=62E112946391FEFB474BC0CF536C75C7 -CT=4CC3C2AC85EBD619E708988C9FEC60C6 -PT=1522371FD5D53919F52CD97258CEBDA7 - -I=389 -KEY=B2EBBE81CF234A7E48C5D252E9F5A83A068217688AEF03BA -IV=8A936BAE971C0C9F396E96CAE425CD33 -CT=1522371FD5D53919F52CD97258CEBDA7 -PT=4AA882DCB39AA79E8439E9ECE9F4F3BD - -I=390 -KEY=043B9FDDEC299802026D508E5A6F0FA482BBFE84631BF007 -IV=6FA7FCDBA3B1BCA5B6D0215C230AD27C -CT=4AA882DCB39AA79E8439E9ECE9F4F3BD -PT=28C1E45D8D01AD148FA7D7C4F41ACE04 - -I=391 -KEY=1074F9BD3FFD4EAF2AACB4D3D76EA2B00D1C294097013E03 -IV=1210BAF1D69B23FE144F6660D3D4D6AD -CT=28C1E45D8D01AD148FA7D7C4F41ACE04 -PT=3ABE04FC59C3BDF9D7721902DEFCB439 - -I=392 -KEY=D97F3440E3684D291012B02F8EAD1F49DA6E304249FD8A3A -IV=C271800852E147D5C90BCDFDDC950386 -CT=3ABE04FC59C3BDF9D7721902DEFCB439 -PT=3A563A6A047E16123B289B047BB54C4E - -I=393 -KEY=49A10E68A38B02F42A448A458AD3095BE146AB463248C674 -IV=9DB6856C7E01CF3690DE3A2840E34FDD -CT=3A563A6A047E16123B289B047BB54C4E -PT=F8CB54B8D16274E9A20C0F026866E52F - -I=394 -KEY=9DD96DCFD4A1B11FD28FDEFD5BB17DB2434AA4445A2E235B -IV=233C069312D97A03D47863A7772AB3EB -CT=F8CB54B8D16274E9A20C0F026866E52F -PT=0302D25C39BF21F67F1AF2E1951D40F9 - -I=395 -KEY=746E55928D7E549DD18D0CA1620E5C443C5056A5CF3363A2 -IV=B6086C5FEEE9A078E9B7385D59DFE582 -CT=0302D25C39BF21F67F1AF2E1951D40F9 -PT=721192A3A5140DD63D93E0D6ACC4A4B8 - -I=396 -KEY=7E6FC505EAAB07E4A39C9E02C71A519201C3B67363F7C71A -IV=9828A03F0ADCE33E0A01909767D55379 -CT=721192A3A5140DD63D93E0D6ACC4A4B8 -PT=1C0F7440EF41FF18E263392741AD9D8B - -I=397 -KEY=D13AD442CAE026C3BF93EA42285BAE8AE3A08F54225A5A91 -IV=4FC707A846B4469AAF551147204B2127 -CT=1C0F7440EF41FF18E263392741AD9D8B -PT=442F978615AC3983AA5ABEA81AD1ACA6 - -I=398 -KEY=043A4EFFCD44EEB1FBBC7DC43DF7970949FA31FC388BF637 -IV=05D58B4A88A961AFD5009ABD07A4C872 -CT=442F978615AC3983AA5ABEA81AD1ACA6 -PT=E75C29413A33AA1210F36AADEC02FCEE - -I=399 -KEY=81492E2C6296C9341CE0548507C43D1B59095B51D4890AD9 -IV=D89794EAA1791507857360D3AFD22785 -CT=E75C29413A33AA1210F36AADEC02FCEE -PT=6342BFDDD2F6610350458B6695463484 - -========== - -KEYSIZE=256 - -I=0 -KEY=0000000000000000000000000000000000000000000000000000000000000000 -IV=00000000000000000000000000000000 -CT=00000000000000000000000000000000 -PT=4804E1818FE6297519A3E88C57310413 - -I=1 -KEY=098E3797788EA3BCD5477BF1660373944804E1818FE6297519A3E88C57310413 -IV=098E3797788EA3BCD5477BF166037394 -CT=4804E1818FE6297519A3E88C57310413 -PT=D36C27EBB8FA0BC9FA368DF850FD45FB - -I=2 -KEY=D949E143F98BDE24BD40A256F9E369339B68C66A371C22BCE395657407CC41E8 -IV=D0C7D6D481057D986807D9A79FE01AA7 -CT=D36C27EBB8FA0BC9FA368DF850FD45FB -PT=EBCB4DC84155682856D94B442BC597EE - -I=3 -KEY=296352DA0158E197EBC80771EC1ECC7D70A38BA276494A94B54C2E302C09D606 -IV=F02AB399F8D33FB35688A52715FDA54E -CT=EBCB4DC84155682856D94B442BC597EE -PT=23AA6A6B4BE8C04E19707CA330804C4E - -I=4 -KEY=5D3E9E2EA4DEDDB65A58DADB5B9679BC5309E1C93DA18ADAAC3C52931C899A48 -IV=745DCCF4A5863C21B190DDAAB788B5C1 -CT=23AA6A6B4BE8C04E19707CA330804C4E -PT=9B1AA0F33416484BA68740E821F95CD3 - -I=5 -KEY=E35024184CCA14687DB19E13093D2A31C813413A09B7C2910ABB127B3D70C69B -IV=BE6EBA36E814C9DE27E944C852AB538D -CT=9B1AA0F33416484BA68740E821F95CD3 -PT=8A8C6ADF453CB7A2FC4F3690FF7C6F23 - -I=6 -KEY=FDC6EB83FF93BA06DE2D09CB33F05406429F2BE54C8B7533F6F424EBC20CA9B8 -IV=1E96CF9BB359AE6EA39C97D83ACD7E37 -CT=8A8C6ADF453CB7A2FC4F3690FF7C6F23 -PT=B104182A3D85B857FB342BD06063E989 - -I=7 -KEY=7177668BAC9407FB2835524D58F1311EF39B33CF710ECD640DC00F3BA26F4031 -IV=8CB18D085307BDFDF6185B866B016518 -CT=B104182A3D85B857FB342BD06063E989 -PT=68AD7EB507FAEE8FF54E5B7EB4314208 - -I=8 -KEY=790AE8470B39A60E9F32F4025B2251849B364D7A76F423EBF88E5445165E0239 -IV=087D8ECCA7ADA1F5B707A64F03D3609A -CT=68AD7EB507FAEE8FF54E5B7EB4314208 -PT=99736D55B2730FDBC4FCD9128A3E6F06 - -I=9 -KEY=4EAF05AC15913059B6B0E43EFA7ADC1C0245202FC4872C303C728D579C606D3F -IV=37A5EDEB1EA896572982103CA1588D98 -CT=99736D55B2730FDBC4FCD9128A3E6F06 -PT=DF326CEE98EE253C855D171D93AA9455 - -I=10 -KEY=55EE1CCDBA5A04040F4212DFBF6ABC89DD774CC15C69090CB92F9A4A0FCAF96A -IV=1B411961AFCB345DB9F2F6E145106095 -CT=DF326CEE98EE253C855D171D93AA9455 -PT=B4E41BD5257CD7AF0A6F020BEE5F4067 - -I=11 -KEY=6190A91725B7D4E8DD42F3F3B4E42E14699357147915DEA3B3409841E195B90D -IV=347EB5DA9FEDD0ECD200E12C0B8E929D -CT=B4E41BD5257CD7AF0A6F020BEE5F4067 -PT=3608F41CA4C677E74F48B113D9B336B0 - -I=12 -KEY=0A93E973CCBAC75C9C0AA05502A43E945F9BA308DDD3A944FC08295238268FBD -IV=6B034064E90D13B4414853A6B6401080 -CT=3608F41CA4C677E74F48B113D9B336B0 -PT=FB54DBB9C0C7176C4C9E1E4E6688B570 - -I=13 -KEY=584CCAEDD52F491A935D892AD132F75AA4CF78B11D14BE28B096371C5EAE3ACD -IV=52DF239E19958E460F57297FD396C9CE -CT=FB54DBB9C0C7176C4C9E1E4E6688B570 -PT=F40A6A6AE95E9D163D88AAE9A2D359BC - -I=14 -KEY=0DD784E96CAB96D702DD3972E95317FD50C512DBF44A233E8D1E9DF5FC7D6371 -IV=559B4E04B984DFCD9180B0583861E0A7 -CT=F40A6A6AE95E9D163D88AAE9A2D359BC -PT=0FE04B8BB249E49E24FEB6FFE106121C - -I=15 -KEY=2BC3A4EBD80215F0130EC1F76821BC515F2559504603C7A0A9E02B0A1D7B716D -IV=26142002B4A9832711D3F8858172ABAC -CT=0FE04B8BB249E49E24FEB6FFE106121C -PT=EBA4EF8D541919A0D0947359344D61C9 - -I=16 -KEY=0B5856BE9A78457868F7CF9C9C58EF7AB481B6DD121ADE0079745853293610A4 -IV=209BF255427A50887BF90E6BF479532B -CT=EBA4EF8D541919A0D0947359344D61C9 -PT=06484C36A29BD3CA7CBAB7FBEA47313B - -I=17 -KEY=C004F13C83AA1FD5C2A592D27B47C437B2C9FAEBB0810DCA05CEEFA8C371219F -IV=CB5CA78219D25AADAA525D4EE71F2B4D -CT=06484C36A29BD3CA7CBAB7FBEA47313B -PT=376157B7DB3B027980C5EF0E88B3F9EF - -I=18 -KEY=AD89203CAD17908C4F44F3FD2D61505385A8AD5C6BBA0FB3850B00A64BC2D870 -IV=6D8DD1002EBD8F598DE1612F56269464 -CT=376157B7DB3B027980C5EF0E88B3F9EF -PT=756783C2F0EE73BBD81B908F660AA6F7 - -I=19 -KEY=FBE990A6247EABC0CD5090DF0C566E01F0CF2E9E9B547C085D1090292DC87E87 -IV=5660B09A89693B4C8214632221373E52 -CT=756783C2F0EE73BBD81B908F660AA6F7 -PT=6CC64B773ECDFA9749DB33197F7EA0AB - -I=20 -KEY=FEC46AD20DA3E667B26D79B11A82A40F9C0965E9A599869F14CBA33052B6DE2C -IV=052DFA7429DD4DA77F3DE96E16D4CA0E -CT=6CC64B773ECDFA9749DB33197F7EA0AB -PT=9230E4DCA927E2F8E617A2EBC4F11477 - -I=21 -KEY=F4396B035E4E1BD914877124D1CD4B370E3981350CBE6467F2DC01DB9647CA5B -IV=0AFD01D153EDFDBEA6EA0895CB4FEF38 -CT=9230E4DCA927E2F8E617A2EBC4F11477 -PT=6ACD9F3939A86EE4236A3C060D2F5C3C - -I=22 -KEY=49C90E620094D6A85E75BD886FAFE79264F41E0C35160A83D1B63DDD9B689667 -IV=BDF065615EDACD714AF2CCACBE62ACA5 -CT=6ACD9F3939A86EE4236A3C060D2F5C3C -PT=E5F4F050827F69B60B417063AC1060E4 - -I=23 -KEY=1AED4D36938AB2D5D884EF2F106D2CEF8100EE5CB7696335DAF74DBE3778F683 -IV=53244354931E647D86F152A77FC2CB7D -CT=E5F4F050827F69B60B417063AC1060E4 -PT=5CE4B0B3C32700B6B887E05A88EE0239 - -I=24 -KEY=EF14B937F6E0F19AC8ADBD208DD60EE5DDE45EEF744E63836270ADE4BF96F4BA -IV=F5F9F401656A434F1029520F9DBB220A -CT=5CE4B0B3C32700B6B887E05A88EE0239 -PT=4794284E2BB56A47332E84AD7A2006A2 - -I=25 -KEY=182581A233332DDCD43C25AF9AA3AD7F9A7076A15FFB09C4515E2949C5B6F218 -IV=F7313895C5D3DC461C91988F1775A39A -CT=4794284E2BB56A47332E84AD7A2006A2 -PT=C8AE2CAA7C257508C3AB75BE28D2602F - -I=26 -KEY=ABE7FE236E28332AE7A74A9EA03B97A952DE5A0B23DE7CCC92F55CF7ED649237 -IV=B3C27F815D1B1EF6339B6F313A983AD6 -CT=C8AE2CAA7C257508C3AB75BE28D2602F -PT=A9FD4B9D4833B647FF60F8013C3B5B9D - -I=27 -KEY=08248BDC5F9186DCD65DA6344A10C57EFB2311966BEDCA8B6D95A4F6D15FC9AA -IV=A3C375FF31B9B5F631FAECAAEA2B52D7 -CT=A9FD4B9D4833B647FF60F8013C3B5B9D -PT=C871D7B4C0167DCFDD79AF1DEAC49D4F - -I=28 -KEY=BF29FB1B11AA7DB8742FF06458C384853352C622ABFBB744B0EC0BEB3B9B54E5 -IV=B70D70C74E3BFB64A272565012D341FB -CT=C871D7B4C0167DCFDD79AF1DEAC49D4F -PT=E2DE7BAC726C404FC7BA5099E39409CA - -I=29 -KEY=1810253DDF0CC5ECE2381FB4C2BEEDCCD18CBD8ED997F70B77565B72D80F5D2F -IV=A739DE26CEA6B8549617EFD09A7D6949 -CT=E2DE7BAC726C404FC7BA5099E39409CA -PT=D4A8257110EF7FFE2A1F026B28D7483A - -I=30 -KEY=F343D1EC9AEB200B65DB4AA369F6A47E052498FFC97888F55D495919F0D81515 -IV=EB53F4D145E7E5E787E35517AB4849B2 -CT=D4A8257110EF7FFE2A1F026B28D7483A -PT=9EA25895CFEAEAD224095C4687726D06 - -I=31 -KEY=86A93B0F219E1FFEBC0E4BA0334046AA9B86C06A069262277940055F77AA7813 -IV=75EAEAE3BB753FF5D9D501035AB6E2D4 -CT=9EA25895CFEAEAD224095C4687726D06 -PT=5C5DD66E7AD197DA86844D53C8ACEA0E - -I=32 -KEY=2278C61356CB0A951DAE3B6DC76868C9C7DB16047C43F5FDFFC4480CBF06921D -IV=A4D1FD1C7755156BA1A070CDF4282E63 -CT=5C5DD66E7AD197DA86844D53C8ACEA0E -PT=011959D35C8FE620E1C49D1804912F26 - -I=33 -KEY=E1972A31ACF850A22CBC592AF6CAF6F0C6C24FD720CC13DD1E00D514BB97BD3B -IV=C3EFEC22FA335A373112624731A29E39 -CT=011959D35C8FE620E1C49D1804912F26 -PT=895DDA7BB43DC3060B41DA70CAE4D2ED - -I=34 -KEY=BB4A76B5E8FD3820CC5D4A44F527E6704F9F95AC94F1D0DB15410F6471736FD6 -IV=5ADD5C8444056882E0E1136E03ED1080 -CT=895DDA7BB43DC3060B41DA70CAE4D2ED -PT=94E8BBC942B4127A0A8EBEC59319CF57 - -I=35 -KEY=4D98C60F0FA316B2DA3D11CFB3B9FE0CDB772E65D645C2A11FCFB1A1E26AA081 -IV=F6D2B0BAE75E2E9216605B8B469E187C -CT=94E8BBC942B4127A0A8EBEC59319CF57 -PT=274FE85E229321D4A6B2E9D4F0D3830F - -I=36 -KEY=A9FC5AC4A7B3550BC34E4BA94C0D328BFC38C63BF4D6E375B97D587512B9238E -IV=E4649CCBA81043B919735A66FFB4CC87 -CT=274FE85E229321D4A6B2E9D4F0D3830F -PT=256AC08E72D79B0CB7457B26769AC226 - -I=37 -KEY=1C44DEF03398188AC1B2EF6A6E91A33FD95206B5860178790E3823536423E1A8 -IV=B5B88434942B4D8102FCA4C3229C91B4 -CT=256AC08E72D79B0CB7457B26769AC226 -PT=366D17A14CA0FC192DBB731C1C305874 - -I=38 -KEY=3D80B92C01F9721032366B20D97DC097EF3F1114CAA184602383504F7813B9DC -IV=21C467DC32616A9AF384844AB7EC63A8 -CT=366D17A14CA0FC192DBB731C1C305874 -PT=000B4A6054663874ECAE310144BA9377 - -I=39 -KEY=48DD38DC16A4CE76338C95A866C1C795EF345B749EC7BC14CF2D614E3CA92AAB -IV=755D81F0175DBC6601BAFE88BFBC0702 -CT=000B4A6054663874ECAE310144BA9377 -PT=32B32D65566626D794FB296CA816B0A8 - -I=40 -KEY=C62EFA02F23FE796799BF9151FBFD8D7DD877611C8A19AC35BD6482294BF9A03 -IV=8EF3C2DEE49B29E04A176CBD797E1F42 -CT=32B32D65566626D794FB296CA816B0A8 -PT=D743A090101B1BAF5B83E8C06517E193 - -I=41 -KEY=91400A96EEADA906ABD4C3F6863CE4750AC4D681D8BA816C0055A0E2F1A87B90 -IV=576EF0941C924E90D24F3AE399833CA2 -CT=D743A090101B1BAF5B83E8C06517E193 -PT=2DE61760BEE8F811B3FEB44D2C566DB0 - -I=42 -KEY=9983EAD4BF987E39644D7D0963F93DB62722C1E16652797DB3AB14AFDDFE1620 -IV=08C3E0425135D73FCF99BEFFE5C5D9C3 -CT=2DE61760BEE8F811B3FEB44D2C566DB0 -PT=E97598EFFED4128DCCCDD7A04D8405E1 - -I=43 -KEY=B72929D2D02A00D36E7C3BD11CDB9FA4CE57590E98866BF07F66C30F907A13C1 -IV=2EAAC3066FB27EEA0A3146D87F22A212 -CT=E97598EFFED4128DCCCDD7A04D8405E1 -PT=5983276B92B95898302385F5156B6201 - -I=44 -KEY=CC9928E45F7885515986E0D431F3288E97D47E650A3F33684F4546FA851171C0 -IV=7BB001368F52858237FADB052D28B72A -CT=5983276B92B95898302385F5156B6201 -PT=ABDEFF06E04995FD2C5472D05056A0A3 - -I=45 -KEY=59A2D8FCED30176B73FF5642BCE4A9163C0A8163EA76A6956311342AD547D163 -IV=953BF018B248923A2A79B6968D178198 -CT=ABDEFF06E04995FD2C5472D05056A0A3 -PT=E4210D117B05F3EADC8AF75D1A80B823 - -I=46 -KEY=FFCCE373B679DE040165054D9EECA460D82B8C729173557FBF9BC377CFC76940 -IV=A66E3B8F5B49C96F729A530F22080D76 -CT=E4210D117B05F3EADC8AF75D1A80B823 -PT=4786111E1B0F2CA78E43CC0D154BC1EA - -I=47 -KEY=36E29D3C942DBC6A12B53088632260649FAD9D6C8A7C79D831D80F7ADA8CA8AA -IV=C92E7E4F2254626E13D035C5FDCEC404 -CT=4786111E1B0F2CA78E43CC0D154BC1EA -PT=122DC3B40007BA36BC7E7EE808911DAE - -I=48 -KEY=3692660415E53226D2758E60FD6E3F5F8D805ED88A7BC3EE8DA67192D21DB504 -IV=0070FB3881C88E4CC0C0BEE89E4C5F3B -CT=122DC3B40007BA36BC7E7EE808911DAE -PT=5E443EC882C1B938C2A4C412D3A92FDF - -I=49 -KEY=E3C167B38A29EDFBDC37A50F434C7056D3C4601008BA7AD64F02B58001B49ADB -IV=D55301B79FCCDFDD0E422B6FBE224F09 -CT=5E443EC882C1B938C2A4C412D3A92FDF -PT=14A8F43BA8829B134D6BD110E6D43F92 - -I=50 -KEY=8AD38A575E425D347C5B5BFB08A5173CC76C942BA038E1C502696490E760A549 -IV=6912EDE4D46BB0CFA06CFEF44BE9676A -CT=14A8F43BA8829B134D6BD110E6D43F92 -PT=025982911796C2FE34C89157BF2959BD - -I=51 -KEY=AE4ABA37DD2C3C5109B13C3DD9FCB67EC53516BAB7AE233B36A1F5C75849FCF4 -IV=24993060836E616575EA67C6D159A142 -CT=025982911796C2FE34C89157BF2959BD -PT=BC658642A8EEBEC6DBE2A76BCD70799B - -I=52 -KEY=31AC934C58BF87AD1EE4357BBE315175795090F81F409DFDED4352AC9539856F -IV=9FE6297B8593BBFC1755094667CDE70B -CT=BC658642A8EEBEC6DBE2A76BCD70799B -PT=132CE1CC36EFE58A4A53534B962D2D70 - -I=53 -KEY=79F7C18CA600203D404363908749B22F6A7C713429AF7877A71001E70314A81F -IV=485B52C0FEBFA7905EA756EB3978E35A -CT=132CE1CC36EFE58A4A53534B962D2D70 -PT=8D2BA39F08ED00BEB51543C0FCCFA57C - -I=54 -KEY=162A4089A1E46EAB5C9592BF1F98BCC2E757D2AB214278C912054227FFDB0D63 -IV=6FDD810507E44E961CD6F12F98D10EED -CT=8D2BA39F08ED00BEB51543C0FCCFA57C -PT=2E8D05A8A3066094025FE07F3A53A94E - -I=55 -KEY=DB5F33F93F2B795EDA54095937B79E4CC9DAD7038244185D105AA258C588A42D -IV=CD7573709ECF17F586C19BE6282F228E -CT=2E8D05A8A3066094025FE07F3A53A94E -PT=D39EC2261C53AD45F91627E1B1F62D22 - -I=56 -KEY=CCA770427DF8CF5350864D4E86E6D8891A4415259E17B518E94C85B9747E890F -IV=17F843BB42D3B60D8AD24417B15146C5 -CT=D39EC2261C53AD45F91627E1B1F62D22 -PT=F517DC01890C3D300520B6CE343B7F94 - -I=57 -KEY=25F53E7CC6590220E9426296568DE496EF53C924171B8828EC6C33774045F69B -IV=E9524E3EBBA1CD73B9C42FD8D06B3C1F -CT=F517DC01890C3D300520B6CE343B7F94 -PT=ECBCCBB21AC2D07E3ECACD26D42E4444 - -I=58 -KEY=6D4A92C82C6C3D44CED65D76BB33B23E03EF02960DD95856D2A6FE51946BB2DF -IV=48BFACB4EA353F6427943FE0EDBE56A8 -CT=ECBCCBB21AC2D07E3ECACD26D42E4444 -PT=6FF7C241A5FF025FAA8C4DAF5E0950AE - -I=59 -KEY=A3D0AB0A0F8EDF232D111458D3B8B1C66C18C0D7A8265A09782AB3FECA62E271 -IV=CE9A39C223E2E267E3C7492E688B03F8 -CT=6FF7C241A5FF025FAA8C4DAF5E0950AE -PT=3B7E4B74F021F9E995627DE42B03D7D8 - -I=60 -KEY=A8E2D59CF188CDA75C80FA49889F7EE357668BA35807A3E0ED48CE1AE16135A9 -IV=0B327E96FE0612847191EE115B27CF25 -CT=3B7E4B74F021F9E995627DE42B03D7D8 -PT=6759C15ED1049A51953E814C2445F3C6 - -I=61 -KEY=092010B28BD3C8E59D09CE85169190BB303F4AFD890339B178764F56C524C66F -IV=A1C2C52E7A5B0542C18934CC9E0EEE58 -CT=6759C15ED1049A51953E814C2445F3C6 -PT=05F681CB7984491E2CE5B1025F860BEB - -I=62 -KEY=538E3068E1059FE89C27D5F19405274835C9CB36F08770AF5493FE549AA2CD84 -IV=5AAE20DA6AD6570D012E1B748294B7F3 -CT=05F681CB7984491E2CE5B1025F860BEB -PT=E046F5B143CEEAC44EF520F2C3BFA96E - -I=63 -KEY=78B5D2551099875910844A17ABBACD64D58F3E87B3499A6B1A66DEA6591D64EA -IV=2B3BE23DF19C18B18CA39FE63FBFEA2C -CT=E046F5B143CEEAC44EF520F2C3BFA96E -PT=0F508DD1BCC6C520A81AE7EC75361179 - -I=64 -KEY=8D6E7E66F496C358A369EF7C49D117A3DADFB3560F8F5F4BB27C394A2C2B7593 -IV=F5DBAC33E40F4401B3EDA56BE26BDAC7 -CT=0F508DD1BCC6C520A81AE7EC75361179 -PT=BAE114FFF19FD11336D454BF0FF6954D - -I=65 -KEY=781164DD6F90037E9896672FD24F1AF6603EA7A9FE108E5884A86DF523DDE0DE -IV=F57F1ABB9B06C0263BFF88539B9E0D55 -CT=BAE114FFF19FD11336D454BF0FF6954D -PT=FE73CE62C227459729E8FDC9116EC6BB - -I=66 -KEY=9268D6C0E8DE5AFBCCE137EADE6293E49E4D69CB3C37CBCFAD40903C32B32665 -IV=EA79B21D874E5985547750C50C2D8912 -CT=FE73CE62C227459729E8FDC9116EC6BB -PT=B13971219C12C12A8308213759196B0D - -I=67 -KEY=701EB5AEF8262D8634B53AF1768ED68E2F7418EAA0250AE52E48B10B6BAA4D68 -IV=E276636E10F8777DF8540D1BA8EC456A -CT=B13971219C12C12A8308213759196B0D -PT=4F5A36173C16ED45F5D36B9D1AED84FF - -I=68 -KEY=40D027792516E1FE962F63B9C939677C602E2EFD9C33E7A0DB9BDA967147C997 -IV=30CE92D7DD30CC78A29A5948BFB7B1F2 -CT=4F5A36173C16ED45F5D36B9D1AED84FF -PT=9FB89D6FEFE606058FE40B5492643596 - -I=69 -KEY=CAAFC0DD2E4FC86AC19B40BC34F14630FF96B39273D5E1A5547FD1C2E323FC01 -IV=8A7FE7A40B59299457B42305FDC8214C -CT=9FB89D6FEFE606058FE40B5492643596 -PT=F6D0717F197CBAE383B55117FCBE07AC - -I=70 -KEY=CE03D67B6DAB9CFAA0C20129475620230946C2ED6AA95B46D7CA80D51F9DFBAD -IV=04AC16A643E454906159419573A76613 -CT=F6D0717F197CBAE383B55117FCBE07AC -PT=7747114FF82F8C7568BE51912CFDB51A - -I=71 -KEY=DDCEDD32E5F0D26F7707DAE453288B537E01D3A29286D733BF74D14433604EB7 -IV=13CD0B49885B4E95D7C5DBCD147EAB70 -CT=7747114FF82F8C7568BE51912CFDB51A -PT=E75313A8DFA7EB0AD1664B14D2DBE284 - -I=72 -KEY=6B032958C3379BD4BEC22CD4271EB4589952C00A4D213C396E129A50E1BBAC33 -IV=B6CDF46A26C749BBC9C5F63074363F0B -CT=E75313A8DFA7EB0AD1664B14D2DBE284 -PT=42FEDBDC4F0BD11DA42163D76E952DC7 - -I=73 -KEY=1710F6CF86EDB5F1364F19CA676ED69BDBAC1BD6022AED24CA33F9878F2E81F4 -IV=7C13DF9745DA2E25888D351E407062C3 -CT=42FEDBDC4F0BD11DA42163D76E952DC7 -PT=6E0166BA404B3AEFACCA8E972F087EA5 - -I=74 -KEY=9D9711F138D0C2D1003E2C99BB0F0447B5AD7D6C4261D7CB66F97710A026FF51 -IV=8A87E73EBE3D772036713553DC61D2DC -CT=6E0166BA404B3AEFACCA8E972F087EA5 -PT=644A1DCFCA2EC01C3E8911768837D99E - -I=75 -KEY=1BD7E446FADA5507ECE26BBB635045E7D1E760A3884F17D758706666281126CF -IV=8640F5B7C20A97D6ECDC4722D85F41A0 -CT=644A1DCFCA2EC01C3E8911768837D99E -PT=4E69AE75BD37DB8024DBD1A11D6D414E - -I=76 -KEY=3454FD4B259FB4C086288ADAFF6464CD9F8ECED63578CC577CABB7C7357C6781 -IV=2F83190DDF45E1C76ACAE1619C34212A -CT=4E69AE75BD37DB8024DBD1A11D6D414E -PT=F63964784AD35374EAFC933AC11A48B6 - -I=77 -KEY=97EFD593918FB16F2D6889C118C5ED4469B7AAAE7FAB9F23965724FDF4662F37 -IV=A3BB28D8B41005AFAB40031BE7A18989 -CT=F63964784AD35374EAFC933AC11A48B6 -PT=51CBF7F67A22DA909567D67F1919ECEF - -I=78 -KEY=481E90BC31903905C08D0E5AEF79A514387C5D58058945B30330F282ED7FC3D8 -IV=DFF1452FA01F886AEDE5879BF7BC4850 -CT=51CBF7F67A22DA909567D67F1919ECEF -PT=9AE181DE8DB65E7E242926091A17D0B1 - -I=79 -KEY=35A4F86146CED63BDCB485B0AE4C205AA29DDC86883F1BCD2719D48BF7681369 -IV=7DBA68DD775EEF3E1C398BEA4135854E -CT=9AE181DE8DB65E7E242926091A17D0B1 -PT=47E15B5AC96A7FDB805F3B8862D9055F - -I=80 -KEY=5ECF20C5884FDF95C2B7C17D40CD6923E57C87DC41556416A746EF0395B11636 -IV=6B6BD8A4CE8109AE1E0344CDEE814979 -CT=47E15B5AC96A7FDB805F3B8862D9055F -PT=1806C474A1ECE5D8183E725804FB92C3 - -I=81 -KEY=AC473047ADF97E75C100CBBD73FA0892FD7A43A8E0B981CEBF789D5B914A84F5 -IV=F288108225B6A1E003B70AC0333761B1 -CT=1806C474A1ECE5D8183E725804FB92C3 -PT=0A0615424DAD4EFC25EC43B13C672727 - -I=82 -KEY=6620AE39484EDD0EC21A3E3F659537DDF77C56EAAD14CF329A94DEEAAD2DA3D2 -IV=CA679E7EE5B7A37B031AF582166F3F4F -CT=0A0615424DAD4EFC25EC43B13C672727 -PT=551639A520D0D043CAD42CB02900D5EF - -I=83 -KEY=04D696BB056CC59492B376CB3A0286EAA26A6F4F8DC41F715040F25A842D763D -IV=62F638824D22189A50A948F45F97B137 -CT=551639A520D0D043CAD42CB02900D5EF -PT=DF906B0E72FEACC9B45381B992E23A5A - -I=84 -KEY=0AED1F2A6660BDBA660E00137E38C1C97DFA0441FF3AB3B8E41373E316CF4C67 -IV=0E3B8991630C782EF4BD76D8443A4723 -CT=DF906B0E72FEACC9B45381B992E23A5A -PT=D477C6287D05C0F83B27B1FD91F5F908 - -I=85 -KEY=E0A51B848A913A860FD2C39941C8C3A1A98DC269823F7340DF34C21E873AB56F -IV=EA4804AEECF1873C69DCC38A3FF00268 -CT=D477C6287D05C0F83B27B1FD91F5F908 -PT=6AB7E109C085B0BA7C8A8B76482F9C80 - -I=86 -KEY=A8B0500EC0292EF668A03E8293E235BAC33A236042BAC3FAA3BE4968CF1529EF -IV=48154B8A4AB814706772FD1BD22AF61B -CT=6AB7E109C085B0BA7C8A8B76482F9C80 -PT=71A31000A5763A0C79B6353E39FFBE84 - -I=87 -KEY=34C53C34901B693F4611F20F1DD5125EB2993360E7CCF9F6DA087C56F6EA976B -IV=9C756C3A503247C92EB1CC8D8E3727E4 -CT=71A31000A5763A0C79B6353E39FFBE84 -PT=B5B377EBEBC0B32A5A0C7E2A2504C32A - -I=88 -KEY=A13850B9164EF60EB77E06819605AC01072A448B0C0C4ADC8004027CD3EE5441 -IV=95FD6C8D86559F31F16FF48E8BD0BE5F -CT=B5B377EBEBC0B32A5A0C7E2A2504C32A -PT=B74459D1E7C5CF9106C362572FE9C917 - -I=89 -KEY=37261F6D588FF9028A23319CE02DDA71B06E1D5AEBC9854D86C7602BFC079D56 -IV=961E4FD44EC10F0C3D5D371D76287670 -CT=B74459D1E7C5CF9106C362572FE9C917 -PT=5777A0854A6E00DB0B6B199BDD35447A - -I=90 -KEY=085A7B276E58B9175204A87D74B9E78AE719BDDFA1A785968DAC79B02132D92C -IV=3F7C644A36D74015D82799E194943DFB -CT=5777A0854A6E00DB0B6B199BDD35447A -PT=01CC73B6EE44403DFED2C91D6F0DC441 - -I=91 -KEY=61DC99DD0C1470F511D79DCC2541002AE6D5CE694FE3C5AB737EB0AD4E3F1D6D -IV=6986E2FA624CC9E243D335B151F8E7A0 -CT=01CC73B6EE44403DFED2C91D6F0DC441 -PT=8993161CF3E75DE836BB2C1955581DB6 - -I=92 -KEY=AEB68207F1E4395794BA7E28CE9BF7996F46D875BC04984345C59CB41B6700DB -IV=CF6A1BDAFDF049A2856DE3E4EBDAF7B3 -CT=8993161CF3E75DE836BB2C1955581DB6 -PT=2A4D6929ED3A66E71EFC40F1840CD649 - -I=93 -KEY=DBF8A8AED7B6D7BCFD1B5BEEC3F01AC0450BB15C513EFEA45B39DC459F6BD692 -IV=754E2AA92652EEEB69A125C60D6BED59 -CT=2A4D6929ED3A66E71EFC40F1840CD649 -PT=596CE09B1176A9FB5A9973086A0E4C12 - -I=94 -KEY=1A61C7F2FB652E256190C0896F800CD61C6751C74048575F01A0AF4DF5659A80 -IV=C1996F5C2CD3F9999C8B9B67AC701616 -CT=596CE09B1176A9FB5A9973086A0E4C12 -PT=B57AC41360C13F6831689C311BD0ED2C - -I=95 -KEY=FC3828E6A9487698231D11C10C353F2DA91D95D42089683730C8337CEEB577AC -IV=E659EF14522D58BD428DD14863B533FB -CT=B57AC41360C13F6831689C311BD0ED2C -PT=F58AA69EEBF25943C728FA26524DE154 - -I=96 -KEY=9D16CAD42D19D1A3B9CB12566745B2765C97334ACB7B3174F7E0C95ABCF896F8 -IV=612EE2328451A73B9AD603976B708D5B -CT=F58AA69EEBF25943C728FA26524DE154 -PT=4A678FED6C5E5898A47F2DFE9DF71DF2 - -I=97 -KEY=D9A8554717435E69EFD4A617CA70B0D216F0BCA7A72569EC539FE4A4210F8B0A -IV=44BE9F933A5A8FCA561FB441AD3502A4 -CT=4A678FED6C5E5898A47F2DFE9DF71DF2 -PT=38011537A04E6C4A81510899741F2FFC - -I=98 -KEY=AA9D9A7B4E187F8D78AAEE11967A20A42EF1A990076B05A6D2CEEC3D5510A4F6 -IV=7335CF3C595B21E4977E48065C0A9076 -CT=38011537A04E6C4A81510899741F2FFC -PT=6472060F536BC5F83A3C247F63C3580E - -I=99 -KEY=90A5D8CD93F0AE068E8DC72CA5DD6E184A83AF9F5400C05EE8F2C84236D3FCF8 -IV=3A3842B6DDE8D18BF627293D33A74EBC -CT=6472060F536BC5F83A3C247F63C3580E -PT=08B99B59D0584DAC0412796871FE3F27 - -I=100 -KEY=489520777A18D5BF65B85AAEA29DB3D8423A34C684588DF2ECE0B12A472DC3DF -IV=D830F8BAE9E87BB9EB359D820740DDC0 -CT=08B99B59D0584DAC0412796871FE3F27 -PT=E8B8579DF9E918B3D24C18E17068AD66 - -I=101 -KEY=69542EE000ACEEFB5E0EB471F3CD0927AA82635B7DB195413EACA9CB37456EB9 -IV=21C10E977AB43B443BB6EEDF5150BAFF -CT=E8B8579DF9E918B3D24C18E17068AD66 -PT=9B6C3234993F6900B3E572B5A43CA644 - -I=102 -KEY=E88C863186548F35DF6EFB48743B7C1831EE516FE48EFC418D49DB7E9379C8FD -IV=81D8A8D186F861CE81604F3987F6753F -CT=9B6C3234993F6900B3E572B5A43CA644 -PT=E0A2962A02698489813292D33D02D0AB - -I=103 -KEY=C9DD7904D060B79B83F97A1FC93E50DED14CC745E6E778C80C7B49ADAE7B1856 -IV=2151FF35563438AE5C978157BD052CC6 -CT=E0A2962A02698489813292D33D02D0AB -PT=10C80B22D8EC54B855E103D6B76C03BC - -I=104 -KEY=D208B7A87003A507561FA5C7422A85C5C184CC673E0B2C70599A4A7B19171BEA -IV=1BD5CEACA063129CD5E6DFD88B14D51B -CT=10C80B22D8EC54B855E103D6B76C03BC -PT=CE88B76CC2223EB68BA9B5852C1921DB - -I=105 -KEY=27B0E1BF8EA57E8AD51BC3FA278369780F0C7B0BFC2912C6D233FFFE350E3A31 -IV=F5B85617FEA6DB8D8304663D65A9ECBD -CT=CE88B76CC2223EB68BA9B5852C1921DB -PT=00401EEE034A193C86A23152AF4B767E - -I=106 -KEY=45E37A710D9E754EE90B7C1DBB894DC20F4C65E5FF630BFA5491CEAC9A454C4F -IV=62539BCE833B0BC43C10BFE79C0A24BA -CT=00401EEE034A193C86A23152AF4B767E -PT=CEF1DC8A618BF71C68720E6EEDE31EEF - -I=107 -KEY=B432E78F49D50B045C8B598EEA3D4142C1BDB96F9EE8FCE63CE3C0C277A652A0 -IV=F1D19DFE444B7E4AB580259351B40C80 -CT=CEF1DC8A618BF71C68720E6EEDE31EEF -PT=EF8FB3790627F31E5CBF21B31FF942DE - -I=108 -KEY=F5CE9C0AF13DA60D32912620673AEE572E320A1698CF0FF8605CE171685F107E -IV=41FC7B85B8E8AD096E1A7FAE8D07AF15 -CT=EF8FB3790627F31E5CBF21B31FF942DE -PT=2EF1C697D948D712AA177855B0D56650 - -I=109 -KEY=DA14D71084F47D87385EF58128C7517F00C3CC814187D8EACA4B9924D88A762E -IV=2FDA4B1A75C9DB8A0ACFD3A14FFDBF28 -CT=2EF1C697D948D712AA177855B0D56650 -PT=0A20E82375680D134FE05AC74E3A0217 - -I=110 -KEY=B68F8C980984E2508E9706117256A4A70AE324A234EFD5F985ABC3E396B07439 -IV=6C9B5B888D709FD7B6C9F3905A91F5D8 -CT=0A20E82375680D134FE05AC74E3A0217 -PT=46AF886AB871A3DABDEB32F1738E180B - -I=111 -KEY=078A8955ECB2F6ACB249E2DB36B660794C4CACC88C9E76233840F112E53E6C32 -IV=B10505CDE53614FC3CDEE4CA44E0C4DE -CT=46AF886AB871A3DABDEB32F1738E180B -PT=79949181E3D20A3042C1E7BDAE73330B - -I=112 -KEY=7CB2A8360EE65417A979D9B5D4A32D2935D83D496F4C7C137A8116AF4B4D5F39 -IV=7B382163E254A2BB1B303B6EE2154D50 -CT=79949181E3D20A3042C1E7BDAE73330B -PT=12C5E55F6EA47BC44392AE9FB888C1FB - -I=113 -KEY=E5835F97C4FF1B007D695DD0E72324A9271DD81601E807D73913B830F3C59EC2 -IV=9931F7A1CA194F17D410846533800980 -CT=12C5E55F6EA47BC44392AE9FB888C1FB -PT=FCA15AB64A01FA6E89FE41F72A67D9E8 - -I=114 -KEY=50932FF04CCCE411AA0541726C1C4CD7DBBC82A04BE9FDB9B0EDF9C7D9A2472A -IV=B51070678833FF11D76C1CA28B3F687E -CT=FCA15AB64A01FA6E89FE41F72A67D9E8 -PT=7B75EC39F707C3C90691BE561AD5CAC6 - -I=115 -KEY=ECAEC5FD6AF5F7DF2587C1A40CB046ADA0C96E99BCEE3E70B67C4791C3778DEC -IV=BC3DEA0D263913CE8F8280D660AC0A7A -CT=7B75EC39F707C3C90691BE561AD5CAC6 -PT=1D3D15FFA0B69EFA8E146301411DFA49 - -I=116 -KEY=82F88C3850CC3D111C2125F34840A9A2BDF47B661C58A08A38682490826A77A5 -IV=6E5649C53A39CACE39A6E45744F0EF0F -CT=1D3D15FFA0B69EFA8E146301411DFA49 -PT=34AFB3D6F0BD9ACB6954BB96B1067F9E - -I=117 -KEY=702FEC9E7F0D2369FF35D4B7A1269AD3895BC8B0ECE53A41513C9F06336C083B -IV=F2D760A62FC11E78E314F144E9663371 -CT=34AFB3D6F0BD9ACB6954BB96B1067F9E -PT=899E4C8192661CCA7C73CDFBC3DCA2F3 - -I=118 -KEY=A1DF98E4585C1A4C15C42AD0782C925000C584317E83268B2D4F52FDF0B0AAC8 -IV=D1F0747A27513925EAF1FE67D90A0883 -CT=899E4C8192661CCA7C73CDFBC3DCA2F3 -PT=3097C0413291E217FB0E3A8A2D908C12 - -I=119 -KEY=9F9082177BF33D8AF6131018E1EFD49F305244704C12C49CD6416877DD2026DA -IV=3E4F1AF323AF27C6E3D73AC899C346CF -CT=3097C0413291E217FB0E3A8A2D908C12 -PT=6C71968295905F881F95DC8BA481CA72 - -I=120 -KEY=B7E5B267EDBFFD4DB4526BA2A1978C105C23D2F2D9829B14C9D4B4FC79A1ECA8 -IV=28753070964CC0C742417BBA4078588F -CT=6C71968295905F881F95DC8BA481CA72 -PT=96D0AB98DBD0CB94A68FC41BEF0B418D - -I=121 -KEY=127FAA6C94663FA9008A1FB7A419C036CAF3796A025250806F5B70E796AAAD25 -IV=A59A180B79D9C2E4B4D87415058E4C26 -CT=96D0AB98DBD0CB94A68FC41BEF0B418D -PT=9E3E4428A911FB328A9F89D7D5E527DB - -I=122 -KEY=1B9493F07E7E5F07473E6997AE15CCDC54CD3D42AB43ABB2E5C4F930434F8AFE -IV=09EB399CEA1860AE47B476200A0C0CEA -CT=9E3E4428A911FB328A9F89D7D5E527DB -PT=0DB5EF3481A9945BAF2E499B5CDE8DDC - -I=123 -KEY=7B2B8201EEF1601C44006A6D7E06EE355978D2762AEA3FE94AEAB0AB1F910722 -IV=60BF11F1908F3F1B033E03FAD01322E9 -CT=0DB5EF3481A9945BAF2E499B5CDE8DDC -PT=C0569DD7DCAE99859D3987B04FFD8CF0 - -I=124 -KEY=B2D7FEE25A564FA00CEDC8E05BAC7F7D992E4FA1F644A66CD7D3371B506C8BD2 -IV=C9FC7CE3B4A72FBC48EDA28D25AA9148 -CT=C0569DD7DCAE99859D3987B04FFD8CF0 -PT=D8AF74B5BB8E632299D32E8DD4DDA012 - -I=125 -KEY=5A06C176A290538BC549CAA8041539A941813B144DCAC54E4E00199684B12BC0 -IV=E8D13F94F8C61C2BC9A402485FB946D4 -CT=D8AF74B5BB8E632299D32E8DD4DDA012 -PT=0821FB911EDE8CDCD97DDAEDCCDB7B1C - -I=126 -KEY=1318D23A3A966D16FDEEE300571F3A8549A0C08553144992977DC37B486A50DC -IV=491E134C98063E9D38A729A8530A032C -CT=0821FB911EDE8CDCD97DDAEDCCDB7B1C -PT=BCB2831AF3721C020FC1D683C19AEBEA - -I=127 -KEY=D6D24AA79B3CA4434CCE2B1470B4FE18F512439FA066559098BC15F889F0BB36 -IV=C5CA989DA1AAC955B120C81427ABC49D -CT=BCB2831AF3721C020FC1D683C19AEBEA -PT=BE869BB3C18EB622CCAC81B6F5B62CC4 - -I=128 -KEY=5F62348BCD9ADB23A19E683400D968404B94D82C61E8E3B25410944E7C4697F2 -IV=89B07E2C56A67F60ED504320706D9658 -CT=BE869BB3C18EB622CCAC81B6F5B62CC4 -PT=C8D3EDD549FEA614B4F2348F82DE5531 - -I=129 -KEY=A64795E417B7C9344185F6B0C66C096B834735F9281645A6E0E2A0C1FE98C2C3 -IV=F925A16FDA2D1217E01B9E84C6B5612B -CT=C8D3EDD549FEA614B4F2348F82DE5531 -PT=4049BDBD9C302D8F2E06F10D34317784 - -I=130 -KEY=CD1F9AB35436014B0CF7ECE9FF98C2BDC30E8844B4266829CEE451CCCAA9B547 -IV=6B580F574381C87F4D721A5939F4CBD6 -CT=4049BDBD9C302D8F2E06F10D34317784 -PT=E1338EA5C5462E8C458E5546FA60324D - -I=131 -KEY=78F7558C14BB5100CE93CD49C22BE2D9223D06E1716046A58B6A048A30C9870A -IV=B5E8CF3F408D504BC26421A03DB32064 -CT=E1338EA5C5462E8C458E5546FA60324D -PT=055984AA929F4D45F5812DC719D4EF24 - -I=132 -KEY=2DBC5092C4C7AB427576EBA2855E00562764824BE3FF0BE07EEB294D291D682E -IV=554B051ED07CFA42BBE526EB4775E28F -CT=055984AA929F4D45F5812DC719D4EF24 -PT=ABC519C4290C69D98BF7AC2A56767202 - -I=133 -KEY=68FA1D8FE36FC5B48A7486FBB34A7B598CA19B8FCAF36239F51C85677F6B1A2C -IV=45464D1D27A86EF6FF026D5936147B0F -CT=ABC519C4290C69D98BF7AC2A56767202 -PT=C825E44799B1739A1F4CB406BBEABEDD - -I=134 -KEY=A2302849850FD33D4048B898DB6C7B0244847FC8534211A3EA503161C481A4F1 -IV=CACA35C666601689CA3C3E636826005B -CT=C825E44799B1739A1F4CB406BBEABEDD -PT=D24EE8D56CE09AFE1061B4016ADD61F7 - -I=135 -KEY=9B2E669EA4BB938072E6E97B0ACF834E96CA971D3FA28B5DFA318560AE5CC506 -IV=391E4ED721B440BD32AE51E3D1A3F84C -CT=D24EE8D56CE09AFE1061B4016ADD61F7 -PT=50FECB118EABF93BB97102E9212C883D - -I=136 -KEY=A07C5EBAC9D0F862AD525C76460B4BA9C6345C0CB1097266434087898F704D3B -IV=3B5238246D6B6BE2DFB4B50D4CC4C8E7 -CT=50FECB118EABF93BB97102E9212C883D -PT=C370C26BD3805211A4679399DFA4DDCB - -I=137 -KEY=414C776222058D6285574741B2B4D11D05449E6762892077E727141050D490F0 -IV=E13029D8EBD5750028051B37F4BF9AB4 -CT=C370C26BD3805211A4679399DFA4DDCB -PT=79715A04DF9216268C77A152CA96C2F6 - -I=138 -KEY=5E54A416470FE8BA263C0FC88FD884297C35C463BD1B36516B50B5429A425206 -IV=1F18D374650A65D8A36B48893D6C5534 -CT=79715A04DF9216268C77A152CA96C2F6 -PT=06DF18B5FAF35F03FE22E39CAE430655 - -I=139 -KEY=98C55CFFB53FA72345EF936283F64BB17AEADCD647E86952957256DE34015453 -IV=C691F8E9F2304F9963D39CAA0C2ECF98 -CT=06DF18B5FAF35F03FE22E39CAE430655 -PT=1AED42EB32C4BAEAF9946818AA00C324 - -I=140 -KEY=B8332B1EE5D6A4E1BBFA20AEAE22330560079E3D752CD3B86CE63EC69E019777 -IV=20F677E150E903C2FE15B3CC2DD478B4 -CT=1AED42EB32C4BAEAF9946818AA00C324 -PT=D276B6A6D480165A944572EF76D4B3E8 - -I=141 -KEY=6E50753A2A0814A778FA2BC773C6A7A2B271289BA1ACC5E2F8A34C29E8D5249F -IV=D6635E24CFDEB046C3000B69DDE494A7 -CT=D276B6A6D480165A944572EF76D4B3E8 -PT=BA46F59DFADC6CA2CBB7D80E33D7B24B - -I=142 -KEY=D8E1763EAD728AB8AA2284964BE586880837DD065B70A94033149427DB0296D4 -IV=B6B10304877A9E1FD2D8AF513823212A -CT=BA46F59DFADC6CA2CBB7D80E33D7B24B -PT=FC9B9F7B5120E1D8B2DD58D211EFF053 - -I=143 -KEY=458CB146C73342F9D5EE4364C400E8E5F4AC427D0A50489881C9CCF5CAED6687 -IV=9D6DC7786A41C8417FCCC7F28FE56E6D -CT=FC9B9F7B5120E1D8B2DD58D211EFF053 -PT=6AD8BCAEFF6F0BF9F360FF601C9B7A43 - -I=144 -KEY=F1FBE00DA1F634ACACB6E2F4F15C11179E74FED3F53F436172A93395D6761CC4 -IV=B477514B66C576557958A190355CF9F2 -CT=6AD8BCAEFF6F0BF9F360FF601C9B7A43 -PT=BB6E45D060E186323AC2B50CFB988856 - -I=145 -KEY=3FBC35054FFF43657936BB676A5C5D1F251ABB0395DEC553486B86992DEE9492 -IV=CE47D508EE0977C9D58059939B004C08 -CT=BB6E45D060E186323AC2B50CFB988856 -PT=31B6157397933EE35DEE5B40FE7237BB - -I=146 -KEY=D49B4E96F8FC2D91FBED3985C53BEB8314ACAE70024DFBB01585DDD9D39CA329 -IV=EB277B93B7036EF482DB82E2AF67B69C -CT=31B6157397933EE35DEE5B40FE7237BB -PT=EFEB82ED91C5C60FB8F910542804B57B - -I=147 -KEY=8D4ABC926827F066B4391FF4B3D6EC99FB472C9D93883DBFAD7CCD8DFB981652 -IV=59D1F20490DBDDF74FD4267176ED071A -CT=EFEB82ED91C5C60FB8F910542804B57B -PT=E30D071737AB9991F000302502BE84A6 - -I=148 -KEY=086A14365F781B2FAF533B1534F458D2184A2B8AA423A42E5D7CFDA8F92692F4 -IV=8520A8A4375FEB491B6A24E18722B44B -CT=E30D071737AB9991F000302502BE84A6 -PT=856AF9DF9A9FE5038B75C98E0E1C720F - -I=149 -KEY=A64DE8CF2DF04ADB60E88C769F7025BC9D20D2553EBC412DD6093426F73AE0FB -IV=AE27FCF9728851F4CFBBB763AB847D6E -CT=856AF9DF9A9FE5038B75C98E0E1C720F -PT=D84910F298F91E081480A912B1AF32D6 - -I=150 -KEY=C52575277A0BD189E2F746FC51CA77844569C2A7A6455F25C2899D344695D22D -IV=63689DE857FB9B52821FCA8ACEBA5238 -CT=D84910F298F91E081480A912B1AF32D6 -PT=57E4A4A2D639D414ED7F82583B4FFA52 - -I=151 -KEY=CB9A5219490F7EE31B030ECE521C589B128D6605707C8B312FF61F6C7DDA287F -IV=0EBF273E3304AF6AF9F4483203D62F1F -CT=57E4A4A2D639D414ED7F82583B4FFA52 -PT=1CECC8218392F2047C0B70BEBFCC5846 - -I=152 -KEY=AA6412AAC8FC309E6BCDFFD1DA01B6470E61AE24F3EE793553FD6FD2C2167039 -IV=61FE40B381F34E7D70CEF11F881DEEDC -CT=1CECC8218392F2047C0B70BEBFCC5846 -PT=EC2B86A04DB2B4F41830E5EA035531E3 - -I=153 -KEY=EFF5BC892E47F4C7EA859969255AC665E24A2884BE5CCDC14BCD8A38C14341DA -IV=4591AE23E6BBC459814866B8FF5B7022 -CT=EC2B86A04DB2B4F41830E5EA035531E3 -PT=8A1A8EE6E08F61E99FC37AC177881C8A - -I=154 -KEY=D62E9405D7402765E30FDAD7A29B2E716850A6625ED3AC28D40EF0F9B6CB5D50 -IV=39DB288CF907D3A2098A43BE87C1E814 -CT=8A1A8EE6E08F61E99FC37AC177881C8A -PT=F21583AC8C5F03C19A1A9B856C97D6E0 - -I=155 -KEY=D49F229B7DB6973EDE6BD14AB20234379A4525CED28CAFE94E146B7CDA5C8BB0 -IV=02B1B69EAAF6B05B3D640B9D10991A46 -CT=F21583AC8C5F03C19A1A9B856C97D6E0 -PT=323191D5997CF0424B7F5501CBD55B17 - -I=156 -KEY=08B1021CD316864EF5B370CBF891FD27A874B41B4BF05FAB056B3E7D1189D0A7 -IV=DC2E2087AEA011702BD8A1814A93C910 -CT=323191D5997CF0424B7F5501CBD55B17 -PT=B2BBCC6E54CB33319536A81174B0D73B - -I=157 -KEY=786AE1D89ECC32C8883D984E7DC5FD0A1ACF78751F3B6C9A905D966C6539079C -IV=70DBE3C44DDAB4867D8EE8858554002D -CT=B2BBCC6E54CB33319536A81174B0D73B -PT=6E4ADDA6895734D891F328C6D0C71467 - -I=158 -KEY=E6C7441B75AF8701E29376287A126CB07485A5D3966C584201AEBEAAB5FE13FB -IV=9EADA5C3EB63B5C96AAEEE6607D791BA -CT=6E4ADDA6895734D891F328C6D0C71467 -PT=8BED3D2AAB5271F90EE5335520E87AA2 - -I=159 -KEY=22D515400072783951742ACDF2FA6DC8FF6898F93D3E29BB0F4B8DFF95166959 -IV=C412515B75DDFF38B3E75CE588E80178 -CT=8BED3D2AAB5271F90EE5335520E87AA2 -PT=D3059CA1B293AA1F52D459643C5FAB5C - -I=160 -KEY=D6E6A383AF38A1CD2889A5F79A23CE512C6D04588FAD83A45D9FD49BA949C205 -IV=F433B6C3AF4AD9F479FD8F3A68D9A399 -CT=D3059CA1B293AA1F52D459643C5FAB5C -PT=C20D8580ACA043B0ED2F409EEA42C0F0 - -I=161 -KEY=AA95A47ADECB61AAD1A05DA0CE6B17BDEE6081D8230DC014B0B09405430B02F5 -IV=7C7307F971F3C067F929F8575448D9EC -CT=C20D8580ACA043B0ED2F409EEA42C0F0 -PT=61C0D0081F176C53DE83B70608201EE6 - -I=162 -KEY=168A56A528A70354AD74C59A8AF33A508FA051D03C1AAC476E3323034B2B1C13 -IV=BC1FF2DFF66C62FE7CD4983A44982DED -CT=61C0D0081F176C53DE83B70608201EE6 -PT=C016536FEFC08B69867AB2946FFBE011 - -I=163 -KEY=92157F38953622D8C0E191DAC4179A6A4FB602BFD3DA272EE849919724D0FC02 -IV=849F299DBD91218C6D9554404EE4A03A -CT=C016536FEFC08B69867AB2946FFBE011 -PT=6923FF03C812710270438F67EF2F42D1 - -I=164 -KEY=CCB6779947D31DF17182FB54555B49422695FDBC1BC8562C980A1EF0CBFFBED3 -IV=5EA308A1D2E53F29B1636A8E914CD328 -CT=6923FF03C812710270438F67EF2F42D1 -PT=0D1674014AD9DC2150E073E2FCF006A8 - -I=165 -KEY=22AA52C07B42CFEB5E75687D395D86092B8389BD51118A0DC8EA6D12370FB87B -IV=EE1C25593C91D21A2FF793296C06CF4B -CT=0D1674014AD9DC2150E073E2FCF006A8 -PT=6399A65CC66E9318F2CEE1103B8FFB90 - -I=166 -KEY=527EF084271AC57F5D33F2E7C7BE1FF1481A2FE1977F19153A248C020C8043EB -IV=70D4A2445C580A9403469A9AFEE399F8 -CT=6399A65CC66E9318F2CEE1103B8FFB90 -PT=511CBDD6CFA31788A43C765301D6BAAB - -I=167 -KEY=D826E762C9EA31B6F4415B3AE5ED888B1906923758DC0E9D9E18FA510D56F940 -IV=8A5817E6EEF0F4C9A972A9DD2253977A -CT=511CBDD6CFA31788A43C765301D6BAAB -PT=B04E78AB18AE3F5B825087D9D5794BD7 - -I=168 -KEY=B4C2DEE60A738C428B187EC3A3A4A982A948EA9C407231C61C487D88D82FB297 -IV=6CE43984C399BDF47F5925F946492109 -CT=B04E78AB18AE3F5B825087D9D5794BD7 -PT=6B013F9A972D82BD5A87DA6C1DD5FD0F - -I=169 -KEY=C4A41F8C4B26391F6C0D629C6B052BD8C249D506D75FB37B46CFA7E4C5FA4F98 -IV=7066C16A4155B55DE7151C5FC8A1825A -CT=6B013F9A972D82BD5A87DA6C1DD5FD0F -PT=9005F8243C6486F63590E7508503719C - -I=170 -KEY=91A18F2681FCACE1C80DC772BD0F2628524C2D22EB3B358D735F40B440F93E04 -IV=550590AACADA95FEA400A5EED60A0DF0 -CT=9005F8243C6486F63590E7508503719C -PT=39DEEEC3D3AEEBBF4B573462B375B5E4 - -I=171 -KEY=E8FF0EE1269AFDCA213F69757C84704D6B92C3E13895DE32380874D6F38C8BE0 -IV=795E81C7A766512BE932AE07C18B5665 -CT=39DEEEC3D3AEEBBF4B573462B375B5E4 -PT=1910F8E7C3D863784058CB35D674AEEB - -I=172 -KEY=F00751EFCCECA0ECA3C252F396B4078E72823B06FB4DBD4A7850BFE325F8250B -IV=18F85F0EEA765D2682FD3B86EA3077C3 -CT=1910F8E7C3D863784058CB35D674AEEB -PT=4A71250E55629D3C5CC62B18B4B67653 - -I=173 -KEY=383A1B81E82B8174A9B9F0AF9EA498A338F31E08AE2F2076249694FB914E5358 -IV=C83D4A6E24C721980A7BA25C08109F2D -CT=4A71250E55629D3C5CC62B18B4B67653 -PT=19CBB63FBB92C7A10B676DBB5EB29060 - -I=174 -KEY=A6695341053BD5B1E15A6CD73DEF84E12138A83715BDE7D72FF1F940CFFCC338 -IV=9E5348C0ED1054C548E39C78A34B1C42 -CT=19CBB63FBB92C7A10B676DBB5EB29060 -PT=18BA0A45E67D2CFEC691203FC2509837 - -I=175 -KEY=71B4C384EF619E5D6CADBFC7D53564913982A272F3C0CB29E960D97F0DAC5B0F -IV=D7DD90C5EA5A4BEC8DF7D310E8DAE070 -CT=18BA0A45E67D2CFEC691203FC2509837 -PT=7699C8550933C30D630AC16D8DA6F13D - -I=176 -KEY=7D0527970FD45C35817091A317A2EAB04F1B6A27FAF308248A6A1812800AAA32 -IV=0CB1E413E0B5C268EDDD2E64C2978E21 -CT=7699C8550933C30D630AC16D8DA6F13D -PT=78FE8EEC14618ED34F63E8671434ADA7 - -I=177 -KEY=204ECE43E91409C515077FACC37C4DF837E5E4CBEE9286F7C509F075943E0795 -IV=5D4BE9D4E6C055F09477EE0FD4DEA748 -CT=78FE8EEC14618ED34F63E8671434ADA7 -PT=0907F75149A74B49F302D2C08CF18AF5 - -I=178 -KEY=8E80DC69B6CC0F0D7F1F0BE6E9F178AD3EE2139AA735CDBE360B22B518CF8D60 -IV=AECE122A5FD806C86A18744A2A8D3555 -CT=0907F75149A74B49F302D2C08CF18AF5 -PT=FE24023BCABCD83E6212FA53E7320D92 - -I=179 -KEY=5152CCE87D9CCC930D7B376C4F1B334BC0C611A16D8915805419D8E6FFFD80F2 -IV=DFD21081CB50C39E72643C8AA6EA4BE6 -CT=FE24023BCABCD83E6212FA53E7320D92 -PT=9526CDED534CB3366306F8C731F87CD6 - -I=180 -KEY=00C9D78F67F1B63181ADE21A02675C6755E0DC4C3EC5A6B6371F2021CE05FC24 -IV=519B1B671A6D7AA28CD6D5764D7C6F2C -CT=9526CDED534CB3366306F8C731F87CD6 -PT=801F005EA2E9287FFD8D9B01BE8E2205 - -I=181 -KEY=442603CF6A012BDB23086BD7EFD7396ED5FFDC129C2C8EC9CA92BB20708BDE21 -IV=44EFD4400DF09DEAA2A589CDEDB06509 -CT=801F005EA2E9287FFD8D9B01BE8E2205 -PT=7558994ACE0299E34EB586B832C98560 - -I=182 -KEY=B153C7C49983077FB0C79C30266A487AA0A74558522E172A84273D9842425B41 -IV=F575C40BF3822CA493CFF7E7C9BD7114 -CT=7558994ACE0299E34EB586B832C98560 -PT=324273A52FFBFBCAC5401CFCD3075C98 - -I=183 -KEY=0E038D82F7FAD738824EF9FEB6F6627692E536FD7DD5ECE041672164914507D9 -IV=BF504A466E79D047328965CE909C2A0C -CT=324273A52FFBFBCAC5401CFCD3075C98 -PT=509E651E053E85340A5B545AA0E40A71 - -I=184 -KEY=B2237D5D0E16B5F9A8FD7274F4CA1206C27B53E378EB69D44B3C753E31A10DA8 -IV=BC20F0DFF9EC62C12AB38B8A423C7070 -CT=509E651E053E85340A5B545AA0E40A71 -PT=1716AB4DCAB205D62EF356E4C565BA70 - -I=185 -KEY=CBE25CF8F3CAB9849F44F330AD8B17E1D56DF8AEB2596C0265CF23DAF4C4B7D8 -IV=79C121A5FDDC0C7D37B98144594105E7 -CT=1716AB4DCAB205D62EF356E4C565BA70 -PT=093CA7764E7F6828EF210E89D3D01C73 - -I=186 -KEY=2BF3C06B0CAE728C8A6134634D5DEAF1DC515FD8FC26042A8AEE2D532714ABAB -IV=E0119C93FF64CB081525C753E0D6FD10 -CT=093CA7764E7F6828EF210E89D3D01C73 -PT=86F8B39DB10EB8B3CFED4C98BBBFFAE1 - -I=187 -KEY=A2C742CFF575CA98D3261BE7DA99E3935AA9EC454D28BC99450361CB9CAB514A -IV=893482A4F9DBB81459472F8497C40962 -CT=86F8B39DB10EB8B3CFED4C98BBBFFAE1 -PT=8BF9C14617B3CE1511ABBD484439D041 - -I=188 -KEY=F8AB8BAD8F2C5A54ED4C80AD094A36D4D1502D035A9B728C54A8DC83D892810B -IV=5A6CC9627A5990CC3E6A9B4AD3D3D547 -CT=8BF9C14617B3CE1511ABBD484439D041 -PT=C41B937B1D5E10D982C7850685997862 - -I=189 -KEY=4DBA6859C8D681253E8F6278BE76D87D154BBE7847C56255D66F59855D0BF969 -IV=B511E3F447FADB71D3C3E2D5B73CEEA9 -CT=C41B937B1D5E10D982C7850685997862 -PT=467114F3F33C8BA65AA76C297E9DA11C - -I=190 -KEY=2738E652A9F41B48B443B487B2AF6D7C533AAA8BB4F9E9F38CC835AC23965875 -IV=6A828E0B61229A6D8ACCD6FF0CD9B501 -CT=467114F3F33C8BA65AA76C297E9DA11C -PT=CB9D772C72BC5BB3E18087CABADDE5B2 - -I=191 -KEY=A1C138E8AFAA19465AE9BD1968C19E8798A7DDA7C645B2406D48B266994BBDC7 -IV=86F9DEBA065E020EEEAA099EDA6EF3FB -CT=CB9D772C72BC5BB3E18087CABADDE5B2 -PT=678837A26F65190F44107C19A01F97E6 - -I=192 -KEY=CD73AF62C6130630324F71F35042BC9AFF2FEA05A920AB4F2958CE7F39542A21 -IV=6CB2978A69B91F7668A6CCEA3883221D -CT=678837A26F65190F44107C19A01F97E6 -PT=E395804E9F2D61447B5207AA438F7D98 - -I=193 -KEY=F076EAF59DAC3F3975E9CBED6697A21B1CBA6A4B360DCA0B520AC9D57ADB57B9 -IV=3D0545975BBF390947A6BA1E36D51E81 -CT=E395804E9F2D61447B5207AA438F7D98 -PT=CA6E3E780C170E950306FEE08CAB46D9 - -I=194 -KEY=87DD7A9906E626E1AC55611A52EBC196D6D454333A1AC49E510C3735F6701160 -IV=77AB906C9B4A19D8D9BCAAF7347C638D -CT=CA6E3E780C170E950306FEE08CAB46D9 -PT=419B7C538E827E431B2C2BA5AEB95373 - -I=195 -KEY=C8D569C710030750FDA3A48E748BED26974F2860B498BADD4A201C9058C94213 -IV=4F08135E16E521B151F6C59426602CB0 -CT=419B7C538E827E431B2C2BA5AEB95373 -PT=1D6607B51B0DA629C62D00CB20870FEA - -I=196 -KEY=A3A22E3CED89316BC747E3326CB53C448A292FD5AF951CF48C0D1C5B784E4DF9 -IV=6B7747FBFD8A363B3AE447BC183ED162 -CT=1D6607B51B0DA629C62D00CB20870FEA -PT=58169D0006C9031C7CCE502F086B0CD6 - -I=197 -KEY=DDB2F456CFE201D5E1DD9EFC6593813FD23FB2D5A95C1FE8F0C34C747025412F -IV=7E10DA6A226B30BE269A7DCE0926BD7B -CT=58169D0006C9031C7CCE502F086B0CD6 -PT=8001E1BDAE24A2A9ABE102C2BEB4AD70 - -I=198 -KEY=A990048427C8E19BABE1D0BB5D6A83CA523E53680778BD415B224EB6CE91EC5F -IV=7422F0D2E82AE04E4A3C4E4738F902F5 -CT=8001E1BDAE24A2A9ABE102C2BEB4AD70 -PT=EA143E99846F5DF1C1A2AD0565D3AE45 - -I=199 -KEY=5074E20E5B70B571A7155A3AAFE3AF2AB82A6DF18317E0B09A80E3B3AB42421A -IV=F9E4E68A7CB854EA0CF48A81F2892CE0 -CT=EA143E99846F5DF1C1A2AD0565D3AE45 -PT=C1EBFE1B00D813BB5AC9E4B007977B19 - -I=200 -KEY=50315F6BF520F26A044751215225348179C193EA83CFF30BC0490703ACD53903 -IV=0045BD65AE50471BA3520B1BFDC69BAB -CT=C1EBFE1B00D813BB5AC9E4B007977B19 -PT=3476AA08CB11F13D8DD858CF10472D03 - -I=201 -KEY=03D2536F9830D74A9B2AEDD1508CE4764DB739E248DE02364D915FCCBC921400 -IV=53E30C046D1025209F6DBCF002A9D0F7 -CT=3476AA08CB11F13D8DD858CF10472D03 -PT=C79BED3BB201F29B65CDF5709654317C - -I=202 -KEY=4AC2173AD99E09ECCB4A647AF96C26F98A2CD4D9FADFF0AD285CAABC2AC6257C -IV=4910445541AEDEA6506089ABA9E0C28F -CT=C79BED3BB201F29B65CDF5709654317C -PT=E5E144D56A2FF95D644D51E73AEAE922 - -I=203 -KEY=9F46778CA9C15CB9978C0DF359056F3D6FCD900C90F009F04C11FB5B102CCC5E -IV=D58460B6705F55555CC66989A06949C4 -CT=E5E144D56A2FF95D644D51E73AEAE922 -PT=38582F30FDE74A162CCD85955C2E48FC - -I=204 -KEY=63038F8EA2934D0C65F181BE92B9664A5795BF3C6D1743E660DC7ECE4C0284A2 -IV=FC45F8020B5211B5F27D8C4DCBBC0977 -CT=38582F30FDE74A162CCD85955C2E48FC -PT=266E808D7E9206C9294F0349D1CEF1DA - -I=205 -KEY=D43CC15DCAB5047B8C67D61F1735C6A471FB3FB11385452F49937D879DCC7578 -IV=B73F4ED368264977E99657A1858CA0EE -CT=266E808D7E9206C9294F0349D1CEF1DA -PT=8E3D1F7DC678C32352782D52E4CD44D5 - -I=206 -KEY=9979232A388E0E6C766279CFE7E047B4FFC620CCD5FD860C1BEB50D5790131AD -IV=4D45E277F23B0A17FA05AFD0F0D58110 -CT=8E3D1F7DC678C32352782D52E4CD44D5 -PT=DDC8075418E2A649D4E78144528682F9 - -I=207 -KEY=43479EA72BF3B417CF224B15749043C5220E2798CD1F2045CF0CD1912B87B354 -IV=DA3EBD8D137DBA7BB94032DA93700471 -CT=DDC8075418E2A649D4E78144528682F9 -PT=4096B4F51C77C8A00A5308D8C3175B6A - -I=208 -KEY=7AE39630885C3ACDCF915625141DF45A6298936DD168E8E5C55FD949E890E83E -IV=39A40897A3AF8EDA00B31D30608DB79F -CT=4096B4F51C77C8A00A5308D8C3175B6A -PT=60D0385ECE913BEC6760BAA0BCCDE853 - -I=209 -KEY=82496ADB8A91DAE80C249D2BD8F00C990248AB331FF9D309A23F63E9545D006D -IV=F8AAFCEB02CDE025C3B5CB0ECCEDF8C3 -CT=60D0385ECE913BEC6760BAA0BCCDE853 -PT=79A86909141C27366744FC614808705B - -I=210 -KEY=EF7FEE5E3FDAC015E8016A7A9D3EB8677BE0C23A0BE5F43FC57B9F881C557036 -IV=6D368485B54B1AFDE425F75145CEB4FE -CT=79A86909141C27366744FC614808705B -PT=9817CE82A9D821189878991B32360409 - -I=211 -KEY=A400D423453A59F64968E8B80140AAF6E3F70CB8A23DD5275D0306932E63743F -IV=4B7F3A7D7AE099E3A16982C29C7E1291 -CT=9817CE82A9D821189878991B32360409 -PT=C3259E5D4A3E82FDC862E862E4449DA2 - -I=212 -KEY=B9280C8996C8BEC6888CB4D9D1E76B0620D292E5E80357DA9561EEF1CA27E99D -IV=1D28D8AAD3F2E730C1E45C61D0A7C1F0 -CT=C3259E5D4A3E82FDC862E862E4449DA2 -PT=F035078B9A3E45B4ED561F001DB21E47 - -I=213 -KEY=9686D9BB259CD14FA7D58C9789932385D0E7956E723D126E7837F1F1D795F7DA -IV=2FAED532B3546F892F59384E58744883 -CT=F035078B9A3E45B4ED561F001DB21E47 -PT=596B9F7F2122A11C599626B16B6AC340 - -I=214 -KEY=736E847DDC4C794A3AA2E22C1AF85EF1898C0A11531FB37221A1D740BCFF349A -IV=E5E85DC6F9D0A8059D776EBB936B7D74 -CT=596B9F7F2122A11C599626B16B6AC340 -PT=800FCC5CE3B08CFFDD70FB5270DED220 - -I=215 -KEY=728D3E35CD653621D41E591530770B370983C64DB0AF3F8DFCD12C12CC21E6BA -IV=01E3BA4811294F6BEEBCBB392A8F55C6 -CT=800FCC5CE3B08CFFDD70FB5270DED220 -PT=5515A58EB0013D2EE561BD2826761209 - -I=216 -KEY=929F6FD8250BAD33FAE4ED108843A2645C9663C300AE02A319B0913AEA57F4B3 -IV=E01251EDE86E9B122EFAB405B834A953 -CT=5515A58EB0013D2EE561BD2826761209 -PT=8B7B3AB73287CEAAA0098D41F0B3A28B - -I=217 -KEY=3F54C218B02F6097C3F31A05F5CCB8C4D7ED59743229CC09B9B91C7B1AE45638 -IV=ADCBADC09524CDA43917F7157D8F1AA0 -CT=8B7B3AB73287CEAAA0098D41F0B3A28B -PT=90CDCF132600F622D1339197B441A4C0 - -I=218 -KEY=2F60AEE4E6A6F7109193112BC756D7F24720966714293A2B688A8DECAEA5F2F8 -IV=10346CFC5689978752600B2E329A6F36 -CT=90CDCF132600F622D1339197B441A4C0 -PT=EA089BEC0DEE1305828522B8AD4F5A99 - -I=219 -KEY=33623A9F86F3AF456D92076B132E46A3AD280D8B19C7292EEA0FAF5403EAA861 -IV=1C02947B60555855FC011640D4789151 -CT=EA089BEC0DEE1305828522B8AD4F5A99 -PT=339C14562AE38F84BE0FB1569C234287 - -I=220 -KEY=6291ED0B63ED8C18A713DDCBFCA054E19EB419DD3324A6AA54001E029FC9EAE6 -IV=51F3D794E51E235DCA81DAA0EF8E1242 -CT=339C14562AE38F84BE0FB1569C234287 -PT=31050E95B1F08B9139EF7F8D42110978 - -I=221 -KEY=7BEF1BE3E67AA478C5D9F50350D221CCAFB1174882D42D3B6DEF618FDDD8E39E -IV=197EF6E88597286062CA28C8AC72752D -CT=31050E95B1F08B9139EF7F8D42110978 -PT=18DE66E3B58C9ABAB99987826AF0D0AF - -I=222 -KEY=3DEB69283844069B400C2E7127B8CD2EB76F71AB3758B781D476E60DB7283331 -IV=460472CBDE3EA2E385D5DB72776AECE2 -CT=18DE66E3B58C9ABAB99987826AF0D0AF -PT=B75D11E28C94DB969FE009B984DA956B - -I=223 -KEY=754C5BEC642540EC8BAD0778773CA8E700326049BBCC6C174B96EFB433F2A65A -IV=48A732C45C614677CBA12909508465C9 -CT=B75D11E28C94DB969FE009B984DA956B -PT=7CEEE835FC734108785B367A28C62058 - -I=224 -KEY=01B0A659138DEE7CF1EFA11DD0A209247CDC887C47BF2D1F33CDD9CE1B348602 -IV=74FCFDB577A8AE907A42A665A79EA1C3 -CT=7CEEE835FC734108785B367A28C62058 -PT=F1E848F6C257D6D56B4FBCA36900614C - -I=225 -KEY=F9531CEDC3C5C76A90195BF1E5FB5ED98D34C08A85E8FBCA5882656D7234E74E -IV=F8E3BAB4D048291661F6FAEC355957FD -CT=F1E848F6C257D6D56B4FBCA36900614C -PT=7B06A193C8B84977E56B382D424D2A78 - -I=226 -KEY=D409DB9768430BCA0E2B68BA1CFE93A5F63261194D50B2BDBDE95D403079CD36 -IV=2D5AC77AAB86CCA09E32334BF905CD7C -CT=7B06A193C8B84977E56B382D424D2A78 -PT=413356E3367ACBDD88ADA6DF5E09FFC6 - -I=227 -KEY=8425B50A014625BA114ABAC1585C3F68B70137FA7B2A79603544FB9F6E7032F0 -IV=502C6E9D69052E701F61D27B44A2ACCD -CT=413356E3367ACBDD88ADA6DF5E09FFC6 -PT=13B524E8AEBFE32CC9559B500D9E9A82 - -I=228 -KEY=3ED2EEDFF8C12697C9CEB18B8DC86798A4B41312D5959A4CFC1160CF63EEA872 -IV=BAF75BD5F987032DD8840B4AD59458F0 -CT=13B524E8AEBFE32CC9559B500D9E9A82 -PT=91775D8DF510277669BC11697965AE99 - -I=229 -KEY=B3C35FF0F6B2DDCF5522A35E75040BB135C34E9F2085BD3A95AD71A61A8B06EB -IV=8D11B12F0E73FB589CEC12D5F8CC6C29 -CT=91775D8DF510277669BC11697965AE99 -PT=0AA5B5A593FED4CE1FD66736774649D2 - -I=230 -KEY=5581EEED032A31D6F8077BEED79ABB1E3F66FB3AB37B69F48A7B16906DCD4F39 -IV=E642B11DF598EC19AD25D8B0A29EB0AF -CT=0AA5B5A593FED4CE1FD66736774649D2 -PT=3DB595E23D32347092E5D94A8376DB5D - -I=231 -KEY=2337ABB014AD70D3E290033BD6FC75D702D36ED88E495D84189ECFDAEEBB9464 -IV=76B6455D178741051A9778D50166CEC9 -CT=3DB595E23D32347092E5D94A8376DB5D -PT=2AF2DEC9D2D4F0BA81D1FC88E421C034 - -I=232 -KEY=7C8A43D8CA68E782BBD49C18477683052821B0115C9DAD3E994F33520A9A5450 -IV=5FBDE868DEC5975159449F23918AF6D2 -CT=2AF2DEC9D2D4F0BA81D1FC88E421C034 -PT=8AF90FCCBEDCDF709AEE93FEF45C03EC - -I=233 -KEY=37FDC789E91F58F691931C86C4505926A2D8BFDDE241724E03A1A0ACFEC657BC -IV=4B7784512377BF742A47809E8326DA23 -CT=8AF90FCCBEDCDF709AEE93FEF45C03EC -PT=8E98DF785A601DF26465D9A0D163D650 - -I=234 -KEY=57C30D92BD234BE693F15534768970FC2C4060A5B8216FBC67C4790C2FA581EC -IV=603ECA1B543C1310026249B2B2D929DA -CT=8E98DF785A601DF26465D9A0D163D650 -PT=21D3EAC95A088A548E5C0E56001BD103 - -I=235 -KEY=1F9A07E73DB0530F84B6DB88C5EA0AFD0D938A6CE229E5E8E998775A2FBE50EF -IV=48590A75809318E917478EBCB3637A01 -CT=21D3EAC95A088A548E5C0E56001BD103 -PT=48A8853D9E4E4A6351E5F5734911D569 - -I=236 -KEY=219E87740C05905A3DAC677C78C5E6D4453B0F517C67AF8BB87D822966AF8586 -IV=3E04809331B5C355B91ABCF4BD2FEC29 -CT=48A8853D9E4E4A6351E5F5734911D569 -PT=C75ECB64A655DC6803FC976A1CAE78A9 - -I=237 -KEY=D445B2CF4C6B8AF073FCDFF8907C4B278265C435DA3273E3BB8115437A01FD2F -IV=F5DB35BB406E1AAA4E50B884E8B9ADF3 -CT=C75ECB64A655DC6803FC976A1CAE78A9 -PT=F063E6C6A62D07B1CA90594CB9041DE4 - -I=238 -KEY=3DECAA3153A9658A2CAA5578AF2C55CD720622F37C1F745271114C0FC305E0CB -IV=E9A918FE1FC2EF7A5F568A803F501EEA -CT=F063E6C6A62D07B1CA90594CB9041DE4 -PT=45F375DDBA20D20CB6C5EAB28AA85D06 - -I=239 -KEY=31766034845DF8A1AEDFC70CE3CD5B1D37F5572EC63FA65EC7D4A6BD49ADBDCD -IV=0C9ACA05D7F49D2B827592744CE10ED0 -CT=45F375DDBA20D20CB6C5EAB28AA85D06 -PT=5D117AAC285D5A6948390FDAFBDACAD5 - -I=240 -KEY=BF17727E1D5DCA94C9CCA8E11DFBF22A6AE42D82EE62FC378FEDA967B2777718 -IV=8E61124A9900323567136FEDFE36A937 -CT=5D117AAC285D5A6948390FDAFBDACAD5 -PT=C8B61B172D930641A88E9E13236E11F9 - -I=241 -KEY=B82DB30F4271245293FC4CB6A0C10D4FA2523695C3F1FA7627633774911966E1 -IV=073AC1715F2CEEC65A30E457BD3AFF65 -CT=C8B61B172D930641A88E9E13236E11F9 -PT=FE05708E08F8568BB55175CEEF9E0433 - -I=242 -KEY=28AE9BD5E181AC41CF2F9B4710DD160C5C57461BCB09ACFD923242BA7E8762D2 -IV=908328DAA3F088135CD3D7F1B01C1B43 -CT=FE05708E08F8568BB55175CEEF9E0433 -PT=D7DB71EAC2EF31AE105227E34134AD3C - -I=243 -KEY=437D385B59B4AB247A5BCFC0C0F8596F8B8C37F109E69D53826065593FB3CFEE -IV=6BD3A38EB8350765B5745487D0254F63 -CT=D7DB71EAC2EF31AE105227E34134AD3C -PT=ECD51D08C870983992708FC1FDFA9D15 - -I=244 -KEY=4EF45D9C1FCA58D42D9E7E2E9C7D0B8F67592AF9C196056A1010EA98C24952FB -IV=0D8965C7467EF3F057C5B1EE5C8552E0 -CT=ECD51D08C870983992708FC1FDFA9D15 -PT=F436BA32E9D089248AC47E40AA6B4BAC - -I=245 -KEY=D3F16D0CF75471A24F273B3E8EF0A3A0936F90CB28468C4E9AD494D868221957 -IV=9D053090E89E297662B94510128DA82F -CT=F436BA32E9D089248AC47E40AA6B4BAC -PT=F43E89C3DBD391B5778B30A36A9E42F3 - -I=246 -KEY=953E7AB7369425A4F396D764F3EA047F67511908F3951DFBED5FA47B02BC5BA4 -IV=46CF17BBC1C05406BCB1EC5A7D1AA7DF -CT=F43E89C3DBD391B5778B30A36A9E42F3 -PT=B12ABB428A29703B929EFDB0031694D1 - -I=247 -KEY=C8DDFEFD3C72822B72C78757EE8EF856D67BA24A79BC6DC07FC159CB01AACF75 -IV=5DE3844A0AE6A78F815150331D64FC29 -CT=B12ABB428A29703B929EFDB0031694D1 -PT=79F19D2BD0A025D2D9822A28F5304446 - -I=248 -KEY=870A25E9511D3F1BCFA941DA41FD00C0AF8A3F61A91C4812A64373E3F49A8B33 -IV=4FD7DB146D6FBD30BD6EC68DAF73F896 -CT=79F19D2BD0A025D2D9822A28F5304446 -PT=C52D5EF8D7A1353F5C1FF7BA33F9ED97 - -I=249 -KEY=178B86564949AE1A0CE50E61F4D3F8776AA761997EBD7D2DFA5C8459C76366A4 -IV=9081A3BF18549101C34C4FBBB52EF8B7 -CT=C52D5EF8D7A1353F5C1FF7BA33F9ED97 -PT=82FAB7DF4BE409880B8F66210DE8D2E5 - -I=250 -KEY=C3F845809E635052F94076E1F3026779E85DD646355974A5F1D3E278CA8BB441 -IV=D473C3D6D72AFE48F5A5788007D19F0E -CT=82FAB7DF4BE409880B8F66210DE8D2E5 -PT=52C05722F125348666DFCF0F2D052530 - -I=251 -KEY=34AE823E21F4C45784F2E125CF5039FCBA9D8164C47C4023970C2D77E78E9171 -IV=F756C7BEBF9794057DB297C43C525E85 -CT=52C05722F125348666DFCF0F2D052530 -PT=DE7FAAF4A10D4D5404847FA080C1DC1C - -I=252 -KEY=9D1EEFC6B62427F5A2CBB2047AB0E41B64E22B9065710D77938852D7674F4D6D -IV=A9B06DF897D0E3A226395321B5E0DDE7 -CT=DE7FAAF4A10D4D5404847FA080C1DC1C -PT=49327927599012EE87FF64F45AC9A9AE - -I=253 -KEY=2C7B21A79BE0B5B0E4DCC427DE8D91572DD052B73CE11F99147736233D86E4C3 -IV=B165CE612DC4924546177623A43D754C -CT=49327927599012EE87FF64F45AC9A9AE -PT=6E11B9F592DD99CD94F8999D9476F4CF - -I=254 -KEY=F4A72FB6D161B9E15A41576C5A7CBF3F43C1EB42AE3C8654808FAFBEA9F0100C -IV=D8DC0E114A810C51BE9D934B84F12E68 -CT=6E11B9F592DD99CD94F8999D9476F4CF -PT=108AC1FE3E008D1C3058917157003E2C - -I=255 -KEY=2E5FE97C58B060C9BACA9E9CC14CFC89534B2ABC903C0B48B0D73ECFFEF02E20 -IV=DAF8C6CA89D1D928E08BC9F09B3043B6 -CT=108AC1FE3E008D1C3058917157003E2C -PT=B315EF45A3BD77688AD0976EF5DCA26B - -I=256 -KEY=9D763A80B96B112E1DAEA50A98C0B6F7E05EC5F933817C203A07A9A10B2C8C4B -IV=B329D3FCE1DB71E7A7643B96598C4A7E -CT=B315EF45A3BD77688AD0976EF5DCA26B -PT=7BF8DABED803049DF8D1F34ED00536F7 - -I=257 -KEY=DF5F07523E7E305B48AAD9C205AE826C9BA61F47EB8278BDC2D65AEFDB29BABC -IV=42293DD28715217555047CC89D6E349B -CT=7BF8DABED803049DF8D1F34ED00536F7 -PT=E55FE84DF3137D16E74DC01A1BFDA4A7 - -I=258 -KEY=80CF537EC8836ADD0FB72F35B2EF703D7EF9F70A189105AB259B9AF5C0D41E1B -IV=5F90542CF6FD5A86471DF6F7B741F251 -CT=E55FE84DF3137D16E74DC01A1BFDA4A7 -PT=6019F9DA2DFDCDCB14C2C6CE5B34432D - -I=259 -KEY=4469D3622A022CFB7614C9C9EB36E6031EE00ED0356CC86031595C3B9BE05D36 -IV=C4A6801CE281462679A3E6FC59D9963E -CT=6019F9DA2DFDCDCB14C2C6CE5B34432D -PT=6D2788861A8F9526D1EC8A6A8AFBA629 - -I=260 -KEY=DED804546FA6B0BCD8C9FD9119616F9873C786562FE35D46E0B5D651111BFB1F -IV=9AB1D73645A49C47AEDD3458F257899B -CT=6D2788861A8F9526D1EC8A6A8AFBA629 -PT=81D5CDEA70E433A2A341FFB13ECCEC54 - -I=261 -KEY=24FD3D900606EEF8F31156D30EA094ADF2124BBC5F076EE443F429E02FD7174B -IV=FA2539C469A05E442BD8AB4217C1FB35 -CT=81D5CDEA70E433A2A341FFB13ECCEC54 -PT=F74B4869E92F918A95B508E382A83FA6 - -I=262 -KEY=C24CA269EAADDFBA060AAF15C2265DE6055903D5B628FF6ED6412103AD7F28ED -IV=E6B19FF9ECAB3142F51BF9C6CC86C94B -CT=F74B4869E92F918A95B508E382A83FA6 -PT=EF3293511A17D0E089A8F88E396B4F31 - -I=263 -KEY=789C94E8D2B6D6FD022ED678F42E796CEA6B9084AC3F2F8E5FE9D98D941467DC -IV=BAD03681381B09470424796D3608248A -CT=EF3293511A17D0E089A8F88E396B4F31 -PT=0D70FCE243309D716D8FA672A11EBCB8 - -I=264 -KEY=B8DFB47D720C26AE22AD6C87785CCB97E71B6C66EF0FB2FF32667FFF350ADB64 -IV=C0432095A0BAF0532083BAFF8C72B2FB -CT=0D70FCE243309D716D8FA672A11EBCB8 -PT=831365AB30D062F2B1C051A9EA03AEEB - -I=265 -KEY=938BCEFF0FD9AEC61CF2B0509A645A19640809CDDFDFD00D83A62E56DF09758F -IV=2B547A827DD588683E5FDCD7E238918E -CT=831365AB30D062F2B1C051A9EA03AEEB -PT=EFE7E9DC254FF4AA70ABF327566A5448 - -I=266 -KEY=BBF0C86D05BF543EC3B9A9240833187F8BEFE011FA9024A7F30DDD71896321C7 -IV=287B06920A66FAF8DF4B197492574266 -CT=EFE7E9DC254FF4AA70ABF327566A5448 -PT=2D41BEE483BD2BAD16026AD7AA5ABA07 - -I=267 -KEY=B744A9326EC1D56CBFF51D969D075C7DA6AE5EF5792D0F0AE50FB7A623399BC0 -IV=0CB4615F6B7E81527C4CB4B295344402 -CT=2D41BEE483BD2BAD16026AD7AA5ABA07 -PT=079460C9B745A53999932C5ECFE6A37B - -I=268 -KEY=AE49C59DD393E9EC9030AEDAD7FC61FEA13A3E3CCE68AA337C9C9BF8ECDF38BB -IV=190D6CAFBD523C802FC5B34C4AFB3D83 -CT=079460C9B745A53999932C5ECFE6A37B -PT=CE7C5851D0437368FEDC7E39270A7430 - -I=269 -KEY=8176855633B6FB2445BDDC2FD8D299576F46666D1E2BD95B8240E5C1CBD54C8B -IV=2F3F40CBE02512C8D58D72F50F2EF8A9 -CT=CE7C5851D0437368FEDC7E39270A7430 -PT=A0C3F2D688E4370AD2F08C09B28DBCC1 - -I=270 -KEY=050E71C47B278C5825DE84513A732D11CF8594BB96CFEE5150B069C87958F04A -IV=8478F4924891777C6063587EE2A1B446 -CT=A0C3F2D688E4370AD2F08C09B28DBCC1 -PT=BE472E609ABB030B96739A959EDBDD21 - -I=271 -KEY=502E4BDCF449E96CB16D5B6C097D20CC71C2BADB0C74ED5AC6C3F35DE7832D6B -IV=55203A188F6E653494B3DF3D330E0DDD -CT=BE472E609ABB030B96739A959EDBDD21 -PT=FE4227D6AC71519FA0F2078433DF69CA - -I=272 -KEY=C3DDDE6B2E80381010569BC093561F628F809D0DA005BCC56631F4D9D45C44A1 -IV=93F395B7DAC9D17CA13BC0AC9A2B3FAE -CT=FE4227D6AC71519FA0F2078433DF69CA -PT=3F8439C7648C5C2B5877643C536E14F9 - -I=273 -KEY=1CC65CB104317D620D729EDEB4C4B512B004A4CAC489E0EE3E4690E587325058 -IV=DF1B82DA2AB145721D24051E2792AA70 -CT=3F8439C7648C5C2B5877643C536E14F9 -PT=E189B969BF38C8A2F38BF3F12267B5B4 - -I=274 -KEY=D121C8556039F07E231F9E88DE60572B518D1DA37BB1284CCDCD6314A555E5EC -IV=CDE794E464088D1C2E6D00566AA4E239 -CT=E189B969BF38C8A2F38BF3F12267B5B4 -PT=EF15CCEC56DCD62681FC7564A1095ECD - -I=275 -KEY=C87070F4AA767BE043B29FE3AF258C91BE98D14F2D6DFE6A4C311670045CBB21 -IV=1951B8A1CA4F8B9E60AD016B7145DBBA -CT=EF15CCEC56DCD62681FC7564A1095ECD -PT=BD38CD579A7124DD0814DB21FC0E7D96 - -I=276 -KEY=08167C643CA7CAD8729B17EB91918AC103A01C18B71CDAB74425CD51F852C6B7 -IV=C0660C9096D1B138312988083EB40650 -CT=BD38CD579A7124DD0814DB21FC0E7D96 -PT=565F580B61E456544D8D553948AD95FD - -I=277 -KEY=55BB77ED49C419EEA418365F2750857355FF4413D6F88CE309A89868B0FF534A -IV=5DAD0B897563D336D68321B4B6C10FB2 -CT=565F580B61E456544D8D553948AD95FD -PT=1AA68EAC78C2B5BFF996F0B58C56432F - -I=278 -KEY=8FEC3C85819F24EE1DA186AB212A19D44F59CABFAE3A395CF03E68DD3CA91065 -IV=DA574B68C85B3D00B9B9B0F4067A9CA7 -CT=1AA68EAC78C2B5BFF996F0B58C56432F -PT=65660FBF6C166604D9E717671488D734 - -I=279 -KEY=D1D19B25C23EA5923D45493905B867D12A3FC500C22C5F5829D97FBA2821C751 -IV=5E3DA7A043A1817C20E4CF9224927E05 -CT=65660FBF6C166604D9E717671488D734 -PT=477CBD97B467AA1AAB738E294092FAA3 - -I=280 -KEY=E1972BE045093EC4475DCE6351CDEDCB6D437897764BF54282AAF19368B33DF2 -IV=3046B0C587379B567A18875A54758A1A -CT=477CBD97B467AA1AAB738E294092FAA3 -PT=C0ED90D90AE11390A275BD03BE00E1D5 - -I=281 -KEY=6F622A270D77AE65084E2070343E8C7FADAEE84E7CAAE6D220DF4C90D6B3DC27 -IV=8EF501C7487E90A14F13EE1365F361B4 -CT=C0ED90D90AE11390A275BD03BE00E1D5 -PT=296FED9B8CF7C532721A2188DDB1A441 - -I=282 -KEY=FF7209EA94C0401544991FDB57F77F2084C105D5F05D23E052C56D180B027866 -IV=901023CD99B7EE704CD73FAB63C9F35F -CT=296FED9B8CF7C532721A2188DDB1A441 -PT=4AE1C2EB8D1CEB5804FA992708150590 - -I=283 -KEY=73C6F94AD63DE39C289AE20179FDDDD7CE20C73E7D41C8B8563FF43F03177DF6 -IV=8CB4F0A042FDA3896C03FDDA2E0AA2F7 -CT=4AE1C2EB8D1CEB5804FA992708150590 -PT=A4EAC8940C12F9CEAC78DFDC99DF68B4 - -I=284 -KEY=A7369886016682F6075678509FFB86ED6ACA0FAA71533176FA472BE39AC81542 -IV=D4F061CCD75B616A2FCC9A51E6065B3A -CT=A4EAC8940C12F9CEAC78DFDC99DF68B4 -PT=70B05A9959E7C4E4545BB3AECCD8B33D - -I=285 -KEY=F01B9FF32CE9CA699F69ADBBC209BBD21A7A553328B4F592AE1C984D5610A67F -IV=572D07752D8F489F983FD5EB5DF23D3F -CT=70B05A9959E7C4E4545BB3AECCD8B33D -PT=F4978960F1382713A5A7183B9694DE85 - -I=286 -KEY=FF05A97961A5CA725CD2E1B2A9D58304EEEDDC53D98CD2810BBB8076C08478FA -IV=0F1E368A4D4C001BC3BB4C096BDC38D6 -CT=F4978960F1382713A5A7183B9694DE85 -PT=EDCC3B8D26928086F1C6727833405424 - -I=287 -KEY=AA4DB35CCBD936D13D1B7DB64638B99A0321E7DEFF1E5207FA7DF20EF3C42CDE -IV=55481A25AA7CFCA361C99C04EFED3A9E -CT=EDCC3B8D26928086F1C6727833405424 -PT=12A36AC1DA72345291CF206FA04F102F - -I=288 -KEY=611E32BF030B7B377AEC338C7FA6D88311828D1F256C66556BB2D261538B3CF1 -IV=CB5381E3C8D24DE647F74E3A399E6119 -CT=12A36AC1DA72345291CF206FA04F102F -PT=8DA0003E090444453B932F0CDBBFA54E - -I=289 -KEY=43E230241EF150AC761C1307C43C3E209C228D212C6822105021FD6D883499BF -IV=22FC029B1DFA2B9B0CF0208BBB9AE6A3 -CT=8DA0003E090444453B932F0CDBBFA54E -PT=A3D9F2112895CEA937A2B18ABB589CC0 - -I=290 -KEY=1FE38E9028DAC8A1E65A04C78BD0E7523FFB7F3004FDECB967834CE7336C057F -IV=5C01BEB4362B980D904617C04FECD972 -CT=A3D9F2112895CEA937A2B18ABB589CC0 -PT=191EE02B9FED198599B5BC2F36271ABB - -I=291 -KEY=5FFD20799D7A7E7A328BD57B13F6E52F26E59F1B9B10F53CFE36F0C8054B1FC4 -IV=401EAEE9B5A0B6DBD4D1D1BC9826027D -CT=191EE02B9FED198599B5BC2F36271ABB -PT=EFC32006AE746D1E3F65E6C7ADF32804 - -I=292 -KEY=EFEFD2A0F1917EB5BFD2337260E11023C926BF1D35649822C153160FA8B837C0 -IV=B012F2D96CEB00CF8D59E6097317F50C -CT=EFC32006AE746D1E3F65E6C7ADF32804 -PT=F9C49B0BFFA354EEBBE3DE29BF9D2623 - -I=293 -KEY=7676D792019D370A67526977EC5FDB5B30E22416CAC7CCCC7AB0C826172511E3 -IV=99990532F00C49BFD8805A058CBECB78 -CT=F9C49B0BFFA354EEBBE3DE29BF9D2623 -PT=EAEAE4BFF789E64D80D88CE5BC0E15CC - -I=294 -KEY=69202B4EB33EB35987DD82026714F603DA08C0A93D4E2A81FA6844C3AB2B042F -IV=1F56FCDCB2A38453E08FEB758B4B2D58 -CT=EAEAE4BFF789E64D80D88CE5BC0E15CC -PT=96C362F59FD2457A5ED68A116B4AA682 - -I=295 -KEY=DE8B4CC7995B3E061E126157B0C2AF984CCBA25CA29C6FFBA4BECED2C061A2AD -IV=B7AB67892A658D5F99CFE355D7D6599B -CT=96C362F59FD2457A5ED68A116B4AA682 -PT=5498BE46DCE840F7B593BE2BC0D252CB - -I=296 -KEY=1BFE119E1B63BA06E9A590709A2985D218531C1A7E742F0C112D70F900B3F066 -IV=C5755D5982388400F7B7F1272AEB2A4A -CT=5498BE46DCE840F7B593BE2BC0D252CB -PT=697482966F491ACB46E7171A4813D916 - -I=297 -KEY=9E6361F9775A88FAAD09711E9691798C71279E8C113D35C757CA67E348A02970 -IV=859D70676C3932FC44ACE16E0CB8FC5E -CT=697482966F491ACB46E7171A4813D916 -PT=A799874DC7721D96DEEFAB5FE1A01A8E - -I=298 -KEY=7D1EF621D3ADC4BD4EC1861167FA5B0CD6BE19C1D64F28518925CCBCA90033FE -IV=E37D97D8A4F74C47E3C8F70FF16B2280 -CT=A799874DC7721D96DEEFAB5FE1A01A8E -PT=2D19344625CF5E6DE07EE960F4AEC5CF - -I=299 -KEY=7DFD0BE692B47C022DC789EF5291D2F5FBA72D87F380763C695B25DC5DAEF631 -IV=00E3FDC74119B8BF63060FFE356B89F9 -CT=2D19344625CF5E6DE07EE960F4AEC5CF -PT=F80C5143F173AE672DA4DDC8272C13EF - -I=300 -KEY=A78C66D30475B93F0A87E6E4A8BFA3AE03AB7CC402F3D85B44FFF8147A82E5DE -IV=DA716D3596C1C53D27406F0BFA2E715B -CT=F80C5143F173AE672DA4DDC8272C13EF -PT=76BDB7A63614A41C9D52718B3514E03C - -I=301 -KEY=9542E4B9D92DAF7B463C83DA257422B37516CB6234E77C47D9AD899F4F9605E2 -IV=32CE826ADD5816444CBB653E8DCB811D -CT=76BDB7A63614A41C9D52718B3514E03C -PT=93F65B7B961EE6B623A026576FF8890B - -I=302 -KEY=6932CD66A25D1DE274C7D5DF540917BFE6E09019A2F99AF1FA0DAFC8206E8CE9 -IV=FC7029DF7B70B29932FB5605717D350C -CT=93F65B7B961EE6B623A026576FF8890B -PT=FA5BEB508ABCBCB1B1D56C0E207A032D - -I=303 -KEY=595CCC3640445FF5BBF303FF7845AB821CBB7B49284526404BD8C3C600148FC4 -IV=306E0150E2194217CF34D6202C4CBC3D -CT=FA5BEB508ABCBCB1B1D56C0E207A032D -PT=BFAEA3EB7C617567EB302D571DBF2811 - -I=304 -KEY=BF5382311BF88FC9E32D5BADC832BE48A315D8A254245327A0E8EE911DABA7D5 -IV=E60F4E075BBCD03C58DE5852B07715CA -CT=BFAEA3EB7C617567EB302D571DBF2811 -PT=4B0E63933414184D43B0AA714AA31E02 - -I=305 -KEY=B50A2FF8FAC6820638CCBA3A0CA6519CE81BBB3160304B6AE35844E05708B9D7 -IV=0A59ADC9E13E0DCFDBE1E197C494EFD4 -CT=4B0E63933414184D43B0AA714AA31E02 -PT=0073CA04B300003AF3C1035C664E0646 - -I=306 -KEY=1A32AA7CA8B5D83C47F56C5D24EDBD38E8687135D3304B50109947BC3146BF91 -IV=AF38858452735A3A7F39D667284BECA4 -CT=0073CA04B300003AF3C1035C664E0646 -PT=75CFE6D4A4F05D8EBB5C614AC7FB48C8 - -I=307 -KEY=C321C5381F5A334C8B82DD2F0E4C73AE9DA797E177C016DEABC526F6F6BDF759 -IV=D9136F44B7EFEB70CC77B1722AA1CE96 -CT=75CFE6D4A4F05D8EBB5C614AC7FB48C8 -PT=B0D8DB37DF5C3A87B9E5D562283E8FEE - -I=308 -KEY=40879EA19753F0F22B1C1BF438A446532D7F4CD6A89C2C591220F394DE8378B7 -IV=83A65B998809C3BEA09EC6DB36E835FD -CT=B0D8DB37DF5C3A87B9E5D562283E8FEE -PT=9C885637CC7666C04B424DD6EF1F3EDB - -I=309 -KEY=B6824C9F800B1E7825135F250DB99FC8B1F71AE164EA4A995962BE42319C466C -IV=F605D23E1758EE8A0E0F44D1351DD99B -CT=9C885637CC7666C04B424DD6EF1F3EDB -PT=3E7F4437656E63E0ADC6C764B20FE92D - -I=310 -KEY=7FA3CDE5856B1F0D9AE33E9E6ED1532E8F885ED601842979F4A479268393AF41 -IV=C921817A05600175BFF061BB6368CCE6 -CT=3E7F4437656E63E0ADC6C764B20FE92D -PT=B19CCFDAADEC54C8DD5F4FD53D3C5824 - -I=311 -KEY=3E3ABA34DB005D9FF2CEF1321BCD018E3E14910CAC687DB129FB36F3BEAFF765 -IV=419977D15E6B4292682DCFAC751C52A0 -CT=B19CCFDAADEC54C8DD5F4FD53D3C5824 -PT=84F7D061322A4042913C0BD14F5F1391 - -I=312 -KEY=FB474D499955CB1F37FBA309DD55E09DBAE3416D9E423DF3B8C73D22F1F0E4F4 -IV=C57DF77D42559680C535523BC698E113 -CT=84F7D061322A4042913C0BD14F5F1391 -PT=CBCD716DA9C53D7AFFFE65B780926660 - -I=313 -KEY=7C1D07031362A7439F9DD5272DAD1D9B712E3000378700894739589571628294 -IV=875A4A4A8A376C5CA866762EF0F8FD06 -CT=CBCD716DA9C53D7AFFFE65B780926660 -PT=F605D205704496C5BFCEE88130920CDE - -I=314 -KEY=7E9E72A6032523643F0965E8BFCB0793872BE20547C3964CF8F7B01441F08E4A -IV=028375A510478427A094B0CF92661A08 -CT=F605D205704496C5BFCEE88130920CDE -PT=CFA8B47DEB5770925EA29484D82CDBB4 - -I=315 -KEY=518CA0A8C81E9DDCE1060410C69F0ACE48835678AC94E6DEA655249099DC55FE -IV=2F12D20ECB3BBEB8DE0F61F879540D5D -CT=CFA8B47DEB5770925EA29484D82CDBB4 -PT=1065AD49D2DD48EB9540F23A69469B92 - -I=316 -KEY=45E6A5A17D8D1AEA04CD8E184D0A1BF758E6FB317E49AE353315D6AAF09ACE6C -IV=146A0509B5938736E5CB8A088B951139 -CT=1065AD49D2DD48EB9540F23A69469B92 -PT=DB12EE00C65069CFEA509BA5BD5BB6BC - -I=317 -KEY=FC8F8F7F8A440A6CEB920D4311851B3A83F41531B819C7FAD9454D0F4DC178D0 -IV=B9692ADEF7C91086EF5F835B5C8F00CD -CT=DB12EE00C65069CFEA509BA5BD5BB6BC -PT=B66316FB3CCC9B262A34C205AE43F42B - -I=318 -KEY=42D666DF2C1575E3B346FCBCD208AD9F359703CA84D55CDCF3718F0AE3828CFB -IV=BE59E9A0A6517F8F58D4F1FFC38DB6A5 -CT=B66316FB3CCC9B262A34C205AE43F42B -PT=4C851D9BDC164194A6D1FDE274C06D1B - -I=319 -KEY=786B9456901DFA9FF85C686DEEDCA02079121E5158C31D4855A072E89742E1E0 -IV=3ABDF289BC088F7C4B1A94D13CD40DBF -CT=4C851D9BDC164194A6D1FDE274C06D1B -PT=5507F1EB271BDBC0A6DD8BBAEC843A05 - -I=320 -KEY=C79B5CD424E592D392FECD3233CEA70B2C15EFBA7FD8C688F37DF9527BC6DBE5 -IV=BFF0C882B4F8684C6AA2A55FDD12072B -CT=5507F1EB271BDBC0A6DD8BBAEC843A05 -PT=BB10EF7C98DE0255C836D5319B94B166 - -I=321 -KEY=10ABC5B835E6E6BD02E90B63D22EF9E7970500C6E706C4DD3B4B2C63E0526A83 -IV=D730996C1103746E9017C651E1E05EEC -CT=BB10EF7C98DE0255C836D5319B94B166 -PT=E8B797AFDC378DB47F172260963A6E2C - -I=322 -KEY=75E05AAAB4E6981A20E4177D214B81EA7FB297693B314969445C0E03766804AF -IV=654B9F1281007EA7220D1C1EF365780D -CT=E8B797AFDC378DB47F172260963A6E2C -PT=58ED1CC5A208A0E7340167E79F5DA7C2 - -I=323 -KEY=A69FECC296D12216128BD1D2C48B373D275F8BAC9939E98E705D69E4E935A36D -IV=D37FB6682237BA0C326FC6AFE5C0B6D7 -CT=58ED1CC5A208A0E7340167E79F5DA7C2 -PT=FEDA5FB215819B441BE18B0AED27A1FD - -I=324 -KEY=7EED1776E603DD6C20F08B4C6B121525D985D41E8CB872CA6BBCE2EE04120290 -IV=D872FBB470D2FF7A327B5A9EAF992218 -CT=FEDA5FB215819B441BE18B0AED27A1FD -PT=7CD64E29A704F13688DB206F7F337685 - -I=325 -KEY=D4479A0AF29AF7145EC3FB89FEF8BBA7A5539A372BBC83FCE367C2817B217415 -IV=AAAA8D7C14992A787E3370C595EAAE82 -CT=7CD64E29A704F13688DB206F7F337685 -PT=25D6728244F28F79D1BC707BE94ECA13 - -I=326 -KEY=7FB45D09003B25EFEB5F68CCB7E09C008085E8B56F4E0C8532DBB2FA926FBE06 -IV=ABF3C703F2A1D2FBB59C9345491827A7 -CT=25D6728244F28F79D1BC707BE94ECA13 -PT=47AF03717893A10D7F40D5A3D9B82534 - -I=327 -KEY=35EE9428D4EC49EC103EDF32F4FBEE16C72AEBC417DDAD884D9B67594BD79B32 -IV=4A5AC921D4D76C03FB61B7FE431B7216 -CT=47AF03717893A10D7F40D5A3D9B82534 -PT=B6C25C0E4CA560707588321AAF41119C - -I=328 -KEY=B12C0149A6EDD2DC3742D10822FEDDF771E8B7CA5B78CDF838135543E4968AAE -IV=84C2956172019B30277C0E3AD60533E1 -CT=B6C25C0E4CA560707588321AAF41119C -PT=09137DF5460434E863647B4B50E17A60 - -I=329 -KEY=CFEC596CE216B14A955E7CBC095C198678FBCA3F1D7CF9105B772E08B477F0CE -IV=7EC0582544FB6396A21CADB42BA2C471 -CT=09137DF5460434E863647B4B50E17A60 -PT=17A26688B271E9765F41C71CD8CF0C25 - -I=330 -KEY=35903FF91CC199C048C6C031AA2F4FC96F59ACB7AF0D10660436E9146CB8FCEB -IV=FA7C6695FED7288ADD98BC8DA373564F -CT=17A26688B271E9765F41C71CD8CF0C25 -PT=62E3C4D53DECB83FCD5F57D1971D58FB - -I=331 -KEY=F262476804B79C1F85FEB875CCD5FC3E0DBA686292E1A859C969BEC5FBA5A410 -IV=C7F27891187605DFCD38784466FAB3F7 -CT=62E3C4D53DECB83FCD5F57D1971D58FB -PT=3495C5855D819B6FF779FC7AC59BEB53 - -I=332 -KEY=DC61E5CFC9BAE6B23B894486AD478ADD392FADE7CF6033363E1042BF3E3E4F43 -IV=2E03A2A7CD0D7AADBE77FCF3619276E3 -CT=3495C5855D819B6FF779FC7AC59BEB53 -PT=7440ABE9E1374208CFBCCC18ADC6089F - -I=333 -KEY=C9D2E747A1A6D594CCAE434B7605C8FB4D6F060E2E57713EF1AC8EA793F847DC -IV=15B30288681C3326F72707CDDB424226 -CT=7440ABE9E1374208CFBCCC18ADC6089F -PT=B6802F0F62A28AF7326CDB2144E8DE87 - -I=334 -KEY=99FEF610CFFFACBE8C6AD0A2B0C8F8A7FBEF29014CF5FBC9C3C05586D710995B -IV=502C11576E59792A40C493E9C6CD305C -CT=B6802F0F62A28AF7326CDB2144E8DE87 -PT=B84D7D91E60C131F6F042D403D85C47B - -I=335 -KEY=91EB2713A930B6A53993029D5A056B4143A25490AAF9E8D6ACC478C6EA955D20 -IV=0815D10366CF1A1BB5F9D23FEACD93E6 -CT=B84D7D91E60C131F6F042D403D85C47B -PT=4DDF64827A16F90B5E6B306E8F227DB7 - -I=336 -KEY=C15019D3523304CC9231B33C53C7FE1E0E7D3012D0EF11DDF2AF48A865B72097 -IV=50BB3EC0FB03B269ABA2B1A109C2955F -CT=4DDF64827A16F90B5E6B306E8F227DB7 -PT=FDF6E5B6486E11839EB3A7F5C3898F54 - -I=337 -KEY=E24B749901384F48B2E740C51175E311F38BD5A49881005E6C1CEF5DA63EAFC3 -IV=231B6D4A530B4B8420D6F3F942B21D0F -CT=FDF6E5B6486E11839EB3A7F5C3898F54 -PT=841EF37B4AF82CC5EB00E11775079D81 - -I=338 -KEY=44B7FFFA042DCA1BF276D4911D4B0BE2779526DFD2792C9B871C0E4AD3393242 -IV=A6FC8B6305158553409194540C3EE8F3 -CT=841EF37B4AF82CC5EB00E11775079D81 -PT=1725AF7F70B65FBB060D29B3BCDF0A31 - -I=339 -KEY=B724B2CD569E436B20594E10576934BF60B089A0A2CF7320811127F96FE63873 -IV=F3934D3752B38970D22F9A814A223F5D -CT=1725AF7F70B65FBB060D29B3BCDF0A31 -PT=2CCC6D09954E5FE6C6A87E18950EED02 - -I=340 -KEY=E9EB02E31CABD14DFF231F1F649294044C7CE4A937812CC647B959E1FAE8D571 -IV=5ECFB02E4A359226DF7A510F33FBA0BB -CT=2CCC6D09954E5FE6C6A87E18950EED02 -PT=C82C82AF68EACE2AF22C3266F898F573 - -I=341 -KEY=90C8F71B05BE122AFE5D58A7A1AAB666845066065F6BE2ECB5956B8702702002 -IV=7923F5F81915C367017E47B8C5382262 -CT=C82C82AF68EACE2AF22C3266F898F573 -PT=377F6966928959F2D68F3A2BD0EA3735 - -I=342 -KEY=1BE70B607CF9A9E35DF916C4CC103FEBB32F0F60CDE2BB1E631A51ACD29A1737 -IV=8B2FFC7B7947BBC9A3A44E636DBA898D -CT=377F6966928959F2D68F3A2BD0EA3735 -PT=3A8CCF4943B9866A9ABBEC0BA46F25DB - -I=343 -KEY=631B2C30FEA26433F0CBCD01B1CE974089A3C0298E5B3D74F9A1BDA776F532EC -IV=78FC2750825BCDD0AD32DBC57DDEA8AB -CT=3A8CCF4943B9866A9ABBEC0BA46F25DB -PT=3B767EAB7F0C2D24BBE5565E93DC3E24 - -I=344 -KEY=8785E70A8CD45A8FE1E4382DC62D563DB2D5BE82F15710504244EBF9E5290CC8 -IV=E49ECB3A72763EBC112FF52C77E3C17D -CT=3B767EAB7F0C2D24BBE5565E93DC3E24 -PT=619610C6A4A8E9B196E65D2E5D463968 - -I=345 -KEY=B49BAD1E8EB8B9CF7F32048A81E5BCD3D343AE4455FFF9E1D4A2B6D7B86F35A0 -IV=331E4A14026CE3409ED63CA747C8EAEE -CT=619610C6A4A8E9B196E65D2E5D463968 -PT=F12AF66580B33C3113C45CF5EFD52F4F - -I=346 -KEY=3C92453C6342B6CDC18BFE05241EB5D922695821D54CC5D0C766EA2257BA1AEF -IV=8809E822EDFA0F02BEB9FA8FA5FB090A -CT=F12AF66580B33C3113C45CF5EFD52F4F -PT=A427E0B2CD34285167999A9F18295D26 - -I=347 -KEY=24A1F21CA68CF23F1674BF5328219987864EB8931878ED81A0FF70BD4F9347C9 -IV=1833B720C5CE44F2D7FF41560C3F2C5E -CT=A427E0B2CD34285167999A9F18295D26 -PT=85F5855ACB2741070E1C89F904CBDBEA - -I=348 -KEY=B5479F4D4A0DBBFFBF86C576009F241403BB3DC9D35FAC86AEE3F9444B589C23 -IV=91E66D51EC8149C0A9F27A2528BEBD93 -CT=85F5855ACB2741070E1C89F904CBDBEA -PT=295D7A02348A185F5C54113C734E9003 - -I=349 -KEY=AA9CE82B0B649063C874699C71E8A94E2AE647CBE7D5B4D9F2B7E87838160C20 -IV=1FDB776641692B9C77F2ACEA71778D5A -CT=295D7A02348A185F5C54113C734E9003 -PT=E466F369B840296AAB1A24ED32A19F51 - -I=350 -KEY=A2BA72E2906E04C42C0047EF222FFFE6CE80B4A25F959DB359ADCC950AB79371 -IV=08269AC99B0A94A7E4742E7353C756A8 -CT=E466F369B840296AAB1A24ED32A19F51 -PT=099CEB8099DD025E4A57015168F75388 - -I=351 -KEY=EA9B425CCD937976EB04693F16C4DAC4C71C5F22C6489FED13FACDC46240C0F9 -IV=482130BE5DFD7DB2C7042ED034EB2522 -CT=099CEB8099DD025E4A57015168F75388 -PT=E40CD2C0A7E7CB35C64AEB396338A801 - -I=352 -KEY=D31BCE56BA19A7CB6057C5F2CCB3786223108DE261AF54D8D5B026FD017868F8 -IV=39808C0A778ADEBD8B53ACCDDA77A2A6 -CT=E40CD2C0A7E7CB35C64AEB396338A801 -PT=12E94732A52D15C624A8E554AB54C9A4 - -I=353 -KEY=F0CD039C509E0EFF71B18AE3FEEB186D31F9CAD0C482411EF118C3A9AA2CA15C -IV=23D6CDCAEA87A93411E64F113258600F -CT=12E94732A52D15C624A8E554AB54C9A4 -PT=241C32C2C0C5C6CBE4BB354C054C68D7 - -I=354 -KEY=0579BEABF73DD177C1F1F0827DA20BA115E5F812044787D515A3F6E5AF60C98B -IV=F5B4BD37A7A3DF88B0407A61834913CC -CT=241C32C2C0C5C6CBE4BB354C054C68D7 -PT=E4EA5643CF19EF64820A1B591DE1C378 - -I=355 -KEY=99C7C61F7153FFA0F07380D052431667F10FAE51CB5E68B197A9EDBCB2810AF3 -IV=9CBE78B4866E2ED7318270522FE11DC6 -CT=E4EA5643CF19EF64820A1B591DE1C378 -PT=BC86D5465171B667CE837F874D933FF4 - -I=356 -KEY=C2A65A0A2E71F6E7E2BD9FBB5049F7914D897B179A2FDED6592A923BFF123507 -IV=5B619C155F22094712CE1F6B020AE1F6 -CT=BC86D5465171B667CE837F874D933FF4 -PT=EEB9DC4EBD27720AD3527A1323D85413 - -I=357 -KEY=B635E7EFD987991CD29414B3EBAB2EA4A330A7592708ACDC8A78E828DCCA6114 -IV=7493BDE5F7F66FFB30298B08BBE2D935 -CT=EEB9DC4EBD27720AD3527A1323D85413 -PT=78591E006B877AC6880834E3F98FD6B0 - -I=358 -KEY=F5849125E52B6DF3CD8144DDB64178DDDB69B9594C8FD61A0270DCCB2545B7A4 -IV=43B176CA3CACF4EF1F15506E5DEA5679 -CT=78591E006B877AC6880834E3F98FD6B0 -PT=8F9A67CF96F4608D56923CB267855F3F - -I=359 -KEY=41885734A072249ADE0091A0AD87F47854F3DE96DA7BB69754E2E07942C0E89B -IV=B40CC611455949691381D57D1BC68CA5 -CT=8F9A67CF96F4608D56923CB267855F3F -PT=1B0B8D9118CBECBA2D5AD17A261F9D56 - -I=360 -KEY=FF1A5B86E3545D9CB01A1222EC99A81C4FF85307C2B05A2D79B8310364DF75CD -IV=BE920CB2432679066E1A8382411E5C64 -CT=1B0B8D9118CBECBA2D5AD17A261F9D56 -PT=6225E63F0C1A5DE00FD63032908A51F3 - -I=361 -KEY=836FB4DC9C17E5AD70404B41CC4A043E2DDDB538CEAA07CD766E0131F455243E -IV=7C75EF5A7F43B831C05A596320D3AC22 -CT=6225E63F0C1A5DE00FD63032908A51F3 -PT=7C66E540C016FB81A345E10331FCAFF3 - -I=362 -KEY=63CA7D0E2675E43626B5311A7BA7131B51BB50780EBCFC4CD52BE032C5A98BCD -IV=E0A5C9D2BA62019B56F57A5BB7ED1725 -CT=7C66E540C016FB81A345E10331FCAFF3 -PT=2F010053D3C59BB8ACB5B13B197A4204 - -I=363 -KEY=6B5C4A2DD70FFF3023B2A775BECF05607EBA502BDD7967F4799E5109DCD3C9C9 -IV=08963723F17A1B060507966FC568167B -CT=2F010053D3C59BB8ACB5B13B197A4204 -PT=8918E06B8619B43E859171A345E246AE - -I=364 -KEY=575661F811B8D8B50980A55848A48949F7A2B0405B60D3CAFC0F20AA99318F67 -IV=3C0A2BD5C6B727852A32022DF66B8C29 -CT=8918E06B8619B43E859171A345E246AE -PT=60FF920A8495AD880459737525C109D6 - -I=365 -KEY=5FACBE49DE8F64786918067E7E361681975D224ADFF57E42F85653DFBCF086B1 -IV=08FADFB1CF37BCCD6098A32636929FC8 -CT=60FF920A8495AD880459737525C109D6 -PT=03F09A2C18DB8BAE5CCC93B9165A1D16 - -I=366 -KEY=9BFDA5803AC1C3004F0B138885DE59FE94ADB866C72EF5ECA49AC066AAAA9BA7 -IV=C4511BC9E44EA778261315F6FBE84F7F -CT=03F09A2C18DB8BAE5CCC93B9165A1D16 -PT=52CB3AF36047F4D14C2EAEE3C3F8AF2A - -I=367 -KEY=614239035D7EF489DE2F88FDB6188EC3C6668295A769013DE8B46E856952348D -IV=FABF9C8367BF378991249B7533C6D73D -CT=52CB3AF36047F4D14C2EAEE3C3F8AF2A -PT=249794B3822BB06708B5D5777D297C40 - -I=368 -KEY=20BEFE90BA9C7EE9CFB1E569FE354258E2F116262542B15AE001BBF2147B48CD -IV=41FCC793E7E28A60119E6D94482DCC9B -CT=249794B3822BB06708B5D5777D297C40 -PT=1836AE59EAE452DAC108618DECD666BD - -I=369 -KEY=E11E8BF6DE253E4FBADEDFD44B34BE15FAC7B87FCFA6E3802109DA7FF8AD2E70 -IV=C1A0756664B940A6756F3ABDB501FC4D -CT=1836AE59EAE452DAC108618DECD666BD -PT=20EE84DEB0E7B0C83D74CE251AA1615C - -I=370 -KEY=D519038D457B4BCD9DD50C8F64FE2F2ADA293CA17F4153481C7D145AE20C4F2C -IV=3407887B9B5E7582270BD35B2FCA913F -CT=20EE84DEB0E7B0C83D74CE251AA1615C -PT=6FA7D3584A2E4B803AC1AC07B09931A2 - -I=371 -KEY=82F1611CFB9E7AF9F9274C6BF1B96BEBB58EEFF9356F18C826BCB85D52957E8E -IV=57E86291BEE5313464F240E4954744C1 -CT=6FA7D3584A2E4B803AC1AC07B09931A2 -PT=A7B8F8AC07BAB843F4E7942A6E4A85D5 - -I=372 -KEY=DFF5A6DE8ADE9AB78CF1E637F44FD3351236175532D5A08BD25B2C773CDFFB5B -IV=5D04C7C27140E04E75D6AA5C05F6B8DE -CT=A7B8F8AC07BAB843F4E7942A6E4A85D5 -PT=7F3C3702404E6E013474A0AA0EF85527 - -I=373 -KEY=9C6A11136F64F462E7C5CB30049CDA056D0A2057729BCE8AE62F8CDD3227AE7C -IV=439FB7CDE5BA6ED56B342D07F0D30930 -CT=7F3C3702404E6E013474A0AA0EF85527 -PT=7C0C44DC96872DEE0BAC71DDBDCC84E3 - -I=374 -KEY=2C95624ADD9B1E09F13AE579333B22BB1106648BE41CE364ED83FD008FEB2A9F -IV=B0FF7359B2FFEA6B16FF2E4937A7F8BE -CT=7C0C44DC96872DEE0BAC71DDBDCC84E3 -PT=B9E4597C562E9B5C0E6815E64F767CE9 - -I=375 -KEY=CBB3F14A21E49825990B89E7D07BC386A8E23DF7B2327838E3EBE8E6C09D5676 -IV=E7269300FC7F862C68316C9EE340E13D -CT=B9E4597C562E9B5C0E6815E64F767CE9 -PT=4B37A1FD978F50BE9EA482CFBEACFA08 - -I=376 -KEY=65B742FFD29D9B07F3956625AED7382EE3D59C0A25BD28867D4F6A297E31AC7E -IV=AE04B3B5F37903226A9EEFC27EACFBA8 -CT=4B37A1FD978F50BE9EA482CFBEACFA08 -PT=D3406B71FFC847C364199666A808C43A - -I=377 -KEY=6C6A4DE74AF6C443B4F6A1C7DAB4A28E3095F77BDA756F451956FC4FD6396844 -IV=09DD0F18986B5F444763C7E274639AA0 -CT=D3406B71FFC847C364199666A808C43A -PT=94744ECE39108CB8084DF8A17C49CDCC - -I=378 -KEY=AD09E82AFAA9F5168CD9B83F44C096A0A4E1B9B5E365E3FD111B04EEAA70A588 -IV=C163A5CDB05F3155382F19F89E74342E -CT=94744ECE39108CB8084DF8A17C49CDCC -PT=45EF43A20D7F174DA1463DDA678BBFFB - -I=379 -KEY=DC29CBF4E8B92311A9AA788C437A8EDDE10EFA17EE1AF4B0B05D3934CDFB1A73 -IV=712023DE1210D6072573C0B307BA187D -CT=45EF43A20D7F174DA1463DDA678BBFFB -PT=4480FB073AA197507E376C56B824C753 - -I=380 -KEY=93308B36D3A2E1A952B96FE4687B2DF9A58E0110D4BB63E0CE6A556275DFDD20 -IV=4F1940C23B1BC2B8FB1317682B01A324 -CT=4480FB073AA197507E376C56B824C753 -PT=C8BBB77D206EF37C7C40DB175D105271 - -I=381 -KEY=9682C995955D18471758C504201E93AC6D35B66DF4D5909CB22A8E7528CF8F51 -IV=05B242A346FFF9EE45E1AAE04865BE55 -CT=C8BBB77D206EF37C7C40DB175D105271 -PT=50C0B9001C716D53470FC9B011191402 - -I=382 -KEY=60854B33BE79B0E631B1AF9046C46D153DF50F6DE8A4FDCFF52547C539D69B53 -IV=F60782A62B24A8A126E96A9466DAFEB9 -CT=50C0B9001C716D53470FC9B011191402 -PT=8DB5367A34C5E5B93486AB07CA8BB02E - -I=383 -KEY=7EE74E63D01F31D44B3860471B0BE50FB0403917DC611876C1A3ECC2F35D2B7D -IV=1E6205506E6681327A89CFD75DCF881A -CT=8DB5367A34C5E5B93486AB07CA8BB02E -PT=4F9B922C88C1750829D9088F16EDB529 - -I=384 -KEY=A65EE6CE576182F487D2C21C4F8539F3FFDBAB3B54A06D7EE87AE44DE5B09E54 -IV=D8B9A8AD877EB320CCEAA25B548EDCFC -CT=4F9B922C88C1750829D9088F16EDB529 -PT=05A705F6B55D3ACF3E95E8264FEFFDCC - -I=385 -KEY=64F9A7DF5DA898C968746F96692F1892FA7CAECDE1FD57B1D6EF0C6BAA5F6398 -IV=C2A741110AC91A3DEFA6AD8A26AA2161 -CT=05A705F6B55D3ACF3E95E8264FEFFDCC -PT=D1FB7C1A698990AC81068D08BE1CE91F - -I=386 -KEY=019663655974433AD5731BC4388A067D2B87D2D78874C71D57E9816314438A87 -IV=656FC4BA04DCDBF3BD07745251A51EEF -CT=D1FB7C1A698990AC81068D08BE1CE91F -PT=A1CD24AAFCEE3A60A025B983D10D8E54 - -I=387 -KEY=16EF87A84F0627345CED6385A62374778A4AF67D749AFD7DF7CC38E0C54E04D3 -IV=1779E4CD1672640E899E78419EA9720A -CT=A1CD24AAFCEE3A60A025B983D10D8E54 -PT=B9064D063D2C8D8D935B53CBEF3224E2 - -I=388 -KEY=80931C61E23BA976FFC9288F74AD876D334CBB7B49B670F064976B2B2A7C2031 -IV=967C9BC9AD3D8E42A3244B0AD28EF31A -CT=B9064D063D2C8D8D935B53CBEF3224E2 -PT=8AD3B2222D84A4B25DC1311378027207 - -I=389 -KEY=227ACE0315678DEE433049D8CDFEE2D8B99F09596432D44239565A38527E5236 -IV=A2E9D262F75C2498BCF96157B95365B5 -CT=8AD3B2222D84A4B25DC1311378027207 -PT=3A7FC9D43F1F997FAF4931101C5B5FD4 - -I=390 -KEY=11799A22D50C53A89EDF396B7C7565AD83E0C08D5B2D4D3D961F6B284E250DE2 -IV=33035421C06BDE46DDEF70B3B18B8775 -CT=3A7FC9D43F1F997FAF4931101C5B5FD4 -PT=930860056FE2FDDC10059D09385C0415 - -I=391 -KEY=58DE85D9975D5F8A16C47C834568EF1D10E8A08834CFB0E1861AF621767909F7 -IV=49A71FFB42510C22881B45E8391D8AB0 -CT=930860056FE2FDDC10059D09385C0415 -PT=F41CCB823840FF7D16C6990A14E591D9 - -I=392 -KEY=3C8567CD05AF33761FE05FBDC2596EBFE4F46B0A0C8F4F9C90DC6F2B629C982E -IV=645BE21492F26CFC0924233E873181A2 -CT=F41CCB823840FF7D16C6990A14E591D9 -PT=82899B698456363C175791B845D5736F - -I=393 -KEY=F50F05CBDDFEBE7A656EE5C08CC24FF5667DF06388D979A0878BFE932749EB41 -IV=C98A6206D8518D0C7A8EBA7D4E9B214A -CT=82899B698456363C175791B845D5736F -PT=CF85BFDA1DFF5ADFFAF1B3E000B407F3 - -I=394 -KEY=B44AA91A374D1C5A7BD00557CBD24962A9F84FB99526237F7D7A4D7327FDECB2 -IV=4145ACD1EAB3A2201EBEE09747100697 -CT=CF85BFDA1DFF5ADFFAF1B3E000B407F3 -PT=34EEA75CC20C6EDEE9A5379C3B5CF01A - -I=395 -KEY=4C401127C0AFABBEA4C93FD80BA009CC9D16E8E5572A4DA194DF7AEF1CA11CA8 -IV=F80AB83DF7E2B7E4DF193A8FC07240AE -CT=34EEA75CC20C6EDEE9A5379C3B5CF01A -PT=27C6392ABE790B448CC9216B3FCF5454 - -I=396 -KEY=44D59CB8EBCC91362462D1D8FE193270BAD0D1CFE95346E518165B84236E48FC -IV=08958D9F2B633A8880ABEE00F5B93BBC -CT=27C6392ABE790B448CC9216B3FCF5454 -PT=2C39AC10C7D51B61D8F437D9BAA24A55 - -I=397 -KEY=E42795DA2BF8FA7A3B0E83923A5E243196E97DDF2E865D84C0E26C5D99CC02A9 -IV=A0F20962C0346B4C1F6C524AC4471641 -CT=2C39AC10C7D51B61D8F437D9BAA24A55 -PT=F828BC735827C106E61F8FFFE9453A77 - -I=398 -KEY=7F05DC0CD80178018D3A90E4A0CE63156EC1C1AC76A19C8226FDE3A2708938DE -IV=9B2249D6F3F9827BB63413769A904724 -CT=F828BC735827C106E61F8FFFE9453A77 -PT=DF8129A79852FEE2A8015A2379A7215B - -I=399 -KEY=935560C6072D897477D71AC4C12188D0B140E80BEEF362608EFCB981092E1985 -IV=EC50BCCADF2CF175FAED8A2061EFEBC5 -CT=DF8129A79852FEE2A8015A2379A7215B -PT=CD6429CF3F81F8B4F82BC627A8283096 - + +========================= + +FILENAME: "cbc_d_m.txt" + +Cipher Block Chaining (CBC) Mode - DECRYPTION +Monte Carlo Test + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========== + +KEYSIZE=128 + +I=0 +KEY=00000000000000000000000000000000 +IV=00000000000000000000000000000000 +CT=00000000000000000000000000000000 +PT=FACA37E0B0C85373DF706E73F7C9AF86 + +I=1 +KEY=FACA37E0B0C85373DF706E73F7C9AF86 +IV=52D0C29FF8793A519BD6A8289FC80E6A +CT=FACA37E0B0C85373DF706E73F7C9AF86 +PT=F5372F9735C5685F1DA362AF6ECB2940 + +I=2 +KEY=0FFD1877850D3B2CC2D30CDC990286C6 +IV=DD74BB1AC6F0F866C7992C61F59D5594 +CT=F5372F9735C5685F1DA362AF6ECB2940 +PT=5496A4C29C7670F61B5D5DF6181F5947 + +I=3 +KEY=5B6BBCB5197B4BDAD98E512A811DDF81 +IV=3795C88134F7C011433397D1443FEB3A +CT=5496A4C29C7670F61B5D5DF6181F5947 +PT=940CC5A2AF4F1F8D1862B47BCF63E4CA + +I=4 +KEY=CF677917B6345457C1ECE5514E7E3B4B +IV=0FC1413900225B47AF9E139E1650EA23 +CT=940CC5A2AF4F1F8D1862B47BCF63E4CA +PT=08832415D97820DE305A58A9AD111A9E + +I=5 +KEY=C7E45D026F4C7489F1B6BDF8E36F21D5 +IV=3032F64674FA243D61DF8C16313D81F3 +CT=08832415D97820DE305A58A9AD111A9E +PT=BD4089775FD1BDB0A6C4F36D1DDAA93E + +I=6 +KEY=7AA4D475309DC93957724E95FEB588EB +IV=47D7F440B43888F173AE5A492F1A99F8 +CT=BD4089775FD1BDB0A6C4F36D1DDAA93E +PT=AB9955F74612859267D61FEA85A75ADC + +I=7 +KEY=D13D8182768F4CAB30A4517F7B12D237 +IV=6D9E57242195D27771D1C7A748378AB0 +CT=AB9955F74612859267D61FEA85A75ADC +PT=168F213FB678D8A46D0E55EFD1C49BB3 + +I=8 +KEY=C7B2A0BDC0F7940F5DAA0490AAD64984 +IV=1B98968FB5ABD95930525C1257DEB364 +CT=168F213FB678D8A46D0E55EFD1C49BB3 +PT=3C4CEECFF9560501C5D8C901D87C8E7B + +I=9 +KEY=FBFE4E7239A1910E9872CD9172AAC7FF +IV=35EB7B6D3F63AAE927C5346C9C2CB91D +CT=3C4CEECFF9560501C5D8C901D87C8E7B +PT=9D206BE0CC60296BF3A486A8C69778EF + +I=10 +KEY=66DE2592F5C1B8656BD64B39B43DBF10 +IV=226646B36D8E9B9279F94378CCBF8FBA +CT=9D206BE0CC60296BF3A486A8C69778EF +PT=9DA7B8094BD0F0BEA26848C84B8E083C + +I=11 +KEY=FB799D9BBE1148DBC9BE03F1FFB3B72C +IV=3E3A2B0E1C70A19BCD7222708AA94F26 +CT=9DA7B8094BD0F0BEA26848C84B8E083C +PT=6A93B2F318C14C2D3E58455B86A4F5D7 + +I=12 +KEY=91EA2F68A6D004F6F7E646AA791742FB +IV=1F256942B3CD691858A20664BB24545E +CT=6A93B2F318C14C2D3E58455B86A4F5D7 +PT=4A19AC6C6FEB654D3675A2BE32E5A820 + +I=13 +KEY=DBF38304C93B61BBC193E4144BF2EADB +IV=631F2EDE05C1C950BCE67DF53BA53ED6 +CT=4A19AC6C6FEB654D3675A2BE32E5A820 +PT=799EAB8E9C864A13490FD6B089F764C5 + +I=14 +KEY=A26D288A55BD2BA8889C32A4C2058E1E +IV=F6AD064E0DBF4AF4AA5165E1FE0E86FA +CT=799EAB8E9C864A13490FD6B089F764C5 +PT=2FA3F38CA1216C6D911C1779F333413E + +I=15 +KEY=8DCEDB06F49C47C5198025DD3136CF20 +IV=DA039AC5F4EDCD84472B23CFA1252EC3 +CT=2FA3F38CA1216C6D911C1779F333413E +PT=2FC703AD6A7DAF8B0BDDD8586C1D67D0 + +I=16 +KEY=A209D8AB9EE1E84E125DFD855D2BA8F0 +IV=341B5FDA8AB434461A7B7A87EF0C530C +CT=2FC703AD6A7DAF8B0BDDD8586C1D67D0 +PT=54723CABFBE32DEEDFEBF4292A5710FA + +I=17 +KEY=F67BE4006502C5A0CDB609AC777CB80A +IV=2C42AD577B0BE057555C3FCB6FC0089E +CT=54723CABFBE32DEEDFEBF4292A5710FA +PT=6B1E2A8C1A9CBB95D1B34AAFE15A78D3 + +I=18 +KEY=9D65CE8C7F9E7E351C0543039626C0D9 +IV=E5E06583A834BF16118ED5FA401A2D6F +CT=6B1E2A8C1A9CBB95D1B34AAFE15A78D3 +PT=F4E57BFAB65375B3AD49CD78814F0C16 + +I=19 +KEY=6980B576C9CD0B86B14C8E7B1769CCCF +IV=71E59389FF6F992225B32960593F9362 +CT=F4E57BFAB65375B3AD49CD78814F0C16 +PT=90A31B5934FCF6822526C973114BD953 + +I=20 +KEY=F923AE2FFD31FD04946A47080622159C +IV=2A4B31492B9BAEC402C255978BB96D40 +CT=90A31B5934FCF6822526C973114BD953 +PT=61F88BA8D438A0FD23F0101465C7FD4E + +I=21 +KEY=98DB258729095DF9B79A571C63E5E8D2 +IV=607640CEA12DCF7F188B2B65C7F4153D +CT=61F88BA8D438A0FD23F0101465C7FD4E +PT=F62D206DF53F41CA898F3A8EB6A843FF + +I=22 +KEY=6EF605EADC361C333E156D92D54DAB2D +IV=D69C32E12303361B465BE9A484BCA723 +CT=F62D206DF53F41CA898F3A8EB6A843FF +PT=364BC3F9FDA5FB1AEEA7691550A58320 + +I=23 +KEY=58BDC6132193E729D0B2048785E8280D +IV=C207B8347B8DB8BC6845827BB6986B0E +CT=364BC3F9FDA5FB1AEEA7691550A58320 +PT=DAA6386A073CD1653E9A9DB0A97970BA + +I=24 +KEY=821BFE7926AF364CEE2899372C9158B7 +IV=6C5D2B186393280253D6922A8421C3A9 +CT=DAA6386A073CD1653E9A9DB0A97970BA +PT=AAF74F0E0A0141A811853AE8B120BC00 + +I=25 +KEY=28ECB1772CAE77E4FFADA3DF9DB1E4B7 +IV=3CB62EF0E649027DDDB76206D0F4D355 +CT=AAF74F0E0A0141A811853AE8B120BC00 +PT=22A0F9611447C1A85F397DD79E3206F9 + +I=26 +KEY=0A4C481638E9B64CA094DE080383E24E +IV=C4320FA90686AE0F9E979CBF1391F6D6 +CT=22A0F9611447C1A85F397DD79E3206F9 +PT=1871ABDEAA7E057E76D41ED9191FAC39 + +I=27 +KEY=123DE3C89297B332D640C0D11A9C4E77 +IV=FBFD18AADF7C5E8E96EB976A535BF312 +CT=1871ABDEAA7E057E76D41ED9191FAC39 +PT=BF52994F41B1DEF78C6A057642C52D89 + +I=28 +KEY=AD6F7A87D3266DC55A2AC5A7585963FE +IV=C195141578ADF4C92113C8A9A63FF072 +CT=BF52994F41B1DEF78C6A057642C52D89 +PT=3EAFB00E3B4A0E6DF74743A7EDAD0FE4 + +I=29 +KEY=93C0CA89E86C63A8AD6D8600B5F46C1A +IV=D1C4E98C4A9AC79B7CCBC052ACF78913 +CT=3EAFB00E3B4A0E6DF74743A7EDAD0FE4 +PT=4393544AB2387A93496D683C2B8970C7 + +I=30 +KEY=D0539EC35A54193BE400EE3C9E7D1CDD +IV=80517C6341DAF4DCBCCAE452F3040147 +CT=4393544AB2387A93496D683C2B8970C7 +PT=51DAC594293708A918E9EFC04F7F2F1C + +I=31 +KEY=81895B5773631192FCE901FCD10233C1 +IV=69DE50406B4E3E8A94C1367E1E3D5464 +CT=51DAC594293708A918E9EFC04F7F2F1C +PT=035B64F06C8166000C82BF15CC88446D + +I=32 +KEY=82D23FA71FE27792F06BBEE91D8A77AC +IV=8EA2E38145BBD79881B7EB31B8818A21 +CT=035B64F06C8166000C82BF15CC88446D +PT=F3EFFA770A21741551F309E1967CC2E4 + +I=33 +KEY=713DC5D015C30387A198B7088BF6B548 +IV=0DCAA309668E11509828152553FF2306 +CT=F3EFFA770A21741551F309E1967CC2E4 +PT=62BA0548E7AD136BEB4E38AECD7942D9 + +I=34 +KEY=1387C098F26E10EC4AD68FA6468FF791 +IV=D031FCA5F3C88926CC3BDDC448537B69 +CT=62BA0548E7AD136BEB4E38AECD7942D9 +PT=38E3D4C7AF0C3E494F1D580AC5430634 + +I=35 +KEY=2B64145F5D622EA505CBD7AC83CCF1A5 +IV=6FFA5A45EDA60294B0224EEB8C36C455 +CT=38E3D4C7AF0C3E494F1D580AC5430634 +PT=2231EB6A6588CBCB56B930B7F1CF9E04 + +I=36 +KEY=0955FF3538EAE56E5372E71B72036FA1 +IV=B5375674631ECC3334A318993CB81F9A +CT=2231EB6A6588CBCB56B930B7F1CF9E04 +PT=59692274C130D6820287EA10F7E64602 + +I=37 +KEY=503CDD41F9DA33EC51F50D0B85E529A3 +IV=A93D6E028B5C2BD17A29C6CA1617A0A2 +CT=59692274C130D6820287EA10F7E64602 +PT=5975A95327DE7749EA8DEDC580E5E8C7 + +I=38 +KEY=09497412DE0444A5BB78E0CE0500C164 +IV=26E00CB161145FCD00C39BC4FB1E5CBB +CT=5975A95327DE7749EA8DEDC580E5E8C7 +PT=D1F7E36BC8FF4439820CB617E745A9CC + +I=39 +KEY=D8BE977916FB009C397456D9E24568A8 +IV=72E78D9E15C8FBA864C6C40CEBB190B8 +CT=D1F7E36BC8FF4439820CB617E745A9CC +PT=76FB4F20C902E9AA89854440631092B5 + +I=40 +KEY=AE45D859DFF9E936B0F112998155FA1D +IV=4B6C585FEF52490EA62BAAD08FAA3DCF +CT=76FB4F20C902E9AA89854440631092B5 +PT=6D7D4487DCD624B2FC5002DFE7D2D347 + +I=41 +KEY=C3389CDE032FCD844CA110466687295A +IV=E94FD23A598DDE077CD1DAEE97FDADD9 +CT=6D7D4487DCD624B2FC5002DFE7D2D347 +PT=7297F8F85B21E1A5CB902DCC5F6738F9 + +I=42 +KEY=B1AF6426580E2C2187313D8A39E011A3 +IV=86E495D31EEFCBC30064414FBD78FAE5 +CT=7297F8F85B21E1A5CB902DCC5F6738F9 +PT=4A6978AACC6968931FB1B83D53D31FEF + +I=43 +KEY=FBC61C8C946744B2988085B76A330E4C +IV=6BA7664AB5ED4F7956D6C3FAA7C42961 +CT=4A6978AACC6968931FB1B83D53D31FEF +PT=6B63FAAF9DB43A2B6025F29B1D6A331C + +I=44 +KEY=90A5E62309D37E99F8A5772C77593D50 +IV=37D17D1702EA34A3C75376AA0F9D24AD +CT=6B63FAAF9DB43A2B6025F29B1D6A331C +PT=8317A07BEE0BF16B88D7D197884AC6CF + +I=45 +KEY=13B24658E7D88FF27072A6BBFF13FB9F +IV=29B89B238062495C260AF44C63AA809F +CT=8317A07BEE0BF16B88D7D197884AC6CF +PT=0443BFEBCA7C85CBD0CB66AB9D75425D + +I=46 +KEY=17F1F9B32DA40A39A0B9C0106266B9C2 +IV=08CF82854AE07429C4A866AA727CEA2E +CT=0443BFEBCA7C85CBD0CB66AB9D75425D +PT=6B1EB033CB844F9BDD96BA2C67D139C7 + +I=47 +KEY=7CEF4980E62045A27D2F7A3C05B78005 +IV=05579F3E0017EBF6083756DC0A50A2E9 +CT=6B1EB033CB844F9BDD96BA2C67D139C7 +PT=E7904CBFB41EBE4178B4D633AFC9B311 + +I=48 +KEY=9B7F053F523EFBE3059BAC0FAA7E3314 +IV=E6B2CB0CE57E02A230DCD16C08614823 +CT=E7904CBFB41EBE4178B4D633AFC9B311 +PT=96EAAA148F05FAD1F0FC06E135EC5DF8 + +I=49 +KEY=0D95AF2BDD3B0132F567AAEE9F926EEC +IV=4268294B10AD58BE9E570A9485963682 +CT=96EAAA148F05FAD1F0FC06E135EC5DF8 +PT=9F2F712F62DE747EE479A0A74384B196 + +I=50 +KEY=92BADE04BFE5754C111E0A49DC16DF7A +IV=A5C558F5D4658089CD9FB295EDAE64DB +CT=9F2F712F62DE747EE479A0A74384B196 +PT=9CF7F00094C4E2D96D752C2312FC135E + +I=51 +KEY=0E4D2E042B2197957C6B266ACEEACC24 +IV=1CE301F294BDF4C906E5F0A6FA7C22BB +CT=9CF7F00094C4E2D96D752C2312FC135E +PT=ABA58D548DB6E9BE977FDDC85E16C2DE + +I=52 +KEY=A5E8A350A6977E2BEB14FBA290FC0EFA +IV=66C1FF1E4B52A3542B48306EC33F171D +CT=ABA58D548DB6E9BE977FDDC85E16C2DE +PT=802948E1A5177FBE97ABA26B996FDF1B + +I=53 +KEY=25C1EBB1038001957CBF59C90993D1E1 +IV=197A546DEB2E19E17507276B9ED95135 +CT=802948E1A5177FBE97ABA26B996FDF1B +PT=67D931C0946ECDF2F8E41000726D1A56 + +I=54 +KEY=4218DA7197EECC67845B49C97BFECBB7 +IV=D11DA3CE92ADA0686F7BF12A4796D9F7 +CT=67D931C0946ECDF2F8E41000726D1A56 +PT=386C68821385E8CFCDD5678FE2AA89F8 + +I=55 +KEY=7A74B2F3846B24A8498E2E469954424F +IV=4DDE413EBC3F30E2F3A9F48DA1258DAF +CT=386C68821385E8CFCDD5678FE2AA89F8 +PT=1638C741EFE3B1CC45C7754783350825 + +I=56 +KEY=6C4C75B26B8895640C495B011A614A6A +IV=5B4F013B085E3A04A16A409E8C3BB270 +CT=1638C741EFE3B1CC45C7754783350825 +PT=91AB00C3828D3DF72BEC487EF4652567 + +I=57 +KEY=FDE77571E905A89327A5137FEE046F0D +IV=98074F522144682FF1498C61581F8B0E +CT=91AB00C3828D3DF72BEC487EF4652567 +PT=BC5BA874D2F3039837528993FB275EBA + +I=58 +KEY=41BCDD053BF6AB0B10F79AEC152331B7 +IV=B65C1A6F80CA024B92176D57061ECDFE +CT=BC5BA874D2F3039837528993FB275EBA +PT=B7DE1BEE1867F4DC3F974E0D8B416DB0 + +I=59 +KEY=F662C6EB23915FD72F60D4E19E625C07 +IV=7268C08FA807D83C9830F54A59F32662 +CT=B7DE1BEE1867F4DC3F974E0D8B416DB0 +PT=19769B9EB30B8DE5FD640ACE78F01F0A + +I=60 +KEY=EF145D75909AD232D204DE2FE692430D +IV=B260792BAB22BAAB6CCF3AE1DD3A0F85 +CT=19769B9EB30B8DE5FD640ACE78F01F0A +PT=2079F2C0A0DE164CD41FCE29D8CE3178 + +I=61 +KEY=CF6DAFB53044C47E061B10063E5C7275 +IV=6ABCE7B41E112B91B8E6BC0DBE37600C +CT=2079F2C0A0DE164CD41FCE29D8CE3178 +PT=0D3A678FAB06E743A9134C103B39B61D + +I=62 +KEY=C257C83A9B42233DAF085C160565C468 +IV=CEB1E776DBEF46BF8B949C0AF0EBEAD2 +CT=0D3A678FAB06E743A9134C103B39B61D +PT=80339ADB34BCDE3384D66170373AEEAC + +I=63 +KEY=426452E1AFFEFD0E2BDE3D66325F2AC4 +IV=EAAC373FCA05E610C1C5D4437AFD5631 +CT=80339ADB34BCDE3384D66170373AEEAC +PT=38D52D75E5783A08FBFE622633D6CF47 + +I=64 +KEY=7AB17F944A86C706D0205F400189E583 +IV=2A25ED6933CAAA95569ADA1AC7480942 +CT=38D52D75E5783A08FBFE622633D6CF47 +PT=3204F1EACBB520A69F0939F45BC82041 + +I=65 +KEY=48B58E7E8133E7A04F2966B45A41C5C2 +IV=9C6819799DAF61111ACC3C0ECEB0F8BF +CT=3204F1EACBB520A69F0939F45BC82041 +PT=16BD33EE541798BEE114E9D7F9141A9C + +I=66 +KEY=5E08BD90D5247F1EAE3D8F63A355DF5E +IV=C181F4DF1EE0E13BF76044A3DA5E3BC4 +CT=16BD33EE541798BEE114E9D7F9141A9C +PT=A0A68CF016C6AD8DAC4D5634EAADEBE5 + +I=67 +KEY=FEAE3160C3E2D2930270D95749F834BB +IV=2A4EE2CD011AF421616789DB790354FD +CT=A0A68CF016C6AD8DAC4D5634EAADEBE5 +PT=FCE7D92FD0B3A1C7920558F653E1019B + +I=68 +KEY=0249E84F13517354907581A11A193520 +IV=A7F7E2B701F34F308C0F28514DFAA15F +CT=FCE7D92FD0B3A1C7920558F653E1019B +PT=F16A084B2DE16D5E3E5405665DE3C623 + +I=69 +KEY=F323E0043EB01E0AAE2184C747FAF303 +IV=6D319828AAA75DFE99BEEDD21B983C7D +CT=F16A084B2DE16D5E3E5405665DE3C623 +PT=CE20AE629887DF02064F2D9DB092E1DB + +I=70 +KEY=3D034E66A637C108A86EA95AF76812D8 +IV=9484E76149F41901AF8AFD3152C56506 +CT=CE20AE629887DF02064F2D9DB092E1DB +PT=B457A655282213C1B7C5C2A206C7FCB9 + +I=71 +KEY=8954E8338E15D2C91FAB6BF8F1AFEE61 +IV=329E089DC915BD71B1F8D0713BFC4F97 +CT=B457A655282213C1B7C5C2A206C7FCB9 +PT=A89B8F7541FFF719A3C7DE1577CE1C3F + +I=72 +KEY=21CF6746CFEA25D0BC6CB5ED8661F25E +IV=FA381CAC5777234E6DF8A28A4E6671D8 +CT=A89B8F7541FFF719A3C7DE1577CE1C3F +PT=C4E73D25647350527C1F93F6C1D90296 + +I=73 +KEY=E5285A63AB997582C073261B47B8F0C8 +IV=082ACF3D2661514F0E00BDABC9015946 +CT=C4E73D25647350527C1F93F6C1D90296 +PT=34BF6DECECFE1C9AE3AA34B6DB3741EF + +I=74 +KEY=D197378F4767691823D912AD9C8FB127 +IV=3E56B658F899B6DBBA4EAF6E629F3555 +CT=34BF6DECECFE1C9AE3AA34B6DB3741EF +PT=FD86C78538176DC5D48BE2EC6B89D581 + +I=75 +KEY=2C11F00A7F7004DDF752F041F70664A6 +IV=765B823193F2738E6CACBB0154C941B1 +CT=FD86C78538176DC5D48BE2EC6B89D581 +PT=524E035AB9DEB29E467B9586A90F3A42 + +I=76 +KEY=7E5FF350C6AEB643B12965C75E095EE4 +IV=DE2B3EC0A3FF29EC67BBE1B124E9451A +CT=524E035AB9DEB29E467B9586A90F3A42 +PT=83DE1E768EED94BA09E623845A057834 + +I=77 +KEY=FD81ED26484322F9B8CF4643040C26D0 +IV=A5CF4D996D8460E71DDA938461BB884B +CT=83DE1E768EED94BA09E623845A057834 +PT=D8381D17B9BCF942F408DBB2B7B2D6B7 + +I=78 +KEY=25B9F031F1FFDBBB4CC79DF1B3BEF067 +IV=899696B8EDC4E8B60489742A2559C909 +CT=D8381D17B9BCF942F408DBB2B7B2D6B7 +PT=BF1D8175015D0A0341427DE1F7DDE379 + +I=79 +KEY=9AA47144F0A2D1B80D85E0104463131E +IV=AD76D13B2F2A3F938F5C810A38A83D09 +CT=BF1D8175015D0A0341427DE1F7DDE379 +PT=58114DEFF8CFF10F06B390EB01B13394 + +I=80 +KEY=C2B53CAB086D20B70B3670FB45D2208A +IV=9EC540C144AB57D4E5A9185F55E71E50 +CT=58114DEFF8CFF10F06B390EB01B13394 +PT=53E72B9603CE221F0160791DF51F6B3E + +I=81 +KEY=9152173D0BA302A80A5609E6B0CD4BB4 +IV=B780257238CA60FD998819B2D04CEB92 +CT=53E72B9603CE221F0160791DF51F6B3E +PT=AF0238554AAFFB0FB5DFAC35E3CE8F4C + +I=82 +KEY=3E502F68410CF9A7BF89A5D35303C4F8 +IV=3509BC884089ADEB90137A39AEA75CFC +CT=AF0238554AAFFB0FB5DFAC35E3CE8F4C +PT=20844D3F4F637B974D38B7E5F1C84205 + +I=83 +KEY=1ED462570E6F8230F2B11236A2CB86FD +IV=52BAB07EB72804630E4BD769F0172FDA +CT=20844D3F4F637B974D38B7E5F1C84205 +PT=68404E006D2F16572EDFAE636A62C537 + +I=84 +KEY=76942C5763409467DC6EBC55C8A943CA +IV=E4B417D85F36F3A25CF04AB05157F247 +CT=68404E006D2F16572EDFAE636A62C537 +PT=13C8DF4117D4EA3645F1825700F8FFA5 + +I=85 +KEY=655CF31674947E51999F3E02C851BC6F +IV=3FE0683442B6B5DF515209DE16F8FD4B +CT=13C8DF4117D4EA3645F1825700F8FFA5 +PT=42307D929439F2723202A5206D640431 + +I=86 +KEY=276C8E84E0AD8C23AB9D9B22A535B85E +IV=33FAD11D9D4057E7ED989F1520450C32 +CT=42307D929439F2723202A5206D640431 +PT=5ED8AF875ACF37BE8FAAC16D4AB8072B + +I=87 +KEY=79B42103BA62BB9D24375A4FEF8DBF75 +IV=807852E5AD0EB5E0C3A2AAF18DFB14F9 +CT=5ED8AF875ACF37BE8FAAC16D4AB8072B +PT=79C950A45ECDC8B676A5CFF324A81DA8 + +I=88 +KEY=007D71A7E4AF732B529295BCCB25A2DD +IV=516BC35B52C26C99E21C0147CB7DD99E +CT=79C950A45ECDC8B676A5CFF324A81DA8 +PT=595C3DDCFBD90661A3A70B94C470A26B + +I=89 +KEY=59214C7B1F76754AF1359E280F5500B6 +IV=FDABDD4BD60725F5E640629416F417D3 +CT=595C3DDCFBD90661A3A70B94C470A26B +PT=7957CF3989083D25B54C6890EC58DB0C + +I=90 +KEY=20768342967E486F4479F6B8E30DDBBA +IV=CADFADF417898DE3786D5DF869396611 +CT=7957CF3989083D25B54C6890EC58DB0C +PT=6C1E8DF34FC80DD2ECA00A1EDC5FC239 + +I=91 +KEY=4C680EB1D9B645BDA8D9FCA63F521983 +IV=A7DF9FA44AA2B49B9E26C6148CCAF36F +CT=6C1E8DF34FC80DD2ECA00A1EDC5FC239 +PT=72B5A426C9DC3B336756FB10B00626CE + +I=92 +KEY=3EDDAA97106A7E8ECF8F07B68F543F4D +IV=50FF574915D407A97A74CC399DE2D901 +CT=72B5A426C9DC3B336756FB10B00626CE +PT=194826159D7FAB9166D64F1DD6F627B0 + +I=93 +KEY=27958C828D15D51FA95948AB59A218FD +IV=A1E3BC848C019B6FC3F7072F9A866C52 +CT=194826159D7FAB9166D64F1DD6F627B0 +PT=0186B2316FC29104D3549C49F92AE414 + +I=94 +KEY=26133EB3E2D7441B7A0DD4E2A088FCE9 +IV=4DBA42F1031AE32016524C7F86781528 +CT=0186B2316FC29104D3549C49F92AE414 +PT=373384DB7383D3A4914C0141BB104B81 + +I=95 +KEY=1120BA68915497BFEB41D5A31B98B768 +IV=FFCB87107AC596D71BA807902D524247 +CT=373384DB7383D3A4914C0141BB104B81 +PT=25465CE5FA2AD65D75586064A18516A8 + +I=96 +KEY=3466E68D6B7E41E29E19B5C7BA1DA1C0 +IV=55879596C3F0A295FA00CFEF1B056248 +CT=25465CE5FA2AD65D75586064A18516A8 +PT=2311A52CEC4A16B5F4FCA613BC0BDB83 + +I=97 +KEY=177743A1873457576AE513D406167A43 +IV=B1A7DABF3D2384BF8754B829659B3989 +CT=2311A52CEC4A16B5F4FCA613BC0BDB83 +PT=357F4BF62308CD5C48F34E9E644DD515 + +I=98 +KEY=22080857A43C9A0B22165D4A625BAF56 +IV=72BF477FE8CF428CFA856323E18B3135 +CT=357F4BF62308CD5C48F34E9E644DD515 +PT=17758539D1896B92BFB811D30C9BA134 + +I=99 +KEY=357D8D6E75B5F1999DAE4C996EC00E62 +IV=4CBA048DFA50910EC94FE5D6AA5DD502 +CT=17758539D1896B92BFB811D30C9BA134 +PT=372B6DCEE44D18D3791C4E8FB0A91971 + +I=100 +KEY=0256E0A091F8E94AE4B20216DE691713 +IV=86F4F670CA3B191B860D6C8A9A35A872 +CT=372B6DCEE44D18D3791C4E8FB0A91971 +PT=66D3FABC4885C1F4897D9160C152D570 + +I=101 +KEY=64851A1CD97D28BE6DCF93761F3BC263 +IV=08490B2E8588FE564F0112D76D6108E9 +CT=66D3FABC4885C1F4897D9160C152D570 +PT=926278E71894F32B5E2A5A1F5FA695E7 + +I=102 +KEY=F6E762FBC1E9DB9533E5C969409D5784 +IV=D3A2E4AFFDD8A7CC1498EF0E812087B7 +CT=926278E71894F32B5E2A5A1F5FA695E7 +PT=A455F5D65D91563D9C15E6B745F29531 + +I=103 +KEY=52B2972D9C788DA8AFF02FDE056FC2B5 +IV=6CB8822EA67C247A6A0CBAD830B3562C +CT=A455F5D65D91563D9C15E6B745F29531 +PT=4544371A5E3A8E7AD9885AECD3868AF3 + +I=104 +KEY=17F6A037C24203D276787532D6E94846 +IV=93E3CAD8BE023F6451ADAA525988A974 +CT=4544371A5E3A8E7AD9885AECD3868AF3 +PT=8473F4F1D77AC1F46706EBD108CB48A5 + +I=105 +KEY=938554C61538C226117E9EE3DE2200E3 +IV=A7E7B354606EF4C1D00BF4F128CCE966 +CT=8473F4F1D77AC1F46706EBD108CB48A5 +PT=787ADE453DCE2FA7F6F24CD33C9A5CDC + +I=106 +KEY=EBFF8A8328F6ED81E78CD230E2B85C3F +IV=97A2CF706C1871B502D15B028C5F0D80 +CT=787ADE453DCE2FA7F6F24CD33C9A5CDC +PT=E6A7E5B65DC124FBE1C1FFFE18A34D8A + +I=107 +KEY=0D586F357537C97A064D2DCEFA1B11B5 +IV=9BBDCAF2A3CC7FC5BF6285631A4636FD +CT=E6A7E5B65DC124FBE1C1FFFE18A34D8A +PT=6A391E9F475546720836312BBEB0B3A9 + +I=108 +KEY=676171AA32628F080E7B1CE544ABA21C +IV=603EEDE91F925A2228537E8BDD26C96B +CT=6A391E9F475546720836312BBEB0B3A9 +PT=D75086BA446563AAB1873FDEBE611D67 + +I=109 +KEY=B031F7107607ECA2BFFC233BFACABF7B +IV=546B8CA37AACE2BC2C85014F2ACD6315 +CT=D75086BA446563AAB1873FDEBE611D67 +PT=63A4D826625CBD9F10083E62330BCFBC + +I=110 +KEY=D3952F36145B513DAFF41D59C9C170C7 +IV=BC2E6E9DD10152C8281B798F711A9334 +CT=63A4D826625CBD9F10083E62330BCFBC +PT=41275EFDFC86B5BDCCCDCA2BBFA5B90D + +I=111 +KEY=92B271CBE8DDE4806339D7727664C9CA +IV=D940A8D1B3448AA9148C7F6DFC266B00 +CT=41275EFDFC86B5BDCCCDCA2BBFA5B90D +PT=56AC1BCB285044710D26EFC42A0ABA56 + +I=112 +KEY=C41E6A00C08DA0F16E1F38B65C6E739C +IV=214238FF5F4D01F3A6694EC80E15BCF7 +CT=56AC1BCB285044710D26EFC42A0ABA56 +PT=5AF2877973AB9787E42202AC0C6E7538 + +I=113 +KEY=9EECED79B32637768A3D3A1A500006A4 +IV=561B4934904E327F3B3639CED6C7A995 +CT=5AF2877973AB9787E42202AC0C6E7538 +PT=787F52F6D9CD9085D782B95FD68F70F8 + +I=114 +KEY=E693BF8F6AEBA7F35DBF8345868F765C +IV=06B93FB1A99BD387A091509B8C6D3482 +CT=787F52F6D9CD9085D782B95FD68F70F8 +PT=E7B1DB917C92E488C6B02AC4C42AFD79 + +I=115 +KEY=0122641E1679437B9B0FA98142A58B25 +IV=1D57A61FED51218BD8C1357CE58F21EB +CT=E7B1DB917C92E488C6B02AC4C42AFD79 +PT=2FBAB770D511EACA849F654DE429DE84 + +I=116 +KEY=2E98D36EC368A9B11F90CCCCA68C55A1 +IV=CB311C43EC32D59941CEF81BB9CF4E57 +CT=2FBAB770D511EACA849F654DE429DE84 +PT=A8FE17AEA961C2A450DD5EAABAA19613 + +I=117 +KEY=8666C4C06A096B154F4D92661C2DC3B2 +IV=B9D7B74D62DD89A01EE3093A5C2A0470 +CT=A8FE17AEA961C2A450DD5EAABAA19613 +PT=D9E598A4DBAF82BDF9474BE13B997FF5 + +I=118 +KEY=5F835C64B1A6E9A8B60AD98727B4BC47 +IV=6398D8A38C38A9B54DCF18C0D76758BA +CT=D9E598A4DBAF82BDF9474BE13B997FF5 +PT=291DB2BC325CD7A94032E7C1208921A5 + +I=119 +KEY=769EEED883FA3E01F6383E46073D9DE2 +IV=4774C7E1BB97117BCA26A897B9302EFA +CT=291DB2BC325CD7A94032E7C1208921A5 +PT=DFC55866F85055F06E752E04AAC4C36A + +I=120 +KEY=A95BB6BE7BAA6BF1984D1042ADF95E88 +IV=BDA0616700CD2817FE4425F6F541E8C1 +CT=DFC55866F85055F06E752E04AAC4C36A +PT=7CACB3A88E7114F7737B05D0FB3AF7F3 + +I=121 +KEY=D5F70516F5DB7F06EB36159256C3A97B +IV=1EF4836BD363B89EE73911B14EBE9262 +CT=7CACB3A88E7114F7737B05D0FB3AF7F3 +PT=3282F1F6B3C04E325FB13E85D18CDBBC + +I=122 +KEY=E775F4E0461B3134B4872B17874F72C7 +IV=E35D47CEDBD30701A64FE504C6BC4199 +CT=3282F1F6B3C04E325FB13E85D18CDBBC +PT=BFB9748A3C825CDA3EA5D001F6AD305F + +I=123 +KEY=58CC806A7A996DEE8A22FB1671E24298 +IV=7A3676377E0B4F815B4B8C9A98DCAB4D +CT=BFB9748A3C825CDA3EA5D001F6AD305F +PT=B33787380A4C3BD5B32EC335916F9229 + +I=124 +KEY=EBFB075270D5563B390C3823E08DD0B1 +IV=B3E40B27DBF6D985D4F57BD4D2899DC8 +CT=B33787380A4C3BD5B32EC335916F9229 +PT=BCD5E40A3B4885ACA82BEC952BA8A973 + +I=125 +KEY=572EE3584B9DD3979127D4B6CB2579C2 +IV=897608FE3238F80CD24192CC64F4F695 +CT=BCD5E40A3B4885ACA82BEC952BA8A973 +PT=793E22E0B01FFE63E89C84A0D0FE1216 + +I=126 +KEY=2E10C1B8FB822DF479BB50161BDB6BD4 +IV=D84401CF83566FEA8FB859C446C22632 +CT=793E22E0B01FFE63E89C84A0D0FE1216 +PT=96858A96FEB19712B10A44FBF8E633D9 + +I=127 +KEY=B8954B2E0533BAE6C8B114EDE33D580D +IV=7210E127BFB706EF9CD24139C0927E01 +CT=96858A96FEB19712B10A44FBF8E633D9 +PT=28A34CC75A215117331D6B88387E16F8 + +I=128 +KEY=903607E95F12EBF1FBAC7F65DB434EF5 +IV=744B8DD281919F79FC529DA15AA0F18F +CT=28A34CC75A215117331D6B88387E16F8 +PT=43FE41DC9FFB88F93ADC43D41BA3E4B2 + +I=129 +KEY=D3C84635C0E96308C1703CB1C0E0AA47 +IV=5C7379A90F1E47F88C7424E8CD31E55D +CT=43FE41DC9FFB88F93ADC43D41BA3E4B2 +PT=66D6D0E84CEB8672D38DDE557CCCFFF6 + +I=130 +KEY=B51E96DD8C02E57A12FDE2E4BC2C55B1 +IV=529B92CD068415627C4BE49874347F98 +CT=66D6D0E84CEB8672D38DDE557CCCFFF6 +PT=F817D013CB041CA41B6D611ED261FAE9 + +I=131 +KEY=4D0946CE4706F9DE099083FA6E4DAF58 +IV=9B4452DD48C3EECEFDB6A6CFAE670117 +CT=F817D013CB041CA41B6D611ED261FAE9 +PT=56420C70CC459A131CD531EDC39ED6E9 + +I=132 +KEY=1B4B4ABE8B4363CD1545B217ADD379B1 +IV=264ABBC30CC98DA3C06B935B1364A317 +CT=56420C70CC459A131CD531EDC39ED6E9 +PT=650DA8C4CB11E4ABFE8841D20443BB04 + +I=133 +KEY=7E46E27A40528766EBCDF3C5A990C2B5 +IV=DBABF7B18568FED50C69DA0C9AA5395D +CT=650DA8C4CB11E4ABFE8841D20443BB04 +PT=94E6CE02AE253F3BE4A59775CAB7B11B + +I=134 +KEY=EAA02C78EE77B85D0F6864B0632773AE +IV=F0D2E456CE063CB68988C1C397038480 +CT=94E6CE02AE253F3BE4A59775CAB7B11B +PT=124F09DAC6A45E6077DCECE971B24ED1 + +I=135 +KEY=F8EF25A228D3E63D78B4885912953D7F +IV=C19A6D2D35E606E552580B002023C966 +CT=124F09DAC6A45E6077DCECE971B24ED1 +PT=AAD649FD1168DFCB431A7216571ED4C1 + +I=136 +KEY=52396C5F39BB39F63BAEFA4F458BE9BE +IV=DF1A307B1D25BC2751ECDC791EC51B16 +CT=AAD649FD1168DFCB431A7216571ED4C1 +PT=992749C940CBBB0944F5248E8D65268C + +I=137 +KEY=CB1E2596797082FF7F5BDEC1C8EECF32 +IV=D8B0466FC4344C6BF4E57584E5F48A36 +CT=992749C940CBBB0944F5248E8D65268C +PT=FF16B9246C325A3B96250875A9D5C4BE + +I=138 +KEY=34089CB21542D8C4E97ED6B4613B0B8C +IV=B8C3E4ECF57631CE1EEA74AD99545BA2 +CT=FF16B9246C325A3B96250875A9D5C4BE +PT=72EDB906165FE6A19E02435AC6457C9A + +I=139 +KEY=46E525B4031D3E65777C95EEA77E7716 +IV=9C4F78D05257C64D752C576B5BB16245 +CT=72EDB906165FE6A19E02435AC6457C9A +PT=0C2F00362B8733D343DCAF884A6BFD46 + +I=140 +KEY=4ACA2582289A0DB634A03A66ED158A50 +IV=C51122198D2FD566ACA1BD07C28BCC7A +CT=0C2F00362B8733D343DCAF884A6BFD46 +PT=C7F5C00F42695CF7870240DA73D487F7 + +I=141 +KEY=8D3FE58D6AF35141B3A27ABC9EC10DA7 +IV=14769B7962371925822C42F0411BDC65 +CT=C7F5C00F42695CF7870240DA73D487F7 +PT=F4BC8A4310A4CD2F396F43B81BD060EB + +I=142 +KEY=79836FCE7A579C6E8ACD390485116D4C +IV=CDA4414DF23427B937D586C1A8164479 +CT=F4BC8A4310A4CD2F396F43B81BD060EB +PT=1B996A525174C35466103BCBD53ECB9C + +I=143 +KEY=621A059C2B235F3AECDD02CF502FA6D0 +IV=1DA9E7C02BE868E118E4B9BF5928BFCF +CT=1B996A525174C35466103BCBD53ECB9C +PT=2B4EC5CB9DE50257B5901C6D49B5EB54 + +I=144 +KEY=4954C057B6C65D6D594D1EA2199A4D84 +IV=55433149AA93215BF53CB8FE66CD683A +CT=2B4EC5CB9DE50257B5901C6D49B5EB54 +PT=5A5B9ACA3BDA951DC4C4DFB7DD15AD18 + +I=145 +KEY=130F5A9D8D1CC8709D89C115C48FE09C +IV=695C69EA8C4257D2758364AFF6387DA0 +CT=5A5B9ACA3BDA951DC4C4DFB7DD15AD18 +PT=5BB08593BA52E94F07CB14FF564AF299 + +I=146 +KEY=48BFDF0E374E213F9A42D5EA92C51205 +IV=665463164601CD0045C684729CDD5E7D +CT=5BB08593BA52E94F07CB14FF564AF299 +PT=DB1840467889551150026A90E3FC272F + +I=147 +KEY=93A79F484FC7742ECA40BF7A7139352A +IV=355C4B87A682712460C80ABA630F7BE8 +CT=DB1840467889551150026A90E3FC272F +PT=9F7BD8EF96A1ECC75B4E3031E65FE8FC + +I=148 +KEY=0CDC47A7D96698E9910E8F4B9766DDD6 +IV=FBF20FEC0A9E9B530DD3745955A1960C +CT=9F7BD8EF96A1ECC75B4E3031E65FE8FC +PT=DCF003E1DDD4B52F5B680568B42EEECF + +I=149 +KEY=D02C444604B22DC6CA668A2323483319 +IV=04EADC638E309466B9500B1C3A308856 +CT=DCF003E1DDD4B52F5B680568B42EEECF +PT=DDD2F2AEFEF4A4641747699170DF0129 + +I=150 +KEY=0DFEB6E8FA4689A2DD21E3B253973230 +IV=FB521123E5BB45F1AC7083C382B95E10 +CT=DDD2F2AEFEF4A4641747699170DF0129 +PT=7D6C54E4369E965513DE1E95E8A37433 + +I=151 +KEY=7092E20CCCD81FF7CEFFFD27BB344603 +IV=0E71300101915AEE97563493B4B2EFB9 +CT=7D6C54E4369E965513DE1E95E8A37433 +PT=B7F5C4275EF7D3A23E8E9A4BC2BCA700 + +I=152 +KEY=C767262B922FCC55F071676C7988E103 +IV=8BBC970D4E24F6F1A92859BBAE70B757 +CT=B7F5C4275EF7D3A23E8E9A4BC2BCA700 +PT=679FA9A8AB3EE2F0663D4DC95FEC3847 + +I=153 +KEY=A0F88F8339112EA5964C2AA52664D944 +IV=B8D28B6903859465F996A0DF491DDAAA +CT=679FA9A8AB3EE2F0663D4DC95FEC3847 +PT=914DCEAC5B00940A415C2144DAA1EF03 + +I=154 +KEY=31B5412F6211BAAFD7100BE1FCC53647 +IV=06E1FF99E63E0EDDA1D95682B541D026 +CT=914DCEAC5B00940A415C2144DAA1EF03 +PT=A718031A531395DA071B828A10A2B9DC + +I=155 +KEY=96AD423531022F75D00B896BEC678F9B +IV=F18546028693CC0A72E218460AC932E9 +CT=A718031A531395DA071B828A10A2B9DC +PT=19D996B9FF549029D800CF977C0E0A88 + +I=156 +KEY=8F74D48CCE56BF5C080B46FC90698513 +IV=7E98DAFA8DE35537A0B0AA8FA32E01DF +CT=19D996B9FF549029D800CF977C0E0A88 +PT=6A7D514FBE9963987E0EE5DD22FDC8BD + +I=157 +KEY=E50985C370CFDCC47605A321B2944DAE +IV=071F44277D12AD6E653FB747C11BEFB7 +CT=6A7D514FBE9963987E0EE5DD22FDC8BD +PT=AB07C464DF72DF58411A7CBF906F43A6 + +I=158 +KEY=4E0E41A7AFBD039C371FDF9E22FB0E08 +IV=BDA8979A0DE78999AE0659D2744BC21B +CT=AB07C464DF72DF58411A7CBF906F43A6 +PT=A8ABC34FF51FD998427A7837BB0F22BB + +I=159 +KEY=E6A582E85AA2DA047565A7A999F42CB3 +IV=3CA763C4375A6C70F072B52C42A02560 +CT=A8ABC34FF51FD998427A7837BB0F22BB +PT=9E82A41AB2A2748695663075C5BF1C09 + +I=160 +KEY=782726F2E800AE82E00397DC5C4B30BA +IV=B1DD4DC8715CA0B8BA3426395B61ABA4 +CT=9E82A41AB2A2748695663075C5BF1C09 +PT=3C891AEFC6645F3C23A2E3A2E1A522EF + +I=161 +KEY=44AE3C1D2E64F1BEC3A1747EBDEE1255 +IV=932F28E3FC0F85A0E703AD6079A68CC0 +CT=3C891AEFC6645F3C23A2E3A2E1A522EF +PT=D4FDD9C3D36E80E0AFA95ABEC2E62FB9 + +I=162 +KEY=9053E5DEFD0A715E6C082EC07F083DEC +IV=1AD1530DE6274BBA3A097004D85DF8FA +CT=D4FDD9C3D36E80E0AFA95ABEC2E62FB9 +PT=9FACBB106FBF34D9B25A83AD4F45AA38 + +I=163 +KEY=0FFF5ECE92B54587DE52AD6D304D97D4 +IV=8412EAA361AB8193AD529FA36944FE3D +CT=9FACBB106FBF34D9B25A83AD4F45AA38 +PT=E95628B6A14326AC153B228C0DD25063 + +I=164 +KEY=E6A9767833F6632BCB698FE13D9FC7B7 +IV=9F1D906FD25CCCA7565D82CDA44B4A57 +CT=E95628B6A14326AC153B228C0DD25063 +PT=7B1ECD07E452D593D00E326F8FD9F2B5 + +I=165 +KEY=9DB7BB7FD7A4B6B81B67BD8EB2463502 +IV=9C91B12734A86451492400EE5759C190 +CT=7B1ECD07E452D593D00E326F8FD9F2B5 +PT=A99874C1ECA463D335B37179348AEF4F + +I=166 +KEY=342FCFBE3B00D56B2ED4CCF786CCDA4D +IV=9060C6E8E2B51E5F1000860ECB5A608C +CT=A99874C1ECA463D335B37179348AEF4F +PT=F9296E658C3048C58FE6404AB6E0186C + +I=167 +KEY=CD06A1DBB7309DAEA1328CBD302CC221 +IV=ADCB427405EDF8078622AFC6C731D3EF +CT=F9296E658C3048C58FE6404AB6E0186C +PT=8D3A4ABFB8F57AEBB1284B78BFDD240D + +I=168 +KEY=403CEB640FC5E745101AC7C58FF1E62C +IV=4CED30477756892A49FE6358700F5DE7 +CT=8D3A4ABFB8F57AEBB1284B78BFDD240D +PT=7C71310D5241B8B461847FA7E2B4D506 + +I=169 +KEY=3C4DDA695D845FF1719EB8626D45332A +IV=52A3B8E21588368AA3AD2131B283B34C +CT=7C71310D5241B8B461847FA7E2B4D506 +PT=380A1E2925FC8061FBC69B08B4C7C6C8 + +I=170 +KEY=0447C4407878DF908A58236AD982F5E2 +IV=B7AD265DF50ABD77C1D1D02BAF06CEBD +CT=380A1E2925FC8061FBC69B08B4C7C6C8 +PT=6931E262570F27732A75629A384492CA + +I=171 +KEY=6D7626222F77F8E3A02D41F0E1C66728 +IV=DD7D3CA7F6CE54775836734B10685A99 +CT=6931E262570F27732A75629A384492CA +PT=336D0AB3F9A793469C544E98CFDC8AD6 + +I=172 +KEY=5E1B2C91D6D06BA53C790F682E1AEDFE +IV=54087C05437049FBAFC9BF6C56AD16CC +CT=336D0AB3F9A793469C544E98CFDC8AD6 +PT=0098A640F1D04E5557F748B80215082A + +I=173 +KEY=5E838AD1270025F06B8E47D02C0FE5D4 +IV=DD13A93C7FAEF14820D6A168AF9969DB +CT=0098A640F1D04E5557F748B80215082A +PT=48660EDDC3ACAC1A814AE088650DE007 + +I=174 +KEY=16E5840CE4AC89EAEAC4A758490205D3 +IV=589C43A680F7AE6E15DE25FD50F18BED +CT=48660EDDC3ACAC1A814AE088650DE007 +PT=047740C48160A14563C0049316C7B78E + +I=175 +KEY=1292C4C865CC28AF8904A3CB5FC5B25D +IV=22DB095AF8268D37AC536FDA3A81B7C2 +CT=047740C48160A14563C0049316C7B78E +PT=D9679ABB1AED1524E8DA2ECA89172853 + +I=176 +KEY=CBF55E737F213D8B61DE8D01D6D29A0E +IV=77FDCCC9BAB3B7E81D7B9D14540ED3A7 +CT=D9679ABB1AED1524E8DA2ECA89172853 +PT=C774AD9EF683A59747AB41DA044471C4 + +I=177 +KEY=0C81F3ED89A2981C2675CCDBD296EBCA +IV=2E266970512C0F6D404367978C70B5C6 +CT=C774AD9EF683A59747AB41DA044471C4 +PT=927C98AFDE6F108268A306A1A818EE89 + +I=178 +KEY=9EFD6B4257CD889E4ED6CA7A7A8E0543 +IV=E2B0A0F146E931136932D8188B7DC980 +CT=927C98AFDE6F108268A306A1A818EE89 +PT=D3C11AF1EF255D65EAAEE5B5C5BF3CD9 + +I=179 +KEY=4D3C71B3B8E8D5FBA4782FCFBF31399A +IV=ABA118A590A8A69D41D20ED13F7DA4C9 +CT=D3C11AF1EF255D65EAAEE5B5C5BF3CD9 +PT=760B1C47EB476A246CE41163B7425C7B + +I=180 +KEY=3B376DF453AFBFDFC89C3EAC087365E1 +IV=8A395FFEE93FF820FBC086932216324F +CT=760B1C47EB476A246CE41163B7425C7B +PT=4EEAE25D1654A461D6A56896EDFFEAB7 + +I=181 +KEY=75DD8FA945FB1BBE1E39563AE58C8F56 +IV=82D68DE458D38127E2A17DA736BC1651 +CT=4EEAE25D1654A461D6A56896EDFFEAB7 +PT=BD7ABD27F3515B9FD337ADADBA5E9EC9 + +I=182 +KEY=C8A7328EB6AA4021CD0EFB975FD2119F +IV=95757C38F4CB26C29DF174FD8B1F35E8 +CT=BD7ABD27F3515B9FD337ADADBA5E9EC9 +PT=E32EF56DE91CC21C158822BDB841A02C + +I=183 +KEY=2B89C7E35FB6823DD886D92AE793B1B3 +IV=AFFB434005E300E99E815A8E5B46E159 +CT=E32EF56DE91CC21C158822BDB841A02C +PT=578B7692D68BD4D65A159C9CCDC81F64 + +I=184 +KEY=7C02B171893D56EB829345B62A5BAED7 +IV=15E783551969F275EF25A429F68BA0DB +CT=578B7692D68BD4D65A159C9CCDC81F64 +PT=0F70D77F31DE8F0010628377C8E4A1C3 + +I=185 +KEY=7372660EB8E3D9EB92F1C6C1E2BF0F14 +IV=078B6E3FC7C79D52A5C49847A7C5D0BB +CT=0F70D77F31DE8F0010628377C8E4A1C3 +PT=A4F29F6A50A4A15789D4647774C96997 + +I=186 +KEY=D780F964E84778BC1B25A2B696766683 +IV=C9B2C903F131856C0D8218146479513A +CT=A4F29F6A50A4A15789D4647774C96997 +PT=7AD4F764911F8F1E8C9356F00B1468EE + +I=187 +KEY=AD540E007958F7A297B6F4469D620E6D +IV=780DAD9DBA12DDC713ECF44057B8B56E +CT=7AD4F764911F8F1E8C9356F00B1468EE +PT=A00EAFD28A95C7F39137773F28F9A0D3 + +I=188 +KEY=0D5AA1D2F3CD305106818379B59BAEBE +IV=6643BF26488FB21BCDAA7D4FABAA5BC3 +CT=A00EAFD28A95C7F39137773F28F9A0D3 +PT=FC884EEEB73B2F66C97D742A441B0463 + +I=189 +KEY=F1D2EF3C44F61F37CFFCF753F180AADD +IV=7B707442550BF1FA4C1B74F0DC3237FC +CT=FC884EEEB73B2F66C97D742A441B0463 +PT=9C260AA82C6902B068495B4844507F7D + +I=190 +KEY=6DF4E594689F1D87A7B5AC1BB5D0D5A0 +IV=8329E8DE2980225DA61158BF467B1D79 +CT=9C260AA82C6902B068495B4844507F7D +PT=1C12FEAA35AD2DD21DE6411C3A3BB6D5 + +I=191 +KEY=71E61B3E5D323055BA53ED078FEB6375 +IV=EFD514D7CF3FAC49DBB5BB3505B9B18F +CT=1C12FEAA35AD2DD21DE6411C3A3BB6D5 +PT=15F26D34E8E1037A5A2393CEA5DB396B + +I=192 +KEY=6414760AB5D3332FE0707EC92A305A1E +IV=9EFC37C295552B965B29A23AC2788D8B +CT=15F26D34E8E1037A5A2393CEA5DB396B +PT=76F0C79955566A0A091AA46E0C59455E + +I=193 +KEY=12E4B193E0855925E96ADAA726691F40 +IV=5BA54E33128A7526A9130E632BE00D65 +CT=76F0C79955566A0A091AA46E0C59455E +PT=1EA06231EBEEB995E2F94B88A4004333 + +I=194 +KEY=0C44D3A20B6BE0B00B93912F82695C73 +IV=9B1C6FA42510E530D2282BF8C5516DCE +CT=1EA06231EBEEB995E2F94B88A4004333 +PT=16C36348884B32AC1CB1DE2D3C158981 + +I=195 +KEY=1A87B0EA8320D21C17224F02BE7CD5F2 +IV=F755F641EED4C828DCBECC327D93F4AF +CT=16C36348884B32AC1CB1DE2D3C158981 +PT=6581A3FB5F61C6C1904F35E787BF552D + +I=196 +KEY=7F061311DC4114DD876D7AE539C380DF +IV=5D799F356C1672707716C47DA4384C01 +CT=6581A3FB5F61C6C1904F35E787BF552D +PT=0BA11F8EE845E03641928825B3344994 + +I=197 +KEY=74A70C9F3404F4EBC6FFF2C08AF7C94B +IV=89A5592031795CEAECF1C1F274813818 +CT=0BA11F8EE845E03641928825B3344994 +PT=1CF907A6C8A33C7806819EB97B854588 + +I=198 +KEY=685E0B39FCA7C893C07E6C79F1728CC3 +IV=BBE87558AF456066B9CE3EBB8729D554 +CT=1CF907A6C8A33C7806819EB97B854588 +PT=722BB2E53CE7846F40B5EA18AF1430B0 + +I=199 +KEY=1A75B9DCC0404CFC80CB86615E66BC73 +IV=2CC42E6DA36883482ACB5D9D92823186 +CT=722BB2E53CE7846F40B5EA18AF1430B0 +PT=E667D6A95E9C56BB56E4436CC1B69874 + +I=200 +KEY=FC126F759EDC1A47D62FC50D9FD02407 +IV=F18DD0388BF5692B7394BAFDC4854308 +CT=E667D6A95E9C56BB56E4436CC1B69874 +PT=3C9A76798C468470EEBC5F7B915879A3 + +I=201 +KEY=C088190C129A9E3738939A760E885DA4 +IV=8262D8603FE0F4AE8BF5795690992F1C +CT=3C9A76798C468470EEBC5F7B915879A3 +PT=3CAFB994BDEF76370D8A5129B63BECDB + +I=202 +KEY=FC27A098AF75E8003519CB5FB8B3B17F +IV=AB090F7A86CFD9A7C1BD8869BBB4D27B +CT=3CAFB994BDEF76370D8A5129B63BECDB +PT=50D037733D2C3242024BD322ADDF01CB + +I=203 +KEY=ACF797EB9259DA423752187D156CB0B4 +IV=3581D6724722C3892C712B2AA1066824 +CT=50D037733D2C3242024BD322ADDF01CB +PT=0D7CB755305EF09692FCED530CCC1336 + +I=204 +KEY=A18B20BEA2072AD4A5AEF52E19A0A382 +IV=9D0DAD6448895ECBE05F8DC73E014E3C +CT=0D7CB755305EF09692FCED530CCC1336 +PT=D66389E01F44C60B26BCF3F9B39DAB55 + +I=205 +KEY=77E8A95EBD43ECDF831206D7AA3D08D7 +IV=7BDC3CD62CD79C7E6CB8FAE104175DE4 +CT=D66389E01F44C60B26BCF3F9B39DAB55 +PT=CC9F59409D636BE5C555AC2841650CD7 + +I=206 +KEY=BB77F01E2020873A4647AAFFEB580400 +IV=A4FBE42983B236097E40C1E244B14748 +CT=CC9F59409D636BE5C555AC2841650CD7 +PT=34804672FCEF79481269B1D254DDCAF9 + +I=207 +KEY=8FF7B66CDCCFFE72542E1B2DBF85CEF9 +IV=700B37E771E88E5DCD9C81D6FD16B995 +CT=34804672FCEF79481269B1D254DDCAF9 +PT=62FC00FDF1F6BF44FFBEB5BED5589A64 + +I=208 +KEY=ED0BB6912D394136AB90AE936ADD549D +IV=F3A9954079382ACD97C3EC198522AE69 +CT=62FC00FDF1F6BF44FFBEB5BED5589A64 +PT=F7901904A02544E064400A2625121C4C + +I=209 +KEY=1A9BAF958D1C05D6CFD0A4B54FCF48D1 +IV=3799F5DEF76C56F8B0A69889B85760AA +CT=F7901904A02544E064400A2625121C4C +PT=A915D55AE8E14497F2693A55F83041F5 + +I=210 +KEY=B38E7ACF65FD41413DB99EE0B7FF0924 +IV=5421F3F4CDD3C6F9BF38184BC61904AA +CT=A915D55AE8E14497F2693A55F83041F5 +PT=66EA0D0968631F3BDA46921078E495C1 + +I=211 +KEY=D56477C60D9E5E7AE7FF0CF0CF1B9CE5 +IV=3B87243EE38BD474E4CBF34A7C592CFC +CT=66EA0D0968631F3BDA46921078E495C1 +PT=283826367D00718849A6539EE8CAD8BF + +I=212 +KEY=FD5C51F0709E2FF2AE595F6E27D1445A +IV=0FB53077D2BC27C544CD400A28212291 +CT=283826367D00718849A6539EE8CAD8BF +PT=B15EA2718FB406D457C8B96530EDC014 + +I=213 +KEY=4C02F381FF2A2926F991E60B173C844E +IV=8BFE654E422E9BCCE7F1357053E1130C +CT=B15EA2718FB406D457C8B96530EDC014 +PT=44238CE0F1765C7983BF408D5ECFA2BA + +I=214 +KEY=08217F610E5C755F7A2EA68649F326F4 +IV=86841D597FA91F54CBAD3C57FC1FC492 +CT=44238CE0F1765C7983BF408D5ECFA2BA +PT=BB6408099CA64F1216D204865449E967 + +I=215 +KEY=B345776892FA3A4D6CFCA2001DBACF93 +IV=849198CEA19F4AD76013D172867A0D20 +CT=BB6408099CA64F1216D204865449E967 +PT=B7E109C6813E686ADA396DDB277AD960 + +I=216 +KEY=04A47EAE13C45227B6C5CFDB3AC016F3 +IV=9C5E0182124701DA958CF68E1B9F8CC1 +CT=B7E109C6813E686ADA396DDB277AD960 +PT=65C77CB822CA10AE1F95B91F0A3F6436 + +I=217 +KEY=61630216310E4289A95076C430FF72C5 +IV=2BB9026F793A64A325E02B922E3A51DD +CT=65C77CB822CA10AE1F95B91F0A3F6436 +PT=48E9DB9FC3F883AD28A0299561444197 + +I=218 +KEY=298AD989F2F6C12481F05F5151BB3352 +IV=6BE0B03639C858D8F2CAE00EFE8FECCA +CT=48E9DB9FC3F883AD28A0299561444197 +PT=02B277AB327BCB5C91831BD376DC5211 + +I=219 +KEY=2B38AE22C08D0A781073448227676143 +IV=ADC033E3EEC3705031D2FB24205823A2 +CT=02B277AB327BCB5C91831BD376DC5211 +PT=FE288D6703CF6AB1635483305A82F192 + +I=220 +KEY=D5102345C34260C97327C7B27DE590D1 +IV=F637C38CB5DF86458225143E157B9415 +CT=FE288D6703CF6AB1635483305A82F192 +PT=B07BF02F795D13D972D5D6E556E8BA37 + +I=221 +KEY=656BD36ABA1F731001F211572B0D2AE6 +IV=824B7BBB3A339BF045C3CFEA9FD842B9 +CT=B07BF02F795D13D972D5D6E556E8BA37 +PT=D4661C2E102C6644724DA54BE291215D + +I=222 +KEY=B10DCF44AA33155473BFB41CC99C0BBB +IV=21FA242B2B9FFF0C7DC6B712A38A333B +CT=D4661C2E102C6644724DA54BE291215D +PT=F7EDEE448559A6ACD68815B6EEAF6E38 + +I=223 +KEY=46E021002F6AB3F8A537A1AA27336583 +IV=390906ECE51C92800D620E1CD1FD3574 +CT=F7EDEE448559A6ACD68815B6EEAF6E38 +PT=07257C91424F65E6752470A6960DF6D9 + +I=224 +KEY=41C55D916D25D61ED013D10CB13E935A +IV=918A010EC2B106DE32A220315999DF7D +CT=07257C91424F65E6752470A6960DF6D9 +PT=CCB4F3FCFFDEE9E93DD3AB4CC2DB870E + +I=225 +KEY=8D71AE6D92FB3FF7EDC07A4073E51454 +IV=7CF6B4948C4E04ED235F2CC96B0A6B49 +CT=CCB4F3FCFFDEE9E93DD3AB4CC2DB870E +PT=C455220E8C8847FF2592074A53104105 + +I=226 +KEY=49248C631E737808C8527D0A20F55551 +IV=4839E74C868786D0A109603CF98F1100 +CT=C455220E8C8847FF2592074A53104105 +PT=B4D0F5B4C15D7AD556ED4964A94C898F + +I=227 +KEY=FDF479D7DF2E02DD9EBF346E89B9DCDE +IV=5C6D9649E47FAA8A2DCAFB317B6BC0EA +CT=B4D0F5B4C15D7AD556ED4964A94C898F +PT=B515D2904555793DDC142618DCFF8464 + +I=228 +KEY=48E1AB479A7B7BE042AB1276554658BA +IV=E3573B4137C13BBA6CDD10D71042B8F6 +CT=B515D2904555793DDC142618DCFF8464 +PT=2C272D6589E2E6EE09067882795E9FB9 + +I=229 +KEY=64C6862213999D0E4BAD6AF42C18C703 +IV=08E335104FC5D18E2C11EF34B805F060 +CT=2C272D6589E2E6EE09067882795E9FB9 +PT=B38E39322245C4A2E170EBF36D764AD5 + +I=230 +KEY=D748BF1031DC59ACAADD8107416E8DD6 +IV=E134D0DEA38A23983766DA18DADA70E0 +CT=B38E39322245C4A2E170EBF36D764AD5 +PT=E7556255602B48D7CAC710A004FFFD2E + +I=231 +KEY=301DDD4551F7117B601A91A7459170F8 +IV=301C2808833418F45D5F97FB09A99504 +CT=E7556255602B48D7CAC710A004FFFD2E +PT=D4356D51B1C486AAC8BCF2F65312758C + +I=232 +KEY=E428B014E03397D1A8A6635116830574 +IV=264D556FA9A9D73510F562BBF983A4F7 +CT=D4356D51B1C486AAC8BCF2F65312758C +PT=B4D003D6C542B576A3EAEC8F1B017F5B + +I=233 +KEY=50F8B3C2257122A70B4C8FDE0D827A2F +IV=8821647AD3E9E529909E60D0F75DA400 +CT=B4D003D6C542B576A3EAEC8F1B017F5B +PT=10056819F314FF21114BE6209AB5508C + +I=234 +KEY=40FDDBDBD665DD861A0769FE97372AA3 +IV=CBD574F4DB1EFEE4E2EC9485D1192E04 +CT=10056819F314FF21114BE6209AB5508C +PT=6E7AA061FE85B6F8972CB0E793BE0CB0 + +I=235 +KEY=2E877BBA28E06B7E8D2BD91904892613 +IV=4F98EE1501681EC0E7834FE941DF6C6B +CT=6E7AA061FE85B6F8972CB0E793BE0CB0 +PT=45E0C0014219D77686E82E74E60608CA + +I=236 +KEY=6B67BBBB6AF9BC080BC3F76DE28F2ED9 +IV=1D34CAB2FF836A7E6568823784519170 +CT=45E0C0014219D77686E82E74E60608CA +PT=ACF686F9D6723EAFDBFE512AB3A8C6B1 + +I=237 +KEY=C7913D42BC8B82A7D03DA6475127E868 +IV=BEA74B4435F9F79D39B8CCE1F090D4B8 +CT=ACF686F9D6723EAFDBFE512AB3A8C6B1 +PT=F11FE34D158D40DEA10033BCE0253F30 + +I=238 +KEY=368EDE0FA906C279713D95FBB102D758 +IV=DF30EE5D8CA298BE630DDE4B6D8AD7AA +CT=F11FE34D158D40DEA10033BCE0253F30 +PT=4E970ACAB8B19C942C85FAA7825C5E67 + +I=239 +KEY=7819D4C511B75EED5DB86F5C335E893F +IV=DC3CCC928C02710EE91391032A3B557D +CT=4E970ACAB8B19C942C85FAA7825C5E67 +PT=0FF6C292507CF135036E04A391210466 + +I=240 +KEY=77EF165741CBAFD85ED66BFFA27F8D59 +IV=7CC57A486E05E36F852278450C03D39F +CT=0FF6C292507CF135036E04A391210466 +PT=BBEF94C8179E7A124492A252507D58E7 + +I=241 +KEY=CC00829F5655D5CA1A44C9ADF202D5BE +IV=BBB92F65197F8D6B388191E78E90A858 +CT=BBEF94C8179E7A124492A252507D58E7 +PT=BAF11150DD418ED7C28072A718815954 + +I=242 +KEY=76F193CF8B145B1DD8C4BB0AEA838CEA +IV=99DA5A29F934BE23EB74B6DE4E8CC740 +CT=BAF11150DD418ED7C28072A718815954 +PT=A935099B91A35655C850939D2FED1569 + +I=243 +KEY=DFC49A541AB70D4810942897C56E9983 +IV=92401B7E92A49FA5A6905E51E49D51C2 +CT=A935099B91A35655C850939D2FED1569 +PT=F60E1B5D10CDA17FC762798B86B8708D + +I=244 +KEY=29CA81090A7AAC37D7F6511C43D6E90E +IV=C2A57521674EB0FB3E46DE2CC1DCF419 +CT=F60E1B5D10CDA17FC762798B86B8708D +PT=0B976079B61F46E7F3CCCD17E23D872F + +I=245 +KEY=225DE170BC65EAD0243A9C0BA1EB6E21 +IV=66970AE807FED1E3581496C9FBE5FF50 +CT=0B976079B61F46E7F3CCCD17E23D872F +PT=FB44F0094A5FC03BD0A27391E58D0AA3 + +I=246 +KEY=D9191179F63A2AEBF498EF9A44666482 +IV=ED7B2ED1AFF7DB9B514D6E4DFAEA484B +CT=FB44F0094A5FC03BD0A27391E58D0AA3 +PT=41A534A69AD25FEB39BB9F754F15D8FE + +I=247 +KEY=98BC25DF6CE87500CD2370EF0B73BC7C +IV=B7E8C7F08BCE1CF1CC2568E18C18C92B +CT=41A534A69AD25FEB39BB9F754F15D8FE +PT=022B28D4F7355E14F99F654B6C35BC16 + +I=248 +KEY=9A970D0B9BDD2B1434BC15A46746006A +IV=F2EF32464FC7E5F3D397C259CB963B7F +CT=022B28D4F7355E14F99F654B6C35BC16 +PT=28F18EA03ADEB36C40FD8FBC590EC6C8 + +I=249 +KEY=B26683ABA103987874419A183E48C6A2 +IV=687E822CCFC5800E88E59ED7DEC1409D +CT=28F18EA03ADEB36C40FD8FBC590EC6C8 +PT=661F9AEA300100333D64FCDD1212C663 + +I=250 +KEY=D47919419102984B492566C52C5A00C1 +IV=3922BB08EE1B4CC75881D1D6F66B8EE0 +CT=661F9AEA300100333D64FCDD1212C663 +PT=11C4D360F585EDF544D5479AE1ABDBE6 + +I=251 +KEY=C5BDCA21648775BE0DF0215FCDF1DB27 +IV=9B7C0D7D0EA8CAD77B331F2E0CA1E639 +CT=11C4D360F585EDF544D5479AE1ABDBE6 +PT=2E4695733B01CC78993E6EB464784223 + +I=252 +KEY=EBFB5F525F86B9C694CE4FEBA9899904 +IV=A2BF273F12FE1F4B2F56A86CAFD9C5BF +CT=2E4695733B01CC78993E6EB464784223 +PT=1CC514E9F4B13FFEF3B076DAC8C62877 + +I=253 +KEY=F73E4BBBAB378638677E3931614FB173 +IV=1D4960EBE667AC5DE5ED767183838846 +CT=1CC514E9F4B13FFEF3B076DAC8C62877 +PT=3B1A7D179DDED66A37F3053B8B231EEA + +I=254 +KEY=CC2436AC36E95052508D3C0AEA6CAF99 +IV=974643FDFDB695A44B7EF8676A2B87DD +CT=3B1A7D179DDED66A37F3053B8B231EEA +PT=620A4E7A25E8D05779C0FB8CEBA55A74 + +I=255 +KEY=AE2E78D613018005294DC78601C9F5ED +IV=C9A1D92DB7D553DCAEB3BB81B489257A +CT=620A4E7A25E8D05779C0FB8CEBA55A74 +PT=93508503278ECECE65D67B5F50962C4E + +I=256 +KEY=3D7EFDD5348F4ECB4C9BBCD9515FD9A3 +IV=108E736F1DCD178A8648F6AA6D527732 +CT=93508503278ECECE65D67B5F50962C4E +PT=EA9E953D8B62FFAFF9FAFB97F614D65C + +I=257 +KEY=D7E068E8BFEDB164B561474EA74B0FFF +IV=B893A94302C0DAFB19D7B6656085DCA9 +CT=EA9E953D8B62FFAFF9FAFB97F614D65C +PT=1452ED26E774029EF30D272F8548C2F8 + +I=258 +KEY=C3B285CE5899B3FA466C60612203CD07 +IV=668FF6719E5A29A99876227EEDE5818F +CT=1452ED26E774029EF30D272F8548C2F8 +PT=4083167E5ED1A1A449C1825B84F321E1 + +I=259 +KEY=833193B00648125E0FADE23AA6F0ECE6 +IV=9F6375A022543AB8303368A235813F02 +CT=4083167E5ED1A1A449C1825B84F321E1 +PT=9206639D076685FD2078F9B984B7A03F + +I=260 +KEY=1137F02D012E97A32FD51B8322474CD9 +IV=1B95128E90B110AED9D543D2A996271F +CT=9206639D076685FD2078F9B984B7A03F +PT=AAA3F2BD0126DFD5007DD2835CCB0109 + +I=261 +KEY=BB940290000848762FA8C9007E8C4DD0 +IV=BB2E26A9CDEF9D1B2940EFFBA1971A5D +CT=AAA3F2BD0126DFD5007DD2835CCB0109 +PT=B58BB3761519C1726D75AE96313FB7DE + +I=262 +KEY=0E1FB1E61511890442DD67964FB3FA0E +IV=68D3EC37EE43E3F24072F69F2DFA768D +CT=B58BB3761519C1726D75AE96313FB7DE +PT=4558CD47C012B7293396D7EDFE3CEA85 + +I=263 +KEY=4B477CA1D5033E2D714BB07BB18F108B +IV=F7E107DBF4DDBF7974B699536A4E2803 +CT=4558CD47C012B7293396D7EDFE3CEA85 +PT=6F43B6B28AEF5DD1B66279ACAAB9A589 + +I=264 +KEY=2404CA135FEC63FCC729C9D71B36B502 +IV=B3E6DA8DE5DDF7ED6F832D1306A1C04A +CT=6F43B6B28AEF5DD1B66279ACAAB9A589 +PT=1BA743E148BC164C4C8324D665B5A3BD + +I=265 +KEY=3FA389F2175075B08BAAED017E8316BF +IV=8BBBB56B39893C8F286561EF6E47E66A +CT=1BA743E148BC164C4C8324D665B5A3BD +PT=49A40365092DD1360D916AAEAFD03FC1 + +I=266 +KEY=76078A971E7DA486863B87AFD153297E +IV=48BA08703A306F772E78F660173A26B3 +CT=49A40365092DD1360D916AAEAFD03FC1 +PT=DF7DEB5968D683AAA274B0D5D3F9AA03 + +I=267 +KEY=A97A61CE76AB272C244F377A02AA837D +IV=0C7832F9CDF65DADA7FA809B8DE709C3 +CT=DF7DEB5968D683AAA274B0D5D3F9AA03 +PT=69689E97E9B166DA53E25BDFBCAF4A97 + +I=268 +KEY=C012FF599F1A41F677AD6CA5BE05C9EA +IV=05BC03F59CD8C5FAE4A7240E6168CF41 +CT=69689E97E9B166DA53E25BDFBCAF4A97 +PT=5F87DC71EF2918F75A94E43007FF50E6 + +I=269 +KEY=9F952328703359012D398895B9FA990C +IV=4233E654802B55155E158B650B64718E +CT=5F87DC71EF2918F75A94E43007FF50E6 +PT=4F170790775A6A147E99D251C401969A + +I=270 +KEY=D08224B80769331553A05AC47DFB0F96 +IV=4AEAE53003D5085F5963CC36C4589941 +CT=4F170790775A6A147E99D251C401969A +PT=E566D46360EF38E5CFF0C2E7E7E0D679 + +I=271 +KEY=35E4F0DB67860BF09C5098239A1BD9EF +IV=F6CBFF51F6E59B7AAA9EB1261707429A +CT=E566D46360EF38E5CFF0C2E7E7E0D679 +PT=F7189C4B9E1048ED66D9B7CCD089C5F9 + +I=272 +KEY=C2FC6C90F996431DFA892FEF4A921C16 +IV=0A05A4BFBBCC8B3E218C123A95FFF475 +CT=F7189C4B9E1048ED66D9B7CCD089C5F9 +PT=68FB0909789DBFA672BEEF5DF0017B63 + +I=273 +KEY=AA076599810BFCBB8837C0B2BA936775 +IV=DF1A3AF147E72C2CEAE5D8713D52F572 +CT=68FB0909789DBFA672BEEF5DF0017B63 +PT=AF2784590089186BED3A48ADC1B68562 + +I=274 +KEY=0520E1C08182E4D0650D881F7B25E217 +IV=BFDC5ECF596F5F3CFFEAAF4B961209FA +CT=AF2784590089186BED3A48ADC1B68562 +PT=E8C29D3C129AB8FA797EFDCE4CE4D4F2 + +I=275 +KEY=EDE27CFC93185C2A1C7375D137C136E5 +IV=49195E71516D5117C26814F98FD94C31 +CT=E8C29D3C129AB8FA797EFDCE4CE4D4F2 +PT=6ACF2AE12C38DB520F49E6C90D4B8F03 + +I=276 +KEY=872D561DBF208778133A93183A8AB9E6 +IV=E4FA7788D6E7AFBD08884BFCFA74D30C +CT=6ACF2AE12C38DB520F49E6C90D4B8F03 +PT=78FEA3B57D6176C44CE753FB01416CA6 + +I=277 +KEY=FFD3F5A8C241F1BC5FDDC0E33BCBD540 +IV=08E333F43615229D95E7C425A04EA2B7 +CT=78FEA3B57D6176C44CE753FB01416CA6 +PT=5030D7131ABBD7AC323BA31B602B776E + +I=278 +KEY=AFE322BBD8FA26106DE663F85BE0A22E +IV=64BDE35106D9A66A4216EA20F6C52D06 +CT=5030D7131ABBD7AC323BA31B602B776E +PT=14B32E8BD3BD9D82613E32536E6A9F91 + +I=279 +KEY=BB500C300B47BB920CD851AB358A3DBF +IV=8FB9E6BDCD50610E97CF731216CFE698 +CT=14B32E8BD3BD9D82613E32536E6A9F91 +PT=1F22542AFCE63AA92CCDAF45F8DAEEF0 + +I=280 +KEY=A472581AF7A1813B2015FEEECD50D34F +IV=E18B3C5EDA8CDA9E94A376CEEF687D9F +CT=1F22542AFCE63AA92CCDAF45F8DAEEF0 +PT=FC986510E3ED40994D1C33201D0EDB27 + +I=281 +KEY=58EA3D0A144CC1A26D09CDCED05E0868 +IV=D1828C9DDB263064AD259A2360B3DFBA +CT=FC986510E3ED40994D1C33201D0EDB27 +PT=06C1CE557C9AC5D40560CF2D40DCC47C + +I=282 +KEY=5E2BF35F68D60476686902E39082CC14 +IV=3454FD0698CC8CD949970509C23E50F6 +CT=06C1CE557C9AC5D40560CF2D40DCC47C +PT=4287FA420FD9AFCAB7E290273BDF4054 + +I=283 +KEY=1CAC091D670FABBCDF8B92C4AB5D8C40 +IV=C2F0C044A975ADBD20DE56858A074886 +CT=4287FA420FD9AFCAB7E290273BDF4054 +PT=447AFDD3ACF0DEEB0385799789FBAFF0 + +I=284 +KEY=58D6F4CECBFF7557DC0EEB5322A623B0 +IV=299C337821B0779A7ADC3A04316A6373 +CT=447AFDD3ACF0DEEB0385799789FBAFF0 +PT=BA0BBC980827E87EEA51E66C92C96B31 + +I=285 +KEY=E2DD4856C3D89D29365F0D3FB06F4881 +IV=2368291AD179C3C143E636898EB3E104 +CT=BA0BBC980827E87EEA51E66C92C96B31 +PT=77A6131415B251049423FFFB1F3A8A3A + +I=286 +KEY=957B5B42D66ACC2DA27CF2C4AF55C2BB +IV=14300EA81B57E102AEDD97CCD466E18A +CT=77A6131415B251049423FFFB1F3A8A3A +PT=A7AEC0CC599D56347A72D934DDAC7899 + +I=287 +KEY=32D59B8E8FF79A19D80E2BF072F9BA22 +IV=FD62415C90DACCD22EC364877DB0CB24 +CT=A7AEC0CC599D56347A72D934DDAC7899 +PT=1B1100FCB9F85D8CCFDEC5865083B44D + +I=288 +KEY=29C49B72360FC79517D0EE76227A0E6F +IV=6CB24892D26E43E63819C372D5EB4F6D +CT=1B1100FCB9F85D8CCFDEC5865083B44D +PT=33E9BBD018604F301C2543878FCCCA5C + +I=289 +KEY=1A2D20A22E6F88A50BF5ADF1ADB6C433 +IV=50D84A03998B897D1AE217FEA9A955C4 +CT=33E9BBD018604F301C2543878FCCCA5C +PT=07163D652DB035C091830042D6047DF3 + +I=290 +KEY=1D3B1DC703DFBD659A76ADB37BB2B9C0 +IV=092DF26C855F07690836203E3E1790D0 +CT=07163D652DB035C091830042D6047DF3 +PT=AD6647AF8EFCD4F3B2ECDB4D6FFFC1EB + +I=291 +KEY=B05D5A688D236996289A76FE144D782B +IV=68634C941957E3F58F71BE37D7C5C78B +CT=AD6647AF8EFCD4F3B2ECDB4D6FFFC1EB +PT=D2B51122154D10F67D2C07BD75D5E8E2 + +I=292 +KEY=62E84B4A986E796055B67143619890C9 +IV=3C85044F6438FAA021BB7985A63A959D +CT=D2B51122154D10F67D2C07BD75D5E8E2 +PT=4131E9296FECD2DF35EDFBF0CBD0E54B + +I=293 +KEY=23D9A263F782ABBF605B8AB3AA487582 +IV=46D47F3F12B6ADD5580CE8CE7C7359CD +CT=4131E9296FECD2DF35EDFBF0CBD0E54B +PT=5AEA3E73A6EC0D9D683A3526AC1C0E58 + +I=294 +KEY=79339C10516EA6220861BF9506547BDA +IV=D3C58B190FDA0838C770C2185C553D97 +CT=5AEA3E73A6EC0D9D683A3526AC1C0E58 +PT=A21B17CB4588C30CAD6DF25A5E83E273 + +I=295 +KEY=DB288BDB14E6652EA50C4DCF58D799A9 +IV=870E7F0E3109712E84C58BEC0E7032F6 +CT=A21B17CB4588C30CAD6DF25A5E83E273 +PT=0021FF3BB8336E607B8DE10117005230 + +I=296 +KEY=DB0974E0ACD50B4EDE81ACCE4FD7CB99 +IV=2FC82B298A60FC40DA3EFD4E800DB063 +CT=0021FF3BB8336E607B8DE10117005230 +PT=2EFA32680ECD84891B447393F7C1AC88 + +I=297 +KEY=F5F34688A2188FC7C5C5DF5DB8166711 +IV=E1B86C9FC466B72BE40F65973FC41FC4 +CT=2EFA32680ECD84891B447393F7C1AC88 +PT=722117C1EE83FBA840EFEE86A930579F + +I=298 +KEY=87D251494C9B746F852A31DB1126308E +IV=48E347A705B6E322153BFE567931346F +CT=722117C1EE83FBA840EFEE86A930579F +PT=A684344231EC4C03726A0DC20EADA36D + +I=299 +KEY=2156650B7D77386CF7403C191F8B93E3 +IV=4CD618E5F959FC4C66602263F6C5C652 +CT=A684344231EC4C03726A0DC20EADA36D +PT=F40BFBEAC1C1BD1621FBAE1B605BD092 + +I=300 +KEY=D55D9EE1BCB6857AD6BB92027FD04371 +IV=5A41E8952E6B1C551C4691DE9C0A4B6D +CT=F40BFBEAC1C1BD1621FBAE1B605BD092 +PT=6ECDBFB3947C7E81C7BD4BE93B603728 + +I=301 +KEY=BB90215228CAFBFB1106D9EB44B07459 +IV=52E2726B0855F993E1075077B3AB1E77 +CT=6ECDBFB3947C7E81C7BD4BE93B603728 +PT=71E051375A3B974FE523DA47862E24AE + +I=302 +KEY=CA70706572F16CB4F42503ACC29E50F7 +IV=76B6637161FBE4760FCE90E9868B441A +CT=71E051375A3B974FE523DA47862E24AE +PT=CC6CFBCF9A62A3AE55F6B040673B25B3 + +I=303 +KEY=061C8BAAE893CF1AA1D3B3ECA5A57544 +IV=5563B0C2350A4ED76EE0C322480884FB +CT=CC6CFBCF9A62A3AE55F6B040673B25B3 +PT=DA71B26C4EE3FB1FD413FD0757B379E6 + +I=304 +KEY=DC6D39C6A670340575C04EEBF2160CA2 +IV=45C1C5DAF8DE9170C01E554DD36C564E +CT=DA71B26C4EE3FB1FD413FD0757B379E6 +PT=BCD4BC394FFB46207EF0A8EC9883BD55 + +I=305 +KEY=60B985FFE98B72250B30E6076A95B1F7 +IV=38E5B69E6D82A760BFD65CBAACC56F8A +CT=BCD4BC394FFB46207EF0A8EC9883BD55 +PT=FD997E7A7B77E5DF637182399779AF75 + +I=306 +KEY=9D20FB8592FC97FA6841643EFDEC1E82 +IV=8EB39B261910419E43B178DCD6803572 +CT=FD997E7A7B77E5DF637182399779AF75 +PT=71749C51136457B604CD8B4C193928A8 + +I=307 +KEY=EC5467D48198C04C6C8CEF72E4D5362A +IV=6DFA447305215066A0B5671E5AB80951 +CT=71749C51136457B604CD8B4C193928A8 +PT=DF48D76E54B4264304B0EC036DFDADDE + +I=308 +KEY=331CB0BAD52CE60F683C037189289BF4 +IV=8C2B316ECA96DB57322853E07BE47AB3 +CT=DF48D76E54B4264304B0EC036DFDADDE +PT=5E2BD374B9856C573A4DEBF1B8F453EC + +I=309 +KEY=6D3763CE6CA98A585271E88031DCC818 +IV=E541AC59CFDBEA97D1AE5221F849838E +CT=5E2BD374B9856C573A4DEBF1B8F453EC +PT=D7F97B76A8D3076D343A22459EC4765D + +I=310 +KEY=BACE18B8C47A8D35664BCAC5AF18BE45 +IV=B359889A22B9502571E4817C47BC5348 +CT=D7F97B76A8D3076D343A22459EC4765D +PT=E24F05EEE812BD3389AC0AAC4172F5C6 + +I=311 +KEY=58811D562C683006EFE7C069EE6A4B83 +IV=33F8D881A783051987103096B6C734C3 +CT=E24F05EEE812BD3389AC0AAC4172F5C6 +PT=A2AB44CC9C41A8748201DA6F9429AB39 + +I=312 +KEY=FA2A599AB02998726DE61A067A43E0BA +IV=2028704442AE252BCF1D081C5EE2D80B +CT=A2AB44CC9C41A8748201DA6F9429AB39 +PT=E8FA100D1D28186196BAF990A80109AA + +I=313 +KEY=12D04997AD018013FB5CE396D242E910 +IV=6384E3612062BC6850C94C3B14934A6F +CT=E8FA100D1D28186196BAF990A80109AA +PT=683AEF47A8990E2F8AAD8813789069B1 + +I=314 +KEY=7AEAA6D005988E3C71F16B85AAD280A1 +IV=12F78728F3B0EFAC7D304257E47ED5C8 +CT=683AEF47A8990E2F8AAD8813789069B1 +PT=F3121C95A5BACDEAEFA87C4EE40B6C6D + +I=315 +KEY=89F8BA45A02243D69E5917CB4ED9ECCC +IV=FE654BC69677E13383C4206BFB7896A6 +CT=F3121C95A5BACDEAEFA87C4EE40B6C6D +PT=AE9701378E128847A2669B516795D586 + +I=316 +KEY=276FBB722E30CB913C3F8C9A294C394A +IV=E79D5C468BCBA36A79B74F32F28FA635 +CT=AE9701378E128847A2669B516795D586 +PT=D97D988A40C5B323794F160FE8639262 + +I=317 +KEY=FE1223F86EF578B245709A95C12FAB28 +IV=4F3055450C627AD4712E042666AC0812 +CT=D97D988A40C5B323794F160FE8639262 +PT=32381BA55D5C0C91D683D57593772496 + +I=318 +KEY=CC2A385D33A9742393F34FE052588FBE +IV=172165B468B83B62B41A2B4310461193 +CT=32381BA55D5C0C91D683D57593772496 +PT=4D555F31A60F1007B96FBB458B06A619 + +I=319 +KEY=817F676C95A664242A9CF4A5D95E29A7 +IV=5D5EEBEA67DCD5F7851619F1BAA6414E +CT=4D555F31A60F1007B96FBB458B06A619 +PT=23D1AC0F18C20FCE7E5CC4619F8376D5 + +I=320 +KEY=A2AECB638D646BEA54C030C446DD5F72 +IV=54154B82B5820D5892DABD15B403345D +CT=23D1AC0F18C20FCE7E5CC4619F8376D5 +PT=2E55905A38F818CC04D8A792D2007332 + +I=321 +KEY=8CFB5B39B59C73265018975694DD2C40 +IV=AC47D7619A587DC8213B749918FCFEA8 +CT=2E55905A38F818CC04D8A792D2007332 +PT=010F3396885F8F6BF15170B8E6D221BD + +I=322 +KEY=8DF468AF3DC3FC4DA149E7EE720F0DFD +IV=6CE249D2E89C61ACD029AA3C122427D1 +CT=010F3396885F8F6BF15170B8E6D221BD +PT=4DB3972D9851B8A4B3150A43210D36F0 + +I=323 +KEY=C047FF82A59244E9125CEDAD53023B0D +IV=07A578889914E113C1C4DE01DC4B1DE4 +CT=4DB3972D9851B8A4B3150A43210D36F0 +PT=84F64CFFD705E82704FF3DA4FC074B34 + +I=324 +KEY=44B1B37D7297ACCE16A3D009AF057039 +IV=CE73ADCD7BCF1807C084276EDD765256 +CT=84F64CFFD705E82704FF3DA4FC074B34 +PT=5964DF8E8D656846EE574635787F7B18 + +I=325 +KEY=1DD56CF3FFF2C488F8F4963CD77A0B21 +IV=679903574013011E62CC5798B9633607 +CT=5964DF8E8D656846EE574635787F7B18 +PT=E28E7E3AA93802BEEFE258F38F5D2E5C + +I=326 +KEY=FF5B12C956CAC6361716CECF5827257D +IV=678D8583A022C60BCE2C227627A548B2 +CT=E28E7E3AA93802BEEFE258F38F5D2E5C +PT=D297684A7C50765C413BFA37B5E1E256 + +I=327 +KEY=2DCC7A832A9AB06A562D34F8EDC6C72B +IV=4EF9AACC21733B65B4DD0B1F105D4037 +CT=D297684A7C50765C413BFA37B5E1E256 +PT=9EF5F9A2B14B090A201DE74E4CF714C8 + +I=328 +KEY=B33983219BD1B9607630D3B6A131D3E3 +IV=5CC41FCC9EC19619BA06D10BBC6E1F5F +CT=9EF5F9A2B14B090A201DE74E4CF714C8 +PT=81EF000CF6CA737E0F449927E66F6392 + +I=329 +KEY=32D6832D6D1BCA1E79744A91475EB071 +IV=6DE60CE2986CF80C5D588FA1F9A8C3A0 +CT=81EF000CF6CA737E0F449927E66F6392 +PT=3BE177EE9F8F7BE3BCE0FAA70C0A5025 + +I=330 +KEY=0937F4C3F294B1FDC594B0364B54E054 +IV=BE2F86A52BEED4497790D6134CF0D64E +CT=3BE177EE9F8F7BE3BCE0FAA70C0A5025 +PT=DD313134DB126529F349808B3E766795 + +I=331 +KEY=D406C5F72986D4D436DD30BD752287C1 +IV=A89E52478FDEF91AF151097CED84579C +CT=DD313134DB126529F349808B3E766795 +PT=330203EA36484C8E091F00CD2255E599 + +I=332 +KEY=E704C61D1FCE985A3FC2307057776258 +IV=1AEF7BA63A3E3B6D2EB8EB1980D3E581 +CT=330203EA36484C8E091F00CD2255E599 +PT=E28A47CDB7DB0351006C1D9FB227FCEF + +I=333 +KEY=058E81D0A8159B0B3FAE2DEFE5509EB7 +IV=F67C7FCF8C5AA1574A165D8CBE694BF4 +CT=E28A47CDB7DB0351006C1D9FB227FCEF +PT=ACF869797690853BE142BB7BAC735FC8 + +I=334 +KEY=A976E8A9DE851E30DEEC96944923C17F +IV=636F181C4735E700897928BFC60A43EB +CT=ACF869797690853BE142BB7BAC735FC8 +PT=60FF9BF36809DAEB94F823FC6458B26A + +I=335 +KEY=C989735AB68CC4DB4A14B5682D7B7315 +IV=0829C0EE6B170C490C7A73401761CEAA +CT=60FF9BF36809DAEB94F823FC6458B26A +PT=17630CBEAB904F7996301515F24A1F27 + +I=336 +KEY=DEEA7FE41D1C8BA2DC24A07DDF316C32 +IV=A4E0624D86F1098D2DD4D0408897ACED +CT=17630CBEAB904F7996301515F24A1F27 +PT=A1E35C3E2FA1B1DB11DB96E7DD58AB37 + +I=337 +KEY=7F0923DA32BD3A79CDFF369A0269C705 +IV=D3639A296FF168ED773785CFCACD1015 +CT=A1E35C3E2FA1B1DB11DB96E7DD58AB37 +PT=14F5408460708A69A22A2023B01969CE + +I=338 +KEY=6BFC635E52CDB0106FD516B9B270AECB +IV=37CD0428A0C08CC6AABAAA05D8830557 +CT=14F5408460708A69A22A2023B01969CE +PT=516991CA6530D20AB121394F51288880 + +I=339 +KEY=3A95F29437FD621ADEF42FF6E358264B +IV=FB52F5A95F2E3665D44F0AEACB88B108 +CT=516991CA6530D20AB121394F51288880 +PT=FB0C32B66729736F8E5EC8C92D80FDC5 + +I=340 +KEY=C199C02250D4117550AAE73FCED8DB8E +IV=403B43C740215D94E8FBAE22846D3B0A +CT=FB0C32B66729736F8E5EC8C92D80FDC5 +PT=C243054D022E7E9EFC21F965C71D63EB + +I=341 +KEY=03DAC56F52FA6FEBAC8B1E5A09C5B865 +IV=663796B211E7F6E05B4A107B16A904B0 +CT=C243054D022E7E9EFC21F965C71D63EB +PT=6CA56F6792355B2A7A60A4467A85F71E + +I=342 +KEY=6F7FAA08C0CF34C1D6EBBA1C73404F7B +IV=A23B73DF1477EC98202135164C6EF1AB +CT=6CA56F6792355B2A7A60A4467A85F71E +PT=BC590C8B427B013F873B2F5F8D66D5D1 + +I=343 +KEY=D326A68382B435FE51D09543FE269AAA +IV=E84DF462C62D594AAD94C33C446E18FC +CT=BC590C8B427B013F873B2F5F8D66D5D1 +PT=D37CAA9BEA300FF6219349DBA25DA0A6 + +I=344 +KEY=005A0C1868843A087043DC985C7B3A0C +IV=9AAD322884EBE93D0FA084E144600174 +CT=D37CAA9BEA300FF6219349DBA25DA0A6 +PT=AE50C328AFFC39A103C767C1FD337449 + +I=345 +KEY=AE0ACF30C77803A97384BB59A1484E45 +IV=9CEE91362FB0D50ABCEB58EF49EC3614 +CT=AE50C328AFFC39A103C767C1FD337449 +PT=882939453C6E156CD023B468EDD16C95 + +I=346 +KEY=2623F675FB1616C5A3A70F314C9922D0 +IV=5626126CC424BF26D92C822442E4221E +CT=882939453C6E156CD023B468EDD16C95 +PT=B9A97FE0DEF66604F6CE928AAB532EC2 + +I=347 +KEY=9F8A899525E070C155699DBBE7CA0C12 +IV=E5BB374C14E36FD0C2D5F9191C967EC7 +CT=B9A97FE0DEF66604F6CE928AAB532EC2 +PT=6ED0FF2FE8DA900A33AE20F7C1C2E457 + +I=348 +KEY=F15A76BACD3AE0CB66C7BD4C2608E845 +IV=4493B9F0FF63D392273302B6932C8F77 +CT=6ED0FF2FE8DA900A33AE20F7C1C2E457 +PT=B7583A56BED55067A520B4F5E5C1528F + +I=349 +KEY=46024CEC73EFB0ACC3E709B9C3C9BACA +IV=12E2BFD3EAB69E5132E3CDF8BAFBD45E +CT=B7583A56BED55067A520B4F5E5C1528F +PT=28874485575E292B0C83E1B568019BF0 + +I=350 +KEY=6E85086924B19987CF64E80CABC8213A +IV=3CEFDC726C919CA265CD6C28A05DE542 +CT=28874485575E292B0C83E1B568019BF0 +PT=A35D16BBB96BF3F9E06D96EDA9BB44BB + +I=351 +KEY=CDD81ED29DDA6A7E2F097EE102736581 +IV=4AE79901700F018D1E5D95A9FAD762F2 +CT=A35D16BBB96BF3F9E06D96EDA9BB44BB +PT=367E6880D369D482E7E64CFCD1BCC870 + +I=352 +KEY=FBA676524EB3BEFCC8EF321DD3CFADF1 +IV=52EEDB058A8E1FE7C651D484F86F941F +CT=367E6880D369D482E7E64CFCD1BCC870 +PT=32B33E97C94953392A738A964DB121FC + +I=353 +KEY=C91548C587FAEDC5E29CB88B9E7E8C0D +IV=B3704291187E9D55901DD237EC1E2F24 +CT=32B33E97C94953392A738A964DB121FC +PT=965A9A0C0287AB8535436E95CC9BFB99 + +I=354 +KEY=5F4FD2C9857D4640D7DFD61E52E57794 +IV=B3878FC256FA4F9ED0BA05FF51C0CE2A +CT=965A9A0C0287AB8535436E95CC9BFB99 +PT=367A5C93099ACF72353DAC320A3B766E + +I=355 +KEY=69358E5A8CE78932E2E27A2C58DE01FA +IV=774EA78AECAF5A1D7CC1785DE91CAB01 +CT=367A5C93099ACF72353DAC320A3B766E +PT=116EDEB1D0E6F8D1BB58AF648429B792 + +I=356 +KEY=785B50EB5C0171E359BAD548DCF7B668 +IV=FB1EC4218C5F733A54DEA7F753F45D68 +CT=116EDEB1D0E6F8D1BB58AF648429B792 +PT=EF3C679822E3A906F380CD07EBE65F09 + +I=357 +KEY=976737737EE2D8E5AA3A184F3711E961 +IV=8BBE09AFE41C5A78EBA0524212AC570F +CT=EF3C679822E3A906F380CD07EBE65F09 +PT=291B066A30A3B11681D414A4BB5311D5 + +I=358 +KEY=BE7C31194E4169F32BEE0CEB8C42F8B4 +IV=4E8F651C06778A964AA7D43999E41FD6 +CT=291B066A30A3B11681D414A4BB5311D5 +PT=764F8FD22FE0BD98852F259EA6DC6F7C + +I=359 +KEY=C833BECB61A1D46BAEC129752A9E97C8 +IV=E90A35007EE7F001D1F5982BF2477C82 +CT=764F8FD22FE0BD98852F259EA6DC6F7C +PT=66016373A6B1A3797A1B2D2B19B73126 + +I=360 +KEY=AE32DDB8C7107712D4DA045E3329A6EE +IV=46FF289808B1AF6B290CB5AF05747085 +CT=66016373A6B1A3797A1B2D2B19B73126 +PT=3367064ECF5CA978001887DBDE40DE5A + +I=361 +KEY=9D55DBF6084CDE6AD4C28385ED6978B4 +IV=9BAC8819E1CA613CFAA730FBC2034168 +CT=3367064ECF5CA978001887DBDE40DE5A +PT=5C4F01D47C9DA94DE95FC26763CC1146 + +I=362 +KEY=C11ADA2274D177273D9D41E28EA569F2 +IV=A5CE34A846E1D0A737963C49FAD6378E +CT=5C4F01D47C9DA94DE95FC26763CC1146 +PT=D41D854E42863F161E76A2397020C321 + +I=363 +KEY=15075F6C3657483123EBE3DBFE85AAD3 +IV=2CC823722DD3E8F15035875ED43513E2 +CT=D41D854E42863F161E76A2397020C321 +PT=1C542DC0B54A053471AF583C909AB3C4 + +I=364 +KEY=095372AC831D4D055244BBE76E1F1917 +IV=9799D03B6AD46BECD981279B35DF707C +CT=1C542DC0B54A053471AF583C909AB3C4 +PT=958D0254D7AFE1E678A9844DF4F4D18D + +I=365 +KEY=9CDE70F854B2ACE32AED3FAA9AEBC89A +IV=E0E401C7BA5E319F0D60AB765CBEE176 +CT=958D0254D7AFE1E678A9844DF4F4D18D +PT=C54888169B30587E732BD7213EE5B1A3 + +I=366 +KEY=5996F8EECF82F49D59C6E88BA40E7939 +IV=711DA6521732E6868111DCC1C835F9DF +CT=C54888169B30587E732BD7213EE5B1A3 +PT=446F234FCADA809A8B2E167A86C9EB36 + +I=367 +KEY=1DF9DBA105587407D2E8FEF122C7920F +IV=B7008BC907C546A56743C292185C2B02 +CT=446F234FCADA809A8B2E167A86C9EB36 +PT=6AD93BC7E18B48810664CD1C528BA6C4 + +I=368 +KEY=7720E066E4D33C86D48C33ED704C34CB +IV=4D7DD98183E56F71D72DB76187FC5F95 +CT=6AD93BC7E18B48810664CD1C528BA6C4 +PT=0D75BD2B8683FB819EB7F71E2E0836A7 + +I=369 +KEY=7A555D4D6250C7074A3BC4F35E44026C +IV=F4DCFB73BBE7EB5348D56F81BCBC0971 +CT=0D75BD2B8683FB819EB7F71E2E0836A7 +PT=8CBE14862E93FE011A4F45518C7258FA + +I=370 +KEY=F6EB49CB4CC33906507481A2D2365A96 +IV=5432FBF1480AA398F09CA5AF375FA394 +CT=8CBE14862E93FE011A4F45518C7258FA +PT=4026D669905762F0790B6497646A2D4D + +I=371 +KEY=B6CD9FA2DC945BF6297FE535B65C77DB +IV=CA462DC9F029A8311CA45A4116DADC1D +CT=4026D669905762F0790B6497646A2D4D +PT=A8CD2E187CF274756E5736D420853435 + +I=372 +KEY=1E00B1BAA0662F834728D3E196D943EE +IV=4FC9E7688352F4700C5F380BFD1F4FB2 +CT=A8CD2E187CF274756E5736D420853435 +PT=A99410B60322340E279C87D3D26793AA + +I=373 +KEY=B794A10CA3441B8D60B4543244BED044 +IV=4D90B1A30EB7E957FAE3DC8C132F4F42 +CT=A99410B60322340E279C87D3D26793AA +PT=D136F990196C667EC35E3A0492C39968 + +I=374 +KEY=66A2589CBA287DF3A3EA6E36D67D492C +IV=6FAD87F358F0C702C5E9E599093219ED +CT=D136F990196C667EC35E3A0492C39968 +PT=8CE49C1BAACAB69432DDA2FF4250C7B2 + +I=375 +KEY=EA46C48710E2CB679137CCC9942D8E9E +IV=2B6FF495B7E482360E31949C7C9B2E2B +CT=8CE49C1BAACAB69432DDA2FF4250C7B2 +PT=7942B80F57EA24FA200451B37899F9E2 + +I=376 +KEY=93047C884708EF9DB1339D7AECB4777C +IV=21FDC4C9B03A1A9A3F87FF9AAC80FAAE +CT=7942B80F57EA24FA200451B37899F9E2 +PT=DE156D56E199FDBB2600DBF9FC254003 + +I=377 +KEY=4D1111DEA6911226973346831091377F +IV=387612E399C62916B394A9FC6BC0F059 +CT=DE156D56E199FDBB2600DBF9FC254003 +PT=C302C494D910640271695324E64B0992 + +I=378 +KEY=8E13D54A7F817624E65A15A7F6DA3EED +IV=34BCABDE4646BCC05CAF7E61CBF1F8D2 +CT=C302C494D910640271695324E64B0992 +PT=110CE84E5B81867CE4FCCD1BBB5FD792 + +I=379 +KEY=9F1F3D042400F05802A6D8BC4D85E97F +IV=C7898DA9ABF2A3D364C228A83525B04F +CT=110CE84E5B81867CE4FCCD1BBB5FD792 +PT=7B94C0E4849AD65291F0F7BD464C544C + +I=380 +KEY=E48BFDE0A09A260A93562F010BC9BD33 +IV=00E079EEBC47AF3ED3796DBF4A2B55FC +CT=7B94C0E4849AD65291F0F7BD464C544C +PT=D6518596BB53E44452393BD4440D805C + +I=381 +KEY=32DA78761BC9C24EC16F14D54FC43D6F +IV=03E168F8AF2303593E0F936648D253DC +CT=D6518596BB53E44452393BD4440D805C +PT=0C4B51FB33380BB215F29F3FCE7CA0DA + +I=382 +KEY=3E91298D28F1C9FCD49D8BEA81B89DB5 +IV=15E1ECD59BC092C974FA4738C66D9604 +CT=0C4B51FB33380BB215F29F3FCE7CA0DA +PT=3FC98D86A558B711807930AAA391C9BF + +I=383 +KEY=0158A40B8DA97EED54E4BB402229540A +IV=303BD4A407015A9E899816E0FABF288D +CT=3FC98D86A558B711807930AAA391C9BF +PT=85D77D90C312FE938F6C1983014BD572 + +I=384 +KEY=848FD99B4EBB807EDB88A2C323628178 +IV=E018FA96FD433CFD162E8E67D4F37015 +CT=85D77D90C312FE938F6C1983014BD572 +PT=4F49C1740EA88B5767CE36C95158DD63 + +I=385 +KEY=CBC618EF40130B29BC46940A723A5C1B +IV=84013D3E2AA0C77650644CD6862096A7 +CT=4F49C1740EA88B5767CE36C95158DD63 +PT=E6F1409ABA890AC3A50FC4AAD82E1872 + +I=386 +KEY=2D375875FA9A01EA194950A0AA144469 +IV=8BFD137593BFF254414349F1147B9BFF +CT=E6F1409ABA890AC3A50FC4AAD82E1872 +PT=66F6E29696CFDC72EE905636614D2A72 + +I=387 +KEY=4BC1BAE36C55DD98F7D90696CB596E1B +IV=8EC295602FB66C4A2DCA65F66B07E010 +CT=66F6E29696CFDC72EE905636614D2A72 +PT=553B45792AE0625B357C4B68A4BB767F + +I=388 +KEY=1EFAFF9A46B5BFC3C2A54DFE6FE21864 +IV=5999E221475D06295451E52FF88F9F97 +CT=553B45792AE0625B357C4B68A4BB767F +PT=FAB6F53166BFDB89DF68D46D423C243E + +I=389 +KEY=E44C0AAB200A644A1DCD99932DDE3C5A +IV=49D1944CBD7BE00C671B8E996F9A3EB9 +CT=FAB6F53166BFDB89DF68D46D423C243E +PT=308DDB3FE0415C46AE450C78FC5F2558 + +I=390 +KEY=D4C1D194C04B380CB38895EBD1811902 +IV=9785FEE180794318514967B4199CFB93 +CT=308DDB3FE0415C46AE450C78FC5F2558 +PT=6659969D1BD493A3851E75981BACCCB0 + +I=391 +KEY=B2984709DB9FABAF3696E073CA2DD5B2 +IV=4FD1DAE14DB75AC0E6C94388805AC3B5 +CT=6659969D1BD493A3851E75981BACCCB0 +PT=B56B950D84DCA131FD8A5E2601037B36 + +I=392 +KEY=07F3D2045F430A9ECB1CBE55CB2EAE84 +IV=3ED415E7DDDADD2DC7F0376E6CA42EFE +CT=B56B950D84DCA131FD8A5E2601037B36 +PT=8648F40FA13018563E6F1A799D9FCD91 + +I=393 +KEY=81BB260BFE7312C8F573A42C56B16315 +IV=FEAF76717C0905A601509BD68C6D08E5 +CT=8648F40FA13018563E6F1A799D9FCD91 +PT=66DE6D7A74B36C7EE2737DA526F5C8CD + +I=394 +KEY=E7654B718AC07EB61700D9897044ABD8 +IV=2B808C340320DD64AB9278A9D9A3E247 +CT=66DE6D7A74B36C7EE2737DA526F5C8CD +PT=9BB0D29CDA21452F60B5897186F3FAFB + +I=395 +KEY=7CD599ED50E13B9977B550F8F6B75123 +IV=D2EB48117E2E9FB2058800DE1A442799 +CT=9BB0D29CDA21452F60B5897186F3FAFB +PT=489CDC3A2C1AE7510E03AE36D5EAB0E5 + +I=396 +KEY=344945D77CFBDCC879B6FECE235DE1C6 +IV=427765E0671AA6D32634447687E9B209 +CT=489CDC3A2C1AE7510E03AE36D5EAB0E5 +PT=1D65D0E1235AE47DBCC2C65B59892C4C + +I=397 +KEY=292C95365FA138B5C57438957AD4CD8A +IV=D75E9F074D965FE902287B3BB1483315 +CT=1D65D0E1235AE47DBCC2C65B59892C4C +PT=E75B7AE5A8C3B93F15D0E3EBD04E1B4B + +I=398 +KEY=CE77EFD3F762818AD0A4DB7EAA9AD6C1 +IV=5455FD9A01E04E48CA777CF8185697ED +CT=E75B7AE5A8C3B93F15D0E3EBD04E1B4B +PT=11F4A35F6C225A9DF1CA6BAF92E11B07 + +I=399 +KEY=DF834C8C9B40DB17216EB0D1387BCDC6 +IV=3C608F664492626B2208DC92E819411A +CT=11F4A35F6C225A9DF1CA6BAF92E11B07 +PT=9B8FB71E035CEFF9CBFA1346E5ACEFE0 + +========== + +KEYSIZE=192 + +I=0 +KEY=000000000000000000000000000000000000000000000000 +IV=00000000000000000000000000000000 +CT=00000000000000000000000000000000 +PT=5DF678DD17BA4E75B61768C6ADEF7C7B + +I=1 +KEY=8AB601AF30C47B225DF678DD17BA4E75B61768C6ADEF7C7B +IV=3B243F1A9BA094EE8AB601AF30C47B22 +CT=5DF678DD17BA4E75B61768C6ADEF7C7B +PT=F9604074F8FA45AC71959888DD056F9F + +I=2 +KEY=D443B8E25A882D05A49638A9EF400BD9C782F04E70EA13E4 +IV=467E32A79443B0735EF5B94D6A4C5627 +CT=F9604074F8FA45AC71959888DD056F9F +PT=98A957EA6DBE623B7E08F919812A3898 + +I=3 +KEY=5742DCD38C8FD46D3C3F6F4382FE69E2B98A0957F1C02B7C +IV=B9E1062EEDD9A1ED83016431D607F968 +CT=98A957EA6DBE623B7E08F919812A3898 +PT=AD6D29D6482764BB4BC27A87AE5CD877 + +I=4 +KEY=B33625F7872DE4A191524695CAD90D59F24873D05F9CF30B +IV=BD1AAC94D2D39445E474F9240BA230CC +CT=AD6D29D6482764BB4BC27A87AE5CD877 +PT=DA5EB591FDC48F0D9E4EBD373E5717A3 + +I=5 +KEY=35DA9F0A5DB187964B0CF304371D82546C06CEE761CBE4A8 +IV=4782561ED717916986ECBAFDDA9C6337 +CT=DA5EB591FDC48F0D9E4EBD373E5717A3 +PT=3F6E771434E26D4FA5A57CEF9DEE05D6 + +I=6 +KEY=A8182E4F8FD8C7987462841003FFEF1BC9A3B208FC25E17E +IV=093273C6E96EA5399DC2B145D269400E +CT=3F6E771434E26D4FA5A57CEF9DEE05D6 +PT=F8FBFC8CBDD4AA8E8DA58DEA7F2F344C + +I=7 +KEY=71A581F408C35DA48C99789CBE2B459544063FE2830AD532 +IV=3900E8650CA62A25D9BDAFBB871B9A3C +CT=F8FBFC8CBDD4AA8E8DA58DEA7F2F344C +PT=B969AA871D3B35C260D8B36C7E9E8913 + +I=8 +KEY=BCD0E4B5F0B7FB5035F0D21BA310705724DE8C8EFD945C21 +IV=0E2BCF13C2A18FF5CD756541F874A6F4 +CT=B969AA871D3B35C260D8B36C7E9E8913 +PT=6205EECCDD965D45339A2DFE85F52AD7 + +I=9 +KEY=A2796321044D9F5557F53CD77E862D121744A170786176F6 +IV=8B935AB4C17D24D21EA98794F4FA6405 +CT=6205EECCDD965D45339A2DFE85F52AD7 +PT=6BC27204DA1B9BC27E463D0E71557D99 + +I=10 +KEY=AD4506295D5309603C374ED3A49DB6D069029C7E09340B6F +IV=A9AF68AB4EFDB7770F3C6508591E9635 +CT=6BC27204DA1B9BC27E463D0E71557D99 +PT=DB1576A8F1BD88F73E6938E72F9C6DCD + +I=11 +KEY=61ECB6C8660E5E20E722387B55203E27576BA49926A866A2 +IV=DF83746D72419F65CCA9B0E13B5D5740 +CT=DB1576A8F1BD88F73E6938E72F9C6DCD +PT=150D14977B15FD304890D7B9C4F8536E + +I=12 +KEY=03679C91B6C57828F22F2CEC2E35C3171FFB7320E25035CC +IV=59D101131EA2FD7F628B2A59D0CB2608 +CT=150D14977B15FD304890D7B9C4F8536E +PT=7AE22B73B412A81D0BCF422C68DA37F8 + +I=13 +KEY=9A087B9DBC37B12988CD079F9A276B0A1434310C8A8A0234 +IV=F26F03A3C84A49F0996FE70C0AF2C901 +CT=7AE22B73B412A81D0BCF422C68DA37F8 +PT=2D1584CE9B85E7264228A8AFF8FAFF01 + +I=14 +KEY=07489932E5335B38A5D8835101A28C2C561C99A37270FD35 +IV=E76AB1C798119F5D9D40E2AF5904EA11 +CT=2D1584CE9B85E7264228A8AFF8FAFF01 +PT=C1067030225453E808F1FF324C44BE7F + +I=15 +KEY=DC3726E33013BC9964DEF36123F6DFC45EED66913E34434A +IV=55010D6199E792E3DB7FBFD1D520E7A1 +CT=C1067030225453E808F1FF324C44BE7F +PT=3AD7DBD96BB69D63BE39B9A16574AC74 + +I=16 +KEY=EDD4EC10B074A36C5E0928B8484042A7E0D4DF305B40EF3E +IV=18C6FE6D0A2FDD7E31E3CAF380671FF5 +CT=3AD7DBD96BB69D63BE39B9A16574AC74 +PT=3D5D82A4C06B9DDCCC8A6B8BF228482F + +I=17 +KEY=23824573BD3CE30D6354AA1C882BDF7B2C5EB4BBA968A711 +IV=E1DEAECBCFC06BCCCE56A9630D484061 +CT=3D5D82A4C06B9DDCCC8A6B8BF228482F +PT=C0E5F9618F2FAB97EA82F8164DC89860 + +I=18 +KEY=AAA43BC528933502A3B1537D070474ECC6DC4CADE4A03F71 +IV=2CE22FDF7E87B7CC89267EB695AFD60F +CT=C0E5F9618F2FAB97EA82F8164DC89860 +PT=6942155FC9EF8F7CFE37CD6FED03CECF + +I=19 +KEY=A2686C442D636D31CAF34622CEEBFB9038EB81C209A3F1BE +IV=B7772CF7B44B856308CC578105F05833 +CT=6942155FC9EF8F7CFE37CD6FED03CECF +PT=6BA4C261F5173862A6789FB026099571 + +I=20 +KEY=29F645A446D84EACA15784433BFCC3F29E931E722FAA64CF +IV=15CA23A60D99FFF68B9E29E06BBB239D +CT=6BA4C261F5173862A6789FB026099571 +PT=AA9E8C6497CAC6B0C8CC92F8DFE7B455 + +I=21 +KEY=5E9165527010387F0BC90827AC360542565F8C8AF04DD09A +IV=53193227307BBE49776720F636C876D3 +CT=AA9E8C6497CAC6B0C8CC92F8DFE7B455 +PT=7DA426C712E7F2F35087D6AA31CF56AB + +I=22 +KEY=92DC0EEE09F5169E766D2EE0BED1F7B106D85A20C1828631 +IV=85A3D20949963F95CC4D6BBC79E52EE1 +CT=7DA426C712E7F2F35087D6AA31CF56AB +PT=09B9FF5E5833B6CE0010C3D0C4A84C19 + +I=23 +KEY=C45B938E7C18B4107FD4D1BEE6E2417F06C899F0052ACA28 +IV=292A007187D730B956879D6075EDA28E +CT=09B9FF5E5833B6CE0010C3D0C4A84C19 +PT=178F7AC0FF63C33683A001F5C4171316 + +I=24 +KEY=03D99546E931B761685BAB7E1981824985689805C13DD93E +IV=A8D8CD3B96215FCDC78206C895290371 +CT=178F7AC0FF63C33683A001F5C4171316 +PT=C39B82763CF6901170902BE6DC1B9305 + +I=25 +KEY=B52384CAC0B230F5ABC0290825771258F5F8B3E31D264A3B +IV=451968C3AA8D0319B6FA118C29838794 +CT=C39B82763CF6901170902BE6DC1B9305 +PT=85D827F61EC17FD00B10356292C863E2 + +I=26 +KEY=DCF617A990AC4CBB2E180EFE3BB66D88FEE886818FEE29D9 +IV=575103DAEFD233E269D59363501E7C4E +CT=85D827F61EC17FD00B10356292C863E2 +PT=535BAC956D5CAB917E1A1BC28E82F28F + +I=27 +KEY=14D0FCAFFD961CFD7D43A26B56EAC61980F29D43016CDB56 +IV=7DE780ACCF9F1896C826EB066D3A5046 +CT=535BAC956D5CAB917E1A1BC28E82F28F +PT=7E73E89F187EA6D5F5A3044A19C85941 + +I=28 +KEY=AF5BFBC086F1392203304AF44E9460CC7551990918A48217 +IV=633F0251217DECEDBB8B076F7B6725DF +CT=7E73E89F187EA6D5F5A3044A19C85941 +PT=B0976DFD4F0620203AC4ED89D395BAFF + +I=29 +KEY=79FFB93DCF243047B3A72709019240EC4F957480CB3138E8 +IV=C1AAE3E35613DAADD6A442FD49D50965 +CT=B0976DFD4F0620203AC4ED89D395BAFF +PT=5ECB838EC7F9F2E7ADBD719599F829B9 + +I=30 +KEY=681F54ADA7685555ED6CA487C66BB20BE228051552C91151 +IV=4F00D9CD31BE1CC611E0ED90684C6512 +CT=5ECB838EC7F9F2E7ADBD719599F829B9 +PT=8DDA96BD88D3D756306D249ABF99F5F9 + +I=31 +KEY=8663BEBF11817A3060B6323A4EB8655DD245218FED50E4A8 +IV=7CC24DC4B003DE90EE7CEA12B6E92F65 +CT=8DDA96BD88D3D756306D249ABF99F5F9 +PT=479E96E558540B71508FEF3173A6FC68 + +I=32 +KEY=831519BE48B0021A2728A4DF16EC6E2C82CACEBE9EF618C0 +IV=59FFA792DC8618070576A7015931782A +CT=479E96E558540B71508FEF3173A6FC68 +PT=080EA053745BEEBDBC5F7D964EEBD2F7 + +I=33 +KEY=AFC20AF72699543A2F26048C62B780913E95B328D01DCA37 +IV=4E5BDD875324CAC02CD713496E295620 +CT=080EA053745BEEBDBC5F7D964EEBD2F7 +PT=B5A58D345C0260A9E274E2E593B76C44 + +I=34 +KEY=46AEAF002B9A297E9A8389B83EB5E038DCE151CD43AAA673 +IV=C67419FDA89E68B1E96CA5F70D037D44 +CT=B5A58D345C0260A9E274E2E593B76C44 +PT=5200F2D475CA388841CB0DD02C7EB7F6 + +I=35 +KEY=1598E4DD7DA3D7B0C8837B6C4B7FD8B09D2A5C1D6FD41185 +IV=9F5C74A1FE2DFF2153364BDD5639FECE +CT=5200F2D475CA388841CB0DD02C7EB7F6 +PT=B2639C2D26BF2CAF2371CA3A4F3D3476 + +I=36 +KEY=FE63AA4A158B41AE7AE0E7416DC0F41FBE5B962720E925F3 +IV=2DC59704D531C890EBFB4E976828961E +CT=B2639C2D26BF2CAF2371CA3A4F3D3476 +PT=C758ADC41E334CCBF34C40E2AEAA3852 + +I=37 +KEY=86B214FA7F89CE06BDB84A8573F3B8D44D17D6C58E431DA1 +IV=D0982ADEECE45CCC78D1BEB06A028FA8 +CT=C758ADC41E334CCBF34C40E2AEAA3852 +PT=F8E0AA1E780F18A50371CBCB1B63E83F + +I=38 +KEY=C0C34A59DC653DCE4558E09B0BFCA0714E661D0E9520F59E +IV=A252B0F29766A24B46715EA3A3ECF3C8 +CT=F8E0AA1E780F18A50371CBCB1B63E83F +PT=554B524391A7A1679210CFC0152A65CE + +I=39 +KEY=3CF3D7DDFFF704231013B2D89A5B0116DC76D2CE800A9050 +IV=42EE716B821C18FCFC309D84239239ED +CT=554B524391A7A1679210CFC0152A65CE +PT=3273E6C51751407B7E4ECDED7970746D + +I=40 +KEY=7FCC684C43B958F02260541D8D0A416DA2381F23F97AE43D +IV=A4FCB2B8AB7158B9433FBF91BC4E5CD3 +CT=3273E6C51751407B7E4ECDED7970746D +PT=D90B75848AC14ACA3CAD9AF2A15F315F + +I=41 +KEY=240724B451241314FB6B219907CB0BA79E9585D15825D562 +IV=5C4FA1918B04D5F85BCB4CF8129D4BE4 +CT=D90B75848AC14ACA3CAD9AF2A15F315F +PT=753C59B87C45B21D527527C6C2DDEB0D + +I=42 +KEY=F0BEECC2DB5D16F98E5778217B8EB9BACCE0A2179AF83E6F +IV=4E41A4AB69AEE73FD4B9C8768A7905ED +CT=753C59B87C45B21D527527C6C2DDEB0D +PT=156E851810ADB0BF2D28B6150D32CAC7 + +I=43 +KEY=C2FB954C95633B5B9B39FD396B230905E1C8140297CAF4A8 +IV=983906FA7F156CF33245798E4E3E2DA2 +CT=156E851810ADB0BF2D28B6150D32CAC7 +PT=26E671DACE32070A601796207BD045B5 + +I=44 +KEY=BF0BD4C6DDBE22DABDDF8CE3A5110E0F81DF8222EC1AB11D +IV=B3188D29356783AF7DF0418A48DD1981 +CT=26E671DACE32070A601796207BD045B5 +PT=ADAD9072859250A8590F6F54C24E5A77 + +I=45 +KEY=2E4F07AD61768CC010721C9120835EA7D8D0ED762E54EB6A +IV=639F27016A9D99B99144D36BBCC8AE1A +CT=ADAD9072859250A8590F6F54C24E5A77 +PT=AC8AD3933D51D5D71CA90FB73A53F6AD + +I=46 +KEY=9963998A6F982462BCF8CF021DD28B70C479E2C114071DC7 +IV=B2A3ACB0CE942F13B72C9E270EEEA8A2 +CT=AC8AD3933D51D5D71CA90FB73A53F6AD +PT=7319F2825648168F07D525618DA9979A + +I=47 +KEY=417FD42690AAE310CFE13D804B9A9DFFC3ACC7A099AE8A5D +IV=EBB0EF7CE1ACF152D81C4DACFF32C772 +CT=7319F2825648168F07D525618DA9979A +PT=4FC19392439D6CBE6699419355E0590B + +I=48 +KEY=30CD3A2A0910C7268020AE120807F141A5358633CC4ED356 +IV=4DCACE79E4C3ADFE71B2EE0C99BA2436 +CT=4FC19392439D6CBE6699419355E0590B +PT=047FF92A523900A3C46D906163927DDD + +I=49 +KEY=F13EE3ACC9C19E4C845F57385A3EF1E261581652AFDCAE8B +IV=E260680204844E6FC1F3D986C0D1596A +CT=047FF92A523900A3C46D906163927DDD +PT=2DAE78D178D069918CCC11D675E09655 + +I=50 +KEY=91556C720DC982D5A9F12FE922EE9873ED940784DA3C38DE +IV=A4E4973E74B61315606B8FDEC4081C99 +CT=2DAE78D178D069918CCC11D675E09655 +PT=6315A6A029ED7FC5AB3CD38D8DAE561A + +I=51 +KEY=9120A23E63AF3BC2CAE489490B03E7B646A8D40957926EC4 +IV=C02DA24531C794BD0075CE4C6E66B917 +CT=6315A6A029ED7FC5AB3CD38D8DAE561A +PT=65A796C69B769E59D34AD19803F117C6 + +I=52 +KEY=5C6847E25C66145DAF431F8F907579EF95E2059154637902 +IV=0D72A6B0F3959C89CD48E5DC3FC92F9F +CT=65A796C69B769E59D34AD19803F117C6 +PT=70770D19D03DF488FB627F460A225F39 + +I=53 +KEY=F5ECA4C905FF0EC2DF34129640488D676E807AD75E41263B +IV=2F60424B5062D978A984E32B59991A9F +CT=70770D19D03DF488FB627F460A225F39 +PT=C8A66A2CD18286D2148230BAB7D81E11 + +I=54 +KEY=FF86E251C5EC6129179278BA91CA0BB57A024A6DE999382A +IV=CC7330AE077936B10A6A4698C0136FEB +CT=C8A66A2CD18286D2148230BAB7D81E11 +PT=FC0B47BA3E51927A632F457A919818DC + +I=55 +KEY=5C0A7344D6FD6983EB993F00AF9B99CF192D0F17780120F6 +IV=CA119AEE5576E06EA38C9115131108AA +CT=FC0B47BA3E51927A632F457A919818DC +PT=AEEDB360C58C4CDC7ACE87AA1A4B785B + +I=56 +KEY=426948BD499E8A9845748C606A17D51363E388BD624A58AD +IV=920C491DE39D52501E633BF99F63E31B +CT=AEEDB360C58C4CDC7ACE87AA1A4B785B +PT=737ECC4294FF69495DC37DC795EC13CE + +I=57 +KEY=F8AD0E545AA212E6360A4022FEE8BC5A3E20F57AF7A64B63 +IV=B975B70450A41A2DBAC446E9133C987E +CT=737ECC4294FF69495DC37DC795EC13CE +PT=3E7CDC26CCC69E02D08248224A22961E + +I=58 +KEY=C2834233A26DCD8A08769C04322E2258EEA2BD58BD84DD7D +IV=A88326DC57AB80FC3A2E4C67F8CFDF6C +CT=3E7CDC26CCC69E02D08248224A22961E +PT=88177B6502254344A364023BCAD29E79 + +I=59 +KEY=962D892D6CDED6798061E761300B611C4DC6BF6377564304 +IV=D95CFF470B1796D754AECB1ECEB31BF3 +CT=88177B6502254344A364023BCAD29E79 +PT=A10FA825EB6DA0E242D9A381F607472D + +I=60 +KEY=3ADA98C76065214A216E4F44DB66C1FE0F1F1CE281510429 +IV=FBD25798351AF35DACF711EA0CBBF733 +CT=A10FA825EB6DA0E242D9A381F607472D +PT=6B5EE3A222DF46560A12E91C006D303F + +I=61 +KEY=C6AB975CF71B6DDF4A30ACE6F9B987A8050DF5FE813C3416 +IV=6CDB3875008754DAFC710F9B977E4C95 +CT=6B5EE3A222DF46560A12E91C006D303F +PT=A0047B92A93ACF32138A818B6E32B3EE + +I=62 +KEY=FFD0E16A5C955EBAEA34D7745083489A16877475EF0E87F8 +IV=F7061CA37B11E445397B7636AB8E3365 +CT=A0047B92A93ACF32138A818B6E32B3EE +PT=1707FC063700E98FF5FDA98A07A8A1C7 + +I=63 +KEY=AA71EC7061FA246CFD332B726783A115E37ADDFFE8A6263F +IV=1853E27FC0689E6755A10D1A3D6F7AD6 +CT=1707FC063700E98FF5FDA98A07A8A1C7 +PT=06320FA4C0E2F42B364B991243FA053D + +I=64 +KEY=D8685685696CBF5CFB0124D6A761553ED53144EDAB5C2302 +IV=E19A3BEC7EBCA3C87219BAF508969B30 +CT=06320FA4C0E2F42B364B991243FA053D +PT=BB70503E9715D653710C0630211755A7 + +I=65 +KEY=28C2AFFA406EF763407174E83074836DA43D42DD8A4B76A5 +IV=5F3BCA36562AFA82F0AAF97F2902483F +CT=BB70503E9715D653710C0630211755A7 +PT=D632FEF42560770DF318C570AFC85285 + +I=66 +KEY=260B8E0723E9AF3D96438A1C1514F460572587AD25832420 +IV=328A42D3898A81C20EC921FD6387585E +CT=D632FEF42560770DF318C570AFC85285 +PT=B1C847FFF455D002E55FCFAF4A4F69A4 + +I=67 +KEY=F39D3CD6A68DC6BC278BCDE3E1412462B27A48026FCC4D84 +IV=C89E7B4C1BAED0FAD596B2D185646981 +CT=B1C847FFF455D002E55FCFAF4A4F69A4 +PT=9C484252E1FE52CD2DFCCAA3E0118F07 + +I=68 +KEY=61A9714C87B94F27BBC38FB100BF76AF9F8682A18FDDC283 +IV=56B7D716EC6F9A6D92344D9A2134899B +CT=9C484252E1FE52CD2DFCCAA3E0118F07 +PT=85A142323B9877E86F3A5874EA613E87 + +I=69 +KEY=B504BE17C673E81F3E62CD833B270147F0BCDAD565BCFC04 +IV=BEF2C82884510475D4ADCF5B41CAA738 +CT=85A142323B9877E86F3A5874EA613E87 +PT=53D0EF74268F55C1B6CA84415E5A2F6F + +I=70 +KEY=1A63CC27BE45C5106DB222F71DA8548646765E943BE6D36B +IV=CC958CC3874510F0AF67723078362D0F +CT=53D0EF74268F55C1B6CA84415E5A2F6F +PT=7B7DB0F3EFAD244FFCC6991452001DF6 + +I=71 +KEY=4B17520C49F46EAF16CF9204F20570C9BAB0C78069E6CE9D +IV=48D7C0690532AFCC51749E2BF7B1ABBF +CT=7B7DB0F3EFAD244FFCC6991452001DF6 +PT=DD0661DCA2BE8C20E95B3A84CCACDB10 + +I=72 +KEY=1ADE412393310021CBC9F3D850BBFCE953EBFD04A54A158D +IV=4B96B2D0CCADFF7D51C9132FDAC56E8E +CT=DD0661DCA2BE8C20E95B3A84CCACDB10 +PT=E505435777F3781121A4A374684E3268 + +I=73 +KEY=493467065AE405B82ECCB08F274884F8724F5E70CD0427E5 +IV=1E8116EB95B94AFC53EA2625C9D50599 +CT=E505435777F3781121A4A374684E3268 +PT=EF4B4E997DA0DCCBDBB36C020D03E8B5 + +I=74 +KEY=4C94816DF6EBDEF5C187FE165AE85833A9FC3272C007CF50 +IV=29094410F6017E5805A0E66BAC0FDB4D +CT=EF4B4E997DA0DCCBDBB36C020D03E8B5 +PT=FA9BAB377C654ED894024BEBDCED2FA0 + +I=75 +KEY=697A0BC179C07A633B1C5521268D16EB3DFE79991CEAE0F0 +IV=83DD12597A405FB725EE8AAC8F2BA496 +CT=FA9BAB377C654ED894024BEBDCED2FA0 +PT=DD1FDA63382552D007F6F8E995820640 + +I=76 +KEY=D40786ED2A6C15E8E6038F421EA8443B3A0881708968E6B0 +IV=2F3AE5594D9CCEDCBD7D8D2C53AC6F8B +CT=DD1FDA63382552D007F6F8E995820640 +PT=C5FF0EB50BA651F436D0566385860ADA + +I=77 +KEY=9D47680C0159F69A23FC81F7150E15CF0CD8D7130CEEEC6A +IV=1BCFAD6802C41B9A4940EEE12B35E372 +CT=C5FF0EB50BA651F436D0566385860ADA +PT=67AE61A77D77CBFD48C080B21313BBAB + +I=78 +KEY=86E61E031542D2DB4452E0506879DE32441857A11FFD57C1 +IV=3DF4DA1F65C739511BA1760F141B2441 +CT=67AE61A77D77CBFD48C080B21313BBAB +PT=68C8512217CB9C3BBF28011FA5BED044 + +I=79 +KEY=4F93757DE614CB1D2C9AB1727FB24209FB3056BEBA438785 +IV=B2C15424EF4E4637C9756B7EF35619C6 +CT=68C8512217CB9C3BBF28011FA5BED044 +PT=233898C850826172965695499748A1B0 + +I=80 +KEY=C56E54BBB54B22CC0FA229BA2F30237B6D66C3F72D0B2635 +IV=DC2FF5992D9383EF8AFD21C6535FE9D1 +CT=233898C850826172965695499748A1B0 +PT=70069F5E963A820D640B40697BD24716 + +I=81 +KEY=A1EF05CB5AAE7A977FA4B6E4B90AA176096D839E56D96123 +IV=EE8CB982124A394C64815170EFE5585B +CT=70069F5E963A820D640B40697BD24716 +PT=B136CA2EF42A9CFF53410554B28A8F65 + +I=82 +KEY=ACEC084A8CED2F4FCE927CCA4D203D895A2C86CAE453EE46 +IV=515D8B6C167EC8570D030D81D64355D8 +CT=B136CA2EF42A9CFF53410554B28A8F65 +PT=123600CD1B5A664430413021DDC8CBBE + +I=83 +KEY=8325A9391B4E106ADCA47C07567A5BCD6A6DB6EB399B25F8 +IV=5A55A24EC8154E532FC9A17397A33F25 +CT=123600CD1B5A664430413021DDC8CBBE +PT=8ECCA03E10D415557C4E7D92DDBFD791 + +I=84 +KEY=DB877966BE0E84575268DC3946AE4E981623CB79E424F269 +IV=659705F3774E141758A2D05FA540943D +CT=8ECCA03E10D415557C4E7D92DDBFD791 +PT=CB70B675AC6BF92237F1C479516E7E6A + +I=85 +KEY=59027658DEC2B5DE99186A4CEAC5B7BA21D20F00B54A8C03 +IV=C9B803CE2D57D26F82850F3E60CC3189 +CT=CB70B675AC6BF92237F1C479516E7E6A +PT=5D99D06E9BEB82AB1CE22201E8467DBC + +I=86 +KEY=652E430F984201E0C481BA22712E35113D302D015D0CF1BF +IV=1838FACBEAC13CF73C2C35574680B43E +CT=5D99D06E9BEB82AB1CE22201E8467DBC +PT=11D7AED0B552D62677DEB874BF7CF8ED + +I=87 +KEY=8377A2C11B73082DD55614F2C47CE3374AEE9575E2700952 +IV=068170C7E11427DFE659E1CE833109CD +CT=11D7AED0B552D62677DEB874BF7CF8ED +PT=74B108D32ABE8401D22F2C3FB008F670 + +I=88 +KEY=7B89A5C45B0A22BBA1E71C21EEC2673698C1B94A5278FF22 +IV=5283DAD6FA2B605DF8FE070540792A96 +CT=74B108D32ABE8401D22F2C3FB008F670 +PT=7883BD8C4DA81C21C4A5847AD801B7AE + +I=89 +KEY=101261A4D23FDA13D964A1ADA36A7B175C643D308A79488C +IV=E2ED92DE4829CB526B9BC4608935F8A8 +CT=7883BD8C4DA81C21C4A5847AD801B7AE +PT=C865B27C21F6F6E681759C318607D2B9 + +I=90 +KEY=E6A6A13B7A64EB51110113D1829C8DF1DD11A1010C7E9A35 +IV=AB325AD4F1FF1C52F6B4C09FA85B3142 +CT=C865B27C21F6F6E681759C318607D2B9 +PT=E31D7AC0E8ADB302BC6C23A0B1D693ED + +I=91 +KEY=64D366C4F61E139BF21C69116A313EF3617D82A1BDA809D8 +IV=A5201D1770A12A898275C7FF8C7AF8CA +CT=E31D7AC0E8ADB302BC6C23A0B1D693ED +PT=CAE6A97EE64228EEEF02E135944C5C62 + +I=92 +KEY=B006CEF05093DE2238FAC06F8C73161D8E7F639429E455BA +IV=62BD7E3EA22E26BAD4D5A834A68DCDB9 +CT=CAE6A97EE64228EEEF02E135944C5C62 +PT=B7AEF117099F799BB0752C7260A2DFB5 + +I=93 +KEY=160AFF18C06B6C4A8F54317885EC6F863E0A4FE649468A0F +IV=AEBB967838133F64A60C31E890F8B268 +CT=B7AEF117099F799BB0752C7260A2DFB5 +PT=81CCC6EDAD41D9C7986D4E175C71551D + +I=94 +KEY=21112CBE896259CE0E98F79528ADB641A66701F11537DF12 +IV=B695BBE7FA331039371BD3A649093584 +CT=81CCC6EDAD41D9C7986D4E175C71551D +PT=9039E01C6485040A2EDAF4C27FE93870 + +I=95 +KEY=60272333C1B4CCC39EA117894C28B24B88BDF5336ADEE762 +IV=4EE830907337D60241360F8D48D6950D +CT=9039E01C6485040A2EDAF4C27FE93870 +PT=44D359DBE4BE436D5133CD81B72DB5C7 + +I=96 +KEY=25C676A781511A98DA724E52A896F126D98E38B2DDF352A5 +IV=38491C9FD517260445E1559440E5D65B +CT=44D359DBE4BE436D5133CD81B72DB5C7 +PT=7B47F95ED30563BE218E40DB4EAAE836 + +I=97 +KEY=59A7B7512B5DC429A135B70C7B939298F80078699359BA93 +IV=1FD8B8BA8B0492E67C61C1F6AA0CDEB1 +CT=7B47F95ED30563BE218E40DB4EAAE836 +PT=C417F6A6824B165D4C26D631F77E45AC + +I=98 +KEY=82E6CF234BC0AA10652241AAF9D884C5B426AE586427FF3F +IV=5FB017B65FE4AF34DB417872609D6E39 +CT=C417F6A6824B165D4C26D631F77E45AC +PT=41EC9A06B318A4D06636ED5403F46CB7 + +I=99 +KEY=82D69A1D747CF6E024CEDBAC4AC02015D210430C67D39388 +IV=1CC1F56321366F420030553E3FBC5CF0 +CT=41EC9A06B318A4D06636ED5403F46CB7 +PT=38E467F81D919F0A1704E9F5CDF4D5FC + +I=100 +KEY=29EFCA26B9C67E141C2ABC545751BF1FC514AAF9AA274674 +IV=A83BDBF4326AE806AB39503BCDBA88F4 +CT=38E467F81D919F0A1704E9F5CDF4D5FC +PT=A08359A20D6F405018F8180A3E8D0FD1 + +I=101 +KEY=AB20AC8C3C5DA5BEBCA9E5F65A3EFF4FDDECB2F394AA49A5 +IV=A14B10E1A998B04E82CF66AA859BDBAA +CT=A08359A20D6F405018F8180A3E8D0FD1 +PT=A16C303138057144A3ECA63E7398DC93 + +I=102 +KEY=86C5E861B9CEAF041DC5D5C7623B8E0B7E0014CDE7329536 +IV=181D943EA950561D2DE544ED85930ABA +CT=A16C303138057144A3ECA63E7398DC93 +PT=EA1A2E30D890D01979D2BCE1EBE6C922 + +I=103 +KEY=90321C401E4B6B30F7DFFBF7BAAB5E1207D2A82C0CD45C14 +IV=12BDB944D898BC5A16F7F421A785C434 +CT=EA1A2E30D890D01979D2BCE1EBE6C922 +PT=C0D620FCF33031DAD617ADBE8F6D13AC + +I=104 +KEY=84964C3B41FE8E4F3709DB0B499B6FC8D1C5059283B94FB8 +IV=0615AD27B29C55F814A4507B5FB5E57F +CT=C0D620FCF33031DAD617ADBE8F6D13AC +PT=EC4B9AEDBE44C4B74B693D08AA1D175A + +I=105 +KEY=6C6361F2C87BC168DB4241E6F7DFAB7F9AAC389A29A458E2 +IV=E79F33FFCD79681CE8F52DC989854F27 +CT=EC4B9AEDBE44C4B74B693D08AA1D175A +PT=F34D426225ADEC3BD2580BF21EF24B3E + +I=106 +KEY=FDA3FB79F1A16865280F0384D272474448F43368375613DC +IV=1DFE18B10032D35F91C09A8B39DAA90D +CT=F34D426225ADEC3BD2580BF21EF24B3E +PT=E14841B0D0CC1E698DE8053B9F1621E1 + +I=107 +KEY=562D3BF792909255C947423402BE592DC51C3653A840323D +IV=247A46C43AE54F1FAB8EC08E6331FA30 +CT=E14841B0D0CC1E698DE8053B9F1621E1 +PT=D21381B5032426EC3582BBD23739E04E + +I=108 +KEY=9D375E6E32C30A801B54C381019A7FC1F09E8D819F79D273 +IV=E05018C26DC38BBDCB1A6599A05398D5 +CT=D21381B5032426EC3582BBD23739E04E +PT=82034FF505FE67B94373770348A934E5 + +I=109 +KEY=7D1A900B515478DB99578C7404641878B3EDFA82D7D0E696 +IV=498AEA38AB55250CE02DCE656397725B +CT=82034FF505FE67B94373770348A934E5 +PT=018B5B1787138D222F6B39C1291ECD2C + +I=110 +KEY=E74B55A39F67C54298DCD7638377955A9C86C343FECE2BBA +IV=DD89DF396236F9A59A51C5A8CE33BD99 +CT=018B5B1787138D222F6B39C1291ECD2C +PT=CABCB7EA14E821726602272A46CEB825 + +I=111 +KEY=D3FFFE0F27D9200352606089979FB428FA84E469B800939F +IV=A707D154BAC28BDC34B4ABACB8BEE541 +CT=CABCB7EA14E821726602272A46CEB825 +PT=0840D09DF2B14ED4B340D32101D68A54 + +I=112 +KEY=485EC313821A37095A20B014652EFAFC49C43748B9D619CB +IV=ADEF6A8A49BF208B9BA13D1CA5C3170A +CT=0840D09DF2B14ED4B340D32101D68A54 +PT=5EB0166FB04AF38F9EA60929FD641844 + +I=113 +KEY=E841074638A154D90490A67BD5640973D7623E6144B2018F +IV=B1956D86A4F79E40A01FC455BABB63D0 +CT=5EB0166FB04AF38F9EA60929FD641844 +PT=2ECBDAFBD0336A436D89FC12944750EC + +I=114 +KEY=17E86798DB7A64E42A5B7C8005576330BAEBC273D0F55163 +IV=0AFFE19CA1425218FFA960DEE3DB303D +CT=2ECBDAFBD0336A436D89FC12944750EC +PT=A326D8C07EF7A21302A3C6A9C67C371A + +I=115 +KEY=D1A6F2AB7C130A60897DA4407BA0C123B84804DA16896679 +IV=6F630069CD0333BDC64E9533A7696E84 +CT=A326D8C07EF7A21302A3C6A9C67C371A +PT=6D06DDFB9B12A71298E32318F582EF72 + +I=116 +KEY=C7D58104581CB5C5E47B79BBE0B2663120AB27C2E30B890B +IV=80E47BA8410247C5167373AF240FBFA5 +CT=6D06DDFB9B12A71298E32318F582EF72 +PT=E1391A50F140E255A9B2E628F25B9B1D + +I=117 +KEY=00D8EEC433F7D68E054263EB11F284648919C1EA11501216 +IV=96F652822C5D4496C70D6FC06BEB634B +CT=E1391A50F140E255A9B2E628F25B9B1D +PT=1418A2DC8D6DBA4942932D6944011D8A + +I=118 +KEY=71D444358CCCF986115AC1379C9F3E2DCB8AEC8355510F9C +IV=410374DE0D8A79FA710CAAF1BF3B2F08 +CT=1418A2DC8D6DBA4942932D6944011D8A +PT=A70A2C48CF5786868844274B8C493C56 + +I=119 +KEY=B9FD9626EC74A129B650ED7F53C8B8AB43CECBC8D91833CA +IV=8362FAE290801C25C829D21360B858AF +CT=A70A2C48CF5786868844274B8C493C56 +PT=3484BA42558B199E8477B8F8280CDE91 + +I=120 +KEY=94CAEE912A7B443582D4573D0643A135C7B97330F114ED5B +IV=F6ABE3F0A7FFC9E02D3778B7C60FE51C +CT=3484BA42558B199E8477B8F8280CDE91 +PT=5D79433F85C7D4C258487080E340F049 + +I=121 +KEY=1D2F762CF08FAE0ADFAD1402838475F79FF103B012541D12 +IV=A0C57652FBF9107C89E598BDDAF4EA3F +CT=5D79433F85C7D4C258487080E340F049 +PT=C51891EA2E68BC60E84912A91F470201 + +I=122 +KEY=9E691D03A3AEB6491AB585E8ADECC99777B811190D131F13 +IV=8426C338234DB9E183466B2F53211843 +CT=C51891EA2E68BC60E84912A91F470201 +PT=F946FD67DD7F92A7A6B93B4F71F70243 + +I=123 +KEY=61EA6FD274C07ADDE3F3788F70935B30D1012A567CE41D50 +IV=2C2AF70B07E9E6F9FF8372D1D76ECC94 +CT=F946FD67DD7F92A7A6B93B4F71F70243 +PT=B4CB0EFF14F8CDC693CC8E7DCEE8E0B0 + +I=124 +KEY=84F27E5BF8B55DA657387670646B96F642CDA42BB20CFDE0 +IV=693782638B439464E51811898C75277B +CT=B4CB0EFF14F8CDC693CC8E7DCEE8E0B0 +PT=EF6DDB56AAE9CFFE128FB3776DD94D20 + +I=125 +KEY=5B1111EADAECDD73B855AD26CE8259085042175CDFD5B0C0 +IV=A14AAEF7A1BF063BDFE36FB1225980D5 +CT=EF6DDB56AAE9CFFE128FB3776DD94D20 +PT=4ACC6AF28293A647093AE788BA778835 + +I=126 +KEY=A924DC707FB16DF1F299C7D44C11FF4F5978F0D465A238F5 +IV=3F7E73BFA24B0C02F235CD9AA55DB082 +CT=4ACC6AF28293A647093AE788BA778835 +PT=5A7989DC61AD6B66B3E83A29168BEDB9 + +I=127 +KEY=164FBEF9EBAEEF03A8E04E082DBC9429EA90CAFD7329D54C +IV=2FB4F1A000B78156BF6B6289941F82F2 +CT=5A7989DC61AD6B66B3E83A29168BEDB9 +PT=246A94AB8488B39C52DE68E8CA5AE0D2 + +I=128 +KEY=B1F4A368B64A78EC8C8ADAA3A93427B5B84EA215B973359E +IV=5D178EC8305B804FA7BB1D915DE497EF +CT=246A94AB8488B39C52DE68E8CA5AE0D2 +PT=F7C758F8DC8FC0891907EBBF299F70B8 + +I=129 +KEY=9161A39C256814AA7B4D825B75BBE73CA14949AA90EC4526 +IV=C87E61A9434EB29F209500F493226C46 +CT=F7C758F8DC8FC0891907EBBF299F70B8 +PT=E2D82C5506BEFA7D7BF032E4C72141CF + +I=130 +KEY=0BFDA1B2CF4B15199995AE0E73051D41DAB97B4E57CD04E9 +IV=5D00992780D9832B9A9C022EEA2301B3 +CT=E2D82C5506BEFA7D7BF032E4C72141CF +PT=F3A0DF1793FC88117E87478FD9E5A1A8 + +I=131 +KEY=F8F5F6016FECDCAF6A357119E0F99550A43E3CC18E28A541 +IV=2800EECA83EB078CF30857B3A0A7C9B6 +CT=F3A0DF1793FC88117E87478FD9E5A1A8 +PT=BEB572C53E9985218ED9012BAB4A9F5B + +I=132 +KEY=84F3E0D153E140D6D48003DCDE6010712AE73DEA25623A1A +IV=E2BEAF80F4A1DDA27C0616D03C0D9C79 +CT=BEB572C53E9985218ED9012BAB4A9F5B +PT=7F4B21C4B7466149CB890B77AC538752 + +I=133 +KEY=B69E5A72FE9B1B85ABCB221869267138E16E369D8931BD48 +IV=FE0A667B9B2BDD29326DBAA3AD7A5B53 +CT=7F4B21C4B7466149CB890B77AC538752 +PT=4B239C8F83F0A10DC6A3497CC3CF9C8E + +I=134 +KEY=0BCF87D2538E0EADE0E8BE97EAD6D03527CD7FE14AFE21C6 +IV=878250C5EA7834CFBD51DDA0AD151528 +CT=4B239C8F83F0A10DC6A3497CC3CF9C8E +PT=89F2B4B8C5AB2988CDEA61F4D4A1BCD4 + +I=135 +KEY=97A4FDCD2E0C993E691A0A2F2F7DF9BDEA271E159E5F9D12 +IV=95E34D44C3E2FE319C6B7A1F7D829793 +CT=89F2B4B8C5AB2988CDEA61F4D4A1BCD4 +PT=C622E28004842564F193C0E58AB40FCB + +I=136 +KEY=38F0A45980CEF0B9AF38E8AF2BF9DCD91BB4DEF014EB92D9 +IV=1BC195727D154539AF545994AEC26987 +CT=C622E28004842564F193C0E58AB40FCB +PT=DF360FBC1607BCC1E6EE9088AEE62EC7 + +I=137 +KEY=6638E0333D7A6765700EE7133DFE6018FD5A4E78BA0DBC1E +IV=F0AB65A69AA4486A5EC8446ABDB497DC +CT=DF360FBC1607BCC1E6EE9088AEE62EC7 +PT=9A8E5BFE223FA9D747164FC1C98B9CDC + +I=138 +KEY=5103611D32D7A1EFEA80BCED1FC1C9CFBA4C01B9738620C2 +IV=A6617B5DA41B2A32373B812E0FADC68A +CT=9A8E5BFE223FA9D747164FC1C98B9CDC +PT=F0143DD4EC3A85F9FA4D5579BD7268A1 + +I=139 +KEY=64FD310AF27CF98C1A948139F3FB4C36400154C0CEF44863 +IV=EBCB744B477F25E635FE5017C0AB5863 +CT=F0143DD4EC3A85F9FA4D5579BD7268A1 +PT=C5C1FED629BF81EE343E4DAEE6BC4D44 + +I=140 +KEY=9390B012FA7D48D9DF557FEFDA44CDD8743F196E28480527 +IV=7AF352D33C08F3FEF76D81180801B155 +CT=C5C1FED629BF81EE343E4DAEE6BC4D44 +PT=26C4460F0B79E16263C38C240C276E5C + +I=141 +KEY=F578E5DF6818CB58F99139E0D13D2CBA17FC954A246F6B7B +IV=05DA148A4EB4D12966E855CD92658381 +CT=26C4460F0B79E16263C38C240C276E5C +PT=E0E249ADB3A39EE2BB48959426874123 + +I=142 +KEY=F23F67282BAFE10E1973704D629EB258ACB400DE02E82A58 +IV=7748B1652DE54EF9074782F743B72A56 +CT=E0E249ADB3A39EE2BB48959426874123 +PT=C2299AAE24C941DC44E5D492BC492FED + +I=143 +KEY=5CAC16BD99EC5067DB5AEAE34657F384E851D44CBEA105B5 +IV=4F599B9C20378305AE937195B243B169 +CT=C2299AAE24C941DC44E5D492BC492FED +PT=780DA1D6FD961DA4756375A15B8BA620 + +I=144 +KEY=9FF7C1766F7F6F9FA3574B35BBC1EE209D32A1EDE52AA395 +IV=044A8C7FFE220414C35BD7CBF6933FF8 +CT=780DA1D6FD961DA4756375A15B8BA620 +PT=E63FE8BE6566E9ECCCDBEC442BCCCBD5 + +I=145 +KEY=3EA408C4CD15E6F24568A38BDEA707CC51E94DA9CEE66840 +IV=05DE81CD5892F1FEA153C9B2A26A896D +CT=E63FE8BE6566E9ECCCDBEC442BCCCBD5 +PT=19F5E5DDDF0F6FABA9B16B732C6058B8 + +I=146 +KEY=29FF0DD567A810385C9D465601A86867F85826DAE28630F8 +IV=0A2A8BF3BE53E2B5175B0511AABDF6CA +CT=19F5E5DDDF0F6FABA9B16B732C6058B8 +PT=41FCD9F8972431F43669863F37B4A18C + +I=147 +KEY=842E4C2F46849E731D619FAE968C5993CE31A0E5D5329174 +IV=1EABD419CA4C0D0BADD141FA212C8E4B +CT=41FCD9F8972431F43669863F37B4A18C +PT=9857CFE1CFE1046F88DF3EB8ECC92E40 + +I=148 +KEY=8EE3344CCB9DE2038536504F596D5DFC46EE9E5D39FBBF34 +IV=FA266CF1AF82A2250ACD78638D197C70 +CT=9857CFE1CFE1046F88DF3EB8ECC92E40 +PT=DE4C55865FB82BDA1FC0D024791C1B22 + +I=149 +KEY=DEEEC86215A6098D5B7A05C906D57626592E4E7940E7A416 +IV=F9B4CFCA36A1B0AB500DFC2EDE3BEB8E +CT=DE4C55865FB82BDA1FC0D024791C1B22 +PT=077F866BF30097D12650855C71B7DB9C + +I=150 +KEY=50872D11A2E463D65C0583A2F5D5E1F77F7ECB2531507F8A +IV=53D4E4CE2C06FCC38E69E573B7426A5B +CT=077F866BF30097D12650855C71B7DB9C +PT=670BBCB81CDE03B883D9B784124F5851 + +I=151 +KEY=7DE3AF7C8550901C3B0E3F1AE90BE24FFCA77CA1231F27DB +IV=C26330B1219C4B4A2D64826D27B4F3CA +CT=670BBCB81CDE03B883D9B784124F5851 +PT=D6141C300F5E5119E1B5F4BBF415A6DD + +I=152 +KEY=BB126D64220A8DB9ED1A232AE655B3561D12881AD70A8106 +IV=74D773D0F053239CC6F1C218A75A1DA5 +CT=D6141C300F5E5119E1B5F4BBF415A6DD +PT=8F742130206F1047FE9CAAE4F2C31B19 + +I=153 +KEY=9845C3A02214A55D626E021AC63AA311E38E22FE25C99A1F +IV=7EC0B4E8BD4BD3EB2357AEC4001E28E4 +CT=8F742130206F1047FE9CAAE4F2C31B19 +PT=47D0D28AF3164CC77FBAB5C015CAC1C9 + +I=154 +KEY=BBC47FAB874E0ED425BED090352CEFD69C34973E30035BD6 +IV=833EC00D894BD8502381BC0BA55AAB89 +CT=47D0D28AF3164CC77FBAB5C015CAC1C9 +PT=3202B04CFC260747BF839FF754A01E26 + +I=155 +KEY=BCC028DA5F286DE017BC60DCC90AE89123B708C964A345F0 +IV=8BCC8079D2175F4407045771D8666334 +CT=3202B04CFC260747BF839FF754A01E26 +PT=75E9FBADAD8885FB2398427EE94C5899 + +I=156 +KEY=352B0CD3E3BA0EB462559B7164826D6A002F4AB78DEF1D69 +IV=0B159F18C1F33EA389EB2409BC926354 +CT=75E9FBADAD8885FB2398427EE94C5899 +PT=90DA906982058C84D2E75B5DAE0EA756 + +I=157 +KEY=6F32D4393B37EA77F28F0B18E687E1EED2C811EA23E1BA3F +IV=2F5C35DA76038E4F5A19D8EAD88DE4C3 +CT=90DA906982058C84D2E75B5DAE0EA756 +PT=705C22072FDFB807A49BAE0FD4D254AF + +I=158 +KEY=5740616769DDF57482D3291FC95859E97653BFE5F733EE90 +IV=B276B0CE56828D683872B55E52EA1F03 +CT=705C22072FDFB807A49BAE0FD4D254AF +PT=A966EE217CF2BDBC17A0BB55AE769FEB + +I=159 +KEY=C9E379BDBC05CC402BB5C73EB5AAE45561F304B05945717B +IV=E1F41EF2147CB5CE9EA318DAD5D83934 +CT=A966EE217CF2BDBC17A0BB55AE769FEB +PT=239D761F1F0437935464C4959546B6BB + +I=160 +KEY=7B2C4F503FCC91AE0828B121AAAED3C63597C025CC03C7C0 +IV=6F90097C7822030DB2CF36ED83C95DEE +CT=239D761F1F0437935464C4959546B6BB +PT=499477B6476BA58CAEF81290ABDD46C4 + +I=161 +KEY=42BC1C4F29D1801D41BCC697EDC5764A9B6FD2B567DE8104 +IV=1571EE53AE1ACAEF3990531F161D11B3 +CT=499477B6476BA58CAEF81290ABDD46C4 +PT=ACC1FB947EB4C7F115871859CD254D96 + +I=162 +KEY=9BE24C041BF4DEECED7D3D039371B1BB8EE8CAECAAFBCC92 +IV=E24F4DBEF2122A73D95E504B32255EF1 +CT=ACC1FB947EB4C7F115871859CD254D96 +PT=85DC9D7ADF342B0733CF9812CFD58F0A + +I=163 +KEY=83BEBEB5727649F268A1A0794C459ABCBD2752FE652E4398 +IV=AF0690E77B1F140B185CF2B16982971E +CT=85DC9D7ADF342B0733CF9812CFD58F0A +PT=7ED8B4DCBD1D13BEA5C819E99ECF75AA + +I=164 +KEY=7020802D561D88AD167914A5F158890218EF4B17FBE13632 +IV=F0AC93D8DDD31D5BF39E3E98246BC15F +CT=7ED8B4DCBD1D13BEA5C819E99ECF75AA +PT=C81F0464C2DE212229370C7A4ED2E890 + +I=165 +KEY=39F8EA2D638410ABDE6610C13386A82031D8476DB533DEA2 +IV=FD6338FAE6F6B00B49D86A0035999806 +CT=C81F0464C2DE212229370C7A4ED2E890 +PT=23A0FA99C632BCC62A035A09514C3EBA + +I=166 +KEY=52FA33F30EFD8D0FFDC6EA58F5B414E61BDB1D64E47FE018 +IV=04C6E0136D8E04C16B02D9DE6D799DA4 +CT=23A0FA99C632BCC62A035A09514C3EBA +PT=9F7F1081AE4B6AD51D395D764D2D5B68 + +I=167 +KEY=95C21BD9257B233A62B9FAD95BFF7E3306E24012A952BB70 +IV=72410E03AAE65889C738282A2B86AE35 +CT=9F7F1081AE4B6AD51D395D764D2D5B68 +PT=5F088092968BF4AF04BF862A6721DF2B + +I=168 +KEY=058F749326AE1DD53DB17A4BCD748A9C025DC638CE73645B +IV=D678325E266D12D7904D6F4A03D53EEF +CT=5F088092968BF4AF04BF862A6721DF2B +PT=15670F60D1D70E129418AC14A425DD70 + +I=169 +KEY=23D2D59C5EF4AF3D28D6752B1CA3848E96456A2C6A56B92B +IV=BB7B672A91E9A61A265DA10F785AB2E8 +CT=15670F60D1D70E129418AC14A425DD70 +PT=3273AC9D250F729AE790A941739C79BF + +I=170 +KEY=E11B1F94517914C81AA5D9B639ACF61471D5C36D19CAC094 +IV=AB84F623EFA11728C2C9CA080F8DBBF5 +CT=3273AC9D250F729AE790A941739C79BF +PT=9B135880CB56A8E6CF3A364CC6E02175 + +I=171 +KEY=66F867085DBE626581B68136F2FA5EF2BEEFF521DF2AE1E1 +IV=01ED899C8DC9C09E87E3789C0CC776AD +CT=9B135880CB56A8E6CF3A364CC6E02175 +PT=681D6FC5447CCFE1152156CFF6172B6A + +I=172 +KEY=98505FCD27DAB39EE9ABEEF3B6869113ABCEA3EE293DCA8B +IV=A58C8285C31035B1FEA838C57A64D1FB +CT=681D6FC5447CCFE1152156CFF6172B6A +PT=6E30DF3FBD67A5FD491E315EF3A268A0 + +I=173 +KEY=9F904A41C19B57A9879B31CC0BE134EEE2D092B0DA9FA22B +IV=6F46DCB3A84FD96907C0158CE641E437 +CT=6E30DF3FBD67A5FD491E315EF3A268A0 +PT=5B4980E24D8F9CABE017991326FBBE95 + +I=174 +KEY=A330D5A6779731D6DCD2B12E466EA84502C70BA3FC641CBE +IV=C5BDAB77E0CA95463CA09FE7B60C667F +CT=5B4980E24D8F9CABE017991326FBBE95 +PT=7324530BF94BD80D286C9BE2FE4113D3 + +I=175 +KEY=20F008DE76D7968AAFF6E225BF2570482AAB904102250F6D +IV=32F5EC4AEBB997C583C0DD780140A75C +CT=7324530BF94BD80D286C9BE2FE4113D3 +PT=B163425AB21DF6AFBD2C7000E777E902 + +I=176 +KEY=0F48153B232E71F41E95A07F0D3886E79787E041E552E66F +IV=3D1854E0C481B28E2FB81DE555F9E77E +CT=B163425AB21DF6AFBD2C7000E777E902 +PT=EB1A6C86C3811E3081325F35BA7F2DCA + +I=177 +KEY=96EE2134FD40CA34F58FCCF9CEB998D716B5BF745F2DCBA5 +IV=8629366A8B8E266499A6340FDE6EBBC0 +CT=EB1A6C86C3811E3081325F35BA7F2DCA +PT=E9675AF0035C3F8E9D5E58D0652BF5C7 + +I=178 +KEY=BF754C828BFE309B1CE89609CDE5A7598BEBE7A43A063E62 +IV=566D5FCEC3FF7D43299B6DB676BEFAAF +CT=E9675AF0035C3F8E9D5E58D0652BF5C7 +PT=24B4DA85EEFAA123948C6B5E0E07EB08 + +I=179 +KEY=F0223B4AF5C885B4385C4C8C231F067A1F678CFA3401D56A +IV=67B98EC651B057104F5777C87E36B52F +CT=24B4DA85EEFAA123948C6B5E0E07EB08 +PT=753CFEBBB9E623453B8BB2976B8D7BD4 + +I=180 +KEY=04665169E091DEF74D60B2379AF9253F24EC3E6D5F8CAEBE +IV=BC3806A9E56A1DACF4446A2315595B43 +CT=753CFEBBB9E623453B8BB2976B8D7BD4 +PT=6949284723B4F795D530B366FAE70876 + +I=181 +KEY=9CABB1CFD4E46F8324299A70B94DD2AAF1DC8D0BA56BA6C8 +IV=8C864563BB8D45A098CDE0A63475B174 +CT=6949284723B4F795D530B366FAE70876 +PT=D43FED9A25C62349787F0336BFFBBFEB + +I=182 +KEY=4407065E88AE79D9F01677EA9C8BF1E389A38E3D1A901923 +IV=539CC5888B34198FD8ACB7915C4A165A +CT=D43FED9A25C62349787F0336BFFBBFEB +PT=030733E175916579F582A778B261DA1C + +I=183 +KEY=84D1EE80E8FA54DEF311440BE91A949A7C212945A8F1C33F +IV=78306F4F56DEF759C0D6E8DE60542D07 +CT=030733E175916579F582A778B261DA1C +PT=F7B1ABE4B4AE3CB726F9A88B06D4552A + +I=184 +KEY=E885BEA6176A75D804A0EFEF5DB4A82D5AD881CEAE259615 +IV=3AC80B78F744208A6C545026FF902106 +CT=F7B1ABE4B4AE3CB726F9A88B06D4552A +PT=DA984A2C346A4B758E066EB509079168 + +I=185 +KEY=2E0317B2DB3F9893DE38A5C369DEE358D4DEEF7BA722077D +IV=FC74E03B1068A6FEC686A914CC55ED4B +CT=DA984A2C346A4B758E066EB509079168 +PT=21F473636EF27B91F29BB1CE67908763 + +I=186 +KEY=850E1B37E1F7DD89FFCCD6A0072C98C926455EB5C0B2801E +IV=7DFD76EE7EF97796AB0D0C853AC8451A +CT=21F473636EF27B91F29BB1CE67908763 +PT=9EEF6E211CC8EDBD3C4FBE3E14B13C70 + +I=187 +KEY=655D365D66CAA5C36123B8811BE475741A0AE08BD403BC6E +IV=33318C04CC0B3CBDE0532D6A873D784A +CT=9EEF6E211CC8EDBD3C4FBE3E14B13C70 +PT=8AB49333CA7B2E58E7B24536BB34DEE7 + +I=188 +KEY=BE3C315647F981DCEB972BB2D19F5B2CFDB8A5BD6F376289 +IV=79D06A0D66B5C2B1DB61070B2133241F +CT=8AB49333CA7B2E58E7B24536BB34DEE7 +PT=323D1E775FD729005DA7A2853A855ED4 + +I=189 +KEY=3126E544A65724C4D9AA35C58E48722CA01F073855B23C5D +IV=CC5C9D95685AF1228F1AD412E1AEA518 +CT=323D1E775FD729005DA7A2853A855ED4 +PT=E283016FEDADEBA2BEC7ADB5A8DEA8B9 + +I=190 +KEY=BCF052AFAFA4852D3B2934AA63E5998E1ED8AA8DFD6C94E4 +IV=2753144E0A26D9FE8DD6B7EB09F3A1E9 +CT=E283016FEDADEBA2BEC7ADB5A8DEA8B9 +PT=9A9BB977D53BBD47550DC60A49AFA0FA + +I=191 +KEY=ECB724A85CBC7B58A1B28DDDB6DE24C94BD56C87B4C3341E +IV=27F910046A94AA3B50477607F318FE75 +CT=9A9BB977D53BBD47550DC60A49AFA0FA +PT=AF4C7AC3B02C1B077E8F97B59AE52A21 + +I=192 +KEY=BCA9E9794F9004AB0EFEF71E06F23FCE355AFB322E261E3F +IV=8AF06705FE272571501ECDD1132C7FF3 +CT=AF4C7AC3B02C1B077E8F97B59AE52A21 +PT=A97DEE2A64DFA7C198B6A4F21E80F7DF + +I=193 +KEY=10DCC14B9A309E25A7831934622D980FADEC5FC030A6E9E0 +IV=B04E1C6FC657B8AEAC752832D5A09A8E +CT=A97DEE2A64DFA7C198B6A4F21E80F7DF +PT=34E8228A24C7A16F9ED3F4B9A94AA70D + +I=194 +KEY=9CB6EE6AAEFAFBED936B3BBE46EA3960333FAB7999EC4EED +IV=6A966EBB8F80A1608C6A2F2134CA65C8 +CT=34E8228A24C7A16F9ED3F4B9A94AA70D +PT=99E6CA896906CBAA9B8D01155D1DB162 + +I=195 +KEY=461916712E8BD6F10A8DF1372FECF2CAA8B2AA6CC4F1FF8F +IV=EAF849974783FAA7DAAFF81B80712D1C +CT=99E6CA896906CBAA9B8D01155D1DB162 +PT=6009B53EB4690C1F1F10639F1FD7640A + +I=196 +KEY=5B9B91A966F9CE146A8444099B85FED5B7A2C9F3DB269B85 +IV=3FB045D182F781EB1D8287D8487218E5 +CT=6009B53EB4690C1F1F10639F1FD7640A +PT=88ED4BC34A27F4C4B480B99857EBF541 + +I=197 +KEY=404F7D8B0E966F02E2690FCAD1A20A110322706B8CCD6EC4 +IV=49C0F4571BAEBE4C1BD4EC22686FA116 +CT=88ED4BC34A27F4C4B480B99857EBF541 +PT=B88F0E3E01FEDF97766AC6B762D2EBC3 + +I=198 +KEY=CB2EA99F330A3A865AE601F4D05CD5867548B6DCEE1F8507 +IV=2518DA0D88C02EC38B61D4143D9C5584 +CT=B88F0E3E01FEDF97766AC6B762D2EBC3 +PT=C1C167FF37E89937DCB8D79C9BC9EC74 + +I=199 +KEY=913C795CF72CD1219B27660BE7B44CB1A9F0614075D66973 +IV=37769A59390261FB5A12D0C3C426EBA7 +CT=C1C167FF37E89937DCB8D79C9BC9EC74 +PT=64D912270A1E60192CDAAD8168219E56 + +I=200 +KEY=05F19DF919E44144FFFE742CEDAA2CA8852ACCC11DF7F725 +IV=63E9D4D1BDD7FEAD94CDE4A5EEC89065 +CT=64D912270A1E60192CDAAD8168219E56 +PT=C9AD2DBB1C686A67A3E21A5659576A2B + +I=201 +KEY=099D0DCE5E4E194236535997F1C246CF26C8D69744A09D0E +IV=A01E3F917EF4652F0C6C903747AA5806 +CT=C9AD2DBB1C686A67A3E21A5659576A2B +PT=244C740B4B136C6C480D0147163868D1 + +I=202 +KEY=EA1F242E9C75C712121F2D9CBAD12AA36EC5D7D05298F5DF +IV=C9D2288C473BCB3EE38229E0C23BDE50 +CT=244C740B4B136C6C480D0147163868D1 +PT=A6B125A9C570CC3ECBB5D302ADB96E34 + +I=203 +KEY=CD5D7C91FBDC81A1B4AE08357FA1E69DA57004D2FF219BEB +IV=871F525F8ED73B7F274258BF67A946B3 +CT=A6B125A9C570CC3ECBB5D302ADB96E34 +PT=0F9862A4A21E1FB365135C07577FB3EE + +I=204 +KEY=F7D9B8C22BDC8005BB366A91DDBFF92EC06358D5A85E2805 +IV=01BB0A9A8737C19D3A84C453D00001A4 +CT=0F9862A4A21E1FB365135C07577FB3EE +PT=D833DB436E1751B882D03FADF683690B + +I=205 +KEY=83F81E3CED72F22F6305B1D2B3A8A89642B367785EDD410E +IV=80E0E7001CCA60CA7421A6FEC6AE722A +CT=D833DB436E1751B882D03FADF683690B +PT=0AE2C64D2C577C420F26F2F48AA58D62 + +I=206 +KEY=63310E5F2F8F0E0769E7779F9FFFD4D44D95958CD478CC6C +IV=57E54995CDC9417DE0C91063C2FDFC28 +CT=0AE2C64D2C577C420F26F2F48AA58D62 +PT=B0E2976AA3891A2C71AFEB063E3C4383 + +I=207 +KEY=F3AE2989B3980DC9D905E0F53C76CEF83C3A7E8AEA448FEF +IV=999DD6C2B1C528E2909F27D69C1703CE +CT=B0E2976AA3891A2C71AFEB063E3C4383 +PT=16F8A305177ECDBA15403FE5D8EEF60D + +I=208 +KEY=52CF17D8DEA4CE5ACFFD43F02B080342297A416F32AA79E2 +IV=C9F5BC961057F845A1613E516D3CC393 +CT=16F8A305177ECDBA15403FE5D8EEF60D +PT=A607A3EE165E82711B30B44CF4E0C4CF + +I=209 +KEY=E22ADE79E75FE58E69FAE01E3D568133324AF523C64ABD2D +IV=E153F25DD207351AB0E5C9A139FB2BD4 +CT=A607A3EE165E82711B30B44CF4E0C4CF +PT=5191CDD0D077AD6BE956AF8E8E39FECA + +I=210 +KEY=38C58EA4EA1E8D4C386B2DCEED212C58DB1C5AAD487343E7 +IV=F55357187F06B142DAEF50DD0D4168C2 +CT=5191CDD0D077AD6BE956AF8E8E39FECA +PT=F63A42508522E5F09C31F160298E8E6F + +I=211 +KEY=8C29CD4F1330EF25CE516F9E6803C9A8472DABCD61FDCD88 +IV=2CBD520E6F6F89C7B4EC43EBF92E6269 +CT=F63A42508522E5F09C31F160298E8E6F +PT=E58ED2EA8671DC5D527CDE01C6D9655D + +I=212 +KEY=3650C9671F38CD752BDFBD74EE7215F5155175CCA724A8D5 +IV=73CA969AECA5574BBA7904280C082250 +CT=E58ED2EA8671DC5D527CDE01C6D9655D +PT=5FFCACC68357B6709F5B10D48C65EA40 + +I=213 +KEY=6F68A078A75FF5A1742311B26D25A3858A0A65182B414295 +IV=DEA2D7D8F9FE3E7D5938691FB86738D4 +CT=5FFCACC68357B6709F5B10D48C65EA40 +PT=10BBA695F25C1F9412DB80F59F937F84 + +I=214 +KEY=9E08E5F9EEC5A7606498B7279F79BC1198D1E5EDB4D23D11 +IV=20E4DE61513233E5F1604581499A52C1 +CT=10BBA695F25C1F9412DB80F59F937F84 +PT=36CAF539734BCAF8250595E5E5DB3E94 + +I=215 +KEY=F72A5636B3A2D23B5252421EEC3276E9BDD4700851090385 +IV=9DEBE05128A2A1A06922B3CF5D67755B +CT=36CAF539734BCAF8250595E5E5DB3E94 +PT=C64074C9A34850C6FD1B12CD8AE9EF30 + +I=216 +KEY=D74FABF587AB10AA941236D74F7A262F40CF62C5DBE0ECB5 +IV=DEF3A637247B78C02065FDC33409C291 +CT=C64074C9A34850C6FD1B12CD8AE9EF30 +PT=DF663CE4199BC64ACB9B6F99D69EC679 + +I=217 +KEY=8D12BAEA80612A284B740A3356E1E0658B540D5C0D7E2ACC +IV=7D9C0365E66F1A355A5D111F07CA3A82 +CT=DF663CE4199BC64ACB9B6F99D69EC679 +PT=CD1BCBDCE7F8C008177E25B83604EE83 + +I=218 +KEY=57B4196767474175866FC1EFB119206D9C2A28E43B7AC44F +IV=41846FA05FC28ABCDAA6A38DE7266B5D +CT=CD1BCBDCE7F8C008177E25B83604EE83 +PT=CD7E96FE44368C4AD22E9D4F6BE3C2C2 + +I=219 +KEY=CBA15BF34D728F0E4B115711F52FAC274E04B5AB5099068D +IV=873A6522E20108C09C1542942A35CE7B +CT=CD7E96FE44368C4AD22E9D4F6BE3C2C2 +PT=BCC88D6EAF2E41D9AA6E7C91DADCF92E + +I=220 +KEY=D3071140E7C7E244F7D9DA7F5A01EDFEE46AC93A8A45FFA3 +IV=A50F782EA949C2A718A64AB3AAB56D4A +CT=BCC88D6EAF2E41D9AA6E7C91DADCF92E +PT=1FFD3EC8E0D0AD8F3D23961703C0C445 + +I=221 +KEY=3F44AB6E12394D24E824E4B7BAD14071D9495F2D89853BE6 +IV=501500DC8A97D00BEC43BA2EF5FEAF60 +CT=1FFD3EC8E0D0AD8F3D23961703C0C445 +PT=1D3D85A9A4BF101E12CC79640D716AC6 + +I=222 +KEY=D6B97A7D0CEBEA71F519611E1E6E506FCB85264984F45120 +IV=84933D2D2F1F6C13E9FDD1131ED2A755 +CT=1D3D85A9A4BF101E12CC79640D716AC6 +PT=A2228D0483F9CF74CAA301FD30D7DB68 + +I=223 +KEY=E86CCBF22BAF7B31573BEC1A9D979F1B012627B4B4238A48 +IV=4AE5BFEB7168981E3ED5B18F27449140 +CT=A2228D0483F9CF74CAA301FD30D7DB68 +PT=D43E1D2C7447B7C08BCA25F8371AEECF + +I=224 +KEY=0279786975DB97998305F136E9D028DB8AEC024C83396487 +IV=2FC19D77503C0296EA15B39B5E74ECA8 +CT=D43E1D2C7447B7C08BCA25F8371AEECF +PT=4F97B6C0B7D10763CD5CE3A45855FEC0 + +I=225 +KEY=7F842708B71AD43BCC9247F65E012FB847B0E1E8DB6C9A47 +IV=BAC3ED277430C4537DFD5F61C2C143A2 +CT=4F97B6C0B7D10763CD5CE3A45855FEC0 +PT=067B1521895AE654CA0C20492A9714B8 + +I=226 +KEY=2FA21F709793A1C7CAE952D7D75BC9EC8DBCC1A1F1FB8EFF +IV=66014BDC0AD70ABB50263878208975FC +CT=067B1521895AE654CA0C20492A9714B8 +PT=E07E7A1D3F39E45E3A755A82EE3C2EBC + +I=227 +KEY=671468BAD93EDBD32A9728CAE8622DB2B7C99B231FC7A043 +IV=47BFF88E3EC2E8DC48B677CA4EAD7A14 +CT=E07E7A1D3F39E45E3A755A82EE3C2EBC +PT=0933D51670E8918147A56816B838BC74 + +I=228 +KEY=9749A2F6B448445023A4FDDC988ABC33F06CF335A7FF1C37 +IV=58F8C33F4725EED2F05DCA4C6D769F83 +CT=0933D51670E8918147A56816B838BC74 +PT=E90570CDFC2CDCC99826780CA7CD7A1C + +I=229 +KEY=C43D753C2489B403CAA18D1164A660FA684A8B390032662B +IV=C4027E5BF29E96A65374D7CA90C1F053 +CT=E90570CDFC2CDCC99826780CA7CD7A1C +PT=65B6C303491459554CDDA630AAB36C12 + +I=230 +KEY=32F2C804DF89C908AF174E122DB239AF24972D09AA810A39 +IV=51DE94724DCE9B10F6CFBD38FB007D0B +CT=65B6C303491459554CDDA630AAB36C12 +PT=A0B1694685785EFBDD6DB8E4FC312BC4 + +I=231 +KEY=9431549183D690920FA62754A8CA6754F9FA95ED56B021FD +IV=5CBDC9F06F45D2F5A6C39C955C5F599A +CT=A0B1694685785EFBDD6DB8E4FC312BC4 +PT=C271A8F639D1A293F4B8899428F618C2 + +I=232 +KEY=0AA1211F2A2134DACDD78FA2911BC5C70D421C797E46393F +IV=E52D7ACAF5DFAF799E90758EA9F7A448 +CT=C271A8F639D1A293F4B8899428F618C2 +PT=AB7968C2A1859D5AEBFAEB201910B672 + +I=233 +KEY=88BFBDDC6D21FC0E66AEE760309E589DE6B8F75967568F4D +IV=15AF9C49191BF995821E9CC34700C8D4 +CT=AB7968C2A1859D5AEBFAEB201910B672 +PT=59D394BB9C41BE21C050A9DF2DD94C2B + +I=234 +KEY=05AB922FA8B6F5FF3F7D73DBACDFE6BC26E85E864A8FC366 +IV=0FB568270892E7A98D142FF3C59709F1 +CT=59D394BB9C41BE21C050A9DF2DD94C2B +PT=43F89BAE0DCCB0EAF30411E6239A753C + +I=235 +KEY=7A7ED7932DED53767C85E875A1135656D5EC4F606915B65A +IV=48F1E1DAEE9C16CD7FD545BC855BA689 +CT=43F89BAE0DCCB0EAF30411E6239A753C +PT=8196A2F49E2508443F86B294D71A5D5E + +I=236 +KEY=8955F595C21BF3AAFD134A813F365E12EA6AFDF4BE0FEB04 +IV=B3DEB1ED557CB477F32B2206EFF6A0DC +CT=8196A2F49E2508443F86B294D71A5D5E +PT=5ED45F8741E7FC5C77CAACA9D3DFA26D + +I=237 +KEY=09205C9C2A528A5BA3C715067ED1A24E9DA0515D6DD04969 +IV=3742941BC0992AAC8075A909E84979F1 +CT=5ED45F8741E7FC5C77CAACA9D3DFA26D +PT=F60C9F9616A03B40655CB733EE1C3B68 + +I=238 +KEY=46DAA0A9A034745355CB8A906871990EF8FCE66E83CC7201 +IV=A3E1EA7D9E5BA6CE4FFAFC358A66FE08 +CT=F60C9F9616A03B40655CB733EE1C3B68 +PT=E73F7E14A3A245B1E594F659D996ED06 + +I=239 +KEY=DA145A69C9D459E1B2F4F484CBD3DCBF1D6810375A5A9F07 +IV=F5D4EB0EAB3486D29CCEFAC069E02DB2 +CT=E73F7E14A3A245B1E594F659D996ED06 +PT=52651C2039168170765B235D85BF6CEC + +I=240 +KEY=61CD045E05969B9FE091E8A4F2C55DCF6B33336ADFE5F3EB +IV=F7162437A85A186ABBD95E37CC42C27E +CT=52651C2039168170765B235D85BF6CEC +PT=665C920C4BB95B5C716D60AE9C30DB1B + +I=241 +KEY=BDF9F289D095660D86CD7AA8B97C06931A5E53C443D528F0 +IV=ADD7416105DB0CF0DC34F6D7D503FD92 +CT=665C920C4BB95B5C716D60AE9C30DB1B +PT=F6E1D36CF7D41F70885587A85B897EA2 + +I=242 +KEY=4CBAF7692571D8C5702CA9C44EA819E3920BD46C185C5652 +IV=9FBF3815905FCD9FF14305E0F5E4BEC8 +CT=F6E1D36CF7D41F70885587A85B897EA2 +PT=137DB7F20F98671E37F55E401D0482E2 + +I=243 +KEY=CEBF572BB09CC72963511E3641307EFDA5FE8A2C0558D4B0 +IV=0C3951BDCA9582CA8205A04295ED1FEC +CT=137DB7F20F98671E37F55E401D0482E2 +PT=72125C79A48573158496EFCC5CA552D4 + +I=244 +KEY=0D8978CF8179CBBF1143424FE5B50DE8216865E059FD8664 +IV=898422AB0DB951B1C3362FE431E50C96 +CT=72125C79A48573158496EFCC5CA552D4 +PT=6B12016832DE435A963FFFA857824CF7 + +I=245 +KEY=180D2DA794FEAF777A514327D76B4EB2B7579A480E7FCA93 +IV=0B47A508EAD8008015845568158764C8 +CT=6B12016832DE435A963FFFA857824CF7 +PT=18693A241FB5687CF3A793B9B7EE4B15 + +I=246 +KEY=3D6C36453DCA611462387903C8DE26CE44F009F1B9918186 +IV=857CC19C3E72C1AD25611BE2A934CE63 +CT=18693A241FB5687CF3A793B9B7EE4B15 +PT=4E04BD363AFC26BDDD3D98892A7C705A + +I=247 +KEY=8B626E8D8E075BCE2C3CC435F222007399CD917893EDF1DC +IV=6E4FCD034F6E2AF5B60E58C8B3CD3ADA +CT=4E04BD363AFC26BDDD3D98892A7C705A +PT=06FB2C371C3F54518AA0A2766CE1CCF3 + +I=248 +KEY=A5ECEB5BAE22C2E72AC7E802EE1D5422136D330EFF0C3D2F +IV=4A23E1EFBB43855E2E8E85D620259929 +CT=06FB2C371C3F54518AA0A2766CE1CCF3 +PT=D7DE2C298EB1EF273A6386986BDEC555 + +I=249 +KEY=B25537EEFD5BDA7AFD19C42B60ACBB05290EB59694D2F87A +IV=9034BBDBF74A369E17B9DCB55379189D +CT=D7DE2C298EB1EF273A6386986BDEC555 +PT=0F4A1CEA83DA845DEC063ADFF173F424 + +I=250 +KEY=39FEF1C45697DABCF253D8C1E3763F58C5088F4965A10C5E +IV=2B5EF64E50A2CF5F8BABC62AABCC00C6 +CT=0F4A1CEA83DA845DEC063ADFF173F424 +PT=CE27F8AF55009D3658D166B960CA12D6 + +I=251 +KEY=5657BBA1106032F13C74206EB676A26E9DD9E9F0056B1E88 +IV=CE96953F749BBFD66FA94A6546F7E84D +CT=CE27F8AF55009D3658D166B960CA12D6 +PT=BF1458E052637EFC0EEF352621606029 + +I=252 +KEY=A1BC53DEFD62921A8360788EE415DC929336DCD6240B7EA1 +IV=B944FC42142E4940F7EBE87FED02A0EB +CT=BF1458E052637EFC0EEF352621606029 +PT=E4D96706DB5B0DA8FA429BB65BFBE4D8 + +I=253 +KEY=DAC8C0328BA4104167B91F883F4ED13A697447607FF09A79 +IV=A8D8E3A3BB687ECC7B7493EC76C6825B +CT=E4D96706DB5B0DA8FA429BB65BFBE4D8 +PT=1B11FF1367FE94F7759D1BEC40B8FDCC + +I=254 +KEY=03AE3AA5E62CA4927CA8E09B58B045CD1CE95C8C3F4867B5 +IV=35D7DB1466E14E3ED966FA976D88B4D3 +CT=1B11FF1367FE94F7759D1BEC40B8FDCC +PT=0989D688C947C616AC13B63892E35E74 + +I=255 +KEY=EAD5A60BB601C1147521361391F783DBB0FAEAB4ADAB39C1 +IV=59BA56CC11EFA9A2E97B9CAE502D6586 +CT=0989D688C947C616AC13B63892E35E74 +PT=978C150575871FB2C8847AA0CB092108 + +I=256 +KEY=C608EE8A971A0383E2AD2316E4709C69787E901466A218C9 +IV=253A79448D79B0B72CDD4881211BC297 +CT=978C150575871FB2C8847AA0CB092108 +PT=D08629CCCF6B869B10768DE9E2984B2E + +I=257 +KEY=D8EB4FC4230D3E39322B0ADA2B1B1AF268081DFD843A53E7 +IV=E9A7FDB26A37B6601EE3A14EB4173DBA +CT=D08629CCCF6B869B10768DE9E2984B2E +PT=E320AECF3803401AB95E09EB50A6EDA5 + +I=258 +KEY=E3F18E12233B5A30D10BA41513185AE8D1561416D49CBE42 +IV=4C6B62E3E6658BE73B1AC1D600366409 +CT=E320AECF3803401AB95E09EB50A6EDA5 +PT=D29E97683C9989C75D5D73EAADC23EE2 + +I=259 +KEY=7D9DEAA58D97A2FC0395337D2F81D32F8C0B67FC795E80A0 +IV=414A2961119CE4D79E6C64B7AEACF8CC +CT=D29E97683C9989C75D5D73EAADC23EE2 +PT=8D859D878DF32FDD26AF4984D48A1BD2 + +I=260 +KEY=E4A19E3554E8D73B8E10AEFAA272FCF2AAA42E78ADD49B72 +IV=9DF8066FCF854065993C7490D97F75C7 +CT=8D859D878DF32FDD26AF4984D48A1BD2 +PT=7B524B71439722F0555D4681F7EEAAC9 + +I=261 +KEY=0C93CDDA4435E903F542E58BE1E5DE02FFF968F95A3A31BB +IV=9529BF1B1ACEEDA5E83253EF10DD3E38 +CT=7B524B71439722F0555D4681F7EEAAC9 +PT=8C8ECC9829F06F73497EA90D48CD7FC5 + +I=262 +KEY=637747C6EF7B72B579CC2913C815B171B687C1F412F74E7E +IV=ADC9666D259469516FE48A1CAB4E9BB6 +CT=8C8ECC9829F06F73497EA90D48CD7FC5 +PT=6E416C2563212821F0D8E7D75297B11F + +I=263 +KEY=7E4BB22E1A7C4E25178D4536AB349950465F26234060FF61 +IV=C3BE9A54FDDA99731D3CF5E8F5073C90 +CT=6E416C2563212821F0D8E7D75297B11F +PT=EFC73DFA5FB87EA16284E25D22360C2F + +I=264 +KEY=62B7D329DC5EA208F84A78CCF48CE7F124DBC47E6256F34E +IV=E2145312DF24CBDB1CFC6107C622EC2D +CT=EFC73DFA5FB87EA16284E25D22360C2F +PT=1191FC5E2EFA9F19004C7D00E1F4D8B1 + +I=265 +KEY=039B0E1DE399831EE9DB8492DA7678E82497B97E83A22BFF +IV=0931D0D100EEB87D612CDD343FC72116 +CT=1191FC5E2EFA9F19004C7D00E1F4D8B1 +PT=717B1B902086B97296B7E97BC01C259E + +I=266 +KEY=CB02B3C8CA4A0C9498A09F02FAF0C19AB220500543BE0E61 +IV=65D0C1DFC85C7FB9C899BDD529D38F8A +CT=717B1B902086B97296B7E97BC01C259E +PT=569097DA8C43871CC5A55AC150ABCD31 + +I=267 +KEY=5FFAEE959D35C247CE3008D876B3468677850AC41315C350 +IV=7A4A448600ACA08994F85D5D577FCED3 +CT=569097DA8C43871CC5A55AC150ABCD31 +PT=4046F3DF53DFC1B56400501F08200FE0 + +I=268 +KEY=0CA33FAAA4B25FEB8E76FB07256C873313855ADB1B35CCB0 +IV=C83E2121AA25A5295359D13F39879DAC +CT=4046F3DF53DFC1B56400501F08200FE0 +PT=87C5362AAF3F31B05C92189E38FD9C66 + +I=269 +KEY=5B782B675EE9A8A509B3CD2D8A53B6834F17424523C850D6 +IV=567E0CD5EAFC699457DB14CDFA5BF74E +CT=87C5362AAF3F31B05C92189E38FD9C66 +PT=03A5CD79734810F4D9559FDC97A4B1A1 + +I=270 +KEY=B069B5DCAADA727F0A160054F91BA6779642DD99B46CE177 +IV=5397ED8A6DF7641EEB119EBBF433DADA +CT=03A5CD79734810F4D9559FDC97A4B1A1 +PT=1B1ECDDFD726C66594DF7B050F6758FF + +I=271 +KEY=52477DE5EFBAE2621108CD8B2E3D6012029DA69CBB0BB988 +IV=52151355DA4369C8E22EC8394560901D +CT=1B1ECDDFD726C66594DF7B050F6758FF +PT=26E9A7A560DD36D9767A51DA06301BBD + +I=272 +KEY=6E59FF11BED37F8837E16A2E4EE056CB74E7F746BD3BA235 +IV=FB1A5F8FA1C3D1F43C1E82F451699DEA +CT=26E9A7A560DD36D9767A51DA06301BBD +PT=C2FAB5CDDB329F2EA1E1459251A3CB1B + +I=273 +KEY=504DE2EC58CE17BBF51BDFE395D2C9E5D506B2D4EC98692E +IV=6BCD90C4D648AB783E141DFDE61D6833 +CT=C2FAB5CDDB329F2EA1E1459251A3CB1B +PT=4293D0A26E81DBE9FED6113B1954D59F + +I=274 +KEY=CC6C6C4150E763AAB7880F41FB53120C2BD0A3EFF5CCBCB1 +IV=0F61DAA62B7E95A79C218EAD08297411 +CT=4293D0A26E81DBE9FED6113B1954D59F +PT=5DC81F054088DB9B3D1F8AD4BACC2039 + +I=275 +KEY=BD3B4967A596578FEA401044BBDBC99716CF293B4F009C88 +IV=0C6435697122955071572526F5713425 +CT=5DC81F054088DB9B3D1F8AD4BACC2039 +PT=B6FB950586C671E968FFC709B79E8AF8 + +I=276 +KEY=9A08B753E07CD6535CBB85413D1DB87E7E30EE32F89E1670 +IV=377A670B7487B3EB2733FE3445EA81DC +CT=B6FB950586C671E968FFC709B79E8AF8 +PT=ED69B1E52F5F095EFF0AC73A76039B65 + +I=277 +KEY=E5FAA83242346B4EB1D234A41242B120813A29088E9D8D15 +IV=DBEEED8784AD80B57FF21F61A248BD1D +CT=ED69B1E52F5F095EFF0AC73A76039B65 +PT=FBC0C9A6FBC2CCD02BF5A009B43FE903 + +I=278 +KEY=44770F6B1653E2754A12FD02E9807DF0AACF89013AA26416 +IV=7D9B061A6209E0FAA18DA7595467893B +CT=FBC0C9A6FBC2CCD02BF5A009B43FE903 +PT=ADBE2B6C2C979C90E019991C5E81F69E + +I=279 +KEY=89A3B49BBE885D34E7ACD66EC517E1604AD6101D64239288 +IV=5495C29E4DDA4E26CDD4BBF0A8DBBF41 +CT=ADBE2B6C2C979C90E019991C5E81F69E +PT=E382D6611C0B2591BE9B7B6BC66D479D + +I=280 +KEY=457D838277C2797B042E000FD91CC4F1F44D6B76A24ED515 +IV=0303BB8A65CCE419CCDE3719C94A244F +CT=E382D6611C0B2591BE9B7B6BC66D479D +PT=7A39D5BFC7ADB6B7539A1AA45A31A7E5 + +I=281 +KEY=814AD70FBAF9D8AA7E17D5B01EB17246A7D771D2F87F72F0 +IV=550BD125E57ADE94C437548DCD3BA1D1 +CT=7A39D5BFC7ADB6B7539A1AA45A31A7E5 +PT=3CB8FF426FF48FA93EFAEDC559833C86 + +I=282 +KEY=89599F584B46337342AF2AF27145FDEF992D9C17A1FC4E76 +IV=45800DE7659A8FD008134857F1BFEBD9 +CT=3CB8FF426FF48FA93EFAEDC559833C86 +PT=2F5C7660310DE65B1C5254E2176A15CA + +I=283 +KEY=8EF84BDE14C7412B6DF35C9240481BB4857FC8F5B6965BBC +IV=5142FFEADEC300C107A1D4865F817258 +CT=2F5C7660310DE65B1C5254E2176A15CA +PT=7A3056742CF8CFDE9CBEAE32607E8DE3 + +I=284 +KEY=F076085EE3EA165617C30AE66CB0D46A19C166C7D6E8D65F +IV=02FBB83EDCB092957E8E4380F72D577D +CT=7A3056742CF8CFDE9CBEAE32607E8DE3 +PT=B2B7B7551B2A1D59601003C6EDD70A78 + +I=285 +KEY=7D74D286D9CEC1C3A574BDB3779AC93379D165013B3FDC27 +IV=890E42EAA4C59B078D02DAD83A24D795 +CT=B2B7B7551B2A1D59601003C6EDD70A78 +PT=8B617CCD9B1289F485167DC13126795C + +I=286 +KEY=8BA3AA3C04001B9D2E15C17EEC8840C7FCC718C00A19A57B +IV=F96182D81751ECCAF6D778BADDCEDA5E +CT=8B617CCD9B1289F485167DC13126795C +PT=D4800EE4A5E29A18C655AD5CE23063F9 + +I=287 +KEY=E51B3BF1DF7B0D54FA95CF9A496ADADF3A92B59CE829C682 +IV=46297563D303DF226EB891CDDB7B16C9 +CT=D4800EE4A5E29A18C655AD5CE23063F9 +PT=4A6008072DCEB7602BF120F0984FF1D6 + +I=288 +KEY=82091A039C558D36B0F5C79D64A46DBF1163956C70663754 +IV=28E82D15BAC860EA671221F2432E8062 +CT=4A6008072DCEB7602BF120F0984FF1D6 +PT=B05CD61BC646851726441B147FBB1AD3 + +I=289 +KEY=C503B4B113DE349700A91186A2E2E8A837278E780FDD2D87 +IV=342F9FDEEEBE130A470AAEB28F8BB9A1 +CT=B05CD61BC646851726441B147FBB1AD3 +PT=33E1834199EE6CD5C6F950D4823B2337 + +I=290 +KEY=4B06065B748AFB69334892C73B0C847DF1DEDEAC8DE60EB0 +IV=02928C43C0FF24968E05B2EA6754CFFE +CT=33E1834199EE6CD5C6F950D4823B2337 +PT=BA0BD1FFA54258361D3A8BD9F3C689E4 + +I=291 +KEY=AD0B10216B5D496B894343389E4EDC4BECE455757E208754 +IV=50DC56062E88C9CAE60D167A1FD7B202 +CT=BA0BD1FFA54258361D3A8BD9F3C689E4 +PT=4911046D8F1D2BCF54F22B5A83AF5AE1 + +I=292 +KEY=AF6CC229A2618121C05247551153F784B8167E2FFD8FDDB5 +IV=A7CC6A2B280A9DE80267D208C93CC84A +CT=4911046D8F1D2BCF54F22B5A83AF5AE1 +PT=254CA1983D7B794911B455E857CE902B + +I=293 +KEY=66413E8C7D11836FE51EE6CD2C288ECDA9A22BC7AA414D9E +IV=D01066ADC643A032C92DFCA5DF70024E +CT=254CA1983D7B794911B455E857CE902B +PT=B0A100E60D0404D123D10AE78E9CFFCB + +I=294 +KEY=D13AF271F9C3337455BFE62B212C8A1C8A73212024DDB255 +IV=20D00A218F07ECEDB77BCCFD84D2B01B +CT=B0A100E60D0404D123D10AE78E9CFFCB +PT=D4CD0CC7D2EBAB050108E94365D34FAA + +I=295 +KEY=8B3C7094C3AD8B018172EAECF3C721198B7BC863410EFDFF +IV=EC5F46869A00FFC25A0682E53A6EB875 +CT=D4CD0CC7D2EBAB050108E94365D34FAA +PT=DF913CC34675469401CCA41DB50BFBA4 + +I=296 +KEY=7DCF9D4559C3EA3A5EE3D62FB5B2678D8AB76C7EF405065B +IV=8718728B7105A417F6F3EDD19A6E613B +CT=DF913CC34675469401CCA41DB50BFBA4 +PT=5B09F0AF91EA41851A232543E97A6ED4 + +I=297 +KEY=C3E6C2A9975117B605EA2680245826089094493D1D7F688F +IV=21D001128A401EBFBE295FECCE92FD8C +CT=5B09F0AF91EA41851A232543E97A6ED4 +PT=8544DFD1E46D14FF1B0E9CF43A7E9EB6 + +I=298 +KEY=54C6D7971066FDD380AEF951C03532F78B9AD5C92701F639 +IV=F861E1C66C3F21779720153E8737EA65 +CT=8544DFD1E46D14FF1B0E9CF43A7E9EB6 +PT=586696A67E355CCDC41AD16D87786773 + +I=299 +KEY=B47A128050D1FC84D8C86FF7BE006E3A4F8004A4A079914A +IV=55A87D49D3640887E0BCC51740B70157 +CT=586696A67E355CCDC41AD16D87786773 +PT=6C7FF8D2F033B33C729C556E0731ACFF + +I=300 +KEY=C66EA18D75351D93B4B797254E33DD063D1C51CAA7483DB5 +IV=7224A11A5D122A607214B30D25E4E117 +CT=6C7FF8D2F033B33C729C556E0731ACFF +PT=BC031D9B497C64B15EE143CF4D2130B1 + +I=301 +KEY=00432A82295B2C6708B48ABE074FB9B763FD1205EA690D04 +IV=61D8239BE618CC39C62D8B0F5C6E31F4 +CT=BC031D9B497C64B15EE143CF4D2130B1 +PT=325D14CCDE09311A8069C5522FD050FD + +I=302 +KEY=E03B01935511FA7E3AE99E72D94688ADE394D757C5B95DF9 +IV=339B83266B282A96E0782B117C4AD619 +CT=325D14CCDE09311A8069C5522FD050FD +PT=FA25D0913004A26A3232F743ACC7677E + +I=303 +KEY=47F79639F27D47E9C0CC4EE3E9422AC7D1A62014697E3A87 +IV=C5F60E2EC86A0971A7CC97AAA76CBD97 +CT=FA25D0913004A26A3232F743ACC7677E +PT=61AA67B567F1CE94326B4711F8115727 + +I=304 +KEY=EE86C028A3B01E7EA16629568EB3E453E3CD6705916F6DA0 +IV=4037462A5B08A27FA971561151CD5997 +CT=61AA67B567F1CE94326B4711F8115727 +PT=35D0FD8AFF6CBDF34065CED4796D9D27 + +I=305 +KEY=EE88DBE9CCC930CB94B6D4DC71DF59A0A3A8A9D1E802F087 +IV=20CB619D26A05953000E1BC16F792EB5 +CT=35D0FD8AFF6CBDF34065CED4796D9D27 +PT=DD69B839EAE7D0DF79F5D06140D54325 + +I=306 +KEY=C77ADB703861D01649DF6CE59B38897FDA5D79B0A8D7B3A2 +IV=16CFCF6A4F3272EA29F20099F4A8E0DD +CT=DD69B839EAE7D0DF79F5D06140D54325 +PT=CA93E79E612893AA0D979ABDF5CA788A + +I=307 +KEY=3F486F048B5D9716834C8B7BFA101AD5D7CAE30D5D1DCB28 +IV=58332C3A8F187A96F832B474B33C4700 +CT=CA93E79E612893AA0D979ABDF5CA788A +PT=39974A1C62DF12F62EC9F75704B0EFA8 + +I=308 +KEY=B9022C8EA2C6FEF4BADBC16798CF0823F903145A59AD2480 +IV=3C09D97EFC480CD6864A438A299B69E2 +CT=39974A1C62DF12F62EC9F75704B0EFA8 +PT=B840EFC34BCD941BF551E437D633BB3A + +I=309 +KEY=D22317E3BB60B9FA029B2EA4D3029C380C52F06D8F9E9FBA +IV=C755A4CF1FAD90046B213B6D19A6470E +CT=B840EFC34BCD941BF551E437D633BB3A +PT=979F6217FD73CAB73A1DE1FACF68542C + +I=310 +KEY=E196EBBFCDA64F7095044CB32E71568F364F119740F6CB96 +IV=D342A7B4EF6CB49F33B5FC5C76C6F68A +CT=979F6217FD73CAB73A1DE1FACF68542C +PT=A290A25CFBCB1BEE137AFB860BB2CF29 + +I=311 +KEY=B756B878A99088B83794EEEFD5BA4D612535EA114B4404BF +IV=D92C9835E799541056C053C76436C7C8 +CT=A290A25CFBCB1BEE137AFB860BB2CF29 +PT=7E99249836CA5167C88BD3431C78C2E0 + +I=312 +KEY=2515F524203B507E490DCA77E3701C06EDBE3952573CC65F +IV=FD7219F6C131C4BD92434D5C89ABD8C6 +CT=7E99249836CA5167C88BD3431C78C2E0 +PT=5B7DAB9C2148A2B7ACCE4723D1D63B3F + +I=313 +KEY=28A33899811FE9B7127061EBC238BEB141707E7186EAFD60 +IV=F6B29A78141D8F8A0DB6CDBDA124B9C9 +CT=5B7DAB9C2148A2B7ACCE4723D1D63B3F +PT=12BAE3836257C52B88ECEEAAE8DE3B80 + +I=314 +KEY=85C6089FEF19163500CA8268A06F7B9AC99C90DB6E34C6E0 +IV=AE11E9BE14B4ECB1AD6530066E06FF82 +CT=12BAE3836257C52B88ECEEAAE8DE3B80 +PT=71C5D9F8747D428DE30736C4DD33E3E5 + +I=315 +KEY=86665ED5DA56FE90710F5B90D41239172A9BA61FB3072505 +IV=2CBAA91201D1980B03A0564A354FE8A5 +CT=71C5D9F8747D428DE30736C4DD33E3E5 +PT=D824A3FB80554CCD519D730D25EED2AF + +I=316 +KEY=F6D0840D75423D5CA92BF86B544775DA7B06D51296E9F7AA +IV=66AA086063C3768C70B6DAD8AF14C3CC +CT=D824A3FB80554CCD519D730D25EED2AF +PT=C974BCBE88ACA9D29312192BE52885BD + +I=317 +KEY=56F2FDAAB52A8691605F44D5DCEBDC08E814CC3973C17217 +IV=14D16CCEDE70F435A02279A7C068BBCD +CT=C974BCBE88ACA9D29312192BE52885BD +PT=23B74C4B5E661FA157F571F4C13AA3AE + +I=318 +KEY=676109782F02525643E8089E828DC3A9BFE1BDCDB2FBD1B9 +IV=46BB517768227D1D3193F4D29A28D4C7 +CT=23B74C4B5E661FA157F571F4C13AA3AE +PT=BDF2A1A79D553C85F5867B2BD5259A82 + +I=319 +KEY=D21B20B085B317EDFE1AA9391FD8FF2C4A67C6E667DE4B3B +IV=054B26F10A7F2D69B57A29C8AAB145BB +CT=BDF2A1A79D553C85F5867B2BD5259A82 +PT=1E02970BE31FEE63C9BCCC79FB41F670 + +I=320 +KEY=3CF3F93D44647FB7E0183E32FCC7114F83DB0A9F9C9FBD4B +IV=C44342FC579F9083EEE8D98DC1D7685A +CT=1E02970BE31FEE63C9BCCC79FB41F670 +PT=70F71372F64174D7C8757F043812439F + +I=321 +KEY=2C83CB76D99E054E90EF2D400A8665984BAE759BA48DFED4 +IV=884B46D9FBE7D99C1070324B9DFA7AF9 +CT=70F71372F64174D7C8757F043812439F +PT=46B20E91579B5CC0ADE9327478DF25FA + +I=322 +KEY=0ADEA18FAA36E94BD65D23D15D1D3958E64747EFDC52DB2E +IV=F256BC3206E11E9C265D6AF973A8EC05 +CT=46B20E91579B5CC0ADE9327478DF25FA +PT=51FE245369F67740615E159E28C2D56C + +I=323 +KEY=E0C00F8BFD4ADCD087A3078234EB4E1887195271F4900E42 +IV=836F6756B9EC572DEA1EAE04577C359B +CT=51FE245369F67740615E159E28C2D56C +PT=58A1B407358C1F9783A05C0A43D5B4FB + +I=324 +KEY=EEA0B17E70A6FC53DF02B3850167518F04B90E7BB745BAB9 +IV=0E584BF6D72F08310E60BEF58DEC2083 +CT=58A1B407358C1F9783A05C0A43D5B4FB +PT=6212DD8752996CC4D747790D5F2BC7E7 + +I=325 +KEY=B6E49EEA07D03112BD106E0253FE3D4BD3FE7776E86E7D5E +IV=2BA760FB0CC14D1858442F947776CD41 +CT=6212DD8752996CC4D747790D5F2BC7E7 +PT=DB16C25BDE0B95F4EC7B34FA2096E6A6 + +I=326 +KEY=F64DCEBA5E71D73E6606AC598DF5A8BF3F85438CC8F89BF8 +IV=674AA4866EE9988E40A9505059A1E62C +CT=DB16C25BDE0B95F4EC7B34FA2096E6A6 +PT=BB98BBB3289F3B5A96C5D3DA92F8CD0F + +I=327 +KEY=23CBCCA3D63DABB8DD9E17EAA56A93E5A94090565A0056F7 +IV=E3D676539CBD9676D5860219884C7C86 +CT=BB98BBB3289F3B5A96C5D3DA92F8CD0F +PT=324C1661B1E289EA3DAC27AF14E026C5 + +I=328 +KEY=D6F7C4A098C4E809EFD2018B14881A0F94ECB7F94EE07032 +IV=E7FB3F340E160FB5F53C08034EF943B1 +CT=324C1661B1E289EA3DAC27AF14E026C5 +PT=6EDA104789445C38F66EC2562F95FBDB + +I=329 +KEY=4B795FAB98879223810811CC9DCC4637628275AF61758BE9 +IV=C5E830814D72E9449D8E9B0B00437A2A +CT=6EDA104789445C38F66EC2562F95FBDB +PT=C834C54858181891C7D654A7502C0B60 + +I=330 +KEY=AA317465E376BAF2493CD484C5D45EA6A554210831598089 +IV=2388FCCDB47CB5DBE1482BCE7BF128D1 +CT=C834C54858181891C7D654A7502C0B60 +PT=9C5F5599557D176050BBAC4258B87F66 + +I=331 +KEY=B601C39C0E5F02DED563811D90A949C6F5EF8D4A69E1FFEF +IV=10C2528D377387311C30B7F9ED29B82C +CT=9C5F5599557D176050BBAC4258B87F66 +PT=ED5F51A6AFA843D467E21F6C68992273 + +I=332 +KEY=44A1FE3F8349D500383CD0BB3F010A12920D92260178DD9C +IV=9E73D9FB1D2471E8F2A03DA38D16D7DE +CT=ED5F51A6AFA843D467E21F6C68992273 +PT=D7A5F18382F892264008F75707254D95 + +I=333 +KEY=568F031D75B9B48FEF992138BDF99834D2056571065D9009 +IV=DEC9B60FA5A91887122EFD22F6F0618F +CT=D7A5F18382F892264008F75707254D95 +PT=D13A34D9F57884ECEE2FA1A412584BE4 + +I=334 +KEY=72CFCCE9FE5EB48A3EA315E148811CD83C2AC4D51405DBED +IV=75C70261D0C49D692440CFF48BE70005 +CT=D13A34D9F57884ECEE2FA1A412584BE4 +PT=064D550098F0813D145A2AA296064CCF + +I=335 +KEY=58448186BD1ED1FC38EE40E1D0719DE52870EE7782039722 +IV=754A1B79A75BD3B32A8B4D6F43406576 +CT=064D550098F0813D145A2AA296064CCF +PT=D7CD7D2B23E42F7A9808D48C28982743 + +I=336 +KEY=6FF7BCC770079D57EF233DCAF395B29FB0783AFBAA9BB061 +IV=25EE1F4D8F257C6437B33D41CD194CAB +CT=D7CD7D2B23E42F7A9808D48C28982743 +PT=6F55D4C7A13F08A1D936C5F0177040CA + +I=337 +KEY=7ECBB104AA3505E58076E90D52AABA3E694EFF0BBDEBF0AB +IV=E21F1527B69B89C8113C0DC3DA3298B2 +CT=6F55D4C7A13F08A1D936C5F0177040CA +PT=7F061908571CDDBC1F8F82A31A3AF1F9 + +I=338 +KEY=135D99B5F2482FFAFF70F00505B6678276C17DA8A7D10152 +IV=5DA54CDB26A0DC2D6D9628B1587D2A1F +CT=7F061908571CDDBC1F8F82A31A3AF1F9 +PT=30AB085953DE3E8027DE0C8A185A7D02 + +I=339 +KEY=3C76458A987B66F0CFDBF85C56685902511F7122BF8B7C50 +IV=E0614E072D2563DD2F2BDC3F6A33490A +CT=30AB085953DE3E8027DE0C8A185A7D02 +PT=92C915E98AEBF6265C43A66AC5B40787 + +I=340 +KEY=EBD41B4484EA67A05D12EDB5DC83AF240D5CD7487A3F7BD7 +IV=6EA27DF02FA0A9A9D7A25ECE1C910150 +CT=92C915E98AEBF6265C43A66AC5B40787 +PT=E9AC0996F97FFBA0F7C860A089CDF99F + +I=341 +KEY=85B6BBBC8E2243D3B4BEE42325FC5484FA94B7E8F3F28248 +IV=46D915F802932C936E62A0F80AC82473 +CT=E9AC0996F97FFBA0F7C860A089CDF99F +PT=BA1D082EDB28E255CB37AFEDB497D43A + +I=342 +KEY=BDA8736E56DDB34F0EA3EC0DFED4B6D131A3180547655672 +IV=0A7B9BCBE89E4CDE381EC8D2D8FFF09C +CT=BA1D082EDB28E255CB37AFEDB497D43A +PT=63298FE15A14C4A4E582C57772A0581E + +I=343 +KEY=9B5DC0C3B097B7CE6D8A63ECA4C07275D421DD7235C50E6C +IV=81F4666446CB470526F5B3ADE64A0481 +CT=63298FE15A14C4A4E582C57772A0581E +PT=AE79390C6789DFCF7110BA93281E9895 + +I=344 +KEY=E64DDC6A55048E35C3F35AE0C349ADBAA53167E11DDB96F9 +IV=DB4439803A1ACA807D101CA9E59339FB +CT=AE79390C6789DFCF7110BA93281E9895 +PT=2C9DF2ED511595756E5CF6D33442D3A3 + +I=345 +KEY=9C75AC9CBA0918CDEF6EA80D925C38CFCB6D91322999455A +IV=B73DBACA0C10AD0A7A3870F6EF0D96F8 +CT=2C9DF2ED511595756E5CF6D33442D3A3 +PT=90FDAEAEDC379128B73515CB2AAC9B7A + +I=346 +KEY=A045744F6BB9205F7F9306A34E6BA9E77C5884F90335DE20 +IV=356BBCDD4EBDA8F93C30D8D3D1B03892 +CT=90FDAEAEDC379128B73515CB2AAC9B7A +PT=E66EA385E1F20791090CA24ADB250AFC + +I=347 +KEY=48E94FAC40CFC94B99FDA526AF99AE76755426B3D810D4DC +IV=ABAF17EBE3658829E8AC3BE32B76E914 +CT=E66EA385E1F20791090CA24ADB250AFC +PT=A17C6802F4322D97C6966B523B54CF88 + +I=348 +KEY=3FC9CD7847FF49D73881CD245BAB83E1B3C24DE1E3441B54 +IV=7D25F4EE8B874E2D772082D40730809C +CT=A17C6802F4322D97C6966B523B54CF88 +PT=CBEC825D143BF30C58B608B58ABFB618 + +I=349 +KEY=D4464B5CD3CFAD06F36D4F794F9070EDEB74455469FBAD4C +IV=93D0E88641960F8EEB8F86249430E4D1 +CT=CBEC825D143BF30C58B608B58ABFB618 +PT=D7A8E224DAA4DB7629790D3D4D5A8560 + +I=350 +KEY=73DD2DA38114D0BD24C5AD5D9534AB9BC20D486924A1282C +IV=3E6B8F8084BAA391A79B66FF52DB7DBB +CT=D7A8E224DAA4DB7629790D3D4D5A8560 +PT=EB7EAD5CF27BA091DEF8D7839EFD7C90 + +I=351 +KEY=CDA609EB23BB90EBCFBB0001674F0B0A1CF59FEABA5C54BC +IV=8EEE61573B01F1E4BE7B2448A2AF4056 +CT=EB7EAD5CF27BA091DEF8D7839EFD7C90 +PT=2EFA41B666ECBBB1D699C1FB8CA9E175 + +I=352 +KEY=768FCC098B8F48FFE14141B701A3B0BBCA6C5E1136F5B5C9 +IV=60BC671273707E17BB29C5E2A834D814 +CT=2EFA41B666ECBBB1D699C1FB8CA9E175 +PT=44D7245914CF3BF73831D4225BD32FDD + +I=353 +KEY=91F2FFA6BB520FD1A59665EE156C8B4CF25D8A336D269A14 +IV=21187FBCFC5E01BEE77D33AF30DD472E +CT=44D7245914CF3BF73831D4225BD32FDD +PT=E9FA049C77C326A4F03D2C9E740DE4A1 + +I=354 +KEY=2FC9C39B5DBC560E4C6C617262AFADE80260A6AD192B7EB5 +IV=72912E59A0095846BE3B3C3DE6EE59DF +CT=E9FA049C77C326A4F03D2C9E740DE4A1 +PT=9A62281465C72FDAA73E00E343A99BC3 + +I=355 +KEY=F401ED3768BC72D4D60E496607688232A55EA64E5A82E576 +IV=88022668FE843060DBC82EAC350024DA +CT=9A62281465C72FDAA73E00E343A99BC3 +PT=FAD9ADA4B98A4141A2857F93F6F71DEB + +I=356 +KEY=1AD741BDF8A18D8E2CD7E4C2BEE2C37307DBD9DDAC75F89D +IV=F98FECC470C84631EED6AC8A901DFF5A +CT=FAD9ADA4B98A4141A2857F93F6F71DEB +PT=630453171FEE434834490229830E1C1A + +I=357 +KEY=24F7B99681335EAD4FD3B7D5A10C803B3392DBF42F7BE487 +IV=5D69B4D81847DABD3E20F82B7992D323 +CT=630453171FEE434834490229830E1C1A +PT=DE613189001598BA6AE67F259F9FD349 + +I=358 +KEY=60E401E96083FF2291B2865CA11918815974A4D1B0E437CE +IV=AADE84AD4127FCDA4413B87FE1B0A18F +CT=DE613189001598BA6AE67F259F9FD349 +PT=CA18925634072DEC80F2F724A0F24235 + +I=359 +KEY=66831E7F4FC51DB95BAA140A951E356DD98653F5101675FB +IV=1C1E2F698C5DD62006671F962F46E29B +CT=CA18925634072DEC80F2F724A0F24235 +PT=B289F06551C56B77F5CDF7B321E0E8E3 + +I=360 +KEY=48FB1A5B41F634D5E923E46FC4DB5E1A2C4BA44631F69D18 +IV=6A872620ED13A14B2E7804240E33296C +CT=B289F06551C56B77F5CDF7B321E0E8E3 +PT=13B1F93DD388A192D6FB836C90E0E022 + +I=361 +KEY=F13FA6E33170F596FA921D521753FF88FAB0272AA1167D3A +IV=40BF714207DA180BB9C4BCB87086C143 +CT=13B1F93DD388A192D6FB836C90E0E022 +PT=298B7B19A27EA1BE9574588A5885F64B + +I=362 +KEY=CE171639A4DDA77DD319664BB52D5E366FC47FA0F9938B71 +IV=8FB32729166E154F3F28B0DA95AD52EB +CT=298B7B19A27EA1BE9574588A5885F64B +PT=11FA000C73485654A8918360DF3C1F5E + +I=363 +KEY=9322B0E9AE4D6B20C2E36647C6650862C755FCC026AF942F +IV=809DE75B169C56BE5D35A6D00A90CC5D +CT=11FA000C73485654A8918360DF3C1F5E +PT=05533E642958E2F6F29BB1848BE225CB + +I=364 +KEY=21B86D89874D627FC7B05823EF3DEA9435CE4D44AD4DB1E4 +IV=81CF24C876471695B29ADD602900095F +CT=05533E642958E2F6F29BB1848BE225CB +PT=613DB485B9565B4889887282A3C8CFB5 + +I=365 +KEY=6E5AD95BDDA04D12A68DECA6566BB1DCBC463FC60E857E51 +IV=7E3AC16D28733BD84FE2B4D25AED2F6D +CT=613DB485B9565B4889887282A3C8CFB5 +PT=0CDDDA3B3375430B601BA1CCBD567284 + +I=366 +KEY=807937B80E55E814AA50369D651EF2D7DC5D9E0AB3D30CD5 +IV=C49324EE3A928684EE23EEE3D3F5A506 +CT=0CDDDA3B3375430B601BA1CCBD567284 +PT=C47A6E22A123AB6397F9C2AFFA6D45AB + +I=367 +KEY=20B3595EFE3D3DA76E2A58BFC43D59B44BA45CA549BE497E +IV=B188E4D3A2AC3F42A0CA6EE6F068D5B3 +CT=C47A6E22A123AB6397F9C2AFFA6D45AB +PT=71592AFCA1FEEE8AB6D6CEF22C14A21D + +I=368 +KEY=A97EAD081EDF66D11F73724365C3B73EFD72925765AAEB63 +IV=0DFF90FA3722469289CDF456E0E25B76 +CT=71592AFCA1FEEE8AB6D6CEF22C14A21D +PT=F4E0C4BCF8B386CF1BD457BD1FB65646 + +I=369 +KEY=DA90448D67D59E3CEB93B6FF9D7031F1E6A6C5EA7A1CBD25 +IV=154DB6488872217073EEE985790AF8ED +CT=F4E0C4BCF8B386CF1BD457BD1FB65646 +PT=9ED1119909322C280FE92B7840792605 + +I=370 +KEY=CF62D3016C8507F17542A76694421DD9E94FEE923A659B20 +IV=ED45F0A7D33FC08515F2978C0B5099CD +CT=9ED1119909322C280FE92B7840792605 +PT=F812615F1BE701E74FCEEFC288303C7C + +I=371 +KEY=C2681849C663E45A8D50C6398FA51C3EA6810150B255A75C +IV=19E09027253115100D0ACB48AAE6E3AB +CT=F812615F1BE701E74FCEEFC288303C7C +PT=25897C51C5FEDBFDC630BF8E9F3B2875 + +I=372 +KEY=F47C452077541CEEA8D9BA684A5BC7C360B1BEDE2D6E8F29 +IV=2C2EE28C518163DF36145D69B137F8B4 +CT=25897C51C5FEDBFDC630BF8E9F3B2875 +PT=9929E5E9F0CA00D0E02022E2FCFAFC3F + +I=373 +KEY=F7BF8679C8D86E2C31F05F81BA91C71380919C3CD1947316 +IV=FCF0C5D85049463103C3C359BF8C72C2 +CT=9929E5E9F0CA00D0E02022E2FCFAFC3F +PT=3B603A3FDAA669E7C965708C9789E329 + +I=374 +KEY=9312EDA0B14017910A9065BE6037AEF449F4ECB0461D903F +IV=364CDACF5762B18864AD6BD9799879BD +CT=3B603A3FDAA669E7C965708C9789E329 +PT=AC33F7B1A778C36617668C98E20B318A + +I=375 +KEY=D5BC989407D78D82A6A3920FC74F6D925E926028A416A1B5 +IV=5FB00506C71711D046AE7534B6979A13 +CT=AC33F7B1A778C36617668C98E20B318A +PT=B408AF5509EF45E0AEDF12570FAE3651 + +I=376 +KEY=6BBB14591C12578112AB3D5ACEA02872F04D727FABB897E4 +IV=D41F58F192CF60D6BE078CCD1BC5DA03 +CT=B408AF5509EF45E0AEDF12570FAE3651 +PT=39EB055E027AC0DEA5992B7BA3753AB5 + +I=377 +KEY=3F71566EA7D07EBF2B403804CCDAE8AC55D4590408CDAD51 +IV=7E495DEC2224696554CA4237BBC2293E +CT=39EB055E027AC0DEA5992B7BA3753AB5 +PT=832B01D2AD4F0EE077244CF9B6ABE31C + +I=378 +KEY=0BDC563CE47527D1A86B39D66195E64C22F015FDBE664E4D +IV=4FE13E98163C3F7734AD005243A5596E +CT=832B01D2AD4F0EE077244CF9B6ABE31C +PT=926EB7E17FA4262D1D390D83CDAC6FB2 + +I=379 +KEY=07D4D606747858B63A058E371E31C0613FC9187E73CA21FF +IV=12D459160DCFFEFE0C08803A900D7F67 +CT=926EB7E17FA4262D1D390D83CDAC6FB2 +PT=DBFBC3313F86C26BA54B9F69BA93C665 + +I=380 +KEY=84BE014D4BFA8ACCE1FE4D0621B7020A9A828717C959E79A +IV=179322B7D19F3A38836AD74B3F82D27A +CT=DBFBC3313F86C26BA54B9F69BA93C665 +PT=39B00A1A655B298F56271B2BDBA6B16B + +I=381 +KEY=A921F537F5F324CAD84E471C44EC2B85CCA59C3C12FF56F1 +IV=D4B03D3AB6FF79D22D9FF47ABE09AE06 +CT=39B00A1A655B298F56271B2BDBA6B16B +PT=7C5DABBF7C7951808DCD35DB2617B763 + +I=382 +KEY=3BB6AACEEEC21A9FA413ECA338957A054168A9E734E8E192 +IV=5C92A3C4C3C8567792975FF91B313E55 +CT=7C5DABBF7C7951808DCD35DB2617B763 +PT=BD88FB3B815415503D4F9264AFEA7887 + +I=383 +KEY=008F402C3524BCA8199B1798B9C16F557C273B839B029915 +IV=08360D06E31B3AA43B39EAE2DBE6A637 +CT=BD88FB3B815415503D4F9264AFEA7887 +PT=B2813AFBC477618F4C6A436C97AA26F2 + +I=384 +KEY=8AB9F9FC4EE8B2D4AB1A2D637DB60EDA304D78EF0CA8BFE7 +IV=DCF7EF19F68916268A36B9D07BCC0E7C +CT=B2813AFBC477618F4C6A436C97AA26F2 +PT=1E96D52E46B1D73EB00778B203946F28 + +I=385 +KEY=CA9D4CE917399619B58CF84D3B07D9E4804A005D0F3CD0CF +IV=63A112DB63DDECB54024B51559D124CD +CT=1E96D52E46B1D73EB00778B203946F28 +PT=C03D770FE4B1733C5E59DD68F0060D5A + +I=386 +KEY=1D8268F833FC772575B18F42DFB6AAD8DE13DD35FF3ADD95 +IV=8B7AC769F85BA650D71F241124C5E13C +CT=C03D770FE4B1733C5E59DD68F0060D5A +PT=6495A8A3667DEDE2CAB58BA3B2F7034E + +I=387 +KEY=CCCEE884786AF28A112427E1B9CB473A14A656964DCDDEDB +IV=280C5BD88E3B88ACD14C807C4B9685AF +CT=6495A8A3667DEDE2CAB58BA3B2F7034E +PT=4CC3C2AC85EBD619E708988C9FEC60C6 + +I=388 +KEY=8B85284B2B06874D5DE7E54D3C209123F3AECE1AD221BE1D +IV=62E112946391FEFB474BC0CF536C75C7 +CT=4CC3C2AC85EBD619E708988C9FEC60C6 +PT=1522371FD5D53919F52CD97258CEBDA7 + +I=389 +KEY=B2EBBE81CF234A7E48C5D252E9F5A83A068217688AEF03BA +IV=8A936BAE971C0C9F396E96CAE425CD33 +CT=1522371FD5D53919F52CD97258CEBDA7 +PT=4AA882DCB39AA79E8439E9ECE9F4F3BD + +I=390 +KEY=043B9FDDEC299802026D508E5A6F0FA482BBFE84631BF007 +IV=6FA7FCDBA3B1BCA5B6D0215C230AD27C +CT=4AA882DCB39AA79E8439E9ECE9F4F3BD +PT=28C1E45D8D01AD148FA7D7C4F41ACE04 + +I=391 +KEY=1074F9BD3FFD4EAF2AACB4D3D76EA2B00D1C294097013E03 +IV=1210BAF1D69B23FE144F6660D3D4D6AD +CT=28C1E45D8D01AD148FA7D7C4F41ACE04 +PT=3ABE04FC59C3BDF9D7721902DEFCB439 + +I=392 +KEY=D97F3440E3684D291012B02F8EAD1F49DA6E304249FD8A3A +IV=C271800852E147D5C90BCDFDDC950386 +CT=3ABE04FC59C3BDF9D7721902DEFCB439 +PT=3A563A6A047E16123B289B047BB54C4E + +I=393 +KEY=49A10E68A38B02F42A448A458AD3095BE146AB463248C674 +IV=9DB6856C7E01CF3690DE3A2840E34FDD +CT=3A563A6A047E16123B289B047BB54C4E +PT=F8CB54B8D16274E9A20C0F026866E52F + +I=394 +KEY=9DD96DCFD4A1B11FD28FDEFD5BB17DB2434AA4445A2E235B +IV=233C069312D97A03D47863A7772AB3EB +CT=F8CB54B8D16274E9A20C0F026866E52F +PT=0302D25C39BF21F67F1AF2E1951D40F9 + +I=395 +KEY=746E55928D7E549DD18D0CA1620E5C443C5056A5CF3363A2 +IV=B6086C5FEEE9A078E9B7385D59DFE582 +CT=0302D25C39BF21F67F1AF2E1951D40F9 +PT=721192A3A5140DD63D93E0D6ACC4A4B8 + +I=396 +KEY=7E6FC505EAAB07E4A39C9E02C71A519201C3B67363F7C71A +IV=9828A03F0ADCE33E0A01909767D55379 +CT=721192A3A5140DD63D93E0D6ACC4A4B8 +PT=1C0F7440EF41FF18E263392741AD9D8B + +I=397 +KEY=D13AD442CAE026C3BF93EA42285BAE8AE3A08F54225A5A91 +IV=4FC707A846B4469AAF551147204B2127 +CT=1C0F7440EF41FF18E263392741AD9D8B +PT=442F978615AC3983AA5ABEA81AD1ACA6 + +I=398 +KEY=043A4EFFCD44EEB1FBBC7DC43DF7970949FA31FC388BF637 +IV=05D58B4A88A961AFD5009ABD07A4C872 +CT=442F978615AC3983AA5ABEA81AD1ACA6 +PT=E75C29413A33AA1210F36AADEC02FCEE + +I=399 +KEY=81492E2C6296C9341CE0548507C43D1B59095B51D4890AD9 +IV=D89794EAA1791507857360D3AFD22785 +CT=E75C29413A33AA1210F36AADEC02FCEE +PT=6342BFDDD2F6610350458B6695463484 + +========== + +KEYSIZE=256 + +I=0 +KEY=0000000000000000000000000000000000000000000000000000000000000000 +IV=00000000000000000000000000000000 +CT=00000000000000000000000000000000 +PT=4804E1818FE6297519A3E88C57310413 + +I=1 +KEY=098E3797788EA3BCD5477BF1660373944804E1818FE6297519A3E88C57310413 +IV=098E3797788EA3BCD5477BF166037394 +CT=4804E1818FE6297519A3E88C57310413 +PT=D36C27EBB8FA0BC9FA368DF850FD45FB + +I=2 +KEY=D949E143F98BDE24BD40A256F9E369339B68C66A371C22BCE395657407CC41E8 +IV=D0C7D6D481057D986807D9A79FE01AA7 +CT=D36C27EBB8FA0BC9FA368DF850FD45FB +PT=EBCB4DC84155682856D94B442BC597EE + +I=3 +KEY=296352DA0158E197EBC80771EC1ECC7D70A38BA276494A94B54C2E302C09D606 +IV=F02AB399F8D33FB35688A52715FDA54E +CT=EBCB4DC84155682856D94B442BC597EE +PT=23AA6A6B4BE8C04E19707CA330804C4E + +I=4 +KEY=5D3E9E2EA4DEDDB65A58DADB5B9679BC5309E1C93DA18ADAAC3C52931C899A48 +IV=745DCCF4A5863C21B190DDAAB788B5C1 +CT=23AA6A6B4BE8C04E19707CA330804C4E +PT=9B1AA0F33416484BA68740E821F95CD3 + +I=5 +KEY=E35024184CCA14687DB19E13093D2A31C813413A09B7C2910ABB127B3D70C69B +IV=BE6EBA36E814C9DE27E944C852AB538D +CT=9B1AA0F33416484BA68740E821F95CD3 +PT=8A8C6ADF453CB7A2FC4F3690FF7C6F23 + +I=6 +KEY=FDC6EB83FF93BA06DE2D09CB33F05406429F2BE54C8B7533F6F424EBC20CA9B8 +IV=1E96CF9BB359AE6EA39C97D83ACD7E37 +CT=8A8C6ADF453CB7A2FC4F3690FF7C6F23 +PT=B104182A3D85B857FB342BD06063E989 + +I=7 +KEY=7177668BAC9407FB2835524D58F1311EF39B33CF710ECD640DC00F3BA26F4031 +IV=8CB18D085307BDFDF6185B866B016518 +CT=B104182A3D85B857FB342BD06063E989 +PT=68AD7EB507FAEE8FF54E5B7EB4314208 + +I=8 +KEY=790AE8470B39A60E9F32F4025B2251849B364D7A76F423EBF88E5445165E0239 +IV=087D8ECCA7ADA1F5B707A64F03D3609A +CT=68AD7EB507FAEE8FF54E5B7EB4314208 +PT=99736D55B2730FDBC4FCD9128A3E6F06 + +I=9 +KEY=4EAF05AC15913059B6B0E43EFA7ADC1C0245202FC4872C303C728D579C606D3F +IV=37A5EDEB1EA896572982103CA1588D98 +CT=99736D55B2730FDBC4FCD9128A3E6F06 +PT=DF326CEE98EE253C855D171D93AA9455 + +I=10 +KEY=55EE1CCDBA5A04040F4212DFBF6ABC89DD774CC15C69090CB92F9A4A0FCAF96A +IV=1B411961AFCB345DB9F2F6E145106095 +CT=DF326CEE98EE253C855D171D93AA9455 +PT=B4E41BD5257CD7AF0A6F020BEE5F4067 + +I=11 +KEY=6190A91725B7D4E8DD42F3F3B4E42E14699357147915DEA3B3409841E195B90D +IV=347EB5DA9FEDD0ECD200E12C0B8E929D +CT=B4E41BD5257CD7AF0A6F020BEE5F4067 +PT=3608F41CA4C677E74F48B113D9B336B0 + +I=12 +KEY=0A93E973CCBAC75C9C0AA05502A43E945F9BA308DDD3A944FC08295238268FBD +IV=6B034064E90D13B4414853A6B6401080 +CT=3608F41CA4C677E74F48B113D9B336B0 +PT=FB54DBB9C0C7176C4C9E1E4E6688B570 + +I=13 +KEY=584CCAEDD52F491A935D892AD132F75AA4CF78B11D14BE28B096371C5EAE3ACD +IV=52DF239E19958E460F57297FD396C9CE +CT=FB54DBB9C0C7176C4C9E1E4E6688B570 +PT=F40A6A6AE95E9D163D88AAE9A2D359BC + +I=14 +KEY=0DD784E96CAB96D702DD3972E95317FD50C512DBF44A233E8D1E9DF5FC7D6371 +IV=559B4E04B984DFCD9180B0583861E0A7 +CT=F40A6A6AE95E9D163D88AAE9A2D359BC +PT=0FE04B8BB249E49E24FEB6FFE106121C + +I=15 +KEY=2BC3A4EBD80215F0130EC1F76821BC515F2559504603C7A0A9E02B0A1D7B716D +IV=26142002B4A9832711D3F8858172ABAC +CT=0FE04B8BB249E49E24FEB6FFE106121C +PT=EBA4EF8D541919A0D0947359344D61C9 + +I=16 +KEY=0B5856BE9A78457868F7CF9C9C58EF7AB481B6DD121ADE0079745853293610A4 +IV=209BF255427A50887BF90E6BF479532B +CT=EBA4EF8D541919A0D0947359344D61C9 +PT=06484C36A29BD3CA7CBAB7FBEA47313B + +I=17 +KEY=C004F13C83AA1FD5C2A592D27B47C437B2C9FAEBB0810DCA05CEEFA8C371219F +IV=CB5CA78219D25AADAA525D4EE71F2B4D +CT=06484C36A29BD3CA7CBAB7FBEA47313B +PT=376157B7DB3B027980C5EF0E88B3F9EF + +I=18 +KEY=AD89203CAD17908C4F44F3FD2D61505385A8AD5C6BBA0FB3850B00A64BC2D870 +IV=6D8DD1002EBD8F598DE1612F56269464 +CT=376157B7DB3B027980C5EF0E88B3F9EF +PT=756783C2F0EE73BBD81B908F660AA6F7 + +I=19 +KEY=FBE990A6247EABC0CD5090DF0C566E01F0CF2E9E9B547C085D1090292DC87E87 +IV=5660B09A89693B4C8214632221373E52 +CT=756783C2F0EE73BBD81B908F660AA6F7 +PT=6CC64B773ECDFA9749DB33197F7EA0AB + +I=20 +KEY=FEC46AD20DA3E667B26D79B11A82A40F9C0965E9A599869F14CBA33052B6DE2C +IV=052DFA7429DD4DA77F3DE96E16D4CA0E +CT=6CC64B773ECDFA9749DB33197F7EA0AB +PT=9230E4DCA927E2F8E617A2EBC4F11477 + +I=21 +KEY=F4396B035E4E1BD914877124D1CD4B370E3981350CBE6467F2DC01DB9647CA5B +IV=0AFD01D153EDFDBEA6EA0895CB4FEF38 +CT=9230E4DCA927E2F8E617A2EBC4F11477 +PT=6ACD9F3939A86EE4236A3C060D2F5C3C + +I=22 +KEY=49C90E620094D6A85E75BD886FAFE79264F41E0C35160A83D1B63DDD9B689667 +IV=BDF065615EDACD714AF2CCACBE62ACA5 +CT=6ACD9F3939A86EE4236A3C060D2F5C3C +PT=E5F4F050827F69B60B417063AC1060E4 + +I=23 +KEY=1AED4D36938AB2D5D884EF2F106D2CEF8100EE5CB7696335DAF74DBE3778F683 +IV=53244354931E647D86F152A77FC2CB7D +CT=E5F4F050827F69B60B417063AC1060E4 +PT=5CE4B0B3C32700B6B887E05A88EE0239 + +I=24 +KEY=EF14B937F6E0F19AC8ADBD208DD60EE5DDE45EEF744E63836270ADE4BF96F4BA +IV=F5F9F401656A434F1029520F9DBB220A +CT=5CE4B0B3C32700B6B887E05A88EE0239 +PT=4794284E2BB56A47332E84AD7A2006A2 + +I=25 +KEY=182581A233332DDCD43C25AF9AA3AD7F9A7076A15FFB09C4515E2949C5B6F218 +IV=F7313895C5D3DC461C91988F1775A39A +CT=4794284E2BB56A47332E84AD7A2006A2 +PT=C8AE2CAA7C257508C3AB75BE28D2602F + +I=26 +KEY=ABE7FE236E28332AE7A74A9EA03B97A952DE5A0B23DE7CCC92F55CF7ED649237 +IV=B3C27F815D1B1EF6339B6F313A983AD6 +CT=C8AE2CAA7C257508C3AB75BE28D2602F +PT=A9FD4B9D4833B647FF60F8013C3B5B9D + +I=27 +KEY=08248BDC5F9186DCD65DA6344A10C57EFB2311966BEDCA8B6D95A4F6D15FC9AA +IV=A3C375FF31B9B5F631FAECAAEA2B52D7 +CT=A9FD4B9D4833B647FF60F8013C3B5B9D +PT=C871D7B4C0167DCFDD79AF1DEAC49D4F + +I=28 +KEY=BF29FB1B11AA7DB8742FF06458C384853352C622ABFBB744B0EC0BEB3B9B54E5 +IV=B70D70C74E3BFB64A272565012D341FB +CT=C871D7B4C0167DCFDD79AF1DEAC49D4F +PT=E2DE7BAC726C404FC7BA5099E39409CA + +I=29 +KEY=1810253DDF0CC5ECE2381FB4C2BEEDCCD18CBD8ED997F70B77565B72D80F5D2F +IV=A739DE26CEA6B8549617EFD09A7D6949 +CT=E2DE7BAC726C404FC7BA5099E39409CA +PT=D4A8257110EF7FFE2A1F026B28D7483A + +I=30 +KEY=F343D1EC9AEB200B65DB4AA369F6A47E052498FFC97888F55D495919F0D81515 +IV=EB53F4D145E7E5E787E35517AB4849B2 +CT=D4A8257110EF7FFE2A1F026B28D7483A +PT=9EA25895CFEAEAD224095C4687726D06 + +I=31 +KEY=86A93B0F219E1FFEBC0E4BA0334046AA9B86C06A069262277940055F77AA7813 +IV=75EAEAE3BB753FF5D9D501035AB6E2D4 +CT=9EA25895CFEAEAD224095C4687726D06 +PT=5C5DD66E7AD197DA86844D53C8ACEA0E + +I=32 +KEY=2278C61356CB0A951DAE3B6DC76868C9C7DB16047C43F5FDFFC4480CBF06921D +IV=A4D1FD1C7755156BA1A070CDF4282E63 +CT=5C5DD66E7AD197DA86844D53C8ACEA0E +PT=011959D35C8FE620E1C49D1804912F26 + +I=33 +KEY=E1972A31ACF850A22CBC592AF6CAF6F0C6C24FD720CC13DD1E00D514BB97BD3B +IV=C3EFEC22FA335A373112624731A29E39 +CT=011959D35C8FE620E1C49D1804912F26 +PT=895DDA7BB43DC3060B41DA70CAE4D2ED + +I=34 +KEY=BB4A76B5E8FD3820CC5D4A44F527E6704F9F95AC94F1D0DB15410F6471736FD6 +IV=5ADD5C8444056882E0E1136E03ED1080 +CT=895DDA7BB43DC3060B41DA70CAE4D2ED +PT=94E8BBC942B4127A0A8EBEC59319CF57 + +I=35 +KEY=4D98C60F0FA316B2DA3D11CFB3B9FE0CDB772E65D645C2A11FCFB1A1E26AA081 +IV=F6D2B0BAE75E2E9216605B8B469E187C +CT=94E8BBC942B4127A0A8EBEC59319CF57 +PT=274FE85E229321D4A6B2E9D4F0D3830F + +I=36 +KEY=A9FC5AC4A7B3550BC34E4BA94C0D328BFC38C63BF4D6E375B97D587512B9238E +IV=E4649CCBA81043B919735A66FFB4CC87 +CT=274FE85E229321D4A6B2E9D4F0D3830F +PT=256AC08E72D79B0CB7457B26769AC226 + +I=37 +KEY=1C44DEF03398188AC1B2EF6A6E91A33FD95206B5860178790E3823536423E1A8 +IV=B5B88434942B4D8102FCA4C3229C91B4 +CT=256AC08E72D79B0CB7457B26769AC226 +PT=366D17A14CA0FC192DBB731C1C305874 + +I=38 +KEY=3D80B92C01F9721032366B20D97DC097EF3F1114CAA184602383504F7813B9DC +IV=21C467DC32616A9AF384844AB7EC63A8 +CT=366D17A14CA0FC192DBB731C1C305874 +PT=000B4A6054663874ECAE310144BA9377 + +I=39 +KEY=48DD38DC16A4CE76338C95A866C1C795EF345B749EC7BC14CF2D614E3CA92AAB +IV=755D81F0175DBC6601BAFE88BFBC0702 +CT=000B4A6054663874ECAE310144BA9377 +PT=32B32D65566626D794FB296CA816B0A8 + +I=40 +KEY=C62EFA02F23FE796799BF9151FBFD8D7DD877611C8A19AC35BD6482294BF9A03 +IV=8EF3C2DEE49B29E04A176CBD797E1F42 +CT=32B32D65566626D794FB296CA816B0A8 +PT=D743A090101B1BAF5B83E8C06517E193 + +I=41 +KEY=91400A96EEADA906ABD4C3F6863CE4750AC4D681D8BA816C0055A0E2F1A87B90 +IV=576EF0941C924E90D24F3AE399833CA2 +CT=D743A090101B1BAF5B83E8C06517E193 +PT=2DE61760BEE8F811B3FEB44D2C566DB0 + +I=42 +KEY=9983EAD4BF987E39644D7D0963F93DB62722C1E16652797DB3AB14AFDDFE1620 +IV=08C3E0425135D73FCF99BEFFE5C5D9C3 +CT=2DE61760BEE8F811B3FEB44D2C566DB0 +PT=E97598EFFED4128DCCCDD7A04D8405E1 + +I=43 +KEY=B72929D2D02A00D36E7C3BD11CDB9FA4CE57590E98866BF07F66C30F907A13C1 +IV=2EAAC3066FB27EEA0A3146D87F22A212 +CT=E97598EFFED4128DCCCDD7A04D8405E1 +PT=5983276B92B95898302385F5156B6201 + +I=44 +KEY=CC9928E45F7885515986E0D431F3288E97D47E650A3F33684F4546FA851171C0 +IV=7BB001368F52858237FADB052D28B72A +CT=5983276B92B95898302385F5156B6201 +PT=ABDEFF06E04995FD2C5472D05056A0A3 + +I=45 +KEY=59A2D8FCED30176B73FF5642BCE4A9163C0A8163EA76A6956311342AD547D163 +IV=953BF018B248923A2A79B6968D178198 +CT=ABDEFF06E04995FD2C5472D05056A0A3 +PT=E4210D117B05F3EADC8AF75D1A80B823 + +I=46 +KEY=FFCCE373B679DE040165054D9EECA460D82B8C729173557FBF9BC377CFC76940 +IV=A66E3B8F5B49C96F729A530F22080D76 +CT=E4210D117B05F3EADC8AF75D1A80B823 +PT=4786111E1B0F2CA78E43CC0D154BC1EA + +I=47 +KEY=36E29D3C942DBC6A12B53088632260649FAD9D6C8A7C79D831D80F7ADA8CA8AA +IV=C92E7E4F2254626E13D035C5FDCEC404 +CT=4786111E1B0F2CA78E43CC0D154BC1EA +PT=122DC3B40007BA36BC7E7EE808911DAE + +I=48 +KEY=3692660415E53226D2758E60FD6E3F5F8D805ED88A7BC3EE8DA67192D21DB504 +IV=0070FB3881C88E4CC0C0BEE89E4C5F3B +CT=122DC3B40007BA36BC7E7EE808911DAE +PT=5E443EC882C1B938C2A4C412D3A92FDF + +I=49 +KEY=E3C167B38A29EDFBDC37A50F434C7056D3C4601008BA7AD64F02B58001B49ADB +IV=D55301B79FCCDFDD0E422B6FBE224F09 +CT=5E443EC882C1B938C2A4C412D3A92FDF +PT=14A8F43BA8829B134D6BD110E6D43F92 + +I=50 +KEY=8AD38A575E425D347C5B5BFB08A5173CC76C942BA038E1C502696490E760A549 +IV=6912EDE4D46BB0CFA06CFEF44BE9676A +CT=14A8F43BA8829B134D6BD110E6D43F92 +PT=025982911796C2FE34C89157BF2959BD + +I=51 +KEY=AE4ABA37DD2C3C5109B13C3DD9FCB67EC53516BAB7AE233B36A1F5C75849FCF4 +IV=24993060836E616575EA67C6D159A142 +CT=025982911796C2FE34C89157BF2959BD +PT=BC658642A8EEBEC6DBE2A76BCD70799B + +I=52 +KEY=31AC934C58BF87AD1EE4357BBE315175795090F81F409DFDED4352AC9539856F +IV=9FE6297B8593BBFC1755094667CDE70B +CT=BC658642A8EEBEC6DBE2A76BCD70799B +PT=132CE1CC36EFE58A4A53534B962D2D70 + +I=53 +KEY=79F7C18CA600203D404363908749B22F6A7C713429AF7877A71001E70314A81F +IV=485B52C0FEBFA7905EA756EB3978E35A +CT=132CE1CC36EFE58A4A53534B962D2D70 +PT=8D2BA39F08ED00BEB51543C0FCCFA57C + +I=54 +KEY=162A4089A1E46EAB5C9592BF1F98BCC2E757D2AB214278C912054227FFDB0D63 +IV=6FDD810507E44E961CD6F12F98D10EED +CT=8D2BA39F08ED00BEB51543C0FCCFA57C +PT=2E8D05A8A3066094025FE07F3A53A94E + +I=55 +KEY=DB5F33F93F2B795EDA54095937B79E4CC9DAD7038244185D105AA258C588A42D +IV=CD7573709ECF17F586C19BE6282F228E +CT=2E8D05A8A3066094025FE07F3A53A94E +PT=D39EC2261C53AD45F91627E1B1F62D22 + +I=56 +KEY=CCA770427DF8CF5350864D4E86E6D8891A4415259E17B518E94C85B9747E890F +IV=17F843BB42D3B60D8AD24417B15146C5 +CT=D39EC2261C53AD45F91627E1B1F62D22 +PT=F517DC01890C3D300520B6CE343B7F94 + +I=57 +KEY=25F53E7CC6590220E9426296568DE496EF53C924171B8828EC6C33774045F69B +IV=E9524E3EBBA1CD73B9C42FD8D06B3C1F +CT=F517DC01890C3D300520B6CE343B7F94 +PT=ECBCCBB21AC2D07E3ECACD26D42E4444 + +I=58 +KEY=6D4A92C82C6C3D44CED65D76BB33B23E03EF02960DD95856D2A6FE51946BB2DF +IV=48BFACB4EA353F6427943FE0EDBE56A8 +CT=ECBCCBB21AC2D07E3ECACD26D42E4444 +PT=6FF7C241A5FF025FAA8C4DAF5E0950AE + +I=59 +KEY=A3D0AB0A0F8EDF232D111458D3B8B1C66C18C0D7A8265A09782AB3FECA62E271 +IV=CE9A39C223E2E267E3C7492E688B03F8 +CT=6FF7C241A5FF025FAA8C4DAF5E0950AE +PT=3B7E4B74F021F9E995627DE42B03D7D8 + +I=60 +KEY=A8E2D59CF188CDA75C80FA49889F7EE357668BA35807A3E0ED48CE1AE16135A9 +IV=0B327E96FE0612847191EE115B27CF25 +CT=3B7E4B74F021F9E995627DE42B03D7D8 +PT=6759C15ED1049A51953E814C2445F3C6 + +I=61 +KEY=092010B28BD3C8E59D09CE85169190BB303F4AFD890339B178764F56C524C66F +IV=A1C2C52E7A5B0542C18934CC9E0EEE58 +CT=6759C15ED1049A51953E814C2445F3C6 +PT=05F681CB7984491E2CE5B1025F860BEB + +I=62 +KEY=538E3068E1059FE89C27D5F19405274835C9CB36F08770AF5493FE549AA2CD84 +IV=5AAE20DA6AD6570D012E1B748294B7F3 +CT=05F681CB7984491E2CE5B1025F860BEB +PT=E046F5B143CEEAC44EF520F2C3BFA96E + +I=63 +KEY=78B5D2551099875910844A17ABBACD64D58F3E87B3499A6B1A66DEA6591D64EA +IV=2B3BE23DF19C18B18CA39FE63FBFEA2C +CT=E046F5B143CEEAC44EF520F2C3BFA96E +PT=0F508DD1BCC6C520A81AE7EC75361179 + +I=64 +KEY=8D6E7E66F496C358A369EF7C49D117A3DADFB3560F8F5F4BB27C394A2C2B7593 +IV=F5DBAC33E40F4401B3EDA56BE26BDAC7 +CT=0F508DD1BCC6C520A81AE7EC75361179 +PT=BAE114FFF19FD11336D454BF0FF6954D + +I=65 +KEY=781164DD6F90037E9896672FD24F1AF6603EA7A9FE108E5884A86DF523DDE0DE +IV=F57F1ABB9B06C0263BFF88539B9E0D55 +CT=BAE114FFF19FD11336D454BF0FF6954D +PT=FE73CE62C227459729E8FDC9116EC6BB + +I=66 +KEY=9268D6C0E8DE5AFBCCE137EADE6293E49E4D69CB3C37CBCFAD40903C32B32665 +IV=EA79B21D874E5985547750C50C2D8912 +CT=FE73CE62C227459729E8FDC9116EC6BB +PT=B13971219C12C12A8308213759196B0D + +I=67 +KEY=701EB5AEF8262D8634B53AF1768ED68E2F7418EAA0250AE52E48B10B6BAA4D68 +IV=E276636E10F8777DF8540D1BA8EC456A +CT=B13971219C12C12A8308213759196B0D +PT=4F5A36173C16ED45F5D36B9D1AED84FF + +I=68 +KEY=40D027792516E1FE962F63B9C939677C602E2EFD9C33E7A0DB9BDA967147C997 +IV=30CE92D7DD30CC78A29A5948BFB7B1F2 +CT=4F5A36173C16ED45F5D36B9D1AED84FF +PT=9FB89D6FEFE606058FE40B5492643596 + +I=69 +KEY=CAAFC0DD2E4FC86AC19B40BC34F14630FF96B39273D5E1A5547FD1C2E323FC01 +IV=8A7FE7A40B59299457B42305FDC8214C +CT=9FB89D6FEFE606058FE40B5492643596 +PT=F6D0717F197CBAE383B55117FCBE07AC + +I=70 +KEY=CE03D67B6DAB9CFAA0C20129475620230946C2ED6AA95B46D7CA80D51F9DFBAD +IV=04AC16A643E454906159419573A76613 +CT=F6D0717F197CBAE383B55117FCBE07AC +PT=7747114FF82F8C7568BE51912CFDB51A + +I=71 +KEY=DDCEDD32E5F0D26F7707DAE453288B537E01D3A29286D733BF74D14433604EB7 +IV=13CD0B49885B4E95D7C5DBCD147EAB70 +CT=7747114FF82F8C7568BE51912CFDB51A +PT=E75313A8DFA7EB0AD1664B14D2DBE284 + +I=72 +KEY=6B032958C3379BD4BEC22CD4271EB4589952C00A4D213C396E129A50E1BBAC33 +IV=B6CDF46A26C749BBC9C5F63074363F0B +CT=E75313A8DFA7EB0AD1664B14D2DBE284 +PT=42FEDBDC4F0BD11DA42163D76E952DC7 + +I=73 +KEY=1710F6CF86EDB5F1364F19CA676ED69BDBAC1BD6022AED24CA33F9878F2E81F4 +IV=7C13DF9745DA2E25888D351E407062C3 +CT=42FEDBDC4F0BD11DA42163D76E952DC7 +PT=6E0166BA404B3AEFACCA8E972F087EA5 + +I=74 +KEY=9D9711F138D0C2D1003E2C99BB0F0447B5AD7D6C4261D7CB66F97710A026FF51 +IV=8A87E73EBE3D772036713553DC61D2DC +CT=6E0166BA404B3AEFACCA8E972F087EA5 +PT=644A1DCFCA2EC01C3E8911768837D99E + +I=75 +KEY=1BD7E446FADA5507ECE26BBB635045E7D1E760A3884F17D758706666281126CF +IV=8640F5B7C20A97D6ECDC4722D85F41A0 +CT=644A1DCFCA2EC01C3E8911768837D99E +PT=4E69AE75BD37DB8024DBD1A11D6D414E + +I=76 +KEY=3454FD4B259FB4C086288ADAFF6464CD9F8ECED63578CC577CABB7C7357C6781 +IV=2F83190DDF45E1C76ACAE1619C34212A +CT=4E69AE75BD37DB8024DBD1A11D6D414E +PT=F63964784AD35374EAFC933AC11A48B6 + +I=77 +KEY=97EFD593918FB16F2D6889C118C5ED4469B7AAAE7FAB9F23965724FDF4662F37 +IV=A3BB28D8B41005AFAB40031BE7A18989 +CT=F63964784AD35374EAFC933AC11A48B6 +PT=51CBF7F67A22DA909567D67F1919ECEF + +I=78 +KEY=481E90BC31903905C08D0E5AEF79A514387C5D58058945B30330F282ED7FC3D8 +IV=DFF1452FA01F886AEDE5879BF7BC4850 +CT=51CBF7F67A22DA909567D67F1919ECEF +PT=9AE181DE8DB65E7E242926091A17D0B1 + +I=79 +KEY=35A4F86146CED63BDCB485B0AE4C205AA29DDC86883F1BCD2719D48BF7681369 +IV=7DBA68DD775EEF3E1C398BEA4135854E +CT=9AE181DE8DB65E7E242926091A17D0B1 +PT=47E15B5AC96A7FDB805F3B8862D9055F + +I=80 +KEY=5ECF20C5884FDF95C2B7C17D40CD6923E57C87DC41556416A746EF0395B11636 +IV=6B6BD8A4CE8109AE1E0344CDEE814979 +CT=47E15B5AC96A7FDB805F3B8862D9055F +PT=1806C474A1ECE5D8183E725804FB92C3 + +I=81 +KEY=AC473047ADF97E75C100CBBD73FA0892FD7A43A8E0B981CEBF789D5B914A84F5 +IV=F288108225B6A1E003B70AC0333761B1 +CT=1806C474A1ECE5D8183E725804FB92C3 +PT=0A0615424DAD4EFC25EC43B13C672727 + +I=82 +KEY=6620AE39484EDD0EC21A3E3F659537DDF77C56EAAD14CF329A94DEEAAD2DA3D2 +IV=CA679E7EE5B7A37B031AF582166F3F4F +CT=0A0615424DAD4EFC25EC43B13C672727 +PT=551639A520D0D043CAD42CB02900D5EF + +I=83 +KEY=04D696BB056CC59492B376CB3A0286EAA26A6F4F8DC41F715040F25A842D763D +IV=62F638824D22189A50A948F45F97B137 +CT=551639A520D0D043CAD42CB02900D5EF +PT=DF906B0E72FEACC9B45381B992E23A5A + +I=84 +KEY=0AED1F2A6660BDBA660E00137E38C1C97DFA0441FF3AB3B8E41373E316CF4C67 +IV=0E3B8991630C782EF4BD76D8443A4723 +CT=DF906B0E72FEACC9B45381B992E23A5A +PT=D477C6287D05C0F83B27B1FD91F5F908 + +I=85 +KEY=E0A51B848A913A860FD2C39941C8C3A1A98DC269823F7340DF34C21E873AB56F +IV=EA4804AEECF1873C69DCC38A3FF00268 +CT=D477C6287D05C0F83B27B1FD91F5F908 +PT=6AB7E109C085B0BA7C8A8B76482F9C80 + +I=86 +KEY=A8B0500EC0292EF668A03E8293E235BAC33A236042BAC3FAA3BE4968CF1529EF +IV=48154B8A4AB814706772FD1BD22AF61B +CT=6AB7E109C085B0BA7C8A8B76482F9C80 +PT=71A31000A5763A0C79B6353E39FFBE84 + +I=87 +KEY=34C53C34901B693F4611F20F1DD5125EB2993360E7CCF9F6DA087C56F6EA976B +IV=9C756C3A503247C92EB1CC8D8E3727E4 +CT=71A31000A5763A0C79B6353E39FFBE84 +PT=B5B377EBEBC0B32A5A0C7E2A2504C32A + +I=88 +KEY=A13850B9164EF60EB77E06819605AC01072A448B0C0C4ADC8004027CD3EE5441 +IV=95FD6C8D86559F31F16FF48E8BD0BE5F +CT=B5B377EBEBC0B32A5A0C7E2A2504C32A +PT=B74459D1E7C5CF9106C362572FE9C917 + +I=89 +KEY=37261F6D588FF9028A23319CE02DDA71B06E1D5AEBC9854D86C7602BFC079D56 +IV=961E4FD44EC10F0C3D5D371D76287670 +CT=B74459D1E7C5CF9106C362572FE9C917 +PT=5777A0854A6E00DB0B6B199BDD35447A + +I=90 +KEY=085A7B276E58B9175204A87D74B9E78AE719BDDFA1A785968DAC79B02132D92C +IV=3F7C644A36D74015D82799E194943DFB +CT=5777A0854A6E00DB0B6B199BDD35447A +PT=01CC73B6EE44403DFED2C91D6F0DC441 + +I=91 +KEY=61DC99DD0C1470F511D79DCC2541002AE6D5CE694FE3C5AB737EB0AD4E3F1D6D +IV=6986E2FA624CC9E243D335B151F8E7A0 +CT=01CC73B6EE44403DFED2C91D6F0DC441 +PT=8993161CF3E75DE836BB2C1955581DB6 + +I=92 +KEY=AEB68207F1E4395794BA7E28CE9BF7996F46D875BC04984345C59CB41B6700DB +IV=CF6A1BDAFDF049A2856DE3E4EBDAF7B3 +CT=8993161CF3E75DE836BB2C1955581DB6 +PT=2A4D6929ED3A66E71EFC40F1840CD649 + +I=93 +KEY=DBF8A8AED7B6D7BCFD1B5BEEC3F01AC0450BB15C513EFEA45B39DC459F6BD692 +IV=754E2AA92652EEEB69A125C60D6BED59 +CT=2A4D6929ED3A66E71EFC40F1840CD649 +PT=596CE09B1176A9FB5A9973086A0E4C12 + +I=94 +KEY=1A61C7F2FB652E256190C0896F800CD61C6751C74048575F01A0AF4DF5659A80 +IV=C1996F5C2CD3F9999C8B9B67AC701616 +CT=596CE09B1176A9FB5A9973086A0E4C12 +PT=B57AC41360C13F6831689C311BD0ED2C + +I=95 +KEY=FC3828E6A9487698231D11C10C353F2DA91D95D42089683730C8337CEEB577AC +IV=E659EF14522D58BD428DD14863B533FB +CT=B57AC41360C13F6831689C311BD0ED2C +PT=F58AA69EEBF25943C728FA26524DE154 + +I=96 +KEY=9D16CAD42D19D1A3B9CB12566745B2765C97334ACB7B3174F7E0C95ABCF896F8 +IV=612EE2328451A73B9AD603976B708D5B +CT=F58AA69EEBF25943C728FA26524DE154 +PT=4A678FED6C5E5898A47F2DFE9DF71DF2 + +I=97 +KEY=D9A8554717435E69EFD4A617CA70B0D216F0BCA7A72569EC539FE4A4210F8B0A +IV=44BE9F933A5A8FCA561FB441AD3502A4 +CT=4A678FED6C5E5898A47F2DFE9DF71DF2 +PT=38011537A04E6C4A81510899741F2FFC + +I=98 +KEY=AA9D9A7B4E187F8D78AAEE11967A20A42EF1A990076B05A6D2CEEC3D5510A4F6 +IV=7335CF3C595B21E4977E48065C0A9076 +CT=38011537A04E6C4A81510899741F2FFC +PT=6472060F536BC5F83A3C247F63C3580E + +I=99 +KEY=90A5D8CD93F0AE068E8DC72CA5DD6E184A83AF9F5400C05EE8F2C84236D3FCF8 +IV=3A3842B6DDE8D18BF627293D33A74EBC +CT=6472060F536BC5F83A3C247F63C3580E +PT=08B99B59D0584DAC0412796871FE3F27 + +I=100 +KEY=489520777A18D5BF65B85AAEA29DB3D8423A34C684588DF2ECE0B12A472DC3DF +IV=D830F8BAE9E87BB9EB359D820740DDC0 +CT=08B99B59D0584DAC0412796871FE3F27 +PT=E8B8579DF9E918B3D24C18E17068AD66 + +I=101 +KEY=69542EE000ACEEFB5E0EB471F3CD0927AA82635B7DB195413EACA9CB37456EB9 +IV=21C10E977AB43B443BB6EEDF5150BAFF +CT=E8B8579DF9E918B3D24C18E17068AD66 +PT=9B6C3234993F6900B3E572B5A43CA644 + +I=102 +KEY=E88C863186548F35DF6EFB48743B7C1831EE516FE48EFC418D49DB7E9379C8FD +IV=81D8A8D186F861CE81604F3987F6753F +CT=9B6C3234993F6900B3E572B5A43CA644 +PT=E0A2962A02698489813292D33D02D0AB + +I=103 +KEY=C9DD7904D060B79B83F97A1FC93E50DED14CC745E6E778C80C7B49ADAE7B1856 +IV=2151FF35563438AE5C978157BD052CC6 +CT=E0A2962A02698489813292D33D02D0AB +PT=10C80B22D8EC54B855E103D6B76C03BC + +I=104 +KEY=D208B7A87003A507561FA5C7422A85C5C184CC673E0B2C70599A4A7B19171BEA +IV=1BD5CEACA063129CD5E6DFD88B14D51B +CT=10C80B22D8EC54B855E103D6B76C03BC +PT=CE88B76CC2223EB68BA9B5852C1921DB + +I=105 +KEY=27B0E1BF8EA57E8AD51BC3FA278369780F0C7B0BFC2912C6D233FFFE350E3A31 +IV=F5B85617FEA6DB8D8304663D65A9ECBD +CT=CE88B76CC2223EB68BA9B5852C1921DB +PT=00401EEE034A193C86A23152AF4B767E + +I=106 +KEY=45E37A710D9E754EE90B7C1DBB894DC20F4C65E5FF630BFA5491CEAC9A454C4F +IV=62539BCE833B0BC43C10BFE79C0A24BA +CT=00401EEE034A193C86A23152AF4B767E +PT=CEF1DC8A618BF71C68720E6EEDE31EEF + +I=107 +KEY=B432E78F49D50B045C8B598EEA3D4142C1BDB96F9EE8FCE63CE3C0C277A652A0 +IV=F1D19DFE444B7E4AB580259351B40C80 +CT=CEF1DC8A618BF71C68720E6EEDE31EEF +PT=EF8FB3790627F31E5CBF21B31FF942DE + +I=108 +KEY=F5CE9C0AF13DA60D32912620673AEE572E320A1698CF0FF8605CE171685F107E +IV=41FC7B85B8E8AD096E1A7FAE8D07AF15 +CT=EF8FB3790627F31E5CBF21B31FF942DE +PT=2EF1C697D948D712AA177855B0D56650 + +I=109 +KEY=DA14D71084F47D87385EF58128C7517F00C3CC814187D8EACA4B9924D88A762E +IV=2FDA4B1A75C9DB8A0ACFD3A14FFDBF28 +CT=2EF1C697D948D712AA177855B0D56650 +PT=0A20E82375680D134FE05AC74E3A0217 + +I=110 +KEY=B68F8C980984E2508E9706117256A4A70AE324A234EFD5F985ABC3E396B07439 +IV=6C9B5B888D709FD7B6C9F3905A91F5D8 +CT=0A20E82375680D134FE05AC74E3A0217 +PT=46AF886AB871A3DABDEB32F1738E180B + +I=111 +KEY=078A8955ECB2F6ACB249E2DB36B660794C4CACC88C9E76233840F112E53E6C32 +IV=B10505CDE53614FC3CDEE4CA44E0C4DE +CT=46AF886AB871A3DABDEB32F1738E180B +PT=79949181E3D20A3042C1E7BDAE73330B + +I=112 +KEY=7CB2A8360EE65417A979D9B5D4A32D2935D83D496F4C7C137A8116AF4B4D5F39 +IV=7B382163E254A2BB1B303B6EE2154D50 +CT=79949181E3D20A3042C1E7BDAE73330B +PT=12C5E55F6EA47BC44392AE9FB888C1FB + +I=113 +KEY=E5835F97C4FF1B007D695DD0E72324A9271DD81601E807D73913B830F3C59EC2 +IV=9931F7A1CA194F17D410846533800980 +CT=12C5E55F6EA47BC44392AE9FB888C1FB +PT=FCA15AB64A01FA6E89FE41F72A67D9E8 + +I=114 +KEY=50932FF04CCCE411AA0541726C1C4CD7DBBC82A04BE9FDB9B0EDF9C7D9A2472A +IV=B51070678833FF11D76C1CA28B3F687E +CT=FCA15AB64A01FA6E89FE41F72A67D9E8 +PT=7B75EC39F707C3C90691BE561AD5CAC6 + +I=115 +KEY=ECAEC5FD6AF5F7DF2587C1A40CB046ADA0C96E99BCEE3E70B67C4791C3778DEC +IV=BC3DEA0D263913CE8F8280D660AC0A7A +CT=7B75EC39F707C3C90691BE561AD5CAC6 +PT=1D3D15FFA0B69EFA8E146301411DFA49 + +I=116 +KEY=82F88C3850CC3D111C2125F34840A9A2BDF47B661C58A08A38682490826A77A5 +IV=6E5649C53A39CACE39A6E45744F0EF0F +CT=1D3D15FFA0B69EFA8E146301411DFA49 +PT=34AFB3D6F0BD9ACB6954BB96B1067F9E + +I=117 +KEY=702FEC9E7F0D2369FF35D4B7A1269AD3895BC8B0ECE53A41513C9F06336C083B +IV=F2D760A62FC11E78E314F144E9663371 +CT=34AFB3D6F0BD9ACB6954BB96B1067F9E +PT=899E4C8192661CCA7C73CDFBC3DCA2F3 + +I=118 +KEY=A1DF98E4585C1A4C15C42AD0782C925000C584317E83268B2D4F52FDF0B0AAC8 +IV=D1F0747A27513925EAF1FE67D90A0883 +CT=899E4C8192661CCA7C73CDFBC3DCA2F3 +PT=3097C0413291E217FB0E3A8A2D908C12 + +I=119 +KEY=9F9082177BF33D8AF6131018E1EFD49F305244704C12C49CD6416877DD2026DA +IV=3E4F1AF323AF27C6E3D73AC899C346CF +CT=3097C0413291E217FB0E3A8A2D908C12 +PT=6C71968295905F881F95DC8BA481CA72 + +I=120 +KEY=B7E5B267EDBFFD4DB4526BA2A1978C105C23D2F2D9829B14C9D4B4FC79A1ECA8 +IV=28753070964CC0C742417BBA4078588F +CT=6C71968295905F881F95DC8BA481CA72 +PT=96D0AB98DBD0CB94A68FC41BEF0B418D + +I=121 +KEY=127FAA6C94663FA9008A1FB7A419C036CAF3796A025250806F5B70E796AAAD25 +IV=A59A180B79D9C2E4B4D87415058E4C26 +CT=96D0AB98DBD0CB94A68FC41BEF0B418D +PT=9E3E4428A911FB328A9F89D7D5E527DB + +I=122 +KEY=1B9493F07E7E5F07473E6997AE15CCDC54CD3D42AB43ABB2E5C4F930434F8AFE +IV=09EB399CEA1860AE47B476200A0C0CEA +CT=9E3E4428A911FB328A9F89D7D5E527DB +PT=0DB5EF3481A9945BAF2E499B5CDE8DDC + +I=123 +KEY=7B2B8201EEF1601C44006A6D7E06EE355978D2762AEA3FE94AEAB0AB1F910722 +IV=60BF11F1908F3F1B033E03FAD01322E9 +CT=0DB5EF3481A9945BAF2E499B5CDE8DDC +PT=C0569DD7DCAE99859D3987B04FFD8CF0 + +I=124 +KEY=B2D7FEE25A564FA00CEDC8E05BAC7F7D992E4FA1F644A66CD7D3371B506C8BD2 +IV=C9FC7CE3B4A72FBC48EDA28D25AA9148 +CT=C0569DD7DCAE99859D3987B04FFD8CF0 +PT=D8AF74B5BB8E632299D32E8DD4DDA012 + +I=125 +KEY=5A06C176A290538BC549CAA8041539A941813B144DCAC54E4E00199684B12BC0 +IV=E8D13F94F8C61C2BC9A402485FB946D4 +CT=D8AF74B5BB8E632299D32E8DD4DDA012 +PT=0821FB911EDE8CDCD97DDAEDCCDB7B1C + +I=126 +KEY=1318D23A3A966D16FDEEE300571F3A8549A0C08553144992977DC37B486A50DC +IV=491E134C98063E9D38A729A8530A032C +CT=0821FB911EDE8CDCD97DDAEDCCDB7B1C +PT=BCB2831AF3721C020FC1D683C19AEBEA + +I=127 +KEY=D6D24AA79B3CA4434CCE2B1470B4FE18F512439FA066559098BC15F889F0BB36 +IV=C5CA989DA1AAC955B120C81427ABC49D +CT=BCB2831AF3721C020FC1D683C19AEBEA +PT=BE869BB3C18EB622CCAC81B6F5B62CC4 + +I=128 +KEY=5F62348BCD9ADB23A19E683400D968404B94D82C61E8E3B25410944E7C4697F2 +IV=89B07E2C56A67F60ED504320706D9658 +CT=BE869BB3C18EB622CCAC81B6F5B62CC4 +PT=C8D3EDD549FEA614B4F2348F82DE5531 + +I=129 +KEY=A64795E417B7C9344185F6B0C66C096B834735F9281645A6E0E2A0C1FE98C2C3 +IV=F925A16FDA2D1217E01B9E84C6B5612B +CT=C8D3EDD549FEA614B4F2348F82DE5531 +PT=4049BDBD9C302D8F2E06F10D34317784 + +I=130 +KEY=CD1F9AB35436014B0CF7ECE9FF98C2BDC30E8844B4266829CEE451CCCAA9B547 +IV=6B580F574381C87F4D721A5939F4CBD6 +CT=4049BDBD9C302D8F2E06F10D34317784 +PT=E1338EA5C5462E8C458E5546FA60324D + +I=131 +KEY=78F7558C14BB5100CE93CD49C22BE2D9223D06E1716046A58B6A048A30C9870A +IV=B5E8CF3F408D504BC26421A03DB32064 +CT=E1338EA5C5462E8C458E5546FA60324D +PT=055984AA929F4D45F5812DC719D4EF24 + +I=132 +KEY=2DBC5092C4C7AB427576EBA2855E00562764824BE3FF0BE07EEB294D291D682E +IV=554B051ED07CFA42BBE526EB4775E28F +CT=055984AA929F4D45F5812DC719D4EF24 +PT=ABC519C4290C69D98BF7AC2A56767202 + +I=133 +KEY=68FA1D8FE36FC5B48A7486FBB34A7B598CA19B8FCAF36239F51C85677F6B1A2C +IV=45464D1D27A86EF6FF026D5936147B0F +CT=ABC519C4290C69D98BF7AC2A56767202 +PT=C825E44799B1739A1F4CB406BBEABEDD + +I=134 +KEY=A2302849850FD33D4048B898DB6C7B0244847FC8534211A3EA503161C481A4F1 +IV=CACA35C666601689CA3C3E636826005B +CT=C825E44799B1739A1F4CB406BBEABEDD +PT=D24EE8D56CE09AFE1061B4016ADD61F7 + +I=135 +KEY=9B2E669EA4BB938072E6E97B0ACF834E96CA971D3FA28B5DFA318560AE5CC506 +IV=391E4ED721B440BD32AE51E3D1A3F84C +CT=D24EE8D56CE09AFE1061B4016ADD61F7 +PT=50FECB118EABF93BB97102E9212C883D + +I=136 +KEY=A07C5EBAC9D0F862AD525C76460B4BA9C6345C0CB1097266434087898F704D3B +IV=3B5238246D6B6BE2DFB4B50D4CC4C8E7 +CT=50FECB118EABF93BB97102E9212C883D +PT=C370C26BD3805211A4679399DFA4DDCB + +I=137 +KEY=414C776222058D6285574741B2B4D11D05449E6762892077E727141050D490F0 +IV=E13029D8EBD5750028051B37F4BF9AB4 +CT=C370C26BD3805211A4679399DFA4DDCB +PT=79715A04DF9216268C77A152CA96C2F6 + +I=138 +KEY=5E54A416470FE8BA263C0FC88FD884297C35C463BD1B36516B50B5429A425206 +IV=1F18D374650A65D8A36B48893D6C5534 +CT=79715A04DF9216268C77A152CA96C2F6 +PT=06DF18B5FAF35F03FE22E39CAE430655 + +I=139 +KEY=98C55CFFB53FA72345EF936283F64BB17AEADCD647E86952957256DE34015453 +IV=C691F8E9F2304F9963D39CAA0C2ECF98 +CT=06DF18B5FAF35F03FE22E39CAE430655 +PT=1AED42EB32C4BAEAF9946818AA00C324 + +I=140 +KEY=B8332B1EE5D6A4E1BBFA20AEAE22330560079E3D752CD3B86CE63EC69E019777 +IV=20F677E150E903C2FE15B3CC2DD478B4 +CT=1AED42EB32C4BAEAF9946818AA00C324 +PT=D276B6A6D480165A944572EF76D4B3E8 + +I=141 +KEY=6E50753A2A0814A778FA2BC773C6A7A2B271289BA1ACC5E2F8A34C29E8D5249F +IV=D6635E24CFDEB046C3000B69DDE494A7 +CT=D276B6A6D480165A944572EF76D4B3E8 +PT=BA46F59DFADC6CA2CBB7D80E33D7B24B + +I=142 +KEY=D8E1763EAD728AB8AA2284964BE586880837DD065B70A94033149427DB0296D4 +IV=B6B10304877A9E1FD2D8AF513823212A +CT=BA46F59DFADC6CA2CBB7D80E33D7B24B +PT=FC9B9F7B5120E1D8B2DD58D211EFF053 + +I=143 +KEY=458CB146C73342F9D5EE4364C400E8E5F4AC427D0A50489881C9CCF5CAED6687 +IV=9D6DC7786A41C8417FCCC7F28FE56E6D +CT=FC9B9F7B5120E1D8B2DD58D211EFF053 +PT=6AD8BCAEFF6F0BF9F360FF601C9B7A43 + +I=144 +KEY=F1FBE00DA1F634ACACB6E2F4F15C11179E74FED3F53F436172A93395D6761CC4 +IV=B477514B66C576557958A190355CF9F2 +CT=6AD8BCAEFF6F0BF9F360FF601C9B7A43 +PT=BB6E45D060E186323AC2B50CFB988856 + +I=145 +KEY=3FBC35054FFF43657936BB676A5C5D1F251ABB0395DEC553486B86992DEE9492 +IV=CE47D508EE0977C9D58059939B004C08 +CT=BB6E45D060E186323AC2B50CFB988856 +PT=31B6157397933EE35DEE5B40FE7237BB + +I=146 +KEY=D49B4E96F8FC2D91FBED3985C53BEB8314ACAE70024DFBB01585DDD9D39CA329 +IV=EB277B93B7036EF482DB82E2AF67B69C +CT=31B6157397933EE35DEE5B40FE7237BB +PT=EFEB82ED91C5C60FB8F910542804B57B + +I=147 +KEY=8D4ABC926827F066B4391FF4B3D6EC99FB472C9D93883DBFAD7CCD8DFB981652 +IV=59D1F20490DBDDF74FD4267176ED071A +CT=EFEB82ED91C5C60FB8F910542804B57B +PT=E30D071737AB9991F000302502BE84A6 + +I=148 +KEY=086A14365F781B2FAF533B1534F458D2184A2B8AA423A42E5D7CFDA8F92692F4 +IV=8520A8A4375FEB491B6A24E18722B44B +CT=E30D071737AB9991F000302502BE84A6 +PT=856AF9DF9A9FE5038B75C98E0E1C720F + +I=149 +KEY=A64DE8CF2DF04ADB60E88C769F7025BC9D20D2553EBC412DD6093426F73AE0FB +IV=AE27FCF9728851F4CFBBB763AB847D6E +CT=856AF9DF9A9FE5038B75C98E0E1C720F +PT=D84910F298F91E081480A912B1AF32D6 + +I=150 +KEY=C52575277A0BD189E2F746FC51CA77844569C2A7A6455F25C2899D344695D22D +IV=63689DE857FB9B52821FCA8ACEBA5238 +CT=D84910F298F91E081480A912B1AF32D6 +PT=57E4A4A2D639D414ED7F82583B4FFA52 + +I=151 +KEY=CB9A5219490F7EE31B030ECE521C589B128D6605707C8B312FF61F6C7DDA287F +IV=0EBF273E3304AF6AF9F4483203D62F1F +CT=57E4A4A2D639D414ED7F82583B4FFA52 +PT=1CECC8218392F2047C0B70BEBFCC5846 + +I=152 +KEY=AA6412AAC8FC309E6BCDFFD1DA01B6470E61AE24F3EE793553FD6FD2C2167039 +IV=61FE40B381F34E7D70CEF11F881DEEDC +CT=1CECC8218392F2047C0B70BEBFCC5846 +PT=EC2B86A04DB2B4F41830E5EA035531E3 + +I=153 +KEY=EFF5BC892E47F4C7EA859969255AC665E24A2884BE5CCDC14BCD8A38C14341DA +IV=4591AE23E6BBC459814866B8FF5B7022 +CT=EC2B86A04DB2B4F41830E5EA035531E3 +PT=8A1A8EE6E08F61E99FC37AC177881C8A + +I=154 +KEY=D62E9405D7402765E30FDAD7A29B2E716850A6625ED3AC28D40EF0F9B6CB5D50 +IV=39DB288CF907D3A2098A43BE87C1E814 +CT=8A1A8EE6E08F61E99FC37AC177881C8A +PT=F21583AC8C5F03C19A1A9B856C97D6E0 + +I=155 +KEY=D49F229B7DB6973EDE6BD14AB20234379A4525CED28CAFE94E146B7CDA5C8BB0 +IV=02B1B69EAAF6B05B3D640B9D10991A46 +CT=F21583AC8C5F03C19A1A9B856C97D6E0 +PT=323191D5997CF0424B7F5501CBD55B17 + +I=156 +KEY=08B1021CD316864EF5B370CBF891FD27A874B41B4BF05FAB056B3E7D1189D0A7 +IV=DC2E2087AEA011702BD8A1814A93C910 +CT=323191D5997CF0424B7F5501CBD55B17 +PT=B2BBCC6E54CB33319536A81174B0D73B + +I=157 +KEY=786AE1D89ECC32C8883D984E7DC5FD0A1ACF78751F3B6C9A905D966C6539079C +IV=70DBE3C44DDAB4867D8EE8858554002D +CT=B2BBCC6E54CB33319536A81174B0D73B +PT=6E4ADDA6895734D891F328C6D0C71467 + +I=158 +KEY=E6C7441B75AF8701E29376287A126CB07485A5D3966C584201AEBEAAB5FE13FB +IV=9EADA5C3EB63B5C96AAEEE6607D791BA +CT=6E4ADDA6895734D891F328C6D0C71467 +PT=8BED3D2AAB5271F90EE5335520E87AA2 + +I=159 +KEY=22D515400072783951742ACDF2FA6DC8FF6898F93D3E29BB0F4B8DFF95166959 +IV=C412515B75DDFF38B3E75CE588E80178 +CT=8BED3D2AAB5271F90EE5335520E87AA2 +PT=D3059CA1B293AA1F52D459643C5FAB5C + +I=160 +KEY=D6E6A383AF38A1CD2889A5F79A23CE512C6D04588FAD83A45D9FD49BA949C205 +IV=F433B6C3AF4AD9F479FD8F3A68D9A399 +CT=D3059CA1B293AA1F52D459643C5FAB5C +PT=C20D8580ACA043B0ED2F409EEA42C0F0 + +I=161 +KEY=AA95A47ADECB61AAD1A05DA0CE6B17BDEE6081D8230DC014B0B09405430B02F5 +IV=7C7307F971F3C067F929F8575448D9EC +CT=C20D8580ACA043B0ED2F409EEA42C0F0 +PT=61C0D0081F176C53DE83B70608201EE6 + +I=162 +KEY=168A56A528A70354AD74C59A8AF33A508FA051D03C1AAC476E3323034B2B1C13 +IV=BC1FF2DFF66C62FE7CD4983A44982DED +CT=61C0D0081F176C53DE83B70608201EE6 +PT=C016536FEFC08B69867AB2946FFBE011 + +I=163 +KEY=92157F38953622D8C0E191DAC4179A6A4FB602BFD3DA272EE849919724D0FC02 +IV=849F299DBD91218C6D9554404EE4A03A +CT=C016536FEFC08B69867AB2946FFBE011 +PT=6923FF03C812710270438F67EF2F42D1 + +I=164 +KEY=CCB6779947D31DF17182FB54555B49422695FDBC1BC8562C980A1EF0CBFFBED3 +IV=5EA308A1D2E53F29B1636A8E914CD328 +CT=6923FF03C812710270438F67EF2F42D1 +PT=0D1674014AD9DC2150E073E2FCF006A8 + +I=165 +KEY=22AA52C07B42CFEB5E75687D395D86092B8389BD51118A0DC8EA6D12370FB87B +IV=EE1C25593C91D21A2FF793296C06CF4B +CT=0D1674014AD9DC2150E073E2FCF006A8 +PT=6399A65CC66E9318F2CEE1103B8FFB90 + +I=166 +KEY=527EF084271AC57F5D33F2E7C7BE1FF1481A2FE1977F19153A248C020C8043EB +IV=70D4A2445C580A9403469A9AFEE399F8 +CT=6399A65CC66E9318F2CEE1103B8FFB90 +PT=511CBDD6CFA31788A43C765301D6BAAB + +I=167 +KEY=D826E762C9EA31B6F4415B3AE5ED888B1906923758DC0E9D9E18FA510D56F940 +IV=8A5817E6EEF0F4C9A972A9DD2253977A +CT=511CBDD6CFA31788A43C765301D6BAAB +PT=B04E78AB18AE3F5B825087D9D5794BD7 + +I=168 +KEY=B4C2DEE60A738C428B187EC3A3A4A982A948EA9C407231C61C487D88D82FB297 +IV=6CE43984C399BDF47F5925F946492109 +CT=B04E78AB18AE3F5B825087D9D5794BD7 +PT=6B013F9A972D82BD5A87DA6C1DD5FD0F + +I=169 +KEY=C4A41F8C4B26391F6C0D629C6B052BD8C249D506D75FB37B46CFA7E4C5FA4F98 +IV=7066C16A4155B55DE7151C5FC8A1825A +CT=6B013F9A972D82BD5A87DA6C1DD5FD0F +PT=9005F8243C6486F63590E7508503719C + +I=170 +KEY=91A18F2681FCACE1C80DC772BD0F2628524C2D22EB3B358D735F40B440F93E04 +IV=550590AACADA95FEA400A5EED60A0DF0 +CT=9005F8243C6486F63590E7508503719C +PT=39DEEEC3D3AEEBBF4B573462B375B5E4 + +I=171 +KEY=E8FF0EE1269AFDCA213F69757C84704D6B92C3E13895DE32380874D6F38C8BE0 +IV=795E81C7A766512BE932AE07C18B5665 +CT=39DEEEC3D3AEEBBF4B573462B375B5E4 +PT=1910F8E7C3D863784058CB35D674AEEB + +I=172 +KEY=F00751EFCCECA0ECA3C252F396B4078E72823B06FB4DBD4A7850BFE325F8250B +IV=18F85F0EEA765D2682FD3B86EA3077C3 +CT=1910F8E7C3D863784058CB35D674AEEB +PT=4A71250E55629D3C5CC62B18B4B67653 + +I=173 +KEY=383A1B81E82B8174A9B9F0AF9EA498A338F31E08AE2F2076249694FB914E5358 +IV=C83D4A6E24C721980A7BA25C08109F2D +CT=4A71250E55629D3C5CC62B18B4B67653 +PT=19CBB63FBB92C7A10B676DBB5EB29060 + +I=174 +KEY=A6695341053BD5B1E15A6CD73DEF84E12138A83715BDE7D72FF1F940CFFCC338 +IV=9E5348C0ED1054C548E39C78A34B1C42 +CT=19CBB63FBB92C7A10B676DBB5EB29060 +PT=18BA0A45E67D2CFEC691203FC2509837 + +I=175 +KEY=71B4C384EF619E5D6CADBFC7D53564913982A272F3C0CB29E960D97F0DAC5B0F +IV=D7DD90C5EA5A4BEC8DF7D310E8DAE070 +CT=18BA0A45E67D2CFEC691203FC2509837 +PT=7699C8550933C30D630AC16D8DA6F13D + +I=176 +KEY=7D0527970FD45C35817091A317A2EAB04F1B6A27FAF308248A6A1812800AAA32 +IV=0CB1E413E0B5C268EDDD2E64C2978E21 +CT=7699C8550933C30D630AC16D8DA6F13D +PT=78FE8EEC14618ED34F63E8671434ADA7 + +I=177 +KEY=204ECE43E91409C515077FACC37C4DF837E5E4CBEE9286F7C509F075943E0795 +IV=5D4BE9D4E6C055F09477EE0FD4DEA748 +CT=78FE8EEC14618ED34F63E8671434ADA7 +PT=0907F75149A74B49F302D2C08CF18AF5 + +I=178 +KEY=8E80DC69B6CC0F0D7F1F0BE6E9F178AD3EE2139AA735CDBE360B22B518CF8D60 +IV=AECE122A5FD806C86A18744A2A8D3555 +CT=0907F75149A74B49F302D2C08CF18AF5 +PT=FE24023BCABCD83E6212FA53E7320D92 + +I=179 +KEY=5152CCE87D9CCC930D7B376C4F1B334BC0C611A16D8915805419D8E6FFFD80F2 +IV=DFD21081CB50C39E72643C8AA6EA4BE6 +CT=FE24023BCABCD83E6212FA53E7320D92 +PT=9526CDED534CB3366306F8C731F87CD6 + +I=180 +KEY=00C9D78F67F1B63181ADE21A02675C6755E0DC4C3EC5A6B6371F2021CE05FC24 +IV=519B1B671A6D7AA28CD6D5764D7C6F2C +CT=9526CDED534CB3366306F8C731F87CD6 +PT=801F005EA2E9287FFD8D9B01BE8E2205 + +I=181 +KEY=442603CF6A012BDB23086BD7EFD7396ED5FFDC129C2C8EC9CA92BB20708BDE21 +IV=44EFD4400DF09DEAA2A589CDEDB06509 +CT=801F005EA2E9287FFD8D9B01BE8E2205 +PT=7558994ACE0299E34EB586B832C98560 + +I=182 +KEY=B153C7C49983077FB0C79C30266A487AA0A74558522E172A84273D9842425B41 +IV=F575C40BF3822CA493CFF7E7C9BD7114 +CT=7558994ACE0299E34EB586B832C98560 +PT=324273A52FFBFBCAC5401CFCD3075C98 + +I=183 +KEY=0E038D82F7FAD738824EF9FEB6F6627692E536FD7DD5ECE041672164914507D9 +IV=BF504A466E79D047328965CE909C2A0C +CT=324273A52FFBFBCAC5401CFCD3075C98 +PT=509E651E053E85340A5B545AA0E40A71 + +I=184 +KEY=B2237D5D0E16B5F9A8FD7274F4CA1206C27B53E378EB69D44B3C753E31A10DA8 +IV=BC20F0DFF9EC62C12AB38B8A423C7070 +CT=509E651E053E85340A5B545AA0E40A71 +PT=1716AB4DCAB205D62EF356E4C565BA70 + +I=185 +KEY=CBE25CF8F3CAB9849F44F330AD8B17E1D56DF8AEB2596C0265CF23DAF4C4B7D8 +IV=79C121A5FDDC0C7D37B98144594105E7 +CT=1716AB4DCAB205D62EF356E4C565BA70 +PT=093CA7764E7F6828EF210E89D3D01C73 + +I=186 +KEY=2BF3C06B0CAE728C8A6134634D5DEAF1DC515FD8FC26042A8AEE2D532714ABAB +IV=E0119C93FF64CB081525C753E0D6FD10 +CT=093CA7764E7F6828EF210E89D3D01C73 +PT=86F8B39DB10EB8B3CFED4C98BBBFFAE1 + +I=187 +KEY=A2C742CFF575CA98D3261BE7DA99E3935AA9EC454D28BC99450361CB9CAB514A +IV=893482A4F9DBB81459472F8497C40962 +CT=86F8B39DB10EB8B3CFED4C98BBBFFAE1 +PT=8BF9C14617B3CE1511ABBD484439D041 + +I=188 +KEY=F8AB8BAD8F2C5A54ED4C80AD094A36D4D1502D035A9B728C54A8DC83D892810B +IV=5A6CC9627A5990CC3E6A9B4AD3D3D547 +CT=8BF9C14617B3CE1511ABBD484439D041 +PT=C41B937B1D5E10D982C7850685997862 + +I=189 +KEY=4DBA6859C8D681253E8F6278BE76D87D154BBE7847C56255D66F59855D0BF969 +IV=B511E3F447FADB71D3C3E2D5B73CEEA9 +CT=C41B937B1D5E10D982C7850685997862 +PT=467114F3F33C8BA65AA76C297E9DA11C + +I=190 +KEY=2738E652A9F41B48B443B487B2AF6D7C533AAA8BB4F9E9F38CC835AC23965875 +IV=6A828E0B61229A6D8ACCD6FF0CD9B501 +CT=467114F3F33C8BA65AA76C297E9DA11C +PT=CB9D772C72BC5BB3E18087CABADDE5B2 + +I=191 +KEY=A1C138E8AFAA19465AE9BD1968C19E8798A7DDA7C645B2406D48B266994BBDC7 +IV=86F9DEBA065E020EEEAA099EDA6EF3FB +CT=CB9D772C72BC5BB3E18087CABADDE5B2 +PT=678837A26F65190F44107C19A01F97E6 + +I=192 +KEY=CD73AF62C6130630324F71F35042BC9AFF2FEA05A920AB4F2958CE7F39542A21 +IV=6CB2978A69B91F7668A6CCEA3883221D +CT=678837A26F65190F44107C19A01F97E6 +PT=E395804E9F2D61447B5207AA438F7D98 + +I=193 +KEY=F076EAF59DAC3F3975E9CBED6697A21B1CBA6A4B360DCA0B520AC9D57ADB57B9 +IV=3D0545975BBF390947A6BA1E36D51E81 +CT=E395804E9F2D61447B5207AA438F7D98 +PT=CA6E3E780C170E950306FEE08CAB46D9 + +I=194 +KEY=87DD7A9906E626E1AC55611A52EBC196D6D454333A1AC49E510C3735F6701160 +IV=77AB906C9B4A19D8D9BCAAF7347C638D +CT=CA6E3E780C170E950306FEE08CAB46D9 +PT=419B7C538E827E431B2C2BA5AEB95373 + +I=195 +KEY=C8D569C710030750FDA3A48E748BED26974F2860B498BADD4A201C9058C94213 +IV=4F08135E16E521B151F6C59426602CB0 +CT=419B7C538E827E431B2C2BA5AEB95373 +PT=1D6607B51B0DA629C62D00CB20870FEA + +I=196 +KEY=A3A22E3CED89316BC747E3326CB53C448A292FD5AF951CF48C0D1C5B784E4DF9 +IV=6B7747FBFD8A363B3AE447BC183ED162 +CT=1D6607B51B0DA629C62D00CB20870FEA +PT=58169D0006C9031C7CCE502F086B0CD6 + +I=197 +KEY=DDB2F456CFE201D5E1DD9EFC6593813FD23FB2D5A95C1FE8F0C34C747025412F +IV=7E10DA6A226B30BE269A7DCE0926BD7B +CT=58169D0006C9031C7CCE502F086B0CD6 +PT=8001E1BDAE24A2A9ABE102C2BEB4AD70 + +I=198 +KEY=A990048427C8E19BABE1D0BB5D6A83CA523E53680778BD415B224EB6CE91EC5F +IV=7422F0D2E82AE04E4A3C4E4738F902F5 +CT=8001E1BDAE24A2A9ABE102C2BEB4AD70 +PT=EA143E99846F5DF1C1A2AD0565D3AE45 + +I=199 +KEY=5074E20E5B70B571A7155A3AAFE3AF2AB82A6DF18317E0B09A80E3B3AB42421A +IV=F9E4E68A7CB854EA0CF48A81F2892CE0 +CT=EA143E99846F5DF1C1A2AD0565D3AE45 +PT=C1EBFE1B00D813BB5AC9E4B007977B19 + +I=200 +KEY=50315F6BF520F26A044751215225348179C193EA83CFF30BC0490703ACD53903 +IV=0045BD65AE50471BA3520B1BFDC69BAB +CT=C1EBFE1B00D813BB5AC9E4B007977B19 +PT=3476AA08CB11F13D8DD858CF10472D03 + +I=201 +KEY=03D2536F9830D74A9B2AEDD1508CE4764DB739E248DE02364D915FCCBC921400 +IV=53E30C046D1025209F6DBCF002A9D0F7 +CT=3476AA08CB11F13D8DD858CF10472D03 +PT=C79BED3BB201F29B65CDF5709654317C + +I=202 +KEY=4AC2173AD99E09ECCB4A647AF96C26F98A2CD4D9FADFF0AD285CAABC2AC6257C +IV=4910445541AEDEA6506089ABA9E0C28F +CT=C79BED3BB201F29B65CDF5709654317C +PT=E5E144D56A2FF95D644D51E73AEAE922 + +I=203 +KEY=9F46778CA9C15CB9978C0DF359056F3D6FCD900C90F009F04C11FB5B102CCC5E +IV=D58460B6705F55555CC66989A06949C4 +CT=E5E144D56A2FF95D644D51E73AEAE922 +PT=38582F30FDE74A162CCD85955C2E48FC + +I=204 +KEY=63038F8EA2934D0C65F181BE92B9664A5795BF3C6D1743E660DC7ECE4C0284A2 +IV=FC45F8020B5211B5F27D8C4DCBBC0977 +CT=38582F30FDE74A162CCD85955C2E48FC +PT=266E808D7E9206C9294F0349D1CEF1DA + +I=205 +KEY=D43CC15DCAB5047B8C67D61F1735C6A471FB3FB11385452F49937D879DCC7578 +IV=B73F4ED368264977E99657A1858CA0EE +CT=266E808D7E9206C9294F0349D1CEF1DA +PT=8E3D1F7DC678C32352782D52E4CD44D5 + +I=206 +KEY=9979232A388E0E6C766279CFE7E047B4FFC620CCD5FD860C1BEB50D5790131AD +IV=4D45E277F23B0A17FA05AFD0F0D58110 +CT=8E3D1F7DC678C32352782D52E4CD44D5 +PT=DDC8075418E2A649D4E78144528682F9 + +I=207 +KEY=43479EA72BF3B417CF224B15749043C5220E2798CD1F2045CF0CD1912B87B354 +IV=DA3EBD8D137DBA7BB94032DA93700471 +CT=DDC8075418E2A649D4E78144528682F9 +PT=4096B4F51C77C8A00A5308D8C3175B6A + +I=208 +KEY=7AE39630885C3ACDCF915625141DF45A6298936DD168E8E5C55FD949E890E83E +IV=39A40897A3AF8EDA00B31D30608DB79F +CT=4096B4F51C77C8A00A5308D8C3175B6A +PT=60D0385ECE913BEC6760BAA0BCCDE853 + +I=209 +KEY=82496ADB8A91DAE80C249D2BD8F00C990248AB331FF9D309A23F63E9545D006D +IV=F8AAFCEB02CDE025C3B5CB0ECCEDF8C3 +CT=60D0385ECE913BEC6760BAA0BCCDE853 +PT=79A86909141C27366744FC614808705B + +I=210 +KEY=EF7FEE5E3FDAC015E8016A7A9D3EB8677BE0C23A0BE5F43FC57B9F881C557036 +IV=6D368485B54B1AFDE425F75145CEB4FE +CT=79A86909141C27366744FC614808705B +PT=9817CE82A9D821189878991B32360409 + +I=211 +KEY=A400D423453A59F64968E8B80140AAF6E3F70CB8A23DD5275D0306932E63743F +IV=4B7F3A7D7AE099E3A16982C29C7E1291 +CT=9817CE82A9D821189878991B32360409 +PT=C3259E5D4A3E82FDC862E862E4449DA2 + +I=212 +KEY=B9280C8996C8BEC6888CB4D9D1E76B0620D292E5E80357DA9561EEF1CA27E99D +IV=1D28D8AAD3F2E730C1E45C61D0A7C1F0 +CT=C3259E5D4A3E82FDC862E862E4449DA2 +PT=F035078B9A3E45B4ED561F001DB21E47 + +I=213 +KEY=9686D9BB259CD14FA7D58C9789932385D0E7956E723D126E7837F1F1D795F7DA +IV=2FAED532B3546F892F59384E58744883 +CT=F035078B9A3E45B4ED561F001DB21E47 +PT=596B9F7F2122A11C599626B16B6AC340 + +I=214 +KEY=736E847DDC4C794A3AA2E22C1AF85EF1898C0A11531FB37221A1D740BCFF349A +IV=E5E85DC6F9D0A8059D776EBB936B7D74 +CT=596B9F7F2122A11C599626B16B6AC340 +PT=800FCC5CE3B08CFFDD70FB5270DED220 + +I=215 +KEY=728D3E35CD653621D41E591530770B370983C64DB0AF3F8DFCD12C12CC21E6BA +IV=01E3BA4811294F6BEEBCBB392A8F55C6 +CT=800FCC5CE3B08CFFDD70FB5270DED220 +PT=5515A58EB0013D2EE561BD2826761209 + +I=216 +KEY=929F6FD8250BAD33FAE4ED108843A2645C9663C300AE02A319B0913AEA57F4B3 +IV=E01251EDE86E9B122EFAB405B834A953 +CT=5515A58EB0013D2EE561BD2826761209 +PT=8B7B3AB73287CEAAA0098D41F0B3A28B + +I=217 +KEY=3F54C218B02F6097C3F31A05F5CCB8C4D7ED59743229CC09B9B91C7B1AE45638 +IV=ADCBADC09524CDA43917F7157D8F1AA0 +CT=8B7B3AB73287CEAAA0098D41F0B3A28B +PT=90CDCF132600F622D1339197B441A4C0 + +I=218 +KEY=2F60AEE4E6A6F7109193112BC756D7F24720966714293A2B688A8DECAEA5F2F8 +IV=10346CFC5689978752600B2E329A6F36 +CT=90CDCF132600F622D1339197B441A4C0 +PT=EA089BEC0DEE1305828522B8AD4F5A99 + +I=219 +KEY=33623A9F86F3AF456D92076B132E46A3AD280D8B19C7292EEA0FAF5403EAA861 +IV=1C02947B60555855FC011640D4789151 +CT=EA089BEC0DEE1305828522B8AD4F5A99 +PT=339C14562AE38F84BE0FB1569C234287 + +I=220 +KEY=6291ED0B63ED8C18A713DDCBFCA054E19EB419DD3324A6AA54001E029FC9EAE6 +IV=51F3D794E51E235DCA81DAA0EF8E1242 +CT=339C14562AE38F84BE0FB1569C234287 +PT=31050E95B1F08B9139EF7F8D42110978 + +I=221 +KEY=7BEF1BE3E67AA478C5D9F50350D221CCAFB1174882D42D3B6DEF618FDDD8E39E +IV=197EF6E88597286062CA28C8AC72752D +CT=31050E95B1F08B9139EF7F8D42110978 +PT=18DE66E3B58C9ABAB99987826AF0D0AF + +I=222 +KEY=3DEB69283844069B400C2E7127B8CD2EB76F71AB3758B781D476E60DB7283331 +IV=460472CBDE3EA2E385D5DB72776AECE2 +CT=18DE66E3B58C9ABAB99987826AF0D0AF +PT=B75D11E28C94DB969FE009B984DA956B + +I=223 +KEY=754C5BEC642540EC8BAD0778773CA8E700326049BBCC6C174B96EFB433F2A65A +IV=48A732C45C614677CBA12909508465C9 +CT=B75D11E28C94DB969FE009B984DA956B +PT=7CEEE835FC734108785B367A28C62058 + +I=224 +KEY=01B0A659138DEE7CF1EFA11DD0A209247CDC887C47BF2D1F33CDD9CE1B348602 +IV=74FCFDB577A8AE907A42A665A79EA1C3 +CT=7CEEE835FC734108785B367A28C62058 +PT=F1E848F6C257D6D56B4FBCA36900614C + +I=225 +KEY=F9531CEDC3C5C76A90195BF1E5FB5ED98D34C08A85E8FBCA5882656D7234E74E +IV=F8E3BAB4D048291661F6FAEC355957FD +CT=F1E848F6C257D6D56B4FBCA36900614C +PT=7B06A193C8B84977E56B382D424D2A78 + +I=226 +KEY=D409DB9768430BCA0E2B68BA1CFE93A5F63261194D50B2BDBDE95D403079CD36 +IV=2D5AC77AAB86CCA09E32334BF905CD7C +CT=7B06A193C8B84977E56B382D424D2A78 +PT=413356E3367ACBDD88ADA6DF5E09FFC6 + +I=227 +KEY=8425B50A014625BA114ABAC1585C3F68B70137FA7B2A79603544FB9F6E7032F0 +IV=502C6E9D69052E701F61D27B44A2ACCD +CT=413356E3367ACBDD88ADA6DF5E09FFC6 +PT=13B524E8AEBFE32CC9559B500D9E9A82 + +I=228 +KEY=3ED2EEDFF8C12697C9CEB18B8DC86798A4B41312D5959A4CFC1160CF63EEA872 +IV=BAF75BD5F987032DD8840B4AD59458F0 +CT=13B524E8AEBFE32CC9559B500D9E9A82 +PT=91775D8DF510277669BC11697965AE99 + +I=229 +KEY=B3C35FF0F6B2DDCF5522A35E75040BB135C34E9F2085BD3A95AD71A61A8B06EB +IV=8D11B12F0E73FB589CEC12D5F8CC6C29 +CT=91775D8DF510277669BC11697965AE99 +PT=0AA5B5A593FED4CE1FD66736774649D2 + +I=230 +KEY=5581EEED032A31D6F8077BEED79ABB1E3F66FB3AB37B69F48A7B16906DCD4F39 +IV=E642B11DF598EC19AD25D8B0A29EB0AF +CT=0AA5B5A593FED4CE1FD66736774649D2 +PT=3DB595E23D32347092E5D94A8376DB5D + +I=231 +KEY=2337ABB014AD70D3E290033BD6FC75D702D36ED88E495D84189ECFDAEEBB9464 +IV=76B6455D178741051A9778D50166CEC9 +CT=3DB595E23D32347092E5D94A8376DB5D +PT=2AF2DEC9D2D4F0BA81D1FC88E421C034 + +I=232 +KEY=7C8A43D8CA68E782BBD49C18477683052821B0115C9DAD3E994F33520A9A5450 +IV=5FBDE868DEC5975159449F23918AF6D2 +CT=2AF2DEC9D2D4F0BA81D1FC88E421C034 +PT=8AF90FCCBEDCDF709AEE93FEF45C03EC + +I=233 +KEY=37FDC789E91F58F691931C86C4505926A2D8BFDDE241724E03A1A0ACFEC657BC +IV=4B7784512377BF742A47809E8326DA23 +CT=8AF90FCCBEDCDF709AEE93FEF45C03EC +PT=8E98DF785A601DF26465D9A0D163D650 + +I=234 +KEY=57C30D92BD234BE693F15534768970FC2C4060A5B8216FBC67C4790C2FA581EC +IV=603ECA1B543C1310026249B2B2D929DA +CT=8E98DF785A601DF26465D9A0D163D650 +PT=21D3EAC95A088A548E5C0E56001BD103 + +I=235 +KEY=1F9A07E73DB0530F84B6DB88C5EA0AFD0D938A6CE229E5E8E998775A2FBE50EF +IV=48590A75809318E917478EBCB3637A01 +CT=21D3EAC95A088A548E5C0E56001BD103 +PT=48A8853D9E4E4A6351E5F5734911D569 + +I=236 +KEY=219E87740C05905A3DAC677C78C5E6D4453B0F517C67AF8BB87D822966AF8586 +IV=3E04809331B5C355B91ABCF4BD2FEC29 +CT=48A8853D9E4E4A6351E5F5734911D569 +PT=C75ECB64A655DC6803FC976A1CAE78A9 + +I=237 +KEY=D445B2CF4C6B8AF073FCDFF8907C4B278265C435DA3273E3BB8115437A01FD2F +IV=F5DB35BB406E1AAA4E50B884E8B9ADF3 +CT=C75ECB64A655DC6803FC976A1CAE78A9 +PT=F063E6C6A62D07B1CA90594CB9041DE4 + +I=238 +KEY=3DECAA3153A9658A2CAA5578AF2C55CD720622F37C1F745271114C0FC305E0CB +IV=E9A918FE1FC2EF7A5F568A803F501EEA +CT=F063E6C6A62D07B1CA90594CB9041DE4 +PT=45F375DDBA20D20CB6C5EAB28AA85D06 + +I=239 +KEY=31766034845DF8A1AEDFC70CE3CD5B1D37F5572EC63FA65EC7D4A6BD49ADBDCD +IV=0C9ACA05D7F49D2B827592744CE10ED0 +CT=45F375DDBA20D20CB6C5EAB28AA85D06 +PT=5D117AAC285D5A6948390FDAFBDACAD5 + +I=240 +KEY=BF17727E1D5DCA94C9CCA8E11DFBF22A6AE42D82EE62FC378FEDA967B2777718 +IV=8E61124A9900323567136FEDFE36A937 +CT=5D117AAC285D5A6948390FDAFBDACAD5 +PT=C8B61B172D930641A88E9E13236E11F9 + +I=241 +KEY=B82DB30F4271245293FC4CB6A0C10D4FA2523695C3F1FA7627633774911966E1 +IV=073AC1715F2CEEC65A30E457BD3AFF65 +CT=C8B61B172D930641A88E9E13236E11F9 +PT=FE05708E08F8568BB55175CEEF9E0433 + +I=242 +KEY=28AE9BD5E181AC41CF2F9B4710DD160C5C57461BCB09ACFD923242BA7E8762D2 +IV=908328DAA3F088135CD3D7F1B01C1B43 +CT=FE05708E08F8568BB55175CEEF9E0433 +PT=D7DB71EAC2EF31AE105227E34134AD3C + +I=243 +KEY=437D385B59B4AB247A5BCFC0C0F8596F8B8C37F109E69D53826065593FB3CFEE +IV=6BD3A38EB8350765B5745487D0254F63 +CT=D7DB71EAC2EF31AE105227E34134AD3C +PT=ECD51D08C870983992708FC1FDFA9D15 + +I=244 +KEY=4EF45D9C1FCA58D42D9E7E2E9C7D0B8F67592AF9C196056A1010EA98C24952FB +IV=0D8965C7467EF3F057C5B1EE5C8552E0 +CT=ECD51D08C870983992708FC1FDFA9D15 +PT=F436BA32E9D089248AC47E40AA6B4BAC + +I=245 +KEY=D3F16D0CF75471A24F273B3E8EF0A3A0936F90CB28468C4E9AD494D868221957 +IV=9D053090E89E297662B94510128DA82F +CT=F436BA32E9D089248AC47E40AA6B4BAC +PT=F43E89C3DBD391B5778B30A36A9E42F3 + +I=246 +KEY=953E7AB7369425A4F396D764F3EA047F67511908F3951DFBED5FA47B02BC5BA4 +IV=46CF17BBC1C05406BCB1EC5A7D1AA7DF +CT=F43E89C3DBD391B5778B30A36A9E42F3 +PT=B12ABB428A29703B929EFDB0031694D1 + +I=247 +KEY=C8DDFEFD3C72822B72C78757EE8EF856D67BA24A79BC6DC07FC159CB01AACF75 +IV=5DE3844A0AE6A78F815150331D64FC29 +CT=B12ABB428A29703B929EFDB0031694D1 +PT=79F19D2BD0A025D2D9822A28F5304446 + +I=248 +KEY=870A25E9511D3F1BCFA941DA41FD00C0AF8A3F61A91C4812A64373E3F49A8B33 +IV=4FD7DB146D6FBD30BD6EC68DAF73F896 +CT=79F19D2BD0A025D2D9822A28F5304446 +PT=C52D5EF8D7A1353F5C1FF7BA33F9ED97 + +I=249 +KEY=178B86564949AE1A0CE50E61F4D3F8776AA761997EBD7D2DFA5C8459C76366A4 +IV=9081A3BF18549101C34C4FBBB52EF8B7 +CT=C52D5EF8D7A1353F5C1FF7BA33F9ED97 +PT=82FAB7DF4BE409880B8F66210DE8D2E5 + +I=250 +KEY=C3F845809E635052F94076E1F3026779E85DD646355974A5F1D3E278CA8BB441 +IV=D473C3D6D72AFE48F5A5788007D19F0E +CT=82FAB7DF4BE409880B8F66210DE8D2E5 +PT=52C05722F125348666DFCF0F2D052530 + +I=251 +KEY=34AE823E21F4C45784F2E125CF5039FCBA9D8164C47C4023970C2D77E78E9171 +IV=F756C7BEBF9794057DB297C43C525E85 +CT=52C05722F125348666DFCF0F2D052530 +PT=DE7FAAF4A10D4D5404847FA080C1DC1C + +I=252 +KEY=9D1EEFC6B62427F5A2CBB2047AB0E41B64E22B9065710D77938852D7674F4D6D +IV=A9B06DF897D0E3A226395321B5E0DDE7 +CT=DE7FAAF4A10D4D5404847FA080C1DC1C +PT=49327927599012EE87FF64F45AC9A9AE + +I=253 +KEY=2C7B21A79BE0B5B0E4DCC427DE8D91572DD052B73CE11F99147736233D86E4C3 +IV=B165CE612DC4924546177623A43D754C +CT=49327927599012EE87FF64F45AC9A9AE +PT=6E11B9F592DD99CD94F8999D9476F4CF + +I=254 +KEY=F4A72FB6D161B9E15A41576C5A7CBF3F43C1EB42AE3C8654808FAFBEA9F0100C +IV=D8DC0E114A810C51BE9D934B84F12E68 +CT=6E11B9F592DD99CD94F8999D9476F4CF +PT=108AC1FE3E008D1C3058917157003E2C + +I=255 +KEY=2E5FE97C58B060C9BACA9E9CC14CFC89534B2ABC903C0B48B0D73ECFFEF02E20 +IV=DAF8C6CA89D1D928E08BC9F09B3043B6 +CT=108AC1FE3E008D1C3058917157003E2C +PT=B315EF45A3BD77688AD0976EF5DCA26B + +I=256 +KEY=9D763A80B96B112E1DAEA50A98C0B6F7E05EC5F933817C203A07A9A10B2C8C4B +IV=B329D3FCE1DB71E7A7643B96598C4A7E +CT=B315EF45A3BD77688AD0976EF5DCA26B +PT=7BF8DABED803049DF8D1F34ED00536F7 + +I=257 +KEY=DF5F07523E7E305B48AAD9C205AE826C9BA61F47EB8278BDC2D65AEFDB29BABC +IV=42293DD28715217555047CC89D6E349B +CT=7BF8DABED803049DF8D1F34ED00536F7 +PT=E55FE84DF3137D16E74DC01A1BFDA4A7 + +I=258 +KEY=80CF537EC8836ADD0FB72F35B2EF703D7EF9F70A189105AB259B9AF5C0D41E1B +IV=5F90542CF6FD5A86471DF6F7B741F251 +CT=E55FE84DF3137D16E74DC01A1BFDA4A7 +PT=6019F9DA2DFDCDCB14C2C6CE5B34432D + +I=259 +KEY=4469D3622A022CFB7614C9C9EB36E6031EE00ED0356CC86031595C3B9BE05D36 +IV=C4A6801CE281462679A3E6FC59D9963E +CT=6019F9DA2DFDCDCB14C2C6CE5B34432D +PT=6D2788861A8F9526D1EC8A6A8AFBA629 + +I=260 +KEY=DED804546FA6B0BCD8C9FD9119616F9873C786562FE35D46E0B5D651111BFB1F +IV=9AB1D73645A49C47AEDD3458F257899B +CT=6D2788861A8F9526D1EC8A6A8AFBA629 +PT=81D5CDEA70E433A2A341FFB13ECCEC54 + +I=261 +KEY=24FD3D900606EEF8F31156D30EA094ADF2124BBC5F076EE443F429E02FD7174B +IV=FA2539C469A05E442BD8AB4217C1FB35 +CT=81D5CDEA70E433A2A341FFB13ECCEC54 +PT=F74B4869E92F918A95B508E382A83FA6 + +I=262 +KEY=C24CA269EAADDFBA060AAF15C2265DE6055903D5B628FF6ED6412103AD7F28ED +IV=E6B19FF9ECAB3142F51BF9C6CC86C94B +CT=F74B4869E92F918A95B508E382A83FA6 +PT=EF3293511A17D0E089A8F88E396B4F31 + +I=263 +KEY=789C94E8D2B6D6FD022ED678F42E796CEA6B9084AC3F2F8E5FE9D98D941467DC +IV=BAD03681381B09470424796D3608248A +CT=EF3293511A17D0E089A8F88E396B4F31 +PT=0D70FCE243309D716D8FA672A11EBCB8 + +I=264 +KEY=B8DFB47D720C26AE22AD6C87785CCB97E71B6C66EF0FB2FF32667FFF350ADB64 +IV=C0432095A0BAF0532083BAFF8C72B2FB +CT=0D70FCE243309D716D8FA672A11EBCB8 +PT=831365AB30D062F2B1C051A9EA03AEEB + +I=265 +KEY=938BCEFF0FD9AEC61CF2B0509A645A19640809CDDFDFD00D83A62E56DF09758F +IV=2B547A827DD588683E5FDCD7E238918E +CT=831365AB30D062F2B1C051A9EA03AEEB +PT=EFE7E9DC254FF4AA70ABF327566A5448 + +I=266 +KEY=BBF0C86D05BF543EC3B9A9240833187F8BEFE011FA9024A7F30DDD71896321C7 +IV=287B06920A66FAF8DF4B197492574266 +CT=EFE7E9DC254FF4AA70ABF327566A5448 +PT=2D41BEE483BD2BAD16026AD7AA5ABA07 + +I=267 +KEY=B744A9326EC1D56CBFF51D969D075C7DA6AE5EF5792D0F0AE50FB7A623399BC0 +IV=0CB4615F6B7E81527C4CB4B295344402 +CT=2D41BEE483BD2BAD16026AD7AA5ABA07 +PT=079460C9B745A53999932C5ECFE6A37B + +I=268 +KEY=AE49C59DD393E9EC9030AEDAD7FC61FEA13A3E3CCE68AA337C9C9BF8ECDF38BB +IV=190D6CAFBD523C802FC5B34C4AFB3D83 +CT=079460C9B745A53999932C5ECFE6A37B +PT=CE7C5851D0437368FEDC7E39270A7430 + +I=269 +KEY=8176855633B6FB2445BDDC2FD8D299576F46666D1E2BD95B8240E5C1CBD54C8B +IV=2F3F40CBE02512C8D58D72F50F2EF8A9 +CT=CE7C5851D0437368FEDC7E39270A7430 +PT=A0C3F2D688E4370AD2F08C09B28DBCC1 + +I=270 +KEY=050E71C47B278C5825DE84513A732D11CF8594BB96CFEE5150B069C87958F04A +IV=8478F4924891777C6063587EE2A1B446 +CT=A0C3F2D688E4370AD2F08C09B28DBCC1 +PT=BE472E609ABB030B96739A959EDBDD21 + +I=271 +KEY=502E4BDCF449E96CB16D5B6C097D20CC71C2BADB0C74ED5AC6C3F35DE7832D6B +IV=55203A188F6E653494B3DF3D330E0DDD +CT=BE472E609ABB030B96739A959EDBDD21 +PT=FE4227D6AC71519FA0F2078433DF69CA + +I=272 +KEY=C3DDDE6B2E80381010569BC093561F628F809D0DA005BCC56631F4D9D45C44A1 +IV=93F395B7DAC9D17CA13BC0AC9A2B3FAE +CT=FE4227D6AC71519FA0F2078433DF69CA +PT=3F8439C7648C5C2B5877643C536E14F9 + +I=273 +KEY=1CC65CB104317D620D729EDEB4C4B512B004A4CAC489E0EE3E4690E587325058 +IV=DF1B82DA2AB145721D24051E2792AA70 +CT=3F8439C7648C5C2B5877643C536E14F9 +PT=E189B969BF38C8A2F38BF3F12267B5B4 + +I=274 +KEY=D121C8556039F07E231F9E88DE60572B518D1DA37BB1284CCDCD6314A555E5EC +IV=CDE794E464088D1C2E6D00566AA4E239 +CT=E189B969BF38C8A2F38BF3F12267B5B4 +PT=EF15CCEC56DCD62681FC7564A1095ECD + +I=275 +KEY=C87070F4AA767BE043B29FE3AF258C91BE98D14F2D6DFE6A4C311670045CBB21 +IV=1951B8A1CA4F8B9E60AD016B7145DBBA +CT=EF15CCEC56DCD62681FC7564A1095ECD +PT=BD38CD579A7124DD0814DB21FC0E7D96 + +I=276 +KEY=08167C643CA7CAD8729B17EB91918AC103A01C18B71CDAB74425CD51F852C6B7 +IV=C0660C9096D1B138312988083EB40650 +CT=BD38CD579A7124DD0814DB21FC0E7D96 +PT=565F580B61E456544D8D553948AD95FD + +I=277 +KEY=55BB77ED49C419EEA418365F2750857355FF4413D6F88CE309A89868B0FF534A +IV=5DAD0B897563D336D68321B4B6C10FB2 +CT=565F580B61E456544D8D553948AD95FD +PT=1AA68EAC78C2B5BFF996F0B58C56432F + +I=278 +KEY=8FEC3C85819F24EE1DA186AB212A19D44F59CABFAE3A395CF03E68DD3CA91065 +IV=DA574B68C85B3D00B9B9B0F4067A9CA7 +CT=1AA68EAC78C2B5BFF996F0B58C56432F +PT=65660FBF6C166604D9E717671488D734 + +I=279 +KEY=D1D19B25C23EA5923D45493905B867D12A3FC500C22C5F5829D97FBA2821C751 +IV=5E3DA7A043A1817C20E4CF9224927E05 +CT=65660FBF6C166604D9E717671488D734 +PT=477CBD97B467AA1AAB738E294092FAA3 + +I=280 +KEY=E1972BE045093EC4475DCE6351CDEDCB6D437897764BF54282AAF19368B33DF2 +IV=3046B0C587379B567A18875A54758A1A +CT=477CBD97B467AA1AAB738E294092FAA3 +PT=C0ED90D90AE11390A275BD03BE00E1D5 + +I=281 +KEY=6F622A270D77AE65084E2070343E8C7FADAEE84E7CAAE6D220DF4C90D6B3DC27 +IV=8EF501C7487E90A14F13EE1365F361B4 +CT=C0ED90D90AE11390A275BD03BE00E1D5 +PT=296FED9B8CF7C532721A2188DDB1A441 + +I=282 +KEY=FF7209EA94C0401544991FDB57F77F2084C105D5F05D23E052C56D180B027866 +IV=901023CD99B7EE704CD73FAB63C9F35F +CT=296FED9B8CF7C532721A2188DDB1A441 +PT=4AE1C2EB8D1CEB5804FA992708150590 + +I=283 +KEY=73C6F94AD63DE39C289AE20179FDDDD7CE20C73E7D41C8B8563FF43F03177DF6 +IV=8CB4F0A042FDA3896C03FDDA2E0AA2F7 +CT=4AE1C2EB8D1CEB5804FA992708150590 +PT=A4EAC8940C12F9CEAC78DFDC99DF68B4 + +I=284 +KEY=A7369886016682F6075678509FFB86ED6ACA0FAA71533176FA472BE39AC81542 +IV=D4F061CCD75B616A2FCC9A51E6065B3A +CT=A4EAC8940C12F9CEAC78DFDC99DF68B4 +PT=70B05A9959E7C4E4545BB3AECCD8B33D + +I=285 +KEY=F01B9FF32CE9CA699F69ADBBC209BBD21A7A553328B4F592AE1C984D5610A67F +IV=572D07752D8F489F983FD5EB5DF23D3F +CT=70B05A9959E7C4E4545BB3AECCD8B33D +PT=F4978960F1382713A5A7183B9694DE85 + +I=286 +KEY=FF05A97961A5CA725CD2E1B2A9D58304EEEDDC53D98CD2810BBB8076C08478FA +IV=0F1E368A4D4C001BC3BB4C096BDC38D6 +CT=F4978960F1382713A5A7183B9694DE85 +PT=EDCC3B8D26928086F1C6727833405424 + +I=287 +KEY=AA4DB35CCBD936D13D1B7DB64638B99A0321E7DEFF1E5207FA7DF20EF3C42CDE +IV=55481A25AA7CFCA361C99C04EFED3A9E +CT=EDCC3B8D26928086F1C6727833405424 +PT=12A36AC1DA72345291CF206FA04F102F + +I=288 +KEY=611E32BF030B7B377AEC338C7FA6D88311828D1F256C66556BB2D261538B3CF1 +IV=CB5381E3C8D24DE647F74E3A399E6119 +CT=12A36AC1DA72345291CF206FA04F102F +PT=8DA0003E090444453B932F0CDBBFA54E + +I=289 +KEY=43E230241EF150AC761C1307C43C3E209C228D212C6822105021FD6D883499BF +IV=22FC029B1DFA2B9B0CF0208BBB9AE6A3 +CT=8DA0003E090444453B932F0CDBBFA54E +PT=A3D9F2112895CEA937A2B18ABB589CC0 + +I=290 +KEY=1FE38E9028DAC8A1E65A04C78BD0E7523FFB7F3004FDECB967834CE7336C057F +IV=5C01BEB4362B980D904617C04FECD972 +CT=A3D9F2112895CEA937A2B18ABB589CC0 +PT=191EE02B9FED198599B5BC2F36271ABB + +I=291 +KEY=5FFD20799D7A7E7A328BD57B13F6E52F26E59F1B9B10F53CFE36F0C8054B1FC4 +IV=401EAEE9B5A0B6DBD4D1D1BC9826027D +CT=191EE02B9FED198599B5BC2F36271ABB +PT=EFC32006AE746D1E3F65E6C7ADF32804 + +I=292 +KEY=EFEFD2A0F1917EB5BFD2337260E11023C926BF1D35649822C153160FA8B837C0 +IV=B012F2D96CEB00CF8D59E6097317F50C +CT=EFC32006AE746D1E3F65E6C7ADF32804 +PT=F9C49B0BFFA354EEBBE3DE29BF9D2623 + +I=293 +KEY=7676D792019D370A67526977EC5FDB5B30E22416CAC7CCCC7AB0C826172511E3 +IV=99990532F00C49BFD8805A058CBECB78 +CT=F9C49B0BFFA354EEBBE3DE29BF9D2623 +PT=EAEAE4BFF789E64D80D88CE5BC0E15CC + +I=294 +KEY=69202B4EB33EB35987DD82026714F603DA08C0A93D4E2A81FA6844C3AB2B042F +IV=1F56FCDCB2A38453E08FEB758B4B2D58 +CT=EAEAE4BFF789E64D80D88CE5BC0E15CC +PT=96C362F59FD2457A5ED68A116B4AA682 + +I=295 +KEY=DE8B4CC7995B3E061E126157B0C2AF984CCBA25CA29C6FFBA4BECED2C061A2AD +IV=B7AB67892A658D5F99CFE355D7D6599B +CT=96C362F59FD2457A5ED68A116B4AA682 +PT=5498BE46DCE840F7B593BE2BC0D252CB + +I=296 +KEY=1BFE119E1B63BA06E9A590709A2985D218531C1A7E742F0C112D70F900B3F066 +IV=C5755D5982388400F7B7F1272AEB2A4A +CT=5498BE46DCE840F7B593BE2BC0D252CB +PT=697482966F491ACB46E7171A4813D916 + +I=297 +KEY=9E6361F9775A88FAAD09711E9691798C71279E8C113D35C757CA67E348A02970 +IV=859D70676C3932FC44ACE16E0CB8FC5E +CT=697482966F491ACB46E7171A4813D916 +PT=A799874DC7721D96DEEFAB5FE1A01A8E + +I=298 +KEY=7D1EF621D3ADC4BD4EC1861167FA5B0CD6BE19C1D64F28518925CCBCA90033FE +IV=E37D97D8A4F74C47E3C8F70FF16B2280 +CT=A799874DC7721D96DEEFAB5FE1A01A8E +PT=2D19344625CF5E6DE07EE960F4AEC5CF + +I=299 +KEY=7DFD0BE692B47C022DC789EF5291D2F5FBA72D87F380763C695B25DC5DAEF631 +IV=00E3FDC74119B8BF63060FFE356B89F9 +CT=2D19344625CF5E6DE07EE960F4AEC5CF +PT=F80C5143F173AE672DA4DDC8272C13EF + +I=300 +KEY=A78C66D30475B93F0A87E6E4A8BFA3AE03AB7CC402F3D85B44FFF8147A82E5DE +IV=DA716D3596C1C53D27406F0BFA2E715B +CT=F80C5143F173AE672DA4DDC8272C13EF +PT=76BDB7A63614A41C9D52718B3514E03C + +I=301 +KEY=9542E4B9D92DAF7B463C83DA257422B37516CB6234E77C47D9AD899F4F9605E2 +IV=32CE826ADD5816444CBB653E8DCB811D +CT=76BDB7A63614A41C9D52718B3514E03C +PT=93F65B7B961EE6B623A026576FF8890B + +I=302 +KEY=6932CD66A25D1DE274C7D5DF540917BFE6E09019A2F99AF1FA0DAFC8206E8CE9 +IV=FC7029DF7B70B29932FB5605717D350C +CT=93F65B7B961EE6B623A026576FF8890B +PT=FA5BEB508ABCBCB1B1D56C0E207A032D + +I=303 +KEY=595CCC3640445FF5BBF303FF7845AB821CBB7B49284526404BD8C3C600148FC4 +IV=306E0150E2194217CF34D6202C4CBC3D +CT=FA5BEB508ABCBCB1B1D56C0E207A032D +PT=BFAEA3EB7C617567EB302D571DBF2811 + +I=304 +KEY=BF5382311BF88FC9E32D5BADC832BE48A315D8A254245327A0E8EE911DABA7D5 +IV=E60F4E075BBCD03C58DE5852B07715CA +CT=BFAEA3EB7C617567EB302D571DBF2811 +PT=4B0E63933414184D43B0AA714AA31E02 + +I=305 +KEY=B50A2FF8FAC6820638CCBA3A0CA6519CE81BBB3160304B6AE35844E05708B9D7 +IV=0A59ADC9E13E0DCFDBE1E197C494EFD4 +CT=4B0E63933414184D43B0AA714AA31E02 +PT=0073CA04B300003AF3C1035C664E0646 + +I=306 +KEY=1A32AA7CA8B5D83C47F56C5D24EDBD38E8687135D3304B50109947BC3146BF91 +IV=AF38858452735A3A7F39D667284BECA4 +CT=0073CA04B300003AF3C1035C664E0646 +PT=75CFE6D4A4F05D8EBB5C614AC7FB48C8 + +I=307 +KEY=C321C5381F5A334C8B82DD2F0E4C73AE9DA797E177C016DEABC526F6F6BDF759 +IV=D9136F44B7EFEB70CC77B1722AA1CE96 +CT=75CFE6D4A4F05D8EBB5C614AC7FB48C8 +PT=B0D8DB37DF5C3A87B9E5D562283E8FEE + +I=308 +KEY=40879EA19753F0F22B1C1BF438A446532D7F4CD6A89C2C591220F394DE8378B7 +IV=83A65B998809C3BEA09EC6DB36E835FD +CT=B0D8DB37DF5C3A87B9E5D562283E8FEE +PT=9C885637CC7666C04B424DD6EF1F3EDB + +I=309 +KEY=B6824C9F800B1E7825135F250DB99FC8B1F71AE164EA4A995962BE42319C466C +IV=F605D23E1758EE8A0E0F44D1351DD99B +CT=9C885637CC7666C04B424DD6EF1F3EDB +PT=3E7F4437656E63E0ADC6C764B20FE92D + +I=310 +KEY=7FA3CDE5856B1F0D9AE33E9E6ED1532E8F885ED601842979F4A479268393AF41 +IV=C921817A05600175BFF061BB6368CCE6 +CT=3E7F4437656E63E0ADC6C764B20FE92D +PT=B19CCFDAADEC54C8DD5F4FD53D3C5824 + +I=311 +KEY=3E3ABA34DB005D9FF2CEF1321BCD018E3E14910CAC687DB129FB36F3BEAFF765 +IV=419977D15E6B4292682DCFAC751C52A0 +CT=B19CCFDAADEC54C8DD5F4FD53D3C5824 +PT=84F7D061322A4042913C0BD14F5F1391 + +I=312 +KEY=FB474D499955CB1F37FBA309DD55E09DBAE3416D9E423DF3B8C73D22F1F0E4F4 +IV=C57DF77D42559680C535523BC698E113 +CT=84F7D061322A4042913C0BD14F5F1391 +PT=CBCD716DA9C53D7AFFFE65B780926660 + +I=313 +KEY=7C1D07031362A7439F9DD5272DAD1D9B712E3000378700894739589571628294 +IV=875A4A4A8A376C5CA866762EF0F8FD06 +CT=CBCD716DA9C53D7AFFFE65B780926660 +PT=F605D205704496C5BFCEE88130920CDE + +I=314 +KEY=7E9E72A6032523643F0965E8BFCB0793872BE20547C3964CF8F7B01441F08E4A +IV=028375A510478427A094B0CF92661A08 +CT=F605D205704496C5BFCEE88130920CDE +PT=CFA8B47DEB5770925EA29484D82CDBB4 + +I=315 +KEY=518CA0A8C81E9DDCE1060410C69F0ACE48835678AC94E6DEA655249099DC55FE +IV=2F12D20ECB3BBEB8DE0F61F879540D5D +CT=CFA8B47DEB5770925EA29484D82CDBB4 +PT=1065AD49D2DD48EB9540F23A69469B92 + +I=316 +KEY=45E6A5A17D8D1AEA04CD8E184D0A1BF758E6FB317E49AE353315D6AAF09ACE6C +IV=146A0509B5938736E5CB8A088B951139 +CT=1065AD49D2DD48EB9540F23A69469B92 +PT=DB12EE00C65069CFEA509BA5BD5BB6BC + +I=317 +KEY=FC8F8F7F8A440A6CEB920D4311851B3A83F41531B819C7FAD9454D0F4DC178D0 +IV=B9692ADEF7C91086EF5F835B5C8F00CD +CT=DB12EE00C65069CFEA509BA5BD5BB6BC +PT=B66316FB3CCC9B262A34C205AE43F42B + +I=318 +KEY=42D666DF2C1575E3B346FCBCD208AD9F359703CA84D55CDCF3718F0AE3828CFB +IV=BE59E9A0A6517F8F58D4F1FFC38DB6A5 +CT=B66316FB3CCC9B262A34C205AE43F42B +PT=4C851D9BDC164194A6D1FDE274C06D1B + +I=319 +KEY=786B9456901DFA9FF85C686DEEDCA02079121E5158C31D4855A072E89742E1E0 +IV=3ABDF289BC088F7C4B1A94D13CD40DBF +CT=4C851D9BDC164194A6D1FDE274C06D1B +PT=5507F1EB271BDBC0A6DD8BBAEC843A05 + +I=320 +KEY=C79B5CD424E592D392FECD3233CEA70B2C15EFBA7FD8C688F37DF9527BC6DBE5 +IV=BFF0C882B4F8684C6AA2A55FDD12072B +CT=5507F1EB271BDBC0A6DD8BBAEC843A05 +PT=BB10EF7C98DE0255C836D5319B94B166 + +I=321 +KEY=10ABC5B835E6E6BD02E90B63D22EF9E7970500C6E706C4DD3B4B2C63E0526A83 +IV=D730996C1103746E9017C651E1E05EEC +CT=BB10EF7C98DE0255C836D5319B94B166 +PT=E8B797AFDC378DB47F172260963A6E2C + +I=322 +KEY=75E05AAAB4E6981A20E4177D214B81EA7FB297693B314969445C0E03766804AF +IV=654B9F1281007EA7220D1C1EF365780D +CT=E8B797AFDC378DB47F172260963A6E2C +PT=58ED1CC5A208A0E7340167E79F5DA7C2 + +I=323 +KEY=A69FECC296D12216128BD1D2C48B373D275F8BAC9939E98E705D69E4E935A36D +IV=D37FB6682237BA0C326FC6AFE5C0B6D7 +CT=58ED1CC5A208A0E7340167E79F5DA7C2 +PT=FEDA5FB215819B441BE18B0AED27A1FD + +I=324 +KEY=7EED1776E603DD6C20F08B4C6B121525D985D41E8CB872CA6BBCE2EE04120290 +IV=D872FBB470D2FF7A327B5A9EAF992218 +CT=FEDA5FB215819B441BE18B0AED27A1FD +PT=7CD64E29A704F13688DB206F7F337685 + +I=325 +KEY=D4479A0AF29AF7145EC3FB89FEF8BBA7A5539A372BBC83FCE367C2817B217415 +IV=AAAA8D7C14992A787E3370C595EAAE82 +CT=7CD64E29A704F13688DB206F7F337685 +PT=25D6728244F28F79D1BC707BE94ECA13 + +I=326 +KEY=7FB45D09003B25EFEB5F68CCB7E09C008085E8B56F4E0C8532DBB2FA926FBE06 +IV=ABF3C703F2A1D2FBB59C9345491827A7 +CT=25D6728244F28F79D1BC707BE94ECA13 +PT=47AF03717893A10D7F40D5A3D9B82534 + +I=327 +KEY=35EE9428D4EC49EC103EDF32F4FBEE16C72AEBC417DDAD884D9B67594BD79B32 +IV=4A5AC921D4D76C03FB61B7FE431B7216 +CT=47AF03717893A10D7F40D5A3D9B82534 +PT=B6C25C0E4CA560707588321AAF41119C + +I=328 +KEY=B12C0149A6EDD2DC3742D10822FEDDF771E8B7CA5B78CDF838135543E4968AAE +IV=84C2956172019B30277C0E3AD60533E1 +CT=B6C25C0E4CA560707588321AAF41119C +PT=09137DF5460434E863647B4B50E17A60 + +I=329 +KEY=CFEC596CE216B14A955E7CBC095C198678FBCA3F1D7CF9105B772E08B477F0CE +IV=7EC0582544FB6396A21CADB42BA2C471 +CT=09137DF5460434E863647B4B50E17A60 +PT=17A26688B271E9765F41C71CD8CF0C25 + +I=330 +KEY=35903FF91CC199C048C6C031AA2F4FC96F59ACB7AF0D10660436E9146CB8FCEB +IV=FA7C6695FED7288ADD98BC8DA373564F +CT=17A26688B271E9765F41C71CD8CF0C25 +PT=62E3C4D53DECB83FCD5F57D1971D58FB + +I=331 +KEY=F262476804B79C1F85FEB875CCD5FC3E0DBA686292E1A859C969BEC5FBA5A410 +IV=C7F27891187605DFCD38784466FAB3F7 +CT=62E3C4D53DECB83FCD5F57D1971D58FB +PT=3495C5855D819B6FF779FC7AC59BEB53 + +I=332 +KEY=DC61E5CFC9BAE6B23B894486AD478ADD392FADE7CF6033363E1042BF3E3E4F43 +IV=2E03A2A7CD0D7AADBE77FCF3619276E3 +CT=3495C5855D819B6FF779FC7AC59BEB53 +PT=7440ABE9E1374208CFBCCC18ADC6089F + +I=333 +KEY=C9D2E747A1A6D594CCAE434B7605C8FB4D6F060E2E57713EF1AC8EA793F847DC +IV=15B30288681C3326F72707CDDB424226 +CT=7440ABE9E1374208CFBCCC18ADC6089F +PT=B6802F0F62A28AF7326CDB2144E8DE87 + +I=334 +KEY=99FEF610CFFFACBE8C6AD0A2B0C8F8A7FBEF29014CF5FBC9C3C05586D710995B +IV=502C11576E59792A40C493E9C6CD305C +CT=B6802F0F62A28AF7326CDB2144E8DE87 +PT=B84D7D91E60C131F6F042D403D85C47B + +I=335 +KEY=91EB2713A930B6A53993029D5A056B4143A25490AAF9E8D6ACC478C6EA955D20 +IV=0815D10366CF1A1BB5F9D23FEACD93E6 +CT=B84D7D91E60C131F6F042D403D85C47B +PT=4DDF64827A16F90B5E6B306E8F227DB7 + +I=336 +KEY=C15019D3523304CC9231B33C53C7FE1E0E7D3012D0EF11DDF2AF48A865B72097 +IV=50BB3EC0FB03B269ABA2B1A109C2955F +CT=4DDF64827A16F90B5E6B306E8F227DB7 +PT=FDF6E5B6486E11839EB3A7F5C3898F54 + +I=337 +KEY=E24B749901384F48B2E740C51175E311F38BD5A49881005E6C1CEF5DA63EAFC3 +IV=231B6D4A530B4B8420D6F3F942B21D0F +CT=FDF6E5B6486E11839EB3A7F5C3898F54 +PT=841EF37B4AF82CC5EB00E11775079D81 + +I=338 +KEY=44B7FFFA042DCA1BF276D4911D4B0BE2779526DFD2792C9B871C0E4AD3393242 +IV=A6FC8B6305158553409194540C3EE8F3 +CT=841EF37B4AF82CC5EB00E11775079D81 +PT=1725AF7F70B65FBB060D29B3BCDF0A31 + +I=339 +KEY=B724B2CD569E436B20594E10576934BF60B089A0A2CF7320811127F96FE63873 +IV=F3934D3752B38970D22F9A814A223F5D +CT=1725AF7F70B65FBB060D29B3BCDF0A31 +PT=2CCC6D09954E5FE6C6A87E18950EED02 + +I=340 +KEY=E9EB02E31CABD14DFF231F1F649294044C7CE4A937812CC647B959E1FAE8D571 +IV=5ECFB02E4A359226DF7A510F33FBA0BB +CT=2CCC6D09954E5FE6C6A87E18950EED02 +PT=C82C82AF68EACE2AF22C3266F898F573 + +I=341 +KEY=90C8F71B05BE122AFE5D58A7A1AAB666845066065F6BE2ECB5956B8702702002 +IV=7923F5F81915C367017E47B8C5382262 +CT=C82C82AF68EACE2AF22C3266F898F573 +PT=377F6966928959F2D68F3A2BD0EA3735 + +I=342 +KEY=1BE70B607CF9A9E35DF916C4CC103FEBB32F0F60CDE2BB1E631A51ACD29A1737 +IV=8B2FFC7B7947BBC9A3A44E636DBA898D +CT=377F6966928959F2D68F3A2BD0EA3735 +PT=3A8CCF4943B9866A9ABBEC0BA46F25DB + +I=343 +KEY=631B2C30FEA26433F0CBCD01B1CE974089A3C0298E5B3D74F9A1BDA776F532EC +IV=78FC2750825BCDD0AD32DBC57DDEA8AB +CT=3A8CCF4943B9866A9ABBEC0BA46F25DB +PT=3B767EAB7F0C2D24BBE5565E93DC3E24 + +I=344 +KEY=8785E70A8CD45A8FE1E4382DC62D563DB2D5BE82F15710504244EBF9E5290CC8 +IV=E49ECB3A72763EBC112FF52C77E3C17D +CT=3B767EAB7F0C2D24BBE5565E93DC3E24 +PT=619610C6A4A8E9B196E65D2E5D463968 + +I=345 +KEY=B49BAD1E8EB8B9CF7F32048A81E5BCD3D343AE4455FFF9E1D4A2B6D7B86F35A0 +IV=331E4A14026CE3409ED63CA747C8EAEE +CT=619610C6A4A8E9B196E65D2E5D463968 +PT=F12AF66580B33C3113C45CF5EFD52F4F + +I=346 +KEY=3C92453C6342B6CDC18BFE05241EB5D922695821D54CC5D0C766EA2257BA1AEF +IV=8809E822EDFA0F02BEB9FA8FA5FB090A +CT=F12AF66580B33C3113C45CF5EFD52F4F +PT=A427E0B2CD34285167999A9F18295D26 + +I=347 +KEY=24A1F21CA68CF23F1674BF5328219987864EB8931878ED81A0FF70BD4F9347C9 +IV=1833B720C5CE44F2D7FF41560C3F2C5E +CT=A427E0B2CD34285167999A9F18295D26 +PT=85F5855ACB2741070E1C89F904CBDBEA + +I=348 +KEY=B5479F4D4A0DBBFFBF86C576009F241403BB3DC9D35FAC86AEE3F9444B589C23 +IV=91E66D51EC8149C0A9F27A2528BEBD93 +CT=85F5855ACB2741070E1C89F904CBDBEA +PT=295D7A02348A185F5C54113C734E9003 + +I=349 +KEY=AA9CE82B0B649063C874699C71E8A94E2AE647CBE7D5B4D9F2B7E87838160C20 +IV=1FDB776641692B9C77F2ACEA71778D5A +CT=295D7A02348A185F5C54113C734E9003 +PT=E466F369B840296AAB1A24ED32A19F51 + +I=350 +KEY=A2BA72E2906E04C42C0047EF222FFFE6CE80B4A25F959DB359ADCC950AB79371 +IV=08269AC99B0A94A7E4742E7353C756A8 +CT=E466F369B840296AAB1A24ED32A19F51 +PT=099CEB8099DD025E4A57015168F75388 + +I=351 +KEY=EA9B425CCD937976EB04693F16C4DAC4C71C5F22C6489FED13FACDC46240C0F9 +IV=482130BE5DFD7DB2C7042ED034EB2522 +CT=099CEB8099DD025E4A57015168F75388 +PT=E40CD2C0A7E7CB35C64AEB396338A801 + +I=352 +KEY=D31BCE56BA19A7CB6057C5F2CCB3786223108DE261AF54D8D5B026FD017868F8 +IV=39808C0A778ADEBD8B53ACCDDA77A2A6 +CT=E40CD2C0A7E7CB35C64AEB396338A801 +PT=12E94732A52D15C624A8E554AB54C9A4 + +I=353 +KEY=F0CD039C509E0EFF71B18AE3FEEB186D31F9CAD0C482411EF118C3A9AA2CA15C +IV=23D6CDCAEA87A93411E64F113258600F +CT=12E94732A52D15C624A8E554AB54C9A4 +PT=241C32C2C0C5C6CBE4BB354C054C68D7 + +I=354 +KEY=0579BEABF73DD177C1F1F0827DA20BA115E5F812044787D515A3F6E5AF60C98B +IV=F5B4BD37A7A3DF88B0407A61834913CC +CT=241C32C2C0C5C6CBE4BB354C054C68D7 +PT=E4EA5643CF19EF64820A1B591DE1C378 + +I=355 +KEY=99C7C61F7153FFA0F07380D052431667F10FAE51CB5E68B197A9EDBCB2810AF3 +IV=9CBE78B4866E2ED7318270522FE11DC6 +CT=E4EA5643CF19EF64820A1B591DE1C378 +PT=BC86D5465171B667CE837F874D933FF4 + +I=356 +KEY=C2A65A0A2E71F6E7E2BD9FBB5049F7914D897B179A2FDED6592A923BFF123507 +IV=5B619C155F22094712CE1F6B020AE1F6 +CT=BC86D5465171B667CE837F874D933FF4 +PT=EEB9DC4EBD27720AD3527A1323D85413 + +I=357 +KEY=B635E7EFD987991CD29414B3EBAB2EA4A330A7592708ACDC8A78E828DCCA6114 +IV=7493BDE5F7F66FFB30298B08BBE2D935 +CT=EEB9DC4EBD27720AD3527A1323D85413 +PT=78591E006B877AC6880834E3F98FD6B0 + +I=358 +KEY=F5849125E52B6DF3CD8144DDB64178DDDB69B9594C8FD61A0270DCCB2545B7A4 +IV=43B176CA3CACF4EF1F15506E5DEA5679 +CT=78591E006B877AC6880834E3F98FD6B0 +PT=8F9A67CF96F4608D56923CB267855F3F + +I=359 +KEY=41885734A072249ADE0091A0AD87F47854F3DE96DA7BB69754E2E07942C0E89B +IV=B40CC611455949691381D57D1BC68CA5 +CT=8F9A67CF96F4608D56923CB267855F3F +PT=1B0B8D9118CBECBA2D5AD17A261F9D56 + +I=360 +KEY=FF1A5B86E3545D9CB01A1222EC99A81C4FF85307C2B05A2D79B8310364DF75CD +IV=BE920CB2432679066E1A8382411E5C64 +CT=1B0B8D9118CBECBA2D5AD17A261F9D56 +PT=6225E63F0C1A5DE00FD63032908A51F3 + +I=361 +KEY=836FB4DC9C17E5AD70404B41CC4A043E2DDDB538CEAA07CD766E0131F455243E +IV=7C75EF5A7F43B831C05A596320D3AC22 +CT=6225E63F0C1A5DE00FD63032908A51F3 +PT=7C66E540C016FB81A345E10331FCAFF3 + +I=362 +KEY=63CA7D0E2675E43626B5311A7BA7131B51BB50780EBCFC4CD52BE032C5A98BCD +IV=E0A5C9D2BA62019B56F57A5BB7ED1725 +CT=7C66E540C016FB81A345E10331FCAFF3 +PT=2F010053D3C59BB8ACB5B13B197A4204 + +I=363 +KEY=6B5C4A2DD70FFF3023B2A775BECF05607EBA502BDD7967F4799E5109DCD3C9C9 +IV=08963723F17A1B060507966FC568167B +CT=2F010053D3C59BB8ACB5B13B197A4204 +PT=8918E06B8619B43E859171A345E246AE + +I=364 +KEY=575661F811B8D8B50980A55848A48949F7A2B0405B60D3CAFC0F20AA99318F67 +IV=3C0A2BD5C6B727852A32022DF66B8C29 +CT=8918E06B8619B43E859171A345E246AE +PT=60FF920A8495AD880459737525C109D6 + +I=365 +KEY=5FACBE49DE8F64786918067E7E361681975D224ADFF57E42F85653DFBCF086B1 +IV=08FADFB1CF37BCCD6098A32636929FC8 +CT=60FF920A8495AD880459737525C109D6 +PT=03F09A2C18DB8BAE5CCC93B9165A1D16 + +I=366 +KEY=9BFDA5803AC1C3004F0B138885DE59FE94ADB866C72EF5ECA49AC066AAAA9BA7 +IV=C4511BC9E44EA778261315F6FBE84F7F +CT=03F09A2C18DB8BAE5CCC93B9165A1D16 +PT=52CB3AF36047F4D14C2EAEE3C3F8AF2A + +I=367 +KEY=614239035D7EF489DE2F88FDB6188EC3C6668295A769013DE8B46E856952348D +IV=FABF9C8367BF378991249B7533C6D73D +CT=52CB3AF36047F4D14C2EAEE3C3F8AF2A +PT=249794B3822BB06708B5D5777D297C40 + +I=368 +KEY=20BEFE90BA9C7EE9CFB1E569FE354258E2F116262542B15AE001BBF2147B48CD +IV=41FCC793E7E28A60119E6D94482DCC9B +CT=249794B3822BB06708B5D5777D297C40 +PT=1836AE59EAE452DAC108618DECD666BD + +I=369 +KEY=E11E8BF6DE253E4FBADEDFD44B34BE15FAC7B87FCFA6E3802109DA7FF8AD2E70 +IV=C1A0756664B940A6756F3ABDB501FC4D +CT=1836AE59EAE452DAC108618DECD666BD +PT=20EE84DEB0E7B0C83D74CE251AA1615C + +I=370 +KEY=D519038D457B4BCD9DD50C8F64FE2F2ADA293CA17F4153481C7D145AE20C4F2C +IV=3407887B9B5E7582270BD35B2FCA913F +CT=20EE84DEB0E7B0C83D74CE251AA1615C +PT=6FA7D3584A2E4B803AC1AC07B09931A2 + +I=371 +KEY=82F1611CFB9E7AF9F9274C6BF1B96BEBB58EEFF9356F18C826BCB85D52957E8E +IV=57E86291BEE5313464F240E4954744C1 +CT=6FA7D3584A2E4B803AC1AC07B09931A2 +PT=A7B8F8AC07BAB843F4E7942A6E4A85D5 + +I=372 +KEY=DFF5A6DE8ADE9AB78CF1E637F44FD3351236175532D5A08BD25B2C773CDFFB5B +IV=5D04C7C27140E04E75D6AA5C05F6B8DE +CT=A7B8F8AC07BAB843F4E7942A6E4A85D5 +PT=7F3C3702404E6E013474A0AA0EF85527 + +I=373 +KEY=9C6A11136F64F462E7C5CB30049CDA056D0A2057729BCE8AE62F8CDD3227AE7C +IV=439FB7CDE5BA6ED56B342D07F0D30930 +CT=7F3C3702404E6E013474A0AA0EF85527 +PT=7C0C44DC96872DEE0BAC71DDBDCC84E3 + +I=374 +KEY=2C95624ADD9B1E09F13AE579333B22BB1106648BE41CE364ED83FD008FEB2A9F +IV=B0FF7359B2FFEA6B16FF2E4937A7F8BE +CT=7C0C44DC96872DEE0BAC71DDBDCC84E3 +PT=B9E4597C562E9B5C0E6815E64F767CE9 + +I=375 +KEY=CBB3F14A21E49825990B89E7D07BC386A8E23DF7B2327838E3EBE8E6C09D5676 +IV=E7269300FC7F862C68316C9EE340E13D +CT=B9E4597C562E9B5C0E6815E64F767CE9 +PT=4B37A1FD978F50BE9EA482CFBEACFA08 + +I=376 +KEY=65B742FFD29D9B07F3956625AED7382EE3D59C0A25BD28867D4F6A297E31AC7E +IV=AE04B3B5F37903226A9EEFC27EACFBA8 +CT=4B37A1FD978F50BE9EA482CFBEACFA08 +PT=D3406B71FFC847C364199666A808C43A + +I=377 +KEY=6C6A4DE74AF6C443B4F6A1C7DAB4A28E3095F77BDA756F451956FC4FD6396844 +IV=09DD0F18986B5F444763C7E274639AA0 +CT=D3406B71FFC847C364199666A808C43A +PT=94744ECE39108CB8084DF8A17C49CDCC + +I=378 +KEY=AD09E82AFAA9F5168CD9B83F44C096A0A4E1B9B5E365E3FD111B04EEAA70A588 +IV=C163A5CDB05F3155382F19F89E74342E +CT=94744ECE39108CB8084DF8A17C49CDCC +PT=45EF43A20D7F174DA1463DDA678BBFFB + +I=379 +KEY=DC29CBF4E8B92311A9AA788C437A8EDDE10EFA17EE1AF4B0B05D3934CDFB1A73 +IV=712023DE1210D6072573C0B307BA187D +CT=45EF43A20D7F174DA1463DDA678BBFFB +PT=4480FB073AA197507E376C56B824C753 + +I=380 +KEY=93308B36D3A2E1A952B96FE4687B2DF9A58E0110D4BB63E0CE6A556275DFDD20 +IV=4F1940C23B1BC2B8FB1317682B01A324 +CT=4480FB073AA197507E376C56B824C753 +PT=C8BBB77D206EF37C7C40DB175D105271 + +I=381 +KEY=9682C995955D18471758C504201E93AC6D35B66DF4D5909CB22A8E7528CF8F51 +IV=05B242A346FFF9EE45E1AAE04865BE55 +CT=C8BBB77D206EF37C7C40DB175D105271 +PT=50C0B9001C716D53470FC9B011191402 + +I=382 +KEY=60854B33BE79B0E631B1AF9046C46D153DF50F6DE8A4FDCFF52547C539D69B53 +IV=F60782A62B24A8A126E96A9466DAFEB9 +CT=50C0B9001C716D53470FC9B011191402 +PT=8DB5367A34C5E5B93486AB07CA8BB02E + +I=383 +KEY=7EE74E63D01F31D44B3860471B0BE50FB0403917DC611876C1A3ECC2F35D2B7D +IV=1E6205506E6681327A89CFD75DCF881A +CT=8DB5367A34C5E5B93486AB07CA8BB02E +PT=4F9B922C88C1750829D9088F16EDB529 + +I=384 +KEY=A65EE6CE576182F487D2C21C4F8539F3FFDBAB3B54A06D7EE87AE44DE5B09E54 +IV=D8B9A8AD877EB320CCEAA25B548EDCFC +CT=4F9B922C88C1750829D9088F16EDB529 +PT=05A705F6B55D3ACF3E95E8264FEFFDCC + +I=385 +KEY=64F9A7DF5DA898C968746F96692F1892FA7CAECDE1FD57B1D6EF0C6BAA5F6398 +IV=C2A741110AC91A3DEFA6AD8A26AA2161 +CT=05A705F6B55D3ACF3E95E8264FEFFDCC +PT=D1FB7C1A698990AC81068D08BE1CE91F + +I=386 +KEY=019663655974433AD5731BC4388A067D2B87D2D78874C71D57E9816314438A87 +IV=656FC4BA04DCDBF3BD07745251A51EEF +CT=D1FB7C1A698990AC81068D08BE1CE91F +PT=A1CD24AAFCEE3A60A025B983D10D8E54 + +I=387 +KEY=16EF87A84F0627345CED6385A62374778A4AF67D749AFD7DF7CC38E0C54E04D3 +IV=1779E4CD1672640E899E78419EA9720A +CT=A1CD24AAFCEE3A60A025B983D10D8E54 +PT=B9064D063D2C8D8D935B53CBEF3224E2 + +I=388 +KEY=80931C61E23BA976FFC9288F74AD876D334CBB7B49B670F064976B2B2A7C2031 +IV=967C9BC9AD3D8E42A3244B0AD28EF31A +CT=B9064D063D2C8D8D935B53CBEF3224E2 +PT=8AD3B2222D84A4B25DC1311378027207 + +I=389 +KEY=227ACE0315678DEE433049D8CDFEE2D8B99F09596432D44239565A38527E5236 +IV=A2E9D262F75C2498BCF96157B95365B5 +CT=8AD3B2222D84A4B25DC1311378027207 +PT=3A7FC9D43F1F997FAF4931101C5B5FD4 + +I=390 +KEY=11799A22D50C53A89EDF396B7C7565AD83E0C08D5B2D4D3D961F6B284E250DE2 +IV=33035421C06BDE46DDEF70B3B18B8775 +CT=3A7FC9D43F1F997FAF4931101C5B5FD4 +PT=930860056FE2FDDC10059D09385C0415 + +I=391 +KEY=58DE85D9975D5F8A16C47C834568EF1D10E8A08834CFB0E1861AF621767909F7 +IV=49A71FFB42510C22881B45E8391D8AB0 +CT=930860056FE2FDDC10059D09385C0415 +PT=F41CCB823840FF7D16C6990A14E591D9 + +I=392 +KEY=3C8567CD05AF33761FE05FBDC2596EBFE4F46B0A0C8F4F9C90DC6F2B629C982E +IV=645BE21492F26CFC0924233E873181A2 +CT=F41CCB823840FF7D16C6990A14E591D9 +PT=82899B698456363C175791B845D5736F + +I=393 +KEY=F50F05CBDDFEBE7A656EE5C08CC24FF5667DF06388D979A0878BFE932749EB41 +IV=C98A6206D8518D0C7A8EBA7D4E9B214A +CT=82899B698456363C175791B845D5736F +PT=CF85BFDA1DFF5ADFFAF1B3E000B407F3 + +I=394 +KEY=B44AA91A374D1C5A7BD00557CBD24962A9F84FB99526237F7D7A4D7327FDECB2 +IV=4145ACD1EAB3A2201EBEE09747100697 +CT=CF85BFDA1DFF5ADFFAF1B3E000B407F3 +PT=34EEA75CC20C6EDEE9A5379C3B5CF01A + +I=395 +KEY=4C401127C0AFABBEA4C93FD80BA009CC9D16E8E5572A4DA194DF7AEF1CA11CA8 +IV=F80AB83DF7E2B7E4DF193A8FC07240AE +CT=34EEA75CC20C6EDEE9A5379C3B5CF01A +PT=27C6392ABE790B448CC9216B3FCF5454 + +I=396 +KEY=44D59CB8EBCC91362462D1D8FE193270BAD0D1CFE95346E518165B84236E48FC +IV=08958D9F2B633A8880ABEE00F5B93BBC +CT=27C6392ABE790B448CC9216B3FCF5454 +PT=2C39AC10C7D51B61D8F437D9BAA24A55 + +I=397 +KEY=E42795DA2BF8FA7A3B0E83923A5E243196E97DDF2E865D84C0E26C5D99CC02A9 +IV=A0F20962C0346B4C1F6C524AC4471641 +CT=2C39AC10C7D51B61D8F437D9BAA24A55 +PT=F828BC735827C106E61F8FFFE9453A77 + +I=398 +KEY=7F05DC0CD80178018D3A90E4A0CE63156EC1C1AC76A19C8226FDE3A2708938DE +IV=9B2249D6F3F9827BB63413769A904724 +CT=F828BC735827C106E61F8FFFE9453A77 +PT=DF8129A79852FEE2A8015A2379A7215B + +I=399 +KEY=935560C6072D897477D71AC4C12188D0B140E80BEEF362608EFCB981092E1985 +IV=EC50BCCADF2CF175FAED8A2061EFEBC5 +CT=DF8129A79852FEE2A8015A2379A7215B +PT=CD6429CF3F81F8B4F82BC627A8283096 + =========== \ No newline at end of file --- krb5-1.4.4.orig/src/lib/crypto/aes/test/ecb_iv.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/ecb_iv.txt @@ -1,123 +1,123 @@ - -========================= - -FILENAME: "ecb_iv.txt" - -Electronic Codebook (ECB) Mode -Intermediate Value Known Answer Tests - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========== - -KEYSIZE=128 -KEY=000102030405060708090A0B0C0D0E0F - -Intermediate Ciphertext Values (Encryption) - -PT=000102030405060708090A0B0C0D0E0F -CT1=B5C9179EB1CC1199B9C51B92B5C8159D -CT2=2B65F6374C427C5B2FE3A9256896755B -CT3=D1015FCBB4EF65679688462076B9D6AD -CT4=8E17064A2A35A183729FE59FF3A591F1 -CT5=D7557DD55999DB3259E2183D558DCDD2 -CT6=73A96A5D7799A5F3111D2B63684B1F7F -CT7=1B6B853069EEFC749AFEFD7B57A04CD1 -CT8=107EEADFB6F77933B5457A6F08F046B2 -CT9=8EC166481A677AA96A14FF6ECE88C010 -CT=0A940BB5416EF045F1C39458C653EA5A - -Intermediate Ciphertext Values (Decryption) - -CT=0A940BB5416EF045F1C39458C653EA5A -PT1=8EC166481A677AA96A14FF6ECE88C010 -PT2=107EEADFB6F77933B5457A6F08F046B2 -PT3=1B6B853069EEFC749AFEFD7B57A04CD1 -PT4=73A96A5D7799A5F3111D2B63684B1F7F -PT5=D7557DD55999DB3259E2183D558DCDD2 -PT6=8E17064A2A35A183729FE59FF3A591F1 -PT7=D1015FCBB4EF65679688462076B9D6AD -PT8=2B65F6374C427C5B2FE3A9256896755B -PT9=B5C9179EB1CC1199B9C51B92B5C8159D -PT=000102030405060708090A0B0C0D0E0F - -========== - -KEYSIZE=192 -KEY=000102030405060708090A0B0C0D0E0F1011121314151617 - -Intermediate Ciphertext Values (Encryption) - -PT=000102030405060708090A0B0C0D0E0F -CT1=73727170777675743B25919A3F20979D -CT2=C673B27A311EC2EB64AD47FF53B233D7 -CT3=0B5CC6BA34C807E6496D79B46826A1E8 -CT4=005B53A5B660E280307883487E4D1A4D -CT5=88A105F0DDD45F3674DBC3DE1A211B03 -CT6=EB5CD8B5FD8A3F33F03A70FB5C620C06 -CT7=909913B09BD2CC5A70B6C647931F0A1F -CT8=6EB6CA10E395AFD646B02C5E9E745A9F -CT9=2CFD2FC41AF82B8DFB80E9BD1C989ECE -CT10=31C5D5E27EAF073E5C21ADAAEAA969D4 -CT11=1DB94956A7268B0DE963D27E55868580 -CT=0060BFFE46834BB8DA5CF9A61FF220AE - -Intermediate Ciphertext Values (Decryption) - -CT=0060BFFE46834BB8DA5CF9A61FF220AE -PT1=1DB94956A7268B0DE963D27E55868580 -PT2=31C5D5E27EAF073E5C21ADAAEAA969D4 -PT3=2CFD2FC41AF82B8DFB80E9BD1C989ECE -PT4=6EB6CA10E395AFD646B02C5E9E745A9F -PT5=909913B09BD2CC5A70B6C647931F0A1F -PT6=EB5CD8B5FD8A3F33F03A70FB5C620C06 -PT7=88A105F0DDD45F3674DBC3DE1A211B03 -PT8=005B53A5B660E280307883487E4D1A4D -PT9=0B5CC6BA34C807E6496D79B46826A1E8 -PT10=C673B27A311EC2EB64AD47FF53B233D7 -PT11=73727170777675743B25919A3F20979D -PT=000102030405060708090A0B0C0D0E0F - -========== - -KEYSIZE=256 -KEY=000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F - -Intermediate Ciphertext Values (Encryption) - -PT=000102030405060708090A0B0C0D0E0F -CT1=73727170777675747B7A79787F7E7D7C -CT2=4E5D32BB8B67FD1BD4CFEC9FFB20AC4F -CT3=96A212E486341549C4AAF7C843F0277A -CT4=0F45F284CDD0CB16E3EA81ECC891A4E1 -CT5=E59BFC458A89063E0137BBE6DB63A058 -CT6=1D958D960EA3143383C17D5CD87BA327 -CT7=43843EF40D9219481935B77A586DB5DE -CT8=5AA5ABADBC40230CBA6124E9FAEEEFB5 -CT9=DAD61937BDFD582927F14C990C5FC761 -CT10=E8A48C5DEE5C0792AB6DFFF5B038529D -CT11=4B71E5A8BFB4E9A5312A18119E68E829 -CT12=DCBA75CEE6589DDC0D289A172E8415B5 -CT13=8A0E856B2074C1093104131D0628BFE8 -CT=5A6E045708FB7196F02E553D02C3A692 - -Intermediate Ciphertext Values (Decryption) - -CT=5A6E045708FB7196F02E553D02C3A692 -PT1=8A0E856B2074C1093104131D0628BFE8 -PT2=DCBA75CEE6589DDC0D289A172E8415B5 -PT3=4B71E5A8BFB4E9A5312A18119E68E829 -PT4=E8A48C5DEE5C0792AB6DFFF5B038529D -PT5=DAD61937BDFD582927F14C990C5FC761 -PT6=5AA5ABADBC40230CBA6124E9FAEEEFB5 -PT7=43843EF40D9219481935B77A586DB5DE -PT8=1D958D960EA3143383C17D5CD87BA327 -PT9=E59BFC458A89063E0137BBE6DB63A058 -PT10=0F45F284CDD0CB16E3EA81ECC891A4E1 -PT11=96A212E486341549C4AAF7C843F0277A -PT12=4E5D32BB8B67FD1BD4CFEC9FFB20AC4F -PT13=73727170777675747B7A79787F7E7D7C -PT=000102030405060708090A0B0C0D0E0F - + +========================= + +FILENAME: "ecb_iv.txt" + +Electronic Codebook (ECB) Mode +Intermediate Value Known Answer Tests + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========== + +KEYSIZE=128 +KEY=000102030405060708090A0B0C0D0E0F + +Intermediate Ciphertext Values (Encryption) + +PT=000102030405060708090A0B0C0D0E0F +CT1=B5C9179EB1CC1199B9C51B92B5C8159D +CT2=2B65F6374C427C5B2FE3A9256896755B +CT3=D1015FCBB4EF65679688462076B9D6AD +CT4=8E17064A2A35A183729FE59FF3A591F1 +CT5=D7557DD55999DB3259E2183D558DCDD2 +CT6=73A96A5D7799A5F3111D2B63684B1F7F +CT7=1B6B853069EEFC749AFEFD7B57A04CD1 +CT8=107EEADFB6F77933B5457A6F08F046B2 +CT9=8EC166481A677AA96A14FF6ECE88C010 +CT=0A940BB5416EF045F1C39458C653EA5A + +Intermediate Ciphertext Values (Decryption) + +CT=0A940BB5416EF045F1C39458C653EA5A +PT1=8EC166481A677AA96A14FF6ECE88C010 +PT2=107EEADFB6F77933B5457A6F08F046B2 +PT3=1B6B853069EEFC749AFEFD7B57A04CD1 +PT4=73A96A5D7799A5F3111D2B63684B1F7F +PT5=D7557DD55999DB3259E2183D558DCDD2 +PT6=8E17064A2A35A183729FE59FF3A591F1 +PT7=D1015FCBB4EF65679688462076B9D6AD +PT8=2B65F6374C427C5B2FE3A9256896755B +PT9=B5C9179EB1CC1199B9C51B92B5C8159D +PT=000102030405060708090A0B0C0D0E0F + +========== + +KEYSIZE=192 +KEY=000102030405060708090A0B0C0D0E0F1011121314151617 + +Intermediate Ciphertext Values (Encryption) + +PT=000102030405060708090A0B0C0D0E0F +CT1=73727170777675743B25919A3F20979D +CT2=C673B27A311EC2EB64AD47FF53B233D7 +CT3=0B5CC6BA34C807E6496D79B46826A1E8 +CT4=005B53A5B660E280307883487E4D1A4D +CT5=88A105F0DDD45F3674DBC3DE1A211B03 +CT6=EB5CD8B5FD8A3F33F03A70FB5C620C06 +CT7=909913B09BD2CC5A70B6C647931F0A1F +CT8=6EB6CA10E395AFD646B02C5E9E745A9F +CT9=2CFD2FC41AF82B8DFB80E9BD1C989ECE +CT10=31C5D5E27EAF073E5C21ADAAEAA969D4 +CT11=1DB94956A7268B0DE963D27E55868580 +CT=0060BFFE46834BB8DA5CF9A61FF220AE + +Intermediate Ciphertext Values (Decryption) + +CT=0060BFFE46834BB8DA5CF9A61FF220AE +PT1=1DB94956A7268B0DE963D27E55868580 +PT2=31C5D5E27EAF073E5C21ADAAEAA969D4 +PT3=2CFD2FC41AF82B8DFB80E9BD1C989ECE +PT4=6EB6CA10E395AFD646B02C5E9E745A9F +PT5=909913B09BD2CC5A70B6C647931F0A1F +PT6=EB5CD8B5FD8A3F33F03A70FB5C620C06 +PT7=88A105F0DDD45F3674DBC3DE1A211B03 +PT8=005B53A5B660E280307883487E4D1A4D +PT9=0B5CC6BA34C807E6496D79B46826A1E8 +PT10=C673B27A311EC2EB64AD47FF53B233D7 +PT11=73727170777675743B25919A3F20979D +PT=000102030405060708090A0B0C0D0E0F + +========== + +KEYSIZE=256 +KEY=000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F + +Intermediate Ciphertext Values (Encryption) + +PT=000102030405060708090A0B0C0D0E0F +CT1=73727170777675747B7A79787F7E7D7C +CT2=4E5D32BB8B67FD1BD4CFEC9FFB20AC4F +CT3=96A212E486341549C4AAF7C843F0277A +CT4=0F45F284CDD0CB16E3EA81ECC891A4E1 +CT5=E59BFC458A89063E0137BBE6DB63A058 +CT6=1D958D960EA3143383C17D5CD87BA327 +CT7=43843EF40D9219481935B77A586DB5DE +CT8=5AA5ABADBC40230CBA6124E9FAEEEFB5 +CT9=DAD61937BDFD582927F14C990C5FC761 +CT10=E8A48C5DEE5C0792AB6DFFF5B038529D +CT11=4B71E5A8BFB4E9A5312A18119E68E829 +CT12=DCBA75CEE6589DDC0D289A172E8415B5 +CT13=8A0E856B2074C1093104131D0628BFE8 +CT=5A6E045708FB7196F02E553D02C3A692 + +Intermediate Ciphertext Values (Decryption) + +CT=5A6E045708FB7196F02E553D02C3A692 +PT1=8A0E856B2074C1093104131D0628BFE8 +PT2=DCBA75CEE6589DDC0D289A172E8415B5 +PT3=4B71E5A8BFB4E9A5312A18119E68E829 +PT4=E8A48C5DEE5C0792AB6DFFF5B038529D +PT5=DAD61937BDFD582927F14C990C5FC761 +PT6=5AA5ABADBC40230CBA6124E9FAEEEFB5 +PT7=43843EF40D9219481935B77A586DB5DE +PT8=1D958D960EA3143383C17D5CD87BA327 +PT9=E59BFC458A89063E0137BBE6DB63A058 +PT10=0F45F284CDD0CB16E3EA81ECC891A4E1 +PT11=96A212E486341549C4AAF7C843F0277A +PT12=4E5D32BB8B67FD1BD4CFEC9FFB20AC4F +PT13=73727170777675747B7A79787F7E7D7C +PT=000102030405060708090A0B0C0D0E0F + ========== \ No newline at end of file --- krb5-1.4.4.orig/src/lib/crypto/aes/test/ecb_vt.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/ecb_vt.txt @@ -1,1566 +1,1566 @@ - -========================= - -FILENAME: "ecb_vt.txt" - -Electronic Codebook (ECB) Mode -Variable Text Known Answer Tests - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========== - -KEYSIZE=128 - -KEY=00000000000000000000000000000000 - -I=1 -PT=80000000000000000000000000000000 -CT=3AD78E726C1EC02B7EBFE92B23D9EC34 - -I=2 -PT=40000000000000000000000000000000 -CT=45BC707D29E8204D88DFBA2F0B0CAD9B - -I=3 -PT=20000000000000000000000000000000 -CT=161556838018F52805CDBD6202002E3F - -I=4 -PT=10000000000000000000000000000000 -CT=F5569B3AB6A6D11EFDE1BF0A64C6854A - -I=5 -PT=08000000000000000000000000000000 -CT=64E82B50E501FBD7DD4116921159B83E - -I=6 -PT=04000000000000000000000000000000 -CT=BAAC12FB613A7DE11450375C74034041 - -I=7 -PT=02000000000000000000000000000000 -CT=BCF176A7EAAD8085EBACEA362462A281 - -I=8 -PT=01000000000000000000000000000000 -CT=47711816E91D6FF059BBBF2BF58E0FD3 - -I=9 -PT=00800000000000000000000000000000 -CT=B970DFBE40698AF1638FE38BD3DF3B2F - -I=10 -PT=00400000000000000000000000000000 -CT=F95B59A44F391E14CF20B74BDC32FCFF - -I=11 -PT=00200000000000000000000000000000 -CT=720F74AE04A2A435B9A7256E49378F5B - -I=12 -PT=00100000000000000000000000000000 -CT=2A0445F61D36BFA7E277070730CF76DA - -I=13 -PT=00080000000000000000000000000000 -CT=8D0536B997AEFEC1D94011BAB6699A03 - -I=14 -PT=00040000000000000000000000000000 -CT=674F002E19F6ED47EFF319E51FAD4498 - -I=15 -PT=00020000000000000000000000000000 -CT=292C02C5CB9163C80AC0F6CF1DD8E92D - -I=16 -PT=00010000000000000000000000000000 -CT=FA321CF18EF5FE727DD82A5C1E945141 - -I=17 -PT=00008000000000000000000000000000 -CT=A5A7AFE1034C39CCCEBE3C584BC0BE05 - -I=18 -PT=00004000000000000000000000000000 -CT=4FF5A52E697E77D081205DBDB21CEA39 - -I=19 -PT=00002000000000000000000000000000 -CT=209E88DC94C9003000CE0769AF7B7166 - -I=20 -PT=00001000000000000000000000000000 -CT=5DEE41AF864CB4B650E5F51551824D38 - -I=21 -PT=00000800000000000000000000000000 -CT=A79A63FA7E4503AE6D6E09F5F9053030 - -I=22 -PT=00000400000000000000000000000000 -CT=A48316749FAE7FAC7002031A6AFD8BA7 - -I=23 -PT=00000200000000000000000000000000 -CT=D6EEE8A7357A0E1D64262CA9C337AC42 - -I=24 -PT=00000100000000000000000000000000 -CT=B013CA8A62A858053E9FB667ED39829E - -I=25 -PT=00000080000000000000000000000000 -CT=DF6EA9E4538A45A52D5C1A43C88F4B55 - -I=26 -PT=00000040000000000000000000000000 -CT=7D03BA451371591D3FD5547D9165C73B - -I=27 -PT=00000020000000000000000000000000 -CT=0E0426281A6277E186499D365D5F49FF - -I=28 -PT=00000010000000000000000000000000 -CT=DBC02169DD2059E6CC4C57C1FEDF5AB4 - -I=29 -PT=00000008000000000000000000000000 -CT=826590E05D167DA6F00DCC75E22788EB - -I=30 -PT=00000004000000000000000000000000 -CT=34A73F21A04421D9786335FAAB49423A - -I=31 -PT=00000002000000000000000000000000 -CT=ED347D0E0128EE1A7392A1D36AB78AA9 - -I=32 -PT=00000001000000000000000000000000 -CT=EE944B2FE6E9FC888042608DA9615F75 - -I=33 -PT=00000000800000000000000000000000 -CT=9E7C85A909EF7218BA7947CFB4718F46 - -I=34 -PT=00000000400000000000000000000000 -CT=811AE07A0B2B1F816587FA73699AE77D - -I=35 -PT=00000000200000000000000000000000 -CT=68466FBF43C2FE13D4B18F7EC5EA745F - -I=36 -PT=00000000100000000000000000000000 -CT=D20B015C7191B219780956E6101F9354 - -I=37 -PT=00000000080000000000000000000000 -CT=5939D5C1BBF54EE1B3E326D757BDDE25 - -I=38 -PT=00000000040000000000000000000000 -CT=B1FDAFE9A0240E8FFEA19CE94B5105D3 - -I=39 -PT=00000000020000000000000000000000 -CT=D62962ECE02CDD68C06BDFEFB2F9495B - -I=40 -PT=00000000010000000000000000000000 -CT=B3BB2DE6F3C26587BA8BAC4F7AD9499A - -I=41 -PT=00000000008000000000000000000000 -CT=E0B1072D6D9FF703D6FBEF77852B0A6B - -I=42 -PT=00000000004000000000000000000000 -CT=D8DD51C907F478DE0228E83E61FD1758 - -I=43 -PT=00000000002000000000000000000000 -CT=A42DFFE6E7C1671C06A25236FDD10017 - -I=44 -PT=00000000001000000000000000000000 -CT=25ACF141550BFAB9EF451B6C6A5B2163 - -I=45 -PT=00000000000800000000000000000000 -CT=4DA7FCA3949B16E821DBC84F19581018 - -I=46 -PT=00000000000400000000000000000000 -CT=7D49B6347CBCC8919C7FA96A37A7A215 - -I=47 -PT=00000000000200000000000000000000 -CT=900024B29A08C6721B95BA3B753DDB4D - -I=48 -PT=00000000000100000000000000000000 -CT=6D2182FB283B6934D90BA7848CAB5E66 - -I=49 -PT=00000000000080000000000000000000 -CT=F73EF01B448D23A4D90DE8B2F9666E7A - -I=50 -PT=00000000000040000000000000000000 -CT=4AD9CDA2418643E9A3D926AF5E6B0412 - -I=51 -PT=00000000000020000000000000000000 -CT=7CAEC8E7E5953997D545B033201C8C5B - -I=52 -PT=00000000000010000000000000000000 -CT=3C43CA1F6B6864503E27B48D88230CF5 - -I=53 -PT=00000000000008000000000000000000 -CT=44F779B93108FE9FEEC880D79BA74488 - -I=54 -PT=00000000000004000000000000000000 -CT=9E50E8D9CFD3A682A78E527C9072A1CF - -I=55 -PT=00000000000002000000000000000000 -CT=68D000CBC838BBE3C505D6F814C01F28 - -I=56 -PT=00000000000001000000000000000000 -CT=2CB2A9FEC1ACD1D9B0FA05205E304F57 - -I=57 -PT=00000000000000800000000000000000 -CT=01EB2806606E46444520A5CC6180CD4B - -I=58 -PT=00000000000000400000000000000000 -CT=DAA9B25168CC702326F217F1A0C0B162 - -I=59 -PT=00000000000000200000000000000000 -CT=3E07E648975D9578D03555B1755807ED - -I=60 -PT=00000000000000100000000000000000 -CT=0B45F52E802C8B8DE09579425B80B711 - -I=61 -PT=00000000000000080000000000000000 -CT=659595DA0B68F6DF0DD6CA77202986E1 - -I=62 -PT=00000000000000040000000000000000 -CT=05FF42873893536E58C8FA98A45C73C4 - -I=63 -PT=00000000000000020000000000000000 -CT=B5B03421DE8BBFFC4EADEC767339A9BD - -I=64 -PT=00000000000000010000000000000000 -CT=788BCD111ECF73D4E78D2E21BEF55460 - -I=65 -PT=00000000000000008000000000000000 -CT=909CD9EC6790359F982DC6F2393D5315 - -I=66 -PT=00000000000000004000000000000000 -CT=332950F361535FF24EFAC8C76293F12C - -I=67 -PT=00000000000000002000000000000000 -CT=A68CCD4E330FFDA9D576DA436DB53D75 - -I=68 -PT=00000000000000001000000000000000 -CT=27C8A1CCFDB0B015D1ED5B3E77143791 - -I=69 -PT=00000000000000000800000000000000 -CT=D76A4B95887A77DF610DD3E1D3B20325 - -I=70 -PT=00000000000000000400000000000000 -CT=C068AB0DE71C66DAE83C361EF4B2D989 - -I=71 -PT=00000000000000000200000000000000 -CT=C2120BCD49EDA9A288B3B4BE79AC8158 - -I=72 -PT=00000000000000000100000000000000 -CT=0C546F62BF2773CD0F564FCECA7BA688 - -I=73 -PT=00000000000000000080000000000000 -CT=18F3462BEDE4920213CCB66DAB1640AA - -I=74 -PT=00000000000000000040000000000000 -CT=FE42F245EDD0E24B216AEBD8B392D690 - -I=75 -PT=00000000000000000020000000000000 -CT=3D3EEBC8D3D1558A194C2D00C337FF2B - -I=76 -PT=00000000000000000010000000000000 -CT=29AAEDF043E785DB42836F79BE6CBA28 - -I=77 -PT=00000000000000000008000000000000 -CT=215F90C6744E2944358E78619159A611 - -I=78 -PT=00000000000000000004000000000000 -CT=8606B1AA9E1D548E5442B06551E2C6DC - -I=79 -PT=00000000000000000002000000000000 -CT=987BB4B8740EC0EDE7FEA97DF033B5B1 - -I=80 -PT=00000000000000000001000000000000 -CT=C0A3500DA5B0AE07D2F450930BEEDF1B - -I=81 -PT=00000000000000000000800000000000 -CT=525FDF8312FE8F32C781481A8DAAAE37 - -I=82 -PT=00000000000000000000400000000000 -CT=BFD2C56AE5FB9C9DE33A6944572A6487 - -I=83 -PT=00000000000000000000200000000000 -CT=7975A57A425CDF5AA1FA929101F650B0 - -I=84 -PT=00000000000000000000100000000000 -CT=BF174BC49609A8709B2CD8366DAA79FE - -I=85 -PT=00000000000000000000080000000000 -CT=06C50C43222F56C874B1704E9F44BF7D - -I=86 -PT=00000000000000000000040000000000 -CT=0CEC48CD34043EA29CA3B8ED5278721E - -I=87 -PT=00000000000000000000020000000000 -CT=9548EA34A1560197B304D0ACB8A1698D - -I=88 -PT=00000000000000000000010000000000 -CT=22F9E9B1BD73B6B5B7D3062C986272F3 - -I=89 -PT=00000000000000000000008000000000 -CT=FEE8E934BD0873295059002230E298D4 - -I=90 -PT=00000000000000000000004000000000 -CT=1B08E2E3EB820D139CB4ABBDBE81D00D - -I=91 -PT=00000000000000000000002000000000 -CT=0021177681E4D90CEAF69DCED0145125 - -I=92 -PT=00000000000000000000001000000000 -CT=4A8E314452CA8A8A3619FC54BC423643 - -I=93 -PT=00000000000000000000000800000000 -CT=65047474F7222C94C6965425FF1BFD0A - -I=94 -PT=00000000000000000000000400000000 -CT=E123F551A9C4A8489622B16F961A9AA4 - -I=95 -PT=00000000000000000000000200000000 -CT=EF05530948B80915028BB2B6FE429380 - -I=96 -PT=00000000000000000000000100000000 -CT=72535B7FE0F0F777CEDCD55CD77E2DDF - -I=97 -PT=00000000000000000000000080000000 -CT=3423D8EFC31FA2F4C365C77D8F3B5C63 - -I=98 -PT=00000000000000000000000040000000 -CT=DE0E51C264663F3C5DBC59580A98D8E4 - -I=99 -PT=00000000000000000000000020000000 -CT=B2D9391166680947AB09264156719679 - -I=100 -PT=00000000000000000000000010000000 -CT=10DB79F23B06D263835C424AF749ADB7 - -I=101 -PT=00000000000000000000000008000000 -CT=DDF72D27E6B01EC107EA3E005B59563B - -I=102 -PT=00000000000000000000000004000000 -CT=8266B57485A5954A4236751DE07F6694 - -I=103 -PT=00000000000000000000000002000000 -CT=669A501E1F1ADE6E5523DE01D6DBC987 - -I=104 -PT=00000000000000000000000001000000 -CT=C20C48F2989725D461D1DB589DC0896E - -I=105 -PT=00000000000000000000000000800000 -CT=DE35158E7810ED1191825D2AA98FA97D - -I=106 -PT=00000000000000000000000000400000 -CT=4FE294F2C0F34D0671B693A237EBDDC8 - -I=107 -PT=00000000000000000000000000200000 -CT=087AE74B10CCBFDF6739FEB9559C01A4 - -I=108 -PT=00000000000000000000000000100000 -CT=5DC278970B7DEF77A5536C77AB59C207 - -I=109 -PT=00000000000000000000000000080000 -CT=7607F078C77085184EAA9B060C1FBFFF - -I=110 -PT=00000000000000000000000000040000 -CT=9DB841531BCBE7998DAD19993FB3CC00 - -I=111 -PT=00000000000000000000000000020000 -CT=D6A089B654854A94560BAE13298835B8 - -I=112 -PT=00000000000000000000000000010000 -CT=E1E223C4CF90CC5D195B370D65114622 - -I=113 -PT=00000000000000000000000000008000 -CT=1CBED73C50D053BDAD372CEEE54836A1 - -I=114 -PT=00000000000000000000000000004000 -CT=D309E69376D257ADF2BFDA152B26555F - -I=115 -PT=00000000000000000000000000002000 -CT=740F7649117F0DEE6EAA7789A9994C36 - -I=116 -PT=00000000000000000000000000001000 -CT=76AE64417C297184D668C5FD908B3CE5 - -I=117 -PT=00000000000000000000000000000800 -CT=6095FEA4AA8035591F1787A819C48787 - -I=118 -PT=00000000000000000000000000000400 -CT=D1FF4E7ACD1C79967FEBAB0F7465D450 - -I=119 -PT=00000000000000000000000000000200 -CT=5F5AD3C42B9489557BB63BF49ECF5F8A - -I=120 -PT=00000000000000000000000000000100 -CT=FB56CC09B680B1D07C5A52149E29F07C - -I=121 -PT=00000000000000000000000000000080 -CT=FF49B8DF4A97CBE03833E66197620DAD - -I=122 -PT=00000000000000000000000000000040 -CT=5E070ADE533D2E090ED0F5BE13BC0983 - -I=123 -PT=00000000000000000000000000000020 -CT=3AB4FB1D2B7BA376590A2C241D1F508D - -I=124 -PT=00000000000000000000000000000010 -CT=58B2431BC0BEDE02550F40238969EC78 - -I=125 -PT=00000000000000000000000000000008 -CT=0253786E126504F0DAB90C48A30321DE - -I=126 -PT=00000000000000000000000000000004 -CT=200211214E7394DA2089B6ACD093ABE0 - -I=127 -PT=00000000000000000000000000000002 -CT=0388DACE60B6A392F328C2B971B2FE78 - -I=128 -PT=00000000000000000000000000000001 -CT=58E2FCCEFA7E3061367F1D57A4E7455A - -========== - -KEYSIZE=192 - -KEY=000000000000000000000000000000000000000000000000 - -I=1 -PT=80000000000000000000000000000000 -CT=6CD02513E8D4DC986B4AFE087A60BD0C - -I=2 -PT=40000000000000000000000000000000 -CT=423D2772A0CA56DAABB48D2129062987 - -I=3 -PT=20000000000000000000000000000000 -CT=1021F2A8DA70EB2219DC16804445FF98 - -I=4 -PT=10000000000000000000000000000000 -CT=C636E35B402577F96974D8804295EBB8 - -I=5 -PT=08000000000000000000000000000000 -CT=1566D2E57E8393C19E29F892EA28A9A7 - -I=6 -PT=04000000000000000000000000000000 -CT=883C878FED70B36CC09D040F9619DD19 - -I=7 -PT=02000000000000000000000000000000 -CT=06734593A974965790E715594FC34AA9 - -I=8 -PT=01000000000000000000000000000000 -CT=F19B389948D9A45534E5BD36C984134A - -I=9 -PT=00800000000000000000000000000000 -CT=D8410DFC14FA6D175EC968EA8CAC514C - -I=10 -PT=00400000000000000000000000000000 -CT=7E6C6EBB4029A177CF7B2FDD9AC6BB7A - -I=11 -PT=00200000000000000000000000000000 -CT=4B51DD4850DC0A6C3A46D924003D2C27 - -I=12 -PT=00100000000000000000000000000000 -CT=2E510A9D917B15BE32A192B12A668F23 - -I=13 -PT=00080000000000000000000000000000 -CT=88F6F79962B0FB77FEA8E7C632D3108E - -I=14 -PT=00040000000000000000000000000000 -CT=A3A35AB1D88DAF07B52794A0F065383A - -I=15 -PT=00020000000000000000000000000000 -CT=DC6CC878433E2B3BB193049A4ECBFC53 - -I=16 -PT=00010000000000000000000000000000 -CT=EFCD3763EB7B1A415938248A9A5B4FD5 - -I=17 -PT=00008000000000000000000000000000 -CT=AB7E9FB9A66DBE5BB44854F07D9015EE - -I=18 -PT=00004000000000000000000000000000 -CT=8B8E9D3365F8F6743ECF7E33E99255A4 - -I=19 -PT=00002000000000000000000000000000 -CT=54D37B4F176FF3D8F6AFC866066D8572 - -I=20 -PT=00001000000000000000000000000000 -CT=E83310889480FBF3C00342E3126D0D02 - -I=21 -PT=00000800000000000000000000000000 -CT=D321AB2511F92F098174AA2DE6E85DA2 - -I=22 -PT=00000400000000000000000000000000 -CT=D8E3F40B1112D5149D58C481DFA9983F - -I=23 -PT=00000200000000000000000000000000 -CT=2454C4E0806639DDF19854D6C68054AD - -I=24 -PT=00000100000000000000000000000000 -CT=A5506D410F7CA32F3955DD79D9D09418 - -I=25 -PT=00000080000000000000000000000000 -CT=7908EE40677699568A7DC1AA317C7E4E - -I=26 -PT=00000040000000000000000000000000 -CT=B4B7B29DD43B2F5CF765E25192273982 - -I=27 -PT=00000020000000000000000000000000 -CT=92AFE9668159BEFFE2A86F8503260164 - -I=28 -PT=00000010000000000000000000000000 -CT=5C36A232FBA6D187A84657AD4028B18F - -I=29 -PT=00000008000000000000000000000000 -CT=A2E994DFAB3A798DF8F54F6DA87E58E2 - -I=30 -PT=00000004000000000000000000000000 -CT=6CDAB10A72ADF77D71D0765BAAE95631 - -I=31 -PT=00000002000000000000000000000000 -CT=9FE3C801BCAAF7BB800F2E6BF3278E21 - -I=32 -PT=00000001000000000000000000000000 -CT=B459D90D9A6C392E5493BC91CF5A0863 - -I=33 -PT=00000000800000000000000000000000 -CT=0518A9FA5007F6787E0FB4E5AC27D758 - -I=34 -PT=00000000400000000000000000000000 -CT=BED9795415D28599700ED7952384A963 - -I=35 -PT=00000000200000000000000000000000 -CT=F0140421173D60251EF6CAB0229B1B50 - -I=36 -PT=00000000100000000000000000000000 -CT=460EB4652B3F6779EA28CB11B37529ED - -I=37 -PT=00000000080000000000000000000000 -CT=C4283D351C960A6AC13CD19CCF03AE38 - -I=38 -PT=00000000040000000000000000000000 -CT=6815A10047B2C834A798EBDCC6786C75 - -I=39 -PT=00000000020000000000000000000000 -CT=99BA19F0CDD5990D0386B32CE56C9C4C - -I=40 -PT=00000000010000000000000000000000 -CT=DE76F62C61E07915162DA13E79679DEC - -I=41 -PT=00000000008000000000000000000000 -CT=DD0325D6854803D06D1D2277D5FB8D67 - -I=42 -PT=00000000004000000000000000000000 -CT=580B71A41DE37D6FAC83CCB0B3BB1C97 - -I=43 -PT=00000000002000000000000000000000 -CT=E9B1AB470A1B02EF0FF5E6754A092C96 - -I=44 -PT=00000000001000000000000000000000 -CT=8590620F5AF5993B7410282F4126BC1F - -I=45 -PT=00000000000800000000000000000000 -CT=8D4914D2F1B22B2E268E66E532D29D7C - -I=46 -PT=00000000000400000000000000000000 -CT=FD826CE48E62C5E30867044B86BA4B56 - -I=47 -PT=00000000000200000000000000000000 -CT=100E7B831C9F35FA1271F5F1316C6FCF - -I=48 -PT=00000000000100000000000000000000 -CT=0A2DD0C17F68B996AA96C007003D0B31 - -I=49 -PT=00000000000080000000000000000000 -CT=C95F68C57E06B0A2E1F623C83C5D80BF - -I=50 -PT=00000000000040000000000000000000 -CT=571CAFC92C7C8A5EC54C0741E186905C - -I=51 -PT=00000000000020000000000000000000 -CT=22514353E95312C112255E1EED0B2DF6 - -I=52 -PT=00000000000010000000000000000000 -CT=791A8BF462BD17580BD9152C6D11C6C5 - -I=53 -PT=00000000000008000000000000000000 -CT=5882A0178D548F84A165DB809C60DC28 - -I=54 -PT=00000000000004000000000000000000 -CT=3CE4A90EED4458CA6039E42DDADB71C3 - -I=55 -PT=00000000000002000000000000000000 -CT=D3CBAB261207A16BE2751E77044FD7C9 - -I=56 -PT=00000000000001000000000000000000 -CT=24E32B698A7B32217093628B01F424AB - -I=57 -PT=00000000000000800000000000000000 -CT=9F6AFC0AF27CF565110C77E3C24F4F5B - -I=58 -PT=00000000000000400000000000000000 -CT=E088AA5CDA20EF267BB039B00C72C45B - -I=59 -PT=00000000000000200000000000000000 -CT=5CF1018B7E0BA1775601C2E279900360 - -I=60 -PT=00000000000000100000000000000000 -CT=3B1A7388B89FB9416AD8753CF5AF35D2 - -I=61 -PT=00000000000000080000000000000000 -CT=137FA4ED00AFCD9F5D8BC0D14BD5837A - -I=62 -PT=00000000000000040000000000000000 -CT=806F5C9B663559BB56F234881E4A3E60 - -I=63 -PT=00000000000000020000000000000000 -CT=8069A449152292DF2DE8642992C632B6 - -I=64 -PT=00000000000000010000000000000000 -CT=37C6CF2A1ABD1B1F1922B46C7B4A280D - -I=65 -PT=00000000000000008000000000000000 -CT=7A2835260E5A0AA2B5DC301800EC8438 - -I=66 -PT=00000000000000004000000000000000 -CT=EE81FAF2F9058213FFCACF281CB8509E - -I=67 -PT=00000000000000002000000000000000 -CT=57F22D93C37129BA331FDBA38E005A1E - -I=68 -PT=00000000000000001000000000000000 -CT=EC798782E87B7D9F780CC3C3A46519B5 - -I=69 -PT=00000000000000000800000000000000 -CT=43EA28497F5D40E3A4744FA2EDAA42DE - -I=70 -PT=00000000000000000400000000000000 -CT=91F004E7DEBF41B3414DD8C5C317372C - -I=71 -PT=00000000000000000200000000000000 -CT=C249EAE54E7B4DF43B938C1B4CC28314 - -I=72 -PT=00000000000000000100000000000000 -CT=32C289D7EEFB99D2F17AD7B7D45FE1EC - -I=73 -PT=00000000000000000080000000000000 -CT=A675FB2E8DDBF810CEF01CF2B728CD2B - -I=74 -PT=00000000000000000040000000000000 -CT=A418AAAB6E6921CC731AA8A349386080 - -I=75 -PT=00000000000000000020000000000000 -CT=2E2B0F44863E67D9B0215C4ABD60417F - -I=76 -PT=00000000000000000010000000000000 -CT=F0AF7CB19E911D481F6426DAEFDD2240 - -I=77 -PT=00000000000000000008000000000000 -CT=CB1304DAAA2DF6878F56AC2E0F887E04 - -I=78 -PT=00000000000000000004000000000000 -CT=B1B70A7E6A0CD1916D9B78BEA19084AE - -I=79 -PT=00000000000000000002000000000000 -CT=0CDE9F9BE646A5FCE3436B794A9CFC65 - -I=80 -PT=00000000000000000001000000000000 -CT=68C7946D476A0A36674B36AFD7E5DF33 - -I=81 -PT=00000000000000000000800000000000 -CT=48770159A07DD8DFFF06C80105F8D57C - -I=82 -PT=00000000000000000000400000000000 -CT=665E62801B3260E3C45BD3BE34DFDEBE - -I=83 -PT=00000000000000000000200000000000 -CT=4159C1F686BFBE5B0E50BDB0DA532B69 - -I=84 -PT=00000000000000000000100000000000 -CT=6333100A5A4AD917DC2D4E78A04869A3 - -I=85 -PT=00000000000000000000080000000000 -CT=866A4519AB1D199F25886B89D0539ACC - -I=86 -PT=00000000000000000000040000000000 -CT=EC0CFD37E4CBC7E8BE385283F7AEA75A - -I=87 -PT=00000000000000000000020000000000 -CT=CA2F383AACCA0810AA13F3E710621422 - -I=88 -PT=00000000000000000000010000000000 -CT=1D0EEF6870444F950937831EC0A55D98 - -I=89 -PT=00000000000000000000008000000000 -CT=37839B35ED6801E7670496D479A95017 - -I=90 -PT=00000000000000000000004000000000 -CT=02317C8C7098C4F94AB867AC7A49DD8D - -I=91 -PT=00000000000000000000002000000000 -CT=FFB4CB4E3F7F8BF3367EBD43236518B4 - -I=92 -PT=00000000000000000000001000000000 -CT=36BEDEF1E4AA3E4A40A305741713FCBF - -I=93 -PT=00000000000000000000000800000000 -CT=B2DFE3C4870269C1E3FEEC39161540D9 - -I=94 -PT=00000000000000000000000400000000 -CT=147EF2518AD45DA0026056ECBF6A3DFA - -I=95 -PT=00000000000000000000000200000000 -CT=027A75E4DE635790E47ACE90D7928804 - -I=96 -PT=00000000000000000000000100000000 -CT=C4CF3CCB59BF87D0AFBD629F48CFBB7B - -I=97 -PT=00000000000000000000000080000000 -CT=35165C93F564C97E1C32EF97E8151A87 - -I=98 -PT=00000000000000000000000040000000 -CT=449DE37F7D5A1BBD628ABBE7E061701D - -I=99 -PT=00000000000000000000000020000000 -CT=B1D45EAF218F1799B149BAD677FE129F - -I=100 -PT=00000000000000000000000010000000 -CT=BE08AC6DB6BD0583AA9D2ABC71C73DCD - -I=101 -PT=00000000000000000000000008000000 -CT=BCC835BD3DF1A79E4C7C145B899A5C25 - -I=102 -PT=00000000000000000000000004000000 -CT=3D311EA611FF5AF371301C58A8E9912D - -I=103 -PT=00000000000000000000000002000000 -CT=A5A1BEA594ACC7CA80F09EA5ADDB5C71 - -I=104 -PT=00000000000000000000000001000000 -CT=0F09492429FE7222D6CD8190D9F2FFBF - -I=105 -PT=00000000000000000000000000800000 -CT=816D2220A16B8AAEE71364FD43636C6F - -I=106 -PT=00000000000000000000000000400000 -CT=D7E8702408419ED73191B107EAF75A0B - -I=107 -PT=00000000000000000000000000200000 -CT=9B170EFB1E235B433C78E276BEA082F0 - -I=108 -PT=00000000000000000000000000100000 -CT=03BBECC5598AE974430F29395522F096 - -I=109 -PT=00000000000000000000000000080000 -CT=DB53517766C0E8CF42059607CBA89380 - -I=110 -PT=00000000000000000000000000040000 -CT=2E2AF4B7931F0AEFFAC5471148A5BB97 - -I=111 -PT=00000000000000000000000000020000 -CT=C872C0408266403B984F635FF5683DE4 - -I=112 -PT=00000000000000000000000000010000 -CT=15DCF750B0E3A68AD1F4EFD07E8967B4 - -I=113 -PT=00000000000000000000000000008000 -CT=B41092048E9E6A749F6FD8CE515A23A3 - -I=114 -PT=00000000000000000000000000004000 -CT=4DA9267D62507994312BD5C99ADDE730 - -I=115 -PT=00000000000000000000000000002000 -CT=9E2FCA6D1D626E9C6A924EBF7DBF618A - -I=116 -PT=00000000000000000000000000001000 -CT=E092E8D7EF2C2465AEFB2493C3063590 - -I=117 -PT=00000000000000000000000000000800 -CT=1C0E58DA37D1068378A88DBE2EDE4E10 - -I=118 -PT=00000000000000000000000000000400 -CT=19063F854232B8509A6A3A6D46809959 - -I=119 -PT=00000000000000000000000000000200 -CT=447FB09E54EFA285F7530F25C4EA0022 - -I=120 -PT=00000000000000000000000000000100 -CT=F6ABE86321BE40E1FBFDAFED37CC1D9B - -I=121 -PT=00000000000000000000000000000080 -CT=4E8506CD006666341D6CF51F98B41F35 - -I=122 -PT=00000000000000000000000000000040 -CT=53995DE0009CA18BECAFB8307C54C14C - -I=123 -PT=00000000000000000000000000000020 -CT=2006BF99F4C58B6CC2627856593FAEEA - -I=124 -PT=00000000000000000000000000000010 -CT=2DA697D2737CB30B744A4644FA1CBC6E - -I=125 -PT=00000000000000000000000000000008 -CT=47A22ACDB60C3A986A8F76ECD0EA3433 - -I=126 -PT=00000000000000000000000000000004 -CT=FDAA17C2CDE20268FE36E164EA532151 - -I=127 -PT=00000000000000000000000000000002 -CT=98E7247C07F0FE411C267E4384B0F600 - -I=128 -PT=00000000000000000000000000000001 -CT=CD33B28AC773F74BA00ED1F312572435 - -========== - -KEYSIZE=256 - -KEY=0000000000000000000000000000000000000000000000000000000000000000 - -I=1 -PT=80000000000000000000000000000000 -CT=DDC6BF790C15760D8D9AEB6F9A75FD4E - -I=2 -PT=40000000000000000000000000000000 -CT=C7098C217C334D0C9BDF37EA13B0822C - -I=3 -PT=20000000000000000000000000000000 -CT=60F0FB0D4C56A8D4EEFEC5264204042D - -I=4 -PT=10000000000000000000000000000000 -CT=73376FBBF654D0686E0E84001477106B - -I=5 -PT=08000000000000000000000000000000 -CT=2F443B52BA5F0C6EA0602C7C4FD259B6 - -I=6 -PT=04000000000000000000000000000000 -CT=75D11B0E3A68C4223D88DBF017977DD7 - -I=7 -PT=02000000000000000000000000000000 -CT=779B38D15BFFB63D8D609D551A5CC98E - -I=8 -PT=01000000000000000000000000000000 -CT=5275F3D86B4FB8684593133EBFA53CD3 - -I=9 -PT=00800000000000000000000000000000 -CT=1CEF2074B336CEC62F12DEA2F6AB1481 - -I=10 -PT=00400000000000000000000000000000 -CT=1AEF5ABBAD9D7160874578DCD8BAE172 - -I=11 -PT=00200000000000000000000000000000 -CT=46C525DB17E72F26BF03216846B6F609 - -I=12 -PT=00100000000000000000000000000000 -CT=E24411F941BBE08788781E3EC52CBAA4 - -I=13 -PT=00080000000000000000000000000000 -CT=83A3DEDD1DD27018F6A6477E40527581 - -I=14 -PT=00040000000000000000000000000000 -CT=B68F8A2CDBAB0C923C67FC8F0F1087DE - -I=15 -PT=00020000000000000000000000000000 -CT=649944A70C32BF87A7409E7AE128FDE8 - -I=16 -PT=00010000000000000000000000000000 -CT=2846526D67387539C89314DE9E0C2D02 - -I=17 -PT=00008000000000000000000000000000 -CT=A9A0B8402E53C70DD1688054BA58DDFD - -I=18 -PT=00004000000000000000000000000000 -CT=4A72E6E1B79C83AC4BE3EBA5699EED48 - -I=19 -PT=00002000000000000000000000000000 -CT=B0E36B867BA4FF2B77D0614B0E364E4C - -I=20 -PT=00001000000000000000000000000000 -CT=49B57DE141F6418E3090F24DDD4014B6 - -I=21 -PT=00000800000000000000000000000000 -CT=A6C0D5B9797258E1987AC5F6CD20146D - -I=22 -PT=00000400000000000000000000000000 -CT=426CF4BDCAA369175965D26E7C71EEA2 - -I=23 -PT=00000200000000000000000000000000 -CT=E27F484CE54BC99BC1A52BDA3B518A26 - -I=24 -PT=00000100000000000000000000000000 -CT=D16D186284C7E6EE64B8104E0EF20BA5 - -I=25 -PT=00000080000000000000000000000000 -CT=6431F8538AD54E1E044A9F71F8EF556B - -I=26 -PT=00000040000000000000000000000000 -CT=ECD57CEB451D27EB96C55B2042257E8E - -I=27 -PT=00000020000000000000000000000000 -CT=4F0F188DC911B1954AFBC734C9F68872 - -I=28 -PT=00000010000000000000000000000000 -CT=B54DEF0337626B65614E81EDFDE620F3 - -I=29 -PT=00000008000000000000000000000000 -CT=6655D8074CAE0B90B0D3A3FE72D4D9DB - -I=30 -PT=00000004000000000000000000000000 -CT=C6B74B6B9EB4FC0C9A237DB1B616D09A - -I=31 -PT=00000002000000000000000000000000 -CT=D7B5D076EA56EC2B20791D7AD51CCF8F - -I=32 -PT=00000001000000000000000000000000 -CT=FE160C224BF003CE3BDDC90CB52ED22C - -I=33 -PT=00000000800000000000000000000000 -CT=5E00DA9BA94B5EC0D258D8A8002E0F6A - -I=34 -PT=00000000400000000000000000000000 -CT=09AC6DCFF4DACFF1651E2BA212A292A3 - -I=35 -PT=00000000200000000000000000000000 -CT=B283617E318D99AF83A05D9810BA89F7 - -I=36 -PT=00000000100000000000000000000000 -CT=0B5F70CCB40B0EF2538AE9B4A9770B35 - -I=37 -PT=00000000080000000000000000000000 -CT=43282BF180248FB517839B37F4DDAAE4 - -I=38 -PT=00000000040000000000000000000000 -CT=DDBD534C8B2E6D30A268F88C55AD765B - -I=39 -PT=00000000020000000000000000000000 -CT=A41A164E50EC2D9F175E752B755E0B5C - -I=40 -PT=00000000010000000000000000000000 -CT=37BFF99FF2F7AA97779E4ADF6F13FB10 - -I=41 -PT=00000000008000000000000000000000 -CT=9BA4F7BD298152903A683C4CEC669216 - -I=42 -PT=00000000004000000000000000000000 -CT=5FB750C7CE10DE7B4504248914D0DA06 - -I=43 -PT=00000000002000000000000000000000 -CT=3E748BFA108E086F51D56EC74A9E0FB9 - -I=44 -PT=00000000001000000000000000000000 -CT=31D4E56B99F5B73C1B8437DF332AFB98 - -I=45 -PT=00000000000800000000000000000000 -CT=9DC6717B84FC55D266E7B1D9B5C52A5F - -I=46 -PT=00000000000400000000000000000000 -CT=8EF8BA007F23C0A50FC120E07041BCCD - -I=47 -PT=00000000000200000000000000000000 -CT=C58F38E1839FC1918A12B8C9E88C66B6 - -I=48 -PT=00000000000100000000000000000000 -CT=B695D72A3FCF508C4050E12E40061C2D - -I=49 -PT=00000000000080000000000000000000 -CT=5D2736AD478A50583BC8C11BEFF16D7A - -I=50 -PT=00000000000040000000000000000000 -CT=DF0EACA8F17847AD41F9578F14C7B56B - -I=51 -PT=00000000000020000000000000000000 -CT=E5AA14AD48AD0A3C47CC35D5F8020E51 - -I=52 -PT=00000000000010000000000000000000 -CT=11BE6C8F58EBD8CEF1A53F591A68E8CE - -I=53 -PT=00000000000008000000000000000000 -CT=ECFE7BAFCBF42C1FEE015488770B3053 - -I=54 -PT=00000000000004000000000000000000 -CT=E552649F8D8EC4A1E1CD6DF50B6E6777 - -I=55 -PT=00000000000002000000000000000000 -CT=521C0629DE93B9119CDB1DDC5809DDEA - -I=56 -PT=00000000000001000000000000000000 -CT=CB38A62A0BAB1784156BA038CBA99BF6 - -I=57 -PT=00000000000000800000000000000000 -CT=76CCEE8AAACD394DE1EEF3DDA10CB54B - -I=58 -PT=00000000000000400000000000000000 -CT=6AFF910FA1D5673140E2DB59B8416049 - -I=59 -PT=00000000000000200000000000000000 -CT=064A12C0EF73FB386801BF4F35F3120D - -I=60 -PT=00000000000000100000000000000000 -CT=2240E374929D5B1BB8FF0FFDDDF640EC - -I=61 -PT=00000000000000080000000000000000 -CT=D4BA15C904C7692185DE85C02052E180 - -I=62 -PT=00000000000000040000000000000000 -CT=1714A315AB0166728A44CD91D4AE9018 - -I=63 -PT=00000000000000020000000000000000 -CT=6C970BDD9F0E222722EA31A1D12DD0AD - -I=64 -PT=00000000000000010000000000000000 -CT=F5956EDF02BD36A401BBB6CE77C3D3FB - -I=65 -PT=00000000000000008000000000000000 -CT=0CA11F122CCD7C259DC597EED3DF9BC4 - -I=66 -PT=00000000000000004000000000000000 -CT=50109AB4912AD2560B206F331B62EB6C - -I=67 -PT=00000000000000002000000000000000 -CT=DBE7C91A4175614889A2D4BEFD64845E - -I=68 -PT=00000000000000001000000000000000 -CT=0D3322853A571A6B46B79C0228E0DD25 - -I=69 -PT=00000000000000000800000000000000 -CT=96E4EE0BB9A11C6FB8522F285BADDEB6 - -I=70 -PT=00000000000000000400000000000000 -CT=96705C52D2CFCE82E630C93477C79C49 - -I=71 -PT=00000000000000000200000000000000 -CT=C50130AED6A126149D71F3888C83C232 - -I=72 -PT=00000000000000000100000000000000 -CT=4816EFE3DEB380566EBA0C17BF582090 - -I=73 -PT=00000000000000000080000000000000 -CT=0390857B4C8C98E4CF7A2B6F3394C507 - -I=74 -PT=00000000000000000040000000000000 -CT=422E73A02025EBE8B8B5D6E0FA24FCB2 - -I=75 -PT=00000000000000000020000000000000 -CT=3271AA7F4BF1D7C38050A43076D4FF76 - -I=76 -PT=00000000000000000010000000000000 -CT=D2074946F0D37B8975607BFC2E70234C - -I=77 -PT=00000000000000000008000000000000 -CT=1A509194C1270AB92E5A42D3A9F8D98B - -I=78 -PT=00000000000000000004000000000000 -CT=512438946360CCC4A5C6D73F6EED7130 - -I=79 -PT=00000000000000000002000000000000 -CT=98CFCDEC46EBEA1A286B3004F2746A0D - -I=80 -PT=00000000000000000001000000000000 -CT=A1CF369949677A3AF3D58E3EABF2741B - -I=81 -PT=00000000000000000000800000000000 -CT=D84C2E1A0E4A52166FA8FF6889D1E5E2 - -I=82 -PT=00000000000000000000400000000000 -CT=4AD91CCEEF60119B5078FD162D2735DE - -I=83 -PT=00000000000000000000200000000000 -CT=2860793D818E97AAFF1D339D7702438D - -I=84 -PT=00000000000000000000100000000000 -CT=6F9068BE73364AE250D89D78A6C9CE6F - -I=85 -PT=00000000000000000000080000000000 -CT=024FC3FEF4883FEB1A8DD005305FECCE - -I=86 -PT=00000000000000000000040000000000 -CT=08A61FE0816D75EA15EB3C9FB9CCDED6 - -I=87 -PT=00000000000000000000020000000000 -CT=449C86DFA13F260175CE39797686FFA4 - -I=88 -PT=00000000000000000000010000000000 -CT=4FFFFC29A59858E1133F2BFB1A8A4817 - -I=89 -PT=00000000000000000000008000000000 -CT=19425D1F6480B25096561295697DC2B7 - -I=90 -PT=00000000000000000000004000000000 -CT=31974727ECDD2C77C3A428FC3A8CB3FC - -I=91 -PT=00000000000000000000002000000000 -CT=A57CD704B3C95E744D08DF443458F2F5 - -I=92 -PT=00000000000000000000001000000000 -CT=486D8C193DB1ED73ACB17990442FC40B - -I=93 -PT=00000000000000000000000800000000 -CT=5E4DBF4E83AB3BC055B9FCC7A6B3A763 - -I=94 -PT=00000000000000000000000400000000 -CT=ACF2E0A693FBBCBA4D41B861E0D89E37 - -I=95 -PT=00000000000000000000000200000000 -CT=32A7CB2AE066A51D2B78FC4B4CFCB608 - -I=96 -PT=00000000000000000000000100000000 -CT=677D494DBB73CAF55C1990158DA12F14 - -I=97 -PT=00000000000000000000000080000000 -CT=082A0D2367512ADF0D75A151BFBE0A17 - -I=98 -PT=00000000000000000000000040000000 -CT=5E5BB7337923C482CE8CBA249E6A8C7D - -I=99 -PT=00000000000000000000000020000000 -CT=D3001BA7C7026EE3E5003179530AFCFC - -I=100 -PT=00000000000000000000000010000000 -CT=46EC44F8931E629FE8FD8961312EDDE1 - -I=101 -PT=00000000000000000000000008000000 -CT=C5F8ECD79C7B30E81D17E32079969310 - -I=102 -PT=00000000000000000000000004000000 -CT=5B8AD6919E24CAEBCC55401AEE0C9802 - -I=103 -PT=00000000000000000000000002000000 -CT=C2302B7E701B5CC7F8B29E3516DBBFA6 - -I=104 -PT=00000000000000000000000001000000 -CT=A1D04D6A76F9F7A94D49FAA64A87F244 - -I=105 -PT=00000000000000000000000000800000 -CT=7FB6F92D35B5CB6C631600EDB9E860BA - -I=106 -PT=00000000000000000000000000400000 -CT=B2EF7078BCFACE07AEEC3F9B48830EB3 - -I=107 -PT=00000000000000000000000000200000 -CT=F475A7493D24C7036E53390374C378B3 - -I=108 -PT=00000000000000000000000000100000 -CT=B36802AC987377A37BD8EADC97C57D60 - -I=109 -PT=00000000000000000000000000080000 -CT=ADDCD3D19689C4DDC738CE5F69DC9505 - -I=110 -PT=00000000000000000000000000040000 -CT=0DAF8CA22884915403C0F0BB1F4BD74F - -I=111 -PT=00000000000000000000000000020000 -CT=4AF36BAE2660503B3248E4685059FD05 - -I=112 -PT=00000000000000000000000000010000 -CT=7D5631814DD8E917D97A0D514C743971 - -I=113 -PT=00000000000000000000000000008000 -CT=BC3352500FC0CBB9DB5B5F6B491C1BE8 - -I=114 -PT=00000000000000000000000000004000 -CT=6A4A30BA87E87AF65C90AEB7AFEDC76B - -I=115 -PT=00000000000000000000000000002000 -CT=77E6125897668AC8E73E8C79A6FF8336 - -I=116 -PT=00000000000000000000000000001000 -CT=3FA9D39104EBB323C7AAAA248960DD1E - -I=117 -PT=00000000000000000000000000000800 -CT=FAD75AD76AB10ADC49036B250E229D39 - -I=118 -PT=00000000000000000000000000000400 -CT=2FACAA5FE35B228A16AC74088D702EC4 - -I=119 -PT=00000000000000000000000000000200 -CT=88B6CBCFDFEF8AD91720A1BB69A1F33E - -I=120 -PT=00000000000000000000000000000100 -CT=C7E9D250998632D444356242EF04058D - -I=121 -PT=00000000000000000000000000000080 -CT=B14DAD8D3D9153F46C0D3A1AD63C7A05 - -I=122 -PT=00000000000000000000000000000040 -CT=60ABA678A506608D0845966D29B5F790 - -I=123 -PT=00000000000000000000000000000020 -CT=482DC43F2388EF25D24144E144BD834E - -I=124 -PT=00000000000000000000000000000010 -CT=1490A05A7CEE43BDE98B56E309DC0126 - -I=125 -PT=00000000000000000000000000000008 -CT=ABFA77CD6E85DA245FB0BDC5E52CFC29 - -I=126 -PT=00000000000000000000000000000004 -CT=DD4AB1284D4AE17B41E85924470C36F7 - -I=127 -PT=00000000000000000000000000000002 -CT=CEA7403D4D606B6E074EC5D3BAF39D18 - -I=128 -PT=00000000000000000000000000000001 -CT=530F8AFBC74536B9A963B4F1C4CB738B - + +========================= + +FILENAME: "ecb_vt.txt" + +Electronic Codebook (ECB) Mode +Variable Text Known Answer Tests + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========== + +KEYSIZE=128 + +KEY=00000000000000000000000000000000 + +I=1 +PT=80000000000000000000000000000000 +CT=3AD78E726C1EC02B7EBFE92B23D9EC34 + +I=2 +PT=40000000000000000000000000000000 +CT=45BC707D29E8204D88DFBA2F0B0CAD9B + +I=3 +PT=20000000000000000000000000000000 +CT=161556838018F52805CDBD6202002E3F + +I=4 +PT=10000000000000000000000000000000 +CT=F5569B3AB6A6D11EFDE1BF0A64C6854A + +I=5 +PT=08000000000000000000000000000000 +CT=64E82B50E501FBD7DD4116921159B83E + +I=6 +PT=04000000000000000000000000000000 +CT=BAAC12FB613A7DE11450375C74034041 + +I=7 +PT=02000000000000000000000000000000 +CT=BCF176A7EAAD8085EBACEA362462A281 + +I=8 +PT=01000000000000000000000000000000 +CT=47711816E91D6FF059BBBF2BF58E0FD3 + +I=9 +PT=00800000000000000000000000000000 +CT=B970DFBE40698AF1638FE38BD3DF3B2F + +I=10 +PT=00400000000000000000000000000000 +CT=F95B59A44F391E14CF20B74BDC32FCFF + +I=11 +PT=00200000000000000000000000000000 +CT=720F74AE04A2A435B9A7256E49378F5B + +I=12 +PT=00100000000000000000000000000000 +CT=2A0445F61D36BFA7E277070730CF76DA + +I=13 +PT=00080000000000000000000000000000 +CT=8D0536B997AEFEC1D94011BAB6699A03 + +I=14 +PT=00040000000000000000000000000000 +CT=674F002E19F6ED47EFF319E51FAD4498 + +I=15 +PT=00020000000000000000000000000000 +CT=292C02C5CB9163C80AC0F6CF1DD8E92D + +I=16 +PT=00010000000000000000000000000000 +CT=FA321CF18EF5FE727DD82A5C1E945141 + +I=17 +PT=00008000000000000000000000000000 +CT=A5A7AFE1034C39CCCEBE3C584BC0BE05 + +I=18 +PT=00004000000000000000000000000000 +CT=4FF5A52E697E77D081205DBDB21CEA39 + +I=19 +PT=00002000000000000000000000000000 +CT=209E88DC94C9003000CE0769AF7B7166 + +I=20 +PT=00001000000000000000000000000000 +CT=5DEE41AF864CB4B650E5F51551824D38 + +I=21 +PT=00000800000000000000000000000000 +CT=A79A63FA7E4503AE6D6E09F5F9053030 + +I=22 +PT=00000400000000000000000000000000 +CT=A48316749FAE7FAC7002031A6AFD8BA7 + +I=23 +PT=00000200000000000000000000000000 +CT=D6EEE8A7357A0E1D64262CA9C337AC42 + +I=24 +PT=00000100000000000000000000000000 +CT=B013CA8A62A858053E9FB667ED39829E + +I=25 +PT=00000080000000000000000000000000 +CT=DF6EA9E4538A45A52D5C1A43C88F4B55 + +I=26 +PT=00000040000000000000000000000000 +CT=7D03BA451371591D3FD5547D9165C73B + +I=27 +PT=00000020000000000000000000000000 +CT=0E0426281A6277E186499D365D5F49FF + +I=28 +PT=00000010000000000000000000000000 +CT=DBC02169DD2059E6CC4C57C1FEDF5AB4 + +I=29 +PT=00000008000000000000000000000000 +CT=826590E05D167DA6F00DCC75E22788EB + +I=30 +PT=00000004000000000000000000000000 +CT=34A73F21A04421D9786335FAAB49423A + +I=31 +PT=00000002000000000000000000000000 +CT=ED347D0E0128EE1A7392A1D36AB78AA9 + +I=32 +PT=00000001000000000000000000000000 +CT=EE944B2FE6E9FC888042608DA9615F75 + +I=33 +PT=00000000800000000000000000000000 +CT=9E7C85A909EF7218BA7947CFB4718F46 + +I=34 +PT=00000000400000000000000000000000 +CT=811AE07A0B2B1F816587FA73699AE77D + +I=35 +PT=00000000200000000000000000000000 +CT=68466FBF43C2FE13D4B18F7EC5EA745F + +I=36 +PT=00000000100000000000000000000000 +CT=D20B015C7191B219780956E6101F9354 + +I=37 +PT=00000000080000000000000000000000 +CT=5939D5C1BBF54EE1B3E326D757BDDE25 + +I=38 +PT=00000000040000000000000000000000 +CT=B1FDAFE9A0240E8FFEA19CE94B5105D3 + +I=39 +PT=00000000020000000000000000000000 +CT=D62962ECE02CDD68C06BDFEFB2F9495B + +I=40 +PT=00000000010000000000000000000000 +CT=B3BB2DE6F3C26587BA8BAC4F7AD9499A + +I=41 +PT=00000000008000000000000000000000 +CT=E0B1072D6D9FF703D6FBEF77852B0A6B + +I=42 +PT=00000000004000000000000000000000 +CT=D8DD51C907F478DE0228E83E61FD1758 + +I=43 +PT=00000000002000000000000000000000 +CT=A42DFFE6E7C1671C06A25236FDD10017 + +I=44 +PT=00000000001000000000000000000000 +CT=25ACF141550BFAB9EF451B6C6A5B2163 + +I=45 +PT=00000000000800000000000000000000 +CT=4DA7FCA3949B16E821DBC84F19581018 + +I=46 +PT=00000000000400000000000000000000 +CT=7D49B6347CBCC8919C7FA96A37A7A215 + +I=47 +PT=00000000000200000000000000000000 +CT=900024B29A08C6721B95BA3B753DDB4D + +I=48 +PT=00000000000100000000000000000000 +CT=6D2182FB283B6934D90BA7848CAB5E66 + +I=49 +PT=00000000000080000000000000000000 +CT=F73EF01B448D23A4D90DE8B2F9666E7A + +I=50 +PT=00000000000040000000000000000000 +CT=4AD9CDA2418643E9A3D926AF5E6B0412 + +I=51 +PT=00000000000020000000000000000000 +CT=7CAEC8E7E5953997D545B033201C8C5B + +I=52 +PT=00000000000010000000000000000000 +CT=3C43CA1F6B6864503E27B48D88230CF5 + +I=53 +PT=00000000000008000000000000000000 +CT=44F779B93108FE9FEEC880D79BA74488 + +I=54 +PT=00000000000004000000000000000000 +CT=9E50E8D9CFD3A682A78E527C9072A1CF + +I=55 +PT=00000000000002000000000000000000 +CT=68D000CBC838BBE3C505D6F814C01F28 + +I=56 +PT=00000000000001000000000000000000 +CT=2CB2A9FEC1ACD1D9B0FA05205E304F57 + +I=57 +PT=00000000000000800000000000000000 +CT=01EB2806606E46444520A5CC6180CD4B + +I=58 +PT=00000000000000400000000000000000 +CT=DAA9B25168CC702326F217F1A0C0B162 + +I=59 +PT=00000000000000200000000000000000 +CT=3E07E648975D9578D03555B1755807ED + +I=60 +PT=00000000000000100000000000000000 +CT=0B45F52E802C8B8DE09579425B80B711 + +I=61 +PT=00000000000000080000000000000000 +CT=659595DA0B68F6DF0DD6CA77202986E1 + +I=62 +PT=00000000000000040000000000000000 +CT=05FF42873893536E58C8FA98A45C73C4 + +I=63 +PT=00000000000000020000000000000000 +CT=B5B03421DE8BBFFC4EADEC767339A9BD + +I=64 +PT=00000000000000010000000000000000 +CT=788BCD111ECF73D4E78D2E21BEF55460 + +I=65 +PT=00000000000000008000000000000000 +CT=909CD9EC6790359F982DC6F2393D5315 + +I=66 +PT=00000000000000004000000000000000 +CT=332950F361535FF24EFAC8C76293F12C + +I=67 +PT=00000000000000002000000000000000 +CT=A68CCD4E330FFDA9D576DA436DB53D75 + +I=68 +PT=00000000000000001000000000000000 +CT=27C8A1CCFDB0B015D1ED5B3E77143791 + +I=69 +PT=00000000000000000800000000000000 +CT=D76A4B95887A77DF610DD3E1D3B20325 + +I=70 +PT=00000000000000000400000000000000 +CT=C068AB0DE71C66DAE83C361EF4B2D989 + +I=71 +PT=00000000000000000200000000000000 +CT=C2120BCD49EDA9A288B3B4BE79AC8158 + +I=72 +PT=00000000000000000100000000000000 +CT=0C546F62BF2773CD0F564FCECA7BA688 + +I=73 +PT=00000000000000000080000000000000 +CT=18F3462BEDE4920213CCB66DAB1640AA + +I=74 +PT=00000000000000000040000000000000 +CT=FE42F245EDD0E24B216AEBD8B392D690 + +I=75 +PT=00000000000000000020000000000000 +CT=3D3EEBC8D3D1558A194C2D00C337FF2B + +I=76 +PT=00000000000000000010000000000000 +CT=29AAEDF043E785DB42836F79BE6CBA28 + +I=77 +PT=00000000000000000008000000000000 +CT=215F90C6744E2944358E78619159A611 + +I=78 +PT=00000000000000000004000000000000 +CT=8606B1AA9E1D548E5442B06551E2C6DC + +I=79 +PT=00000000000000000002000000000000 +CT=987BB4B8740EC0EDE7FEA97DF033B5B1 + +I=80 +PT=00000000000000000001000000000000 +CT=C0A3500DA5B0AE07D2F450930BEEDF1B + +I=81 +PT=00000000000000000000800000000000 +CT=525FDF8312FE8F32C781481A8DAAAE37 + +I=82 +PT=00000000000000000000400000000000 +CT=BFD2C56AE5FB9C9DE33A6944572A6487 + +I=83 +PT=00000000000000000000200000000000 +CT=7975A57A425CDF5AA1FA929101F650B0 + +I=84 +PT=00000000000000000000100000000000 +CT=BF174BC49609A8709B2CD8366DAA79FE + +I=85 +PT=00000000000000000000080000000000 +CT=06C50C43222F56C874B1704E9F44BF7D + +I=86 +PT=00000000000000000000040000000000 +CT=0CEC48CD34043EA29CA3B8ED5278721E + +I=87 +PT=00000000000000000000020000000000 +CT=9548EA34A1560197B304D0ACB8A1698D + +I=88 +PT=00000000000000000000010000000000 +CT=22F9E9B1BD73B6B5B7D3062C986272F3 + +I=89 +PT=00000000000000000000008000000000 +CT=FEE8E934BD0873295059002230E298D4 + +I=90 +PT=00000000000000000000004000000000 +CT=1B08E2E3EB820D139CB4ABBDBE81D00D + +I=91 +PT=00000000000000000000002000000000 +CT=0021177681E4D90CEAF69DCED0145125 + +I=92 +PT=00000000000000000000001000000000 +CT=4A8E314452CA8A8A3619FC54BC423643 + +I=93 +PT=00000000000000000000000800000000 +CT=65047474F7222C94C6965425FF1BFD0A + +I=94 +PT=00000000000000000000000400000000 +CT=E123F551A9C4A8489622B16F961A9AA4 + +I=95 +PT=00000000000000000000000200000000 +CT=EF05530948B80915028BB2B6FE429380 + +I=96 +PT=00000000000000000000000100000000 +CT=72535B7FE0F0F777CEDCD55CD77E2DDF + +I=97 +PT=00000000000000000000000080000000 +CT=3423D8EFC31FA2F4C365C77D8F3B5C63 + +I=98 +PT=00000000000000000000000040000000 +CT=DE0E51C264663F3C5DBC59580A98D8E4 + +I=99 +PT=00000000000000000000000020000000 +CT=B2D9391166680947AB09264156719679 + +I=100 +PT=00000000000000000000000010000000 +CT=10DB79F23B06D263835C424AF749ADB7 + +I=101 +PT=00000000000000000000000008000000 +CT=DDF72D27E6B01EC107EA3E005B59563B + +I=102 +PT=00000000000000000000000004000000 +CT=8266B57485A5954A4236751DE07F6694 + +I=103 +PT=00000000000000000000000002000000 +CT=669A501E1F1ADE6E5523DE01D6DBC987 + +I=104 +PT=00000000000000000000000001000000 +CT=C20C48F2989725D461D1DB589DC0896E + +I=105 +PT=00000000000000000000000000800000 +CT=DE35158E7810ED1191825D2AA98FA97D + +I=106 +PT=00000000000000000000000000400000 +CT=4FE294F2C0F34D0671B693A237EBDDC8 + +I=107 +PT=00000000000000000000000000200000 +CT=087AE74B10CCBFDF6739FEB9559C01A4 + +I=108 +PT=00000000000000000000000000100000 +CT=5DC278970B7DEF77A5536C77AB59C207 + +I=109 +PT=00000000000000000000000000080000 +CT=7607F078C77085184EAA9B060C1FBFFF + +I=110 +PT=00000000000000000000000000040000 +CT=9DB841531BCBE7998DAD19993FB3CC00 + +I=111 +PT=00000000000000000000000000020000 +CT=D6A089B654854A94560BAE13298835B8 + +I=112 +PT=00000000000000000000000000010000 +CT=E1E223C4CF90CC5D195B370D65114622 + +I=113 +PT=00000000000000000000000000008000 +CT=1CBED73C50D053BDAD372CEEE54836A1 + +I=114 +PT=00000000000000000000000000004000 +CT=D309E69376D257ADF2BFDA152B26555F + +I=115 +PT=00000000000000000000000000002000 +CT=740F7649117F0DEE6EAA7789A9994C36 + +I=116 +PT=00000000000000000000000000001000 +CT=76AE64417C297184D668C5FD908B3CE5 + +I=117 +PT=00000000000000000000000000000800 +CT=6095FEA4AA8035591F1787A819C48787 + +I=118 +PT=00000000000000000000000000000400 +CT=D1FF4E7ACD1C79967FEBAB0F7465D450 + +I=119 +PT=00000000000000000000000000000200 +CT=5F5AD3C42B9489557BB63BF49ECF5F8A + +I=120 +PT=00000000000000000000000000000100 +CT=FB56CC09B680B1D07C5A52149E29F07C + +I=121 +PT=00000000000000000000000000000080 +CT=FF49B8DF4A97CBE03833E66197620DAD + +I=122 +PT=00000000000000000000000000000040 +CT=5E070ADE533D2E090ED0F5BE13BC0983 + +I=123 +PT=00000000000000000000000000000020 +CT=3AB4FB1D2B7BA376590A2C241D1F508D + +I=124 +PT=00000000000000000000000000000010 +CT=58B2431BC0BEDE02550F40238969EC78 + +I=125 +PT=00000000000000000000000000000008 +CT=0253786E126504F0DAB90C48A30321DE + +I=126 +PT=00000000000000000000000000000004 +CT=200211214E7394DA2089B6ACD093ABE0 + +I=127 +PT=00000000000000000000000000000002 +CT=0388DACE60B6A392F328C2B971B2FE78 + +I=128 +PT=00000000000000000000000000000001 +CT=58E2FCCEFA7E3061367F1D57A4E7455A + +========== + +KEYSIZE=192 + +KEY=000000000000000000000000000000000000000000000000 + +I=1 +PT=80000000000000000000000000000000 +CT=6CD02513E8D4DC986B4AFE087A60BD0C + +I=2 +PT=40000000000000000000000000000000 +CT=423D2772A0CA56DAABB48D2129062987 + +I=3 +PT=20000000000000000000000000000000 +CT=1021F2A8DA70EB2219DC16804445FF98 + +I=4 +PT=10000000000000000000000000000000 +CT=C636E35B402577F96974D8804295EBB8 + +I=5 +PT=08000000000000000000000000000000 +CT=1566D2E57E8393C19E29F892EA28A9A7 + +I=6 +PT=04000000000000000000000000000000 +CT=883C878FED70B36CC09D040F9619DD19 + +I=7 +PT=02000000000000000000000000000000 +CT=06734593A974965790E715594FC34AA9 + +I=8 +PT=01000000000000000000000000000000 +CT=F19B389948D9A45534E5BD36C984134A + +I=9 +PT=00800000000000000000000000000000 +CT=D8410DFC14FA6D175EC968EA8CAC514C + +I=10 +PT=00400000000000000000000000000000 +CT=7E6C6EBB4029A177CF7B2FDD9AC6BB7A + +I=11 +PT=00200000000000000000000000000000 +CT=4B51DD4850DC0A6C3A46D924003D2C27 + +I=12 +PT=00100000000000000000000000000000 +CT=2E510A9D917B15BE32A192B12A668F23 + +I=13 +PT=00080000000000000000000000000000 +CT=88F6F79962B0FB77FEA8E7C632D3108E + +I=14 +PT=00040000000000000000000000000000 +CT=A3A35AB1D88DAF07B52794A0F065383A + +I=15 +PT=00020000000000000000000000000000 +CT=DC6CC878433E2B3BB193049A4ECBFC53 + +I=16 +PT=00010000000000000000000000000000 +CT=EFCD3763EB7B1A415938248A9A5B4FD5 + +I=17 +PT=00008000000000000000000000000000 +CT=AB7E9FB9A66DBE5BB44854F07D9015EE + +I=18 +PT=00004000000000000000000000000000 +CT=8B8E9D3365F8F6743ECF7E33E99255A4 + +I=19 +PT=00002000000000000000000000000000 +CT=54D37B4F176FF3D8F6AFC866066D8572 + +I=20 +PT=00001000000000000000000000000000 +CT=E83310889480FBF3C00342E3126D0D02 + +I=21 +PT=00000800000000000000000000000000 +CT=D321AB2511F92F098174AA2DE6E85DA2 + +I=22 +PT=00000400000000000000000000000000 +CT=D8E3F40B1112D5149D58C481DFA9983F + +I=23 +PT=00000200000000000000000000000000 +CT=2454C4E0806639DDF19854D6C68054AD + +I=24 +PT=00000100000000000000000000000000 +CT=A5506D410F7CA32F3955DD79D9D09418 + +I=25 +PT=00000080000000000000000000000000 +CT=7908EE40677699568A7DC1AA317C7E4E + +I=26 +PT=00000040000000000000000000000000 +CT=B4B7B29DD43B2F5CF765E25192273982 + +I=27 +PT=00000020000000000000000000000000 +CT=92AFE9668159BEFFE2A86F8503260164 + +I=28 +PT=00000010000000000000000000000000 +CT=5C36A232FBA6D187A84657AD4028B18F + +I=29 +PT=00000008000000000000000000000000 +CT=A2E994DFAB3A798DF8F54F6DA87E58E2 + +I=30 +PT=00000004000000000000000000000000 +CT=6CDAB10A72ADF77D71D0765BAAE95631 + +I=31 +PT=00000002000000000000000000000000 +CT=9FE3C801BCAAF7BB800F2E6BF3278E21 + +I=32 +PT=00000001000000000000000000000000 +CT=B459D90D9A6C392E5493BC91CF5A0863 + +I=33 +PT=00000000800000000000000000000000 +CT=0518A9FA5007F6787E0FB4E5AC27D758 + +I=34 +PT=00000000400000000000000000000000 +CT=BED9795415D28599700ED7952384A963 + +I=35 +PT=00000000200000000000000000000000 +CT=F0140421173D60251EF6CAB0229B1B50 + +I=36 +PT=00000000100000000000000000000000 +CT=460EB4652B3F6779EA28CB11B37529ED + +I=37 +PT=00000000080000000000000000000000 +CT=C4283D351C960A6AC13CD19CCF03AE38 + +I=38 +PT=00000000040000000000000000000000 +CT=6815A10047B2C834A798EBDCC6786C75 + +I=39 +PT=00000000020000000000000000000000 +CT=99BA19F0CDD5990D0386B32CE56C9C4C + +I=40 +PT=00000000010000000000000000000000 +CT=DE76F62C61E07915162DA13E79679DEC + +I=41 +PT=00000000008000000000000000000000 +CT=DD0325D6854803D06D1D2277D5FB8D67 + +I=42 +PT=00000000004000000000000000000000 +CT=580B71A41DE37D6FAC83CCB0B3BB1C97 + +I=43 +PT=00000000002000000000000000000000 +CT=E9B1AB470A1B02EF0FF5E6754A092C96 + +I=44 +PT=00000000001000000000000000000000 +CT=8590620F5AF5993B7410282F4126BC1F + +I=45 +PT=00000000000800000000000000000000 +CT=8D4914D2F1B22B2E268E66E532D29D7C + +I=46 +PT=00000000000400000000000000000000 +CT=FD826CE48E62C5E30867044B86BA4B56 + +I=47 +PT=00000000000200000000000000000000 +CT=100E7B831C9F35FA1271F5F1316C6FCF + +I=48 +PT=00000000000100000000000000000000 +CT=0A2DD0C17F68B996AA96C007003D0B31 + +I=49 +PT=00000000000080000000000000000000 +CT=C95F68C57E06B0A2E1F623C83C5D80BF + +I=50 +PT=00000000000040000000000000000000 +CT=571CAFC92C7C8A5EC54C0741E186905C + +I=51 +PT=00000000000020000000000000000000 +CT=22514353E95312C112255E1EED0B2DF6 + +I=52 +PT=00000000000010000000000000000000 +CT=791A8BF462BD17580BD9152C6D11C6C5 + +I=53 +PT=00000000000008000000000000000000 +CT=5882A0178D548F84A165DB809C60DC28 + +I=54 +PT=00000000000004000000000000000000 +CT=3CE4A90EED4458CA6039E42DDADB71C3 + +I=55 +PT=00000000000002000000000000000000 +CT=D3CBAB261207A16BE2751E77044FD7C9 + +I=56 +PT=00000000000001000000000000000000 +CT=24E32B698A7B32217093628B01F424AB + +I=57 +PT=00000000000000800000000000000000 +CT=9F6AFC0AF27CF565110C77E3C24F4F5B + +I=58 +PT=00000000000000400000000000000000 +CT=E088AA5CDA20EF267BB039B00C72C45B + +I=59 +PT=00000000000000200000000000000000 +CT=5CF1018B7E0BA1775601C2E279900360 + +I=60 +PT=00000000000000100000000000000000 +CT=3B1A7388B89FB9416AD8753CF5AF35D2 + +I=61 +PT=00000000000000080000000000000000 +CT=137FA4ED00AFCD9F5D8BC0D14BD5837A + +I=62 +PT=00000000000000040000000000000000 +CT=806F5C9B663559BB56F234881E4A3E60 + +I=63 +PT=00000000000000020000000000000000 +CT=8069A449152292DF2DE8642992C632B6 + +I=64 +PT=00000000000000010000000000000000 +CT=37C6CF2A1ABD1B1F1922B46C7B4A280D + +I=65 +PT=00000000000000008000000000000000 +CT=7A2835260E5A0AA2B5DC301800EC8438 + +I=66 +PT=00000000000000004000000000000000 +CT=EE81FAF2F9058213FFCACF281CB8509E + +I=67 +PT=00000000000000002000000000000000 +CT=57F22D93C37129BA331FDBA38E005A1E + +I=68 +PT=00000000000000001000000000000000 +CT=EC798782E87B7D9F780CC3C3A46519B5 + +I=69 +PT=00000000000000000800000000000000 +CT=43EA28497F5D40E3A4744FA2EDAA42DE + +I=70 +PT=00000000000000000400000000000000 +CT=91F004E7DEBF41B3414DD8C5C317372C + +I=71 +PT=00000000000000000200000000000000 +CT=C249EAE54E7B4DF43B938C1B4CC28314 + +I=72 +PT=00000000000000000100000000000000 +CT=32C289D7EEFB99D2F17AD7B7D45FE1EC + +I=73 +PT=00000000000000000080000000000000 +CT=A675FB2E8DDBF810CEF01CF2B728CD2B + +I=74 +PT=00000000000000000040000000000000 +CT=A418AAAB6E6921CC731AA8A349386080 + +I=75 +PT=00000000000000000020000000000000 +CT=2E2B0F44863E67D9B0215C4ABD60417F + +I=76 +PT=00000000000000000010000000000000 +CT=F0AF7CB19E911D481F6426DAEFDD2240 + +I=77 +PT=00000000000000000008000000000000 +CT=CB1304DAAA2DF6878F56AC2E0F887E04 + +I=78 +PT=00000000000000000004000000000000 +CT=B1B70A7E6A0CD1916D9B78BEA19084AE + +I=79 +PT=00000000000000000002000000000000 +CT=0CDE9F9BE646A5FCE3436B794A9CFC65 + +I=80 +PT=00000000000000000001000000000000 +CT=68C7946D476A0A36674B36AFD7E5DF33 + +I=81 +PT=00000000000000000000800000000000 +CT=48770159A07DD8DFFF06C80105F8D57C + +I=82 +PT=00000000000000000000400000000000 +CT=665E62801B3260E3C45BD3BE34DFDEBE + +I=83 +PT=00000000000000000000200000000000 +CT=4159C1F686BFBE5B0E50BDB0DA532B69 + +I=84 +PT=00000000000000000000100000000000 +CT=6333100A5A4AD917DC2D4E78A04869A3 + +I=85 +PT=00000000000000000000080000000000 +CT=866A4519AB1D199F25886B89D0539ACC + +I=86 +PT=00000000000000000000040000000000 +CT=EC0CFD37E4CBC7E8BE385283F7AEA75A + +I=87 +PT=00000000000000000000020000000000 +CT=CA2F383AACCA0810AA13F3E710621422 + +I=88 +PT=00000000000000000000010000000000 +CT=1D0EEF6870444F950937831EC0A55D98 + +I=89 +PT=00000000000000000000008000000000 +CT=37839B35ED6801E7670496D479A95017 + +I=90 +PT=00000000000000000000004000000000 +CT=02317C8C7098C4F94AB867AC7A49DD8D + +I=91 +PT=00000000000000000000002000000000 +CT=FFB4CB4E3F7F8BF3367EBD43236518B4 + +I=92 +PT=00000000000000000000001000000000 +CT=36BEDEF1E4AA3E4A40A305741713FCBF + +I=93 +PT=00000000000000000000000800000000 +CT=B2DFE3C4870269C1E3FEEC39161540D9 + +I=94 +PT=00000000000000000000000400000000 +CT=147EF2518AD45DA0026056ECBF6A3DFA + +I=95 +PT=00000000000000000000000200000000 +CT=027A75E4DE635790E47ACE90D7928804 + +I=96 +PT=00000000000000000000000100000000 +CT=C4CF3CCB59BF87D0AFBD629F48CFBB7B + +I=97 +PT=00000000000000000000000080000000 +CT=35165C93F564C97E1C32EF97E8151A87 + +I=98 +PT=00000000000000000000000040000000 +CT=449DE37F7D5A1BBD628ABBE7E061701D + +I=99 +PT=00000000000000000000000020000000 +CT=B1D45EAF218F1799B149BAD677FE129F + +I=100 +PT=00000000000000000000000010000000 +CT=BE08AC6DB6BD0583AA9D2ABC71C73DCD + +I=101 +PT=00000000000000000000000008000000 +CT=BCC835BD3DF1A79E4C7C145B899A5C25 + +I=102 +PT=00000000000000000000000004000000 +CT=3D311EA611FF5AF371301C58A8E9912D + +I=103 +PT=00000000000000000000000002000000 +CT=A5A1BEA594ACC7CA80F09EA5ADDB5C71 + +I=104 +PT=00000000000000000000000001000000 +CT=0F09492429FE7222D6CD8190D9F2FFBF + +I=105 +PT=00000000000000000000000000800000 +CT=816D2220A16B8AAEE71364FD43636C6F + +I=106 +PT=00000000000000000000000000400000 +CT=D7E8702408419ED73191B107EAF75A0B + +I=107 +PT=00000000000000000000000000200000 +CT=9B170EFB1E235B433C78E276BEA082F0 + +I=108 +PT=00000000000000000000000000100000 +CT=03BBECC5598AE974430F29395522F096 + +I=109 +PT=00000000000000000000000000080000 +CT=DB53517766C0E8CF42059607CBA89380 + +I=110 +PT=00000000000000000000000000040000 +CT=2E2AF4B7931F0AEFFAC5471148A5BB97 + +I=111 +PT=00000000000000000000000000020000 +CT=C872C0408266403B984F635FF5683DE4 + +I=112 +PT=00000000000000000000000000010000 +CT=15DCF750B0E3A68AD1F4EFD07E8967B4 + +I=113 +PT=00000000000000000000000000008000 +CT=B41092048E9E6A749F6FD8CE515A23A3 + +I=114 +PT=00000000000000000000000000004000 +CT=4DA9267D62507994312BD5C99ADDE730 + +I=115 +PT=00000000000000000000000000002000 +CT=9E2FCA6D1D626E9C6A924EBF7DBF618A + +I=116 +PT=00000000000000000000000000001000 +CT=E092E8D7EF2C2465AEFB2493C3063590 + +I=117 +PT=00000000000000000000000000000800 +CT=1C0E58DA37D1068378A88DBE2EDE4E10 + +I=118 +PT=00000000000000000000000000000400 +CT=19063F854232B8509A6A3A6D46809959 + +I=119 +PT=00000000000000000000000000000200 +CT=447FB09E54EFA285F7530F25C4EA0022 + +I=120 +PT=00000000000000000000000000000100 +CT=F6ABE86321BE40E1FBFDAFED37CC1D9B + +I=121 +PT=00000000000000000000000000000080 +CT=4E8506CD006666341D6CF51F98B41F35 + +I=122 +PT=00000000000000000000000000000040 +CT=53995DE0009CA18BECAFB8307C54C14C + +I=123 +PT=00000000000000000000000000000020 +CT=2006BF99F4C58B6CC2627856593FAEEA + +I=124 +PT=00000000000000000000000000000010 +CT=2DA697D2737CB30B744A4644FA1CBC6E + +I=125 +PT=00000000000000000000000000000008 +CT=47A22ACDB60C3A986A8F76ECD0EA3433 + +I=126 +PT=00000000000000000000000000000004 +CT=FDAA17C2CDE20268FE36E164EA532151 + +I=127 +PT=00000000000000000000000000000002 +CT=98E7247C07F0FE411C267E4384B0F600 + +I=128 +PT=00000000000000000000000000000001 +CT=CD33B28AC773F74BA00ED1F312572435 + +========== + +KEYSIZE=256 + +KEY=0000000000000000000000000000000000000000000000000000000000000000 + +I=1 +PT=80000000000000000000000000000000 +CT=DDC6BF790C15760D8D9AEB6F9A75FD4E + +I=2 +PT=40000000000000000000000000000000 +CT=C7098C217C334D0C9BDF37EA13B0822C + +I=3 +PT=20000000000000000000000000000000 +CT=60F0FB0D4C56A8D4EEFEC5264204042D + +I=4 +PT=10000000000000000000000000000000 +CT=73376FBBF654D0686E0E84001477106B + +I=5 +PT=08000000000000000000000000000000 +CT=2F443B52BA5F0C6EA0602C7C4FD259B6 + +I=6 +PT=04000000000000000000000000000000 +CT=75D11B0E3A68C4223D88DBF017977DD7 + +I=7 +PT=02000000000000000000000000000000 +CT=779B38D15BFFB63D8D609D551A5CC98E + +I=8 +PT=01000000000000000000000000000000 +CT=5275F3D86B4FB8684593133EBFA53CD3 + +I=9 +PT=00800000000000000000000000000000 +CT=1CEF2074B336CEC62F12DEA2F6AB1481 + +I=10 +PT=00400000000000000000000000000000 +CT=1AEF5ABBAD9D7160874578DCD8BAE172 + +I=11 +PT=00200000000000000000000000000000 +CT=46C525DB17E72F26BF03216846B6F609 + +I=12 +PT=00100000000000000000000000000000 +CT=E24411F941BBE08788781E3EC52CBAA4 + +I=13 +PT=00080000000000000000000000000000 +CT=83A3DEDD1DD27018F6A6477E40527581 + +I=14 +PT=00040000000000000000000000000000 +CT=B68F8A2CDBAB0C923C67FC8F0F1087DE + +I=15 +PT=00020000000000000000000000000000 +CT=649944A70C32BF87A7409E7AE128FDE8 + +I=16 +PT=00010000000000000000000000000000 +CT=2846526D67387539C89314DE9E0C2D02 + +I=17 +PT=00008000000000000000000000000000 +CT=A9A0B8402E53C70DD1688054BA58DDFD + +I=18 +PT=00004000000000000000000000000000 +CT=4A72E6E1B79C83AC4BE3EBA5699EED48 + +I=19 +PT=00002000000000000000000000000000 +CT=B0E36B867BA4FF2B77D0614B0E364E4C + +I=20 +PT=00001000000000000000000000000000 +CT=49B57DE141F6418E3090F24DDD4014B6 + +I=21 +PT=00000800000000000000000000000000 +CT=A6C0D5B9797258E1987AC5F6CD20146D + +I=22 +PT=00000400000000000000000000000000 +CT=426CF4BDCAA369175965D26E7C71EEA2 + +I=23 +PT=00000200000000000000000000000000 +CT=E27F484CE54BC99BC1A52BDA3B518A26 + +I=24 +PT=00000100000000000000000000000000 +CT=D16D186284C7E6EE64B8104E0EF20BA5 + +I=25 +PT=00000080000000000000000000000000 +CT=6431F8538AD54E1E044A9F71F8EF556B + +I=26 +PT=00000040000000000000000000000000 +CT=ECD57CEB451D27EB96C55B2042257E8E + +I=27 +PT=00000020000000000000000000000000 +CT=4F0F188DC911B1954AFBC734C9F68872 + +I=28 +PT=00000010000000000000000000000000 +CT=B54DEF0337626B65614E81EDFDE620F3 + +I=29 +PT=00000008000000000000000000000000 +CT=6655D8074CAE0B90B0D3A3FE72D4D9DB + +I=30 +PT=00000004000000000000000000000000 +CT=C6B74B6B9EB4FC0C9A237DB1B616D09A + +I=31 +PT=00000002000000000000000000000000 +CT=D7B5D076EA56EC2B20791D7AD51CCF8F + +I=32 +PT=00000001000000000000000000000000 +CT=FE160C224BF003CE3BDDC90CB52ED22C + +I=33 +PT=00000000800000000000000000000000 +CT=5E00DA9BA94B5EC0D258D8A8002E0F6A + +I=34 +PT=00000000400000000000000000000000 +CT=09AC6DCFF4DACFF1651E2BA212A292A3 + +I=35 +PT=00000000200000000000000000000000 +CT=B283617E318D99AF83A05D9810BA89F7 + +I=36 +PT=00000000100000000000000000000000 +CT=0B5F70CCB40B0EF2538AE9B4A9770B35 + +I=37 +PT=00000000080000000000000000000000 +CT=43282BF180248FB517839B37F4DDAAE4 + +I=38 +PT=00000000040000000000000000000000 +CT=DDBD534C8B2E6D30A268F88C55AD765B + +I=39 +PT=00000000020000000000000000000000 +CT=A41A164E50EC2D9F175E752B755E0B5C + +I=40 +PT=00000000010000000000000000000000 +CT=37BFF99FF2F7AA97779E4ADF6F13FB10 + +I=41 +PT=00000000008000000000000000000000 +CT=9BA4F7BD298152903A683C4CEC669216 + +I=42 +PT=00000000004000000000000000000000 +CT=5FB750C7CE10DE7B4504248914D0DA06 + +I=43 +PT=00000000002000000000000000000000 +CT=3E748BFA108E086F51D56EC74A9E0FB9 + +I=44 +PT=00000000001000000000000000000000 +CT=31D4E56B99F5B73C1B8437DF332AFB98 + +I=45 +PT=00000000000800000000000000000000 +CT=9DC6717B84FC55D266E7B1D9B5C52A5F + +I=46 +PT=00000000000400000000000000000000 +CT=8EF8BA007F23C0A50FC120E07041BCCD + +I=47 +PT=00000000000200000000000000000000 +CT=C58F38E1839FC1918A12B8C9E88C66B6 + +I=48 +PT=00000000000100000000000000000000 +CT=B695D72A3FCF508C4050E12E40061C2D + +I=49 +PT=00000000000080000000000000000000 +CT=5D2736AD478A50583BC8C11BEFF16D7A + +I=50 +PT=00000000000040000000000000000000 +CT=DF0EACA8F17847AD41F9578F14C7B56B + +I=51 +PT=00000000000020000000000000000000 +CT=E5AA14AD48AD0A3C47CC35D5F8020E51 + +I=52 +PT=00000000000010000000000000000000 +CT=11BE6C8F58EBD8CEF1A53F591A68E8CE + +I=53 +PT=00000000000008000000000000000000 +CT=ECFE7BAFCBF42C1FEE015488770B3053 + +I=54 +PT=00000000000004000000000000000000 +CT=E552649F8D8EC4A1E1CD6DF50B6E6777 + +I=55 +PT=00000000000002000000000000000000 +CT=521C0629DE93B9119CDB1DDC5809DDEA + +I=56 +PT=00000000000001000000000000000000 +CT=CB38A62A0BAB1784156BA038CBA99BF6 + +I=57 +PT=00000000000000800000000000000000 +CT=76CCEE8AAACD394DE1EEF3DDA10CB54B + +I=58 +PT=00000000000000400000000000000000 +CT=6AFF910FA1D5673140E2DB59B8416049 + +I=59 +PT=00000000000000200000000000000000 +CT=064A12C0EF73FB386801BF4F35F3120D + +I=60 +PT=00000000000000100000000000000000 +CT=2240E374929D5B1BB8FF0FFDDDF640EC + +I=61 +PT=00000000000000080000000000000000 +CT=D4BA15C904C7692185DE85C02052E180 + +I=62 +PT=00000000000000040000000000000000 +CT=1714A315AB0166728A44CD91D4AE9018 + +I=63 +PT=00000000000000020000000000000000 +CT=6C970BDD9F0E222722EA31A1D12DD0AD + +I=64 +PT=00000000000000010000000000000000 +CT=F5956EDF02BD36A401BBB6CE77C3D3FB + +I=65 +PT=00000000000000008000000000000000 +CT=0CA11F122CCD7C259DC597EED3DF9BC4 + +I=66 +PT=00000000000000004000000000000000 +CT=50109AB4912AD2560B206F331B62EB6C + +I=67 +PT=00000000000000002000000000000000 +CT=DBE7C91A4175614889A2D4BEFD64845E + +I=68 +PT=00000000000000001000000000000000 +CT=0D3322853A571A6B46B79C0228E0DD25 + +I=69 +PT=00000000000000000800000000000000 +CT=96E4EE0BB9A11C6FB8522F285BADDEB6 + +I=70 +PT=00000000000000000400000000000000 +CT=96705C52D2CFCE82E630C93477C79C49 + +I=71 +PT=00000000000000000200000000000000 +CT=C50130AED6A126149D71F3888C83C232 + +I=72 +PT=00000000000000000100000000000000 +CT=4816EFE3DEB380566EBA0C17BF582090 + +I=73 +PT=00000000000000000080000000000000 +CT=0390857B4C8C98E4CF7A2B6F3394C507 + +I=74 +PT=00000000000000000040000000000000 +CT=422E73A02025EBE8B8B5D6E0FA24FCB2 + +I=75 +PT=00000000000000000020000000000000 +CT=3271AA7F4BF1D7C38050A43076D4FF76 + +I=76 +PT=00000000000000000010000000000000 +CT=D2074946F0D37B8975607BFC2E70234C + +I=77 +PT=00000000000000000008000000000000 +CT=1A509194C1270AB92E5A42D3A9F8D98B + +I=78 +PT=00000000000000000004000000000000 +CT=512438946360CCC4A5C6D73F6EED7130 + +I=79 +PT=00000000000000000002000000000000 +CT=98CFCDEC46EBEA1A286B3004F2746A0D + +I=80 +PT=00000000000000000001000000000000 +CT=A1CF369949677A3AF3D58E3EABF2741B + +I=81 +PT=00000000000000000000800000000000 +CT=D84C2E1A0E4A52166FA8FF6889D1E5E2 + +I=82 +PT=00000000000000000000400000000000 +CT=4AD91CCEEF60119B5078FD162D2735DE + +I=83 +PT=00000000000000000000200000000000 +CT=2860793D818E97AAFF1D339D7702438D + +I=84 +PT=00000000000000000000100000000000 +CT=6F9068BE73364AE250D89D78A6C9CE6F + +I=85 +PT=00000000000000000000080000000000 +CT=024FC3FEF4883FEB1A8DD005305FECCE + +I=86 +PT=00000000000000000000040000000000 +CT=08A61FE0816D75EA15EB3C9FB9CCDED6 + +I=87 +PT=00000000000000000000020000000000 +CT=449C86DFA13F260175CE39797686FFA4 + +I=88 +PT=00000000000000000000010000000000 +CT=4FFFFC29A59858E1133F2BFB1A8A4817 + +I=89 +PT=00000000000000000000008000000000 +CT=19425D1F6480B25096561295697DC2B7 + +I=90 +PT=00000000000000000000004000000000 +CT=31974727ECDD2C77C3A428FC3A8CB3FC + +I=91 +PT=00000000000000000000002000000000 +CT=A57CD704B3C95E744D08DF443458F2F5 + +I=92 +PT=00000000000000000000001000000000 +CT=486D8C193DB1ED73ACB17990442FC40B + +I=93 +PT=00000000000000000000000800000000 +CT=5E4DBF4E83AB3BC055B9FCC7A6B3A763 + +I=94 +PT=00000000000000000000000400000000 +CT=ACF2E0A693FBBCBA4D41B861E0D89E37 + +I=95 +PT=00000000000000000000000200000000 +CT=32A7CB2AE066A51D2B78FC4B4CFCB608 + +I=96 +PT=00000000000000000000000100000000 +CT=677D494DBB73CAF55C1990158DA12F14 + +I=97 +PT=00000000000000000000000080000000 +CT=082A0D2367512ADF0D75A151BFBE0A17 + +I=98 +PT=00000000000000000000000040000000 +CT=5E5BB7337923C482CE8CBA249E6A8C7D + +I=99 +PT=00000000000000000000000020000000 +CT=D3001BA7C7026EE3E5003179530AFCFC + +I=100 +PT=00000000000000000000000010000000 +CT=46EC44F8931E629FE8FD8961312EDDE1 + +I=101 +PT=00000000000000000000000008000000 +CT=C5F8ECD79C7B30E81D17E32079969310 + +I=102 +PT=00000000000000000000000004000000 +CT=5B8AD6919E24CAEBCC55401AEE0C9802 + +I=103 +PT=00000000000000000000000002000000 +CT=C2302B7E701B5CC7F8B29E3516DBBFA6 + +I=104 +PT=00000000000000000000000001000000 +CT=A1D04D6A76F9F7A94D49FAA64A87F244 + +I=105 +PT=00000000000000000000000000800000 +CT=7FB6F92D35B5CB6C631600EDB9E860BA + +I=106 +PT=00000000000000000000000000400000 +CT=B2EF7078BCFACE07AEEC3F9B48830EB3 + +I=107 +PT=00000000000000000000000000200000 +CT=F475A7493D24C7036E53390374C378B3 + +I=108 +PT=00000000000000000000000000100000 +CT=B36802AC987377A37BD8EADC97C57D60 + +I=109 +PT=00000000000000000000000000080000 +CT=ADDCD3D19689C4DDC738CE5F69DC9505 + +I=110 +PT=00000000000000000000000000040000 +CT=0DAF8CA22884915403C0F0BB1F4BD74F + +I=111 +PT=00000000000000000000000000020000 +CT=4AF36BAE2660503B3248E4685059FD05 + +I=112 +PT=00000000000000000000000000010000 +CT=7D5631814DD8E917D97A0D514C743971 + +I=113 +PT=00000000000000000000000000008000 +CT=BC3352500FC0CBB9DB5B5F6B491C1BE8 + +I=114 +PT=00000000000000000000000000004000 +CT=6A4A30BA87E87AF65C90AEB7AFEDC76B + +I=115 +PT=00000000000000000000000000002000 +CT=77E6125897668AC8E73E8C79A6FF8336 + +I=116 +PT=00000000000000000000000000001000 +CT=3FA9D39104EBB323C7AAAA248960DD1E + +I=117 +PT=00000000000000000000000000000800 +CT=FAD75AD76AB10ADC49036B250E229D39 + +I=118 +PT=00000000000000000000000000000400 +CT=2FACAA5FE35B228A16AC74088D702EC4 + +I=119 +PT=00000000000000000000000000000200 +CT=88B6CBCFDFEF8AD91720A1BB69A1F33E + +I=120 +PT=00000000000000000000000000000100 +CT=C7E9D250998632D444356242EF04058D + +I=121 +PT=00000000000000000000000000000080 +CT=B14DAD8D3D9153F46C0D3A1AD63C7A05 + +I=122 +PT=00000000000000000000000000000040 +CT=60ABA678A506608D0845966D29B5F790 + +I=123 +PT=00000000000000000000000000000020 +CT=482DC43F2388EF25D24144E144BD834E + +I=124 +PT=00000000000000000000000000000010 +CT=1490A05A7CEE43BDE98B56E309DC0126 + +I=125 +PT=00000000000000000000000000000008 +CT=ABFA77CD6E85DA245FB0BDC5E52CFC29 + +I=126 +PT=00000000000000000000000000000004 +CT=DD4AB1284D4AE17B41E85924470C36F7 + +I=127 +PT=00000000000000000000000000000002 +CT=CEA7403D4D606B6E074EC5D3BAF39D18 + +I=128 +PT=00000000000000000000000000000001 +CT=530F8AFBC74536B9A963B4F1C4CB738B + ========== \ No newline at end of file --- krb5-1.4.4.orig/src/lib/crypto/aes/test/Readme.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/Readme.txt @@ -1,22 +1,22 @@ -README - -Algorithm: Rijndael -Submitter: Joan Daemen and Vincent Rijmen - -Test values: Known Answer Tests and Monte Carlo Tests ------------------------------------------------------------ - -This directory contains the following files: - -Readme.txt: This file. - -cbc_d_m.txt: Test values for the CBC decryption MCT. -cbc_e_m.txt: Test values for the CBC encryption MCT. -ecb_d_m.txt: Test values for the ECB decryption MCT. -ecb_e_m.txt: Test values for the ECB encryption MCT. -ecb_vk.txt: Test values for the Variable Key KAT. -ecb_vt.txt: Test values for the Variable Text KAT. -ecb_iv.txt: Test values for the Intermediate Values KAT. -ecb_iv.readme: Detailed information about the Intermediate Values KAT. -ecb_tbl.txt: Test values for the Table KAT. - +README + +Algorithm: Rijndael +Submitter: Joan Daemen and Vincent Rijmen + +Test values: Known Answer Tests and Monte Carlo Tests +----------------------------------------------------------- + +This directory contains the following files: + +Readme.txt: This file. + +cbc_d_m.txt: Test values for the CBC decryption MCT. +cbc_e_m.txt: Test values for the CBC encryption MCT. +ecb_d_m.txt: Test values for the ECB decryption MCT. +ecb_e_m.txt: Test values for the ECB encryption MCT. +ecb_vk.txt: Test values for the Variable Key KAT. +ecb_vt.txt: Test values for the Variable Text KAT. +ecb_iv.txt: Test values for the Intermediate Values KAT. +ecb_iv.readme: Detailed information about the Intermediate Values KAT. +ecb_tbl.txt: Test values for the Table KAT. + --- krb5-1.4.4.orig/src/lib/crypto/aes/test/cbc_e_m.txt +++ krb5-1.4.4/src/lib/crypto/aes/test/cbc_e_m.txt @@ -1,7224 +1,7224 @@ - -========================= - -FILENAME: "cbc_e_m.txt" - -Cipher Block Chaining (CBC) Mode - ENCRYPTION -Monte Carlo Test - -Algorithm Name: Rijndael -Principal Submitter: Joan Daemen - -========== - -KEYSIZE=128 - -I=0 -KEY=00000000000000000000000000000000 -IV=00000000000000000000000000000000 -PT=00000000000000000000000000000000 -CT=8A05FC5E095AF4848A08D328D3688E3D - -I=1 -KEY=8A05FC5E095AF4848A08D328D3688E3D -IV=8A05FC5E095AF4848A08D328D3688E3D -PT=204F17E2444381F6114FF53934C0BCD3 -CT=192D9B3AA10BB2F7846CCBA0085C657A - -I=2 -KEY=93286764A85146730E641888DB34EB47 -IV=192D9B3AA10BB2F7846CCBA0085C657A -PT=983BF6F5A6DFBCDAA19370666E83A99A -CT=40D8DAF6D1FDA0A073B3BD18B7695D2E - -I=3 -KEY=D3F0BD9279ACE6D37DD7A5906C5DB669 -IV=40D8DAF6D1FDA0A073B3BD18B7695D2E -PT=C48CD503A21C8AD0B2483EF15F79571D -CT=3EDBE80D69A1D2248CA55FC17C4EF3C5 - -I=4 -KEY=ED2B559F100D34F7F172FA51101345AC -IV=3EDBE80D69A1D2248CA55FC17C4EF3C5 -PT=6A49A07B90CE830C20BC239646D936C0 -CT=D87891CF573C99EAE4349A70CA099415 - -I=5 -KEY=3553C4504731AD1D15466021DA1AD1B9 -IV=D87891CF573C99EAE4349A70CA099415 -PT=0ACB9A969946F523317BB932CE1561A4 -CT=24E8F1013F479BBE655DF088C9316BC7 - -I=6 -KEY=11BB3551787636A3701B90A9132BBA7E -IV=24E8F1013F479BBE655DF088C9316BC7 -PT=3DFC8683C1D626A26E2513EB747E8B0F -CT=2C92E80D8D1F70B411C28BD9FDABF21D - -I=7 -KEY=3D29DD5CF569461761D91B70EE804863 -IV=2C92E80D8D1F70B411C28BD9FDABF21D -PT=FAE2D6A36DBD17199F257643C89EB608 -CT=A61810A2798A70A9D2B37E88DEF9AE0F - -I=8 -KEY=9B31CDFE8CE336BEB36A65F83079E66C -IV=A61810A2798A70A9D2B37E88DEF9AE0F -PT=CB97F090318A6B10F5044EB8333ECDD6 -CT=0034FA480DE6F65D98D30B026118718F - -I=9 -KEY=9B0537B68105C0E32BB96EFA516197E3 -IV=0034FA480DE6F65D98D30B026118718F -PT=1B8030AC682BA677A7A3ACDC7FB33BB6 -CT=BEA24548CBC4A6630C9F1251F2C3DC51 - -I=10 -KEY=25A772FE4AC1668027267CABA3A24BB2 -IV=BEA24548CBC4A6630C9F1251F2C3DC51 -PT=D0524282C9AC395508CB2991822E8F42 -CT=4F278DD0B06CBFBAA928635E7CA81B68 - -I=11 -KEY=6A80FF2EFAADD93A8E0E1FF5DF0A50DA -IV=4F278DD0B06CBFBAA928635E7CA81B68 -PT=49EA900E2F61DF8CDEA7D479F59C4C30 -CT=EDFF930BB183F8DAC2FC0BD01AD65882 - -I=12 -KEY=877F6C254B2E21E04CF21425C5DC0858 -IV=EDFF930BB183F8DAC2FC0BD01AD65882 -PT=A1BBEB4E44EF725497B8C589192CC900 -CT=A6FE530E9509D48BAF30F601D04DB19D - -I=13 -KEY=21813F2BDE27F56BE3C2E2241591B9C5 -IV=A6FE530E9509D48BAF30F601D04DB19D -PT=4AD71402771A83F41F7E3AC004150CB7 -CT=FF1148A2E07401F7291B418D62618B65 - -I=14 -KEY=DE9077893E53F49CCAD9A3A977F032A0 -IV=FF1148A2E07401F7291B418D62618B65 -PT=AC47A1FD3490D6E809D40D4BEB8FF639 -CT=4420D4686F7A4D77A72810E89A5E0DF1 - -I=15 -KEY=9AB0A3E15129B9EB6DF1B341EDAE3F51 -IV=4420D4686F7A4D77A72810E89A5E0DF1 -PT=F22E1865DD87A88238173FC693C382E7 -CT=A4C7DE5DF9E2B6A20A1E22F8D7496ACD - -I=16 -KEY=3E777DBCA8CB0F4967EF91B93AE7559C -IV=A4C7DE5DF9E2B6A20A1E22F8D7496ACD -PT=929EFB34B1C552221B648A3D2C678EC9 -CT=D93DBCCA25FA4D9D8C37B3F107FCFA3C - -I=17 -KEY=E74AC1768D3142D4EBD822483D1BAFA0 -IV=D93DBCCA25FA4D9D8C37B3F107FCFA3C -PT=771C61ABB1E9BAB6F678336C8193307E -CT=75F491C2EA85184ACA3C96B769FA9698 - -I=18 -KEY=92BE50B467B45A9E21E4B4FF54E13938 -IV=75F491C2EA85184ACA3C96B769FA9698 -PT=55E42F98CCED821FE211D29674E77F48 -CT=A9C7536B77265ECBF7AC5ECD1EF5DDE2 - -I=19 -KEY=3B7903DF10920455D648EA324A14E4DA -IV=A9C7536B77265ECBF7AC5ECD1EF5DDE2 -PT=56BC0FA54F6F1E04A9A8893D3964EA68 -CT=3C749BF7EFA55CE924D1B33291C2B586 - -I=20 -KEY=070D9828FF3758BCF2995900DBD6515C -IV=3C749BF7EFA55CE924D1B33291C2B586 -PT=45D9BBBB1F3BB33EE182F09C90B1661C -CT=C4708DBAEBD202CDD2054DDCB1AF7BAB - -I=21 -KEY=C37D159214E55A71209C14DC6A792AF7 -IV=C4708DBAEBD202CDD2054DDCB1AF7BAB -PT=37765B154264AD781BBE5F5717DE7038 -CT=87457FD2EE747645576A27F46B00EC30 - -I=22 -KEY=44386A40FA912C3477F633280179C6C7 -IV=87457FD2EE747645576A27F46B00EC30 -PT=A7150BBC7BE3837E145AB83E554B49DE -CT=E25743DAD8E627803DA6C5E587C82384 - -I=23 -KEY=A66F299A22770BB44A50F6CD86B1E543 -IV=E25743DAD8E627803DA6C5E587C82384 -PT=173343A8488146FC9E4B59C2DF42BAF3 -CT=0D0A78CD5E3EB40F92FB55351122E92B - -I=24 -KEY=AB6551577C49BFBBD8ABA3F897930C68 -IV=0D0A78CD5E3EB40F92FB55351122E92B -PT=3B68CFE78B5DEA8F5165A2034D8C2823 -CT=1921B523A2F9B5F53C740D451C9FCE0C - -I=25 -KEY=B244E474DEB00A4EE4DFAEBD8B0CC264 -IV=1921B523A2F9B5F53C740D451C9FCE0C -PT=FDDD484B52C7F3A32F4514BEF5A646E3 -CT=6EAC2BB6EDF35C1267FF4F10700F3CD7 - -I=26 -KEY=DCE8CFC23343565C8320E1ADFB03FEB3 -IV=6EAC2BB6EDF35C1267FF4F10700F3CD7 -PT=CDAD592E5467AD1FA1B71D8AC050FCE0 -CT=D9624E40A8C9A2C58ABEDBAEB865DC1F - -I=27 -KEY=058A81829B8AF499099E3A03436622AC -IV=D9624E40A8C9A2C58ABEDBAEB865DC1F -PT=F9E90A4D7A9EF66818004CBC47C8C6EA -CT=DE15C7322B32738BB493E7FA27AFE6E2 - -I=28 -KEY=DB9F46B0B0B88712BD0DDDF964C9C44E -IV=DE15C7322B32738BB493E7FA27AFE6E2 -PT=FE3CC4AE4A13AC8946407CEEE220290B -CT=5822C79D627AD8A0C4975873D62C5E11 - -I=29 -KEY=83BD812DD2C25FB2799A858AB2E59A5F -IV=5822C79D627AD8A0C4975873D62C5E11 -PT=A5106EBD8888CC3A6884AC8E8EA9C97A -CT=F5AD0473A4228662D9F76E7A5ED4DBDD - -I=30 -KEY=7610855E76E0D9D0A06DEBF0EC314182 -IV=F5AD0473A4228662D9F76E7A5ED4DBDD -PT=4F30B073FB95CD0F0317E749F20E7A7D -CT=4B39DA1FA331CFEB1D6713054C6E9474 - -I=31 -KEY=3D295F41D5D1163BBD0AF8F5A05FD5F6 -IV=4B39DA1FA331CFEB1D6713054C6E9474 -PT=4850735E17F01A3B131E1B78B3A6EB96 -CT=32D1BE8640859CFAB16D64CE8795729B - -I=32 -KEY=0FF8E1C795548AC10C679C3B27CAA76D -IV=32D1BE8640859CFAB16D64CE8795729B -PT=A8C4B9E0069935CB046ACBB49C0B1205 -CT=47DC1150929AA9610938CB0CFE92995E - -I=33 -KEY=4824F09707CE23A0055F5737D9583E33 -IV=47DC1150929AA9610938CB0CFE92995E -PT=13F5DA56D399A7DAA004D0BE76845E68 -CT=BCA6BD8971837B8A81B923E5B2ED0D83 - -I=34 -KEY=F4824D1E764D582A84E674D26BB533B0 -IV=BCA6BD8971837B8A81B923E5B2ED0D83 -PT=8397C79E02FDFE6B7D47FA0181EA453A -CT=23D991B7DA5E96966830E7B40B5A2D8A - -I=35 -KEY=D75BDCA9AC13CEBCECD6936660EF1E3A -IV=23D991B7DA5E96966830E7B40B5A2D8A -PT=18987E5504E23C0F862BCA8DFFC2B07F -CT=17AA31C49F584DEF77C8E7891B11652B - -I=36 -KEY=C0F1ED6D334B83539B1E74EF7BFE7B11 -IV=17AA31C49F584DEF77C8E7891B11652B -PT=A34D44CC1C6E171D7D48447F87E2F2C1 -CT=DD1F90F66D4062E6823F0F229562D110 - -I=37 -KEY=1DEE7D9B5E0BE1B519217BCDEE9CAA01 -IV=DD1F90F66D4062E6823F0F229562D110 -PT=C9793582E22B8840BBAA3D7669208CCC -CT=8F5B876777F7CA903B1D6346AA8BDAE7 - -I=38 -KEY=92B5FAFC29FC2B25223C188B441770E6 -IV=8F5B876777F7CA903B1D6346AA8BDAE7 -PT=730EACFEE3817A94B88117ABB3F9CDE4 -CT=388780BA989C0A8BB5BD9E4086D91EF7 - -I=39 -KEY=AA327A46B16021AE978186CBC2CE6E11 -IV=388780BA989C0A8BB5BD9E4086D91EF7 -PT=F004D3A14C6C94FA2D39BE0C71119658 -CT=7F4C33E4F5C055C05DB4B7691061B307 - -I=40 -KEY=D57E49A244A0746ECA3531A2D2AFDD16 -IV=7F4C33E4F5C055C05DB4B7691061B307 -PT=575F86A5D1637CB86449F8BC0F1573D3 -CT=F6FE1919F174065AB31AC43E0D733A81 - -I=41 -KEY=238050BBB5D47234792FF59CDFDCE797 -IV=F6FE1919F174065AB31AC43E0D733A81 -PT=14F8E2DB61B05E094CA4C0E9DA7800EE -CT=4CB876F2DC169F955E639C6C916340A6 - -I=42 -KEY=6F38264969C2EDA1274C69F04EBFA731 -IV=4CB876F2DC169F955E639C6C916340A6 -PT=F88BA2E4AA4ABDD381778DFD1DA1856F -CT=AEEB80B469D89E45BC3426B6CCC50440 - -I=43 -KEY=C1D3A6FD001A73E49B784F46827AA371 -IV=AEEB80B469D89E45BC3426B6CCC50440 -PT=195F74019B65C0F7D724491BDE8C8B88 -CT=2FD7CCDBDB2B2037C104F0A707A11EDA - -I=44 -KEY=EE046A26DB3153D35A7CBFE185DBBDAB -IV=2FD7CCDBDB2B2037C104F0A707A11EDA -PT=FF51887AB5FEC9C97CB61BB2DE9CDBC6 -CT=8DF7BB99B781C63F4F8B2A7D5DFF2960 - -I=45 -KEY=63F3D1BF6CB095EC15F7959CD82494CB -IV=8DF7BB99B781C63F4F8B2A7D5DFF2960 -PT=A35AAB0055E99FA980D59B242B8C6257 -CT=7D96ECC20571E9E85C16E3BDADA374CA - -I=46 -KEY=1E653D7D69C17C0449E176217587E001 -IV=7D96ECC20571E9E85C16E3BDADA374CA -PT=02CC392194874CD531025588C96E2D22 -CT=AA1DC2E69CE582DFA9A1B435854FCBB1 - -I=47 -KEY=B478FF9BF524FEDBE040C214F0C82BB0 -IV=AA1DC2E69CE582DFA9A1B435854FCBB1 -PT=94CC5DB118EF53C904B0EEC23AC650FD -CT=DA0CA33BCCE4ABA1936833127D1F5E25 - -I=48 -KEY=6E745CA039C0557A7328F1068DD77595 -IV=DA0CA33BCCE4ABA1936833127D1F5E25 -PT=52F009E929526E923BE4F43B66876725 -CT=B5E80FF4DADD69BB7493B9F72A752811 - -I=49 -KEY=DB9C5354E31D3CC107BB48F1A7A25D84 -IV=B5E80FF4DADD69BB7493B9F72A752811 -PT=6B88B42E99E5B4F838064A711B71DE1F -CT=5CDDCE45516C6D1654647A1A541AC435 - -I=50 -KEY=87419D11B27151D753DF32EBF3B899B1 -IV=5CDDCE45516C6D1654647A1A541AC435 -PT=9E25CBDD8E2D7D68FF72932E35879175 -CT=3C7E88A9A6462D08ADA5910A3FCE611A - -I=51 -KEY=BB3F15B814377CDFFE7AA3E1CC76F8AB -IV=3C7E88A9A6462D08ADA5910A3FCE611A -PT=72A4EF1D82A3AC5C1DFDF8C4DCFB9F6E -CT=E428200E1C3BE9A5141F73590B7473B8 - -I=52 -KEY=5F1735B6080C957AEA65D0B8C7028B13 -IV=E428200E1C3BE9A5141F73590B7473B8 -PT=7CD8053F2FD743A44CC39F75C1E81075 -CT=AB3B8A79653E884053AFC8C14504AF77 - -I=53 -KEY=F42CBFCF6D321D3AB9CA187982062464 -IV=AB3B8A79653E884053AFC8C14504AF77 -PT=0731077A8B6854CB90AFFAE3A3B199C4 -CT=53B7DFD6D12DDE7966C62FCC1946A4AC - -I=54 -KEY=A79B6019BC1FC343DF0C37B59B4080C8 -IV=53B7DFD6D12DDE7966C62FCC1946A4AC -PT=E4E26CA1DA697F30E0542763313A79B7 -CT=6DEC201BBB90B66A3B2DFF4FA1DDF7C4 - -I=55 -KEY=CA774002078F7529E421C8FA3A9D770C -IV=6DEC201BBB90B66A3B2DFF4FA1DDF7C4 -PT=C2CF11681C4767A78B2F95AFB50CF155 -CT=F535B7CD4135A39E0E344BD2CFA14B83 - -I=56 -KEY=3F42F7CF46BAD6B7EA158328F53C3C8F -IV=F535B7CD4135A39E0E344BD2CFA14B83 -PT=606618948C1ED454B9B0F92435381D2D -CT=209AC483682C48AA197BB64417127656 - -I=57 -KEY=1FD8334C2E969E1DF36E356CE22E4AD9 -IV=209AC483682C48AA197BB64417127656 -PT=8F8A70AADF2F8BFB5E137F86AC83D32F -CT=76F5F43A888D7F22D698A73810ED5B15 - -I=58 -KEY=692DC776A61BE13F25F69254F2C311CC -IV=76F5F43A888D7F22D698A73810ED5B15 -PT=E9E8AEBF16A5F4E1C26B4A385163E844 -CT=625C62F33C9548F2651FB0A08BF45286 - -I=59 -KEY=0B71A5859A8EA9CD40E922F47937434A -IV=625C62F33C9548F2651FB0A08BF45286 -PT=C69CFD36C50EBA06E3B3C4AB7C9B694E -CT=3931CE6DF783063F26920D4048B00C82 - -I=60 -KEY=32406BE86D0DAFF2667B2FB431874FC8 -IV=3931CE6DF783063F26920D4048B00C82 -PT=5DFE322DD692BA8DD9CD328A5AF9A3B7 -CT=A3CA3ECE725C84281144052A80EA5176 - -I=61 -KEY=918A55261F512BDA773F2A9EB16D1EBE -IV=A3CA3ECE725C84281144052A80EA5176 -PT=4BBD16BF74226F816767A7207C672C9A -CT=94552690A231354F8F9BEF295E55F142 - -I=62 -KEY=05DF73B6BD601E95F8A4C5B7EF38EFFC -IV=94552690A231354F8F9BEF295E55F142 -PT=7055D0C535B2B0501FF6AAEE46E03818 -CT=771908987F00C2D822897E7EEA148F29 - -I=63 -KEY=72C67B2EC260DC4DDA2DBBC9052C60D5 -IV=771908987F00C2D822897E7EEA148F29 -PT=7336B9D4977BDDA811C0C5EBEA539574 -CT=7AA84598115B181863081AFCC239EDD2 - -I=64 -KEY=086E3EB6D33BC455B925A135C7158D07 -IV=7AA84598115B181863081AFCC239EDD2 -PT=5296C8546532BAEACBEC9F29916FB6B2 -CT=3D95967035AF639B2D2814DEB9B7F86A - -I=65 -KEY=35FBA8C6E694A7CE940DB5EB7EA2756D -IV=3D95967035AF639B2D2814DEB9B7F86A -PT=430880F5576C7783BC1336F900DDD037 -CT=4D70AAD2FC9EF403B463A72DB4CFE640 - -I=66 -KEY=788B02141A0A53CD206E12C6CA6D932D -IV=4D70AAD2FC9EF403B463A72DB4CFE640 -PT=E489B93778DE0C42FEFB6122ECA46BDC -CT=165DDB405546934E81CB6B0B89B4A40E - -I=67 -KEY=6ED6D9544F4CC083A1A579CD43D93723 -IV=165DDB405546934E81CB6B0B89B4A40E -PT=8E5481ACD58BFC5D141C1F71CDE91E37 -CT=693775A3661CE9D0E4CB4888431C64A5 - -I=68 -KEY=07E1ACF729502953456E314500C55386 -IV=693775A3661CE9D0E4CB4888431C64A5 -PT=4AAA5E507EFB9FAD15E5F4C77F46AF89 -CT=C42391D50B1210C67B6AD642745A4DAC - -I=69 -KEY=C3C23D22224239953E04E707749F1E2A -IV=C42391D50B1210C67B6AD642745A4DAC -PT=4E0748F8716801B099494037485B8BA4 -CT=A4CB7F010AC42B4C3C14F02353F3644A - -I=70 -KEY=67094223288612D902101724276C7A60 -IV=A4CB7F010AC42B4C3C14F02353F3644A -PT=0B7B41D57885DB37A2FC355C8D03FF3C -CT=1BB0CBD24537B36EB555BE8C0FEC3A1F - -I=71 -KEY=7CB989F16DB1A1B7B745A9A82880407F -IV=1BB0CBD24537B36EB555BE8C0FEC3A1F -PT=4696F9A564354194142AB7B8630B4279 -CT=18B10BAE39D4FA58F586A067A8E38BC5 - -I=72 -KEY=6408825F54655BEF42C309CF8063CBBA -IV=18B10BAE39D4FA58F586A067A8E38BC5 -PT=0B59EBABAB994F2DDB3DE383454BECE8 -CT=C09C6670B93ECD303BA53DE58DD81A64 - -I=73 -KEY=A494E42FED5B96DF7966342A0DBBD1DE -IV=C09C6670B93ECD303BA53DE58DD81A64 -PT=2F897F3385E71133CEC8367411E830A3 -CT=45EA7CB9119DF7367294F9FE36D4A09F - -I=74 -KEY=E17E9896FCC661E90BF2CDD43B6F7141 -IV=45EA7CB9119DF7367294F9FE36D4A09F -PT=8CDE9D975B51A098F4CAC93DC58C002F -CT=02DDD735439A8AE03E976E629A6C992C - -I=75 -KEY=E3A34FA3BF5CEB093565A3B6A103E86D -IV=02DDD735439A8AE03E976E629A6C992C -PT=1E20571F82C2C6884A6F90A23FD3A925 -CT=B040686B866AE80A88B899031F2F0EE4 - -I=76 -KEY=53E327C839360303BDDD3AB5BE2CE689 -IV=B040686B866AE80A88B899031F2F0EE4 -PT=0851624711970ADE2F456D5DAFB17E05 -CT=201756BC061706513264A3C489D95A0C - -I=77 -KEY=73F471743F2105528FB9997137F5BC85 -IV=201756BC061706513264A3C489D95A0C -PT=E8B1410DE742136E71F54D31FEAA72EB -CT=2EF27C31AA488648FCE0F1804D658092 - -I=78 -KEY=5D060D459569831A735968F17A903C17 -IV=2EF27C31AA488648FCE0F1804D658092 -PT=97E0CA84C9B22C8942C7FC5088EAED04 -CT=7545F1D9C8F5F8B441EDCDAF00462344 - -I=79 -KEY=2843FC9C5D9C7BAE32B4A55E7AD61F53 -IV=7545F1D9C8F5F8B441EDCDAF00462344 -PT=7B5572C09E998656B55C53748CF77C21 -CT=347875EFD6BD978CD1B2EA949F7E2358 - -I=80 -KEY=1C3B89738B21EC22E3064FCAE5A83C0B -IV=347875EFD6BD978CD1B2EA949F7E2358 -PT=A30001AA29D70B0A141B8FC8B9B2E210 -CT=9C956408BA335CCC9F02F31CC45FD5E6 - -I=81 -KEY=80AEED7B3112B0EE7C04BCD621F7E9ED -IV=9C956408BA335CCC9F02F31CC45FD5E6 -PT=839783D75859393B215010F63159FA45 -CT=B70E700F4A7ED08618754960B83BD0F2 - -I=82 -KEY=37A09D747B6C60686471F5B699CC391F -IV=B70E700F4A7ED08618754960B83BD0F2 -PT=1E3C630BC8C34BF8822686043D14E4D6 -CT=4721B6796F82D47D6EEB9CB11A19605E - -I=83 -KEY=70812B0D14EEB4150A9A690783D55941 -IV=4721B6796F82D47D6EEB9CB11A19605E -PT=CEE1B977E8B75623CC4E2C4F4765FE2A -CT=3382E1B076680BBBE7C451582016DD11 - -I=84 -KEY=4303CABD6286BFAEED5E385FA3C38450 -IV=3382E1B076680BBBE7C451582016DD11 -PT=02365457AB60C892A0C34A7067AB7608 -CT=AB581732E06B90AA0C835C1C7B6D18B5 - -I=85 -KEY=E85BDD8F82ED2F04E1DD6443D8AE9CE5 -IV=AB581732E06B90AA0C835C1C7B6D18B5 -PT=222B7ED84C648C12FFDD6E8E13EEC651 -CT=3E2E592CEEAD3B5E16860E80E406E882 - -I=86 -KEY=D67584A36C40145AF75B6AC33CA87467 -IV=3E2E592CEEAD3B5E16860E80E406E882 -PT=7D24BD646EEBA44ED27B11DA42D72FF8 -CT=9163F6DBE0D8BB79A154D92E37A07E1C - -I=87 -KEY=471672788C98AF23560FB3ED0B080A7B -IV=9163F6DBE0D8BB79A154D92E37A07E1C -PT=42B571FFB3275F5A8E26616A3F0E3403 -CT=E1340E61513FE8146F29E111392E2C3A - -I=88 -KEY=A6227C19DDA74737392652FC32262641 -IV=E1340E61513FE8146F29E111392E2C3A -PT=6EFD16D48E03B6E1CD74777ABC891DA8 -CT=3D703B4FD8A8A7F015D0FD47DE0C5A28 - -I=89 -KEY=9B524756050FE0C72CF6AFBBEC2A7C69 -IV=3D703B4FD8A8A7F015D0FD47DE0C5A28 -PT=7956129687AC95397E14821A17F267DE -CT=C5C6D2BAABDBE0B82CDFFFE7A92C8344 - -I=90 -KEY=5E9495ECAED4007F0029505C4506FF2D -IV=C5C6D2BAABDBE0B82CDFFFE7A92C8344 -PT=AC661770332FE0A45B80791C3A5D1241 -CT=6F7BDE1BD17C5B10064B52EB54EE90B0 - -I=91 -KEY=31EF4BF77FA85B6F066202B711E86F9D -IV=6F7BDE1BD17C5B10064B52EB54EE90B0 -PT=1DE0702C81667A979E5E3542DA95C5AD -CT=DC7E35D5B02AFF4B92C190265E01C0F8 - -I=92 -KEY=ED917E22CF82A42494A392914FE9AF65 -IV=DC7E35D5B02AFF4B92C190265E01C0F8 -PT=A491CB4321C757FD353B560C0B3EA4D0 -CT=D753F5A6C5D7E17F4024FD8675B23E7F - -I=93 -KEY=3AC28B840A55455BD4876F173A5B911A -IV=D753F5A6C5D7E17F4024FD8675B23E7F -PT=418FA3B3E9B4E463D04AC3A3361DCA57 -CT=B635529E8080B33E9AD6D79B8203112D - -I=94 -KEY=8CF7D91A8AD5F6654E51B88CB8588037 -IV=B635529E8080B33E9AD6D79B8203112D -PT=C87E4ED505989807D1DBDA4769804EA3 -CT=43E763CD1B9EE4BC474B79C1E0DA2564 - -I=95 -KEY=CF10BAD7914B12D9091AC14D5882A553 -IV=43E763CD1B9EE4BC474B79C1E0DA2564 -PT=042F084454D0EE01AB00D3921E1BCA06 -CT=C799956FF8A7A05B71123EBC4AA09C0C - -I=96 -KEY=08892FB869ECB2827808FFF11222395F -IV=C799956FF8A7A05B71123EBC4AA09C0C -PT=9A8E40400C51A438DCE498AD3455DE51 -CT=76679B0E26B1B6CA2A8D90944777C57F - -I=97 -KEY=7EEEB4B64F5D044852856F655555FC20 -IV=76679B0E26B1B6CA2A8D90944777C57F -PT=227E122D3AF18A3CAA973B33B3356CE7 -CT=B2F52396F02D2DFFE36C5F9238AC1EBE - -I=98 -KEY=CC1B9720BF7029B7B1E930F76DF9E29E -IV=B2F52396F02D2DFFE36C5F9238AC1EBE -PT=0D9CDD97E2FE0E78CF16B1596DC20ABA -CT=7C8EDD3A079835954238E0FE4872AAE1 - -I=99 -KEY=B0954A1AB8E81C22F3D1D009258B487F -IV=7C8EDD3A079835954238E0FE4872AAE1 -PT=925A7ECD233B3B3CCDE2221A03C5F720 -CT=D7C9FD3EF010C8577087591149D5640F - -I=100 -KEY=675CB72448F8D475835689186C5E2C70 -IV=D7C9FD3EF010C8577087591149D5640F -PT=59FEFBE5179F0E7E48F3D97CDA314FF5 -CT=2608CCE6BA917551DEF84FA7BCA9B23C - -I=101 -KEY=41547BC2F269A1245DAEC6BFD0F79E4C -IV=2608CCE6BA917551DEF84FA7BCA9B23C -PT=7F24A1BA8762294194F76322A6B28A16 -CT=EFF1513B52D5D74D2202898AC99552C4 - -I=102 -KEY=AEA52AF9A0BC76697FAC4F351962CC88 -IV=EFF1513B52D5D74D2202898AC99552C4 -PT=79B43F27F3E144C4EFBF383698A1EC90 -CT=B4B3B020D44D059666E86D22072916B5 - -I=103 -KEY=1A169AD974F173FF194422171E4BDA3D -IV=B4B3B020D44D059666E86D22072916B5 -PT=8BF20B60B4774354857BA2979CD396F9 -CT=6F1A3D43CC2171A808AE8D38396DE1D1 - -I=104 -KEY=750CA79AB8D0025711EAAF2F27263BEC -IV=6F1A3D43CC2171A808AE8D38396DE1D1 -PT=74955DDACFB8A5467D069F1EF341248B -CT=47C23A68DA351C22EBF86FDBD8F723B4 - -I=105 -KEY=32CE9DF262E51E75FA12C0F4FFD11858 -IV=47C23A68DA351C22EBF86FDBD8F723B4 -PT=25D7A186ED990020E10A23C5CFB1CEF9 -CT=D5F2E2C2CED730479D87E0AF0FEF8A73 - -I=106 -KEY=E73C7F30AC322E326795205BF03E922B -IV=D5F2E2C2CED730479D87E0AF0FEF8A73 -PT=13480F2EDCCB62B8F9A7DF98238571FC -CT=F29A46A7F1B1D1D4F5FE30E569D7A801 - -I=107 -KEY=15A639975D83FFE6926B10BE99E93A2A -IV=F29A46A7F1B1D1D4F5FE30E569D7A801 -PT=75E138123B5A98596303ACF9DAEEA714 -CT=9F6E9A13913DF78AC67BD20303AF49B5 - -I=108 -KEY=8AC8A384CCBE086C5410C2BD9A46739F -IV=9F6E9A13913DF78AC67BD20303AF49B5 -PT=DBD0AE00FD06761626366EB251412A32 -CT=46AC9F42239B22A163CE0FDEAA103D44 - -I=109 -KEY=CC643CC6EF252ACD37DECD6330564EDB -IV=46AC9F42239B22A163CE0FDEAA103D44 -PT=B8768A8AF461C9547D1F982FE90E96B6 -CT=95D7C8F969B0EEB03FEC257043597315 - -I=110 -KEY=59B3F43F8695C47D0832E813730F3DCE -IV=95D7C8F969B0EEB03FEC257043597315 -PT=3D20CC8AD484048251C7A81C7E3CA59C -CT=6B74AF42435BC640A826EC443207574E - -I=111 -KEY=32C75B7DC5CE023DA014045741086A80 -IV=6B74AF42435BC640A826EC443207574E -PT=BF719F78B23BAFD4A50634BCD9361095 -CT=31E3919F36D79FBF61884227110C10FF - -I=112 -KEY=0324CAE2F3199D82C19C467050047A7F -IV=31E3919F36D79FBF61884227110C10FF -PT=E1D32740BB8B6D67AD3038887899F090 -CT=A1CD90683CE041D6CA20780176FDD5F4 - -I=113 -KEY=A2E95A8ACFF9DC540BBC3E7126F9AF8B -IV=A1CD90683CE041D6CA20780176FDD5F4 -PT=3069EA97F092ACDCF41649377B8FCBC8 -CT=7220F866A10DC711DC1D277B4C8F204D - -I=114 -KEY=D0C9A2EC6EF41B45D7A1190A6A768FC6 -IV=7220F866A10DC711DC1D277B4C8F204D -PT=B0563A5E0EE1E2B96F3F7D04EE39EA7C -CT=CF81CA348B98C532B172F032AE0A6FED - -I=115 -KEY=1F4868D8E56CDE7766D3E938C47CE02B -IV=CF81CA348B98C532B172F032AE0A6FED -PT=B1B78BD75C30DD4E1E198ACB98B498A6 -CT=99C990D64D27D47ED0C1E7F186AC6674 - -I=116 -KEY=8681F80EA84B0A09B6120EC942D0865F -IV=99C990D64D27D47ED0C1E7F186AC6674 -PT=D413E3CC66E9938E4E0CFC1975E38C8C -CT=30C7DAD86FEF77C43A44A3EF8B116354 - -I=117 -KEY=B64622D6C7A47DCD8C56AD26C9C1E50B -IV=30C7DAD86FEF77C43A44A3EF8B116354 -PT=CD85D9334481AE85B8816233CA4AF7DB -CT=9E717B45239DD908138837154B803654 - -I=118 -KEY=28375993E439A4C59FDE9A338241D35F -IV=9E717B45239DD908138837154B803654 -PT=925BA3760D655D5B788802DDE25732BB -CT=4A6E32C01709EBCCC9BCA43FD5DFDFB3 - -I=119 -KEY=62596B53F3304F0956623E0C579E0CEC -IV=4A6E32C01709EBCCC9BCA43FD5DFDFB3 -PT=0AA6264BFCC7BD07FA8F94E1EF739633 -CT=7263392DC9DA868BC0317A6D4AD52553 - -I=120 -KEY=103A527E3AEAC982965344611D4B29BF -IV=7263392DC9DA868BC0317A6D4AD52553 -PT=FB385BD8ECE7C4DFE2351D851141888D -CT=AA49B1DDA3AF4D05D861667E88AD61AB - -I=121 -KEY=BA73E3A3994584874E32221F95E64814 -IV=AA49B1DDA3AF4D05D861667E88AD61AB -PT=510E13E20BB06EAD335F10F2C69831D3 -CT=3AC256A92F69AF35DB05DDCA61CF1EE4 - -I=122 -KEY=80B1B50AB62C2BB29537FFD5F42956F0 -IV=3AC256A92F69AF35DB05DDCA61CF1EE4 -PT=0A07CAA0EC6CB726F1A38847253BECB6 -CT=037497736381429A5E5A139C44A6C64A - -I=123 -KEY=83C52279D5AD6928CB6DEC49B08F90BA -IV=037497736381429A5E5A139C44A6C64A -PT=864FEF67C8902757E2CFB28DA2EF3C8D -CT=5393D7F9F37A5B9F1F82C1BE20435149 - -I=124 -KEY=D056F58026D732B7D4EF2DF790CCC1F3 -IV=5393D7F9F37A5B9F1F82C1BE20435149 -PT=ED2D2A671677067B30540D4C9D86905F -CT=2969AC5FB94EC76209C6DF58F6B8AA01 - -I=125 -KEY=F93F59DF9F99F5D5DD29F2AF66746BF2 -IV=2969AC5FB94EC76209C6DF58F6B8AA01 -PT=67ED14454DAD764C1772BCB1E0527954 -CT=150F94E1940F9D2ACC735F79B0912A06 - -I=126 -KEY=EC30CD3E0B9668FF115AADD6D6E541F4 -IV=150F94E1940F9D2ACC735F79B0912A06 -PT=517A4852F68370EDD879E32F52FD4D2B -CT=6EFD8E4E4C096A2033B3DA8A1F0066AF - -I=127 -KEY=82CD4370479F02DF22E9775CC9E5275B -IV=6EFD8E4E4C096A2033B3DA8A1F0066AF -PT=DBF4CAD912437115658E5BA5E1724739 -CT=899D9126CD85D2D4053AD9EE7156041B - -I=128 -KEY=0B50D2568A1AD00B27D3AEB2B8B32340 -IV=899D9126CD85D2D4053AD9EE7156041B -PT=69B302F96AFCF802AC639EBABC52ECFB -CT=819E4B8319807088FF306E125E52DAD3 - -I=129 -KEY=8ACE99D5939AA083D8E3C0A0E6E1F993 -IV=819E4B8319807088FF306E125E52DAD3 -PT=F5CA57371833F0AF98F0EC02DFE518ED -CT=4DFA3739235D14660DF7D5FDE36F6567 - -I=130 -KEY=C734AEECB0C7B4E5D514155D058E9CF4 -IV=4DFA3739235D14660DF7D5FDE36F6567 -PT=29BBD9264B9792BED8A8EFA43F943A7D -CT=4EA36ECCBCCD9FAFD8FB588BD53826A7 - -I=131 -KEY=8997C0200C0A2B4A0DEF4DD6D0B6BA53 -IV=4EA36ECCBCCD9FAFD8FB588BD53826A7 -PT=149120CFC3D7C671F287AA77A4A3EF97 -CT=0282357C78C8944A5520AF80506DE30D - -I=132 -KEY=8B15F55C74C2BF0058CFE25680DB595E -IV=0282357C78C8944A5520AF80506DE30D -PT=02C2E0CCB12F5216213D493325F38FC3 -CT=C827C36F654137A2BB127D1782285B10 - -I=133 -KEY=43323633118388A2E3DD9F4102F3024E -IV=C827C36F654137A2BB127D1782285B10 -PT=FA1693AD90401791FF9093A562EC66EB -CT=3723A94BC91032BF8DB599ABEFB784D1 - -I=134 -KEY=74119F78D893BA1D6E6806EAED44869F -IV=3723A94BC91032BF8DB599ABEFB784D1 -PT=5410CBE33ABB58AB0B0E86F5817E6F2C -CT=26A520B5B475632EE8806648BFC028AF - -I=135 -KEY=52B4BFCD6CE6D93386E860A25284AE30 -IV=26A520B5B475632EE8806648BFC028AF -PT=B01A11D200C24F4333029DE3BFF49601 -CT=36D5E00E0A53D7CE1498215AFA686905 - -I=136 -KEY=64615FC366B50EFD927041F8A8ECC735 -IV=36D5E00E0A53D7CE1498215AFA686905 -PT=252E4460E9A391D54CE9E516663E59AE -CT=829F0B7B17ED5F2FB7A014A6CD9D8052 - -I=137 -KEY=E6FE54B8715851D225D0555E65714767 -IV=829F0B7B17ED5F2FB7A014A6CD9D8052 -PT=BCC51A6493F6847BEA8219329F67308D -CT=BAB1D358D08DA13BEC485051F2EBFE2E - -I=138 -KEY=5C4F87E0A1D5F0E9C998050F979AB949 -IV=BAB1D358D08DA13BEC485051F2EBFE2E -PT=D89236011B3C2338E95322D4716AEE59 -CT=29BA99F8CF8B48134B1330E75BD7254E - -I=139 -KEY=75F51E186E5EB8FA828B35E8CC4D9C07 -IV=29BA99F8CF8B48134B1330E75BD7254E -PT=21D0EB5857C93A0D4D75253E1020C00E -CT=9D557274FE14AA69673441117A2D7DA2 - -I=140 -KEY=E8A06C6C904A1293E5BF74F9B660E1A5 -IV=9D557274FE14AA69673441117A2D7DA2 -PT=3C3BB454584C4C7570089B6E631BA035 -CT=543EF50A024E77ACE685BD0BBB47232D - -I=141 -KEY=BC9E99669204653F033AC9F20D27C288 -IV=543EF50A024E77ACE685BD0BBB47232D -PT=8ED890BC903AEAC7C3C685980EDB3370 -CT=884BD68868D89DE9DEDB2D95A8B992FB - -I=142 -KEY=34D54FEEFADCF8D6DDE1E467A59E5073 -IV=884BD68868D89DE9DEDB2D95A8B992FB -PT=684DEBD6DEDE24BD0F4F8AFA47F08AEF -CT=DB00984CAEB14CF5A1FDE8E8E9C03830 - -I=143 -KEY=EFD5D7A2546DB4237C1C0C8F4C5E6843 -IV=DB00984CAEB14CF5A1FDE8E8E9C03830 -PT=C42B245443F2695F306455199C7C76FE -CT=0CA808425E8EBDDD5519130F4900329F - -I=144 -KEY=E37DDFE00AE309FE29051F80055E5ADC -IV=0CA808425E8EBDDD5519130F4900329F -PT=1655F89334CCB6ED8E140088997BD2D1 -CT=0DAE2F85CD81874DCD7368277D0C386D - -I=145 -KEY=EED3F065C7628EB3E47677A7785262B1 -IV=0DAE2F85CD81874DCD7368277D0C386D -PT=2B7A2DF6E0CAC83837AFDC8B2134E6A6 -CT=E3BF66A6784432E6CE61B769C3CFDB35 - -I=146 -KEY=0D6C96C3BF26BC552A17C0CEBB9DB984 -IV=E3BF66A6784432E6CE61B769C3CFDB35 -PT=8FED19E77B9690EC8F70272364B4EB74 -CT=473925552401311F24EE4F40B5A3ECB5 - -I=147 -KEY=4A55B3969B278D4A0EF98F8E0E3E5531 -IV=473925552401311F24EE4F40B5A3ECB5 -PT=032D9AF654037E2586B12CF031E4AB4C -CT=E9E1E4ACF3F4E25CB8093F6B27665DFF - -I=148 -KEY=A3B4573A68D36F16B6F0B0E5295808CE -IV=E9E1E4ACF3F4E25CB8093F6B27665DFF -PT=E6EF26B3721F6C772D231584DD480441 -CT=2D9F85D63FED609876DF97F0E6B85564 - -I=149 -KEY=8E2BD2EC573E0F8EC02F2715CFE05DAA -IV=2D9F85D63FED609876DF97F0E6B85564 -PT=E641EBC4A734C71669D948F1BEEE675A -CT=3A61F4BED09FD7A7AED71E9FD53D2EE3 - -I=150 -KEY=B44A265287A1D8296EF8398A1ADD7349 -IV=3A61F4BED09FD7A7AED71E9FD53D2EE3 -PT=36DB43747CD9215857886A0DE2008509 -CT=6BE2AD95F4A642F3FD73D9543B53D479 - -I=151 -KEY=DFA88BC773079ADA938BE0DE218EA730 -IV=6BE2AD95F4A642F3FD73D9543B53D479 -PT=58A73313B31B8C1EB3C144C9363EE94B -CT=BF198D336DF857BFBA069634C25CF45B - -I=152 -KEY=60B106F41EFFCD65298D76EAE3D2536B -IV=BF198D336DF857BFBA069634C25CF45B -PT=E0974E1BBEFE21422ECED27858535F87 -CT=7945132F6F7EED6B61E1CF9C47E2AB2A - -I=153 -KEY=19F415DB7181200E486CB976A430F841 -IV=7945132F6F7EED6B61E1CF9C47E2AB2A -PT=6F36B63A1A8B426282CA4E61B7E37B3A -CT=AF441F330C8C199E9776D92A92B02216 - -I=154 -KEY=B6B00AE87D0D3990DF1A605C3680DA57 -IV=AF441F330C8C199E9776D92A92B02216 -PT=99AD2B814D3A4C0E1C27D4251C55C74A -CT=F34463A538E46E87B0F24EAA36B674A7 - -I=155 -KEY=45F4694D45E957176FE82EF60036AEF0 -IV=F34463A538E46E87B0F24EAA36B674A7 -PT=6D05C19E42D0561C198A10FA55F4C870 -CT=5D54D3C72D55015D0149FA1591208824 - -I=156 -KEY=18A0BA8A68BC564A6EA1D4E3911626D4 -IV=5D54D3C72D55015D0149FA1591208824 -PT=7AA7A04DE8CD21F59BA5369CA175CEC3 -CT=D2EBE35C33210B39CD4F443BB577DBD8 - -I=157 -KEY=CA4B59D65B9D5D73A3EE90D82461FD0C -IV=D2EBE35C33210B39CD4F443BB577DBD8 -PT=2DA2A48FE13FA4DD5271A02FB7F98AEC -CT=2F4AD89C0D915DF978160E9E882AD28E - -I=158 -KEY=E501814A560C008ADBF89E46AC4B2F82 -IV=2F4AD89C0D915DF978160E9E882AD28E -PT=82EB831B9FF9DA7D06553A456133766B -CT=09A04C7CBED3D60ADB6CFDD012DEED17 - -I=159 -KEY=ECA1CD36E8DFD68000946396BE95C295 -IV=09A04C7CBED3D60ADB6CFDD012DEED17 -PT=8D4FD1CE8CB9745E9E65182D94F8307A -CT=193C6FAB40C87C7029983EDD52628400 - -I=160 -KEY=F59DA29DA817AAF0290C5D4BECF74695 -IV=193C6FAB40C87C7029983EDD52628400 -PT=F06A061082E499E65A5DED0D22323F57 -CT=7166BD655D8128E7B09D37B38478B480 - -I=161 -KEY=84FB1FF8F596821799916AF8688FF215 -IV=7166BD655D8128E7B09D37B38478B480 -PT=DCEC808551EA98534E1A9EDF457125DA -CT=5DFAAFB695D34A7AF2D39CD2D01FD4BD - -I=162 -KEY=D901B04E6045C86D6B42F62AB89026A8 -IV=5DFAAFB695D34A7AF2D39CD2D01FD4BD -PT=FAE59C96604D062F49C8C93FA7E4D5FC -CT=85F63AFC88A1CED4E73B849C295692F2 - -I=163 -KEY=5CF78AB2E8E406B98C7972B691C6B45A -IV=85F63AFC88A1CED4E73B849C295692F2 -PT=7FE1EA6A7A525A7E0222D6269F7D6A40 -CT=DC60A8554BF9E783D0E92283EC0D00AF - -I=164 -KEY=809722E7A31DE13A5C9050357DCBB4F5 -IV=DC60A8554BF9E783D0E92283EC0D00AF -PT=89C93828CE30D4CD7025D9F2CF864371 -CT=EF10720E8F10FBABC96BB5F4E5287D12 - -I=165 -KEY=6F8750E92C0D1A9195FBE5C198E3C9E7 -IV=EF10720E8F10FBABC96BB5F4E5287D12 -PT=A8DEA35D4A712ACE8F38A2CA2CB6BCFB -CT=EED271733DC7B81AD09C86C8F8D69255 - -I=166 -KEY=8155219A11CAA28B4567630960355BB2 -IV=EED271733DC7B81AD09C86C8F8D69255 -PT=6720AD239EFECF5785B238D4DA39DD6A -CT=DC47B1FAC154CB0C39ADF4C92F8C2902 - -I=167 -KEY=5D129060D09E69877CCA97C04FB972B0 -IV=DC47B1FAC154CB0C39ADF4C92F8C2902 -PT=D41DEA3BC44CC552B5ACCFEEFAF225F5 -CT=AD4828834513730BF275C854D35BF09E - -I=168 -KEY=F05AB8E3958D1A8C8EBF5F949CE2822E -IV=AD4828834513730BF275C854D35BF09E -PT=5059DA9258A7DE12865E1E2173399BC9 -CT=82CA6B085A452CFDFFBDE5C7B738CDAB - -I=169 -KEY=7290D3EBCFC836717102BA532BDA4F85 -IV=82CA6B085A452CFDFFBDE5C7B738CDAB -PT=9625B8A444C3E4D3554A8C6E33E1B810 -CT=4F44C38189E1011970690D0ED4BCB9C7 - -I=170 -KEY=3DD4106A46293768016BB75DFF66F642 -IV=4F44C38189E1011970690D0ED4BCB9C7 -PT=373FBCA7529A9FA9AF77295FC55B0BEE -CT=27BE0578B0F898C04133AA4D3C1A5A7C - -I=171 -KEY=1A6A1512F6D1AFA840581D10C37CAC3E -IV=27BE0578B0F898C04133AA4D3C1A5A7C -PT=37FC0A286DFFD5A76643D1D45C858F64 -CT=B9C70B34F78F3DA7796C32D0918474A5 - -I=172 -KEY=A3AD1E26015E920F39342FC052F8D89B -IV=B9C70B34F78F3DA7796C32D0918474A5 -PT=E1EAC69AA2A8F05B8747E2624D00F4BB -CT=846985C471F10676E63BCD09C32506F3 - -I=173 -KEY=27C49BE270AF9479DF0FE2C991DDDE68 -IV=846985C471F10676E63BCD09C32506F3 -PT=6EB0046D9C6854C63447296F4F6D3D21 -CT=F754559746C52113C29AF782E96B6105 - -I=174 -KEY=D090CE75366AB56A1D95154B78B6BF6D -IV=F754559746C52113C29AF782E96B6105 -PT=F65269422328F40D8A53F4F14DB88583 -CT=AE6B4EABF8DC479A1E3F8C3F30A4A797 - -I=175 -KEY=7EFB80DECEB6F2F003AA9974481218FA -IV=AE6B4EABF8DC479A1E3F8C3F30A4A797 -PT=765B38DC041DEC130A3A294D9F89A16D -CT=87645926B9D85AC4AB023D2104CC3FA2 - -I=176 -KEY=F99FD9F8776EA834A8A8A4554CDE2758 -IV=87645926B9D85AC4AB023D2104CC3FA2 -PT=8070950120E0FBE07C70B171364AD173 -CT=0125D51139CE00DB848B8A9AD3FEB90B - -I=177 -KEY=F8BA0CE94EA0A8EF2C232ECF9F209E53 -IV=0125D51139CE00DB848B8A9AD3FEB90B -PT=1EF45DD2CD61667469569CFAD445341C -CT=E1651756A2C0D132C671D74748244E49 - -I=178 -KEY=19DF1BBFEC6079DDEA52F988D704D01A -IV=E1651756A2C0D132C671D74748244E49 -PT=26BEF7E8A3D0AC50DC64B8215CCBC44F -CT=94049FBD554A6CFFE7927D6EC07D6242 - -I=179 -KEY=8DDB8402B92A15220DC084E61779B258 -IV=94049FBD554A6CFFE7927D6EC07D6242 -PT=803F34FA967583623D0CA4D76FC56787 -CT=974BBE04952D8F0DD70F4353FEB092EB - -I=180 -KEY=1A903A062C079A2FDACFC7B5E9C920B3 -IV=974BBE04952D8F0DD70F4353FEB092EB -PT=023E5D307CE85244144D59A53DB504E7 -CT=2615B9F94F9024EA616648FF15E3B65F - -I=181 -KEY=3C8583FF6397BEC5BBA98F4AFC2A96EC -IV=2615B9F94F9024EA616648FF15E3B65F -PT=1A84130B09CE3E7AB1F400B9FE295BEB -CT=39A2A3B6EFB5EBE805CBAD5817EAEEDA - -I=182 -KEY=052720498C22552DBE622212EBC07836 -IV=39A2A3B6EFB5EBE805CBAD5817EAEEDA -PT=B83609055302D99DE46B7153AE3DFCE2 -CT=93F72B839E2AD731B5E894B56ADADCF4 - -I=183 -KEY=96D00BCA1208821C0B8AB6A7811AA4C2 -IV=93F72B839E2AD731B5E894B56ADADCF4 -PT=85E69EBDE13C05526EA8AE1D24B487F3 -CT=D0ADA333801DFDBFC2420B73CD2B92A5 - -I=184 -KEY=467DA8F992157FA3C9C8BDD44C313667 -IV=D0ADA333801DFDBFC2420B73CD2B92A5 -PT=F24782E953B9B1BBF3B925659C99415B -CT=F59A3D0B65E8F16DC73CCD6C27E8C705 - -I=185 -KEY=B3E795F2F7FD8ECE0EF470B86BD9F162 -IV=F59A3D0B65E8F16DC73CCD6C27E8C705 -PT=73BE517552E054D78583BEA03B84A245 -CT=7904DBE3A103D936EB4B960C180B0651 - -I=186 -KEY=CAE34E1156FE57F8E5BFE6B473D2F733 -IV=7904DBE3A103D936EB4B960C180B0651 -PT=91998E9582D8357DD5D8B95A9D85912F -CT=C2DE0D0145A45DEABD6DE1FD62161EB1 - -I=187 -KEY=083D4310135A0A1258D2074911C4E982 -IV=C2DE0D0145A45DEABD6DE1FD62161EB1 -PT=2A5D4EC49712B9CF1E2D9C6C5EFACC2A -CT=974264BDC574C738243DDC008EC4C15A - -I=188 -KEY=9F7F27ADD62ECD2A7CEFDB499F0028D8 -IV=974264BDC574C738243DDC008EC4C15A -PT=F74520C3745B9B9F9D19642AA57451FB -CT=F4EE51C2ECC32F4806F9C8588880525B - -I=189 -KEY=6B91766F3AEDE2627A16131117807A83 -IV=F4EE51C2ECC32F4806F9C8588880525B -PT=4A7D6FC6712F451F58DF0AC2D517189E -CT=F4978F5F53AA4C336BEE0C62F432B44F - -I=190 -KEY=9F06F9306947AE5111F81F73E3B2CECC -IV=F4978F5F53AA4C336BEE0C62F432B44F -PT=00DAD17491C973991FEC296972B691BC -CT=09DAA53C2E394BF83113BE48E5D0CCA2 - -I=191 -KEY=96DC5C0C477EE5A920EBA13B0662026E -IV=09DAA53C2E394BF83113BE48E5D0CCA2 -PT=C00943704C1336F01A1D23FD98BE7E8B -CT=D0DE529664BF241DBED3168DA5BC1B28 - -I=192 -KEY=46020E9A23C1C1B49E38B7B6A3DE1946 -IV=D0DE529664BF241DBED3168DA5BC1B28 -PT=A07FAD9770CC32C5680F33A2D67044A4 -CT=F6A44922B3744BE96C46742A79A49CBB - -I=193 -KEY=B0A647B890B58A5DF27EC39CDA7A85FD -IV=F6A44922B3744BE96C46742A79A49CBB -PT=D5450C670BE84169AD1E62C5ECB8365F -CT=47D229908D4C1EA34E429C34B7D635F5 - -I=194 -KEY=F7746E281DF994FEBC3C5FA86DACB008 -IV=47D229908D4C1EA34E429C34B7D635F5 -PT=9E90D30BE92104667A16522237D645A6 -CT=6463AC2096842A0958ACF45370C0626F - -I=195 -KEY=9317C2088B7DBEF7E490ABFB1D6CD267 -IV=6463AC2096842A0958ACF45370C0626F -PT=74382A7BF713DE8E8D17AE389E03C3AC -CT=ECDCEF7613C362D288AC23D38722DC4C - -I=196 -KEY=7FCB2D7E98BEDC256C3C88289A4E0E2B -IV=ECDCEF7613C362D288AC23D38722DC4C -PT=DB2EC6F41A72F426D9F5DBC65CEC1C5C -CT=DFE2DA423ACE2DFB053265E9E9B214E2 - -I=197 -KEY=A029F73CA270F1DE690EEDC173FC1AC9 -IV=DFE2DA423ACE2DFB053265E9E9B214E2 -PT=35998CB9958DC9DE0550FC3EA722D571 -CT=5EBCA79BF99165D9FFE355D9B24ECB5D - -I=198 -KEY=FE9550A75BE1940796EDB818C1B2D194 -IV=5EBCA79BF99165D9FFE355D9B24ECB5D -PT=9BDA7BC96736FE2140911C98E8E02E1C -CT=782D3EFD5F599E8D3C85D06128677EC2 - -I=199 -KEY=86B86E5A04B80A8AAA686879E9D5AF56 -IV=782D3EFD5F599E8D3C85D06128677EC2 -PT=8014C1F398E4DCC7F4E5E09E5FAFB080 -CT=E01AE2D961F31BBAE3DA7429627572AB - -I=200 -KEY=66A28C83654B113049B21C508BA0DDFD -IV=E01AE2D961F31BBAE3DA7429627572AB -PT=97D66D66D1731EEFF14519620616A10B -CT=BC41ED9D568D6ED36212C92DEEB40A0E - -I=201 -KEY=DAE3611E33C67FE32BA0D57D6514D7F3 -IV=BC41ED9D568D6ED36212C92DEEB40A0E -PT=F7646B60C237ED24F467141980EB4F00 -CT=CB8DF2D164E5B4AB3193D02E71959F63 - -I=202 -KEY=116E93CF5723CB481A33055314814890 -IV=CB8DF2D164E5B4AB3193D02E71959F63 -PT=4A3A241B26AC7A1C88AA2FB750DF6E5A -CT=E396FB47A686ABAA350B84C250E5EAE9 - -I=203 -KEY=F2F86888F1A560E22F3881914464A279 -IV=E396FB47A686ABAA350B84C250E5EAE9 -PT=A71348309D176A072167C4B1B8A295C0 -CT=29AF21F96564EB591E9A60B1BE88DEC7 - -I=204 -KEY=DB57497194C18BBB31A2E120FAEC7CBE -IV=29AF21F96564EB591E9A60B1BE88DEC7 -PT=BC528364EF78D6432177FE0CF1CDECD1 -CT=34CD9D96D4455AE0C15B6B970F1EC905 - -I=205 -KEY=EF9AD4E74084D15BF0F98AB7F5F2B5BB -IV=34CD9D96D4455AE0C15B6B970F1EC905 -PT=18972F6992299533EE23AA5824C25892 -CT=2E05E3E2079A055310FD9318590A6F41 - -I=206 -KEY=C19F3705471ED408E00419AFACF8DAFA -IV=2E05E3E2079A055310FD9318590A6F41 -PT=5441FF0D0A4062D5D0DF29BF2FDA85B4 -CT=47D4EAECE59C733EEFCB7B9D5BE95A98 - -I=207 -KEY=864BDDE9A282A7360FCF6232F7118062 -IV=47D4EAECE59C733EEFCB7B9D5BE95A98 -PT=ED3E19B5AB5389AA3A58D97F6604F4C0 -CT=00525B7D5BFC0651AEF6770F6281E6DC - -I=208 -KEY=86198694F97EA167A139153D959066BE -IV=00525B7D5BFC0651AEF6770F6281E6DC -PT=8BD4869C88A9BD3DCFE89B98B93F6EB3 -CT=AFB2215E6DC04E9467F44227FD4BDB98 - -I=209 -KEY=29ABA7CA94BEEFF3C6CD571A68DBBD26 -IV=AFB2215E6DC04E9467F44227FD4BDB98 -PT=6E7269FC27BDCC42D64CEF41A612F771 -CT=7B769B90279C95E31D8B3D792FA27FA8 - -I=210 -KEY=52DD3C5AB3227A10DB466A634779C28E -IV=7B769B90279C95E31D8B3D792FA27FA8 -PT=E00316E79DC10D179002B1BACC146027 -CT=E3870CDE5CF99B7C4C489AF81153002F - -I=211 -KEY=B15A3084EFDBE16C970EF09B562AC2A1 -IV=E3870CDE5CF99B7C4C489AF81153002F -PT=FB2FC78A79C33225E6EAAA06B76FA793 -CT=4DFC91F8971635348EF35141E8C291F7 - -I=212 -KEY=FCA6A17C78CDD45819FDA1DABEE85356 -IV=4DFC91F8971635348EF35141E8C291F7 -PT=69C8EE14F21832BB077F1A5414851FFE -CT=DA51BE36F96AA8C80DED9DB2A701D72F - -I=213 -KEY=26F71F4A81A77C9014103C6819E98479 -IV=DA51BE36F96AA8C80DED9DB2A701D72F -PT=766EC1664D2194E0F89B69861A4A8501 -CT=2ACA6359CD935CA2294F9FB5A50F4993 - -I=214 -KEY=0C3D7C134C3420323D5FA3DDBCE6CDEA -IV=2ACA6359CD935CA2294F9FB5A50F4993 -PT=1D95E551169BD538836CC349BC6B1772 -CT=315518F0AC6C1DC9939CB802336DA968 - -I=215 -KEY=3D6864E3E0583DFBAEC31BDF8F8B6482 -IV=315518F0AC6C1DC9939CB802336DA968 -PT=4F6BFE727AECDAB5A32DF8CFFC43D6A9 -CT=34C3ECD89376B4D771CA0669C2C3E26C - -I=216 -KEY=09AB883B732E892CDF091DB64D4886EE -IV=34C3ECD89376B4D771CA0669C2C3E26C -PT=AA8B1DA2E015D482EE08FA2B4A2B77B6 -CT=A3F4DD9DDC375C90579C274527612C6E - -I=217 -KEY=AA5F55A6AF19D5BC88953AF36A29AA80 -IV=A3F4DD9DDC375C90579C274527612C6E -PT=2EE6982D9E0AA5FCB61F3E66E52A0D6D -CT=C45C9E4DE76782E2599BD73B132BFE90 - -I=218 -KEY=6E03CBEB487E575ED10EEDC879025410 -IV=C45C9E4DE76782E2599BD73B132BFE90 -PT=6E58E5B1EDF1BFABAD643D8223F0FA81 -CT=32221DA62DA2B441B5E66A197A5C69F1 - -I=219 -KEY=5C21D64D65DCE31F64E887D1035E3DE1 -IV=32221DA62DA2B441B5E66A197A5C69F1 -PT=D5A81DF4B6BE17A531478961D78CAB46 -CT=E1FEB5C31B1671F15DC1F7713E5DD7FE - -I=220 -KEY=BDDF638E7ECA92EE392970A03D03EA1F -IV=E1FEB5C31B1671F15DC1F7713E5DD7FE -PT=D360948141A1D3ECFF5E8D6BDC022685 -CT=FF07F02135FB458D63EE68C4B1463A99 - -I=221 -KEY=42D893AF4B31D7635AC718648C45D086 -IV=FF07F02135FB458D63EE68C4B1463A99 -PT=E3C1E44333C9307E90EE2FBA6A7708A5 -CT=1AE4E8466B84B59EECF5E6BEB6140DF2 - -I=222 -KEY=583C7BE920B562FDB632FEDA3A51DD74 -IV=1AE4E8466B84B59EECF5E6BEB6140DF2 -PT=653AA343CE35F72E2ADB5FFCD2DFCBA8 -CT=3CB44BC123DDCD55B812D265CC5E974E - -I=223 -KEY=648830280368AFA80E202CBFF60F4A3A -IV=3CB44BC123DDCD55B812D265CC5E974E -PT=E96A66BFE5F0E8083A01664A47226672 -CT=BB6C54E118FA895F2AC4CC036166E390 - -I=224 -KEY=DFE464C91B9226F724E4E0BC9769A9AA -IV=BB6C54E118FA895F2AC4CC036166E390 -PT=A5B240D8E5731E1BFA7C4FDFB4EED81F -CT=DA20870677A6214F26FDACBA81B41882 - -I=225 -KEY=05C4E3CF6C3407B802194C0616DDB128 -IV=DA20870677A6214F26FDACBA81B41882 -PT=92FF6EAB4A6D1AD3941E6A91D8C9105B -CT=F079AA86FC9FD361DBA0C21CCD4B0F6C - -I=226 -KEY=F5BD494990ABD4D9D9B98E1ADB96BE44 -IV=F079AA86FC9FD361DBA0C21CCD4B0F6C -PT=DFF005175EF746B83CB00AC13337E248 -CT=B6021E0AA1A921C7BCC3FDAB1C3EA44A - -I=227 -KEY=43BF57433102F51E657A73B1C7A81A0E -IV=B6021E0AA1A921C7BCC3FDAB1C3EA44A -PT=DDDC1AA804AD13813C6AEA540557C097 -CT=41F0E4AB03801DCE585727B7C41F48BD - -I=228 -KEY=024FB3E83282E8D03D2D540603B752B3 -IV=41F0E4AB03801DCE585727B7C41F48BD -PT=4C6421E5A487C9C452958CAB38AC7098 -CT=6EFDD855BAF2D13437C01097ABB633DE - -I=229 -KEY=6CB26BBD887039E40AED4491A801616D -IV=6EFDD855BAF2D13437C01097ABB633DE -PT=2A11519D5463F2B96A5E0FCE6E4710D7 -CT=5E8243E5C54A109CCC0BF622A299EF68 - -I=230 -KEY=323028584D3A2978C6E6B2B30A988E05 -IV=5E8243E5C54A109CCC0BF622A299EF68 -PT=252145DACAD23E8B85AB7637B22C42F2 -CT=2C9A476418F01C589ADC0CA10BF4A183 - -I=231 -KEY=1EAA6F3C55CA35205C3ABE12016C2F86 -IV=2C9A476418F01C589ADC0CA10BF4A183 -PT=A22C36DC7D00645FEFE8683EA4231787 -CT=DA3A4AC19EF6A0F950E26B00834AFE41 - -I=232 -KEY=C49025FDCB3C95D90CD8D5128226D1C7 -IV=DA3A4AC19EF6A0F950E26B00834AFE41 -PT=B0DC92D3B4878156B768923286F0433F -CT=10BBC2A8C8F650FD8EED7CC9F5EAD05D - -I=233 -KEY=D42BE75503CAC5248235A9DB77CC019A -IV=10BBC2A8C8F650FD8EED7CC9F5EAD05D -PT=83A9338157091D4AECAF60E887AE09F7 -CT=757993A70F78B25F02FA0355E04DE27B - -I=234 -KEY=A15274F20CB2777B80CFAA8E9781E3E1 -IV=757993A70F78B25F02FA0355E04DE27B -PT=9D818ACA2C753E7314F51699D3062031 -CT=E2E74C76C09516135876D54AFC940D80 - -I=235 -KEY=43B53884CC276168D8B97FC46B15EE61 -IV=E2E74C76C09516135876D54AFC940D80 -PT=BDD36F881F8D1FC56780E291D1359EE1 -CT=22F76A2DB98544549DEA21FFCDC2B943 - -I=236 -KEY=614252A975A2253C45535E3BA6D75722 -IV=22F76A2DB98544549DEA21FFCDC2B943 -PT=4C9C16802A4BB1202D4FAC9E76C57A43 -CT=166B0FF778D72B6102D6ADF990A70A23 - -I=237 -KEY=77295D5E0D750E5D4785F3C236705D01 -IV=166B0FF778D72B6102D6ADF990A70A23 -PT=0045ECDDAA51EE6FDB226E2D9471F46C -CT=D7724DC8A1413BC1B9D6F305794426F0 - -I=238 -KEY=A05B1096AC34359CFE5300C74F347BF1 -IV=D7724DC8A1413BC1B9D6F305794426F0 -PT=25C55C60290DF3D0DC3274CD2AE0ED21 -CT=41F0196DFE0B1F664A107D12A6FF3D79 - -I=239 -KEY=E1AB09FB523F2AFAB4437DD5E9CB4688 -IV=41F0196DFE0B1F664A107D12A6FF3D79 -PT=9A44454F7A335C89BEFF1D94D3FDB320 -CT=3F37D7ADFB9933FFBAC1F7D07F31046E - -I=240 -KEY=DE9CDE56A9A619050E828A0596FA42E6 -IV=3F37D7ADFB9933FFBAC1F7D07F31046E -PT=03D7F09054233696BEF84AB8D5B77091 -CT=02D226A748153C27A723F02461FFF913 - -I=241 -KEY=DC4EF8F1E1B32522A9A17A21F705BBF5 -IV=02D226A748153C27A723F02461FFF913 -PT=D5C82A6F048A2AA0E5CF4F1EDADD68B3 -CT=4BD7486C212E7F78228478BBF0A7AD3D - -I=242 -KEY=9799B09DC09D5A5A8B25029A07A216C8 -IV=4BD7486C212E7F78228478BBF0A7AD3D -PT=936431AD9F800606240C33EAF661D3DA -CT=3EFE00CA0A96AF4425E683512DAC0164 - -I=243 -KEY=A967B057CA0BF51EAEC381CB2A0E17AC -IV=3EFE00CA0A96AF4425E683512DAC0164 -PT=280DC27864BED0D548B5B4F9A7FA38DE -CT=7023640C8D6B02F6C4C7E007C169C592 - -I=244 -KEY=D944D45B4760F7E86A0461CCEB67D23E -IV=7023640C8D6B02F6C4C7E007C169C592 -PT=CD0F58962915E5A514E5D6DA8BB868E8 -CT=D08419A75363E9622FAA09DB589915F1 - -I=245 -KEY=09C0CDFC14031E8A45AE6817B3FEC7CF -IV=D08419A75363E9622FAA09DB589915F1 -PT=09A6099FDDDBBC15EE79224B01C49DF0 -CT=6CDD2B0279D9DB3C71329C1BB2C24C2F - -I=246 -KEY=651DE6FE6DDAC5B6349CF40C013C8BE0 -IV=6CDD2B0279D9DB3C71329C1BB2C24C2F -PT=B24B11FD8A6FC6B2703FFBEBC85B6C44 -CT=CCB0F6F32BDE2339A1842A7EDC8C99C7 - -I=247 -KEY=A9AD100D4604E68F9518DE72DDB01227 -IV=CCB0F6F32BDE2339A1842A7EDC8C99C7 -PT=2E471506C55D1762CDB9EAEF29E23C01 -CT=DAD62227A5F328CC33F054EEB346E3D3 - -I=248 -KEY=737B322AE3F7CE43A6E88A9C6EF6F1F4 -IV=DAD62227A5F328CC33F054EEB346E3D3 -PT=5598344020E32F9B2C509D06F4E7804A -CT=18DE226F7CAA4EF2712A223C4709C9E2 - -I=249 -KEY=6BA510459F5D80B1D7C2A8A029FF3816 -IV=18DE226F7CAA4EF2712A223C4709C9E2 -PT=549A87BE74B62BAC3F0FDC2A878F5669 -CT=DB082C8D70948B6BF08D4848E4DB0231 - -I=250 -KEY=B0AD3CC8EFC90BDA274FE0E8CD243A27 -IV=DB082C8D70948B6BF08D4848E4DB0231 -PT=08946428BF90FBF0951A35D6FB72A48A -CT=29CBD3E3F2074514E63A7B2A651AB031 - -I=251 -KEY=9966EF2B1DCE4ECEC1759BC2A83E8A16 -IV=29CBD3E3F2074514E63A7B2A651AB031 -PT=7EBEC38F7787EE1BDD6A648334FA3076 -CT=0037935821278E879BCBB2FBE4ECC23E - -I=252 -KEY=99517C733CE9C0495ABE29394CD24828 -IV=0037935821278E879BCBB2FBE4ECC23E -PT=01D77828928164A830C249D96AC6F8B4 -CT=47501831F9DF42C234E9FE9169075888 - -I=253 -KEY=DE016442C536828B6E57D7A825D510A0 -IV=47501831F9DF42C234E9FE9169075888 -PT=608349FF8FFC31B072CFA7DF649E15B8 -CT=BC10B1D412BC05404B2E38A1D75DA421 - -I=254 -KEY=6211D596D78A87CB2579EF09F288B481 -IV=BC10B1D412BC05404B2E38A1D75DA421 -PT=B16325BD78FC0451216FF476D4CAE293 -CT=6ABD8010E9CBAE61E05A9E30C622B501 - -I=255 -KEY=08AC55863E4129AAC523713934AA0180 -IV=6ABD8010E9CBAE61E05A9E30C622B501 -PT=E613C244F74C61B078C9E59E06E7AD85 -CT=E896B8BD539C30D9A58E5EF6629B279C - -I=256 -KEY=E03AED3B6DDD197360AD2FCF5631261C -IV=E896B8BD539C30D9A58E5EF6629B279C -PT=6CFF7A909AAB2C0DC61FB8F11B45E661 -CT=30D15AAA05F56FA2D21E9974FB3FF5DA - -I=257 -KEY=D0EBB791682876D1B2B3B6BBAD0ED3C6 -IV=30D15AAA05F56FA2D21E9974FB3FF5DA -PT=6BFAC8E8FB9C3D5AF813B4DF90AD863B -CT=43B99F3DA3C1BCCE9038118E2968EFA1 - -I=258 -KEY=935228ACCBE9CA1F228BA73584663C67 -IV=43B99F3DA3C1BCCE9038118E2968EFA1 -PT=064D09E9F5104602E191DC39F18E6A1A -CT=EBC5796519BE4E05262A10D56FA0F72D - -I=259 -KEY=789751C9D257841A04A1B7E0EBC6CB4A -IV=EBC5796519BE4E05262A10D56FA0F72D -PT=C2B528D69ED3028A359D4472D98807A7 -CT=5F2B51DD025E775A63DFE5B9FBF54986 - -I=260 -KEY=27BC0014D009F340677E5259103382CC -IV=5F2B51DD025E775A63DFE5B9FBF54986 -PT=D5CF62940967AF7225F79E87136751F5 -CT=F56D88E433CEA445C6E4D6298DFB6C27 - -I=261 -KEY=D2D188F0E3C75705A19A84709DC8EEEB -IV=F56D88E433CEA445C6E4D6298DFB6C27 -PT=3BE3171202E762846D2CA00FB2CB141A -CT=4C168A0129F2D48E249777A366D1AEF1 - -I=262 -KEY=9EC702F1CA35838B850DF3D3FB19401A -IV=4C168A0129F2D48E249777A366D1AEF1 -PT=5B82A34141C236FAED7E1A78D3C426C4 -CT=E11FEBEF79E425480442D45A8C105B44 - -I=263 -KEY=7FD8E91EB3D1A6C3814F278977091B5E -IV=E11FEBEF79E425480442D45A8C105B44 -PT=86CFADD3F1B368B3A6E57148CA343D38 -CT=5F5F3548BDBB2A5337FBF07DF76526DD - -I=264 -KEY=2087DC560E6A8C90B6B4D7F4806C3D83 -IV=5F5F3548BDBB2A5337FBF07DF76526DD -PT=A4474ACA97100C7A357A66119D678798 -CT=013ADA262021F88617773CF478067EC8 - -I=265 -KEY=21BD06702E4B7416A1C3EB00F86A434B -IV=013ADA262021F88617773CF478067EC8 -PT=6D66801C39DB803B5DA5A80E30DB0D89 -CT=F46BE70F65FC5641318292AE0C79E5C5 - -I=266 -KEY=D5D6E17F4BB72257904179AEF413A68E -IV=F46BE70F65FC5641318292AE0C79E5C5 -PT=C9499B32D8F47313EB351139DB81AB25 -CT=8573A25F86C7784BF7A0153DF812805C - -I=267 -KEY=50A54320CD705A1C67E16C930C0126D2 -IV=8573A25F86C7784BF7A0153DF812805C -PT=4B09D37A4A57B320C34B1D70F74EB36A -CT=036913128A2B71CE3D05D52D61E48E86 - -I=268 -KEY=53CC5032475B2BD25AE4B9BE6DE5A854 -IV=036913128A2B71CE3D05D52D61E48E86 -PT=EA3A92794B204C0345765CEE2A04AF27 -CT=5A53E929182859CC28D4EB1CB9579B71 - -I=269 -KEY=099FB91B5F73721E723052A2D4B23325 -IV=5A53E929182859CC28D4EB1CB9579B71 -PT=2714E38858426C5631BB2BB4FA289985 -CT=DF4BD734DEC60475D47FE40502439AAE - -I=270 -KEY=D6D46E2F81B5766BA64FB6A7D6F1A98B -IV=DF4BD734DEC60475D47FE40502439AAE -PT=69AC3FD2273926E2DAD3F5BED9F21491 -CT=EBCCD0B121C4009EA7F038F30F5B6B05 - -I=271 -KEY=3D18BE9EA07176F501BF8E54D9AAC28E -IV=EBCCD0B121C4009EA7F038F30F5B6B05 -PT=07520CD471E27BAC35387DB47E706784 -CT=299FE603BBA51BD1582CBD42BC9568EA - -I=272 -KEY=1487589D1BD46D2459933316653FAA64 -IV=299FE603BBA51BD1582CBD42BC9568EA -PT=39598B70B8EB190049823472E3596E42 -CT=68DD98FE52B454F85D6F6A6C742223FA - -I=273 -KEY=7C5AC063496039DC04FC597A111D899E -IV=68DD98FE52B454F85D6F6A6C742223FA -PT=C7E13ABBBA75F527AB1320DD930B24F1 -CT=906B569E44263A4E6F41A52802D3FC59 - -I=274 -KEY=EC3196FD0D4603926BBDFC5213CE75C7 -IV=906B569E44263A4E6F41A52802D3FC59 -PT=9F5D8E50F06895D5D7E6D1DAA247D45F -CT=E5ECBDCC55A9D952BE0F93DFA0FE2C31 - -I=275 -KEY=09DD2B3158EFDAC0D5B26F8DB33059F6 -IV=E5ECBDCC55A9D952BE0F93DFA0FE2C31 -PT=EC3F35C1E6371F106443BD1446D58A0A -CT=4837A3D703E80BFE50D742E378956F3A - -I=276 -KEY=41EA88E65B07D13E85652D6ECBA536CC -IV=4837A3D703E80BFE50D742E378956F3A -PT=7998C3B7B5C94540DFC5BF777D700D48 -CT=DF1564E5E47503A779020D27394571E9 - -I=277 -KEY=9EFFEC03BF72D299FC672049F2E04725 -IV=DF1564E5E47503A779020D27394571E9 -PT=63BEA75A2440C5D123F335F72137B0B6 -CT=5147239C3F6E4A158989BE96C0275D41 - -I=278 -KEY=CFB8CF9F801C988C75EE9EDF32C71A64 -IV=5147239C3F6E4A158989BE96C0275D41 -PT=09C656A0DFCF893DDBE5E2B3D88E5F1F -CT=7E4DEE30DED62EE15CD957530B62559D - -I=279 -KEY=B1F521AF5ECAB66D2937C98C39A54FF9 -IV=7E4DEE30DED62EE15CD957530B62559D -PT=71DC22F489DD422CDE09F01DAA427567 -CT=6F62D6359F07F6BDBB4C02BBE50B273C - -I=280 -KEY=DE97F79AC1CD40D0927BCB37DCAE68C5 -IV=6F62D6359F07F6BDBB4C02BBE50B273C -PT=C2A9BC94CAE48DBEB37B4B506AD4336A -CT=902D9E9F82DE4E66E42B4FEA79AF4077 - -I=281 -KEY=4EBA690543130EB6765084DDA50128B2 -IV=902D9E9F82DE4E66E42B4FEA79AF4077 -PT=69EE7E15EEC2EA953A32E1714961BA9E -CT=72CB5DE8AF6CDC60A00A15CEAF249DBD - -I=282 -KEY=3C7134EDEC7FD2D6D65A91130A25B50F -IV=72CB5DE8AF6CDC60A00A15CEAF249DBD -PT=4C0A3B88FDFAEFEC38858A927C38AE6A -CT=68C2BFA5DE837B927BD75C6DE6008595 - -I=283 -KEY=54B38B4832FCA944AD8DCD7EEC25309A -IV=68C2BFA5DE837B927BD75C6DE6008595 -PT=CE75CCA2D7B0199EB1DA7E33A0E50AB7 -CT=4FFCCBB31FB1FCC0FCB38F0B557BE67A - -I=284 -KEY=1B4F40FB2D4D5584513E4275B95ED6E0 -IV=4FFCCBB31FB1FCC0FCB38F0B557BE67A -PT=E0ECA2ABC1F389B149E746CFB039539E -CT=249FB11DF8C0ED1F346F6D69B8FD0470 - -I=285 -KEY=3FD0F1E6D58DB89B65512F1C01A3D290 -IV=249FB11DF8C0ED1F346F6D69B8FD0470 -PT=BFA871CA5EC16C0B353679782BE04394 -CT=8127E6D8EEC1111518065EDC34CD4B4C - -I=286 -KEY=BEF7173E3B4CA98E7D5771C0356E99DC -IV=8127E6D8EEC1111518065EDC34CD4B4C -PT=1EF816C565B2F56E772C96AD5C92842D -CT=C8DC75AE1E2DBD005D94E69D6776C498 - -I=287 -KEY=762B62902561148E20C3975D52185D44 -IV=C8DC75AE1E2DBD005D94E69D6776C498 -PT=9F2B9873F88EBF21A3BB3DCD853C812E -CT=861D4FF061E85D44173252244F143692 - -I=288 -KEY=F0362D60448949CA37F1C5791D0C6BD6 -IV=861D4FF061E85D44173252244F143692 -PT=6CDEA8A806516A1A0E1CBB5AA123862A -CT=16DA4EE5C5044F66EFCC313754FBCD9E - -I=289 -KEY=E6EC6385818D06ACD83DF44E49F7A648 -IV=16DA4EE5C5044F66EFCC313754FBCD9E -PT=5B637BB469073B5E54EC006F47C4D546 -CT=C2C50037BBBEC252B7D5CF10C38BD665 - -I=290 -KEY=242963B23A33C4FE6FE83B5E8A7C702D -IV=C2C50037BBBEC252B7D5CF10C38BD665 -PT=38DADBF2BA4A80A6A190D9E2AA245167 -CT=721222A5A67E96246DA1B9C59B67DDD5 - -I=291 -KEY=563B41179C4D52DA0249829B111BADF8 -IV=721222A5A67E96246DA1B9C59B67DDD5 -PT=CB52378F6E4E7FCB1891D3BB4D086B9F -CT=D28B8F54E8BDA9A20965984D5DA27FC9 - -I=292 -KEY=84B0CE4374F0FB780B2C1AD64CB9D231 -IV=D28B8F54E8BDA9A20965984D5DA27FC9 -PT=E66015A1B848EF190F981DEFEDB98C93 -CT=012C5D9B847C9583B0BE03999D24E277 - -I=293 -KEY=859C93D8F08C6EFBBB92194FD19D3046 -IV=012C5D9B847C9583B0BE03999D24E277 -PT=F5B2BAD53323A52A2B99CC12782CD6F9 -CT=D1EFB7E7A34F75887038FC4827E894C1 - -I=294 -KEY=5473243F53C31B73CBAAE507F675A487 -IV=D1EFB7E7A34F75887038FC4827E894C1 -PT=11C0C41C3F547B5D7FC94115327AB3D5 -CT=2CF97D8995AA8FDC4C05205D3D8B757F - -I=295 -KEY=788A59B6C66994AF87AFC55ACBFED1F8 -IV=2CF97D8995AA8FDC4C05205D3D8B757F -PT=3F911029D8B69CA1A323A277090B9C07 -CT=44BB04C6253F3ADD454264EA97490475 - -I=296 -KEY=3C315D70E356AE72C2EDA1B05CB7D58D -IV=44BB04C6253F3ADD454264EA97490475 -PT=9D7724EFD1AE76904458EF1360953AA4 -CT=5D6F876E4FDD6921B243EB1F6EF50F82 - -I=297 -KEY=615EDA1EAC8BC75370AE4AAF3242DA0F -IV=5D6F876E4FDD6921B243EB1F6EF50F82 -PT=44A26554FE355D95706431B344701B03 -CT=5F3226B39DF230163D2C474F04BAD36E - -I=298 -KEY=3E6CFCAD3179F7454D820DE036F80961 -IV=5F3226B39DF230163D2C474F04BAD36E -PT=5D8B62C8CD3B04451A599989F3165530 -CT=A247CF8E1D8F480DA4155DA846A2B64E - -I=299 -KEY=9C2B33232CF6BF48E9975048705ABF2F -IV=A247CF8E1D8F480DA4155DA846A2B64E -PT=610D3798E62E9338D5987BAC82D48CD7 -CT=2A92B5AAEA43CFBAA62842DEE7F43A19 - -I=300 -KEY=B6B98689C6B570F24FBF129697AE8536 -IV=2A92B5AAEA43CFBAA62842DEE7F43A19 -PT=F77943AA429BCCC5253156474E719389 -CT=7D475AFF824080E9C95D4E49D4F5090D - -I=301 -KEY=CBFEDC7644F5F01B86E25CDF435B8C3B -IV=7D475AFF824080E9C95D4E49D4F5090D -PT=5E6269D157164B2C544D3052E9DB8553 -CT=AD4628B05F5A765E557015B4A41505EA - -I=302 -KEY=66B8F4C61BAF8645D392496BE74E89D1 -IV=AD4628B05F5A765E557015B4A41505EA -PT=77126BD6C08A094981FEC9E2DE91B2BF -CT=59C24F269E3884A4F8E3F9FB05BF448F - -I=303 -KEY=3F7ABBE0859702E12B71B090E2F1CD5E -IV=59C24F269E3884A4F8E3F9FB05BF448F -PT=7775F90D2189E91B75AB8AD93C0D44F2 -CT=B72873115D4761B8BAEB5B5892B79DF8 - -I=304 -KEY=8852C8F1D8D06359919AEBC8704650A6 -IV=B72873115D4761B8BAEB5B5892B79DF8 -PT=03D9C45A2A152ADAA53E1D42AB33555B -CT=FE0C3F22E6B467DC1C628C928D03DB5B - -I=305 -KEY=765EF7D33E6404858DF8675AFD458BFD -IV=FE0C3F22E6B467DC1C628C928D03DB5B -PT=279791AC4189634A6066BCDCAA2EF9B4 -CT=7F3ABBA943C8E3EF19C3BA2C98C9685F - -I=306 -KEY=09644C7A7DACE76A943BDD76658CE3A2 -IV=7F3ABBA943C8E3EF19C3BA2C98C9685F -PT=E46E5FB6019BA52524A383A18A89583A -CT=C96D250343B134241221490AB39931DB - -I=307 -KEY=C00969793E1DD34E861A947CD615D279 -IV=C96D250343B134241221490AB39931DB -PT=A3A544B8982C2F9EA0CD0ABC4D6392E2 -CT=951D54AABDF6F5B70E700C4896EB2685 - -I=308 -KEY=55143DD383EB26F9886A983440FEF4FC -IV=951D54AABDF6F5B70E700C4896EB2685 -PT=43FEB2051478A02BA1F054C9E82F0209 -CT=1F90165BE29C6C86D09AD07B1C006CA6 - -I=309 -KEY=4A842B8861774A7F58F0484F5CFE985A -IV=1F90165BE29C6C86D09AD07B1C006CA6 -PT=558AD95B25BAB5205FB7E529C96E5B59 -CT=40C0A0427C12AB1F72A7ADF96F82D437 - -I=310 -KEY=0A448BCA1D65E1602A57E5B6337C4C6D -IV=40C0A0427C12AB1F72A7ADF96F82D437 -PT=BABA13A1244DEFF5E4A2AB8183775773 -CT=FB08FDF3BF4394BA1A92C45B7F5F3060 - -I=311 -KEY=F14C7639A22675DA30C521ED4C237C0D -IV=FB08FDF3BF4394BA1A92C45B7F5F3060 -PT=46E036ECCDBE88931E552E45CBBC2BDC -CT=311AE8C2B7CB633178874BDEEEE0602F - -I=312 -KEY=C0569EFB15ED16EB48426A33A2C31C22 -IV=311AE8C2B7CB633178874BDEEEE0602F -PT=4D5C919959478AD0D9862BA509233102 -CT=1DC85D9A8877C79698C7D1C1610CBAE9 - -I=313 -KEY=DD9EC3619D9AD17DD085BBF2C3CFA6CB -IV=1DC85D9A8877C79698C7D1C1610CBAE9 -PT=D423E31E9FD6E4F4373FA7AD31CC6011 -CT=FC55E7BEA15BD539EDACB202F0218D4A - -I=314 -KEY=21CB24DF3CC104443D2909F033EE2B81 -IV=FC55E7BEA15BD539EDACB202F0218D4A -PT=52C2C696A4343C0F280A3BC8F6AA19EA -CT=FFD9FECD3A4EC194568A96C5A899E8D2 - -I=315 -KEY=DE12DA12068FC5D06BA39F359B77C353 -IV=FFD9FECD3A4EC194568A96C5A899E8D2 -PT=3B2266FAB514211E8E33AFA566898083 -CT=DC1A545F354365A0002180BACCE0AD25 - -I=316 -KEY=02088E4D33CCA0706B821F8F57976E76 -IV=DC1A545F354365A0002180BACCE0AD25 -PT=DC20E6BD8B8AC822CF2B505E580E6A80 -CT=51CF4C11F15B8B565B875F769C2FD37F - -I=317 -KEY=53C7C25CC2972B26300540F9CBB8BD09 -IV=51CF4C11F15B8B565B875F769C2FD37F -PT=67B4C3E2AFC3402901549265186303FB -CT=A118B7E5B10DAB4DDB449877AB1E6897 - -I=318 -KEY=F2DF75B9739A806BEB41D88E60A6D59E -IV=A118B7E5B10DAB4DDB449877AB1E6897 -PT=971952EE322CD68462B4CE8B772BBA48 -CT=A2988AAC94D8A7EFB32B34CC07911F3E - -I=319 -KEY=5047FF15E7422784586AEC426737CAA0 -IV=A2988AAC94D8A7EFB32B34CC07911F3E -PT=64C2665506EDDED98EC55D2CCED7762C -CT=86AEB7B90565D05293A8D9146880C307 - -I=320 -KEY=D6E948ACE227F7D6CBC235560FB709A7 -IV=86AEB7B90565D05293A8D9146880C307 -PT=A5E7E411209DD2A34AA8CDA3153A69E4 -CT=27746442FAC1DF26B11A55251AAFD865 - -I=321 -KEY=F19D2CEE18E628F07AD860731518D1C2 -IV=27746442FAC1DF26B11A55251AAFD865 -PT=83A41EF5F664A909BC47939D7858C221 -CT=619A164C3F2119FFCA3832A5EA958E01 - -I=322 -KEY=90073AA227C7310FB0E052D6FF8D5FC3 -IV=619A164C3F2119FFCA3832A5EA958E01 -PT=1F5A31EBB2C515728DB07EE3160D03CD -CT=DEE1692D386EF5A8861BE5D8A4630906 - -I=323 -KEY=4EE6538F1FA9C4A736FBB70E5BEE56C5 -IV=DEE1692D386EF5A8861BE5D8A4630906 -PT=297B343F5EE6221FB6CC40E0C836B387 -CT=B2BA45B0A776A950C32DD5F302201FC3 - -I=324 -KEY=FC5C163FB8DF6DF7F5D662FD59CE4906 -IV=B2BA45B0A776A950C32DD5F302201FC3 -PT=CC3601DC94B13116DF3012860A522D2D -CT=6D141746B23B4E1EF20DFE6C14D6ECE4 - -I=325 -KEY=914801790AE423E907DB9C914D18A5E2 -IV=6D141746B23B4E1EF20DFE6C14D6ECE4 -PT=FE07DA9A6E8B712B1FDFC3C1CC87146D -CT=0D80E8F5557A88A271133F8929125C72 - -I=326 -KEY=9CC8E98C5F9EAB4B76C8A318640AF990 -IV=0D80E8F5557A88A271133F8929125C72 -PT=EBDC0192755A685D6275532E93D33890 -CT=B88A629A8E22A78BAF98C9E623F48134 - -I=327 -KEY=24428B16D1BC0CC0D9506AFE47FE78A4 -IV=B88A629A8E22A78BAF98C9E623F48134 -PT=78AD3067BE2E9536ADB58DA49D7CA6DA -CT=0A9C2D318240F4FA4FF91CC5D23A371F - -I=328 -KEY=2EDEA62753FCF83A96A9763B95C44FBB -IV=0A9C2D318240F4FA4FF91CC5D23A371F -PT=04C72A08CCC36B4211AFE98637C4CEFF -CT=A42618A89B9E618DDD7A983081E086B9 - -I=329 -KEY=8AF8BE8FC86299B74BD3EE0B1424C902 -IV=A42618A89B9E618DDD7A983081E086B9 -PT=22D4A346027B8E5FEE1C0C0C45CA7DCB -CT=7CC4479AE05A295723F27545E1A46B7B - -I=330 -KEY=F63CF9152838B0E068219B4EF580A279 -IV=7CC4479AE05A295723F27545E1A46B7B -PT=05090A5C8F3CD0E7F7EA11B33CDF3C1D -CT=815BCEB2A29EA2A491C8E39B117790EC - -I=331 -KEY=776737A78AA61244F9E978D5E4F73295 -IV=815BCEB2A29EA2A491C8E39B117790EC -PT=7B40F8A4AC0E4C6BD73A59FFC91CA77D -CT=E4ED412F3ECDD4B7409BEEAEDC2C755F - -I=332 -KEY=938A7688B46BC6F3B972967B38DB47CA -IV=E4ED412F3ECDD4B7409BEEAEDC2C755F -PT=047E2E4681A97ED20308F1FE4B132F7B -CT=10153209AED4115329587180D65A0B97 - -I=333 -KEY=839F44811ABFD7A0902AE7FBEE814C5D -IV=10153209AED4115329587180D65A0B97 -PT=32671E6C0D28744AB457587BBB6DD21E -CT=847F781EDF77A870C4EA99CCC1721917 - -I=334 -KEY=07E03C9FC5C87FD054C07E372FF3554A -IV=847F781EDF77A870C4EA99CCC1721917 -PT=EC3159B002B95054F00D57049D91E32B -CT=05CC06529764F6747FCB2B62569C428C - -I=335 -KEY=022C3ACD52AC89A42B0B5555796F17C6 -IV=05CC06529764F6747FCB2B62569C428C -PT=9A930743113957D10EC643D8D8034C73 -CT=D1C7957073C2A44D9483DD11F3FA2B1E - -I=336 -KEY=D3EBAFBD216E2DE9BF8888448A953CD8 -IV=D1C7957073C2A44D9483DD11F3FA2B1E -PT=2E061A5B483D0D834D3019954E54CF80 -CT=0AC3300C59DB7A76A1E16DC5BF167B70 - -I=337 -KEY=D9289FB178B5579F1E69E581358347A8 -IV=0AC3300C59DB7A76A1E16DC5BF167B70 -PT=2A6E00DF7820913341D26EF611A7BEC1 -CT=5A5A1BE396D3C56DB0690B92A925D8D8 - -I=338 -KEY=83728452EE6692F2AE00EE139CA69F70 -IV=5A5A1BE396D3C56DB0690B92A925D8D8 -PT=E871C79BA6132F15C80A85F4BC732E77 -CT=829ABA07496E1269437680257308029D - -I=339 -KEY=01E83E55A708809BED766E36EFAE9DED -IV=829ABA07496E1269437680257308029D -PT=5955643AB76251E6AF97BC2490D09A72 -CT=3FEDBF80B703D067126EF55B02A41175 - -I=340 -KEY=3E0581D5100B50FCFF189B6DED0A8C98 -IV=3FEDBF80B703D067126EF55B02A41175 -PT=32BCF86ECA6CCE8F9C1C87AD9FDF8238 -CT=B59D6C5FCA91EDBFE75E795638CAD286 - -I=341 -KEY=8B98ED8ADA9ABD431846E23BD5C05E1E -IV=B59D6C5FCA91EDBFE75E795638CAD286 -PT=01A08051FC1D98C1BDAE4CA1D41D91E6 -CT=21CB8EF8BBE6C371A26BFF92701C3D1A - -I=342 -KEY=AA536372617C7E32BA2D1DA9A5DC6304 -IV=21CB8EF8BBE6C371A26BFF92701C3D1A -PT=5F5D891DF8D595D3FEDAEF0174B0A1D1 -CT=23D0FB6489113D3D4AA6470210698391 - -I=343 -KEY=89839816E86D430FF08B5AABB5B5E095 -IV=23D0FB6489113D3D4AA6470210698391 -PT=54FEAB37EFCD36D28E943DD85E803812 -CT=45F0556ED9A8ED0E1C8B0A0BA648E069 - -I=344 -KEY=CC73CD7831C5AE01EC0050A013FD00FC -IV=45F0556ED9A8ED0E1C8B0A0BA648E069 -PT=7AF4BC398ACAD37F526BDE12F3ED59ED -CT=C41E115EE06FFE5DED10480A1BE5B720 - -I=345 -KEY=086DDC26D1AA505C011018AA0818B7DC -IV=C41E115EE06FFE5DED10480A1BE5B720 -PT=CF15E4B6DDF60A4EE0CB6CBFA8AD499B -CT=1098A41E2C97C9D70626E4D1841F5CC1 - -I=346 -KEY=18F57838FD3D998B0736FC7B8C07EB1D -IV=1098A41E2C97C9D70626E4D1841F5CC1 -PT=BAD4050A0013AB8BC556F367AB634D94 -CT=D9B58211EB935246A5E04FCD3BE10B54 - -I=347 -KEY=C140FA2916AECBCDA2D6B3B6B7E6E049 -IV=D9B58211EB935246A5E04FCD3BE10B54 -PT=CEFF0AF7EF4EA7EF3B0E8BF7FB756E77 -CT=50FAE8C770EF7F9D5FE93B090B9D5C66 - -I=348 -KEY=91BA12EE6641B450FD3F88BFBC7BBC2F -IV=50FAE8C770EF7F9D5FE93B090B9D5C66 -PT=3B8C412B4156B413AD06CB181B4C5EAA -CT=E47249D4B5F24FF415B0E669EBF471B1 - -I=349 -KEY=75C85B3AD3B3FBA4E88F6ED6578FCD9E -IV=E47249D4B5F24FF415B0E669EBF471B1 -PT=56C612C5C594CAFB7B1CE8131E786DF0 -CT=6AF057199C217EECB886D940F61B91C5 - -I=350 -KEY=1F380C234F9285485009B796A1945C5B -IV=6AF057199C217EECB886D940F61B91C5 -PT=5629EF768743AB63D5B79B511C0A6BEF -CT=A5A76C330984D34310D021A6C2BDE9BC - -I=351 -KEY=BA9F60104616560B40D996306329B5E7 -IV=A5A76C330984D34310D021A6C2BDE9BC -PT=ED8DF427A02692C09D7AAEF2EDAA1249 -CT=8AAEFBA5DE0AAA41D947E3238B279913 - -I=352 -KEY=30319BB5981CFC4A999E7513E80E2CF4 -IV=8AAEFBA5DE0AAA41D947E3238B279913 -PT=949339605F30310FC557F2CA4815B034 -CT=9408BCB67EA573E7B5359B67918C16B9 - -I=353 -KEY=A4392703E6B98FAD2CABEE7479823A4D -IV=9408BCB67EA573E7B5359B67918C16B9 -PT=03607642CBBCCA2134837AC4BB452682 -CT=90660AF3DD0EAC1B61BB60EB49408586 - -I=354 -KEY=345F2DF03BB723B64D108E9F30C2BFCB -IV=90660AF3DD0EAC1B61BB60EB49408586 -PT=DE00E32930E14BD4297F9D789D0C25A1 -CT=1C48AC020174C0D87443229C113E2838 - -I=355 -KEY=281781F23AC3E36E3953AC0321FC97F3 -IV=1C48AC020174C0D87443229C113E2838 -PT=9CA7A04855F8404176D7D30B594B65AC -CT=7ACCB3FD4F9C7A5BFB83A969EB6D211A - -I=356 -KEY=52DB320F755F9935C2D0056ACA91B6E9 -IV=7ACCB3FD4F9C7A5BFB83A969EB6D211A -PT=DC0B392E998A347ECB789A51A09F1B1D -CT=22BED79EF2CAFF83BE8CEE5D7001DE21 - -I=357 -KEY=7065E591879566B67C5CEB37BA9068C8 -IV=22BED79EF2CAFF83BE8CEE5D7001DE21 -PT=07210334590A9314031D98F7DFBB84B9 -CT=44B16879886BC331407D1E7C7F247A04 - -I=358 -KEY=34D48DE80FFEA5873C21F54BC5B412CC -IV=44B16879886BC331407D1E7C7F247A04 -PT=27DDF18405E56989E59ED442C8825DD6 -CT=2787AD57159450916A45C72D0E074D53 - -I=359 -KEY=135320BF1A6AF51656643266CBB35F9F -IV=2787AD57159450916A45C72D0E074D53 -PT=4F43202A454BB0F3A9440DA558BEE228 -CT=3C1B83C66CEEEB27644BC66ACC3117E8 - -I=360 -KEY=2F48A37976841E31322FF40C07824877 -IV=3C1B83C66CEEEB27644BC66ACC3117E8 -PT=28ED6A88BDE4ADEFDA5C0F629109A7A3 -CT=B6009481F8C5D3EE37C645CF238238A1 - -I=361 -KEY=994837F88E41CDDF05E9B1C3240070D6 -IV=B6009481F8C5D3EE37C645CF238238A1 -PT=48DC5A3700CD4A7A9B066DC0E2667544 -CT=C1A20854601D7A81CAC51E9237BDC030 - -I=362 -KEY=58EA3FACEE5CB75ECF2CAF5113BDB0E6 -IV=C1A20854601D7A81CAC51E9237BDC030 -PT=1F84C71120B50FDF715B60DB69DECBE0 -CT=663EDB4EFD3F6AC2259A43C926ACE66D - -I=363 -KEY=3ED4E4E21363DD9CEAB6EC983511568B -IV=663EDB4EFD3F6AC2259A43C926ACE66D -PT=D6F9C59367A57E1DBDC2F4627524BC9A -CT=CA84A10F987212D75B744A7966ABBABA - -I=364 -KEY=F45045ED8B11CF4BB1C2A6E153BAEC31 -IV=CA84A10F987212D75B744A7966ABBABA -PT=1D8BC84060844CE5C40C716F2190C2BB -CT=ABAEEB339C4D150E894392444E021710 - -I=365 -KEY=5FFEAEDE175CDA45388134A51DB8FB21 -IV=ABAEEB339C4D150E894392444E021710 -PT=1300843AABCFB110198F0F0102C0A4D5 -CT=DBA9A1F8EE9AB8300D0273F71EAC5D1C - -I=366 -KEY=84570F26F9C66275358347520314A63D -IV=DBA9A1F8EE9AB8300D0273F71EAC5D1C -PT=1EA11B05D7DA9D770BA9AB619267B7A3 -CT=4921F1CB4A9AA6594C205D8FF0B2DEC9 - -I=367 -KEY=CD76FEEDB35CC42C79A31ADDF3A678F4 -IV=4921F1CB4A9AA6594C205D8FF0B2DEC9 -PT=9ABA414156563E88A8CCDB3BD226F66C -CT=4CF623AC6E145E2D61CAD28BFBF1F1E5 - -I=368 -KEY=8180DD41DD489A011869C85608578911 -IV=4CF623AC6E145E2D61CAD28BFBF1F1E5 -PT=FEF20625FA0C788DB8A20298F6933F6F -CT=67C491A5CA1A065980BDECE44B7979F1 - -I=369 -KEY=E6444CE417529C5898D424B2432EF0E0 -IV=67C491A5CA1A065980BDECE44B7979F1 -PT=79C4A475D0E064D72D48AF6357A0E6A0 -CT=529766CDD1223ED05C055108F91E6526 - -I=370 -KEY=B4D32A29C670A288C4D175BABA3095C6 -IV=529766CDD1223ED05C055108F91E6526 -PT=0758AA9195AE8684B9FEEBEF8E1226AE -CT=2AEC009219ECD0499DD729352C220E7D - -I=371 -KEY=9E3F2ABBDF9C72C159065C8F96129BBB -IV=2AEC009219ECD0499DD729352C220E7D -PT=886713433798AB16E87A8AD3A8CD0C87 -CT=0DE2A7554E343B6FFC6D1ECF4A8AF0DD - -I=372 -KEY=93DD8DEE91A849AEA56B4240DC986B66 -IV=0DE2A7554E343B6FFC6D1ECF4A8AF0DD -PT=984E8BA3DFFB4E9A1244D65BEA7DC594 -CT=8111340B4AF2CD82FF15447143069276 - -I=373 -KEY=12CCB9E5DB5A842C5A7E06319F9EF910 -IV=8111340B4AF2CD82FF15447143069276 -PT=A4F6C8ACF4F1050D11E42FEF1B6C8B68 -CT=BB4693FA1399583EACB21D2675E6D156 - -I=374 -KEY=A98A2A1FC8C3DC12F6CC1B17EA782846 -IV=BB4693FA1399583EACB21D2675E6D156 -PT=C5DBE1A937D6EA2FDD9A1A2FD25217B9 -CT=BC01B078339637D796F822B7E58D968D - -I=375 -KEY=158B9A67FB55EBC5603439A00FF5BECB -IV=BC01B078339637D796F822B7E58D968D -PT=DBD0494B0FE3149F8BCB8A70D344E811 -CT=600C1EFBDCA314A6F9714DEE413B9BD2 - -I=376 -KEY=7587849C27F6FF639945744E4ECE2519 -IV=600C1EFBDCA314A6F9714DEE413B9BD2 -PT=FCA88DCB484317D7F886E7437BC9E669 -CT=2E3788A647105DD0A286E2EFFD469C99 - -I=377 -KEY=5BB00C3A60E6A2B33BC396A1B388B980 -IV=2E3788A647105DD0A286E2EFFD469C99 -PT=65AF28E41B3DA5ACE3B2CC9A25EAD28C -CT=5411E48B57058A52C8560423BCFFBCD2 - -I=378 -KEY=0FA1E8B137E328E1F39592820F770552 -IV=5411E48B57058A52C8560423BCFFBCD2 -PT=6DD82A9F1CF0A5134A76899B04BE37D5 -CT=C3F69C8ED682BF252D5119D1695126E1 - -I=379 -KEY=CC57743FE16197C4DEC48B53662623B3 -IV=C3F69C8ED682BF252D5119D1695126E1 -PT=DE729AB3803144FD958D8597396BC8ED -CT=0941B78975FD2945B4AA81E8C58E3CB2 - -I=380 -KEY=C516C3B6949CBE816A6E0ABBA3A81F01 -IV=0941B78975FD2945B4AA81E8C58E3CB2 -PT=D8404E7A17254EB40683A8919A9563B4 -CT=BF647E0346C013E138A2F0B06E7BB142 - -I=381 -KEY=7A72BDB5D25CAD6052CCFA0BCDD3AE43 -IV=BF647E0346C013E138A2F0B06E7BB142 -PT=214089EC2996CE9FA2BBFEFBCAC03509 -CT=AFDA67B9451FF758CC87BBD93C7D4BE4 - -I=382 -KEY=D5A8DA0C97435A389E4B41D2F1AEE5A7 -IV=AFDA67B9451FF758CC87BBD93C7D4BE4 -PT=9406E9D4FB4592A609BBDB23CE5F9D7F -CT=B18202E4CA510695540371A8B6523616 - -I=383 -KEY=642AD8E85D125CADCA48307A47FCD3B1 -IV=B18202E4CA510695540371A8B6523616 -PT=FEE45BE0503B4093747AFCEA9881D30D -CT=64E149A4A1840F93D675B041ED81D45A - -I=384 -KEY=00CB914CFC96533E1C3D803BAA7D07EB -IV=64E149A4A1840F93D675B041ED81D45A -PT=880368D5609350167C7826DA30DCFF59 -CT=65A363E9837DFBBDA2688E6F4FBE6C35 - -I=385 -KEY=6568F2A57FEBA883BE550E54E5C36BDE -IV=65A363E9837DFBBDA2688E6F4FBE6C35 -PT=29C5940D09A8723B441FC469C909813A -CT=2A47FDF5BF600891DF4D9E8AA34748BA - -I=386 -KEY=4F2F0F50C08BA012611890DE46842364 -IV=2A47FDF5BF600891DF4D9E8AA34748BA -PT=20AF0FF7BAC0F468C12BD2816A8B1620 -CT=68A637E4B94EC150C84A6EBB005BB79B - -I=387 -KEY=278938B479C56142A952FE6546DF94FF -IV=68A637E4B94EC150C84A6EBB005BB79B -PT=42906D013A3F0A426B01B489ECA6CAD7 -CT=A090CA02FCD40F01CA0D1A699E30C164 - -I=388 -KEY=8719F2B685116E43635FE40CD8EF559B -IV=A090CA02FCD40F01CA0D1A699E30C164 -PT=05A02D4D7D90BCA74ECE791CD865CB88 -CT=F70109F0EBBA56959B3013565E2BDFFC - -I=389 -KEY=7018FB466EAB38D6F86FF75A86C48A67 -IV=F70109F0EBBA56959B3013565E2BDFFC -PT=C373AB7B8F770212F9D5CEF40099086C -CT=67221CC1F104809B8A5D35431963812D - -I=390 -KEY=173AE7879FAFB84D7232C2199FA70B4A -IV=67221CC1F104809B8A5D35431963812D -PT=8C59B2A7FD50EC66ABACC0531BE33237 -CT=E06166175F68155DB86E268F3C5524AE - -I=391 -KEY=F75B8190C0C7AD10CA5CE496A3F22FE4 -IV=E06166175F68155DB86E268F3C5524AE -PT=D39790AED2970355A6337AAD2CA4D501 -CT=85E89883242A3B68F4AAF922646EB385 - -I=392 -KEY=72B31913E4ED96783EF61DB4C79C9C61 -IV=85E89883242A3B68F4AAF922646EB385 -PT=87D4160C7C97476D0884A22B5983AA65 -CT=038C79FDFAA0B4F4AD9DC336F46CACDF - -I=393 -KEY=713F60EE1E4D228C936BDE8233F030BE -IV=038C79FDFAA0B4F4AD9DC336F46CACDF -PT=3B59088B5ADC77E4B3FC31897C6389B5 -CT=F6C92ECB3332E5E93C9DE29F27F94BB3 - -I=394 -KEY=87F64E252D7FC765AFF63C1D14097B0D -IV=F6C92ECB3332E5E93C9DE29F27F94BB3 -PT=68BA9BEBB40B3E35D2E577A2831CF9DB -CT=7B72342488233DAD5ACF0A8D54EA9E8B - -I=395 -KEY=FC847A01A55CFAC8F539369040E3E586 -IV=7B72342488233DAD5ACF0A8D54EA9E8B -PT=7816251219B8C7F009ADD7A1898D02CF -CT=45CBA66AD6045917C3E8257D3ECBECDB - -I=396 -KEY=B94FDC6B7358A3DF36D113ED7E28095D -IV=45CBA66AD6045917C3E8257D3ECBECDB -PT=F542FEAB12E2EA9AE761E58108784E37 -CT=82E289465F5838036B9880C33AEBCB83 - -I=397 -KEY=3BAD552D2C009BDC5D49932E44C3C2DE -IV=82E289465F5838036B9880C33AEBCB83 -PT=3B8208791DAE56383CC2BCB44097C9D3 -CT=F02F2B89DE46D01F46AD95C82AF0C20E - -I=398 -KEY=CB827EA4F2464BC31BE406E66E3300D0 -IV=F02F2B89DE46D01F46AD95C82AF0C20E -PT=3F2C0F7A0AEAB04F318C661ABCFED153 -CT=8D4FAF6332578524301ACA22AD86965B - -I=399 -KEY=46CDD1C7C011CEE72BFECCC4C3B5968B -IV=8D4FAF6332578524301ACA22AD86965B -PT=A27200B51D69AAC22F1C567F8BCEABFA -CT=2F844CBF78EBA70DA7A49601388F1AB6 - -========== - -KEYSIZE=192 - -I=0 -KEY=000000000000000000000000000000000000000000000000 -IV=00000000000000000000000000000000 -PT=00000000000000000000000000000000 -CT=7BD966D53AD8C1BB85D2ADFAE87BB104 - -I=1 -KEY=506339DAE3B35BEB7BD966D53AD8C1BB85D2ADFAE87BB104 -IV=7BD966D53AD8C1BB85D2ADFAE87BB104 -PT=0555C410F44C7AA4506339DAE3B35BEB -CT=869C061BE9CFEAB5D285B0724A9A8970 - -I=2 -KEY=74D3414C2374367BFD4560CED3172B0E57571D88A2E13874 -IV=869C061BE9CFEAB5D285B0724A9A8970 -PT=C6FB25A188CF7F3F24B07896C0C76D90 -CT=9E58A52B3840DBE16E8063A18220FEE4 - -I=3 -KEY=DDE2DF4EEC312FA3631DC5E5EB57F0EF39D77E2920C1C690 -IV=9E58A52B3840DBE16E8063A18220FEE4 -PT=84E3D4168A8469A6A9319E02CF4519D8 -CT=730A256C202B9D57F3C0D73AD4B6CBED - -I=4 -KEY=9D973AECAF19E9951017E089CB7C6DB8CA17A913F4770D7D -IV=730A256C202B9D57F3C0D73AD4B6CBED -PT=E000CE26CD3185B44075E5A24328C636 -CT=E79EF11C5C1FD1AB75280BCFFCFE89D4 - -I=5 -KEY=7A52007B2C40C9F4F78911959763BC13BF3FA2DC088984A9 -IV=E79EF11C5C1FD1AB75280BCFFCFE89D4 -PT=19D79403BB238816E7C53A9783592061 -CT=65744444724F1052D0B8674EDC8083B5 - -I=6 -KEY=40D50426A8D09F3292FD55D1E52CAC416F87C592D409071C -IV=65744444724F1052D0B8674EDC8083B5 -PT=FDFA33685E2B5BBC3A87045D849056C6 -CT=23C6377D3D076491AD93E2B6112289C7 - -I=7 -KEY=6FD062412FE1AE4EB13B62ACD82BC8D0C2142724C52B8EDB -IV=23C6377D3D076491AD93E2B6112289C7 -PT=5056DDDEF15831502F0566678731317C -CT=F13A83088536BF30E5E9018BE57D7D89 - -I=8 -KEY=EB4DB5F469D0EE9B4001E1A45D1D77E027FD26AF2056F352 -IV=F13A83088536BF30E5E9018BE57D7D89 -PT=0EE535A4A524668F849DD7B5463140D5 -CT=3F496CB19B21C37159528BF345473E6D - -I=9 -KEY=AA6E5744B909D9A87F488D15C63CB4917EAFAD5C6511CD3F -IV=3F496CB19B21C37159528BF345473E6D -PT=3A11F90EB51C81ED4123E2B0D0D93733 -CT=CF79C1EDEE17A68DC7E673006AEC90D9 - -I=10 -KEY=64AB0C0C9471B77FB0314CF8282B121CB949DE5C0FFD5DE6 -IV=CF79C1EDEE17A68DC7E673006AEC90D9 -PT=85187E7F91280A5BCEC55B482D786ED7 -CT=92D1757BEBCE6E0406407819AF82353F - -I=11 -KEY=9E5720C1DC2E285C22E03983C3E57C18BF09A645A07F68D9 -IV=92D1757BEBCE6E0406407819AF82353F -PT=45147511BC08EC76FAFC2CCD485F9F23 -CT=8C0228F57523D746E67D27A8E6C426D9 - -I=12 -KEY=EBBB8245582E4367AEE21176B6C6AB5E597481ED46BB4E00 -IV=8C0228F57523D746E67D27A8E6C426D9 -PT=73B9EEAC644CBB8875ECA28484006B3B -CT=D0025BF1FC35DD9BDA20F42DF775AF71 - -I=13 -KEY=5F938EE9CC63C9E87EE04A874AF376C5835475C0B1CEE171 -IV=D0025BF1FC35DD9BDA20F42DF775AF71 -PT=DE2507F01BC8B212B4280CAC944D8A8F -CT=3FDDD3E04B2CBE79BB07D82182CD3787 - -I=14 -KEY=B94E2EC5F6E86EDC413D996701DFC8BC3853ADE13303D6F6 -IV=3FDDD3E04B2CBE79BB07D82182CD3787 -PT=90CE32BCC16C20F7E6DDA02C3A8BA734 -CT=F7B491E4C40B60BE8ACF16D68E3ED60F - -I=15 -KEY=DE41ABD8C44F5DF6B6890883C5D4A802B29CBB37BD3D00F9 -IV=F7B491E4C40B60BE8ACF16D68E3ED60F -PT=B7ACCA62BB9974BC670F851D32A7332A -CT=7ED4055D367CB31A4CF1CC17132E00B5 - -I=16 -KEY=E2A57C71F23BC4DEC85D0DDEF3A81B18FE6D7720AE13004C -IV=7ED4055D367CB31A4CF1CC17132E00B5 -PT=1CA59C2384797B803CE4D7A936749928 -CT=8D50A87F14D466323929BB52FA60FA42 - -I=17 -KEY=2FA1A78B8BCC301C450DA5A1E77C7D2AC744CC725473FA0E -IV=8D50A87F14D466323929BB52FA60FA42 -PT=0A623319F2A051ACCD04DBFA79F7F4C2 -CT=7C02D378606FC33DFCEF8AA2A000383E - -I=18 -KEY=A949CE493892DF58390F76D98713BE173BAB46D0F473C230 -IV=7C02D378606FC33DFCEF8AA2A000383E -PT=EE8F5FF6A7FF813386E869C2B35EEF44 -CT=CAE55B9CCBB5A68EBF0D2AB55E079FD4 - -I=19 -KEY=E159445FE4201A6CF3EA2D454CA6189984A66C65AA745DE4 -IV=CAE55B9CCBB5A68EBF0D2AB55E079FD4 -PT=9699456986535C4648108A16DCB2C534 -CT=9056685FBFECC7A6143DB5AC314DAC88 - -I=20 -KEY=EE4F7BF96BF1163E63BC451AF34ADF3F909BD9C99B39F16C -IV=9056685FBFECC7A6143DB5AC314DAC88 -PT=16D6C34C3B57AC0A0F163FA68FD10C52 -CT=4D6A5542F0680CE37E88119141F321F5 - -I=21 -KEY=27F8CEE0120E8A0F2ED610580322D3DCEE13C858DACAD099 -IV=4D6A5542F0680CE37E88119141F321F5 -PT=337839926E36EC77C9B7B51979FF9C31 -CT=78E16D6027F0D190E78825C2F52E5364 - -I=22 -KEY=0AF4D3D8EB9FF18A56377D3824D2024C099BED9A2FE483FD -IV=78E16D6027F0D190E78825C2F52E5364 -PT=8F96B66F934467C72D0C1D38F9917B85 -CT=82A81B33F80A105DD7D9CC6DDFECDB96 - -I=23 -KEY=AD2AFC821170D967D49F660BDCD81211DE4221F7F008586B -IV=82A81B33F80A105DD7D9CC6DDFECDB96 -PT=E2CB8E6E329C6660A7DE2F5AFAEF28ED -CT=0BCD68A063BA3540B3E04C885DF45BD0 - -I=24 -KEY=5B50EE72BD6CE837DF520EABBF6227516DA26D7FADFC03BB -IV=0BCD68A063BA3540B3E04C885DF45BD0 -PT=31A14C64CD8BCC8FF67A12F0AC1C3150 -CT=DB27EA5834BF572EA50E03E0773C1010 - -I=25 -KEY=BF4D8A58F54D47620475E4F38BDD707FC8AC6E9FDAC013AB -IV=DB27EA5834BF572EA50E03E0773C1010 -PT=26755B5C0BE60998E41D642A4821AF55 -CT=655A896243B5E86B2F74299A317A2E4C - -I=26 -KEY=8DC190D88B17EAB9612F6D91C8689814E7D84705EBBA3DE7 -IV=655A896243B5E86B2F74299A317A2E4C -PT=C6920ADCED82F661328C1A807E5AADDB -CT=9F45472FDBB732C745AD228810392EA2 - -I=27 -KEY=B44071C6F14CDA97FE6A2ABE13DFAAD3A275658DFB831345 -IV=9F45472FDBB732C745AD228810392EA2 -PT=2178DFA9784E563E3981E11E7A5B302E -CT=9F985FBF08235845E396BFCE54BCE7C8 - -I=28 -KEY=A3C12E42B53D829E61F275011BFCF29641E3DA43AF3FF48D -IV=9F985FBF08235845E396BFCE54BCE7C8 -PT=44977E2274DA25AE17815F8444715809 -CT=033EAF4FAC934D123012279B1663C80B - -I=29 -KEY=8FD2B79E25E39C4A62CCDA4EB76FBF8471F1FDD8B95C3C86 -IV=033EAF4FAC934D123012279B1663C80B -PT=425088D4626CD7972C1399DC90DE1ED4 -CT=A962CB4707B0048BB81F4225EFC85E48 - -I=30 -KEY=3D68793EF46B8125CBAE1109B0DFBB0FC9EEBFFD569462CE -IV=A962CB4707B0048BB81F4225EFC85E48 -PT=EF21ED587C272175B2BACEA0D1881D6F -CT=6F3A0D63A22C003F7F65B09098F667DB - -I=31 -KEY=6A4FB651BE9D0BAFA4941C6A12F3BB30B68B0F6DCE620515 -IV=6F3A0D63A22C003F7F65B09098F667DB -PT=16054E60B460B2D15727CF6F4AF68A8A -CT=8BB46230FF03665765F2E5AAEA14104F - -I=32 -KEY=3F5991D63C15A1822F207E5AEDF0DD67D379EAC72476155A -IV=8BB46230FF03665765F2E5AAEA14104F -PT=82D0B12FEA88917F551627878288AA2D -CT=8E1A664131FAB09E786E111C3C20A7BB - -I=33 -KEY=456F69D38929ED82A13A181BDC0A6DF9AB17FBDB1856B2E1 -IV=8E1A664131FAB09E786E111C3C20A7BB -PT=1384D3B7CAEB528A7A36F805B53C4C00 -CT=92D99BF1D71026D2BF78E32421E34E52 - -I=34 -KEY=658891F63379484C33E383EA0B1A4B2B146F18FF39B5FCB3 -IV=92D99BF1D71026D2BF78E32421E34E52 -PT=9F60C3117269E88920E7F825BA50A5CE -CT=7DB6782C68EC5FC75A2A75E4EA7B4071 - -I=35 -KEY=9193E2EACE8423F64E55FBC663F614EC4E456D1BD3CEBCC2 -IV=7DB6782C68EC5FC75A2A75E4EA7B4071 -PT=232ECA0370EBD920F41B731CFDFD6BBA -CT=D76A1E73E977533E6D7C74277DAFEB48 - -I=36 -KEY=F4C34FE273D0FCB5993FE5B58A8147D22339193CAE61578A -IV=D76A1E73E977533E6D7C74277DAFEB48 -PT=5BCD8C6C4D14321F6550AD08BD54DF43 -CT=4A69E9081DDD43A6061700C7DA8F5E73 - -I=37 -KEY=DC82C155896C5D5CD3560CBD975C0474252E19FB74EE09F9 -IV=4A69E9081DDD43A6061700C7DA8F5E73 -PT=C914BB961EA890D828418EB7FABCA1E9 -CT=91EE5BE28C27F055258BC3E1F37E2DEC - -I=38 -KEY=08F1655EA3656F1C42B8575F1B7BF42100A5DA1A87902415 -IV=91EE5BE28C27F055258BC3E1F37E2DEC -PT=11804F73D788115CD473A40B2A093240 -CT=86B9BE5AFD2A8A49E2651C314CAE0918 - -I=39 -KEY=59D7EFD92140A147C401E905E6517E68E2C0C62BCB3E2D0D -IV=86B9BE5AFD2A8A49E2651C314CAE0918 -PT=6E2A1E436926174E51268A878225CE5B -CT=C642F5ED78DB76738A89296B1C4A0932 - -I=40 -KEY=F6E75E7867D0FB4A02431CE89E8A081B6849EF40D774243F -IV=C642F5ED78DB76738A89296B1C4A0932 -PT=15896B8B864CF068AF30B1A146905A0D -CT=24288AE027547E499EBADE9260C8F037 - -I=41 -KEY=9A048C2BC98E15B2266B9608B9DE7652F6F331D2B7BCD408 -IV=24288AE027547E499EBADE9260C8F037 -PT=FF9A330C205DC3006CE3D253AE5EEEF8 -CT=BD9B3D670D24EDDA1EAD1DB06C8A83C7 - -I=42 -KEY=97E8C017644E9FED9BF0AB6FB4FA9B88E85E2C62DB3657CF -IV=BD9B3D670D24EDDA1EAD1DB06C8A83C7 -PT=C9A3916C34A7CCD90DEC4C3CADC08A5F -CT=1FCCBC65C44E4680E1593EE0EEFEA9A9 - -I=43 -KEY=3A2862113BD3312D843C170A70B4DD080907128235C8FE66 -IV=1FCCBC65C44E4680E1593EE0EEFEA9A9 -PT=EAF9C4A80EE93585ADC0A2065F9DAEC0 -CT=2C0004064936696B10D039D9795BABC7 - -I=44 -KEY=33FAE356C0C96F17A83C130C3982B46319D72B5B4C9355A1 -IV=2C0004064936696B10D039D9795BABC7 -PT=4181525880CA468909D28147FB1A5E3A -CT=79F193EB9A9A48464FF007D73E9B4106 - -I=45 -KEY=2136A7940C9B9FAFD1CD80E7A318FC2556272C8C720814A7 -IV=79F193EB9A9A48464FF007D73E9B4106 -PT=2899D75DFB84950E12CC44C2CC52F0B8 -CT=DA12307CE9A6BA0FCE5A76AE1747E619 - -I=46 -KEY=0C839679750274320BDFB09B4ABE462A987D5A22654FF2BE -IV=DA12307CE9A6BA0FCE5A76AE1747E619 -PT=2C71B8623CA5BF292DB531ED7999EB9D -CT=A59997FA19B58BC71CB05E7140386C94 - -I=47 -KEY=4D3CDB92797645C1AE462761530BCDED84CD045325779E2A -IV=A59997FA19B58BC71CB05E7140386C94 -PT=63F4FC202A1B921241BF4DEB0C7431F3 -CT=49E65D7422398035DD1E4EBAD37C699D - -I=48 -KEY=38082D7CC27EBABBE7A07A1571324DD859D34AE9F60BF7B7 -IV=49E65D7422398035DD1E4EBAD37C699D -PT=7F0E2FD5D4B5A0CB7534F6EEBB08FF7A -CT=64DF24483FC73174FB6482A6E2B895E0 - -I=49 -KEY=1557398CFBFF31F8837F5E5D4EF57CACA2B7C84F14B36257 -IV=64DF24483FC73174FB6482A6E2B895E0 -PT=0F525FCF2A1E3D612D5F14F039818B43 -CT=028880CC8AA1B92CB807F1102663E658 - -I=50 -KEY=229C31F1D34A529581F7DE91C454C5801AB0395F32D0840F -IV=028880CC8AA1B92CB807F1102663E658 -PT=219604B99FF2BE7B37CB087D28B5636D -CT=FAC8B66D1BA7849392CC235D0276110E - -I=51 -KEY=C75DE76D40D536277B3F68FCDFF34113887C1A0230A69501 -IV=FAC8B66D1BA7849392CC235D0276110E -PT=3319C80C038E565FE5C1D69C939F64B2 -CT=79770F286419EEFD855868EC4ADF3775 - -I=52 -KEY=5F0B08B451490B27024867D4BBEAAFEE0D2472EE7A79A274 -IV=79770F286419EEFD855868EC4ADF3775 -PT=E173A8580816CAFA9856EFD9119C3D00 -CT=FC0AA487B09DF657DB58DBF83E13E137 - -I=53 -KEY=E86E8BFBF1D65541FE42C3530B7759B9D67CA916446A4343 -IV=FC0AA487B09DF657DB58DBF83E13E137 -PT=01274C45F202C22CB765834FA09F5E66 -CT=9691EA44FC67CA29E50E7FF7DBC4D0CA - -I=54 -KEY=7849550CA6CCD87268D32917F71093903372D6E19FAE9389 -IV=9691EA44FC67CA29E50E7FF7DBC4D0CA -PT=026BD493499B7BA99027DEF7571A8D33 -CT=5206F7CF45A59FD6444CCBB6B034CF45 - -I=55 -KEY=52D81D6104DBF6DF3AD5DED8B2B50C46773E1D572F9A5CCC -IV=5206F7CF45A59FD6444CCBB6B034CF45 -PT=33CA15B3D921E7752A91486DA2172EAD -CT=F4A41D18E3EF9DE46917BADB1B5EC613 - -I=56 -KEY=36FB680165ABD632CE71C3C0515A91A21E29A78C34C49ADF -IV=F4A41D18E3EF9DE46917BADB1B5EC613 -PT=65F3084285AA869464237560617020ED -CT=6C4154D3245D2546979118A36120A911 - -I=57 -KEY=6E7548B98AA0640AA23097137507B4E489B8BF2F55E433CE -IV=6C4154D3245D2546979118A36120A911 -PT=6CF540F502D90886588E20B8EF0BB238 -CT=2A52376A7E494ADEDD53A416F73FE9C0 - -I=58 -KEY=A0D840A0E3CC1EA58862A0790B4EFE3A54EB1B39A2DBDA0E -IV=2A52376A7E494ADEDD53A416F73FE9C0 -PT=708AE2375F305572CEAD0819696C7AAF -CT=7A0EF052184147EA279839380B3DBB32 - -I=59 -KEY=153CF68E4A1C1FCEF26C502B130FB9D073732201A9E6613C -IV=7A0EF052184147EA279839380B3DBB32 -PT=A8267215107D3DD0B5E4B62EA9D0016B -CT=F193B80D57571F94A4F5373149163AA1 - -I=60 -KEY=E0B0657A66C37D8703FFE8264458A644D7861530E0F05B9D -IV=F193B80D57571F94A4F5373149163AA1 -PT=EE4B04302CB02990F58C93F42CDF6249 -CT=A28E99815C930AC05ADA4524A7E5968C - -I=61 -KEY=94760F8A93926E4DA17171A718CBAC848D5C50144715CD11 -IV=A28E99815C930AC05ADA4524A7E5968C -PT=34D122B717CBA59174C66AF0F55113CA -CT=6F9342E7915613450E823EC9A781DAA3 - -I=62 -KEY=0B352460A1579376CEE23340899DBFC183DE6EDDE09417B2 -IV=6F9342E7915613450E823EC9A781DAA3 -PT=D8689ED21F3EA8E29F432BEA32C5FD3B -CT=584BB944532A830F7F8DCDBE42E7DBFC - -I=63 -KEY=999A5CEB73DFCC1796A98A04DAB73CCEFC53A363A273CC4E -IV=584BB944532A830F7F8DCDBE42E7DBFC -PT=4E87F73D46D0C0AF92AF788BD2885F61 -CT=4AC372A4D3273C71F69D50168A9235A1 - -I=64 -KEY=42C59FFD5AA69C11DC6AF8A0099000BF0ACEF37528E1F9EF -IV=4AC372A4D3273C71F69D50168A9235A1 -PT=324DC9C2D34E95F9DB5FC31629795006 -CT=60E53CC2D5E4900D48A0C5F7EE3BC810 - -I=65 -KEY=843EBDEF0CEEBA5BBC8FC462DC7490B2426E3682C6DA31FF -IV=60E53CC2D5E4900D48A0C5F7EE3BC810 -PT=8B94F018A7115B3AC6FB22125648264A -CT=4BD7DF7DFD03A24809B751F59FACF417 - -I=66 -KEY=98E40853FA954FF5F7581B1F217732FA4BD967775976C5E8 -IV=4BD7DF7DFD03A24809B751F59FACF417 -PT=109C734AC21ED2631CDAB5BCF67BF5AE -CT=B7A3CF7E58A413C5065E9CFD23C750F9 - -I=67 -KEY=5419462C5329544A40FBD46179D3213F4D87FB8A7AB19511 -IV=B7A3CF7E58A413C5065E9CFD23C750F9 -PT=8CA507ACCDB3A793CCFD4E7FA9BC1BBF -CT=6285C3D0FD2645192C5DD046D73414CE - -I=68 -KEY=B58628819840885D227E17B184F5642661DA2BCCAD8581DF -IV=6285C3D0FD2645192C5DD046D73414CE -PT=7DE48BAD03BB9F53E19F6EADCB69DC17 -CT=583FBCEB09646CEC19D00620E5455FD5 - -I=69 -KEY=73F7F00EF22ED1B07A41AB5A8D9108CA780A2DEC48C0DE0A -IV=583FBCEB09646CEC19D00620E5455FD5 -PT=126D3F2A0BC1B168C671D88F6A6E59ED -CT=886A5273055AF7AE37EFB726DC90FD9E - -I=70 -KEY=69735F80F0B876DAF22BF92988CBFF644FE59ACA94502394 -IV=886A5273055AF7AE37EFB726DC90FD9E -PT=0B4D3F58D83D866A1A84AF8E0296A76A -CT=FD068F02BB6C2611EF78CD963EF2F78F - -I=71 -KEY=92E5FF32D46494880F2D762B33A7D975A09D575CAAA2D41B -IV=FD068F02BB6C2611EF78CD963EF2F78F -PT=705667CBCC87BF3DFB96A0B224DCE252 -CT=34713FD3FA07F0B3F94EC0FB17BB465F - -I=72 -KEY=A0DF9DCB873A1ADC3B5C49F8C9A029C659D397A7BD199244 -IV=34713FD3FA07F0B3F94EC0FB17BB465F -PT=4BF66F55275D6CB3323A62F9535E8E54 -CT=82C8A179661207B7FE178A266C607074 - -I=73 -KEY=2D1604ADAA49C3FBB994E881AFB22E71A7C41D81D179E230 -IV=82C8A179661207B7FE178A266C607074 -PT=167203BBB933707A8DC999662D73D927 -CT=DCDBCC8D11C632CB220C6E95B399A1CC - -I=74 -KEY=7D2C4B0C0D0B001A654F240CBE741CBA85C8731462E043FC -IV=DCDBCC8D11C632CB220C6E95B399A1CC -PT=668F998350BDA831503A4FA1A742C3E1 -CT=8827EBFCB24470266D5C0BA05D5974A4 - -I=75 -KEY=BE3A4CF21186C2C7ED68CFF00C306C9CE89478B43FB93758 -IV=8827EBFCB24470266D5C0BA05D5974A4 -PT=B8D1D48F3C41094EC31607FE1C8DC2DD -CT=61E59DECE1AEFFDEB9B216828953D70F - -I=76 -KEY=D0CE372842DC32508C8D521CED9E934251266E36B6EAE057 -IV=61E59DECE1AEFFDEB9B216828953D70F -PT=49A4495257D08AA56EF47BDA535AF097 -CT=ECD04FFB385CCC1D13C312A5C31810DE - -I=77 -KEY=E7274C14C4163169605D1DE7D5C25F5F42E57C9375F2F089 -IV=ECD04FFB385CCC1D13C312A5C31810DE -PT=3EED6F60FD9050A737E97B3C86CA0339 -CT=D9C90455AFBF5465F89752FB6F60BDFF - -I=78 -KEY=71E35A00CAFB898BB99419B27A7D0B3ABA722E681A924D76 -IV=D9C90455AFBF5465F89752FB6F60BDFF -PT=5CE6E7F07945191396C416140EEDB8E2 -CT=F6E795B326CFD6CCC0E230E4FE770878 - -I=79 -KEY=79DFA388989B29204F738C015CB2DDF67A901E8CE4E5450E -IV=F6E795B326CFD6CCC0E230E4FE770878 -PT=314A5784B7909F89083CF9885260A0AB -CT=6B3A00F05F79F25E4E9EDA81034A9B7B - -I=80 -KEY=75F6D5983AE6D7AC24498CF103CB2FA8340EC40DE7AFDE75 -IV=6B3A00F05F79F25E4E9EDA81034A9B7B -PT=DEC42B1A6184FDF80C297610A27DFE8C -CT=6A19BEA8826427E309BD55BCBBE246B4 - -I=81 -KEY=E47EEE65549BF1634E50325981AF084B3DB391B15C4D98C1 -IV=6A19BEA8826427E309BD55BCBBE246B4 -PT=63C46CFF49FF13B291883BFD6E7D26CF -CT=738C0B0E580C0B1ED488DDE8502CB754 - -I=82 -KEY=E6DBE45547556F403DDC3957D9A30355E93B4C590C612F95 -IV=738C0B0E580C0B1ED488DDE8502CB754 -PT=E951F5C902BD351502A50A3013CE9E23 -CT=389E33F3DAB3FAB7B2ACB853C0150B8D - -I=83 -KEY=EBA5A1BDF9FC558905420AA40310F9E25B97F40ACC742418 -IV=389E33F3DAB3FAB7B2ACB853C0150B8D -PT=54EFC45B4036B60D0D7E45E8BEA93AC9 -CT=EACAE8A4B5CCBDB28ED2162670DBD4B1 - -I=84 -KEY=B570945030615F75EF88E200B6DC4450D545E22CBCAFF0A9 -IV=EACAE8A4B5CCBDB28ED2162670DBD4B1 -PT=7F3BA6FE23AE45665ED535EDC99D0AFC -CT=535FEA61623ECD22FA1A95BF95320252 - -I=85 -KEY=F332D3DE8556F82EBCD70861D4E289722F5F7793299DF2FB -IV=535FEA61623ECD22FA1A95BF95320252 -PT=8FEB6943B22437D34642478EB537A75B -CT=CD23D928E1D3221E4D3C51670C071276 - -I=86 -KEY=1402D325D7EBA90871F4D1493531AB6C626326F4259AE08D -IV=CD23D928E1D3221E4D3C51670C071276 -PT=8B01EE4509B58B49E73000FB52BD5126 -CT=56DC7F1BE2CC26A369B3BCA71BF8FAB8 - -I=87 -KEY=389C95DC5BF411B62728AE52D7FD8DCF0BD09A533E621A35 -IV=56DC7F1BE2CC26A369B3BCA71BF8FAB8 -PT=9BFE561402B07B4C2C9E46F98C1FB8BE -CT=A059CFB443009F0ACD8E5051BD16C837 - -I=88 -KEY=89180FBFF0A12019877161E694FD12C5C65ECA028374D202 -IV=A059CFB443009F0ACD8E5051BD16C837 -PT=C8D55810C7A22E30B1849A63AB5531AF -CT=62CEB7D9A6D23B40CFD75990D1040BA4 - -I=89 -KEY=08BE01CF1E620DBEE5BFD63F322F2985098993925270D9A6 -IV=62CEB7D9A6D23B40CFD75990D1040BA4 -PT=F888764A970B03BC81A60E70EEC32DA7 -CT=F6D89003ABBF003AF013EB221AF17F99 - -I=90 -KEY=5EB9AC53FC544ADE1367463C999029BFF99A78B04881A63F -IV=F6D89003ABBF003AF013EB221AF17F99 -PT=26A25CFC1E699D8B5607AD9CE2364760 -CT=74C9E920DC16396E89774B82E7803EF5 - -I=91 -KEY=D8FAD6E8CDC96CEF67AEAF1C458610D170ED3332AF0198CA -IV=74C9E920DC16396E89774B82E7803EF5 -PT=76AFDD045A30FAA486437ABB319D2631 -CT=A5B997689B88AAC0611C2963C8C1B7CE - -I=92 -KEY=7E774E64A5F209B2C2173874DE0EBA1111F11A5167C02F04 -IV=A5B997689B88AAC0611C2963C8C1B7CE -PT=ABF525144D3415DEA68D988C683B655D -CT=7A2F39D97547C3CD336577E41C0483ED - -I=93 -KEY=0406C21AE6E015E0B83801ADAB4979DC22946DB57BC4ACE9 -IV=7A2F39D97547C3CD336577E41C0483ED -PT=E0C2466426630D1B7A718C7E43121C52 -CT=67899F7D0890E90383C05A7984604241 - -I=94 -KEY=D9249A4AFDF40BEADFB19ED0A3D990DFA15437CCFFA4EEA8 -IV=67899F7D0890E90383C05A7984604241 -PT=07E55341FCD016D7DD2258501B141E0A -CT=7B1CBCD270B09E9A1D15714D8366D174 - -I=95 -KEY=B2242464CD4D2448A4AD2202D3690E45BC4146817CC23FDC -IV=7B1CBCD270B09E9A1D15714D8366D174 -PT=25C6E62F44ABFF406B00BE2E30B92FA2 -CT=C86E27E5CA4461CE656D893A16477966 - -I=96 -KEY=602CDF824C043C836CC305E7192D6F8BD92CCFBB6A8546BA -IV=C86E27E5CA4461CE656D893A16477966 -PT=3F9D262E375F057BD208FBE6814918CB -CT=8129054CF746CB79112942AE35142E4D - -I=97 -KEY=73F82C9EE4B4D0E8EDEA00ABEE6BA4F2C8058D155F9168F7 -IV=8129054CF746CB79112942AE35142E4D -PT=7BC798EAC4C17B2D13D4F31CA8B0EC6B -CT=36F21910B1677AF19586E55E360FB8DD - -I=98 -KEY=E5FC538A60CC29A3DB1819BB5F0CDE035D83684B699ED02A -IV=36F21910B1677AF19586E55E360FB8DD -PT=D3E39037253E5BAA96047F148478F94B -CT=BA7CE80E0853D264368EE61D8E71EEBE - -I=99 -KEY=D9381EF81441B6C16164F1B5575F0C676B0D8E56E7EF3E94 -IV=BA7CE80E0853D264368EE61D8E71EEBE -PT=DE4FFDFADB81FABB3CC44D72748D9F62 -CT=971AD82D1F46F1087B37103B4BE5DD8C - -I=100 -KEY=A0BF8B4740D929C9F67E29984819FD6F103A9E6DAC0AE318 -IV=971AD82D1F46F1087B37103B4BE5DD8C -PT=FE6355B5D860522B798795BF54989F08 -CT=D17268155EE586F352BB031929441700 - -I=101 -KEY=477A0AB591FFEC5C270C418D16FC7B9C42819D74854EF418 -IV=D17268155EE586F352BB031929441700 -PT=166A50EEE05F4A39E7C581F2D126C595 -CT=2CD84FB5B587BE8B04638A9EDBA17AE2 - -I=102 -KEY=50005B4C4B11BFB20BD40E38A37BC51746E217EA5EEF8EFA -IV=2CD84FB5B587BE8B04638A9EDBA17AE2 -PT=1296DC2C1741EB2A177A51F9DAEE53EE -CT=8C2A5A31951FB2D9E8D35CD3C007B8B3 - -I=103 -KEY=E1E88DDBA5D849DF87FE5409366477CEAE314B399EE83649 -IV=8C2A5A31951FB2D9E8D35CD3C007B8B3 -PT=57C5E1A070E3C2AEB1E8D697EEC9F66D -CT=AA9E935BA264C9FD0C07072AF8499CD7 - -I=104 -KEY=D465F0FB195068CF2D60C7529400BE33A2364C1366A1AA9E -IV=AA9E935BA264C9FD0C07072AF8499CD7 -PT=77D0522670E00BD7358D7D20BC882110 -CT=A22DF6CE12C75FB99F5159A1E3E4249F - -I=105 -KEY=4DEB1B5E6398E4AD8F4D319C86C7E18A3D6715B285458E01 -IV=A22DF6CE12C75FB99F5159A1E3E4249F -PT=D6F96D22896A2574998EEBA57AC88C62 -CT=B356102A9158C569469E61093146B9F0 - -I=106 -KEY=D73E5CA946860BDD3C1B21B6179F24E37BF974BBB40337F1 -IV=B356102A9158C569469E61093146B9F0 -PT=2E72F61FC21F57A09AD547F7251EEF70 -CT=AB2BABFB88D3C3ACE4CBA81E0E250AD3 - -I=107 -KEY=6B592CE635873DE197308A4D9F4CE74F9F32DCA5BA263D22 -IV=AB2BABFB88D3C3ACE4CBA81E0E250AD3 -PT=39B02C01155705C9BC67704F7301363C -CT=8A4AC90E9095479F3C02DE7B08C01F1C - -I=108 -KEY=1026EE98CAC684081D7A43430FD9A0D0A33002DEB2E6223E -IV=8A4AC90E9095479F3C02DE7B08C01F1C -PT=14F49DBECEE88DBB7B7FC27EFF41B9E9 -CT=62E4E3C43938D014D90C4A1D8CD09639 - -I=109 -KEY=20972278E7C0FFC17F9EA08736E170C47A3C48C33E36B407 -IV=62E4E3C43938D014D90C4A1D8CD09639 -PT=56EFB0EA336A674930B1CCE02D067BC9 -CT=5E8EB865BFC1999D57A67280E37CA129 - -I=110 -KEY=2BEE1A1965A7F17C211018E28920E9592D9A3A43DD4A152E -IV=5E8EB865BFC1999D57A67280E37CA129 -PT=9CF6F073F2F0C7CB0B79386182670EBD -CT=D3B98A4562FAB47ED3D09C55E75EE51B - -I=111 -KEY=EB85E491647FD6ACF2A992A7EBDA5D27FE4AA6163A14F035 -IV=D3B98A4562FAB47ED3D09C55E75EE51B -PT=61964EF472752F21C06BFE8801D827D0 -CT=CF3D65AEEDD747416AF436A3B909828F - -I=112 -KEY=E94E6286941EC36D3D94F709060D1A6694BE90B5831D72BA -IV=CF3D65AEEDD747416AF436A3B909828F -PT=6C0B536EA1099A4202CB8617F06115C1 -CT=5DB0625B34C01C47490B5200E8A205FC - -I=113 -KEY=F5D756E568CA6BA06024955232CD0621DDB5C2B56BBF7746 -IV=5DB0625B34C01C47490B5200E8A205FC -PT=08D5CD9945D190AB1C993463FCD4A8CD -CT=771B5C66F79E262FAAC6F92F128669CB - -I=114 -KEY=462C74E6E222DE77173FC934C553200E77733B9A79391E8D -IV=771B5C66F79E262FAAC6F92F128669CB -PT=5628EC55D7AB7634B3FB22038AE8B5D7 -CT=31C436E7CA7343A93AA0B74A38CCDAC0 - -I=115 -KEY=5062F2489F4C68FE26FBFFD30F2063A74DD38CD041F5C44D -IV=31C436E7CA7343A93AA0B74A38CCDAC0 -PT=F279C45DBD75C458164E86AE7D6EB689 -CT=845320B41FD6F1D4DBB36D19D8A4A268 - -I=116 -KEY=5A27EC509FED17B6A2A8DF6710F692739660E1C999516625 -IV=845320B41FD6F1D4DBB36D19D8A4A268 -PT=7C0CB5E4FFE703260A451E1800A17F48 -CT=D8F9FB52BE1B342D6FBBB8A7FCDEFD89 - -I=117 -KEY=E925EC8E99BF11E97A512435AEEDA65EF9DB596E658F9BAC -IV=D8F9FB52BE1B342D6FBBB8A7FCDEFD89 -PT=187F3648643AF8E6B30200DE0652065F -CT=240647A32D765031C79D8893CC19EBA9 - -I=118 -KEY=5574034BCE64FADD5E576396839BF66F3E46D1FDA9967005 -IV=240647A32D765031C79D8893CC19EBA9 -PT=AF808097E0C68C8FBC51EFC557DBEB34 -CT=2A3805A7D773F9C00635779752C9CCE7 - -I=119 -KEY=D842A9983BBDAA5E746F663154E80FAF3873A66AFB5FBCE2 -IV=2A3805A7D773F9C00635779752C9CCE7 -PT=D44486CCC61C68588D36AAD3F5D95083 -CT=2219F0C7A805BEC4A4931F84CBFFC598 - -I=120 -KEY=CD622302BD70E2CD567696F6FCEDB16B9CE0B9EE30A0797A -IV=2219F0C7A805BEC4A4931F84CBFFC598 -PT=67DA1BC4F2BC2F3315208A9A86CD4893 -CT=8B1F4353CF6969888BBD6654AB65C2A8 - -I=121 -KEY=80A1D0CA7667F291DD69D5A53384D8E3175DDFBA9BC5BBD2 -IV=8B1F4353CF6969888BBD6654AB65C2A8 -PT=D114FDA8E61BEAC44DC3F3C8CB17105C -CT=B6F0C0F016A1FA033C37D1128D9B2EF3 - -I=122 -KEY=2C9B755C3B8B44416B991555252522E02B6A0EA8165E9521 -IV=B6F0C0F016A1FA033C37D1128D9B2EF3 -PT=738DBCE3EE7E70EAAC3AA5964DECB6D0 -CT=14FB0A67CB0729CA25152581D8C3FEEF - -I=123 -KEY=5D05BDFBF482E4D37F621F32EE220B2A0E7F2B29CE9D6BCE -IV=14FB0A67CB0729CA25152581D8C3FEEF -PT=D3186497981F294B719EC8A7CF09A092 -CT=14C988C52C7ED50EBD10219F1F58C213 - -I=124 -KEY=9E044D195FA8557C6BAB97F7C25CDE24B36F0AB6D1C5A9DD -IV=14C988C52C7ED50EBD10219F1F58C213 -PT=C062585284FDE540C301F0E2AB2AB1AF -CT=1FE7E153E69F95F102624ACEB9067FA1 - -I=125 -KEY=2B116B6F1FD581C6744C76A424C34BD5B10D407868C3D67C -IV=1FE7E153E69F95F102624ACEB9067FA1 -PT=F18294D40CAA674DB5152676407DD4BA -CT=AB43B2C61C9F23B96EFE293C6730A98F - -I=126 -KEY=EAF1AFBDD2CEDB9ADF0FC462385C686CDFF369440FF37FF3 -IV=AB43B2C61C9F23B96EFE293C6730A98F -PT=7D465730C5422413C1E0C4D2CD1B5A5C -CT=B1413F447CA81C678287EE2366544547 - -I=127 -KEY=4FA6C7DA7A84D4CB6E4EFB2644F4740B5D74876769A73AB4 -IV=B1413F447CA81C678287EE2366544547 -PT=C7BFA1BFA26828F7A5576867A84A0F51 -CT=7AE90F988557F3A41BBDB4B69C5FF56A - -I=128 -KEY=C9B0E3C7CEF4003014A7F4BEC1A387AF46C933D1F5F8CFDE -IV=7AE90F988557F3A41BBDB4B69C5FF56A -PT=5173C32806105AD18616241DB470D4FB -CT=F2EF675645D284F042FAEBE87AE3ECAE - -I=129 -KEY=DB855274F6CC030BE64893E88471035F0433D8398F1B2370 -IV=F2EF675645D284F042FAEBE87AE3ECAE -PT=6DF6B7F917B2F8431235B1B33838033B -CT=30D4F068BC2FDEC79CF81A4FA641A495 - -I=130 -KEY=F37DBF11472A4F87D69C6380385EDD9898CBC276295A87E5 -IV=30D4F068BC2FDEC79CF81A4FA641A495 -PT=F4C98D268B7D175728F8ED65B1E64C8C -CT=0CEB234560B935E5B08C7EA2AA4A962D - -I=131 -KEY=1A2F5A0827B2F861DA7740C558E7E87D2847BCD4831011C8 -IV=0CEB234560B935E5B08C7EA2AA4A962D -PT=9873E312B815DC81E952E5196098B7E6 -CT=7BED84EFC02836F6D165AD27DEEF2B21 - -I=132 -KEY=9C815F2A4EC42D02A19AC42A98CFDE8BF92211F35DFF3AE9 -IV=7BED84EFC02836F6D165AD27DEEF2B21 -PT=D8765DE55131DC4186AE05226976D563 -CT=C36FEDCB97DA734243A20C49D5942DD1 - -I=133 -KEY=9A12CC40F3C185AA62F529E10F15ADC9BA801DBA886B1738 -IV=C36FEDCB97DA734243A20C49D5942DD1 -PT=18B252CEB124BD110693936ABD05A8A8 -CT=94C9A6BDB97522FACEE2E869C3C48FB0 - -I=134 -KEY=F08C23DDC110ED40F63C8F5CB6608F337462F5D34BAF9888 -IV=94C9A6BDB97522FACEE2E869C3C48FB0 -PT=154FF810E3F0CE586A9EEF9D32D168EA -CT=AFC8D15F80F19F942FCA22DA0DF79937 - -I=135 -KEY=B1224FF7293C5DC559F45E03369110A75BA8D709465801BF -IV=AFC8D15F80F19F942FCA22DA0DF79937 -PT=259A6B069CA3273C41AE6C2AE82CB085 -CT=5AADC1716B2ED4FC7CA9825A32EA2FB1 - -I=136 -KEY=D29A829813CC5B4103599F725DBFC45B2701555374B22E0E -IV=5AADC1716B2ED4FC7CA9825A32EA2FB1 -PT=CB78C574D9B1B9EF63B8CD6F3AF00684 -CT=EACB8D3001640F340DFB459CD8D162BD - -I=137 -KEY=1049116DD39F7B30E99212425CDBCB6F2AFA10CFAC634CB3 -IV=EACB8D3001640F340DFB459CD8D162BD -PT=DF461D135DE19FA2C2D393F5C0532071 -CT=9115EB33739C04AAE22765621A8852C5 - -I=138 -KEY=A129CBBF89658D977887F9712F47CFC5C8DD75ADB6EB1E76 -IV=9115EB33739C04AAE22765621A8852C5 -PT=E32AF908A190B95FB160DAD25AFAF6A7 -CT=B171D8AC24C6873B54F42D5DAC51ED34 - -I=139 -KEY=EE7226D88DFA48DFC9F621DD0B8148FE9C2958F01ABAF342 -IV=B171D8AC24C6873B54F42D5DAC51ED34 -PT=0A669BB00E2123B54F5BED67049FC548 -CT=CFFC81B70593A36D022248D1CBE7FC58 - -I=140 -KEY=C907918503B2C1C0060AA06A0E12EB939E0B1021D15D0F1A -IV=CFFC81B70593A36D022248D1CBE7FC58 -PT=E9B1E6FA006D4CEE2775B75D8E48891F -CT=0B3B02FC8A8D677B8077D7FDF9EB0396 - -I=141 -KEY=E468A0560DB602C10D31A296849F8CE81E7CC7DC28B60C8C -IV=0B3B02FC8A8D677B8077D7FDF9EB0396 -PT=AA3626C69662AE442D6F31D30E04C301 -CT=2C78C31D4B2EBAEF54CB6D04C4375196 - -I=142 -KEY=EB8BCD80D3E35CCB2149618BCFB136074AB7AAD8EC815D1A -IV=2C78C31D4B2EBAEF54CB6D04C4375196 -PT=5017BD9EB52514180FE36DD6DE555E0A -CT=67D2DD54A0881186DFA6A608C036CE61 - -I=143 -KEY=7065D92686BA37E9469BBCDF6F39278195110CD02CB7937B -IV=67D2DD54A0881186DFA6A608C036CE61 -PT=6CBC1C2DAA3A7F7B9BEE14A655596B22 -CT=62163C88A40E7CFF7522A3DC32F30BCF - -I=144 -KEY=E0B4AE9D6C9A5A92248D8057CB375B7EE033AF0C1E4498B4 -IV=62163C88A40E7CFF7522A3DC32F30BCF -PT=0F6C44EE5E2587A790D177BBEA206D7B -CT=B84A631DE451F109C48785DE3D4099C2 - -I=145 -KEY=DDCDB4F73AA0C8789CC7E34A2F66AA7724B42AD223040176 -IV=B84A631DE451F109C48785DE3D4099C2 -PT=EE1EA5C5340C2F263D791A6A563A92EA -CT=D438E983DB81DA9341CE1AC45F4E7E52 - -I=146 -KEY=813604E941CBDF6448FF0AC9F4E770E4657A30167C4A7F24 -IV=D438E983DB81DA9341CE1AC45F4E7E52 -PT=08E1F94874432DBD5CFBB01E7B6B171C -CT=0E1C069CB75D4EDF4243D1E6D7175425 - -I=147 -KEY=D64EB9DE5A3B546B46E30C5543BA3E3B2739E1F0AB5D2B01 -IV=0E1C069CB75D4EDF4243D1E6D7175425 -PT=CFCDC1C0EFE678FB5778BD371BF08B0F -CT=CBC0ED542E26A1943926EF7897A79E97 - -I=148 -KEY=D1659785D1D551948D23E1016D9C9FAF1E1F0E883CFAB596 -IV=CBC0ED542E26A1943926EF7897A79E97 -PT=1FEA178A348CAE8B072B2E5B8BEE05FF -CT=C743A7B60EB7C24867DA82AFF15ED18A - -I=149 -KEY=05786C3E1FBE51864A6046B7632B5DE779C58C27CDA4641C -IV=C743A7B60EB7C24867DA82AFF15ED18A -PT=3A4EF6696CD26875D41DFBBBCE6B0012 -CT=EA23014227CF7B563AEFF86DB947FAC4 - -I=150 -KEY=CE1E5D5BF32BF0CAA04347F544E426B1432A744A74E39ED8 -IV=EA23014227CF7B563AEFF86DB947FAC4 -PT=DFDF9B4032986E90CB663165EC95A14C -CT=EAF762B60A106C03B76742E69CEE385A - -I=151 -KEY=F8EAC01B3F7E925A4AB425434EF44AB2F44D36ACE80DA682 -IV=EAF762B60A106C03B76742E69CEE385A -PT=2BDC6EAB1D86311D36F49D40CC556290 -CT=E6CC0491C3509240ED848AE304CC3385 - -I=152 -KEY=BF5AE8B244244B4BAC7821D28DA4D8F219C9BC4FECC19507 -IV=E6CC0491C3509240ED848AE304CC3385 -PT=81D4E28E02717AB347B028A97B5AD911 -CT=11EE9D22AC798AB5FEF6C6188845F425 - -I=153 -KEY=5C6538235111334FBD96BCF021DD5247E73F7A5764846122 -IV=11EE9D22AC798AB5FEF6C6188845F425 -PT=DDE402413BB09DFBE33FD09115357804 -CT=3F054911089500FD2CD0645DBFE2A8D3 - -I=154 -KEY=FAC914FA6B6CA1AB8293F5E1294852BACBEF1E0ADB66C9F1 -IV=3F054911089500FD2CD0645DBFE2A8D3 -PT=345343E023AC39FFA6AC2CD93A7D92E4 -CT=7538E78DE8FC09D203010C61422E6B5A - -I=155 -KEY=1E62F54271EA4374F7AB126CC1B45B68C8EE126B9948A2AB -IV=7538E78DE8FC09D203010C61422E6B5A -PT=0EC4357C476EB76AE4ABE1B81A86E2DF -CT=3A4D0093A2B7FF807BAA6A815538507E - -I=156 -KEY=5AD3B884BE5653BBCDE612FF6303A4E8B34478EACC70F2D5 -IV=3A4D0093A2B7FF807BAA6A815538507E -PT=F59FD86893B7DF7244B14DC6CFBC10CF -CT=2C2FD7DF94FDDC2CA1C05EF5878583FF - -I=157 -KEY=B9039E1678902ECCE1C9C520F7FE78C41284261F4BF5712A -IV=2C2FD7DF94FDDC2CA1C05EF5878583FF -PT=4600E6CCD65B575AE3D02692C6C67D77 -CT=59C9FA2E4A2227C3E5B831899A3CCBFD - -I=158 -KEY=394A8245256D72B8B8003F0EBDDC5F07F73C1796D1C9BAD7 -IV=59C9FA2E4A2227C3E5B831899A3CCBFD -PT=3030D8E24F7BEA0580491C535DFD5C74 -CT=DEAFC4A07A3FB5D5AA09FF6A2515AB4A - -I=159 -KEY=2496931DFCFF2E7166AFFBAEC7E3EAD25D35E8FCF4DC119D -IV=DEAFC4A07A3FB5D5AA09FF6A2515AB4A -PT=63CD1CC241B267791DDC1158D9925CC9 -CT=B1B0AED275FCE241B5726E943B37C130 - -I=160 -KEY=53CBA419E5CED1C8D71F557CB21F0893E8478668CFEBD0AD -IV=B1B0AED275FCE241B5726E943B37C130 -PT=85F4E06A05C8704A775D37041931FFB9 -CT=B0DFD3EF3AF538791E69AF59CAA7B8CC - -I=161 -KEY=DFB0E5440EB582F667C0869388EA30EAF62E2931054C6861 -IV=B0DFD3EF3AF538791E69AF59CAA7B8CC -PT=B7BDA6C504797C8B8C7B415DEB7B533E -CT=220F810B0D5A9ED8794932D0BF6150D6 - -I=162 -KEY=B26A70894070BC9B45CF079885B0AE328F671BE1BA2D38B7 -IV=220F810B0D5A9ED8794932D0BF6150D6 -PT=0113567BFAC19EB86DDA95CD4EC53E6D -CT=56C77682CA1A041B312061F3FB9A1A59 - -I=163 -KEY=36EDA74B7133D5871308711A4FAAAA29BE477A1241B722EE -IV=56C77682CA1A041B312061F3FB9A1A59 -PT=4D39AD87258968FA8487D7C23143691C -CT=4F18208E63B2D84CC7A0707617DD7B63 - -I=164 -KEY=F7589312CE997AFE5C1051942C18726579E70A64566A598D -IV=4F18208E63B2D84CC7A0707617DD7B63 -PT=1B82F5C849E0F965C1B53459BFAAAF79 -CT=85CE0310DEFB36474B38C4347D7EEE8B - -I=165 -KEY=F770FC7B1E183E31D9DE5284F2E3442232DFCE502B14B706 -IV=85CE0310DEFB36474B38C4347D7EEE8B -PT=7B56EBC47E780FB000286F69D08144CF -CT=CB5AE674DB1426618F577BBD63309EA4 - -I=166 -KEY=79AD3040CCC9FD521284B4F029F76243BD88B5ED482429A2 -IV=CB5AE674DB1426618F577BBD63309EA4 -PT=47A5B213BC3DF61B8EDDCC3BD2D1C363 -CT=1E26AB2D8B156913995FCAC1ABD99D68 - -I=167 -KEY=10BB9597F823B61F0CA21FDDA2E20B5024D77F2CE3FDB4CA -IV=1E26AB2D8B156913995FCAC1ABD99D68 -PT=D31FC11C9FD6E7F86916A5D734EA4B4D -CT=84E0E24F155E5EFCA9AE9C5F2F26BD25 - -I=168 -KEY=E1264A2AD33800FF8842FD92B7BC55AC8D79E373CCDB09EF -IV=84E0E24F155E5EFCA9AE9C5F2F26BD25 -PT=F77FE11AE4BEB403F19DDFBD2B1BB6E0 -CT=B41973B0D807A43A822EB57555B818D4 - -I=169 -KEY=A19ABDD25ED272693C5B8E226FBBF1960F5756069963113B -IV=B41973B0D807A43A822EB57555B818D4 -PT=FECAAA8EA9C1883640BCF7F88DEA7296 -CT=949634E68FB9086AE623EAF5E867D4A5 - -I=170 -KEY=DD904ECCC94F64D0A8CDBAC4E002F9FCE974BCF37104C59E -IV=949634E68FB9086AE623EAF5E867D4A5 -PT=E8A413C2ADB97D387C0AF31E979D16B9 -CT=96BE2B618F8A961E5DC892F429A8B6FC - -I=171 -KEY=1B83C20396D7D0D33E7391A56F886FE2B4BC2E0758AC7362 -IV=96BE2B618F8A961E5DC892F429A8B6FC -PT=1408434BF0C3432BC6138CCF5F98B403 -CT=C0A9596F56E48F459D2C405F47DCA44C - -I=172 -KEY=B04C71DBEA60DB15FEDAC8CA396CE0A729906E581F70D72E -IV=C0A9596F56E48F459D2C405F47DCA44C -PT=5E7F070C7EE8A852ABCFB3D87CB70BC6 -CT=A4739C93911C72C959E89544500843BD - -I=173 -KEY=9BFC8026BC1D965B5AA95459A870926E7078FB1C4F789493 -IV=A4739C93911C72C959E89544500843BD -PT=718C23D1F537A6E72BB0F1FD567D4D4E -CT=4D581200B1E446CC3AD306138BF2898B - -I=174 -KEY=FEA9DF8F4FECB3ED17F146591994D4A24AABFD0FC48A1D18 -IV=4D581200B1E446CC3AD306138BF2898B -PT=E4DD231D871795E065555FA9F3F125B6 -CT=E53EFC19D8048073167B1473C5EBA6D9 - -I=175 -KEY=62DF036D6F96D937F2CFBA40C19054D15CD0E97C0161BBC1 -IV=E53EFC19D8048073167B1473C5EBA6D9 -PT=9AB809114F10C3FD9C76DCE2207A6ADA -CT=BDB0C3D9732DE5813C4C72CF01FF5194 - -I=176 -KEY=CFEF04F0343587004F7F7999B2BDB150609C9BB3009EEA55 -IV=BDB0C3D9732DE5813C4C72CF01FF5194 -PT=B4CFE094F8B4EEE5AD30079D5BA35E37 -CT=D00B5B980D8B10DF3D7D4C0BE5975C1C - -I=177 -KEY=CBF2C475C11FA6B89F742201BF36A18F5DE1D7B8E509B649 -IV=D00B5B980D8B10DF3D7D4C0BE5975C1C -PT=34B39728291953DC041DC085F52A21B8 -CT=ADF5CDFDCC23AD8AD111454B2DB69013 - -I=178 -KEY=C96820A08056F7C23281EFFC73150C058CF092F3C8BF265A -IV=ADF5CDFDCC23AD8AD111454B2DB69013 -PT=4C8152CCAA0A23AC029AE4D54149517A -CT=F070979F68BAEBBD6CE8CE8A549C0E12 - -I=179 -KEY=61A6BBDB58B4C9D4C2F178631BAFE7B8E0185C799C232848 -IV=F070979F68BAEBBD6CE8CE8A549C0E12 -PT=0B6AF20EF8550A1BA8CE9B7BD8E23E16 -CT=8A75D276384A4F468B459466A304D418 - -I=180 -KEY=D3EC560DE8B1BBEE4884AA1523E5A8FE6B5DC81F3F27FC50 -IV=8A75D276384A4F468B459466A304D418 -PT=259A18BABFD09145B24AEDD6B005723A -CT=B7C04F66EB771CBD97F948098E23C655 - -I=181 -KEY=16FE806749FDDF8CFF44E573C892B443FCA48016B1043A05 -IV=B7C04F66EB771CBD97F948098E23C655 -PT=E00B5E4B3D9E64D0C512D66AA14C6462 -CT=29FB08289BD19BCC0FEB0F433D5CACEE - -I=182 -KEY=9CC345922C8912D5D6BFED5B53432F8FF34F8F558C5896EB -IV=29FB08289BD19BCC0FEB0F433D5CACEE -PT=07BAA266554EAE0C8A3DC5F56574CD59 -CT=495C245E2F3CC52499B9C1AD7C4484BA - -I=183 -KEY=7DDDCF7DE759FDEC9FE3C9057C7FEAAB6AF64EF8F01C1251 -IV=495C245E2F3CC52499B9C1AD7C4484BA -PT=2E5360D5563EB7D4E11E8AEFCBD0EF39 -CT=68267051421D3AFA19A2E43D501B940B - -I=184 -KEY=4BA2EAD4106DD4B7F7C5B9543E62D0517354AAC5A007865A -IV=68267051421D3AFA19A2E43D501B940B -PT=050EBC6942F92D95367F25A9F734295B -CT=1781558A2A8B7C29AC82D6610B67E3CF - -I=185 -KEY=CFCCD4ECD20E051CE044ECDE14E9AC78DFD67CA4AB606595 -IV=1781558A2A8B7C29AC82D6610B67E3CF -PT=1AC90B21EB197E26846E3E38C263D1AB -CT=BF5FE87A2E882A64493850EC3A0E93A5 - -I=186 -KEY=C9EA5F992C77DD9C5F1B04A43A61861C96EE2C48916EF630 -IV=BF5FE87A2E882A64493850EC3A0E93A5 -PT=58F997704D085DC506268B75FE79D880 -CT=8F43A961964E3452094E8E71295177CD - -I=187 -KEY=1136648F9E0A53C3D058ADC5AC2FB24E9FA0A239B83F81FD -IV=8F43A961964E3452094E8E71295177CD -PT=086041AB29E423EFD8DC3B16B27D8E5F -CT=BF69230BAB6200B7828DC04A13B88E83 - -I=188 -KEY=47040E2D6DFBE3006F318ECE074DB2F91D2D6273AB870F7E -IV=BF69230BAB6200B7828DC04A13B88E83 -PT=57865A8650D3202056326AA2F3F1B0C3 -CT=A012FAEE65E2C4F0AC22CB63AB75E35D - -I=189 -KEY=868F8310E79C0473CF23742062AF7609B10FA91000F2EC23 -IV=A012FAEE65E2C4F0AC22CB63AB75E35D -PT=F3ABB47DAE94B82EC18B8D3D8A67E773 -CT=F35BBD3C516F86384DA3BB6B5CCC8B37 - -I=190 -KEY=5C71ADCE480714DA3C78C91C33C0F031FCAC127B5C3E6714 -IV=F35BBD3C516F86384DA3BB6B5CCC8B37 -PT=CDB3E57FA6DDFF9FDAFE2EDEAF9B10A9 -CT=627A15E65B37C2B9575E8A781271AE64 - -I=191 -KEY=B603092BC5FD004F5E02DCFA68F73288ABF298034E4FC970 -IV=627A15E65B37C2B9575E8A781271AE64 -PT=7E04F9A0F723DF00EA72A4E58DFA1495 -CT=15427D27E783A5476345C83F3E8A3319 - -I=192 -KEY=4DB5A9F825C5E8C24B40A1DD8F7497CFC8B7503C70C5FA69 -IV=15427D27E783A5476345C83F3E8A3319 -PT=842B94BE25E8747BFBB6A0D3E038E88D -CT=35812AFD1A90B0B7D52B45EAD9CAF083 - -I=193 -KEY=D4F2CCC0734F9ACD7EC18B2095E427781D9C15D6A90F0AEA -IV=35812AFD1A90B0B7D52B45EAD9CAF083 -PT=3FAB7D4C741B8CD499476538568A720F -CT=C1A59CD3D9E6650F0D16947D26BFC20D - -I=194 -KEY=CB28A8313E133469BF6417F34C024277108A81AB8FB0C8E7 -IV=C1A59CD3D9E6650F0D16947D26BFC20D -PT=37AC888DCE5CDFD31FDA64F14D5CAEA4 -CT=CB0313E9A046711866CA65702A45CDB6 - -I=195 -KEY=C5BFEB8246ABAF467467041AEC44336F7640E4DBA5F50551 -IV=CB0313E9A046711866CA65702A45CDB6 -PT=326C9E3EB49138ED0E9743B378B89B2F -CT=ACE8FC6C6ABBC8124FE35C7976585DF6 - -I=196 -KEY=110891F8FDF0F254D88FF87686FFFB7D39A3B8A2D3AD58A7 -IV=ACE8FC6C6ABBC8124FE35C7976585DF6 -PT=964239EB84C57F61D4B77A7ABB5B5D12 -CT=0762EF13B80A8B77D04AF797B67D5AA6 - -I=197 -KEY=EFF558976586AC91DFED17653EF5700AE9E94F3565D00201 -IV=0762EF13B80A8B77D04AF797B67D5AA6 -PT=5ECA17ADFE3C2C21FEFDC96F98765EC5 -CT=B60CC9CD9DE93E2A6FB0B59369B1628E - -I=198 -KEY=4494A36EABE3555E69E1DEA8A31C4E208659FAA60C61608F -IV=B60CC9CD9DE93E2A6FB0B59369B1628E -PT=7A659E803888296BAB61FBF9CE65F9CF -CT=73258A43C7DA66FFE4DC9384FC7A60C1 - -I=199 -KEY=1780249B48B8F7561AC454EB64C628DF62856922F01B004E -IV=73258A43C7DA66FFE4DC9384FC7A60C1 -PT=8D9C3DCF612320B4531487F5E35BA208 -CT=F0F5D51C06F2D900CC4BE8D3512CA4B6 - -I=200 -KEY=9FF03D1E23BD9959EA3181F76234F1DFAECE81F1A137A4F8 -IV=F0F5D51C06F2D900CC4BE8D3512CA4B6 -PT=F002AEC878B80A0B887019856B056E0F -CT=E1321C52A51D9345296A0EF2A9DC9CC5 - -I=201 -KEY=6042967162EDA50B0B039DA5C729629A87A48F0308EB383D -IV=E1321C52A51D9345296A0EF2A9DC9CC5 -PT=C5EA4A519D9BAF8FFFB2AB6F41503C52 -CT=ED79D8FC9C60B583E29D0A65A6A5F321 - -I=202 -KEY=250C416206B9D0A9E67A45595B49D71965398566AE4ECB1C -IV=ED79D8FC9C60B583E29D0A65A6A5F321 -PT=34D771B44B3943DE454ED713645475A2 -CT=7A08F9096109535C262407EB323EF7BC - -I=203 -KEY=6357BC1B7B12F1C09C72BC503A408445431D828D9C703CA0 -IV=7A08F9096109535C262407EB323EF7BC -PT=60A1EEAE2B16841A465BFD797DAB2169 -CT=24C7F1A39F8B2F03C256F5C59B69C31A - -I=204 -KEY=18BF29D147A9675BB8B54DF3A5CBAB46814B77480719FFBA -IV=24C7F1A39F8B2F03C256F5C59B69C31A -PT=BFD7B314F959298B7BE895CA3CBB969B -CT=7DDA5DF3CC7C69AA490FB597888396B2 - -I=205 -KEY=E8B13C48FBABCD19C56F100069B7C2ECC844C2DF8F9A6908 -IV=7DDA5DF3CC7C69AA490FB597888396B2 -PT=23F8A60BD2354901F00E1599BC02AA42 -CT=04CEB4BE252293A822C77B9C4C27822B - -I=206 -KEY=BF275C4D9FC54BC0C1A1A4BE4C955144EA83B943C3BDEB23 -IV=04CEB4BE252293A822C77B9C4C27822B -PT=2182C0577EAA3C2A57966005646E86D9 -CT=0F24034642E351984620BB2647F5D649 - -I=207 -KEY=40B459144A6415C2CE85A7F80E7600DCACA3026584483D6A -IV=0F24034642E351984620BB2647F5D649 -PT=F59318D1D3D9A9E0FF930559D5A15E02 -CT=DB98808C46668D79AB059C5554CEEB1A - -I=208 -KEY=D5A01AB42D709E6A151D277448108DA507A69E30D086D670 -IV=DB98808C46668D79AB059C5554CEEB1A -PT=49CF142E621D1A8D951443A067148BA8 -CT=15C32FE5E9BCA5F8D09EA2E4D145FE3D - -I=209 -KEY=8191AB3C11B4B72700DE0891A1AC285DD7383CD401C3284D -IV=15C32FE5E9BCA5F8D09EA2E4D145FE3D -PT=5C1E9B721987B8BF5431B1883CC4294D -CT=AA7CA217D0514CA4F20C50293121E8D8 - -I=210 -KEY=69D24875B8A5B5D1AAA2AA8671FD64F925346CFD30E2C095 -IV=AA7CA217D0514CA4F20C50293121E8D8 -PT=8239553D8FB88E17E843E349A91102F6 -CT=C4068B901CB07904F843BF6F3CDC4FF8 - -I=211 -KEY=12BAE3B5B2C03E746EA421166D4D1DFDDD77D3920C3E8F6D -IV=C4068B901CB07904F843BF6F3CDC4FF8 -PT=80D797C671D3BFF67B68ABC00A658BA5 -CT=9F835417C4D622DB52651897DC23E1C3 - -I=212 -KEY=1A0CFD7FA1284652F1277501A99B3F268F12CB05D01D6EAE -IV=9F835417C4D622DB52651897DC23E1C3 -PT=C36513D78FBBFDCC08B61ECA13E87826 -CT=0156C998E85BE92F0EF998442204EB19 - -I=213 -KEY=7829D1FE113103B0F071BC9941C0D60981EB5341F21985B7 -IV=0156C998E85BE92F0EF998442204EB19 -PT=000894F1AF39A67562252C81B01945E2 -CT=6A554057C0A3EB723B693258BC5E899D - -I=214 -KEY=D719D37FC9087D2F9A24FCCE81633D7BBA8261194E470C2A -IV=6A554057C0A3EB723B693258BC5E899D -PT=B92413276BF142D0AF300281D8397E9F -CT=395F80E405813D97576954A23C77C2CA - -I=215 -KEY=39E173517A321A5AA37B7C2A84E200ECEDEB35BB7230CEE0 -IV=395F80E405813D97576954A23C77C2CA -PT=AA95F2BD255DBE23EEF8A02EB33A6775 -CT=1B1BC5D3DABD536E91177EF1BF2B7E39 - -I=216 -KEY=EE1FB67D907C597BB860B9F95E5F53827CFC4B4ACD1BB0D9 -IV=1B1BC5D3DABD536E91177EF1BF2B7E39 -PT=985E81E0BF5FF6EFD7FEC52CEA4E4321 -CT=20F42326749CC7CCD54188DEA46F4EC1 - -I=217 -KEY=41D333EC5E537B8098949ADF2AC3944EA9BDC3946974FE18 -IV=20F42326749CC7CCD54188DEA46F4EC1 -PT=901FD7D22F220608AFCC8591CE2F22FB -CT=AFFC6F2668097B58A0CFF619A3FDD1CB - -I=218 -KEY=F6E392EF75572C6A3768F5F942CAEF160972358DCA892FD3 -IV=AFFC6F2668097B58A0CFF619A3FDD1CB -PT=45AEB51360C50AB1B730A1032B0457EA -CT=1B75CF440CE8521069599B7889F21C1D - -I=219 -KEY=47C82CF46472D3732C1D3ABD4E22BD06602BAEF5437B33CE -IV=1B75CF440CE8521069599B7889F21C1D -PT=7E931056CC33D22CB12BBE1B1125FF19 -CT=F6079ADBAA8D28F371F0156B170FB7BD - -I=220 -KEY=DDA62A9922B04902DA1AA066E4AF95F511DBBB9E54748473 -IV=F6079ADBAA8D28F371F0156B170FB7BD -PT=2BE3DA337C9187109A6E066D46C29A71 -CT=7D2FC16B26971DDC20C6F7510C47B352 - -I=221 -KEY=570C8CA5236A2E65A735610DC2388829311D4CCF58333721 -IV=7D2FC16B26971DDC20C6F7510C47B352 -PT=43596064590570F88AAAA63C01DA6767 -CT=5FBA845FB25FE6AE015E4E8A228ED645 - -I=222 -KEY=6CEA158ED663A4B7F88FE55270676E87304302457ABDE164 -IV=5FBA845FB25FE6AE015E4E8A228ED645 -PT=1E265F0AA9A20C603BE6992BF5098AD2 -CT=A729E250D736A43966DD0D9C461ECEC0 - -I=223 -KEY=AACCE3387C0DF35D5FA60702A751CABE569E0FD93CA32FA4 -IV=A729E250D736A43966DD0D9C461ECEC0 -PT=B08AAE113CCE6226C626F6B6AA6E57EA -CT=A8192E964A74A6ABDB463ECFA483A1E3 - -I=224 -KEY=207F19ABDA13F728F7BF2994ED256C158DD8311698208E47 -IV=A8192E964A74A6ABDB463ECFA483A1E3 -PT=858CF92E6B1793448AB3FA93A61E0475 -CT=060C7CCCD58E6348518161C7878AA71B - -I=225 -KEY=AB05AD81CF07091AF1B3555838AB0F5DDC5950D11FAA295C -IV=060C7CCCD58E6348518161C7878AA71B -PT=424D175035503C728B7AB42A1514FE32 -CT=8ECAA12830B0C5B4C6950E69AFD31B66 - -I=226 -KEY=3A8E1CC01464AF9B7F79F470081BCAE91ACC5EB8B079323A -IV=8ECAA12830B0C5B4C6950E69AFD31B66 -PT=6E5A94391F1FE5A9918BB141DB63A681 -CT=65C3A891192324A7FA3C882B2C09CB8D - -I=227 -KEY=8004AB13CF38B3ED1ABA5CE11138EE4EE0F0D6939C70F9B7 -IV=65C3A891192324A7FA3C882B2C09CB8D -PT=584E219335CA4642BA8AB7D3DB5C1C76 -CT=F29F8735A403414621F2100AF38A500C - -I=228 -KEY=D37BB962CFC53E77E825DBD4B53BAF08C102C6996FFAA9BB -IV=F29F8735A403414621F2100AF38A500C -PT=CCB996C23C627D4D537F127100FD8D9A -CT=9C6A7655E25E9231E46C0D3B57C7FCAB - -I=229 -KEY=C23B3C983C79179A744FAD8157653D39256ECBA2383D5510 -IV=9C6A7655E25E9231E46C0D3B57C7FCAB -PT=5D727E12D3932F56114085FAF3BC29ED -CT=6C5AA7364755AF599AB6F86EC8B24C52 - -I=230 -KEY=4462CD1DD817170C18150AB710309260BFD833CCF08F1942 -IV=6C5AA7364755AF599AB6F86EC8B24C52 -PT=D7A99C8F3BC37AD08659F185E46E0096 -CT=821D7EAC8FD041C0C8CF1011661FBB9E - -I=231 -KEY=1BA52BEF2B010D169A08741B9FE0D3A0771723DD9690A2DC -IV=821D7EAC8FD041C0C8CF1011661FBB9E -PT=704F3525510FCC745FC7E6F2F3161A1A -CT=44591D71D64FC38010E402874853E9BC - -I=232 -KEY=C6A6818229CC65E6DE51696A49AF102067F3215ADEC34B60 -IV=44591D71D64FC38010E402874853E9BC -PT=5D5769AE155C9F43DD03AA6D02CD68F0 -CT=E5647FF6C843543E484FC13B58A345B9 - -I=233 -KEY=41F27DD5905B299C3B35169C81EC441E2FBCE06186600ED9 -IV=E5647FF6C843543E484FC13B58A345B9 -PT=ADF29030DFDFCCEE8754FC57B9974C7A -CT=E6EA42E2F046D3ED75081A50770563D1 - -I=234 -KEY=3A8018855EDC80D2DDDF547E71AA97F35AB4FA31F1656D08 -IV=E6EA42E2F046D3ED75081A50770563D1 -PT=096F74717D5583477B726550CE87A94E -CT=D75682FE37396887659E87895F1C6441 - -I=235 -KEY=6C94C2634142DA310A89D6804693FF743F2A7DB8AE790949 -IV=D75682FE37396887659E87895F1C6441 -PT=F1B527DD4935FBDE5614DAE61F9E5AE3 -CT=15755CFE84E113AA751E4D5BB098ABC7 - -I=236 -KEY=4BA407D7C6426C641FFC8A7EC272ECDE4A3430E31EE1A28E -IV=15755CFE84E113AA751E4D5BB098ABC7 -PT=7C4433DCC314DBD72730C5B48700B655 -CT=B048F209CE1B1FAEC33392D2D8F326A1 - -I=237 -KEY=A56FD7BCEEA55474AFB478770C69F3708907A231C612842F -IV=B048F209CE1B1FAEC33392D2D8F326A1 -PT=D40C7CD8D80C8C6CEECBD06B28E73810 -CT=8E1F4830F94004C286C39D0EC014A963 - -I=238 -KEY=0730B7B664CFD1E321AB3047F529F7B20FC43F3F06062D4C -IV=8E1F4830F94004C286C39D0EC014A963 -PT=B16772FE8C8A573FA25F600A8A6A8597 -CT=3FB92771D2BE2D33C40AB0409998B229 - -I=239 -KEY=0A08E43B13C57EB41E1217362797DA81CBCE8F7F9F9E9F65 -IV=3FB92771D2BE2D33C40AB0409998B229 -PT=D4883476825EA2D30D38538D770AAF57 -CT=190106DE79836016C57A16BBBA6893D2 - -I=240 -KEY=195B7E1B67872B0D071311E85E14BA970EB499C425F60CB7 -IV=190106DE79836016C57A16BBBA6893D2 -PT=3B8F4F140FDFFB6B13539A20744255B9 -CT=C06398537B4F534203D57184543E6516 - -I=241 -KEY=BE0C4A8A9B581D16C77089BB255BE9D50D61E84071C869A1 -IV=C06398537B4F534203D57184543E6516 -PT=E50D127AE258061DA7573491FCDF361B -CT=FF615CCC9F2D3DBB3074C835ECE4224E - -I=242 -KEY=662A224DAB1233C83811D577BA76D46E3D1520759D2C4BEF -IV=FF615CCC9F2D3DBB3074C835ECE4224E -PT=347C976D20470968D82668C7304A2EDE -CT=B5FB1BCCBC838B87FDB10FEFE6CDC45B - -I=243 -KEY=F4F3B47D9CC8BA798DEACEBB06F55FE9C0A42F9A7BE18FB4 -IV=B5FB1BCCBC838B87FDB10FEFE6CDC45B -PT=BC276D1002C5DD8292D9963037DA89B1 -CT=151F88A44A76568FAC756011B827778D - -I=244 -KEY=7EA3C03193B737DE98F5461F4C8309666CD14F8BC3C6F839 -IV=151F88A44A76568FAC756011B827778D -PT=BCD9054596EE644E8A50744C0F7F8DA7 -CT=C1B0B6FDD717881442496794A2C890F2 - -I=245 -KEY=C4D94D5C4169EE4B5945F0E29B9481722E98281F610E68CB -IV=C1B0B6FDD717881442496794A2C890F2 -PT=3D7F68D3014F3BEDBA7A8D6DD2DED995 -CT=181100A04881DCF9813E4A22C6C1BB3B - -I=246 -KEY=A9A9483D9FC46DD34154F042D3155D8BAFA6623DA7CFD3F0 -IV=181100A04881DCF9813E4A22C6C1BB3B -PT=0FE2E2A97DFFB4966D700561DEAD8398 -CT=AA4BEC4007C38C7B86B6F9EED33E5EB1 - -I=247 -KEY=5F08A3C09F4AE90BEB1F1C02D4D6D1F029109BD374F18D41 -IV=AA4BEC4007C38C7B86B6F9EED33E5EB1 -PT=C2392264CE43C57AF6A1EBFD008E84D8 -CT=A0756CCDA72462CD89DF9990C0FE6676 - -I=248 -KEY=6A1A4F2D25DFC9F94B6A70CF73F2B33DA0CF0243B40FEB37 -IV=A0756CCDA72462CD89DF9990C0FE6676 -PT=A6650A3432CCA74A3512ECEDBA9520F2 -CT=F5044AECC6F35C99FCDBA26DD15E1474 - -I=249 -KEY=B475174A46D0CDC2BE6E3A23B501EFA45C14A02E6551FF43 -IV=F5044AECC6F35C99FCDBA26DD15E1474 -PT=07967DE17DEB720CDE6F5867630F043B -CT=60645B559E7321D7FA8A3F925CFC0FA4 - -I=250 -KEY=8DBB9D8A4A2E7E61DE0A61762B72CE73A69E9FBC39ADF0E7 -IV=60645B559E7321D7FA8A3F925CFC0FA4 -PT=D8D3FD2077545DD039CE8AC00CFEB3A3 -CT=C4C6FD53A2572D643AA631FB85B84D0B - -I=251 -KEY=97D34E4B3B9E081A1ACC9C258925E3179C38AE47BC15BDEC -IV=C4C6FD53A2572D643AA631FB85B84D0B -PT=F31D8F3C8AC67E081A68D3C171B0767B -CT=E1A0E460E2D1483FE954F26F45CCE7A0 - -I=252 -KEY=5372C72A4ABF72D9FB6C78456BF4AB28756C5C28F9D95A4C -IV=E1A0E460E2D1483FE954F26F45CCE7A0 -PT=422C5429CE7BD811C4A1896171217AC3 -CT=2695923CFB2141F05A0F144FF021BD36 - -I=253 -KEY=A8CA6DB8A8758322DDF9EA7990D5EAD82F63486709F8E77A -IV=2695923CFB2141F05A0F144FF021BD36 -PT=780771C65FCB907BFBB8AA92E2CAF1FB -CT=A9820B527F71E95CC1F53033149FB26F - -I=254 -KEY=62ABF1F4178F3C73747BE12BEFA40384EE9678541D675515 -IV=A9820B527F71E95CC1F53033149FB26F -PT=CCC14BD8DF1CA8A4CA619C4CBFFABF51 -CT=2BAD4E8CD7D6420D36DC2F8E77DCA072 - -I=255 -KEY=C79B767D31D9F0FC5FD6AFA738724189D84A57DA6ABBF567 -IV=2BAD4E8CD7D6420D36DC2F8E77DCA072 -PT=1EFF63C71B10DCC7A53087892656CC8F -CT=C21303AAB04E2CAF1893396DD405B265 - -I=256 -KEY=1F3C7FF71340DEEC9DC5AC0D883C6D26C0D96EB7BEBE4702 -IV=C21303AAB04E2CAF1893396DD405B265 -PT=209270B7768E5553D8A7098A22992E10 -CT=B220025B5307C9D5D1EEB4B427E7263F - -I=257 -KEY=867CB381E6D532B32FE5AE56DB3BA4F31137DA039959613D -IV=B220025B5307C9D5D1EEB4B427E7263F -PT=8546A6C9B4CEF0229940CC76F595EC5F -CT=B925C660EBE409050DA369E58C601F4D - -I=258 -KEY=33B33F93622E509296C0683630DFADF61C94B3E615397E70 -IV=B925C660EBE409050DA369E58C601F4D -PT=1F4930242C2951C4B5CF8C1284FB6221 -CT=67DA7B4BEAB2152D21C54F389F9282D4 - -I=259 -KEY=E8EC3394AF44DD34F11A137DDA6DB8DB3D51FCDE8AABFCA4 -IV=67DA7B4BEAB2152D21C54F389F9282D4 -PT=41611AE93BE61306DB5F0C07CD6A8DA6 -CT=4C116D3ED0B021129CCD1764D132A72D - -I=260 -KEY=92F61F4CB5794268BD0B7E430ADD99C9A19CEBBA5B995B89 -IV=4C116D3ED0B021129CCD1764D132A72D -PT=E7B1E63FBD5B4CA77A1A2CD81A3D9F5C -CT=FE1C3096C14AF2A4DC840207BFFFC0AF - -I=261 -KEY=08DC826B4DDBAC4D43174ED5CB976B6D7D18E9BDE4669B26 -IV=FE1C3096C14AF2A4DC840207BFFFC0AF -PT=9A0D034B1931FD599A2A9D27F8A2EE25 -CT=ED500812A10CC6C4EED0836871F85AA9 - -I=262 -KEY=486EBC43A876FF2AAE4746C76A9BADA993C86AD5959EC18F -IV=ED500812A10CC6C4EED0836871F85AA9 -PT=8237641B58069AFD40B23E28E5AD5367 -CT=0AD90C1C13E7C1318057A417C0B9B97C - -I=263 -KEY=F340D2CAC4645595A49E4ADB797C6C98139FCEC2552778F3 -IV=0AD90C1C13E7C1318057A417C0B9B97C -PT=905119E1F11E4B04BB2E6E896C12AABF -CT=B260FFA5806A4A6D8845FA6146A565ED - -I=264 -KEY=DF326741BD1EE2FF16FEB57EF91626F59BDA34A313821D1E -IV=B260FFA5806A4A6D8845FA6146A565ED -PT=4F639233904531162C72B58B797AB76A -CT=2D27A1A3968E30EBCA463C8709D0FD83 - -I=265 -KEY=D4C684692E05983C3BD914DD6F98161E519C08241A52E09D -IV=2D27A1A3968E30EBCA463C8709D0FD83 -PT=428B700FB3CD18790BF4E328931B7AC3 -CT=D350CCF3B440006C9F18E99DD5B69920 - -I=266 -KEY=9DD5275FFDCD5D2DE889D82EDBD81672CE84E1B9CFE479BD -IV=D350CCF3B440006C9F18E99DD5B69920 -PT=97F4A6256A9E22FB4913A336D3C8C511 -CT=F5A0571EB7E4719B862EBC47141EA319 - -I=267 -KEY=0A3B329A4973D7A21D298F306C3C67E948AA5DFEDBFADAA4 -IV=F5A0571EB7E4719B862EBC47141EA319 -PT=E355F7EBA4DAC16B97EE15C5B4BE8A8F -CT=4F18730073D3E78CAD356441F1317B2D - -I=268 -KEY=3BB3A19EF4EB8A755231FC301FEF8065E59F39BF2ACBA189 -IV=4F18730073D3E78CAD356441F1317B2D -PT=A20B3B6C41E88E9D31889304BD985DD7 -CT=AEAECB17B9009AAF1E4E9CC02653194B - -I=269 -KEY=4B9DDD2F821CE4D1FC9F3727A6EF1ACAFBD1A57F0C98B8C2 -IV=AEAECB17B9009AAF1E4E9CC02653194B -PT=5D2E4A96F9BB4AD4702E7CB176F76EA4 -CT=26851709960A42D5711EBDC7D40535FC - -I=270 -KEY=D7273499C5BA2842DA1A202E30E5581F8ACF18B8D89D8D3E -IV=26851709960A42D5711EBDC7D40535FC -PT=202534EA0A1952A19CBAE9B647A6CC93 -CT=FF8BFFB98EDA7E54664AE879551B5497 - -I=271 -KEY=7870FF6B66070AB02591DF97BE3F264BEC85F0C18D86D9A9 -IV=FF8BFFB98EDA7E54664AE879551B5497 -PT=365CFE282B9508CFAF57CBF2A3BD22F2 -CT=D0809C84A97221E6F8DCB483B38EC7E1 - -I=272 -KEY=F4E6DFDF4A081200F5114313174D07AD145944423E081E48 -IV=D0809C84A97221E6F8DCB483B38EC7E1 -PT=915323F59134AB838C9620B42C0F18B0 -CT=DC8A24B8DECF81E0412DBF10127119EC - -I=273 -KEY=336A7C81A4BE3FE9299B67ABC982864D5574FB522C7907A4 -IV=DC8A24B8DECF81E0412DBF10127119EC -PT=0FC4387E49F666B8C78CA35EEEB62DE9 -CT=84E370DF6CA478BA85FC0874393CE442 - -I=274 -KEY=F8ADC39E17CDDEB0AD781774A526FEF7D088F3261545E3E6 -IV=84E370DF6CA478BA85FC0874393CE442 -PT=34BFEFD3E43D8EE0CBC7BF1FB373E159 -CT=2C109A8363D1D0FB69CA77ABFA922F05 - -I=275 -KEY=2B26D271208BD64F81688DF7C6F72E0CB942848DEFD7CCE3 -IV=2C109A8363D1D0FB69CA77ABFA922F05 -PT=D28D86D5199E7E30D38B11EF374608FF -CT=F1749EFE66D339BC99AE4D9F63C90490 - -I=276 -KEY=ACB8D3E6F5A45F0C701C1309A02417B020ECC9128C1EC873 -IV=F1749EFE66D339BC99AE4D9F63C90490 -PT=2ADAFA1911C5E9BD879E0197D52F8943 -CT=3B2A7C4278E1F071BFA29A6B0BFF4A15 - -I=277 -KEY=CCEE75264DD770C44B366F4BD8C5E7C19F4E537987E18266 -IV=3B2A7C4278E1F071BFA29A6B0BFF4A15 -PT=84E244B62DF08DC76056A6C0B8732FC8 -CT=A35F83A5EE0B1C3B9DAD76DEAED96D72 - -I=278 -KEY=F8F9239CDB5CC963E869ECEE36CEFBFA02E325A72938EF14 -IV=A35F83A5EE0B1C3B9DAD76DEAED96D72 -PT=F0B652F296CF162B341756BA968BB9A7 -CT=D5867FFE2FB75E309D3345611B25E3B0 - -I=279 -KEY=509A10ABA5EAF2963DEF93101979A5CA9FD060C6321D0CA4 -IV=D5867FFE2FB75E309D3345611B25E3B0 -PT=C47D42AE34131463A86333377EB63BF5 -CT=6E136F01638AFBE3554218431DF44E7E - -I=280 -KEY=9B52C39C38F16CCE53FCFC117AF35E29CA9278852FE942DA -IV=6E136F01638AFBE3554218431DF44E7E -PT=78E05783EAEBE1BDCBC8D3379D1B9E58 -CT=FB6ACD3D0CF805374AD07EF5C038EBF6 - -I=281 -KEY=2044F086923D5E43A896312C760B5B1E80420670EFD1A92C -IV=FB6ACD3D0CF805374AD07EF5C038EBF6 -PT=02415B8E4D915492BB16331AAACC328D -CT=0086C26DA11540FF5F485D7B238FD98C - -I=282 -KEY=12CE4C4109606CD7A810F341D71E1BE1DF0A5B0BCC5E70A0 -IV=0086C26DA11540FF5F485D7B238FD98C -PT=0A2988237132B0B3328ABCC79B5D3294 -CT=F2E94C71A2AE0FCB096D8259B931CF8D - -I=283 -KEY=21BBCDA7FBC5229C5AF9BF3075B0142AD667D952756FBF2D -IV=F2E94C71A2AE0FCB096D8259B931CF8D -PT=4234B6C7F1CE98A3337581E6F2A54E4B -CT=3B52E7834263C6790763706943741FD8 - -I=284 -KEY=BB451732881A996161AB58B337D3D253D104A93B361BA0F5 -IV=3B52E7834263C6790763706943741FD8 -PT=F8509FB57E14501F9AFEDA9573DFBBFD -CT=93FCA9F122CB707213D0CD72D8E6BF74 - -I=285 -KEY=857D076E9A127A84F257F1421518A221C2D46449EEFD1F81 -IV=93FCA9F122CB707213D0CD72D8E6BF74 -PT=AA4D07DFAD030BE03E38105C1208E3E5 -CT=50717568D21862AECFAA898337405C96 - -I=286 -KEY=1BCFD020D63709E0A226842AC700C08F0D7EEDCAD9BD4317 -IV=50717568D21862AECFAA898337405C96 -PT=7B488D7BBB2D538E9EB2D74E4C257364 -CT=0338D74260CB6CBB1B220DE7E4CC0BCF - -I=287 -KEY=CCDDF5D0BBCE202DA11E5368A7CBAC34165CE02D3D7148D8 -IV=0338D74260CB6CBB1B220DE7E4CC0BCF -PT=16E01F8B3E94AC26D71225F06DF929CD -CT=698AD17BB2F5F06C0465BEE34A7DCEDD - -I=288 -KEY=B7F556BC9BB4DC49C8948213153E5C5812395ECE770C8605 -IV=698AD17BB2F5F06C0465BEE34A7DCEDD -PT=3ED0C80AFDEFE8BF7B28A36C207AFC64 -CT=E20129557F795C2B1CC32A5494824A4B - -I=289 -KEY=4B00D75969C3549C2A95AB466A4700730EFA749AE38ECC4E -IV=E20129557F795C2B1CC32A5494824A4B -PT=20BE0CD6C2244384FCF581E5F27788D5 -CT=C2F9DD55E91F4796636FEC9745410087 - -I=290 -KEY=5EDCC5155BA684A4E86C7613835847E56D95980DA6CFCCC9 -IV=C2F9DD55E91F4796636FEC9745410087 -PT=B2DF53DF1139FB9915DC124C3265D038 -CT=015D51CD3568EB4EC210B58FFA89A409 - -I=291 -KEY=21BA26AC6880AACDE93127DEB630ACABAF852D825C4668C0 -IV=015D51CD3568EB4EC210B58FFA89A409 -PT=401094B8B47CBDC87F66E3B933262E69 -CT=2987D39C19E6997957BDD0CAF010F778 - -I=292 -KEY=BBA7ABC0A20CCBDEC0B6F442AFD635D2F838FD48AC569FB8 -IV=2987D39C19E6997957BDD0CAF010F778 -PT=EFC30498827AAD9A9A1D8D6CCA8C6113 -CT=E01AA987C9520EF8EBF53E97371D056B - -I=293 -KEY=5322D81BAA29410320AC5DC566843B2A13CDC3DF9B4B9AD3 -IV=E01AA987C9520EF8EBF53E97371D056B -PT=685D6F660D40105CE88573DB08258ADD -CT=D1265ABFCFA75FC65E94983BFF75CD48 - -I=294 -KEY=19DF73EBF1CEF669F18A077AA92364EC4D595BE4643E579B -IV=D1265ABFCFA75FC65E94983BFF75CD48 -PT=DD6E090E9981E5F24AFDABF05BE7B76A -CT=605FDD1CA95B8FE1A5E26DBA10241914 - -I=295 -KEY=F7D1D0CA3DAA851891D5DA660078EB0DE8BB365E741A4E8F -IV=605FDD1CA95B8FE1A5E26DBA10241914 -PT=9F8442EE8B5A325FEE0EA321CC647371 -CT=76D67121FDEAEB6B81DBB29565F71E8E - -I=296 -KEY=FFFF200EA04824E9E703AB47FD920066696084CB11ED5001 -IV=76D67121FDEAEB6B81DBB29565F71E8E -PT=5AF386509F0C8BAA082EF0C49DE2A1F1 -CT=7E1D833DC8D73228B7DFDE918E31E5E7 - -I=297 -KEY=2A7D40B689490FC7991E287A3545324EDEBF5A5A9FDCB5E6 -IV=7E1D833DC8D73228B7DFDE918E31E5E7 -PT=02AB05F508ACDD21D58260B829012B2E -CT=D6CA06D415EA5D750B5D06C252645A43 - -I=298 -KEY=134154161A39E2CF4FD42EAE20AF6F3BD5E25C98CDB8EFA5 -IV=D6CA06D415EA5D750B5D06C252645A43 -PT=E63873AE14DD3BA8393C14A09370ED08 -CT=BFEA32E77BC1607921C54027C01C3EDF - -I=299 -KEY=AD8AF90935A6B455F03E1C495B6E0F42F4271CBF0DA4D17A -IV=BFEA32E77BC1607921C54027C01C3EDF -PT=BAD47B1FBF949870BECBAD1F2F9F569A -CT=A86FFC9A91C79AFE47899B3934F3E05E - -I=300 -KEY=D88A2E828514CEC25851E0D3CAA995BCB3AE878639573124 -IV=A86FFC9A91C79AFE47899B3934F3E05E -PT=2A2115074A9767747500D78BB0B27A97 -CT=507ED155CC3ED3B1922BBC166812A7FE - -I=301 -KEY=2CDDF1A577A3C86C082F31860697460D21853B90514596DA -IV=507ED155CC3ED3B1922BBC166812A7FE -PT=308D27178ABA22BCF457DF27F2B706AE -CT=87F4EEA7CD2438F3EDCB650824A2D638 - -I=302 -KEY=2B9D006908018D648FDBDF21CBB37EFECC4E5E9875E740E2 -IV=87F4EEA7CD2438F3EDCB650824A2D638 -PT=28F6C452D061E3DB0740F1CC7FA24508 -CT=DBA57DDA73A4E987EA32EF113877E908 - -I=303 -KEY=FC69838410D06425547EA2FBB8179779267CB1894D90A9EA -IV=DBA57DDA73A4E987EA32EF113877E908 -PT=91CFB50FFBE97D8AD7F483ED18D1E941 -CT=1720ED3E3B685A19CDA66BD09BD4DA5F - -I=304 -KEY=541AAB6191E2C51F435E4FC5837FCD60EBDADA59D64473B5 -IV=1720ED3E3B685A19CDA66BD09BD4DA5F -PT=78FF980C48FAEBA0A87328E58132A13A -CT=ED2E260103CAA77598FD195D02B484C8 - -I=305 -KEY=761B0A3F50E2ACC1AE7069C480B56A157327C304D4F0F77D -IV=ED2E260103CAA77598FD195D02B484C8 -PT=8C01554039D8F8EE2201A15EC10069DE -CT=A9F0E16716B3AC14E06F18F5AEECB541 - -I=306 -KEY=70056CD35CF430D5078088A39606C6019348DBF17A1C423C -IV=A9F0E16716B3AC14E06F18F5AEECB541 -PT=C139651464D1614B061E66EC0C169C14 -CT=A41DDF008E0D52B627982D4196C3069E - -I=307 -KEY=EE1932746487B7BEA39D57A3180B94B7B4D0F6B0ECDF44A2 -IV=A41DDF008E0D52B627982D4196C3069E -PT=C617572884721A3D9E1C5EA73873876B -CT=44E5304E35A21660C450FAF84D87B13B - -I=308 -KEY=13D43E4526F8243FE77867ED2DA982D770800C48A158F599 -IV=44E5304E35A21660C450FAF84D87B13B -PT=9C72E08DD264D6B7FDCD0C31427F9381 -CT=173B2C7A54A1A3CF3D39DCB68DA1C539 - -I=309 -KEY=7CB72DE2CAED4080F0434B97790821184DB9D0FE2CF930A0 -IV=173B2C7A54A1A3CF3D39DCB68DA1C539 -PT=4DF3764F679E29446F6313A7EC1564BF -CT=F1A167A3EB8F3FAB9F9B1570475ED15A - -I=310 -KEY=A7E6340A1278A3E801E22C3492871EB3D222C58E6BA7E1FA -IV=F1A167A3EB8F3FAB9F9B1570475ED15A -PT=2ED419EA11AAF8F3DB5119E8D895E368 -CT=2C5C5B10E285FE6C7E4750D2F9C1BD23 - -I=311 -KEY=4B535B4D088F09192DBE77247002E0DFAC65955C92665CD9 -IV=2C5C5B10E285FE6C7E4750D2F9C1BD23 -PT=A3E9EA99771D0C02ECB56F471AF7AAF1 -CT=A12B4A15DBFAE2E7D4A7A792CD3C121A - -I=312 -KEY=2F0E7BAD76DC0A718C953D31ABF8023878C232CE5F5A4EC3 -IV=A12B4A15DBFAE2E7D4A7A792CD3C121A -PT=1CC105D2604628B7645D20E07E530368 -CT=65CE700B785D901C5E5E08F7E74BB296 - -I=313 -KEY=6111C386DE35C954E95B4D3AD3A59224269C3A39B811FC55 -IV=65CE700B785D901C5E5E08F7E74BB296 -PT=F902717AF7F0794E4E1FB82BA8E9C325 -CT=E7F3BD1056C504285FFC7F65B395DCAE - -I=314 -KEY=3B8F85E6FD28C4610EA8F02A8560960C7960455C0B8420FB -IV=E7F3BD1056C504285FFC7F65B395DCAE -PT=20A5529420D6D4C35A9E4660231D0D35 -CT=6CC36458ADECCA8B7198FD272A8C76C8 - -I=315 -KEY=D404C97E089F240B626B9472288C5C8708F8B87B21085633 -IV=6CC36458ADECCA8B7198FD272A8C76C8 -PT=1094639F6723C9B0EF8B4C98F5B7E06A -CT=D01C3C1E036D804563F04926ED203146 - -I=316 -KEY=4779B44770085E18B277A86C2BE1DCC26B08F15DCC286775 -IV=D01C3C1E036D804563F04926ED203146 -PT=A482437681DFE307937D7D3978977A13 -CT=319D579DE9E55C8A3B2097EE8C93375F - -I=317 -KEY=22362304D7417BB483EAFFF1C2048048502866B340BB502A -IV=319D579DE9E55C8A3B2097EE8C93375F -PT=7AF0C8274B5C243B654F9743A74925AC -CT=5F722165B8B422E088814B77A6B4D8E4 - -I=318 -KEY=06FDA49350C16FEADC98DE947AB0A2A8D8A92DC4E60F88CE -IV=5F722165B8B422E088814B77A6B4D8E4 -PT=A37964FA3E8145EF24CB87978780145E -CT=C0417773DFD3FC83C2CE12D388F5DD8F - -I=319 -KEY=366245F8CBC490611CD9A9E7A5635E2B1A673F176EFA5541 -IV=C0417773DFD3FC83C2CE12D388F5DD8F -PT=5D7E1E14F7BD7DB6309FE16B9B05FF8B -CT=2EAE64B58C18AC7ADD2EE62896AB708D - -I=320 -KEY=A1BB8A9F9BE8F1383277CD52297BF251C749D93FF85125CC -IV=2EAE64B58C18AC7ADD2EE62896AB708D -PT=3ADC6991BF15554F97D9CF67502C6159 -CT=069FC966F8A985AD41617CB0148D2B96 - -I=321 -KEY=7AB228E4114C14AB34E80434D1D277FC8628A58FECDC0E5A -IV=069FC966F8A985AD41617CB0148D2B96 -PT=4405B80CCE92FD71DB09A27B8AA4E593 -CT=13459A0239A33BC41424A5D03C6B2864 - -I=322 -KEY=78D1BC27E5CBBB1D27AD9E36E8714C38920C005FD0B7263E -IV=13459A0239A33BC41424A5D03C6B2864 -PT=B9BAA861988616CD026394C3F487AFB6 -CT=08DA968A2BAEB9B763EB42BF555A2BFA - -I=323 -KEY=F53B033A22EA1D7B2F7708BCC3DFF58FF1E742E085ED0DC4 -IV=08DA968A2BAEB9B763EB42BF555A2BFA -PT=30654265AD0FB24E8DEABF1DC721A666 -CT=E8412BDC1E75AC8E2C28552E2195795E - -I=324 -KEY=4928B51AF5C2408CC7362360DDAA5901DDCF17CEA478749A -IV=E8412BDC1E75AC8E2C28552E2195795E -PT=EEB05E487EEB907FBC13B620D7285DF7 -CT=E01839F95680D27E048383236D59EE85 - -I=325 -KEY=C4DB91EAFC4C26D7272E1A998B2A8B7FD94C94EDC9219A1F -IV=E01839F95680D27E048383236D59EE85 -PT=BA0160229D7471FE8DF324F0098E665B -CT=D41902E6BE946CEB1612CFEE2F33F7CD - -I=326 -KEY=B550731E659834A1F337187F35BEE794CF5E5B03E6126DD2 -IV=D41902E6BE946CEB1612CFEE2F33F7CD -PT=7DC970AFAF99BA6C718BE2F499D41276 -CT=326C3523173D62E9E145592E7A774311 - -I=327 -KEY=5F87F6C2402B2352C15B2D5C2283857D2E1B022D9C652EC3 -IV=326C3523173D62E9E145592E7A774311 -PT=24ED6DAE1B24CC2BEAD785DC25B317F3 -CT=DDAE8AFF94604FFA82AE4FFB06953C01 - -I=328 -KEY=3636C04061996CD01CF5A7A3B6E3CA87ACB54DD69AF012C2 -IV=DDAE8AFF94604FFA82AE4FFB06953C01 -PT=98E262805B8D9FD169B1368221B24F82 -CT=0D75DCFA4941BCE658DB2C71CB270BE7 - -I=329 -KEY=64B9A0DE7DDA73C011807B59FFA27661F46E61A751D71925 -IV=0D75DCFA4941BCE658DB2C71CB270BE7 -PT=2BC34C226D41D8CE528F609E1C431F10 -CT=D70ED1DCDB9420E4B4A0D2A7C5148DE3 - -I=330 -KEY=F64196479D35F74BC68EAA852436568540CEB30094C394C6 -IV=D70ED1DCDB9420E4B4A0D2A7C5148DE3 -PT=1015CB1E4569986C92F83699E0EF848B -CT=524314DCCF2ADE5F8C3D241824C2BA73 - -I=331 -KEY=686AB32115A2884C94CDBE59EB1C88DACCF39718B0012EB5 -IV=524314DCCF2ADE5F8C3D241824C2BA73 -PT=FB8B49053F724B7D9E2B256688977F07 -CT=7C579324F7251EDF95BDE2320104ACA6 - -I=332 -KEY=34DD68E6F442F6D9E89A2D7D1C399605594E752AB1058213 -IV=7C579324F7251EDF95BDE2320104ACA6 -PT=A3B71504A8DAA3515CB7DBC7E1E07E95 -CT=921A66278A6D1E61D4B509F199F8FE55 - -I=333 -KEY=19C9F40A858DD9EA7A804B5A965488648DFB7CDB28FD7C46 -IV=921A66278A6D1E61D4B509F199F8FE55 -PT=B0B651905E1B38FB2D149CEC71CF2F33 -CT=F2C37CF94514C902A0E438159C2C9F5F - -I=334 -KEY=B68812FC7D4E40D6884337A3D34041662D1F44CEB4D1E319 -IV=F2C37CF94514C902A0E438159C2C9F5F -PT=7DE03F498839F8DAAF41E6F6F8C3993C -CT=4596A25A85D06BCC74F686F8F1E8C203 - -I=335 -KEY=2836F982CA563379CDD595F956902AAA59E9C2364539211A -IV=4596A25A85D06BCC74F686F8F1E8C203 -PT=D5425E42151014ED9EBEEB7EB71873AF -CT=0BA46EFA61FB07430C51D7CE267E1F47 - -I=336 -KEY=BC8C7F9051C98892C671FB03376B2DE955B815F863473E5D -IV=0BA46EFA61FB07430C51D7CE267E1F47 -PT=5D060EEC179C1B9E94BA86129B9FBBEB -CT=49F7D7D7BAB7795A4E74A854C8C1AC53 - -I=337 -KEY=E661F49B22BC92358F862CD48DDC54B31BCCBDACAB86920E -IV=49F7D7D7BAB7795A4E74A854C8C1AC53 -PT=C598926A437A27A45AED8B0B73751AA7 -CT=0EB97E32AEC4CE3959197C5B72C1ABC5 - -I=338 -KEY=E625AB8664BCF057813F52E623189A8A42D5C1F7D94739CB -IV=0EB97E32AEC4CE3959197C5B72C1ABC5 -PT=B7272C4D712F9CF500445F1D46006262 -CT=DA9F53564E69AED610BCCAD13C00A241 - -I=339 -KEY=75FC1D46AFD886915BA001B06D71345C52690B26E5479B8A -IV=DA9F53564E69AED610BCCAD13C00A241 -PT=FE7513CF9353BBF093D9B6C0CB6476C6 -CT=7F61B6F9B7C14EB6179F2DA597EC1183 - -I=340 -KEY=F92D3201DA84422024C1B749DAB07AEA45F6268372AB8A09 -IV=7F61B6F9B7C14EB6179F2DA597EC1183 -PT=4E4D3DF58D7D9C338CD12F47755CC4B1 -CT=F9216373C300AA9BE96BD8C98F9716B7 - -I=341 -KEY=680384A1E522C848DDE0D43A19B0D071AC9DFE4AFD3C9CBE -IV=F9216373C300AA9BE96BD8C98F9716B7 -PT=1A7B30192D54142E912EB6A03FA68A68 -CT=8512BA1B57BC04EF3C021DB1EC3CA9C6 - -I=342 -KEY=DE3B85BD09EC93B858F26E214E0CD49E909FE3FB11003578 -IV=8512BA1B57BC04EF3C021DB1EC3CA9C6 -PT=86587FF85D73F77FB638011CECCE5BF0 -CT=FA582C37D4063D61428C886A9FD54C84 - -I=343 -KEY=C574CA7322F443FBA2AA42169A0AE9FFD2136B918ED579FC -IV=FA582C37D4063D61428C886A9FD54C84 -PT=3A7425A8B7BC3A941B4F4FCE2B18D043 -CT=7571B4D46CBC671964AB5BDE9C843DCF - -I=344 -KEY=078109812EFBA9DBD7DBF6C2F6B68EE6B6B8304F12514433 -IV=7571B4D46CBC671964AB5BDE9C843DCF -PT=5224060F0848F028C2F5C3F20C0FEA20 -CT=DA9EB72D65D492FE88B819674B8433C1 - -I=345 -KEY=5BF7FA2E15A87C850D4541EF93621C183E00292859D577F2 -IV=DA9EB72D65D492FE88B819674B8433C1 -PT=2622B2A19CBBAD065C76F3AF3B53D55E -CT=C66EF470CEDDD499AE6214E75DE9051B - -I=346 -KEY=ECBE2377CAF0C9E9CB2BB59F5DBFC88190623DCF043C72E9 -IV=C66EF470CEDDD499AE6214E75DE9051B -PT=833F22A76D51E360B749D959DF58B56C -CT=57407E3DEFFF753E879619424FCE5713 - -I=347 -KEY=4EAB83DA78D60CB09C6BCBA2B240BDBF17F4248D4BF225FA -IV=57407E3DEFFF753E879619424FCE5713 -PT=25781A534FB9192CA215A0ADB226C559 -CT=644D89381439E7BBED7DC344CBF4C886 - -I=348 -KEY=C4977EF1F6271D6CF826429AA6795A04FA89E7C98006ED7C -IV=644D89381439E7BBED7DC344CBF4C886 -PT=E8EDD9AA25A8C5B08A3CFD2B8EF111DC -CT=CA4B2680D0EE8E28818BE8DE8D625ADC - -I=349 -KEY=80212F6D11C6DAE2326D641A7697D42C7B020F170D64B7A0 -IV=CA4B2680D0EE8E28818BE8DE8D625ADC -PT=8F667EEDB79E930644B6519CE7E1C78E -CT=5497F477AD5E65BB748A781533F1BCEF - -I=350 -KEY=A05DF1DF7E0393A566FA906DDBC9B1970F8877023E950B4F -IV=5497F477AD5E65BB748A781533F1BCEF -PT=099FDB76E6D21788207CDEB26FC54947 -CT=C8C541B359BF1B53441C4EFFFD2F65AF - -I=351 -KEY=3970F236F800D18BAE3FD1DE8276AAC44B9439FDC3BA6EE0 -IV=C8C541B359BF1B53441C4EFFFD2F65AF -PT=C79FA2079ECCEBCD992D03E98603422E -CT=E59765A861DE0168161EA1360B5966A9 - -I=352 -KEY=8ED3BFA3E4C9453C4BA8B476E3A8ABAC5D8A98CBC8E30849 -IV=E59765A861DE0168161EA1360B5966A9 -PT=AFBCD48F06709730B7A34D951CC994B7 -CT=5A65435BD1B4DB742E8AFF8C402927FC - -I=353 -KEY=2A3F01E56E45895B11CDF72D321C70D87300674788CA2FB5 -IV=5A65435BD1B4DB742E8AFF8C402927FC -PT=CF684F64B8CCD2EDA4ECBE468A8CCC67 -CT=551AF68D50D23408F47214C0B18E6C8A - -I=354 -KEY=CA12AC8D17941E6244D701A062CE44D0877273873944433F -IV=551AF68D50D23408F47214C0B18E6C8A -PT=561072AC144854C1E02DAD6879D19739 -CT=ADFF035C89E040A4C3CCE190D6CB7283 - -I=355 -KEY=D1CA1B08A51B5086E92802FCEB2E047444BE9217EF8F31BC -IV=ADFF035C89E040A4C3CCE190D6CB7283 -PT=827ADE7D0F329D9A1BD8B785B28F4EE4 -CT=425F5596D3FD37243EE59D6FC1F5ADCC - -I=356 -KEY=54EC325FE63AA470AB77576A38D333507A5B0F782E7A9C70 -IV=425F5596D3FD37243EE59D6FC1F5ADCC -PT=4AAF21E64F8DBDB0852629574321F4F6 -CT=D85520FE860C9F320CDC8192A900F499 - -I=357 -KEY=5B4612BC35BFC12473227794BEDFAC6276878EEA877A68E9 -IV=D85520FE860C9F320CDC8192A900F499 -PT=0D046A402A1860C70FAA20E3D3856554 -CT=11C20F3ACED79B37402B2F04886D4CC7 - -I=358 -KEY=5052384CE705101562E078AE7008375536ACA1EE0F17242E -IV=11C20F3ACED79B37402B2F04886D4CC7 -PT=7546E6521BBBFAFE0B142AF0D2BAD131 -CT=BCDA339266E3AFB779AF17CE34218BE5 - -I=359 -KEY=F7ECFB2AA4FC6DE2DE3A4B3C16EB98E24F03B6203B36AFCB -IV=BCDA339266E3AFB779AF17CE34218BE5 -PT=85DF7958789E9090A7BEC36643F97DF7 -CT=300D46EAB6466314BB00DBC869C77F4E - -I=360 -KEY=1E27229506EC9555EE370DD6A0ADFBF6F4036DE852F1D085 -IV=300D46EAB6466314BB00DBC869C77F4E -PT=C6CED700614467A0E9CBD9BFA210F8B7 -CT=51735C075A14FE95D4A02F527A9474D3 - -I=361 -KEY=857F653E1E811CABBF4451D1FAB9056320A342BA2865A456 -IV=51735C075A14FE95D4A02F527A9474D3 -PT=53D436401D6811B19B5847AB186D89FE -CT=827017531E56980C4357549D0E70114F - -I=362 -KEY=1BCE612F3A5262223D344682E4EF9D6F63F416272615B519 -IV=827017531E56980C4357549D0E70114F -PT=4C1BD17FFD65AB2C9EB1041124D37E89 -CT=751BCA9516123906561FB8AF2208CEE1 - -I=363 -KEY=7C7034EC27524FC3482F8C17F2FDA46935EBAE88041D7BF8 -IV=751BCA9516123906561FB8AF2208CEE1 -PT=7C23D6E77039F35267BE55C31D002DE1 -CT=82CAFBBE859FA80B2A8E58CEC074B01A - -I=364 -KEY=7F31EEE0447BB53CCAE577A977620C621F65F646C469CBE2 -IV=82CAFBBE859FA80B2A8E58CEC074B01A -PT=B91FF7759419BBB10341DA0C6329FAFF -CT=B7614376C9BAFC92E17E39D2BDF1F2EF - -I=365 -KEY=E705144BCE40FC987D8434DFBED8F0F0FE1BCF947998390D -IV=B7614376C9BAFC92E17E39D2BDF1F2EF -PT=72B3472217AC80979834FAAB8A3B49A4 -CT=A63BA38FDDFE99D28BA447871BBA6211 - -I=366 -KEY=15C813D2D9AD1494DBBF97506326692275BF881362225B1C -IV=A63BA38FDDFE99D28BA447871BBA6211 -PT=349F8E5FAE004B51F2CD079917EDE80C -CT=C87E448872E619419766CB46787F2581 - -I=367 -KEY=B12B790C217821DA13C1D3D811C07063E2D943551A5D7E9D -IV=C87E448872E619419766CB46787F2581 -PT=EC474C794E3C8322A4E36ADEF8D5354E -CT=73DD478F7F41857F7A5DE7EDF3F1AF7B - -I=368 -KEY=1CFA6A54B3E572DC601C94576E81F51C9884A4B8E9ACD1E6 -IV=73DD478F7F41857F7A5DE7EDF3F1AF7B -PT=48F8361EF11F94C1ADD11358929D5306 -CT=8B85DE2CBE5C96CBDFE16064079754D9 - -I=369 -KEY=6718C10E683F4D73EB994A7BD0DD63D74765C4DCEE3B853F -IV=8B85DE2CBE5C96CBDFE16064079754D9 -PT=59BFDA108542EDDB7BE2AB5ADBDA3FAF -CT=56FF53384CED780F604F86EC0CE26B26 - -I=370 -KEY=704ED4F1E96776A2BD6619439C301BD8272A4230E2D9EE19 -IV=56FF53384CED780F604F86EC0CE26B26 -PT=468FDBDB8BC26B5A175615FF81583BD1 -CT=7B0C2436262A262C5FAFC3A9B786DB00 - -I=371 -KEY=67AFB86317B622B2C66A3D75BA1A3DF478858199555F3519 -IV=7B0C2436262A262C5FAFC3A9B786DB00 -PT=768BE978E5E8CA6E17E16C92FED15410 -CT=D32206D5D1521AB667516391810F5719 - -I=372 -KEY=0BF4E0C32EA3D69615483BA06B4827421FD4E208D4506200 -IV=D32206D5D1521AB667516391810F5719 -PT=1943C5D93D10A0E36C5B58A03915F424 -CT=6BCE2BEC0D5A0DA9051AF2B34A873694 - -I=373 -KEY=924D1C527572A2EF7E86104C66122AEB1ACE10BB9ED75494 -IV=6BCE2BEC0D5A0DA9051AF2B34A873694 -PT=E3020D099D0841C299B9FC915BD17479 -CT=3BEBA6BA0762BF5FAA4D26B70071B4A9 - -I=374 -KEY=CFA41DB53F2F8766456DB6F6617095B4B083360C9EA6E03D -IV=3BEBA6BA0762BF5FAA4D26B70071B4A9 -PT=31F7316F0D1012CD5DE901E74A5D2589 -CT=C4253CED7F88DF97596B08A15BAEF533 - -I=375 -KEY=E2B9D43008C1537281488A1B1EF84A23E9E83EADC508150E -IV=C4253CED7F88DF97596B08A15BAEF533 -PT=00365D6755A898E62D1DC98537EED414 -CT=2D4EB6BA84D1C0C978EA20C1693BB75C - -I=376 -KEY=43EA75DFD5B35CCBAC063CA19A298AEA91021E6CAC33A252 -IV=2D4EB6BA84D1C0C978EA20C1693BB75C -PT=599279C68B67A988A153A1EFDD720FB9 -CT=03698CC5E133AD8855B847C124FD2778 - -I=377 -KEY=8F2C76FCFBD8060DAF6FB0647B1A2762C4BA59AD88CE852A -IV=03698CC5E133AD8855B847C124FD2778 -PT=47EFAF7E090B94B5CCC603232E6B5AC6 -CT=8D44C11C25ADE5631E05FAAECCA70AF7 - -I=378 -KEY=E02084775A2E1A4E222B71785EB7C201DABFA30344698FDD -IV=8D44C11C25ADE5631E05FAAECCA70AF7 -PT=394EC624EBC0D79E6F0CF28BA1F61C43 -CT=5EB407847213D5E950C66787B140BC35 - -I=379 -KEY=D8208A70940589F47C9F76FC2CA417E88A79C484F52933E8 -IV=5EB407847213D5E950C66787B140BC35 -PT=F28816D227AC09F538000E07CE2B93BA -CT=2D4FBD74A027526BADC8C2A433963C22 - -I=380 -KEY=858193C76AFE48D951D0CB888C83458327B10620C6BF0FCA -IV=2D4FBD74A027526BADC8C2A433963C22 -PT=FBAA6C644F8E08885DA119B7FEFBC12D -CT=FA2DAE761EBBFDE4B77CBCD2381165DB - -I=381 -KEY=DA9A9F800056FC6EABFD65FE9238B86790CDBAF2FEAE6A11 -IV=FA2DAE761EBBFDE4B77CBCD2381165DB -PT=F66A574C26D0F15C5F1B0C476AA8B4B7 -CT=DB18F5B16BF19C2BCCA36091A302BF38 - -I=382 -KEY=BD2AB07F036032AB70E5904FF9C9244C5C6EDA635DACD529 -IV=DB18F5B16BF19C2BCCA36091A302BF38 -PT=04B0C1A19C6D38B467B02FFF0336CEC5 -CT=D3F01581B21DF4E470EE595CAB44912C - -I=383 -KEY=7EF57F6BDE41D79CA31585CE4BD4D0A82C80833FF6E84405 -IV=D3F01581B21DF4E470EE595CAB44912C -PT=83BF32E0F3F3CEE7C3DFCF14DD21E537 -CT=10C69B9A04E0851B63D85D025BBACA29 - -I=384 -KEY=22057A9912BB6B76B3D31E544F3455B34F58DE3DAD528E2C -IV=10C69B9A04E0851B63D85D025BBACA29 -PT=150ACC96322893CC5CF005F2CCFABCEA -CT=2743FE5769DDA5D591318E200AF672D0 - -I=385 -KEY=742A2117B51176E69490E00326E9F066DE69501DA7A4FCFC -IV=2743FE5769DDA5D591318E200AF672D0 -PT=93246C1A26F66DAF562F5B8EA7AA1D90 -CT=5CA8FC8DB4A20B2CA8AB86B1B40DA1A1 - -I=386 -KEY=3C09F8C3B20BE749C8381C8E924BFB4A76C2D6AC13A95D5D -IV=5CA8FC8DB4A20B2CA8AB86B1B40DA1A1 -PT=D91806E0F3451C374823D9D4071A91AF -CT=25701E4C6685C98333566EB75498AEB7 - -I=387 -KEY=DD0386F2D0D1E8FFED4802C2F4CE32C94594B81B4731F3EA -IV=25701E4C6685C98333566EB75498AEB7 -PT=701A5D7027053688E10A7E3162DA0FB6 -CT=E4A5889FC49B62F767F61F1D2810801A - -I=388 -KEY=BB9A1FA7287B0D3D09ED8A5D3055503E2262A7066F2173F0 -IV=E4A5889FC49B62F767F61F1D2810801A -PT=A110B0A38255279B66999955F8AAE5C2 -CT=F1A9BDA2045F3EAE2AB9CEE2AD352270 - -I=389 -KEY=21B561DC3C44B5A5F84437FF340A6E9008DB69E4C2145180 -IV=F1A9BDA2045F3EAE2AB9CEE2AD352270 -PT=1562CF8420963B479A2F7E7B143FB898 -CT=E7E2BA657D3482A4825D643B8C01B52E - -I=390 -KEY=60A0FA1F5FA435401FA68D9A493EEC348A860DDF4E15E4AE -IV=E7E2BA657D3482A4825D643B8C01B52E -PT=930490633BC4EDC941159BC363E080E5 -CT=2FDBCD145EB8620594834B0D63BBD137 - -I=391 -KEY=7DD1686F811E4017307D408E17868E311E0546D22DAE3599 -IV=2FDBCD145EB8620594834B0D63BBD137 -PT=4BB1C43F4ABC51CD1D719270DEBA7557 -CT=B703658AD9FFCDE05E2C7E252990402E - -I=392 -KEY=18203DC5AAA632F5877E2504CE7943D1402938F7043E75B7 -IV=B703658AD9FFCDE05E2C7E252990402E -PT=47931942F275F05E65F155AA2BB872E2 -CT=5B79CB7FA90D3BB5A979A4588D4DE434 - -I=393 -KEY=9F6D532CBAF42FCDDC07EE7B67747864E9509CAF89739183 -IV=5B79CB7FA90D3BB5A979A4588D4DE434 -PT=E3A36DF4EB896B4D874D6EE910521D38 -CT=61BF460521E67B3CAC638F3298EF9310 - -I=394 -KEY=ED4F97BC99036E83BDB8A87E469203584533139D119C0293 -IV=61BF460521E67B3CAC638F3298EF9310 -PT=55EABDF72CCB5D737222C49023F7414E -CT=8A27D87B53B2FB8BBAFF7851AF1D51F2 - -I=395 -KEY=E1B9A7291D885F8E379F70051520F8D3FFCC6BCCBE815361 -IV=8A27D87B53B2FB8BBAFF7851AF1D51F2 -PT=D30271EA236E948F0CF63095848B310D -CT=15075FDCBD2D6FC15B9A3841A2D58C34 - -I=396 -KEY=976B101EE3E10E0822982FD9A80D9712A456538D1C54DF55 -IV=15075FDCBD2D6FC15B9A3841A2D58C34 -PT=879EED3434159D8076D2B737FE695186 -CT=6896582462983FAAE443078F9768B339 - -I=397 -KEY=A7A3277BF5F605FC4A0E77FDCA95A8B8401554028B3C6C6C -IV=6896582462983FAAE443078F9768B339 -PT=89DDABE96D1069ED30C8376516170BF4 -CT=96FE6B921416B667AA5B34D2D2E25747 - -I=398 -KEY=DD57026B1D4E32A8DCF01C6FDE831EDFEA4E60D059DE3B2B -IV=96FE6B921416B667AA5B34D2D2E25747 -PT=8144C8BB09FC72827AF42510E8B83754 -CT=EEDC3677AB7B57829F6D733F8090DA8A - -I=399 -KEY=B4D1BDF297DC0574322C2A1875F8495D752313EFD94EE1A1 -IV=EEDC3677AB7B57829F6D733F8090DA8A -PT=510F7A55799B39786986BF998A9237DC -CT=BA50C94440C04A8C0899D42658E25437 - -========== - -KEYSIZE=256 - -I=0 -KEY=0000000000000000000000000000000000000000000000000000000000000000 -IV=00000000000000000000000000000000 -PT=00000000000000000000000000000000 -CT=FE3C53653E2F45B56FCD88B2CC898FF0 - -I=1 -KEY=B2493DE29713367D9FAA93469F8EF596FE3C53653E2F45B56FCD88B2CC898FF0 -IV=FE3C53653E2F45B56FCD88B2CC898FF0 -PT=B2493DE29713367D9FAA93469F8EF596 -CT=7CE2ABAF8BEF23C4816DC8CE842048A7 - -I=2 -KEY=33A36646FE56F70DC0C51A3117E639F182DEF8CAB5C06671EEA0407C48A9C757 -IV=7CE2ABAF8BEF23C4816DC8CE842048A7 -PT=81EA5BA46945C1705F6F89778868CC67 -CT=50CD14A12C6852D39654C816BFAF9AC2 - -I=3 -KEY=0D6A3DACE75B104CA8A303A32670BF3AD213EC6B99A834A278F4886AF7065D95 -IV=50CD14A12C6852D39654C816BFAF9AC2 -PT=3EC95BEA190DE74168661992319686CB -CT=3F411DAD0E339FE281637133BF46BD13 - -I=4 -KEY=A53BE0709BF686A7DB7C3848D81AB66BED52F1C6979BAB40F997F9594840E086 -IV=3F411DAD0E339FE281637133BF46BD13 -PT=A851DDDC7CAD96EB73DF3BEBFE6A0951 -CT=5BA2C7663A4061719A7CCC2AF2A3EE8A - -I=5 -KEY=ECF3490CB7717A5236A3A94811BEBF13B6F036A0ADDBCA3163EB3573BAE30E0C -IV=5BA2C7663A4061719A7CCC2AF2A3EE8A -PT=49C8A97C2C87FCF5EDDF9100C9A40978 -CT=F105031CE7E5111317745C64F4F6D150 - -I=6 -KEY=CE8A062A2A9F9EDE2EFB43A8602BB47847F535BC4A3EDB22749F69174E15DF5C -IV=F105031CE7E5111317745C64F4F6D150 -PT=22794F269DEEE48C1858EAE071950B6B -CT=C8F030398A873550A34386D9A153D833 - -I=7 -KEY=2BE39545B8FC27444178BF0004C7F1048F050585C0B9EE72D7DCEFCEEF46076F -IV=C8F030398A873550A34386D9A153D833 -PT=E569936F9263B99A6F83FCA864EC457C -CT=519CF42C0BBFCBD79679089BC5E963B4 - -I=8 -KEY=80E9C0F78F99E309935C0A69B961D787DE99F1A9CB0625A541A5E7552AAF64DB -IV=519CF42C0BBFCBD79679089BC5E963B4 -PT=AB0A55B23765C44DD224B569BDA62683 -CT=64AC8FEA3B83584E9B7379B48F88B7A4 - -I=9 -KEY=48DDBDA704BA7702960820A0D2CA485CBA357E43F0857DEBDAD69EE1A527D37F -IV=64AC8FEA3B83584E9B7379B48F88B7A4 -PT=C8347D508B23940B05542AC96BAB9FDB -CT=2B1F53F35A308673E9B1E004C32B2080 - -I=10 -KEY=D26C4C6BE601D63BDDE6F1A49B5124CB912A2DB0AAB5FB9833677EE5660CF3FF -IV=2B1F53F35A308673E9B1E004C32B2080 -PT=9AB1F1CCE2BBA1394BEED104499B6C97 -CT=0DAE66B5741FE38E544D9EC4E90ABDAF - -I=11 -KEY=D241355DB8FC5F23D0D207F72E290F189C844B05DEAA1816672AE0218F064E50 -IV=0DAE66B5741FE38E544D9EC4E90ABDAF -PT=002D79365EFD89180D34F653B5782BD3 -CT=D00122636CC0D9D62E614EAF0963C448 - -I=12 -KEY=1BC3268A0B674A05B2FC6E18460231564C856966B26AC1C0494BAE8E86658A18 -IV=D00122636CC0D9D62E614EAF0963C448 -PT=C98213D7B39B1526622E69EF682B3E4E -CT=30EF014D1766651C524B3CC82F0140C6 - -I=13 -KEY=50BE5951A5C2403C52425897C442A8457C6A682BA50CA4DC1B009246A964CADE -IV=30EF014D1766651C524B3CC82F0140C6 -PT=4B7D7FDBAEA50A39E0BE368F82409913 -CT=BAD488702B447FABEC2074E1DD37E631 - -I=14 -KEY=C007EE52430FF98EDD206C94ED349DE6C6BEE05B8E48DB77F720E6A774532CEF -IV=BAD488702B447FABEC2074E1DD37E631 -PT=90B9B703E6CDB9B28F623403297635A3 -CT=EC3862EB60E7D8D0827645BD690F71B8 - -I=15 -KEY=AE37C1DBEBF9B269E8D10CC4F046F9FC2A8682B0EEAF03A77556A31A1D5C5D57 -IV=EC3862EB60E7D8D0827645BD690F71B8 -PT=6E302F89A8F64BE735F160501D72641A -CT=6073D1F25F3697C1E07384C67D71D8AE - -I=16 -KEY=86E8B9050AB24200E3757B67F08761534AF55342B1999466952527DC602D85F9 -IV=6073D1F25F3697C1E07384C67D71D8AE -PT=28DF78DEE14BF0690BA477A300C198AF -CT=90EF55AB8837792F82CF0F002E36F8DB - -I=17 -KEY=DE93EA10BB6DC2B0A6D3919561CE5AE4DA1A06E939AEED4917EA28DC4E1B7D22 -IV=90EF55AB8837792F82CF0F002E36F8DB -PT=587B5315B1DF80B045A6EAF291493BB7 -CT=063783CB1A2137732D10CA6233C5CE93 - -I=18 -KEY=3D147E3727A1FEB2C6F36AB9DF772E97DC2D8522238FDA3A3AFAE2BE7DDEB3B1 -IV=063783CB1A2137732D10CA6233C5CE93 -PT=E38794279CCC3C026020FB2CBEB97473 -CT=79C5CEEE64BFD33948D2E08EBE25B7E9 - -I=19 -KEY=34586C52923969647663A0D69436D7D1A5E84BCC4730090372280230C3FB0458 -IV=79C5CEEE64BFD33948D2E08EBE25B7E9 -PT=094C1265B59897D6B090CA6F4B41F946 -CT=87DFB65D575F56670DB739C988FD7DE5 - -I=20 -KEY=53724BF79612A7F0237927604619DD592237FD91106F5F647F9F3BF94B0679BD -IV=87DFB65D575F56670DB739C988FD7DE5 -PT=672A27A5042BCE94551A87B6D22F0A88 -CT=643F46BC77A5FE2434753B9C38142583 - -I=21 -KEY=8FBC30746F29985FFFA43C8BD3C4FC664608BB2D67CAA1404BEA006573125C3E -IV=643F46BC77A5FE2434753B9C38142583 -PT=DCCE7B83F93B3FAFDCDD1BEB95DD213F -CT=FD774BD6874EA7C0D790A5015440B664 - -I=22 -KEY=9A61A910701A4A42873549F78D3D9FD1BB7FF0FBE08406809C7AA5642752EA5A -IV=FD774BD6874EA7C0D790A5015440B664 -PT=15DD99641F33D21D7891757C5EF963B7 -CT=BFCEF4403428F5C96C24C249962371D4 - -I=23 -KEY=8D98738F6DF30113AF69A7A61C1582EE04B104BBD4ACF349F05E672DB1719B8E -IV=BFCEF4403428F5C96C24C249962371D4 -PT=17F9DA9F1DE94B51285CEE5191281D3F -CT=CC79F35C41F0E6C0EB03472B1D13029E - -I=24 -KEY=976C27F1A15FF6780043636FC4777090C8C8F7E7955C15891B5D2006AC629910 -IV=CC79F35C41F0E6C0EB03472B1D13029E -PT=1AF4547ECCACF76BAF2AC4C9D862F27E -CT=0629B80F94FBC2C1984985B9F3B85BDD - -I=25 -KEY=E8934C533DED166F58D65C9E60A906A5CEE14FE801A7D7488314A5BF5FDAC2CD -IV=0629B80F94FBC2C1984985B9F3B85BDD -PT=7FFF6BA29CB2E01758953FF1A4DE7635 -CT=F2A70F4ED1A836696841D523F2650B55 - -I=26 -KEY=8116688C16D2C26D162C4D813FB267103C4640A6D00FE121EB55709CADBFC998 -IV=F2A70F4ED1A836696841D523F2650B55 -PT=698524DF2B3FD4024EFA111F5F1B61B5 -CT=A9B5565EB9B5D5DAC52BE0F449FBE11A - -I=27 -KEY=5A7062E77C6D20563AFD0BFDAAE04BE995F316F869BA34FB2E7E9068E4442882 -IV=A9B5565EB9B5D5DAC52BE0F449FBE11A -PT=DB660A6B6ABFE23B2CD1467C95522CF9 -CT=E47F675379D4CE3DDABA0F906BE014B2 - -I=28 -KEY=4DDC0A5938F4A3DC1AF8D3AFD3DF6198718C71AB106EFAC6F4C49FF88FA43C30 -IV=E47F675379D4CE3DDABA0F906BE014B2 -PT=17AC68BE4499838A2005D852793F2A71 -CT=7B95AB0E030C70B7940ECDAEFCA570A5 - -I=29 -KEY=E287EFC66626600AF3453F68BE53E5250A19DAA513628A7160CA525673014C95 -IV=7B95AB0E030C70B7940ECDAEFCA570A5 -PT=AF5BE59F5ED2C3D6E9BDECC76D8C84BD -CT=E854E5DE0C42D57B869C29FC8D5AFFF3 - -I=30 -KEY=7F3415A538F60B24A58447E1D38805B3E24D3F7B1F205F0AE6567BAAFE5BB366 -IV=E854E5DE0C42D57B869C29FC8D5AFFF3 -PT=9DB3FA635ED06B2E56C178896DDBE096 -CT=4E55EDEDC35CDEAB3BFB2B5D39871625 - -I=31 -KEY=59E5F5ECC5693DA07046636094970E8CAC18D296DC7C81A1DDAD50F7C7DCA543 -IV=4E55EDEDC35CDEAB3BFB2B5D39871625 -PT=26D1E049FD9F3684D5C22481471F0B3F -CT=3355C2CC762E58FA941E0004209CA710 - -I=32 -KEY=0B62CF7EA869036A529E9D184574CD609F4D105AAA52D95B49B350F3E7400253 -IV=3355C2CC762E58FA941E0004209CA710 -PT=52873A926D003ECA22D8FE78D1E3C3EC -CT=9B86680D69D38870268D42E78EDA2B50 - -I=33 -KEY=CEDC9CCC4DC42CB055EDC50597EE24DF04CB7857C381512B6F3E1214699A2903 -IV=9B86680D69D38870268D42E78EDA2B50 -PT=C5BE53B2E5AD2FDA0773581DD29AE9BF -CT=05DD4896F08EEAA6A53FA7BCF183F538 - -I=34 -KEY=CA30B422016C86247D75B618D19247AC011630C1330FBB8DCA01B5A89819DC3B -IV=05DD4896F08EEAA6A53FA7BCF183F538 -PT=04EC28EE4CA8AA942898731D467C6373 -CT=F81E56F4390D65C7959348A6FBD8A94E - -I=35 -KEY=B7096A2EC0259DA21ACA6DBE637A9F15F90866350A02DE4A5F92FD0E63C17575 -IV=F81E56F4390D65C7959348A6FBD8A94E -PT=7D39DE0CC1491B8667BFDBA6B2E8D8B9 -CT=4364CA2D90FA256084DF8E2FCDC62AB3 - -I=36 -KEY=436C0894D4436149EE685F0061BDF3AEBA6CAC189AF8FB2ADB4D7321AE075FC6 -IV=4364CA2D90FA256084DF8E2FCDC62AB3 -PT=F46562BA1466FCEBF4A232BE02C76CBB -CT=0991DE19A5ABE5F7E8AE24120789B9AB - -I=37 -KEY=44E1636AFF962EC4F1C446A89B9393C6B3FD72013F531EDD33E35733A98EE66D -IV=0991DE19A5ABE5F7E8AE24120789B9AB -PT=078D6BFE2BD54F8D1FAC19A8FA2E6068 -CT=0F4EF4FA608671AC5F71063CF6C1EBDE - -I=38 -KEY=44289918A9E99F859FC2F604FE38B86EBCB386FB5FD56F716C92510F5F4F0DB3 -IV=0F4EF4FA608671AC5F71063CF6C1EBDE -PT=00C9FA72567FB1416E06B0AC65AB2BA8 -CT=2D6A2A1CC9D208C16236BBC9451EC5E1 - -I=39 -KEY=BE5907C77B0939D20575F27427A2C3FE91D9ACE7960767B00EA4EAC61A51C852 -IV=2D6A2A1CC9D208C16236BBC9451EC5E1 -PT=FA719EDFD2E0A6579AB70470D99A7B90 -CT=237A8DFBA42708BBF7E540766F2059F1 - -I=40 -KEY=CD97125720F2002207AC44C456CDDF0DB2A3211C32206F0BF941AAB0757191A3 -IV=237A8DFBA42708BBF7E540766F2059F1 -PT=73CE15905BFB39F002D9B6B0716F1CF3 -CT=2D1AB5CF3E9C27ADA9FB45F15007A7BB - -I=41 -KEY=123F64F2A28C80C2F6E000F69C8E5A639FB994D30CBC48A650BAEF4125763618 -IV=2D1AB5CF3E9C27ADA9FB45F15007A7BB -PT=DFA876A5827E80E0F14C4432CA43856E -CT=7039C9AF1E10FE99A91483EA578AE6DD - -I=42 -KEY=6CD69C4F5AD7CB5E9E4574F6A48FDB28EF805D7C12ACB63FF9AE6CAB72FCD0C5 -IV=7039C9AF1E10FE99A91483EA578AE6DD -PT=7EE9F8BDF85B4B9C68A574003801814B -CT=116DD8566366A19EEAF2F3E744B3EF9C - -I=43 -KEY=C73969C7D6D057003E2E215D94978792FEED852A71CA17A1135C9F4C364F3F59 -IV=116DD8566366A19EEAF2F3E744B3EF9C -PT=ABEFF5888C079C5EA06B55AB30185CBA -CT=648A801EF27E77D964BB751A32B8CFE8 - -I=44 -KEY=E0960DD6E807F3D0B5DF057D0D1E6DCC9A67053483B4607877E7EA5604F7F0B1 -IV=648A801EF27E77D964BB751A32B8CFE8 -PT=27AF64113ED7A4D08BF124209989EA5E -CT=D18AE728717C535049868FA6F1B4294E - -I=45 -KEY=466AE043435C6CCA67FF1C5D4B4175DA4BEDE21CF2C833283E6165F0F543D9FF -IV=D18AE728717C535049868FA6F1B4294E -PT=A6FCED95AB5B9F1AD2201920465F1816 -CT=169B55360728DA8F582C488F2569411F - -I=46 -KEY=27E1BC4931601D667CD807454D58B2BB5D76B72AF5E0E9A7664D2D7FD02A98E0 -IV=169B55360728DA8F582C488F2569411F -PT=618B5C0A723C71AC1B271B180619C761 -CT=67DADCF7C31CA394F46F18AB1AEA022E - -I=47 -KEY=2D4EB1F3A709F0A4CA5E2CD47F8F10123AAC6BDD36FC4A33922235D4CAC09ACE -IV=67DADCF7C31CA394F46F18AB1AEA022E -PT=0AAF0DBA9669EDC2B6862B9132D7A2A9 -CT=A5D49BDF099335166BBFDCBE29C90B80 - -I=48 -KEY=2A90CE470EB8C9400B056307D53452BE9F78F0023F6F7F25F99DE96AE309914E -IV=A5D49BDF099335166BBFDCBE29C90B80 -PT=07DE7FB4A9B139E4C15B4FD3AABB42AC -CT=5AFC238F19E369E77278593C6E20A946 - -I=49 -KEY=90B696E9A0792BFF7BF21BE373731CB5C584D38D268C16C28BE5B0568D293808 -IV=5AFC238F19E369E77278593C6E20A946 -PT=BA2658AEAEC1E2BF70F778E4A6474E0B -CT=2861A363922099D0F0B2A5AD2A5F421E - -I=50 -KEY=4FE5C563B7DB98C6B9CCA52F313FBAFCEDE570EEB4AC8F127B5715FBA7767A16 -IV=2861A363922099D0F0B2A5AD2A5F421E -PT=DF53538A17A2B339C23EBECC424CA649 -CT=D76E51B6EA5F74D0116C4D16EDD0DFAC - -I=51 -KEY=EBF784D98E40372429819EE23BE85B723A8B21585EF3FBC26A3B58ED4AA6A5BA -IV=D76E51B6EA5F74D0116C4D16EDD0DFAC -PT=A41241BA399BAFE2904D3BCD0AD7E18E -CT=6214F5E50EC99F40B86951CE395C8315 - -I=52 -KEY=C01A5093C6A29CEED72D14D903BD17E8589FD4BD503A6482D252092373FA26AF -IV=6214F5E50EC99F40B86951CE395C8315 -PT=2BEDD44A48E2ABCAFEAC8A3B38554C9A -CT=6CFC2188E40E806BBE277988B924627E - -I=53 -KEY=A8C3A10380B6D4D1CEFABF57F3C695193463F535B434E4E96C7570ABCADE44D1 -IV=6CFC2188E40E806BBE277988B924627E -PT=68D9F1904614483F19D7AB8EF07B82F1 -CT=B98E851902AEC129FD1607DECA9E0669 - -I=54 -KEY=B828711ABA1D06408099944287112DE58DED702CB69A25C091637775004042B8 -IV=B98E851902AEC129FD1607DECA9E0669 -PT=10EBD0193AABD2914E632B1574D7B8FC -CT=DBDA9DB56E6FF915D67D7DEE541DD6A3 - -I=55 -KEY=3B0E9FE343D665ABB3706243EF023C765637ED99D8F5DCD5471E0A9B545D941B -IV=DBDA9DB56E6FF915D67D7DEE541DD6A3 -PT=8326EEF9F9CB63EB33E9F60168131193 -CT=399802CE3FF3878A73C7D85E19FDD54B - -I=56 -KEY=9270D72D972B46C8E630FBD1AA67FBED6FAFEF57E7065B5F34D9D2C54DA04150 -IV=399802CE3FF3878A73C7D85E19FDD54B -PT=A97E48CED4FD2363554099924565C79B -CT=40FABA067414961FD964EC91196943E3 - -I=57 -KEY=017211AC512541BFBDD0292385AA20862F5555519312CD40EDBD3E5454C902B3 -IV=40FABA067414961FD964EC91196943E3 -PT=9302C681C60E07775BE0D2F22FCDDB6B -CT=6BF1125E581341510FD02B9450886B17 - -I=58 -KEY=AC2652A877F924710178641D20B239B944A4470FCB018C11E26D15C0044169A4 -IV=6BF1125E581341510FD02B9450886B17 -PT=AD54430426DC65CEBCA84D3EA518193F -CT=74871D2EF6D1F29181B0A2530885EEC8 - -I=59 -KEY=0BF012A9F0CB194C1F00893D4803E10130235A213DD07E8063DDB7930CC4876C -IV=74871D2EF6D1F29181B0A2530885EEC8 -PT=A7D6400187323D3D1E78ED2068B1D8B8 -CT=2A2DC9F5CB47C94D430ECAAAB1D0811E - -I=60 -KEY=8D22EEEA013E327509E84630166331DB1A0E93D4F697B7CD20D37D39BD140672 -IV=2A2DC9F5CB47C94D430ECAAAB1D0811E -PT=86D2FC43F1F52B3916E8CF0D5E60D0DA -CT=BC318E32957CE6577CD06E2D3166CD1F - -I=61 -KEY=1C4909D11840D978FD7232D0FBC0E6A3A63F1DE663EB519A5C0313148C72CB6D -IV=BC318E32957CE6577CD06E2D3166CD1F -PT=916BE73B197EEB0DF49A74E0EDA3D778 -CT=E9858DBB1B5145ABB598ADE882346DDB - -I=62 -KEY=DD2ED3C6FCE0034F19259D57A35B60CF4FBA905D78BA1431E99BBEFC0E46A6B6 -IV=E9858DBB1B5145ABB598ADE882346DDB -PT=C167DA17E4A0DA37E457AF87589B866C -CT=1E04B15BBF727BEAC33C0C26141636DD - -I=63 -KEY=81C434CDF7EABAA49252EC86DFE15FBA51BE2106C7C86FDB2AA7B2DA1A50906B -IV=1E04B15BBF727BEAC33C0C26141636DD -PT=5CEAE70B0B0AB9EB8B7771D17CBA3F75 -CT=EB21AED731D594017F5729262A1E23B4 - -I=64 -KEY=AEF6BF8323CAE4C2270CC5E51B0A3BFFBA9F8FD1F61DFBDA55F09BFC304EB3DF -IV=EB21AED731D594017F5729262A1E23B4 -PT=2F328B4ED4205E66B55E2963C4EB6445 -CT=EB73CFADA0ACB98B37091CB81489CC7C - -I=65 -KEY=BC3BD548867FA82FF80EF67B38016A1E51EC407C56B1425162F9874424C77FA3 -IV=EB73CFADA0ACB98B37091CB81489CC7C -PT=12CD6ACBA5B54CEDDF02339E230B51E1 -CT=1FEEF226D6759E8813B98A5D43B2F22A - -I=66 -KEY=E1F5760C694DBE5688A0241B5517B4B14E02B25A80C4DCD971400D1967758D89 -IV=1FEEF226D6759E8813B98A5D43B2F22A -PT=5DCEA344EF32167970AED2606D16DEAF -CT=9C591D087F0F45C8AE3DEC9C455FE200 - -I=67 -KEY=ABF2D79C472D0159FA9AE646D0C0FC9CD25BAF52FFCB9911DF7DE185222A6F89 -IV=9C591D087F0F45C8AE3DEC9C455FE200 -PT=4A07A1902E60BF0F723AC25D85D7482D -CT=62C4F4D7E4AC5ABC03BECA3CA56DA4FD - -I=68 -KEY=E58A351A4DD79A2ED6D386E11A8563F2B09F5B851B67C3ADDCC32BB98747CB74 -IV=62C4F4D7E4AC5ABC03BECA3CA56DA4FD -PT=4E78E2860AFA9B772C4960A7CA459F6E -CT=AD8557C0D04675CC312C7A106D5C8B83 - -I=69 -KEY=BCF7BB1010AF5CEB05E06339689067E31D1A0C45CB21B661EDEF51A9EA1B40F7 -IV=AD8557C0D04675CC312C7A106D5C8B83 -PT=597D8E0A5D78C6C5D333E5D872150411 -CT=80159F4F5E0C2DC07D3CD3C52A1A8E6D - -I=70 -KEY=328BB8EB86055D2BB52A02E40BB5D2C39D0F930A952D9BA190D3826CC001CE9A -IV=80159F4F5E0C2DC07D3CD3C52A1A8E6D -PT=8E7C03FB96AA01C0B0CA61DD6325B520 -CT=F58A2EE5A5BDE8CA0A96F4F4B64BE737 - -I=71 -KEY=F192AE51D926A2B68C38EA4E48A0590F6885BDEF3090736B9A457698764A29AD -IV=F58A2EE5A5BDE8CA0A96F4F4B64BE737 -PT=C31916BA5F23FF9D3912E8AA43158BCC -CT=B4C0DD55013AEFE12D94F31B861134CC - -I=72 -KEY=5EE48E38C2C805E2AACC89AD8682E552DC4560BA31AA9C8AB7D18583F05B1D61 -IV=B4C0DD55013AEFE12D94F31B861134CC -PT=AF7620691BEEA75426F463E3CE22BC5D -CT=FD8B06AEF9B3C25D11B950A6648276BB - -I=73 -KEY=F425B9BF4D114251736EE7FCDB430B6721CE6614C8195ED7A668D52594D96BDA -IV=FD8B06AEF9B3C25D11B950A6648276BB -PT=AAC137878FD947B3D9A26E515DC1EE35 -CT=31BE8DF4A8A749FBF11AB07D8479A10B - -I=74 -KEY=61A2D5337BCB827887F884AD98C67BEA1070EBE060BE172C5772655810A0CAD1 -IV=31BE8DF4A8A749FBF11AB07D8479A10B -PT=95876C8C36DAC029F49663514385708D -CT=E9A2EF0C882781788D50033B79FE181F - -I=75 -KEY=E930B2277AC4475FB0A94519F60DE552F9D204ECE8999654DA226663695ED2CE -IV=E9A2EF0C882781788D50033B79FE181F -PT=88926714010FC5273751C1B46ECB9EB8 -CT=17FFCD5A010709A2737570E038D63B27 - -I=76 -KEY=B944CE978DF68F8FBFF0A5EA62AAC299EE2DC9B6E99E9FF6A95716835188E9E9 -IV=17FFCD5A010709A2737570E038D63B27 -PT=50747CB0F732C8D00F59E0F394A727CB -CT=E12B89FA1B1DD3B29F02219FD3D7D3D2 - -I=77 -KEY=0E2D7FCEB557462267BED2CCA8B48CD70F06404CF2834C443655371C825F3A3B -IV=E12B89FA1B1DD3B29F02219FD3D7D3D2 -PT=B769B15938A1C9ADD84E7726CA1E4E4E -CT=75AE99B6022B08E36FB88A6F4D7698BF - -I=78 -KEY=8046D73D60912221694B2AFE703EDB167AA8D9FAF0A844A759EDBD73CF29A284 -IV=75AE99B6022B08E36FB88A6F4D7698BF -PT=8E6BA8F3D5C664030EF5F832D88A57C1 -CT=CF32DCE11FDB098A6435315342796064 - -I=79 -KEY=20716D6975C32231968BF76725144CBAB59A051BEF734D2D3DD88C208D50C2E0 -IV=CF32DCE11FDB098A6435315342796064 -PT=A037BA5415520010FFC0DD99552A97AC -CT=80F12B261317C66F21AC811230848468 - -I=80 -KEY=AD5A2011E425AFFD57E7191336D37D25356B2E3DFC648B421C740D32BDD44688 -IV=80F12B261317C66F21AC811230848468 -PT=8D2B4D7891E68DCCC16CEE7413C7319F -CT=F2C6B70C19A5748C6D2B5DE41544854F - -I=81 -KEY=49D4228508C789105CF457D10FA56048C7AD9931E5C1FFCE715F50D6A890C3C7 -IV=F2C6B70C19A5748C6D2B5DE41544854F -PT=E48E0294ECE226ED0B134EC239761D6D -CT=A31FB3535978DAA555DD617FAB27A97A - -I=82 -KEY=67CE710A3E778CB4A37D1F2274D4462D64B22A62BCB9256B248231A903B76ABD -IV=A31FB3535978DAA555DD617FAB27A97A -PT=2E1A538F36B005A4FF8948F37B712665 -CT=97336ECFAE89015E0B5A7D1C154C71BF - -I=83 -KEY=A87C517EF43CACC6D41EEB661DD1142CF38144AD123024352FD84CB516FB1B02 -IV=97336ECFAE89015E0B5A7D1C154C71BF -PT=CFB22074CA4B20727763F44469055201 -CT=466CD227A6A9D5FC3C0579064530FCE0 - -I=84 -KEY=D73F926A5B5DD8F5B82DE8F77E0E0697B5ED968AB499F1C913DD35B353CBE7E2 -IV=466CD227A6A9D5FC3C0579064530FCE0 -PT=7F43C314AF6174336C33039163DF12BB -CT=4F444B4554E965A113DC0097AA8FAD7A - -I=85 -KEY=7A19BE1C42A13B85B754834E9808DF4BFAA9DDCFE070946800013524F9444A98 -IV=4F444B4554E965A113DC0097AA8FAD7A -PT=AD262C7619FCE3700F796BB9E606D9DC -CT=F7078ABE7617867274CBBEDA1082B987 - -I=86 -KEY=D256675EDBF987B5CA86C21DE177C6A00DAE57719667121A74CA8BFEE9C6F31F -IV=F7078ABE7617867274CBBEDA1082B987 -PT=A84FD9429958BC307DD24153797F19EB -CT=676ACAB66B04597F1A33FF462BD5E0EE - -I=87 -KEY=C025616AB6F89BB1B90AA0E8F63FF1CC6AC49DC7FD634B656EF974B8C21313F1 -IV=676ACAB66B04597F1A33FF462BD5E0EE -PT=127306346D011C04738C62F51748376C -CT=BF66B8DD1E540A4FED759FDB9A44B439 - -I=88 -KEY=2A437D44D93C25B3233FB168D63751A5D5A2251AE337412A838CEB635857A7C8 -IV=BF66B8DD1E540A4FED759FDB9A44B439 -PT=EA661C2E6FC4BE029A3511802008A069 -CT=EC8DBB5B3FE245180856B312D3052A87 - -I=89 -KEY=838278123F0261D1F287C9FF94CA4A55392F9E41DCD504328BDA58718B528D4F -IV=EC8DBB5B3FE245180856B312D3052A87 -PT=A9C10556E63E4462D1B8789742FD1BF0 -CT=02E1E60312BB371912C35E3EBC6EA755 - -I=90 -KEY=64F3A47C8C7CFA9FF2AC88637C598E6A3BCE7842CE6E332B9919064F373C2A1A -IV=02E1E60312BB371912C35E3EBC6EA755 -PT=E771DC6EB37E9B4E002B419CE893C43F -CT=73D7499EBB38716D71CCB737CFFFA3FB - -I=91 -KEY=585ABE6B779F22400FC2AC3B55B39E91481931DC75564246E8D5B178F8C389E1 -IV=73D7499EBB38716D71CCB737CFFFA3FB -PT=3CA91A17FBE3D8DFFD6E245829EA10FB -CT=CEE7721855B7381D369ECC1C9337BB02 - -I=92 -KEY=7BC1E883465CBBB9BA624FF99308259386FE43C420E17A5BDE4B7D646BF432E3 -IV=CEE7721855B7381D369ECC1C9337BB02 -PT=239B56E831C399F9B5A0E3C2C6BBBB02 -CT=B6F48D369383974D163E4F17FDFC59EF - -I=93 -KEY=70032AF50BB5E080D4AA7722CEDC7DA9300ACEF2B362ED16C875327396086B0C -IV=B6F48D369383974D163E4F17FDFC59EF -PT=0BC2C2764DE95B396EC838DB5DD4583A -CT=E8372DA404126C63190626D95583629D - -I=94 -KEY=5C61B59BDA2FF51D4F4F740578466EA9D83DE356B7708175D17314AAC38B0991 -IV=E8372DA404126C63190626D95583629D -PT=2C629F6ED19A159D9BE50327B69A1300 -CT=F717B53E51665D0854C895EA1D1D7E77 - -I=95 -KEY=59A35E82B9C8D8FF25CFC5BAD979A9052F2A5668E616DC7D85BB8140DE9677E6 -IV=F717B53E51665D0854C895EA1D1D7E77 -PT=05C2EB1963E72DE26A80B1BFA13FC7AC -CT=7D3EE90EEF7C16872F98296977AA9557 - -I=96 -KEY=5BC419836F7C4F57957E13E39B2181455214BF66096ACAFAAA23A829A93CE2B1 -IV=7D3EE90EEF7C16872F98296977AA9557 -PT=02674701D6B497A8B0B1D65942582840 -CT=6DCD0C4B5633078FDEA9AE24781CB212 - -I=97 -KEY=E6D2BB67584AA2FAAE1D0DAD8C9C60253FD9B32D5F59CD75748A060DD12050A3 -IV=6DCD0C4B5633078FDEA9AE24781CB212 -PT=BD16A2E43736EDAD3B631E4E17BDE160 -CT=6515251260A73AE868E992B6D49579C5 - -I=98 -KEY=57637851C3C08A2923EBD2FEA27472DC5ACC963F3FFEF79D1C6394BB05B52966 -IV=6515251260A73AE868E992B6D49579C5 -PT=B1B1C3369B8A28D38DF6DF532EE812F9 -CT=1A40C2C15F03867E81F951B545396BB4 - -I=99 -KEY=E08E94110F1E64554848AB1966299B7D408C54FE60FD71E39D9AC50E408C42D2 -IV=1A40C2C15F03867E81F951B545396BB4 -PT=B7EDEC40CCDEEE7C6BA379E7C45DE9A1 -CT=DD331F336D669EFD37106099EA51010D - -I=100 -KEY=17F2544156745EC108BF97DA806752C39DBF4BCD0D9BEF1EAA8AA597AADD43DF -IV=DD331F336D669EFD37106099EA51010D -PT=F77CC050596A3A9440F73CC3E64EC9BE -CT=0EF37EC0B6071874FF68926D98A0EEAB - -I=101 -KEY=C97ABFF115E20A6C72A6206DB63EC0FD934C350DBB9CF76A55E237FA327DAD74 -IV=0EF37EC0B6071874FF68926D98A0EEAB -PT=DE88EBB0439654AD7A19B7B73659923E -CT=DA1DAEB42178A7657A40BD72A06CEDDC - -I=102 -KEY=77AB469FBC999BB2922D460413E2012049519BB99AE4500F2FA28A88921140A8 -IV=DA1DAEB42178A7657A40BD72A06CEDDC -PT=BED1F96EA97B91DEE08B6669A5DCC1DD -CT=E78523134FC8EAA77CC85E0EEC60FCD3 - -I=103 -KEY=4F88FA6F4053B3A15094ED532C2F47DCAED4B8AAD52CBAA8536AD4867E71BC7B -IV=E78523134FC8EAA77CC85E0EEC60FCD3 -PT=3823BCF0FCCA2813C2B9AB573FCD46FC -CT=BC540D1838D7AD8E8B1C44B96684DD31 - -I=104 -KEY=D178E105443700CFEE007AB3BAA71E4C1280B5B2EDFB1726D876903F18F5614A -IV=BC540D1838D7AD8E8B1C44B96684DD31 -PT=9EF01B6A0464B36EBE9497E096885990 -CT=6C6B95A5D8F4E7F1A5864DDBFCDCEED8 - -I=105 -KEY=8F6A589BA0ED1A67FE426368A7E523047EEB2017350FF0D77DF0DDE4E4298F92 -IV=6C6B95A5D8F4E7F1A5864DDBFCDCEED8 -PT=5E12B99EE4DA1AA8104219DB1D423D48 -CT=B58C92AE19B332621E7A4E5512C88596 - -I=106 -KEY=147895B157BF16B87C32AAA17480A886CB67B2B92CBCC2B5638A93B1F6E10A04 -IV=B58C92AE19B332621E7A4E5512C88596 -PT=9B12CD2AF7520CDF8270C9C9D3658B82 -CT=4D1D90F007BB5099C382E69C9CD1F7E5 - -I=107 -KEY=4C8441FCEBBD595999864A6CC37F7EDB867A22492B07922CA008752D6A30FDE1 -IV=4D1D90F007BB5099C382E69C9CD1F7E5 -PT=58FCD44DBC024FE1E5B4E0CDB7FFD65D -CT=7F59920056EC32FA48F8A9CCCFFE437A - -I=108 -KEY=CD922EEA60F0F136A799C650F5D4B030F923B0497DEBA0D6E8F0DCE1A5CEBE9B -IV=7F59920056EC32FA48F8A9CCCFFE437A -PT=81166F168B4DA86F3E1F8C3C36ABCEEB -CT=A546F57E48A783694577D59F7FD01D9E - -I=109 -KEY=90DE3ECB26E68BDD3C4B7AB9B9CDE6195C654537354C23BFAD87097EDA1EA305 -IV=A546F57E48A783694577D59F7FD01D9E -PT=5D4C102146167AEB9BD2BCE94C195629 -CT=6342B8CB1E493F916585FF1BBFC42AB3 - -I=110 -KEY=ADF1869FEA15122394E1F6FF6B51E5DE3F27FDFC2B051C2EC802F66565DA89B6 -IV=6342B8CB1E493F916585FF1BBFC42AB3 -PT=3D2FB854CCF399FEA8AA8C46D29C03C7 -CT=052AEDF54016429320B04243E308ECFE - -I=111 -KEY=DF52D7982845CBAEB4E56592906B63943A0D10096B135EBDE8B2B42686D26548 -IV=052AEDF54016429320B04243E308ECFE -PT=72A35107C250D98D2004936DFB3A864A -CT=EE147A64DC2E31222A3A14B133769ACE - -I=112 -KEY=5D6B5899612FF15825029DEB0B37CB4ED4196A6DB73D6F9FC288A097B5A4FF86 -IV=EE147A64DC2E31222A3A14B133769ACE -PT=82398F01496A3AF691E7F8799B5CA8DA -CT=8330EF868E72D33172D7DEC7B440056C - -I=113 -KEY=FC23917C478894C9490A6585CCB8A716572985EB394FBCAEB05F7E5001E4FAEA -IV=8330EF868E72D33172D7DEC7B440056C -PT=A148C9E526A765916C08F86EC78F6C58 -CT=DC83E3727C4E9754A82BFCFFD924ACB3 - -I=114 -KEY=BCD556FA7AFA27F9675F45922924DFA68BAA669945012BFA187482AFD8C05659 -IV=DC83E3727C4E9754A82BFCFFD924ACB3 -PT=40F6C7863D72B3302E552017E59C78B0 -CT=C0B97D9320DC3E893953E1D93859D3E4 - -I=115 -KEY=A0F23A11C85F008CFEC20F76BD6751054B131B0A65DD157321276376E09985BD -IV=C0B97D9320DC3E893953E1D93859D3E4 -PT=1C276CEBB2A52775999D4AE494438EA3 -CT=8C28875C39211D01A084A59BA71D0C31 - -I=116 -KEY=2BB58C8FE9FE5BAEC5DB3F6A7EB98187C73B9C565CFC087281A3C6ED4784898C -IV=8C28875C39211D01A084A59BA71D0C31 -PT=8B47B69E21A15B223B19301CC3DED082 -CT=7865E390E8019259A117669082ED5CCC - -I=117 -KEY=6035A1AC1F0C1871EA06773DEA40B5C5BF5E7FC6B4FD9A2B20B4A07DC569D540 -IV=7865E390E8019259A117669082ED5CCC -PT=4B802D23F6F243DF2FDD485794F93442 -CT=DC7BA7C54217B8DEE966C0672DBE79CD - -I=118 -KEY=CCA70BB373BA65736D25078BB99980F66325D803F6EA22F5C9D2601AE8D7AC8D -IV=DC7BA7C54217B8DEE966C0672DBE79CD -PT=AC92AA1F6CB67D02872370B653D93533 -CT=CBB60FB6BE7240A2037CDA46DAAAC4E4 - -I=119 -KEY=E6D9E4347ABCE875CDFB026A9B1CE767A893D7B548986257CAAEBA5C327D6869 -IV=CBB60FB6BE7240A2037CDA46DAAAC4E4 -PT=2A7EEF8709068D06A0DE05E122856791 -CT=3B0863884DCFFDAAE439E3BCFC2E0491 - -I=120 -KEY=90C0678C9B9796FACBD3A9E8E40A46E6939BB43D05579FFD2E9759E0CE536CF8 -IV=3B0863884DCFFDAAE439E3BCFC2E0491 -PT=761983B8E12B7E8F0628AB827F16A181 -CT=1407CDBD04CA6450D15A276B0E45D500 - -I=121 -KEY=A3505D86BF4B95AEC0F720B4CBDF4985879C7980019DFBADFFCD7E8BC016B9F8 -IV=1407CDBD04CA6450D15A276B0E45D500 -PT=33903A0A24DC03540B24895C2FD50F63 -CT=94B64DF8376EAF94F24EB0457DF81418 - -I=122 -KEY=EAD741BA44D8637A4D49A089E4A122F2132A347836F354390D83CECEBDEEADE0 -IV=94B64DF8376EAF94F24EB0457DF81418 -PT=49871C3CFB93F6D48DBE803D2F7E6B77 -CT=6E2DE304D4A21A218291FD9B59FED9BF - -I=123 -KEY=278551B22B73239BF36E61370FFF43EA7D07D77CE2514E188F123355E410745F -IV=6E2DE304D4A21A218291FD9B59FED9BF -PT=CD5210086FAB40E1BE27C1BEEB5E6118 -CT=72A1E7B22D6B8B8C38C4CCD545466879 - -I=124 -KEY=C7046CA82928EA5AE1E6998399A090BB0FA630CECF3AC594B7D6FF80A1561C26 -IV=72A1E7B22D6B8B8C38C4CCD545466879 -PT=E0813D1A025BC9C11288F8B4965FD351 -CT=F5F1B011C644D119625733433C3DBB40 - -I=125 -KEY=82AF7079A309A3B1367E4DC8EE90B8C5FA5780DF097E148DD581CCC39D6BA766 -IV=F5F1B011C644D119625733433C3DBB40 -PT=45AB1CD18A2149EBD798D44B7730287E -CT=FDD90319FC2878AE4E23CE63C6660D1A - -I=126 -KEY=EB439411E1412BA8D6DB9F3052753D3F078E83C6F5566C239BA202A05B0DAA7C -IV=FDD90319FC2878AE4E23CE63C6660D1A -PT=69ECE46842488819E0A5D2F8BCE585FA -CT=0B3948AEFD674622289CB41E3F668A5C - -I=127 -KEY=C2FDF3EB8C01693C7FB990CE6D7F56E10CB7CB6808312A01B33EB6BE646B2020 -IV=0B3948AEFD674622289CB41E3F668A5C -PT=29BE67FA6D404294A9620FFE3F0A6BDE -CT=9F5BF60EB5CCF9D9F3A20DA569209636 - -I=128 -KEY=ECF0B5C32A3163495086894AB263166D93EC3D66BDFDD3D8409CBB1B0D4BB616 -IV=9F5BF60EB5CCF9D9F3A20DA569209636 -PT=2E0D4628A6300A752F3F1984DF1C408C -CT=3FED40A5796B3D1FF8805E5EF8922511 - -I=129 -KEY=259CAA194EE9BE90B2B1E7654CBDCD03AC017DC3C496EEC7B81CE545F5D99307 -IV=3FED40A5796B3D1FF8805E5EF8922511 -PT=C96C1FDA64D8DDD9E2376E2FFEDEDB6E -CT=2973A39E09EF5F4F42B29E6730ECC127 - -I=130 -KEY=FAAB18CE5FA7895BAA9EC69A55F690208572DE5DCD79B188FAAE7B22C5355220 -IV=2973A39E09EF5F4F42B29E6730ECC127 -PT=DF37B2D7114E37CB182F21FF194B5D23 -CT=F8C4C1A86B0665E2124CFFA9128FFEFD - -I=131 -KEY=3806BAB3764E794DF526A17BCE0112877DB61FF5A67FD46AE8E2848BD7BAACDD -IV=F8C4C1A86B0665E2124CFFA9128FFEFD -PT=C2ADA27D29E9F0165FB867E19BF782A7 -CT=90996F6629A41FC86A9520DD33AE5B3F - -I=132 -KEY=B7F781357E024140C3797D01C286E72BED2F70938FDBCBA28277A456E414F7E2 -IV=90996F6629A41FC86A9520DD33AE5B3F -PT=8FF13B86084C380D365FDC7A0C87F5AC -CT=9DAFB2F259BFD18945A0A6EFF9A81A75 - -I=133 -KEY=B67D37A8E281AFD015C38A72F5662BEE7080C261D6641A2BC7D702B91DBCED97 -IV=9DAFB2F259BFD18945A0A6EFF9A81A75 -PT=018AB69D9C83EE90D6BAF77337E0CCC5 -CT=C89F523289AE2A7C8F796C2252CB0597 - -I=134 -KEY=A47B97F34FB4A8F219ED7A59EFE40080B81F90535FCA305748AE6E9B4F77E800 -IV=C89F523289AE2A7C8F796C2252CB0597 -PT=1206A05BAD3507220C2EF02B1A822B6E -CT=3AACC4E5DE152BB1730C6D10C9A81A0A - -I=135 -KEY=E8EBBFDA61B6BC6735953F8E448B5E0282B354B681DF1BE63BA2038B86DFF20A -IV=3AACC4E5DE152BB1730C6D10C9A81A0A -PT=4C9028292E0214952C7845D7AB6F5E82 -CT=1E315BFFFDC3DA42438E683263B496DD - -I=136 -KEY=EE950FF3D603DECEE18F4ACF99A623589C820F497C1CC1A4782C6BB9E56B64D7 -IV=1E315BFFFDC3DA42438E683263B496DD -PT=067EB029B7B562A9D41A7541DD2D7D5A -CT=9B021A44CD9FF920DFE1EC97B3EE8AE4 - -I=137 -KEY=E073E1149A4A605E041167F3739F17240780150DB1833884A7CD872E5685EE33 -IV=9B021A44CD9FF920DFE1EC97B3EE8AE4 -PT=0EE6EEE74C49BE90E59E2D3CEA39347C -CT=4F62EE03D7A8337ECB3DCC0EA5444C2D - -I=138 -KEY=BF449E4B7DFA404D3F18C0266725F67248E2FB0E662B0BFA6CF04B20F3C1A21E -IV=4F62EE03D7A8337ECB3DCC0EA5444C2D -PT=5F377F5FE7B020133B09A7D514BAE156 -CT=AC8767B1E15D6D1ECACCCBF2D0FAB043 - -I=139 -KEY=3AB2898399D0F8467B37A5C916D9117AE4659CBF877666E4A63C80D2233B125D -IV=AC8767B1E15D6D1ECACCCBF2D0FAB043 -PT=85F617C8E42AB80B442F65EF71FCE708 -CT=9CA6E27F1966AE133CB7B98C2B13C1DA - -I=140 -KEY=06A09B6D5A6BCA82B26D0625F2A89FA178C37EC09E10C8F79A8B395E0828D387 -IV=9CA6E27F1966AE133CB7B98C2B13C1DA -PT=3C1212EEC3BB32C4C95AA3ECE4718EDB -CT=B7A6788E6D9886047D1450B093F5B6FE - -I=141 -KEY=79A26263675E11BE581DDEA79A20CAACCF65064EF3884EF3E79F69EE9BDD6579 -IV=B7A6788E6D9886047D1450B093F5B6FE -PT=7F02F90E3D35DB3CEA70D8826888550D -CT=5C1785DC27BC301DEAFAEF325A4CCBFD - -I=142 -KEY=21DEF781026D9ACB4108C6F9847C635F93728392D4347EEE0D6586DCC191AE84 -IV=5C1785DC27BC301DEAFAEF325A4CCBFD -PT=587C95E265338B751915185E1E5CA9F3 -CT=9577E8F6DF5921C4B518974A2F1FCF07 - -I=143 -KEY=EB000BAA170733EA4D077BDD7DA1623506056B640B6D5F2AB87D1196EE8E6183 -IV=9577E8F6DF5921C4B518974A2F1FCF07 -PT=CADEFC2B156AA9210C0FBD24F9DD016A -CT=09F8E3DA7C5E39F2F13C2B72001D1D56 - -I=144 -KEY=D56A1025AB5F7B5F943B3AECAF87A2800FFD88BE773366D849413AE4EE937CD5 -IV=09F8E3DA7C5E39F2F13C2B72001D1D56 -PT=3E6A1B8FBC5848B5D93C4131D226C0B5 -CT=7344F33968E177F3864908F02915739A - -I=145 -KEY=876077EA9BDB2134098B73CAD4411D997CB97B871FD2112BCF083214C7860F4F -IV=7344F33968E177F3864908F02915739A -PT=520A67CF30845A6B9DB049267BC6BF19 -CT=EC286360EF2A54CE894ED06ACF39970C - -I=146 -KEY=AA9943761AD545F47EBCF5CD4584C3B3909118E7F0F845E54646E27E08BF9843 -IV=EC286360EF2A54CE894ED06ACF39970C -PT=2DF9349C810E64C07737860791C5DE2A -CT=89F4BE70D36A05C84FD2124F6A69786B - -I=147 -KEY=5C285D3FD07EF5F6664B1F4C4CA771E31965A6972392402D0994F03162D6E028 -IV=89F4BE70D36A05C84FD2124F6A69786B -PT=F6B11E49CAABB00218F7EA810923B250 -CT=9A65E99C06E0744056365C4A26CD001F - -I=148 -KEY=F28851656D77922A55655DBE4610993683004F0B2572346D5FA2AC7B441BE037 -IV=9A65E99C06E0744056365C4A26CD001F -PT=AEA00C5ABD0967DC332E42F20AB7E8D5 -CT=566ECB7B317C81CF87BC483B4B6CF417 - -I=149 -KEY=62428DD3F6B04C564CA6D9DA9A9A64B3D56E8470140EB5A2D81EE4400F771420 -IV=566ECB7B317C81CF87BC483B4B6CF417 -PT=90CADCB69BC7DE7C19C38464DC8AFD85 -CT=16E3F727D2D4CC2E88C2A4B0DFEF34AF - -I=150 -KEY=78A68A0EC33E2C0198538C1EA591AF46C38D7357C6DA798C50DC40F0D098208F -IV=16E3F727D2D4CC2E88C2A4B0DFEF34AF -PT=1AE407DD358E6057D4F555C43F0BCBF5 -CT=6F6606018F5491FC43864FC29B572551 - -I=151 -KEY=4EFBCF71F7A0DA7564DAF1F0488AA933ACEB7556498EE870135A0F324BCF05DE -IV=6F6606018F5491FC43864FC29B572551 -PT=365D457F349EF674FC897DEEED1B0675 -CT=BC07194E716B4D78F64E14B6E5762439 - -I=152 -KEY=A4BBF15395604071DF929A4922A129DD10EC6C1838E5A508E5141B84AEB921E7 -IV=BC07194E716B4D78F64E14B6E5762439 -PT=EA403E2262C09A04BB486BB96A2B80EE -CT=BF1994171481FB4F84AB092F437EA9C7 - -I=153 -KEY=665F10926596E8F5691ACE10AA5075AEAFF5F80F2C645E4761BF12ABEDC78820 -IV=BF1994171481FB4F84AB092F437EA9C7 -PT=C2E4E1C1F0F6A884B688545988F15C73 -CT=254FE05D25B67D3BF6C2688F46A7FAD8 - -I=154 -KEY=15F4BA29EBAAF160AC95507FDA03D7D58ABA185209D2237C977D7A24AB6072F8 -IV=254FE05D25B67D3BF6C2688F46A7FAD8 -PT=73ABAABB8E3C1995C58F9E6F7053A27B -CT=A03B8DB2C1C9B6C574A8499C6E5869CF - -I=155 -KEY=96A760AB52E1D6A5ACFCA016E98D0BA12A8195E0C81B95B9E3D533B8C5381B37 -IV=A03B8DB2C1C9B6C574A8499C6E5869CF -PT=8353DA82B94B27C50069F069338EDC74 -CT=088F141F097F659145DE8E1EDB2300B5 - -I=156 -KEY=7C06F9EE0327C811CEE3CC3B2B492620220E81FFC164F028A60BBDA61E1B1B82 -IV=088F141F097F659145DE8E1EDB2300B5 -PT=EAA1994551C61EB4621F6C2DC2C42D81 -CT=43703327BFDAF109F6F9C5969D3C7649 - -I=157 -KEY=0F8AC1E3014DD99D1A440A693CB73B51617EB2D87EBE012150F2783083276DCB -IV=43703327BFDAF109F6F9C5969D3C7649 -PT=738C380D026A118CD4A7C65217FE1D71 -CT=BDAC873D0A674CDA98105DC3070F7BE4 - -I=158 -KEY=E595998ABEF32CABDD4A441B4042BF8BDCD235E574D94DFBC8E225F38428162F -IV=BDAC873D0A674CDA98105DC3070F7BE4 -PT=EA1F5869BFBEF536C70E4E727CF584DA -CT=A1A89122CF532FBC69E74A70F1E7346F - -I=159 -KEY=FBA3999F7BF540184E9BE7715CA8C0497D7AA4C7BB8A6247A1056F8375CF2240 -IV=A1A89122CF532FBC69E74A70F1E7346F -PT=1E360015C5066CB393D1A36A1CEA7FC2 -CT=68C2A6FF8EABE7EA05E5DD6093C00129 - -I=160 -KEY=65AF7CB5F5CEF75FEF0BF5F746D7DD7D15B80238352185ADA4E0B2E3E60F2369 -IV=68C2A6FF8EABE7EA05E5DD6093C00129 -PT=9E0CE52A8E3BB747A19012861A7F1D34 -CT=1EA92E63C6926082B04F69E658CFA478 - -I=161 -KEY=7D3BA807729873EB2021AC1817B2C7D30B112C5BF3B3E52F14AFDB05BEC08711 -IV=1EA92E63C6926082B04F69E658CFA478 -PT=1894D4B2875684B4CF2A59EF51651AAE -CT=45A943F0B6430ABA20C562469AE98A6D - -I=162 -KEY=5ECAEF5BF4EC899C7BFAEE2F50B864924EB86FAB45F0EF95346AB94324290D7C -IV=45A943F0B6430ABA20C562469AE98A6D -PT=23F1475C8674FA775BDB4237470AA341 -CT=6CDF579A8429606CC9BC56D010845954 - -I=163 -KEY=8D394BD1C8C1D1F8A67A3BA16530662A22673831C1D98FF9FDD6EF9334AD5428 -IV=6CDF579A8429606CC9BC56D010845954 -PT=D3F3A48A3C2D5864DD80D58E358802B8 -CT=96E9E19694DB9931AC09A7B6296FEAA8 - -I=164 -KEY=9ABEC4725C717368463710CB2D45774DB48ED9A7550216C851DF48251DC2BE80 -IV=96E9E19694DB9931AC09A7B6296FEAA8 -PT=17878FA394B0A290E04D2B6A48751167 -CT=176C9B9B32A539F35BDFB21B38C42134 - -I=165 -KEY=3CA1E23510949D81242F16DE0E9B2B3AA3E2423C67A72F3B0A00FA3E25069FB4 -IV=176C9B9B32A539F35BDFB21B38C42134 -PT=A61F26474CE5EEE96218061523DE5C77 -CT=06004480169FB7B6D4DBA7453A85E54D - -I=166 -KEY=2A72AA0C7EAA3113480EF57A83C272D7A5E206BC7138988DDEDB5D7B1F837AF9 -IV=06004480169FB7B6D4DBA7453A85E54D -PT=16D348396E3EAC926C21E3A48D5959ED -CT=FF2F4F6E32133CE8C70252937FE5BDA6 - -I=167 -KEY=90C0C8FC5B65BE92E643956293A70AF35ACD49D2432BA46519D90FE86066C75F -IV=FF2F4F6E32133CE8C70252937FE5BDA6 -PT=BAB262F025CF8F81AE4D601810657824 -CT=0972CCC79C412DB6FBC5918B8E6EAB7C - -I=168 -KEY=E0AF49BAC4BD146E83C884327FFB682353BF8515DF6A89D3E21C9E63EE086C23 -IV=0972CCC79C412DB6FBC5918B8E6EAB7C -PT=706F81469FD8AAFC658B1150EC5C62D0 -CT=2D8C668310308FCF7B3E325F50AA89E5 - -I=169 -KEY=E5C29451893B7B94249E89469E58DEAD7E33E396CF5A061C9922AC3CBEA2E5C6 -IV=2D8C668310308FCF7B3E325F50AA89E5 -PT=056DDDEB4D866FFAA7560D74E1A3B68E -CT=8342DD95F1040E763C82E36F8F74822F - -I=170 -KEY=4A9AD7CAFA46AE63362069120B502D33FD713E033E5E086AA5A04F5331D667E9 -IV=8342DD95F1040E763C82E36F8F74822F -PT=AF58439B737DD5F712BEE0549508F39E -CT=8CA83627884D9B7A62F096BD37C14EFF - -I=171 -KEY=21AEFC00E7CC2942F319630702ECCC6B71D90824B6139310C750D9EE06172916 -IV=8CA83627884D9B7A62F096BD37C14EFF -PT=6B342BCA1D8A8721C5390A1509BCE158 -CT=13073AB95C0C0587372564189A4C176F - -I=172 -KEY=7E615F002723795F6E37182ECC0C429E62DE329DEA1F9697F075BDF69C5B3E79 -IV=13073AB95C0C0587372564189A4C176F -PT=5FCFA300C0EF501D9D2E7B29CEE08EF5 -CT=247A01C6A7072F64CB463E6580DA222E - -I=173 -KEY=C2A25232803E901B35080B5CA64DEC2646A4335B4D18B9F33B3383931C811C57 -IV=247A01C6A7072F64CB463E6580DA222E -PT=BCC30D32A71DE9445B3F13726A41AEB8 -CT=562355D078402DA76B0CCAAC2BE63DAE - -I=174 -KEY=46C06B83AD1C5CD849C53A11C05137141087668B35589454503F493F376721F9 -IV=562355D078402DA76B0CCAAC2BE63DAE -PT=846239B12D22CCC37CCD314D661CDB32 -CT=841B1644CCE1BF9DB0D537733047DB7F - -I=175 -KEY=CB3AD5FB9E07D380841D712E7A71FC15949C70CFF9B92BC9E0EA7E4C0720FA86 -IV=841B1644CCE1BF9DB0D537733047DB7F -PT=8DFABE78331B8F58CDD84B3FBA20CB01 -CT=DE34C065627DB86A2D0AE89FB31BDA86 - -I=176 -KEY=240CFC15D60F6AE4A53D2C25BD71DD6E4AA8B0AA9BC493A3CDE096D3B43B2000 -IV=DE34C065627DB86A2D0AE89FB31BDA86 -PT=EF3629EE4808B96421205D0BC700217B -CT=38DD744B95756614261178685FBF097F - -I=177 -KEY=FAA7CBA4AAAD9576591C12233960F1C87275C4E10EB1F5B7EBF1EEBBEB84297F -IV=38DD744B95756614261178685FBF097F -PT=DEAB37B17CA2FF92FC213E0684112CA6 -CT=DC1CF4E4633355111AD09BE1C6BC1E39 - -I=178 -KEY=29E0D33A81FFDCE220D1587C36C5EB09AE6930056D82A0A6F121755A2D383746 -IV=DC1CF4E4633355111AD09BE1C6BC1E39 -PT=D347189E2B52499479CD4A5F0FA51AC1 -CT=2A5DC4E8C16753D202B638E5003AF83D - -I=179 -KEY=956C5751C5B439990A006DB1B52336E78434F4EDACE5F374F3974DBF2D02CF7B -IV=2A5DC4E8C16753D202B638E5003AF83D -PT=BC8C846B444BE57B2AD135CD83E6DDEE -CT=70F5676DC7646EA8F8A913AE6AD21949 - -I=180 -KEY=8AD9D44BC9018FD05B103360575592FEF4C193806B819DDC0B3E5E1147D0D632 -IV=70F5676DC7646EA8F8A913AE6AD21949 -PT=1FB5831A0CB5B64951105ED1E276A419 -CT=C44DA6A603A1E9C02F18123D5CAD5291 - -I=181 -KEY=DA77F2DA5CD7148B15FE8CA898C9A25E308C35266820741C24264C2C1B7D84A3 -IV=C44DA6A603A1E9C02F18123D5CAD5291 -PT=50AE269195D69B5B4EEEBFC8CF9C30A0 -CT=53C2D89EC4D5867DC79168D21C9B8755 - -I=182 -KEY=4A4FD6AED6825A2A0C2114460F029EDA634EEDB8ACF5F261E3B724FE07E603F6 -IV=53C2D89EC4D5867DC79168D21C9B8755 -PT=903824748A554EA119DF98EE97CB3C84 -CT=79B9DABE5171A614CAFDEA11637A1800 - -I=183 -KEY=29102930967275801BD019D6766FDA1A1AF73706FD845475294ACEEF649C1BF6 -IV=79B9DABE5171A614CAFDEA11637A1800 -PT=635FFF9E40F02FAA17F10D90796D44C0 -CT=8AB92FA5EA50F1185112FE4D8D2FCC21 - -I=184 -KEY=F4ABA34B232C18EAD6D367320651C374904E18A317D4A56D785830A2E9B3D7D7 -IV=8AB92FA5EA50F1185112FE4D8D2FCC21 -PT=DDBB8A7BB55E6D6ACD037EE4703E196E -CT=FB97C84040732D7B308C5959059D90A9 - -I=185 -KEY=FB140F98A79F5D5D68B80301CB7B640E6BD9D0E357A7881648D469FBEC2E477E -IV=FB97C84040732D7B308C5959059D90A9 -PT=0FBFACD384B345B7BE6B6433CD2AA77A -CT=D0D0119D500519BF5B4770C494B41680 - -I=186 -KEY=BC98221C0792D22B6EB258E57DB0D8B0BB09C17E07A291A91393193F789A51FE -IV=D0D0119D500519BF5B4770C494B41680 -PT=478C2D84A00D8F76060A5BE4B6CBBCBE -CT=94842399FC93828D30979DAD9210B827 - -I=187 -KEY=C92F345AC3CB803EA91C123F97E7005A2F8DE2E7FB31132423048492EA8AE9D9 -IV=94842399FC93828D30979DAD9210B827 -PT=75B71646C4595215C7AE4ADAEA57D8EA -CT=5BDB886E7A7DBBA8679704F13F44B981 - -I=188 -KEY=3EACAF51FEA9A9886D0B9D1B6BA8436574566A89814CA88C44938063D5CE5058 -IV=5BDB886E7A7DBBA8679704F13F44B981 -PT=F7839B0B3D6229B6C4178F24FC4F433F -CT=A2DA893257EE0F732A80FC52887A0788 - -I=189 -KEY=72E26FEDC250C5FED59FE29C966B61FAD68CE3BBD6A2A7FF6E137C315DB457D0 -IV=A2DA893257EE0F732A80FC52887A0788 -PT=4C4EC0BC3CF96C76B8947F87FDC3229F -CT=2F7877481B1162B01616C9F3268B4C44 - -I=190 -KEY=901C1268AD3582E6A9FA4C5CBB99D07EF9F494F3CDB3C54F7805B5C27B3F1B94 -IV=2F7877481B1162B01616C9F3268B4C44 -PT=E2FE7D856F6547187C65AEC02DF2B184 -CT=9FFA4AF8D0F096CC40A9F879076211E0 - -I=191 -KEY=EAF814EC49F2254E4933FAF977D7BEEC660EDE0B1D43538338AC4DBB7C5D0A74 -IV=9FFA4AF8D0F096CC40A9F879076211E0 -PT=7AE40684E4C7A7A8E0C9B6A5CC4E6E92 -CT=886097F5BC20C157A605CBEFCA5663D7 - -I=192 -KEY=8ED70BBA192093A0C9AD62E86C27091FEE6E49FEA16392D49EA98654B60B69A3 -IV=886097F5BC20C157A605CBEFCA5663D7 -PT=642F1F5650D2B6EE809E98111BF0B7F3 -CT=00DBBB84F52B3C9B28325161072753B6 - -I=193 -KEY=18280464C9E683CFFF9B75A5FD74EE96EEB5F27A5448AE4FB69BD735B12C3A15 -IV=00DBBB84F52B3C9B28325161072753B6 -PT=96FF0FDED0C6106F3636174D9153E789 -CT=714A27832B326F0A8FA745012DE4D936 - -I=194 -KEY=F464EE1298B09059016082CCC5ABC0129FFFD5F97F7AC145393C92349CC8E323 -IV=714A27832B326F0A8FA745012DE4D936 -PT=EC4CEA7651561396FEFBF76938DF2E84 -CT=5DE8A5CDBA7A6111A646AA17CA5324D4 - -I=195 -KEY=EE7301D63C482593ABB33CF4A57F1101C2177034C500A0549F7A3823569BC7F7 -IV=5DE8A5CDBA7A6111A646AA17CA5324D4 -PT=1A17EFC4A4F8B5CAAAD3BE3860D4D113 -CT=EA197ECF36E63616EBB0D9D7C1BD9A22 - -I=196 -KEY=10528506D50D143EAC40D83731DD55F0280E0EFBF3E6964274CAE1F497265DD5 -IV=EA197ECF36E63616EBB0D9D7C1BD9A22 -PT=FE2184D0E94531AD07F3E4C394A244F1 -CT=798349D56EC37993B0E131F8E3F64860 - -I=197 -KEY=438E1B672254504B972927644802ED36518D472E9D25EFD1C42BD00C74D015B5 -IV=798349D56EC37993B0E131F8E3F64860 -PT=53DC9E61F75944753B69FF5379DFB8C6 -CT=545E4CD72E74F5A91B29DDBA60BCEB5A - -I=198 -KEY=7E32F16A4E2E125A95FF9963C6F9796105D30BF9B3511A78DF020DB6146CFEEF -IV=545E4CD72E74F5A91B29DDBA60BCEB5A -PT=3DBCEA0D6C7A421102D6BE078EFB9457 -CT=084142F2C892DCF8A37A509DF0D669BC - -I=199 -KEY=B1BEC1C124A0941D0BA6C75239C17E250D92490B7BC3C6807C785D2BE4BA9753 -IV=084142F2C892DCF8A37A509DF0D669BC -PT=CF8C30AB6A8E86479E595E31FF380744 -CT=0A96C326C9D642F1F84C8772BCF8EB4A - -I=200 -KEY=80D7A5A2AE29B42143046D45B6B6B36C07048A2DB21584718434DA5958427C19 -IV=0A96C326C9D642F1F84C8772BCF8EB4A -PT=316964638A89203C48A2AA178F77CD49 -CT=273916ED09A517CE5C6A294D82E78980 - -I=201 -KEY=4D1C892DF27868BBB0FE803145C1D731203D9CC0BBB093BFD85EF314DAA5F599 -IV=273916ED09A517CE5C6A294D82E78980 -PT=CDCB2C8F5C51DC9AF3FAED74F377645D -CT=7183A7C83964ECFB2A1E44FFCFEBB7C1 - -I=202 -KEY=8C9B28041ECD5149A51207ACE38F0D0351BE3B0882D47F44F240B7EB154E4258 -IV=7183A7C83964ECFB2A1E44FFCFEBB7C1 -PT=C187A129ECB539F215EC879DA64EDA32 -CT=6015DF395D795DECA0A2F833E3614000 - -I=203 -KEY=FF175C7C745BB06E51EEDAA4F2C61E0F31ABE431DFAD22A852E24FD8F62F0258 -IV=6015DF395D795DECA0A2F833E3614000 -PT=738C74786A96E127F4FCDD081149130C -CT=B6B466B56B0E994E672072C273BA067D - -I=204 -KEY=0C84C64E1BB3B86E9AF5A8405D950B3A871F8284B4A3BBE635C23D1A85950425 -IV=B6B466B56B0E994E672072C273BA067D -PT=F3939A326FE80800CB1B72E4AF531535 -CT=C8566E37DF2E2958DDD5D2DB49889BA8 - -I=205 -KEY=5FF4C2A08B85338172D2779BF789DA234F49ECB36B8D92BEE817EFC1CC1D9F8D -IV=C8566E37DF2E2958DDD5D2DB49889BA8 -PT=537004EE90368BEFE827DFDBAA1CD119 -CT=C4A8D14DB86637E94AF515764BC7DF44 - -I=206 -KEY=BD81DE1813AEC9BAFDDC90E4A563CB338BE13DFED3EBA557A2E2FAB787DA40C9 -IV=C4A8D14DB86637E94AF515764BC7DF44 -PT=E2751CB8982BFA3B8F0EE77F52EA1110 -CT=5707495E4CBA3727FBA5D7F4F61AF35C - -I=207 -KEY=AE1B09CB7D99BAC0A71B3E83815F10A2DCE674A09F51927059472D4371C0B395 -IV=5707495E4CBA3727FBA5D7F4F61AF35C -PT=139AD7D36E37737A5AC7AE67243CDB91 -CT=C770CD182DFF66E4D6A7BFEFE2820AE1 - -I=208 -KEY=4F7491F03447293C42DE8393E7AD91741B96B9B8B2AEF4948FE092AC9342B974 -IV=C770CD182DFF66E4D6A7BFEFE2820AE1 -PT=E16F983B49DE93FCE5C5BD1066F281D6 -CT=E2044134ACD21D5AD026671BDC0CB2E4 - -I=209 -KEY=A747EF80608CED4309800CA0B1C73081F992F88C1E7CE9CE5FC6F5B74F4E0B90 -IV=E2044134ACD21D5AD026671BDC0CB2E4 -PT=E8337E7054CBC47F4B5E8F33566AA1F5 -CT=303CF7780126AD06B5272A8350639C93 - -I=210 -KEY=E5EBF5E471F2CA9F38492F604438B9C0C9AE0FF41F5A44C8EAE1DF341F2D9703 -IV=303CF7780126AD06B5272A8350639C93 -PT=42AC1A64117E27DC31C923C0F5FF8941 -CT=DACCD42953603A1321CAD9C236454598 - -I=211 -KEY=B5E5C9211A5C43F2267B4A2411FC2CC21362DBDD4C3A7EDBCB2B06F62968D29B -IV=DACCD42953603A1321CAD9C236454598 -PT=500E3CC56BAE896D1E32654455C49502 -CT=F9AB4D1D8255E83B330031EBE2ECE5C6 - -I=212 -KEY=8D78453D63A2DD8D08BF5F250F2581CFEAC996C0CE6F96E0F82B371DCB84375D -IV=F9AB4D1D8255E83B330031EBE2ECE5C6 -PT=389D8C1C79FE9E7F2EC415011ED9AD0D -CT=0F28E2D4CC948D36E18F80184A594841 - -I=213 -KEY=2E921775036404FD9939EE83C9585481E5E1741402FB1BD619A4B70581DD7F1C -IV=0F28E2D4CC948D36E18F80184A594841 -PT=A3EA524860C6D9709186B1A6C67DD54E -CT=A4756EAB45BCF716A52038C729E420C6 - -I=214 -KEY=9F86FEF42701B1D779BD46BE515680FC41941ABF4747ECC0BC848FC2A8395FDA -IV=A4756EAB45BCF716A52038C729E420C6 -PT=B114E9812465B52AE084A83D980ED47D -CT=9834425E009006673E777E3552E83D20 - -I=215 -KEY=2212046FFD03BA552089FBF7B2F3EF32D9A058E147D7EAA782F3F1F7FAD162FA -IV=9834425E009006673E777E3552E83D20 -PT=BD94FA9BDA020B825934BD49E3A56FCE -CT=AEA572D530A3694EAFF6DFDE30B80D5A - -I=216 -KEY=F73BB21F916D8011751AFDDDCD130A6477052A34777483E92D052E29CA696FA0 -IV=AEA572D530A3694EAFF6DFDE30B80D5A -PT=D529B6706C6E3A445593062A7FE0E556 -CT=86394E06B621147758CAB012852035A6 - -I=217 -KEY=EE44A367A3CDDFED7DBD980BF731B4E5F13C6432C155979E75CF9E3B4F495A06 -IV=86394E06B621147758CAB012852035A6 -PT=197F117832A05FFC08A765D63A22BE81 -CT=3CBC18C1AC02C0A7595199E08F1F552B - -I=218 -KEY=1558BABB3DCD830F693E7950F736BCADCD807CF36D5757392C9E07DBC0560F2D -IV=3CBC18C1AC02C0A7595199E08F1F552B -PT=FB1C19DC9E005CE21483E15B00070848 -CT=5A9CFD8BFE10CF7FBD0F9A3FAF6C117B - -I=219 -KEY=D083F58141F5E5AF3D5479739D55780D971C81789347984691919DE46F3A1E56 -IV=5A9CFD8BFE10CF7FBD0F9A3FAF6C117B -PT=C5DB4F3A7C3866A0546A00236A63C4A0 -CT=61A437D4E2F1C3779F1EBE906C5D2C12 - -I=220 -KEY=C60824F2DDC67623D270974E9F87BD27F6B8B6AC71B65B310E8F237403673244 -IV=61A437D4E2F1C3779F1EBE906C5D2C12 -PT=168BD1739C33938CEF24EE3D02D2C52A -CT=FC675EE1B12B47410A20CFAC23FD20EE - -I=221 -KEY=F73A715AD84DB0A6F55AD584922001920ADFE84DC09D1C7004AFECD8209A12AA -IV=FC675EE1B12B47410A20CFAC23FD20EE -PT=313255A8058BC685272A42CA0DA7BCB5 -CT=82E3FB6189716D94C8E9D30E1ECCABC4 - -I=222 -KEY=6ABBDCE21E2ECECBCAA3473897A2E178883C132C49EC71E4CC463FD63E56B96E -IV=82E3FB6189716D94C8E9D30E1ECCABC4 -PT=9D81ADB8C6637E6D3FF992BC0582E0EA -CT=BD84DCE4994B505EED71596B454BDF85 - -I=223 -KEY=0D4F68CDB9B53B08E22DDDFE4FD5FCC035B8CFC8D0A721BA213766BD7B1D66EB -IV=BD84DCE4994B505EED71596B454BDF85 -PT=67F4B42FA79BF5C3288E9AC6D8771DB8 -CT=1B3AA490C6E874BA77CE55D71789616C - -I=224 -KEY=3D8E3121698DD7E9D1835EFF5FA02DB22E826B58164F550056F9336A6C940787 -IV=1B3AA490C6E874BA77CE55D71789616C -PT=30C159ECD038ECE133AE83011075D172 -CT=D6EE171B39B5E40535FBF5A7CB4C6953 - -I=225 -KEY=1A5B2249CA785F0DB58FF5B07CCCFCDEF86C7C432FFAB1056302C6CDA7D86ED4 -IV=D6EE171B39B5E40535FBF5A7CB4C6953 -PT=27D51368A3F588E4640CAB4F236CD16C -CT=8691BE10D13B4C08246938750EE33643 - -I=226 -KEY=48AD5DEF217F83DC5039ECD1191ABE3A7EFDC253FEC1FD0D476BFEB8A93B5897 -IV=8691BE10D13B4C08246938750EE33643 -PT=52F67FA6EB07DCD1E5B6196165D642E4 -CT=E40AD0EE818639E37349E1132B138D63 - -I=227 -KEY=FEB84B0B264A8A6FB8D4DE065DA68A479AF712BD7F47C4EE34221FAB8228D5F4 -IV=E40AD0EE818639E37349E1132B138D63 -PT=B61516E4073509B3E8ED32D744BC347D -CT=6E40A22767A39C978F279D40B447099D - -I=228 -KEY=2FE79FCC3C959901BAAEE8C55B71D01FF4B7B09A18E45879BB0582EB366FDC69 -IV=6E40A22767A39C978F279D40B447099D -PT=D15FD4C71ADF136E027A36C306D75A58 -CT=C2DE8C5200F6FCBF1A4D6178909DF110 - -I=229 -KEY=C3EB1424EFD0ACDF3670C4943CB2CF5936693CC81812A4C6A148E393A6F22D79 -IV=C2DE8C5200F6FCBF1A4D6178909DF110 -PT=EC0C8BE8D34535DE8CDE2C5167C31F46 -CT=104CBECB1134CAE09B2FE8C5CE2E0901 - -I=230 -KEY=DF9F70702DA816906F3907575DF4D3032625820309266E263A670B5668DC2478 -IV=104CBECB1134CAE09B2FE8C5CE2E0901 -PT=1C746454C278BA4F5949C3C361461C5A -CT=65287F66F01AC054B1051D700EDDBF2B - -I=231 -KEY=F6C4CE3006A43EFBE18C5FF305F32C37430DFD65F93CAE728B62162666019B53 -IV=65287F66F01AC054B1051D700EDDBF2B -PT=295BBE402B0C286B8EB558A45807FF34 -CT=4933D44FD414225CB1E6951240D28150 - -I=232 -KEY=3963CE7465D89FBE550649326262DB450A3E292A2D288C2E3A84833426D31A03 -IV=4933D44FD414225CB1E6951240D28150 -PT=CFA70044637CA145B48A16C16791F772 -CT=3733351F76DE0E07581F84600E38EFDD - -I=233 -KEY=42468662273D8CB3EFAB19DBC802888B3D0D1C355BF68229629B075428EBF5DE -IV=3733351F76DE0E07581F84600E38EFDD -PT=7B25481642E5130DBAAD50E9AA6053CE -CT=F16F22EB9CCD854591AE2FC28E1D4B59 - -I=234 -KEY=E2B3E5EA6573FC8ABE4E890FA4F5502DCC623EDEC73B076CF3352896A6F6BE87 -IV=F16F22EB9CCD854591AE2FC28E1D4B59 -PT=A0F56388424E703951E590D46CF7D8A6 -CT=1D607C6E9BAD454DD5DE785F2A78F990 - -I=235 -KEY=FDB55AF96E09AF677AA4737992E13C9ED10242B05C96422126EB50C98C8E4717 -IV=1D607C6E9BAD454DD5DE785F2A78F990 -PT=1F06BF130B7A53EDC4EAFA7636146CB3 -CT=7B16B6A8F88E05F6A9A036A67CB8A2B6 - -I=236 -KEY=E546D74518CF4AA64B399EA321C570CAAA14F418A41847D78F4B666FF036E5A1 -IV=7B16B6A8F88E05F6A9A036A67CB8A2B6 -PT=18F38DBC76C6E5C1319DEDDAB3244C54 -CT=63AD66FCF9D52195CD0339443F554311 - -I=237 -KEY=2F9B91A24BEF0E503DC576E4F8D32C16C9B992E45DCD664242485F2BCF63A6B0 -IV=63AD66FCF9D52195CD0339443F554311 -PT=CADD46E7532044F676FCE847D9165CDC -CT=6293FBB897D8F0C60171BEA3072CA512 - -I=238 -KEY=97B7DF112EFFE9279D5EDF932889D84BAB2A695CCA1596844339E188C84F03A2 -IV=6293FBB897D8F0C60171BEA3072CA512 -PT=B82C4EB36510E777A09BA977D05AF45D -CT=9555D7F244448C80E965CE6AB7EF0F7B - -I=239 -KEY=39F26B429FE4111DAA984F03112B339F3E7FBEAE8E511A04AA5C2FE27FA00CD9 -IV=9555D7F244448C80E965CE6AB7EF0F7B -PT=AE45B453B11BF83A37C6909039A2EBD4 -CT=FA242C9DB2984E9EFA8CD98AE7C29D6F - -I=240 -KEY=64C6D001CB3C8AFC24A72DA11D172727C45B92333CC9549A50D0F668986291B6 -IV=FA242C9DB2984E9EFA8CD98AE7C29D6F -PT=5D34BB4354D89BE18E3F62A20C3C14B8 -CT=2998B59B0441F068D7F3FCE7AEAA6FD9 - -I=241 -KEY=FE56E2EB2434CA49D46A684DBCE2426CEDC327A83888A4F287230A8F36C8FE6F -IV=2998B59B0441F068D7F3FCE7AEAA6FD9 -PT=9A9032EAEF0840B5F0CD45ECA1F5654B -CT=A3F77BBA27BA88F33D4330EB2CC0EFBA - -I=242 -KEY=0F9B3CAD0EDFA9C429F3A005C78FE9F84E345C121F322C01BA603A641A0811D5 -IV=A3F77BBA27BA88F33D4330EB2CC0EFBA -PT=F1CDDE462AEB638DFD99C8487B6DAB94 -CT=9C751C64BCB82229ABA5130353455CCB - -I=243 -KEY=1725A4C019FB909FB1DE2ACA00E9A33DD2414076A38A0E2811C52967494D4D1E -IV=9C751C64BCB82229ABA5130353455CCB -PT=18BE986D1724395B982D8ACFC7664AC5 -CT=540DE482B7170E925FA4B429F6BCD458 - -I=244 -KEY=E2A619367235AA4611A72FD4FAF68FB3864CA4F4149D00BA4E619D4EBFF19946 -IV=540DE482B7170E925FA4B429F6BCD458 -PT=F583BDF66BCE3AD9A079051EFA1F2C8E -CT=6AADE1E1A12F5C83AF434CAD95B29678 - -I=245 -KEY=8629FB2CC8C06A07EC910681499E917FECE14515B5B25C39E122D1E32A430F3E -IV=6AADE1E1A12F5C83AF434CAD95B29678 -PT=648FE21ABAF5C041FD362955B3681ECC -CT=11308758A1C2075FEAECD260867CA343 - -I=246 -KEY=5EDD76C395D2A0D3D547CFB394B439EAFDD1C24D14705B660BCE0383AC3FAC7D -IV=11308758A1C2075FEAECD260867CA343 -PT=D8F48DEF5D12CAD439D6C932DD2AA895 -CT=14C9A904A3909A8FF44D88E22F8626DF - -I=247 -KEY=AF3FA8D6034564D7151C3933C7986CFCE9186B49B7E0C1E9FF838B6183B98AA2 -IV=14C9A904A3909A8FF44D88E22F8626DF -PT=F1E2DE159697C404C05BF680532C5516 -CT=A042D7F391A37E5A3EDB3022400EC797 - -I=248 -KEY=8ACC720216DBDBDB4C213FE65E575A09495ABCBA2643BFB3C158BB43C3B74D35 -IV=A042D7F391A37E5A3EDB3022400EC797 -PT=25F3DAD4159EBF0C593D06D599CF36F5 -CT=439FEF326223A65F7A555C6231178190 - -I=249 -KEY=F2882A52603203A71895A5870CCF7EE40AC55388446019ECBB0DE721F2A0CCA5 -IV=439FEF326223A65F7A555C6231178190 -PT=7844585076E9D87C54B49A61529824ED -CT=6FE1286C19AA3BC802F1C6C7B58DB4C4 - -I=250 -KEY=57EFB10BFC21E28397A9D5E5A533D35B65247BE45DCA2224B9FC21E6472D7861 -IV=6FE1286C19AA3BC802F1C6C7B58DB4C4 -PT=A5679B599C13E1248F3C7062A9FCADBF -CT=C38D763981392FF038573CA341DD8EA1 - -I=251 -KEY=19328A5147BC2E7C5149DA257487D734A6A90DDDDCF30DD481AB1D4506F0F6C0 -IV=C38D763981392FF038573CA341DD8EA1 -PT=4EDD3B5ABB9DCCFFC6E00FC0D1B4046F -CT=5FD553A2848C683B138D50F2741B124D - -I=252 -KEY=ED66DE43FE0F966850EF6754E21B69A0F97C5E7F587F65EF92264DB772EBE48D -IV=5FD553A2848C683B138D50F2741B124D -PT=F4545412B9B3B81401A6BD71969CBE94 -CT=910CDCBE38068A51185A879FF2B45B9C - -I=253 -KEY=E53D9016DE7DF4E2377968864B6F69F8687082C16079EFBE8A7CCA28805FBF11 -IV=910CDCBE38068A51185A879FF2B45B9C -PT=085B4E552072628A67960FD2A9740058 -CT=E0A0E68A14893501D75BC42B8EFC6F96 - -I=254 -KEY=C88C4383E2D16541765E5DB85957C59188D0644B74F0DABF5D270E030EA3D087 -IV=E0A0E68A14893501D75BC42B8EFC6F96 -PT=2DB1D3953CAC91A34127353E1238AC69 -CT=A66DD21DA627347F962A0AB7DCA887ED - -I=255 -KEY=6F01CC5C22DE71C7C2D5B429AA756A392EBDB656D2D7EEC0CB0D04B4D20B576A -IV=A66DD21DA627347F962A0AB7DCA887ED -PT=A78D8FDFC00F1486B48BE991F322AFA8 -CT=87551BC7A6B6D9B76239CB8A31FF1993 - -I=256 -KEY=DAC405506CD3779FC2400B459B7C6B6EA9E8AD9174613777A934CF3EE3F44EF9 -IV=87551BC7A6B6D9B76239CB8A31FF1993 -PT=B5C5C90C4E0D06580095BF6C31090157 -CT=B909B206A041F33EB3AC7ED481DFBA21 - -I=257 -KEY=E482333E6FBAA8427A2E30D56069E0B810E11F97D420C4491A98B1EA622BF4D8 -IV=B909B206A041F33EB3AC7ED481DFBA21 -PT=3E46366E0369DFDDB86E3B90FB158BD6 -CT=DE5E71F446794D3402400C96FBFEB93F - -I=258 -KEY=176CAD69CD20690B95DA40B95C43AC54CEBF6E639259897D18D8BD7C99D54DE7 -IV=DE5E71F446794D3402400C96FBFEB93F -PT=F3EE9E57A29AC149EFF4706C3C2A4CEC -CT=175A7C580A99E985A2FD2F185D9BAADB - -I=259 -KEY=FA4DD79A64960C8264624CDF215B54A1D9E5123B98C060F8BA259264C44EE73C -IV=175A7C580A99E985A2FD2F185D9BAADB -PT=ED217AF3A9B66589F1B80C667D18F8F5 -CT=413EB5D166C1D196F0239FF34D184013 - -I=260 -KEY=49855C1008EAF59432518A9F3807A0B398DBA7EAFE01B16E4A060D978956A72F -IV=413EB5D166C1D196F0239FF34D184013 -PT=B3C88B8A6C7CF9165633C640195CF412 -CT=69A3A63C580336296FF826600C754747 - -I=261 -KEY=849D231AE9F90F233F328BE6EE0AC180F17801D6A602874725FE2BF78523E068 -IV=69A3A63C580336296FF826600C754747 -PT=CD187F0AE113FAB70D630179D60D6133 -CT=B9AF0CA2B502C2DEB66834BD729AA528 - -I=262 -KEY=40E3F7EA3E7CFBDBF57935DBB124CF7F48D70D741300459993961F4AF7B94540 -IV=B9AF0CA2B502C2DEB66834BD729AA528 -PT=C47ED4F0D785F4F8CA4BBE3D5F2E0EFF -CT=99E16968796AB521FC460A8DF6744FA8 - -I=263 -KEY=4FDF8D16B85E527490FBE95EA34138D6D136641C6A6AF0B86FD015C701CD0AE8 -IV=99E16968796AB521FC460A8DF6744FA8 -PT=0F3C7AFC8622A9AF6582DC851265F7A9 -CT=7B871B0153657949D1FE7259E16791B7 - -I=264 -KEY=6AD7099EA6DC50F5CC836C3EB934CF92AAB17F1D390F89F1BE2E679EE0AA9B5F -IV=7B871B0153657949D1FE7259E16791B7 -PT=250884881E8202815C7885601A75F744 -CT=8D6B80EAC01BF7E204A79DD14BFDB71A - -I=265 -KEY=0860DD776AD2014ED90D0837A5A298B627DAFFF7F9147E13BA89FA4FAB572C45 -IV=8D6B80EAC01BF7E204A79DD14BFDB71A -PT=62B7D4E9CC0E51BB158E64091C965724 -CT=DAD6A83408559AD3003C6995DC099303 - -I=266 -KEY=9E8757199D96CA08B9C3CEF817E902B8FD0C57C3F141E4C0BAB593DA775EBF46 -IV=DAD6A83408559AD3003C6995DC099303 -PT=96E78A6EF744CB4660CEC6CFB24B9A0E -CT=AA6EF32AFC8AA6ADCDE86D86CC59AFB4 - -I=267 -KEY=483AD9696154B929F35016B648F5952B5762A4E90DCB426D775DFE5CBB0710F2 -IV=AA6EF32AFC8AA6ADCDE86D86CC59AFB4 -PT=D6BD8E70FCC273214A93D84E5F1C9793 -CT=713F9516A55FBFA4AE8155EC12A3AB5D - -I=268 -KEY=027B7F5F83B26099A4CE8FCC1AB84529265D31FFA894FDC9D9DCABB0A9A4BBAF -IV=713F9516A55FBFA4AE8155EC12A3AB5D -PT=4A41A636E2E6D9B0579E997A524DD002 -CT=B2E4BEAF6DB84214E379B89697191379 - -I=269 -KEY=D7AEFAD28855BB04A9604527F8376CAF94B98F50C52CBFDD3AA513263EBDA8D6 -IV=B2E4BEAF6DB84214E379B89697191379 -PT=D5D5858D0BE7DB9D0DAECAEBE28F2986 -CT=9FE3B8941D9F85B1400CC45B7BDE8E9F - -I=270 -KEY=B5EBE7CB901F69E61EC6F011E6A46A2E0B5A37C4D8B33A6C7AA9D77D45632649 -IV=9FE3B8941D9F85B1400CC45B7BDE8E9F -PT=62451D19184AD2E2B7A6B5361E930681 -CT=E9ABFC5563B4AD1718EF4A91F7D60913 - -I=271 -KEY=571805B63BC20F5784AF56FDB71CBCD7E2F1CB91BB07977B62469DECB2B52F5A -IV=E9ABFC5563B4AD1718EF4A91F7D60913 -PT=E2F3E27DABDD66B19A69A6EC51B8D6F9 -CT=D825DC1C8C73A84BDFEFD9799D9E3960 - -I=272 -KEY=9EED79D9ABB11094FB4475ED2EC042133AD4178D37743F30BDA944952F2B163A -IV=D825DC1C8C73A84BDFEFD9799D9E3960 -PT=C9F57C6F90731FC37FEB231099DCFEC4 -CT=7D0DC4C31259FD0A46D2D2282F1FE22E - -I=273 -KEY=EF905E20846E064A3B3281FD2BD59AB647D9D34E252DC23AFB7B96BD0034F414 -IV=7D0DC4C31259FD0A46D2D2282F1FE22E -PT=717D27F92FDF16DEC076F4100515D8A5 -CT=93FAFC16EFF504A9D2B791A272A78135 - -I=274 -KEY=8F219C67ACF0F1C745FA0ABBADE96015D4232F58CAD8C69329CC071F72937521 -IV=93FAFC16EFF504A9D2B791A272A78135 -PT=60B1C247289EF78D7EC88B46863CFAA3 -CT=EF387517F8C781A79700C8196DCA6F1A - -I=275 -KEY=48C6408FD8FA84D30DD53B83B31C425D3B1B5A4F321F4734BECCCF061F591A3B -IV=EF387517F8C781A79700C8196DCA6F1A -PT=C7E7DCE8740A7514482F31381EF52248 -CT=A6166002C7239645D55494BB64840B26 - -I=276 -KEY=1C9EB0648715CA5738A4FD27A63693A09D0D3A4DF53CD1716B985BBD7BDD111D -IV=A6166002C7239645D55494BB64840B26 -PT=5458F0EB5FEF4E843571C6A4152AD1FD -CT=FB35646B2008AD29AFF508B94179F223 - -I=277 -KEY=4AA2E4BAC74E8CD9AEA969550D27877866385E26D5347C58C46D53043AA4E33E -IV=FB35646B2008AD29AFF508B94179F223 -PT=563C54DE405B468E960D9472AB1114D8 -CT=59C1692D4598AD622B6586A06892E11D - -I=278 -KEY=B9F5A3BAAA0C2F6EA5E835F6E6E5D50E3FF9370B90ACD13AEF08D5A452360223 -IV=59C1692D4598AD622B6586A06892E11D -PT=F35747006D42A3B70B415CA3EBC25276 -CT=3131E251A6A4AC7226A1809553198AB8 - -I=279 -KEY=EF46814F8656D3D8ABAF3B08EFEBC3150EC8D55A36087D48C9A95531012F889B -IV=3131E251A6A4AC7226A1809553198AB8 -PT=56B322F52C5AFCB60E470EFE090E161B -CT=2E30D8D5B7B636307A6D354FBED41A2D - -I=280 -KEY=3DFBE0FE20F0421CAABD62E2CDB0E60F20F80D8F81BE4B78B3C4607EBFFB92B6 -IV=2E30D8D5B7B636307A6D354FBED41A2D -PT=D2BD61B1A6A691C4011259EA225B251A -CT=6D791952F9416FC09B78517A2FFE986F - -I=281 -KEY=5197CF05753D155C5B08A5EB51B82F2D4D8114DD78FF24B828BC310490050AD9 -IV=6D791952F9416FC09B78517A2FFE986F -PT=6C6C2FFB55CD5740F1B5C7099C08C922 -CT=37A8E0B9375AD5669A396D980D68D0F3 - -I=282 -KEY=B3EFE2F914264AAAB7C7FD9C4843619E7A29F4644FA5F1DEB2855C9C9D6DDA2A -IV=37A8E0B9375AD5669A396D980D68D0F3 -PT=E2782DFC611B5FF6ECCF587719FB4EB3 -CT=BC65630DB71EE8DA2194E5DFBC48360E - -I=283 -KEY=CAAB7758FF4AFF39A98C2202A26165CFC64C9769F8BB19049311B9432125EC24 -IV=BC65630DB71EE8DA2194E5DFBC48360E -PT=794495A1EB6CB5931E4BDF9EEA220451 -CT=9C47136C1B510BFCEFA7F6659BDA08C2 - -I=284 -KEY=CC38852E17544DB004372C4A3AA3DFDB5A0B8405E3EA12F87CB64F26BAFFE4E6 -IV=9C47136C1B510BFCEFA7F6659BDA08C2 -PT=0693F276E81EB289ADBB0E4898C2BA14 -CT=68AC57D13EC53C250FEBFC64B1992B1C - -I=285 -KEY=108FE55553F353DFABD421E15A18C9F532A7D3D4DD2F2EDD735DB3420B66CFFA -IV=68AC57D13EC53C250FEBFC64B1992B1C -PT=DCB7607B44A71E6FAFE30DAB60BB162E -CT=9A8C11E031E57B77138A3637784D1D71 - -I=286 -KEY=C432EA6E854DE8C191C6F0ED4A2BF1D7A82BC234ECCA55AA60D78575732BD28B -IV=9A8C11E031E57B77138A3637784D1D71 -PT=D4BD0F3BD6BEBB1E3A12D10C10333822 -CT=3BBB1E76A491A5AA145ED931BB886333 - -I=287 -KEY=980941D5FEFD458061B1B443E39818299390DC42485BF00074895C44C8A3B1B8 -IV=3BBB1E76A491A5AA145ED931BB886333 -PT=5C3BABBB7BB0AD41F07744AEA9B3E9FE -CT=F79F1B46F57BDD36B58DDA33619D3920 - -I=288 -KEY=B4FF33FB094612B6A3438A285C3AEA41640FC704BD202D36C1048677A93E8898 -IV=F79F1B46F57BDD36B58DDA33619D3920 -PT=2CF6722EF7BB5736C2F23E6BBFA2F268 -CT=F1C3ED72D0B6D917DD6F8AE86CFD8CBF - -I=289 -KEY=BC81027596771F9C591BE6C61762B1E795CC2A766D96F4211C6B0C9FC5C30427 -IV=F1C3ED72D0B6D917DD6F8AE86CFD8CBF -PT=087E318E9F310D2AFA586CEE4B585BA6 -CT=EAF1AACEEB9F9BE0E880911BFEEAC2AC - -I=290 -KEY=D41458000DDED43B83DAA81B1D7FFB597F3D80B886096FC1F4EB9D843B29C68B -IV=EAF1AACEEB9F9BE0E880911BFEEAC2AC -PT=68955A759BA9CBA7DAC14EDD0A1D4ABE -CT=7B35179E67E9B40346F7DE6356EDC98F - -I=291 -KEY=FACDC2B3BA9E125B2A734DE75F99F48C04089726E1E0DBC2B21C43E76DC40F04 -IV=7B35179E67E9B40346F7DE6356EDC98F -PT=2ED99AB3B740C660A9A9E5FC42E60FD5 -CT=0EDE849D7E56B296B12C1EDF37436A8D - -I=292 -KEY=E73022253439EB4464CE0B205BBB0F1F0AD613BB9FB6695403305D385A876589 -IV=0EDE849D7E56B296B12C1EDF37436A8D -PT=1DFDE0968EA7F91F4EBD46C70422FB93 -CT=D02F1EAF3CF6A6B681BAF8ECB921FFC4 - -I=293 -KEY=9F3671205266DC4F7C771EBA74265F36DAF90D14A340CFE2828AA5D4E3A69A4D -IV=D02F1EAF3CF6A6B681BAF8ECB921FFC4 -PT=78065305665F370B18B9159A2F9D5029 -CT=E365BE1A125C6930DFDCBB33E6937EC5 - -I=294 -KEY=111A3E012C9D5CB2967E8BD22907D6F7399CB30EB11CA6D25D561EE70535E488 -IV=E365BE1A125C6930DFDCBB33E6937EC5 -PT=8E2C4F217EFB80FDEA0995685D2189C1 -CT=C5B24EEC5CDD17AA56838B09EC4AB725 - -I=295 -KEY=15DA3EE4EE9A560B05493FFC971713A5FC2EFDE2EDC1B1780BD595EEE97F53AD -IV=C5B24EEC5CDD17AA56838B09EC4AB725 -PT=04C000E5C2070AB99337B42EBE10C552 -CT=4D8A43CD28BBCB86953FA55A409BF130 - -I=296 -KEY=2C8B30484D954192818342F3766C1415B1A4BE2FC57A7AFE9EEA30B4A9E4A29D -IV=4D8A43CD28BBCB86953FA55A409BF130 -PT=39510EACA30F179984CA7D0FE17B07B0 -CT=A524A6329E6DCE041F72459234ECDE78 - -I=297 -KEY=0F162BAD5F298EE0B0164CFED6A7AC271480181D5B17B4FA819875269D087CE5 -IV=A524A6329E6DCE041F72459234ECDE78 -PT=239D1BE512BCCF7231950E0DA0CBB832 -CT=90BBC5130D1C06182F737FE7F0FCD00D - -I=298 -KEY=62744CA02B6684D05A91F2049D403480843BDD0E560BB2E2AEEB0AC16DF4ACE8 -IV=90BBC5130D1C06182F737FE7F0FCD00D -PT=6D62670D744F0A30EA87BEFA4BE798A7 -CT=35F293EDDEC8D9446A4ACD34602839B5 - -I=299 -KEY=21F5373DA5D6BF15BC163383F62EA92FB1C94EE388C36BA6C4A1C7F50DDC955D -IV=35F293EDDEC8D9446A4ACD34602839B5 -PT=43817B9D8EB03BC5E687C1876B6E9DAF -CT=E45CF478D7C84325143165F58B041A13 - -I=300 -KEY=4CF4A508B4DF37A831916353620DC1F45595BA9B5F0B2883D090A20086D88F4E -IV=E45CF478D7C84325143165F58B041A13 -PT=6D019235110988BD8D8750D0942368DB -CT=964983C30745D7EEA1BD5E287DAC466C - -I=301 -KEY=35C99C004D01E89F94A9B3BC79C492D7C3DC3958584EFF6D712DFC28FB74C922 -IV=964983C30745D7EEA1BD5E287DAC466C -PT=793D3908F9DEDF37A538D0EF1BC95323 -CT=6834813D8403A963AD36C1A18CA605C0 - -I=302 -KEY=F185723D6A2D2A6F9F4B9194A444AA2AABE8B865DC4D560EDC1B3D8977D2CCE2 -IV=6834813D8403A963AD36C1A18CA605C0 -PT=C44CEE3D272CC2F00BE22228DD8038FD -CT=61F35AA76E1E0EC2D5E4F4F432B68260 - -I=303 -KEY=B571B0BC6CFD2BA23611FB9A900A31FACA1BE2C2B25358CC09FFC97D45644E82 -IV=61F35AA76E1E0EC2D5E4F4F432B68260 -PT=44F4C28106D001CDA95A6A0E344E9BD0 -CT=DD081A96602E6665B860466B8D14050E - -I=304 -KEY=2A5757156C596DE633D0D8908011C3771713F854D27D3EA9B19F8F16C8704B8C -IV=DD081A96602E6665B860466B8D14050E -PT=9F26E7A900A4464405C1230A101BF28D -CT=5BF18EA3D7F3ED1D941EA1B995313B98 - -I=305 -KEY=DA008B517FA48E908A72B8525CC31AEF4CE276F7058ED3B425812EAF5D417014 -IV=5BF18EA3D7F3ED1D941EA1B995313B98 -PT=F057DC4413FDE376B9A260C2DCD2D998 -CT=74C361B6A13013E9ABF6841601513539 - -I=306 -KEY=E313244DC22AC16C1D59AC494AA728D738211741A4BEC05D8E77AAB95C10452D -IV=74C361B6A13013E9ABF6841601513539 -PT=3913AF1CBD8E4FFC972B141B16643238 -CT=9937614570FD404D5B39BA43D3A20602 - -I=307 -KEY=92A7173E943CBA80AF56203552625E8AA1167604D4438010D54E10FA8FB2432F -IV=9937614570FD404D5B39BA43D3A20602 -PT=71B4337356167BECB20F8C7C18C5765D -CT=726FCDDF8E6738B51D767828EBDFC71E - -I=308 -KEY=242C75C141A58DC403020E52421BB347D379BBDB5A24B8A5C83868D2646D8431 -IV=726FCDDF8E6738B51D767828EBDFC71E -PT=B68B62FFD5993744AC542E671079EDCD -CT=78F735344BF10EED47969F1C02ECBF8C - -I=309 -KEY=5247008C3EB79AA67E5D2E0B95D0AC3AAB8E8EEF11D5B6488FAEF7CE66813BBD -IV=78F735344BF10EED47969F1C02ECBF8C -PT=766B754D7F1217627D5F2059D7CB1F7D -CT=7D6A6CA54B084105DF6A778A4913BB04 - -I=310 -KEY=06E7C1A6C8BC6A3355A86F61B41E70C6D6E4E24A5ADDF74D50C480442F9280B9 -IV=7D6A6CA54B084105DF6A778A4913BB04 -PT=54A0C12AF60BF0952BF5416A21CEDCFC -CT=11F0A303D6C0ED5E18F40248AF1A794B - -I=311 -KEY=D7722746B58D494BE9B97F586CA4BB0AC71441498C1D1A134830820C8088F9F2 -IV=11F0A303D6C0ED5E18F40248AF1A794B -PT=D195E6E07D312378BC111039D8BACBCC -CT=2A715E8AC7101415E65EBF34CC4CD786 - -I=312 -KEY=98B1E5954DE8000B6FFFE98D918B6237ED651FC34B0D0E06AE6E3D384CC42E74 -IV=2A715E8AC7101415E65EBF34CC4CD786 -PT=4FC3C2D3F8654940864696D5FD2FD93D -CT=965E8AF93D390E424C9F4F1FBF9D98A5 - -I=313 -KEY=74B910207ACD1D7C801724D53ED6BBC47B3B953A76340044E2F17227F359B6D1 -IV=965E8AF93D390E424C9F4F1FBF9D98A5 -PT=EC08F5B537251D77EFE8CD58AF5DD9F3 -CT=294782DD29C65B6C445C5D92F50E6D19 - -I=314 -KEY=3E1AD36FDCC33F6B3425B5D52717845E527C17E75FF25B28A6AD2FB50657DBC8 -IV=294782DD29C65B6C445C5D92F50E6D19 -PT=4AA3C34FA60E2217B432910019C13F9A -CT=E22098E7EDBEECC49FA8E31B76E925CA - -I=315 -KEY=BE9F93FE153DF61370F6709F8265DCCDB05C8F00B24CB7EC3905CCAE70BEFE02 -IV=E22098E7EDBEECC49FA8E31B76E925CA -PT=80854091C9FEC97844D3C54AA5725893 -CT=24E80C1F59A4EA36044358E0C0D4F29D - -I=316 -KEY=A790F593CFA1643BD2EB3A1AAB8176A294B4831FEBE85DDA3D46944EB06A0C9F -IV=24E80C1F59A4EA36044358E0C0D4F29D -PT=190F666DDA9C9228A21D4A8529E4AA6F -CT=63CF21803941B521532FF36F9FBFC7BD - -I=317 -KEY=0CF6F000352B4B583E4AEE707D111DC9F77BA29FD2A9E8FB6E6967212FD5CB22 -IV=63CF21803941B521532FF36F9FBFC7BD -PT=AB660593FA8A2F63ECA1D46AD6906B6B -CT=250941C1D45C82B0D9C381293CDD833A - -I=318 -KEY=1F875BCF1967857990EC97864B1EA9F8D272E35E06F56A4BB7AAE60813084818 -IV=250941C1D45C82B0D9C381293CDD833A -PT=1371ABCF2C4CCE21AEA679F6360FB431 -CT=8303B962DAFC4A225C0FD6EA60D29CF4 - -I=319 -KEY=42FE25BF51418FE7A7C7A1828219E1DB51715A3CDC092069EBA530E273DAD4EC -IV=8303B962DAFC4A225C0FD6EA60D29CF4 -PT=5D797E7048260A9E372B3604C9074823 -CT=29E2DB359FAB42C0A83A4059A059CB51 - -I=320 -KEY=6C821A4893FE0EAC88FC1F98BD44AD0A7893810943A262A9439F70BBD3831FBD -IV=29E2DB359FAB42C0A83A4059A059CB51 -PT=2E7C3FF7C2BF814B2F3BBE1A3F5D4CD1 -CT=02BDB7EC18279FA9B7788D95FEB4000E - -I=321 -KEY=411670D389D0A04859FDC26DE5AAD1297A2E36E55B85FD00F4E7FD2E2D371FB3 -IV=02BDB7EC18279FA9B7788D95FEB4000E -PT=2D946A9B1A2EAEE4D101DDF558EE7C23 -CT=3960A92A34967F13B754F2265A6F68C1 - -I=322 -KEY=851BCD18F6043DE625BBEA33E1E860E3434E9FCF6F13821343B30F0877587772 -IV=3960A92A34967F13B754F2265A6F68C1 -PT=C40DBDCB7FD49DAE7C46285E0442B1CA -CT=EF396AB8613AC6083932734D38869458 - -I=323 -KEY=1944F363F3143A380F26BD4831A6BD9EAC77F5770E29441B7A817C454FDEE32A -IV=EF396AB8613AC6083932734D38869458 -PT=9C5F3E7B051007DE2A9D577BD04EDD7D -CT=CB73B8D257CC1A8235E48DA0E6AECC4E - -I=324 -KEY=C2F3C203F591C78914E31BA1E083AB9867044DA559E55E994F65F1E5A9702F64 -IV=CB73B8D257CC1A8235E48DA0E6AECC4E -PT=DBB731600685FDB11BC5A6E9D1251606 -CT=3B0B12757B5D1B6E0130FCC306E9DBAA - -I=325 -KEY=0DCB66B972631AFBB1DA22F1418EE1C45C0F5FD022B845F74E550D26AF99F4CE -IV=3B0B12757B5D1B6E0130FCC306E9DBAA -PT=CF38A4BA87F2DD72A5393950A10D4A5C -CT=CCEF4079CE8FAF0E6B8CD4C8751059E1 - -I=326 -KEY=8FF976D3C735506D86A3540664F1C40590E01FA9EC37EAF925D9D9EEDA89AD2F -IV=CCEF4079CE8FAF0E6B8CD4C8751059E1 -PT=8232106AB5564A96377976F7257F25C1 -CT=D835D2FA5583D9B2C16424960163DF7F - -I=327 -KEY=3499925B26E4F846CAA230EC069F127F48D5CD53B9B4334BE4BDFD78DBEA7250 -IV=D835D2FA5583D9B2C16424960163DF7F -PT=BB60E488E1D1A82B4C0164EA626ED67A -CT=4634485DB5D9C40FA2F6EF36E477F0B7 - -I=328 -KEY=7A133EEC3DD747FE38A3370F8927A3C70EE1850E0C6DF744464B124E3F9D82E7 -IV=4634485DB5D9C40FA2F6EF36E477F0B7 -PT=4E8AACB71B33BFB8F20107E38FB8B1B8 -CT=AE30CD2A5D84CEF10B9C15EE1FE20CEB - -I=329 -KEY=F573665345317BAB5F14881777A0D789A0D1482451E939B54DD707A0207F8E0C -IV=AE30CD2A5D84CEF10B9C15EE1FE20CEB -PT=8F6058BF78E63C5567B7BF18FE87744E -CT=B3926CDE5BFB1363DCCA28CDA2DC4CD8 - -I=330 -KEY=FEFB661FA786BF2DA1B70FD7D06B86E8134324FA0A122AD6911D2F6D82A3C2D4 -IV=B3926CDE5BFB1363DCCA28CDA2DC4CD8 -PT=0B88004CE2B7C486FEA387C0A7CB5161 -CT=633388FA9EAE0DB2036F63CB2E21C266 - -I=331 -KEY=BFC495DFBA60078708D992724C9201577070AC0094BC276492724CA6AC8200B2 -IV=633388FA9EAE0DB2036F63CB2E21C266 -PT=413FF3C01DE6B8AAA96E9DA59CF987BF -CT=54ACB838D247D26A1544B2E42F18CF3F - -I=332 -KEY=EB0113E4FFE1201B59EAE94706B2571F24DC143846FBF50E8736FE42839ACF8D -IV=54ACB838D247D26A1544B2E42F18CF3F -PT=54C5863B4581279C51337B354A205648 -CT=B9210B8A8639CA5C94A1CF1169F89DDB - -I=333 -KEY=0E1D5F7873FD6440227C5529AEB4C7999DFD1FB2C0C23F5213973153EA625256 -IV=B9210B8A8639CA5C94A1CF1169F89DDB -PT=E51C4C9C8C1C445B7B96BC6EA8069086 -CT=8990488561B43B03CF9FE631E2E7D5E7 - -I=334 -KEY=8B2759471137DBF37906B394EFEF96D2146D5737A1760451DC08D762088587B1 -IV=8990488561B43B03CF9FE631E2E7D5E7 -PT=853A063F62CABFB35B7AE6BD415B514B -CT=9DCE77D8CCC0F041FA717C28474E9A30 - -I=335 -KEY=0D4B29E8D6F39CA01BC01CE73E2834C689A320EF6DB6F4102679AB4A4FCB1D81 -IV=9DCE77D8CCC0F041FA717C28474E9A30 -PT=866C70AFC7C4475362C6AF73D1C7A214 -CT=E1DA174FE5848D21735E55B91CA48A9B - -I=336 -KEY=55228F6FF93B7DE9304CD75991C133A5687937A0883279315527FEF3536F971A -IV=E1DA174FE5848D21735E55B91CA48A9B -PT=5869A6872FC8E1492B8CCBBEAFE90763 -CT=C578F53AD69AD508711E674F8DD2A843 - -I=337 -KEY=35CA943437046860F72A1F8554127676AD01C29A5EA8AC39243999BCDEBD3F59 -IV=C578F53AD69AD508711E674F8DD2A843 -PT=60E81B5BCE3F1589C766C8DCC5D345D3 -CT=177A50196260D3F0A3F97423899EBEE2 - -I=338 -KEY=B8C3B8414C112FC2E2E848733D5CF69CBA7B92833CC87FC987C0ED9F572381BB -IV=177A50196260D3F0A3F97423899EBEE2 -PT=8D092C757B1547A215C257F6694E80EA -CT=6B03A799C51C7D0A9D3C9929617E69B1 - -I=339 -KEY=E82B651AE5740119104FE3284CE780E4D178351AF9D402C31AFC74B6365DE80A -IV=6B03A799C51C7D0A9D3C9929617E69B1 -PT=50E8DD5BA9652EDBF2A7AB5B71BB7678 -CT=8D4C7C1157422E7B6DDA47C5C2C246F4 - -I=340 -KEY=3C0B660F2B78F768812AC671D3107AD85C34490BAE962CB877263373F49FAEFE -IV=8D4C7C1157422E7B6DDA47C5C2C246F4 -PT=D4200315CE0CF671916525599FF7FA3C -CT=787B3C51094569BC1F139102964DF5AF - -I=341 -KEY=A197B59C700A4786E840733047964FD4244F755AA7D345046835A27162D25B51 -IV=787B3C51094569BC1F139102964DF5AF -PT=9D9CD3935B72B0EE696AB5419486350C -CT=AE02945B4E63AC35B6AC2DFA2DF3CEBA - -I=342 -KEY=00E75C4B909D44A94FA20EDA6C3628418A4DE101E9B0E931DE998F8B4F2195EB -IV=AE02945B4E63AC35B6AC2DFA2DF3CEBA -PT=A170E9D7E097032FA7E27DEA2BA06795 -CT=AC4AACD3597FE73F519F7CEDAFE6E000 - -I=343 -KEY=4626BE31853C15DE412EF2A42328D47326074DD2B0CF0E0E8F06F366E0C775EB -IV=AC4AACD3597FE73F519F7CEDAFE6E000 -PT=46C1E27A15A151770E8CFC7E4F1EFC32 -CT=5EB8B35708A135E041603BA323663F34 - -I=344 -KEY=1733A037E76437411F49821D948A098978BFFE85B86E3BEECE66C8C5C3A14ADF -IV=5EB8B35708A135E041603BA323663F34 -PT=51151E066258229F5E6770B9B7A2DDFA -CT=6674FB922570377334A4F22D13E95BD8 - -I=345 -KEY=8474275A2E4D5E5448EB8D34B65EE7081ECB05179D1E0C9DFAC23AE8D0481107 -IV=6674FB922570377334A4F22D13E95BD8 -PT=9347876DC929691557A20F2922D4EE81 -CT=F0E3F09C0350C0172E449A01F24AB828 - -I=346 -KEY=765AA3F4014B8475CF832DE6128F7F2DEE28F58B9E4ECC8AD486A0E92202A92F -IV=F0E3F09C0350C0172E449A01F24AB828 -PT=F22E84AE2F06DA218768A0D2A4D19825 -CT=CC156010299679ADEE9CC000FD5C90E5 - -I=347 -KEY=DD3D3AFC83B7EEBC58CE35B35719B587223D959BB7D8B5273A1A60E9DF5E39CA -IV=CC156010299679ADEE9CC000FD5C90E5 -PT=AB67990882FC6AC9974D18554596CAAA -CT=80354EDEA10038E903C4896313236CE5 - -I=348 -KEY=4764BB8C98BCF3FD4A21A370AE5432BBA208DB4516D88DCE39DEE98ACC7D552F -IV=80354EDEA10038E903C4896313236CE5 -PT=9A5981701B0B1D4112EF96C3F94D873C -CT=15140DC26F383EB99425FB51D445CC98 - -I=349 -KEY=DF729AB7D09BC85489F8AD373EBDDA70B71CD68779E0B377ADFB12DB183899B7 -IV=15140DC26F383EB99425FB51D445CC98 -PT=9816213B48273BA9C3D90E4790E9E8CB -CT=163465787010C97D3C2023D803F62556 - -I=350 -KEY=A945B0C5997C596B5155A6BCA5055127A128B3FF09F07A0A91DB31031BCEBCE1 -IV=163465787010C97D3C2023D803F62556 -PT=76372A7249E7913FD8AD0B8B9BB88B57 -CT=23E861D557EE72534C8B729240E3A54F - -I=351 -KEY=0E1C166F2B947D14D0C7E6ABD280A31E82C0D22A5E1E0859DD5043915B2D19AE -IV=23E861D557EE72534C8B729240E3A54F -PT=A759A6AAB2E8247F819240177785F239 -CT=652CA6A199D7DBC37936FCD70636989F - -I=352 -KEY=208A37149072011877E3E85B3DC7F4A7E7EC748BC7C9D39AA466BF465D1B8131 -IV=652CA6A199D7DBC37936FCD70636989F -PT=2E96217BBBE67C0CA7240EF0EF4757B9 -CT=7C29D6F4788553E3C50A48027478A98F - -I=353 -KEY=A8FFCB194C077EEED66632AEBE01652E9BC5A27FBF4C8079616CF744296328BE -IV=7C29D6F4788553E3C50A48027478A98F -PT=8875FC0DDC757FF6A185DAF583C69189 -CT=7B886FC819D625B224F2516901788E88 - -I=354 -KEY=3716969BDDBF04FF4010D4667CCA994AE04DCDB7A69AA5CB459EA62D281BA636 -IV=7B886FC819D625B224F2516901788E88 -PT=9FE95D8291B87A119676E6C8C2CBFC64 -CT=3EAB925C025F379153CE2C7191026976 - -I=355 -KEY=991D0D313717C7AC62537C8572DE094BDEE65FEBA4C5925A16508A5CB919CF40 -IV=3EAB925C025F379153CE2C7191026976 -PT=AE0B9BAAEAA8C3532243A8E30E149001 -CT=B9904B8BDF431FDDB9166086C9D3E24C - -I=356 -KEY=315772BB82A3DD286FE5891934B19434677614607B868D87AF46EADA70CA2D0C -IV=B9904B8BDF431FDDB9166086C9D3E24C -PT=A84A7F8AB5B41A840DB6F59C466F9D7F -CT=3C7029336ECCA5D352DB9D0C060D3830 - -I=357 -KEY=C99E4E6A8C1D42A9E431FF8B2A8ACA615B063D53154A2854FD9D77D676C7153C -IV=3C7029336ECCA5D352DB9D0C060D3830 -PT=F8C93CD10EBE9F818BD476921E3B5E55 -CT=4AF4290AA79EB96435D2D3FC745033D7 - -I=358 -KEY=55317B8B407B7D089ED2CEF7BE80E99111F21459B2D49130C84FA42A029726EB -IV=4AF4290AA79EB96435D2D3FC745033D7 -PT=9CAF35E1CC663FA17AE3317C940A23F0 -CT=BFCA0B6B31AAD81F1BDC743B48B7CCA4 - -I=359 -KEY=6EAE6D8B06AA25493BA3608357D71404AE381F32837E492FD393D0114A20EA4F -IV=BFCA0B6B31AAD81F1BDC743B48B7CCA4 -PT=3B9F160046D15841A571AE74E957FD95 -CT=89C1D565569A12A68B2E808AB5CFA2E3 - -I=360 -KEY=3245D7C1F5571A1329E1B2303F8A689D27F9CA57D5E45B8958BD509BFFEF48AC -IV=89C1D565569A12A68B2E808AB5CFA2E3 -PT=5CEBBA4AF3FD3F5A1242D2B3685D7C99 -CT=EC8EEAED7894646B1D1A5E058ED41178 - -I=361 -KEY=1DE05811428569D3F89CF1C01AF434AFCB7720BAAD703FE245A70E9E713B59D4 -IV=EC8EEAED7894646B1D1A5E058ED41178 -PT=2FA58FD0B7D273C0D17D43F0257E5C32 -CT=92802F392579C66AD72D2E85776720E8 - -I=362 -KEY=0A8FB6D844AB0B73C05A121085E07FFE59F70F838809F988928A201B065C793C -IV=92802F392579C66AD72D2E85776720E8 -PT=176FEEC9062E62A038C6E3D09F144B51 -CT=461DBCF9894F5319FE772F6529FBCEC0 - -I=363 -KEY=4E6818B3BBEF69FA7ABEC1EBE2E54CDC1FEAB37A0146AA916CFD0F7E2FA7B7FC -IV=461DBCF9894F5319FE772F6529FBCEC0 -PT=44E7AE6BFF446289BAE4D3FB67053322 -CT=794CA9DC41BAE95D415A6D1119582763 - -I=364 -KEY=4A1EABB13924B188441724141F1C88A966A61AA640FC43CC2DA7626F36FF909F -IV=794CA9DC41BAE95D415A6D1119582763 -PT=0476B30282CBD8723EA9E5FFFDF9C475 -CT=B761EAF5CC07651BD33D8BF93913EAE8 - -I=365 -KEY=FFE4E48F8D96710A1BE7DBE36F4905CDD1C7F0538CFB26D7FE9AE9960FEC7A77 -IV=B761EAF5CC07651BD33D8BF93913EAE8 -PT=B5FA4F3EB4B2C0825FF0FFF770558D64 -CT=0B5146EB77161E60D6D1E2FAEAE80694 - -I=366 -KEY=7A4F383AF4BB2DC6588E75EE82C7D9CFDA96B6B8FBED38B7284B0B6CE5047CE3 -IV=0B5146EB77161E60D6D1E2FAEAE80694 -PT=85ABDCB5792D5CCC4369AE0DED8EDC02 -CT=07635064CE85F6AE17961AF1F2B44469 - -I=367 -KEY=EFFE7F8BBBEC8BEC83FA199102763BEDDDF5E6DC3568CE193FDD119D17B0388A -IV=07635064CE85F6AE17961AF1F2B44469 -PT=95B147B14F57A62ADB746C7F80B1E222 -CT=3A9CD5F30C421FF333BA2C2F0A7AD07D - -I=368 -KEY=1DF51B7A35E11E2AF79E8C59094A1ECFE769332F392AD1EA0C673DB21DCAE8F7 -IV=3A9CD5F30C421FF333BA2C2F0A7AD07D -PT=F20B64F18E0D95C6746495C80B3C2522 -CT=F60032C249CF561CB02421DA189A57D1 - -I=369 -KEY=CC09FFE72A10AE27FE14934A6628AB83116901ED70E587F6BC431C680550BF26 -IV=F60032C249CF561CB02421DA189A57D1 -PT=D1FCE49D1FF1B00D098A1F136F62B54C -CT=EAD5844B160C08F9CDAA15FD5936EF26 - -I=370 -KEY=09C84CA0DA0B9FD79D3090E690BAB419FBBC85A666E98F0F71E909955C665000 -IV=EAD5844B160C08F9CDAA15FD5936EF26 -PT=C5C1B347F01B31F0632403ACF6921F9A -CT=26AD72F011133FD4CED8F38A1ABE7D73 - -I=371 -KEY=74FA53C172A2003EC5933F486FCC7BBFDD11F75677FAB0DBBF31FA1F46D82D73 -IV=26AD72F011133FD4CED8F38A1ABE7D73 -PT=7D321F61A8A99FE958A3AFAEFF76CFA6 -CT=F115FBC0D3F386527176D1DF6AD4B38A - -I=372 -KEY=0E5BA209B7BC28D184E73BD37F35C1312C040C96A4093689CE472BC02C0C9EF9 -IV=F115FBC0D3F386527176D1DF6AD4B38A -PT=7AA1F1C8C51E28EF4174049B10F9BA8E -CT=27ED0BA04734E70317BF58E11B0DD051 - -I=373 -KEY=9404D9139B6597D1F7C7519713C6CBC80BE90736E33DD18AD9F8732137014EA8 -IV=27ED0BA04734E70317BF58E11B0DD051 -PT=9A5F7B1A2CD9BF0073206A446CF30AF9 -CT=24080A577426F8F270A13F3A5F3DB546 - -I=374 -KEY=E72476BC679C8DCBAB92BBA5D48BF6D32FE10D61971B2978A9594C1B683CFBEE -IV=24080A577426F8F270A13F3A5F3DB546 -PT=7320AFAFFCF91A1A5C55EA32C74D3D1B -CT=A754CC0464E35B387435790505F2DCE5 - -I=375 -KEY=4548DE389CCAD4A65B02A9B5FE90930188B5C165F3F87240DD6C351E6DCE270B -IV=A754CC0464E35B387435790505F2DCE5 -PT=A26CA884FB56596DF09012102A1B65D2 -CT=D9AED2566884E97D081EADB45780AA7D - -I=376 -KEY=2E54365B503140D0EC9074DFA05F4B2C511B13339B7C9B3DD57298AA3A4E8D76 -IV=D9AED2566884E97D081EADB45780AA7D -PT=6B1CE863CCFB9476B792DD6A5ECFD82D -CT=9FA221E082CAD838AB4B210A8794BD8F - -I=377 -KEY=7C9FB092B8A96465076E14C575E9A8F0CEB932D319B643057E39B9A0BDDA30F9 -IV=9FA221E082CAD838AB4B210A8794BD8F -PT=52CB86C9E89824B5EBFE601AD5B6E3DC -CT=AAEA6DE5734CF14BED503512EB071C2A - -I=378 -KEY=90AB85A18F2B0255D4F43AF5E98DAA7E64535F366AFAB24E93698CB256DD2CD3 -IV=AAEA6DE5734CF14BED503512EB071C2A -PT=EC34353337826630D39A2E309C64028E -CT=1359A157B415EB63E038AB7354E6B0F2 - -I=379 -KEY=9135D4D54A1CE6BBF4F23AFDE23F537C770AFE61DEEF592D735127C1023B9C21 -IV=1359A157B415EB63E038AB7354E6B0F2 -PT=019E5174C537E4EE200600080BB2F902 -CT=0764EBDBFAE8FD447244408A5153CC3B - -I=380 -KEY=4B5F1BC60EF5DCE83474A3970EB2ABA8706E15BA2407A4690115674B5368501A -IV=0764EBDBFAE8FD447244408A5153CC3B -PT=DA6ACF1344E93A53C086996AEC8DF8D4 -CT=A31F69E0055E8D4162AC06C088925FBA - -I=381 -KEY=9DD8E8D75BE2E4D1BC70B30DAE0B375FD3717C5A2159292863B9618BDBFA0FA0 -IV=A31F69E0055E8D4162AC06C088925FBA -PT=D687F311551738398804109AA0B99CF7 -CT=EB84AC035534CDF1698E660F529E0EC7 - -I=382 -KEY=4A2B2FC8446B4C2575CFE584A490680238F5D059746DE4D90A37078489640167 -IV=EB84AC035534CDF1698E660F529E0EC7 -PT=D7F3C71F1F89A8F4C9BF56890A9B5F5D -CT=9236D37A28C2CF29237127173B93C5D5 - -I=383 -KEY=9BE42576823EEAADB34657A5CBB44B21AAC303235CAF2BF029462093B2F7C4B2 -IV=9236D37A28C2CF29237127173B93C5D5 -PT=D1CF0ABEC655A688C689B2216F242323 -CT=86C122CFA62B1356FEE33FECF598ACC9 - -I=384 -KEY=5DFC1838B052E95A948D0AC31736CBE62C0221ECFA8438A6D7A51F7F476F687B -IV=86C122CFA62B1356FEE33FECF598ACC9 -PT=C6183D4E326C03F727CB5D66DC8280C7 -CT=8A9926125B1CA354B1D7A9FED0850FEE - -I=385 -KEY=2B12FA914EE7674EADED81C47A67A1B4A69B07FEA1989BF26672B68197EA6795 -IV=8A9926125B1CA354B1D7A9FED0850FEE -PT=76EEE2A9FEB58E1439608B076D516A52 -CT=AD99A2A427BFF7A17C375DB38764EBFC - -I=386 -KEY=10607DE088CB92382089EF99B7C054280B02A55A86276C531A45EB32108E8C69 -IV=AD99A2A427BFF7A17C375DB38764EBFC -PT=3B728771C62CF5768D646E5DCDA7F59C -CT=0E141FD7D6928E7B7885638B6334947C - -I=387 -KEY=605ECCB38F9FFD9DAB2DB523313FFADB0516BA8D50B5E22862C088B973BA1815 -IV=0E141FD7D6928E7B7885638B6334947C -PT=703EB15307546FA58BA45ABA86FFAEF3 -CT=996CB8723B08B99A4959072DC8A73292 - -I=388 -KEY=C6371257BDA461F3A4D2F1ED5DD4B0B69C7A02FF6BBD5BB22B998F94BB1D2A87 -IV=996CB8723B08B99A4959072DC8A73292 -PT=A669DEE4323B9C6E0FFF44CE6CEB4A6D -CT=72966BAA5E4D7FA9129088F2C072E301 - -I=389 -KEY=DDD8877C25005F9B8336823CBF4D4B1DEEEC695535F0241B390907667B6FC986 -IV=72966BAA5E4D7FA9129088F2C072E301 -PT=1BEF952B98A43E6827E473D1E299FBAB -CT=32C321C999A2D68EA4517D332C785FC4 - -I=390 -KEY=00882DCBC6CFDED1A2ED7D9892F494A5DC2F489CAC52F2959D587A5557179642 -IV=32C321C999A2D68EA4517D332C785FC4 -PT=DD50AAB7E3CF814A21DBFFA42DB9DFB8 -CT=391D95DD63982E0A9AF3980A234DB5B9 - -I=391 -KEY=234B9097BD6519EFE106103720AC937DE532DD41CFCADC9F07ABE25F745A23FB -IV=391D95DD63982E0A9AF3980A234DB5B9 -PT=23C3BD5C7BAAC73E43EB6DAFB25807D8 -CT=D3A279EE1BABABA71DB01DC35EBA879D - -I=392 -KEY=AFF7D52D959CC7E41F1F3FF3CA2425053690A4AFD46177381A1BFF9C2AE0A466 -IV=D3A279EE1BABABA71DB01DC35EBA879D -PT=8CBC45BA28F9DE0BFE192FC4EA88B678 -CT=B4696871EE3A9D035BC32308DA5A5DA7 - -I=393 -KEY=B557440CEEB6E4EF54F6CD1B222246AC82F9CCDE3A5BEA3B41D8DC94F0BAF9C1 -IV=B4696871EE3A9D035BC32308DA5A5DA7 -PT=1AA091217B2A230B4BE9F2E8E80663A9 -CT=C5047AFD7884E0124928229AA6E72F67 - -I=394 -KEY=BF64C071FAAD2C48CB269C03563FA06147FDB62342DF0A2908F0FE0E565DD6A6 -IV=C5047AFD7884E0124928229AA6E72F67 -PT=0A33847D141BC8A79FD05118741DE6CD -CT=240D684E6BAD3FD4E41D58DB871E93CD - -I=395 -KEY=F6945509258A1584398F5438DFD679DB63F0DE6D297235FDECEDA6D5D143456B -IV=240D684E6BAD3FD4E41D58DB871E93CD -PT=49F09578DF2739CCF2A9C83B89E9D9BA -CT=F66917F0C3C67774F9263062F918DDD5 - -I=396 -KEY=A8E48107D59287ABBA374E7CE5BC28E89599C99DEAB4428915CB96B7285B98BE -IV=F66917F0C3C67774F9263062F918DDD5 -PT=5E70D40EF018922F83B81A443A6A5133 -CT=85C42456F11D0191BC4B4DD4EA0406EE - -I=397 -KEY=E4F367569F4F9114AFE937A0190C9738105DEDCB1BA94318A980DB63C25F9E50 -IV=85C42456F11D0191BC4B4DD4EA0406EE -PT=4C17E6514ADD16BF15DE79DCFCB0BFD0 -CT=D48B6C87A25C71113947569411C2186A - -I=398 -KEY=987ED2D586DA9AB08C584BBEA0478953C4D6814CB9F5320990C78DF7D39D863A -IV=D48B6C87A25C71113947569411C2186A -PT=7C8DB58319950BA423B17C1EB94B1E6B -CT=AB6957C2F3D360593E9096F3A392A701 - -I=399 -KEY=3DF2BF13B7FF97CA13567A890E11C9796FBFD68E4A265250AE571B04700F213B -IV=AB6957C2F3D360593E9096F3A392A701 -PT=A58C6DC631250D7A9F0E3137AE56402A -CT=C0FEFFF07506A0B4CD7B8B0CF25D3664 - + +========================= + +FILENAME: "cbc_e_m.txt" + +Cipher Block Chaining (CBC) Mode - ENCRYPTION +Monte Carlo Test + +Algorithm Name: Rijndael +Principal Submitter: Joan Daemen + +========== + +KEYSIZE=128 + +I=0 +KEY=00000000000000000000000000000000 +IV=00000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=8A05FC5E095AF4848A08D328D3688E3D + +I=1 +KEY=8A05FC5E095AF4848A08D328D3688E3D +IV=8A05FC5E095AF4848A08D328D3688E3D +PT=204F17E2444381F6114FF53934C0BCD3 +CT=192D9B3AA10BB2F7846CCBA0085C657A + +I=2 +KEY=93286764A85146730E641888DB34EB47 +IV=192D9B3AA10BB2F7846CCBA0085C657A +PT=983BF6F5A6DFBCDAA19370666E83A99A +CT=40D8DAF6D1FDA0A073B3BD18B7695D2E + +I=3 +KEY=D3F0BD9279ACE6D37DD7A5906C5DB669 +IV=40D8DAF6D1FDA0A073B3BD18B7695D2E +PT=C48CD503A21C8AD0B2483EF15F79571D +CT=3EDBE80D69A1D2248CA55FC17C4EF3C5 + +I=4 +KEY=ED2B559F100D34F7F172FA51101345AC +IV=3EDBE80D69A1D2248CA55FC17C4EF3C5 +PT=6A49A07B90CE830C20BC239646D936C0 +CT=D87891CF573C99EAE4349A70CA099415 + +I=5 +KEY=3553C4504731AD1D15466021DA1AD1B9 +IV=D87891CF573C99EAE4349A70CA099415 +PT=0ACB9A969946F523317BB932CE1561A4 +CT=24E8F1013F479BBE655DF088C9316BC7 + +I=6 +KEY=11BB3551787636A3701B90A9132BBA7E +IV=24E8F1013F479BBE655DF088C9316BC7 +PT=3DFC8683C1D626A26E2513EB747E8B0F +CT=2C92E80D8D1F70B411C28BD9FDABF21D + +I=7 +KEY=3D29DD5CF569461761D91B70EE804863 +IV=2C92E80D8D1F70B411C28BD9FDABF21D +PT=FAE2D6A36DBD17199F257643C89EB608 +CT=A61810A2798A70A9D2B37E88DEF9AE0F + +I=8 +KEY=9B31CDFE8CE336BEB36A65F83079E66C +IV=A61810A2798A70A9D2B37E88DEF9AE0F +PT=CB97F090318A6B10F5044EB8333ECDD6 +CT=0034FA480DE6F65D98D30B026118718F + +I=9 +KEY=9B0537B68105C0E32BB96EFA516197E3 +IV=0034FA480DE6F65D98D30B026118718F +PT=1B8030AC682BA677A7A3ACDC7FB33BB6 +CT=BEA24548CBC4A6630C9F1251F2C3DC51 + +I=10 +KEY=25A772FE4AC1668027267CABA3A24BB2 +IV=BEA24548CBC4A6630C9F1251F2C3DC51 +PT=D0524282C9AC395508CB2991822E8F42 +CT=4F278DD0B06CBFBAA928635E7CA81B68 + +I=11 +KEY=6A80FF2EFAADD93A8E0E1FF5DF0A50DA +IV=4F278DD0B06CBFBAA928635E7CA81B68 +PT=49EA900E2F61DF8CDEA7D479F59C4C30 +CT=EDFF930BB183F8DAC2FC0BD01AD65882 + +I=12 +KEY=877F6C254B2E21E04CF21425C5DC0858 +IV=EDFF930BB183F8DAC2FC0BD01AD65882 +PT=A1BBEB4E44EF725497B8C589192CC900 +CT=A6FE530E9509D48BAF30F601D04DB19D + +I=13 +KEY=21813F2BDE27F56BE3C2E2241591B9C5 +IV=A6FE530E9509D48BAF30F601D04DB19D +PT=4AD71402771A83F41F7E3AC004150CB7 +CT=FF1148A2E07401F7291B418D62618B65 + +I=14 +KEY=DE9077893E53F49CCAD9A3A977F032A0 +IV=FF1148A2E07401F7291B418D62618B65 +PT=AC47A1FD3490D6E809D40D4BEB8FF639 +CT=4420D4686F7A4D77A72810E89A5E0DF1 + +I=15 +KEY=9AB0A3E15129B9EB6DF1B341EDAE3F51 +IV=4420D4686F7A4D77A72810E89A5E0DF1 +PT=F22E1865DD87A88238173FC693C382E7 +CT=A4C7DE5DF9E2B6A20A1E22F8D7496ACD + +I=16 +KEY=3E777DBCA8CB0F4967EF91B93AE7559C +IV=A4C7DE5DF9E2B6A20A1E22F8D7496ACD +PT=929EFB34B1C552221B648A3D2C678EC9 +CT=D93DBCCA25FA4D9D8C37B3F107FCFA3C + +I=17 +KEY=E74AC1768D3142D4EBD822483D1BAFA0 +IV=D93DBCCA25FA4D9D8C37B3F107FCFA3C +PT=771C61ABB1E9BAB6F678336C8193307E +CT=75F491C2EA85184ACA3C96B769FA9698 + +I=18 +KEY=92BE50B467B45A9E21E4B4FF54E13938 +IV=75F491C2EA85184ACA3C96B769FA9698 +PT=55E42F98CCED821FE211D29674E77F48 +CT=A9C7536B77265ECBF7AC5ECD1EF5DDE2 + +I=19 +KEY=3B7903DF10920455D648EA324A14E4DA +IV=A9C7536B77265ECBF7AC5ECD1EF5DDE2 +PT=56BC0FA54F6F1E04A9A8893D3964EA68 +CT=3C749BF7EFA55CE924D1B33291C2B586 + +I=20 +KEY=070D9828FF3758BCF2995900DBD6515C +IV=3C749BF7EFA55CE924D1B33291C2B586 +PT=45D9BBBB1F3BB33EE182F09C90B1661C +CT=C4708DBAEBD202CDD2054DDCB1AF7BAB + +I=21 +KEY=C37D159214E55A71209C14DC6A792AF7 +IV=C4708DBAEBD202CDD2054DDCB1AF7BAB +PT=37765B154264AD781BBE5F5717DE7038 +CT=87457FD2EE747645576A27F46B00EC30 + +I=22 +KEY=44386A40FA912C3477F633280179C6C7 +IV=87457FD2EE747645576A27F46B00EC30 +PT=A7150BBC7BE3837E145AB83E554B49DE +CT=E25743DAD8E627803DA6C5E587C82384 + +I=23 +KEY=A66F299A22770BB44A50F6CD86B1E543 +IV=E25743DAD8E627803DA6C5E587C82384 +PT=173343A8488146FC9E4B59C2DF42BAF3 +CT=0D0A78CD5E3EB40F92FB55351122E92B + +I=24 +KEY=AB6551577C49BFBBD8ABA3F897930C68 +IV=0D0A78CD5E3EB40F92FB55351122E92B +PT=3B68CFE78B5DEA8F5165A2034D8C2823 +CT=1921B523A2F9B5F53C740D451C9FCE0C + +I=25 +KEY=B244E474DEB00A4EE4DFAEBD8B0CC264 +IV=1921B523A2F9B5F53C740D451C9FCE0C +PT=FDDD484B52C7F3A32F4514BEF5A646E3 +CT=6EAC2BB6EDF35C1267FF4F10700F3CD7 + +I=26 +KEY=DCE8CFC23343565C8320E1ADFB03FEB3 +IV=6EAC2BB6EDF35C1267FF4F10700F3CD7 +PT=CDAD592E5467AD1FA1B71D8AC050FCE0 +CT=D9624E40A8C9A2C58ABEDBAEB865DC1F + +I=27 +KEY=058A81829B8AF499099E3A03436622AC +IV=D9624E40A8C9A2C58ABEDBAEB865DC1F +PT=F9E90A4D7A9EF66818004CBC47C8C6EA +CT=DE15C7322B32738BB493E7FA27AFE6E2 + +I=28 +KEY=DB9F46B0B0B88712BD0DDDF964C9C44E +IV=DE15C7322B32738BB493E7FA27AFE6E2 +PT=FE3CC4AE4A13AC8946407CEEE220290B +CT=5822C79D627AD8A0C4975873D62C5E11 + +I=29 +KEY=83BD812DD2C25FB2799A858AB2E59A5F +IV=5822C79D627AD8A0C4975873D62C5E11 +PT=A5106EBD8888CC3A6884AC8E8EA9C97A +CT=F5AD0473A4228662D9F76E7A5ED4DBDD + +I=30 +KEY=7610855E76E0D9D0A06DEBF0EC314182 +IV=F5AD0473A4228662D9F76E7A5ED4DBDD +PT=4F30B073FB95CD0F0317E749F20E7A7D +CT=4B39DA1FA331CFEB1D6713054C6E9474 + +I=31 +KEY=3D295F41D5D1163BBD0AF8F5A05FD5F6 +IV=4B39DA1FA331CFEB1D6713054C6E9474 +PT=4850735E17F01A3B131E1B78B3A6EB96 +CT=32D1BE8640859CFAB16D64CE8795729B + +I=32 +KEY=0FF8E1C795548AC10C679C3B27CAA76D +IV=32D1BE8640859CFAB16D64CE8795729B +PT=A8C4B9E0069935CB046ACBB49C0B1205 +CT=47DC1150929AA9610938CB0CFE92995E + +I=33 +KEY=4824F09707CE23A0055F5737D9583E33 +IV=47DC1150929AA9610938CB0CFE92995E +PT=13F5DA56D399A7DAA004D0BE76845E68 +CT=BCA6BD8971837B8A81B923E5B2ED0D83 + +I=34 +KEY=F4824D1E764D582A84E674D26BB533B0 +IV=BCA6BD8971837B8A81B923E5B2ED0D83 +PT=8397C79E02FDFE6B7D47FA0181EA453A +CT=23D991B7DA5E96966830E7B40B5A2D8A + +I=35 +KEY=D75BDCA9AC13CEBCECD6936660EF1E3A +IV=23D991B7DA5E96966830E7B40B5A2D8A +PT=18987E5504E23C0F862BCA8DFFC2B07F +CT=17AA31C49F584DEF77C8E7891B11652B + +I=36 +KEY=C0F1ED6D334B83539B1E74EF7BFE7B11 +IV=17AA31C49F584DEF77C8E7891B11652B +PT=A34D44CC1C6E171D7D48447F87E2F2C1 +CT=DD1F90F66D4062E6823F0F229562D110 + +I=37 +KEY=1DEE7D9B5E0BE1B519217BCDEE9CAA01 +IV=DD1F90F66D4062E6823F0F229562D110 +PT=C9793582E22B8840BBAA3D7669208CCC +CT=8F5B876777F7CA903B1D6346AA8BDAE7 + +I=38 +KEY=92B5FAFC29FC2B25223C188B441770E6 +IV=8F5B876777F7CA903B1D6346AA8BDAE7 +PT=730EACFEE3817A94B88117ABB3F9CDE4 +CT=388780BA989C0A8BB5BD9E4086D91EF7 + +I=39 +KEY=AA327A46B16021AE978186CBC2CE6E11 +IV=388780BA989C0A8BB5BD9E4086D91EF7 +PT=F004D3A14C6C94FA2D39BE0C71119658 +CT=7F4C33E4F5C055C05DB4B7691061B307 + +I=40 +KEY=D57E49A244A0746ECA3531A2D2AFDD16 +IV=7F4C33E4F5C055C05DB4B7691061B307 +PT=575F86A5D1637CB86449F8BC0F1573D3 +CT=F6FE1919F174065AB31AC43E0D733A81 + +I=41 +KEY=238050BBB5D47234792FF59CDFDCE797 +IV=F6FE1919F174065AB31AC43E0D733A81 +PT=14F8E2DB61B05E094CA4C0E9DA7800EE +CT=4CB876F2DC169F955E639C6C916340A6 + +I=42 +KEY=6F38264969C2EDA1274C69F04EBFA731 +IV=4CB876F2DC169F955E639C6C916340A6 +PT=F88BA2E4AA4ABDD381778DFD1DA1856F +CT=AEEB80B469D89E45BC3426B6CCC50440 + +I=43 +KEY=C1D3A6FD001A73E49B784F46827AA371 +IV=AEEB80B469D89E45BC3426B6CCC50440 +PT=195F74019B65C0F7D724491BDE8C8B88 +CT=2FD7CCDBDB2B2037C104F0A707A11EDA + +I=44 +KEY=EE046A26DB3153D35A7CBFE185DBBDAB +IV=2FD7CCDBDB2B2037C104F0A707A11EDA +PT=FF51887AB5FEC9C97CB61BB2DE9CDBC6 +CT=8DF7BB99B781C63F4F8B2A7D5DFF2960 + +I=45 +KEY=63F3D1BF6CB095EC15F7959CD82494CB +IV=8DF7BB99B781C63F4F8B2A7D5DFF2960 +PT=A35AAB0055E99FA980D59B242B8C6257 +CT=7D96ECC20571E9E85C16E3BDADA374CA + +I=46 +KEY=1E653D7D69C17C0449E176217587E001 +IV=7D96ECC20571E9E85C16E3BDADA374CA +PT=02CC392194874CD531025588C96E2D22 +CT=AA1DC2E69CE582DFA9A1B435854FCBB1 + +I=47 +KEY=B478FF9BF524FEDBE040C214F0C82BB0 +IV=AA1DC2E69CE582DFA9A1B435854FCBB1 +PT=94CC5DB118EF53C904B0EEC23AC650FD +CT=DA0CA33BCCE4ABA1936833127D1F5E25 + +I=48 +KEY=6E745CA039C0557A7328F1068DD77595 +IV=DA0CA33BCCE4ABA1936833127D1F5E25 +PT=52F009E929526E923BE4F43B66876725 +CT=B5E80FF4DADD69BB7493B9F72A752811 + +I=49 +KEY=DB9C5354E31D3CC107BB48F1A7A25D84 +IV=B5E80FF4DADD69BB7493B9F72A752811 +PT=6B88B42E99E5B4F838064A711B71DE1F +CT=5CDDCE45516C6D1654647A1A541AC435 + +I=50 +KEY=87419D11B27151D753DF32EBF3B899B1 +IV=5CDDCE45516C6D1654647A1A541AC435 +PT=9E25CBDD8E2D7D68FF72932E35879175 +CT=3C7E88A9A6462D08ADA5910A3FCE611A + +I=51 +KEY=BB3F15B814377CDFFE7AA3E1CC76F8AB +IV=3C7E88A9A6462D08ADA5910A3FCE611A +PT=72A4EF1D82A3AC5C1DFDF8C4DCFB9F6E +CT=E428200E1C3BE9A5141F73590B7473B8 + +I=52 +KEY=5F1735B6080C957AEA65D0B8C7028B13 +IV=E428200E1C3BE9A5141F73590B7473B8 +PT=7CD8053F2FD743A44CC39F75C1E81075 +CT=AB3B8A79653E884053AFC8C14504AF77 + +I=53 +KEY=F42CBFCF6D321D3AB9CA187982062464 +IV=AB3B8A79653E884053AFC8C14504AF77 +PT=0731077A8B6854CB90AFFAE3A3B199C4 +CT=53B7DFD6D12DDE7966C62FCC1946A4AC + +I=54 +KEY=A79B6019BC1FC343DF0C37B59B4080C8 +IV=53B7DFD6D12DDE7966C62FCC1946A4AC +PT=E4E26CA1DA697F30E0542763313A79B7 +CT=6DEC201BBB90B66A3B2DFF4FA1DDF7C4 + +I=55 +KEY=CA774002078F7529E421C8FA3A9D770C +IV=6DEC201BBB90B66A3B2DFF4FA1DDF7C4 +PT=C2CF11681C4767A78B2F95AFB50CF155 +CT=F535B7CD4135A39E0E344BD2CFA14B83 + +I=56 +KEY=3F42F7CF46BAD6B7EA158328F53C3C8F +IV=F535B7CD4135A39E0E344BD2CFA14B83 +PT=606618948C1ED454B9B0F92435381D2D +CT=209AC483682C48AA197BB64417127656 + +I=57 +KEY=1FD8334C2E969E1DF36E356CE22E4AD9 +IV=209AC483682C48AA197BB64417127656 +PT=8F8A70AADF2F8BFB5E137F86AC83D32F +CT=76F5F43A888D7F22D698A73810ED5B15 + +I=58 +KEY=692DC776A61BE13F25F69254F2C311CC +IV=76F5F43A888D7F22D698A73810ED5B15 +PT=E9E8AEBF16A5F4E1C26B4A385163E844 +CT=625C62F33C9548F2651FB0A08BF45286 + +I=59 +KEY=0B71A5859A8EA9CD40E922F47937434A +IV=625C62F33C9548F2651FB0A08BF45286 +PT=C69CFD36C50EBA06E3B3C4AB7C9B694E +CT=3931CE6DF783063F26920D4048B00C82 + +I=60 +KEY=32406BE86D0DAFF2667B2FB431874FC8 +IV=3931CE6DF783063F26920D4048B00C82 +PT=5DFE322DD692BA8DD9CD328A5AF9A3B7 +CT=A3CA3ECE725C84281144052A80EA5176 + +I=61 +KEY=918A55261F512BDA773F2A9EB16D1EBE +IV=A3CA3ECE725C84281144052A80EA5176 +PT=4BBD16BF74226F816767A7207C672C9A +CT=94552690A231354F8F9BEF295E55F142 + +I=62 +KEY=05DF73B6BD601E95F8A4C5B7EF38EFFC +IV=94552690A231354F8F9BEF295E55F142 +PT=7055D0C535B2B0501FF6AAEE46E03818 +CT=771908987F00C2D822897E7EEA148F29 + +I=63 +KEY=72C67B2EC260DC4DDA2DBBC9052C60D5 +IV=771908987F00C2D822897E7EEA148F29 +PT=7336B9D4977BDDA811C0C5EBEA539574 +CT=7AA84598115B181863081AFCC239EDD2 + +I=64 +KEY=086E3EB6D33BC455B925A135C7158D07 +IV=7AA84598115B181863081AFCC239EDD2 +PT=5296C8546532BAEACBEC9F29916FB6B2 +CT=3D95967035AF639B2D2814DEB9B7F86A + +I=65 +KEY=35FBA8C6E694A7CE940DB5EB7EA2756D +IV=3D95967035AF639B2D2814DEB9B7F86A +PT=430880F5576C7783BC1336F900DDD037 +CT=4D70AAD2FC9EF403B463A72DB4CFE640 + +I=66 +KEY=788B02141A0A53CD206E12C6CA6D932D +IV=4D70AAD2FC9EF403B463A72DB4CFE640 +PT=E489B93778DE0C42FEFB6122ECA46BDC +CT=165DDB405546934E81CB6B0B89B4A40E + +I=67 +KEY=6ED6D9544F4CC083A1A579CD43D93723 +IV=165DDB405546934E81CB6B0B89B4A40E +PT=8E5481ACD58BFC5D141C1F71CDE91E37 +CT=693775A3661CE9D0E4CB4888431C64A5 + +I=68 +KEY=07E1ACF729502953456E314500C55386 +IV=693775A3661CE9D0E4CB4888431C64A5 +PT=4AAA5E507EFB9FAD15E5F4C77F46AF89 +CT=C42391D50B1210C67B6AD642745A4DAC + +I=69 +KEY=C3C23D22224239953E04E707749F1E2A +IV=C42391D50B1210C67B6AD642745A4DAC +PT=4E0748F8716801B099494037485B8BA4 +CT=A4CB7F010AC42B4C3C14F02353F3644A + +I=70 +KEY=67094223288612D902101724276C7A60 +IV=A4CB7F010AC42B4C3C14F02353F3644A +PT=0B7B41D57885DB37A2FC355C8D03FF3C +CT=1BB0CBD24537B36EB555BE8C0FEC3A1F + +I=71 +KEY=7CB989F16DB1A1B7B745A9A82880407F +IV=1BB0CBD24537B36EB555BE8C0FEC3A1F +PT=4696F9A564354194142AB7B8630B4279 +CT=18B10BAE39D4FA58F586A067A8E38BC5 + +I=72 +KEY=6408825F54655BEF42C309CF8063CBBA +IV=18B10BAE39D4FA58F586A067A8E38BC5 +PT=0B59EBABAB994F2DDB3DE383454BECE8 +CT=C09C6670B93ECD303BA53DE58DD81A64 + +I=73 +KEY=A494E42FED5B96DF7966342A0DBBD1DE +IV=C09C6670B93ECD303BA53DE58DD81A64 +PT=2F897F3385E71133CEC8367411E830A3 +CT=45EA7CB9119DF7367294F9FE36D4A09F + +I=74 +KEY=E17E9896FCC661E90BF2CDD43B6F7141 +IV=45EA7CB9119DF7367294F9FE36D4A09F +PT=8CDE9D975B51A098F4CAC93DC58C002F +CT=02DDD735439A8AE03E976E629A6C992C + +I=75 +KEY=E3A34FA3BF5CEB093565A3B6A103E86D +IV=02DDD735439A8AE03E976E629A6C992C +PT=1E20571F82C2C6884A6F90A23FD3A925 +CT=B040686B866AE80A88B899031F2F0EE4 + +I=76 +KEY=53E327C839360303BDDD3AB5BE2CE689 +IV=B040686B866AE80A88B899031F2F0EE4 +PT=0851624711970ADE2F456D5DAFB17E05 +CT=201756BC061706513264A3C489D95A0C + +I=77 +KEY=73F471743F2105528FB9997137F5BC85 +IV=201756BC061706513264A3C489D95A0C +PT=E8B1410DE742136E71F54D31FEAA72EB +CT=2EF27C31AA488648FCE0F1804D658092 + +I=78 +KEY=5D060D459569831A735968F17A903C17 +IV=2EF27C31AA488648FCE0F1804D658092 +PT=97E0CA84C9B22C8942C7FC5088EAED04 +CT=7545F1D9C8F5F8B441EDCDAF00462344 + +I=79 +KEY=2843FC9C5D9C7BAE32B4A55E7AD61F53 +IV=7545F1D9C8F5F8B441EDCDAF00462344 +PT=7B5572C09E998656B55C53748CF77C21 +CT=347875EFD6BD978CD1B2EA949F7E2358 + +I=80 +KEY=1C3B89738B21EC22E3064FCAE5A83C0B +IV=347875EFD6BD978CD1B2EA949F7E2358 +PT=A30001AA29D70B0A141B8FC8B9B2E210 +CT=9C956408BA335CCC9F02F31CC45FD5E6 + +I=81 +KEY=80AEED7B3112B0EE7C04BCD621F7E9ED +IV=9C956408BA335CCC9F02F31CC45FD5E6 +PT=839783D75859393B215010F63159FA45 +CT=B70E700F4A7ED08618754960B83BD0F2 + +I=82 +KEY=37A09D747B6C60686471F5B699CC391F +IV=B70E700F4A7ED08618754960B83BD0F2 +PT=1E3C630BC8C34BF8822686043D14E4D6 +CT=4721B6796F82D47D6EEB9CB11A19605E + +I=83 +KEY=70812B0D14EEB4150A9A690783D55941 +IV=4721B6796F82D47D6EEB9CB11A19605E +PT=CEE1B977E8B75623CC4E2C4F4765FE2A +CT=3382E1B076680BBBE7C451582016DD11 + +I=84 +KEY=4303CABD6286BFAEED5E385FA3C38450 +IV=3382E1B076680BBBE7C451582016DD11 +PT=02365457AB60C892A0C34A7067AB7608 +CT=AB581732E06B90AA0C835C1C7B6D18B5 + +I=85 +KEY=E85BDD8F82ED2F04E1DD6443D8AE9CE5 +IV=AB581732E06B90AA0C835C1C7B6D18B5 +PT=222B7ED84C648C12FFDD6E8E13EEC651 +CT=3E2E592CEEAD3B5E16860E80E406E882 + +I=86 +KEY=D67584A36C40145AF75B6AC33CA87467 +IV=3E2E592CEEAD3B5E16860E80E406E882 +PT=7D24BD646EEBA44ED27B11DA42D72FF8 +CT=9163F6DBE0D8BB79A154D92E37A07E1C + +I=87 +KEY=471672788C98AF23560FB3ED0B080A7B +IV=9163F6DBE0D8BB79A154D92E37A07E1C +PT=42B571FFB3275F5A8E26616A3F0E3403 +CT=E1340E61513FE8146F29E111392E2C3A + +I=88 +KEY=A6227C19DDA74737392652FC32262641 +IV=E1340E61513FE8146F29E111392E2C3A +PT=6EFD16D48E03B6E1CD74777ABC891DA8 +CT=3D703B4FD8A8A7F015D0FD47DE0C5A28 + +I=89 +KEY=9B524756050FE0C72CF6AFBBEC2A7C69 +IV=3D703B4FD8A8A7F015D0FD47DE0C5A28 +PT=7956129687AC95397E14821A17F267DE +CT=C5C6D2BAABDBE0B82CDFFFE7A92C8344 + +I=90 +KEY=5E9495ECAED4007F0029505C4506FF2D +IV=C5C6D2BAABDBE0B82CDFFFE7A92C8344 +PT=AC661770332FE0A45B80791C3A5D1241 +CT=6F7BDE1BD17C5B10064B52EB54EE90B0 + +I=91 +KEY=31EF4BF77FA85B6F066202B711E86F9D +IV=6F7BDE1BD17C5B10064B52EB54EE90B0 +PT=1DE0702C81667A979E5E3542DA95C5AD +CT=DC7E35D5B02AFF4B92C190265E01C0F8 + +I=92 +KEY=ED917E22CF82A42494A392914FE9AF65 +IV=DC7E35D5B02AFF4B92C190265E01C0F8 +PT=A491CB4321C757FD353B560C0B3EA4D0 +CT=D753F5A6C5D7E17F4024FD8675B23E7F + +I=93 +KEY=3AC28B840A55455BD4876F173A5B911A +IV=D753F5A6C5D7E17F4024FD8675B23E7F +PT=418FA3B3E9B4E463D04AC3A3361DCA57 +CT=B635529E8080B33E9AD6D79B8203112D + +I=94 +KEY=8CF7D91A8AD5F6654E51B88CB8588037 +IV=B635529E8080B33E9AD6D79B8203112D +PT=C87E4ED505989807D1DBDA4769804EA3 +CT=43E763CD1B9EE4BC474B79C1E0DA2564 + +I=95 +KEY=CF10BAD7914B12D9091AC14D5882A553 +IV=43E763CD1B9EE4BC474B79C1E0DA2564 +PT=042F084454D0EE01AB00D3921E1BCA06 +CT=C799956FF8A7A05B71123EBC4AA09C0C + +I=96 +KEY=08892FB869ECB2827808FFF11222395F +IV=C799956FF8A7A05B71123EBC4AA09C0C +PT=9A8E40400C51A438DCE498AD3455DE51 +CT=76679B0E26B1B6CA2A8D90944777C57F + +I=97 +KEY=7EEEB4B64F5D044852856F655555FC20 +IV=76679B0E26B1B6CA2A8D90944777C57F +PT=227E122D3AF18A3CAA973B33B3356CE7 +CT=B2F52396F02D2DFFE36C5F9238AC1EBE + +I=98 +KEY=CC1B9720BF7029B7B1E930F76DF9E29E +IV=B2F52396F02D2DFFE36C5F9238AC1EBE +PT=0D9CDD97E2FE0E78CF16B1596DC20ABA +CT=7C8EDD3A079835954238E0FE4872AAE1 + +I=99 +KEY=B0954A1AB8E81C22F3D1D009258B487F +IV=7C8EDD3A079835954238E0FE4872AAE1 +PT=925A7ECD233B3B3CCDE2221A03C5F720 +CT=D7C9FD3EF010C8577087591149D5640F + +I=100 +KEY=675CB72448F8D475835689186C5E2C70 +IV=D7C9FD3EF010C8577087591149D5640F +PT=59FEFBE5179F0E7E48F3D97CDA314FF5 +CT=2608CCE6BA917551DEF84FA7BCA9B23C + +I=101 +KEY=41547BC2F269A1245DAEC6BFD0F79E4C +IV=2608CCE6BA917551DEF84FA7BCA9B23C +PT=7F24A1BA8762294194F76322A6B28A16 +CT=EFF1513B52D5D74D2202898AC99552C4 + +I=102 +KEY=AEA52AF9A0BC76697FAC4F351962CC88 +IV=EFF1513B52D5D74D2202898AC99552C4 +PT=79B43F27F3E144C4EFBF383698A1EC90 +CT=B4B3B020D44D059666E86D22072916B5 + +I=103 +KEY=1A169AD974F173FF194422171E4BDA3D +IV=B4B3B020D44D059666E86D22072916B5 +PT=8BF20B60B4774354857BA2979CD396F9 +CT=6F1A3D43CC2171A808AE8D38396DE1D1 + +I=104 +KEY=750CA79AB8D0025711EAAF2F27263BEC +IV=6F1A3D43CC2171A808AE8D38396DE1D1 +PT=74955DDACFB8A5467D069F1EF341248B +CT=47C23A68DA351C22EBF86FDBD8F723B4 + +I=105 +KEY=32CE9DF262E51E75FA12C0F4FFD11858 +IV=47C23A68DA351C22EBF86FDBD8F723B4 +PT=25D7A186ED990020E10A23C5CFB1CEF9 +CT=D5F2E2C2CED730479D87E0AF0FEF8A73 + +I=106 +KEY=E73C7F30AC322E326795205BF03E922B +IV=D5F2E2C2CED730479D87E0AF0FEF8A73 +PT=13480F2EDCCB62B8F9A7DF98238571FC +CT=F29A46A7F1B1D1D4F5FE30E569D7A801 + +I=107 +KEY=15A639975D83FFE6926B10BE99E93A2A +IV=F29A46A7F1B1D1D4F5FE30E569D7A801 +PT=75E138123B5A98596303ACF9DAEEA714 +CT=9F6E9A13913DF78AC67BD20303AF49B5 + +I=108 +KEY=8AC8A384CCBE086C5410C2BD9A46739F +IV=9F6E9A13913DF78AC67BD20303AF49B5 +PT=DBD0AE00FD06761626366EB251412A32 +CT=46AC9F42239B22A163CE0FDEAA103D44 + +I=109 +KEY=CC643CC6EF252ACD37DECD6330564EDB +IV=46AC9F42239B22A163CE0FDEAA103D44 +PT=B8768A8AF461C9547D1F982FE90E96B6 +CT=95D7C8F969B0EEB03FEC257043597315 + +I=110 +KEY=59B3F43F8695C47D0832E813730F3DCE +IV=95D7C8F969B0EEB03FEC257043597315 +PT=3D20CC8AD484048251C7A81C7E3CA59C +CT=6B74AF42435BC640A826EC443207574E + +I=111 +KEY=32C75B7DC5CE023DA014045741086A80 +IV=6B74AF42435BC640A826EC443207574E +PT=BF719F78B23BAFD4A50634BCD9361095 +CT=31E3919F36D79FBF61884227110C10FF + +I=112 +KEY=0324CAE2F3199D82C19C467050047A7F +IV=31E3919F36D79FBF61884227110C10FF +PT=E1D32740BB8B6D67AD3038887899F090 +CT=A1CD90683CE041D6CA20780176FDD5F4 + +I=113 +KEY=A2E95A8ACFF9DC540BBC3E7126F9AF8B +IV=A1CD90683CE041D6CA20780176FDD5F4 +PT=3069EA97F092ACDCF41649377B8FCBC8 +CT=7220F866A10DC711DC1D277B4C8F204D + +I=114 +KEY=D0C9A2EC6EF41B45D7A1190A6A768FC6 +IV=7220F866A10DC711DC1D277B4C8F204D +PT=B0563A5E0EE1E2B96F3F7D04EE39EA7C +CT=CF81CA348B98C532B172F032AE0A6FED + +I=115 +KEY=1F4868D8E56CDE7766D3E938C47CE02B +IV=CF81CA348B98C532B172F032AE0A6FED +PT=B1B78BD75C30DD4E1E198ACB98B498A6 +CT=99C990D64D27D47ED0C1E7F186AC6674 + +I=116 +KEY=8681F80EA84B0A09B6120EC942D0865F +IV=99C990D64D27D47ED0C1E7F186AC6674 +PT=D413E3CC66E9938E4E0CFC1975E38C8C +CT=30C7DAD86FEF77C43A44A3EF8B116354 + +I=117 +KEY=B64622D6C7A47DCD8C56AD26C9C1E50B +IV=30C7DAD86FEF77C43A44A3EF8B116354 +PT=CD85D9334481AE85B8816233CA4AF7DB +CT=9E717B45239DD908138837154B803654 + +I=118 +KEY=28375993E439A4C59FDE9A338241D35F +IV=9E717B45239DD908138837154B803654 +PT=925BA3760D655D5B788802DDE25732BB +CT=4A6E32C01709EBCCC9BCA43FD5DFDFB3 + +I=119 +KEY=62596B53F3304F0956623E0C579E0CEC +IV=4A6E32C01709EBCCC9BCA43FD5DFDFB3 +PT=0AA6264BFCC7BD07FA8F94E1EF739633 +CT=7263392DC9DA868BC0317A6D4AD52553 + +I=120 +KEY=103A527E3AEAC982965344611D4B29BF +IV=7263392DC9DA868BC0317A6D4AD52553 +PT=FB385BD8ECE7C4DFE2351D851141888D +CT=AA49B1DDA3AF4D05D861667E88AD61AB + +I=121 +KEY=BA73E3A3994584874E32221F95E64814 +IV=AA49B1DDA3AF4D05D861667E88AD61AB +PT=510E13E20BB06EAD335F10F2C69831D3 +CT=3AC256A92F69AF35DB05DDCA61CF1EE4 + +I=122 +KEY=80B1B50AB62C2BB29537FFD5F42956F0 +IV=3AC256A92F69AF35DB05DDCA61CF1EE4 +PT=0A07CAA0EC6CB726F1A38847253BECB6 +CT=037497736381429A5E5A139C44A6C64A + +I=123 +KEY=83C52279D5AD6928CB6DEC49B08F90BA +IV=037497736381429A5E5A139C44A6C64A +PT=864FEF67C8902757E2CFB28DA2EF3C8D +CT=5393D7F9F37A5B9F1F82C1BE20435149 + +I=124 +KEY=D056F58026D732B7D4EF2DF790CCC1F3 +IV=5393D7F9F37A5B9F1F82C1BE20435149 +PT=ED2D2A671677067B30540D4C9D86905F +CT=2969AC5FB94EC76209C6DF58F6B8AA01 + +I=125 +KEY=F93F59DF9F99F5D5DD29F2AF66746BF2 +IV=2969AC5FB94EC76209C6DF58F6B8AA01 +PT=67ED14454DAD764C1772BCB1E0527954 +CT=150F94E1940F9D2ACC735F79B0912A06 + +I=126 +KEY=EC30CD3E0B9668FF115AADD6D6E541F4 +IV=150F94E1940F9D2ACC735F79B0912A06 +PT=517A4852F68370EDD879E32F52FD4D2B +CT=6EFD8E4E4C096A2033B3DA8A1F0066AF + +I=127 +KEY=82CD4370479F02DF22E9775CC9E5275B +IV=6EFD8E4E4C096A2033B3DA8A1F0066AF +PT=DBF4CAD912437115658E5BA5E1724739 +CT=899D9126CD85D2D4053AD9EE7156041B + +I=128 +KEY=0B50D2568A1AD00B27D3AEB2B8B32340 +IV=899D9126CD85D2D4053AD9EE7156041B +PT=69B302F96AFCF802AC639EBABC52ECFB +CT=819E4B8319807088FF306E125E52DAD3 + +I=129 +KEY=8ACE99D5939AA083D8E3C0A0E6E1F993 +IV=819E4B8319807088FF306E125E52DAD3 +PT=F5CA57371833F0AF98F0EC02DFE518ED +CT=4DFA3739235D14660DF7D5FDE36F6567 + +I=130 +KEY=C734AEECB0C7B4E5D514155D058E9CF4 +IV=4DFA3739235D14660DF7D5FDE36F6567 +PT=29BBD9264B9792BED8A8EFA43F943A7D +CT=4EA36ECCBCCD9FAFD8FB588BD53826A7 + +I=131 +KEY=8997C0200C0A2B4A0DEF4DD6D0B6BA53 +IV=4EA36ECCBCCD9FAFD8FB588BD53826A7 +PT=149120CFC3D7C671F287AA77A4A3EF97 +CT=0282357C78C8944A5520AF80506DE30D + +I=132 +KEY=8B15F55C74C2BF0058CFE25680DB595E +IV=0282357C78C8944A5520AF80506DE30D +PT=02C2E0CCB12F5216213D493325F38FC3 +CT=C827C36F654137A2BB127D1782285B10 + +I=133 +KEY=43323633118388A2E3DD9F4102F3024E +IV=C827C36F654137A2BB127D1782285B10 +PT=FA1693AD90401791FF9093A562EC66EB +CT=3723A94BC91032BF8DB599ABEFB784D1 + +I=134 +KEY=74119F78D893BA1D6E6806EAED44869F +IV=3723A94BC91032BF8DB599ABEFB784D1 +PT=5410CBE33ABB58AB0B0E86F5817E6F2C +CT=26A520B5B475632EE8806648BFC028AF + +I=135 +KEY=52B4BFCD6CE6D93386E860A25284AE30 +IV=26A520B5B475632EE8806648BFC028AF +PT=B01A11D200C24F4333029DE3BFF49601 +CT=36D5E00E0A53D7CE1498215AFA686905 + +I=136 +KEY=64615FC366B50EFD927041F8A8ECC735 +IV=36D5E00E0A53D7CE1498215AFA686905 +PT=252E4460E9A391D54CE9E516663E59AE +CT=829F0B7B17ED5F2FB7A014A6CD9D8052 + +I=137 +KEY=E6FE54B8715851D225D0555E65714767 +IV=829F0B7B17ED5F2FB7A014A6CD9D8052 +PT=BCC51A6493F6847BEA8219329F67308D +CT=BAB1D358D08DA13BEC485051F2EBFE2E + +I=138 +KEY=5C4F87E0A1D5F0E9C998050F979AB949 +IV=BAB1D358D08DA13BEC485051F2EBFE2E +PT=D89236011B3C2338E95322D4716AEE59 +CT=29BA99F8CF8B48134B1330E75BD7254E + +I=139 +KEY=75F51E186E5EB8FA828B35E8CC4D9C07 +IV=29BA99F8CF8B48134B1330E75BD7254E +PT=21D0EB5857C93A0D4D75253E1020C00E +CT=9D557274FE14AA69673441117A2D7DA2 + +I=140 +KEY=E8A06C6C904A1293E5BF74F9B660E1A5 +IV=9D557274FE14AA69673441117A2D7DA2 +PT=3C3BB454584C4C7570089B6E631BA035 +CT=543EF50A024E77ACE685BD0BBB47232D + +I=141 +KEY=BC9E99669204653F033AC9F20D27C288 +IV=543EF50A024E77ACE685BD0BBB47232D +PT=8ED890BC903AEAC7C3C685980EDB3370 +CT=884BD68868D89DE9DEDB2D95A8B992FB + +I=142 +KEY=34D54FEEFADCF8D6DDE1E467A59E5073 +IV=884BD68868D89DE9DEDB2D95A8B992FB +PT=684DEBD6DEDE24BD0F4F8AFA47F08AEF +CT=DB00984CAEB14CF5A1FDE8E8E9C03830 + +I=143 +KEY=EFD5D7A2546DB4237C1C0C8F4C5E6843 +IV=DB00984CAEB14CF5A1FDE8E8E9C03830 +PT=C42B245443F2695F306455199C7C76FE +CT=0CA808425E8EBDDD5519130F4900329F + +I=144 +KEY=E37DDFE00AE309FE29051F80055E5ADC +IV=0CA808425E8EBDDD5519130F4900329F +PT=1655F89334CCB6ED8E140088997BD2D1 +CT=0DAE2F85CD81874DCD7368277D0C386D + +I=145 +KEY=EED3F065C7628EB3E47677A7785262B1 +IV=0DAE2F85CD81874DCD7368277D0C386D +PT=2B7A2DF6E0CAC83837AFDC8B2134E6A6 +CT=E3BF66A6784432E6CE61B769C3CFDB35 + +I=146 +KEY=0D6C96C3BF26BC552A17C0CEBB9DB984 +IV=E3BF66A6784432E6CE61B769C3CFDB35 +PT=8FED19E77B9690EC8F70272364B4EB74 +CT=473925552401311F24EE4F40B5A3ECB5 + +I=147 +KEY=4A55B3969B278D4A0EF98F8E0E3E5531 +IV=473925552401311F24EE4F40B5A3ECB5 +PT=032D9AF654037E2586B12CF031E4AB4C +CT=E9E1E4ACF3F4E25CB8093F6B27665DFF + +I=148 +KEY=A3B4573A68D36F16B6F0B0E5295808CE +IV=E9E1E4ACF3F4E25CB8093F6B27665DFF +PT=E6EF26B3721F6C772D231584DD480441 +CT=2D9F85D63FED609876DF97F0E6B85564 + +I=149 +KEY=8E2BD2EC573E0F8EC02F2715CFE05DAA +IV=2D9F85D63FED609876DF97F0E6B85564 +PT=E641EBC4A734C71669D948F1BEEE675A +CT=3A61F4BED09FD7A7AED71E9FD53D2EE3 + +I=150 +KEY=B44A265287A1D8296EF8398A1ADD7349 +IV=3A61F4BED09FD7A7AED71E9FD53D2EE3 +PT=36DB43747CD9215857886A0DE2008509 +CT=6BE2AD95F4A642F3FD73D9543B53D479 + +I=151 +KEY=DFA88BC773079ADA938BE0DE218EA730 +IV=6BE2AD95F4A642F3FD73D9543B53D479 +PT=58A73313B31B8C1EB3C144C9363EE94B +CT=BF198D336DF857BFBA069634C25CF45B + +I=152 +KEY=60B106F41EFFCD65298D76EAE3D2536B +IV=BF198D336DF857BFBA069634C25CF45B +PT=E0974E1BBEFE21422ECED27858535F87 +CT=7945132F6F7EED6B61E1CF9C47E2AB2A + +I=153 +KEY=19F415DB7181200E486CB976A430F841 +IV=7945132F6F7EED6B61E1CF9C47E2AB2A +PT=6F36B63A1A8B426282CA4E61B7E37B3A +CT=AF441F330C8C199E9776D92A92B02216 + +I=154 +KEY=B6B00AE87D0D3990DF1A605C3680DA57 +IV=AF441F330C8C199E9776D92A92B02216 +PT=99AD2B814D3A4C0E1C27D4251C55C74A +CT=F34463A538E46E87B0F24EAA36B674A7 + +I=155 +KEY=45F4694D45E957176FE82EF60036AEF0 +IV=F34463A538E46E87B0F24EAA36B674A7 +PT=6D05C19E42D0561C198A10FA55F4C870 +CT=5D54D3C72D55015D0149FA1591208824 + +I=156 +KEY=18A0BA8A68BC564A6EA1D4E3911626D4 +IV=5D54D3C72D55015D0149FA1591208824 +PT=7AA7A04DE8CD21F59BA5369CA175CEC3 +CT=D2EBE35C33210B39CD4F443BB577DBD8 + +I=157 +KEY=CA4B59D65B9D5D73A3EE90D82461FD0C +IV=D2EBE35C33210B39CD4F443BB577DBD8 +PT=2DA2A48FE13FA4DD5271A02FB7F98AEC +CT=2F4AD89C0D915DF978160E9E882AD28E + +I=158 +KEY=E501814A560C008ADBF89E46AC4B2F82 +IV=2F4AD89C0D915DF978160E9E882AD28E +PT=82EB831B9FF9DA7D06553A456133766B +CT=09A04C7CBED3D60ADB6CFDD012DEED17 + +I=159 +KEY=ECA1CD36E8DFD68000946396BE95C295 +IV=09A04C7CBED3D60ADB6CFDD012DEED17 +PT=8D4FD1CE8CB9745E9E65182D94F8307A +CT=193C6FAB40C87C7029983EDD52628400 + +I=160 +KEY=F59DA29DA817AAF0290C5D4BECF74695 +IV=193C6FAB40C87C7029983EDD52628400 +PT=F06A061082E499E65A5DED0D22323F57 +CT=7166BD655D8128E7B09D37B38478B480 + +I=161 +KEY=84FB1FF8F596821799916AF8688FF215 +IV=7166BD655D8128E7B09D37B38478B480 +PT=DCEC808551EA98534E1A9EDF457125DA +CT=5DFAAFB695D34A7AF2D39CD2D01FD4BD + +I=162 +KEY=D901B04E6045C86D6B42F62AB89026A8 +IV=5DFAAFB695D34A7AF2D39CD2D01FD4BD +PT=FAE59C96604D062F49C8C93FA7E4D5FC +CT=85F63AFC88A1CED4E73B849C295692F2 + +I=163 +KEY=5CF78AB2E8E406B98C7972B691C6B45A +IV=85F63AFC88A1CED4E73B849C295692F2 +PT=7FE1EA6A7A525A7E0222D6269F7D6A40 +CT=DC60A8554BF9E783D0E92283EC0D00AF + +I=164 +KEY=809722E7A31DE13A5C9050357DCBB4F5 +IV=DC60A8554BF9E783D0E92283EC0D00AF +PT=89C93828CE30D4CD7025D9F2CF864371 +CT=EF10720E8F10FBABC96BB5F4E5287D12 + +I=165 +KEY=6F8750E92C0D1A9195FBE5C198E3C9E7 +IV=EF10720E8F10FBABC96BB5F4E5287D12 +PT=A8DEA35D4A712ACE8F38A2CA2CB6BCFB +CT=EED271733DC7B81AD09C86C8F8D69255 + +I=166 +KEY=8155219A11CAA28B4567630960355BB2 +IV=EED271733DC7B81AD09C86C8F8D69255 +PT=6720AD239EFECF5785B238D4DA39DD6A +CT=DC47B1FAC154CB0C39ADF4C92F8C2902 + +I=167 +KEY=5D129060D09E69877CCA97C04FB972B0 +IV=DC47B1FAC154CB0C39ADF4C92F8C2902 +PT=D41DEA3BC44CC552B5ACCFEEFAF225F5 +CT=AD4828834513730BF275C854D35BF09E + +I=168 +KEY=F05AB8E3958D1A8C8EBF5F949CE2822E +IV=AD4828834513730BF275C854D35BF09E +PT=5059DA9258A7DE12865E1E2173399BC9 +CT=82CA6B085A452CFDFFBDE5C7B738CDAB + +I=169 +KEY=7290D3EBCFC836717102BA532BDA4F85 +IV=82CA6B085A452CFDFFBDE5C7B738CDAB +PT=9625B8A444C3E4D3554A8C6E33E1B810 +CT=4F44C38189E1011970690D0ED4BCB9C7 + +I=170 +KEY=3DD4106A46293768016BB75DFF66F642 +IV=4F44C38189E1011970690D0ED4BCB9C7 +PT=373FBCA7529A9FA9AF77295FC55B0BEE +CT=27BE0578B0F898C04133AA4D3C1A5A7C + +I=171 +KEY=1A6A1512F6D1AFA840581D10C37CAC3E +IV=27BE0578B0F898C04133AA4D3C1A5A7C +PT=37FC0A286DFFD5A76643D1D45C858F64 +CT=B9C70B34F78F3DA7796C32D0918474A5 + +I=172 +KEY=A3AD1E26015E920F39342FC052F8D89B +IV=B9C70B34F78F3DA7796C32D0918474A5 +PT=E1EAC69AA2A8F05B8747E2624D00F4BB +CT=846985C471F10676E63BCD09C32506F3 + +I=173 +KEY=27C49BE270AF9479DF0FE2C991DDDE68 +IV=846985C471F10676E63BCD09C32506F3 +PT=6EB0046D9C6854C63447296F4F6D3D21 +CT=F754559746C52113C29AF782E96B6105 + +I=174 +KEY=D090CE75366AB56A1D95154B78B6BF6D +IV=F754559746C52113C29AF782E96B6105 +PT=F65269422328F40D8A53F4F14DB88583 +CT=AE6B4EABF8DC479A1E3F8C3F30A4A797 + +I=175 +KEY=7EFB80DECEB6F2F003AA9974481218FA +IV=AE6B4EABF8DC479A1E3F8C3F30A4A797 +PT=765B38DC041DEC130A3A294D9F89A16D +CT=87645926B9D85AC4AB023D2104CC3FA2 + +I=176 +KEY=F99FD9F8776EA834A8A8A4554CDE2758 +IV=87645926B9D85AC4AB023D2104CC3FA2 +PT=8070950120E0FBE07C70B171364AD173 +CT=0125D51139CE00DB848B8A9AD3FEB90B + +I=177 +KEY=F8BA0CE94EA0A8EF2C232ECF9F209E53 +IV=0125D51139CE00DB848B8A9AD3FEB90B +PT=1EF45DD2CD61667469569CFAD445341C +CT=E1651756A2C0D132C671D74748244E49 + +I=178 +KEY=19DF1BBFEC6079DDEA52F988D704D01A +IV=E1651756A2C0D132C671D74748244E49 +PT=26BEF7E8A3D0AC50DC64B8215CCBC44F +CT=94049FBD554A6CFFE7927D6EC07D6242 + +I=179 +KEY=8DDB8402B92A15220DC084E61779B258 +IV=94049FBD554A6CFFE7927D6EC07D6242 +PT=803F34FA967583623D0CA4D76FC56787 +CT=974BBE04952D8F0DD70F4353FEB092EB + +I=180 +KEY=1A903A062C079A2FDACFC7B5E9C920B3 +IV=974BBE04952D8F0DD70F4353FEB092EB +PT=023E5D307CE85244144D59A53DB504E7 +CT=2615B9F94F9024EA616648FF15E3B65F + +I=181 +KEY=3C8583FF6397BEC5BBA98F4AFC2A96EC +IV=2615B9F94F9024EA616648FF15E3B65F +PT=1A84130B09CE3E7AB1F400B9FE295BEB +CT=39A2A3B6EFB5EBE805CBAD5817EAEEDA + +I=182 +KEY=052720498C22552DBE622212EBC07836 +IV=39A2A3B6EFB5EBE805CBAD5817EAEEDA +PT=B83609055302D99DE46B7153AE3DFCE2 +CT=93F72B839E2AD731B5E894B56ADADCF4 + +I=183 +KEY=96D00BCA1208821C0B8AB6A7811AA4C2 +IV=93F72B839E2AD731B5E894B56ADADCF4 +PT=85E69EBDE13C05526EA8AE1D24B487F3 +CT=D0ADA333801DFDBFC2420B73CD2B92A5 + +I=184 +KEY=467DA8F992157FA3C9C8BDD44C313667 +IV=D0ADA333801DFDBFC2420B73CD2B92A5 +PT=F24782E953B9B1BBF3B925659C99415B +CT=F59A3D0B65E8F16DC73CCD6C27E8C705 + +I=185 +KEY=B3E795F2F7FD8ECE0EF470B86BD9F162 +IV=F59A3D0B65E8F16DC73CCD6C27E8C705 +PT=73BE517552E054D78583BEA03B84A245 +CT=7904DBE3A103D936EB4B960C180B0651 + +I=186 +KEY=CAE34E1156FE57F8E5BFE6B473D2F733 +IV=7904DBE3A103D936EB4B960C180B0651 +PT=91998E9582D8357DD5D8B95A9D85912F +CT=C2DE0D0145A45DEABD6DE1FD62161EB1 + +I=187 +KEY=083D4310135A0A1258D2074911C4E982 +IV=C2DE0D0145A45DEABD6DE1FD62161EB1 +PT=2A5D4EC49712B9CF1E2D9C6C5EFACC2A +CT=974264BDC574C738243DDC008EC4C15A + +I=188 +KEY=9F7F27ADD62ECD2A7CEFDB499F0028D8 +IV=974264BDC574C738243DDC008EC4C15A +PT=F74520C3745B9B9F9D19642AA57451FB +CT=F4EE51C2ECC32F4806F9C8588880525B + +I=189 +KEY=6B91766F3AEDE2627A16131117807A83 +IV=F4EE51C2ECC32F4806F9C8588880525B +PT=4A7D6FC6712F451F58DF0AC2D517189E +CT=F4978F5F53AA4C336BEE0C62F432B44F + +I=190 +KEY=9F06F9306947AE5111F81F73E3B2CECC +IV=F4978F5F53AA4C336BEE0C62F432B44F +PT=00DAD17491C973991FEC296972B691BC +CT=09DAA53C2E394BF83113BE48E5D0CCA2 + +I=191 +KEY=96DC5C0C477EE5A920EBA13B0662026E +IV=09DAA53C2E394BF83113BE48E5D0CCA2 +PT=C00943704C1336F01A1D23FD98BE7E8B +CT=D0DE529664BF241DBED3168DA5BC1B28 + +I=192 +KEY=46020E9A23C1C1B49E38B7B6A3DE1946 +IV=D0DE529664BF241DBED3168DA5BC1B28 +PT=A07FAD9770CC32C5680F33A2D67044A4 +CT=F6A44922B3744BE96C46742A79A49CBB + +I=193 +KEY=B0A647B890B58A5DF27EC39CDA7A85FD +IV=F6A44922B3744BE96C46742A79A49CBB +PT=D5450C670BE84169AD1E62C5ECB8365F +CT=47D229908D4C1EA34E429C34B7D635F5 + +I=194 +KEY=F7746E281DF994FEBC3C5FA86DACB008 +IV=47D229908D4C1EA34E429C34B7D635F5 +PT=9E90D30BE92104667A16522237D645A6 +CT=6463AC2096842A0958ACF45370C0626F + +I=195 +KEY=9317C2088B7DBEF7E490ABFB1D6CD267 +IV=6463AC2096842A0958ACF45370C0626F +PT=74382A7BF713DE8E8D17AE389E03C3AC +CT=ECDCEF7613C362D288AC23D38722DC4C + +I=196 +KEY=7FCB2D7E98BEDC256C3C88289A4E0E2B +IV=ECDCEF7613C362D288AC23D38722DC4C +PT=DB2EC6F41A72F426D9F5DBC65CEC1C5C +CT=DFE2DA423ACE2DFB053265E9E9B214E2 + +I=197 +KEY=A029F73CA270F1DE690EEDC173FC1AC9 +IV=DFE2DA423ACE2DFB053265E9E9B214E2 +PT=35998CB9958DC9DE0550FC3EA722D571 +CT=5EBCA79BF99165D9FFE355D9B24ECB5D + +I=198 +KEY=FE9550A75BE1940796EDB818C1B2D194 +IV=5EBCA79BF99165D9FFE355D9B24ECB5D +PT=9BDA7BC96736FE2140911C98E8E02E1C +CT=782D3EFD5F599E8D3C85D06128677EC2 + +I=199 +KEY=86B86E5A04B80A8AAA686879E9D5AF56 +IV=782D3EFD5F599E8D3C85D06128677EC2 +PT=8014C1F398E4DCC7F4E5E09E5FAFB080 +CT=E01AE2D961F31BBAE3DA7429627572AB + +I=200 +KEY=66A28C83654B113049B21C508BA0DDFD +IV=E01AE2D961F31BBAE3DA7429627572AB +PT=97D66D66D1731EEFF14519620616A10B +CT=BC41ED9D568D6ED36212C92DEEB40A0E + +I=201 +KEY=DAE3611E33C67FE32BA0D57D6514D7F3 +IV=BC41ED9D568D6ED36212C92DEEB40A0E +PT=F7646B60C237ED24F467141980EB4F00 +CT=CB8DF2D164E5B4AB3193D02E71959F63 + +I=202 +KEY=116E93CF5723CB481A33055314814890 +IV=CB8DF2D164E5B4AB3193D02E71959F63 +PT=4A3A241B26AC7A1C88AA2FB750DF6E5A +CT=E396FB47A686ABAA350B84C250E5EAE9 + +I=203 +KEY=F2F86888F1A560E22F3881914464A279 +IV=E396FB47A686ABAA350B84C250E5EAE9 +PT=A71348309D176A072167C4B1B8A295C0 +CT=29AF21F96564EB591E9A60B1BE88DEC7 + +I=204 +KEY=DB57497194C18BBB31A2E120FAEC7CBE +IV=29AF21F96564EB591E9A60B1BE88DEC7 +PT=BC528364EF78D6432177FE0CF1CDECD1 +CT=34CD9D96D4455AE0C15B6B970F1EC905 + +I=205 +KEY=EF9AD4E74084D15BF0F98AB7F5F2B5BB +IV=34CD9D96D4455AE0C15B6B970F1EC905 +PT=18972F6992299533EE23AA5824C25892 +CT=2E05E3E2079A055310FD9318590A6F41 + +I=206 +KEY=C19F3705471ED408E00419AFACF8DAFA +IV=2E05E3E2079A055310FD9318590A6F41 +PT=5441FF0D0A4062D5D0DF29BF2FDA85B4 +CT=47D4EAECE59C733EEFCB7B9D5BE95A98 + +I=207 +KEY=864BDDE9A282A7360FCF6232F7118062 +IV=47D4EAECE59C733EEFCB7B9D5BE95A98 +PT=ED3E19B5AB5389AA3A58D97F6604F4C0 +CT=00525B7D5BFC0651AEF6770F6281E6DC + +I=208 +KEY=86198694F97EA167A139153D959066BE +IV=00525B7D5BFC0651AEF6770F6281E6DC +PT=8BD4869C88A9BD3DCFE89B98B93F6EB3 +CT=AFB2215E6DC04E9467F44227FD4BDB98 + +I=209 +KEY=29ABA7CA94BEEFF3C6CD571A68DBBD26 +IV=AFB2215E6DC04E9467F44227FD4BDB98 +PT=6E7269FC27BDCC42D64CEF41A612F771 +CT=7B769B90279C95E31D8B3D792FA27FA8 + +I=210 +KEY=52DD3C5AB3227A10DB466A634779C28E +IV=7B769B90279C95E31D8B3D792FA27FA8 +PT=E00316E79DC10D179002B1BACC146027 +CT=E3870CDE5CF99B7C4C489AF81153002F + +I=211 +KEY=B15A3084EFDBE16C970EF09B562AC2A1 +IV=E3870CDE5CF99B7C4C489AF81153002F +PT=FB2FC78A79C33225E6EAAA06B76FA793 +CT=4DFC91F8971635348EF35141E8C291F7 + +I=212 +KEY=FCA6A17C78CDD45819FDA1DABEE85356 +IV=4DFC91F8971635348EF35141E8C291F7 +PT=69C8EE14F21832BB077F1A5414851FFE +CT=DA51BE36F96AA8C80DED9DB2A701D72F + +I=213 +KEY=26F71F4A81A77C9014103C6819E98479 +IV=DA51BE36F96AA8C80DED9DB2A701D72F +PT=766EC1664D2194E0F89B69861A4A8501 +CT=2ACA6359CD935CA2294F9FB5A50F4993 + +I=214 +KEY=0C3D7C134C3420323D5FA3DDBCE6CDEA +IV=2ACA6359CD935CA2294F9FB5A50F4993 +PT=1D95E551169BD538836CC349BC6B1772 +CT=315518F0AC6C1DC9939CB802336DA968 + +I=215 +KEY=3D6864E3E0583DFBAEC31BDF8F8B6482 +IV=315518F0AC6C1DC9939CB802336DA968 +PT=4F6BFE727AECDAB5A32DF8CFFC43D6A9 +CT=34C3ECD89376B4D771CA0669C2C3E26C + +I=216 +KEY=09AB883B732E892CDF091DB64D4886EE +IV=34C3ECD89376B4D771CA0669C2C3E26C +PT=AA8B1DA2E015D482EE08FA2B4A2B77B6 +CT=A3F4DD9DDC375C90579C274527612C6E + +I=217 +KEY=AA5F55A6AF19D5BC88953AF36A29AA80 +IV=A3F4DD9DDC375C90579C274527612C6E +PT=2EE6982D9E0AA5FCB61F3E66E52A0D6D +CT=C45C9E4DE76782E2599BD73B132BFE90 + +I=218 +KEY=6E03CBEB487E575ED10EEDC879025410 +IV=C45C9E4DE76782E2599BD73B132BFE90 +PT=6E58E5B1EDF1BFABAD643D8223F0FA81 +CT=32221DA62DA2B441B5E66A197A5C69F1 + +I=219 +KEY=5C21D64D65DCE31F64E887D1035E3DE1 +IV=32221DA62DA2B441B5E66A197A5C69F1 +PT=D5A81DF4B6BE17A531478961D78CAB46 +CT=E1FEB5C31B1671F15DC1F7713E5DD7FE + +I=220 +KEY=BDDF638E7ECA92EE392970A03D03EA1F +IV=E1FEB5C31B1671F15DC1F7713E5DD7FE +PT=D360948141A1D3ECFF5E8D6BDC022685 +CT=FF07F02135FB458D63EE68C4B1463A99 + +I=221 +KEY=42D893AF4B31D7635AC718648C45D086 +IV=FF07F02135FB458D63EE68C4B1463A99 +PT=E3C1E44333C9307E90EE2FBA6A7708A5 +CT=1AE4E8466B84B59EECF5E6BEB6140DF2 + +I=222 +KEY=583C7BE920B562FDB632FEDA3A51DD74 +IV=1AE4E8466B84B59EECF5E6BEB6140DF2 +PT=653AA343CE35F72E2ADB5FFCD2DFCBA8 +CT=3CB44BC123DDCD55B812D265CC5E974E + +I=223 +KEY=648830280368AFA80E202CBFF60F4A3A +IV=3CB44BC123DDCD55B812D265CC5E974E +PT=E96A66BFE5F0E8083A01664A47226672 +CT=BB6C54E118FA895F2AC4CC036166E390 + +I=224 +KEY=DFE464C91B9226F724E4E0BC9769A9AA +IV=BB6C54E118FA895F2AC4CC036166E390 +PT=A5B240D8E5731E1BFA7C4FDFB4EED81F +CT=DA20870677A6214F26FDACBA81B41882 + +I=225 +KEY=05C4E3CF6C3407B802194C0616DDB128 +IV=DA20870677A6214F26FDACBA81B41882 +PT=92FF6EAB4A6D1AD3941E6A91D8C9105B +CT=F079AA86FC9FD361DBA0C21CCD4B0F6C + +I=226 +KEY=F5BD494990ABD4D9D9B98E1ADB96BE44 +IV=F079AA86FC9FD361DBA0C21CCD4B0F6C +PT=DFF005175EF746B83CB00AC13337E248 +CT=B6021E0AA1A921C7BCC3FDAB1C3EA44A + +I=227 +KEY=43BF57433102F51E657A73B1C7A81A0E +IV=B6021E0AA1A921C7BCC3FDAB1C3EA44A +PT=DDDC1AA804AD13813C6AEA540557C097 +CT=41F0E4AB03801DCE585727B7C41F48BD + +I=228 +KEY=024FB3E83282E8D03D2D540603B752B3 +IV=41F0E4AB03801DCE585727B7C41F48BD +PT=4C6421E5A487C9C452958CAB38AC7098 +CT=6EFDD855BAF2D13437C01097ABB633DE + +I=229 +KEY=6CB26BBD887039E40AED4491A801616D +IV=6EFDD855BAF2D13437C01097ABB633DE +PT=2A11519D5463F2B96A5E0FCE6E4710D7 +CT=5E8243E5C54A109CCC0BF622A299EF68 + +I=230 +KEY=323028584D3A2978C6E6B2B30A988E05 +IV=5E8243E5C54A109CCC0BF622A299EF68 +PT=252145DACAD23E8B85AB7637B22C42F2 +CT=2C9A476418F01C589ADC0CA10BF4A183 + +I=231 +KEY=1EAA6F3C55CA35205C3ABE12016C2F86 +IV=2C9A476418F01C589ADC0CA10BF4A183 +PT=A22C36DC7D00645FEFE8683EA4231787 +CT=DA3A4AC19EF6A0F950E26B00834AFE41 + +I=232 +KEY=C49025FDCB3C95D90CD8D5128226D1C7 +IV=DA3A4AC19EF6A0F950E26B00834AFE41 +PT=B0DC92D3B4878156B768923286F0433F +CT=10BBC2A8C8F650FD8EED7CC9F5EAD05D + +I=233 +KEY=D42BE75503CAC5248235A9DB77CC019A +IV=10BBC2A8C8F650FD8EED7CC9F5EAD05D +PT=83A9338157091D4AECAF60E887AE09F7 +CT=757993A70F78B25F02FA0355E04DE27B + +I=234 +KEY=A15274F20CB2777B80CFAA8E9781E3E1 +IV=757993A70F78B25F02FA0355E04DE27B +PT=9D818ACA2C753E7314F51699D3062031 +CT=E2E74C76C09516135876D54AFC940D80 + +I=235 +KEY=43B53884CC276168D8B97FC46B15EE61 +IV=E2E74C76C09516135876D54AFC940D80 +PT=BDD36F881F8D1FC56780E291D1359EE1 +CT=22F76A2DB98544549DEA21FFCDC2B943 + +I=236 +KEY=614252A975A2253C45535E3BA6D75722 +IV=22F76A2DB98544549DEA21FFCDC2B943 +PT=4C9C16802A4BB1202D4FAC9E76C57A43 +CT=166B0FF778D72B6102D6ADF990A70A23 + +I=237 +KEY=77295D5E0D750E5D4785F3C236705D01 +IV=166B0FF778D72B6102D6ADF990A70A23 +PT=0045ECDDAA51EE6FDB226E2D9471F46C +CT=D7724DC8A1413BC1B9D6F305794426F0 + +I=238 +KEY=A05B1096AC34359CFE5300C74F347BF1 +IV=D7724DC8A1413BC1B9D6F305794426F0 +PT=25C55C60290DF3D0DC3274CD2AE0ED21 +CT=41F0196DFE0B1F664A107D12A6FF3D79 + +I=239 +KEY=E1AB09FB523F2AFAB4437DD5E9CB4688 +IV=41F0196DFE0B1F664A107D12A6FF3D79 +PT=9A44454F7A335C89BEFF1D94D3FDB320 +CT=3F37D7ADFB9933FFBAC1F7D07F31046E + +I=240 +KEY=DE9CDE56A9A619050E828A0596FA42E6 +IV=3F37D7ADFB9933FFBAC1F7D07F31046E +PT=03D7F09054233696BEF84AB8D5B77091 +CT=02D226A748153C27A723F02461FFF913 + +I=241 +KEY=DC4EF8F1E1B32522A9A17A21F705BBF5 +IV=02D226A748153C27A723F02461FFF913 +PT=D5C82A6F048A2AA0E5CF4F1EDADD68B3 +CT=4BD7486C212E7F78228478BBF0A7AD3D + +I=242 +KEY=9799B09DC09D5A5A8B25029A07A216C8 +IV=4BD7486C212E7F78228478BBF0A7AD3D +PT=936431AD9F800606240C33EAF661D3DA +CT=3EFE00CA0A96AF4425E683512DAC0164 + +I=243 +KEY=A967B057CA0BF51EAEC381CB2A0E17AC +IV=3EFE00CA0A96AF4425E683512DAC0164 +PT=280DC27864BED0D548B5B4F9A7FA38DE +CT=7023640C8D6B02F6C4C7E007C169C592 + +I=244 +KEY=D944D45B4760F7E86A0461CCEB67D23E +IV=7023640C8D6B02F6C4C7E007C169C592 +PT=CD0F58962915E5A514E5D6DA8BB868E8 +CT=D08419A75363E9622FAA09DB589915F1 + +I=245 +KEY=09C0CDFC14031E8A45AE6817B3FEC7CF +IV=D08419A75363E9622FAA09DB589915F1 +PT=09A6099FDDDBBC15EE79224B01C49DF0 +CT=6CDD2B0279D9DB3C71329C1BB2C24C2F + +I=246 +KEY=651DE6FE6DDAC5B6349CF40C013C8BE0 +IV=6CDD2B0279D9DB3C71329C1BB2C24C2F +PT=B24B11FD8A6FC6B2703FFBEBC85B6C44 +CT=CCB0F6F32BDE2339A1842A7EDC8C99C7 + +I=247 +KEY=A9AD100D4604E68F9518DE72DDB01227 +IV=CCB0F6F32BDE2339A1842A7EDC8C99C7 +PT=2E471506C55D1762CDB9EAEF29E23C01 +CT=DAD62227A5F328CC33F054EEB346E3D3 + +I=248 +KEY=737B322AE3F7CE43A6E88A9C6EF6F1F4 +IV=DAD62227A5F328CC33F054EEB346E3D3 +PT=5598344020E32F9B2C509D06F4E7804A +CT=18DE226F7CAA4EF2712A223C4709C9E2 + +I=249 +KEY=6BA510459F5D80B1D7C2A8A029FF3816 +IV=18DE226F7CAA4EF2712A223C4709C9E2 +PT=549A87BE74B62BAC3F0FDC2A878F5669 +CT=DB082C8D70948B6BF08D4848E4DB0231 + +I=250 +KEY=B0AD3CC8EFC90BDA274FE0E8CD243A27 +IV=DB082C8D70948B6BF08D4848E4DB0231 +PT=08946428BF90FBF0951A35D6FB72A48A +CT=29CBD3E3F2074514E63A7B2A651AB031 + +I=251 +KEY=9966EF2B1DCE4ECEC1759BC2A83E8A16 +IV=29CBD3E3F2074514E63A7B2A651AB031 +PT=7EBEC38F7787EE1BDD6A648334FA3076 +CT=0037935821278E879BCBB2FBE4ECC23E + +I=252 +KEY=99517C733CE9C0495ABE29394CD24828 +IV=0037935821278E879BCBB2FBE4ECC23E +PT=01D77828928164A830C249D96AC6F8B4 +CT=47501831F9DF42C234E9FE9169075888 + +I=253 +KEY=DE016442C536828B6E57D7A825D510A0 +IV=47501831F9DF42C234E9FE9169075888 +PT=608349FF8FFC31B072CFA7DF649E15B8 +CT=BC10B1D412BC05404B2E38A1D75DA421 + +I=254 +KEY=6211D596D78A87CB2579EF09F288B481 +IV=BC10B1D412BC05404B2E38A1D75DA421 +PT=B16325BD78FC0451216FF476D4CAE293 +CT=6ABD8010E9CBAE61E05A9E30C622B501 + +I=255 +KEY=08AC55863E4129AAC523713934AA0180 +IV=6ABD8010E9CBAE61E05A9E30C622B501 +PT=E613C244F74C61B078C9E59E06E7AD85 +CT=E896B8BD539C30D9A58E5EF6629B279C + +I=256 +KEY=E03AED3B6DDD197360AD2FCF5631261C +IV=E896B8BD539C30D9A58E5EF6629B279C +PT=6CFF7A909AAB2C0DC61FB8F11B45E661 +CT=30D15AAA05F56FA2D21E9974FB3FF5DA + +I=257 +KEY=D0EBB791682876D1B2B3B6BBAD0ED3C6 +IV=30D15AAA05F56FA2D21E9974FB3FF5DA +PT=6BFAC8E8FB9C3D5AF813B4DF90AD863B +CT=43B99F3DA3C1BCCE9038118E2968EFA1 + +I=258 +KEY=935228ACCBE9CA1F228BA73584663C67 +IV=43B99F3DA3C1BCCE9038118E2968EFA1 +PT=064D09E9F5104602E191DC39F18E6A1A +CT=EBC5796519BE4E05262A10D56FA0F72D + +I=259 +KEY=789751C9D257841A04A1B7E0EBC6CB4A +IV=EBC5796519BE4E05262A10D56FA0F72D +PT=C2B528D69ED3028A359D4472D98807A7 +CT=5F2B51DD025E775A63DFE5B9FBF54986 + +I=260 +KEY=27BC0014D009F340677E5259103382CC +IV=5F2B51DD025E775A63DFE5B9FBF54986 +PT=D5CF62940967AF7225F79E87136751F5 +CT=F56D88E433CEA445C6E4D6298DFB6C27 + +I=261 +KEY=D2D188F0E3C75705A19A84709DC8EEEB +IV=F56D88E433CEA445C6E4D6298DFB6C27 +PT=3BE3171202E762846D2CA00FB2CB141A +CT=4C168A0129F2D48E249777A366D1AEF1 + +I=262 +KEY=9EC702F1CA35838B850DF3D3FB19401A +IV=4C168A0129F2D48E249777A366D1AEF1 +PT=5B82A34141C236FAED7E1A78D3C426C4 +CT=E11FEBEF79E425480442D45A8C105B44 + +I=263 +KEY=7FD8E91EB3D1A6C3814F278977091B5E +IV=E11FEBEF79E425480442D45A8C105B44 +PT=86CFADD3F1B368B3A6E57148CA343D38 +CT=5F5F3548BDBB2A5337FBF07DF76526DD + +I=264 +KEY=2087DC560E6A8C90B6B4D7F4806C3D83 +IV=5F5F3548BDBB2A5337FBF07DF76526DD +PT=A4474ACA97100C7A357A66119D678798 +CT=013ADA262021F88617773CF478067EC8 + +I=265 +KEY=21BD06702E4B7416A1C3EB00F86A434B +IV=013ADA262021F88617773CF478067EC8 +PT=6D66801C39DB803B5DA5A80E30DB0D89 +CT=F46BE70F65FC5641318292AE0C79E5C5 + +I=266 +KEY=D5D6E17F4BB72257904179AEF413A68E +IV=F46BE70F65FC5641318292AE0C79E5C5 +PT=C9499B32D8F47313EB351139DB81AB25 +CT=8573A25F86C7784BF7A0153DF812805C + +I=267 +KEY=50A54320CD705A1C67E16C930C0126D2 +IV=8573A25F86C7784BF7A0153DF812805C +PT=4B09D37A4A57B320C34B1D70F74EB36A +CT=036913128A2B71CE3D05D52D61E48E86 + +I=268 +KEY=53CC5032475B2BD25AE4B9BE6DE5A854 +IV=036913128A2B71CE3D05D52D61E48E86 +PT=EA3A92794B204C0345765CEE2A04AF27 +CT=5A53E929182859CC28D4EB1CB9579B71 + +I=269 +KEY=099FB91B5F73721E723052A2D4B23325 +IV=5A53E929182859CC28D4EB1CB9579B71 +PT=2714E38858426C5631BB2BB4FA289985 +CT=DF4BD734DEC60475D47FE40502439AAE + +I=270 +KEY=D6D46E2F81B5766BA64FB6A7D6F1A98B +IV=DF4BD734DEC60475D47FE40502439AAE +PT=69AC3FD2273926E2DAD3F5BED9F21491 +CT=EBCCD0B121C4009EA7F038F30F5B6B05 + +I=271 +KEY=3D18BE9EA07176F501BF8E54D9AAC28E +IV=EBCCD0B121C4009EA7F038F30F5B6B05 +PT=07520CD471E27BAC35387DB47E706784 +CT=299FE603BBA51BD1582CBD42BC9568EA + +I=272 +KEY=1487589D1BD46D2459933316653FAA64 +IV=299FE603BBA51BD1582CBD42BC9568EA +PT=39598B70B8EB190049823472E3596E42 +CT=68DD98FE52B454F85D6F6A6C742223FA + +I=273 +KEY=7C5AC063496039DC04FC597A111D899E +IV=68DD98FE52B454F85D6F6A6C742223FA +PT=C7E13ABBBA75F527AB1320DD930B24F1 +CT=906B569E44263A4E6F41A52802D3FC59 + +I=274 +KEY=EC3196FD0D4603926BBDFC5213CE75C7 +IV=906B569E44263A4E6F41A52802D3FC59 +PT=9F5D8E50F06895D5D7E6D1DAA247D45F +CT=E5ECBDCC55A9D952BE0F93DFA0FE2C31 + +I=275 +KEY=09DD2B3158EFDAC0D5B26F8DB33059F6 +IV=E5ECBDCC55A9D952BE0F93DFA0FE2C31 +PT=EC3F35C1E6371F106443BD1446D58A0A +CT=4837A3D703E80BFE50D742E378956F3A + +I=276 +KEY=41EA88E65B07D13E85652D6ECBA536CC +IV=4837A3D703E80BFE50D742E378956F3A +PT=7998C3B7B5C94540DFC5BF777D700D48 +CT=DF1564E5E47503A779020D27394571E9 + +I=277 +KEY=9EFFEC03BF72D299FC672049F2E04725 +IV=DF1564E5E47503A779020D27394571E9 +PT=63BEA75A2440C5D123F335F72137B0B6 +CT=5147239C3F6E4A158989BE96C0275D41 + +I=278 +KEY=CFB8CF9F801C988C75EE9EDF32C71A64 +IV=5147239C3F6E4A158989BE96C0275D41 +PT=09C656A0DFCF893DDBE5E2B3D88E5F1F +CT=7E4DEE30DED62EE15CD957530B62559D + +I=279 +KEY=B1F521AF5ECAB66D2937C98C39A54FF9 +IV=7E4DEE30DED62EE15CD957530B62559D +PT=71DC22F489DD422CDE09F01DAA427567 +CT=6F62D6359F07F6BDBB4C02BBE50B273C + +I=280 +KEY=DE97F79AC1CD40D0927BCB37DCAE68C5 +IV=6F62D6359F07F6BDBB4C02BBE50B273C +PT=C2A9BC94CAE48DBEB37B4B506AD4336A +CT=902D9E9F82DE4E66E42B4FEA79AF4077 + +I=281 +KEY=4EBA690543130EB6765084DDA50128B2 +IV=902D9E9F82DE4E66E42B4FEA79AF4077 +PT=69EE7E15EEC2EA953A32E1714961BA9E +CT=72CB5DE8AF6CDC60A00A15CEAF249DBD + +I=282 +KEY=3C7134EDEC7FD2D6D65A91130A25B50F +IV=72CB5DE8AF6CDC60A00A15CEAF249DBD +PT=4C0A3B88FDFAEFEC38858A927C38AE6A +CT=68C2BFA5DE837B927BD75C6DE6008595 + +I=283 +KEY=54B38B4832FCA944AD8DCD7EEC25309A +IV=68C2BFA5DE837B927BD75C6DE6008595 +PT=CE75CCA2D7B0199EB1DA7E33A0E50AB7 +CT=4FFCCBB31FB1FCC0FCB38F0B557BE67A + +I=284 +KEY=1B4F40FB2D4D5584513E4275B95ED6E0 +IV=4FFCCBB31FB1FCC0FCB38F0B557BE67A +PT=E0ECA2ABC1F389B149E746CFB039539E +CT=249FB11DF8C0ED1F346F6D69B8FD0470 + +I=285 +KEY=3FD0F1E6D58DB89B65512F1C01A3D290 +IV=249FB11DF8C0ED1F346F6D69B8FD0470 +PT=BFA871CA5EC16C0B353679782BE04394 +CT=8127E6D8EEC1111518065EDC34CD4B4C + +I=286 +KEY=BEF7173E3B4CA98E7D5771C0356E99DC +IV=8127E6D8EEC1111518065EDC34CD4B4C +PT=1EF816C565B2F56E772C96AD5C92842D +CT=C8DC75AE1E2DBD005D94E69D6776C498 + +I=287 +KEY=762B62902561148E20C3975D52185D44 +IV=C8DC75AE1E2DBD005D94E69D6776C498 +PT=9F2B9873F88EBF21A3BB3DCD853C812E +CT=861D4FF061E85D44173252244F143692 + +I=288 +KEY=F0362D60448949CA37F1C5791D0C6BD6 +IV=861D4FF061E85D44173252244F143692 +PT=6CDEA8A806516A1A0E1CBB5AA123862A +CT=16DA4EE5C5044F66EFCC313754FBCD9E + +I=289 +KEY=E6EC6385818D06ACD83DF44E49F7A648 +IV=16DA4EE5C5044F66EFCC313754FBCD9E +PT=5B637BB469073B5E54EC006F47C4D546 +CT=C2C50037BBBEC252B7D5CF10C38BD665 + +I=290 +KEY=242963B23A33C4FE6FE83B5E8A7C702D +IV=C2C50037BBBEC252B7D5CF10C38BD665 +PT=38DADBF2BA4A80A6A190D9E2AA245167 +CT=721222A5A67E96246DA1B9C59B67DDD5 + +I=291 +KEY=563B41179C4D52DA0249829B111BADF8 +IV=721222A5A67E96246DA1B9C59B67DDD5 +PT=CB52378F6E4E7FCB1891D3BB4D086B9F +CT=D28B8F54E8BDA9A20965984D5DA27FC9 + +I=292 +KEY=84B0CE4374F0FB780B2C1AD64CB9D231 +IV=D28B8F54E8BDA9A20965984D5DA27FC9 +PT=E66015A1B848EF190F981DEFEDB98C93 +CT=012C5D9B847C9583B0BE03999D24E277 + +I=293 +KEY=859C93D8F08C6EFBBB92194FD19D3046 +IV=012C5D9B847C9583B0BE03999D24E277 +PT=F5B2BAD53323A52A2B99CC12782CD6F9 +CT=D1EFB7E7A34F75887038FC4827E894C1 + +I=294 +KEY=5473243F53C31B73CBAAE507F675A487 +IV=D1EFB7E7A34F75887038FC4827E894C1 +PT=11C0C41C3F547B5D7FC94115327AB3D5 +CT=2CF97D8995AA8FDC4C05205D3D8B757F + +I=295 +KEY=788A59B6C66994AF87AFC55ACBFED1F8 +IV=2CF97D8995AA8FDC4C05205D3D8B757F +PT=3F911029D8B69CA1A323A277090B9C07 +CT=44BB04C6253F3ADD454264EA97490475 + +I=296 +KEY=3C315D70E356AE72C2EDA1B05CB7D58D +IV=44BB04C6253F3ADD454264EA97490475 +PT=9D7724EFD1AE76904458EF1360953AA4 +CT=5D6F876E4FDD6921B243EB1F6EF50F82 + +I=297 +KEY=615EDA1EAC8BC75370AE4AAF3242DA0F +IV=5D6F876E4FDD6921B243EB1F6EF50F82 +PT=44A26554FE355D95706431B344701B03 +CT=5F3226B39DF230163D2C474F04BAD36E + +I=298 +KEY=3E6CFCAD3179F7454D820DE036F80961 +IV=5F3226B39DF230163D2C474F04BAD36E +PT=5D8B62C8CD3B04451A599989F3165530 +CT=A247CF8E1D8F480DA4155DA846A2B64E + +I=299 +KEY=9C2B33232CF6BF48E9975048705ABF2F +IV=A247CF8E1D8F480DA4155DA846A2B64E +PT=610D3798E62E9338D5987BAC82D48CD7 +CT=2A92B5AAEA43CFBAA62842DEE7F43A19 + +I=300 +KEY=B6B98689C6B570F24FBF129697AE8536 +IV=2A92B5AAEA43CFBAA62842DEE7F43A19 +PT=F77943AA429BCCC5253156474E719389 +CT=7D475AFF824080E9C95D4E49D4F5090D + +I=301 +KEY=CBFEDC7644F5F01B86E25CDF435B8C3B +IV=7D475AFF824080E9C95D4E49D4F5090D +PT=5E6269D157164B2C544D3052E9DB8553 +CT=AD4628B05F5A765E557015B4A41505EA + +I=302 +KEY=66B8F4C61BAF8645D392496BE74E89D1 +IV=AD4628B05F5A765E557015B4A41505EA +PT=77126BD6C08A094981FEC9E2DE91B2BF +CT=59C24F269E3884A4F8E3F9FB05BF448F + +I=303 +KEY=3F7ABBE0859702E12B71B090E2F1CD5E +IV=59C24F269E3884A4F8E3F9FB05BF448F +PT=7775F90D2189E91B75AB8AD93C0D44F2 +CT=B72873115D4761B8BAEB5B5892B79DF8 + +I=304 +KEY=8852C8F1D8D06359919AEBC8704650A6 +IV=B72873115D4761B8BAEB5B5892B79DF8 +PT=03D9C45A2A152ADAA53E1D42AB33555B +CT=FE0C3F22E6B467DC1C628C928D03DB5B + +I=305 +KEY=765EF7D33E6404858DF8675AFD458BFD +IV=FE0C3F22E6B467DC1C628C928D03DB5B +PT=279791AC4189634A6066BCDCAA2EF9B4 +CT=7F3ABBA943C8E3EF19C3BA2C98C9685F + +I=306 +KEY=09644C7A7DACE76A943BDD76658CE3A2 +IV=7F3ABBA943C8E3EF19C3BA2C98C9685F +PT=E46E5FB6019BA52524A383A18A89583A +CT=C96D250343B134241221490AB39931DB + +I=307 +KEY=C00969793E1DD34E861A947CD615D279 +IV=C96D250343B134241221490AB39931DB +PT=A3A544B8982C2F9EA0CD0ABC4D6392E2 +CT=951D54AABDF6F5B70E700C4896EB2685 + +I=308 +KEY=55143DD383EB26F9886A983440FEF4FC +IV=951D54AABDF6F5B70E700C4896EB2685 +PT=43FEB2051478A02BA1F054C9E82F0209 +CT=1F90165BE29C6C86D09AD07B1C006CA6 + +I=309 +KEY=4A842B8861774A7F58F0484F5CFE985A +IV=1F90165BE29C6C86D09AD07B1C006CA6 +PT=558AD95B25BAB5205FB7E529C96E5B59 +CT=40C0A0427C12AB1F72A7ADF96F82D437 + +I=310 +KEY=0A448BCA1D65E1602A57E5B6337C4C6D +IV=40C0A0427C12AB1F72A7ADF96F82D437 +PT=BABA13A1244DEFF5E4A2AB8183775773 +CT=FB08FDF3BF4394BA1A92C45B7F5F3060 + +I=311 +KEY=F14C7639A22675DA30C521ED4C237C0D +IV=FB08FDF3BF4394BA1A92C45B7F5F3060 +PT=46E036ECCDBE88931E552E45CBBC2BDC +CT=311AE8C2B7CB633178874BDEEEE0602F + +I=312 +KEY=C0569EFB15ED16EB48426A33A2C31C22 +IV=311AE8C2B7CB633178874BDEEEE0602F +PT=4D5C919959478AD0D9862BA509233102 +CT=1DC85D9A8877C79698C7D1C1610CBAE9 + +I=313 +KEY=DD9EC3619D9AD17DD085BBF2C3CFA6CB +IV=1DC85D9A8877C79698C7D1C1610CBAE9 +PT=D423E31E9FD6E4F4373FA7AD31CC6011 +CT=FC55E7BEA15BD539EDACB202F0218D4A + +I=314 +KEY=21CB24DF3CC104443D2909F033EE2B81 +IV=FC55E7BEA15BD539EDACB202F0218D4A +PT=52C2C696A4343C0F280A3BC8F6AA19EA +CT=FFD9FECD3A4EC194568A96C5A899E8D2 + +I=315 +KEY=DE12DA12068FC5D06BA39F359B77C353 +IV=FFD9FECD3A4EC194568A96C5A899E8D2 +PT=3B2266FAB514211E8E33AFA566898083 +CT=DC1A545F354365A0002180BACCE0AD25 + +I=316 +KEY=02088E4D33CCA0706B821F8F57976E76 +IV=DC1A545F354365A0002180BACCE0AD25 +PT=DC20E6BD8B8AC822CF2B505E580E6A80 +CT=51CF4C11F15B8B565B875F769C2FD37F + +I=317 +KEY=53C7C25CC2972B26300540F9CBB8BD09 +IV=51CF4C11F15B8B565B875F769C2FD37F +PT=67B4C3E2AFC3402901549265186303FB +CT=A118B7E5B10DAB4DDB449877AB1E6897 + +I=318 +KEY=F2DF75B9739A806BEB41D88E60A6D59E +IV=A118B7E5B10DAB4DDB449877AB1E6897 +PT=971952EE322CD68462B4CE8B772BBA48 +CT=A2988AAC94D8A7EFB32B34CC07911F3E + +I=319 +KEY=5047FF15E7422784586AEC426737CAA0 +IV=A2988AAC94D8A7EFB32B34CC07911F3E +PT=64C2665506EDDED98EC55D2CCED7762C +CT=86AEB7B90565D05293A8D9146880C307 + +I=320 +KEY=D6E948ACE227F7D6CBC235560FB709A7 +IV=86AEB7B90565D05293A8D9146880C307 +PT=A5E7E411209DD2A34AA8CDA3153A69E4 +CT=27746442FAC1DF26B11A55251AAFD865 + +I=321 +KEY=F19D2CEE18E628F07AD860731518D1C2 +IV=27746442FAC1DF26B11A55251AAFD865 +PT=83A41EF5F664A909BC47939D7858C221 +CT=619A164C3F2119FFCA3832A5EA958E01 + +I=322 +KEY=90073AA227C7310FB0E052D6FF8D5FC3 +IV=619A164C3F2119FFCA3832A5EA958E01 +PT=1F5A31EBB2C515728DB07EE3160D03CD +CT=DEE1692D386EF5A8861BE5D8A4630906 + +I=323 +KEY=4EE6538F1FA9C4A736FBB70E5BEE56C5 +IV=DEE1692D386EF5A8861BE5D8A4630906 +PT=297B343F5EE6221FB6CC40E0C836B387 +CT=B2BA45B0A776A950C32DD5F302201FC3 + +I=324 +KEY=FC5C163FB8DF6DF7F5D662FD59CE4906 +IV=B2BA45B0A776A950C32DD5F302201FC3 +PT=CC3601DC94B13116DF3012860A522D2D +CT=6D141746B23B4E1EF20DFE6C14D6ECE4 + +I=325 +KEY=914801790AE423E907DB9C914D18A5E2 +IV=6D141746B23B4E1EF20DFE6C14D6ECE4 +PT=FE07DA9A6E8B712B1FDFC3C1CC87146D +CT=0D80E8F5557A88A271133F8929125C72 + +I=326 +KEY=9CC8E98C5F9EAB4B76C8A318640AF990 +IV=0D80E8F5557A88A271133F8929125C72 +PT=EBDC0192755A685D6275532E93D33890 +CT=B88A629A8E22A78BAF98C9E623F48134 + +I=327 +KEY=24428B16D1BC0CC0D9506AFE47FE78A4 +IV=B88A629A8E22A78BAF98C9E623F48134 +PT=78AD3067BE2E9536ADB58DA49D7CA6DA +CT=0A9C2D318240F4FA4FF91CC5D23A371F + +I=328 +KEY=2EDEA62753FCF83A96A9763B95C44FBB +IV=0A9C2D318240F4FA4FF91CC5D23A371F +PT=04C72A08CCC36B4211AFE98637C4CEFF +CT=A42618A89B9E618DDD7A983081E086B9 + +I=329 +KEY=8AF8BE8FC86299B74BD3EE0B1424C902 +IV=A42618A89B9E618DDD7A983081E086B9 +PT=22D4A346027B8E5FEE1C0C0C45CA7DCB +CT=7CC4479AE05A295723F27545E1A46B7B + +I=330 +KEY=F63CF9152838B0E068219B4EF580A279 +IV=7CC4479AE05A295723F27545E1A46B7B +PT=05090A5C8F3CD0E7F7EA11B33CDF3C1D +CT=815BCEB2A29EA2A491C8E39B117790EC + +I=331 +KEY=776737A78AA61244F9E978D5E4F73295 +IV=815BCEB2A29EA2A491C8E39B117790EC +PT=7B40F8A4AC0E4C6BD73A59FFC91CA77D +CT=E4ED412F3ECDD4B7409BEEAEDC2C755F + +I=332 +KEY=938A7688B46BC6F3B972967B38DB47CA +IV=E4ED412F3ECDD4B7409BEEAEDC2C755F +PT=047E2E4681A97ED20308F1FE4B132F7B +CT=10153209AED4115329587180D65A0B97 + +I=333 +KEY=839F44811ABFD7A0902AE7FBEE814C5D +IV=10153209AED4115329587180D65A0B97 +PT=32671E6C0D28744AB457587BBB6DD21E +CT=847F781EDF77A870C4EA99CCC1721917 + +I=334 +KEY=07E03C9FC5C87FD054C07E372FF3554A +IV=847F781EDF77A870C4EA99CCC1721917 +PT=EC3159B002B95054F00D57049D91E32B +CT=05CC06529764F6747FCB2B62569C428C + +I=335 +KEY=022C3ACD52AC89A42B0B5555796F17C6 +IV=05CC06529764F6747FCB2B62569C428C +PT=9A930743113957D10EC643D8D8034C73 +CT=D1C7957073C2A44D9483DD11F3FA2B1E + +I=336 +KEY=D3EBAFBD216E2DE9BF8888448A953CD8 +IV=D1C7957073C2A44D9483DD11F3FA2B1E +PT=2E061A5B483D0D834D3019954E54CF80 +CT=0AC3300C59DB7A76A1E16DC5BF167B70 + +I=337 +KEY=D9289FB178B5579F1E69E581358347A8 +IV=0AC3300C59DB7A76A1E16DC5BF167B70 +PT=2A6E00DF7820913341D26EF611A7BEC1 +CT=5A5A1BE396D3C56DB0690B92A925D8D8 + +I=338 +KEY=83728452EE6692F2AE00EE139CA69F70 +IV=5A5A1BE396D3C56DB0690B92A925D8D8 +PT=E871C79BA6132F15C80A85F4BC732E77 +CT=829ABA07496E1269437680257308029D + +I=339 +KEY=01E83E55A708809BED766E36EFAE9DED +IV=829ABA07496E1269437680257308029D +PT=5955643AB76251E6AF97BC2490D09A72 +CT=3FEDBF80B703D067126EF55B02A41175 + +I=340 +KEY=3E0581D5100B50FCFF189B6DED0A8C98 +IV=3FEDBF80B703D067126EF55B02A41175 +PT=32BCF86ECA6CCE8F9C1C87AD9FDF8238 +CT=B59D6C5FCA91EDBFE75E795638CAD286 + +I=341 +KEY=8B98ED8ADA9ABD431846E23BD5C05E1E +IV=B59D6C5FCA91EDBFE75E795638CAD286 +PT=01A08051FC1D98C1BDAE4CA1D41D91E6 +CT=21CB8EF8BBE6C371A26BFF92701C3D1A + +I=342 +KEY=AA536372617C7E32BA2D1DA9A5DC6304 +IV=21CB8EF8BBE6C371A26BFF92701C3D1A +PT=5F5D891DF8D595D3FEDAEF0174B0A1D1 +CT=23D0FB6489113D3D4AA6470210698391 + +I=343 +KEY=89839816E86D430FF08B5AABB5B5E095 +IV=23D0FB6489113D3D4AA6470210698391 +PT=54FEAB37EFCD36D28E943DD85E803812 +CT=45F0556ED9A8ED0E1C8B0A0BA648E069 + +I=344 +KEY=CC73CD7831C5AE01EC0050A013FD00FC +IV=45F0556ED9A8ED0E1C8B0A0BA648E069 +PT=7AF4BC398ACAD37F526BDE12F3ED59ED +CT=C41E115EE06FFE5DED10480A1BE5B720 + +I=345 +KEY=086DDC26D1AA505C011018AA0818B7DC +IV=C41E115EE06FFE5DED10480A1BE5B720 +PT=CF15E4B6DDF60A4EE0CB6CBFA8AD499B +CT=1098A41E2C97C9D70626E4D1841F5CC1 + +I=346 +KEY=18F57838FD3D998B0736FC7B8C07EB1D +IV=1098A41E2C97C9D70626E4D1841F5CC1 +PT=BAD4050A0013AB8BC556F367AB634D94 +CT=D9B58211EB935246A5E04FCD3BE10B54 + +I=347 +KEY=C140FA2916AECBCDA2D6B3B6B7E6E049 +IV=D9B58211EB935246A5E04FCD3BE10B54 +PT=CEFF0AF7EF4EA7EF3B0E8BF7FB756E77 +CT=50FAE8C770EF7F9D5FE93B090B9D5C66 + +I=348 +KEY=91BA12EE6641B450FD3F88BFBC7BBC2F +IV=50FAE8C770EF7F9D5FE93B090B9D5C66 +PT=3B8C412B4156B413AD06CB181B4C5EAA +CT=E47249D4B5F24FF415B0E669EBF471B1 + +I=349 +KEY=75C85B3AD3B3FBA4E88F6ED6578FCD9E +IV=E47249D4B5F24FF415B0E669EBF471B1 +PT=56C612C5C594CAFB7B1CE8131E786DF0 +CT=6AF057199C217EECB886D940F61B91C5 + +I=350 +KEY=1F380C234F9285485009B796A1945C5B +IV=6AF057199C217EECB886D940F61B91C5 +PT=5629EF768743AB63D5B79B511C0A6BEF +CT=A5A76C330984D34310D021A6C2BDE9BC + +I=351 +KEY=BA9F60104616560B40D996306329B5E7 +IV=A5A76C330984D34310D021A6C2BDE9BC +PT=ED8DF427A02692C09D7AAEF2EDAA1249 +CT=8AAEFBA5DE0AAA41D947E3238B279913 + +I=352 +KEY=30319BB5981CFC4A999E7513E80E2CF4 +IV=8AAEFBA5DE0AAA41D947E3238B279913 +PT=949339605F30310FC557F2CA4815B034 +CT=9408BCB67EA573E7B5359B67918C16B9 + +I=353 +KEY=A4392703E6B98FAD2CABEE7479823A4D +IV=9408BCB67EA573E7B5359B67918C16B9 +PT=03607642CBBCCA2134837AC4BB452682 +CT=90660AF3DD0EAC1B61BB60EB49408586 + +I=354 +KEY=345F2DF03BB723B64D108E9F30C2BFCB +IV=90660AF3DD0EAC1B61BB60EB49408586 +PT=DE00E32930E14BD4297F9D789D0C25A1 +CT=1C48AC020174C0D87443229C113E2838 + +I=355 +KEY=281781F23AC3E36E3953AC0321FC97F3 +IV=1C48AC020174C0D87443229C113E2838 +PT=9CA7A04855F8404176D7D30B594B65AC +CT=7ACCB3FD4F9C7A5BFB83A969EB6D211A + +I=356 +KEY=52DB320F755F9935C2D0056ACA91B6E9 +IV=7ACCB3FD4F9C7A5BFB83A969EB6D211A +PT=DC0B392E998A347ECB789A51A09F1B1D +CT=22BED79EF2CAFF83BE8CEE5D7001DE21 + +I=357 +KEY=7065E591879566B67C5CEB37BA9068C8 +IV=22BED79EF2CAFF83BE8CEE5D7001DE21 +PT=07210334590A9314031D98F7DFBB84B9 +CT=44B16879886BC331407D1E7C7F247A04 + +I=358 +KEY=34D48DE80FFEA5873C21F54BC5B412CC +IV=44B16879886BC331407D1E7C7F247A04 +PT=27DDF18405E56989E59ED442C8825DD6 +CT=2787AD57159450916A45C72D0E074D53 + +I=359 +KEY=135320BF1A6AF51656643266CBB35F9F +IV=2787AD57159450916A45C72D0E074D53 +PT=4F43202A454BB0F3A9440DA558BEE228 +CT=3C1B83C66CEEEB27644BC66ACC3117E8 + +I=360 +KEY=2F48A37976841E31322FF40C07824877 +IV=3C1B83C66CEEEB27644BC66ACC3117E8 +PT=28ED6A88BDE4ADEFDA5C0F629109A7A3 +CT=B6009481F8C5D3EE37C645CF238238A1 + +I=361 +KEY=994837F88E41CDDF05E9B1C3240070D6 +IV=B6009481F8C5D3EE37C645CF238238A1 +PT=48DC5A3700CD4A7A9B066DC0E2667544 +CT=C1A20854601D7A81CAC51E9237BDC030 + +I=362 +KEY=58EA3FACEE5CB75ECF2CAF5113BDB0E6 +IV=C1A20854601D7A81CAC51E9237BDC030 +PT=1F84C71120B50FDF715B60DB69DECBE0 +CT=663EDB4EFD3F6AC2259A43C926ACE66D + +I=363 +KEY=3ED4E4E21363DD9CEAB6EC983511568B +IV=663EDB4EFD3F6AC2259A43C926ACE66D +PT=D6F9C59367A57E1DBDC2F4627524BC9A +CT=CA84A10F987212D75B744A7966ABBABA + +I=364 +KEY=F45045ED8B11CF4BB1C2A6E153BAEC31 +IV=CA84A10F987212D75B744A7966ABBABA +PT=1D8BC84060844CE5C40C716F2190C2BB +CT=ABAEEB339C4D150E894392444E021710 + +I=365 +KEY=5FFEAEDE175CDA45388134A51DB8FB21 +IV=ABAEEB339C4D150E894392444E021710 +PT=1300843AABCFB110198F0F0102C0A4D5 +CT=DBA9A1F8EE9AB8300D0273F71EAC5D1C + +I=366 +KEY=84570F26F9C66275358347520314A63D +IV=DBA9A1F8EE9AB8300D0273F71EAC5D1C +PT=1EA11B05D7DA9D770BA9AB619267B7A3 +CT=4921F1CB4A9AA6594C205D8FF0B2DEC9 + +I=367 +KEY=CD76FEEDB35CC42C79A31ADDF3A678F4 +IV=4921F1CB4A9AA6594C205D8FF0B2DEC9 +PT=9ABA414156563E88A8CCDB3BD226F66C +CT=4CF623AC6E145E2D61CAD28BFBF1F1E5 + +I=368 +KEY=8180DD41DD489A011869C85608578911 +IV=4CF623AC6E145E2D61CAD28BFBF1F1E5 +PT=FEF20625FA0C788DB8A20298F6933F6F +CT=67C491A5CA1A065980BDECE44B7979F1 + +I=369 +KEY=E6444CE417529C5898D424B2432EF0E0 +IV=67C491A5CA1A065980BDECE44B7979F1 +PT=79C4A475D0E064D72D48AF6357A0E6A0 +CT=529766CDD1223ED05C055108F91E6526 + +I=370 +KEY=B4D32A29C670A288C4D175BABA3095C6 +IV=529766CDD1223ED05C055108F91E6526 +PT=0758AA9195AE8684B9FEEBEF8E1226AE +CT=2AEC009219ECD0499DD729352C220E7D + +I=371 +KEY=9E3F2ABBDF9C72C159065C8F96129BBB +IV=2AEC009219ECD0499DD729352C220E7D +PT=886713433798AB16E87A8AD3A8CD0C87 +CT=0DE2A7554E343B6FFC6D1ECF4A8AF0DD + +I=372 +KEY=93DD8DEE91A849AEA56B4240DC986B66 +IV=0DE2A7554E343B6FFC6D1ECF4A8AF0DD +PT=984E8BA3DFFB4E9A1244D65BEA7DC594 +CT=8111340B4AF2CD82FF15447143069276 + +I=373 +KEY=12CCB9E5DB5A842C5A7E06319F9EF910 +IV=8111340B4AF2CD82FF15447143069276 +PT=A4F6C8ACF4F1050D11E42FEF1B6C8B68 +CT=BB4693FA1399583EACB21D2675E6D156 + +I=374 +KEY=A98A2A1FC8C3DC12F6CC1B17EA782846 +IV=BB4693FA1399583EACB21D2675E6D156 +PT=C5DBE1A937D6EA2FDD9A1A2FD25217B9 +CT=BC01B078339637D796F822B7E58D968D + +I=375 +KEY=158B9A67FB55EBC5603439A00FF5BECB +IV=BC01B078339637D796F822B7E58D968D +PT=DBD0494B0FE3149F8BCB8A70D344E811 +CT=600C1EFBDCA314A6F9714DEE413B9BD2 + +I=376 +KEY=7587849C27F6FF639945744E4ECE2519 +IV=600C1EFBDCA314A6F9714DEE413B9BD2 +PT=FCA88DCB484317D7F886E7437BC9E669 +CT=2E3788A647105DD0A286E2EFFD469C99 + +I=377 +KEY=5BB00C3A60E6A2B33BC396A1B388B980 +IV=2E3788A647105DD0A286E2EFFD469C99 +PT=65AF28E41B3DA5ACE3B2CC9A25EAD28C +CT=5411E48B57058A52C8560423BCFFBCD2 + +I=378 +KEY=0FA1E8B137E328E1F39592820F770552 +IV=5411E48B57058A52C8560423BCFFBCD2 +PT=6DD82A9F1CF0A5134A76899B04BE37D5 +CT=C3F69C8ED682BF252D5119D1695126E1 + +I=379 +KEY=CC57743FE16197C4DEC48B53662623B3 +IV=C3F69C8ED682BF252D5119D1695126E1 +PT=DE729AB3803144FD958D8597396BC8ED +CT=0941B78975FD2945B4AA81E8C58E3CB2 + +I=380 +KEY=C516C3B6949CBE816A6E0ABBA3A81F01 +IV=0941B78975FD2945B4AA81E8C58E3CB2 +PT=D8404E7A17254EB40683A8919A9563B4 +CT=BF647E0346C013E138A2F0B06E7BB142 + +I=381 +KEY=7A72BDB5D25CAD6052CCFA0BCDD3AE43 +IV=BF647E0346C013E138A2F0B06E7BB142 +PT=214089EC2996CE9FA2BBFEFBCAC03509 +CT=AFDA67B9451FF758CC87BBD93C7D4BE4 + +I=382 +KEY=D5A8DA0C97435A389E4B41D2F1AEE5A7 +IV=AFDA67B9451FF758CC87BBD93C7D4BE4 +PT=9406E9D4FB4592A609BBDB23CE5F9D7F +CT=B18202E4CA510695540371A8B6523616 + +I=383 +KEY=642AD8E85D125CADCA48307A47FCD3B1 +IV=B18202E4CA510695540371A8B6523616 +PT=FEE45BE0503B4093747AFCEA9881D30D +CT=64E149A4A1840F93D675B041ED81D45A + +I=384 +KEY=00CB914CFC96533E1C3D803BAA7D07EB +IV=64E149A4A1840F93D675B041ED81D45A +PT=880368D5609350167C7826DA30DCFF59 +CT=65A363E9837DFBBDA2688E6F4FBE6C35 + +I=385 +KEY=6568F2A57FEBA883BE550E54E5C36BDE +IV=65A363E9837DFBBDA2688E6F4FBE6C35 +PT=29C5940D09A8723B441FC469C909813A +CT=2A47FDF5BF600891DF4D9E8AA34748BA + +I=386 +KEY=4F2F0F50C08BA012611890DE46842364 +IV=2A47FDF5BF600891DF4D9E8AA34748BA +PT=20AF0FF7BAC0F468C12BD2816A8B1620 +CT=68A637E4B94EC150C84A6EBB005BB79B + +I=387 +KEY=278938B479C56142A952FE6546DF94FF +IV=68A637E4B94EC150C84A6EBB005BB79B +PT=42906D013A3F0A426B01B489ECA6CAD7 +CT=A090CA02FCD40F01CA0D1A699E30C164 + +I=388 +KEY=8719F2B685116E43635FE40CD8EF559B +IV=A090CA02FCD40F01CA0D1A699E30C164 +PT=05A02D4D7D90BCA74ECE791CD865CB88 +CT=F70109F0EBBA56959B3013565E2BDFFC + +I=389 +KEY=7018FB466EAB38D6F86FF75A86C48A67 +IV=F70109F0EBBA56959B3013565E2BDFFC +PT=C373AB7B8F770212F9D5CEF40099086C +CT=67221CC1F104809B8A5D35431963812D + +I=390 +KEY=173AE7879FAFB84D7232C2199FA70B4A +IV=67221CC1F104809B8A5D35431963812D +PT=8C59B2A7FD50EC66ABACC0531BE33237 +CT=E06166175F68155DB86E268F3C5524AE + +I=391 +KEY=F75B8190C0C7AD10CA5CE496A3F22FE4 +IV=E06166175F68155DB86E268F3C5524AE +PT=D39790AED2970355A6337AAD2CA4D501 +CT=85E89883242A3B68F4AAF922646EB385 + +I=392 +KEY=72B31913E4ED96783EF61DB4C79C9C61 +IV=85E89883242A3B68F4AAF922646EB385 +PT=87D4160C7C97476D0884A22B5983AA65 +CT=038C79FDFAA0B4F4AD9DC336F46CACDF + +I=393 +KEY=713F60EE1E4D228C936BDE8233F030BE +IV=038C79FDFAA0B4F4AD9DC336F46CACDF +PT=3B59088B5ADC77E4B3FC31897C6389B5 +CT=F6C92ECB3332E5E93C9DE29F27F94BB3 + +I=394 +KEY=87F64E252D7FC765AFF63C1D14097B0D +IV=F6C92ECB3332E5E93C9DE29F27F94BB3 +PT=68BA9BEBB40B3E35D2E577A2831CF9DB +CT=7B72342488233DAD5ACF0A8D54EA9E8B + +I=395 +KEY=FC847A01A55CFAC8F539369040E3E586 +IV=7B72342488233DAD5ACF0A8D54EA9E8B +PT=7816251219B8C7F009ADD7A1898D02CF +CT=45CBA66AD6045917C3E8257D3ECBECDB + +I=396 +KEY=B94FDC6B7358A3DF36D113ED7E28095D +IV=45CBA66AD6045917C3E8257D3ECBECDB +PT=F542FEAB12E2EA9AE761E58108784E37 +CT=82E289465F5838036B9880C33AEBCB83 + +I=397 +KEY=3BAD552D2C009BDC5D49932E44C3C2DE +IV=82E289465F5838036B9880C33AEBCB83 +PT=3B8208791DAE56383CC2BCB44097C9D3 +CT=F02F2B89DE46D01F46AD95C82AF0C20E + +I=398 +KEY=CB827EA4F2464BC31BE406E66E3300D0 +IV=F02F2B89DE46D01F46AD95C82AF0C20E +PT=3F2C0F7A0AEAB04F318C661ABCFED153 +CT=8D4FAF6332578524301ACA22AD86965B + +I=399 +KEY=46CDD1C7C011CEE72BFECCC4C3B5968B +IV=8D4FAF6332578524301ACA22AD86965B +PT=A27200B51D69AAC22F1C567F8BCEABFA +CT=2F844CBF78EBA70DA7A49601388F1AB6 + +========== + +KEYSIZE=192 + +I=0 +KEY=000000000000000000000000000000000000000000000000 +IV=00000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=7BD966D53AD8C1BB85D2ADFAE87BB104 + +I=1 +KEY=506339DAE3B35BEB7BD966D53AD8C1BB85D2ADFAE87BB104 +IV=7BD966D53AD8C1BB85D2ADFAE87BB104 +PT=0555C410F44C7AA4506339DAE3B35BEB +CT=869C061BE9CFEAB5D285B0724A9A8970 + +I=2 +KEY=74D3414C2374367BFD4560CED3172B0E57571D88A2E13874 +IV=869C061BE9CFEAB5D285B0724A9A8970 +PT=C6FB25A188CF7F3F24B07896C0C76D90 +CT=9E58A52B3840DBE16E8063A18220FEE4 + +I=3 +KEY=DDE2DF4EEC312FA3631DC5E5EB57F0EF39D77E2920C1C690 +IV=9E58A52B3840DBE16E8063A18220FEE4 +PT=84E3D4168A8469A6A9319E02CF4519D8 +CT=730A256C202B9D57F3C0D73AD4B6CBED + +I=4 +KEY=9D973AECAF19E9951017E089CB7C6DB8CA17A913F4770D7D +IV=730A256C202B9D57F3C0D73AD4B6CBED +PT=E000CE26CD3185B44075E5A24328C636 +CT=E79EF11C5C1FD1AB75280BCFFCFE89D4 + +I=5 +KEY=7A52007B2C40C9F4F78911959763BC13BF3FA2DC088984A9 +IV=E79EF11C5C1FD1AB75280BCFFCFE89D4 +PT=19D79403BB238816E7C53A9783592061 +CT=65744444724F1052D0B8674EDC8083B5 + +I=6 +KEY=40D50426A8D09F3292FD55D1E52CAC416F87C592D409071C +IV=65744444724F1052D0B8674EDC8083B5 +PT=FDFA33685E2B5BBC3A87045D849056C6 +CT=23C6377D3D076491AD93E2B6112289C7 + +I=7 +KEY=6FD062412FE1AE4EB13B62ACD82BC8D0C2142724C52B8EDB +IV=23C6377D3D076491AD93E2B6112289C7 +PT=5056DDDEF15831502F0566678731317C +CT=F13A83088536BF30E5E9018BE57D7D89 + +I=8 +KEY=EB4DB5F469D0EE9B4001E1A45D1D77E027FD26AF2056F352 +IV=F13A83088536BF30E5E9018BE57D7D89 +PT=0EE535A4A524668F849DD7B5463140D5 +CT=3F496CB19B21C37159528BF345473E6D + +I=9 +KEY=AA6E5744B909D9A87F488D15C63CB4917EAFAD5C6511CD3F +IV=3F496CB19B21C37159528BF345473E6D +PT=3A11F90EB51C81ED4123E2B0D0D93733 +CT=CF79C1EDEE17A68DC7E673006AEC90D9 + +I=10 +KEY=64AB0C0C9471B77FB0314CF8282B121CB949DE5C0FFD5DE6 +IV=CF79C1EDEE17A68DC7E673006AEC90D9 +PT=85187E7F91280A5BCEC55B482D786ED7 +CT=92D1757BEBCE6E0406407819AF82353F + +I=11 +KEY=9E5720C1DC2E285C22E03983C3E57C18BF09A645A07F68D9 +IV=92D1757BEBCE6E0406407819AF82353F +PT=45147511BC08EC76FAFC2CCD485F9F23 +CT=8C0228F57523D746E67D27A8E6C426D9 + +I=12 +KEY=EBBB8245582E4367AEE21176B6C6AB5E597481ED46BB4E00 +IV=8C0228F57523D746E67D27A8E6C426D9 +PT=73B9EEAC644CBB8875ECA28484006B3B +CT=D0025BF1FC35DD9BDA20F42DF775AF71 + +I=13 +KEY=5F938EE9CC63C9E87EE04A874AF376C5835475C0B1CEE171 +IV=D0025BF1FC35DD9BDA20F42DF775AF71 +PT=DE2507F01BC8B212B4280CAC944D8A8F +CT=3FDDD3E04B2CBE79BB07D82182CD3787 + +I=14 +KEY=B94E2EC5F6E86EDC413D996701DFC8BC3853ADE13303D6F6 +IV=3FDDD3E04B2CBE79BB07D82182CD3787 +PT=90CE32BCC16C20F7E6DDA02C3A8BA734 +CT=F7B491E4C40B60BE8ACF16D68E3ED60F + +I=15 +KEY=DE41ABD8C44F5DF6B6890883C5D4A802B29CBB37BD3D00F9 +IV=F7B491E4C40B60BE8ACF16D68E3ED60F +PT=B7ACCA62BB9974BC670F851D32A7332A +CT=7ED4055D367CB31A4CF1CC17132E00B5 + +I=16 +KEY=E2A57C71F23BC4DEC85D0DDEF3A81B18FE6D7720AE13004C +IV=7ED4055D367CB31A4CF1CC17132E00B5 +PT=1CA59C2384797B803CE4D7A936749928 +CT=8D50A87F14D466323929BB52FA60FA42 + +I=17 +KEY=2FA1A78B8BCC301C450DA5A1E77C7D2AC744CC725473FA0E +IV=8D50A87F14D466323929BB52FA60FA42 +PT=0A623319F2A051ACCD04DBFA79F7F4C2 +CT=7C02D378606FC33DFCEF8AA2A000383E + +I=18 +KEY=A949CE493892DF58390F76D98713BE173BAB46D0F473C230 +IV=7C02D378606FC33DFCEF8AA2A000383E +PT=EE8F5FF6A7FF813386E869C2B35EEF44 +CT=CAE55B9CCBB5A68EBF0D2AB55E079FD4 + +I=19 +KEY=E159445FE4201A6CF3EA2D454CA6189984A66C65AA745DE4 +IV=CAE55B9CCBB5A68EBF0D2AB55E079FD4 +PT=9699456986535C4648108A16DCB2C534 +CT=9056685FBFECC7A6143DB5AC314DAC88 + +I=20 +KEY=EE4F7BF96BF1163E63BC451AF34ADF3F909BD9C99B39F16C +IV=9056685FBFECC7A6143DB5AC314DAC88 +PT=16D6C34C3B57AC0A0F163FA68FD10C52 +CT=4D6A5542F0680CE37E88119141F321F5 + +I=21 +KEY=27F8CEE0120E8A0F2ED610580322D3DCEE13C858DACAD099 +IV=4D6A5542F0680CE37E88119141F321F5 +PT=337839926E36EC77C9B7B51979FF9C31 +CT=78E16D6027F0D190E78825C2F52E5364 + +I=22 +KEY=0AF4D3D8EB9FF18A56377D3824D2024C099BED9A2FE483FD +IV=78E16D6027F0D190E78825C2F52E5364 +PT=8F96B66F934467C72D0C1D38F9917B85 +CT=82A81B33F80A105DD7D9CC6DDFECDB96 + +I=23 +KEY=AD2AFC821170D967D49F660BDCD81211DE4221F7F008586B +IV=82A81B33F80A105DD7D9CC6DDFECDB96 +PT=E2CB8E6E329C6660A7DE2F5AFAEF28ED +CT=0BCD68A063BA3540B3E04C885DF45BD0 + +I=24 +KEY=5B50EE72BD6CE837DF520EABBF6227516DA26D7FADFC03BB +IV=0BCD68A063BA3540B3E04C885DF45BD0 +PT=31A14C64CD8BCC8FF67A12F0AC1C3150 +CT=DB27EA5834BF572EA50E03E0773C1010 + +I=25 +KEY=BF4D8A58F54D47620475E4F38BDD707FC8AC6E9FDAC013AB +IV=DB27EA5834BF572EA50E03E0773C1010 +PT=26755B5C0BE60998E41D642A4821AF55 +CT=655A896243B5E86B2F74299A317A2E4C + +I=26 +KEY=8DC190D88B17EAB9612F6D91C8689814E7D84705EBBA3DE7 +IV=655A896243B5E86B2F74299A317A2E4C +PT=C6920ADCED82F661328C1A807E5AADDB +CT=9F45472FDBB732C745AD228810392EA2 + +I=27 +KEY=B44071C6F14CDA97FE6A2ABE13DFAAD3A275658DFB831345 +IV=9F45472FDBB732C745AD228810392EA2 +PT=2178DFA9784E563E3981E11E7A5B302E +CT=9F985FBF08235845E396BFCE54BCE7C8 + +I=28 +KEY=A3C12E42B53D829E61F275011BFCF29641E3DA43AF3FF48D +IV=9F985FBF08235845E396BFCE54BCE7C8 +PT=44977E2274DA25AE17815F8444715809 +CT=033EAF4FAC934D123012279B1663C80B + +I=29 +KEY=8FD2B79E25E39C4A62CCDA4EB76FBF8471F1FDD8B95C3C86 +IV=033EAF4FAC934D123012279B1663C80B +PT=425088D4626CD7972C1399DC90DE1ED4 +CT=A962CB4707B0048BB81F4225EFC85E48 + +I=30 +KEY=3D68793EF46B8125CBAE1109B0DFBB0FC9EEBFFD569462CE +IV=A962CB4707B0048BB81F4225EFC85E48 +PT=EF21ED587C272175B2BACEA0D1881D6F +CT=6F3A0D63A22C003F7F65B09098F667DB + +I=31 +KEY=6A4FB651BE9D0BAFA4941C6A12F3BB30B68B0F6DCE620515 +IV=6F3A0D63A22C003F7F65B09098F667DB +PT=16054E60B460B2D15727CF6F4AF68A8A +CT=8BB46230FF03665765F2E5AAEA14104F + +I=32 +KEY=3F5991D63C15A1822F207E5AEDF0DD67D379EAC72476155A +IV=8BB46230FF03665765F2E5AAEA14104F +PT=82D0B12FEA88917F551627878288AA2D +CT=8E1A664131FAB09E786E111C3C20A7BB + +I=33 +KEY=456F69D38929ED82A13A181BDC0A6DF9AB17FBDB1856B2E1 +IV=8E1A664131FAB09E786E111C3C20A7BB +PT=1384D3B7CAEB528A7A36F805B53C4C00 +CT=92D99BF1D71026D2BF78E32421E34E52 + +I=34 +KEY=658891F63379484C33E383EA0B1A4B2B146F18FF39B5FCB3 +IV=92D99BF1D71026D2BF78E32421E34E52 +PT=9F60C3117269E88920E7F825BA50A5CE +CT=7DB6782C68EC5FC75A2A75E4EA7B4071 + +I=35 +KEY=9193E2EACE8423F64E55FBC663F614EC4E456D1BD3CEBCC2 +IV=7DB6782C68EC5FC75A2A75E4EA7B4071 +PT=232ECA0370EBD920F41B731CFDFD6BBA +CT=D76A1E73E977533E6D7C74277DAFEB48 + +I=36 +KEY=F4C34FE273D0FCB5993FE5B58A8147D22339193CAE61578A +IV=D76A1E73E977533E6D7C74277DAFEB48 +PT=5BCD8C6C4D14321F6550AD08BD54DF43 +CT=4A69E9081DDD43A6061700C7DA8F5E73 + +I=37 +KEY=DC82C155896C5D5CD3560CBD975C0474252E19FB74EE09F9 +IV=4A69E9081DDD43A6061700C7DA8F5E73 +PT=C914BB961EA890D828418EB7FABCA1E9 +CT=91EE5BE28C27F055258BC3E1F37E2DEC + +I=38 +KEY=08F1655EA3656F1C42B8575F1B7BF42100A5DA1A87902415 +IV=91EE5BE28C27F055258BC3E1F37E2DEC +PT=11804F73D788115CD473A40B2A093240 +CT=86B9BE5AFD2A8A49E2651C314CAE0918 + +I=39 +KEY=59D7EFD92140A147C401E905E6517E68E2C0C62BCB3E2D0D +IV=86B9BE5AFD2A8A49E2651C314CAE0918 +PT=6E2A1E436926174E51268A878225CE5B +CT=C642F5ED78DB76738A89296B1C4A0932 + +I=40 +KEY=F6E75E7867D0FB4A02431CE89E8A081B6849EF40D774243F +IV=C642F5ED78DB76738A89296B1C4A0932 +PT=15896B8B864CF068AF30B1A146905A0D +CT=24288AE027547E499EBADE9260C8F037 + +I=41 +KEY=9A048C2BC98E15B2266B9608B9DE7652F6F331D2B7BCD408 +IV=24288AE027547E499EBADE9260C8F037 +PT=FF9A330C205DC3006CE3D253AE5EEEF8 +CT=BD9B3D670D24EDDA1EAD1DB06C8A83C7 + +I=42 +KEY=97E8C017644E9FED9BF0AB6FB4FA9B88E85E2C62DB3657CF +IV=BD9B3D670D24EDDA1EAD1DB06C8A83C7 +PT=C9A3916C34A7CCD90DEC4C3CADC08A5F +CT=1FCCBC65C44E4680E1593EE0EEFEA9A9 + +I=43 +KEY=3A2862113BD3312D843C170A70B4DD080907128235C8FE66 +IV=1FCCBC65C44E4680E1593EE0EEFEA9A9 +PT=EAF9C4A80EE93585ADC0A2065F9DAEC0 +CT=2C0004064936696B10D039D9795BABC7 + +I=44 +KEY=33FAE356C0C96F17A83C130C3982B46319D72B5B4C9355A1 +IV=2C0004064936696B10D039D9795BABC7 +PT=4181525880CA468909D28147FB1A5E3A +CT=79F193EB9A9A48464FF007D73E9B4106 + +I=45 +KEY=2136A7940C9B9FAFD1CD80E7A318FC2556272C8C720814A7 +IV=79F193EB9A9A48464FF007D73E9B4106 +PT=2899D75DFB84950E12CC44C2CC52F0B8 +CT=DA12307CE9A6BA0FCE5A76AE1747E619 + +I=46 +KEY=0C839679750274320BDFB09B4ABE462A987D5A22654FF2BE +IV=DA12307CE9A6BA0FCE5A76AE1747E619 +PT=2C71B8623CA5BF292DB531ED7999EB9D +CT=A59997FA19B58BC71CB05E7140386C94 + +I=47 +KEY=4D3CDB92797645C1AE462761530BCDED84CD045325779E2A +IV=A59997FA19B58BC71CB05E7140386C94 +PT=63F4FC202A1B921241BF4DEB0C7431F3 +CT=49E65D7422398035DD1E4EBAD37C699D + +I=48 +KEY=38082D7CC27EBABBE7A07A1571324DD859D34AE9F60BF7B7 +IV=49E65D7422398035DD1E4EBAD37C699D +PT=7F0E2FD5D4B5A0CB7534F6EEBB08FF7A +CT=64DF24483FC73174FB6482A6E2B895E0 + +I=49 +KEY=1557398CFBFF31F8837F5E5D4EF57CACA2B7C84F14B36257 +IV=64DF24483FC73174FB6482A6E2B895E0 +PT=0F525FCF2A1E3D612D5F14F039818B43 +CT=028880CC8AA1B92CB807F1102663E658 + +I=50 +KEY=229C31F1D34A529581F7DE91C454C5801AB0395F32D0840F +IV=028880CC8AA1B92CB807F1102663E658 +PT=219604B99FF2BE7B37CB087D28B5636D +CT=FAC8B66D1BA7849392CC235D0276110E + +I=51 +KEY=C75DE76D40D536277B3F68FCDFF34113887C1A0230A69501 +IV=FAC8B66D1BA7849392CC235D0276110E +PT=3319C80C038E565FE5C1D69C939F64B2 +CT=79770F286419EEFD855868EC4ADF3775 + +I=52 +KEY=5F0B08B451490B27024867D4BBEAAFEE0D2472EE7A79A274 +IV=79770F286419EEFD855868EC4ADF3775 +PT=E173A8580816CAFA9856EFD9119C3D00 +CT=FC0AA487B09DF657DB58DBF83E13E137 + +I=53 +KEY=E86E8BFBF1D65541FE42C3530B7759B9D67CA916446A4343 +IV=FC0AA487B09DF657DB58DBF83E13E137 +PT=01274C45F202C22CB765834FA09F5E66 +CT=9691EA44FC67CA29E50E7FF7DBC4D0CA + +I=54 +KEY=7849550CA6CCD87268D32917F71093903372D6E19FAE9389 +IV=9691EA44FC67CA29E50E7FF7DBC4D0CA +PT=026BD493499B7BA99027DEF7571A8D33 +CT=5206F7CF45A59FD6444CCBB6B034CF45 + +I=55 +KEY=52D81D6104DBF6DF3AD5DED8B2B50C46773E1D572F9A5CCC +IV=5206F7CF45A59FD6444CCBB6B034CF45 +PT=33CA15B3D921E7752A91486DA2172EAD +CT=F4A41D18E3EF9DE46917BADB1B5EC613 + +I=56 +KEY=36FB680165ABD632CE71C3C0515A91A21E29A78C34C49ADF +IV=F4A41D18E3EF9DE46917BADB1B5EC613 +PT=65F3084285AA869464237560617020ED +CT=6C4154D3245D2546979118A36120A911 + +I=57 +KEY=6E7548B98AA0640AA23097137507B4E489B8BF2F55E433CE +IV=6C4154D3245D2546979118A36120A911 +PT=6CF540F502D90886588E20B8EF0BB238 +CT=2A52376A7E494ADEDD53A416F73FE9C0 + +I=58 +KEY=A0D840A0E3CC1EA58862A0790B4EFE3A54EB1B39A2DBDA0E +IV=2A52376A7E494ADEDD53A416F73FE9C0 +PT=708AE2375F305572CEAD0819696C7AAF +CT=7A0EF052184147EA279839380B3DBB32 + +I=59 +KEY=153CF68E4A1C1FCEF26C502B130FB9D073732201A9E6613C +IV=7A0EF052184147EA279839380B3DBB32 +PT=A8267215107D3DD0B5E4B62EA9D0016B +CT=F193B80D57571F94A4F5373149163AA1 + +I=60 +KEY=E0B0657A66C37D8703FFE8264458A644D7861530E0F05B9D +IV=F193B80D57571F94A4F5373149163AA1 +PT=EE4B04302CB02990F58C93F42CDF6249 +CT=A28E99815C930AC05ADA4524A7E5968C + +I=61 +KEY=94760F8A93926E4DA17171A718CBAC848D5C50144715CD11 +IV=A28E99815C930AC05ADA4524A7E5968C +PT=34D122B717CBA59174C66AF0F55113CA +CT=6F9342E7915613450E823EC9A781DAA3 + +I=62 +KEY=0B352460A1579376CEE23340899DBFC183DE6EDDE09417B2 +IV=6F9342E7915613450E823EC9A781DAA3 +PT=D8689ED21F3EA8E29F432BEA32C5FD3B +CT=584BB944532A830F7F8DCDBE42E7DBFC + +I=63 +KEY=999A5CEB73DFCC1796A98A04DAB73CCEFC53A363A273CC4E +IV=584BB944532A830F7F8DCDBE42E7DBFC +PT=4E87F73D46D0C0AF92AF788BD2885F61 +CT=4AC372A4D3273C71F69D50168A9235A1 + +I=64 +KEY=42C59FFD5AA69C11DC6AF8A0099000BF0ACEF37528E1F9EF +IV=4AC372A4D3273C71F69D50168A9235A1 +PT=324DC9C2D34E95F9DB5FC31629795006 +CT=60E53CC2D5E4900D48A0C5F7EE3BC810 + +I=65 +KEY=843EBDEF0CEEBA5BBC8FC462DC7490B2426E3682C6DA31FF +IV=60E53CC2D5E4900D48A0C5F7EE3BC810 +PT=8B94F018A7115B3AC6FB22125648264A +CT=4BD7DF7DFD03A24809B751F59FACF417 + +I=66 +KEY=98E40853FA954FF5F7581B1F217732FA4BD967775976C5E8 +IV=4BD7DF7DFD03A24809B751F59FACF417 +PT=109C734AC21ED2631CDAB5BCF67BF5AE +CT=B7A3CF7E58A413C5065E9CFD23C750F9 + +I=67 +KEY=5419462C5329544A40FBD46179D3213F4D87FB8A7AB19511 +IV=B7A3CF7E58A413C5065E9CFD23C750F9 +PT=8CA507ACCDB3A793CCFD4E7FA9BC1BBF +CT=6285C3D0FD2645192C5DD046D73414CE + +I=68 +KEY=B58628819840885D227E17B184F5642661DA2BCCAD8581DF +IV=6285C3D0FD2645192C5DD046D73414CE +PT=7DE48BAD03BB9F53E19F6EADCB69DC17 +CT=583FBCEB09646CEC19D00620E5455FD5 + +I=69 +KEY=73F7F00EF22ED1B07A41AB5A8D9108CA780A2DEC48C0DE0A +IV=583FBCEB09646CEC19D00620E5455FD5 +PT=126D3F2A0BC1B168C671D88F6A6E59ED +CT=886A5273055AF7AE37EFB726DC90FD9E + +I=70 +KEY=69735F80F0B876DAF22BF92988CBFF644FE59ACA94502394 +IV=886A5273055AF7AE37EFB726DC90FD9E +PT=0B4D3F58D83D866A1A84AF8E0296A76A +CT=FD068F02BB6C2611EF78CD963EF2F78F + +I=71 +KEY=92E5FF32D46494880F2D762B33A7D975A09D575CAAA2D41B +IV=FD068F02BB6C2611EF78CD963EF2F78F +PT=705667CBCC87BF3DFB96A0B224DCE252 +CT=34713FD3FA07F0B3F94EC0FB17BB465F + +I=72 +KEY=A0DF9DCB873A1ADC3B5C49F8C9A029C659D397A7BD199244 +IV=34713FD3FA07F0B3F94EC0FB17BB465F +PT=4BF66F55275D6CB3323A62F9535E8E54 +CT=82C8A179661207B7FE178A266C607074 + +I=73 +KEY=2D1604ADAA49C3FBB994E881AFB22E71A7C41D81D179E230 +IV=82C8A179661207B7FE178A266C607074 +PT=167203BBB933707A8DC999662D73D927 +CT=DCDBCC8D11C632CB220C6E95B399A1CC + +I=74 +KEY=7D2C4B0C0D0B001A654F240CBE741CBA85C8731462E043FC +IV=DCDBCC8D11C632CB220C6E95B399A1CC +PT=668F998350BDA831503A4FA1A742C3E1 +CT=8827EBFCB24470266D5C0BA05D5974A4 + +I=75 +KEY=BE3A4CF21186C2C7ED68CFF00C306C9CE89478B43FB93758 +IV=8827EBFCB24470266D5C0BA05D5974A4 +PT=B8D1D48F3C41094EC31607FE1C8DC2DD +CT=61E59DECE1AEFFDEB9B216828953D70F + +I=76 +KEY=D0CE372842DC32508C8D521CED9E934251266E36B6EAE057 +IV=61E59DECE1AEFFDEB9B216828953D70F +PT=49A4495257D08AA56EF47BDA535AF097 +CT=ECD04FFB385CCC1D13C312A5C31810DE + +I=77 +KEY=E7274C14C4163169605D1DE7D5C25F5F42E57C9375F2F089 +IV=ECD04FFB385CCC1D13C312A5C31810DE +PT=3EED6F60FD9050A737E97B3C86CA0339 +CT=D9C90455AFBF5465F89752FB6F60BDFF + +I=78 +KEY=71E35A00CAFB898BB99419B27A7D0B3ABA722E681A924D76 +IV=D9C90455AFBF5465F89752FB6F60BDFF +PT=5CE6E7F07945191396C416140EEDB8E2 +CT=F6E795B326CFD6CCC0E230E4FE770878 + +I=79 +KEY=79DFA388989B29204F738C015CB2DDF67A901E8CE4E5450E +IV=F6E795B326CFD6CCC0E230E4FE770878 +PT=314A5784B7909F89083CF9885260A0AB +CT=6B3A00F05F79F25E4E9EDA81034A9B7B + +I=80 +KEY=75F6D5983AE6D7AC24498CF103CB2FA8340EC40DE7AFDE75 +IV=6B3A00F05F79F25E4E9EDA81034A9B7B +PT=DEC42B1A6184FDF80C297610A27DFE8C +CT=6A19BEA8826427E309BD55BCBBE246B4 + +I=81 +KEY=E47EEE65549BF1634E50325981AF084B3DB391B15C4D98C1 +IV=6A19BEA8826427E309BD55BCBBE246B4 +PT=63C46CFF49FF13B291883BFD6E7D26CF +CT=738C0B0E580C0B1ED488DDE8502CB754 + +I=82 +KEY=E6DBE45547556F403DDC3957D9A30355E93B4C590C612F95 +IV=738C0B0E580C0B1ED488DDE8502CB754 +PT=E951F5C902BD351502A50A3013CE9E23 +CT=389E33F3DAB3FAB7B2ACB853C0150B8D + +I=83 +KEY=EBA5A1BDF9FC558905420AA40310F9E25B97F40ACC742418 +IV=389E33F3DAB3FAB7B2ACB853C0150B8D +PT=54EFC45B4036B60D0D7E45E8BEA93AC9 +CT=EACAE8A4B5CCBDB28ED2162670DBD4B1 + +I=84 +KEY=B570945030615F75EF88E200B6DC4450D545E22CBCAFF0A9 +IV=EACAE8A4B5CCBDB28ED2162670DBD4B1 +PT=7F3BA6FE23AE45665ED535EDC99D0AFC +CT=535FEA61623ECD22FA1A95BF95320252 + +I=85 +KEY=F332D3DE8556F82EBCD70861D4E289722F5F7793299DF2FB +IV=535FEA61623ECD22FA1A95BF95320252 +PT=8FEB6943B22437D34642478EB537A75B +CT=CD23D928E1D3221E4D3C51670C071276 + +I=86 +KEY=1402D325D7EBA90871F4D1493531AB6C626326F4259AE08D +IV=CD23D928E1D3221E4D3C51670C071276 +PT=8B01EE4509B58B49E73000FB52BD5126 +CT=56DC7F1BE2CC26A369B3BCA71BF8FAB8 + +I=87 +KEY=389C95DC5BF411B62728AE52D7FD8DCF0BD09A533E621A35 +IV=56DC7F1BE2CC26A369B3BCA71BF8FAB8 +PT=9BFE561402B07B4C2C9E46F98C1FB8BE +CT=A059CFB443009F0ACD8E5051BD16C837 + +I=88 +KEY=89180FBFF0A12019877161E694FD12C5C65ECA028374D202 +IV=A059CFB443009F0ACD8E5051BD16C837 +PT=C8D55810C7A22E30B1849A63AB5531AF +CT=62CEB7D9A6D23B40CFD75990D1040BA4 + +I=89 +KEY=08BE01CF1E620DBEE5BFD63F322F2985098993925270D9A6 +IV=62CEB7D9A6D23B40CFD75990D1040BA4 +PT=F888764A970B03BC81A60E70EEC32DA7 +CT=F6D89003ABBF003AF013EB221AF17F99 + +I=90 +KEY=5EB9AC53FC544ADE1367463C999029BFF99A78B04881A63F +IV=F6D89003ABBF003AF013EB221AF17F99 +PT=26A25CFC1E699D8B5607AD9CE2364760 +CT=74C9E920DC16396E89774B82E7803EF5 + +I=91 +KEY=D8FAD6E8CDC96CEF67AEAF1C458610D170ED3332AF0198CA +IV=74C9E920DC16396E89774B82E7803EF5 +PT=76AFDD045A30FAA486437ABB319D2631 +CT=A5B997689B88AAC0611C2963C8C1B7CE + +I=92 +KEY=7E774E64A5F209B2C2173874DE0EBA1111F11A5167C02F04 +IV=A5B997689B88AAC0611C2963C8C1B7CE +PT=ABF525144D3415DEA68D988C683B655D +CT=7A2F39D97547C3CD336577E41C0483ED + +I=93 +KEY=0406C21AE6E015E0B83801ADAB4979DC22946DB57BC4ACE9 +IV=7A2F39D97547C3CD336577E41C0483ED +PT=E0C2466426630D1B7A718C7E43121C52 +CT=67899F7D0890E90383C05A7984604241 + +I=94 +KEY=D9249A4AFDF40BEADFB19ED0A3D990DFA15437CCFFA4EEA8 +IV=67899F7D0890E90383C05A7984604241 +PT=07E55341FCD016D7DD2258501B141E0A +CT=7B1CBCD270B09E9A1D15714D8366D174 + +I=95 +KEY=B2242464CD4D2448A4AD2202D3690E45BC4146817CC23FDC +IV=7B1CBCD270B09E9A1D15714D8366D174 +PT=25C6E62F44ABFF406B00BE2E30B92FA2 +CT=C86E27E5CA4461CE656D893A16477966 + +I=96 +KEY=602CDF824C043C836CC305E7192D6F8BD92CCFBB6A8546BA +IV=C86E27E5CA4461CE656D893A16477966 +PT=3F9D262E375F057BD208FBE6814918CB +CT=8129054CF746CB79112942AE35142E4D + +I=97 +KEY=73F82C9EE4B4D0E8EDEA00ABEE6BA4F2C8058D155F9168F7 +IV=8129054CF746CB79112942AE35142E4D +PT=7BC798EAC4C17B2D13D4F31CA8B0EC6B +CT=36F21910B1677AF19586E55E360FB8DD + +I=98 +KEY=E5FC538A60CC29A3DB1819BB5F0CDE035D83684B699ED02A +IV=36F21910B1677AF19586E55E360FB8DD +PT=D3E39037253E5BAA96047F148478F94B +CT=BA7CE80E0853D264368EE61D8E71EEBE + +I=99 +KEY=D9381EF81441B6C16164F1B5575F0C676B0D8E56E7EF3E94 +IV=BA7CE80E0853D264368EE61D8E71EEBE +PT=DE4FFDFADB81FABB3CC44D72748D9F62 +CT=971AD82D1F46F1087B37103B4BE5DD8C + +I=100 +KEY=A0BF8B4740D929C9F67E29984819FD6F103A9E6DAC0AE318 +IV=971AD82D1F46F1087B37103B4BE5DD8C +PT=FE6355B5D860522B798795BF54989F08 +CT=D17268155EE586F352BB031929441700 + +I=101 +KEY=477A0AB591FFEC5C270C418D16FC7B9C42819D74854EF418 +IV=D17268155EE586F352BB031929441700 +PT=166A50EEE05F4A39E7C581F2D126C595 +CT=2CD84FB5B587BE8B04638A9EDBA17AE2 + +I=102 +KEY=50005B4C4B11BFB20BD40E38A37BC51746E217EA5EEF8EFA +IV=2CD84FB5B587BE8B04638A9EDBA17AE2 +PT=1296DC2C1741EB2A177A51F9DAEE53EE +CT=8C2A5A31951FB2D9E8D35CD3C007B8B3 + +I=103 +KEY=E1E88DDBA5D849DF87FE5409366477CEAE314B399EE83649 +IV=8C2A5A31951FB2D9E8D35CD3C007B8B3 +PT=57C5E1A070E3C2AEB1E8D697EEC9F66D +CT=AA9E935BA264C9FD0C07072AF8499CD7 + +I=104 +KEY=D465F0FB195068CF2D60C7529400BE33A2364C1366A1AA9E +IV=AA9E935BA264C9FD0C07072AF8499CD7 +PT=77D0522670E00BD7358D7D20BC882110 +CT=A22DF6CE12C75FB99F5159A1E3E4249F + +I=105 +KEY=4DEB1B5E6398E4AD8F4D319C86C7E18A3D6715B285458E01 +IV=A22DF6CE12C75FB99F5159A1E3E4249F +PT=D6F96D22896A2574998EEBA57AC88C62 +CT=B356102A9158C569469E61093146B9F0 + +I=106 +KEY=D73E5CA946860BDD3C1B21B6179F24E37BF974BBB40337F1 +IV=B356102A9158C569469E61093146B9F0 +PT=2E72F61FC21F57A09AD547F7251EEF70 +CT=AB2BABFB88D3C3ACE4CBA81E0E250AD3 + +I=107 +KEY=6B592CE635873DE197308A4D9F4CE74F9F32DCA5BA263D22 +IV=AB2BABFB88D3C3ACE4CBA81E0E250AD3 +PT=39B02C01155705C9BC67704F7301363C +CT=8A4AC90E9095479F3C02DE7B08C01F1C + +I=108 +KEY=1026EE98CAC684081D7A43430FD9A0D0A33002DEB2E6223E +IV=8A4AC90E9095479F3C02DE7B08C01F1C +PT=14F49DBECEE88DBB7B7FC27EFF41B9E9 +CT=62E4E3C43938D014D90C4A1D8CD09639 + +I=109 +KEY=20972278E7C0FFC17F9EA08736E170C47A3C48C33E36B407 +IV=62E4E3C43938D014D90C4A1D8CD09639 +PT=56EFB0EA336A674930B1CCE02D067BC9 +CT=5E8EB865BFC1999D57A67280E37CA129 + +I=110 +KEY=2BEE1A1965A7F17C211018E28920E9592D9A3A43DD4A152E +IV=5E8EB865BFC1999D57A67280E37CA129 +PT=9CF6F073F2F0C7CB0B79386182670EBD +CT=D3B98A4562FAB47ED3D09C55E75EE51B + +I=111 +KEY=EB85E491647FD6ACF2A992A7EBDA5D27FE4AA6163A14F035 +IV=D3B98A4562FAB47ED3D09C55E75EE51B +PT=61964EF472752F21C06BFE8801D827D0 +CT=CF3D65AEEDD747416AF436A3B909828F + +I=112 +KEY=E94E6286941EC36D3D94F709060D1A6694BE90B5831D72BA +IV=CF3D65AEEDD747416AF436A3B909828F +PT=6C0B536EA1099A4202CB8617F06115C1 +CT=5DB0625B34C01C47490B5200E8A205FC + +I=113 +KEY=F5D756E568CA6BA06024955232CD0621DDB5C2B56BBF7746 +IV=5DB0625B34C01C47490B5200E8A205FC +PT=08D5CD9945D190AB1C993463FCD4A8CD +CT=771B5C66F79E262FAAC6F92F128669CB + +I=114 +KEY=462C74E6E222DE77173FC934C553200E77733B9A79391E8D +IV=771B5C66F79E262FAAC6F92F128669CB +PT=5628EC55D7AB7634B3FB22038AE8B5D7 +CT=31C436E7CA7343A93AA0B74A38CCDAC0 + +I=115 +KEY=5062F2489F4C68FE26FBFFD30F2063A74DD38CD041F5C44D +IV=31C436E7CA7343A93AA0B74A38CCDAC0 +PT=F279C45DBD75C458164E86AE7D6EB689 +CT=845320B41FD6F1D4DBB36D19D8A4A268 + +I=116 +KEY=5A27EC509FED17B6A2A8DF6710F692739660E1C999516625 +IV=845320B41FD6F1D4DBB36D19D8A4A268 +PT=7C0CB5E4FFE703260A451E1800A17F48 +CT=D8F9FB52BE1B342D6FBBB8A7FCDEFD89 + +I=117 +KEY=E925EC8E99BF11E97A512435AEEDA65EF9DB596E658F9BAC +IV=D8F9FB52BE1B342D6FBBB8A7FCDEFD89 +PT=187F3648643AF8E6B30200DE0652065F +CT=240647A32D765031C79D8893CC19EBA9 + +I=118 +KEY=5574034BCE64FADD5E576396839BF66F3E46D1FDA9967005 +IV=240647A32D765031C79D8893CC19EBA9 +PT=AF808097E0C68C8FBC51EFC557DBEB34 +CT=2A3805A7D773F9C00635779752C9CCE7 + +I=119 +KEY=D842A9983BBDAA5E746F663154E80FAF3873A66AFB5FBCE2 +IV=2A3805A7D773F9C00635779752C9CCE7 +PT=D44486CCC61C68588D36AAD3F5D95083 +CT=2219F0C7A805BEC4A4931F84CBFFC598 + +I=120 +KEY=CD622302BD70E2CD567696F6FCEDB16B9CE0B9EE30A0797A +IV=2219F0C7A805BEC4A4931F84CBFFC598 +PT=67DA1BC4F2BC2F3315208A9A86CD4893 +CT=8B1F4353CF6969888BBD6654AB65C2A8 + +I=121 +KEY=80A1D0CA7667F291DD69D5A53384D8E3175DDFBA9BC5BBD2 +IV=8B1F4353CF6969888BBD6654AB65C2A8 +PT=D114FDA8E61BEAC44DC3F3C8CB17105C +CT=B6F0C0F016A1FA033C37D1128D9B2EF3 + +I=122 +KEY=2C9B755C3B8B44416B991555252522E02B6A0EA8165E9521 +IV=B6F0C0F016A1FA033C37D1128D9B2EF3 +PT=738DBCE3EE7E70EAAC3AA5964DECB6D0 +CT=14FB0A67CB0729CA25152581D8C3FEEF + +I=123 +KEY=5D05BDFBF482E4D37F621F32EE220B2A0E7F2B29CE9D6BCE +IV=14FB0A67CB0729CA25152581D8C3FEEF +PT=D3186497981F294B719EC8A7CF09A092 +CT=14C988C52C7ED50EBD10219F1F58C213 + +I=124 +KEY=9E044D195FA8557C6BAB97F7C25CDE24B36F0AB6D1C5A9DD +IV=14C988C52C7ED50EBD10219F1F58C213 +PT=C062585284FDE540C301F0E2AB2AB1AF +CT=1FE7E153E69F95F102624ACEB9067FA1 + +I=125 +KEY=2B116B6F1FD581C6744C76A424C34BD5B10D407868C3D67C +IV=1FE7E153E69F95F102624ACEB9067FA1 +PT=F18294D40CAA674DB5152676407DD4BA +CT=AB43B2C61C9F23B96EFE293C6730A98F + +I=126 +KEY=EAF1AFBDD2CEDB9ADF0FC462385C686CDFF369440FF37FF3 +IV=AB43B2C61C9F23B96EFE293C6730A98F +PT=7D465730C5422413C1E0C4D2CD1B5A5C +CT=B1413F447CA81C678287EE2366544547 + +I=127 +KEY=4FA6C7DA7A84D4CB6E4EFB2644F4740B5D74876769A73AB4 +IV=B1413F447CA81C678287EE2366544547 +PT=C7BFA1BFA26828F7A5576867A84A0F51 +CT=7AE90F988557F3A41BBDB4B69C5FF56A + +I=128 +KEY=C9B0E3C7CEF4003014A7F4BEC1A387AF46C933D1F5F8CFDE +IV=7AE90F988557F3A41BBDB4B69C5FF56A +PT=5173C32806105AD18616241DB470D4FB +CT=F2EF675645D284F042FAEBE87AE3ECAE + +I=129 +KEY=DB855274F6CC030BE64893E88471035F0433D8398F1B2370 +IV=F2EF675645D284F042FAEBE87AE3ECAE +PT=6DF6B7F917B2F8431235B1B33838033B +CT=30D4F068BC2FDEC79CF81A4FA641A495 + +I=130 +KEY=F37DBF11472A4F87D69C6380385EDD9898CBC276295A87E5 +IV=30D4F068BC2FDEC79CF81A4FA641A495 +PT=F4C98D268B7D175728F8ED65B1E64C8C +CT=0CEB234560B935E5B08C7EA2AA4A962D + +I=131 +KEY=1A2F5A0827B2F861DA7740C558E7E87D2847BCD4831011C8 +IV=0CEB234560B935E5B08C7EA2AA4A962D +PT=9873E312B815DC81E952E5196098B7E6 +CT=7BED84EFC02836F6D165AD27DEEF2B21 + +I=132 +KEY=9C815F2A4EC42D02A19AC42A98CFDE8BF92211F35DFF3AE9 +IV=7BED84EFC02836F6D165AD27DEEF2B21 +PT=D8765DE55131DC4186AE05226976D563 +CT=C36FEDCB97DA734243A20C49D5942DD1 + +I=133 +KEY=9A12CC40F3C185AA62F529E10F15ADC9BA801DBA886B1738 +IV=C36FEDCB97DA734243A20C49D5942DD1 +PT=18B252CEB124BD110693936ABD05A8A8 +CT=94C9A6BDB97522FACEE2E869C3C48FB0 + +I=134 +KEY=F08C23DDC110ED40F63C8F5CB6608F337462F5D34BAF9888 +IV=94C9A6BDB97522FACEE2E869C3C48FB0 +PT=154FF810E3F0CE586A9EEF9D32D168EA +CT=AFC8D15F80F19F942FCA22DA0DF79937 + +I=135 +KEY=B1224FF7293C5DC559F45E03369110A75BA8D709465801BF +IV=AFC8D15F80F19F942FCA22DA0DF79937 +PT=259A6B069CA3273C41AE6C2AE82CB085 +CT=5AADC1716B2ED4FC7CA9825A32EA2FB1 + +I=136 +KEY=D29A829813CC5B4103599F725DBFC45B2701555374B22E0E +IV=5AADC1716B2ED4FC7CA9825A32EA2FB1 +PT=CB78C574D9B1B9EF63B8CD6F3AF00684 +CT=EACB8D3001640F340DFB459CD8D162BD + +I=137 +KEY=1049116DD39F7B30E99212425CDBCB6F2AFA10CFAC634CB3 +IV=EACB8D3001640F340DFB459CD8D162BD +PT=DF461D135DE19FA2C2D393F5C0532071 +CT=9115EB33739C04AAE22765621A8852C5 + +I=138 +KEY=A129CBBF89658D977887F9712F47CFC5C8DD75ADB6EB1E76 +IV=9115EB33739C04AAE22765621A8852C5 +PT=E32AF908A190B95FB160DAD25AFAF6A7 +CT=B171D8AC24C6873B54F42D5DAC51ED34 + +I=139 +KEY=EE7226D88DFA48DFC9F621DD0B8148FE9C2958F01ABAF342 +IV=B171D8AC24C6873B54F42D5DAC51ED34 +PT=0A669BB00E2123B54F5BED67049FC548 +CT=CFFC81B70593A36D022248D1CBE7FC58 + +I=140 +KEY=C907918503B2C1C0060AA06A0E12EB939E0B1021D15D0F1A +IV=CFFC81B70593A36D022248D1CBE7FC58 +PT=E9B1E6FA006D4CEE2775B75D8E48891F +CT=0B3B02FC8A8D677B8077D7FDF9EB0396 + +I=141 +KEY=E468A0560DB602C10D31A296849F8CE81E7CC7DC28B60C8C +IV=0B3B02FC8A8D677B8077D7FDF9EB0396 +PT=AA3626C69662AE442D6F31D30E04C301 +CT=2C78C31D4B2EBAEF54CB6D04C4375196 + +I=142 +KEY=EB8BCD80D3E35CCB2149618BCFB136074AB7AAD8EC815D1A +IV=2C78C31D4B2EBAEF54CB6D04C4375196 +PT=5017BD9EB52514180FE36DD6DE555E0A +CT=67D2DD54A0881186DFA6A608C036CE61 + +I=143 +KEY=7065D92686BA37E9469BBCDF6F39278195110CD02CB7937B +IV=67D2DD54A0881186DFA6A608C036CE61 +PT=6CBC1C2DAA3A7F7B9BEE14A655596B22 +CT=62163C88A40E7CFF7522A3DC32F30BCF + +I=144 +KEY=E0B4AE9D6C9A5A92248D8057CB375B7EE033AF0C1E4498B4 +IV=62163C88A40E7CFF7522A3DC32F30BCF +PT=0F6C44EE5E2587A790D177BBEA206D7B +CT=B84A631DE451F109C48785DE3D4099C2 + +I=145 +KEY=DDCDB4F73AA0C8789CC7E34A2F66AA7724B42AD223040176 +IV=B84A631DE451F109C48785DE3D4099C2 +PT=EE1EA5C5340C2F263D791A6A563A92EA +CT=D438E983DB81DA9341CE1AC45F4E7E52 + +I=146 +KEY=813604E941CBDF6448FF0AC9F4E770E4657A30167C4A7F24 +IV=D438E983DB81DA9341CE1AC45F4E7E52 +PT=08E1F94874432DBD5CFBB01E7B6B171C +CT=0E1C069CB75D4EDF4243D1E6D7175425 + +I=147 +KEY=D64EB9DE5A3B546B46E30C5543BA3E3B2739E1F0AB5D2B01 +IV=0E1C069CB75D4EDF4243D1E6D7175425 +PT=CFCDC1C0EFE678FB5778BD371BF08B0F +CT=CBC0ED542E26A1943926EF7897A79E97 + +I=148 +KEY=D1659785D1D551948D23E1016D9C9FAF1E1F0E883CFAB596 +IV=CBC0ED542E26A1943926EF7897A79E97 +PT=1FEA178A348CAE8B072B2E5B8BEE05FF +CT=C743A7B60EB7C24867DA82AFF15ED18A + +I=149 +KEY=05786C3E1FBE51864A6046B7632B5DE779C58C27CDA4641C +IV=C743A7B60EB7C24867DA82AFF15ED18A +PT=3A4EF6696CD26875D41DFBBBCE6B0012 +CT=EA23014227CF7B563AEFF86DB947FAC4 + +I=150 +KEY=CE1E5D5BF32BF0CAA04347F544E426B1432A744A74E39ED8 +IV=EA23014227CF7B563AEFF86DB947FAC4 +PT=DFDF9B4032986E90CB663165EC95A14C +CT=EAF762B60A106C03B76742E69CEE385A + +I=151 +KEY=F8EAC01B3F7E925A4AB425434EF44AB2F44D36ACE80DA682 +IV=EAF762B60A106C03B76742E69CEE385A +PT=2BDC6EAB1D86311D36F49D40CC556290 +CT=E6CC0491C3509240ED848AE304CC3385 + +I=152 +KEY=BF5AE8B244244B4BAC7821D28DA4D8F219C9BC4FECC19507 +IV=E6CC0491C3509240ED848AE304CC3385 +PT=81D4E28E02717AB347B028A97B5AD911 +CT=11EE9D22AC798AB5FEF6C6188845F425 + +I=153 +KEY=5C6538235111334FBD96BCF021DD5247E73F7A5764846122 +IV=11EE9D22AC798AB5FEF6C6188845F425 +PT=DDE402413BB09DFBE33FD09115357804 +CT=3F054911089500FD2CD0645DBFE2A8D3 + +I=154 +KEY=FAC914FA6B6CA1AB8293F5E1294852BACBEF1E0ADB66C9F1 +IV=3F054911089500FD2CD0645DBFE2A8D3 +PT=345343E023AC39FFA6AC2CD93A7D92E4 +CT=7538E78DE8FC09D203010C61422E6B5A + +I=155 +KEY=1E62F54271EA4374F7AB126CC1B45B68C8EE126B9948A2AB +IV=7538E78DE8FC09D203010C61422E6B5A +PT=0EC4357C476EB76AE4ABE1B81A86E2DF +CT=3A4D0093A2B7FF807BAA6A815538507E + +I=156 +KEY=5AD3B884BE5653BBCDE612FF6303A4E8B34478EACC70F2D5 +IV=3A4D0093A2B7FF807BAA6A815538507E +PT=F59FD86893B7DF7244B14DC6CFBC10CF +CT=2C2FD7DF94FDDC2CA1C05EF5878583FF + +I=157 +KEY=B9039E1678902ECCE1C9C520F7FE78C41284261F4BF5712A +IV=2C2FD7DF94FDDC2CA1C05EF5878583FF +PT=4600E6CCD65B575AE3D02692C6C67D77 +CT=59C9FA2E4A2227C3E5B831899A3CCBFD + +I=158 +KEY=394A8245256D72B8B8003F0EBDDC5F07F73C1796D1C9BAD7 +IV=59C9FA2E4A2227C3E5B831899A3CCBFD +PT=3030D8E24F7BEA0580491C535DFD5C74 +CT=DEAFC4A07A3FB5D5AA09FF6A2515AB4A + +I=159 +KEY=2496931DFCFF2E7166AFFBAEC7E3EAD25D35E8FCF4DC119D +IV=DEAFC4A07A3FB5D5AA09FF6A2515AB4A +PT=63CD1CC241B267791DDC1158D9925CC9 +CT=B1B0AED275FCE241B5726E943B37C130 + +I=160 +KEY=53CBA419E5CED1C8D71F557CB21F0893E8478668CFEBD0AD +IV=B1B0AED275FCE241B5726E943B37C130 +PT=85F4E06A05C8704A775D37041931FFB9 +CT=B0DFD3EF3AF538791E69AF59CAA7B8CC + +I=161 +KEY=DFB0E5440EB582F667C0869388EA30EAF62E2931054C6861 +IV=B0DFD3EF3AF538791E69AF59CAA7B8CC +PT=B7BDA6C504797C8B8C7B415DEB7B533E +CT=220F810B0D5A9ED8794932D0BF6150D6 + +I=162 +KEY=B26A70894070BC9B45CF079885B0AE328F671BE1BA2D38B7 +IV=220F810B0D5A9ED8794932D0BF6150D6 +PT=0113567BFAC19EB86DDA95CD4EC53E6D +CT=56C77682CA1A041B312061F3FB9A1A59 + +I=163 +KEY=36EDA74B7133D5871308711A4FAAAA29BE477A1241B722EE +IV=56C77682CA1A041B312061F3FB9A1A59 +PT=4D39AD87258968FA8487D7C23143691C +CT=4F18208E63B2D84CC7A0707617DD7B63 + +I=164 +KEY=F7589312CE997AFE5C1051942C18726579E70A64566A598D +IV=4F18208E63B2D84CC7A0707617DD7B63 +PT=1B82F5C849E0F965C1B53459BFAAAF79 +CT=85CE0310DEFB36474B38C4347D7EEE8B + +I=165 +KEY=F770FC7B1E183E31D9DE5284F2E3442232DFCE502B14B706 +IV=85CE0310DEFB36474B38C4347D7EEE8B +PT=7B56EBC47E780FB000286F69D08144CF +CT=CB5AE674DB1426618F577BBD63309EA4 + +I=166 +KEY=79AD3040CCC9FD521284B4F029F76243BD88B5ED482429A2 +IV=CB5AE674DB1426618F577BBD63309EA4 +PT=47A5B213BC3DF61B8EDDCC3BD2D1C363 +CT=1E26AB2D8B156913995FCAC1ABD99D68 + +I=167 +KEY=10BB9597F823B61F0CA21FDDA2E20B5024D77F2CE3FDB4CA +IV=1E26AB2D8B156913995FCAC1ABD99D68 +PT=D31FC11C9FD6E7F86916A5D734EA4B4D +CT=84E0E24F155E5EFCA9AE9C5F2F26BD25 + +I=168 +KEY=E1264A2AD33800FF8842FD92B7BC55AC8D79E373CCDB09EF +IV=84E0E24F155E5EFCA9AE9C5F2F26BD25 +PT=F77FE11AE4BEB403F19DDFBD2B1BB6E0 +CT=B41973B0D807A43A822EB57555B818D4 + +I=169 +KEY=A19ABDD25ED272693C5B8E226FBBF1960F5756069963113B +IV=B41973B0D807A43A822EB57555B818D4 +PT=FECAAA8EA9C1883640BCF7F88DEA7296 +CT=949634E68FB9086AE623EAF5E867D4A5 + +I=170 +KEY=DD904ECCC94F64D0A8CDBAC4E002F9FCE974BCF37104C59E +IV=949634E68FB9086AE623EAF5E867D4A5 +PT=E8A413C2ADB97D387C0AF31E979D16B9 +CT=96BE2B618F8A961E5DC892F429A8B6FC + +I=171 +KEY=1B83C20396D7D0D33E7391A56F886FE2B4BC2E0758AC7362 +IV=96BE2B618F8A961E5DC892F429A8B6FC +PT=1408434BF0C3432BC6138CCF5F98B403 +CT=C0A9596F56E48F459D2C405F47DCA44C + +I=172 +KEY=B04C71DBEA60DB15FEDAC8CA396CE0A729906E581F70D72E +IV=C0A9596F56E48F459D2C405F47DCA44C +PT=5E7F070C7EE8A852ABCFB3D87CB70BC6 +CT=A4739C93911C72C959E89544500843BD + +I=173 +KEY=9BFC8026BC1D965B5AA95459A870926E7078FB1C4F789493 +IV=A4739C93911C72C959E89544500843BD +PT=718C23D1F537A6E72BB0F1FD567D4D4E +CT=4D581200B1E446CC3AD306138BF2898B + +I=174 +KEY=FEA9DF8F4FECB3ED17F146591994D4A24AABFD0FC48A1D18 +IV=4D581200B1E446CC3AD306138BF2898B +PT=E4DD231D871795E065555FA9F3F125B6 +CT=E53EFC19D8048073167B1473C5EBA6D9 + +I=175 +KEY=62DF036D6F96D937F2CFBA40C19054D15CD0E97C0161BBC1 +IV=E53EFC19D8048073167B1473C5EBA6D9 +PT=9AB809114F10C3FD9C76DCE2207A6ADA +CT=BDB0C3D9732DE5813C4C72CF01FF5194 + +I=176 +KEY=CFEF04F0343587004F7F7999B2BDB150609C9BB3009EEA55 +IV=BDB0C3D9732DE5813C4C72CF01FF5194 +PT=B4CFE094F8B4EEE5AD30079D5BA35E37 +CT=D00B5B980D8B10DF3D7D4C0BE5975C1C + +I=177 +KEY=CBF2C475C11FA6B89F742201BF36A18F5DE1D7B8E509B649 +IV=D00B5B980D8B10DF3D7D4C0BE5975C1C +PT=34B39728291953DC041DC085F52A21B8 +CT=ADF5CDFDCC23AD8AD111454B2DB69013 + +I=178 +KEY=C96820A08056F7C23281EFFC73150C058CF092F3C8BF265A +IV=ADF5CDFDCC23AD8AD111454B2DB69013 +PT=4C8152CCAA0A23AC029AE4D54149517A +CT=F070979F68BAEBBD6CE8CE8A549C0E12 + +I=179 +KEY=61A6BBDB58B4C9D4C2F178631BAFE7B8E0185C799C232848 +IV=F070979F68BAEBBD6CE8CE8A549C0E12 +PT=0B6AF20EF8550A1BA8CE9B7BD8E23E16 +CT=8A75D276384A4F468B459466A304D418 + +I=180 +KEY=D3EC560DE8B1BBEE4884AA1523E5A8FE6B5DC81F3F27FC50 +IV=8A75D276384A4F468B459466A304D418 +PT=259A18BABFD09145B24AEDD6B005723A +CT=B7C04F66EB771CBD97F948098E23C655 + +I=181 +KEY=16FE806749FDDF8CFF44E573C892B443FCA48016B1043A05 +IV=B7C04F66EB771CBD97F948098E23C655 +PT=E00B5E4B3D9E64D0C512D66AA14C6462 +CT=29FB08289BD19BCC0FEB0F433D5CACEE + +I=182 +KEY=9CC345922C8912D5D6BFED5B53432F8FF34F8F558C5896EB +IV=29FB08289BD19BCC0FEB0F433D5CACEE +PT=07BAA266554EAE0C8A3DC5F56574CD59 +CT=495C245E2F3CC52499B9C1AD7C4484BA + +I=183 +KEY=7DDDCF7DE759FDEC9FE3C9057C7FEAAB6AF64EF8F01C1251 +IV=495C245E2F3CC52499B9C1AD7C4484BA +PT=2E5360D5563EB7D4E11E8AEFCBD0EF39 +CT=68267051421D3AFA19A2E43D501B940B + +I=184 +KEY=4BA2EAD4106DD4B7F7C5B9543E62D0517354AAC5A007865A +IV=68267051421D3AFA19A2E43D501B940B +PT=050EBC6942F92D95367F25A9F734295B +CT=1781558A2A8B7C29AC82D6610B67E3CF + +I=185 +KEY=CFCCD4ECD20E051CE044ECDE14E9AC78DFD67CA4AB606595 +IV=1781558A2A8B7C29AC82D6610B67E3CF +PT=1AC90B21EB197E26846E3E38C263D1AB +CT=BF5FE87A2E882A64493850EC3A0E93A5 + +I=186 +KEY=C9EA5F992C77DD9C5F1B04A43A61861C96EE2C48916EF630 +IV=BF5FE87A2E882A64493850EC3A0E93A5 +PT=58F997704D085DC506268B75FE79D880 +CT=8F43A961964E3452094E8E71295177CD + +I=187 +KEY=1136648F9E0A53C3D058ADC5AC2FB24E9FA0A239B83F81FD +IV=8F43A961964E3452094E8E71295177CD +PT=086041AB29E423EFD8DC3B16B27D8E5F +CT=BF69230BAB6200B7828DC04A13B88E83 + +I=188 +KEY=47040E2D6DFBE3006F318ECE074DB2F91D2D6273AB870F7E +IV=BF69230BAB6200B7828DC04A13B88E83 +PT=57865A8650D3202056326AA2F3F1B0C3 +CT=A012FAEE65E2C4F0AC22CB63AB75E35D + +I=189 +KEY=868F8310E79C0473CF23742062AF7609B10FA91000F2EC23 +IV=A012FAEE65E2C4F0AC22CB63AB75E35D +PT=F3ABB47DAE94B82EC18B8D3D8A67E773 +CT=F35BBD3C516F86384DA3BB6B5CCC8B37 + +I=190 +KEY=5C71ADCE480714DA3C78C91C33C0F031FCAC127B5C3E6714 +IV=F35BBD3C516F86384DA3BB6B5CCC8B37 +PT=CDB3E57FA6DDFF9FDAFE2EDEAF9B10A9 +CT=627A15E65B37C2B9575E8A781271AE64 + +I=191 +KEY=B603092BC5FD004F5E02DCFA68F73288ABF298034E4FC970 +IV=627A15E65B37C2B9575E8A781271AE64 +PT=7E04F9A0F723DF00EA72A4E58DFA1495 +CT=15427D27E783A5476345C83F3E8A3319 + +I=192 +KEY=4DB5A9F825C5E8C24B40A1DD8F7497CFC8B7503C70C5FA69 +IV=15427D27E783A5476345C83F3E8A3319 +PT=842B94BE25E8747BFBB6A0D3E038E88D +CT=35812AFD1A90B0B7D52B45EAD9CAF083 + +I=193 +KEY=D4F2CCC0734F9ACD7EC18B2095E427781D9C15D6A90F0AEA +IV=35812AFD1A90B0B7D52B45EAD9CAF083 +PT=3FAB7D4C741B8CD499476538568A720F +CT=C1A59CD3D9E6650F0D16947D26BFC20D + +I=194 +KEY=CB28A8313E133469BF6417F34C024277108A81AB8FB0C8E7 +IV=C1A59CD3D9E6650F0D16947D26BFC20D +PT=37AC888DCE5CDFD31FDA64F14D5CAEA4 +CT=CB0313E9A046711866CA65702A45CDB6 + +I=195 +KEY=C5BFEB8246ABAF467467041AEC44336F7640E4DBA5F50551 +IV=CB0313E9A046711866CA65702A45CDB6 +PT=326C9E3EB49138ED0E9743B378B89B2F +CT=ACE8FC6C6ABBC8124FE35C7976585DF6 + +I=196 +KEY=110891F8FDF0F254D88FF87686FFFB7D39A3B8A2D3AD58A7 +IV=ACE8FC6C6ABBC8124FE35C7976585DF6 +PT=964239EB84C57F61D4B77A7ABB5B5D12 +CT=0762EF13B80A8B77D04AF797B67D5AA6 + +I=197 +KEY=EFF558976586AC91DFED17653EF5700AE9E94F3565D00201 +IV=0762EF13B80A8B77D04AF797B67D5AA6 +PT=5ECA17ADFE3C2C21FEFDC96F98765EC5 +CT=B60CC9CD9DE93E2A6FB0B59369B1628E + +I=198 +KEY=4494A36EABE3555E69E1DEA8A31C4E208659FAA60C61608F +IV=B60CC9CD9DE93E2A6FB0B59369B1628E +PT=7A659E803888296BAB61FBF9CE65F9CF +CT=73258A43C7DA66FFE4DC9384FC7A60C1 + +I=199 +KEY=1780249B48B8F7561AC454EB64C628DF62856922F01B004E +IV=73258A43C7DA66FFE4DC9384FC7A60C1 +PT=8D9C3DCF612320B4531487F5E35BA208 +CT=F0F5D51C06F2D900CC4BE8D3512CA4B6 + +I=200 +KEY=9FF03D1E23BD9959EA3181F76234F1DFAECE81F1A137A4F8 +IV=F0F5D51C06F2D900CC4BE8D3512CA4B6 +PT=F002AEC878B80A0B887019856B056E0F +CT=E1321C52A51D9345296A0EF2A9DC9CC5 + +I=201 +KEY=6042967162EDA50B0B039DA5C729629A87A48F0308EB383D +IV=E1321C52A51D9345296A0EF2A9DC9CC5 +PT=C5EA4A519D9BAF8FFFB2AB6F41503C52 +CT=ED79D8FC9C60B583E29D0A65A6A5F321 + +I=202 +KEY=250C416206B9D0A9E67A45595B49D71965398566AE4ECB1C +IV=ED79D8FC9C60B583E29D0A65A6A5F321 +PT=34D771B44B3943DE454ED713645475A2 +CT=7A08F9096109535C262407EB323EF7BC + +I=203 +KEY=6357BC1B7B12F1C09C72BC503A408445431D828D9C703CA0 +IV=7A08F9096109535C262407EB323EF7BC +PT=60A1EEAE2B16841A465BFD797DAB2169 +CT=24C7F1A39F8B2F03C256F5C59B69C31A + +I=204 +KEY=18BF29D147A9675BB8B54DF3A5CBAB46814B77480719FFBA +IV=24C7F1A39F8B2F03C256F5C59B69C31A +PT=BFD7B314F959298B7BE895CA3CBB969B +CT=7DDA5DF3CC7C69AA490FB597888396B2 + +I=205 +KEY=E8B13C48FBABCD19C56F100069B7C2ECC844C2DF8F9A6908 +IV=7DDA5DF3CC7C69AA490FB597888396B2 +PT=23F8A60BD2354901F00E1599BC02AA42 +CT=04CEB4BE252293A822C77B9C4C27822B + +I=206 +KEY=BF275C4D9FC54BC0C1A1A4BE4C955144EA83B943C3BDEB23 +IV=04CEB4BE252293A822C77B9C4C27822B +PT=2182C0577EAA3C2A57966005646E86D9 +CT=0F24034642E351984620BB2647F5D649 + +I=207 +KEY=40B459144A6415C2CE85A7F80E7600DCACA3026584483D6A +IV=0F24034642E351984620BB2647F5D649 +PT=F59318D1D3D9A9E0FF930559D5A15E02 +CT=DB98808C46668D79AB059C5554CEEB1A + +I=208 +KEY=D5A01AB42D709E6A151D277448108DA507A69E30D086D670 +IV=DB98808C46668D79AB059C5554CEEB1A +PT=49CF142E621D1A8D951443A067148BA8 +CT=15C32FE5E9BCA5F8D09EA2E4D145FE3D + +I=209 +KEY=8191AB3C11B4B72700DE0891A1AC285DD7383CD401C3284D +IV=15C32FE5E9BCA5F8D09EA2E4D145FE3D +PT=5C1E9B721987B8BF5431B1883CC4294D +CT=AA7CA217D0514CA4F20C50293121E8D8 + +I=210 +KEY=69D24875B8A5B5D1AAA2AA8671FD64F925346CFD30E2C095 +IV=AA7CA217D0514CA4F20C50293121E8D8 +PT=8239553D8FB88E17E843E349A91102F6 +CT=C4068B901CB07904F843BF6F3CDC4FF8 + +I=211 +KEY=12BAE3B5B2C03E746EA421166D4D1DFDDD77D3920C3E8F6D +IV=C4068B901CB07904F843BF6F3CDC4FF8 +PT=80D797C671D3BFF67B68ABC00A658BA5 +CT=9F835417C4D622DB52651897DC23E1C3 + +I=212 +KEY=1A0CFD7FA1284652F1277501A99B3F268F12CB05D01D6EAE +IV=9F835417C4D622DB52651897DC23E1C3 +PT=C36513D78FBBFDCC08B61ECA13E87826 +CT=0156C998E85BE92F0EF998442204EB19 + +I=213 +KEY=7829D1FE113103B0F071BC9941C0D60981EB5341F21985B7 +IV=0156C998E85BE92F0EF998442204EB19 +PT=000894F1AF39A67562252C81B01945E2 +CT=6A554057C0A3EB723B693258BC5E899D + +I=214 +KEY=D719D37FC9087D2F9A24FCCE81633D7BBA8261194E470C2A +IV=6A554057C0A3EB723B693258BC5E899D +PT=B92413276BF142D0AF300281D8397E9F +CT=395F80E405813D97576954A23C77C2CA + +I=215 +KEY=39E173517A321A5AA37B7C2A84E200ECEDEB35BB7230CEE0 +IV=395F80E405813D97576954A23C77C2CA +PT=AA95F2BD255DBE23EEF8A02EB33A6775 +CT=1B1BC5D3DABD536E91177EF1BF2B7E39 + +I=216 +KEY=EE1FB67D907C597BB860B9F95E5F53827CFC4B4ACD1BB0D9 +IV=1B1BC5D3DABD536E91177EF1BF2B7E39 +PT=985E81E0BF5FF6EFD7FEC52CEA4E4321 +CT=20F42326749CC7CCD54188DEA46F4EC1 + +I=217 +KEY=41D333EC5E537B8098949ADF2AC3944EA9BDC3946974FE18 +IV=20F42326749CC7CCD54188DEA46F4EC1 +PT=901FD7D22F220608AFCC8591CE2F22FB +CT=AFFC6F2668097B58A0CFF619A3FDD1CB + +I=218 +KEY=F6E392EF75572C6A3768F5F942CAEF160972358DCA892FD3 +IV=AFFC6F2668097B58A0CFF619A3FDD1CB +PT=45AEB51360C50AB1B730A1032B0457EA +CT=1B75CF440CE8521069599B7889F21C1D + +I=219 +KEY=47C82CF46472D3732C1D3ABD4E22BD06602BAEF5437B33CE +IV=1B75CF440CE8521069599B7889F21C1D +PT=7E931056CC33D22CB12BBE1B1125FF19 +CT=F6079ADBAA8D28F371F0156B170FB7BD + +I=220 +KEY=DDA62A9922B04902DA1AA066E4AF95F511DBBB9E54748473 +IV=F6079ADBAA8D28F371F0156B170FB7BD +PT=2BE3DA337C9187109A6E066D46C29A71 +CT=7D2FC16B26971DDC20C6F7510C47B352 + +I=221 +KEY=570C8CA5236A2E65A735610DC2388829311D4CCF58333721 +IV=7D2FC16B26971DDC20C6F7510C47B352 +PT=43596064590570F88AAAA63C01DA6767 +CT=5FBA845FB25FE6AE015E4E8A228ED645 + +I=222 +KEY=6CEA158ED663A4B7F88FE55270676E87304302457ABDE164 +IV=5FBA845FB25FE6AE015E4E8A228ED645 +PT=1E265F0AA9A20C603BE6992BF5098AD2 +CT=A729E250D736A43966DD0D9C461ECEC0 + +I=223 +KEY=AACCE3387C0DF35D5FA60702A751CABE569E0FD93CA32FA4 +IV=A729E250D736A43966DD0D9C461ECEC0 +PT=B08AAE113CCE6226C626F6B6AA6E57EA +CT=A8192E964A74A6ABDB463ECFA483A1E3 + +I=224 +KEY=207F19ABDA13F728F7BF2994ED256C158DD8311698208E47 +IV=A8192E964A74A6ABDB463ECFA483A1E3 +PT=858CF92E6B1793448AB3FA93A61E0475 +CT=060C7CCCD58E6348518161C7878AA71B + +I=225 +KEY=AB05AD81CF07091AF1B3555838AB0F5DDC5950D11FAA295C +IV=060C7CCCD58E6348518161C7878AA71B +PT=424D175035503C728B7AB42A1514FE32 +CT=8ECAA12830B0C5B4C6950E69AFD31B66 + +I=226 +KEY=3A8E1CC01464AF9B7F79F470081BCAE91ACC5EB8B079323A +IV=8ECAA12830B0C5B4C6950E69AFD31B66 +PT=6E5A94391F1FE5A9918BB141DB63A681 +CT=65C3A891192324A7FA3C882B2C09CB8D + +I=227 +KEY=8004AB13CF38B3ED1ABA5CE11138EE4EE0F0D6939C70F9B7 +IV=65C3A891192324A7FA3C882B2C09CB8D +PT=584E219335CA4642BA8AB7D3DB5C1C76 +CT=F29F8735A403414621F2100AF38A500C + +I=228 +KEY=D37BB962CFC53E77E825DBD4B53BAF08C102C6996FFAA9BB +IV=F29F8735A403414621F2100AF38A500C +PT=CCB996C23C627D4D537F127100FD8D9A +CT=9C6A7655E25E9231E46C0D3B57C7FCAB + +I=229 +KEY=C23B3C983C79179A744FAD8157653D39256ECBA2383D5510 +IV=9C6A7655E25E9231E46C0D3B57C7FCAB +PT=5D727E12D3932F56114085FAF3BC29ED +CT=6C5AA7364755AF599AB6F86EC8B24C52 + +I=230 +KEY=4462CD1DD817170C18150AB710309260BFD833CCF08F1942 +IV=6C5AA7364755AF599AB6F86EC8B24C52 +PT=D7A99C8F3BC37AD08659F185E46E0096 +CT=821D7EAC8FD041C0C8CF1011661FBB9E + +I=231 +KEY=1BA52BEF2B010D169A08741B9FE0D3A0771723DD9690A2DC +IV=821D7EAC8FD041C0C8CF1011661FBB9E +PT=704F3525510FCC745FC7E6F2F3161A1A +CT=44591D71D64FC38010E402874853E9BC + +I=232 +KEY=C6A6818229CC65E6DE51696A49AF102067F3215ADEC34B60 +IV=44591D71D64FC38010E402874853E9BC +PT=5D5769AE155C9F43DD03AA6D02CD68F0 +CT=E5647FF6C843543E484FC13B58A345B9 + +I=233 +KEY=41F27DD5905B299C3B35169C81EC441E2FBCE06186600ED9 +IV=E5647FF6C843543E484FC13B58A345B9 +PT=ADF29030DFDFCCEE8754FC57B9974C7A +CT=E6EA42E2F046D3ED75081A50770563D1 + +I=234 +KEY=3A8018855EDC80D2DDDF547E71AA97F35AB4FA31F1656D08 +IV=E6EA42E2F046D3ED75081A50770563D1 +PT=096F74717D5583477B726550CE87A94E +CT=D75682FE37396887659E87895F1C6441 + +I=235 +KEY=6C94C2634142DA310A89D6804693FF743F2A7DB8AE790949 +IV=D75682FE37396887659E87895F1C6441 +PT=F1B527DD4935FBDE5614DAE61F9E5AE3 +CT=15755CFE84E113AA751E4D5BB098ABC7 + +I=236 +KEY=4BA407D7C6426C641FFC8A7EC272ECDE4A3430E31EE1A28E +IV=15755CFE84E113AA751E4D5BB098ABC7 +PT=7C4433DCC314DBD72730C5B48700B655 +CT=B048F209CE1B1FAEC33392D2D8F326A1 + +I=237 +KEY=A56FD7BCEEA55474AFB478770C69F3708907A231C612842F +IV=B048F209CE1B1FAEC33392D2D8F326A1 +PT=D40C7CD8D80C8C6CEECBD06B28E73810 +CT=8E1F4830F94004C286C39D0EC014A963 + +I=238 +KEY=0730B7B664CFD1E321AB3047F529F7B20FC43F3F06062D4C +IV=8E1F4830F94004C286C39D0EC014A963 +PT=B16772FE8C8A573FA25F600A8A6A8597 +CT=3FB92771D2BE2D33C40AB0409998B229 + +I=239 +KEY=0A08E43B13C57EB41E1217362797DA81CBCE8F7F9F9E9F65 +IV=3FB92771D2BE2D33C40AB0409998B229 +PT=D4883476825EA2D30D38538D770AAF57 +CT=190106DE79836016C57A16BBBA6893D2 + +I=240 +KEY=195B7E1B67872B0D071311E85E14BA970EB499C425F60CB7 +IV=190106DE79836016C57A16BBBA6893D2 +PT=3B8F4F140FDFFB6B13539A20744255B9 +CT=C06398537B4F534203D57184543E6516 + +I=241 +KEY=BE0C4A8A9B581D16C77089BB255BE9D50D61E84071C869A1 +IV=C06398537B4F534203D57184543E6516 +PT=E50D127AE258061DA7573491FCDF361B +CT=FF615CCC9F2D3DBB3074C835ECE4224E + +I=242 +KEY=662A224DAB1233C83811D577BA76D46E3D1520759D2C4BEF +IV=FF615CCC9F2D3DBB3074C835ECE4224E +PT=347C976D20470968D82668C7304A2EDE +CT=B5FB1BCCBC838B87FDB10FEFE6CDC45B + +I=243 +KEY=F4F3B47D9CC8BA798DEACEBB06F55FE9C0A42F9A7BE18FB4 +IV=B5FB1BCCBC838B87FDB10FEFE6CDC45B +PT=BC276D1002C5DD8292D9963037DA89B1 +CT=151F88A44A76568FAC756011B827778D + +I=244 +KEY=7EA3C03193B737DE98F5461F4C8309666CD14F8BC3C6F839 +IV=151F88A44A76568FAC756011B827778D +PT=BCD9054596EE644E8A50744C0F7F8DA7 +CT=C1B0B6FDD717881442496794A2C890F2 + +I=245 +KEY=C4D94D5C4169EE4B5945F0E29B9481722E98281F610E68CB +IV=C1B0B6FDD717881442496794A2C890F2 +PT=3D7F68D3014F3BEDBA7A8D6DD2DED995 +CT=181100A04881DCF9813E4A22C6C1BB3B + +I=246 +KEY=A9A9483D9FC46DD34154F042D3155D8BAFA6623DA7CFD3F0 +IV=181100A04881DCF9813E4A22C6C1BB3B +PT=0FE2E2A97DFFB4966D700561DEAD8398 +CT=AA4BEC4007C38C7B86B6F9EED33E5EB1 + +I=247 +KEY=5F08A3C09F4AE90BEB1F1C02D4D6D1F029109BD374F18D41 +IV=AA4BEC4007C38C7B86B6F9EED33E5EB1 +PT=C2392264CE43C57AF6A1EBFD008E84D8 +CT=A0756CCDA72462CD89DF9990C0FE6676 + +I=248 +KEY=6A1A4F2D25DFC9F94B6A70CF73F2B33DA0CF0243B40FEB37 +IV=A0756CCDA72462CD89DF9990C0FE6676 +PT=A6650A3432CCA74A3512ECEDBA9520F2 +CT=F5044AECC6F35C99FCDBA26DD15E1474 + +I=249 +KEY=B475174A46D0CDC2BE6E3A23B501EFA45C14A02E6551FF43 +IV=F5044AECC6F35C99FCDBA26DD15E1474 +PT=07967DE17DEB720CDE6F5867630F043B +CT=60645B559E7321D7FA8A3F925CFC0FA4 + +I=250 +KEY=8DBB9D8A4A2E7E61DE0A61762B72CE73A69E9FBC39ADF0E7 +IV=60645B559E7321D7FA8A3F925CFC0FA4 +PT=D8D3FD2077545DD039CE8AC00CFEB3A3 +CT=C4C6FD53A2572D643AA631FB85B84D0B + +I=251 +KEY=97D34E4B3B9E081A1ACC9C258925E3179C38AE47BC15BDEC +IV=C4C6FD53A2572D643AA631FB85B84D0B +PT=F31D8F3C8AC67E081A68D3C171B0767B +CT=E1A0E460E2D1483FE954F26F45CCE7A0 + +I=252 +KEY=5372C72A4ABF72D9FB6C78456BF4AB28756C5C28F9D95A4C +IV=E1A0E460E2D1483FE954F26F45CCE7A0 +PT=422C5429CE7BD811C4A1896171217AC3 +CT=2695923CFB2141F05A0F144FF021BD36 + +I=253 +KEY=A8CA6DB8A8758322DDF9EA7990D5EAD82F63486709F8E77A +IV=2695923CFB2141F05A0F144FF021BD36 +PT=780771C65FCB907BFBB8AA92E2CAF1FB +CT=A9820B527F71E95CC1F53033149FB26F + +I=254 +KEY=62ABF1F4178F3C73747BE12BEFA40384EE9678541D675515 +IV=A9820B527F71E95CC1F53033149FB26F +PT=CCC14BD8DF1CA8A4CA619C4CBFFABF51 +CT=2BAD4E8CD7D6420D36DC2F8E77DCA072 + +I=255 +KEY=C79B767D31D9F0FC5FD6AFA738724189D84A57DA6ABBF567 +IV=2BAD4E8CD7D6420D36DC2F8E77DCA072 +PT=1EFF63C71B10DCC7A53087892656CC8F +CT=C21303AAB04E2CAF1893396DD405B265 + +I=256 +KEY=1F3C7FF71340DEEC9DC5AC0D883C6D26C0D96EB7BEBE4702 +IV=C21303AAB04E2CAF1893396DD405B265 +PT=209270B7768E5553D8A7098A22992E10 +CT=B220025B5307C9D5D1EEB4B427E7263F + +I=257 +KEY=867CB381E6D532B32FE5AE56DB3BA4F31137DA039959613D +IV=B220025B5307C9D5D1EEB4B427E7263F +PT=8546A6C9B4CEF0229940CC76F595EC5F +CT=B925C660EBE409050DA369E58C601F4D + +I=258 +KEY=33B33F93622E509296C0683630DFADF61C94B3E615397E70 +IV=B925C660EBE409050DA369E58C601F4D +PT=1F4930242C2951C4B5CF8C1284FB6221 +CT=67DA7B4BEAB2152D21C54F389F9282D4 + +I=259 +KEY=E8EC3394AF44DD34F11A137DDA6DB8DB3D51FCDE8AABFCA4 +IV=67DA7B4BEAB2152D21C54F389F9282D4 +PT=41611AE93BE61306DB5F0C07CD6A8DA6 +CT=4C116D3ED0B021129CCD1764D132A72D + +I=260 +KEY=92F61F4CB5794268BD0B7E430ADD99C9A19CEBBA5B995B89 +IV=4C116D3ED0B021129CCD1764D132A72D +PT=E7B1E63FBD5B4CA77A1A2CD81A3D9F5C +CT=FE1C3096C14AF2A4DC840207BFFFC0AF + +I=261 +KEY=08DC826B4DDBAC4D43174ED5CB976B6D7D18E9BDE4669B26 +IV=FE1C3096C14AF2A4DC840207BFFFC0AF +PT=9A0D034B1931FD599A2A9D27F8A2EE25 +CT=ED500812A10CC6C4EED0836871F85AA9 + +I=262 +KEY=486EBC43A876FF2AAE4746C76A9BADA993C86AD5959EC18F +IV=ED500812A10CC6C4EED0836871F85AA9 +PT=8237641B58069AFD40B23E28E5AD5367 +CT=0AD90C1C13E7C1318057A417C0B9B97C + +I=263 +KEY=F340D2CAC4645595A49E4ADB797C6C98139FCEC2552778F3 +IV=0AD90C1C13E7C1318057A417C0B9B97C +PT=905119E1F11E4B04BB2E6E896C12AABF +CT=B260FFA5806A4A6D8845FA6146A565ED + +I=264 +KEY=DF326741BD1EE2FF16FEB57EF91626F59BDA34A313821D1E +IV=B260FFA5806A4A6D8845FA6146A565ED +PT=4F639233904531162C72B58B797AB76A +CT=2D27A1A3968E30EBCA463C8709D0FD83 + +I=265 +KEY=D4C684692E05983C3BD914DD6F98161E519C08241A52E09D +IV=2D27A1A3968E30EBCA463C8709D0FD83 +PT=428B700FB3CD18790BF4E328931B7AC3 +CT=D350CCF3B440006C9F18E99DD5B69920 + +I=266 +KEY=9DD5275FFDCD5D2DE889D82EDBD81672CE84E1B9CFE479BD +IV=D350CCF3B440006C9F18E99DD5B69920 +PT=97F4A6256A9E22FB4913A336D3C8C511 +CT=F5A0571EB7E4719B862EBC47141EA319 + +I=267 +KEY=0A3B329A4973D7A21D298F306C3C67E948AA5DFEDBFADAA4 +IV=F5A0571EB7E4719B862EBC47141EA319 +PT=E355F7EBA4DAC16B97EE15C5B4BE8A8F +CT=4F18730073D3E78CAD356441F1317B2D + +I=268 +KEY=3BB3A19EF4EB8A755231FC301FEF8065E59F39BF2ACBA189 +IV=4F18730073D3E78CAD356441F1317B2D +PT=A20B3B6C41E88E9D31889304BD985DD7 +CT=AEAECB17B9009AAF1E4E9CC02653194B + +I=269 +KEY=4B9DDD2F821CE4D1FC9F3727A6EF1ACAFBD1A57F0C98B8C2 +IV=AEAECB17B9009AAF1E4E9CC02653194B +PT=5D2E4A96F9BB4AD4702E7CB176F76EA4 +CT=26851709960A42D5711EBDC7D40535FC + +I=270 +KEY=D7273499C5BA2842DA1A202E30E5581F8ACF18B8D89D8D3E +IV=26851709960A42D5711EBDC7D40535FC +PT=202534EA0A1952A19CBAE9B647A6CC93 +CT=FF8BFFB98EDA7E54664AE879551B5497 + +I=271 +KEY=7870FF6B66070AB02591DF97BE3F264BEC85F0C18D86D9A9 +IV=FF8BFFB98EDA7E54664AE879551B5497 +PT=365CFE282B9508CFAF57CBF2A3BD22F2 +CT=D0809C84A97221E6F8DCB483B38EC7E1 + +I=272 +KEY=F4E6DFDF4A081200F5114313174D07AD145944423E081E48 +IV=D0809C84A97221E6F8DCB483B38EC7E1 +PT=915323F59134AB838C9620B42C0F18B0 +CT=DC8A24B8DECF81E0412DBF10127119EC + +I=273 +KEY=336A7C81A4BE3FE9299B67ABC982864D5574FB522C7907A4 +IV=DC8A24B8DECF81E0412DBF10127119EC +PT=0FC4387E49F666B8C78CA35EEEB62DE9 +CT=84E370DF6CA478BA85FC0874393CE442 + +I=274 +KEY=F8ADC39E17CDDEB0AD781774A526FEF7D088F3261545E3E6 +IV=84E370DF6CA478BA85FC0874393CE442 +PT=34BFEFD3E43D8EE0CBC7BF1FB373E159 +CT=2C109A8363D1D0FB69CA77ABFA922F05 + +I=275 +KEY=2B26D271208BD64F81688DF7C6F72E0CB942848DEFD7CCE3 +IV=2C109A8363D1D0FB69CA77ABFA922F05 +PT=D28D86D5199E7E30D38B11EF374608FF +CT=F1749EFE66D339BC99AE4D9F63C90490 + +I=276 +KEY=ACB8D3E6F5A45F0C701C1309A02417B020ECC9128C1EC873 +IV=F1749EFE66D339BC99AE4D9F63C90490 +PT=2ADAFA1911C5E9BD879E0197D52F8943 +CT=3B2A7C4278E1F071BFA29A6B0BFF4A15 + +I=277 +KEY=CCEE75264DD770C44B366F4BD8C5E7C19F4E537987E18266 +IV=3B2A7C4278E1F071BFA29A6B0BFF4A15 +PT=84E244B62DF08DC76056A6C0B8732FC8 +CT=A35F83A5EE0B1C3B9DAD76DEAED96D72 + +I=278 +KEY=F8F9239CDB5CC963E869ECEE36CEFBFA02E325A72938EF14 +IV=A35F83A5EE0B1C3B9DAD76DEAED96D72 +PT=F0B652F296CF162B341756BA968BB9A7 +CT=D5867FFE2FB75E309D3345611B25E3B0 + +I=279 +KEY=509A10ABA5EAF2963DEF93101979A5CA9FD060C6321D0CA4 +IV=D5867FFE2FB75E309D3345611B25E3B0 +PT=C47D42AE34131463A86333377EB63BF5 +CT=6E136F01638AFBE3554218431DF44E7E + +I=280 +KEY=9B52C39C38F16CCE53FCFC117AF35E29CA9278852FE942DA +IV=6E136F01638AFBE3554218431DF44E7E +PT=78E05783EAEBE1BDCBC8D3379D1B9E58 +CT=FB6ACD3D0CF805374AD07EF5C038EBF6 + +I=281 +KEY=2044F086923D5E43A896312C760B5B1E80420670EFD1A92C +IV=FB6ACD3D0CF805374AD07EF5C038EBF6 +PT=02415B8E4D915492BB16331AAACC328D +CT=0086C26DA11540FF5F485D7B238FD98C + +I=282 +KEY=12CE4C4109606CD7A810F341D71E1BE1DF0A5B0BCC5E70A0 +IV=0086C26DA11540FF5F485D7B238FD98C +PT=0A2988237132B0B3328ABCC79B5D3294 +CT=F2E94C71A2AE0FCB096D8259B931CF8D + +I=283 +KEY=21BBCDA7FBC5229C5AF9BF3075B0142AD667D952756FBF2D +IV=F2E94C71A2AE0FCB096D8259B931CF8D +PT=4234B6C7F1CE98A3337581E6F2A54E4B +CT=3B52E7834263C6790763706943741FD8 + +I=284 +KEY=BB451732881A996161AB58B337D3D253D104A93B361BA0F5 +IV=3B52E7834263C6790763706943741FD8 +PT=F8509FB57E14501F9AFEDA9573DFBBFD +CT=93FCA9F122CB707213D0CD72D8E6BF74 + +I=285 +KEY=857D076E9A127A84F257F1421518A221C2D46449EEFD1F81 +IV=93FCA9F122CB707213D0CD72D8E6BF74 +PT=AA4D07DFAD030BE03E38105C1208E3E5 +CT=50717568D21862AECFAA898337405C96 + +I=286 +KEY=1BCFD020D63709E0A226842AC700C08F0D7EEDCAD9BD4317 +IV=50717568D21862AECFAA898337405C96 +PT=7B488D7BBB2D538E9EB2D74E4C257364 +CT=0338D74260CB6CBB1B220DE7E4CC0BCF + +I=287 +KEY=CCDDF5D0BBCE202DA11E5368A7CBAC34165CE02D3D7148D8 +IV=0338D74260CB6CBB1B220DE7E4CC0BCF +PT=16E01F8B3E94AC26D71225F06DF929CD +CT=698AD17BB2F5F06C0465BEE34A7DCEDD + +I=288 +KEY=B7F556BC9BB4DC49C8948213153E5C5812395ECE770C8605 +IV=698AD17BB2F5F06C0465BEE34A7DCEDD +PT=3ED0C80AFDEFE8BF7B28A36C207AFC64 +CT=E20129557F795C2B1CC32A5494824A4B + +I=289 +KEY=4B00D75969C3549C2A95AB466A4700730EFA749AE38ECC4E +IV=E20129557F795C2B1CC32A5494824A4B +PT=20BE0CD6C2244384FCF581E5F27788D5 +CT=C2F9DD55E91F4796636FEC9745410087 + +I=290 +KEY=5EDCC5155BA684A4E86C7613835847E56D95980DA6CFCCC9 +IV=C2F9DD55E91F4796636FEC9745410087 +PT=B2DF53DF1139FB9915DC124C3265D038 +CT=015D51CD3568EB4EC210B58FFA89A409 + +I=291 +KEY=21BA26AC6880AACDE93127DEB630ACABAF852D825C4668C0 +IV=015D51CD3568EB4EC210B58FFA89A409 +PT=401094B8B47CBDC87F66E3B933262E69 +CT=2987D39C19E6997957BDD0CAF010F778 + +I=292 +KEY=BBA7ABC0A20CCBDEC0B6F442AFD635D2F838FD48AC569FB8 +IV=2987D39C19E6997957BDD0CAF010F778 +PT=EFC30498827AAD9A9A1D8D6CCA8C6113 +CT=E01AA987C9520EF8EBF53E97371D056B + +I=293 +KEY=5322D81BAA29410320AC5DC566843B2A13CDC3DF9B4B9AD3 +IV=E01AA987C9520EF8EBF53E97371D056B +PT=685D6F660D40105CE88573DB08258ADD +CT=D1265ABFCFA75FC65E94983BFF75CD48 + +I=294 +KEY=19DF73EBF1CEF669F18A077AA92364EC4D595BE4643E579B +IV=D1265ABFCFA75FC65E94983BFF75CD48 +PT=DD6E090E9981E5F24AFDABF05BE7B76A +CT=605FDD1CA95B8FE1A5E26DBA10241914 + +I=295 +KEY=F7D1D0CA3DAA851891D5DA660078EB0DE8BB365E741A4E8F +IV=605FDD1CA95B8FE1A5E26DBA10241914 +PT=9F8442EE8B5A325FEE0EA321CC647371 +CT=76D67121FDEAEB6B81DBB29565F71E8E + +I=296 +KEY=FFFF200EA04824E9E703AB47FD920066696084CB11ED5001 +IV=76D67121FDEAEB6B81DBB29565F71E8E +PT=5AF386509F0C8BAA082EF0C49DE2A1F1 +CT=7E1D833DC8D73228B7DFDE918E31E5E7 + +I=297 +KEY=2A7D40B689490FC7991E287A3545324EDEBF5A5A9FDCB5E6 +IV=7E1D833DC8D73228B7DFDE918E31E5E7 +PT=02AB05F508ACDD21D58260B829012B2E +CT=D6CA06D415EA5D750B5D06C252645A43 + +I=298 +KEY=134154161A39E2CF4FD42EAE20AF6F3BD5E25C98CDB8EFA5 +IV=D6CA06D415EA5D750B5D06C252645A43 +PT=E63873AE14DD3BA8393C14A09370ED08 +CT=BFEA32E77BC1607921C54027C01C3EDF + +I=299 +KEY=AD8AF90935A6B455F03E1C495B6E0F42F4271CBF0DA4D17A +IV=BFEA32E77BC1607921C54027C01C3EDF +PT=BAD47B1FBF949870BECBAD1F2F9F569A +CT=A86FFC9A91C79AFE47899B3934F3E05E + +I=300 +KEY=D88A2E828514CEC25851E0D3CAA995BCB3AE878639573124 +IV=A86FFC9A91C79AFE47899B3934F3E05E +PT=2A2115074A9767747500D78BB0B27A97 +CT=507ED155CC3ED3B1922BBC166812A7FE + +I=301 +KEY=2CDDF1A577A3C86C082F31860697460D21853B90514596DA +IV=507ED155CC3ED3B1922BBC166812A7FE +PT=308D27178ABA22BCF457DF27F2B706AE +CT=87F4EEA7CD2438F3EDCB650824A2D638 + +I=302 +KEY=2B9D006908018D648FDBDF21CBB37EFECC4E5E9875E740E2 +IV=87F4EEA7CD2438F3EDCB650824A2D638 +PT=28F6C452D061E3DB0740F1CC7FA24508 +CT=DBA57DDA73A4E987EA32EF113877E908 + +I=303 +KEY=FC69838410D06425547EA2FBB8179779267CB1894D90A9EA +IV=DBA57DDA73A4E987EA32EF113877E908 +PT=91CFB50FFBE97D8AD7F483ED18D1E941 +CT=1720ED3E3B685A19CDA66BD09BD4DA5F + +I=304 +KEY=541AAB6191E2C51F435E4FC5837FCD60EBDADA59D64473B5 +IV=1720ED3E3B685A19CDA66BD09BD4DA5F +PT=78FF980C48FAEBA0A87328E58132A13A +CT=ED2E260103CAA77598FD195D02B484C8 + +I=305 +KEY=761B0A3F50E2ACC1AE7069C480B56A157327C304D4F0F77D +IV=ED2E260103CAA77598FD195D02B484C8 +PT=8C01554039D8F8EE2201A15EC10069DE +CT=A9F0E16716B3AC14E06F18F5AEECB541 + +I=306 +KEY=70056CD35CF430D5078088A39606C6019348DBF17A1C423C +IV=A9F0E16716B3AC14E06F18F5AEECB541 +PT=C139651464D1614B061E66EC0C169C14 +CT=A41DDF008E0D52B627982D4196C3069E + +I=307 +KEY=EE1932746487B7BEA39D57A3180B94B7B4D0F6B0ECDF44A2 +IV=A41DDF008E0D52B627982D4196C3069E +PT=C617572884721A3D9E1C5EA73873876B +CT=44E5304E35A21660C450FAF84D87B13B + +I=308 +KEY=13D43E4526F8243FE77867ED2DA982D770800C48A158F599 +IV=44E5304E35A21660C450FAF84D87B13B +PT=9C72E08DD264D6B7FDCD0C31427F9381 +CT=173B2C7A54A1A3CF3D39DCB68DA1C539 + +I=309 +KEY=7CB72DE2CAED4080F0434B97790821184DB9D0FE2CF930A0 +IV=173B2C7A54A1A3CF3D39DCB68DA1C539 +PT=4DF3764F679E29446F6313A7EC1564BF +CT=F1A167A3EB8F3FAB9F9B1570475ED15A + +I=310 +KEY=A7E6340A1278A3E801E22C3492871EB3D222C58E6BA7E1FA +IV=F1A167A3EB8F3FAB9F9B1570475ED15A +PT=2ED419EA11AAF8F3DB5119E8D895E368 +CT=2C5C5B10E285FE6C7E4750D2F9C1BD23 + +I=311 +KEY=4B535B4D088F09192DBE77247002E0DFAC65955C92665CD9 +IV=2C5C5B10E285FE6C7E4750D2F9C1BD23 +PT=A3E9EA99771D0C02ECB56F471AF7AAF1 +CT=A12B4A15DBFAE2E7D4A7A792CD3C121A + +I=312 +KEY=2F0E7BAD76DC0A718C953D31ABF8023878C232CE5F5A4EC3 +IV=A12B4A15DBFAE2E7D4A7A792CD3C121A +PT=1CC105D2604628B7645D20E07E530368 +CT=65CE700B785D901C5E5E08F7E74BB296 + +I=313 +KEY=6111C386DE35C954E95B4D3AD3A59224269C3A39B811FC55 +IV=65CE700B785D901C5E5E08F7E74BB296 +PT=F902717AF7F0794E4E1FB82BA8E9C325 +CT=E7F3BD1056C504285FFC7F65B395DCAE + +I=314 +KEY=3B8F85E6FD28C4610EA8F02A8560960C7960455C0B8420FB +IV=E7F3BD1056C504285FFC7F65B395DCAE +PT=20A5529420D6D4C35A9E4660231D0D35 +CT=6CC36458ADECCA8B7198FD272A8C76C8 + +I=315 +KEY=D404C97E089F240B626B9472288C5C8708F8B87B21085633 +IV=6CC36458ADECCA8B7198FD272A8C76C8 +PT=1094639F6723C9B0EF8B4C98F5B7E06A +CT=D01C3C1E036D804563F04926ED203146 + +I=316 +KEY=4779B44770085E18B277A86C2BE1DCC26B08F15DCC286775 +IV=D01C3C1E036D804563F04926ED203146 +PT=A482437681DFE307937D7D3978977A13 +CT=319D579DE9E55C8A3B2097EE8C93375F + +I=317 +KEY=22362304D7417BB483EAFFF1C2048048502866B340BB502A +IV=319D579DE9E55C8A3B2097EE8C93375F +PT=7AF0C8274B5C243B654F9743A74925AC +CT=5F722165B8B422E088814B77A6B4D8E4 + +I=318 +KEY=06FDA49350C16FEADC98DE947AB0A2A8D8A92DC4E60F88CE +IV=5F722165B8B422E088814B77A6B4D8E4 +PT=A37964FA3E8145EF24CB87978780145E +CT=C0417773DFD3FC83C2CE12D388F5DD8F + +I=319 +KEY=366245F8CBC490611CD9A9E7A5635E2B1A673F176EFA5541 +IV=C0417773DFD3FC83C2CE12D388F5DD8F +PT=5D7E1E14F7BD7DB6309FE16B9B05FF8B +CT=2EAE64B58C18AC7ADD2EE62896AB708D + +I=320 +KEY=A1BB8A9F9BE8F1383277CD52297BF251C749D93FF85125CC +IV=2EAE64B58C18AC7ADD2EE62896AB708D +PT=3ADC6991BF15554F97D9CF67502C6159 +CT=069FC966F8A985AD41617CB0148D2B96 + +I=321 +KEY=7AB228E4114C14AB34E80434D1D277FC8628A58FECDC0E5A +IV=069FC966F8A985AD41617CB0148D2B96 +PT=4405B80CCE92FD71DB09A27B8AA4E593 +CT=13459A0239A33BC41424A5D03C6B2864 + +I=322 +KEY=78D1BC27E5CBBB1D27AD9E36E8714C38920C005FD0B7263E +IV=13459A0239A33BC41424A5D03C6B2864 +PT=B9BAA861988616CD026394C3F487AFB6 +CT=08DA968A2BAEB9B763EB42BF555A2BFA + +I=323 +KEY=F53B033A22EA1D7B2F7708BCC3DFF58FF1E742E085ED0DC4 +IV=08DA968A2BAEB9B763EB42BF555A2BFA +PT=30654265AD0FB24E8DEABF1DC721A666 +CT=E8412BDC1E75AC8E2C28552E2195795E + +I=324 +KEY=4928B51AF5C2408CC7362360DDAA5901DDCF17CEA478749A +IV=E8412BDC1E75AC8E2C28552E2195795E +PT=EEB05E487EEB907FBC13B620D7285DF7 +CT=E01839F95680D27E048383236D59EE85 + +I=325 +KEY=C4DB91EAFC4C26D7272E1A998B2A8B7FD94C94EDC9219A1F +IV=E01839F95680D27E048383236D59EE85 +PT=BA0160229D7471FE8DF324F0098E665B +CT=D41902E6BE946CEB1612CFEE2F33F7CD + +I=326 +KEY=B550731E659834A1F337187F35BEE794CF5E5B03E6126DD2 +IV=D41902E6BE946CEB1612CFEE2F33F7CD +PT=7DC970AFAF99BA6C718BE2F499D41276 +CT=326C3523173D62E9E145592E7A774311 + +I=327 +KEY=5F87F6C2402B2352C15B2D5C2283857D2E1B022D9C652EC3 +IV=326C3523173D62E9E145592E7A774311 +PT=24ED6DAE1B24CC2BEAD785DC25B317F3 +CT=DDAE8AFF94604FFA82AE4FFB06953C01 + +I=328 +KEY=3636C04061996CD01CF5A7A3B6E3CA87ACB54DD69AF012C2 +IV=DDAE8AFF94604FFA82AE4FFB06953C01 +PT=98E262805B8D9FD169B1368221B24F82 +CT=0D75DCFA4941BCE658DB2C71CB270BE7 + +I=329 +KEY=64B9A0DE7DDA73C011807B59FFA27661F46E61A751D71925 +IV=0D75DCFA4941BCE658DB2C71CB270BE7 +PT=2BC34C226D41D8CE528F609E1C431F10 +CT=D70ED1DCDB9420E4B4A0D2A7C5148DE3 + +I=330 +KEY=F64196479D35F74BC68EAA852436568540CEB30094C394C6 +IV=D70ED1DCDB9420E4B4A0D2A7C5148DE3 +PT=1015CB1E4569986C92F83699E0EF848B +CT=524314DCCF2ADE5F8C3D241824C2BA73 + +I=331 +KEY=686AB32115A2884C94CDBE59EB1C88DACCF39718B0012EB5 +IV=524314DCCF2ADE5F8C3D241824C2BA73 +PT=FB8B49053F724B7D9E2B256688977F07 +CT=7C579324F7251EDF95BDE2320104ACA6 + +I=332 +KEY=34DD68E6F442F6D9E89A2D7D1C399605594E752AB1058213 +IV=7C579324F7251EDF95BDE2320104ACA6 +PT=A3B71504A8DAA3515CB7DBC7E1E07E95 +CT=921A66278A6D1E61D4B509F199F8FE55 + +I=333 +KEY=19C9F40A858DD9EA7A804B5A965488648DFB7CDB28FD7C46 +IV=921A66278A6D1E61D4B509F199F8FE55 +PT=B0B651905E1B38FB2D149CEC71CF2F33 +CT=F2C37CF94514C902A0E438159C2C9F5F + +I=334 +KEY=B68812FC7D4E40D6884337A3D34041662D1F44CEB4D1E319 +IV=F2C37CF94514C902A0E438159C2C9F5F +PT=7DE03F498839F8DAAF41E6F6F8C3993C +CT=4596A25A85D06BCC74F686F8F1E8C203 + +I=335 +KEY=2836F982CA563379CDD595F956902AAA59E9C2364539211A +IV=4596A25A85D06BCC74F686F8F1E8C203 +PT=D5425E42151014ED9EBEEB7EB71873AF +CT=0BA46EFA61FB07430C51D7CE267E1F47 + +I=336 +KEY=BC8C7F9051C98892C671FB03376B2DE955B815F863473E5D +IV=0BA46EFA61FB07430C51D7CE267E1F47 +PT=5D060EEC179C1B9E94BA86129B9FBBEB +CT=49F7D7D7BAB7795A4E74A854C8C1AC53 + +I=337 +KEY=E661F49B22BC92358F862CD48DDC54B31BCCBDACAB86920E +IV=49F7D7D7BAB7795A4E74A854C8C1AC53 +PT=C598926A437A27A45AED8B0B73751AA7 +CT=0EB97E32AEC4CE3959197C5B72C1ABC5 + +I=338 +KEY=E625AB8664BCF057813F52E623189A8A42D5C1F7D94739CB +IV=0EB97E32AEC4CE3959197C5B72C1ABC5 +PT=B7272C4D712F9CF500445F1D46006262 +CT=DA9F53564E69AED610BCCAD13C00A241 + +I=339 +KEY=75FC1D46AFD886915BA001B06D71345C52690B26E5479B8A +IV=DA9F53564E69AED610BCCAD13C00A241 +PT=FE7513CF9353BBF093D9B6C0CB6476C6 +CT=7F61B6F9B7C14EB6179F2DA597EC1183 + +I=340 +KEY=F92D3201DA84422024C1B749DAB07AEA45F6268372AB8A09 +IV=7F61B6F9B7C14EB6179F2DA597EC1183 +PT=4E4D3DF58D7D9C338CD12F47755CC4B1 +CT=F9216373C300AA9BE96BD8C98F9716B7 + +I=341 +KEY=680384A1E522C848DDE0D43A19B0D071AC9DFE4AFD3C9CBE +IV=F9216373C300AA9BE96BD8C98F9716B7 +PT=1A7B30192D54142E912EB6A03FA68A68 +CT=8512BA1B57BC04EF3C021DB1EC3CA9C6 + +I=342 +KEY=DE3B85BD09EC93B858F26E214E0CD49E909FE3FB11003578 +IV=8512BA1B57BC04EF3C021DB1EC3CA9C6 +PT=86587FF85D73F77FB638011CECCE5BF0 +CT=FA582C37D4063D61428C886A9FD54C84 + +I=343 +KEY=C574CA7322F443FBA2AA42169A0AE9FFD2136B918ED579FC +IV=FA582C37D4063D61428C886A9FD54C84 +PT=3A7425A8B7BC3A941B4F4FCE2B18D043 +CT=7571B4D46CBC671964AB5BDE9C843DCF + +I=344 +KEY=078109812EFBA9DBD7DBF6C2F6B68EE6B6B8304F12514433 +IV=7571B4D46CBC671964AB5BDE9C843DCF +PT=5224060F0848F028C2F5C3F20C0FEA20 +CT=DA9EB72D65D492FE88B819674B8433C1 + +I=345 +KEY=5BF7FA2E15A87C850D4541EF93621C183E00292859D577F2 +IV=DA9EB72D65D492FE88B819674B8433C1 +PT=2622B2A19CBBAD065C76F3AF3B53D55E +CT=C66EF470CEDDD499AE6214E75DE9051B + +I=346 +KEY=ECBE2377CAF0C9E9CB2BB59F5DBFC88190623DCF043C72E9 +IV=C66EF470CEDDD499AE6214E75DE9051B +PT=833F22A76D51E360B749D959DF58B56C +CT=57407E3DEFFF753E879619424FCE5713 + +I=347 +KEY=4EAB83DA78D60CB09C6BCBA2B240BDBF17F4248D4BF225FA +IV=57407E3DEFFF753E879619424FCE5713 +PT=25781A534FB9192CA215A0ADB226C559 +CT=644D89381439E7BBED7DC344CBF4C886 + +I=348 +KEY=C4977EF1F6271D6CF826429AA6795A04FA89E7C98006ED7C +IV=644D89381439E7BBED7DC344CBF4C886 +PT=E8EDD9AA25A8C5B08A3CFD2B8EF111DC +CT=CA4B2680D0EE8E28818BE8DE8D625ADC + +I=349 +KEY=80212F6D11C6DAE2326D641A7697D42C7B020F170D64B7A0 +IV=CA4B2680D0EE8E28818BE8DE8D625ADC +PT=8F667EEDB79E930644B6519CE7E1C78E +CT=5497F477AD5E65BB748A781533F1BCEF + +I=350 +KEY=A05DF1DF7E0393A566FA906DDBC9B1970F8877023E950B4F +IV=5497F477AD5E65BB748A781533F1BCEF +PT=099FDB76E6D21788207CDEB26FC54947 +CT=C8C541B359BF1B53441C4EFFFD2F65AF + +I=351 +KEY=3970F236F800D18BAE3FD1DE8276AAC44B9439FDC3BA6EE0 +IV=C8C541B359BF1B53441C4EFFFD2F65AF +PT=C79FA2079ECCEBCD992D03E98603422E +CT=E59765A861DE0168161EA1360B5966A9 + +I=352 +KEY=8ED3BFA3E4C9453C4BA8B476E3A8ABAC5D8A98CBC8E30849 +IV=E59765A861DE0168161EA1360B5966A9 +PT=AFBCD48F06709730B7A34D951CC994B7 +CT=5A65435BD1B4DB742E8AFF8C402927FC + +I=353 +KEY=2A3F01E56E45895B11CDF72D321C70D87300674788CA2FB5 +IV=5A65435BD1B4DB742E8AFF8C402927FC +PT=CF684F64B8CCD2EDA4ECBE468A8CCC67 +CT=551AF68D50D23408F47214C0B18E6C8A + +I=354 +KEY=CA12AC8D17941E6244D701A062CE44D0877273873944433F +IV=551AF68D50D23408F47214C0B18E6C8A +PT=561072AC144854C1E02DAD6879D19739 +CT=ADFF035C89E040A4C3CCE190D6CB7283 + +I=355 +KEY=D1CA1B08A51B5086E92802FCEB2E047444BE9217EF8F31BC +IV=ADFF035C89E040A4C3CCE190D6CB7283 +PT=827ADE7D0F329D9A1BD8B785B28F4EE4 +CT=425F5596D3FD37243EE59D6FC1F5ADCC + +I=356 +KEY=54EC325FE63AA470AB77576A38D333507A5B0F782E7A9C70 +IV=425F5596D3FD37243EE59D6FC1F5ADCC +PT=4AAF21E64F8DBDB0852629574321F4F6 +CT=D85520FE860C9F320CDC8192A900F499 + +I=357 +KEY=5B4612BC35BFC12473227794BEDFAC6276878EEA877A68E9 +IV=D85520FE860C9F320CDC8192A900F499 +PT=0D046A402A1860C70FAA20E3D3856554 +CT=11C20F3ACED79B37402B2F04886D4CC7 + +I=358 +KEY=5052384CE705101562E078AE7008375536ACA1EE0F17242E +IV=11C20F3ACED79B37402B2F04886D4CC7 +PT=7546E6521BBBFAFE0B142AF0D2BAD131 +CT=BCDA339266E3AFB779AF17CE34218BE5 + +I=359 +KEY=F7ECFB2AA4FC6DE2DE3A4B3C16EB98E24F03B6203B36AFCB +IV=BCDA339266E3AFB779AF17CE34218BE5 +PT=85DF7958789E9090A7BEC36643F97DF7 +CT=300D46EAB6466314BB00DBC869C77F4E + +I=360 +KEY=1E27229506EC9555EE370DD6A0ADFBF6F4036DE852F1D085 +IV=300D46EAB6466314BB00DBC869C77F4E +PT=C6CED700614467A0E9CBD9BFA210F8B7 +CT=51735C075A14FE95D4A02F527A9474D3 + +I=361 +KEY=857F653E1E811CABBF4451D1FAB9056320A342BA2865A456 +IV=51735C075A14FE95D4A02F527A9474D3 +PT=53D436401D6811B19B5847AB186D89FE +CT=827017531E56980C4357549D0E70114F + +I=362 +KEY=1BCE612F3A5262223D344682E4EF9D6F63F416272615B519 +IV=827017531E56980C4357549D0E70114F +PT=4C1BD17FFD65AB2C9EB1041124D37E89 +CT=751BCA9516123906561FB8AF2208CEE1 + +I=363 +KEY=7C7034EC27524FC3482F8C17F2FDA46935EBAE88041D7BF8 +IV=751BCA9516123906561FB8AF2208CEE1 +PT=7C23D6E77039F35267BE55C31D002DE1 +CT=82CAFBBE859FA80B2A8E58CEC074B01A + +I=364 +KEY=7F31EEE0447BB53CCAE577A977620C621F65F646C469CBE2 +IV=82CAFBBE859FA80B2A8E58CEC074B01A +PT=B91FF7759419BBB10341DA0C6329FAFF +CT=B7614376C9BAFC92E17E39D2BDF1F2EF + +I=365 +KEY=E705144BCE40FC987D8434DFBED8F0F0FE1BCF947998390D +IV=B7614376C9BAFC92E17E39D2BDF1F2EF +PT=72B3472217AC80979834FAAB8A3B49A4 +CT=A63BA38FDDFE99D28BA447871BBA6211 + +I=366 +KEY=15C813D2D9AD1494DBBF97506326692275BF881362225B1C +IV=A63BA38FDDFE99D28BA447871BBA6211 +PT=349F8E5FAE004B51F2CD079917EDE80C +CT=C87E448872E619419766CB46787F2581 + +I=367 +KEY=B12B790C217821DA13C1D3D811C07063E2D943551A5D7E9D +IV=C87E448872E619419766CB46787F2581 +PT=EC474C794E3C8322A4E36ADEF8D5354E +CT=73DD478F7F41857F7A5DE7EDF3F1AF7B + +I=368 +KEY=1CFA6A54B3E572DC601C94576E81F51C9884A4B8E9ACD1E6 +IV=73DD478F7F41857F7A5DE7EDF3F1AF7B +PT=48F8361EF11F94C1ADD11358929D5306 +CT=8B85DE2CBE5C96CBDFE16064079754D9 + +I=369 +KEY=6718C10E683F4D73EB994A7BD0DD63D74765C4DCEE3B853F +IV=8B85DE2CBE5C96CBDFE16064079754D9 +PT=59BFDA108542EDDB7BE2AB5ADBDA3FAF +CT=56FF53384CED780F604F86EC0CE26B26 + +I=370 +KEY=704ED4F1E96776A2BD6619439C301BD8272A4230E2D9EE19 +IV=56FF53384CED780F604F86EC0CE26B26 +PT=468FDBDB8BC26B5A175615FF81583BD1 +CT=7B0C2436262A262C5FAFC3A9B786DB00 + +I=371 +KEY=67AFB86317B622B2C66A3D75BA1A3DF478858199555F3519 +IV=7B0C2436262A262C5FAFC3A9B786DB00 +PT=768BE978E5E8CA6E17E16C92FED15410 +CT=D32206D5D1521AB667516391810F5719 + +I=372 +KEY=0BF4E0C32EA3D69615483BA06B4827421FD4E208D4506200 +IV=D32206D5D1521AB667516391810F5719 +PT=1943C5D93D10A0E36C5B58A03915F424 +CT=6BCE2BEC0D5A0DA9051AF2B34A873694 + +I=373 +KEY=924D1C527572A2EF7E86104C66122AEB1ACE10BB9ED75494 +IV=6BCE2BEC0D5A0DA9051AF2B34A873694 +PT=E3020D099D0841C299B9FC915BD17479 +CT=3BEBA6BA0762BF5FAA4D26B70071B4A9 + +I=374 +KEY=CFA41DB53F2F8766456DB6F6617095B4B083360C9EA6E03D +IV=3BEBA6BA0762BF5FAA4D26B70071B4A9 +PT=31F7316F0D1012CD5DE901E74A5D2589 +CT=C4253CED7F88DF97596B08A15BAEF533 + +I=375 +KEY=E2B9D43008C1537281488A1B1EF84A23E9E83EADC508150E +IV=C4253CED7F88DF97596B08A15BAEF533 +PT=00365D6755A898E62D1DC98537EED414 +CT=2D4EB6BA84D1C0C978EA20C1693BB75C + +I=376 +KEY=43EA75DFD5B35CCBAC063CA19A298AEA91021E6CAC33A252 +IV=2D4EB6BA84D1C0C978EA20C1693BB75C +PT=599279C68B67A988A153A1EFDD720FB9 +CT=03698CC5E133AD8855B847C124FD2778 + +I=377 +KEY=8F2C76FCFBD8060DAF6FB0647B1A2762C4BA59AD88CE852A +IV=03698CC5E133AD8855B847C124FD2778 +PT=47EFAF7E090B94B5CCC603232E6B5AC6 +CT=8D44C11C25ADE5631E05FAAECCA70AF7 + +I=378 +KEY=E02084775A2E1A4E222B71785EB7C201DABFA30344698FDD +IV=8D44C11C25ADE5631E05FAAECCA70AF7 +PT=394EC624EBC0D79E6F0CF28BA1F61C43 +CT=5EB407847213D5E950C66787B140BC35 + +I=379 +KEY=D8208A70940589F47C9F76FC2CA417E88A79C484F52933E8 +IV=5EB407847213D5E950C66787B140BC35 +PT=F28816D227AC09F538000E07CE2B93BA +CT=2D4FBD74A027526BADC8C2A433963C22 + +I=380 +KEY=858193C76AFE48D951D0CB888C83458327B10620C6BF0FCA +IV=2D4FBD74A027526BADC8C2A433963C22 +PT=FBAA6C644F8E08885DA119B7FEFBC12D +CT=FA2DAE761EBBFDE4B77CBCD2381165DB + +I=381 +KEY=DA9A9F800056FC6EABFD65FE9238B86790CDBAF2FEAE6A11 +IV=FA2DAE761EBBFDE4B77CBCD2381165DB +PT=F66A574C26D0F15C5F1B0C476AA8B4B7 +CT=DB18F5B16BF19C2BCCA36091A302BF38 + +I=382 +KEY=BD2AB07F036032AB70E5904FF9C9244C5C6EDA635DACD529 +IV=DB18F5B16BF19C2BCCA36091A302BF38 +PT=04B0C1A19C6D38B467B02FFF0336CEC5 +CT=D3F01581B21DF4E470EE595CAB44912C + +I=383 +KEY=7EF57F6BDE41D79CA31585CE4BD4D0A82C80833FF6E84405 +IV=D3F01581B21DF4E470EE595CAB44912C +PT=83BF32E0F3F3CEE7C3DFCF14DD21E537 +CT=10C69B9A04E0851B63D85D025BBACA29 + +I=384 +KEY=22057A9912BB6B76B3D31E544F3455B34F58DE3DAD528E2C +IV=10C69B9A04E0851B63D85D025BBACA29 +PT=150ACC96322893CC5CF005F2CCFABCEA +CT=2743FE5769DDA5D591318E200AF672D0 + +I=385 +KEY=742A2117B51176E69490E00326E9F066DE69501DA7A4FCFC +IV=2743FE5769DDA5D591318E200AF672D0 +PT=93246C1A26F66DAF562F5B8EA7AA1D90 +CT=5CA8FC8DB4A20B2CA8AB86B1B40DA1A1 + +I=386 +KEY=3C09F8C3B20BE749C8381C8E924BFB4A76C2D6AC13A95D5D +IV=5CA8FC8DB4A20B2CA8AB86B1B40DA1A1 +PT=D91806E0F3451C374823D9D4071A91AF +CT=25701E4C6685C98333566EB75498AEB7 + +I=387 +KEY=DD0386F2D0D1E8FFED4802C2F4CE32C94594B81B4731F3EA +IV=25701E4C6685C98333566EB75498AEB7 +PT=701A5D7027053688E10A7E3162DA0FB6 +CT=E4A5889FC49B62F767F61F1D2810801A + +I=388 +KEY=BB9A1FA7287B0D3D09ED8A5D3055503E2262A7066F2173F0 +IV=E4A5889FC49B62F767F61F1D2810801A +PT=A110B0A38255279B66999955F8AAE5C2 +CT=F1A9BDA2045F3EAE2AB9CEE2AD352270 + +I=389 +KEY=21B561DC3C44B5A5F84437FF340A6E9008DB69E4C2145180 +IV=F1A9BDA2045F3EAE2AB9CEE2AD352270 +PT=1562CF8420963B479A2F7E7B143FB898 +CT=E7E2BA657D3482A4825D643B8C01B52E + +I=390 +KEY=60A0FA1F5FA435401FA68D9A493EEC348A860DDF4E15E4AE +IV=E7E2BA657D3482A4825D643B8C01B52E +PT=930490633BC4EDC941159BC363E080E5 +CT=2FDBCD145EB8620594834B0D63BBD137 + +I=391 +KEY=7DD1686F811E4017307D408E17868E311E0546D22DAE3599 +IV=2FDBCD145EB8620594834B0D63BBD137 +PT=4BB1C43F4ABC51CD1D719270DEBA7557 +CT=B703658AD9FFCDE05E2C7E252990402E + +I=392 +KEY=18203DC5AAA632F5877E2504CE7943D1402938F7043E75B7 +IV=B703658AD9FFCDE05E2C7E252990402E +PT=47931942F275F05E65F155AA2BB872E2 +CT=5B79CB7FA90D3BB5A979A4588D4DE434 + +I=393 +KEY=9F6D532CBAF42FCDDC07EE7B67747864E9509CAF89739183 +IV=5B79CB7FA90D3BB5A979A4588D4DE434 +PT=E3A36DF4EB896B4D874D6EE910521D38 +CT=61BF460521E67B3CAC638F3298EF9310 + +I=394 +KEY=ED4F97BC99036E83BDB8A87E469203584533139D119C0293 +IV=61BF460521E67B3CAC638F3298EF9310 +PT=55EABDF72CCB5D737222C49023F7414E +CT=8A27D87B53B2FB8BBAFF7851AF1D51F2 + +I=395 +KEY=E1B9A7291D885F8E379F70051520F8D3FFCC6BCCBE815361 +IV=8A27D87B53B2FB8BBAFF7851AF1D51F2 +PT=D30271EA236E948F0CF63095848B310D +CT=15075FDCBD2D6FC15B9A3841A2D58C34 + +I=396 +KEY=976B101EE3E10E0822982FD9A80D9712A456538D1C54DF55 +IV=15075FDCBD2D6FC15B9A3841A2D58C34 +PT=879EED3434159D8076D2B737FE695186 +CT=6896582462983FAAE443078F9768B339 + +I=397 +KEY=A7A3277BF5F605FC4A0E77FDCA95A8B8401554028B3C6C6C +IV=6896582462983FAAE443078F9768B339 +PT=89DDABE96D1069ED30C8376516170BF4 +CT=96FE6B921416B667AA5B34D2D2E25747 + +I=398 +KEY=DD57026B1D4E32A8DCF01C6FDE831EDFEA4E60D059DE3B2B +IV=96FE6B921416B667AA5B34D2D2E25747 +PT=8144C8BB09FC72827AF42510E8B83754 +CT=EEDC3677AB7B57829F6D733F8090DA8A + +I=399 +KEY=B4D1BDF297DC0574322C2A1875F8495D752313EFD94EE1A1 +IV=EEDC3677AB7B57829F6D733F8090DA8A +PT=510F7A55799B39786986BF998A9237DC +CT=BA50C94440C04A8C0899D42658E25437 + +========== + +KEYSIZE=256 + +I=0 +KEY=0000000000000000000000000000000000000000000000000000000000000000 +IV=00000000000000000000000000000000 +PT=00000000000000000000000000000000 +CT=FE3C53653E2F45B56FCD88B2CC898FF0 + +I=1 +KEY=B2493DE29713367D9FAA93469F8EF596FE3C53653E2F45B56FCD88B2CC898FF0 +IV=FE3C53653E2F45B56FCD88B2CC898FF0 +PT=B2493DE29713367D9FAA93469F8EF596 +CT=7CE2ABAF8BEF23C4816DC8CE842048A7 + +I=2 +KEY=33A36646FE56F70DC0C51A3117E639F182DEF8CAB5C06671EEA0407C48A9C757 +IV=7CE2ABAF8BEF23C4816DC8CE842048A7 +PT=81EA5BA46945C1705F6F89778868CC67 +CT=50CD14A12C6852D39654C816BFAF9AC2 + +I=3 +KEY=0D6A3DACE75B104CA8A303A32670BF3AD213EC6B99A834A278F4886AF7065D95 +IV=50CD14A12C6852D39654C816BFAF9AC2 +PT=3EC95BEA190DE74168661992319686CB +CT=3F411DAD0E339FE281637133BF46BD13 + +I=4 +KEY=A53BE0709BF686A7DB7C3848D81AB66BED52F1C6979BAB40F997F9594840E086 +IV=3F411DAD0E339FE281637133BF46BD13 +PT=A851DDDC7CAD96EB73DF3BEBFE6A0951 +CT=5BA2C7663A4061719A7CCC2AF2A3EE8A + +I=5 +KEY=ECF3490CB7717A5236A3A94811BEBF13B6F036A0ADDBCA3163EB3573BAE30E0C +IV=5BA2C7663A4061719A7CCC2AF2A3EE8A +PT=49C8A97C2C87FCF5EDDF9100C9A40978 +CT=F105031CE7E5111317745C64F4F6D150 + +I=6 +KEY=CE8A062A2A9F9EDE2EFB43A8602BB47847F535BC4A3EDB22749F69174E15DF5C +IV=F105031CE7E5111317745C64F4F6D150 +PT=22794F269DEEE48C1858EAE071950B6B +CT=C8F030398A873550A34386D9A153D833 + +I=7 +KEY=2BE39545B8FC27444178BF0004C7F1048F050585C0B9EE72D7DCEFCEEF46076F +IV=C8F030398A873550A34386D9A153D833 +PT=E569936F9263B99A6F83FCA864EC457C +CT=519CF42C0BBFCBD79679089BC5E963B4 + +I=8 +KEY=80E9C0F78F99E309935C0A69B961D787DE99F1A9CB0625A541A5E7552AAF64DB +IV=519CF42C0BBFCBD79679089BC5E963B4 +PT=AB0A55B23765C44DD224B569BDA62683 +CT=64AC8FEA3B83584E9B7379B48F88B7A4 + +I=9 +KEY=48DDBDA704BA7702960820A0D2CA485CBA357E43F0857DEBDAD69EE1A527D37F +IV=64AC8FEA3B83584E9B7379B48F88B7A4 +PT=C8347D508B23940B05542AC96BAB9FDB +CT=2B1F53F35A308673E9B1E004C32B2080 + +I=10 +KEY=D26C4C6BE601D63BDDE6F1A49B5124CB912A2DB0AAB5FB9833677EE5660CF3FF +IV=2B1F53F35A308673E9B1E004C32B2080 +PT=9AB1F1CCE2BBA1394BEED104499B6C97 +CT=0DAE66B5741FE38E544D9EC4E90ABDAF + +I=11 +KEY=D241355DB8FC5F23D0D207F72E290F189C844B05DEAA1816672AE0218F064E50 +IV=0DAE66B5741FE38E544D9EC4E90ABDAF +PT=002D79365EFD89180D34F653B5782BD3 +CT=D00122636CC0D9D62E614EAF0963C448 + +I=12 +KEY=1BC3268A0B674A05B2FC6E18460231564C856966B26AC1C0494BAE8E86658A18 +IV=D00122636CC0D9D62E614EAF0963C448 +PT=C98213D7B39B1526622E69EF682B3E4E +CT=30EF014D1766651C524B3CC82F0140C6 + +I=13 +KEY=50BE5951A5C2403C52425897C442A8457C6A682BA50CA4DC1B009246A964CADE +IV=30EF014D1766651C524B3CC82F0140C6 +PT=4B7D7FDBAEA50A39E0BE368F82409913 +CT=BAD488702B447FABEC2074E1DD37E631 + +I=14 +KEY=C007EE52430FF98EDD206C94ED349DE6C6BEE05B8E48DB77F720E6A774532CEF +IV=BAD488702B447FABEC2074E1DD37E631 +PT=90B9B703E6CDB9B28F623403297635A3 +CT=EC3862EB60E7D8D0827645BD690F71B8 + +I=15 +KEY=AE37C1DBEBF9B269E8D10CC4F046F9FC2A8682B0EEAF03A77556A31A1D5C5D57 +IV=EC3862EB60E7D8D0827645BD690F71B8 +PT=6E302F89A8F64BE735F160501D72641A +CT=6073D1F25F3697C1E07384C67D71D8AE + +I=16 +KEY=86E8B9050AB24200E3757B67F08761534AF55342B1999466952527DC602D85F9 +IV=6073D1F25F3697C1E07384C67D71D8AE +PT=28DF78DEE14BF0690BA477A300C198AF +CT=90EF55AB8837792F82CF0F002E36F8DB + +I=17 +KEY=DE93EA10BB6DC2B0A6D3919561CE5AE4DA1A06E939AEED4917EA28DC4E1B7D22 +IV=90EF55AB8837792F82CF0F002E36F8DB +PT=587B5315B1DF80B045A6EAF291493BB7 +CT=063783CB1A2137732D10CA6233C5CE93 + +I=18 +KEY=3D147E3727A1FEB2C6F36AB9DF772E97DC2D8522238FDA3A3AFAE2BE7DDEB3B1 +IV=063783CB1A2137732D10CA6233C5CE93 +PT=E38794279CCC3C026020FB2CBEB97473 +CT=79C5CEEE64BFD33948D2E08EBE25B7E9 + +I=19 +KEY=34586C52923969647663A0D69436D7D1A5E84BCC4730090372280230C3FB0458 +IV=79C5CEEE64BFD33948D2E08EBE25B7E9 +PT=094C1265B59897D6B090CA6F4B41F946 +CT=87DFB65D575F56670DB739C988FD7DE5 + +I=20 +KEY=53724BF79612A7F0237927604619DD592237FD91106F5F647F9F3BF94B0679BD +IV=87DFB65D575F56670DB739C988FD7DE5 +PT=672A27A5042BCE94551A87B6D22F0A88 +CT=643F46BC77A5FE2434753B9C38142583 + +I=21 +KEY=8FBC30746F29985FFFA43C8BD3C4FC664608BB2D67CAA1404BEA006573125C3E +IV=643F46BC77A5FE2434753B9C38142583 +PT=DCCE7B83F93B3FAFDCDD1BEB95DD213F +CT=FD774BD6874EA7C0D790A5015440B664 + +I=22 +KEY=9A61A910701A4A42873549F78D3D9FD1BB7FF0FBE08406809C7AA5642752EA5A +IV=FD774BD6874EA7C0D790A5015440B664 +PT=15DD99641F33D21D7891757C5EF963B7 +CT=BFCEF4403428F5C96C24C249962371D4 + +I=23 +KEY=8D98738F6DF30113AF69A7A61C1582EE04B104BBD4ACF349F05E672DB1719B8E +IV=BFCEF4403428F5C96C24C249962371D4 +PT=17F9DA9F1DE94B51285CEE5191281D3F +CT=CC79F35C41F0E6C0EB03472B1D13029E + +I=24 +KEY=976C27F1A15FF6780043636FC4777090C8C8F7E7955C15891B5D2006AC629910 +IV=CC79F35C41F0E6C0EB03472B1D13029E +PT=1AF4547ECCACF76BAF2AC4C9D862F27E +CT=0629B80F94FBC2C1984985B9F3B85BDD + +I=25 +KEY=E8934C533DED166F58D65C9E60A906A5CEE14FE801A7D7488314A5BF5FDAC2CD +IV=0629B80F94FBC2C1984985B9F3B85BDD +PT=7FFF6BA29CB2E01758953FF1A4DE7635 +CT=F2A70F4ED1A836696841D523F2650B55 + +I=26 +KEY=8116688C16D2C26D162C4D813FB267103C4640A6D00FE121EB55709CADBFC998 +IV=F2A70F4ED1A836696841D523F2650B55 +PT=698524DF2B3FD4024EFA111F5F1B61B5 +CT=A9B5565EB9B5D5DAC52BE0F449FBE11A + +I=27 +KEY=5A7062E77C6D20563AFD0BFDAAE04BE995F316F869BA34FB2E7E9068E4442882 +IV=A9B5565EB9B5D5DAC52BE0F449FBE11A +PT=DB660A6B6ABFE23B2CD1467C95522CF9 +CT=E47F675379D4CE3DDABA0F906BE014B2 + +I=28 +KEY=4DDC0A5938F4A3DC1AF8D3AFD3DF6198718C71AB106EFAC6F4C49FF88FA43C30 +IV=E47F675379D4CE3DDABA0F906BE014B2 +PT=17AC68BE4499838A2005D852793F2A71 +CT=7B95AB0E030C70B7940ECDAEFCA570A5 + +I=29 +KEY=E287EFC66626600AF3453F68BE53E5250A19DAA513628A7160CA525673014C95 +IV=7B95AB0E030C70B7940ECDAEFCA570A5 +PT=AF5BE59F5ED2C3D6E9BDECC76D8C84BD +CT=E854E5DE0C42D57B869C29FC8D5AFFF3 + +I=30 +KEY=7F3415A538F60B24A58447E1D38805B3E24D3F7B1F205F0AE6567BAAFE5BB366 +IV=E854E5DE0C42D57B869C29FC8D5AFFF3 +PT=9DB3FA635ED06B2E56C178896DDBE096 +CT=4E55EDEDC35CDEAB3BFB2B5D39871625 + +I=31 +KEY=59E5F5ECC5693DA07046636094970E8CAC18D296DC7C81A1DDAD50F7C7DCA543 +IV=4E55EDEDC35CDEAB3BFB2B5D39871625 +PT=26D1E049FD9F3684D5C22481471F0B3F +CT=3355C2CC762E58FA941E0004209CA710 + +I=32 +KEY=0B62CF7EA869036A529E9D184574CD609F4D105AAA52D95B49B350F3E7400253 +IV=3355C2CC762E58FA941E0004209CA710 +PT=52873A926D003ECA22D8FE78D1E3C3EC +CT=9B86680D69D38870268D42E78EDA2B50 + +I=33 +KEY=CEDC9CCC4DC42CB055EDC50597EE24DF04CB7857C381512B6F3E1214699A2903 +IV=9B86680D69D38870268D42E78EDA2B50 +PT=C5BE53B2E5AD2FDA0773581DD29AE9BF +CT=05DD4896F08EEAA6A53FA7BCF183F538 + +I=34 +KEY=CA30B422016C86247D75B618D19247AC011630C1330FBB8DCA01B5A89819DC3B +IV=05DD4896F08EEAA6A53FA7BCF183F538 +PT=04EC28EE4CA8AA942898731D467C6373 +CT=F81E56F4390D65C7959348A6FBD8A94E + +I=35 +KEY=B7096A2EC0259DA21ACA6DBE637A9F15F90866350A02DE4A5F92FD0E63C17575 +IV=F81E56F4390D65C7959348A6FBD8A94E +PT=7D39DE0CC1491B8667BFDBA6B2E8D8B9 +CT=4364CA2D90FA256084DF8E2FCDC62AB3 + +I=36 +KEY=436C0894D4436149EE685F0061BDF3AEBA6CAC189AF8FB2ADB4D7321AE075FC6 +IV=4364CA2D90FA256084DF8E2FCDC62AB3 +PT=F46562BA1466FCEBF4A232BE02C76CBB +CT=0991DE19A5ABE5F7E8AE24120789B9AB + +I=37 +KEY=44E1636AFF962EC4F1C446A89B9393C6B3FD72013F531EDD33E35733A98EE66D +IV=0991DE19A5ABE5F7E8AE24120789B9AB +PT=078D6BFE2BD54F8D1FAC19A8FA2E6068 +CT=0F4EF4FA608671AC5F71063CF6C1EBDE + +I=38 +KEY=44289918A9E99F859FC2F604FE38B86EBCB386FB5FD56F716C92510F5F4F0DB3 +IV=0F4EF4FA608671AC5F71063CF6C1EBDE +PT=00C9FA72567FB1416E06B0AC65AB2BA8 +CT=2D6A2A1CC9D208C16236BBC9451EC5E1 + +I=39 +KEY=BE5907C77B0939D20575F27427A2C3FE91D9ACE7960767B00EA4EAC61A51C852 +IV=2D6A2A1CC9D208C16236BBC9451EC5E1 +PT=FA719EDFD2E0A6579AB70470D99A7B90 +CT=237A8DFBA42708BBF7E540766F2059F1 + +I=40 +KEY=CD97125720F2002207AC44C456CDDF0DB2A3211C32206F0BF941AAB0757191A3 +IV=237A8DFBA42708BBF7E540766F2059F1 +PT=73CE15905BFB39F002D9B6B0716F1CF3 +CT=2D1AB5CF3E9C27ADA9FB45F15007A7BB + +I=41 +KEY=123F64F2A28C80C2F6E000F69C8E5A639FB994D30CBC48A650BAEF4125763618 +IV=2D1AB5CF3E9C27ADA9FB45F15007A7BB +PT=DFA876A5827E80E0F14C4432CA43856E +CT=7039C9AF1E10FE99A91483EA578AE6DD + +I=42 +KEY=6CD69C4F5AD7CB5E9E4574F6A48FDB28EF805D7C12ACB63FF9AE6CAB72FCD0C5 +IV=7039C9AF1E10FE99A91483EA578AE6DD +PT=7EE9F8BDF85B4B9C68A574003801814B +CT=116DD8566366A19EEAF2F3E744B3EF9C + +I=43 +KEY=C73969C7D6D057003E2E215D94978792FEED852A71CA17A1135C9F4C364F3F59 +IV=116DD8566366A19EEAF2F3E744B3EF9C +PT=ABEFF5888C079C5EA06B55AB30185CBA +CT=648A801EF27E77D964BB751A32B8CFE8 + +I=44 +KEY=E0960DD6E807F3D0B5DF057D0D1E6DCC9A67053483B4607877E7EA5604F7F0B1 +IV=648A801EF27E77D964BB751A32B8CFE8 +PT=27AF64113ED7A4D08BF124209989EA5E +CT=D18AE728717C535049868FA6F1B4294E + +I=45 +KEY=466AE043435C6CCA67FF1C5D4B4175DA4BEDE21CF2C833283E6165F0F543D9FF +IV=D18AE728717C535049868FA6F1B4294E +PT=A6FCED95AB5B9F1AD2201920465F1816 +CT=169B55360728DA8F582C488F2569411F + +I=46 +KEY=27E1BC4931601D667CD807454D58B2BB5D76B72AF5E0E9A7664D2D7FD02A98E0 +IV=169B55360728DA8F582C488F2569411F +PT=618B5C0A723C71AC1B271B180619C761 +CT=67DADCF7C31CA394F46F18AB1AEA022E + +I=47 +KEY=2D4EB1F3A709F0A4CA5E2CD47F8F10123AAC6BDD36FC4A33922235D4CAC09ACE +IV=67DADCF7C31CA394F46F18AB1AEA022E +PT=0AAF0DBA9669EDC2B6862B9132D7A2A9 +CT=A5D49BDF099335166BBFDCBE29C90B80 + +I=48 +KEY=2A90CE470EB8C9400B056307D53452BE9F78F0023F6F7F25F99DE96AE309914E +IV=A5D49BDF099335166BBFDCBE29C90B80 +PT=07DE7FB4A9B139E4C15B4FD3AABB42AC +CT=5AFC238F19E369E77278593C6E20A946 + +I=49 +KEY=90B696E9A0792BFF7BF21BE373731CB5C584D38D268C16C28BE5B0568D293808 +IV=5AFC238F19E369E77278593C6E20A946 +PT=BA2658AEAEC1E2BF70F778E4A6474E0B +CT=2861A363922099D0F0B2A5AD2A5F421E + +I=50 +KEY=4FE5C563B7DB98C6B9CCA52F313FBAFCEDE570EEB4AC8F127B5715FBA7767A16 +IV=2861A363922099D0F0B2A5AD2A5F421E +PT=DF53538A17A2B339C23EBECC424CA649 +CT=D76E51B6EA5F74D0116C4D16EDD0DFAC + +I=51 +KEY=EBF784D98E40372429819EE23BE85B723A8B21585EF3FBC26A3B58ED4AA6A5BA +IV=D76E51B6EA5F74D0116C4D16EDD0DFAC +PT=A41241BA399BAFE2904D3BCD0AD7E18E +CT=6214F5E50EC99F40B86951CE395C8315 + +I=52 +KEY=C01A5093C6A29CEED72D14D903BD17E8589FD4BD503A6482D252092373FA26AF +IV=6214F5E50EC99F40B86951CE395C8315 +PT=2BEDD44A48E2ABCAFEAC8A3B38554C9A +CT=6CFC2188E40E806BBE277988B924627E + +I=53 +KEY=A8C3A10380B6D4D1CEFABF57F3C695193463F535B434E4E96C7570ABCADE44D1 +IV=6CFC2188E40E806BBE277988B924627E +PT=68D9F1904614483F19D7AB8EF07B82F1 +CT=B98E851902AEC129FD1607DECA9E0669 + +I=54 +KEY=B828711ABA1D06408099944287112DE58DED702CB69A25C091637775004042B8 +IV=B98E851902AEC129FD1607DECA9E0669 +PT=10EBD0193AABD2914E632B1574D7B8FC +CT=DBDA9DB56E6FF915D67D7DEE541DD6A3 + +I=55 +KEY=3B0E9FE343D665ABB3706243EF023C765637ED99D8F5DCD5471E0A9B545D941B +IV=DBDA9DB56E6FF915D67D7DEE541DD6A3 +PT=8326EEF9F9CB63EB33E9F60168131193 +CT=399802CE3FF3878A73C7D85E19FDD54B + +I=56 +KEY=9270D72D972B46C8E630FBD1AA67FBED6FAFEF57E7065B5F34D9D2C54DA04150 +IV=399802CE3FF3878A73C7D85E19FDD54B +PT=A97E48CED4FD2363554099924565C79B +CT=40FABA067414961FD964EC91196943E3 + +I=57 +KEY=017211AC512541BFBDD0292385AA20862F5555519312CD40EDBD3E5454C902B3 +IV=40FABA067414961FD964EC91196943E3 +PT=9302C681C60E07775BE0D2F22FCDDB6B +CT=6BF1125E581341510FD02B9450886B17 + +I=58 +KEY=AC2652A877F924710178641D20B239B944A4470FCB018C11E26D15C0044169A4 +IV=6BF1125E581341510FD02B9450886B17 +PT=AD54430426DC65CEBCA84D3EA518193F +CT=74871D2EF6D1F29181B0A2530885EEC8 + +I=59 +KEY=0BF012A9F0CB194C1F00893D4803E10130235A213DD07E8063DDB7930CC4876C +IV=74871D2EF6D1F29181B0A2530885EEC8 +PT=A7D6400187323D3D1E78ED2068B1D8B8 +CT=2A2DC9F5CB47C94D430ECAAAB1D0811E + +I=60 +KEY=8D22EEEA013E327509E84630166331DB1A0E93D4F697B7CD20D37D39BD140672 +IV=2A2DC9F5CB47C94D430ECAAAB1D0811E +PT=86D2FC43F1F52B3916E8CF0D5E60D0DA +CT=BC318E32957CE6577CD06E2D3166CD1F + +I=61 +KEY=1C4909D11840D978FD7232D0FBC0E6A3A63F1DE663EB519A5C0313148C72CB6D +IV=BC318E32957CE6577CD06E2D3166CD1F +PT=916BE73B197EEB0DF49A74E0EDA3D778 +CT=E9858DBB1B5145ABB598ADE882346DDB + +I=62 +KEY=DD2ED3C6FCE0034F19259D57A35B60CF4FBA905D78BA1431E99BBEFC0E46A6B6 +IV=E9858DBB1B5145ABB598ADE882346DDB +PT=C167DA17E4A0DA37E457AF87589B866C +CT=1E04B15BBF727BEAC33C0C26141636DD + +I=63 +KEY=81C434CDF7EABAA49252EC86DFE15FBA51BE2106C7C86FDB2AA7B2DA1A50906B +IV=1E04B15BBF727BEAC33C0C26141636DD +PT=5CEAE70B0B0AB9EB8B7771D17CBA3F75 +CT=EB21AED731D594017F5729262A1E23B4 + +I=64 +KEY=AEF6BF8323CAE4C2270CC5E51B0A3BFFBA9F8FD1F61DFBDA55F09BFC304EB3DF +IV=EB21AED731D594017F5729262A1E23B4 +PT=2F328B4ED4205E66B55E2963C4EB6445 +CT=EB73CFADA0ACB98B37091CB81489CC7C + +I=65 +KEY=BC3BD548867FA82FF80EF67B38016A1E51EC407C56B1425162F9874424C77FA3 +IV=EB73CFADA0ACB98B37091CB81489CC7C +PT=12CD6ACBA5B54CEDDF02339E230B51E1 +CT=1FEEF226D6759E8813B98A5D43B2F22A + +I=66 +KEY=E1F5760C694DBE5688A0241B5517B4B14E02B25A80C4DCD971400D1967758D89 +IV=1FEEF226D6759E8813B98A5D43B2F22A +PT=5DCEA344EF32167970AED2606D16DEAF +CT=9C591D087F0F45C8AE3DEC9C455FE200 + +I=67 +KEY=ABF2D79C472D0159FA9AE646D0C0FC9CD25BAF52FFCB9911DF7DE185222A6F89 +IV=9C591D087F0F45C8AE3DEC9C455FE200 +PT=4A07A1902E60BF0F723AC25D85D7482D +CT=62C4F4D7E4AC5ABC03BECA3CA56DA4FD + +I=68 +KEY=E58A351A4DD79A2ED6D386E11A8563F2B09F5B851B67C3ADDCC32BB98747CB74 +IV=62C4F4D7E4AC5ABC03BECA3CA56DA4FD +PT=4E78E2860AFA9B772C4960A7CA459F6E +CT=AD8557C0D04675CC312C7A106D5C8B83 + +I=69 +KEY=BCF7BB1010AF5CEB05E06339689067E31D1A0C45CB21B661EDEF51A9EA1B40F7 +IV=AD8557C0D04675CC312C7A106D5C8B83 +PT=597D8E0A5D78C6C5D333E5D872150411 +CT=80159F4F5E0C2DC07D3CD3C52A1A8E6D + +I=70 +KEY=328BB8EB86055D2BB52A02E40BB5D2C39D0F930A952D9BA190D3826CC001CE9A +IV=80159F4F5E0C2DC07D3CD3C52A1A8E6D +PT=8E7C03FB96AA01C0B0CA61DD6325B520 +CT=F58A2EE5A5BDE8CA0A96F4F4B64BE737 + +I=71 +KEY=F192AE51D926A2B68C38EA4E48A0590F6885BDEF3090736B9A457698764A29AD +IV=F58A2EE5A5BDE8CA0A96F4F4B64BE737 +PT=C31916BA5F23FF9D3912E8AA43158BCC +CT=B4C0DD55013AEFE12D94F31B861134CC + +I=72 +KEY=5EE48E38C2C805E2AACC89AD8682E552DC4560BA31AA9C8AB7D18583F05B1D61 +IV=B4C0DD55013AEFE12D94F31B861134CC +PT=AF7620691BEEA75426F463E3CE22BC5D +CT=FD8B06AEF9B3C25D11B950A6648276BB + +I=73 +KEY=F425B9BF4D114251736EE7FCDB430B6721CE6614C8195ED7A668D52594D96BDA +IV=FD8B06AEF9B3C25D11B950A6648276BB +PT=AAC137878FD947B3D9A26E515DC1EE35 +CT=31BE8DF4A8A749FBF11AB07D8479A10B + +I=74 +KEY=61A2D5337BCB827887F884AD98C67BEA1070EBE060BE172C5772655810A0CAD1 +IV=31BE8DF4A8A749FBF11AB07D8479A10B +PT=95876C8C36DAC029F49663514385708D +CT=E9A2EF0C882781788D50033B79FE181F + +I=75 +KEY=E930B2277AC4475FB0A94519F60DE552F9D204ECE8999654DA226663695ED2CE +IV=E9A2EF0C882781788D50033B79FE181F +PT=88926714010FC5273751C1B46ECB9EB8 +CT=17FFCD5A010709A2737570E038D63B27 + +I=76 +KEY=B944CE978DF68F8FBFF0A5EA62AAC299EE2DC9B6E99E9FF6A95716835188E9E9 +IV=17FFCD5A010709A2737570E038D63B27 +PT=50747CB0F732C8D00F59E0F394A727CB +CT=E12B89FA1B1DD3B29F02219FD3D7D3D2 + +I=77 +KEY=0E2D7FCEB557462267BED2CCA8B48CD70F06404CF2834C443655371C825F3A3B +IV=E12B89FA1B1DD3B29F02219FD3D7D3D2 +PT=B769B15938A1C9ADD84E7726CA1E4E4E +CT=75AE99B6022B08E36FB88A6F4D7698BF + +I=78 +KEY=8046D73D60912221694B2AFE703EDB167AA8D9FAF0A844A759EDBD73CF29A284 +IV=75AE99B6022B08E36FB88A6F4D7698BF +PT=8E6BA8F3D5C664030EF5F832D88A57C1 +CT=CF32DCE11FDB098A6435315342796064 + +I=79 +KEY=20716D6975C32231968BF76725144CBAB59A051BEF734D2D3DD88C208D50C2E0 +IV=CF32DCE11FDB098A6435315342796064 +PT=A037BA5415520010FFC0DD99552A97AC +CT=80F12B261317C66F21AC811230848468 + +I=80 +KEY=AD5A2011E425AFFD57E7191336D37D25356B2E3DFC648B421C740D32BDD44688 +IV=80F12B261317C66F21AC811230848468 +PT=8D2B4D7891E68DCCC16CEE7413C7319F +CT=F2C6B70C19A5748C6D2B5DE41544854F + +I=81 +KEY=49D4228508C789105CF457D10FA56048C7AD9931E5C1FFCE715F50D6A890C3C7 +IV=F2C6B70C19A5748C6D2B5DE41544854F +PT=E48E0294ECE226ED0B134EC239761D6D +CT=A31FB3535978DAA555DD617FAB27A97A + +I=82 +KEY=67CE710A3E778CB4A37D1F2274D4462D64B22A62BCB9256B248231A903B76ABD +IV=A31FB3535978DAA555DD617FAB27A97A +PT=2E1A538F36B005A4FF8948F37B712665 +CT=97336ECFAE89015E0B5A7D1C154C71BF + +I=83 +KEY=A87C517EF43CACC6D41EEB661DD1142CF38144AD123024352FD84CB516FB1B02 +IV=97336ECFAE89015E0B5A7D1C154C71BF +PT=CFB22074CA4B20727763F44469055201 +CT=466CD227A6A9D5FC3C0579064530FCE0 + +I=84 +KEY=D73F926A5B5DD8F5B82DE8F77E0E0697B5ED968AB499F1C913DD35B353CBE7E2 +IV=466CD227A6A9D5FC3C0579064530FCE0 +PT=7F43C314AF6174336C33039163DF12BB +CT=4F444B4554E965A113DC0097AA8FAD7A + +I=85 +KEY=7A19BE1C42A13B85B754834E9808DF4BFAA9DDCFE070946800013524F9444A98 +IV=4F444B4554E965A113DC0097AA8FAD7A +PT=AD262C7619FCE3700F796BB9E606D9DC +CT=F7078ABE7617867274CBBEDA1082B987 + +I=86 +KEY=D256675EDBF987B5CA86C21DE177C6A00DAE57719667121A74CA8BFEE9C6F31F +IV=F7078ABE7617867274CBBEDA1082B987 +PT=A84FD9429958BC307DD24153797F19EB +CT=676ACAB66B04597F1A33FF462BD5E0EE + +I=87 +KEY=C025616AB6F89BB1B90AA0E8F63FF1CC6AC49DC7FD634B656EF974B8C21313F1 +IV=676ACAB66B04597F1A33FF462BD5E0EE +PT=127306346D011C04738C62F51748376C +CT=BF66B8DD1E540A4FED759FDB9A44B439 + +I=88 +KEY=2A437D44D93C25B3233FB168D63751A5D5A2251AE337412A838CEB635857A7C8 +IV=BF66B8DD1E540A4FED759FDB9A44B439 +PT=EA661C2E6FC4BE029A3511802008A069 +CT=EC8DBB5B3FE245180856B312D3052A87 + +I=89 +KEY=838278123F0261D1F287C9FF94CA4A55392F9E41DCD504328BDA58718B528D4F +IV=EC8DBB5B3FE245180856B312D3052A87 +PT=A9C10556E63E4462D1B8789742FD1BF0 +CT=02E1E60312BB371912C35E3EBC6EA755 + +I=90 +KEY=64F3A47C8C7CFA9FF2AC88637C598E6A3BCE7842CE6E332B9919064F373C2A1A +IV=02E1E60312BB371912C35E3EBC6EA755 +PT=E771DC6EB37E9B4E002B419CE893C43F +CT=73D7499EBB38716D71CCB737CFFFA3FB + +I=91 +KEY=585ABE6B779F22400FC2AC3B55B39E91481931DC75564246E8D5B178F8C389E1 +IV=73D7499EBB38716D71CCB737CFFFA3FB +PT=3CA91A17FBE3D8DFFD6E245829EA10FB +CT=CEE7721855B7381D369ECC1C9337BB02 + +I=92 +KEY=7BC1E883465CBBB9BA624FF99308259386FE43C420E17A5BDE4B7D646BF432E3 +IV=CEE7721855B7381D369ECC1C9337BB02 +PT=239B56E831C399F9B5A0E3C2C6BBBB02 +CT=B6F48D369383974D163E4F17FDFC59EF + +I=93 +KEY=70032AF50BB5E080D4AA7722CEDC7DA9300ACEF2B362ED16C875327396086B0C +IV=B6F48D369383974D163E4F17FDFC59EF +PT=0BC2C2764DE95B396EC838DB5DD4583A +CT=E8372DA404126C63190626D95583629D + +I=94 +KEY=5C61B59BDA2FF51D4F4F740578466EA9D83DE356B7708175D17314AAC38B0991 +IV=E8372DA404126C63190626D95583629D +PT=2C629F6ED19A159D9BE50327B69A1300 +CT=F717B53E51665D0854C895EA1D1D7E77 + +I=95 +KEY=59A35E82B9C8D8FF25CFC5BAD979A9052F2A5668E616DC7D85BB8140DE9677E6 +IV=F717B53E51665D0854C895EA1D1D7E77 +PT=05C2EB1963E72DE26A80B1BFA13FC7AC +CT=7D3EE90EEF7C16872F98296977AA9557 + +I=96 +KEY=5BC419836F7C4F57957E13E39B2181455214BF66096ACAFAAA23A829A93CE2B1 +IV=7D3EE90EEF7C16872F98296977AA9557 +PT=02674701D6B497A8B0B1D65942582840 +CT=6DCD0C4B5633078FDEA9AE24781CB212 + +I=97 +KEY=E6D2BB67584AA2FAAE1D0DAD8C9C60253FD9B32D5F59CD75748A060DD12050A3 +IV=6DCD0C4B5633078FDEA9AE24781CB212 +PT=BD16A2E43736EDAD3B631E4E17BDE160 +CT=6515251260A73AE868E992B6D49579C5 + +I=98 +KEY=57637851C3C08A2923EBD2FEA27472DC5ACC963F3FFEF79D1C6394BB05B52966 +IV=6515251260A73AE868E992B6D49579C5 +PT=B1B1C3369B8A28D38DF6DF532EE812F9 +CT=1A40C2C15F03867E81F951B545396BB4 + +I=99 +KEY=E08E94110F1E64554848AB1966299B7D408C54FE60FD71E39D9AC50E408C42D2 +IV=1A40C2C15F03867E81F951B545396BB4 +PT=B7EDEC40CCDEEE7C6BA379E7C45DE9A1 +CT=DD331F336D669EFD37106099EA51010D + +I=100 +KEY=17F2544156745EC108BF97DA806752C39DBF4BCD0D9BEF1EAA8AA597AADD43DF +IV=DD331F336D669EFD37106099EA51010D +PT=F77CC050596A3A9440F73CC3E64EC9BE +CT=0EF37EC0B6071874FF68926D98A0EEAB + +I=101 +KEY=C97ABFF115E20A6C72A6206DB63EC0FD934C350DBB9CF76A55E237FA327DAD74 +IV=0EF37EC0B6071874FF68926D98A0EEAB +PT=DE88EBB0439654AD7A19B7B73659923E +CT=DA1DAEB42178A7657A40BD72A06CEDDC + +I=102 +KEY=77AB469FBC999BB2922D460413E2012049519BB99AE4500F2FA28A88921140A8 +IV=DA1DAEB42178A7657A40BD72A06CEDDC +PT=BED1F96EA97B91DEE08B6669A5DCC1DD +CT=E78523134FC8EAA77CC85E0EEC60FCD3 + +I=103 +KEY=4F88FA6F4053B3A15094ED532C2F47DCAED4B8AAD52CBAA8536AD4867E71BC7B +IV=E78523134FC8EAA77CC85E0EEC60FCD3 +PT=3823BCF0FCCA2813C2B9AB573FCD46FC +CT=BC540D1838D7AD8E8B1C44B96684DD31 + +I=104 +KEY=D178E105443700CFEE007AB3BAA71E4C1280B5B2EDFB1726D876903F18F5614A +IV=BC540D1838D7AD8E8B1C44B96684DD31 +PT=9EF01B6A0464B36EBE9497E096885990 +CT=6C6B95A5D8F4E7F1A5864DDBFCDCEED8 + +I=105 +KEY=8F6A589BA0ED1A67FE426368A7E523047EEB2017350FF0D77DF0DDE4E4298F92 +IV=6C6B95A5D8F4E7F1A5864DDBFCDCEED8 +PT=5E12B99EE4DA1AA8104219DB1D423D48 +CT=B58C92AE19B332621E7A4E5512C88596 + +I=106 +KEY=147895B157BF16B87C32AAA17480A886CB67B2B92CBCC2B5638A93B1F6E10A04 +IV=B58C92AE19B332621E7A4E5512C88596 +PT=9B12CD2AF7520CDF8270C9C9D3658B82 +CT=4D1D90F007BB5099C382E69C9CD1F7E5 + +I=107 +KEY=4C8441FCEBBD595999864A6CC37F7EDB867A22492B07922CA008752D6A30FDE1 +IV=4D1D90F007BB5099C382E69C9CD1F7E5 +PT=58FCD44DBC024FE1E5B4E0CDB7FFD65D +CT=7F59920056EC32FA48F8A9CCCFFE437A + +I=108 +KEY=CD922EEA60F0F136A799C650F5D4B030F923B0497DEBA0D6E8F0DCE1A5CEBE9B +IV=7F59920056EC32FA48F8A9CCCFFE437A +PT=81166F168B4DA86F3E1F8C3C36ABCEEB +CT=A546F57E48A783694577D59F7FD01D9E + +I=109 +KEY=90DE3ECB26E68BDD3C4B7AB9B9CDE6195C654537354C23BFAD87097EDA1EA305 +IV=A546F57E48A783694577D59F7FD01D9E +PT=5D4C102146167AEB9BD2BCE94C195629 +CT=6342B8CB1E493F916585FF1BBFC42AB3 + +I=110 +KEY=ADF1869FEA15122394E1F6FF6B51E5DE3F27FDFC2B051C2EC802F66565DA89B6 +IV=6342B8CB1E493F916585FF1BBFC42AB3 +PT=3D2FB854CCF399FEA8AA8C46D29C03C7 +CT=052AEDF54016429320B04243E308ECFE + +I=111 +KEY=DF52D7982845CBAEB4E56592906B63943A0D10096B135EBDE8B2B42686D26548 +IV=052AEDF54016429320B04243E308ECFE +PT=72A35107C250D98D2004936DFB3A864A +CT=EE147A64DC2E31222A3A14B133769ACE + +I=112 +KEY=5D6B5899612FF15825029DEB0B37CB4ED4196A6DB73D6F9FC288A097B5A4FF86 +IV=EE147A64DC2E31222A3A14B133769ACE +PT=82398F01496A3AF691E7F8799B5CA8DA +CT=8330EF868E72D33172D7DEC7B440056C + +I=113 +KEY=FC23917C478894C9490A6585CCB8A716572985EB394FBCAEB05F7E5001E4FAEA +IV=8330EF868E72D33172D7DEC7B440056C +PT=A148C9E526A765916C08F86EC78F6C58 +CT=DC83E3727C4E9754A82BFCFFD924ACB3 + +I=114 +KEY=BCD556FA7AFA27F9675F45922924DFA68BAA669945012BFA187482AFD8C05659 +IV=DC83E3727C4E9754A82BFCFFD924ACB3 +PT=40F6C7863D72B3302E552017E59C78B0 +CT=C0B97D9320DC3E893953E1D93859D3E4 + +I=115 +KEY=A0F23A11C85F008CFEC20F76BD6751054B131B0A65DD157321276376E09985BD +IV=C0B97D9320DC3E893953E1D93859D3E4 +PT=1C276CEBB2A52775999D4AE494438EA3 +CT=8C28875C39211D01A084A59BA71D0C31 + +I=116 +KEY=2BB58C8FE9FE5BAEC5DB3F6A7EB98187C73B9C565CFC087281A3C6ED4784898C +IV=8C28875C39211D01A084A59BA71D0C31 +PT=8B47B69E21A15B223B19301CC3DED082 +CT=7865E390E8019259A117669082ED5CCC + +I=117 +KEY=6035A1AC1F0C1871EA06773DEA40B5C5BF5E7FC6B4FD9A2B20B4A07DC569D540 +IV=7865E390E8019259A117669082ED5CCC +PT=4B802D23F6F243DF2FDD485794F93442 +CT=DC7BA7C54217B8DEE966C0672DBE79CD + +I=118 +KEY=CCA70BB373BA65736D25078BB99980F66325D803F6EA22F5C9D2601AE8D7AC8D +IV=DC7BA7C54217B8DEE966C0672DBE79CD +PT=AC92AA1F6CB67D02872370B653D93533 +CT=CBB60FB6BE7240A2037CDA46DAAAC4E4 + +I=119 +KEY=E6D9E4347ABCE875CDFB026A9B1CE767A893D7B548986257CAAEBA5C327D6869 +IV=CBB60FB6BE7240A2037CDA46DAAAC4E4 +PT=2A7EEF8709068D06A0DE05E122856791 +CT=3B0863884DCFFDAAE439E3BCFC2E0491 + +I=120 +KEY=90C0678C9B9796FACBD3A9E8E40A46E6939BB43D05579FFD2E9759E0CE536CF8 +IV=3B0863884DCFFDAAE439E3BCFC2E0491 +PT=761983B8E12B7E8F0628AB827F16A181 +CT=1407CDBD04CA6450D15A276B0E45D500 + +I=121 +KEY=A3505D86BF4B95AEC0F720B4CBDF4985879C7980019DFBADFFCD7E8BC016B9F8 +IV=1407CDBD04CA6450D15A276B0E45D500 +PT=33903A0A24DC03540B24895C2FD50F63 +CT=94B64DF8376EAF94F24EB0457DF81418 + +I=122 +KEY=EAD741BA44D8637A4D49A089E4A122F2132A347836F354390D83CECEBDEEADE0 +IV=94B64DF8376EAF94F24EB0457DF81418 +PT=49871C3CFB93F6D48DBE803D2F7E6B77 +CT=6E2DE304D4A21A218291FD9B59FED9BF + +I=123 +KEY=278551B22B73239BF36E61370FFF43EA7D07D77CE2514E188F123355E410745F +IV=6E2DE304D4A21A218291FD9B59FED9BF +PT=CD5210086FAB40E1BE27C1BEEB5E6118 +CT=72A1E7B22D6B8B8C38C4CCD545466879 + +I=124 +KEY=C7046CA82928EA5AE1E6998399A090BB0FA630CECF3AC594B7D6FF80A1561C26 +IV=72A1E7B22D6B8B8C38C4CCD545466879 +PT=E0813D1A025BC9C11288F8B4965FD351 +CT=F5F1B011C644D119625733433C3DBB40 + +I=125 +KEY=82AF7079A309A3B1367E4DC8EE90B8C5FA5780DF097E148DD581CCC39D6BA766 +IV=F5F1B011C644D119625733433C3DBB40 +PT=45AB1CD18A2149EBD798D44B7730287E +CT=FDD90319FC2878AE4E23CE63C6660D1A + +I=126 +KEY=EB439411E1412BA8D6DB9F3052753D3F078E83C6F5566C239BA202A05B0DAA7C +IV=FDD90319FC2878AE4E23CE63C6660D1A +PT=69ECE46842488819E0A5D2F8BCE585FA +CT=0B3948AEFD674622289CB41E3F668A5C + +I=127 +KEY=C2FDF3EB8C01693C7FB990CE6D7F56E10CB7CB6808312A01B33EB6BE646B2020 +IV=0B3948AEFD674622289CB41E3F668A5C +PT=29BE67FA6D404294A9620FFE3F0A6BDE +CT=9F5BF60EB5CCF9D9F3A20DA569209636 + +I=128 +KEY=ECF0B5C32A3163495086894AB263166D93EC3D66BDFDD3D8409CBB1B0D4BB616 +IV=9F5BF60EB5CCF9D9F3A20DA569209636 +PT=2E0D4628A6300A752F3F1984DF1C408C +CT=3FED40A5796B3D1FF8805E5EF8922511 + +I=129 +KEY=259CAA194EE9BE90B2B1E7654CBDCD03AC017DC3C496EEC7B81CE545F5D99307 +IV=3FED40A5796B3D1FF8805E5EF8922511 +PT=C96C1FDA64D8DDD9E2376E2FFEDEDB6E +CT=2973A39E09EF5F4F42B29E6730ECC127 + +I=130 +KEY=FAAB18CE5FA7895BAA9EC69A55F690208572DE5DCD79B188FAAE7B22C5355220 +IV=2973A39E09EF5F4F42B29E6730ECC127 +PT=DF37B2D7114E37CB182F21FF194B5D23 +CT=F8C4C1A86B0665E2124CFFA9128FFEFD + +I=131 +KEY=3806BAB3764E794DF526A17BCE0112877DB61FF5A67FD46AE8E2848BD7BAACDD +IV=F8C4C1A86B0665E2124CFFA9128FFEFD +PT=C2ADA27D29E9F0165FB867E19BF782A7 +CT=90996F6629A41FC86A9520DD33AE5B3F + +I=132 +KEY=B7F781357E024140C3797D01C286E72BED2F70938FDBCBA28277A456E414F7E2 +IV=90996F6629A41FC86A9520DD33AE5B3F +PT=8FF13B86084C380D365FDC7A0C87F5AC +CT=9DAFB2F259BFD18945A0A6EFF9A81A75 + +I=133 +KEY=B67D37A8E281AFD015C38A72F5662BEE7080C261D6641A2BC7D702B91DBCED97 +IV=9DAFB2F259BFD18945A0A6EFF9A81A75 +PT=018AB69D9C83EE90D6BAF77337E0CCC5 +CT=C89F523289AE2A7C8F796C2252CB0597 + +I=134 +KEY=A47B97F34FB4A8F219ED7A59EFE40080B81F90535FCA305748AE6E9B4F77E800 +IV=C89F523289AE2A7C8F796C2252CB0597 +PT=1206A05BAD3507220C2EF02B1A822B6E +CT=3AACC4E5DE152BB1730C6D10C9A81A0A + +I=135 +KEY=E8EBBFDA61B6BC6735953F8E448B5E0282B354B681DF1BE63BA2038B86DFF20A +IV=3AACC4E5DE152BB1730C6D10C9A81A0A +PT=4C9028292E0214952C7845D7AB6F5E82 +CT=1E315BFFFDC3DA42438E683263B496DD + +I=136 +KEY=EE950FF3D603DECEE18F4ACF99A623589C820F497C1CC1A4782C6BB9E56B64D7 +IV=1E315BFFFDC3DA42438E683263B496DD +PT=067EB029B7B562A9D41A7541DD2D7D5A +CT=9B021A44CD9FF920DFE1EC97B3EE8AE4 + +I=137 +KEY=E073E1149A4A605E041167F3739F17240780150DB1833884A7CD872E5685EE33 +IV=9B021A44CD9FF920DFE1EC97B3EE8AE4 +PT=0EE6EEE74C49BE90E59E2D3CEA39347C +CT=4F62EE03D7A8337ECB3DCC0EA5444C2D + +I=138 +KEY=BF449E4B7DFA404D3F18C0266725F67248E2FB0E662B0BFA6CF04B20F3C1A21E +IV=4F62EE03D7A8337ECB3DCC0EA5444C2D +PT=5F377F5FE7B020133B09A7D514BAE156 +CT=AC8767B1E15D6D1ECACCCBF2D0FAB043 + +I=139 +KEY=3AB2898399D0F8467B37A5C916D9117AE4659CBF877666E4A63C80D2233B125D +IV=AC8767B1E15D6D1ECACCCBF2D0FAB043 +PT=85F617C8E42AB80B442F65EF71FCE708 +CT=9CA6E27F1966AE133CB7B98C2B13C1DA + +I=140 +KEY=06A09B6D5A6BCA82B26D0625F2A89FA178C37EC09E10C8F79A8B395E0828D387 +IV=9CA6E27F1966AE133CB7B98C2B13C1DA +PT=3C1212EEC3BB32C4C95AA3ECE4718EDB +CT=B7A6788E6D9886047D1450B093F5B6FE + +I=141 +KEY=79A26263675E11BE581DDEA79A20CAACCF65064EF3884EF3E79F69EE9BDD6579 +IV=B7A6788E6D9886047D1450B093F5B6FE +PT=7F02F90E3D35DB3CEA70D8826888550D +CT=5C1785DC27BC301DEAFAEF325A4CCBFD + +I=142 +KEY=21DEF781026D9ACB4108C6F9847C635F93728392D4347EEE0D6586DCC191AE84 +IV=5C1785DC27BC301DEAFAEF325A4CCBFD +PT=587C95E265338B751915185E1E5CA9F3 +CT=9577E8F6DF5921C4B518974A2F1FCF07 + +I=143 +KEY=EB000BAA170733EA4D077BDD7DA1623506056B640B6D5F2AB87D1196EE8E6183 +IV=9577E8F6DF5921C4B518974A2F1FCF07 +PT=CADEFC2B156AA9210C0FBD24F9DD016A +CT=09F8E3DA7C5E39F2F13C2B72001D1D56 + +I=144 +KEY=D56A1025AB5F7B5F943B3AECAF87A2800FFD88BE773366D849413AE4EE937CD5 +IV=09F8E3DA7C5E39F2F13C2B72001D1D56 +PT=3E6A1B8FBC5848B5D93C4131D226C0B5 +CT=7344F33968E177F3864908F02915739A + +I=145 +KEY=876077EA9BDB2134098B73CAD4411D997CB97B871FD2112BCF083214C7860F4F +IV=7344F33968E177F3864908F02915739A +PT=520A67CF30845A6B9DB049267BC6BF19 +CT=EC286360EF2A54CE894ED06ACF39970C + +I=146 +KEY=AA9943761AD545F47EBCF5CD4584C3B3909118E7F0F845E54646E27E08BF9843 +IV=EC286360EF2A54CE894ED06ACF39970C +PT=2DF9349C810E64C07737860791C5DE2A +CT=89F4BE70D36A05C84FD2124F6A69786B + +I=147 +KEY=5C285D3FD07EF5F6664B1F4C4CA771E31965A6972392402D0994F03162D6E028 +IV=89F4BE70D36A05C84FD2124F6A69786B +PT=F6B11E49CAABB00218F7EA810923B250 +CT=9A65E99C06E0744056365C4A26CD001F + +I=148 +KEY=F28851656D77922A55655DBE4610993683004F0B2572346D5FA2AC7B441BE037 +IV=9A65E99C06E0744056365C4A26CD001F +PT=AEA00C5ABD0967DC332E42F20AB7E8D5 +CT=566ECB7B317C81CF87BC483B4B6CF417 + +I=149 +KEY=62428DD3F6B04C564CA6D9DA9A9A64B3D56E8470140EB5A2D81EE4400F771420 +IV=566ECB7B317C81CF87BC483B4B6CF417 +PT=90CADCB69BC7DE7C19C38464DC8AFD85 +CT=16E3F727D2D4CC2E88C2A4B0DFEF34AF + +I=150 +KEY=78A68A0EC33E2C0198538C1EA591AF46C38D7357C6DA798C50DC40F0D098208F +IV=16E3F727D2D4CC2E88C2A4B0DFEF34AF +PT=1AE407DD358E6057D4F555C43F0BCBF5 +CT=6F6606018F5491FC43864FC29B572551 + +I=151 +KEY=4EFBCF71F7A0DA7564DAF1F0488AA933ACEB7556498EE870135A0F324BCF05DE +IV=6F6606018F5491FC43864FC29B572551 +PT=365D457F349EF674FC897DEEED1B0675 +CT=BC07194E716B4D78F64E14B6E5762439 + +I=152 +KEY=A4BBF15395604071DF929A4922A129DD10EC6C1838E5A508E5141B84AEB921E7 +IV=BC07194E716B4D78F64E14B6E5762439 +PT=EA403E2262C09A04BB486BB96A2B80EE +CT=BF1994171481FB4F84AB092F437EA9C7 + +I=153 +KEY=665F10926596E8F5691ACE10AA5075AEAFF5F80F2C645E4761BF12ABEDC78820 +IV=BF1994171481FB4F84AB092F437EA9C7 +PT=C2E4E1C1F0F6A884B688545988F15C73 +CT=254FE05D25B67D3BF6C2688F46A7FAD8 + +I=154 +KEY=15F4BA29EBAAF160AC95507FDA03D7D58ABA185209D2237C977D7A24AB6072F8 +IV=254FE05D25B67D3BF6C2688F46A7FAD8 +PT=73ABAABB8E3C1995C58F9E6F7053A27B +CT=A03B8DB2C1C9B6C574A8499C6E5869CF + +I=155 +KEY=96A760AB52E1D6A5ACFCA016E98D0BA12A8195E0C81B95B9E3D533B8C5381B37 +IV=A03B8DB2C1C9B6C574A8499C6E5869CF +PT=8353DA82B94B27C50069F069338EDC74 +CT=088F141F097F659145DE8E1EDB2300B5 + +I=156 +KEY=7C06F9EE0327C811CEE3CC3B2B492620220E81FFC164F028A60BBDA61E1B1B82 +IV=088F141F097F659145DE8E1EDB2300B5 +PT=EAA1994551C61EB4621F6C2DC2C42D81 +CT=43703327BFDAF109F6F9C5969D3C7649 + +I=157 +KEY=0F8AC1E3014DD99D1A440A693CB73B51617EB2D87EBE012150F2783083276DCB +IV=43703327BFDAF109F6F9C5969D3C7649 +PT=738C380D026A118CD4A7C65217FE1D71 +CT=BDAC873D0A674CDA98105DC3070F7BE4 + +I=158 +KEY=E595998ABEF32CABDD4A441B4042BF8BDCD235E574D94DFBC8E225F38428162F +IV=BDAC873D0A674CDA98105DC3070F7BE4 +PT=EA1F5869BFBEF536C70E4E727CF584DA +CT=A1A89122CF532FBC69E74A70F1E7346F + +I=159 +KEY=FBA3999F7BF540184E9BE7715CA8C0497D7AA4C7BB8A6247A1056F8375CF2240 +IV=A1A89122CF532FBC69E74A70F1E7346F +PT=1E360015C5066CB393D1A36A1CEA7FC2 +CT=68C2A6FF8EABE7EA05E5DD6093C00129 + +I=160 +KEY=65AF7CB5F5CEF75FEF0BF5F746D7DD7D15B80238352185ADA4E0B2E3E60F2369 +IV=68C2A6FF8EABE7EA05E5DD6093C00129 +PT=9E0CE52A8E3BB747A19012861A7F1D34 +CT=1EA92E63C6926082B04F69E658CFA478 + +I=161 +KEY=7D3BA807729873EB2021AC1817B2C7D30B112C5BF3B3E52F14AFDB05BEC08711 +IV=1EA92E63C6926082B04F69E658CFA478 +PT=1894D4B2875684B4CF2A59EF51651AAE +CT=45A943F0B6430ABA20C562469AE98A6D + +I=162 +KEY=5ECAEF5BF4EC899C7BFAEE2F50B864924EB86FAB45F0EF95346AB94324290D7C +IV=45A943F0B6430ABA20C562469AE98A6D +PT=23F1475C8674FA775BDB4237470AA341 +CT=6CDF579A8429606CC9BC56D010845954 + +I=163 +KEY=8D394BD1C8C1D1F8A67A3BA16530662A22673831C1D98FF9FDD6EF9334AD5428 +IV=6CDF579A8429606CC9BC56D010845954 +PT=D3F3A48A3C2D5864DD80D58E358802B8 +CT=96E9E19694DB9931AC09A7B6296FEAA8 + +I=164 +KEY=9ABEC4725C717368463710CB2D45774DB48ED9A7550216C851DF48251DC2BE80 +IV=96E9E19694DB9931AC09A7B6296FEAA8 +PT=17878FA394B0A290E04D2B6A48751167 +CT=176C9B9B32A539F35BDFB21B38C42134 + +I=165 +KEY=3CA1E23510949D81242F16DE0E9B2B3AA3E2423C67A72F3B0A00FA3E25069FB4 +IV=176C9B9B32A539F35BDFB21B38C42134 +PT=A61F26474CE5EEE96218061523DE5C77 +CT=06004480169FB7B6D4DBA7453A85E54D + +I=166 +KEY=2A72AA0C7EAA3113480EF57A83C272D7A5E206BC7138988DDEDB5D7B1F837AF9 +IV=06004480169FB7B6D4DBA7453A85E54D +PT=16D348396E3EAC926C21E3A48D5959ED +CT=FF2F4F6E32133CE8C70252937FE5BDA6 + +I=167 +KEY=90C0C8FC5B65BE92E643956293A70AF35ACD49D2432BA46519D90FE86066C75F +IV=FF2F4F6E32133CE8C70252937FE5BDA6 +PT=BAB262F025CF8F81AE4D601810657824 +CT=0972CCC79C412DB6FBC5918B8E6EAB7C + +I=168 +KEY=E0AF49BAC4BD146E83C884327FFB682353BF8515DF6A89D3E21C9E63EE086C23 +IV=0972CCC79C412DB6FBC5918B8E6EAB7C +PT=706F81469FD8AAFC658B1150EC5C62D0 +CT=2D8C668310308FCF7B3E325F50AA89E5 + +I=169 +KEY=E5C29451893B7B94249E89469E58DEAD7E33E396CF5A061C9922AC3CBEA2E5C6 +IV=2D8C668310308FCF7B3E325F50AA89E5 +PT=056DDDEB4D866FFAA7560D74E1A3B68E +CT=8342DD95F1040E763C82E36F8F74822F + +I=170 +KEY=4A9AD7CAFA46AE63362069120B502D33FD713E033E5E086AA5A04F5331D667E9 +IV=8342DD95F1040E763C82E36F8F74822F +PT=AF58439B737DD5F712BEE0549508F39E +CT=8CA83627884D9B7A62F096BD37C14EFF + +I=171 +KEY=21AEFC00E7CC2942F319630702ECCC6B71D90824B6139310C750D9EE06172916 +IV=8CA83627884D9B7A62F096BD37C14EFF +PT=6B342BCA1D8A8721C5390A1509BCE158 +CT=13073AB95C0C0587372564189A4C176F + +I=172 +KEY=7E615F002723795F6E37182ECC0C429E62DE329DEA1F9697F075BDF69C5B3E79 +IV=13073AB95C0C0587372564189A4C176F +PT=5FCFA300C0EF501D9D2E7B29CEE08EF5 +CT=247A01C6A7072F64CB463E6580DA222E + +I=173 +KEY=C2A25232803E901B35080B5CA64DEC2646A4335B4D18B9F33B3383931C811C57 +IV=247A01C6A7072F64CB463E6580DA222E +PT=BCC30D32A71DE9445B3F13726A41AEB8 +CT=562355D078402DA76B0CCAAC2BE63DAE + +I=174 +KEY=46C06B83AD1C5CD849C53A11C05137141087668B35589454503F493F376721F9 +IV=562355D078402DA76B0CCAAC2BE63DAE +PT=846239B12D22CCC37CCD314D661CDB32 +CT=841B1644CCE1BF9DB0D537733047DB7F + +I=175 +KEY=CB3AD5FB9E07D380841D712E7A71FC15949C70CFF9B92BC9E0EA7E4C0720FA86 +IV=841B1644CCE1BF9DB0D537733047DB7F +PT=8DFABE78331B8F58CDD84B3FBA20CB01 +CT=DE34C065627DB86A2D0AE89FB31BDA86 + +I=176 +KEY=240CFC15D60F6AE4A53D2C25BD71DD6E4AA8B0AA9BC493A3CDE096D3B43B2000 +IV=DE34C065627DB86A2D0AE89FB31BDA86 +PT=EF3629EE4808B96421205D0BC700217B +CT=38DD744B95756614261178685FBF097F + +I=177 +KEY=FAA7CBA4AAAD9576591C12233960F1C87275C4E10EB1F5B7EBF1EEBBEB84297F +IV=38DD744B95756614261178685FBF097F +PT=DEAB37B17CA2FF92FC213E0684112CA6 +CT=DC1CF4E4633355111AD09BE1C6BC1E39 + +I=178 +KEY=29E0D33A81FFDCE220D1587C36C5EB09AE6930056D82A0A6F121755A2D383746 +IV=DC1CF4E4633355111AD09BE1C6BC1E39 +PT=D347189E2B52499479CD4A5F0FA51AC1 +CT=2A5DC4E8C16753D202B638E5003AF83D + +I=179 +KEY=956C5751C5B439990A006DB1B52336E78434F4EDACE5F374F3974DBF2D02CF7B +IV=2A5DC4E8C16753D202B638E5003AF83D +PT=BC8C846B444BE57B2AD135CD83E6DDEE +CT=70F5676DC7646EA8F8A913AE6AD21949 + +I=180 +KEY=8AD9D44BC9018FD05B103360575592FEF4C193806B819DDC0B3E5E1147D0D632 +IV=70F5676DC7646EA8F8A913AE6AD21949 +PT=1FB5831A0CB5B64951105ED1E276A419 +CT=C44DA6A603A1E9C02F18123D5CAD5291 + +I=181 +KEY=DA77F2DA5CD7148B15FE8CA898C9A25E308C35266820741C24264C2C1B7D84A3 +IV=C44DA6A603A1E9C02F18123D5CAD5291 +PT=50AE269195D69B5B4EEEBFC8CF9C30A0 +CT=53C2D89EC4D5867DC79168D21C9B8755 + +I=182 +KEY=4A4FD6AED6825A2A0C2114460F029EDA634EEDB8ACF5F261E3B724FE07E603F6 +IV=53C2D89EC4D5867DC79168D21C9B8755 +PT=903824748A554EA119DF98EE97CB3C84 +CT=79B9DABE5171A614CAFDEA11637A1800 + +I=183 +KEY=29102930967275801BD019D6766FDA1A1AF73706FD845475294ACEEF649C1BF6 +IV=79B9DABE5171A614CAFDEA11637A1800 +PT=635FFF9E40F02FAA17F10D90796D44C0 +CT=8AB92FA5EA50F1185112FE4D8D2FCC21 + +I=184 +KEY=F4ABA34B232C18EAD6D367320651C374904E18A317D4A56D785830A2E9B3D7D7 +IV=8AB92FA5EA50F1185112FE4D8D2FCC21 +PT=DDBB8A7BB55E6D6ACD037EE4703E196E +CT=FB97C84040732D7B308C5959059D90A9 + +I=185 +KEY=FB140F98A79F5D5D68B80301CB7B640E6BD9D0E357A7881648D469FBEC2E477E +IV=FB97C84040732D7B308C5959059D90A9 +PT=0FBFACD384B345B7BE6B6433CD2AA77A +CT=D0D0119D500519BF5B4770C494B41680 + +I=186 +KEY=BC98221C0792D22B6EB258E57DB0D8B0BB09C17E07A291A91393193F789A51FE +IV=D0D0119D500519BF5B4770C494B41680 +PT=478C2D84A00D8F76060A5BE4B6CBBCBE +CT=94842399FC93828D30979DAD9210B827 + +I=187 +KEY=C92F345AC3CB803EA91C123F97E7005A2F8DE2E7FB31132423048492EA8AE9D9 +IV=94842399FC93828D30979DAD9210B827 +PT=75B71646C4595215C7AE4ADAEA57D8EA +CT=5BDB886E7A7DBBA8679704F13F44B981 + +I=188 +KEY=3EACAF51FEA9A9886D0B9D1B6BA8436574566A89814CA88C44938063D5CE5058 +IV=5BDB886E7A7DBBA8679704F13F44B981 +PT=F7839B0B3D6229B6C4178F24FC4F433F +CT=A2DA893257EE0F732A80FC52887A0788 + +I=189 +KEY=72E26FEDC250C5FED59FE29C966B61FAD68CE3BBD6A2A7FF6E137C315DB457D0 +IV=A2DA893257EE0F732A80FC52887A0788 +PT=4C4EC0BC3CF96C76B8947F87FDC3229F +CT=2F7877481B1162B01616C9F3268B4C44 + +I=190 +KEY=901C1268AD3582E6A9FA4C5CBB99D07EF9F494F3CDB3C54F7805B5C27B3F1B94 +IV=2F7877481B1162B01616C9F3268B4C44 +PT=E2FE7D856F6547187C65AEC02DF2B184 +CT=9FFA4AF8D0F096CC40A9F879076211E0 + +I=191 +KEY=EAF814EC49F2254E4933FAF977D7BEEC660EDE0B1D43538338AC4DBB7C5D0A74 +IV=9FFA4AF8D0F096CC40A9F879076211E0 +PT=7AE40684E4C7A7A8E0C9B6A5CC4E6E92 +CT=886097F5BC20C157A605CBEFCA5663D7 + +I=192 +KEY=8ED70BBA192093A0C9AD62E86C27091FEE6E49FEA16392D49EA98654B60B69A3 +IV=886097F5BC20C157A605CBEFCA5663D7 +PT=642F1F5650D2B6EE809E98111BF0B7F3 +CT=00DBBB84F52B3C9B28325161072753B6 + +I=193 +KEY=18280464C9E683CFFF9B75A5FD74EE96EEB5F27A5448AE4FB69BD735B12C3A15 +IV=00DBBB84F52B3C9B28325161072753B6 +PT=96FF0FDED0C6106F3636174D9153E789 +CT=714A27832B326F0A8FA745012DE4D936 + +I=194 +KEY=F464EE1298B09059016082CCC5ABC0129FFFD5F97F7AC145393C92349CC8E323 +IV=714A27832B326F0A8FA745012DE4D936 +PT=EC4CEA7651561396FEFBF76938DF2E84 +CT=5DE8A5CDBA7A6111A646AA17CA5324D4 + +I=195 +KEY=EE7301D63C482593ABB33CF4A57F1101C2177034C500A0549F7A3823569BC7F7 +IV=5DE8A5CDBA7A6111A646AA17CA5324D4 +PT=1A17EFC4A4F8B5CAAAD3BE3860D4D113 +CT=EA197ECF36E63616EBB0D9D7C1BD9A22 + +I=196 +KEY=10528506D50D143EAC40D83731DD55F0280E0EFBF3E6964274CAE1F497265DD5 +IV=EA197ECF36E63616EBB0D9D7C1BD9A22 +PT=FE2184D0E94531AD07F3E4C394A244F1 +CT=798349D56EC37993B0E131F8E3F64860 + +I=197 +KEY=438E1B672254504B972927644802ED36518D472E9D25EFD1C42BD00C74D015B5 +IV=798349D56EC37993B0E131F8E3F64860 +PT=53DC9E61F75944753B69FF5379DFB8C6 +CT=545E4CD72E74F5A91B29DDBA60BCEB5A + +I=198 +KEY=7E32F16A4E2E125A95FF9963C6F9796105D30BF9B3511A78DF020DB6146CFEEF +IV=545E4CD72E74F5A91B29DDBA60BCEB5A +PT=3DBCEA0D6C7A421102D6BE078EFB9457 +CT=084142F2C892DCF8A37A509DF0D669BC + +I=199 +KEY=B1BEC1C124A0941D0BA6C75239C17E250D92490B7BC3C6807C785D2BE4BA9753 +IV=084142F2C892DCF8A37A509DF0D669BC +PT=CF8C30AB6A8E86479E595E31FF380744 +CT=0A96C326C9D642F1F84C8772BCF8EB4A + +I=200 +KEY=80D7A5A2AE29B42143046D45B6B6B36C07048A2DB21584718434DA5958427C19 +IV=0A96C326C9D642F1F84C8772BCF8EB4A +PT=316964638A89203C48A2AA178F77CD49 +CT=273916ED09A517CE5C6A294D82E78980 + +I=201 +KEY=4D1C892DF27868BBB0FE803145C1D731203D9CC0BBB093BFD85EF314DAA5F599 +IV=273916ED09A517CE5C6A294D82E78980 +PT=CDCB2C8F5C51DC9AF3FAED74F377645D +CT=7183A7C83964ECFB2A1E44FFCFEBB7C1 + +I=202 +KEY=8C9B28041ECD5149A51207ACE38F0D0351BE3B0882D47F44F240B7EB154E4258 +IV=7183A7C83964ECFB2A1E44FFCFEBB7C1 +PT=C187A129ECB539F215EC879DA64EDA32 +CT=6015DF395D795DECA0A2F833E3614000 + +I=203 +KEY=FF175C7C745BB06E51EEDAA4F2C61E0F31ABE431DFAD22A852E24FD8F62F0258 +IV=6015DF395D795DECA0A2F833E3614000 +PT=738C74786A96E127F4FCDD081149130C +CT=B6B466B56B0E994E672072C273BA067D + +I=204 +KEY=0C84C64E1BB3B86E9AF5A8405D950B3A871F8284B4A3BBE635C23D1A85950425 +IV=B6B466B56B0E994E672072C273BA067D +PT=F3939A326FE80800CB1B72E4AF531535 +CT=C8566E37DF2E2958DDD5D2DB49889BA8 + +I=205 +KEY=5FF4C2A08B85338172D2779BF789DA234F49ECB36B8D92BEE817EFC1CC1D9F8D +IV=C8566E37DF2E2958DDD5D2DB49889BA8 +PT=537004EE90368BEFE827DFDBAA1CD119 +CT=C4A8D14DB86637E94AF515764BC7DF44 + +I=206 +KEY=BD81DE1813AEC9BAFDDC90E4A563CB338BE13DFED3EBA557A2E2FAB787DA40C9 +IV=C4A8D14DB86637E94AF515764BC7DF44 +PT=E2751CB8982BFA3B8F0EE77F52EA1110 +CT=5707495E4CBA3727FBA5D7F4F61AF35C + +I=207 +KEY=AE1B09CB7D99BAC0A71B3E83815F10A2DCE674A09F51927059472D4371C0B395 +IV=5707495E4CBA3727FBA5D7F4F61AF35C +PT=139AD7D36E37737A5AC7AE67243CDB91 +CT=C770CD182DFF66E4D6A7BFEFE2820AE1 + +I=208 +KEY=4F7491F03447293C42DE8393E7AD91741B96B9B8B2AEF4948FE092AC9342B974 +IV=C770CD182DFF66E4D6A7BFEFE2820AE1 +PT=E16F983B49DE93FCE5C5BD1066F281D6 +CT=E2044134ACD21D5AD026671BDC0CB2E4 + +I=209 +KEY=A747EF80608CED4309800CA0B1C73081F992F88C1E7CE9CE5FC6F5B74F4E0B90 +IV=E2044134ACD21D5AD026671BDC0CB2E4 +PT=E8337E7054CBC47F4B5E8F33566AA1F5 +CT=303CF7780126AD06B5272A8350639C93 + +I=210 +KEY=E5EBF5E471F2CA9F38492F604438B9C0C9AE0FF41F5A44C8EAE1DF341F2D9703 +IV=303CF7780126AD06B5272A8350639C93 +PT=42AC1A64117E27DC31C923C0F5FF8941 +CT=DACCD42953603A1321CAD9C236454598 + +I=211 +KEY=B5E5C9211A5C43F2267B4A2411FC2CC21362DBDD4C3A7EDBCB2B06F62968D29B +IV=DACCD42953603A1321CAD9C236454598 +PT=500E3CC56BAE896D1E32654455C49502 +CT=F9AB4D1D8255E83B330031EBE2ECE5C6 + +I=212 +KEY=8D78453D63A2DD8D08BF5F250F2581CFEAC996C0CE6F96E0F82B371DCB84375D +IV=F9AB4D1D8255E83B330031EBE2ECE5C6 +PT=389D8C1C79FE9E7F2EC415011ED9AD0D +CT=0F28E2D4CC948D36E18F80184A594841 + +I=213 +KEY=2E921775036404FD9939EE83C9585481E5E1741402FB1BD619A4B70581DD7F1C +IV=0F28E2D4CC948D36E18F80184A594841 +PT=A3EA524860C6D9709186B1A6C67DD54E +CT=A4756EAB45BCF716A52038C729E420C6 + +I=214 +KEY=9F86FEF42701B1D779BD46BE515680FC41941ABF4747ECC0BC848FC2A8395FDA +IV=A4756EAB45BCF716A52038C729E420C6 +PT=B114E9812465B52AE084A83D980ED47D +CT=9834425E009006673E777E3552E83D20 + +I=215 +KEY=2212046FFD03BA552089FBF7B2F3EF32D9A058E147D7EAA782F3F1F7FAD162FA +IV=9834425E009006673E777E3552E83D20 +PT=BD94FA9BDA020B825934BD49E3A56FCE +CT=AEA572D530A3694EAFF6DFDE30B80D5A + +I=216 +KEY=F73BB21F916D8011751AFDDDCD130A6477052A34777483E92D052E29CA696FA0 +IV=AEA572D530A3694EAFF6DFDE30B80D5A +PT=D529B6706C6E3A445593062A7FE0E556 +CT=86394E06B621147758CAB012852035A6 + +I=217 +KEY=EE44A367A3CDDFED7DBD980BF731B4E5F13C6432C155979E75CF9E3B4F495A06 +IV=86394E06B621147758CAB012852035A6 +PT=197F117832A05FFC08A765D63A22BE81 +CT=3CBC18C1AC02C0A7595199E08F1F552B + +I=218 +KEY=1558BABB3DCD830F693E7950F736BCADCD807CF36D5757392C9E07DBC0560F2D +IV=3CBC18C1AC02C0A7595199E08F1F552B +PT=FB1C19DC9E005CE21483E15B00070848 +CT=5A9CFD8BFE10CF7FBD0F9A3FAF6C117B + +I=219 +KEY=D083F58141F5E5AF3D5479739D55780D971C81789347984691919DE46F3A1E56 +IV=5A9CFD8BFE10CF7FBD0F9A3FAF6C117B +PT=C5DB4F3A7C3866A0546A00236A63C4A0 +CT=61A437D4E2F1C3779F1EBE906C5D2C12 + +I=220 +KEY=C60824F2DDC67623D270974E9F87BD27F6B8B6AC71B65B310E8F237403673244 +IV=61A437D4E2F1C3779F1EBE906C5D2C12 +PT=168BD1739C33938CEF24EE3D02D2C52A +CT=FC675EE1B12B47410A20CFAC23FD20EE + +I=221 +KEY=F73A715AD84DB0A6F55AD584922001920ADFE84DC09D1C7004AFECD8209A12AA +IV=FC675EE1B12B47410A20CFAC23FD20EE +PT=313255A8058BC685272A42CA0DA7BCB5 +CT=82E3FB6189716D94C8E9D30E1ECCABC4 + +I=222 +KEY=6ABBDCE21E2ECECBCAA3473897A2E178883C132C49EC71E4CC463FD63E56B96E +IV=82E3FB6189716D94C8E9D30E1ECCABC4 +PT=9D81ADB8C6637E6D3FF992BC0582E0EA +CT=BD84DCE4994B505EED71596B454BDF85 + +I=223 +KEY=0D4F68CDB9B53B08E22DDDFE4FD5FCC035B8CFC8D0A721BA213766BD7B1D66EB +IV=BD84DCE4994B505EED71596B454BDF85 +PT=67F4B42FA79BF5C3288E9AC6D8771DB8 +CT=1B3AA490C6E874BA77CE55D71789616C + +I=224 +KEY=3D8E3121698DD7E9D1835EFF5FA02DB22E826B58164F550056F9336A6C940787 +IV=1B3AA490C6E874BA77CE55D71789616C +PT=30C159ECD038ECE133AE83011075D172 +CT=D6EE171B39B5E40535FBF5A7CB4C6953 + +I=225 +KEY=1A5B2249CA785F0DB58FF5B07CCCFCDEF86C7C432FFAB1056302C6CDA7D86ED4 +IV=D6EE171B39B5E40535FBF5A7CB4C6953 +PT=27D51368A3F588E4640CAB4F236CD16C +CT=8691BE10D13B4C08246938750EE33643 + +I=226 +KEY=48AD5DEF217F83DC5039ECD1191ABE3A7EFDC253FEC1FD0D476BFEB8A93B5897 +IV=8691BE10D13B4C08246938750EE33643 +PT=52F67FA6EB07DCD1E5B6196165D642E4 +CT=E40AD0EE818639E37349E1132B138D63 + +I=227 +KEY=FEB84B0B264A8A6FB8D4DE065DA68A479AF712BD7F47C4EE34221FAB8228D5F4 +IV=E40AD0EE818639E37349E1132B138D63 +PT=B61516E4073509B3E8ED32D744BC347D +CT=6E40A22767A39C978F279D40B447099D + +I=228 +KEY=2FE79FCC3C959901BAAEE8C55B71D01FF4B7B09A18E45879BB0582EB366FDC69 +IV=6E40A22767A39C978F279D40B447099D +PT=D15FD4C71ADF136E027A36C306D75A58 +CT=C2DE8C5200F6FCBF1A4D6178909DF110 + +I=229 +KEY=C3EB1424EFD0ACDF3670C4943CB2CF5936693CC81812A4C6A148E393A6F22D79 +IV=C2DE8C5200F6FCBF1A4D6178909DF110 +PT=EC0C8BE8D34535DE8CDE2C5167C31F46 +CT=104CBECB1134CAE09B2FE8C5CE2E0901 + +I=230 +KEY=DF9F70702DA816906F3907575DF4D3032625820309266E263A670B5668DC2478 +IV=104CBECB1134CAE09B2FE8C5CE2E0901 +PT=1C746454C278BA4F5949C3C361461C5A +CT=65287F66F01AC054B1051D700EDDBF2B + +I=231 +KEY=F6C4CE3006A43EFBE18C5FF305F32C37430DFD65F93CAE728B62162666019B53 +IV=65287F66F01AC054B1051D700EDDBF2B +PT=295BBE402B0C286B8EB558A45807FF34 +CT=4933D44FD414225CB1E6951240D28150 + +I=232 +KEY=3963CE7465D89FBE550649326262DB450A3E292A2D288C2E3A84833426D31A03 +IV=4933D44FD414225CB1E6951240D28150 +PT=CFA70044637CA145B48A16C16791F772 +CT=3733351F76DE0E07581F84600E38EFDD + +I=233 +KEY=42468662273D8CB3EFAB19DBC802888B3D0D1C355BF68229629B075428EBF5DE +IV=3733351F76DE0E07581F84600E38EFDD +PT=7B25481642E5130DBAAD50E9AA6053CE +CT=F16F22EB9CCD854591AE2FC28E1D4B59 + +I=234 +KEY=E2B3E5EA6573FC8ABE4E890FA4F5502DCC623EDEC73B076CF3352896A6F6BE87 +IV=F16F22EB9CCD854591AE2FC28E1D4B59 +PT=A0F56388424E703951E590D46CF7D8A6 +CT=1D607C6E9BAD454DD5DE785F2A78F990 + +I=235 +KEY=FDB55AF96E09AF677AA4737992E13C9ED10242B05C96422126EB50C98C8E4717 +IV=1D607C6E9BAD454DD5DE785F2A78F990 +PT=1F06BF130B7A53EDC4EAFA7636146CB3 +CT=7B16B6A8F88E05F6A9A036A67CB8A2B6 + +I=236 +KEY=E546D74518CF4AA64B399EA321C570CAAA14F418A41847D78F4B666FF036E5A1 +IV=7B16B6A8F88E05F6A9A036A67CB8A2B6 +PT=18F38DBC76C6E5C1319DEDDAB3244C54 +CT=63AD66FCF9D52195CD0339443F554311 + +I=237 +KEY=2F9B91A24BEF0E503DC576E4F8D32C16C9B992E45DCD664242485F2BCF63A6B0 +IV=63AD66FCF9D52195CD0339443F554311 +PT=CADD46E7532044F676FCE847D9165CDC +CT=6293FBB897D8F0C60171BEA3072CA512 + +I=238 +KEY=97B7DF112EFFE9279D5EDF932889D84BAB2A695CCA1596844339E188C84F03A2 +IV=6293FBB897D8F0C60171BEA3072CA512 +PT=B82C4EB36510E777A09BA977D05AF45D +CT=9555D7F244448C80E965CE6AB7EF0F7B + +I=239 +KEY=39F26B429FE4111DAA984F03112B339F3E7FBEAE8E511A04AA5C2FE27FA00CD9 +IV=9555D7F244448C80E965CE6AB7EF0F7B +PT=AE45B453B11BF83A37C6909039A2EBD4 +CT=FA242C9DB2984E9EFA8CD98AE7C29D6F + +I=240 +KEY=64C6D001CB3C8AFC24A72DA11D172727C45B92333CC9549A50D0F668986291B6 +IV=FA242C9DB2984E9EFA8CD98AE7C29D6F +PT=5D34BB4354D89BE18E3F62A20C3C14B8 +CT=2998B59B0441F068D7F3FCE7AEAA6FD9 + +I=241 +KEY=FE56E2EB2434CA49D46A684DBCE2426CEDC327A83888A4F287230A8F36C8FE6F +IV=2998B59B0441F068D7F3FCE7AEAA6FD9 +PT=9A9032EAEF0840B5F0CD45ECA1F5654B +CT=A3F77BBA27BA88F33D4330EB2CC0EFBA + +I=242 +KEY=0F9B3CAD0EDFA9C429F3A005C78FE9F84E345C121F322C01BA603A641A0811D5 +IV=A3F77BBA27BA88F33D4330EB2CC0EFBA +PT=F1CDDE462AEB638DFD99C8487B6DAB94 +CT=9C751C64BCB82229ABA5130353455CCB + +I=243 +KEY=1725A4C019FB909FB1DE2ACA00E9A33DD2414076A38A0E2811C52967494D4D1E +IV=9C751C64BCB82229ABA5130353455CCB +PT=18BE986D1724395B982D8ACFC7664AC5 +CT=540DE482B7170E925FA4B429F6BCD458 + +I=244 +KEY=E2A619367235AA4611A72FD4FAF68FB3864CA4F4149D00BA4E619D4EBFF19946 +IV=540DE482B7170E925FA4B429F6BCD458 +PT=F583BDF66BCE3AD9A079051EFA1F2C8E +CT=6AADE1E1A12F5C83AF434CAD95B29678 + +I=245 +KEY=8629FB2CC8C06A07EC910681499E917FECE14515B5B25C39E122D1E32A430F3E +IV=6AADE1E1A12F5C83AF434CAD95B29678 +PT=648FE21ABAF5C041FD362955B3681ECC +CT=11308758A1C2075FEAECD260867CA343 + +I=246 +KEY=5EDD76C395D2A0D3D547CFB394B439EAFDD1C24D14705B660BCE0383AC3FAC7D +IV=11308758A1C2075FEAECD260867CA343 +PT=D8F48DEF5D12CAD439D6C932DD2AA895 +CT=14C9A904A3909A8FF44D88E22F8626DF + +I=247 +KEY=AF3FA8D6034564D7151C3933C7986CFCE9186B49B7E0C1E9FF838B6183B98AA2 +IV=14C9A904A3909A8FF44D88E22F8626DF +PT=F1E2DE159697C404C05BF680532C5516 +CT=A042D7F391A37E5A3EDB3022400EC797 + +I=248 +KEY=8ACC720216DBDBDB4C213FE65E575A09495ABCBA2643BFB3C158BB43C3B74D35 +IV=A042D7F391A37E5A3EDB3022400EC797 +PT=25F3DAD4159EBF0C593D06D599CF36F5 +CT=439FEF326223A65F7A555C6231178190 + +I=249 +KEY=F2882A52603203A71895A5870CCF7EE40AC55388446019ECBB0DE721F2A0CCA5 +IV=439FEF326223A65F7A555C6231178190 +PT=7844585076E9D87C54B49A61529824ED +CT=6FE1286C19AA3BC802F1C6C7B58DB4C4 + +I=250 +KEY=57EFB10BFC21E28397A9D5E5A533D35B65247BE45DCA2224B9FC21E6472D7861 +IV=6FE1286C19AA3BC802F1C6C7B58DB4C4 +PT=A5679B599C13E1248F3C7062A9FCADBF +CT=C38D763981392FF038573CA341DD8EA1 + +I=251 +KEY=19328A5147BC2E7C5149DA257487D734A6A90DDDDCF30DD481AB1D4506F0F6C0 +IV=C38D763981392FF038573CA341DD8EA1 +PT=4EDD3B5ABB9DCCFFC6E00FC0D1B4046F +CT=5FD553A2848C683B138D50F2741B124D + +I=252 +KEY=ED66DE43FE0F966850EF6754E21B69A0F97C5E7F587F65EF92264DB772EBE48D +IV=5FD553A2848C683B138D50F2741B124D +PT=F4545412B9B3B81401A6BD71969CBE94 +CT=910CDCBE38068A51185A879FF2B45B9C + +I=253 +KEY=E53D9016DE7DF4E2377968864B6F69F8687082C16079EFBE8A7CCA28805FBF11 +IV=910CDCBE38068A51185A879FF2B45B9C +PT=085B4E552072628A67960FD2A9740058 +CT=E0A0E68A14893501D75BC42B8EFC6F96 + +I=254 +KEY=C88C4383E2D16541765E5DB85957C59188D0644B74F0DABF5D270E030EA3D087 +IV=E0A0E68A14893501D75BC42B8EFC6F96 +PT=2DB1D3953CAC91A34127353E1238AC69 +CT=A66DD21DA627347F962A0AB7DCA887ED + +I=255 +KEY=6F01CC5C22DE71C7C2D5B429AA756A392EBDB656D2D7EEC0CB0D04B4D20B576A +IV=A66DD21DA627347F962A0AB7DCA887ED +PT=A78D8FDFC00F1486B48BE991F322AFA8 +CT=87551BC7A6B6D9B76239CB8A31FF1993 + +I=256 +KEY=DAC405506CD3779FC2400B459B7C6B6EA9E8AD9174613777A934CF3EE3F44EF9 +IV=87551BC7A6B6D9B76239CB8A31FF1993 +PT=B5C5C90C4E0D06580095BF6C31090157 +CT=B909B206A041F33EB3AC7ED481DFBA21 + +I=257 +KEY=E482333E6FBAA8427A2E30D56069E0B810E11F97D420C4491A98B1EA622BF4D8 +IV=B909B206A041F33EB3AC7ED481DFBA21 +PT=3E46366E0369DFDDB86E3B90FB158BD6 +CT=DE5E71F446794D3402400C96FBFEB93F + +I=258 +KEY=176CAD69CD20690B95DA40B95C43AC54CEBF6E639259897D18D8BD7C99D54DE7 +IV=DE5E71F446794D3402400C96FBFEB93F +PT=F3EE9E57A29AC149EFF4706C3C2A4CEC +CT=175A7C580A99E985A2FD2F185D9BAADB + +I=259 +KEY=FA4DD79A64960C8264624CDF215B54A1D9E5123B98C060F8BA259264C44EE73C +IV=175A7C580A99E985A2FD2F185D9BAADB +PT=ED217AF3A9B66589F1B80C667D18F8F5 +CT=413EB5D166C1D196F0239FF34D184013 + +I=260 +KEY=49855C1008EAF59432518A9F3807A0B398DBA7EAFE01B16E4A060D978956A72F +IV=413EB5D166C1D196F0239FF34D184013 +PT=B3C88B8A6C7CF9165633C640195CF412 +CT=69A3A63C580336296FF826600C754747 + +I=261 +KEY=849D231AE9F90F233F328BE6EE0AC180F17801D6A602874725FE2BF78523E068 +IV=69A3A63C580336296FF826600C754747 +PT=CD187F0AE113FAB70D630179D60D6133 +CT=B9AF0CA2B502C2DEB66834BD729AA528 + +I=262 +KEY=40E3F7EA3E7CFBDBF57935DBB124CF7F48D70D741300459993961F4AF7B94540 +IV=B9AF0CA2B502C2DEB66834BD729AA528 +PT=C47ED4F0D785F4F8CA4BBE3D5F2E0EFF +CT=99E16968796AB521FC460A8DF6744FA8 + +I=263 +KEY=4FDF8D16B85E527490FBE95EA34138D6D136641C6A6AF0B86FD015C701CD0AE8 +IV=99E16968796AB521FC460A8DF6744FA8 +PT=0F3C7AFC8622A9AF6582DC851265F7A9 +CT=7B871B0153657949D1FE7259E16791B7 + +I=264 +KEY=6AD7099EA6DC50F5CC836C3EB934CF92AAB17F1D390F89F1BE2E679EE0AA9B5F +IV=7B871B0153657949D1FE7259E16791B7 +PT=250884881E8202815C7885601A75F744 +CT=8D6B80EAC01BF7E204A79DD14BFDB71A + +I=265 +KEY=0860DD776AD2014ED90D0837A5A298B627DAFFF7F9147E13BA89FA4FAB572C45 +IV=8D6B80EAC01BF7E204A79DD14BFDB71A +PT=62B7D4E9CC0E51BB158E64091C965724 +CT=DAD6A83408559AD3003C6995DC099303 + +I=266 +KEY=9E8757199D96CA08B9C3CEF817E902B8FD0C57C3F141E4C0BAB593DA775EBF46 +IV=DAD6A83408559AD3003C6995DC099303 +PT=96E78A6EF744CB4660CEC6CFB24B9A0E +CT=AA6EF32AFC8AA6ADCDE86D86CC59AFB4 + +I=267 +KEY=483AD9696154B929F35016B648F5952B5762A4E90DCB426D775DFE5CBB0710F2 +IV=AA6EF32AFC8AA6ADCDE86D86CC59AFB4 +PT=D6BD8E70FCC273214A93D84E5F1C9793 +CT=713F9516A55FBFA4AE8155EC12A3AB5D + +I=268 +KEY=027B7F5F83B26099A4CE8FCC1AB84529265D31FFA894FDC9D9DCABB0A9A4BBAF +IV=713F9516A55FBFA4AE8155EC12A3AB5D +PT=4A41A636E2E6D9B0579E997A524DD002 +CT=B2E4BEAF6DB84214E379B89697191379 + +I=269 +KEY=D7AEFAD28855BB04A9604527F8376CAF94B98F50C52CBFDD3AA513263EBDA8D6 +IV=B2E4BEAF6DB84214E379B89697191379 +PT=D5D5858D0BE7DB9D0DAECAEBE28F2986 +CT=9FE3B8941D9F85B1400CC45B7BDE8E9F + +I=270 +KEY=B5EBE7CB901F69E61EC6F011E6A46A2E0B5A37C4D8B33A6C7AA9D77D45632649 +IV=9FE3B8941D9F85B1400CC45B7BDE8E9F +PT=62451D19184AD2E2B7A6B5361E930681 +CT=E9ABFC5563B4AD1718EF4A91F7D60913 + +I=271 +KEY=571805B63BC20F5784AF56FDB71CBCD7E2F1CB91BB07977B62469DECB2B52F5A +IV=E9ABFC5563B4AD1718EF4A91F7D60913 +PT=E2F3E27DABDD66B19A69A6EC51B8D6F9 +CT=D825DC1C8C73A84BDFEFD9799D9E3960 + +I=272 +KEY=9EED79D9ABB11094FB4475ED2EC042133AD4178D37743F30BDA944952F2B163A +IV=D825DC1C8C73A84BDFEFD9799D9E3960 +PT=C9F57C6F90731FC37FEB231099DCFEC4 +CT=7D0DC4C31259FD0A46D2D2282F1FE22E + +I=273 +KEY=EF905E20846E064A3B3281FD2BD59AB647D9D34E252DC23AFB7B96BD0034F414 +IV=7D0DC4C31259FD0A46D2D2282F1FE22E +PT=717D27F92FDF16DEC076F4100515D8A5 +CT=93FAFC16EFF504A9D2B791A272A78135 + +I=274 +KEY=8F219C67ACF0F1C745FA0ABBADE96015D4232F58CAD8C69329CC071F72937521 +IV=93FAFC16EFF504A9D2B791A272A78135 +PT=60B1C247289EF78D7EC88B46863CFAA3 +CT=EF387517F8C781A79700C8196DCA6F1A + +I=275 +KEY=48C6408FD8FA84D30DD53B83B31C425D3B1B5A4F321F4734BECCCF061F591A3B +IV=EF387517F8C781A79700C8196DCA6F1A +PT=C7E7DCE8740A7514482F31381EF52248 +CT=A6166002C7239645D55494BB64840B26 + +I=276 +KEY=1C9EB0648715CA5738A4FD27A63693A09D0D3A4DF53CD1716B985BBD7BDD111D +IV=A6166002C7239645D55494BB64840B26 +PT=5458F0EB5FEF4E843571C6A4152AD1FD +CT=FB35646B2008AD29AFF508B94179F223 + +I=277 +KEY=4AA2E4BAC74E8CD9AEA969550D27877866385E26D5347C58C46D53043AA4E33E +IV=FB35646B2008AD29AFF508B94179F223 +PT=563C54DE405B468E960D9472AB1114D8 +CT=59C1692D4598AD622B6586A06892E11D + +I=278 +KEY=B9F5A3BAAA0C2F6EA5E835F6E6E5D50E3FF9370B90ACD13AEF08D5A452360223 +IV=59C1692D4598AD622B6586A06892E11D +PT=F35747006D42A3B70B415CA3EBC25276 +CT=3131E251A6A4AC7226A1809553198AB8 + +I=279 +KEY=EF46814F8656D3D8ABAF3B08EFEBC3150EC8D55A36087D48C9A95531012F889B +IV=3131E251A6A4AC7226A1809553198AB8 +PT=56B322F52C5AFCB60E470EFE090E161B +CT=2E30D8D5B7B636307A6D354FBED41A2D + +I=280 +KEY=3DFBE0FE20F0421CAABD62E2CDB0E60F20F80D8F81BE4B78B3C4607EBFFB92B6 +IV=2E30D8D5B7B636307A6D354FBED41A2D +PT=D2BD61B1A6A691C4011259EA225B251A +CT=6D791952F9416FC09B78517A2FFE986F + +I=281 +KEY=5197CF05753D155C5B08A5EB51B82F2D4D8114DD78FF24B828BC310490050AD9 +IV=6D791952F9416FC09B78517A2FFE986F +PT=6C6C2FFB55CD5740F1B5C7099C08C922 +CT=37A8E0B9375AD5669A396D980D68D0F3 + +I=282 +KEY=B3EFE2F914264AAAB7C7FD9C4843619E7A29F4644FA5F1DEB2855C9C9D6DDA2A +IV=37A8E0B9375AD5669A396D980D68D0F3 +PT=E2782DFC611B5FF6ECCF587719FB4EB3 +CT=BC65630DB71EE8DA2194E5DFBC48360E + +I=283 +KEY=CAAB7758FF4AFF39A98C2202A26165CFC64C9769F8BB19049311B9432125EC24 +IV=BC65630DB71EE8DA2194E5DFBC48360E +PT=794495A1EB6CB5931E4BDF9EEA220451 +CT=9C47136C1B510BFCEFA7F6659BDA08C2 + +I=284 +KEY=CC38852E17544DB004372C4A3AA3DFDB5A0B8405E3EA12F87CB64F26BAFFE4E6 +IV=9C47136C1B510BFCEFA7F6659BDA08C2 +PT=0693F276E81EB289ADBB0E4898C2BA14 +CT=68AC57D13EC53C250FEBFC64B1992B1C + +I=285 +KEY=108FE55553F353DFABD421E15A18C9F532A7D3D4DD2F2EDD735DB3420B66CFFA +IV=68AC57D13EC53C250FEBFC64B1992B1C +PT=DCB7607B44A71E6FAFE30DAB60BB162E +CT=9A8C11E031E57B77138A3637784D1D71 + +I=286 +KEY=C432EA6E854DE8C191C6F0ED4A2BF1D7A82BC234ECCA55AA60D78575732BD28B +IV=9A8C11E031E57B77138A3637784D1D71 +PT=D4BD0F3BD6BEBB1E3A12D10C10333822 +CT=3BBB1E76A491A5AA145ED931BB886333 + +I=287 +KEY=980941D5FEFD458061B1B443E39818299390DC42485BF00074895C44C8A3B1B8 +IV=3BBB1E76A491A5AA145ED931BB886333 +PT=5C3BABBB7BB0AD41F07744AEA9B3E9FE +CT=F79F1B46F57BDD36B58DDA33619D3920 + +I=288 +KEY=B4FF33FB094612B6A3438A285C3AEA41640FC704BD202D36C1048677A93E8898 +IV=F79F1B46F57BDD36B58DDA33619D3920 +PT=2CF6722EF7BB5736C2F23E6BBFA2F268 +CT=F1C3ED72D0B6D917DD6F8AE86CFD8CBF + +I=289 +KEY=BC81027596771F9C591BE6C61762B1E795CC2A766D96F4211C6B0C9FC5C30427 +IV=F1C3ED72D0B6D917DD6F8AE86CFD8CBF +PT=087E318E9F310D2AFA586CEE4B585BA6 +CT=EAF1AACEEB9F9BE0E880911BFEEAC2AC + +I=290 +KEY=D41458000DDED43B83DAA81B1D7FFB597F3D80B886096FC1F4EB9D843B29C68B +IV=EAF1AACEEB9F9BE0E880911BFEEAC2AC +PT=68955A759BA9CBA7DAC14EDD0A1D4ABE +CT=7B35179E67E9B40346F7DE6356EDC98F + +I=291 +KEY=FACDC2B3BA9E125B2A734DE75F99F48C04089726E1E0DBC2B21C43E76DC40F04 +IV=7B35179E67E9B40346F7DE6356EDC98F +PT=2ED99AB3B740C660A9A9E5FC42E60FD5 +CT=0EDE849D7E56B296B12C1EDF37436A8D + +I=292 +KEY=E73022253439EB4464CE0B205BBB0F1F0AD613BB9FB6695403305D385A876589 +IV=0EDE849D7E56B296B12C1EDF37436A8D +PT=1DFDE0968EA7F91F4EBD46C70422FB93 +CT=D02F1EAF3CF6A6B681BAF8ECB921FFC4 + +I=293 +KEY=9F3671205266DC4F7C771EBA74265F36DAF90D14A340CFE2828AA5D4E3A69A4D +IV=D02F1EAF3CF6A6B681BAF8ECB921FFC4 +PT=78065305665F370B18B9159A2F9D5029 +CT=E365BE1A125C6930DFDCBB33E6937EC5 + +I=294 +KEY=111A3E012C9D5CB2967E8BD22907D6F7399CB30EB11CA6D25D561EE70535E488 +IV=E365BE1A125C6930DFDCBB33E6937EC5 +PT=8E2C4F217EFB80FDEA0995685D2189C1 +CT=C5B24EEC5CDD17AA56838B09EC4AB725 + +I=295 +KEY=15DA3EE4EE9A560B05493FFC971713A5FC2EFDE2EDC1B1780BD595EEE97F53AD +IV=C5B24EEC5CDD17AA56838B09EC4AB725 +PT=04C000E5C2070AB99337B42EBE10C552 +CT=4D8A43CD28BBCB86953FA55A409BF130 + +I=296 +KEY=2C8B30484D954192818342F3766C1415B1A4BE2FC57A7AFE9EEA30B4A9E4A29D +IV=4D8A43CD28BBCB86953FA55A409BF130 +PT=39510EACA30F179984CA7D0FE17B07B0 +CT=A524A6329E6DCE041F72459234ECDE78 + +I=297 +KEY=0F162BAD5F298EE0B0164CFED6A7AC271480181D5B17B4FA819875269D087CE5 +IV=A524A6329E6DCE041F72459234ECDE78 +PT=239D1BE512BCCF7231950E0DA0CBB832 +CT=90BBC5130D1C06182F737FE7F0FCD00D + +I=298 +KEY=62744CA02B6684D05A91F2049D403480843BDD0E560BB2E2AEEB0AC16DF4ACE8 +IV=90BBC5130D1C06182F737FE7F0FCD00D +PT=6D62670D744F0A30EA87BEFA4BE798A7 +CT=35F293EDDEC8D9446A4ACD34602839B5 + +I=299 +KEY=21F5373DA5D6BF15BC163383F62EA92FB1C94EE388C36BA6C4A1C7F50DDC955D +IV=35F293EDDEC8D9446A4ACD34602839B5 +PT=43817B9D8EB03BC5E687C1876B6E9DAF +CT=E45CF478D7C84325143165F58B041A13 + +I=300 +KEY=4CF4A508B4DF37A831916353620DC1F45595BA9B5F0B2883D090A20086D88F4E +IV=E45CF478D7C84325143165F58B041A13 +PT=6D019235110988BD8D8750D0942368DB +CT=964983C30745D7EEA1BD5E287DAC466C + +I=301 +KEY=35C99C004D01E89F94A9B3BC79C492D7C3DC3958584EFF6D712DFC28FB74C922 +IV=964983C30745D7EEA1BD5E287DAC466C +PT=793D3908F9DEDF37A538D0EF1BC95323 +CT=6834813D8403A963AD36C1A18CA605C0 + +I=302 +KEY=F185723D6A2D2A6F9F4B9194A444AA2AABE8B865DC4D560EDC1B3D8977D2CCE2 +IV=6834813D8403A963AD36C1A18CA605C0 +PT=C44CEE3D272CC2F00BE22228DD8038FD +CT=61F35AA76E1E0EC2D5E4F4F432B68260 + +I=303 +KEY=B571B0BC6CFD2BA23611FB9A900A31FACA1BE2C2B25358CC09FFC97D45644E82 +IV=61F35AA76E1E0EC2D5E4F4F432B68260 +PT=44F4C28106D001CDA95A6A0E344E9BD0 +CT=DD081A96602E6665B860466B8D14050E + +I=304 +KEY=2A5757156C596DE633D0D8908011C3771713F854D27D3EA9B19F8F16C8704B8C +IV=DD081A96602E6665B860466B8D14050E +PT=9F26E7A900A4464405C1230A101BF28D +CT=5BF18EA3D7F3ED1D941EA1B995313B98 + +I=305 +KEY=DA008B517FA48E908A72B8525CC31AEF4CE276F7058ED3B425812EAF5D417014 +IV=5BF18EA3D7F3ED1D941EA1B995313B98 +PT=F057DC4413FDE376B9A260C2DCD2D998 +CT=74C361B6A13013E9ABF6841601513539 + +I=306 +KEY=E313244DC22AC16C1D59AC494AA728D738211741A4BEC05D8E77AAB95C10452D +IV=74C361B6A13013E9ABF6841601513539 +PT=3913AF1CBD8E4FFC972B141B16643238 +CT=9937614570FD404D5B39BA43D3A20602 + +I=307 +KEY=92A7173E943CBA80AF56203552625E8AA1167604D4438010D54E10FA8FB2432F +IV=9937614570FD404D5B39BA43D3A20602 +PT=71B4337356167BECB20F8C7C18C5765D +CT=726FCDDF8E6738B51D767828EBDFC71E + +I=308 +KEY=242C75C141A58DC403020E52421BB347D379BBDB5A24B8A5C83868D2646D8431 +IV=726FCDDF8E6738B51D767828EBDFC71E +PT=B68B62FFD5993744AC542E671079EDCD +CT=78F735344BF10EED47969F1C02ECBF8C + +I=309 +KEY=5247008C3EB79AA67E5D2E0B95D0AC3AAB8E8EEF11D5B6488FAEF7CE66813BBD +IV=78F735344BF10EED47969F1C02ECBF8C +PT=766B754D7F1217627D5F2059D7CB1F7D +CT=7D6A6CA54B084105DF6A778A4913BB04 + +I=310 +KEY=06E7C1A6C8BC6A3355A86F61B41E70C6D6E4E24A5ADDF74D50C480442F9280B9 +IV=7D6A6CA54B084105DF6A778A4913BB04 +PT=54A0C12AF60BF0952BF5416A21CEDCFC +CT=11F0A303D6C0ED5E18F40248AF1A794B + +I=311 +KEY=D7722746B58D494BE9B97F586CA4BB0AC71441498C1D1A134830820C8088F9F2 +IV=11F0A303D6C0ED5E18F40248AF1A794B +PT=D195E6E07D312378BC111039D8BACBCC +CT=2A715E8AC7101415E65EBF34CC4CD786 + +I=312 +KEY=98B1E5954DE8000B6FFFE98D918B6237ED651FC34B0D0E06AE6E3D384CC42E74 +IV=2A715E8AC7101415E65EBF34CC4CD786 +PT=4FC3C2D3F8654940864696D5FD2FD93D +CT=965E8AF93D390E424C9F4F1FBF9D98A5 + +I=313 +KEY=74B910207ACD1D7C801724D53ED6BBC47B3B953A76340044E2F17227F359B6D1 +IV=965E8AF93D390E424C9F4F1FBF9D98A5 +PT=EC08F5B537251D77EFE8CD58AF5DD9F3 +CT=294782DD29C65B6C445C5D92F50E6D19 + +I=314 +KEY=3E1AD36FDCC33F6B3425B5D52717845E527C17E75FF25B28A6AD2FB50657DBC8 +IV=294782DD29C65B6C445C5D92F50E6D19 +PT=4AA3C34FA60E2217B432910019C13F9A +CT=E22098E7EDBEECC49FA8E31B76E925CA + +I=315 +KEY=BE9F93FE153DF61370F6709F8265DCCDB05C8F00B24CB7EC3905CCAE70BEFE02 +IV=E22098E7EDBEECC49FA8E31B76E925CA +PT=80854091C9FEC97844D3C54AA5725893 +CT=24E80C1F59A4EA36044358E0C0D4F29D + +I=316 +KEY=A790F593CFA1643BD2EB3A1AAB8176A294B4831FEBE85DDA3D46944EB06A0C9F +IV=24E80C1F59A4EA36044358E0C0D4F29D +PT=190F666DDA9C9228A21D4A8529E4AA6F +CT=63CF21803941B521532FF36F9FBFC7BD + +I=317 +KEY=0CF6F000352B4B583E4AEE707D111DC9F77BA29FD2A9E8FB6E6967212FD5CB22 +IV=63CF21803941B521532FF36F9FBFC7BD +PT=AB660593FA8A2F63ECA1D46AD6906B6B +CT=250941C1D45C82B0D9C381293CDD833A + +I=318 +KEY=1F875BCF1967857990EC97864B1EA9F8D272E35E06F56A4BB7AAE60813084818 +IV=250941C1D45C82B0D9C381293CDD833A +PT=1371ABCF2C4CCE21AEA679F6360FB431 +CT=8303B962DAFC4A225C0FD6EA60D29CF4 + +I=319 +KEY=42FE25BF51418FE7A7C7A1828219E1DB51715A3CDC092069EBA530E273DAD4EC +IV=8303B962DAFC4A225C0FD6EA60D29CF4 +PT=5D797E7048260A9E372B3604C9074823 +CT=29E2DB359FAB42C0A83A4059A059CB51 + +I=320 +KEY=6C821A4893FE0EAC88FC1F98BD44AD0A7893810943A262A9439F70BBD3831FBD +IV=29E2DB359FAB42C0A83A4059A059CB51 +PT=2E7C3FF7C2BF814B2F3BBE1A3F5D4CD1 +CT=02BDB7EC18279FA9B7788D95FEB4000E + +I=321 +KEY=411670D389D0A04859FDC26DE5AAD1297A2E36E55B85FD00F4E7FD2E2D371FB3 +IV=02BDB7EC18279FA9B7788D95FEB4000E +PT=2D946A9B1A2EAEE4D101DDF558EE7C23 +CT=3960A92A34967F13B754F2265A6F68C1 + +I=322 +KEY=851BCD18F6043DE625BBEA33E1E860E3434E9FCF6F13821343B30F0877587772 +IV=3960A92A34967F13B754F2265A6F68C1 +PT=C40DBDCB7FD49DAE7C46285E0442B1CA +CT=EF396AB8613AC6083932734D38869458 + +I=323 +KEY=1944F363F3143A380F26BD4831A6BD9EAC77F5770E29441B7A817C454FDEE32A +IV=EF396AB8613AC6083932734D38869458 +PT=9C5F3E7B051007DE2A9D577BD04EDD7D +CT=CB73B8D257CC1A8235E48DA0E6AECC4E + +I=324 +KEY=C2F3C203F591C78914E31BA1E083AB9867044DA559E55E994F65F1E5A9702F64 +IV=CB73B8D257CC1A8235E48DA0E6AECC4E +PT=DBB731600685FDB11BC5A6E9D1251606 +CT=3B0B12757B5D1B6E0130FCC306E9DBAA + +I=325 +KEY=0DCB66B972631AFBB1DA22F1418EE1C45C0F5FD022B845F74E550D26AF99F4CE +IV=3B0B12757B5D1B6E0130FCC306E9DBAA +PT=CF38A4BA87F2DD72A5393950A10D4A5C +CT=CCEF4079CE8FAF0E6B8CD4C8751059E1 + +I=326 +KEY=8FF976D3C735506D86A3540664F1C40590E01FA9EC37EAF925D9D9EEDA89AD2F +IV=CCEF4079CE8FAF0E6B8CD4C8751059E1 +PT=8232106AB5564A96377976F7257F25C1 +CT=D835D2FA5583D9B2C16424960163DF7F + +I=327 +KEY=3499925B26E4F846CAA230EC069F127F48D5CD53B9B4334BE4BDFD78DBEA7250 +IV=D835D2FA5583D9B2C16424960163DF7F +PT=BB60E488E1D1A82B4C0164EA626ED67A +CT=4634485DB5D9C40FA2F6EF36E477F0B7 + +I=328 +KEY=7A133EEC3DD747FE38A3370F8927A3C70EE1850E0C6DF744464B124E3F9D82E7 +IV=4634485DB5D9C40FA2F6EF36E477F0B7 +PT=4E8AACB71B33BFB8F20107E38FB8B1B8 +CT=AE30CD2A5D84CEF10B9C15EE1FE20CEB + +I=329 +KEY=F573665345317BAB5F14881777A0D789A0D1482451E939B54DD707A0207F8E0C +IV=AE30CD2A5D84CEF10B9C15EE1FE20CEB +PT=8F6058BF78E63C5567B7BF18FE87744E +CT=B3926CDE5BFB1363DCCA28CDA2DC4CD8 + +I=330 +KEY=FEFB661FA786BF2DA1B70FD7D06B86E8134324FA0A122AD6911D2F6D82A3C2D4 +IV=B3926CDE5BFB1363DCCA28CDA2DC4CD8 +PT=0B88004CE2B7C486FEA387C0A7CB5161 +CT=633388FA9EAE0DB2036F63CB2E21C266 + +I=331 +KEY=BFC495DFBA60078708D992724C9201577070AC0094BC276492724CA6AC8200B2 +IV=633388FA9EAE0DB2036F63CB2E21C266 +PT=413FF3C01DE6B8AAA96E9DA59CF987BF +CT=54ACB838D247D26A1544B2E42F18CF3F + +I=332 +KEY=EB0113E4FFE1201B59EAE94706B2571F24DC143846FBF50E8736FE42839ACF8D +IV=54ACB838D247D26A1544B2E42F18CF3F +PT=54C5863B4581279C51337B354A205648 +CT=B9210B8A8639CA5C94A1CF1169F89DDB + +I=333 +KEY=0E1D5F7873FD6440227C5529AEB4C7999DFD1FB2C0C23F5213973153EA625256 +IV=B9210B8A8639CA5C94A1CF1169F89DDB +PT=E51C4C9C8C1C445B7B96BC6EA8069086 +CT=8990488561B43B03CF9FE631E2E7D5E7 + +I=334 +KEY=8B2759471137DBF37906B394EFEF96D2146D5737A1760451DC08D762088587B1 +IV=8990488561B43B03CF9FE631E2E7D5E7 +PT=853A063F62CABFB35B7AE6BD415B514B +CT=9DCE77D8CCC0F041FA717C28474E9A30 + +I=335 +KEY=0D4B29E8D6F39CA01BC01CE73E2834C689A320EF6DB6F4102679AB4A4FCB1D81 +IV=9DCE77D8CCC0F041FA717C28474E9A30 +PT=866C70AFC7C4475362C6AF73D1C7A214 +CT=E1DA174FE5848D21735E55B91CA48A9B + +I=336 +KEY=55228F6FF93B7DE9304CD75991C133A5687937A0883279315527FEF3536F971A +IV=E1DA174FE5848D21735E55B91CA48A9B +PT=5869A6872FC8E1492B8CCBBEAFE90763 +CT=C578F53AD69AD508711E674F8DD2A843 + +I=337 +KEY=35CA943437046860F72A1F8554127676AD01C29A5EA8AC39243999BCDEBD3F59 +IV=C578F53AD69AD508711E674F8DD2A843 +PT=60E81B5BCE3F1589C766C8DCC5D345D3 +CT=177A50196260D3F0A3F97423899EBEE2 + +I=338 +KEY=B8C3B8414C112FC2E2E848733D5CF69CBA7B92833CC87FC987C0ED9F572381BB +IV=177A50196260D3F0A3F97423899EBEE2 +PT=8D092C757B1547A215C257F6694E80EA +CT=6B03A799C51C7D0A9D3C9929617E69B1 + +I=339 +KEY=E82B651AE5740119104FE3284CE780E4D178351AF9D402C31AFC74B6365DE80A +IV=6B03A799C51C7D0A9D3C9929617E69B1 +PT=50E8DD5BA9652EDBF2A7AB5B71BB7678 +CT=8D4C7C1157422E7B6DDA47C5C2C246F4 + +I=340 +KEY=3C0B660F2B78F768812AC671D3107AD85C34490BAE962CB877263373F49FAEFE +IV=8D4C7C1157422E7B6DDA47C5C2C246F4 +PT=D4200315CE0CF671916525599FF7FA3C +CT=787B3C51094569BC1F139102964DF5AF + +I=341 +KEY=A197B59C700A4786E840733047964FD4244F755AA7D345046835A27162D25B51 +IV=787B3C51094569BC1F139102964DF5AF +PT=9D9CD3935B72B0EE696AB5419486350C +CT=AE02945B4E63AC35B6AC2DFA2DF3CEBA + +I=342 +KEY=00E75C4B909D44A94FA20EDA6C3628418A4DE101E9B0E931DE998F8B4F2195EB +IV=AE02945B4E63AC35B6AC2DFA2DF3CEBA +PT=A170E9D7E097032FA7E27DEA2BA06795 +CT=AC4AACD3597FE73F519F7CEDAFE6E000 + +I=343 +KEY=4626BE31853C15DE412EF2A42328D47326074DD2B0CF0E0E8F06F366E0C775EB +IV=AC4AACD3597FE73F519F7CEDAFE6E000 +PT=46C1E27A15A151770E8CFC7E4F1EFC32 +CT=5EB8B35708A135E041603BA323663F34 + +I=344 +KEY=1733A037E76437411F49821D948A098978BFFE85B86E3BEECE66C8C5C3A14ADF +IV=5EB8B35708A135E041603BA323663F34 +PT=51151E066258229F5E6770B9B7A2DDFA +CT=6674FB922570377334A4F22D13E95BD8 + +I=345 +KEY=8474275A2E4D5E5448EB8D34B65EE7081ECB05179D1E0C9DFAC23AE8D0481107 +IV=6674FB922570377334A4F22D13E95BD8 +PT=9347876DC929691557A20F2922D4EE81 +CT=F0E3F09C0350C0172E449A01F24AB828 + +I=346 +KEY=765AA3F4014B8475CF832DE6128F7F2DEE28F58B9E4ECC8AD486A0E92202A92F +IV=F0E3F09C0350C0172E449A01F24AB828 +PT=F22E84AE2F06DA218768A0D2A4D19825 +CT=CC156010299679ADEE9CC000FD5C90E5 + +I=347 +KEY=DD3D3AFC83B7EEBC58CE35B35719B587223D959BB7D8B5273A1A60E9DF5E39CA +IV=CC156010299679ADEE9CC000FD5C90E5 +PT=AB67990882FC6AC9974D18554596CAAA +CT=80354EDEA10038E903C4896313236CE5 + +I=348 +KEY=4764BB8C98BCF3FD4A21A370AE5432BBA208DB4516D88DCE39DEE98ACC7D552F +IV=80354EDEA10038E903C4896313236CE5 +PT=9A5981701B0B1D4112EF96C3F94D873C +CT=15140DC26F383EB99425FB51D445CC98 + +I=349 +KEY=DF729AB7D09BC85489F8AD373EBDDA70B71CD68779E0B377ADFB12DB183899B7 +IV=15140DC26F383EB99425FB51D445CC98 +PT=9816213B48273BA9C3D90E4790E9E8CB +CT=163465787010C97D3C2023D803F62556 + +I=350 +KEY=A945B0C5997C596B5155A6BCA5055127A128B3FF09F07A0A91DB31031BCEBCE1 +IV=163465787010C97D3C2023D803F62556 +PT=76372A7249E7913FD8AD0B8B9BB88B57 +CT=23E861D557EE72534C8B729240E3A54F + +I=351 +KEY=0E1C166F2B947D14D0C7E6ABD280A31E82C0D22A5E1E0859DD5043915B2D19AE +IV=23E861D557EE72534C8B729240E3A54F +PT=A759A6AAB2E8247F819240177785F239 +CT=652CA6A199D7DBC37936FCD70636989F + +I=352 +KEY=208A37149072011877E3E85B3DC7F4A7E7EC748BC7C9D39AA466BF465D1B8131 +IV=652CA6A199D7DBC37936FCD70636989F +PT=2E96217BBBE67C0CA7240EF0EF4757B9 +CT=7C29D6F4788553E3C50A48027478A98F + +I=353 +KEY=A8FFCB194C077EEED66632AEBE01652E9BC5A27FBF4C8079616CF744296328BE +IV=7C29D6F4788553E3C50A48027478A98F +PT=8875FC0DDC757FF6A185DAF583C69189 +CT=7B886FC819D625B224F2516901788E88 + +I=354 +KEY=3716969BDDBF04FF4010D4667CCA994AE04DCDB7A69AA5CB459EA62D281BA636 +IV=7B886FC819D625B224F2516901788E88 +PT=9FE95D8291B87A119676E6C8C2CBFC64 +CT=3EAB925C025F379153CE2C7191026976 + +I=355 +KEY=991D0D313717C7AC62537C8572DE094BDEE65FEBA4C5925A16508A5CB919CF40 +IV=3EAB925C025F379153CE2C7191026976 +PT=AE0B9BAAEAA8C3532243A8E30E149001 +CT=B9904B8BDF431FDDB9166086C9D3E24C + +I=356 +KEY=315772BB82A3DD286FE5891934B19434677614607B868D87AF46EADA70CA2D0C +IV=B9904B8BDF431FDDB9166086C9D3E24C +PT=A84A7F8AB5B41A840DB6F59C466F9D7F +CT=3C7029336ECCA5D352DB9D0C060D3830 + +I=357 +KEY=C99E4E6A8C1D42A9E431FF8B2A8ACA615B063D53154A2854FD9D77D676C7153C +IV=3C7029336ECCA5D352DB9D0C060D3830 +PT=F8C93CD10EBE9F818BD476921E3B5E55 +CT=4AF4290AA79EB96435D2D3FC745033D7 + +I=358 +KEY=55317B8B407B7D089ED2CEF7BE80E99111F21459B2D49130C84FA42A029726EB +IV=4AF4290AA79EB96435D2D3FC745033D7 +PT=9CAF35E1CC663FA17AE3317C940A23F0 +CT=BFCA0B6B31AAD81F1BDC743B48B7CCA4 + +I=359 +KEY=6EAE6D8B06AA25493BA3608357D71404AE381F32837E492FD393D0114A20EA4F +IV=BFCA0B6B31AAD81F1BDC743B48B7CCA4 +PT=3B9F160046D15841A571AE74E957FD95 +CT=89C1D565569A12A68B2E808AB5CFA2E3 + +I=360 +KEY=3245D7C1F5571A1329E1B2303F8A689D27F9CA57D5E45B8958BD509BFFEF48AC +IV=89C1D565569A12A68B2E808AB5CFA2E3 +PT=5CEBBA4AF3FD3F5A1242D2B3685D7C99 +CT=EC8EEAED7894646B1D1A5E058ED41178 + +I=361 +KEY=1DE05811428569D3F89CF1C01AF434AFCB7720BAAD703FE245A70E9E713B59D4 +IV=EC8EEAED7894646B1D1A5E058ED41178 +PT=2FA58FD0B7D273C0D17D43F0257E5C32 +CT=92802F392579C66AD72D2E85776720E8 + +I=362 +KEY=0A8FB6D844AB0B73C05A121085E07FFE59F70F838809F988928A201B065C793C +IV=92802F392579C66AD72D2E85776720E8 +PT=176FEEC9062E62A038C6E3D09F144B51 +CT=461DBCF9894F5319FE772F6529FBCEC0 + +I=363 +KEY=4E6818B3BBEF69FA7ABEC1EBE2E54CDC1FEAB37A0146AA916CFD0F7E2FA7B7FC +IV=461DBCF9894F5319FE772F6529FBCEC0 +PT=44E7AE6BFF446289BAE4D3FB67053322 +CT=794CA9DC41BAE95D415A6D1119582763 + +I=364 +KEY=4A1EABB13924B188441724141F1C88A966A61AA640FC43CC2DA7626F36FF909F +IV=794CA9DC41BAE95D415A6D1119582763 +PT=0476B30282CBD8723EA9E5FFFDF9C475 +CT=B761EAF5CC07651BD33D8BF93913EAE8 + +I=365 +KEY=FFE4E48F8D96710A1BE7DBE36F4905CDD1C7F0538CFB26D7FE9AE9960FEC7A77 +IV=B761EAF5CC07651BD33D8BF93913EAE8 +PT=B5FA4F3EB4B2C0825FF0FFF770558D64 +CT=0B5146EB77161E60D6D1E2FAEAE80694 + +I=366 +KEY=7A4F383AF4BB2DC6588E75EE82C7D9CFDA96B6B8FBED38B7284B0B6CE5047CE3 +IV=0B5146EB77161E60D6D1E2FAEAE80694 +PT=85ABDCB5792D5CCC4369AE0DED8EDC02 +CT=07635064CE85F6AE17961AF1F2B44469 + +I=367 +KEY=EFFE7F8BBBEC8BEC83FA199102763BEDDDF5E6DC3568CE193FDD119D17B0388A +IV=07635064CE85F6AE17961AF1F2B44469 +PT=95B147B14F57A62ADB746C7F80B1E222 +CT=3A9CD5F30C421FF333BA2C2F0A7AD07D + +I=368 +KEY=1DF51B7A35E11E2AF79E8C59094A1ECFE769332F392AD1EA0C673DB21DCAE8F7 +IV=3A9CD5F30C421FF333BA2C2F0A7AD07D +PT=F20B64F18E0D95C6746495C80B3C2522 +CT=F60032C249CF561CB02421DA189A57D1 + +I=369 +KEY=CC09FFE72A10AE27FE14934A6628AB83116901ED70E587F6BC431C680550BF26 +IV=F60032C249CF561CB02421DA189A57D1 +PT=D1FCE49D1FF1B00D098A1F136F62B54C +CT=EAD5844B160C08F9CDAA15FD5936EF26 + +I=370 +KEY=09C84CA0DA0B9FD79D3090E690BAB419FBBC85A666E98F0F71E909955C665000 +IV=EAD5844B160C08F9CDAA15FD5936EF26 +PT=C5C1B347F01B31F0632403ACF6921F9A +CT=26AD72F011133FD4CED8F38A1ABE7D73 + +I=371 +KEY=74FA53C172A2003EC5933F486FCC7BBFDD11F75677FAB0DBBF31FA1F46D82D73 +IV=26AD72F011133FD4CED8F38A1ABE7D73 +PT=7D321F61A8A99FE958A3AFAEFF76CFA6 +CT=F115FBC0D3F386527176D1DF6AD4B38A + +I=372 +KEY=0E5BA209B7BC28D184E73BD37F35C1312C040C96A4093689CE472BC02C0C9EF9 +IV=F115FBC0D3F386527176D1DF6AD4B38A +PT=7AA1F1C8C51E28EF4174049B10F9BA8E +CT=27ED0BA04734E70317BF58E11B0DD051 + +I=373 +KEY=9404D9139B6597D1F7C7519713C6CBC80BE90736E33DD18AD9F8732137014EA8 +IV=27ED0BA04734E70317BF58E11B0DD051 +PT=9A5F7B1A2CD9BF0073206A446CF30AF9 +CT=24080A577426F8F270A13F3A5F3DB546 + +I=374 +KEY=E72476BC679C8DCBAB92BBA5D48BF6D32FE10D61971B2978A9594C1B683CFBEE +IV=24080A577426F8F270A13F3A5F3DB546 +PT=7320AFAFFCF91A1A5C55EA32C74D3D1B +CT=A754CC0464E35B387435790505F2DCE5 + +I=375 +KEY=4548DE389CCAD4A65B02A9B5FE90930188B5C165F3F87240DD6C351E6DCE270B +IV=A754CC0464E35B387435790505F2DCE5 +PT=A26CA884FB56596DF09012102A1B65D2 +CT=D9AED2566884E97D081EADB45780AA7D + +I=376 +KEY=2E54365B503140D0EC9074DFA05F4B2C511B13339B7C9B3DD57298AA3A4E8D76 +IV=D9AED2566884E97D081EADB45780AA7D +PT=6B1CE863CCFB9476B792DD6A5ECFD82D +CT=9FA221E082CAD838AB4B210A8794BD8F + +I=377 +KEY=7C9FB092B8A96465076E14C575E9A8F0CEB932D319B643057E39B9A0BDDA30F9 +IV=9FA221E082CAD838AB4B210A8794BD8F +PT=52CB86C9E89824B5EBFE601AD5B6E3DC +CT=AAEA6DE5734CF14BED503512EB071C2A + +I=378 +KEY=90AB85A18F2B0255D4F43AF5E98DAA7E64535F366AFAB24E93698CB256DD2CD3 +IV=AAEA6DE5734CF14BED503512EB071C2A +PT=EC34353337826630D39A2E309C64028E +CT=1359A157B415EB63E038AB7354E6B0F2 + +I=379 +KEY=9135D4D54A1CE6BBF4F23AFDE23F537C770AFE61DEEF592D735127C1023B9C21 +IV=1359A157B415EB63E038AB7354E6B0F2 +PT=019E5174C537E4EE200600080BB2F902 +CT=0764EBDBFAE8FD447244408A5153CC3B + +I=380 +KEY=4B5F1BC60EF5DCE83474A3970EB2ABA8706E15BA2407A4690115674B5368501A +IV=0764EBDBFAE8FD447244408A5153CC3B +PT=DA6ACF1344E93A53C086996AEC8DF8D4 +CT=A31F69E0055E8D4162AC06C088925FBA + +I=381 +KEY=9DD8E8D75BE2E4D1BC70B30DAE0B375FD3717C5A2159292863B9618BDBFA0FA0 +IV=A31F69E0055E8D4162AC06C088925FBA +PT=D687F311551738398804109AA0B99CF7 +CT=EB84AC035534CDF1698E660F529E0EC7 + +I=382 +KEY=4A2B2FC8446B4C2575CFE584A490680238F5D059746DE4D90A37078489640167 +IV=EB84AC035534CDF1698E660F529E0EC7 +PT=D7F3C71F1F89A8F4C9BF56890A9B5F5D +CT=9236D37A28C2CF29237127173B93C5D5 + +I=383 +KEY=9BE42576823EEAADB34657A5CBB44B21AAC303235CAF2BF029462093B2F7C4B2 +IV=9236D37A28C2CF29237127173B93C5D5 +PT=D1CF0ABEC655A688C689B2216F242323 +CT=86C122CFA62B1356FEE33FECF598ACC9 + +I=384 +KEY=5DFC1838B052E95A948D0AC31736CBE62C0221ECFA8438A6D7A51F7F476F687B +IV=86C122CFA62B1356FEE33FECF598ACC9 +PT=C6183D4E326C03F727CB5D66DC8280C7 +CT=8A9926125B1CA354B1D7A9FED0850FEE + +I=385 +KEY=2B12FA914EE7674EADED81C47A67A1B4A69B07FEA1989BF26672B68197EA6795 +IV=8A9926125B1CA354B1D7A9FED0850FEE +PT=76EEE2A9FEB58E1439608B076D516A52 +CT=AD99A2A427BFF7A17C375DB38764EBFC + +I=386 +KEY=10607DE088CB92382089EF99B7C054280B02A55A86276C531A45EB32108E8C69 +IV=AD99A2A427BFF7A17C375DB38764EBFC +PT=3B728771C62CF5768D646E5DCDA7F59C +CT=0E141FD7D6928E7B7885638B6334947C + +I=387 +KEY=605ECCB38F9FFD9DAB2DB523313FFADB0516BA8D50B5E22862C088B973BA1815 +IV=0E141FD7D6928E7B7885638B6334947C +PT=703EB15307546FA58BA45ABA86FFAEF3 +CT=996CB8723B08B99A4959072DC8A73292 + +I=388 +KEY=C6371257BDA461F3A4D2F1ED5DD4B0B69C7A02FF6BBD5BB22B998F94BB1D2A87 +IV=996CB8723B08B99A4959072DC8A73292 +PT=A669DEE4323B9C6E0FFF44CE6CEB4A6D +CT=72966BAA5E4D7FA9129088F2C072E301 + +I=389 +KEY=DDD8877C25005F9B8336823CBF4D4B1DEEEC695535F0241B390907667B6FC986 +IV=72966BAA5E4D7FA9129088F2C072E301 +PT=1BEF952B98A43E6827E473D1E299FBAB +CT=32C321C999A2D68EA4517D332C785FC4 + +I=390 +KEY=00882DCBC6CFDED1A2ED7D9892F494A5DC2F489CAC52F2959D587A5557179642 +IV=32C321C999A2D68EA4517D332C785FC4 +PT=DD50AAB7E3CF814A21DBFFA42DB9DFB8 +CT=391D95DD63982E0A9AF3980A234DB5B9 + +I=391 +KEY=234B9097BD6519EFE106103720AC937DE532DD41CFCADC9F07ABE25F745A23FB +IV=391D95DD63982E0A9AF3980A234DB5B9 +PT=23C3BD5C7BAAC73E43EB6DAFB25807D8 +CT=D3A279EE1BABABA71DB01DC35EBA879D + +I=392 +KEY=AFF7D52D959CC7E41F1F3FF3CA2425053690A4AFD46177381A1BFF9C2AE0A466 +IV=D3A279EE1BABABA71DB01DC35EBA879D +PT=8CBC45BA28F9DE0BFE192FC4EA88B678 +CT=B4696871EE3A9D035BC32308DA5A5DA7 + +I=393 +KEY=B557440CEEB6E4EF54F6CD1B222246AC82F9CCDE3A5BEA3B41D8DC94F0BAF9C1 +IV=B4696871EE3A9D035BC32308DA5A5DA7 +PT=1AA091217B2A230B4BE9F2E8E80663A9 +CT=C5047AFD7884E0124928229AA6E72F67 + +I=394 +KEY=BF64C071FAAD2C48CB269C03563FA06147FDB62342DF0A2908F0FE0E565DD6A6 +IV=C5047AFD7884E0124928229AA6E72F67 +PT=0A33847D141BC8A79FD05118741DE6CD +CT=240D684E6BAD3FD4E41D58DB871E93CD + +I=395 +KEY=F6945509258A1584398F5438DFD679DB63F0DE6D297235FDECEDA6D5D143456B +IV=240D684E6BAD3FD4E41D58DB871E93CD +PT=49F09578DF2739CCF2A9C83B89E9D9BA +CT=F66917F0C3C67774F9263062F918DDD5 + +I=396 +KEY=A8E48107D59287ABBA374E7CE5BC28E89599C99DEAB4428915CB96B7285B98BE +IV=F66917F0C3C67774F9263062F918DDD5 +PT=5E70D40EF018922F83B81A443A6A5133 +CT=85C42456F11D0191BC4B4DD4EA0406EE + +I=397 +KEY=E4F367569F4F9114AFE937A0190C9738105DEDCB1BA94318A980DB63C25F9E50 +IV=85C42456F11D0191BC4B4DD4EA0406EE +PT=4C17E6514ADD16BF15DE79DCFCB0BFD0 +CT=D48B6C87A25C71113947569411C2186A + +I=398 +KEY=987ED2D586DA9AB08C584BBEA0478953C4D6814CB9F5320990C78DF7D39D863A +IV=D48B6C87A25C71113947569411C2186A +PT=7C8DB58319950BA423B17C1EB94B1E6B +CT=AB6957C2F3D360593E9096F3A392A701 + +I=399 +KEY=3DF2BF13B7FF97CA13567A890E11C9796FBFD68E4A265250AE571B04700F213B +IV=AB6957C2F3D360593E9096F3A392A701 +PT=A58C6DC631250D7A9F0E3137AE56402A +CT=C0FEFFF07506A0B4CD7B8B0CF25D3664 + =========== \ No newline at end of file --- krb5-1.4.4.orig/src/krb524/k524init.M +++ krb5-1.4.4/src/krb524/k524init.M @@ -0,0 +1,47 @@ +.\" krb524/k524init.M +.\" +.\" Copyright 2005 by the Massachusetts Institute of Technology. +.\" +.\" Export of this software from the United States of America may +.\" require a specific license from the United States Government. +.\" It is the responsibility of any person or organization contemplating +.\" export to obtain such a license before exporting. +.\" +.\" WITHIN THAT CONSTRAINT, permission to use, copy, modify, and +.\" distribute this software and its documentation for any purpose and +.\" without fee is hereby granted, provided that the above copyright +.\" notice appear in all copies and that both that copyright notice and +.\" this permission notice appear in supporting documentation, and that +.\" the name of M.I.T. not be used in advertising or publicity pertaining +.\" to distribution of the software without specific, written prior +.\" permission. Furthermore if you modify this software you must label +.\" your software as modified software and not distribute it in such a +.\" fashion that it might be confused with the original M.I.T. software. +.\" M.I.T. makes no representations about the suitability of +.\" this software for any purpose. It is provided "as is" without express +.\" or implied warranty. +.\" " +.TH KRB524INIT 1 +.SH NAME +krb524init \- Obtain Kerberos V4 tickets from Kerberos V5 tickets +.SH SYNOPSIS +\fBkrb524init\fP [\fB\-n\fP] [\fB\-p\fP \fIprincipal\fP] +.SH DESCRIPTION +.I krb524init +converts a V5 credential to a V4 credential by querying a remote krb524d +server and stores it in a V4 ticket cache. The credential is +.I principal +or "krbtgt" at the V5 ticket cache's default principal's realm if not +specified. +.SH OPTIONS +.TP +.B \-n +By default, the V4 ticket cache is initialized. If this option is given, +the converted credential is instead added to the existing ticket cache. +.TP +\fB\-p\fP \fIprincipal\fP +Convert +.I principal +rather than krbtgt. +.SH SEE ALSO +kinit(1), krb524d(8) --- krb5-1.4.4.orig/src/krb524/Makefile.in +++ krb5-1.4.4/src/krb524/Makefile.in @@ -93,6 +93,7 @@ $(INSTALL_PROGRAM) krb524d $(DESTDIR)$(SERVER_BINDIR)/krb524d $(INSTALL_PROGRAM) k524init $(DESTDIR)$(CLIENT_BINDIR)/krb524init $(INSTALL_DATA) $(srcdir)/krb524d.M $(DESTDIR)$(SERVER_MANDIR)/krb524d.8 + $(INSTALL_DATA) $(srcdir)/k524init.M $(DESTDIR)$(CLIENT_MANDIR)/krb524init.1 clean-unix:: $(RM) $(OBJS) core *~ *.bak #* --- krb5-1.4.4.orig/src/include/k5-platform.h +++ krb5-1.4.4/src/include/k5-platform.h @@ -503,8 +503,9 @@ #ifdef HAVE_GETPWNAM_R # ifndef GETPWNAM_R_4_ARGS /* POSIX */ -# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \ - getpwnam_r(NAME,REC,BUF,BUFSIZE,OUT) +# define k5_getpwnam_r(NAME, REC, BUF, BUFSIZE, OUT) \ + (getpwnam_r(NAME,REC,BUF,BUFSIZE,OUT) == 0 \ + ? (*(OUT) == NULL ? -1 : 0) : -1) # else /* POSIX drafts? */ # ifdef GETPWNAM_R_RETURNS_INT --- krb5-1.4.4.orig/src/include/k5-thread.h +++ krb5-1.4.4/src/include/k5-thread.h @@ -375,6 +375,12 @@ # pragma weak pthread_mutex_init # pragma weak pthread_self # pragma weak pthread_equal +# if __GNU__ +# pragma weak _pthread_mutex_lock +# pragma weak _pthread_mutex_unlock +# pragma weak _pthread_mutex_destroy +# pragma weak _pthread_mutex_init +# endif /* __GNU__ */ # ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST_NP_IN_THREAD_LIB # pragma weak pthread_mutexattr_setrobust_np # endif --- krb5-1.4.4.orig/src/include/krb5/stock/osconf.h +++ krb5-1.4.4/src/include/krb5/stock/osconf.h @@ -117,10 +117,10 @@ * krb5 slave support follows */ -#define KPROP_DEFAULT_FILE "@LOCALSTATEDIR/krb5kdc/slave_datatrans" -#define KPROPD_DEFAULT_FILE "@LOCALSTATEDIR/krb5kdc/from_master" -#define KPROPD_DEFAULT_KDB5_UTIL "@SBINDIR/kdb5_util" -#define KPROPD_DEFAULT_KDB5_EDIT "@SBINDIR/kdb5_edit" +#define KPROP_DEFAULT_FILE "/var/lib/krb5kdc/slave_datatrans" +#define KPROPD_DEFAULT_FILE "/var/lib/krb5kdc/from_master" +#define KPROPD_DEFAULT_KDB5_UTIL "@PREFIX/sbin/kdb5_util" +#define KPROPD_DEFAULT_KDB5_EDIT "@PREFIX/sbin/kdb5_edit" #define KPROPD_DEFAULT_KRB_DB DEFAULT_KDB_FILE #define KPROPD_ACL_FILE "@LOCALSTATEDIR/krb5kdc/kpropd.acl" --- krb5-1.4.4.orig/src/krb5-config.in +++ krb5-1.4.4/src/krb5-config.in @@ -166,7 +166,11 @@ fi if test -n "$do_cflags"; then - echo "-I${includedir}" + if test x"$includedir" != x"/usr/include" ; then + echo "-I${includedir}" + else + echo '' + fi fi --- krb5-1.4.4.orig/src/krb5-config.M +++ krb5-1.4.4/src/krb5-config.M @@ -26,37 +26,38 @@ krb5-config \- tool for linking against MIT Kerberos libraries .SH SYNOPSIS .B krb5-config -[ \fB--help\fP | \fB--all\fP | \fB--version\fP | \fB--vendor\fP | \fB--prefix\fP | -\fB--exec-prefix\fP | \fB--cflags\fP | \fB--libs\fP libraries ] +[ \fB\-\-help\fP | \fB\-\-all\fP | \fB\-\-version\fP | \fB\-\-vendor\fP +| \fB\-\-prefix\fP | \fB\-\-exec\-prefix\fP | \fB\-\-cflags\fP +| \fB\-\-libs\fP libraries ] .br .SH DESCRIPTION -.I krb5-config +.I krb5\-config tells the application programmer what special flags to use to compile and link programs against the installed Kerberos libraries. .SH OPTIONS .TP -\fB\--help\fP +\fB\-\-help\fP print usage message. This is the default. .TP -\fB\--all\fP +\fB\-\-all\fP prints version, vendor, prefix and exec-prefix. .TP -\fB\--version\fP +\fB\-\-version\fP prints the version of the installed Kerberos implementation. .TP -\fB\--vendor\fP +\fB\-\-vendor\fP prints the vendor of the installed Kerberos implementation. .TP -\fB\--prefix\fP +\fB\-\-prefix\fP prints the prefix with which Kerberos was built. .TP -\fB\--exec-prefix\fP +\fB\-\-exec\-prefix\fP prints the exec-prefix with which Kerberos was built. .TP -\fB\--cflags\fP +\fB\-\-cflags\fP prints the compiler flags with which Kerberos was built. .TP -\fB\--libs\fP \fIlibraries\fP +\fB\-\-libs\fP \fIlibraries\fP list compiler options required to link with \fIlibraries\fP. Possible values for \fIlibraries\fP are: .sp --- krb5-1.4.4.orig/src/clients/ksu/ksu.h +++ krb5-1.4.4/src/clients/ksu/ksu.h @@ -56,7 +56,10 @@ #define CACHE_MODE 0600 #define MAX_CMD 2048 /* this is temp, should use realloc instead, as done in most of the code */ - + +#ifndef MAXPATHLEN +# define MAXPATHLEN 4096 +#endif extern int optind; extern char * optarg; --- krb5-1.4.4.orig/src/clients/ksu/ksu.M +++ krb5-1.4.4/src/clients/ksu/ksu.M @@ -175,28 +175,28 @@ .PP Ksu can be used to create a new security context for the target program (either the target -shell, or command specified via the -e option). +shell, or command specified via the \-e option). The target program inherits a set of credentials from the source user. By default, this set includes all of the credentials in the source cache plus any additional credentials obtained during authentication. The source user is able to limit the credentials in this set -by using -z or -Z option. --z restricts the copy of tickets from the source cache +by using \-z or \-Z option. +\-z restricts the copy of tickets from the source cache to the target cache to only the tickets where client == -the target principal name. The -Z option +the target principal name. The \-Z option provides the target user with a fresh target cache (no creds in the cache). Note that for security reasons, when the source user is root and target user is non-root, --z option is the default mode of operation. +\-z option is the default mode of operation. While no authentication takes place if the source user is root or is the same as the target user, additional tickets can still be obtained for the target cache. -If -n is specified and no credentials can be copied to the target +If \-n is specified and no credentials can be copied to the target cache, the source user is prompted for a Kerberos password -(unless -Z specified or GET_TGT_VIA_PASSWD is undefined). If +(unless \-Z specified or GET_TGT_VIA_PASSWD is undefined). If successful, a TGT is obtained from the Kerberos server and stored in the target cache. Otherwise, if a password is not provided (user hit return) @@ -301,7 +301,7 @@ \fB\-D turn on debug mode. .TP 10 -\fITicket granting ticket options: -l lifetime -r time -pf\fP +\fITicket granting ticket options: \-l lifetime \-r time \-pf\fP The ticket granting ticket options only apply to the case where there are no appropriate tickets in the cache to authenticate the source user. In this case @@ -341,7 +341,7 @@ principal. Note that the .B \-z option is mutually -exclusive with the -Z option. +exclusive with the \-Z option. .TP 10 \fB\-Z Don't copy any tickets from the source cache to the @@ -350,7 +350,7 @@ initialized to the target principal name. Note that .B \-Z option is mutually -exclusive with the -z option. +exclusive with the \-z option. .TP 10 \fB\-q suppress the printing of status messages. @@ -365,7 +365,7 @@ ls .B \-lag). -\fIThe authorization algorithm for -e is as follows:\fP +\fIThe authorization algorithm for \-e is as follows:\fP If the source user is root or source user == target user, no authorization takes place and @@ -418,7 +418,7 @@ .TP 10 \fB\-a \fIargs specify arguments to be passed to the target shell. -Note: that all flags and parameters following -a +Note: that all flags and parameters following \-a will be passed to the shell, thus all options intended for ksu must precede .B \-a. @@ -449,7 +449,7 @@ during the resolution of the default principal name, PRINC_LOOK_AHEAD enables ksu to find principal names in the .k5users file as described in the OPTIONS section -(see -n option). +(see \-n option). .TP 10 \fICMD_PATH\fP specifies a list of directories containing programs @@ -463,8 +463,8 @@ shell is obtained from the passwd file. .TP 10 SAMPLE CONFIGURATION: -KSU_OPTS = -DGET_TGT_VIA_PASSWD --DPRINC_LOOK_AHEAD -DCMD_PATH='"/bin /usr/ucb /local/bin" +KSU_OPTS = \-DGET_TGT_VIA_PASSWD +\-DPRINC_LOOK_AHEAD \-DCMD_PATH='"/bin /usr/ucb /local/bin" .TP 10 PERMISSIONS FOR KSU ksu should be owned by root and have the set user id bit turned on. --- krb5-1.4.4.orig/src/clients/kinit/kinit.c +++ krb5-1.4.4/src/clients/kinit/kinit.c @@ -209,7 +209,7 @@ USAGE_BREAK_LONG "[-p | -P" USAGE_LONG_PROXIABLE "] " USAGE_BREAK_LONG - "[-A" USAGE_LONG_ADDRESSES "] " + "[-a | -A" USAGE_LONG_ADDRESSES "] " USAGE_BREAK "[-v] [-R] " "[-k [-t keytab_file]] " @@ -256,6 +256,7 @@ ULINE("\t", "-F not forwardable", OPTTYPE_KRB5); ULINE("\t", "-p proxiable", OPTTYPE_KRB5); ULINE("\t", "-P not proxiable", OPTTYPE_KRB5); + ULINE("\t", "-a include addresses", OPTTYPE_KRB5); ULINE("\t", "-A do not include addresses", OPTTYPE_KRB5); ULINE("\t", "-v validate", OPTTYPE_KRB5); ULINE("\t", "-R renew", OPTTYPE_BOTH); @@ -281,7 +282,7 @@ int use_k5 = 0; int i; - while ((i = GETOPT(argc, argv, "r:fpFP54AVl:s:c:kt:RS:v")) + while ((i = GETOPT(argc, argv, "r:fpFP54aAVl:s:c:kt:RS:v")) != -1) { switch (i) { case 'V': @@ -316,7 +317,6 @@ opts->not_proxiable = 1; break; case 'a': - /* Note: This is supported only with GETOPT_LONG */ opts->addresses = 1; break; case 'A': --- krb5-1.4.4.orig/src/clients/kinit/kinit.M +++ krb5-1.4.4/src/clients/kinit/kinit.M @@ -45,7 +45,8 @@ .SH DESCRIPTION .I kinit obtains and caches an initial ticket-granting ticket for -.IR principal . The typical default behavior is to acquire only +.IR principal . +The typical default behavior is to acquire only Kerberos 5 tickets. However, if kinit was built with both Kerberos 4 support and with the default behavior of acquiring both types of tickets, it will try to acquire both Kerberos 5 and Kerberos 4 @@ -86,7 +87,7 @@ .in -.3i .fi .sp -as in "kinit -l 90m". You cannot mix units; a value of `3h30m' will +as in "kinit \-l 90m". You cannot mix units; a value of `3h30m' will result in an error. .sp If the @@ -197,4 +198,4 @@ .B keytab file. .SH SEE ALSO -klist(1), kdestroy(1), krb5(3) +klist(1), kdestroy(1), kerberos(1) --- krb5-1.4.4.orig/src/config-files/krb5.conf.M +++ krb5-1.4.4/src/config-files/krb5.conf.M @@ -196,8 +196,8 @@ .IP udp_preference_limit When sending a message to the KDC, the library will try using TCP -before UDP if the size of the message is above "udp_preference_list". -If the message is smaller than "udp_preference_list", then UDP will be +before UDP if the size of the message is above "udp_preference_limit". +If the message is smaller than "udp_preference_limit", then UDP will be tried before TCP. Regardless of the size, both protocols will be tried if the first attempt fails. @@ -438,7 +438,7 @@ In the following example, the logging messages from the KDC will go to the console and to the system log under the facility LOG_DAEMON with default severity of LOG_INFO; and the logging messages from the -administrative server will be appended to the file /var/adm/kadmin.log +administrative server will be appended to the file /var/log/kadmin.log and sent to the device /dev/tty04. .sp .nf @@ -446,7 +446,7 @@ [logging] kdc = CONSOLE kdc = SYSLOG:INFO:DAEMON - admin_server = FILE:/var/adm/kadmin.log + admin_server = FILE:/var/log/kadmin.log admin_server = DEVICE=/dev/tty04 .in -1i .fi --- krb5-1.4.4.orig/src/config-files/kdc.conf.M +++ krb5-1.4.4/src/config-files/kdc.conf.M @@ -78,14 +78,14 @@ .B string specifies the location of the access control list (acl) file that kadmin uses to determine which principals are allowed which permissions -on the database. The default value is /usr/local/var/krb5kdc/kadm5.acl. +on the database. The default value is /etc/krb5kdc/kadm5.acl. .IP admin_keytab This .B string Specifies the location of the keytab file that kadmin uses to authenticate to the database. The default value is -/usr/local/var/krb5kdc/kadm5.keytab. +/etc/krb5kdc/kadm5.keytab. .IP database_name This @@ -235,7 +235,7 @@ realm names and the [capaths] section of its krb5.conf file .SH FILES -/usr/local/var/krb5kdc/kdc.conf +/etc/krb5kdc/kdc.conf .SH SEE ALSO krb5.conf(5), krb5kdc(8) --- krb5-1.4.4.orig/doc/krb425.texinfo +++ krb5-1.4.4/doc/krb425.texinfo @@ -15,6 +15,11 @@ @parskip 6pt plus 6pt @end iftex +@dircategory Kerberos +@direntry +* krb425: (krb425). Upgrading to Kerberos V5 from V4 +@end direntry + @include definitions.texinfo @set EDITION 1.0 @set UPDATED May 22, 2003 --- krb5-1.4.4.orig/doc/admin.texinfo +++ krb5-1.4.4/doc/admin.texinfo @@ -14,6 +14,11 @@ @parskip 6pt plus 6pt @end iftex +@dircategory Kerberos +@direntry +* krb5-admin: (krb5-admin). Kerberos V5 Administrator's Guide +@end direntry + @include definitions.texinfo @set EDITION 1.0 @set UPDATED June 16, 2000 @@ -2443,7 +2448,7 @@ @b{Re-enter password for principal krbtgt/@value{PRIMARYREALM}@@@value{SECONDREALM}:} @b{kadmin:} add_princ -requires_preauth krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALM} @b{Enter password for principal krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALM}:} -@b{Enter password for principal krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALML}:} +@b{Enter password for principal krbtgt/@value{SECONDREALM}@@@value{PRIMARYREALM}:} @b{kadmin:} @end group @end smallexample --- krb5-1.4.4.orig/doc/user-guide.texinfo +++ krb5-1.4.4/doc/user-guide.texinfo @@ -13,6 +13,11 @@ @parskip 6pt plus 6pt @end iftex +@dircategory Kerberos +@direntry +* krb5-user: (krb5-user). Kerberos V5 UNIX User's Guide +@end direntry + @include definitions.texinfo @set EDITION 1.0 @@ -932,7 +937,7 @@ [ Kerberos V5 accepts you as ``@value{RANDOMUSER1}@@@value{PRIMARYDOMAIN}'' ] [ Kerberos V5 accepted forwarded credentials ] What you type is protected by encryption. -Last login: Tue Jul 30 18:47:44 from @value{RANDOMHOST}.@value{SECONDDOMAIN} +Last login: Tue Jul 30 18:47:44 from @value{RANDOMHOST1}.@value{SECONDDOMAIN} Athena Server (sun4) Version 9.1.11 Tue Jul 30 14:40:08 EDT 2002 shell%} --- krb5-1.4.4.orig/doc/install.texinfo +++ krb5-1.4.4/doc/install.texinfo @@ -15,6 +15,11 @@ @parskip 6pt plus 6pt @end iftex +@dircategory Kerberos +@direntry +* krb5-install: (krb5-install). Kerberos V5 Installation Guide +@end direntry + @include definitions.texinfo @set EDITION 1.1