Foros de consultas y discusión

Leer Cedula Electronica .Net Framework SmartCard

Maximiliano Cesán, modificado hace 5 años.

Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Buenos días, 
Hace unos días me han dado la tarea de realizar la lectura de la Cedula de Identidad Uruguaya Electronica por medio de su chip y que sea en asp.Net.
He investigado bastante sobre los Framework .Net que me permitan la lectura de las mismas, los cuales encontre varios pero me quede con uno 
en especial.

https://www.codeproject.com/Articles/16653/A-Smart-Card-Framework-for-NET

Estoy utilizando un Reader Usb de Uruguay Digital que me permite la inseción de la CIU.

​​​​​​​Log Generado
Connect() -- OK

CardNative implementation used
Connect()
ExecuteCommand(CIU Applet IAS)
Comando= ( Class=00 Ins=A4 P1=04 P2=00 P3=0C Data=A00000001840000001634200) , Respuesta= (SW=9000) , SW1= 144 - SW2= 0 , Status= 36864 , Data= 
Connect()
ExecuteCommand(CIU Select File)
Comando= ( Class=00 Ins=A4 P1=00 P2=00 P3=02 Data=7001) , Respuesta= (SW=6115) , SW1= 97 - SW2= 21 , Status= 24853 , Data= 
Connect()
ExecuteCommand(CIU ReadBinary)
Comando= ( Class=00 Ins=B0 P1=00 P2=00 P3=00 Data=) , Respuesta= (SW=6C0C) , SW1= 108 - SW2= 12 , Status= 27660 , Data= 

Probe la aplicación de Java y estoy intentando emular lo que hacen ahi en c# pero sin mucho resultado hasta ahora.
​​​​​​
Alguno ha utilizado ese Framework o probado con algun otro dando con un resultado optimo? 
Gracias.
thumbnail
Francisco Perdomo, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Hola Maxi, como estas?

Te respondo por partes lo que fui encontrando:
ExecuteCommand(CIU Select File)
Comando= ( Class=00 Ins=A4 P1=00 P2=00 P3=02 Data=7001) , Respuesta= (SW=6115) , SW1= 97 - SW2= 21 , Status= 24853 , Data= 
La respuesta 61 15 indica que el comando se ejecutó correctamente, y que recibas los 15 bytes de datos que te mandan
ExecuteCommand(CIU ReadBinary)
Comando= ( Class=00 Ins=B0 P1=00 P2=00 P3=00 Data=) , Respuesta= (SW=6C0C) , SW1= 108 - SW2= 12 , Status= 27660 , Data= 

La respuesta 6C 0C indica que el largo del Le está mal colocado, que el valor correcto es 0C.

Cualquier cosa sigue consultando (perdón por demorar, tuve que ponerme a leer una guía de APDUs de nuevo, leí tus dos mensajes en el foro).

Saludos,

Pancho
thumbnail
Francisco Perdomo, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Puedes googlear la tabla de respuestas APDU, todas son iguales, te tiro una de referencia : https://www.eftlab.co.uk/index.php/site-map/knowledge-base/118-apdu-response-list
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Exacto algo de eso habia visto, ahora esos 15 bytes, porque la data regresa como null en ese Select File?
E visto que les regresa un 90 00 en el SelectFile a la mayoría de los que les ha funcionado. He tomado como ejemplo tu Aplicación de Java para pasarlo a .net integrandolo con este Framework, y utilizando la clase FCITemplate pero bueno los Datos vacios aun no me permiten continuar.
Con respecto al Comando ReaderBinary, se debe a que la data que le envio es 0, porque en el SelectFile no pude recuperarla para el FCITemplate
​​​​​​​Muchas gracias por tu respuesta
thumbnail
Francisco Perdomo, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Entiendo, la implementación en Java espera que se devuelva 90 00 para leer. No tengo mucha idea de porque regresa null.

Probaste clonar el git de la implementacion java y correrla a ver si te tira lo mismo?

​​​​​​​
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
La implementación de Java ahi regresa Data y 90 00, con la data lo que hace es obtener el Size cargando el FCITemplate, para posteriormente en el ReadBinary pasarle el Length.
​​​​​​​
thumbnail
Francisco Perdomo, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Se supone que es igual independientemente del framework que uses, al final se terminan enviando los mismos APDUs y el smartcard debería responder lo mismo.
Es una pavada pero asegúrate que estás enviando exactamente la misma secuencia que se envía en el programa Java. Con eso arrancas a debuggear para arriba.

Disculpa que demore en responder, se me había pasado, y me habia quedado colgado pensando en que podria ser.

Cuentame como te va con eso!
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Buenas tardes !!
He tenido un avanze significativo, al realizar el Get Response ahora recupero Data, 
Que hasta donde he podido entender, en esos Hexadecimales obtengo un OK y los Byte  y la data.
Te paso la respuesta obtenida.

​​​​​​​ExecuteCommand(CIU Select File)
Comando Enviado = ( Class=00 Ins=A4 P1=00 P2=00 P3=02 Data=7002)
Respuesta= (SW=6115) , SW1= 97 - SW2= 21 , Status= 24853 , Data= 
ExecuteCommand(CIU GetResponse)
Comando Enviado = ( Class=00 Ins=B0 P1=00 P2=00 Le= 15)
Respuesta= (SW=9000 Data=1F011346455252454952412052414D4F53204D555A) , SW1= 144 - SW2= 0 , Status= 36864 , Data= System.Byte[]
​​​​​​​Esa es la respuesta que obtuve del Get Response.
Hasta donde entiendo o un compañero me ha dado una mano el
1F01 Es como el OK
13 Son los Byte a leer
46455252454952412052414D4F53204D555A Es la data a convertir
​​​​​​​Ahora para convertir esa Data y poder visualizarla estoy buscando cual es el camino.
​​​​​​​La converti a Bytes y luego a ASCII
Estoy obteniendo esto
​​​​​​​"\u0082is\u0082e2\u0082ewy\u00832w\u0085\u0090"
EDICION:

Ejecutando Este Codigo sobre el DATA que recupero en el GetResponse de arriba obtengo:
​​​​​​​
                string ASCIIstring = "";
                byte[] ASCIIbyteArray = new byte[apduRsp.Data.Length-2];
                for (int i = 2; i < apduRsp.Data.Length; i+=1)
                {
                        ASCIIstring = ASCIIstring + apduRsp.Data[i];
                        ASCIIbyteArray[i - 2] = apduRsp.Data[i];
                }
                // Convert utf-8 bytes to a string.
                string s_unicode2 = System.Text.Encoding.UTF8.GetString(ASCIIbyteArray);
                ASCIIstring = ConvertHexToASCII(ASCIIstring);
Esto son los datos que carga sobre las variables s_unicode2 y ASCIIstring
​​​​​​​s_unicode2 = "\u0013FERREIRA RAMOS MUZ"

ASCIIstring = "\u0019pi\u0082\u0082is\u0082e2\u0082ewy\u00832w\u0085\u0090"
​​​​​Al parecer me esta faltando la i de Muzi.
Pero bueno es un comienzo.
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Actualizo!
Haciendo un Loop de llamado GetResponse con esta Serie

CLA  INS  P1   P2   LE
00     B0   00    00   15

El Le 15 son los Bytes que obtuve del SelectFile Anterior de la respuesta "6115"

int leNext = apduRsp.Data[2];
​​​​​​​While(Data.length != null){
     //Genero el Loop hasta que la data sea null
      leNext = leNext + 3;
     //Cargo el parametro Le con el Next Value para obtener mas data
      pCommand.Le = hexStringToByteArray(leNext.ToString())[0];
     ///Envio el comando nuevamente
      apduRsp = m_iCard.Transmit(pCommand);
}
​​​​​​​En cada llamado agregaba 3 al Index[2] de la data y esto lo utilizaba en el Le en el proximo llamado.
​​​​​​​Obtuve este string con esta data.
Estoy viendo como depurarla y poder sacar todos los datos.

Este es el string.
​​​​​​​"\u001f\u0001\u0013FERREIRA RAMOS MUZI\u001f\u0002\0\u001f\u0003\aRICARDO\u001f\u0004\u0003URY\u001f\u0005\b09031979\u001f\u0006\u000eMONTEVIDEO/URY\u001f\a\b34946682\u001f\b\u0004\"\a \u0016\u001f\t\b22072026\u001f\n\0"
​​​​​​​
thumbnail
Francisco Perdomo, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Como estás? Agarrando desde el mensaje anterior, cuando te llegan los hexa (46455252454952412052414D4F53204D555A), si vas a un conversor de hexa a ascii te da el nombre bien (aunque le faltan letras al final).

Esto que lograste sacar de los hexa no son ascii, son unicode
​​​​​​​"\u001f\u0001\u0013FERREIRA RAMOS MUZI\u001f\u0002\0\u001f\u0003\aRICARDO\u001f\u0004\u0003URY\u001f\u0005\b09031979\u001f\u0006\u000eMONTEVIDEO/URY\u001f\a\b34946682\u001f\b\u0004\"\a \u0016\u001f\t\b22072026\u001f\n\0"
​​​Por eso tienes caracteres raros que como no tienen representación ascii quedan metidos entre medio (ej: \u001f)
Capaz tienes que revisar el procedimiento de conversion hexa-ascii. Apoyate en la función readbinary de java que capaz te inspira para solucionar.

​​​​​​​Saludos!
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Actualmente pude recuperar todos los datos menos una fecha sobre el 7001 que nose porque no la regresa, estoy perfeccionando el codigo un poco.
Ahora estoy intentando obtener la imagen.
El codigo de Java es bastante intenso como para replicarlo en c# y veo que el Framework de c# es mas eficiente y sencillo a la hora de recuperar cosas.
Estoy ejecutando el comando select File enviandole el 7004 y luego de eso un Get Response.

El get response me regresa estos datos en el Byte[]
​​​​​​​
20 63 1 130 47 111 255 216 255 224 0 16 74 70 73 70 0 1 1 0 0 1 0 1 0 0 255 219 0 67 0 8 6 6 7 6 5 8 7 7 7 9 9 8 10 12 20 13 12 11 11 12 25 18 19 15 20 29 26 31 30 29 26 28 28 32 36 46 39 32 34 44 35 28 28 40 55 41 44 48 49 52 52 52 31 39 57 61 56 50 60 46 51 52 50 255 219 0 67 1 9 9 9 12 11 12 24 13 13 24 50 33 28 33 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 255 192 0 17 8 1 64 0 240 3 1 34 0 2 17 1 3 17 1 255 196 0 31 0 0 1 5 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 255 196 0 181 16 0 2 1 3 3 2 4 3 5 5 4 4 0 0 1 125 1 2 3 0 4 17 5 18 33 49 65 6 19 81 97 7 34 113 20

Esto convertido a hexa:

3F01822F6FFFD8FFE000104A46494600010100000100010000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC0001108014000F003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114

Lo unico que pude conseguir es que el 
255 216 255 224 del Index 5 al 8 determinan que es jpeg

Pero no e podido extraer la imagen aun convirtiendola con MemoryStream ya que me tira error de Parametros
Algun dato que me estoy salteando?
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Buenas, pude llegar a obtener todo el string para la imagen con un detalle
Porque el Largo en java es F274 = 12148 y en c# me da 2F6F = 12143

A la hora de traer la data no me la trae completa.
Esto tb me pasa con el fileId , es 5 valores menos.

Cual será el problema?

Forze los 5+ eso que faltan y con Stream

​​​​​​​byte[] bytes = hexStringToByteArray(ImagenString.Substring(10));

Image image;
using (MemoryStream ms = new MemoryStream(bytes))
{
   image = Image.FromStream(ms);
}
​​​​​​​y se rompe, pero seguiré probando, te dejo esa pregunta del valor porque cambia. Saludos
thumbnail
Francisco Perdomo, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Te he estado leyendo y no estoy viendo el porqué de los largos de bytes, un compañero del trabajo ayer estuvo trabajando con los apdu para encontrarte una respuesta. De principio intenta emular todo lo que hay en el programa Java aunque sea ineficiente, y una vez funcione todo de ahí lo mejoramos.

Hace pila que no toco c# pero se me ocurre que convertir en imagen no se usaba con Image, sino con bitmap

en la linea 7: 
 Bitmap.FromStream(ms).Save("C:\\fotoCi.jpg");
​​​​​​​Capaz ayuda en algo eso. Seguimos buscando respuesta al tema de los 5 bytes faltantes y te comentamos! 
thumbnail
Nicolas Piquerez, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 62 Fecha de incorporación: 3/10/16 Mensajes recientes
Maximiliano, extendiendo la otra explicación que te di, el largo para el READ_BINARY es F274 = 12148 bytes que incluye todo el TLV, 2 bytes de tag, 3 bytes del lenght y 12143 bytes para la imagen jpeg, por eso la diferencia entre el largo del archivo y el largo de la data dentro del TLV.

​​​​​​​Saludos
thumbnail
Nicolas Piquerez, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 62 Fecha de incorporación: 3/10/16 Mensajes recientes
¿Como andas Maximiliano?
Te comento primero unas lineas generales que te pueden ayudar a entender como se procesan los datos de la cedula, y despues vamos al caso particular de la imagen. Para tener como referencia en la sección "EXTRACCIÓN DE LOS DATOS DE IDENTIFICACIÓN DE LA PERSONA" de https://centroderecursos.agesic.gub.uy/web/seguridad/wiki/-/wiki/Main/Gu%C3%ADa+de+uso+de+CI+electr%C3%B3nica+a+trav%C3%A9s+de+APDU esta explicado.

Bien, para empezar cuando leemos un archivo (EF) con el APDU READ_BINARY los datos van a venir en el formato TLV  (TAG-LENGTH-VALUE) - esto es - cada dato va a tener una etiqueta, luego el largo (en general representado en un byte) y finalmente el valor. Pueden venir varios TLV concatenados. Por ejemplo para el archivo 7001 que es el numero de documento, la data va a venir con la etiqueta 5F01, largo 09 y seguido del numero de documento en ASCII, o sea READ_BINARY(7001) devolvera 5F0109XXXXXXXXXXXXXXXXXX donde las X son el numero de documento en ASCII.
Los otros archivos disponibles son 7002 para los datos de la cedula, 7004 para la imagen y 700B para el MRZ.
En el archivo 7002 nos vamos a encontrar varios TLV concatenados de la siguiente manera:
1F01 = Apellido/s
1F02 = Segundo Apellido
1F03 = Nombres
1F04 = Nacionalidad
1F05 = Fecha de Nacimiento en formato DDMMAAAA
1F06 = Lugar de Nacimiento
1F07 = Num de Documento 
1F08 = Fecha de emisión (en 4bit, ej 15 12 20 17)
1F09 = Fecha vencimiento en formato DDMMAAAA
1F0A = Observaciones

La fecha de emisión puede ser el dato que tenias problemas ya que la codificación es extraña, es el hexadecimal convertido en decimal.
Todo los demas datos estan codificados en ASCII y algunos TLV tendran largo conocido y otros podrá variar.

Con el MRZ no vas a tener mayores inconvenientes ya que viene en un TLV T=7F01 L=5A D=90 caracteres en ASCII

Ahora con respecto a la imagen hay dos consideraciones a tener, la primera es que no se va a poder leer en un solo READ_BINARY, porque habra que ir leyendo de a bloques de maximo largo FF, una manera optima de leer la imagen es ejecutar READ_BINARY consecutivos

​​​​​​​00 B0 00 00 Le=FF
00 B0 00 FF Le=FF
00 B0 01 FE Le=FF
00 B0 02 FD Le=FF
00 B0 03 FC Le=FF
00 B0 04 FB Le=FF
.
.
00 B0 XX XX Le=YY

El bloque final dependera del largo del archivo devuelto en el FCI Template.

La otra consideración, también por el largo, es que el TLV de la imagen viene codificado diferente, la etiqueta es 3F01 luego viene 82 (en hexa, y significa que el largo vendra en dos bytes) y luego dos byte que indican el largo de los datos.
Por lo tanto en tu caso particular,
3F01 Tag
82 2F6F = Largo 12143 bytes
JPEG=
FFD8FFE000104A46494600010100000100010000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC0001108014000F003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114 ...

Una buena aproximación para encontrar errores es guardar los bytes de la imagen en archivo con extensión jpeg, si la puedes abrir con un visor de imagen es que estas tomando los datos de manera correcta.

Espero haber sido de ayuda y cualquier otra consulta a las ordenes.

Saludos!
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Excelente, con respecto a tu explicación.
Es todo lo que he hecho y aprendido con ensayo y error guiandome con los datos que recojo de Java tambien. 

Los datos del 7002 actulmente cree un proceso de SubString() para capturar los Tags y recoger todos los datos ya que los Tags son predefinidos, Con respecto a una fecha que faltaba, parece que no viene como lo otro jeje, asi que ya viene convertida, nose si eso es un bug que existe hehe.

Con respecto mi duda de los +5 de diferencia que tienen con la misma Cedula utilizada java y C# . Que al sumarselos en c# obtengo el 100% de datos que obtengo en Java, podes confirmarme si es un tema de Lenguajes, y si lo dejo automatico en +5 estará bien ?.

El byte[] obtenido del Readbinary sobre el 7004 despues de convertido a hexaString quitandole los 10 primeros lugares.

Es exactamente el mismo que obtiene Java para la imagen.

Ahora por toda la red vi que hay muchisima gente preguntando que al convertir da invalidParameter. Probe con bitmap, con MemoryStream y hasta ahora no he podido.

​​​​​​​Por lo pronto voy bien , en fin todo esto es para aprender, porque debo realizar lo de Firma Digital y bueno he perdido tiempo pero he adquirido conocimientos extras
thumbnail
Nicolas Piquerez, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 62 Fecha de incorporación: 3/10/16 Mensajes recientes
Barbaro Maximiliano, venis bien encaminado, es bueno primero probar los comandos de lectura de archivos para luego intentar con la firma que tiene un poco mas de dificultad.
Tal vez ya leiste la otra respuesta, pero esos 5 bytes de diferencia deben ser porque estas mirando en "largos" diferentes. El que tiene 5 bytes extra es el largo de todo el TLV que se obtiene del FCI template, esos 5 bytes extra son para el tag(2 bytes)+length(3bytes). Luego en el Length del TLV deberias obtener el largo en bytes de la imagen (los datos). O sea la imagen va a venir en el TLV con el encabezado en hexa 0x3F1082XXXX donde los X es el tamaño en bytes representado en hexadecimal.

​​​​​​​Saludos!
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
No, sabes que estoy tirando exactamente el mismo comando, Java trata los Bytes diferentes y eso confunde muchisimo.
Lo que si vi es que el Byte[] array que trae el readbinary tiene un 111 en el Index 0, y ese 111 lo tengo en el Index 4 o 5 en el mio. Así que nose cual es el llamado que tengo que hacer realmente aun.

De igual manera pude construir el String exactamente igual que en Java pero bueno la realidad es que a la otra de crear la imagen no he podido.

Intente con MemoryStream, con Bitmap y con ninguna de ellas logre. En todas me dice que los parametros son Invalidos y buscando en la web nadie ha llegado a una solución cando sucede eso. 

Este es el string obtenido de los llamados Readbinary utilizando el FileSize que consegui. Es exactamente igual al que en Java construyen.
​​​​​​​FFD8FFE000104A46494600010100000100010000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC0001108014000F003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D010203000411051221314106135161072271143F01822F6FFFD8FFE000104A46494600010100000100010000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC0001108014000F003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F57EF9A29700F5A3159083F9D1F414BD3BD21A003B51DA8A5E68013BD2E283F5E68A0038A31DFF003A5A41400518A5A280131462968ED4084A00F5A0D2F3400631451D68C5001FCA92971CD18A004CE28A5C5275E714005147BE28A00314A293BD2F340052D274A280168A3BD1400DEB476A0D1DE8187F4A2939A3A9CD002FB77A28E99A281077A297A9A3AD031281D3DA8CF347F3A042D20EBCD1466801451D68240EBC0A4DC338C8CD002D2F5EB4C695173B9D57EA6AA36AB62A769BDB60719E655A02E5EF4A2AA0D42D1941175091EBE60A956E607FBB2A1FA30A02E4BDF8A3BD30B71C1CD28707A1A00703C7145273F514641E98A005349D4D2E6931400BEF451474E940C5ED45145020A5A4A5A0068A4A00E79A5F5A004C734BFE3462968013FAD1DA820D18EF40051DFAD1476A004EFC52F5A3A0EBCD0700649005002679E78AAD7DA8DAE9B6AD73753A45120C92C7FA773ED5CC78A3C7569A42C96F6616E6EC0C1FEE27D4F7FA5792EA7AF5FEAF72D2DD4CCE49EA7855FA0ED406AF63D075BF8A0B0B3269502B60FF00AF9BFA28E7F323E95C4DEF8E35BBE2CAF7B2AA9391E5AAA1FA640DD8FC6B05F7B0DCCC768EE6ABC842AE72067B934C7646836A32CB2EE966727D598934F171F2E5DDC03D0802B2A2656202AB363B55A531874CC88A4F6EF9FC3340EC594BC524619F23A131EEFE58AB569ABCD0B930CF2447B90590FBF19EF50C4B1B0382C0B7628C09A798BB0896419C11E59233F8D481D7E8FE3F9ECDD56EDD67871CB11861D3A11C1FC457503C7D6110C82D32919DC800C9F6CFE5CD791B9DACABE546FECA4A0FC738FE755567684B2A13827EE73FA50163DD2C7C73A3DD9D8D3180F2712F1FAF4FD6BA28E78E43F2481C7D7A57CD71DDBF4C330F5F4FD2BA1D0FC517BA4B8F2DC4B0F398DCE31EE0F63FE7069D8563DDC367DA97278AE7F42F105A6B36C2486428470D1BE03AFE5D7EBF4ADD590190A9E1BAE3FCFF009E45022406968EF466801696928A005A28A2801BDFDA940A29074F6A00776A4EF47B5140075347B514B40087BF3C5039ED8A08069A4FA0E3D7D280118AAAEECF03B935E7FE35F19FD895EC6C5C24BFF2D641D547A0F73563C6FE286D2E2FB25B483ED2F8663D7CB5F5C1FC3FCE2BC72695EF67676766C9CE49E5893FAD304AE3DA592EA42D21217393DC934D791621962001CE334D2C221B41DCDEDD2A32B86064019C9E07A50591C9348F92A840EA0E39FC2A260CEC0372DD028FEB5723B5795BD49FD289EEA2B45F2EDE3DF27773DE8BF60B1147652B6061B18FBB8C7EB5A76DA63229623E53827040CFE558825BC99CFDEC9F4A962B6BE09BA392404F3EB49A7DC76379A2083F740671D1581FE62AAB4A48C957E3A9DBDFEA2A8937CC9873BC7707AD43E65C47C72A474A560B17259641F2AB3AF504ABFF009EF55E28CC8E51BA9EE7B7E94AB3C8F80CAA7AF0471FA53E187731C038F4CF434C56124492D586C25F804E6AC831CD102F16C2792C3AE3F1FF00EB55A7B74FB33310E4E06D3DF1CF5FF3E954BCC30290D8E9D4FA524C65BD36FEEF48BD59EDA464E7D7861EFF00FD7AF6EF0E6BF0EB9A6C732B22CC30AD16EC156C761E98C91EDC76AF0549C4848000279E38AD6D035C9742D496E2021971F3A03F7949C9FA74EBED4C9B1F4221CA8E99EFD69D59BA36AD6FAC592DD4047CD8DC3B835A439A0917A51D681450014B46314500373C52FAD27E1450028E29294D14009DBB52D1450031BA8C71C1AC9D7F598747D3A6B872A762808A4FDF63D07F9F4AD3998AAEEE31DF271C57907C40D6CDF6A66DE390F936D950B9E370EA7F4FF39A00E4B56D42E751BF924958992462CC477EF55B62C3173FC2327069910EACD9FC6A4CFCBBD8E3186E3D7B532C81D842BBDB0D230CE3D29B086918672493C5413319663DEAFD946D801705D8ED00D0DE8095C93CB9676FB25B0241FBE57D7D2B52D3C36A17E64058F39EF5BBA2E9021847C9927924F7AE8A0B051D12B9A551F43AE34D25A9CCDBE878C0F2C1F4F6AB69A0A3365D06EF5C66BA95B2555C1A93ECEA3B7E359B9B34E5472FFD8500C8099E3B8ACEBAD0622C00880F4CE71FFD6AEDCC03A0FE5559ED80F7A5CED09C533807D0BCA6DCAA40EBB474FC3D0F34F5D2A25972A4823D7D3B576CD6C9B01D8001DB159D2DB33B7DD023C74C75AA551B339534729A95B8823C05C83D083FCEB0E446601405C01C90D5D7DEDB2244FB1319C8C81FCAB91B98FCB94315E0E7A7F4ADA12B984E362A81824105587B609FF1A963938643C10720D1236537272738CE3A9C7A7E62AA4727CEA77633C1AD883BEF01F88A5B1D563B7667292909B00CE79E00039CE7F9FB0AF698DD5D032B020FA735F3024CF69730CEA06E461C1008C8F63C1E95F41F843554D5B40B79C172D8DAE59401B8000ED03B521337C51477A05048B49477A3E94000A5EF4945002D18F6A3AD2D0036918F07D7D29D9CF43F5A6120264F3401CF78BF563A4E852BAE44D2FEEE323B1EB9CFB0FD48AF11BB7F3998F5C751E9E83FCFA5765E37D646A3ABB4313031C1F2A91CFCDC64FF009F435C56C0C40E07B7A7A7E18FE7415143446AC5216C73F336E38C81D79FD3F1A82690EE6518C8E5B3EF5624CA2CB3608472515C8E0AAFDEFC6B3C12E809392C726A90C6A212D9EB9AEAFC35A79964699812178506B9F081595401C0E7EBDC7E67F4AF48F0F59882C634C00703358559686F463ADCD9B5B60AA3A051ED5791028C0A6A8C003D6A6007FF00AAB991D0200453B6F18A7630704814A00C71CD16020D9EF4C6519CE2AC0538C63DFE94C23079E6958772B3A823A552BA40158ED1EB5A0E00C8EDFCAA8CFCA3647518A0460EA3188EDCA81EFD3D3FFD55C85FDB110EECF20863938EBD3F9D7797509923E7B8AE76F6D435A953C608539F5E3FFAD5A539194E271B721A318C820F7CFF009FF3F4AA67972AC31BBDF157B551B5D810415040FF000FEB59AB302AA5806E80E73FE3E95D88E66AC5D6DB2423BB630467B8E2BD4FE146AD882E74E6624A912AF53C67691EDC91F9D795DBCAAF18CF19EA393CFF009FE55D1783AF4E9BE29B190B6D0F208988FF006B8071DF9C1FC28623E840491C52D32360471C0F7A7FE34880A3BD1476A003A8A0FEB4A28CFE540083B77CD3A9A4601A0B60671CFA5001E99EF595E21D4D34DD2A798B856DBB4127A13DF1FE7AD69927181D8579F7C41BCDB0C16D93B9CE76F71EB9E7E9406E79CCF2996E0B33745E589EAC7A926A36511C05FB229C77C13D3F42BD6A6014440B9C190EE040C93CF4F6E01A6DC279906E643FBC21F2063E5E83F9FEB4D22EE67DDC78856254C3ED552075C9E49FD3F5A880FDE0DDC851CFE156648CDC5CA9524A005FDC76FE9FAD40CB80437CAC4ED39ED43605AD320371A8C230796CB67DB9AF51D390AC2315C17866D4BDCF98463E5014E7DF9FE42BD1ED63DB1803B572D67EF58EBA4AD12CA8C807B54A3E6EF4D55E00E69C16B246848327EBF4A3193F4F4A1460E7F5A7E0918C13DFA55086303D3A546C41F5E6A665C0C63F4A89938F7A4C0AB21EBD6AACBD473D2AEBA1EF55E44F6A963284AB80463E5EBC76ACBB8B42E495E32307D0D6D327078CD40D1FA8FCE92623CE3C4762E417DBB58761DFDEB928DBE62A707DABD675AB25B9B675EFD7E95E5BAA5A9B4BC2471CD76D195D58E5A91B326B12092A18F1924019AD341997EE907B60739EB81F88AC6B7399030EFE95AEAF958A45EE01207AD6ACCCFA2B41BFFED3D12CEEC9CB491293DF9C73D2B48715C2FC34BF32E87F646933F6766C0C745E3AFE7FA1AEEEA496252D2772296810BD69334BEF4940073EA290E40E0F24D07A81DE83F77B500452B1DAC00E71FAD78BF8C752FB6789254420C712900A8C64E3BFBF6AF5CD52E45BD93B100FB67AFA7EB5E0F713492EA572DB99774843063D70738CFD45038EE122E6448925C8C63E55C727807F5351DE12B222A80AA14B0E31C0C9191D8F4FCE96125A712481776D2E546578C6063F5FCAA8C92A9FB548436D030083C82791C7B802AD0CB56A99B699CAA9DC046A33FE7B9CD56954ADC98B38D8304F4F63FCEAF58221B752DD23073EE7EF1FD3F95544C8135D3287249C8F427A7D79A948A676BE1EB658E047E7E63DFF00CFB575D0B8030B5E65A7EBB796A8A86DDF8C7515AD0F8BE488E248081F5FC6B9E506DDCE9524958EF8498C52F9A8783ED8CD73B61E2382F14021949EC4735A8250C4303F4ACDAB169DCD58CEE078CF3C548BF770A9C761B7A0FA5508E5278CF1FCE9ED3ED5F7C5340CB8400D8E71ED51C846338EBF8D65CBA9A5B65A49401DF26B1AEFC5D027CB186624F07A53E5B92DD8E98B863E9503F27007D6B8C6F19CAC7E58303D4727F2A6278C6E1F19B76E339CAE727D68F662E74764F1829FFD7AA7329C7D2B221F13A311E6A1507A9ED5A8678E68C3C6C1811C1159CA162D3295CE190815E6FE26B7DB231C7AD7A44D82B8AE43C4B65E6DB1914648ABA2ED222AABA38AB363C72300E0FB035B3111E480571B5FA93EA33FD45604242DC11EBC574117FA81B4921B0727924F7FE55D8CE53BFF0086B7420D7A7B7121D922E13033961D3F4C9FC2BD700C74E9E95E15E18BB5B2F105A4D19080305258646D3C313F866BDC90903E623F03903DB3508521FD4D2D20393D7AD2D324775A0F4A4CF1485B1D7BD000477E7EB4C6393C9C7D475A771FE4523818271401CCF8BE60BA6CAA372B08D9B2075C0C75C7F9FC2BC415B900724E4F033C9AF56F1CCB8D3AE1C641DC549078E063FAD791CACBE74CCDCA0C819E38E9FE14752A24ACFE4D93CA57E62DB4376CFF00F5F9AA0F315B121972B24B807FDC03A7FDF469F752F951C6A777CA0363B67A8AAEB1E6DE15C80EE03280723EF11CFA55203A5B4876E86C4A37992B7CAF9F94E7B7D71C7E5508F2BED7040195D5642CFCFA763F881562DE6963D3CEEFF5200C9F4E7A8F4AE5A6D4DC5DCB38FBEC08EBEA734EDA0D3D4F4982680A72B1050075C52B5A595C60462225BB2E2BCEC6A3A8C10248F101139F94BA673F9D5A8BC497023576B680A92576C7F2B1EF9E3F0FAFE758FB166FED5763B98ECA281CF1B7D315B568C046006C81D326B8FD3F58F3E30DB99D303E5618651FD6B76D2E08752AD946E9584935A3358D9EA8E9A27C73D699712FCA7BE2A4B38FCC40DC8CD54D43F7791CD4DF42AC65DF4692E77B13E99359474D8A43CF39EF56A6720191F38ED58D7DA918C0DEC635CF091F2CFF00E7FCFAD691BB21D96E6BC7A7E9F19FDEEDC8EBB9F19156D7EC3180228E13D81C027F3AE0935FB879DE1B5B067318672872EDB5416638F400127D003500F144AE49681739E36923F43915A7B27633F68AE77F27D924063685003C9C0EA7D6A3585ADCE6CDC6CFEE13D2B9AB1D756E7009C7D78C7D6B660B93B800739F7ACA516B7358B4F634C4CD227CEBB587154B54B73359C800E719E9576005B0706A4B88F31118ED59DECC6F63C76F13C9BD71E8D5D05AF94D66ACE79459318FA71FAD66F8821F2755900E99ABFA44666B271DB7004E7A74AEFDD5CE26AC6A594E22923917180C3240E9823FA57BBE9974975A7DBCCB289119010FD8F183FA83C57814642DAA0232C412B8E0927FC9AF67F07DD8B9D0208F7AC8C8A3202EDDA08071FA9A85B848E940C719FC0D18C107F41480F7A5CD333173FA527078A3DBA503AD3181E298E78EB8F7F4A7E78A8A423696E781F9D211E6DF106E55ED6084860A645F9B1C0009FF00E26BCB49768BF84331E3DFFC8AEEBC7B3B4DAA470139458F711938C902B8676512448003953BB3D6975348AD0CEBF94B48F939030067F0A7C40848101E79E7DBB7F3AA973832ED1DDAAE5BAA6E88B64E1573F4ABE8069DF5EAC569B5383B42B263D3BF35976767E748B2EDC8273834CBF9BCC658D460E0027D7D3FC7F1AEC34DD242D942A570C101CFF9FAD4CE5CA8D29C3998C96217FA57D96E20DAC9968A4423231EA0FF008D655A786AE0CC24976ECCF3B5813E9C035D8C362E17923A7715621D3C8CE718C62B1F6A6BECADB19D70C8ED6E967A64B1B42BB1594A9247BF3D2B46DEDF6CB84185621801DBD6AFC569E580A9E9F95588EDF6B038E6B3A93BB2E31515636F4F5C4233D00ACBD617E6383CD6CD9A620CFA0AA17F18690823AD67B21DCC07847D8FCCD8642A0E101E49C76CD6169D8B5BD135F6993B4DDF705C0FD7A7B575688D13614723350DC5AACFD720FA835AD39589946E79DEB9A13C97CF2582C851D98E0A10CA7FBA78C7EB53689A6C3650C8F730F9F348BB0444615477CE7F0E9FD6BB19ACE419D98C67A63201FCEA11A7B9C2F9617E8B5ABAB644AA47256DA1192F7CD84B2807A1E9FF00EAAE86D34F915C06E2B6EDB4E29D17DFA568C76AAA391584AA391AC62A25582D4C68334D994807D855F3803E954AE7EEF5E2B3436797F8B6355D4B3D770CF3EB50E8AFB59863E53824FA753FD2AE78C462ED0E39E39ACCB076F3C6DE4290CDE871FF00EBAEF87C28E297C4CDBB521636900F98290A71D307FF00AE7F2AF4FF0086F297D3664318091920B1C7DE04FF00435E57652A89CC647DECA1F4E73FE22BBFF879725756BA81E675DC372C3DB9E41FAE0FE94BA92F63D3D781D29E39A894B6F6CF4007F5A905333172683D69051914C60473D7AD325E23C0FD29F55AEE531C44AE3183938CFF009EB408F14F1649E6EA974FCE064291EDD7F1E2B909C39B862E8D948CEEFF0067AE3FF425AE9B5890B5CB3020EE6C9F61939FD3F9D7393A1967B92B9CED0304F6EBFC80A85B9AAD8C794EC9BB74357518AA2E4E3F7608C7D38AA12A933919E98156D46E8837A90A07A000568F6122C59C5F6FD72D61D800DCA08C7651CFF2AF54B6B5554418C00315E7BE0E83CED7259CAE4221C1F424FF00866BD4208BF76A3F9D73567A9D7457BB720DABD08FCBB55AB7B632638E3B1356A0B3030C719AB623201C2FE15CF76CD8AA2158C6001EA4D44542F723356AE488D49ED8AA11CA65954678F4A6910CDBB77DB0800718AA17926651CF06AEC6008F3DC75ACCBDC162DDE98F949D220C03639A47B539DC076E98EB49673AB8033C8AD209F2F149262463F920372307D875A155700E00E6B4DE10DD4039A85ADC76519ED4EECAB1122E45388E318F6E29C5368EE2A366A56195DC6DEE6B3EE986D26AFCAC0FA5655E3ED5342259E7FE2D5266857258F4C9ACEB23F6784B6C25DC95EBDB23B568788CBCF7D0AC6A4ED3938A8DD634D2B718C896362413C601618FAFFF005EBBA1F09C337EF0C59002C3180486EBD08E723F115DBF82EEA287C43019039927558D36F41CE7F901F866B8711864B9DA371E001D3B13FD2BA4F0EEA2B677F04B17CAA55947D31C2FE6052067BB2F53C73D339A77E151C6FB914B0C311923D2A4F4A666373452027D6807DA980639ACDD524F22DA593246C8D8E47D2B489C7715CFF89E66874AB9298DDE515E3BEE3B7FAD211E3B7249DEC402467073F9FD7D6B0255522465DC15DFAFB607FF005EB72E9D44130CE76F2B8FA1FF00EB566A444C31C6794326723B1A989A981273712718F98F356958F951B6707249E3D31513206B9988000C9E95619018A3183F7481C77AB608EAFC070A8826948E4C9B4FE03FFAF5E8F6CA08C9C579E781980B161DCC873F90AF44B6E8A735CB53E23B21F0A2EA647B5498551D8D31581E287C1E9F4ACD22AE65EA8E64DAA0F06A2B18FF007C39E946A65A1C38048079F6AC68B51961BB59180FB3B36372B676FA647A556E3477291FEEC63D3B565EA48163EBEC2A38F5801766FF00CEB9ED675BB8FB4A25B406E1B76319C28FA9C53E50BB3454BC256452719C1AE92D27134401EB8ED5C9C7765EDC2C89B1F3C8F7ADEB14291291DBA52416359C2AFF00FAAAB31C1C81C54DBF28323AD577E3239C1A624C63C808C77AAB21001C54AC7BF7AA92BE01A963B95E7248201DBD81F4AC4D4AE0E0AE6B46EA70AA4935813B6EDF29CE0538A224CE76EDD7CF676505C48B83CF400E47EA3F2AA1772131B21623E60307A0E6A5BE97263C1E5B24F3EF8FE95465977BB9E33C100FD715D8B45638DEF72DC5BDE57D87E729BB8E3FC9E95AFA35C324F096C048A456CA9C13B72A3FCFD6B2A372668C0CFDC20363EA71F9D59D3C1C31CB139238FF00BE80FCC54319F46DB4CD3DB47338DACE0311E99A9AB3F44BB4BED260B88B1E5B2ED4F7038CFE957F3CF4AA31199A09E69A0D2E7DA9808DEC6B93F1A3AFD8638830DCF2807E6C6303767F415D5B363B66BCFF00C71260C7924AAC52B6D1EBB4007F3A4F61ADCF3B62248954823737240CEDE493FA03562184F92248B06444DE540C8DC09393FE7151C50B308496643812165E703D7E98AD0B89B6346B27CB343122EDC1C361B71191D38273F4A2068CE3E2B7132C8EBD4B8EBEE3FC69D32E2653C8620B7A75CD6B58C3E5C4E14EECB02A31C1E847BFAD51B985BCB8E4EE548FFD0AAA4246BF82A4D90B2E7F88E7F4AF4AB57FDDAE0D796F873FD16F2783703E5CA5770E879C7F4AF46B29434639ED5C957E23AE0EF1360371D69EB9E31D2A9AC9CD4C25C2D65734424F0A499CD64369CB1CAC4004370463AD6AF9B93C1C521C1393C9CD34D85D9813694F1C83CB72A87B7A55C8EC04516D50093C938AD17DA3B71D8D3D5D5B04F5F6AAE60D519B0E9AB1319580321EF5BB6CA046147A5572CA480BFE454B1BED18CFE54AE372B939F97F0A81CF5F6A1A6E383F8D47BB83C8345C444E7BD67DC498CE2AE4AF80702B2AE5F27838A057285C31964C7E159BAA3AC163236EC00B8AD40B8C935CB78AAEBCBB2F2C1E58D5C15E46751D91C92CED23B33B64649C7A75A739C4718C7248C9EF55E3E0376E31561983CC81FBB0CFD2BACE52F24AC97402F51D33EFC568D8A6C0E11F6904727A1E0AD65C608BB66E07CDB71F4FFF00556A5ABFEFC92088C6EC0F501BA7EB5948A47BC786678A5D1A04836F95122C6BB47B03FD6B6335CBF81020F0E41B776F3B9DF7633CB103FF0041AE9F356B6327B910EB4E1CD3475A75310C7EBBB2381819AF34F1EC8CB2DC2A8C8484027AFDE7FF0005AF48973B78E9C7F3AF2AF1DCBBE59986007291B7D473FE7EB5322A3B9CCD913E6DBE5BAA2AFDEC6011EB51EA132F9E240D9DCEE473D46D23FAE3FC9A75BCA0488EC08310C8E3AE07FF005EAA4A15A5815DB6FCDF78F75C81D3F0A517D0D1A2F6E1069B21036B6E080A81C104F438C8A92CECD6FED2D238C7CC41000192724E703AFE159F7770F25AB82F23440E06E38C9209CFEB56B48BB9205B3957831B10BC75392467F2AA6C1223B1B592CAFDD5F20C88B30F7079CFEA6BB4D365DC8077F7AE76778E3F2811B9C288FCC04FF0FCA47FF5FDAB574E9F8193C9EB58D546D49E87471C80A13E86A29EF16343B9F00D323707E51DC557B8D2E2BB426519C76AC11B32ADC788A38BE4870C47526AA2EBCD203B98FD3351FF00645BDBCE774791938E78A7A69B6AE06DDA091D368EBE957689D14E28B11EB4E89C49C74E7B5346BAEA770933F5FF000A85F488B8C2A904919E7823F1A8BFB153395E8C33904FF8D3D0D3951AD17896371B5D71DB766B560D4A09103248083EF5C97F6542990ED8C7704FF8D3ADB477798149A644F66FFEB516463529E9A1D92CEAE383CF5A76EC63F9D66595B4B6D847959C1E84F5ABE5829C9FD6A0C6E4770FF29E6B31CEE735666977038E9F5AAAC703B7BD022B5CCBB16BCEFC4B75E7DF2C59E13935D9EAD74B142E73800135E6B75299EE1DC9E58FE95D1463D4C2ABE8350123DC9E6ACC58FB5AEEED9FFEB543183B947A735341822590F2318CFA135A9916EDD83CF193C6E39271EE6B6234297AEAEE3CB00F7C751B8D6342DE5344A31B7393EFDBFAFEB5B911CDCAA3024B46197D0F016B39148F52F8792B1D3E53236199822A67F8464E7F36AEDEB80F87970CC2589D46D3F34673C8CF18FF00C77F4F7AEFEAA1B194F721A5E7149C7E3413DEA892398F615E39E3594BCF72E49DBE771F5D82BD7E76C444F19E86BC63C44C2569B072259599571D3E5031FA5448A86E663398D0FCA388CE48FD3F91FCEA85D3B0B88F0436114FCBD86338FC335A976BD132C0BE00C7B671FD6B2E4559257651C12768CFBE31FCAA606AC9AE8811ED2BB467B0E723029BA63FFA1C4493F2C9EBE9FF00EBA4BA7023525B86CB11E849C63F95456A0A5A940E3990807D79029F40EA5DB99CC4EC01DE3CC663F42C4FF5AD6B19864633EDCD62DFFCF6D23A46030620EDFF007548FD71F9547A36A1BD40CF4A992BA2E0EDA1E836D38DA327AD5D5982E39E0D60D9CFBD063AE2AF2B12BCF06B99A3A23A9766092F256A8CB6FB0F991641F6AB11C99183C76AB4912B0F5A69969B8EA8C56BA70A50249FF7C9A58DE7917626541F515B46D727E418F6A05A763C1EBCD55CBF6B232A1B1E417209AD28904200ED4F3084E323A7E3514BF28072400324D2B99B6E5B960C814E73504D312324F14D76017AF5A82570133D7142258D6724120D55B99FCA88EE2071C9A63DC80084E7079AC1D5AFFCB8CEE6C9FE1515495C86EC63788352695DA25638EA7E95CD460B364D5FBB62C8EEC7E66FE55561421067BD75C5591CADDD8F51F2B135623052D30320BB723D47D3F1A89810BC6793DAADBA2AC8911380831F8F7A4C07B20FDDB01D17775E9C9FF0AD890FFA4DB3003985473EBCFF008D66AC2A5910B603A80091D0900FF5C5694AD199932472318518EDFE359C8A47A07C3DBA686FA481B0C1E1518EE30428FF00D08D7A503C0ED5E55E092A9ABC462619914820F61BB3FC80AF551D2AA1B19CF721E7D68273C76CD20CFF00FAE9923103A81EF8AB20AD7B2E23703A62BC735205DE366E76BBB119C7427FA0AF5FBB5D966E73F3107923A5793DF2E55815CE4E14F42096CFF4C56750D20B532EF59BCD088DF2A1E09F5C7FF585505DE020C138DCF9E9E9FE157AE170D21D99C0C8C0C75E7F92D578B68312A83F7792C7BE454C7634643A815DB2009B7070A076E87FC6A3B4DC2D23C80769F4F534E955DC2B70566942827AF7FF00E285229D9163072393FAD35F087502AC9E66F620008460FAAE7F90AE7D266B1BD2533B33823DABA5B8DBE5B73F20F2C9F5DA030CFEB5CE4F16E988200C11F8D5404CEC34BD495954EEE0F7CD74D05C86407391DEBCDA3826B0413C399206FBE3BAD745A5EACAA1496DD19EFE9595487546D099D84656594A1FBB8CD6B5BED4555049F7AC1B5B8472AE08208EB5B16F3AE3D41AC4DD4B435530101EDF9D2328EA3AE3BD4227CA8DB8A1E638233CD6845C8244064279CD41263041E9EF4F96620F5AA52DC2AE79A8686D8E99D513A8FC6B22E6EF92A0FEB55AFB52DEE510F3ED58F717A1411B816EF9354A266E45CBDD456288807935CDC865BC90C8C4EDEC2AC2C32DE481E40760FD6A6961F2D70140C0FCAB68A48C9BB9897B1EF2B183DFF414CD9CE07D2AD4AAA70C3EF1E00F6A458B0517B935A5C8B0D821F3AE910827037903D075A79724B372075C1FCAA781771BB9FA2A8D8B8E71DB8FCA9AC8044594E324609F4C8A5B80F31C91B42594A8CE47F8FF002AB9C97B7C8CE1173EDC7350B33BDB5BBBB0E8573EB8207F222AC857FB540A33B157E6E7B11D7F4A4D5C0EC3C13F2F892152B905597AE71F2F1FA9C57ACAF0A39C8F5F5AF22F0883FDB96BC9C171D0FA8E7F957AE4400418C7E0288113DC8B351B633B987B629D8C1CFA52370064D59051D4CE6CE401828C76AF2A9D77CCA54EDDAC58678CE0803FC6BD3F589521D3E42481F2B7538E70715E6B283895B6C78504E777DEC0E47EB58D56694CC1BF0148049642DE9DBB5382F92A5C0E1474F4C7F914DBAF966C05C00E1573CF1D453D8816D709BB8770578E78FF00F5D4DFDD354B5332459162802F3C97C7E1CFF2A95221B09620AE09C1EBFE78AB76B1C725CC316E00ECCA923AF04D412968E1E07392DD3AF1DBF3AA4FDD06B52BDCC8A6CE3F2B3BBC9009F5F99BFA0AC9B827CE8E61D770C9AD5BA50B691718C33203EC071FFA11ACD9222F16C0C32A038CF7F5FC69C189A3734EC040A46548E869B75A535BB99AD480A4E4A76349A7B16456EC7D2BA0B70AEBB5BEE9A4DD9969686159EA72DBB84391CFDC3D47D2B7ED75C8FB9C7622A0BCD212419D8187AD503A73A636BE7D038FEB50ECCB4D9D3C7AE46C3EF80294EB28BD187D6B9636970A3FD503F46A3ECD7271FB861FF02A2C82ECDD9F5B50325C7E159377AA4B382158A27A9A80585CB939454F73532691920C8C48A34426DB33FCD7932910383D4E3AD58834E2EDBA5E7D056B4362A806D518F7AB896859771C003A9A7CDD8563305B844E074E959F7CE173086049E58FAFB7F3FCAB5EF1D62858290A83966EFC56073302F91990ED507AFF009FF03EB570D48915628CCB360676F61FE7DB34E8D8A4D24F92AB18241DB904E3A7356E006DEDE572C143021B70FE01D7F51F862ABCA85EDD50A8569A40C7D391BB8F6C1157622E3A50B6F65147E62BF9A4B6F008DC0719E7E83F3A86550A046E014DB9041E7D0FF2356EE7C9FED68E36C985155381C03EBF9540228D59F7FCC481B467D473FA134BA8FA0E9230B6483D31E839CE4D5A914C6CA1470EAA173DBFCE69972AA2D4A2804A119C8E9C014F752D05BC80925481CFAFBFE669A11D2F85F1FF000905A7CC42960013C63048AF608D81504742339AF1FD086FD6EDD623F302324F193827AFD4D7ADC0E0AAAE082001CD11DD913E8358F047AF1C554BDBD8EDA3DCE4939E157A93E83FCE2A3BFBFF00B347F202D21FBA3D6B9BD435BB4D3B749753A4970470991C536C9485D62E4C88AF74FF003B021211D101FF003D7FFD55C620260DF9C3301B413DC927F9014A9AD9D53519796395638F4C038FE74E9322DD4EDC95C672318017193FAD72D47A9BC1192C0BC854725892A4FBE48FE8295C6F711F6321F988E87A7F4A7ED3E76707EF0E83D29F805E318CED66FE59A24F4348AD48E346FB6AAC6082542127B118FF000355D943A315CF55E481EA01AB8C196FCE3FE7A9CFA01F37FF005AA0642609029F9B2CA09EC41C8AA8BF7497B99F2EE6B425B9DA40504704F27F9565CE821DADBFEE921B3DB93FFD6ADC9016495CA67203A803DC1FE59AA1244ACBB76861F77681E871FCA88B0689F4D39E0E01FF0038ADFB56C1C7715CD697827CADE32A3E520F55FF00EB74AE8615906378CFA106AA4389B50B7001E6A6FB2C52F206D3546D98F42083EE2B46227838AC99630E99E983FA527F67383F74FE157D1FA0E87D0D4BBA90CCD1A7BF6434F5D3CF7C0ABFE61EE4530C9926988896DA28C6719FAD51BC6DF95CE029E7157667C2FF004AE6F5996499858C2482FF00EB58740BE9F8D34061EA573F6C9CC71B05B643CB0E431FF3FCA9DB8C7006FB9B94AAAFA2F720FE5F8E2A298A2DD886353B23F97EA7DFE9FE154350B95C32AB1E9B54E78C7AFE3FE15D113196E4F757BBD0242B827EEE7206318518E9D031FC7DAAF44A897F6D0A37FA904ED7E7191900FE7597A640B73A8C08D1B88DE4DCE3AE1477E31CE3BD6CCE19B549DCB654A6D66E3E523F1E9F375F7AB332859BFF00A548F21CACA33CFA1271F960549222FF000B1C838231F5FE94F4F2CB9D9803C91C679E493FD4525C45BA527710370E3B9F6FD6A1FC45AD8B4B133DACCECEA9B6438CE72D800E3F315096DD1840DF7DC9C8EC011FFD71565509B6DDC79664738EB8F947F9FC2A0F20C50C09C8909618F4C37FFAE9ADC93A1F0B488BE248CEE0B1E01DD9C00D823AFE22BD720649620E98C119231D2BC21A7FB344F2AB60349B5587B7BD6F697E3FBBB1991268C5CC4142AFCDB48C7BFE7493D58A4AE8E7AFBC51A85DEE77B97E9FC2703FC6B06E2FE4652ECC4B1E013D6A02C4A13938278AAEE1A4271D01C035A5921236FC35239BA9C67EF4473F5C81FD4D759711B3C73B27CABDC673C13D3FA5737E188BCBBBE5401B4AE4FAF15D2E3F712127EF827F3C571D67EF1BC3633ED94B3A85CFDEE3BE48A9CC4934F1850146E5FD4D36DC856F33071BFF00BBC74E7F9D5A8A126252149E149C7B11512D4A89525037BAEF6C8989031C76AAE4925D76F218E41FAD5D847EF66DB93966EA71C6EFF0E2AB73F68B823E604B7DEEC074FE9577158A81765C2C648CEE68CE0E323EED564522E1E273921803C6707B73D3B1FF00BE6AEDD44C92CAA7A29DD91FAFF2355AF30645B9042FCBF39C018E7AFE0DC7E3496E37B5CCBBB8A4B5945C44CC9CE7207DD63FD0D6E68FAAA5D6D85C20908FB9BB9FC299140B3C4CB22AB29F9587F74D73FAAE9F73A5CFE7C4CE6327E5909395F6CF5FC6B68DA6ADD487789E8D0A71EDE87AD5C4523EEE7F1E6B90F0EF8C2190ADAEA4CA92741291853F5F4FAD77F1246E80EDE31DAB2945A76669169AD0AA038C647E34F00FA77ABCB0A8C71C7BD482DD0F25706A4AB99DDFDE9C1588E109AD216A99C8CD3FECEA0727814C5739EBD636F04933E42A0E83B9AC29D4699A6CD7736DF3DF939E0B31E95B1AF5EDADA481AE2458E283E662472CC72001EE003C7B8F4AE0755F10CBAC3315411DBABE6319E7EA7DF9FC2AE116F526522B34876F272E41DCC3B9CE7FAD67B1F3A70A0719E95649668F2A0E07CA3D493D07F3A6429E4B79A0E0E4ED38C7415BA3266E691E6192078651E5C48C1811CB2B1DBFA75A2460B7124854C8990EC17A7D4FB7DDAAFA23C66DCEE0C240D8E0E323827FA53E4977898A9DA08380DD79238FD2AAFA9059D2B649889705B009CFA641CFBF5A9EFA2517088010DCFCA4F56C0C63DB83597A7CCF6770B2272C0000B703AE467F215AFA84A2EAE5A60A1431F31483E8B85F7CF5CD4BDCAE8351E48F4C064198C4857039383FE1FD2985B74B12EEF982BCB93F53F974FF003C548C55B490C9BB2C58B64FD7D3DB9E951427E52CE320205183D998D1D40A5A9C822B74C1F965264C63A76C5648B86C019F989FD2ADEB127957A226395190011D89FF00EBD65BB04B8723B1E3DA9C50996090173C0C543066423209E72066A694928ABB0658827DA9131146FF00DE247E03FCFF004A7724DDD0A43F6C958F2AA157E9C8AE99D374640C8509CFD723A7EB5CCF8743289CED042BA120FE24FE5815D344CAF1919001CF4EBD335C553E2378EC5242BB48DE485738047622AFDACA05B123B2633D0FDEC715980ACCB93DDF9F6E2ADC64790474F971F8EECD4B65D882062F2008416DC41C718EF505AAB1BF92260332380327D463A7E152DB63CD18E0E7A8FD69B3C4FF006E693EE1C0238C647FFA9A84F51D89EE200079A0970A3E6FF3F5359D8CA35A3901304AE3A60F5FF3F5AE8A4884F24A848DAEB81B463031FF00D6AE72E63730798B26D9231CF3F7481C1FCB8FCBDEAB71058165778C86322F55FEF0F6FC2B584105DC06174DD1B0230C2B363DB70AAE9C3E307BF3E9C76AD6B271F7640473C91D47BD09EA16BA380D77C3B75A44C648C3496AC7E571C91EC6B47C31E33B9D1CADBDE6F9ACFA01D5A3FA67B7B7F2EFE846D63BA85A09D51E261821864115E73E2AF0CCFA34A67854C966DC6EC64A7B1FE86BAA3353569194A2E0EE8F5EB0BFB5D46D52E2D26496261C32FF0023E87DAAE8230066BC0BC3FE21BCD02F84D03168D88F36227871FD0FBF6AF6ED2F54B7D5AC22BCB66CC720C8CF507B83EE2B2A90713484948D304002B9EF14F8B6CBC3B06D6C4B76E3290A9E7EA7D0543E2DF13AF87B4D0C837DDCD95854F41EAC7D864578B5CDD4F7D7325C5C48D2CAED96663924D553A7CDAB26A4EDA22CEA9AA5D6AF7AF7572E0B487381C01F4157ECADF10B39C811AFE39EFF00E152D9F87645D364D4EF479712AE238C8E59BA0CFA0CD684302A6964918257713D3927A7E55A4E4B644462F7664F96C5A355C839CFE3FF00EBA8EF1963B60AAC7AFDDFEB575846B23120E046304F504E78ACABF94B1033C0038FF3F8511091A7A6480D82A77123373FC5D07F5A125530B2B020FDE1F91FF3F9D53D3C95B26704EEDC7BF62075AB6A159546DC12B9E7AF4349BD44B624538B6DE012700107D01E956A2B9693058AE41C1C74C1EC07E26A3B41BA30B8C8C63A679CE2AA47986E1E2381B720107D3BFBF152FB948E863DABA7950BC97CE718EA3D3E869B6332887693B76A7CC587E9FCEA45188FCC04EC6849E46406E7FA6DAAB19DB6F390C0862A83EBD33F950D89239BD5662D7AF2062D939CFB8AA8011DF9EF524D99672D8C0249C7A7D286504E003903FAD6D15A10CFFFD9
​​​​​​​Actualmente a ese string le quite lo siguiente ya que ej java tambien lo hacen al realizar:
String result2 = r[0].substring(10);​​​​​​​
3F01822F6F
​​​​​​​dado que 3F0182 ya lo dijistes vos lo que era.
y  2F6F es el filesize que voy a recuperar
thumbnail
Nicolas Piquerez, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 62 Fecha de incorporación: 3/10/16 Mensajes recientes
No he visto la implementación java en concreto, pero algo que note de tus ejemplos es que al hacer SELECT_FILE no te devuelve SW=9000 junto al FCI Template como es eperado. Tal vez tengas que poner el parametro Le=00 para que no te devuelva un SW indicando la cantidad de bytes a leer. Luego el largo a utilizar para el comando READ_BINARY tiene que ser el obtenido del FCI Template (T=81 L=02 V=XXXX, donde XXXX sería el largo del archivo), este largo es independiente de la implementación utilizada.

Luego el resultado esperado al ejecutar READ_BINARY es obtener el TLV completo incluyendo "3F01 82 2F6F".

Suponiendo que llegaste al mismo array en hexa que con la aplicación java, en vez de tratar de convertirlo directamente en imagen, intentaria guardarlo en disco como archivo binario, y luego si levantar el archivo como imagen, si bien puede ser mas tedioso e ineficiente podes revisar si al guardar el archivo no te esta quedando algún byte incorrecto.

Saludos!
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Oye! me acabo de dar cuenta un problema, el string anterior que te mostre.

FFD8FFE000104A46494600010100000100010000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC0001108014000F003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114
Eso es el inicio, y lo que sigue 
​​​​​​​3F01822F6FFFD8FFE000104A46494600010100000100010000FFDB004300080606070605080707070909080A0C140D0C0B0B0C1912130F141D1A1F1E1D1A1C1C20242E2720222C231C1C2837292C30313434341F27393D38323C2E333432FFDB0043010909090C0B0C180D0D1832211C213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232FFC0001108014000F003012200021101031101FFC4001F0000010501010101010100000000000000000102030405060708090A0BFFC400B5100002010303020403050504040000017D01020300041105122131410613516107227114328191A1082342B1C11552D1F02433627282090A161718191A25262728292A3435363738393A434445464748494A535455565758595A636465666768696A737475767778797A838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F0100030101010101010101010000000000000102030405060708090A0BFFC400B51100020102040403040705040400010277000102031104052131061241510761711322328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728292A35363738393A434445464748494A535455565758595A636465666768696A737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00F57EF9A29700F5A3159083F9D1F414BD3BD21A003B51DA8A5E68013BD2E283F5E68A0038A31DFF003A5A41400518A5A280131462968ED4084A00F5A0D2F3400631451D68C5001FCA92971CD18A004CE28A5C5275E714005147BE28A00314A293BD2F340052D274A280168A3BD1400DEB476A0D1DE8187F4A2939A3A9CD002FB77A28E99A281077A297A9A3AD031281D3DA8CF347F3A042D20EBCD1466801451D68240EBC0A4DC338C8CD002D2F5EB4C695173B9D57EA6AA36AB62A769BDB60719E655A02E5EF4A2AA0D42D1941175091EBE60A956E607FBB2A1FA30A02E4BDF8A3BD30B71C1CD28707A1A00703C7145273F514641E98A005349D4D2E6931400BEF451474E940C5ED45145020A5A4A5A0068A4A00E79A5F5A004C734BFE3462968013FAD1DA820D18EF40051DFAD1476A004EFC52F5A3A0EBCD0700649005002679E78AAD7DA8DAE9B6AD73753A45120C92C7FA773ED5CC78A3C7569A42C96F6616E6EC0C1FEE27D4F7FA5792EA7AF5FEAF72D2DD4CCE49EA7855FA0ED406AF63D075BF8A0B0B3269502B60FF00AF9BFA28E7F323E95C4DEF8E35BBE2CAF7B2AA9391E5AAA1FA640DD8FC6B05F7B0DCCC768EE6ABC842AE72067B934C7646836A32CB2EE966727D598934F171F2E5DDC03D0802B2A2656202AB363B55A531874CC88A4F6EF9FC3340EC594BC524619F23A131EEFE58AB569ABCD0B930CF2447B90590FBF19EF50C4B1B0382C0B7628C09A798BB0896419C11E59233F8D481D7E8FE3F9ECDD56EDD67871CB11861D3A11C1FC457503C7D6110C82D32919DC800C9F6CFE5CD791B9DACABE546FECA4A0FC738FE755567684B2A13827EE73FA50163DD2C7C73A3DD9D8D3180F2712F1FAF4FD6BA28E78E43F2481C7D7A57CD71DDBF4C330F5F4FD2BA1D0FC517BA4B8F2DC4B0F398DCE31EE0F63FE7069D8563DDC367DA97278AE7F42F105A6B36C2486428470D1BE03AFE5D7EBF4ADD590190A9E1BAE3FCFF009E45022406968EF466801696928A005A28A2801BDFDA940A29074F6A00776A4EF47B5140075347B514B40087BF3C5039ED8A08069A4FA0E3D7D280118AAAEECF03B935E7FE35F19FD895EC6C5C24BFF2D641D547A0F73563C6FE286D2E2FB25B483ED2F8663D7CB5F5C1FC3FCE2BC72695EF67676766C9CE49E5893FAD304AE3DA592EA42D21217393DC934D791621962001CE334D2C221B41DCDEDD2A32B86064019C9E07A50591C9348F92A840EA0E39FC2A260CEC0372DD028FEB5723B5795BD49FD289EEA2B45F2EDE3DF27773DE8BF60B1147652B6061B18FBB8C7EB5A76DA63229623E53827040CFE558825BC99CFDEC9F4A962B6BE09BA392404F3EB49A7DC76379A2083F740671D1581FE62AAB4A48C957E3A9DBDFEA2A8937CC9873BC7707AD43E65C47C72A474A560B17259641F2AB3AF504ABFF009EF55E28CC8E51BA9EE7B7E94AB3C8F80CAA7AF0471FA53E187731C038F4CF434C56124492D586C25F804E6AC831CD102F16C2792C3AE3F1FF00EB55A7B74FB33310E4E06D3DF1CF5FF3E954BCC30290D8E9D4FA524C65BD36FEEF48BD59EDA464E7D7861EFF00FD7AF6EF0E6BF0EB9A6C732B22CC30AD16EC156C761E98C91EDC76AF0549C4848000279E38AD6D035C9742D496E2021971F3A03F7949C9FA74EBED4C9B1F4221CA8E99EFD69D59BA36AD6FAC592DD4047CD8DC3B835A439A0917A51D681450014B46314500373C52FAD27E1450028E29294D14009DBB52D1450031BA8C71C1AC9D7F598747D3A6B872A762808A4FDF63D07F9F4AD3998AAEEE31DF271C57907C40D6CDF6A66DE390F936D950B9E370EA7F4FF39A00E4B56D42E751BF924958992462CC477EF55B62C3173FC2327069910EACD9FC6A4CFCBBD8E3186E3D7B532C81D842BBDB0D230CE3D29B086918672493C5413319663DEAFD946D801705D8ED00D0DE8095C93CB9676FB25B0241FBE57D7D2B52D3C36A17E64058F39EF5BBA2E9021847C9927924F7AE8A0B051D12B9A551F43AE34D25A9CCDBE878C0F2C1F4F6AB69A0A3365D06EF5C66BA95B2555C1A93ECEA3B7E359B9B34E5472FFD8500C8099E3B8ACEBAD0622C00880F4CE71FFD6AEDCC03A0FE5559ED80F7A5CED09C533807D0BCA6DCAA40EBB474FC3D0F34F5D2A25972A4823D7D3B576CD6C9B01D8001DB159D2DB33B7DD023C74C75AA551B339534729A95B8823C05C83D083FCEB0E446601405C01C90D5D7DEDB2244FB1319C8C81FCAB91B98FCB94315E0E7A7F4ADA12B984E362A81824105587B609FF1A963938643C10720D1236537272738CE3A9C7A7E62AA4727CEA77633C1AD883BEF01F88A5B1D563B7667292909B00CE79E00039CE7F9FB0AF698DD5D032B020FA735F3024CF69730CEA06E461C1008C8F63C1E95F41F843554D5B40B79C172D8DAE59401B8000ED03B521337C51477A05048B49477A3E94000A5EF4945002D18F6A3AD2D0036918F07D7D29D9CF43F5A6120264F3401CF78BF563A4E852BAE44D2FEEE323B1EB9CFB0FD48AF11BB7F3998F5C751E9E83FCFA5765E37D646A3ABB4313031C1F2A91CFCDC64FF009F435C56C0C40E07B7A7A7E18FE7415143446AC5216C73F336E38C81D79FD3F1A82690EE6518C8E5B3EF5624CA2CB3608472515C8E0AAFDEFC6B3C12E809392C726A90C6A212D9EB9AEAFC35A79964699812178506B9F081595401C0E7EBDC7E67F4AF48F0F59882C634C00703358559686F463ADCD9B5B60AA3A051ED5791028C0A6A8C003D6A6007FF00AAB991D0200453B6F18A7630704814A00C71CD16020D9EF4C6519CE2AC0538C63DFE94C23079E6958772B3A823A552BA40158ED1EB5A0E00C8EDFCAA8CFCA3647518A0460EA3188EDCA81EFD3D3FFD55C85FDB110EECF20863938EBD3F9D7797509923E7B8AE76F6D435A953C608539F5E3FFAD5A539194E271B721A318C820F7CFF009FF3F4AA67972AC31BBDF157B551B5D810415040FF000FEB59AB302AA5806E80E73FE3E95D88E66AC5D6DB2423BB630467B8E2BD4FE146AD882E74E6624A912AF53C67691EDC91F9D795DBCAAF18CF19EA393CFF009FE55D1783AF4E9BE29B190B6D0F208988FF006B8071DF9C1FC28623E840491C52D32360471C0F7A7FE34880A3BD1476A003A8A0FEB4A28CFE540083B77CD3A9A4601A0B60671CFA5001E99EF595E21D4D34DD2A798B856DBB4127A13DF1FE7AD69927181D8579F7C41BCDB0C16D93B9CE76F71EB9E7E9406E79CCF2996E0B33745E589EAC7A926A36511C05FB229C77C13D3F42BD6A6014440B9C190EE040C93CF4F6E01A6DC279906E643FBC21F2063E5E83F9FEB4D22EE67DDC78856254C3ED552075C9E49FD3F5A880FDE0DDC851CFE156648CDC5CA9524A005FDC76FE9FAD40CB80437CAC4ED39ED43605AD320371A8C230796CB67DB9AF51D390AC2315C17866D4BDCF98463E5014E7DF9FE42BD1ED63DB1803B572D67EF58EBA4AD12CA8C807B54A3E6EF4D55E00E69C16B246848327EBF4A3193F4F4A1460E7F5A7E0918C13DFA55086303D3A546C41F5E6A665C0C63F4A89938F7A4C0AB21EBD6AACBD473D2AEBA1EF55E44F6A963284AB80463E5EBC76ACBB8B42E495E32307D0D6D327078CD40D1FA8FCE92623CE3C4762E417DBB58761DFDEB928DBE62A707DABD675AB25B9B675EFD7E95E5BAA5A9B4BC2471CD76D195D58E5A91B326B12092A18F1924019AD341997EE907B60739EB81F88AC6B7399030EFE95AEAF958A45EE01207AD6ACCCFA2B41BFFED3D12CEEC9CB491293DF9C73D2B48715C2FC34BF32E87F646933F6766C0C745E3AFE7FA1AEEEA496252D2772296810BD69334BEF4940073EA290E40E0F24D07A81DE83F77B500452B1DAC00E71FAD78BF8C752FB6789254420C712900A8C64E3BFBF6AF5CD52E45BD93B100FB67AFA7EB5E0F713492EA572DB99774843063D70738CFD45038EE122E6448925C8C63E55C727807F5351DE12B222A80AA14B0E31C0C9191D8F4FCE96125A712481776D2E546578C6063F5FCAA8C92A9FB548436D030083C82791C7B802AD0CB56A99B699CAA9DC046A33FE7B9CD56954ADC98B38D8304F4F63FCEAF58221B752DD23073EE7EF1FD3F95544C8135D3287249C8F427A7D79A948A676BE1EB658E047E7E63DFF00CFB575D0B8030B5E65A7EBB796A8A86DDF8C7515AD0F8BE488E248081F5FC6B9E506DDCE9524958EF8498C52F9A8783ED8CD73B61E2382F14021949EC4735A8250C4303F4ACDAB169DCD58CEE078CF3C548BF770A9C761B7A0FA5508E5278CF1FCE9ED3ED5F7C5340CB8400D8E71ED51C846338EBF8D65CBA9A5B65A49401DF26B1AEFC5D027CB186624F07A53E5B92DD8E98B863E9503F27007D6B8C6F19CAC7E58303D4727F2A6278C6E1F19B76E339CAE727D68F662E74764F1829FFD7AA7329C7D2B221F13A311E6A1507A9ED5A8678E68C3C6C1811C1159CA162D3295CE190815E6FE26B7DB231C7AD7A44D82B8AE43C4B65E6DB1914648ABA2ED222AABA38AB363C72300E0FB035B3111E480571B5FA93EA33FD45604242DC11EBC574117FA81B4921B0727924F7FE55D8CE53BFF0086B7420D7A7B7121D922E13033961D3F4C9FC2BD700C74E9E95E15E18BB5B2F105A4D19080305258646D3C313F866BDC90903E623F03903DB3508521FD4D2D20393D7AD2D324775A0F4A4CF1485B1D7BD000477E7EB4C6393C9C7D475A771FE4523818271401CCF8BE60BA6CAA372B08D9B2075C0C75C7F9FC2BC415B900724E4F033C9AF56F1CCB8D3AE1C641DC549078E063FAD791CACBE74CCDCA0C819E38E9FE14752A24ACFE4D93CA57E62DB4376CFF00F5F9AA0F315B121972B24B807FDC03A7FDF469F752F951C6A777CA0363B67A8AAEB1E6DE15C80EE03280723EF11CFA55203A5B4876E86C4A37992B7CAF9F94E7B7D71C7E5508F2BED7040195D5642CFCFA763F881562DE6963D3CEEFF5200C9F4E7A8F4AE5A6D4DC5DCB38FBEC08EBEA734EDA0D3D4F4982680A72B1050075C52B5A595C60462225BB2E2BCEC6A3A8C10248F101139F94BA673F9D5A8BC497023576B680A92576C7F2B1EF9E3F0FAFE758FB166FED5763B98ECA281CF1B7D315B568C046006C81D326B8FD3F58F3E30DB99D303E5618651FD6B76D2E08752AD946E9584935A3358D9EA8E9A27C73D699712FCA7BE2A4B38FCC40DC8CD54D43F7791CD4DF42AC65DF4692E77B13E99359474D8A43CF39EF56A6720191F38ED58D7DA918C0DEC635CF091F2CFF00E7FCFAD691BB21D96E6BC7A7E9F19FDEEDC8EBB9F19156D7EC3180228E13D81C027F3AE0935FB879DE1B5B067318672872EDB5416638F400127D003500F144AE49681739E36923F43915A7B27633F68AE77F27D924063685003C9C0EA7D6A3585ADCE6CDC6CFEE13D2B9AB1D756E7009C7D78C7D6B660B93B800739F7ACA516B7358B4F634C4CD227CEBB587154B54B73359C800E719E9576005B0706A4B88F31118ED59DECC6F63C76F13C9BD71E8D5D05AF94D66ACE79459318FA71FAD66F8821F2755900E99ABFA44666B271DB7004E7A74AEFDD5CE26AC6A594E22923917180C3240E9823FA57BBE9974975A7DBCCB289119010FD8F183FA83C57814642DAA0232C412B8E0927FC9AF67F07DD8B9D0208F7AC8C8A3202EDDA08071FA9A85B848E940C719FC0D18C107F41480F7A5CD333173FA527078A3DBA503AD3181E298E78EB8F7F4A7E78A8A423696E781F9D211E6DF106E55ED6084860A645F9B1C0009FF00E26BCB49768BF84331E3DFFC8AEEBC7B3B4DAA470139458F711938C902B8676512448003953BB3D6975348AD0CEBF94B48F939030067F0A7C40848101E79E7DBB7F3AA973832ED1DDAAE5BAA6E88B64E1573F4ABE8069DF5EAC569B5383B42B263D3BF35976767E748B2EDC8273834CBF9BCC658D460E0027D7D3FC7F1AEC34DD242D942A570C101CFF9FAD4CE5CA8D29C3998C96217FA57D96E20DAC9968A4423231EA0FF008D655A786AE0CC24976ECCF3B5813E9C035D8C362E17923A7715621D3C8CE718C62B1F6A6BECADB19D70C8ED6E967A64B1B42BB1594A9247BF3D2B46DEDF6CB84185621801DBD6AFC569E580A9E9F95588EDF6B038E6B3A93BB2E31515636F4F5C4233D00ACBD617E6383CD6CD9A620CFA0AA17F18690823AD67B21DCC07847D8FCCD8642A0E101E49C76CD6169D8B5BD135F6993B4DDF705C0FD7A7B575688D13614723350DC5AACFD720FA835AD39589946E79DEB9A13C97CF2582C851D98E0A10CA7FBA78C7EB53689A6C3650C8F730F9F348BB0444615477CE7F0E9FD6BB19ACE419D98C67A63201FCEA11A7B9C2F9617E8B5ABAB644AA47256DA1192F7CD84B2807A1E9FF00EAAE86D34F915C06E2B6EDB4E29D17DFA568C76AAA391584AA391AC62A25582D4C68334D994807D855F3803E954AE7EEF5E2B3436797F8B6355D4B3D770CF3EB50E8AFB59863E53824FA753FD2AE78C462ED0E39E39ACCB076F3C6DE4290CDE871FF00EBAEF87C28E297C4CDBB521636900F98290A71D307FF00AE7F2AF4FF0086F297D3664318091920B1C7DE04FF00435E57652A89CC647DECA1F4E73FE22BBFF879725756BA81E675DC372C3DB9E41FAE0FE94BA92F63D3D781D29E39A894B6F6CF4007F5A905333172683D69051914C60473D7AD325E23C0FD29F55AEE531C44AE3183938CFF009EB408F14F1649E6EA974FCE064291EDD7F1E2B909C39B862E8D948CEEFF0067AE3FF425AE9B5890B5CB3020EE6C9F61939FD3F9D7393A1967B92B9CED0304F6EBFC80A85B9AAD8C794EC9BB74357518AA2E4E3F7608C7D38AA12A933919E98156D46E8837A90A07A000568F6122C59C5F6FD72D61D800DCA08C7651CFF2AF54B6B5554418C00315E7BE0E83CED7259CAE4221C1F424FF00866BD4208BF76A3F9D73567A9D7457BB720DABD08FCBB55AB7B632638E3B1356A0B3030C719AB623201C2FE15CF76CD8AA2158C6001EA4D44542F723356AE488D49ED8AA11CA65954678F4A6910CDBB77DB0800718AA17926651CF06AEC6008F3DC75ACCBDC162DDE98F949D220C03639A47B539DC076E98EB49673AB8033C8AD209F2F149262463F920372307D875A155700E00E6B4DE10DD4039A85ADC76519ED4EECAB1122E45388E318F6E29C5368EE2A366A56195DC6DEE6B3EE986D26AFCAC0FA5655E3ED5342259E7FE2D5266857258F4C9ACEB23F6784B6C25DC95EBDB23B568788CBCF7D0AC6A4ED3938A8DD634D2B718C896362413C601618FAFFF005EBBA1F09C337EF0C59002C3180486EBD08E723F115DBF82EEA287C43019039927558D36F41CE7F901F866B8711864B9DA371E001D3B13FD2BA4F0EEA2B677F04B17CAA55947D31C2FE6052067BB2F53C73D339A77E151C6FB914B0C311923D2A4F4A666373452027D6807DA980639ACDD524F22DA593246C8D8E47D2B489C7715CFF89E66874AB9298DDE515E3BEE3B7FAD211E3B7249DEC402467073F9FD7D6B0255522465DC15DFAFB607FF005EB72E9D44130CE76F2B8FA1FF00EB566A444C31C6794326723B1A989A981273712718F98F356958F951B6707249E3D31513206B9988000C9E95619018A3183F7481C77AB608EAFC070A8826948E4C9B4FE03FFAF5E8F6CA08C9C579E781980B161DCC873F90AF44B6E8A735CB53E23B21F0A2EA647B5498551D8D31581E287C1E9F4ACD22AE65EA8E64DAA0F06A2B18FF007C39E946A65A1C38048079F6AC68B51961BB59180FB3B36372B676FA647A556E3477291FEEC63D3B565EA48163EBEC2A38F5801766FF00CEB9ED675BB8FB4A25B406E1B76319C28FA9C53E50BB3454BC256452719C1AE92D27134401EB8ED5C9C7765EDC2C89B1F3C8F7ADEB14291291DBA52416359C2AFF00FAAAB31C1C81C54DBF28323AD577E3239C1A624C63C808C77AAB21001C54AC7BF7AA92BE01A963B95E7248201DBD81F4AC4D4AE0E0AE6B46EA70AA4935813B6EDF29CE0538A224CE76EDD7CF676505C48B83CF400E47EA3F2AA1772131B21623E60307A0E6A5BE97263C1E5B24F3EF8FE95465977BB9E33C100FD715D8B45638DEF72DC5BDE57D87E729BB8E3FC9E95AFA35C324F096C048A456CA9C13B72A3FCFD6B2A372668C0CFDC20363EA71F9D59D3C1C31CB139238FF00BE80FCC54319F46DB4CD3DB47338DACE0311E99A9AB3F44BB4BED260B88B1E5B2ED4F7038CFE957F3CF4AA31199A09E69A0D2E7DA9808DEC6B93F1A3AFD8638830DCF2807E6C6303767F415D5B363B66BCFF00C71260C7924AAC52B6D1EBB4007F3A4F61ADCF3B62248954823737240CEDE493FA03562184F92248B06444DE540C8DC09393FE7151C50B308496643812165E703D7E98AD0B89B6346B27CB343122EDC1C361B71191D38273F4A2068CE3E2B7132C8EBD4B8EBEE3FC69D32E2653C8620B7A75CD6B58C3E5C4E14EECB02A31C1E847BFAD51B985BCB8E4EE548FFD0AAA4246BF82A4D90B2E7F88E7F4AF4AB57FDDAE0D796F873FD16F2783703E5CA5770E879C7F4AF46B29434639ED5C957E23AE0EF1360371D69EB9E31D2A9AC9CD4C25C2D65734424F0A499CD64369CB1CAC4004370463AD6AF9B93C1C521C1393C9CD34D85D9813694F1C83CB72A87B7A55C8EC04516D50093C938AD17DA3B71D8D3D5D5B04F5F6AAE60D519B0E9AB1319580321EF5BB6CA046147A5572CA480BFE454B1BED18CFE54AE372B939F97F0A81CF5F6A1A6E383F8D47BB83C8345C444E7BD67DC498CE2AE4AF80702B2AE5F27838A057285C31964C7E159BAA3AC163236EC00B8AD40B8C935CB78AAEBCBB2F2C1E58D5C15E46751D91C92CED23B33B64649C7A75A739C4718C7248C9EF55E3E0376E31561983CC81FBB0CFD2BACE52F24AC97402F51D33EFC568D8A6C0E11F6904727A1E0AD65C608BB66E07CDB71F4FFF00556A5ABFEFC92088C6EC0F501BA7EB5948A47BC786678A5D1A04836F95122C6BB47B03FD6B6335CBF81020F0E41B776F3B9DF7633CB103FF0041AE9F356B6327B910EB4E1CD3475A75310C7EBBB2381819AF34F1EC8CB2DC2A8C8484027AFDE7FF0005AF48973B78E9C7F3AF2AF1DCBBE59986007291B7D473FE7EB5322A3B9CCD913E6DBE5BAA2AFDEC6011EB51EA132F9E240D9DCEE473D46D23FAE3FC9A75BCA0488EC08310C8E3AE07FF005EAA4A15A5815DB6FCDF78F75C81D3F0A517D0D1A2F6E1069B21036B6E080A81C104F438C8A92CECD6FED2D238C7CC41000192724E703AFE159F7770F25AB82F23440E06E38C9209CFEB56B48BB9205B3957831B10BC75392467F2AA6C1223B1B592CAFDD5F20C88B30F7079CFEA6BB4D365DC8077F7AE76778E3F2811B9C288FCC04FF0FCA47FF5FDAB574E9F8193C9EB58D546D49E87471C80A13E86A29EF16343B9F00D323707E51DC557B8D2E2BB426519C76AC11B32ADC788A38BE4870C47526AA2EBCD203B98FD3351FF00645BDBCE774791938E78A7A69B6AE06DDA091D368EBE957689D14E28B11EB4E89C49C74E7B5346BAEA770933F5FF000A85F488B8C2A904919E7823F1A8BFB153395E8C33904FF8D3D0D3951AD17896371B5D71DB766B560D4A09103248083EF5C97F6542990ED8C7704FF8D3ADB477798149A644F66FFEB516463529E9A1D92CEAE383CF5A76EC63F9D66595B4B6D847959C1E84F5ABE5829C9FD6A0C6E4770FF29E6B31CEE735666977038E9F5AAAC703B7BD022B5CCBB16BCEFC4B75E7DF2C59E13935D9EAD74B142E73800135E6B75299EE1DC9E58FE95D1463D4C2ABE8350123DC9E6ACC58FB5AEEED9FFEB543183B947A735341822590F2318CFA135A9916EDD83CF193C6E39271EE6B6234297AEAEE3CB00F7C751B8D6342DE5344A31B7393EFDBFAFEB5B911CDCAA3024B46197D0F016B39148F52F8792B1D3E53236199822A67F8464E7F36AEDEB80F87970CC2589D46D3F34673C8CF18FF00C77F4F7AEFEAA1B194F721A5E7149C7E3413DEA892398F615E39E3594BCF72E49DBE771F5D82BD7E76C444F19E86BC63C44C2569B072259599571D3E5031FA5448A86E663398D0FCA388CE48FD3F91FCEA85D3B0B88F0436114FCBD86338FC335A976BD132C0BE00C7B671FD6B2E4559257651C12768CFBE31FCAA606AC9AE8811ED2BB467B0E723029BA63FFA1C4493F2C9EBE9FF00EBA4BA7023525B86CB11E849C63F95456A0A5A940E3990807D79029F40EA5DB99CC4EC01DE3CC663F42C4FF5AD6B19864633EDCD62DFFCF6D23A46030620EDFF007548FD71F9547A36A1BD40CF4A992BA2E0EDA1E836D38DA327AD5D5982E39E0D60D9CFBD063AE2AF2B12BCF06B99A3A23A9766092F256A8CB6FB0F991641F6AB11C99183C76AB4912B0F5A69969B8EA8C56BA70A50249FF7C9A58DE7917626541F515B46D727E418F6A05A763C1EBCD55CBF6B232A1B1E417209AD28904200ED4F3084E323A7E3514BF28072400324D2B99B6E5B960C814E73504D312324F14D76017AF5A82570133D7142258D6724120D55B99FCA88EE2071C9A63DC80084E7079AC1D5AFFCB8CEE6C9FE1515495C86EC63788352695DA25638EA7E95CD460B364D5FBB62C8EEC7E66FE55561421067BD75C5591CADDD8F51F2B135623052D30320BB723D47D3F1A89810BC6793DAADBA2AC8911380831F8F7A4C07B20FDDB01D17775E9C9FF0AD890FFA4DB3003985473EBCFF008D66AC2A5910B603A80091D0900FF5C5694AD199932472318518EDFE359C8A47A07C3DBA686FA481B0C1E1518EE30428FF00D08D7A503C0ED5E55E092A9ABC462619914820F61BB3FC80AF551D2AA1B19CF721E7D68273C76CD20CFF00FAE9923103A81EF8AB20AD7B2E23703A62BC735205DE366E76BBB119C7427FA0AF5FBB5D966E73F3107923A5793DF2E55815CE4E14F42096CFF4C56750D20B532EF59BCD088DF2A1E09F5C7FF585505DE020C138DCF9E9E9FE157AE170D21D99C0C8C0C75E7F92D578B68312A83F7792C7BE454C7634643A815DB2009B7070A076E87FC6A3B4DC2D23C80769F4F534E955DC2B70566942827AF7FF00E285229D9163072393FAD35F087502AC9E66F620008460FAAE7F90AE7D266B1BD2533B33823DABA5B8DBE5B73F20F2C9F5DA030CFEB5CE4F16E988200C11F8D5404CEC34BD495954EEE0F7CD74D05C86407391DEBCDA3826B0413C399206FBE3BAD745A5EACAA1496DD19EFE9595487546D099D84656594A1FBB8CD6B5BED4555049F7AC1B5B8472AE08208EB5B16F3AE3D41AC4DD4B435530101EDF9D2328EA3AE3BD4227CA8DB8A1E638233CD6845C8244064279CD41263041E9EF4F96620F5AA52DC2AE79A8686D8E99D513A8FC6B22E6EF92A0FEB55AFB52DEE510F3ED58F717A1411B816EF9354A266E45CBDD456288807935CDC865BC90C8C4EDEC2AC2C32DE481E40760FD6A6961F2D70140C0FCAB68A48C9BB9897B1EF2B183DFF414CD9CE07D2AD4AAA70C3EF1E00F6A458B0517B935A5C8B0D821F3AE910827037903D075A79724B372075C1FCAA781771BB9FA2A8D8B8E71DB8FCA9AC8044594E324609F4C8A5B80F31C91B42594A8CE47F8FF002AB9C97B7C8CE1173EDC7350B33BDB5BBBB0E8573EB8207F222AC857FB540A33B157E6E7B11D7F4A4D5C0EC3C13F2F892152B905597AE71F2F1FA9C57ACAF0A39C8F5F5AF22F0883FDB96BC9C171D0FA8E7F957AE4400418C7E0288113DC8B351B633B987B629D8C1CFA52370064D59051D4CE6CE401828C76AF2A9D77CCA54EDDAC58678CE0803FC6BD3F589521D3E42481F2B7538E70715E6B283895B6C78504E777DEC0E47EB58D56694CC1BF0148049642DE9DBB5382F92A5C0E1474F4C7F914DBAF966C05C00E1573CF1D453D8816D709BB8770578E78FF00F5D4DFDD354B5332459162802F3C97C7E1CFF2A95221B09620AE09C1EBFE78AB76B1C725CC316E00ECCA923AF04D412968E1E07392DD3AF1DBF3AA4FDD06B52BDCC8A6CE3F2B3BBC9009F5F99BFA0AC9B827CE8E61D770C9AD5BA50B691718C33203EC071FFA11ACD9222F16C0C32A038CF7F5FC69C189A3734EC040A46548E869B75A535BB99AD480A4E4A76349A7B16456EC7D2BA0B70AEBB5BEE9A4DD9969686159EA72DBB84391CFDC3D47D2B7ED75C8FB9C7622A0BCD212419D8187AD503A73A636BE7D038FEB50ECCB4D9D3C7AE46C3EF80294EB28BD187D6B9636970A3FD503F46A3ECD7271FB861FF02A2C82ECDD9F5B50325C7E159377AA4B382158A27A9A80585CB939454F73532691920C8C48A34426DB33FCD7932910383D4E3AD58834E2EDBA5E7D056B4362A806D518F7AB896859771C003A9A7CDD8563305B844E074E959F7CE173086049E58FAFB7F3FCAB5EF1D62858290A83966EFC56073302F91990ED507AFF009FF03EB570D48915628CCB360676F61FE7DB34E8D8A4D24F92AB18241DB904E3A7356E006DEDE572C143021B70FE01D7F51F862ABCA85EDD50A8569A40C7D391BB8F6C1157622E3A50B6F65147E62BF9A4B6F008DC0719E7E83F3A86550A046E014DB9041E7D0FF2356EE7C9FED68E36C985155381C03EBF9540228D59F7FCC481B467D473FA134BA8FA0E9230B6483D31E839CE4D5A914C6CA1470EAA173DBFCE69972AA2D4A2804A119C8E9C014F752D05BC80925481CFAFBFE669A11D2F85F1FF000905A7CC42960013C63048AF608D81504742339AF1FD086FD6EDD623F302324F193827AFD4D7ADC0E0AAAE082001CD11DD913E8358F047AF1C554BDBD8EDA3DCE4939E157A93E83FCE2A3BFBFF00B347F202D21FBA3D6B9BD435BB4D3B749753A4970470991C536C9485D62E4C88AF74FF003B021211D101FF003D7FFD55C620260DF9C3301B413DC927F9014A9AD9D53519796395638F4C038FE74E9322DD4EDC95C672318017193FAD72D47A9BC1192C0BC854725892A4FBE48FE8295C6F711F6321F988E87A7F4A7ED3E76707EF0E83D29F805E318CED66FE59A24F4348AD48E346FB6AAC6082542127B118FF000355D943A315CF55E481EA01AB8C196FCE3FE7A9CFA01F37FF005AA0642609029F9B2CA09EC41C8AA8BF7497B99F2EE6B425B9DA40504704F27F9565CE821DADBFEE921B3DB93FFD6ADC9016495CA67203A803DC1FE59AA1244ACBB76861F77681E871FCA88B0689F4D39E0E01FF0038ADFB56C1C7715CD697827CADE32A3E520F55FF00EB74AE8615906378CFA106AA4389B50B7001E6A6FB2C52F206D3546D98F42083EE2B46227838AC99630E99E983FA527F67383F74FE157D1FA0E87D0D4BBA90CCD1A7BF6434F5D3CF7C0ABFE61EE4530C9926988896DA28C6719FAD51BC6DF95CE029E7157667C2FF004AE6F5996499858C2482FF00EB58740BE9F8D34061EA573F6C9CC71B05B643CB0E431FF3FCA9DB8C7006FB9B94AAAFA2F720FE5F8E2A298A2DD886353B23F97EA7DFE9FE154350B95C32AB1E9B54E78C7AFE3FE15D113196E4F757BBD0242B827EEE7206318518E9D031FC7DAAF44A897F6D0A37FA904ED7E7191900FE7597A640B73A8C08D1B88DE4DCE3AE1477E31CE3BD6CCE19B549DCB654A6D66E3E523F1E9F375F7AB332859BFF00A548F21CACA33CFA1271F960549222FF000B1C838231F5FE94F4F2CB9D9803C91C679E493FD4525C45BA527710370E3B9F6FD6A1FC45AD8B4B133DACCECEA9B6438CE72D800E3F315096DD1840DF7DC9C8EC011FFD71565509B6DDC79664738EB8F947F9FC2A0F20C50C09C8909618F4C37FFAE9ADC93A1F0B488BE248CEE0B1E01DD9C00D823AFE22BD720649620E98C119231D2BC21A7FB344F2AB60349B5587B7BD6F697E3FBBB1991268C5CC4142AFCDB48C7BFE7493D58A4AE8E7AFBC51A85DEE77B97E9FC2703FC6B06E2FE4652ECC4B1E013D6A02C4A13938278AAEE1A4271D01C035A5921236FC35239BA9C67EF4473F5C81FD4D759711B3C73B27CABDC673C13D3FA5737E188BCBBBE5401B4AE4FAF15D2E3F712127EF827F3C571D67EF1BC3633ED94B3A85CFDEE3BE48A9CC4934F1850146E5FD4D36DC856F33071BFF00BBC74E7F9D5A8A126252149E149C7B11512D4A89525037BAEF6C8989031C76AAE4925D76F218E41FAD5D847EF66DB93966EA71C6EFF0E2AB73F68B823E604B7DEEC074FE9577158A81765C2C648CEE68CE0E323EED564522E1E273921803C6707B73D3B1FF00BE6AEDD44C92CAA7A29DD91FAFF2355AF30645B9042FCBF39C018E7AFE0DC7E3496E37B5CCBBB8A4B5945C44CC9CE7207DD63FD0D6E68FAAA5D6D85C20908FB9BB9FC299140B3C4CB22AB29F9587F74D73FAAE9F73A5CFE7C4CE6327E5909395F6CF5FC6B68DA6ADD487789E8D0A71EDE87AD5C4523EEE7F1E6B90F0EF8C2190ADAEA4CA92741291853F5F4FAD77F1246E80EDE31DAB2945A76669169AD0AA038C647E34F00FA77ABCB0A8C71C7BD482DD0F25706A4AB99DDFDE9C1588E109AD216A99C8CD3FECEA0727814C5739EBD636F04933E42A0E83B9AC29D4699A6CD7736DF3DF939E0B31E95B1AF5EDADA481AE2458E283E662472CC72001EE003C7B8F4AE0755F10CBAC3315411DBABE6319E7EA7DF9FC2AE116F526522B34876F272E41DCC3B9CE7FAD67B1F3A70A0719E95649668F2A0E07CA3D493D07F3A6429E4B79A0E0E4ED38C7415BA3266E691E6192078651E5C48C1811CB2B1DBFA75A2460B7124854C8990EC17A7D4FB7DDAAFA23C66DCEE0C240D8E0E323827FA53E4977898A9DA08380DD79238FD2AAFA9059D2B649889705B009CFA641CFBF5A9EFA2517088010DCFCA4F56C0C63DB83597A7CCF6770B2272C0000B703AE467F215AFA84A2EAE5A60A1431F31483E8B85F7CF5CD4BDCAE8351E48F4C064198C4857039383FE1FD2985B74B12EEF982BCB93F53F974FF003C548C55B490C9BB2C58B64FD7D3DB9E951427E52CE320205183D998D1D40A5A9C822B74C1F965264C63A76C5648B86C019F989FD2ADEB127957A226395190011D89FF00EBD65BB04B8723B1E3DA9C50996090173C0C543066423209E72066A694928ABB0658827DA9131146FF00DE247E03FCFF004A7724DDD0A43F6C958F2AA157E9C8AE99D374640C8509CFD723A7EB5CCF8743289CED042BA120FE24FE5815D344CAF1919001CF4EBD335C553E2378EC5242BB48DE485738047622AFDACA05B123B2633D0FDEC715980ACCB93DDF9F6E2ADC64790474F971F8EECD4B65D882062F2008416DC41C718EF505AAB1BF92260332380327D463A7E152DB63CD18E0E7A8FD69B3C4FF006E693EE1C0238C647FFA9A84F51D89EE200079A0970A3E6FF3F5359D8CA35A3901304AE3A60F5FF3F5AE8A4884F24A848DAEB81B463031FF00D6AE72E63730798B26D9231CF3F7481C1FCB8FCBDEAB71058165778C86322F55FEF0F6FC2B584105DC06174DD1B0230C2B363DB70AAE9C3E307BF3E9C76AD6B271F7640473C91D47BD09EA16BA380D77C3B75A44C648C3496AC7E571C91EC6B47C31E33B9D1CADBDE6F9ACFA01D5A3FA67B7B7F2EFE846D63BA85A09D51E261821864115E73E2AF0CCFA34A67854C966DC6EC64A7B1FE86BAA3353569194A2E0EE8F5EB0BFB5D46D52E2D26496261C32FF0023E87DAAE8230066BC0BC3FE21BCD02F84D03168D88F36227871FD0FBF6AF6ED2F54B7D5AC22BCB66CC720C8CF507B83EE2B2A90713484948D304002B9EF14F8B6CBC3B06D6C4B76E3290A9E7EA7D0543E2DF13AF87B4D0C837DDCD95854F41EAC7D864578B5CDD4F7D7325C5C48D2CAED96663924D553A7CDAB26A4EDA22CEA9AA5D6AF7AF7572E0B487381C01F4157ECADF10B39C811AFE39EFF00E152D9F87645D364D4EF479712AE238C8E59BA0CFA0CD684302A6964918257713D3927A7E55A4E4B644462F7664F96C5A355C839CFE3FF00EBA8EF1963B60AAC7AFDDFEB575846B23120E046304F504E78ACABF94B1033C0038FF3F8511091A7A6480D82A77123373FC5D07F5A125530B2B020FDE1F91FF3F9D53D3C95B26704EEDC7BF62075AB6A159546DC12B9E7AF4349BD44B624538B6DE012700107D01E956A2B9693058AE41C1C74C1EC07E26A3B41BA30B8C8C63A679CE2AA47986E1E2381B720107D3BFBF152FB948E863DABA7950BC97CE718EA3D3E869B6332887693B76A7CC587E9FCEA45188FCC04EC6849E46406E7FA6DAAB19DB6F390C0862A83EBD33F950D89239BD5662D7AF2062D939CFB8AA8011DF9EF524D99672D8C0249C7A7D286504E003903FAD6D15A10
Si te fijas al inicio de la ultima cadena tiene
​​​​​​​3F01822F6FF
porque habra hecho eso?

Hay 2 3F01822 el que saque la primera vez, y el que esta en el medio

​​​​​​​Es a partir de ahi la imagen me parece
thumbnail
Nicolas Piquerez, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 62 Fecha de incorporación: 3/10/16 Mensajes recientes
Eso no debería ocurrir, se me ocurren un par de posibilidades, que haya algún error de programación al manipular el string o no hacer la secuencia de READ_BINARY correcta.
¿Siempre te da el mismo string?, el primer string tiene un tamaño sospechoso de 510 caracteres (0x3FC), que se corresponden a las 4 primeras llamadas de READ_BINARY, asegurate que la iteración de READ_BINARY se hace correctamente, debería continuar con 

00 B0 03 FC Le=FF
00 B0 04 FB Le=FF
00 B0 05 FA Le=FF
00 B0 06 F9 Le=FF
... etc

​​​​​​​Saludos
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Finally!, Pude obtener el String correcto d ela imagen. Limpie el codigo llevandolo a una Funcion solo para el ReadBinary de la imagen.
Lo que pasaba es que ejecutaba un Comando y luego entraba a la funcion y ejecutaba nuevamente, entonces ya habia traido data + data

por eso se duplicaba esa primera linea.

Cuando limpie bien el codigo te lo comparto para que bueno tambien quién llegue aqui sufra menos, o te gusta que sufran? jaja

Ahora me toca ver lo de Firma Digital, entenderlo aun.

Puedes explicarme bien cual es la Finalidad?

Firmar PDF? la cedula tiene un Certificado adentro? o como sería el tema.
​​​​​​​Muchas gracias por todo finalmente.
Maximiliano Cesán, modificado hace 5 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensajes: 12 Fecha de incorporación: 30/08/18 Mensajes recientes
Una consulta general, capaz tu puedes revisar el codigo o saber porque sucede eso.
En todos los llamados que yo hago de Select File, jamas recupero el TLVTemplate. Solo obtengo respuestas 6114 6115 6116 
Y con eso hago un ReadBinary.
Eso me ha complicado para recopilar los datos pero me las ingenie de otras maneras.


Te dejo como quedo, aunque me falta la firma Digital, como pruebo el pin con una cedula real? de donde se obtiene el pin?

https://image.ibb.co/h8mgxK/image.png
Jhollman Chacon, modificado hace 4 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Youngling Mensaje: 1 Fecha de incorporación: 24/08/19 Mensajes recientes
Hola,

Leer la Cedula Uruguaya, sin tener conocimiento previo del tema, fue un verdadero martirio.
​​​​​​​
Pero finalmete pude hacerlo y para evitarle a futuras victimas pasar por este infierno les quiero compartir mi solucion:

Esta hecha con Visual Studio 2017, .NET 4.0 (100% compatible con XP) y C#.
Pueden bajarsela desde aqui:
https://github.com/BlueMystical/Cedula-Uruguaya-con-SmartCard-.NET

Saludos.
thumbnail
Francisco Perdomo, modificado hace 4 años.

RE: Leer Cedula Electronica .Net Framework SmartCard

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Excelente! Agradecemos tu aporte, muchas veces queremos meterle y sacar más casos con diferentes lenguajes pero no estamos pudiendo cubrir tantos proyectos a la vez.

Gracias nuevamente por aportar a la comunidad, 

saludos!

​​​​​​​Francisco