Está en la página 1de 347

Escribir Aplicaciones Avanzadas para la Plataforma

Java
TM
Como desarrollador experimentado sobre la plataforma Java
TM
, indudablemente
sabes lo rpido que evoluciona esta plataforma. Sus muchos Interfaces de
Programacin de Aplicaciones (APIs) proporcionan una gran cantidad de
funcionalidades para todos los aspectos de la programacin de aplicaciones y nivel
de sistema. Los desarrolladores del mundo real nunca usan uno o dos APIs para
resolver un problema, sino que juntan la funcionalidad clave de la expansin de
varios APIs. Conocer los APIs que necesitas, qu parte de esos APIs necesitas, y
como los APIs funcionan juntos para crear la mejor solucin puede ser una tarea
intimidatoria.
Para ayudarte a navegar por los APIs de Java y acortar el tiempo de desarrollo de
tus proyectos, esta seccin incluye las fases de diseo, desarrollo, prueba y
despliegue para una aplicacin de subastas. Durante esta aplicacin de ejemplo, no
cubriremos cada posible escenario de programacin, explora muchas situaciones
comunes y la discusin te dejar con una metodologa slida para disear y
construir tus propias soluciones.
Esta seccin es para desarrolladores con un nivel un poco alto de entendimiento de
la escritura de programas Java. El ejemplo est escrito con los APIs de la
plataforma Java 2 y explica en trminos de funcionalidad el cmo y el por qu,
por eso, si necesitas ayuda para instalar la plataforma Java, configurar tu entorno,
o conseguir que tu primera aplicacin funcione, primero deberas leer las secciones
anteriores de este tutor...
ndice de Contenidos
Concordar los Requerimientos del Proyecto con la Tecnologa
Requerimientos del Proyecto
Elegir el Software

La Aplicacin Casa de Subastas
Una Aplicacin Multi-Fila con JavaBeans
Beans de Entidad y Sesin
Examinar un Bean de Manejo de Contenedor
Mtodos de Bsqueda de Manejo de Contenedor

Manejo de Datos y Transaciones
Persistencia del Bean
Manejar Transaciones

Mtodos de Bsqueda de Manejo del Bean
Clculo Distribuido
Servicios de Bsqueda
RMI
CORBA
Tecnologa JDBC
Servelts

Tecnologa JNI
Ejemplos JNI
Strings y Arrays
Otros Problemas de Programacin

Proyecto Swing: Construir un Interface de Usuario
Componentes y Modelos de Datos
El API de Impresin
Impresin Avanzada

Depuracin de Applets, Aplicaciones y Servlets
Recoleccin de Evidencias
Ejecutar Tests y Analizar
Depurar Servlets
Depurar Eventos AWT
Analizar la Pila
Problemas de Versiones

Tcnicas de Rendimiento
Aumentar el Rendimiento por Diseo
Trucos de Conexin
Caractersticas de Rendimiento y Herramientas
Anlisis de Rendimiento
Enlazar Aplicaciones Cliente/Servidor

Desarrollar la Aplicacin Subasta
Archivos JAR
Plataforma Solaris
Plataforma Win32

Ms Tpicos de Seguridad
Appelts Firmados
Escribir un Controlador de Seguridad
Apndice A: Seguridad y Permisos
Apndice B: Clases, Mtodos y Permisos
Apndice C: Mtodos de SecurityManager
Eplogo
Ozito
Concordar los Requerimientos del Proyecto con la
Tecnologa
El desafo de escribir un libro sobre el desarrollo de una aplicacin avanzada para la
plataforma Java
TM
es encontrar un proyecto lo suficientemente pequeo, pero al
mismo tiempo, los suficientemente completo para garantizar las tecnicas de
programacin avanzadas.
El proyecto presentado en este libro es una casa de subastas basada en web. La
aplicacin est inicialmente escrita para la plataforma Enterprise JavaBeans
TM
. En
los captulos posteriores expandieremos el corazn del ejemplo descrito aqu
aadiendo funcionalidades avanzadas, mejoras y soluciones alternativas a algunas
de las cosas que obtendrs gratis cuando use la plataforma Enterprise JavaBeans.
Para mantener la explicacin sencilla, la aplicacin de ejemplo slo tiene un
conjunto bsico de transaciones para poner y pujar tems a subasta. Sin embargo,
la aplicacin escala para manejar mltiples usuarios, proporciona un entorno de
tres filas basado en transaciones, controla la seguirad, e integra sistemas basados
en la legalidad. Este captulo cubre cmo determinar los requerimientos del
proyecto y el modelo de aplicacin -- pasos importantes que siempre deberan
realizarse antes de empezar a codificar.
Requerimientos de Proyecto y Modelado
Elegir el Software
Tienes Prisa?
Esta tabla te enlaza directamente con los tpicos especficos.
Tpico Seccin
Demostracin de Subasta La Subasta de Duke
Requerimientos del Proyecto Entrevista Base
Modelar el Proyecto
Modelado La Casa Identifica Compradores y Vendedores
La Casa Determina la Mayor Puja
La Casa Notifica a Compradores y Vendedores
Alguien Busca un tem
Alguien Ve un tem en Venta
Alguien Ve los Detalles de un tem
El Vendedor Pone un tem en Venta
El Compador Puja por tems
Diagrama de Actividad
Elegir el Software Los APIs de Java
TM
Ozito
R
e
q
u
e
r
i
m
i
e
n
t
o
s

d
e
l

P
r
o
y
e
c
t
o

y

M
o
d
e
l
a
d
o
E
l

p
r
i
m
e
r

p
a
s
o

p
a
r
a

d
e
t
e
r
m
i
n
a
r

l
o
s

r
e
q
u
e
r
i
m
i
e
n
t
o
s

d
e
l

p
r
o
y
e
c
t
o

e
s

l
a

e
n
t
r
e
v
i
s
t
a

c
o
n

e
l

u
s
u
a
r
i
o

b
a
s
e

p
a
r
a

s
a
b
e
r

q
u
e

s
e

e
s
p
e
r
a

d
e

u
n
a

s
u
b
a
s
t
a

o
n
-
l
i
n
e
.

E
s
t
e

e
s

u
n

p
a
s
o

i
m
p
o
r
t
a
n
t
e
,

y
n
o

p
u
e
d
e

p
a
s
a
r
s
e

p
o
r

a
l
t
o

p
o
r
q
u
e

e
s

u
n
a

b
a
s
e

s

l
i
d
a

d
e

i
n
f
o
r
m
a
c
i

n

q
u
e

n
o
s

a
y
u
d
a
r


a

d
e
f
i
n
i
r

l
a
s

c
a
p
a
c
i
d
a
d
e
s

c
l
a
v
e

d
e

n
u
e
s
t
r
a

a
p
l
i
c
a
c
i
o
n
.
E
l

c
a
p

t
u
l
o

2

p
a
s
e
a

a

t
r
a
v

s

d
e
l

c

d
i
g
o

d
e

l
a

a
p
l
i
c
a
c
i

n
,

e
x
p
l
i
c
a

c
o
m
o

t
r
a
b
a
j
a

l
a

p
l
a
t
a
f
o
r
m
a

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
,

y

n
o
s

c
u
e
n
t
a

c

m
o

e
j
e
c
u
t
a
r

u
n
a

d
e
m
o
s
t
r
a
c
i

n

e
n

v
i
v
o
.

S
i

n
u
n
c
a
h
a
s

v
i
s
t
o

o

u
s
a
d
o

u
n
a

s
u
b
a
s
t
a

o
n
-
l
i
n
e
,

a
q
u


h
a
y

u
n
a

m
a
q
u
e
t
a

d
e

l
a
s

p

g
i
n
a
s

H
T
M
L

d
e

l
a

a
p
l
i
c
a
c
i

n

d
e

e
j
e
m
p
l
o
.
E
n
t
r
e
v
i
s
t
a

a
l

u
s
u
a
r
i
o

B
a
s
e




M
o
d
e
l
o

d
e

P
r
o
y
e
c
t
o




E
n
t
r
e
v
i
s
t
a

a
l

u
s
u
a
r
i
o

B
a
s
e
P
o
r

l
a

d
i
c
u
s
i

n

y

p
o
r

m
a
n
t
e
n
e
r

l
a
s

c
o
s
a
s

s
e
n
c
i
l
l
a
s
,

e
s
t
a

e
x
p
l
i
c
a
c
i

n

a
s
u
m
e

q
u
e

e
n

l
a
s

e
n
t
r
e
v
i
s
t
a
s

c
o
n

l
o
s

u
s
u
a
r
i
o
s

b
a
s
e

s
e

e
n
c
o
n
t
r
a
r
o
n

l
o
s

s
i
g
u
i
e
n
t
e
s

r
e
q
u
e
r
i
m
i
e
n
t
o
s

p
a
r
a

l
a

c
a
s
a

d
e
s
u
b
a
s
t
a
s
:
R
e
q
u
e
r
i
m
i
e
n
t
o
s

d
e

l
a

C
a
s
a

d
e

S
u
b
a
s
t
a
s
I
n
f
o
r
m
a
c
i

n

N
e
c
e
s
a
r
i
a

d
e
l

C
o
m
p
r
a
d
o
r

y

V
e
n
d
e
d
o
r




N
o
t
a
s

d
e

V
e
n
d
e
d
o
r
e
s

p
a
r
a

p
o
s
t
e
a
r

t
e
m
s




G
r
a
b
a
r

e

I
n
f
o
r
m
a
r

d
e

l
a
s

t
r
a
n
s
a
c
i
o
n
e
s

d
i
a
r
i
a
s




R
e
q
u
e
r
i
m
i
e
n
t
o
s

d
e
l

u
s
u
a
r
i
o
P
u
j
a
r

p
o
r

o

V
e
n
d
e
r

u
n

t
e
m




B
u
s
c
a
r

o

v
e
r

t
e
m
s

e
n

v
e
n
t
a




N
o
t
i
f
i
c
a
r

l
a
s

v
e
n
t
a
s

a
l

v
e
n
d
e
d
o
r

y

a
l

c
o
m
p
r
a
d
o
r




M
o
d
e
l
o

d
e

P
r
o
y
e
c
t
o
D
e
s
p
u

s

d
e

a
n
a
l
i
z
a
r

l
o
s

r
e
q
u
e
r
i
m
i
e
n
t
o
s
,

p
o
d
e
m
o
s

c
o
n
s
t
r
u
i
r

u
n

d
i
a
g
r
a
m
a

d
e

f
l
u
j
o

d
e

l
a

a
p
l
i
c
a
c
i

n

p
a
r
a

o
b
t
e
n
e
r

u
n

m
e
j
o
r

e
n
t
e
n
d
i
m
i
e
n
t
o

d
e

l
o
s

e
l
e
m
e
n
t
o
s

n
e
c
e
s
a
r
i
o
s

e
n

l
a

a
p
l
i
c
a
c
i

n
y

c

m
o

i
n
t
e
r
a
c
t
u
a
.
U
n

d
i
a
g
r
a
m
a

d
e

f
l
u
j
o

m
u
e
s
t
r
a

l
a

r
e
l
a
c
i

n

e
n
t
r
e

l
o
s

a
c
t
o
r
e
s

y

p
r
o
c
e
s
o
s

d
e
n
t
r
o

d
e
l

s
i
s
t
e
m
a
.

U
n

p
r
o
c
e
s
o

e
s

u
n
a

f
u
n
c
i

n
i
c
a

e
n

u
n

s
i
s
t
e
m
a
,

y

u
n

a
c
t
o
r

e
s

l
a

p
e
r
s
o
n
a

o

s
o
f
t
w
a
r
e

q
u
e
r
e
a
l
i
z
a

l
a

a
c
c
i

n

o

p
r
o
c
e
s
o
.

P
o
r

e
j
e
m
p
l
o
,

u
n

c
o
m
p
r
a
d
o
r

e
s

e
l

a
c
t
o
r

q
u
e

r
e
a
l
i
z
a

l
a

f
u
n
c
i

n

(
p
r
o
c
e
s
o
)

d
e

p
u
j
a
r

p
o
r

u
n

t
e
m

d
e

l
a

s
u
b
a
s
t
a
,

y

e
l

v
e
n
d
e
d
o
r

e
s

e
l

a
c
t
o
r

q
u
e

r
e
a
l
i
z
a

e
l
p
r
o
c
e
s
o

d
e

p
o
s
t
e
a
r

u
n

t
e
m

p
a
r
a

s
u

s
u
b
a
s
t
a
.
A
u
n
q
u
e
,

n
o

t
o
d
o
s

l
o
s

a
c
t
o
r
e
s

s
o
n

p
e
r
s
o
n
a
s
.

P
o
r

e
j
e
m
p
l
o
,

e
l

s
o
f
t
w
a
r
e

e
s

e
l

a
c
t
o
r

q
u
e

d
e
t
e
r
m
i
n
a

c
u
a
n
d
o

u
n

t
e
m

s
e

h
a

c
e
r
r
a
d
o
,

e
n
c
u
e
n
t
r
a

l
a

p
u
j
a

m

s

a
l
t
a
,

y

n
o
t
i
f
i
c
a

l
a

v
e
n
t
a

a
l
c
o
m
p
r
a
d
o
r

y

a
l

v
e
n
d
e
d
o
r
.
E
l
U
n
i
f
i
e
d

M
o
d
e
l
i
n
g

L
a
n
g
u
a
g
e

(
U
M
L
)

e
s

l
a

h
e
r
r
a
m
i
e
n
t
a

q
u
e

s
e

u
s
a

p
a
r
a

l
o
s

d
i
a
g
r
a
m
a
s

d
e

p
r
o
c
e
s
o
s
.

E
l

s
i
g
u
i
e
n
t
e

d
i
a
g
r
a
m
a

u
s
a

U
M
L

p
a
r
a

d
e
s
c
r
i
b
i
r

l
o
s

p
r
o
c
e
s
o
s

d
e
l

c
o
m
p
r
a
d
o
r

y

d
e
l
v
e
n
d
e
d
o
r

p
a
r
a

u
n
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a

o
n
-
l
i
n
e
.
E
n

U
M
L
,

l
o
s

s
i
s
t
e
m
a
s

s
e

a
g
r
u
p
a
n

e
n

c
u
a
d
r
a
d
o
s
,

l
o
s

a
c
t
o
r
e
s

s
e

r
e
p
r
e
s
e
n
t
a
s

p
o
r

f
i
g
u
r
a
s

h
u
m
a
n
a
s
,

l
o
s

p
r
o
c
e
s
o
s

s
e

d
e
n
o
t
a
n

m
e
d
i
a
n
t
e

v
a
l
o
s
,

y

l
a
s

l

n
e
a
s

m
u
e
s
t
r
a
n

c
o
m
o

l
o
s

a
c
t
o
r
e
s
u
s
a
n

e
l

s
i
s
t
e
m
a
.
L
a

s
i
g
u
i
e
n
t
e

d
e
s
c
r
i
p
c
i

n

d
e
f
i
n
e

e
l

p
r
o
y
e
c
t
o
.

E
s
t
a
s

d
e
s
c
r
i
p
c
i
o
n
e
s

n
o

s
o
n

p
a
r
t
e

d
e
l

U
M
L
,

p
e
r
o

s
o
n

u
n
a

h
e
r
r
a
m
i
e
n
t
a

t
i
l

p
a
r
a

l
a

d
e
f
i
n
i
c
i

n

d
e

p
r
o
y
e
c
t
o
s
.
L
a

C
a
s
a

I
d
e
n
t
i
f
i
c
a

a

C
o
m
p
r
a
d
o
r
e
s

y

V
e
n
d
e
d
o
r
e
s
U
n
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a
s

e
s

u
s
a
d
a

p
o
r

c
o
m
p
r
a
d
o
r
e
s

y

v
e
n
d
e
d
o
r
e
s
.

U
n

c
o
m
p
r
a
d
o
r

n
e
c
e
s
i
t
a

s
a
b
e
r

q
u

e
n

e
s

e
l

v
e
n
d
e
d
o
r

a

q
u
i
e
n

t
i
e
n
e

q
u
e

p
a
g
a
r
l
e
,

y

e
l

v
e
n
d
e
d
o
r

n
e
c
e
s
i
t
a

c
o
n
o
c
e
r

a
l
o
s

c
o
m
p
r
a
d
o
r
e
s

p
a
r
a

r
e
s
p
o
n
d
e
r

a

s
u
s

p
r
e
g
u
n
t
a
s

s
o
b
r
e

e
l

p
r
o
d
u
c
t
o

y

p
a
r
a

f
i
n
a
l
i
z
a
r

l
a

v
e
n
t
a
.

P
o
r

e
s
o
,

p
a
r
a

p
o
s
t
e
a
r

o

p
u
j
a
r

p
o
r

u
n

t
e
m

d
e

l
a

s
u
b
a
s
t
a
,

l
o
s

c
o
m
p
r
a
d
o
r
e
s

y

v
e
n
d
e
d
o
r
e
s
n
e
c
e
s
i
t
a
n

e
s
t
a
r

r
e
g
i
s
t
r
a
d
o
s
.

E
l

r
e
g
i
s
t
r
o

n
e
c
e
s
i
t
a

o
b
t
e
n
e
r

l
a

s
i
g
u
i
e
n
t
e

i
n
f
o
r
m
a
c
i

n

s
o
b
r
e

l
o
s

c
o
m
p
r
a
d
o
r
e
s

y

v
e
n
d
e
d
o
r
e
s
:
U
s
e
r

I
D

y

p
a
s
s
w
o
r
d

p
a
r
a

c
o
m
p
r
a
r

y

v
e
n
d
e
r
.




D
i
r
e
c
c
i

n

d
e

E
-
m
a
i
l

p
a
r
a

q
u
e

p
u
e
d
a

c
o
m
u
n
i
c
a
r
s
e
l
e

l
a

p
u
j
a

m

s

a
l
t
a

c
u
a
n
d
o

s
e

c
i
e
r
r
e

l
a

s
u
b
a
s
t
a
.




I
n
f
o
r
m
a
c
i

n

d
e

l
a

t
a
r
j
e
t
a

d
e

c
r

d
i
t
o

p
a
r
a

q
u
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

p
u
e
d
a

c
o
b
r
a
r

a
l

v
e
n
d
e
d
o
r

p
o
r

l
i
s
t
a
r

s
u
s

t
e
m
s
.




U
n
a

v
e
z

r
e
g
i
s
t
r
a
d
o
,

e
l

u
s
u
a
r
i
o

p
u
e
d
e

p
o
s
t
e
a
r

o

p
u
j
a
r

p
o
r

u
n

t
e
m

e
n

v
e
n
t
a
.
L
a

C
a
s
a

D
e
t
e
r
m
i
n
a

l
a

P
u
j
a

m

s

a
l
t
a
L
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a
s

h
a
c
e

c
o
n
s
u
l
t
a
s

a

l
a

b
a
s
e

d
e

d
a
t
o
s

y

g
r
a
b
a

e

i
n
f
o
r
m
a

d
e

l
a
s

t
r
a
n
s
a
c
i
o
n
e
s

d
i
a
r
i
a
s
.

L
a

a
p
l
i
c
a
c
i

n

b
u
s
c
a

t
e
m
s

q
u
e

s
e

h
a
n

c
e
r
r
a
d
o

y

d
e
t
e
r
m
i
n
a

l
a

p
u
j
a

m

s
a
l
t
a
.
L
a

C
a
s
a

N
o
t
i
t
i
c
a

a

l
o
s

C
o
m
p
r
a
d
o
r
e
s

y

V
e
n
d
e
d
o
r
e
s
L
a

a
p
l
i
c
a
c
i

n

s
u
b
a
s
t
a

u
s
a

e
l

e
-
m
a
i
l

p
a
r
a

n
o
t
i
f
i
c
a
r

a
l

q
u
e

h
a

p
u
j
a
d
o

m

s

a
l
t
o

y

a
l

v
e
n
d
e
d
o
r
,

y

c
o
b
r
a
r
l
e

a
l

v
e
n
d
e
d
o
r

p
o
r

l
o
s

s
e
r
v
i
c
i
o
s
.
A
l
g
u
i
e
n

B
u
s
c
a

u
n

t
e
m
L
o
s

c
o
m
p
r
a
d
o
r
e
s

y

v
e
n
d
e
d
o
r
e
s

i
n
t
r
o
d
u
c
e
n

u
n

s
t
r
i
n
g

d
e

b

s
q
u
e
d
a

p
a
r
a

l
o
c
a
l
i
z
a
r

t
o
d
o
s

l
o
s

t
e
m
s

e
n

s
u
b
a
s
t
a

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
.
A
l
g
u
i
e
n

V
e

l
o
s

t
e
m
s

e
n

V
e
n
t
a
P
a
r
a

p
o
p
u
l
a
r
i
z
a
r

l
a

s
u
b
a
s
t
a

y

c
o
n
s
e
g
u
i
r

n
u
e
v
o
s

v
e
n
d
e
d
o
r
e
s

y

c
o
m
p
r
a
d
o
r
e
s
,

l
a

a
p
l
i
c
a
c
i

n

p
e
m
i
t
e

q
u
e

c
u
a
l
q
u
i
e
r
a

v
e
a

l
o
s

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a

s
i
n

r
e
q
u
e
r
i
r

q
u
e

e
s
t


r
e
g
i
s
t
r
a
d
o
.

P
a
r
a
h
a
c
e
r

e
s
t
o

s
e
n
c
i
l
l
o
,

l
a

s
u
b
a
s
t
a

p
e
r
m
i
t
e

q
u
e

c
u
a
l
q
u
i
e
r
a

v
e
a

u
n
a

l
i
s
t
a

d
e

l
o
s

t
e
m
s

d
e

a
l
g
u
n
a

d
e

e
s
t
a
s

t
r
e
s

f
o
r
m
a
s
:
T
o
d
o
s

l
o
s

t
e
m
s

e
n

s
u
b
a
s
t
a
.




N
u
e
v
o
s

t
e
m
s

l
i
s
t
a
d
o
s

h
o
y
.

t
e
m
s

q
u
e

s
e

c
i
e
r
r
a
n

h
o
y
.




A
l
g
u
i
e
n

V
e

l
o
s

D
e
t
a
l
l
e
s

d
e

u
n

t
e
m
L
a

l
i
s
t
a

s
u
m
a
r
i
z
a
d
a

e
n
l
a
z
a

c
o
n

l
a

s
i
g
u
i
e
n
t
e

i
n
f
o
r
m
a
c
i

n

d
e
t
a
l
l
a
d
a

d
e

c
a
d
a

t
e
m
.

E
s
t
a

i
n
f
o
r
m
a
c
i

n

e
s
t


d
i
s
p
o
n
i
b
l
e

p
a
r
a

c
u
a
l
q
u
i
e
r
a

s
i
n

n
e
c
e
s
i
d
a
d

d
e

i
d
e
n
t
i
f
i
c
a
c
i

n
.
S
u
m
a
r
i
o

d
e
l

t
e
m
.

m
e
r
o

d
e
l

t
e
m

e
n

l
a

s
u
b
a
s
t
a
.




P
r
e
c
i
o

A
c
t
u
a
l

m
e
r
o

d
e

p
u
j
a
s




F
e
c
h
a

d
e

p
u
e
s
t
a

e
n

s
u
b
a
s
t
a




F
e
c
h
a

d
e

c
i
e
r
r
e

d
e
l

t
e
m




I
D

d
e
l

v
e
n
d
e
d
o
r




P
u
j
a

m

s

a
l
t
a




D
e
s
c
r
i
p
c
i

n

d
e
l

t
e
m




E
l

V
e
n
d
e
d
o
r

P
o
s
t
e
a

t
e
m
s

p
a
r
a

s
u

V
e
n
t
a
P
a
r
a

p
o
s
t
e
a
r

u
n

t
e
m

p
a
r
a

s
u

v
e
n
t
a
,

u
n

v
e
n
d
e
d
o
r

n
e
c
e
s
i
t
a

i
d
e
n
t
i
f
i
c
a
r
s
e

a

s


m
i
s
m
o

y

d
e
s
c
r
i
b
i
r

e
l

t
e
m
,

d
e

e
s
t
a

f
o
r
m
a
:
U
s
e
r

I
D

y

p
a
s
s
w
o
r
d

p
a
r
a

l
a

i
d
e
n
t
i
f
i
c
a
c
i

n

d
e
l

v
e
n
d
e
d
o
r




D
e
s
c
r
i
p
c
i

n

s
u
m
a
r
i
a

d
e

t
e
m




P
r
e
c
i
o

d
e

p
u
j
a

i
n
i
c
i
a
l




D
e
s
c
r
i
p
c
i

n

d
e
t
a
l
l
a
d
a

d
e
l

t
e
m

m
e
r
o

d
e

d

a
s

q
u
e

e
l

t
e
m

e
s
t
a
r


e
n

l
a

s
u
b
a
s
t
a




E
l

C
o
m
p
r
a
d
o
r

P
u
j
a

p
o
r

I
t
e
m
s
U
n
a

p

g
i
n
a

d
e

s
u
m
a
r
i
o

d
e
t
a
l
l
a
d
o

p
o
r

c
a
d
a

t
e
m

p
e
r
m
i
t
e

a

l
o
s

u
s
u
a
r
i
o
s

r
e
g
i
s
t
r
a
d
o
s

i
d
e
n
t
i
f
i
c
a
r
s
e

a

s


m
i
s
m
o
s

y

p
u
j
a
r

p
o
r

e
l

t
e
m

p
r
o
p
o
r
c
i
o
n
a
n
d
o

l
a

s
i
g
u
i
e
n
t
e

i
n
f
o
r
m
a
c
i

n
:
U
s
e
r

I
D




P
a
s
s
w
o
r
d




C
a
n
t
i
d
a
d

d
e

l
a

P
u
j
a




D
i
a
g
r
a
m
a

d
e

A
c
t
i
v
i
d
a
d
E
l

d
i
a
g
r
a
m
a

d
e

a
c
t
i
v
i
d
a
d

m
u
e
s
t
r
a

e
l

f
l
u
j
o

d
e

t
a
r
e
a
s

d
e
n
t
r
o

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

c
o
m
o

u
n
a

t
o
t
a
l
i
d
a
d
.

E
s
t
e

d
i
a
g
r
a
m
a

m
u
e
s
t
r
a

l
a

a
p
l
i
c
a
c
i

n

s
u
b
a
s
t
a
.

E
l

c

r
c
u
l
o

n
e
g
r
o

d
e

l
a

i
z
q
u
i
e
r
d
a
m
u
e
s
t
r
a

e
l

p
r
i
n
c
i
p
i
o

d
e

l
a
s

a
c
t
i
v
i
d
a
d
e
s
,

y

e
l

c

r
c
u
l
o

b
l
a
n
c
o

p
u
n
t
e
a
d
o

e
n

e
l

c
e
n
t
r
o

d
e
n
o
t
a

d
o
n
d
e

t
e
r
m
i
n
a
n

l
a
s

a
c
t
i
v
i
d
a
d
e
s
.
O
z
i
t
o
Elegir el Software
Con la aplicacin modelada y los requerimientos del proyecto definidos, es hora de
pensar en los APIs de Java
TM
que vamos a usar. La aplicacin est claramente
basada en cliente y servidor porque queremos acomodar desde 1 hasta n
compradores, vendedores y mirones al mismo tiempo. Como el registro de los
datos de los tems en subasta deben almacenarse y recuperarse de alguna
manejar, necesitares el API para acceder a bases de datos.
Los APIs de Java
TM
El corazn de la aplicacin se puede crear de muchas formas usando uno de los
siguientes aPIs:
APIs de Sockets, multithreads y JDBC
TM
. 1.
APIs de Remote Method Invocation (RMI) y JDBC. 2.
Plataforma Enterprise JavaBeans
TM
. 3.
Enterprise JavaBeans proporciona una forma sencilla de crear aplicaciones de
clientes multi hilos porque maneja transaciones y control de estado, multithreads,
recursos y otros complejos detalles de bajo nivel. La forma ms sencilla para
codificar la aplicacin de subastas es con la plataforma Enterprise JavaBeans.
El captulo 2 explica el cdigo del corazn de la aplicacin y como configurar y
ejecutar el ejemplo.
Ozito
C

d
i
g
o

d
e

l
a

A
p
l
i
c
a
c
i

n

d
e

l
a

C
a
s
a

d
e

S
u
b
a
s
t
a
s
L
a

a
p
l
i
c
a
c
i

n

d
e

e
j
e
m
p
l
o

e
s

u
n
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

b
a
s
a
d
a

e
n

e
l

W
e
b

y

e
s
c
r
i
t
a

p
a
r
a

l
a

p
l
a
t
a
f
o
r
m
a

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
T
M
.

E
l

i
n
t
e
r
f
a
c
e

d
e

u
s
u
a
r
i
o

e
s

u
n

c
o
n
j
u
n
t
o

d
e

p

g
i
n
a
s

H
T
M
L
q
u
e

o
b
t
i
e
n
e
n

l
a

e
n
t
r
a
d
a

d
e
l

u
s
u
a
r
i
o

y

l
e

m
u
e
s
t
r
a
n

l
a

i
n
f
o
r
m
a
c
i

n
.

D
e
t
r

s

d
e

l
a
s

p

g
i
n
a
s

H
T
M
L

h
a
y

u
n

s
e
r
v
e
l
t

q
u
e

p
a
s
a

d
a
t
o
s

e
n
t
r
e

e
l

n
a
v
e
g
a
d
o
r

y

e
l

s
e
r
v
i
d
o
r

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
.
E
s
t
e

s
e
r
v
i
d
o
r

m
a
n
e
j
a

l
a

l
e
c
t
u
r
a

y

e
s
c
r
i
t
u
r
a

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
.
E
s
t
e

c
a
p

t
u
l
o

d
e
s
c
r
i
b
e

e
l

c

d
i
g
o

d
e

l
a

a
p
l
i
c
a
c
i

n
,

c

m
o

f
u
n
c
i
o
n
a

c
o
n

e
l

s
e
r
v
i
d
o
r

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
,

y

d

n
d
e

o
b
t
e
n
e
r

e
s
t
e

s
e
r
v
i
d
o
r

p
a
r
a

e
j
c
u
t
a
r

e
l

e
j
e
m
p
l
o
.

O
,

s
i

l
o

p
r
e
f
i
e
r
e
s
,

a
q
u

h
a
y

u
n
a

m
a
q
u
e
t
a

d
e

l
a

a
p
l
i
c
a
c
i

n

s
u
b
a
s
t
a
.
U
n
a

A
p
l
i
c
a
c
i

n

M
u
l
t
i
.
H
i
l
o

c
o
n

E
n
t
e
r
p
r
i
s
e

B
e
a
n
s




B
e
a
n
s

d
e

E
n
t
i
d
a
d

y

d
e

S
e
s
i




E
x
a
m
i
n
a
r

u
n

B
e
a
n

d
e

C
o
n
t
e
n
e
d
o
r

C
o
n
t
r
o
l
a
d
o
r

t
o
d
o
s

B
u
s
c
a
d
o
r
e
s

d
e
l

C
o
n
t
e
n
d
o
r

C
o
n
t
r
o
l
a
d
o
r

T
i
e
n
e
s

P
r
i
s
a
?
E
s
t
a

t
a
b
l
a

c
o
n
t
i
e
n
e

e
n
l
a
c
e
s

d
i
r
e
c
t
o
s

a

l
o
s

t

p
i
c
o
s

e
s
p
e
c

f
i
c
o
s
.
T

p
i
c
o
S
e
c
c
i

n
U
n
a

A
p
l
i
c
a
c
i

n

M
u
l
t
i
-
H
i
l
o

c
o
n

E
n
t
e
r
p
r
i
s
e

B
e
a
n
s
E
l

E
n
t
e
r
p
r
i
s
e

B
e
a
n
s

D
e
f
i
n
i
d
o
B
e
a
n
s

d
e

E
n
t
i
d
a
d

y

d
e

S
e
s
i

n
L
a

C
a
s
a

d
e

S
u
b
a
s
t
a
s

F
u
n
c
i
o
n
a
D
e
s
a
r
r
o
l
l
a
r

y

E
j
e
c
u
t
a
r

A
p
l
i
c
a
c
i
o
n
e
s

m
o

f
u
n
c
i
o
n
a
n

l
a
s

a
p
l
i
c
a
c
i
o
n
e
s

M
u
l
t
i
-
H
i
l
o
?
B
e
a
n
s

d
e

E
n
t
i
d
a
d

y

d
e

S
e
s
i

n
E
l

s
e
r
v
e
l
t

A
u
c
t
i
o
n
B
e
a
n
s

E
n
t
i
t
y
B
e
a
n
s

S
e
s
s
i
o
n
C
l
a
s
e
s

C
o
n
t
e
n
e
d
o
r
E
x
a
m
i
n
a
r

u
n

B
e
a
n

d
e

C
o
n
t
e
n
e
d
o
r

C
o
n
t
r
o
l
a
d
o
r
V
a
r
i
a
b
l
e
s

M
i
e
m
b
r
o
M

t
o
d
o

C
r
e
a
t
e
M

t
o
d
o
s

d
e

C
o
n
t
e
x
t
o

d
e

E
n
t
i
d
a
d
M

t
o
d
o

L
o
a
d
M

t
o
d
o

S
t
o
r
e
G
u
a
r
d
a
r

l
a

C
o
n
e
x
i

n
D
e
s
c
r
i
p
t
o
r

d
e

D
e
s
a
r
r
o
l
l
o
M

t
o
d
o
s

d
e
l

B
u
s
c
a
d
o
r

d
e

C
o
n
t
e
n
e
d
o

C
o
n
t
r
o
l
a
d
o
r
A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
s
e
a
r
c
h
I
t
e
m
s
B
i
d
d
e
r
B
e
a
n
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s
A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

D
e
p
l
o
y
m
e
n
t

D
e
s
c
r
i
p
t
o
r
O
z
i
t
o
U
n

A
p
l
i
c
a
c
i

n

M
u
l
t
i
-
F
i
l
a

c
o
n

B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
L
a

p
r
o
l
i
f
e
r
a
c
i

n

d
e

a
p
l
i
c
a
c
i
o
n
e
s

b
a
s
a
d
a
s

e
n

i
n
t
e
r
n
e
t

-

e

i
n
t
r
a
n
e
t

-

h
a

c
r
e
a
d
o

u
n
a

g
r
a
n

n
e
c
e
s
i
d
a
d

d
e

a
p
l
i
c
a
c
i
o
n
e
s

t
r
a
n
s
a
c
i
o
n
a
l
e
s

d
i
s
t
r
i
b
u
i
d
a
s

q
u
e

a
u
m
e
n
t
e

l
a

v
e
l
o
c
i
d
a
d
,

s
e
g
u
r
i
d
a
d

y
r
e
n
d
i
m
i
e
n
t
o

d
e

l
a

t
e
c
n
o
l
o
g

a

d
e
l

l
a
d
o

d
e
l

s
e
r
v
i
d
o
r
.

U
n
a

f
o
r
m
a

d
e

c
o
n
s
e
g
u
i
r

e
s
t
a
s

n
e
c
e
s
i
d
a
d
e
s

e
s

u
s
a
r

u
n

m
o
d
e
l
o

m
u
l
t
i
-
f
i
l
a

d
o
n
d
e

u
n
a

p
e
q
u
e

a

a
p
l
i
c
a
c
i

n

c
l
i
e
n
t
e

i
n
v
o
c
a

l

g
i
c
a

d
e
n
e
g
o
c
i
o

q
u
e

s
e

e
j
e
c
u
t
a

e
n

e
l

s
e
r
v
i
d
o
r
.
N
o
r
m
a
l
m
e
n
t
e
,

l
a
s

p
e
q
u
e

a
s

a
p
l
i
c
a
c
i
o
n
e
s

c
l
i
e
n
t
e
s

m
u
l
t
i
-
h
i
l
o

s
o
n

d
i
f
i
c
i
l
e
s

d
e

e
s
c
r
i
b
i
r

p
o
r
q
u
e

s
e

i
n
v
o
l
u
c
r
a
n

m
u
c
h
a
s

l

n
e
a
s

d
e

c

d
i
g
o

i
n
t
r
i
n
c
a
d
o

p
a
r
a

m
a
n
e
j
a
r

l
a

t
r
a
n
s
a
c
i

n
,

e
l

c
o
n
t
r
o
l

d
e
e
s
t
a
d
o
s
,

m
u
l
t
i
t
h
r
e
a
d
s
,

s
o
l
a
p
e

d
e

r
e
c
u
r
s
o
s

y

o
t
r
o
s

d
e
t
a
l
l
e
s

c
o
m
p
l
e
j
o
s

d
e

b
a
j
o

n
i
v
e
l
.

Y

p
a
r
a

r
e
m
a
t
a
r

e
s
t
a
s

d
i
f
i
c
u
l
t
a
d
e
s
,

t
e
n
e
m
o
s

q
u
e

r
e
t
r
a
b
a
j
a
r

e
s
t
e

c

d
i
g
o

c
a
d
a

v
e
z

q
u
e

e
s
c
r
i
b
a
m
o
s
u
n
a

a
p
l
i
c
a
c
i

n

p
o
r
q
u
e

e
s

t
a
n

d
e

b
a
j
o

n
i
v
e
l

q
u
e

n
o

e
s

r
e
u
t
i
l
i
z
a
b
l
e
.
S
i

p
u
d
i
e
r
a
m
o
s

u
s
a
r

u
n

c

d
i
g
o

d
e

m
a
n
e
j
o

d
e

t
r
a
n
s
a
c
i
o
n
e
s

p
r
e
c
o
n
s
t
r
u
i
d
o

p
o
r

a
l
g
u
i
e
n

o

i
n
c
l
u
s
o

s
i

p
u
e
d
i
e
r
a
m
o
s

r
e
u
t
i
l
i
z
a
r

a
l
g
o

d
e

n
u
e
s
t
r
o

p
r
o
p
i
o

c

d
i
g
o
,

a
h
o
r
r
a
r
i
a
m
o
s

m
u
c
h
o

t
i
e
m
p
o

y
e
n
e
r
g

a

q
u
e

p
o
d
r

a
m
o
s

u
t
i
l
i
z
a
r

p
a
r
a

r
e
s
o
l
v
e
r

o
t
r
o
s

p
r
o
b
l
e
m
a
s
.

B
i
e
n
,

l
a

t
e
c
n
o
l
o
g

a

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
T
M

p
u
e
d
e

d
a
r
n
o
s

l
a

a
y
u
d
a

n
e
c
e
s
a
r
i
a
.

E
s
t
a

t
e
c
n
o
l
o
g

a

h
a
c
e

s
e
n
c
i
l
l
a
s

d
e

e
s
c
r
i
b
i
r
l
a
s

a
p
l
i
c
a
c
i
o
n
e
s

t
r
a
n
s
a
c
i
o
n
a
l
e
s

d
i
s
t
r
i
b
u
i
d
a
s

p
o
r
q
u
e

s
e
p
a
r
a

l
o
s

d
e
t
a
l
l
e
s

d
e

b
a
j
o

n
i
v
e
l

d
e

l
a

l

g
i
c
a

d
e
l

n
e
g
o
c
i
o
.

N
o
s

c
o
n
c
e
n
t
r
a
m
o
s

e
n

c
r
e
a
r

l
a

m
e
j
o
r

s
o
l
u
c
i

n

p
a
r
a

n
u
e
s
t
r
o

n
e
g
o
c
i
o

y
d
e
j
a
m
o
s

e
l

r
e
s
t
o

a

l
a

a
r
q
u
i
t
e
c
t
u
r
a

o
c
u
l
t
a
.
E
s
t
e

c
a
p

t
u
l
o

d
e
s
c
r
i
b
e

c

m
o

c
r
e
a
r

l
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a
s

d
e
l

e
j
e
m
p
l
o

u
s
a
n
d
o

l
o
s

s
e
r
v
i
c
i
o
s

p
r
o
p
o
r
c
i
o
n
a
d
o
s

p
o
r

l
a

p
l
a
t
a
f
o
r
m
a

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
.

E
n

l
o
s

s
i
g
u
i
e
n
t
e
s

c
a
p

t
u
l
o
s
v
e
r
e
m
o
s

c
o
m
o

p
o
d
e
m
o
s

p
e
r
s
o
n
a
l
i
z
a
r

e
s
t
o
s

s
e
r
v
i
c
i
o
s

e

i
n
t
e
g
r
a
r

e
s
t
a
s

c
a
r
a
c
t
e
r

s
t
i
c
a
s

e
n

a
p
l
i
c
a
c
i
o
n
e
s

e
x
i
s
t
e
n
t
e
s

n
o

E
J
B
.
E
n
t
e
r
p
r
i
s
e

B
e
a
n
s

D
e
f
i
n
i
d
o
s




P
e
q
u
e

o
s

P
r
o
g
r
a
m
a
s

C
l
i
e
n
t
e
s




A
r
q
u
i
t
e
c
t
u
r

M
u
l
t
i
-
H
i
l
o




B
e
a
n
s

d
e

e
n
t
i
d
a
d

y

d
e

s
e
s
i




L
a

C
a
s
a

d
e

S
u
b
a
s
t
a
s

F
u
n
c
i
o
n
a




D
e
s
a
r
r
o
l
l
a
r

y

E
j
e
c
u
t
a
r

A
p
l
i
c
a
c
i
o
n
e
s

m
o

f
u
n
c
i
o
n
a
n

l
a
s

A
p
l
i
c
a
c
i
o
n
e
s

m
u
l
t
i
-
h
i
l
o
?




E
n
t
e
r
p
r
i
s
e

B
e
a
n
s

D
e
f
i
n
i
d
o
s
U
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

e
s

u
n
a

c
l
a
s
e

q
u
e

p
r
o
p
o
r
c
i
o
n
a

d
o
s

t
i
p
o
s

d
e

m

t
o
d
o
s
:

l

g
i
c
a

d
e

n
e
g
o
c
i
o

y

c
i
c
l
o

d
e

v
i
d
a
.

U
n

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

l
l
a
m
a

a

l
o
s

m

t
o
d
o
s

d
e

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

p
a
r
a
i
n
t
e
r
a
c
t
u
a
r

c
o
n

l
o
s

d
a
t
o
s

c
o
n
t
e
n
i
d
o
s

e
n

e
l

s
e
r
v
i
d
o
r
.

E
l

c
o
n
t
e
n
e
d
o
r

l
l
a
m
a

a

l
o
s

m

t
o
d
o
s

d
e

c
i
c
l
o

d
e

v
i
d
a

p
a
r
a

m
a
n
e
j
a
r

e
l

B
e
a
n

e
n

e
l

s
e
r
v
i
d
o
r
.

A
d
e
m

s

d
e

e
s
t
o
s

d
o
s

t
i
p
o
s

d
e

m

t
o
d
o
s
,
u
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

t
i
e
n
e

u
n

f
i
c
h
e
r
o

d
e

c
o
n
f
i
g
u
r
a
c
i

n

a
s
o
c
i
a
d
o
,

l
l
a
m
a
d
o

u
n

d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o
,

s
e

u
s
a

p
a
r
a

c
o
n
f
i
g
u
r
a
r

e
l

B
e
a
n

e
n

e
l

m
o
m
e
n
t
o

d
e
l

d
e
s
a
r
r
o
l
l
o
.
A
s


c
o
m
o

e
s

e
l

r
e
s
p
o
n
s
a
b
l
e

d
e

l
a

c
r
e
a
c
c
i

n

y

b
o
r
r
a
d
o

d
e

B
e
a
n
s
,

e
l

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

t
a
m
b
i

n

m
a
n
e
j
a

l
a
s

t
r
a
n
s
a
c
i
o
n
e
s
,

l
a

c
o
n
c
u
r
r
e
n
c
i
a
,

l
a

s
e
g
u
r
i
d
a
d

y

l
a
p
e
r
s
i
s
t
e
n
c
i
a

d
e

d
a
t
o
s
.

I
n
c
l
u
s
o

l
a
s

c
o
n
e
x
i
o
n
e
s

e
n
t
r
e

e
l

c
l
i
e
n
t
e

y

e
l

s
e
r
v
i
d
o
r

s
e

p
r
o
p
o
r
c
i
o
n
a
n

u
s
a
n
d
o

l
o
s

A
P
I
s

d
e

R
M
I

y

J
N
D
I

y

o
p
c
i
o
n
a
l
m
e
n
t
e

l
o
s

s
e
r
v
i
d
o
r
e
s

p
u
e
d
e
n

p
r
o
p
o
r
c
i
o
n
a
r
e
s
c
a
l
a
b
i
l
i
d
a
d

a

t
r
a
v

s

d
e
l

m
a
n
e
j
o

d
e

t
h
r
e
a
d
s
.
E
l

e
j
e
m
p
l
o

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

i
m
p
l
e
m
e
n
t
a

u
n
a

c
o
m
p
l
e
t
a

s
o
l
u
c
i

n

d
e

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

q
u
e

s

l
o

p
r
o
p
o
r
c
i
o
n
a
n

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

y

u
s
a

l
o
s

s
e
r
v
i
c
i
o
s

o
c
u
l
t
o
s
p
r
o
p
o
r
c
i
o
n
a
d
o
s

p
o
r

l
a

a
r
q
u
i
t
e
c
t
u
r
a
.

S
i
n

e
m
b
a
r
g
o
,

p
o
d
r

a
m
o
s

e
n
c
o
n
t
r
a
r

q
u
e

e
l

s
e
r
v
i
c
i
o

d
e

c
o
n
t
e
n
e
d
o
r
e
s

c
o
n
t
r
o
l
a
d
o
r
e
s
,

a
u
n
q
u
e

p
r
o
p
o
r
c
i
o
n
a
n
d
o

u
n
a

m

x
i
m
a

p
o
r
t
a
b
i
l
i
d
a
d
,

n
o

c
o
n
s
i
g
u
e
t
o
d
o
s

l
o
s

r
e
q
u
e
r
i
m
i
e
n
t
o
s

d
e

n
u
e
s
t
r
a

a
p
l
i
c
a
c
i

n
.

E
n

l
o
s

p
r

x
i
m
o
s

c
a
p

t
u
l
o
s

v
e
r
e
m
o
s

c

m
o

p
r
o
p
o
r
c
i
o
n
a
r

e
s
t
o
s

s
e
r
v
i
c
i
o
s

a

n
u
e
s
t
r
o

B
e
a
n

y

t
a
m
b
i

n

c
o
m
o

u
s
a
r

e
s
t
o
s

s
e
r
v
i
c
i
o
s

e
n
a
p
l
i
c
a
c
i
o
n
e
s

q
u
e

n
o

u
s
e
n

B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
.
P
e
q
u
e

o

P
r
o
g
r
a
m
a
s

C
l
i
e
n
t
e
U
n

p
e
q
u
e

o

c
l
i
e
n
t
e

e
s

u
n

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

q
u
e

i
n
v
o
c
a

a

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

q
u
e

s
e

e
j
e
c
u
t
a

e
n

e
l

s
e
r
v
i
d
o
r
.

S
e

l
l
a
m
a

"
p
e
q
u
e

o
"

p
o
r
q
u
e

l
a

m
a
y
o
r

a

d
e
l

p
r
o
c
e
s
o

s
u
c
e
d
e

e
n

e
l

s
e
r
v
i
d
o
r
.
E
n

l
a

s
i
g
u
i
e
n
t
e

f
i
g
u
r
a
,

e
l

s
e
r
v
l
e
t

e
s

e
l

c
l
i
e
n
t
e
.

I
n
v
o
c
a

a

l
o
s

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

q
u
e

s
e

e
j
e
c
u
t
a
n

s
o
b
r
e

u
n

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e
.

T
a
m
b
i

n

e
j
e
c
u
t
a

l
a

l

g
i
c
a

q
u
e

c
r
e
a

l
a
s
p

g
i
n
a
s

w
e
b

q
u
e

a
p
a
r
e
c
e
n

e
n

e
l

n
a
v
e
g
a
d
o
r
.
A
r
q
u
i
t
e
c
t
u
r
a

M
u
l
t
i
-
F
i
l
a
a
r
q
u
i
t
e
c
t
u
r
a

m
u
l
t
i
-
f
i
l
a

o

a
r
q
u
i
t
e
c
t
u
r
a

d
e

t
r
e
s

f
i
l
a
s

d
e
s
c
i
e
n
d
e

d
e
l

m
o
d
e
l
o

e
s
t

n
d
a
r
d

d
e

d
o
s

f
i
l
a
s

d
e

c
l
i
e
n
t
e

y

s
e
r
v
i
d
o
r

s
i
t
u
a
n
d
o

u
n
a

a
p
l
i
c
a
c
i

n

m
u
l
t
i
-
f
i
l
a

e
n
t
r
e

e
l

c
l
i
e
n
t
e

y

l
a

b
a
s
e

d
e
d
a
t
o
s
.
L
o
s

p
r
o
g
r
a
m
a
s

c
l
i
e
n
t
e
s

s
e

c
o
m
u
n
i
c
a
n

c
o
n

l
a

b
a
s
e

d
e

d
a
t
o
s

a

t
r
a
v

s

d
e

l
a

a
p
l
i
c
a
c
i

n

d
e
l

s
e
r
v
i
d
o
r

u
s
a
n
d
o

l
l
a
m
a
d
a
s

d
e

a
l
t
o

n
i
v
e
l

e

i
n
d
e
p
e
n
d
i
e
n
t
e
s

d
e

l
a

p
l
a
t
a
f
o
r
m
a
.

L
a

a
p
l
i
c
a
c
i

n
s
e
r
v
i
d
o
r

r
e
s
p
o
n
d
e

a

l
a
s

p
e
t
i
c
i
o
n
e
s

d
e
l

c
l
i
e
n
t
e
,

h
a
c
e

l
a
s

l
l
a
m
a
d
a
s

n
e
c
e
s
a
r
i
a
s

a

l
a

b
a
s
e

d
e

d
a
t
o
s

d
e
n
t
r
o

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s

o
c
u
l
t
a
,

y

r
e
s
p
o
n
d
e

a
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

d
e

l
a

f
o
r
m
a
a
p
r
o
p
i
a
d
a
.
E
l

e
j
e
m
p
l
o

d
e

c
a
s
a

d
e

s
u
b
a
s
t
a
s

b
a
s
a
d
o

e
n

w
e
b

d
e

t
r
e
s

f
i
l
a
s

c
o
n
s
i
s
t
e

e
n

e
l

s
e
r
v
l
e
t

c
l
i
e
n
t
e
,

e
l

s
e
r
v
i
d
o
r

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s

(
l
a

a
p
l
i
c
a
c
i

n

s
e
r
v
i
d
o
r
)
,

y

e
l

s
e
r
v
i
d
o
r

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
c
o
m
o

s
e

v
e

e
n

l
a

f
i
g
u
r
a
.
B
e
a
n
s

d
e

E
n
t
i
d
a
d

y

d
e

S
e
s
i

n
E
x
i
s
t
e
n

d
o
s

t
i
p
o
s

d
e

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e
:

B
e
a
n
s

d
e

e
n
t
i
d
a
d

y

d
e

s
e
s
i

n
.

U
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

q
u
e

i
m
p
l
e
m
e
n
t
a

u
n
a

e
n
t
i
d
a
d

d
e

n
e
g
o
c
i
o

e
s

u
n

B
e
a
n

d
e

E
n
t
i
d
a
d
,

y

u
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e
q
u
e

i
m
p
l
e
m
e
n
t
a

u
n
a

t
a
r
e
a

d
e

n
e
g
o
c
i
o

e
s

u
n

B
e
a
n

d
e

S
e
s
i

n
.
T

p
i
c
a
m
e
n
t
e
,

u
n

B
e
a
n

d
e

e
n
t
i
d
a
d

r
e
p
r
e
s
e
n
t
a

u
n
a

f
i
l
a

d
e

d
a
t
o
s

p
e
r
s
i
s
t
e
n
t
e
s

a
l
m
a
c
e
n
a
d
o
s

e
n

u
n
a

t
a
b
l
a

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
.

E
n

e
l

e
j
e
m
p
l
o

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s
,

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
e
s

u
n

B
e
a
n

d
e

e
n
t
i
d
a
d

q
u
e

r
e
p
r
e
s
e
n
t
a

l
o
s

d
a
t
o
s

d
e

u
n

u
s
u
a
r
i
o

r
e
g
i
s
t
r
a
d
o
,

y

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

e
s

u
n

B
e
a
n

d
e

e
n
t
i
d
a
d

q
u
e

r
e
p
r
e
s
e
n
a

l
o
s

d
a
t
o
s

d
e

u
n

t
e
m

d
e

l
a

s
u
b
a
s
t
a
.

L
o
s

B
e
a
n
s
d
e

e
n
t
i
d
a
d

s
o
n

t
r
a
n
s
a
c
i
o
n
a
l
e
s

y

d
e

l
a
r
g
a

v
i
d
a
.

M
i
e
n
t
r
a
s

q
u
e

l
o
s

d
a
t
o
s

p
e
r
m
a
n
e
z
c
a
n
,

e
l

B
e
a
n

d
e

e
n
t
i
d
a
d

p
u
e
d
e

a
c
c
e
d
e
r

y

a
c
t
u
a
l
i
z
a
r
l
o
s
.

E
s
t
o

n
o

s
i
g
n
i
f
i
c
a

q
u
e

t
e
n
g
a
m
o
s

u
n

B
e
a
n
e
j
e
c
u
t

n
d
o
s
e

p
o
r

c
a
d
a

f
i
l
a

d
e

l
a

t
a
b
l
a
.

S
i

n
o

q
u
e

l
o
s

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

s
e

c
a
r
g
a
n

y

g
r
a
b
a
n

c
u
a
n
d
o

e
s

n
e
c
e
s
a
r
i
o
.
U
n

B
e
a
n

d
e

s
e
s
i

n

p
o
d
r

a

e
j
e
c
u
t
a
r

u
n
a

l
e
c
t
u
r
a

o

e
s
c
r
i
t
u
r
a

e
n

l
a

b
a
s
e

d
e

d
a
t
o
s
,

p
e
r
o

n
o

e
s

n
e
c
e
s
a
r
i
o
.

U
n

B
e
a
n

d
e

s
e
s
i

n

p
o
d
r

a

i
n
v
o
c
a
r

l
l
a
m
a
d
a
s

a
l

J
D
B
C

p
o
r

s


m
i
s
m
o

o

p
o
d
r

a

u
s
a
r
u
n

B
e
a
n

d
e

e
n
t
i
d
a
d

p
a
r
a

h
a
c
e
r

l
a

l
l
a
m
a
d
a
,

e
n

c
u
y
o

c
a
s
o

e
l

B
e
a
n

d
e

s
e
s
i

n

e
s

u
n

c
l
i
e
n
t
e

d
e
l

B
e
a
n

d
e

e
n
t
i
d
a
d
.

U
n

c
a
m
p
o

d
e

B
e
a
n

c
o
n
t
i
e
n
e

e
l

e
s
t
a
d
o

d
e

l
a

c
o
n
v
e
r
s
a
c
i

n

y

s
o
n
t
e
m
p
o
r
a
l
e
s
.

S
i

e
l

s
e
r
v
i
d
o
r

o

e
l

c
l
i
e
n
t
e

s
e

b
l
o
q
u
e
a
n
,

e
l

B
e
a
n

d
e

s
e
s
i

n

s
e

v

.

F
r
e
c
u
e
n
t
e
m
e
n
t
e

s
e

u
s
a
n

l
o
s

B
e
a
n
s

d
e

s
e
s
i

n

c
o
n

u
n
o

o

m

s

B
e
a
n
s

d
e

e
n
t
i
d
a
d

y

p
a
r
a

o
p
e
r
a
c
i
o
n
e
s
c
o
m
p
l
e
j
a
s

c
o
n

d
a
t
o
s
.
B
e
a
n
s

d
e

S
e
s
i

n
B
e
a
n
s

d
e

E
n
t
i
d
a
d
C
a
m
p
o
s

q
u
e

c
o
n
t
i
e
n
e
n

e
l

e
s
t
a
d
o

d
e

l
a

c
o
n
v
e
r
s
a
c
i

n
R
e
p
r
e
s
e
n
t
a
n

d
a
t
o
s

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
M
a
n
e
j
a
n

a
c
c
e
s
o
s

a

l
a

b
a
s
e

d
e

d
a
t
o
s

p
o
r

p
a
r
t
e

d
e
l

c
l
i
e
n
t
e
C
o
m
p
a
r
t
e
n

a
c
c
e
s
o
s

e
n
t
r
e

m

l
t
i
p
l
e
s

u
s
u
a
r
i
o
s
L
a

v
i
d
a

d
e
l

c
l
i
e
n
t
e

e
s

l
a

v
i
d
a

d
e
l

B
e
a
n
P
e
s
i
s
t
e

m
i
e
n
t
r
a
s

e
x
i
s
t
a
n

l
o
s

d
a
t
o
s
P
u
e
d
e
n

p
e
r
d
e
r
s
e

c
o
n

l
a

t
r
a
n
s
a
c
i

n
T
r
a
n
s
a
c
i
o
n
a
l
N
o

s
o
b
r
e
v
i
v
e

a

l
a
s

c
a

d
a
s

d
e
l

s
e
r
v
i
d
o
r
S
o
b
r
e
v
i
v
e

a

l
a
s

c
a

d
a
s

d
e
l

s
e
r
v
i
d
o
r
N
o

m
a
n
e
j
a

l
o
s

d
a
t
o
s

d
e

f
o
r
m
a

f
i
n
a
M
a
n
e
j
o

d
e

d
a
t
o
s

d
e

f
o
r
m
a

d
e
l
i
c
a
d
a
L
a

C
a
s
a

d
e

S
u
b
a
s
t
a
s

F
u
n
c
i
o
n
a
E
l

d
i
a
g
r
a
m
a

m
u
e
s
t
r
a

l
o
s

B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

p
a
r
a

l
a

a
p
l
i
c
a
c
i

n

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

y

s
u

r
e
l
a
c
i

n

c
o
n

e
l

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
.

E
l

c
l
i
e
n
t
e

i
n
v
o
c
a

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o
e
n

c
u
a
t
r
o

B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

a

t
r
a
v

s

d
e

s
u
s

i
n
t
e
r
f
a
c
e
s

h
o
m
e

y

r
e
m
o
t
o
.

E
l

s
e
r
v
i
d
o
r

J
a
v
a
B
e
a
n
s

d
e

e
s
t
e

e
j
e
m
p
l
o

m
a
n
e
j
a

l
o
s

d
e
t
a
l
l
e
s

d
e

b
a
j
o

n
i
v
e
l

i
n
c
l
u
y
e
n
d
o

l
a
s

o
p
e
r
a
c
i
o
n
e
s

d
e
l
e
c
t
u
r
a

y

e
s
c
r
i
t
u
r
a

e
n

l
a

b
a
s
e

d
e

d
a
t
o
s
.
L
o
s

c
u
a
t
r
o

B
e
a
n
s

d
e
l

e
j
e
m
p
l
o

s
o
n
:
A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

u
n

B
e
a
n

d
e

e
n
t
i
d
a
d

q
u
e

m
a
n
t
i
e
n
e

i
n
f
o
r
m
a
c
i

n

s
o
b
r
e

e
l

t
e
m

d
e

l
a

s
u
b
a
s
t
a
.




R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

u
n

B
e
a
n

d
e

e
n
t
i
d
a
d

q
u
e

a
l
m
a
c
e
n
a

i
n
f
o
r
m
a
c
i

n

d
e

r
e
g
i
s
t
r
o

d
e

l
o
s

u
s
u
a
r
i
o
s
.




B
i
d
d
e
r
B
e
a
n

u
n

B
e
a
n

d
e

s
e
s
i

n

q
u
e

u
s
a

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

p
a
r
a

r
e
c
u
p
e
r
a
r

u
n
a

l
i
s
t
r
a

d
e

l
o
s

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a
s
,

s

l
o

l
o
s

n
u
e
v
o
s

t
e
m
s
,

t
e
m
s

c
e
r
c
a

d
e
l

c
i
e
r
r
e
,

e

t
e
m
s

c
u
y
o
s
u
m
a
r
i
o

c
o
r
r
e
s
p
o
n
d
e

c
o
n

u
n
a

c
a
d
e
n
a

d
e

b
u
s
q
u
e
d
a

e
n

l
a

b
a
s
e

d
e

d
a
t
o
s
.

T
a
m
b
i

n

c
o
m
p
r
u
e
b
a

l
a

i
d
e
n
t
i
d
a
d

d
e
l

u
s
u
a
r
i
o

y

l
a

p
a
s
s
w
o
r
d

c
u
a
n
d
o

a
l
g
u
i
e
n

h
a
c
e

u
n
a

p
u
j
a
,

y

a
l
m
a
c
e
n
a
l
a
s

n
u
e
v
a
s

p
u
j
a
s

e
n

l
a

b
a
s
e

d
e

d
a
t
o
s
.




S
e
l
l
e
r
B
e
a
n

e
s

u
n

B
e
a
n

d
e

s
e
s
i

n

q
u
e

u
s
a

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

p
a
r
a

c
o
m
p
r
o
b
a
r

l
a

i
d
e
n
t
i
d
a
d

d
e
l

u
s
u
a
r
i
o

y

l
a

p
a
s
s
w
o
r
d

c
u
a
n
d
o

a
l
g
u
i
e
n

p
o
s
t
e
a

u
n

t
e
m

p
a
r
a

s
u

s
u
b
a
s
t
a
,

y
A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

p
a
r
a

a

a
d
i
r

n
u
e
v
o
s

t
e
m
s

a

l
a

b
a
s
e

d
e

d
a
t
o
s

d
e

l
a

s
u
b
a
s
t
a
.




C
o
m
o

s
e

v
e

e
n

l
a

f
i
g
u
r
a

s
u
p
e
r
i
o
r
,

u
n

B
e
a
n

d
e

e
n
t
i
d
a
d

o

d
e

s
e
s
i

n

r
e
a
l
m
e
n
t
e

e
s

u
n
a

c
o
l
e
c
c
i

n

d
e

c
l
a
s
e
s

e

i
n
t
e
r
f
a
c
e
s
.

T
o
d
o
s

l
o
s

B
e
a
n
s

d
e

e
n
t
i
d
a
d

y

d
e

s
e
s
i

n

c
o
n
s
i
s
t
e
n

e
n

u
n

i
n
t
e
r
f
a
e
r
e
m
o
t
o
,

u
n

i
n
t
e
r
f
a
c
e

h
o
m
e
,

y

l
a

c
l
a
s
e

d
e
l

B
e
a
n
.

E
l

s
e
r
v
i
d
o
r

b
u
s
c
a

e
l

i
n
t
e
r
f
a
c
e

h
o
m
e

d
e
l

B
e
a
n

q
u
e

e
s
t


e
j
e
c
u
t

n
d
o
s
e

e
n

e
l

s
e
r
v
i
d
o
r

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
,

l
o

u
s
a

p
a
r
a

c
r
e
a
r

e
l
i
n
t
e
r
f
a
c
e

r
e
m
o
t
o
,

e

i
n
v
o
c
a

a

l
o
s

m

t
o
d
o
s

d
e
l

B
e
a
n

a

t
r
a
v

s

d
e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o
.
U
n

I
n
t
e
r
f
a
c
e

r
e
m
o
t
o

d
e

u
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

d
e
c
r
i
b
e

l
o
s

m

t
o
d
o
s

d
e
l

B
e
a
n
,

o

q
u


h
a
c
e

e
l

B
e
a
n
.

U
n

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

u

o
t
r
o

B
e
a
n

E
n
t
e
r
p
r
i
s
e

l
l
a
m
a

a

l
o
s

m

t
o
d
o
s

d
e
f
i
n
i
d
o
s

e
n

e
l
i
n
t
e
r
f
a
c
e

r
e
m
o
t
o

p
a
r
a

i
n
v
o
c
a
r

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o
s

i
m
p
l
e
m
e
n
t
a
d
a

p
o
r

e
l

B
e
a
n
.




U
n

i
n
t
e
r
f
a
c
e

h
o
m
e

d
e

u
n

B
e
a
n

d
e

E
n
t
e
r
p
r
i
s
e

d
e
s
c
r
i
b
e

c

m
o

u
n

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

u

o
t
r
o

B
e
a
n

E
n
t
e
r
p
r
i
s
e

c
r
e
a
,

e
n
c
u
e
n
t
r
a

(
s

l
o

l
o
s

B
e
a
n
s

d
e

e
n
t
i
d
a
d
)
,

y

e
l
i
m
i
n
a

e
s
e

B
e
a
n

d
e
E
n
t
e
r
p
i
s
e

d
e

s
u

c
o
n
t
e
n
e
d
o
r
.




E
l

c
o
n
t
e
n
e
d
o
r
,

m
o
s
t
r
a
d
o

e
n

c
y
a
n

e
n

e
l

g
r

f
i
c
o
,

p
r
o
p
o
r
c
i
o
n
a

e
l

i
n
t
e
r
f
a
c
e

e
n
t
r
e

e
l

B
e
a
n

I
n
t
e
r
f
a
c
e

y

l
a
s

f
u
n
c
i
o
n
a
l
i
d
a
d
e
s

d
e

b
a
j
o

n
i
v
e
l

e
s
p
e
c

f
i
c
a
s

d
e

l
a

p
l
a
t
a
f
o
r
m
a

q
u
e

s
o
p
o
r
t
a

e
l
B
e
a
n
.




D
e
s
a
r
r
o
l
l
a
r

y

E
j
e
c
u
t
a
r

A
p
l
i
c
a
c
i
o
n
e
s
L
a
s

h
e
r
r
a
m
i
e
n
t
a
s

d
e

d
e
s
a
r
r
o
l
l
o

y

u
n

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

e
s

e
s
e
n
c
i
a
l

p
a
r
a

e
j
e
c
u
t
a
r

a
p
l
i
c
a
c
i
o
n
e
s

c
o
n

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e
.

L
a
s

h
e
r
r
a
m
i
e
n
t
a
s

d
e

d
e
s
a
r
r
o
l
l
o

g
e
n
e
r
a
n
c
o
n
t
e
n
e
d
o
r
e
s
,

q
u
e

s
o
n

c
l
a
s
e
s

q
u
e

p
r
o
p
o
r
c
i
o
n
a
n

u
n

i
n
t
e
r
f
a
c
e

d
e

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

d
e

b
a
j
o

n
i
v
e
l

e
n

u
n

s
e
r
v
i
d
o
r

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

d
a
d
o
.

E
l

s
e
r
v
i
d
o
r

p
r
o
p
o
r
c
i
o
n
a
d
o

p
u
e
d
e

i
n
c
l
u
i
r
c
o
n
t
e
n
e
d
o
r
e
s

y

h
e
r
r
a
m
i
e
n
t
a
s

d
e

d
e
s
a
r
r
o
l
l
o

p
a
r
a

s
u
s

s
e
r
v
i
d
o
r
e
s

y

n
o
r
m
a
l
m
e
n
t
e

p
u
b
l
i
c
a
r


l
o
s

i
n
t
e
r
f
a
c
e
s

d
e

b
a
j
o

n
i
v
e
l

p
a
r
a

q
u
e

o
t
r
o
s

v
e
n
d
e
d
o
r
e
s

p
u
e
d
e
n

d
e
s
a
r
r
o
l
l
a
r

c
o
n
t
e
n
e
d
o
r
e
s

y
h
e
r
r
a
m
i
e
n
t
a
s

d
e

d
e
s
a
r
r
o
l
l
o

p
a
r
a

s
u
s

s
e
r
v
i
d
o
r
e
s
.
E
l

e
j
e
m
p
l
o

d
e

c
a
s
a

d
e

s
u
b
a
s
t
a
s

u
s
a

e
l

s
e
r
v
i
d
o
r

J
a
v
a
B
e
a
n
s

y

l
a
s

h
e
r
r
a
m
i
e
n
t
a
s

d
e

d
e
s
a
r
r
o
l
l
o

c
r
e
a
d
a
s

p
o
r

B
E
A

W
e
b
l
o
g
i
c
.

V
i
s
i
t
a

s
u

s
i
t
e

p
a
r
a

o
b
t
e
n
e
r

u
n
a

d
e
m
o

d
e

3
0

d

a
s
.
C
o
m
o

t
o
d
o

e
s
t


s
u
j
e
t
o

a

l
a
s

e
s
p
e
c
i
f
i
c
a
c
i
o
n
e
s
,

t
o
d
o
s

l
o
s

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

s
o
n

i
n
t
e
r
c
a
m
b
i
a
b
l
e
s

c
o
n

c
o
n
t
e
n
e
d
o
r
e
s
,

h
e
r
r
a
m
i
e
n
t
a
s

d
e

d
e
s
a
r
r
o
l
l
o
,

y

s
e
r
v
i
d
o
r
e
s

c
r
e
a
d
o
s

p
o
r

o
t
r
o
s
v
e
n
d
e
d
o
r
e
s
.

D
e

h
e
c
h
o
,

p
o
d
r
i
a
m
o
s

e
s
c
r
i
b
i
r

n
u
e
s
t
r
o

p
r
o
p
i
o

B
e
a
n

E
n
t
e
r
p
r
i
s
e

p
o
r
q
u
e

e
s

p
o
s
i
b
l
e
,

y

a
l
g
u
n
a
s

v
e
c
e
s

d
e
s
e
a
b
l
e
,

u
s
a
r

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

e
s
c
r
i
t
o
s

p
o
r

u
n
o

o

m

s

p
r
o
v
e
e
d
o
r
e
s
q
u
e

e
n
s
a
m
b
l
a
r
e
m
o
s

d
e
n
t
r
o

d
e

u
n
a

a
p
l
i
c
a
c
i

n

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e
.
C

m
o

F
u
n
c
i
o
n
a
n

l
a
s

A
p
l
i
c
a
c
i
o
n
e
s

M
u
l
t
i
-
F
i
l
a
E
l

o
b
j
e
t
i
v
o

d
e

u
n
a

a
p
l
i
c
a
c
i

n

m
u
l
t
i
-
f
i
l
a

e
s

q
u
e

e
l

c
l
i
e
n
t
e

p
u
e
d
a

t
r
a
b
a
j
a
r

c
o
n

l
o
s

d
a
t
o
s

d
e

u
n
a

a
p
l
i
c
a
c
i

n

s
i
n

c
o
n
o
c
e
r

e
n

e
l

m
o
m
e
n
t
o

d
e

l
a

c
o
n
s
t
r
u
c
c
i

n

d

n
d
e

s
e

e
n
c
u
e
n
t
r
a
n

l
o
s

d
a
t
o
s
.
P
a
r
a

h
a
c
e
r

p
o
s
i
b
l
e

e
s
t
e

n
i
v
e
l

d
e

t
r
a
n
s
p
a
r
e
n
c
i
a
,

l
o
s

s
e
r
v
i
c
i
o
s

o
c
u
l
t
o
s

e
n

u
n
a

a
r
q
u
i
t
e
c
t
u
r
a

m
u
l
t
i
-
f
i
l
a

u
s
a
n

s
e
r
v
i
c
i
o
s

d
e

b

s
q
u
e
d
a

p
a
r
a

l
o
c
a
l
i
z
a
r

l
o
s

o
b
j
e
t
o
s

d
e
l

s
e
r
v
i
d
o
r

r
e
m
o
t
o

(
e
l
o
b
j
e
t
o

i
n
t
e
r
f
a
c
e

d
e
l

B
e
a
n

r
e
m
o
t
o
)
,

y

l
o
s

s
e
r
v
i
c
i
o
s

d
e

c
o
m
u
n
i
c
a
c
i

n

d
e

d
a
t
o
s

p
a
r
a

m
o
v
e
r

l
o
s

d
a
t
o
s

d
e
s
d
e

e
l

c
l
i
e
n
t
e
,

a

t
r
a
v

s

d
e
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o
,

h
a
s
t
a

s
u

d
e
s
t
i
n
o

f
i
n
a
l

e
n

e
l
m
e
d
i
o

d
e

a
l
m
a
c
e
n
a
j
e
.
S
e
r
v
i
c
i
o

d
e

B

s
q
u
e
d
a
P
a
r
a

e
n
c
o
n
t
r
a
r

l
o
s

o
b
j
e
t
o
s

d
e
l

s
e
r
v
i
d
o
r

r
e
m
o
t
o

e
n

e
l

m
o
m
e
n
t
o

d
e

l
a

e
j
e
c
u
c
i

n
,

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

n
e
c
e
s
i
t
a

u
n
a

f
o
r
m
a

d
e

b
u
s
c
a
r
l
o
s
.

U
n
a

d
e

e
s
t
a
s

f
o
r
m
a
s

e
s

u
s
a
r

e
l

A
P
I

J
a
v
a
N
a
m
i
n
g

y

D
i
r
e
c
t
o
r
y

I
n
t
e
r
f
a
c
e
T
M

(
J
N
D
I
)
.

J
N
D
I

e
s

u
n

i
n
t
e
r
f
a
c
e

c
o
m

n

p
a
r
a

i
n
t
e
r
f
a
c
e
s

e
x
i
s
t
e
n
t
e
s

d
e

n
o
m
b
r
e
s

y

d
i
r
e
c
t
o
r
i
o
s
.

L
o
s

c
o
n
t
e
n
e
d
o
r
e
s

d
e

l
o
s

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

u
s
a
n

J
N
D
I
c
o
m
o

i
n
t
e
r
f
a
c
e

p
a
r
a

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

d
e
l

R
e
m
o
t
e

M
e
t
h
o
d

I
n
v
o
c
a
t
i
o
n

(
R
M
I
)
.
D
u
r
a
n
t
e

e
l

d
e
s
a
r
r
o
l
l
o
,

e
l

s
e
r
v
i
c
i
o

J
N
D
I

r
e
g
i
s
t
r
a

e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o

c
o
n

u
n

n
o
m
b
r
e
.

S
i
e
m
p
r
e

q
u
e

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

u
s
e

e
l

m
i
s
m
o

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

y

p
r
e
g
u
n
t
e

p
o
r

e
l

i
n
t
e
r
f
a
c
e
r
e
m
o
t
o

c
o
n

s
u

n
o
m
b
r
e

r
e
g
i
s
t
r
a
d
o
,

p
o
d
r


e
n
c
o
n
t
r
a
r
l
o
.

E
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

l
l
a
m
a

a
l

m

t
o
d
o

l
o
o
k
u
p

s
o
b
r
e

u
n

o
b
j
e
t
o

j
a
v
a
x
.
n
a
m
i
n
g
.
C
o
n
t
e
x
t

p
a
r
a

p
r
e
g
u
n
t
a
r

p
o
r

e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o
c
o
n

s
u

n
o
m
b
r
e

r
e
g
i
s
t
r
a
d
o
.

E
l

o
b
j
e
t
o

j
a
v
a
x
.
n
a
m
i
n
g
.
C
o
n
t
e
x
t

e
s

d
o
n
d
e

s
e

a
l
m
a
c
e
n
a
n

l
a
s

u
n
i
o
n
e
s

y

e
s

u
n

o
b
j
e
t
o

d
i
f
e
r
e
n
t
e

d
e
l

c
o
n
t
e
x
t
o

d
e
l

J
a
v
a
B
e
a
n

d
e

E
n
t
e
r
p
r
i
s
e
,

q
u
e

s
e

c
u
b
r
e
m

s

a
d
e
l
a
n
t
e
.
.
C
o
m
u
n
i
c
a
c
i

n

d
e

D
a
t
o
s
U
n
a

v
e
z

q
u
e

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

o
b
t
i
e
n
e

u
n
a

r
e
f
e
r
e
n
c
i
a

a
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o
,

h
a
c
e

l
l
a
m
a
d
a
s

a

l
o
s

m

t
o
d
o
s

d
e

e
s
t
e

o
b
j
e
t
o
.

C
o
m
o

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

t
i
e
n
e

u
n
a

r
e
f
e
r
e
n
c
i
a

a
l
o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o
,

s
e

u
s
a

u
n
a

t

c
n
i
c
a

l
l
a
m
a
d
a

"
e
n
v
o
l
v
e
r

d
a
t
o
s
"

p
a
r
a

h
a
c
e
r

q
u
e

p
a
r
e
z
c
a

q
u
e

e
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o

e
s

l
o
c
a
l

p
a
r
a

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e
.
L
a

"
o
r
d
e
n
a
c
i

n

d
e

d
a
t
o
s
"

e
s

d
o
n
d
e

l
a
s

l
l
a
m
a
d
a
s

a

m

t
o
d
o
s

d
e
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o

s
e

e
m
p
a
q
u
e
t
a
n

c
o
n

s
u
s

d
a
t
o
s

y

s
e

e
n
v

a
n

a
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o
.

E
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r
r
e
m
o
t
o

d
e
s
e
m
p
a
q
u
e
t
a

(
d
e
s
o
r
d
e
n
a
)

l
o
s

m

t
o
d
o
s

y

l
o
s

d
a
t
o
s
,

y

l
l
a
m
a

a
l

B
e
a
n

E
n
t
e
r
p
r
i
s
e
.

E
l

r
e
s
u
l
t
a
d
o

d
e

l
a

l
l
a
m
d
a

a
l

B
e
a
n

e
s

e
m
p
a
q
u
e
t
a
d
o

d
e

n
u
e
v
o

y

p
a
s
a
d
o

d
e

v
u
e
l
t
a

a
l

c
l
i
e
n
t
e

a
t
r
a
v

s

d
e
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o
,

y

s
o
n

d
e
s
e
m
p
a
q
u
e
t
a
d
o
s
.
L
o
s

c
o
n
t
e
n
e
d
o
r
e
s

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

u
s
a
n

s
e
r
v
i
c
i
o
s

R
M
I

p
a
r
a

o
r
d
e
n
a
r

l
o
s

d
a
t
o
s
.

C
u
a
n
d
o

s
e

c
o
m
p
i
l
a

u
n

B
e
a
n
,

s
e

c
r
e
a
n

u
n
o
s

f
i
c
h
e
r
o
s

s
t
u
b

(
t
a
l

n
)

y

s
k
e
l
e
t
o
n

(
e
s
q
u
e
l
e
t
o
)
.

E
l
f
i
c
h
e
r
o
t
a
l

n

p
r
o
p
o
r
c
i
o
n
a

l
a

c
o
n
f
i
g
u
r
a
c
i

n

d
e
l

e
m
p
a
q
u
e
t
a
d
o

y

d
e
s
e
m
p
a
q
u
e
t
a
d
o

d
e

d
a
t
o
s

e
n

e
l

c
l
i
e
n
t
e
,

y

e
l

e
s
q
u
e
l
e
t
o

p
r
o
p
o
r
c
i
o
n
a

l
a

m
i
s
m
a

i
n
f
o
r
m
a
c
i

n

p
a
r
a

e
l

s
e
r
v
i
d
o
r
.
L
o
s

d
a
t
o
s

s
e

p
a
s
a
n

e
n
t
r
e

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

y

e
l

s
e
r
v
i
d
o
r

u
s
a
n
d
o

s
e
r
i
a
l
i
z
a
c
i

n
.

L
a

s
e
r
i
a
l
i
z
a
c
i

n

e
s

u
n
a

f
o
r
m
a

d
e

r
e
p
r
e
s
e
n
t
a
r

o
b
j
e
t
o
s

J
a
v
a
T
M

c
o
m
o

b
y
t
e
s

q
u
e

p
u
e
d
e
n

s
e
r

e
n
v
i
a
d
o
s

a
t
r
a
v

s

d
e

l
a

r
e
d

c
o
m
o

u
n

s
t
r
e
a
m

y

p
u
e
d
e
n

s
e
r

r
e
c
o
n
s
t
u
i
d
o
s

e
n

e
l

m
i
s
m
o

e
s
t
a
d
o

e
n

e
l

q
u
e

f
u
e
r
o
n

e
n
v
i
a
d
o
s

o
r
i
g
i
n
a
l
m
e
n
t
e
.
O
z
i
t
o
B
e
a
n
s

d
e

E
n
t
i
d
a
d

y

d
e

S
e
s
i

n
E
l

e
j
e
m
p
l
o

u
s
a

d
o
s

B
e
a
n
s

d
e

e
n
t
i
d
a
d

y

d
o
s

d
e

s
e
s
i

n
.

L
o
s

B
e
a
n
s

d
e

e
n
t
i
d
a
d
,

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

y

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
,

r
e
p
r
e
s
e
n
t
a
n

t
e
m
s

p
e
r
s
i
s
t
e
n
t
e
s

q
u
e

p
o
d
r

a
n

e
s
t
a
r
a
l
m
a
c
e
n
a
d
o
s

e
n

u
n

b
a
s
e

d
e

d
a
t
o
s
,

y

l
o
s

B
e
a
n
s

d
e

s
e
s
i

n
,

S
e
l
l
e
r
B
e
a
n

y

B
i
d
d
e
r
B
e
a
n
,

r
e
p
r
e
s
e
n
t
a
n

o
p
e
r
a
c
i
o
n
e
s

d
e

v
i
d
a

c
o
r
t
a

c
o
n

e
l

c
l
i
e
n
t
e

y

l
o
s

d
a
t
o
s
.
L
o
s

B
e
a
n
s

d
e

s
e
s
i

n

s
o
n

e
l

i
n
t
e
r
f
a
c
e

d
e
l

c
l
i
e
n
t
e

h
a
c
i
a

l
o
s

b
e
a
n
s

d
e

e
n
t
i
d
a
d
.

E
l

S
e
l
l
e
r
B
e
a
n

p
r
o
c
e
s
a

p
e
t
i
c
i
o
n
e
s

p
a
r
a

a

a
d
i
r

n
u
e
v
o
s

t
e
m
s

p
a
r
a

l
a

s
u
b
a
s
t
a
.

E
l

B
i
d
d
e
r
B
e
a
n

p
r
o
c
e
s
a
p
e
t
i
c
i
o
n
e
s

p
a
r
a

r
e
c
u
p
e
r
a
r

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a

y

s
i
t
u
a
r

l
a
s

p
u
j
a
s

p
o
r

e
s
o
s

t
e
m
s
.

E
l

c
a
m
b
i
o

o

a
d
i
c
i

n

d
e

d
a
t
o
s

a

l
a

b
a
s
e

d
e

d
a
t
o
s

e
n

u
n

B
e
a
n

c
o
n
t
r
o
l
a
d
o

p
o
r

c
o
n
t
e
n
e
d
o
r

s
e

l
e

d
e
j
a

a
l
o
s

B
e
a
n
s

d
e

e
n
t
i
d
a
d
:
A
u
c
t
i
o
n

S
e
r
v
l
e
t




B
e
a
n
s

d
e

E
n
t
i
d
a
d




B
e
a
n
s

d
e

S
e
s
i




C
l
a
s
e
s

C
o
n
t
e
n
e
d
o
r




A
u
c
t
i
o
n
S
e
r
v
l
e
t
E
l
A
u
c
t
i
o
n
S
e
r
v
l
e
t

e
s

e
s
e
n
c
i
a
l
m
e
n
t
e

l
a

s
e
g
u
n
d
a

f
i
l
a

e
n

l
a

a
p
l
i
c
a
c
i

n

y

e
l

p
u
n
t
o

f
o
c
a
l

p
a
r
a

l
a
s

a
c
t
i
v
i
d
a
d
e
s

d
e

l
a

s
u
b
a
s
t
a
.

A
c
e
p
t
a

e
n
t
r
a
d
a
s

f
i
n
a
l
e
s

d
e
l

u
s
u
a
r
i
o

d
e
s
d
e

e
l

n
a
v
e
g
a
d
o
r
m
e
d
i
a
n
t
e

e
l

p
r
o
t
o
c
o
l
o

d
e

t
r
a
n
s
f
e
r
e
n
c
i
a

d
e

h
y
p
e
r
t
e
x
t
o

(
H
T
T
P
)
,

p
a
s
a

l
a

e
n
t
r
a
d
a

a
l

B
e
a
n

E
n
t
e
r
p
r
i
s
e

a
p
r
o
p
i
a
d
o

p
a
r
a

s
u

p
r
o
c
e
s
o
,

y

m
u
e
s
t
r
a

e
l

r
e
s
u
l
t
a
d
o

d
e
l

p
r
o
c
e
s
o

a
l

u
s
u
a
r
i
o

f
i
n
a
l

e
n
e
l

n
a
v
e
g
a
d
o
r
.
A
q
u


h
a
y

u
n

d
i
a
g
r
a
m
a

d
e
l

t
i
p
o

U
n
i
f
i
e
d

M
o
d
e
l
i
n
g

L
a
n
g
u
a
g
e

(
U
M
L
)

p
a
r
a

l
a

c
l
a
s
e

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
L
o
s

m

t
o
d
o
s

d
e

A
u
c
t
i
o
n
S
e
r
v
l
e
t

m
o
s
t
r
a
d
o
s

a
r
r
i
b
a

i
n
v
o
c
a
n

a

l
a

l

g
i
c
a

d
e
l

n
e
g
o
c
i
o

q
u
e

s
e

e
j
e
c
u
t
a

e
n

e
l

s
e
r
v
i
d
o
r

b
u
s
c
a
n
d
o

u
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

y

l
l
a
m
a
n
d
o

a

u
n
o

o

m

s

d
e

s
u
s
m

t
o
d
o
s
.

C
u
a
n
d
o

e
l

s
e
r
v
e
l
t

a

a
d
e

c

d
i
g
o

H
T
M
L

a

u
n
a

p

g
i
n
a

p
a
r
a

m
o
s
t
r
a
r
s
e
l
a

a
l

u
s
u
a
r
i
o
,

l
a

l

g
i
c
a

s
e

e
j
e
c
u
t
a

e
n

e
l

c
l
i
e
n
t
e
.
P
o
r

e
j
e
m
p
l
o
,

e
l

m

t
o
d
o

l
i
s
t
A
l
l
I
t
e
m
s
(
o
u
t
)

e
j
e
c
u
t
a

c

d
i
g
o

e
n

e
l

c
l
i
e
n
t
e

p
a
r
a

g
e
n
e
r
a
r

d
i
n

m
i
c
a
m
e
n
t
e

u
n
a

p

g
i
n
a

H
T
M
L

p
a
r
a

q
u
e

l
a

v
e
a

e
l

c
l
i
e
n
t
e

e
n

u
n

n
a
v
e
g
a
d
o
r
.

L
a

p

g
i
n
a

H
T
M
L
s
e

r
e
l
l
e
n
a

c
o
n

l
o
s

r
e
s
u
l
t
a
d
o
s

d
e

u
n
a

l
l
a
m
a
d
a

a

B
i
d
d
e
r
B
e
a
n

q
u
e

e
j
e
c
u
t
a

l
a

l

g
i
c
a

e
n

e
l

s
e
r
v
i
d
o
r

p
a
r
a

g
e
n
e
r
a
r

u
n
a

l
i
s
t
a

d
e

t
o
d
o
s

l
o
s

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a
.
p
r
i
v
a
t
e

v
o
i
d

l
i
s
t
A
l
l
I
t
e
m
s
(
S
e
r
v
l
e
t
O
u
t
p
u
t
S
t
r
e
a
m

o
u
t
)

































t
h
r
o
w
s

I
O
E
x
c
e
p
t
i
o
n
{
/
/
P
u
t

t
e
x
t

o
n

H
T
M
L

p
a
g
e


s
e
t
T
i
t
l
e
(
o
u
t
,

"
A
u
c
t
i
o
n

r
e
s
u
l
t
s
"
)
;


S
t
r
i
n
g

t
e
x
t

=

"
C
l
i
c
k

I
t
e
m

n
u
m
b
e
r

f
o
r

d
e
s
c
r
i
p
t
i
o
n

















a
n
d

t
o

p
l
a
c
e

b
i
d
.
"
;


t
r
y
{





a
d
d
L
i
n
e
(
"
<
B
R
>
"
+
t
e
x
t
,

o
u
t
)
;
/
/
L
o
o
k

u
p

B
i
d
d
e
r

b
e
a
n

h
o
m
e

i
n
t
e
r
f
a
c
e
.





B
i
d
d
e
r
H
o
m
e

b
h
o
m
e
=
(
B
i
d
d
e
r
H
o
m
e
)

c
t
x
.
l
o
o
k
u
p
(
"
b
i
d
d
e
r
"
)
;
/
/
C
r
e
a
t
e

B
i
d
d
e
r

b
e
a
n

r
e
m
o
t
e

i
n
t
e
r
f
a
c
e
.





B
i
d
d
e
r

b
i
d
=
b
h
o
m
e
.
c
r
e
a
t
e
(
)
;
/
/
C
a
l
l

B
i
d
d
e
r

b
e
a
n

m
e
t
h
o
d

t
h
r
o
u
g
h

r
e
m
o
t
e

i
n
t
e
r
f
a
c
e
.





E
n
u
m
e
r
a
t
i
o
n

e
n
u
m
=
(
E
n
u
m
e
r
a
t
i
o
n
)
b
i
d
.
g
e
t
I
t
e
m
L
i
s
t
(
)
;





i
f
(
e
n
u
m

!
=

n
u
l
l
)

{
/
/
P
u
t

r
e
t
r
i
e
v
e
d

i
t
e
m
s

o
n

s
e
r
v
l
e
t

p
a
g
e
.







d
i
s
p
l
a
y
i
t
e
m
s
(
e
n
u
m
,

o
u
t
)
;







a
d
d
L
i
n
e
(
"
"
,

o
u
t
)
;





}


}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{
/
/
P
r
i
n
g

e
r
r
o
r

o
n

s
e
r
v
l
e
t

p
a
g
e
.





a
d
d
L
i
n
e
(
"
A
u
c
t
i
o
n
S
e
r
v
l
e
t

L
i
s
t

A
l
l

I
t
e
m
s

e
r
r
o
r
"
,
o
u
t
)
;





S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
A
u
c
t
i
o
n
S
e
r
v
l
e
t

<
l
i
s
t
>
:
"
+
e
)
;


}





o
u
t
.
f
l
u
s
h
(
)
;
}
B
e
a
n
s

d
e

E
n
t
i
d
a
d
A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

y

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

s
o
n

B
e
a
n
s

d
e

e
n
t
i
d
a
d
.

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

a

a
d
e

n
u
e
v
o
s

t
e
m
s

d
e

s
u
b
a
s
t
a

a

l
a

b
a
s
e

d
e

d
a
t
o
s

y

a
c
t
u
a
l
i
z
a

l
a

c
a
n
t
i
d
a
d

p
u
j
a
d
a

p
o
r

l
o
s
u
s
u
a
r
i
o
s

c
u
a
n
d
o

s
t
o
s

p
u
j
a
n

p
o
r

e
l

t
e
m
.

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

a

a
d
e

i
n
f
o
r
m
a
c
i

n

a

l
a

b
a
s
e

d
e

d
a
t
o
s

s
o
b
r
e

u
s
u
a
r
i
o
s

r
e
g
i
s
t
r
a
d
o
s
.

A
m
b
o
s

B
e
a
n
s

c
o
n
s
i
s
t
e
n

e
n

l
a
s

c
l
a
s
e
s

d
e
s
c
r
i
t
a
s

a
q
u

.
A
u
c
t
i
o
n
I
t
e
m

E
n
t
i
t
y

B
e
a
n
A
q
u


e
s
t

n

l
a
s

c
l
a
s
e

d
e

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n
.

R
e
c
u
e
r
d
a

q
u
e

e
s
t
o
s

B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

s
o
n

o
b
j
e
t
o
s

d
i
s
t
r
i
b
u
i
d
o
s

q
u
e

u
s
a
n

e
l

A
P
I

R
M
I

(
I
n
v
o
c
a
c
i

n

R
e
m
o
t
a

d
e

M

t
o
d
o
s
)
,

p
o
r

e
s
o
,

c
u
a
n
d
o
o
c
u
r
r
e

u
n

e
r
r
o
r

s
e

l
a
n
z
a

u
n
a

e
x
c
e
p
c
i

n

R
M
I

r
e
m
o
t
a
.
A
u
c
t
i
o
n
I
t
e
m
.
j
a
v
a




A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.
j
a
v
a




A
u
c
t
i
o
n
I
t
e
m
B
e
a
n
.
j
a
v
a




A
u
c
t
i
o
n
I
t
e
m
P
k
.
j
a
v
a




A
u
c
t
i
o
n
I
t
e
m

e
s

u
n

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o
.

D
e
s
c
r
i
b
e

q
u


h
a
c
e

e
l

B
e
a
n

d
e
c
l
a
r
a
n
d
o

l
o
s

m

t
o
d
o
s

d
e
f
i
n
i
d
o
s

p
o
r

e
l

u
s
u
a
r
i
o

q
u
e

p
r
o
p
o
r
c
i
o
n
a
n

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

p
a
r
a

e
s
t
e

B
e
a
n
.

E
s
t
o
s
m

t
o
d
o
s

s
o
n

u
s
a
d
o
s

p
o
r

e
l

c
l
i
e
n
t
e

p
a
r
a

i
n
t
e
r
a
c
t
u
a
r

c
o
n

e
l

B
e
a
n

s
o
b
r
e

l
a

c
o
n
e
x
i

n

r
e
m
o
t
a
.

S
u

n
o
m
b
r
e

s
e

m
a
p
e
a

a

l
a

t
a
b
l
a

A
U
C
T
I
O
N
I
T
E
M
S

q
u
e

p
u
e
d
e
s

v
e
r

a
b
a
j
o
.
A
u
c
t
i
o
n
I
t
e
m
H
o
m
e

e
s

e
l

i
n
t
e
r
f
a
c
e

h
o
m
e
.

D
e
s
c
r
i
b
e

c

m
o

s
e

c
r
e
a

e
l

B
e
a
n
,

c
o
m
o

e
n
c
o
n
t
r
a
r
l
o
,

y

e
l
i
m
i
n
a
r
l
o

d
e

s
u

c
o
n
t
e
n
e
d
o
r
.

L
a
s

h
e
r
r
a
m
i
e
n
t
a
s

d
e

d
e
s
a
r
r
o
l
l
o

d
e
l

s
e
r
v
i
d
o
r

d
e

B
e
a
n
s

d
e
E
n
t
e
r
p
r
i
s
e

p
r
o
p
o
r
c
i
o
n
a
r

n

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

p
a
r
a

e
s
t
e

i
n
t
e
r
f
a
c
e
.
A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

e
s

e
l

B
e
a
n

d
e

E
n
t
e
r
p
r
i
s
e
.

I
m
p
l
e
m
e
n
t
a

E
n
t
i
t
y
B
e
a
n
,

p
r
o
p
o
r
c
i
o
n
a

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

p
a
r
a

l
o
s

m

t
o
d
o
s

d
e
f
i
n
i
d
o
s

p
o
r

e
l

d
e
s
a
r
r
o
l
l
a
d
o
r
,

e

i
m
p
l
e
m
e
n
t
a

l
o
s

m

t
o
d
o
s
d
e
E
n
t
i
t
y
B
e
a
n

p
a
r
a

c
r
e
a
r

e
l

B
e
a
n

y

s
e
l
e
c
c
i
o
n
a
r

e
l

c
o
n
t
e
x
t
o

d
e

s
e
s
i

n
.

E
s
t
a

e
s

u
n
a

c
l
a
s
e

q
u
e

n
e
c
e
s
i
t
a

i
m
p
l
e
m
e
n
t
a
r

e
l

d
e
s
a
r
r
o
l
l
a
d
o
r

d
e
l

B
e
a
n
.

S
u
s

c
a
m
p
o
s

v
a
r
i
a
b
l
e
s

m
a
p
e
a
n

a

l
o
s
c
a
m
p
o
s

d
e

l
a

t
a
b
l
a

A
U
C
T
I
O
N
I
T
E
M
S

q
u
e

p
u
e
d
e
s

v
e
r

a
b
a
j
o
.
A
u
c
t
i
o
n
I
t
e
m
P
K

e
s

l
a

c
l
a
s
e

c
l
a
v
e

p
r
i
m
a
r
i
a
.

E
l

s
e
r
v
i
d
o
r

d
e

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

r
e
q
u
i
e
r
e

q
u
e

u
n

B
e
a
n

d
e

E
n
t
i
d
a
d

M
a
n
e
j
a
d
o

p
o
r

C
o
n
t
e
n
e
d
o
r

t
e
n
g
a

u
n
a

c
l
a
s
e

c
l
a
v
e

p
r
i
m
a
r
i
a

c
o
n

u
n
c
a
m
p
o

p

b
l
i
c
o

p
r
i
m
a
r
i
o

(
o

c
a
m
p
o
s
,

s
i

s
e

u
s
a
n

c
l
a
v
e
s

p
r
i
m
a
r
i
a
s

c
o
m
p
u
e
s
t
a
s
)
.

E
l

d
e
s
a
r
r
o
l
l
a
d
o
r

d
e
l

B
e
a
n

i
m
p
l
e
m
e
n
t
a

e
s
t
a

c
l
a
s
e
.

E
l

c
a
m
p
o

I
D

e
s

l
a

c
l
a
v
e

p
r
i
m
a
r
i
a

e
n

l
a

t
a
b
l
a
A
U
C
T
I
O
N
I
T
E
M
S

q
u
e

p
u
e
d
e
s

v
e
r

m

s

a
b
a
j
o
,

p
o
r

e
s
o

e
l

c
a
m
p
o

i
d

e
s

u
n

c
a
m
p
o

p

b
l
i
c
o

d
e

e
s
t
a

c
l
a
s
e
.

A
l

c
a
m
p
o

i
d

s
e

l
e

a
s
i
g
n
a

u
n

v
a
l
o
r

c
u
a
n
d
o

s
e

c
o
n
s
t
r
u
y
e

l
a

c
l
a
s
e

d
e

l
a

c
l
a
v
e
p
r
i
m
a
r
i
a
.
P
o
d
e
m
o
s

p
e
d
i
r
l
e

a
l

c
o
n
t
e
n
e
d
o
r

q
u
e

m
a
n
e
j
e

l
a

p
e
r
s
i
s
t
e
n
c
i
a

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s

d
e

u
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

o

e
s
c
r
i
b
i
r

e
l

c

d
i
g
o

p
a
r
a

m
a
n
e
j
a
r

l
a

p
e
r
s
i
s
t
e
n
c
i
a

p
o
r

n
o
s
o
t
r
o
s

m
i
s
m
o
s
.

E
n

e
s
t
e
c
a
p

t
u
l
o
,

t
o
d
o
s

l
o
s

b
e
a
n
s

s
o
n

m
a
n
e
j
a
d
o
s

p
o
r

e
l

c
o
n
t
e
n
e
d
o
r
.

C
o
n

e
s
t
o

n
o
s
o
t
r
o
s

s

l
o

d
e
c
i
m
o
s

q
u


c
a
m
p
o
s

s
o
n

m
a
n
e
j
a
d
o
s

p
o
r

e
l

c
o
n
t
e
n
e
d
o
r

y

l
e

d
e
j
a
m
o
s

a
l

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

d
e
E
n
t
e
r
p
r
i
s
e

q
u
e

h
a
g
a

e
l

r
e
s
t
o
.

E
s
t
o

e
s

f
e
n
o
m
e
n
a
l

p
a
r
a

l
a
s

a
p
l
i
c
a
c
i
o
n
e
s

s
e
n
c
i
l
l
a
s
,

p
e
r
o

s
i

t
u
v
i
e
r
a
m
o
s

q
u
e

c
o
d
i
f
i
c
a
r

a
l
g
o

m

s

c
o
m
p
l
e
j
o
,

n
e
c
e
s
i
t
a
r

a
m
o
s

m

s

c
o
n
t
r
o
l
.
C

m
o

e
s
c
r
i
b
i
r

l
o
s

s
e
r
v
i
c
i
o
s

o
c
u
l
t
o
s

d
e

l
o
s

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

p
a
r
a

g
a
n
a
r

m

s

c
o
n
t
r
o
l

o

p
r
o
p
o
r
c
i
o
n
a
r

s
e
r
v
i
c
i
o
s

s
i
m
i
l
a
r
e
s

p
a
r
a

l
a
s

a
p
l
i
c
a
c
i
o
n
e
s

q
u
e

n
o

u
s
e
n

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
s
e

c
u
b
r
e

e
n

e
l

c
a
p

t
u
l
o

3
.
T
a
b
l
a

A
u
c
t
i
o
n

I
t
e
m
s
A
q
u


e
s
t


l
a

t
a
b
l
a

A
U
C
T
I
O
N
I
T
E
M
S
.
c
r
e
a
t
e

t
a
b
l
e

A
U
C
T
I
O
N
I
T
E
M
S

(
S
U
M
M
A
R
Y

V
A
R
C
H
A
R
(
8
0
)

,
I
D

I
N
T

,
C
O
U
N
T
E
R

I
N
T

,
D
E
S
C
R
I
P
T
I
O
N

V
A
R
C
H
A
R
(
1
0
0
0
)

,
S
T
A
R
T
D
A
T
E

D
A
T
E

,
E
N
D
D
A
T
E

D
A
T
E

,
S
T
A
R
T
P
R
I
C
E

D
O
U
B
L
E

P
R
E
C
I
S
I
O
N

,
I
N
C
R
E
M
E
N
T

D
O
U
B
L
E

P
R
E
C
I
S
I
O
N

,
S
E
L
L
E
R

V
A
R
C
H
A
R
(
3
0
)

,
M
A
X
B
I
D

D
O
U
B
L
E

P
R
E
C
I
S
I
O
N
,
B
I
D
C
O
U
N
T

I
N
T
,
H
I
G
H
B
I
D
D
E
R

V
A
R
C
H
A
R
(
3
0
)

)
R
e
g
i
s
t
r
a
t
i
o
n

E
n
t
i
t
y

B
e
a
n
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

c
o
n
s
t
a

d
e

l
a
s

m
i
s
m
a
s

c
l
a
s
e
s

y

t
a
b
l
a
s

d
e

b
a
s
e

d
e

d
a
t
o
s

q
u
e

e
l

B
e
a
n

A
u
c
t
i
o
n
I
t
e
m
,

e
x
c
e
p
t
o

q
u
e

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

r
e
a
l
,

l
o
s

c
a
m
p
o
s

d
e

l
a

t
a
b
l
a

d
e

l
a

b
a
s
e

d
e
d
a
t
o
s
,

y

l
a

c
l
a
v
e

p
r
i
m
a
r
i
a

s
o
n

d
e

a
l
g
u
n
a

f
o
r
m
a

d
i
f
e
r
e
n
t
e
s
.

E
n

v
e
z

d
e

d
e
s
c
r
i
b
i
r

l
a
s

c
l
a
s
e
s
,

p
o
d
e
m
o
s

n
a
v
e
g
a
r

p
o
r

e
l
l
a
s

y

l
u
e
g
o

v
o
l
v
e
r

a

l
a

d
e
s
c
r
i
p
c
i

n

d
e

l
a
s

c
l
a
s
e
s

d
e

A
u
c
t
i
o
n
I
t
e
m

s
i
t
e
n
e
m
o
s

a
l
g
u
n
a

p
r
e
g
u
n
t
a
.
R
e
g
i
s
t
r
a
t
i
o
n
.
j
a
v
a




R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
j
a
v
a




R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
.
j
a
v
a




R
e
g
i
s
t
r
a
t
i
o
n
P
K
.
j
a
v
a




T
a
b
l
a

R
e
g
i
s
t
r
a
t
i
o
n
A
q
u


e
s
t


l
a

t
a
b
l
a

R
E
G
I
S
T
R
A
T
I
O
N
.
c
r
e
a
t
e

t
a
b
l
e

R
E
G
I
S
T
R
A
T
I
O
N

(
T
H
E
U
S
E
R

V
A
R
C
H
A
R
(
4
0
)

,
P
A
S
S
W
O
R
D

V
A
R
C
H
A
R
(
4
0
)

,
E
M
A
I
L
A
D
D
R
E
S
S

V
A
R
C
H
A
R
(
8
0
)

,
C
R
E
D
I
T
C
A
R
D

V
A
R
C
H
A
R
(
4
0
)

,
B
A
L
A
N
C
E

D
O
U
B
L
E

P
R
E
C
I
S
I
O
N

)
B
e
a
n
s

d
e

S
e
s
i

n
B
i
d
d
e
r
B
e
a
n

y

S
e
l
l
e
r
B
e
a
n

s
o
n

l
o
s

B
e
a
n
s

d
e

s
e
s
i

n
.

B
i
d
d
e
r
B
e
a
n

r
e
c
u
p
e
r
a

u
n
a

l
i
s
t
a

d
e

l
o
s

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a
,

b
u
s
c
a

t
e
m
s
,

c
h
u
e
q
u
e
a

e
l

I
D

y

l
a

p
a
s
s
w
o
r
d

d
e
l

u
s
u
a
r
i
o

c
u
a
n
d
o
a
l
g
u
i
e
n

h
a
c
e

u
n
a

p
u
j
a
,

y

a
l
m
a
c
e
n
a

l
a
s

n
u
e
v
a
s

p
u
j
a
s

e
n

l
a

b
a
s
e

d
e

d
a
t
o
s
.

S
e
l
l
e
r
B
e
a
n

c
h
e
q
u
e
a

e
l

I
D

y

l
a

p
a
s
s
w
o
r
d

d
e
l

u
s
u
a
r
i
o

c
u
a
n
d
o

a
l
g
u
i
e
n

p
o
s
t
e
a

u
n

t
e
m

p
a
r
a

s
u

s
u
b
a
s
t
a
,

y
a

a
d
e

n
u
e
v
o
s

t
e
m
s

p
a
r
a

s
u
b
a
s
t
a

a

l
a

b
a
s
e

d
e

d
a
t
o
s
.
A
m
b
o
s

B
e
a
n
s

d
e

s
e
s
i

n

e
s
t

n

d
e
s
a
r
r
o
l
l
a
d
o
s

i
n
i
c
i
a
l
m
e
n
t
e

c
o
m
o

B
e
a
n
s

s
i
n

e
s
t
a
d
o
.

U
n

B
e
a
n

s
i
n

e
s
t
a
d
o

n
o

m
a
n
t
i
e
n
e

u
n

r
e
g
i
s
t
r
o

d
e

l
o

q
u
e

h
i
z
o

e
l

c
l
i
e
n
t
e

e
n

u
n
a

l
l
a
m
a
d
a

a
n
t
e
r
i
o
r
;
m
i
e
n
t
r
a
s

q
u
e

u
n

B
e
a
n

c
o
n

e
s
t
a
d
o

c
o
m
p
l
e
t
o

s
i

l
o

h
a
c
e
.

L
o
s

B
e
a
n
s

c
o
n

e
s
t
a
d
o

c
o
m
p
l
e
t
o

s
o
n

m
u
y

t
i
l
e
s

s
i

l
a

o
p
e
r
a
c
i

n

e
s

a
l
g
o

m

s

q
u
e

u
n
a

s
i
m
p
l
e

b

s
q
u
e
d
a

y

l
a

o
p
e
r
a
c
i

n

d
e
l

c
l
i
e
n
t
e
d
e
p
e
n
d
e

d
e

a
l
g
o

q
u
e

h
a

s
u
c
e
d
i
d
o

e
n

u
n
a

l
l
a
m
a
d
a

a
n
t
e
r
i
o
r
.
B
e
a
n

d
e

s
e
s
i

n

B
i
d
d
e
r
A
q
u


e
s
t

n

l
a
s

c
l
a
s
e

d
e

B
i
d
d
e
r
B
e
a
n
.

R
e
c
u
e
r
d
a

q
u
e

e
s
t
o
s

B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

s
o
n

o
b
j
e
t
o
s

d
i
s
t
r
i
b
u
i
d
o
s

q
u
e

u
s
a
n

e
l

A
P
I

R
M
I

(
I
n
v
o
c
a
c
i

n

R
e
m
o
t
a

d
e

M

t
o
d
o
s
)
,

p
o
r

e
s
o
,

c
u
a
n
d
o
o
c
u
r
r
e

u
n

e
r
r
o
r

s
e

l
a
n
z
a

u
n
a

e
x
c
e
p
c
i

n

R
M
I

r
e
m
o
t
a
.
N
o

e
x
i
t
e
n

c
l
a
v
e
s

p
r
i
m
a
r
i
a
s

p
o
r
q
u
e

e
s
t
o
s

B
e
a
n
s

s
o
n

t
e
m
p
o
r
a
l
e
s

y

n
o

h
a
y

a
c
c
e
s
o
s

a

l
a

b
a
s
e

d
e

d
a
t
o
s
.

P
a
r
a

r
e
c
u
p
e
r
a
r

t
e
m
s

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
,

B
i
d
d
e
r
B
e
a
n

c
r
e
a

u
n

e
j
e
m
p
l
a
r

d
e
A
u
c
t
i
o
n
I
t
e
m
B
e
a
n
,

y

p
a
r
a

p
r
o
c
e
s
a
r

l
a
s

p
u
j
a
s
,

c
r
e
a

u
n

e
j
e
m
p
l
a
r

d
e

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
.
B
i
d
d
e
r
.
j
a
v
a




B
i
d
d
e
r
H
o
m
e
.
j
a
v
a




B
i
d
d
e
r
B
e
a
n
.
j
a
v
a




B
i
d
d
e
r

e
s

u
n

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o
.

D
e
s
c
r
i
b
e

l
o

q
u
e

h
a
c
e

e
l

B
e
a
n

d
e
c
l
a
r
a
n
d
o

l
o
s

m

t
o
d
o
s

d
e
f
i
n
i
d
o
s

p
o
r

e
l

d
e
s
a
r
r
o
l
l
a
d
o
r

q
u
e

p
r
o
p
o
r
c
i
o
n
a
n

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

p
a
r
a

e
s
t
e

B
e
a
n
.

E
s
t
o

s
o
n
l
o
s

q
u
e

q
u
e

e
l

c
l
i
e
n
t
e

l
l
a
m
a

d
e

f
o
r
m
a

r
e
m
o
t
a
.
B
i
d
d
e
r
H
o
m
e

e
s

e
l

i
n
t
e
r
f
a
c
e

h
o
m
e
.

D
e
s
c
i
b
e

c

m
o

s
e

c
r
e
a
r

e
l

B
e
a
n
,

c
o
m
o

s
e

b
u
s
c
a

y

c
o
m
o

s
e

e
l
i
m
i
n
a

d
e

s
u

c
o
n
t
e
n
e
d
o
r
.
B
i
d
d
e
r
B
e
a
n

e
s

e
l

B
e
a
n

d
e

E
n
t
e
r
p
r
i
s
e
.

I
m
p
l
e
m
e
n
t
a

S
e
s
s
i
o
n
B
e
a
n
,

p
r
o
p
o
r
c
i
o
n
a

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

p
a
r
a

l
o
s

m

t
o
d
o
s

d
e
f
i
n
i
d
o
s

p
o
r

e
l

d
e
s
a
r
r
o
l
l
a
d
o
r
,

e

i
m
p
l
e
m
e
n
t
a

l
o
s

m

t
o
d
o
s

d
e
S
e
s
s
i
o
n
B
e
a
n

p
a
r
a

c
r
e
a
r

e
l

B
e
a
n

y

s
e
l
e
c
c
i
o
n
a
r

e
l

c
o
n
t
e
x
t
o

d
e

s
e
s
i

n
.
B
e
a
n

d
e

s
e
s
i
o
n

S
e
l
l
e
r
S
e
l
l
e
r
B
e
a
n

c
o
n
s
t
a

d
e

l
o
s

m
i
s
m
o
s

t
i
p
o
s

d
e

c
l
a
s
e

q
u
e

u
n

B
i
d
d
e
r
B
e
a
n
,

e
x
c
e
p
t
o

q
u
e

l
a

l

g
i
c
a

d
e

n
e
g
o
c
i
o

e
s

d
i
f
e
r
e
n
t
e
.

E
n

v
e
z

d
e

d
e
s
c
r
i
b
i
r

l
a
s

c
l
a
s
e
s
,

p
u
e
d
e
s

n
a
v
e
g
a
r

p
o
r

e
l
l
a
s

y

l
u
e
g
o
v
o
l
v
e
r

a

l
a

e
x
p
l
i
c
a
c
i

n

d
e

B
i
d
d
e
r
B
e
a
n

s
i

t
i
e
n
e
s

a
l
g
u
n
a

d
u
d
a
.
S
e
l
l
e
r
.
j
a
v
a




S
e
l
l
e
r
H
o
m
e
.
j
a
v
a




S
e
l
l
e
r
B
e
a
n
.
j
a
v
a




C
l
a
s
e
s

C
o
n
t
e
n
e
d
o
r
L
a
s

c
l
a
s
e
s

q
u
e

n
e
c
e
s
i
t
a

e
l

c
o
n
t
e
n
e
d
o
r

p
a
r
a

d
e
s
a
r
r
o
l
l
a
r

u
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

d
e
n
t
r
o

d
e

u
n

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

p
a
r
t
i
c
u
l
a
r

s
e

g
e
n
e
r
a
n

c
o
n

u
n
a

h
e
r
r
a
m
i
e
n
t
a

d
e

d
e
s
a
r
r
o
l
l
o
.
L
a
s

c
l
a
s
e
s

i
n
c
l
u
y
e
n

_
S
t
u
b
.
c
l
a
s
s

y

_
S
k
e
l
.
c
l
a
s
s

q
u
e

p
r
o
p
o
r
c
i
o
n
a
n

e
l

R
M
I

e
n

e
l

c
l
i
e
n
t
e

y

e
l

s
e
r
v
i
d
o
r

r
e
s
p
e
c
t
i
v
a
m
e
n
t
e
.
E
s
t
a
s

c
l
a
s
e
s

s
e

u
t
i
l
i
z
a
n

p
a
r
a

m
o
v
e
r

d
a
t
o
s

e
n
t
r
e

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

y

e
l

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
.

A
d
e
m

s
,

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e

l
a
s

c
l
a
s
e
s

s
e

c
r
e
a

p
a
r
a

l
o
s

i
n
t
e
r
f
a
c
e
s

y
l
a
s

r
e
g
l
a
s

d
e

d
e
s
a
r
r
o
l
l
o

d
e
f
i
n
i
d
a
s

p
a
r
a

n
u
e
s
t
r
o

B
e
a
n
.
E
l

o
b
j
e
t
o

S
t
u
b

s
e

i
n
s
t
a
l
a

o

s
e

d
e
s
c
a
r
g
a

e
n

e
l

s
i
s
t
e
m
a

c
l
i
e
n
t
e

y

p
r
o
p
o
r
c
i
o
n
a

u
n

o
b
j
e
t
o

p
r
o
x
y

l
o
c
a
l

p
a
r
a

e
l

c
l
i
e
n
t
e
.

I
m
p
l
e
m
e
n
t
a

l
o
s

i
n
t
e
r
f
a
c
e
s

r
e
m
o
t
o
s

y

d
e
l
e
g
a

d
e

f
o
r
m
a

t
r
a
n
s
p
a
r
e
n
t
e
t
o
d
a
s

l
a
s

l
l
a
m
a
d
a
s

a

m

t
o
d
o
s

a

t
r
a
v

s

d
e

l
a

r
e
d

a
l

o
b
j
e
t
o

r
e
m
o
t
o
.
E
l

o
b
j
e
t
o

S
k
e
l

s
e

i
n
s
t
a
l
a

o

s
e

d
e
s
c
a
r
g
a

e
n

e
l

s
i
s
t
e
m
a

s
e
r
v
i
d
o
r

y

p
r
o
p
o
r
c
i
o
n
a

u
n

o
b
j
e
t
o

p
r
o
x
y

l
o
c
a
l

p
a
r
a

e
l

s
e
r
v
i
d
o
r
.

D
e
s
p
e
m
p
a
q
u
e
t
a

l
o
s

d
a
t
o
s

r
e
c
i
b
i
d
o
s

a

t
r
a
v

s

d
e

l
a

r
e
d

d
e
s
d
e

e
l
o
b
j
e
t
o
S
t
u
b

p
a
r
a

p
r
o
c
e
s
a
r
l
o
s

e
n

e
l

s
e
r
v
i
d
o
r
.
O
z
i
t
o
Examinar un Bean Controlado por Contenedor
Esta seccin pasea a travs del cdigo de RegistrationBean.java para ver lo fcil
que es hacer que el contenedor maneje la persistencia del almacenamiento de
datos en un medio oculto como una base de datos (por defecto).
Variables Miembro
Mtodo Create
Mtodos de Contexto de Entidad
Mtodo Load
Mtodo Store
Connection Pooling
Descriptor de Desarrollo
Variables Miembro
Un entorno de contenedor controlador necesita saber qu variables son para
almacenamiento persistente y cuales no. En el lenguaje Java
TM
, la palabra clave
transient indica variables que no son incluidas cuando los datos de un objeto se
serializan y escriben en un almacenamiento permanente. En la clase
RegistrationBean.java, la variable EntityContext est marcada como transient
para indicar que su dato no ser escrito en ningn medio de almacenamiento.
El dato de EntityContext no se escribe en el almacenamiento permanente porque
su propsito es proporcionar informacin sobre el contexto en el momento de
ejecucin del contenedor. Por lo tanto, no contiene datos sobre el usuario
registrado y no debera grabarse en un medio de almacenamiento. Las otras
variables estn declaradas como public, por lo que el contenedor de este ejemplo
puede descubrirlas usando el API Reflection.
protected transient EntityContext ctx;
public String theuser, password, creditcard,
emailaddress;
public double balance;
Mtodo Create
El mtodo ejbCreate del Bean es llamado por el contenedor despus de que el
programa cliente llame al mtodo create sobre el interface remoto y pase los
datos de registro. Este mtodo asigna los valores de entrada a las variables
miembro que representan los datos del usuario. El contenedor maneja el
almacenamiento y carga de los datos, y crea nuevas entradas en el medio de
almacenamiento oculto.
public RegistrationPK ejbCreate(String theuser,
String password,
String emailaddress,
String creditcard)
throws CreateException, RemoteException {
this.theuser=theuser;
this.password=password;
this.emailaddress=emailaddress;
this.creditcard=creditcard;
this.balance=0;
Mtodos de Contexto de Entidad
Un Bean de entidad tiene un ejemplar de EntityContext asociado que ofrece al
Bean acceso a la informacin del contenedor controlador en el momento de la
ejecucin, como el contexto de la transacin.
public void setEntityContext(
javax.ejb.EntityContext ctx)
throws RemoteException {
this.ctx = ctx;
}
public void unsetEntityContext()
throws RemoteException{
ctx = null;
}
Mtodo Load
El mtodo ejbLoad del Bean es llamado por el contenedor para cargar los datos
desde el medio de almacenamiento oculto. Esto sera necesario cuando
BidderBean o SellerBean necesiten chequear la ID y password del usuario.
Nota: No todos los objetos Beans estn vivos en un momento dato. El
servidor de JavaBeans
TM
de Enterprise podra tener un nmero
configurable de Beans que puede mantener en memoria.
Este mtodo no est implementado porque el contenedor de los JavaBeans de
Enterprise carga los datos por nosotros.
public void ejbLoad() throws RemoteException {}
Mtodo Store
El mtodo ejbStore del Bean es llamado por el contenedor para grabar los datos
del usuario. Este mtodo no est implementado porque el contenedor de los
JavaBeans de Enterprise graba los datos por nosotros.
public void ejbStore() throws RemoteException {}
Connection Pooling
La carga y almacenamiento de datos en la base de datos puede tardar mucho
tiempo y reducir el rendimiento general de la aplicacin. Para reducir el tiempo de
conexin, el servidor de Weblogic BEA usa una cola de conexiones JDBC
TM
para
hacer un cache con las conexiones con la base de datos, por eso las conexiones
estn siempre disponibles cuando la aplicacin las necesita.
Sin embargo, no estamos limitados a la cola de conexiones JDBC. Podemos
sobreescribir el comportamiento de la cola de conexiones del Bean y sustituirla
nosotros mismos.
Descriptor de Desarrollo
La configuracin restante para un Brans persistente controlado por contenedor
ocurre en el momento del desarrollo. Lo que ves abajo es un Descriptor de
Desarrollo basado en texto usado en un servidor de BEA Weblogic Enterprise
JavaBeans.
Texto del Descriptor de Desarrollo
(environmentProperties
(persistentStoreProperties
persistentStoreType jdbc
(jdbc
tableName registration
dbIsShared false
poolName ejbPool
(attributeMap
creditcard creditcard
emailaddress emailaddress
balance balance
password password
theuser theuser
); end attributeMap
); end jdbc
); end persistentStoreProperties
); end environmentProperties
El descriptor de desarrollo indica que el almacenamiento es una base de datos cuya
conexin est contenida en una cola de conexiones JDBC
TM
llamada ejbPool. El
attributeMap contiene la variable del Bean Enterprise a la izquierda y su campo
asociado de la base de datos a la derecha.
Descriptor de Desarrollo XML
En Enterprise JavaBeans 1.1, el descriptor de desarrollo usa XML. Aqu est la
configuracin equivalente en XML:
<persistence-type>Container</persistence-type>
<cmp-field><field-name>creditcard
</field-name></cmp-field>
<cmp-field><field-name>emailaddress
</field-name></cmp-field>
<cmp-field><field-name>balance
</field-name></cmp-field>
<cmp-field><field-name>password
</field-name></cmp-field>
<cmp-field><field-name>theuser
</field-name></cmp-field>
<resource-ref>
<res-ref-name>registration</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Los campos del contenedor controlador se mapean directamente a su nombre
contraparte en la tabla de la base de datos. El recurso de autorizacin del
contenedor (res-auth) significa que el contenedor maneja el login a la tabla
REGISTRATION.
Ozito
M

t
o
d
o
s

d
e

B

s
q
u
e
d
a

d
e
l

C
o
n
t
e
n
e
d
o
r

C
o
n
t
r
o
l
a
d
o
r
L
a

f
a
c
i
l
i
d
a
d

d
e

b

s
q
u
e
d
a

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

e
s
t


i
m
p
l
e
m
e
n
t
a
d
a

c
o
m
o

u
n

m

t
o
d
o

f
i
n
d
e
r

d
e
l

c
o
n
t
e
n
e
d
o
r
.

A
r
r
a
n
c
a

c
u
a
n
d
o

e
l

u
s
u
a
r
i
o

e
s
c
r
i
b
e

u
n
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

y

p
u
l
s
a

e
l
b
o
t

n
S
u
b
m
i
t

e
n

l
a

p

g
i
n
a

p
r
i
n
c
i
p
a
l

p
a
r
a

l
o
c
a
l
i
z
a
r

u
n

t
e
m

d
e

l
a

s
u
b
a
s
t
a
.

C
o
m
o

s
e

m
u
e
s
t
r
a

e
n

e
l

d
i
a
g
r
a
m
a
,

e
l

n
a
v
e
g
a
d
o
r

p
a
s
a

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

a
l

m

t
o
d
o
A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
s
e
a
r
c
h
I
t
e
m
,

q
u
e

l
u
e
g
o

l
a

p
a
s
a

a
l

m

t
o
d
o

B
i
d
d
e
r
B
e
a
n
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
.
E
n

e
s
t
e

p
u
n
t
o
,

B
i
d
d
e
r
B
e
a
n
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t

p
a
s
a

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

a
l

m

t
o
d
o

f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s

d
e
c
l
a
r
a
d
o

e
n

e
l

i
n
t
e
r
f
a
c
e

A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.

E
s
t
e

m

t
o
d
o

e
s
u
n

m

t
o
d
o

b
u
s
c
a
d
o
r
,

y

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e
l

c
o
n
t
e
n
e
d
o
r

v
a
r

a

l
a

f
o
r
m
a

e
n

q
u
e

m
a
n
e
j
a

l
a
s

l
l
a
m
a
d
a
s

a

l
o
s

m

t
o
d
o
s

f
i
n
d
e
r
.

L
o
s

c
o
n
t
e
n
e
d
o
r
e
s

B
E
A

W
e
b
l
o
g
i
c

b
u
s
c
a
n

e
n

e
l

d
e
s
c
r
i
p
t
o
r
d
e

d
e
s
a
r
r
o
l
l
o

d
e
l

B
e
a
n

l
a

i
n
f
o
r
m
a
c
i

n

s
o
b
r
e

l
o
s

m

t
o
d
o
s

f
i
n
d
e
r
.
E
n

e
l

c
a
s
o

d
e

l
a

b
u
s
q
u
e
d
a
,

e
l

d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o

m
a
p
e
a

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

p
a
s
a
d
a

a

A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s

a
l

c
a
m
p
o

s
u
m
m
a
r
y

e
n

l
a

t
a
b
l
a
A
u
c
t
i
o
n
I
t
e
m
s

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
.

E
s
t
e

l
e

d
i
c
e

a
l

s
e
r
v
i
d
o
r

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
T
M

q
u
e

r
e
c
u
p
e
r
e

d
a
t
o
s

d
e

t
o
d
o
s

l
o
s

c
a
m
p
o
s

q
u
e

e
n

e
l

c
a
m
p
o

s
u
m
m
a
r
y

c
o
n
t
e
n
g
a
n

e
l

t
e
x
t
o

d
e

l
a
c
a
d
e
n
a

d
e

b

s
q
u
e
d
a
.
E
s
t
a

s
e
c
c
i

n

p
a
s
e
a

a

t
r
a
v

s

d
e

l
a
s

d
i
f
e
r
e
n
t
e
s

p
a
r
t
e
s

d
e
l

c

d
i
g
o

d
e

b

s
q
u
e
d
a

f
i
n
d
e
r
.
A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
s
e
a
r
c
h
I
t
e
m
s




B
i
d
d
e
r
B
e
a
n
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t




A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s




D
e
s
c
r
i
p
t
o
r

d
e

D
e
s
a
r
r
o
l
l
o

d
e

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n




A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
s
e
a
r
c
h
I
t
e
m
s
E
l

m

t
o
d
o

s
e
a
r
c
h
I
t
e
m
s

r
e
c
u
p
e
r
a

e
l

t
e
x
t
o

d
e

l
a

c
a
d
e
n
a

d
e
l

n
a
v
e
g
a
d
o
r
,

c
r
e
a

u
n
a

p

g
i
n
a

H
T
M
L

p
a
r
a

m
o
s
t
a
r

e
l

r
e
s
u
l
t
a
d
o

d
e

l
a

b

s
q
u
e
d
a
,

y

l
e

p
a
s
a

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

a
l

m

t
o
d
o
B
i
d
d
e
r
B
e
a
n
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
.
B
i
d
d
e
r
B
e
a
n

e
s

u
n

B
e
a
n

d
e

s
e
s
i

n

q
u
e

r
e
c
u
p
e
r
a

u
n
a

l
i
s
t
a

d
e

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a

y

c
h
e
q
u
e
a

l
a

I
D

y

l
a

p
a
s
s
w
o
r
d

d
e
l

u
s
u
a
r
i
o

p
a
r
a

l
o
s

u
s
u
a
r
i
o
s
q
u
e

q
u
i
e
r
e
n

p
u
j
a
r

p
o
r

a
l
g

n

a
r
t
i
c
u
l
o
.
L
o
s

r
e
s
u
l
t
a
d
o
s

d
e

l
a

b

s
q
u
e
d
a

s
e

d
e
v
u
e
l
v
e
n

a

e
s
t
e

m

t
o
d
o

e
n

u
n
a

v
a
r
i
a
b
l
e

E
n
u
m
e
r
a
t
i
o
n
.
p
r
i
v
a
t
e

v
o
i
d

s
e
a
r
c
h
I
t
e
m
s
(
S
e
r
v
l
e
t
O
u
t
p
u
t
S
t
r
e
a
m

o
u
t
,








H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t

r
e
q
u
e
s
t
)









t
h
r
o
w
s

I
O
E
x
c
e
p
t
i
o
n

{
/
/
R
e
t
r
i
e
v
e

s
e
a
r
c
h

s
t
r
i
n
g


S
t
r
i
n
g

s
e
a
r
c
h
S
t
r
i
n
g
=
r
e
q
u
e
s
t
.
g
e
t
P
a
r
a
m
e
t
e
r
(








"
s
e
a
r
c
h
S
t
r
i
n
g
"
)
;
/
/
C
r
e
a
t
e

H
T
M
L

p
a
g
e


S
t
r
i
n
g

t
e
x
t

=

"
C
l
i
c
k

I
t
e
m

n
u
m
b
e
r

f
o
r

d
e
s
c
r
i
p
t
i
o
n









a
n
d

t
o

p
l
a
c
e

b
i
d
.
"
;


s
e
t
T
i
t
l
e
(
o
u
t
,

"
S
e
a
r
c
h

R
e
s
u
l
t
s
"
)
;


t
r
y

{








a
d
d
L
i
n
e
(
"
<
B
R
>
"
+
t
e
x
t
,

o
u
t
)
;
/
/
L
o
o
k

u
p

h
o
m
e

i
n
t
e
r
f
a
c
e

f
o
r

B
i
d
d
e
r
B
e
a
n








B
i
d
d
e
r
H
o
m
e

b
h
o
m
e
=
(
B
i
d
d
e
r
H
o
m
e
)

c
t
x
.
l
o
o
k
u
p
(
















"
b
i
d
d
e
r
"
)
;
/
/
C
r
e
a
t
e

r
e
m
o
t
e

i
n
t
e
r
f
a
c
e

f
o
r

B
i
d
d
e
r
B
e
a
n








B
i
d
d
e
r

b
i
d
=
b
h
o
m
e
.
c
r
e
a
t
e
(
)
;
/
/
P
a
s
s

s
e
a
r
c
h

s
t
r
i
n
g

t
o

B
i
d
d
e
r
B
e
a
n

m
e
t
h
o
d








E
n
u
m
e
r
a
t
i
o
n

e
n
u
m
=
(
E
n
u
m
e
r
a
t
i
o
n
)










b
i
d
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
(
s
e
a
r
c
h
S
t
r
i
n
g
)
;








i
f
(
e
n
u
m

!
=

n
u
l
l
)

{










d
i
s
p
l
a
y
i
t
e
m
s
(
e
n
u
m
,

o
u
t
)
;










a
d
d
L
i
n
e
(
"
"
,

o
u
t
)
;








}


}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{




a
d
d
L
i
n
e
(
"
A
u
c
t
i
o
n
S
e
r
v
l
e
t

S
e
a
r
c
h

I
t
e
m
s

e
r
r
o
r
"
,









o
u
t
)
;




S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
A
u
c
t
i
o
n
S
e
r
v
l
e
t

<
n
e
w
l
i
s
t
>
:








"
+
e
)
;


}




o
u
t
.
f
l
u
s
h
(
)
;
}
B
i
d
d
e
r
B
e
a
n
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
E
l

m

t
o
d
o

B
i
d
d
e
r
B
e
a
n
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t

l
l
a
m
a

a
l

m

t
o
d
o

A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s

y

l
e

p
a
s
a

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a
.

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

e
s

u
n

b
e
a
n

d
e
e
n
t
i
d
a
d

q
u
e

m
a
n
e
j
a

a
c
t
u
a
l
i
z
a
c
i
o
n
e
s

y

r
e
c
u
p
e
r
a
c
i
o
n
e
s

d
e

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a
.
E
l

r
e
s
u
l
t
a
d
o

d
e

l
a

b

s
q
u
e
d
a

e
s

d
e
v
u
e
l
t
o

a

e
s
t
e

m

t
o
d
o

e
n

u
n
a

v
a
r
i
a
b
l
e
E
n
u
m
e
r
a
t
i
o
n
.
p
u
b
l
i
c

E
n
u
m
e
r
a
t
i
o
n

g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
(
















S
t
r
i
n
g

s
e
a
r
c
h
S
t
r
i
n
g
)









t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{


E
n
u
m
e
r
a
t
i
o
n

e
n
u
m
=
n
u
l
l
;


t
r
y
{
/
/
C
r
e
a
t
e

H
o
m
e

i
n
t
e
r
f
a
c
e

f
o
r

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n




A
u
c
t
i
o
n
I
t
e
m
H
o
m
e

h
o
m
e

=

(
A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
)









c
t
x
.
l
o
o
k
u
p
(
"
a
u
c
t
i
o
n
i
t
e
m
s
"
)
;
/
/
P
a
s
s

s
e
a
r
c
h

s
t
r
i
n
g

t
o

H
o
m
e

i
n
t
e
r
f
a
c
e

m
e
t
h
o
d




e
n
u
m
=
(
E
n
u
m
e
r
a
t
i
o
n
)
h
o
m
e
.
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s
(








s
e
a
r
c
h
S
t
r
i
n
g
)
;


}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{




S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
L
i
s
t
:

"
+
e
)
;




r
e
t
u
r
n

n
u
l
l
;


}


r
e
t
u
r
n

e
n
u
m
;
}
A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s
E
l

m

t
o
d
o

A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s

n
o

e
s
t


i
m
p
l
e
m
e
n
t
a
d
o

p
o
r

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n
.

L
a
s

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

d
e
l

m

t
o
d
o

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

f
i
n
d
e
r

e
s
t

n
d
e
f
i
n
i
d
a
s

e
n

e
l

d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o

d
e

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

c
u
a
n
d
o

s
e

u
s
a
n

c
o
n
t
e
n
e
d
o
r
e
s

d
e

B
E
A

W
e
b
l
o
g
i
c
.
C
u
a
n
d
o

s
e

u
s
a
n

e
s
t
o
s

c
o
n
t
e
n
e
d
o
r
e
s
,

i
n
c
l
u
s
o

s
i

e
l

B
e
a
n

t
i
e
n
e

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

d
e
l

m

t
o
d
o

f
i
n
d
e
r
,

s
o
n

i
g
n
o
r
a
d
o
s

y

e
n

s
u

l
u
g
a
r

s
e

c
o
n
s
u
l
t
a
n

l
a
s

s
e
l
e
c
c
i
o
n
e
s

e
n

e
l

d
e
s
c
r
i
p
t
o
r

d
e
d
e
s
a
r
r
o
l
l
o
.
/
/
D
e
c
l
a
r
e

m
e
t
h
o
d

i
n

H
o
m
e

i
n
t
e
r
f
a
c
e


p
u
b
l
i
c

E
n
u
m
e
r
a
t
i
o
n

f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s
(
















S
t
r
i
n
g

s
e
a
r
c
h
S
t
r
i
n
g
)









t
h
r
o
w
s

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
,

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;
D
e
s
c
r
i
p
t
o
r

d
e

D
e
s
a
r
r
o
l
l
o

d
e

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n
C
u
a
n
d
o

s
e

l
l
a
m
a

a

u
n

m

t
o
d
o

f
i
n
d
e
r

d
e

u
n

B
e
a
n
,

e
l

c
o
n
t
e
n
e
d
o
r

c
o
n
s
u
l
t
a

e
l

d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o

p
a
r
a

e
s
e

B
e
a
n

p
a
r
a

e
n
c
o
n
t
r
a
r

q
u


d
a
t
o
s

n
e
c
e
s
i
t
a

r
e
c
u
p
e
r
a
r

e
l

m

t
o
d
o

f
i
n
d
e
r

d
e
l
a

t
a
b
l
a

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
.

E
l

c
o
n
t
e
n
e
d
o
r

p
a
s
a

e
s
t
a

i
n
f
o
r
m
a
c
i

n

a
l

s
e
r
v
i
d
o
r

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s
,

q
u
e

h
a
c
e

l
a

r
e
c
u
p
e
r
a
c
i

n

r
e
a
l
.
E
l

d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o

p
a
r
a

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

p
r
o
p
o
r
c
i
o
n
a

f
i
n
d
e
r
D
e
s
c
r
i
p
t
o
r
s

p
a
r
a

t
o
d
o
s

l
o
s

m

t
o
d
o
s

f
i
n
d
e
r

d
e
c
l
a
r
a
d
o
s

e
n

e
l

i
n
t
e
r
f
a
c
e

A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
.

E
l
f
i
n
d
e
r
D
e
s
c
r
i
p
t
o
r

p
a
r
a

e
l

m

t
o
d
o

f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s

m
a
p
e
a

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

a
l

c
a
m
p
o

s
u
m
m
a
r
y

d
e

l
a

t
a
b
l
a

A
u
c
t
i
o
n
I
t
e
m
s

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
.

E
s
t
o

l
e

d
i
c
e

a
l
s
e
r
v
i
d
o
r

E
n
t
e
r
p
r
i
s
e

J
a
v
a
B
e
a
n
s

q
u
e

r
e
c
u
p
e
r
e

l
o
s

d
a
t
o
s

d
e

t
o
d
a
s

l
a
s

f
i
l
a
s

d
e

l
a

t
a
b
l
a

e
n

l
a
s

q
u
e

e
l

c
o
n
t
e
n
i
d
o

d
e
l

c
a
m
p
o

s
u
m
m
a
r
y

c
o
r
r
e
s
p
o
n
d
a

c
o
n

e
l

t
e
x
t
o

d
e

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a
.
(
f
i
n
d
e
r
D
e
s
c
r
i
p
t
o
r
s

"
f
i
n
d
A
l
l
I
t
e
m
s
(
)
"









"
(
=

1

1
)
"

"
f
i
n
d
A
l
l
N
e
w
I
t
e
m
s
(
j
a
v
a
.
s
q
l
.
D
a
t
e

n
e
w
t
o
d
a
y
)
"









"
(
=

s
t
a
r
t
d
a
t
e

$
n
e
w
t
o
d
a
y
)
"

"
f
i
n
d
A
l
l
C
l
o
s
e
d
I
t
e
m
s
(
j
a
v
a
.
s
q
l
.
D
a
t
e

c
l
o
s
e
d
t
o
d
a
y
)
"









"
(
=

e
n
d
d
a
t
e

$
c
l
o
s
e
d
t
o
d
a
y
)
"

"
f
i
n
d
A
l
l
M
a
t
c
h
i
n
g
I
t
e
m
s
(
S
t
r
i
n
g

s
e
a
r
c
h
S
t
r
i
n
g
)
"









"
(
l
i
k
e

s
u
m
m
a
r
y

$
s
e
a
r
c
h
S
t
r
i
n
g
)
"
)
;

e
n
d

f
i
n
d
e
r
D
e
s
c
r
i
p
t
o
r
s
O
z
i
t
o
Manejo de Datos y Transaciones
Cuando usamos la arquitectura Enterprise JavaBeans
TM
, los datos se leen y
escriben en la base de datos sin tener que escribir ningn cdigo SQL. Pero qu
pasa si no quereos almacenar los datos en una base de datos, o si queremos
escribir nuestros propios comandos SQL, o manejar transaciones?
Podemos sobreescribir el contenedor controlador interno de persistencia e
implementar un Bean controlador de persistencia usando nuestro propio
almacenamiento de datos y nuestro cdigo de manejo de transaciones.
La persistencia del Bean controlador se convierte en til cuando queremos ms
control del que proporciona el contenedor controlador. Por ejemplo podramos
sobreescribir la mayora de los contenedores para que mapeen un Bean en una fila
de la tabla, implementar nuestros propios mtodos finder, o personalizar el cach.
Este captulo presenta dos versiones de la clase RegistrationBean del captulo
anterior. Una versin lee y escribe los datos del usuario en un fichero usando
streams de entrada y salida serializados. La otra versin proporciona nuestros
propios comandos SQL para leer y escribir en la base de datos. Tambin explica
cmo podemos escribir nuestro propio cdigo de manejo de transaciones.
Bean-Controlador de Persistencia y la plataforma JDBC
TM

Manejar Transaciones
Mtodos de Bsqueda del Bean Controlador
Tienes Prisa?
Esta tabla te lleva directamente a los tpicos especficos
Tpico Seccin
Bean-Controlador de Persistencia y la
Plataformna JDBC
Conectar con la base de datos
Mtodo Create
Mtodo Load
Mtodo Refresh
Mtodo Store
Mtodo Find
Manejo de Transaciones Por qu Manejar Transaciones?
Sincronizacin de Sesin
Transaction Commit Mode
Mtodos de Bsqueda del Bean-Controlador AuctionServlet.searchItems
SearchBean
Ozito
Bean-Controlador de Persistencia y la Plataforma
JDBC
Puede que haya algunas veces que querramos sobreescribir la persistencia del
contenedor controlador e implementar mtodos de Beans de entidad o de sesin
para usar nuestros propios comandos SQL. Este tipo de persistencia controlada por
el Bean puede ser til si necesitamos aumentar el redimiento o mapear datos de
mltiples Beans en una sla fila de la tabla de la base de datos.
Esta seccin nos muestra cmo convertir la clase RegistrationBean.java para
acceder a la base de datos con la clase PreparedStatement del JDBC.
Conectar con la Base de Datos
Mtodo Create
Mtodo Load
Mtodo Refresh
Mtodo Store
Mtodo Find
Conectar con la Base de Datos
Esta versin de la clase RegistrationBean.java establece la conexin con la base de
datos ejemplarizando una clase esttica Driver y proporcionando el mtodo
getConnection.
El mtodo getConnection necesita la clase esttica DriverManager para un
motor de la base datos registrada que corresponda con la URL. En este caso, la
URL es weblogic.jdbc.jts.Driver.
//Create static instance of database driver
static {
new weblogic.jdbc.jts.Driver();
}
//Get registered driver from static instance
public Connection getConnection() throws SQLException{
return DriverManager.getConnection(
"jdbc:weblogic:jts:ejbPool");
}
Mtodo Create
El mtodo ejbCreate asigna valores a las variables miembro, obtiene una conexin
con la base de datos, y crea un ejemplar de la clase java.sql.PreparedStatement
para ejecutar la sentencia SQL que escribe los datos en la tabla registration de la
base de datos.
Un objeto PreparedStatement se crea desde una sentenica SQL que se enva a la
base de datos y se precompila antes de enviar cualquier dato. Podemos llamar a
las sentencias setXXX apropiadas sobre el objeto PreparedStatement para
enviar datos. Manteniendo los objetos PreparedStatement y Connection como
variables de ejemplar privadas reducimos la sobrecarga porque las sentencias SQL
no tienen que compilarse cada vez que se envan.
Lo ltimo que hace el mtodo ejbCreate es crear una clase de clave primaria con
el ID del usuario, y devolverlo al contenedor.
public RegistrationPK ejbCreate(String theuser,
String password,
String emailaddress,
String creditcard)
throws CreateException, RemoteException {
this.theuser=theuser;
this.password=password;
this.emailaddress=emailaddress;
this.creditcard=creditcard;
this.balance=0;
try {
con=getConnection();
ps=con.prepareStatement("insert into registration (
theuser, password,
emailaddress, creditcard,
balance) values (
?, ?, ?, ?, ?)");
ps.setString(1, theuser);
ps.setString(2, password);
ps.setString(3, emailaddress);
ps.setString(4, creditcard);
ps.setDouble(5, balance);
if (ps.executeUpdate() != 1) {
throw new CreateException (
"JDBC did not create a row");
}
RegistrationPK primaryKey = new RegistrationPK();
primaryKey.theuser = theuser;
return primaryKey;
} catch (CreateException ce) {
throw ce;
} catch (SQLException sqe) {
throw new CreateException (sqe.getMessage());
} finally {
try {
ps.close();
} catch (Exception ignore) {}
try {
con.close();
} catch (Exception ignore) {}
}
}
Mtodo Load
Este mtodo obtiene la clave primaria desde el contexto de entidad y lo pasa al
mtodo refresh que carga los datos.
public void ejbLoad() throws RemoteException {
try {
refresh((RegistrationPK) ctx.getPrimaryKey());
}
catch (FinderException fe) {
throw new RemoteException (fe.getMessage());
}
}
Mtodo Refresh
El mtodo refresh es el cdigo suministrado por el programador para cargar los
datos desde la base de datos. Chequea la clave primaria, obtiene la conexin con la
base de datos, y crea un objeto PreparedStatement para consultar en la base de
datos la clave primaria especificada.
Los datos se leen desde la base de datos en un ResultSet y se asignan a las
variables miembro globales para que RegistrationBean tenga la informacin ms
actualizada del usuario.
private void refresh(RegistrationPK pk)
throws FinderException, RemoteException {
if (pk == null) {
throw new RemoteException ("primary key
cannot be null");
}
Connection con = null;
PreparedStatement ps = null;
try {
con=getConnection();
ps=con.prepareStatement("select password,
emailaddress, creditcard,
balance from registration
where theuser = ?");
ps.setString(1, pk.theuser);
ps.executeQuery();
ResultSet rs = ps.getResultSet();
if (rs.next()) {
theuser = pk.theuser;
password = rs.getString(1);
emailaddress = rs.getString(2);
creditcard = rs.getString(3);
balance = rs.getDouble(4);
}
else {
throw new FinderException (
"Refresh: Registration ("
+ pk.theuser + ") not found");
}
}
catch (SQLException sqe) {
throw new RemoteException (sqe.getMessage());
}
finally {
try {
ps.close();
}
catch (Exception ignore) {}
try {
con.close();
}
catch (Exception ignore) {}
}
}
Mtodo Store
Este mtodo obtiene una conexin con la base de datos y crea un
PreparedStatement para actualizarla.
public void ejbStore() throws RemoteException {
Connection con = null;
PreparedStatement ps = null;
try {
con = getConnection();
ps = con.prepareStatement("update registration
set password = ?,
emailaddress = ?,
creditcard = ?,
balance = ?
where theuser = ?");
ps.setString(1, password);
ps.setString(2, emailaddress);
ps.setString(3, creditcard);
ps.setDouble(4, balance);
ps.setString(5, theuser);
int i = ps.executeUpdate();
if (i == 0) {
throw new RemoteException (
"ejbStore: Registration (
" + theuser + ") not updated");
}
} catch (RemoteException re) {
throw re;
} catch (SQLException sqe) {
throw new RemoteException (sqe.getMessage());
} finally {
try {
ps.close();
} catch (Exception ignore) {}
try {
con.close();
}
catch (Exception ignore) {}
}
}
Mtodo Find
El mtodo ejbFindByPrimaryKey corresponde con la firma del mtodo
FindByPrimaryKey del interface RegistrationHome. Este llama al mtodo refresh
para obtner o refrescar los datos de usuario para el usuario especficado en la clave
primaria.
La versin de persistencia del contenedor controlador de RegistrationBean no
implementa este mtodo porque el contenedor maneja la obtencin y refresco de
los datos de usuario.
public RegistrationPK ejbFindByPrimaryKey(
RegistrationPK pk)
throws FinderException,
RemoteException {
if ((pk == null) || (pk.theuser == null)) {
throw new FinderException ("primary key
cannot be null");
}
refresh(pk);
return pk;
}
Ozito
Control de Transaciones
No sera maravilloso si cada operacin que intentara nuestra aplicacin tuviera
xito? Desafortunadamente, en el mundo multi-thread de las aplicaciones
distribuidas y recursos compartidos, esto no es siempre posible.
Por qu? Primero de todo, los recursos compartidos deben mantener una vista
consistente de los datos de todos los usuarios. Esto significa que leer y escribir
tiene que ser controlado para que los usuarios no se sobreescriban los datos unos
a los otros, o los errores de transacin no corrompan la integridad de los datos.
Tambin, si trabajamos en una red con retardos intermitenes o cadas de
conexiones, el potencial para que las operaciones fallen en una aplicacin basada
en web se incrementa con el nmero de usuarios.
Los fallos de operaciones son inevitables, lo mejor es recuperar luego la seguridad,
y aqu es donde entra el control de transaciones. Las bases de datos modernas y
los controladores de transaciones nos permiten deshacer y repetir el estado de una
secuencia de operaciones fallidas para asegurar que los datos son consistentes
para el acceso desde mltiples threads.
Esta seccin aade cdigo al SellerBean del ejemplo de la casa de subastas para
que pueda manejar la insercin de itms en la subasta ms all del controlador de
transaciones por defecto proporcionado por su contenedor.
Por qu Controlar las Transaciones?
Sincronizacin de Sesin
Ejemplo de Contenedor Controlador
Cdigo

Modo de Entrega de la Transacin
Configurador del Servidor
Descripciones de Atributos de Transacin
Descripciones del Nivel de Aislamiento
Ejemplo de Bean-Controlador

Por qu Controlar las Transaciones?
Cuando accedemos a una base de datos usando el API JDBC, todas las aplicaciones
se ejecutan con una entrega automtica explcita por defecto. Esto significa que
cualquier aplicacin que est viendo los datos ver los datos actualizados despus
de cada llamada a JDBC.
Para aplicaciones sencillas, esto podra ser aceptable, pero consideremos la
aplicacin de la casa de subastas y las secuencias que ocurren cuando SellerBean
inserta un tem de subasta. Primero se carga la cuenta del usuario para listar el
tem, y se aade el tem a la lista de tems de la subasta. Estas operaciones
ivolucran a RegistrationBean para cobrar la cuenta y AuctionItemBean para
aadir el tem a la lista de subasta.
En el modo de entrega automtico, si falla la insercin del tem de subasta, slo se
se puede deshacer el listado, y tenemos que ajustar manualmente la cuenta del
usuario para descontarle la lista de cargos. Mientras tanto, otro thread podra estar
intentando deducir de la misma cuenta de usuario, sin encontrar crdito, y
abortando cuando quizs unos milisegundos despus se podra haber completado.
Hay dos formas para segurarnos de que el dbito se ha devuelto a su valor cuando
falla la insercin de un tem en la subasta:
Aadir cdigo de sincronizacin de sesin al Bean de sesin del contenedor
controlador para obtener el control sobre las entregas de la transacin y
volver atrs.

Configurar JDBC para los servicios de modo de entrega transacin y aadir
cdigo para arrancar, parar, entregar y deshacer la transacin. Esto es una
transacin controlada por Bean y puede ser usada por Beans de entidad y de
sesin.

Sincronizacin de Sesisn
Un Bean de sesin controlado por contenedor puede opcionalmente incluir
sincronizacin de sesin para controlar la entrega automtica por defecto
propocionada por el contenedor. El cdigo de sincronizacin permite al contenedor
notificar al Bean cuando se alcanzan los puntos importantes en la transacin.
Adems de recibir la notificacin, el Bean puede tomar cualquier accin necesaria
antes de que la transacin proceda con el siguiente punto.
Nota: Un Bean de Sesin que usa transaciones controladas por Bean no
necesita sincronizacin de sesin porque tiene la entrega totalmente
controlada.
Ejemplo de Control por Contenedor
SellerBean es un Bean de sesin que usa RegistrationBean para comprobar la
ID y la password del usuario cuando alguien postea un tem para la subasta y
apunta en la cuenta del vendedor un listado, y AuctionItemBean aade los
nuevos tems a la base de datos.
La transacin empieza en el mtodo insertItem con el apunte del dbito y termina
cuando se entrega la transacin completa o se deshace. La transacin completa
incluye deshacer el apunte de 50 centavos si el tem de subasta es null (la
insercin falla), o si se captura una excepcin. Si el tem de subasta no es null y la
insercin se realiza con xito, se entrega la transacin completa, incluyendo el
cobro de los 50 centavos.
Cdigo
Para usar sincronizacin de sesin, un Bean de sesin implementa el interface
SessionSynchronzation y sus tres mtodos, afterBegin, beforeCompletion, y
afterCompletion. Este ejemplo adapta el cdigo de SellerBean.java para usar
sincronizacin de sesin.
public class SellerBean implements SessionBean,
SessionSynchronization {
private transient SessionContext ctx;
private transient Properties p = new Properties();
private transient boolean success = true;
public void afterBegin() {}
public void beforeCompletion() {
if (!success ) {
ctx.setRollbackOnly();
}
}
public void afterCompletion(boolean state) {}
afterBegin: El contenedor llama a este mtodo antes del dbito para notificar al
Bean de sesin de que una nueva transacin va a comenzar. Podemos implementar
este mtodo que haga cualquier trabajo prvio en la base de datos que pudiera ser
necesario para la transacin. En este caso no son necesarios trabajos prvios, por
eso este mtodo no est implementado.
beforeCompletion: El contenedor llama a este mtodo cuando est listo para
escribir el tem de subasta y el dbito en la base de datos, pero antes de hacerlo
realmente (entregarlo). Podemos implementar este mtodo para escribir cualquier
actualizacin cach de la base de datos o deshacer la transacin. En este ejemplo,
el mtodo llama al mtodo setRollbackOnly sobre el contexto de la sesin en el
caso de que la variable success sea false durante la transacin.
afterCompletion: El contenedor llama a este mtodo cuando la transacin se
entrega. Un valor booleano de true significa que el dato ha sido enviado y false
significa que la transacin se ha deshecho. El mtodo usa el valor boolean para
determinar si necesita resetear el estado del Bean en el caso de que se haya
deshecho. En este ejemplo, no es necesario resetear el estado en el caso de un
fallo.
Aqu est el mtodo insertItem con comentarios que muestran dnde estn los
puntos donde se llama a los mtodos de SessionSynchronization.
public int insertItem(String seller,
String password,
String description,
int auctiondays,
double startprice,
String summary)
throws RemoteException {
try{
Context jndiCtx = new InitialContext(p);
RegistrationHome rhome =
(RegistrationHome) sCtx.lookup("registration");
RegistrationPK rpk=new RegistrationPK();
rpk.theuser=seller;
Registration newseller=rhome.findByPrimaryKey(rpk);
if((newseller == null) ||
(!newseller.verifyPassword(password))) {
return(Auction.INVALID_USER);
}
//Call to afterBegin
newseller.adjustAccount(-0.50);
AuctionItemHome home = (AuctionItemHome)
jndiCtx.lookup("auctionitems");
AuctionItem ai= home.create(seller,
description,
auctiondays,
startprice,
summary);
if(ai == null) {
success=false;
return Auction.INVALID_ITEM;
}
else {
return(ai.getId());
}
}catch(Exception e){
System.out.println("insert problem="+e);
success=false;
return Auction.INVALID_ITEM;
}
//Call to beforeCompletion
//Call to afterCompletion
}
Modo de Entrega de la Transacin
Si configuramos los servicos JDBC para modo de entrega de transacin, podemos
hacer que el Bean controle la transacin. Para configurar los servicios de JDBC para
la entrega, llamamos a con.setAutoCommit(false) sobre nuestra conexin JDBC.
No todos los drivers JDBC soportan el modo de entrega, pero para hacer que el
Bean controle y maneje las transaciones, necesitamos un driver que lo haga.
El modo de entrega de la transacin nos permite aadir cdigo que crea una red de
seguridad alrededor de una secuencia de operaciones dependientes. El API de
Transaction de Java, proporciona las ayudas que necesitamos para crear esa red
de seguridad. Pero si estamos usando la arquitectura JavaBeans de Enterprise,
podemos hacerlo con mucho menos cdigo. Slo tenemos que configurar el
servidor de JavaBeans de Entrprise, y especificar en nuestro cdigo donde empieza
la transacin, donde para, donde se deshace y se entrega.
Configuracin del servidor
Configurar el servidor de JavaBeans Enterprise implica especificar las siguientes
selecciones en un fichero de configuracin para cada Bean:
Un nivel de aislamiento para especificar cmo de exclusivo es el acceso de
una transascin a los datos compartidos.

Un atributo de transacin para especificar cmo controlar las transaciones
mediante el Bean o el contenedor que contina en otro Bean.

Un tipo de transacin para especificar si la transacin es manejada por el
contenedor o por el Bean.

Por ejemplo, podramos especificar estas selecciones para el servidor BEA Weblogic
en un fichero DeploymentDescriptor.txt para cada Bean.
Aqu est la parte de DeploymentDescriptor.txt para SellerBean que especifica
el nivel de aislamiento y el atributo de transacin.
(controlDescriptors
(DEFAULT
isolationLevel TRANSACTION_SERIALIZABLE
transactionAttribute REQUIRED
runAsMode CLIENT_IDENTITY
runAsIdentity guest
); end DEFAULT
); end controlDescriptors
Aqu est el equivalente en lenguaje XML.
<container-transaction>
<method>
<ejb-name>SellerBean<ejb-name>
<method-name>*<method-name>
<method>
<transaction-type>Container<transaction-type>
<trans-attribute>Required<trans-attribute>
<container-transaction>
En este ejemplo, SellerBean est controlado por el Bean.
<container-transaction>
<method>
<ejb-name>SellerBean<ejb-name>
<method-name>*<method-name>
<method>
<transaction-type>Bean<transaction-type>
<trans-attribute>Required<trans-attribute>
<container-transaction>
Descripcin de Atributo de Transacin: Un Bean Enterprise usa un transaction
attribute para especificar si una transacin de Bean es manejada por el propio
Bean o por el contenedor, y cmo manejar las transaciones que empezaron en otro
Bean.
El servidor de JavaBeans de Enterprise slo puede controlar una transacin a la
vez. Este modelo sigue el ejemplo configurado por el Object Transaction Service
(OTS) de la OMG, y significa que la especificacin actual de los JavaBeans
Enterpirse no proporcionan una forma para transaciones anidadas. Una transacin
anidada es un nueva transacin que arranca dentro de otra transacin existente.
Mientras que las transaciones anidadas no estn permitidas, continuar una
transacin existente en otro Bean es correcto.
Cuando se entra en un Bean, el servidor crea un contexto de transacin para
controlar la transacin. Cuando la transacin es manejada por le Bean, accedemos
para comenzar, entregar o deshacer la transacin cuando sea necesario.
Aqu estn los atributos de transacin con una breve descripcin de cada uno de
ellos. Los nombres de los atributos cambiaron entre las especificaciones 1.0 y 1.1
de los JavaBeans Enterprise.
Especificacin 1. Especificacin 1.0
REQUIRED TX_REQUIRED
Transacin controlada por el contenedor. El servidor arranca y maneja una nueva
transacin a peticin del usuario o contina usando la transacin que se arranc
en el cdigo que llam a este Bean.
REQUIRESNEW TX_REQUIRED_NEW
Transacin controlada por contenedor. El servidor arranca y maneja una nueva
transacin. Si una transacin existente arranca esta transacin, la suspende hasta
que la transacin se complete.
Especificado como tipo
de transacin de Bean en
el Descriptor de
desarrollo
TX_BEAN_MANAGED
<Transacin controlada por el Bean. Tenemos acceso al contexto de la transacin
para empezar, entregar o deshacer la transacin cuando sea necesario.
SUPPORTS TX_SUPPORTS
Si el cdigo que llama a este Bean tiene un transacin en ejecucin, incluye este
Bean en esa transacin.
NEVER TX_NOT_SUPPORTED
Si el cdigo que llama a un mtodo en este Bean tiene una transacin
ejecuntndose, suspende esa transacin hasta que la llamada al mtodo de este
Bean se complete. No se crea contexto de transacin para este Bean.
MANDATORY TX_MANDATORY
El atributo de transacin para este Bean se configura cuando otro bean llama a
uno de sus mtodos. En este caso, este bean obtiene el atributo de transacin del
Bean llamante. Si el Bean llamante no tiene atributo de transacin, el mtodo
llamado en este Bean lanza una excepcion TransactionRequired.
Descripcin del Nivel de Aislamiento: Un Bean de Enterprise usa un nivel de
aislamiento para negociar su propia interaccin con los datos compartidos y la
interaccin de otros threads con los mismos datos compartidos. Como el nombre
indica, existen varios niveles de aislamiento con TRANSACTION_SERIALIZABLE
siendo el nivel ms alto de integridad de los datos.
Nota:Debemos asegurarnos de que nuestra base de datos puede
soportar el nivel elegido. En la especificacin 1.1 de los JavaBeans de
Enterprise, slo los Beans de sesin con persistencia controlada por el
Bean pueden seleccionar el nivel de aislamiento.
Si la base de datos no puede controlar el nivel de aislamiento, el servidor
de JavaBeans Enterprise dar un fallo cuando intente acceder al mtodo
setTransactionIsolation de JDBC.
TRANSACTION_SERIALIZABLE: Este nivel proporciona la mxima integridad de
los datos. El Bean decide la cantidad de accesos exclusivos. Ninguna otra
transacin puede leer o escribir estos datos hasta que la transacin serializable se
complete.
En este contexto, serializable significa proceso como una operacin serial, y no
debera confundirse con la serializacin de objetos para preservar y restaurar sus
estados. Ejecutar transaciones como una sla operacin serial es la seleccin ms
lenta. Si el rendimiento es un problema, debemos usar otro nivel de aislamiento
que cumpla con los requerimientos de nuestra aplicacin, pero mejore el
rendimiento.
TRANSACTION_REPEATABLE_READ: En este nivel, los datos leidos por una
transacin pueden ser leidos, pero no modificados, por otra transacin. Se
garantiza que el dato tenga el mismo valor que cuando fue ledo por primera vez, a
menos que la primera transacin lo cambie y escriba de nuevo el valor cambiado.
TRANSACTION_READ_COMMITTED: En este nivel, los datos ledos por una
transacin no pueden ser ledos por otra transacin hasta que la primera
transacin los haya entregado o deshecho
TRANSACTION_READ_UNCOMMITTED:En este nivel, los datos involucrados en
una transacin pueden ser ledos por otros threads antes de que la primera
transacin se haya completado o se haya deshecho. Las otras transaciones no
pueden saber si los datos fueron finalmente entregados o deshechos.
Ejemplo de Bean Controlador
SellerBean es un Bean de sesin que usa RegistrationBean para chequear la ID
y la password del usuario cuando alguien postea un tem para la subasta, apunta el
dbito en la cuenta del usuario, y AuctionItemBean aade un nuevo tem a la
base de datos de la subasta.
La transacin empieza en el mtodo insertItem con el dbito de la cuenta y
termina cuando la transacin completa se entrega o se deshace. La transacin
completa incluye deshacer el apunte de 50 centavos si el tem de subasta es null
(la insercin falla), o si se captura una excepcin. Si el tem de subasta no es null
y la insercin se realiza con xito, se entrega la transacin completa, incluyendo el
cobro de los 50 centavos.
Para este ejemplo, el nivel de aislamiento es TRANSACTION_SERIALIZABLE, y
el atributo de transacin es TX_BEAN_MANAGED. Los otros Beans en la
transacin, RegistrationBean y AuctionItemBean, tienen un nivel de
aislamiento de TRANSACTION_SERIALIZABLE y un atributo de transacin de
REQUIRED.
Los cambios en esta versin de SellerBean sobre la versin del contenedor
controlador se marcan con comentarios:
public int insertItem(String seller,
String password,
String description,
int auctiondays,
double startprice,
String summary)
throws RemoteException {
//Declare transaction context variable using the
//javax.transaction.UserTransaction class
UserTransaction uts= null;
try{
Context ectx = new InitialContext(p);
//Get the transaction context
uts=(UserTransaction)ctx.getUserTransaction();
RegistrationHome rhome = (
RegistrationHome)ectx.lookup("registration");
RegistrationPK rpk=new RegistrationPK();
rpk.theuser=seller;
Registration newseller=
rhome.findByPrimaryKey(rpk);
if((newseller == null)||
(!newseller.verifyPassword(password))) {
return(Auction.INVALID_USER);
}
//Start the transaction
uts.begin();
//Deduct 50 cents from seller's account
newseller.adjustAccount(-0.50);
AuctionItemHome home = (
AuctionItemHome) ectx.lookup("auctionitems");
AuctionItem ai= home.create(seller,
description,
auctiondays,
startprice,
summary);
if(ai == null) {
//Roll transaction back
uts.rollback();
return Auction.INVALID_ITEM;
}
else {
//Commit transaction
uts.commit();
return(ai.getId());
}
}catch(Exception e){
System.out.println("insert problem="+e);
//Roll transaction back if insert fails
uts.rollback();
return Auction.INVALID_ITEM;
}
}
Ozito
M

t
o
d
o
s

d
e

B

s
q
u
e
d
a

d
e

B
e
a
n

C
o
n
t
r
o
l
a
d
o
r
L
a

b

s
q
u
e
d
a

e
n

e
l

c
o
n
t
e
n
e
d
o
r

c
o
n
t
r
o
l
a
d
o
r

d
e
s
c
r
i
t
a

e
n

e
l

c
a
p

t
u
l
o

2

e
s
t


b
a
s
a
d
a

e
n

e
l

m

c
a
n
i
s
m
o

d
e
l

m

t
o
d
o

f
i
n
d
e
r

d
o
n
d
e

e
l

d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o
,

e
n

l
u
g
a
r

d
e
l

B
e
a
n
,

e
s
p
e
c
i
f
i
c
a

e
l
c
o
m
p
o
r
t
a
m
i
e
n
t
o

d
e
l

m

t
o
d
o

f
i
n
d
e
r
.

M
i
e
n
t
r
a
s

e
l

m
e
c
a
n
i
s
m
o

d
e
l

m

t
o
d
o

f
i
n
d
e
r

f
u
n
c
i
o
n
a

b
i
e
n

p
a
r
a

c
o
n
s
u
l
t
a
s

s
e
n
c
i
l
l
a
s
,

n
o

p
u
e
d
e

m
a
n
e
j
a
r

o
p
e
r
a
c
i
o
n
e
s

c
o
m
p
l
e
j
a
s

q
u
e

i
m
p
l
i
q
u
e
n

m

s

d
e

u
n
t
i
p
o

d
e

B
e
a
n

o

t
a
b
l
a
s

d
e

b
a
s
e
s

d
e

d
a
t
o
s
.

T
a
m
b
i

n
,

l
a

e
s
p
e
c
i
f
i
c
a
c
i

n

1
.
1

d
e

l
o
s

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

a
c
t
u
a
l
m
e
n
t
e

n
o

p
r
o
p
o
r
c
i
o
n
a

p
a
r
a

p
o
n
e
r

l
a
s

r
e
g
l
a
s

d
e
l

m

t
o
d
o

f
i
n
d
e
r

e
n

e
l
d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o
.
P
o
r

e
s
o
,

p
a
r
a

c
o
n
s
u
l
t
a
s

y

b

s
q
u
e
d
a
s

m

s

c
o
m
p
l
e
j
a
s
,

t
e
n
e
m
o
s

q
u
e

e
s
c
r
i
b
i
r

b

s
q
u
e
d
a
s

y

c
o
n
s
u
l
t
a
s

c
o
n
t
r
o
l
a
d
a
s

p
o
r

e
l

B
e
a
n
.

E
s
t
a

s
e
c
c
i

n

e
x
p
l
i
c
a

c

m
o

e
s
c
r
i
b
i
r

u
n
a

v
e
r
s
i

n

d
e

l
a

f
a
c
i
l
i
d
a
d
d
e

b

s
q
u
e
d
a

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

c
o
n
t
r
o
l
a
d
a

p
o
r

e
l

B
e
a
n
.

L
a

b

s
q
u
e
d
a

c
o
n
t
r
o
l
a
d
a

p
o
r

e
l

B
e
a
n

i
n
p
l
i
c
a

c
a
m
b
i
o
s

e
n

e
l

m

t
o
d
o

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
s
e
a
r
c
h
I
t
e
m
s

y

u
n

n
u
e
v
o

B
e
a
n

d
e

s
e
s
i

n
,
S
e
a
r
c
h
B
e
a
n
.
A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
s
e
a
r
c
h
I
t
e
m
s




S
e
a
r
c
h
B
e
a
n




A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
s
e
a
r
c
h
I
t
e
m
s
L
a

b

s
q
u
e
d
a

e
m
p
i
e
z
a

c
u
a
n
d
o

e
l

u
s
u
a
r
i
o

f
i
n
a
l

e
n
v

a

u
n
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

a

l
a

f
a
c
i
l
i
d
a
d

d
e

b

s
q
u
e
d
a

d
e

l
a

p

g
i
n
a

p
r
i
n
c
i
p
a
l

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s
,

y

p
u
l
s
a

e
l

b
o
t
o
n

S
u
b
m
i
t
.

E
s
t
o

l
l
a
m
a
a
A
u
c
t
i
o
n
S
e
r
v
l
e
t
,

q
u
e

r
e
c
u
p
e
r
a

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

d
e
s
d
e

l
a

c
a
b
e
c
e
r
a

H
T
T
P

y

l
a

p
a
s
a

a
l

m

t
o
d
o

s
e
a
r
c
h
I
t
e
m
.
N
o
t
a
:

L
a

l

g
i
c
a

d
e

b

s
q
u
e
d
a

p
a
r
a

e
s
t
e

e
j
e
m
p
l
o

e
s

b
a
s
t
a
n
t
e

s
i
m
p
l
e
.

E
l

p
r
o
p

s
i
t
o

e
s

m
o
s
t
r
a
r

c

m
o

m
o
v
e
r

l
a

l

g
i
c
a

d
e

b

s
q
u
e
d
a

a

o
t
r
o

B
e
a
n

E
n
t
e
r
p
r
i
s
e

s
e
p
a
r
a
d
o

p
a
r
a

q
u
e
p
o
d
a
m
o
s

m
o
v
e
r

b

s
q
u
e
d
a
s

m

s

c
o
m
p
l
e
j
a
s

n
o
s
o
t
r
o
s

s
o
l
o
s
.
o
p
e
r
a
c
i

n
s
e
a
r
c
h
I
t
e
m

s
e

h
a
c
e

e
n

d
o
s

p
a
r
t
e
s
:

1
)

u
s
a
r

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

p
a
r
a

r
e
c
u
p
e
r
a
r

l
a
s

c
l
a
v
e
s

p
r
i
m
a
r
i
a
s
,

y

2
)

u
s
a
r

l
a
s

c
l
a
v
e
s

p
r
i
m
a
r
i
a
s

p
a
r
a

r
e
c
u
p
e
r
a
r

l
o
s

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a
P
a
r
t
e

1
:

L
o

p
r
i
m
e
r
o

q
u
e

h
a
c
e

e
l

m

t
o
d
o

s
e
a
r
c
h
I
t
e
m
s

e
s

p
a
s
a
r

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a

e
n
v
i
a
d
a

p
o
r

e
l

u
s
u
a
r
i
o

f
i
n
a
l

a
l

B
e
a
n

d
e

s
e
s
i

n

S
e
a
r
c
h
B
e
a
n
.
S
e
a
r
c
h
B
e
a
n

(
d
e
s
c
r
i
t
o

e
n

l
a

s
i
g
u
i
e
n
t
e

s
e
c
c
i

n
)

i
m
p
l
e
m
e
n
t
a

u
n
a

b

s
q
u
e
d
a

c
o
n
t
r
o
l
a
d
a

p
o
r

B
e
a
n

q
u
e

r
e
c
u
p
e
r
a

u
n
a

l
i
s
t
a

d
e

c
l
a
v
e
s

p
r
i
m
a
r
i
a
s

p
a
r
a

t
o
d
o
s

l
o
s

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a

c
u
y
o

c
a
m
p
o
S
u
m
m
a
r
y

c
o
n
t
e
n
g
a

c
a
r
a
c
t
e
r
e
s

q
u
e

c
o
r
r
e
s
p
o
n
d
a
n

c
o
n

l
o
s

d
e

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a
.

E
s
t
a

l
i
s
t
a

e
s

d
e
v
u
e
l
t
a

a
l

m

t
o
d
o

s
e
a
r
c
h
I
t
e
m
s

e
n

u
n
a

v
a
r
i
a
b
l
e

E
n
u
m
e
r
a
t
i
o
n
.
E
n
u
m
e
r
a
t
i
o
n

e
n
u
m
=
(
E
n
u
m
e
r
a
t
i
o
n
)



s
e
a
r
c
h
.
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
(
s
e
a
r
c
h
S
t
r
i
n
g
)
;
2
:

E
l

m

t
o
d
o

s
e
a
r
c
h
I
t
e
m
s

u
s
a

l
a

l
i
s
t
a

E
n
u
m
e
r
a
t
i
o
n

d
e
v
u
e
l
t
a

e
n

l
a

p
a
r
t
e

1

y

u
s
a

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n

p
a
r
a

r
e
c
u
p
e
r
a
r

c
a
d
a

B
e
a
n

p
o
r

t
u
r
n
o

l
l
a
m
a
n
d
o

a

f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y

s
o
b
r
e

c
a
d
a

c
l
a
v
e
p
r
i
m
a
r
i
a

d
e

l
a

l
i
s
t
a
.

E
s
t
a

e
s

u
n
a

b

s
q
u
e
d
a

c
o
n
t
r
o
l
a
d
a

p
o
r

c
o
n
t
e
n
e
d
o
r

b
a
s
a
d
a

e
n

e
l

m
e
c
a
n
i
s
m
o

d
e
l

m

t
o
d
o

f
i
n
d
e
r

d
e
s
c
r
i
t
o

e
n

e
l

c
a
p

t
u
l
o

2
.
/
/
I
t
e
r
a
t
e

t
h
r
o
u
g
h

s
e
a
r
c
h

r
e
s
u
l
t
s
w
h
i
l
e

(
(
e
n
u
m

!
=

n
u
l
l
)

&
&





e
n
u
m
.
h
a
s
M
o
r
e
E
l
e
m
e
n
t
s
(
)
)
)

{

w
h
i
l
e
(
e
n
u
m
.
h
a
s
M
o
r
e
E
l
e
m
e
n
t
s
(
i
n
)
)

{
/
/
L
o
c
a
t
e

a
u
c
t
i
o
n

i
t
e
m
s

A
u
c
t
i
o
n
I
t
e
m

a
i
=
a
h
o
m
e
.
f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(
(




A
u
c
t
i
o
n
I
t
e
m
P
K
)
e
n
u
m
.
n
e
x
t
E
l
e
m
e
n
t
(
)
)
;

d
i
s
p
l
a
y
L
i
n
e
I
t
e
m
(
a
i
,

o
u
t
)
;

}
}
S
e
a
r
c
h
B
e
a
n
L
a

c
l
a
s
e

S
e
a
r
c
h
B
e
a
n
.
j
a
v
a

d
e
f
i
n
e

u
n
a

b

s
q
u
e
d
a

c
o
n
t
r
o
l
a
d
a

p
o
r

e
l

B
e
a
n

p
a
r
a

c
l
a
v
e
s

p
r
i
m
a
r
i
a
s

d
e

t
e
m
s

d
e

s
u
b
a
s
t
a

c
o
n

l
o
s

c
a
m
p
o
s

s
u
m
m
a
r
y

q
u
e

c
o
n
t
i
e
n
e
n

c
a
r
a
c
t
e
r
e
s

q
u
e

c
o
r
r
e
s
p
o
n
d
e
n
c
o
n

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a
.

E
s
t
e

B
e
a
n

e
s
t
a
b
l
e
c
e

u
n
a

c
o
n
e
x
i

n

c
o
n

l
a

b
a
s
e

d
e

d
a
t
o
s
,

y

p
r
o
p
o
r
c
i
o
n
a

l
o
s

m

t
o
d
o
s

g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t

y

E
J
B
C
r
e
a
t
e
.
C
o
n
e
x
i

n

c
o
n

l
a

B
a
s
e

d
e

D
a
t
o
s
C
o
m
o

e
s
t
e

B
e
a
n

c
o
n
t
r
o
l
a

s
u

p
r
o
p
i
o

a
c
c
e
s
o

a

l
a

b
a
s
e

d
e

d
a
t
o
s
,

t
i
e
n
e

q
u
e

e
s
t
a
b
l
e
c
e
r

s
u

p
r
o
p
i
a

c
o
n
e
x
i

n

c
o
n

e
l
l
a
.

N
o

p
u
e
d
e

d
e
l
e
g
a
r

e
s
t
o

a
l

c
o
n
t
e
n
e
d
o
r
.
.
L
a

c
o
n
e
x
i

n

c
o
n

l
a

b
a
s
e

d
e

d
a
t
o
s

s
e

e
s
t
a
b
l
e
c
e

e
j
e
m
p
l
a
r
i
z
a
n
d
o

u
n
a

c
l
a
s
e

D
r
i
v
e
r

e
s
t

t
i
c
a

y

p
r
o
p
o
r
c
i
o
n
a
n
d
o

e
l

m

t
o
d
o

g
e
t
C
o
n
n
e
c
t
i
o
n
.

E
s
t
e

m

t
o
d
o

r
e
q
u
i
e
r
e

u
n
a

c
l
a
s
e

e
s
t

t
i
c
a
D
r
i
v
e
r
M
a
n
a
g
e
r

p
a
r
a

r
e
g
i
s
t
r
a
r

u
n

d
r
i
v
e
r

c
o
n

l
a

b
a
s
e

d
e

d
a
t
o
s

q
u
e

c
o
r
r
e
s
p
o
n
d
a

c
o
n

l
a

U
R
L
.

E
n

e
s
t
e

c
a
s
o

l
a

U
R
L

e
s

w
e
b
l
o
g
i
c
.
j
d
b
c
.
j
t
s
.
D
r
i
v
e
r
.
/
/
E
s
t
a
b
l
i
s
h

d
a
t
a
b
a
s
e

c
o
n
n
e
c
t
i
o
n


s
t
a
t
i
c

{




n
e
w

w
e
b
l
o
g
i
c
.
j
d
b
c
.
j
t
s
.
D
r
i
v
e
r
(
)
;


}


p
u
b
l
i
c

C
o
n
n
e
c
t
i
o
n

g
e
t
C
o
n
n
e
c
t
i
o
n
(
)








t
h
r
o
w
s

S
Q
L
E
x
c
e
p
t
i
o
n

{




r
e
t
u
r
n

D
r
i
v
e
r
M
a
n
a
g
e
r
.
g
e
t
C
o
n
n
e
c
t
i
o
n
(








"
j
d
b
c
:
w
e
b
l
o
g
i
c
:
j
t
s
:
e
j
b
P
o
o
l
"
)
;


}
O
b
t
e
n
e
r

l
a

L
i
s
t
a

d
e

t
e
m
s

E
n
c
o
n
t
r
a
d
o
s
E
l

m

t
o
d
o

g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t

b
u
s
c
a

A
u
c
t
i
o
n
I
t
e
m
s
B
e
a
n

y

c
r
e
a

u
n

o
b
j
e
t
o

P
r
e
p
a
r
e
d
S
t
a
t
e
m
e
n
t

p
a
r
a

h
a
c
e
r

u
n
a

c
o
n
s
u
l
t
a

a

l
a

b
a
s
e

d
e

d
a
t
o
s

p
o
r

l
o
s

c
a
m
p
o
s

s
u
m
m
a
r
y

q
u
e
c
o
n
t
e
n
g
a
n

l
a

c
a
d
e
n
a

d
e

b

s
q
u
e
d
a
.

L
o
s

d
a
t
o
s

s
e

l
e
e
n

d
e
s
d
e

l
a

b
a
s
e

d
e

d
a
t
o
s

d
e
n
t
r
o

d
e

u
n

R
e
s
u
l
t
S
e
t
,

a
l
m
a
c
e
n
a
d
o

e
n

u
n

V
e
c
t
o
r
,

y

d
e
v
u
e
l
t
o

a

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.


p
u
b
l
i
c

E
n
u
m
e
r
a
t
i
o
n

g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
(








S
t
r
i
n
g

s
e
a
r
c
h
S
t
r
i
n
g
)









t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{




R
e
s
u
l
t
S
e
t

r
s

=

n
u
l
l
;




P
r
e
p
a
r
e
d
S
t
a
t
e
m
e
n
t

p
s

=

n
u
l
l
;




V
e
c
t
o
r

v

=

n
e
w

V
e
c
t
o
r
(
)
;




C
o
n
n
e
c
t
i
o
n

c
o
n

=

n
u
l
l
;




t
r
y
{
/
/
G
e
t

d
a
t
a
b
a
s
e

c
o
n
n
e
c
t
i
o
n






c
o
n
=
g
e
t
C
o
n
n
e
c
t
i
o
n
(
)
;
/
/
C
r
e
a
t
e

a

p
r
e
p
a
r
e
d

s
t
a
t
e
m
e
n
t

f
o
r

d
a
t
a
b
a
s
e

q
u
e
r
y






p
s
=
c
o
n
.
p
r
e
p
a
r
e
S
t
a
t
e
m
e
n
t
(
"
s
e
l
e
c
t

i
d

f
r
o
m









a
u
c
t
i
o
n
i
t
e
m
s

w
h
e
r
e

s
u
m
m
a
r
y

l
i
k
e

?
"
)
;






p
s
.
s
e
t
S
t
r
i
n
g
(
1
,

"
%
"
+
s
e
a
r
c
h
S
t
r
i
n
g
+
"
%
"
)
;
/
/
E
x
e
c
u
t
e

d
a
t
a
b
a
s
e

q
u
e
r
y






p
s
.
e
x
e
c
u
t
e
Q
u
e
r
y
(
)
;
/
/
G
e
t

r
e
s
u
l
t
s

s
e
t






r
s

=

p
s
.
g
e
t
R
e
s
u
l
t
S
e
t
(
)
;
/
/
G
e
t

i
n
f
o
r
m
a
t
i
o
n

f
r
o
m

r
e
s
u
l
t
s

s
e
t






A
u
c
t
i
o
n
I
t
e
m
P
K

p
k
;






w
h
i
l
e

(
r
s
.
n
e
x
t
(
)
)

{








p
k

=

n
e
w

A
u
c
t
i
o
n
I
t
e
m
P
K
(
)
;








p
k
.
i
d

=

(
i
n
t
)
r
s
.
g
e
t
I
n
t
(
1
)
;
/
/
S
t
o
r
e

r
e
t
r
i
e
v
e
d

d
a
t
a

i
n

v
e
c
t
o
r








v
.
a
d
d
E
l
e
m
e
n
t
(
p
k
)
;






}






r
s
.
c
l
o
s
e
(
)
;






r
e
t
u
r
n

v
.
e
l
e
m
e
n
t
s
(
)
;




}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{








S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
g
e
t
M
a
t
c
h
i
n
g
I
t
e
m
s
L
i
s
t
:





























"
+
e
)
;








r
e
t
u
r
n

n
u
l
l
;




}
f
i
n
a
l
l
y

{






t
r
y

{









i
f
(
r
s

!
=

n
u
l
l
)

{











r
s
.
c
l
o
s
e
(
)
;









}









i
f
(
p
s

!
=

n
u
l
l
)

{











p
s
.
c
l
o
s
e
(
)
;









}









i
f
(
c
o
n

!
=

n
u
l
l
)

{











c
o
n
.
c
l
o
s
e
(
)
;









}






}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

i
g
n
o
r
e
)

{
}




}


}
M

t
o
d
o

C
r
e
a
t
e
E
l

m

t
o
d
o

e
j
b
C
r
e
a
t
e

c
r
e
a

u
n

o
b
j
e
t
o

j
a
v
a
x
.
n
a
m
i
n
g
.
I
n
i
t
i
a
l
C
o
n
t
e
x
t
.

E
s
t
a

e
s

u
n
a

c
l
a
s
e

J
N
D
I

(
J
a
v
a

N
a
n
i
m
g

a
n
d

D
i
r
e
c
t
o
r
y
)

q
u
e

p
e
r
m
i
t
e

a

S
e
a
r
c
h
B
e
a
n

a
c
c
e
d
e
r

a

l
a

b
a
s
e

d
e

d
a
t
o
s

s
i
n
r
e
l
a
c
i
o
n
a
r
s
e

c
o
n

e
l

c
o
n
t
e
n
e
d
o
r
:


p
u
b
l
i
c

v
o
i
d

e
j
b
C
r
e
a
t
e
(
)

t
h
r
o
w
s

C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
,





R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{




P
r
o
p
e
r
t
i
e
s

p

=

n
e
w

P
r
o
p
e
r
t
i
e
s
(
)
;




p
.
p
u
t
(
C
o
n
t
e
x
t
.
I
N
I
T
I
A
L
_
C
O
N
T
E
X
T
_
F
A
C
T
O
R
Y
,









"
w
e
b
l
o
g
i
c
.
j
n
d
i
.
T
e
n
g
a
h
I
n
i
t
i
a
l
C
o
n
t
e
x
t
F
a
c
t
o
r
y
"
)
;




t
r
y
{








c
t
x

=

n
e
w

I
n
i
t
i
a
l
C
o
n
t
e
x
t
(
p
)
;




}
c
a
t
c
h
(
E
x
c
e
p
t
i
o
n

e
)

{








S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
c
r
e
a
t
e

e
x
c
e
p
t
i
o
n
:

"
+
e
)
;




}


}
O
z
i
t
o
Clculo Distribuido
Tan recientemente como hace diez aos, el clculo distribuido generalmente
significaba que teniamos clientes PCs en una habitacin con un servidor en otra. El
problema con esta arquitectura es que si se pierde la conexin con el servidor, los
clientes no pueden actualizar las bases de datos de la compaa.
Para evitar esta prdida de tiempo, se crearon los diferentes modelos de red. Un
ejemplo es el modelo de servidor maestro y esclavo donde si el maestro falla, el
esclavo toma el relevo. El problema con los distintos modelos de red es que todos
requieren alguna forma de intervencin manual y se unieron con un sistema
operativo o un lenguaje. Y aunque estas aproximaciones consiguieron reducir el
tiempo de parada, no cumplen con los sistemas de distribucin heterognea que
consiste en una mezcla de protocolos de red y mquinas.
La plataforma Java
TM
combinada con otros avances como Common Object Request
Broker Architecture (CORBA), servidores multi-fila, y redes sin cables han llevado
un paso mas all la realizacin de la computacin totalmentedistribuida, de la
tradicional aproximacin cliente y servidor.
Ahora podemos construir aplicaciones que incluyan servicios de redundancia por
defecto. Si una conexin de servidor falla, podemos usar un servicio de otro
servidor. CORBA y los puentes "Distributed Component Object Model" (DCOM)
significan que los objetos pueden ser transferidos entre casi todas las mquinas y
lenguajes. Y con el nuevo sistema de software Jini
TM
, el entorno de clculo
distribuido pude estar pronto en todos los hogares, oficinas o escuelas.
Servicios de Bsqueda
Remote Method Invocation (RMI)
Common Object Request Broker Architecture (CORBA)
Tecnologa JDBC
TM

Servlets
Tienes Prisa?
Esta tabla te llevar directamente a los tpicos especificados.
Tpico Seccin
Servicios de Bsqueda Java Naming and Directory Interface (JNDI)
Common Object Request Broker Architecture
(CORBA) Naming Service

Interoperable Object References (IOR)
Remote Method Invocation (RMI)
RMI Over Internet Inter-ORB Protocol (IIOP)
JINI Lookup Services
Aumentar el Rendimiento de la Bsqueda
Remote Method
Invocation (RMI)
Sobre RMI
RMI en la aplicacin Subasta
Introduccin a la Clase
Sumario de Ficheros
Compilar el Ejemplo
Arrancar el Registro RMI
Arrancar el Servidor Remoto

Establecer Comunicaciones Remotas
La clase RegistrationServer
Exportar un Objeto Remoto
Pasar por Valor y por Referencia
Recoleccin de Basura Distribuida

Interface Registration
Interface ReturnResults
La Clase SellerBean
Common Object
Request Broker
Architecture (CORBA)
Esquema de Mapeo IDL
Referencia Rpida
Configurar el Mapeo IDL
Otros Tipos IDL

CORBA en la Aplicacin de Subasta
CORBA RegistrationServer
Fichero de Mapeos IDL
Compilar el Fichero de Mapeos IDL
Ficheros Stub y Skeleton

Object Request Broker (ORB)
Hacer Accesible el Servidor CORBA
Aadir un nuevo ORB
Accesos al Servicio de Nombres por clientes
CORBA

Clases Helper y Holder
Recoleccin de Basura
Retrollamadas CORBA
Uso de Cualquier Tipo
Conclusin
Tecnologa JDBC Drivers JDBC
Conexiones a Bases de Datos
Sentencias
Sentencias Callable
Sentencias
Sentencias Preparadas

Guardar los Resultados de la Base de Datos
Hojas de Resultados
Hojas de Resultados Scrollables
Controlar Transaciones
Caracteres de Escape
Mapeo de Tipos de Bases de Datos
Mapeo de Tipos de Datos
Ozito
S
e
r
v
i
c
i
o
s

d
e

B

s
q
u
e
d
a
L
o
s

s
e
r
v
i
c
i
o
s

d
e

b

s
q
u
e
d
a

p
e
r
m
i
t
e
n

l
a
s

c
o
m
u
n
i
c
a
c
i
o
n
e
s

a

t
r
a
v

s

d
e

l
a

r
e
d
.

U
n

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

p
u
e
d
e

u
s
a
r

u
n

p
r
o
t
o
c
o
l
o

d
e

b

s
q
u
e
d
a

p
a
r
a

o
b
t
e
n
e
r

i
n
f
o
r
m
a
c
i

n

s
o
b
r
e

p
r
o
g
r
a
m
a
s
r
e
m
o
t
o
s

o

m

q
u
i
n
a
s

q
u
e

u
s
e
n

e
s
a

i
n
f
o
r
m
a
c
i

n

p
a
r
a

e
s
t
a
b
l
e
c
e
r

u
n
a

c
o
m
u
n
i
c
a
c
i

n
.
U
n

s
e
r
v
i
c
i
o

d
e

b

s
q
u
e
d
a

c
o
m

n

c
o
n

e
l

q
u
e

p
o
d
r

a
m
o
s

e
s
t
a
r

f
a
m
i
l
i
a
r
i
z
a
d
o
s

e
s

e
l

D
i
r
e
c
t
o
r
y

N
a
m
e

S
e
r
v
i
c
e

(
D
N
S
)
.

M
a
p
e
a

d
i
r
e
c
c
i
o
n
e
s

d
e

I
n
t
e
r
n
e
t

P
r
o
t
o
c
o
l

(
I
P
)

a

n
o
m
b
r
e
s

d
e
m

q
u
i
n
a
s
.

L
o
s

p
r
o
g
r
a
m
a
s

u
s
a
n

e
l

m
a
p
e
o

D
N
S

p
a
r
a

b
u
s
c
a
r

d
i
r
e
c
c
i
o
n
e
s

I
P

a
s
o
c
i
a
d
a
s

c
o
n

u
n

n
o
m
b
r
e

d
e

m

q
u
i
n
a

y

u
s
a
r

l
a

d
i
r
e
c
c
i

n

I
P

p
a
r
a

e
s
t
a
b
l
e
c
e
r

u
n
a

c
o
m
u
n
i
c
a
c
i

n
.




D
e

l
a

m
i
s
m
a

f
o
r
m
a
,

e
l

A
u
c
t
i
o
n
S
e
r
v
l
e
t

p
r
e
s
e
n
t
a
d
o

e
n

C
h
a
p
t
e
r

2

u
s
a

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

i
n
t
e
r
n
o

d
e

l
a

a
r
q
u
i
t
e
c
t
u
r
a

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

p
a
r
a

b
u
s
c
a
r

u
n
a
s

r
e
f
e
r
e
n
c
i
a
s

a

B
e
a
n
s
E
n
t
e
r
p
r
i
s
e

r
e
g
i
s
t
r
a
d
o
s

c
o
n

e
l

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e
.




A
d
e
m

s

d
e

l
o
s

s
e
r
v
i
c
i
o
s

d
e

n
o
m
b
r
e
s
,

a
l
g
u
n
o
s

p
r
o
t
o
c
o
l
o
s

d
e

b

s
q
u
e
d
a

p
r
o
p
o
r
c
i
o
n
a
n

s
e
r
v
i
c
i
o
s

d
e

d
i
r
e
c
t
o
r
i
o
.

E
s
t
e

s
e
r
v
i
c
i
o
s

c
o
m
o

e
l

L
i
g
h
t
w
e
i
g
h
t

D
i
r
e
c
t
o
r
y

A
c
c
e
s
s

P
r
o
t
o
c
o
l

(
L
D
A
P
)

y

e
l
N
I
S
+

d
e

S
u
n

p
r
o
p
o
r
c
i
o
n
a
n

o
t
r
a

i
n
f
o
r
m
a
c
i

n

y

s
e
r
v
i
c
i
o
s

m

s

a
l
l


d
e

l
o
s

d
i
s
p
o
n
i
b
l
e
s

c
o
n

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s
.

P
o
r

e
j
e
m
p
l
o
,

N
I
S
+

a
s
o
c
i
a

u
n

a
t
r
i
b
u
t
o

w
o
r
k
g
r
o
u
p

c
o
n

u
n
a

c
u
e
n
t
a

d
e
u
s
u
a
r
i
o
.

E
s
t
e

a
t
r
i
b
u
t
o

p
u
e
d
e

u
s
a
r
s
e

p
a
r
a

r
e
s
t
r
i
n
g
i
r

e
l

a
c
c
e
s
o

a

u
n
a

m

q
u

n
a
,

p
o
r

l
o

q
u
e

s

l
o

l
o
s

u
s
u
a
r
i
o
s

e
s
p
e
c
i
f
i
c
a
d
o
s

e
n

e
l

w
o
r
k
g
r
o
u
p

t
i
e
n
e
n

a
c
c
e
s
o
.
E
s
t
e

c
a
p

t
u
l
o

d
e
s
c
r
i
b
e

c
o
m
o

s
e

u
s
a

e
l

"
N
a
m
i
n
g

a
n
d

D
i
r
e
c
t
o
r
y

I
n
t
e
r
f
a
c
e

(
J
N
D
I
)
"

d
e

J
a
v
a

e
n

l
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a
s

p
a
r
a

b
u
s
c
a
r

l
o
s

B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
.

T
a
m
b
i

n

e
x
p
l
i
c
a

c
o
m
o

u
s
a
r
a
l
g
u
n
o
s

d
e

l
o
s

o
t
r
o
s

m
u
c
h
o
s

s
e
r
v
i
c
i
o
s

d
e

b

s
q
u
e
d
a

q
u
e

t
e
n
e
m
o
s

d
i
s
p
o
n
i
b
l
e
s
.

E
l

c

d
i
g
o

p
a
r
a

u
s
a
r

e
s
t
o
s

s
e
r
v
i
c
i
o
s

n
o

e
s

t
a
n

s
e
n
c
i
l
l
o

c
o
m
o

e
l

c

d
i
g
o

d
e

l
a

b

s
q
u
e
d
a

e
n

l
a

a
p
l
i
c
a
c
i

n

d
e

l
a
s
u
b
a
s
t
a

d
e
l

c
a
p

t
u
l
o

2
,

p
e
r
o

l
a
s

v
e
n
t
a
j
a
s

q
u
e

o
f
r
e
c
e
n

e
s
t
o
s

o
t
r
o
s

s
e
r
v
i
c
i
o
s

h
a
c
e
n

q
u
e

a
l
g
u
n
a
s

v
e
c
e
s

m
e
r
e
z
c
a

l
a

p
e
n
a

e
s
e

c

d
i
g
o

m

s

c
o
m
p
l
e
j
o
.
J
a
v
a

N
a
m
i
n
g

a
n
d

D
i
r
e
c
t
o
r
y

I
n
t
e
r
f
a
c
e

(
J
N
D
I
)




S
e
r
v
i
c
i
o

d
e

N
o
m
b
r
e
s

d
e

l
a

A
r
q
u
i
t
e
c
t
u
r
a

C
o
m
m
o
n

O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r

(
C
O
R
B
A
)




I
n
t
e
r
o
p
e
r
a
b
l
e

O
b
j
e
c
t

R
e
f
e
r
e
n
c
e
s

(
I
O
R
)




R
e
m
o
t
e

M
e
t
h
o
d

I
n
v
o
c
a
t
i
o
n

(
R
M
I
)




R
M
I

O
v
e
r

I
n
t
e
r
n
e
t

I
n
t
e
r
-
O
R
B

P
r
o
t
o
c
o
l

(
I
I
O
P
)




S
e
r
v
i
c
i
o
s

d
e

B

s
q
u
e
d
a

J
I
N
I




A
u
m
e
n
t
a
r

e
l

R
e
n
d
i
m
i
e
n
t
o

d
e

l
a

B

s
q
u
e
d
a




J
a
v
a

N
a
m
i
n
g

a
n
d

D
i
r
e
c
t
o
r
y

I
n
t
e
r
f
a
c
e

(
J
N
D
I
)
E
l

A
P
I

d
e

J
N
D
I

h
a
c
e

s
e
n
c
i
l
l
o

c
o
n
e
c
t
a
r

s
e
r
v
i
c
i
o
s

d
e

b

s
q
u
e
d
a

d
e

v
a
r
i
o
s

p
r
o
v
e
e
d
o
r
e
s

e
n

u
n

p
r
o
g
r
a
m
a

e
s
c
r
i
t
o

e
n

l
e
n
g
u
a
j
e

J
a
v
a
.

S
i
e
m
p
r
e

q
u
e

e
l

c
l
i
e
n
t
e

y

e
l

s
e
r
v
i
d
o
r

u
s
e
n

e
l

m
i
s
m
o

s
e
r
v
i
c
i
o
d
e

b

s
q
u
e
d
a
,

e
l

c
l
i
e
n
t
e

p
u
e
d
e

f

c
i
l
m
e
n
t
e

b
u
s
c
a
r

i
n
f
o
r
m
a
c
i

n

r
e
g
i
s
t
r
a
d
a

e
n

e
l

s
e
r
v
i
d
o
r

y

e
s
t
a
b
l
e
c
e
r

u
n
a

c
o
m
u
n
i
c
a
c
i

n
.
L
o
s

B
e
a
n
s

d
e

s
e
s
i

n

d
e

l
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a

u
s
a
n

J
N
D
I

y

u
n
a

f

b
r
i
c
a

d
e

n
o
m
b
r
e
s

J
N
D
I

e
s
p
e
c
i
a
l

d
e

B
E
A

W
e
b
l
o
g
i
c

p
a
r
a

b
u
s
c
a
r

B
e
a
n
s

d
e

e
n
t
i
d
a
d
.

L
o
s

s
e
r
v
i
c
i
o
s

J
N
D
I

n
o
r
m
a
l
m
e
n
t
e
i
n
i
c
i
a
l
i
z
a
n

l
a

f

b
r
i
c
a

d
e

n
o
m
b
r
e
s

c
o
m
o

u
n
a

p
r
o
p
i
e
d
a
d

d
e

l
a

l

n
e
a

d
e

c
o
m
a
n
d
o
s

o

c
o
m
o

u
n

v
a
l
o
r

d
e

i
n
i
c
i
a
l
i
z
a
c
i

n
.
P
r
i
m
e
r
o
,

l
a

f

b
r
i
c
a

d
e

n
o
m
b
r
e
s

w
e
b
l
o
g
i
c
.
j
n
d
i
.
T
e
n
g
a
h
I
n
i
t
i
a
l
C
o
n
t
e
x
t
F
a
c
t
o
r
y

s
e

p
o
n
e

d
e
n
t
r
o

d
e

u
n

o
b
j
e
t
o

j
a
v
a
.
u
t
i
l
.
P
r
o
p
e
r
t
y
,

l
u
e
g
o

e
s
t
e

o
b
j
e
t
o

s
e

p
a
s
a

c
o
m
o

p
a
r

m
e
t
r
o

a
l
c
o
n
s
t
r
u
c
t
o
r

d
e

I
n
i
t
i
a
l
C
o
n
t
e
x
T
.

A
q
u


t
e
n
e
m
o
s

u
n

e
j
e
m
p
l
o

d
e
l

m

t
o
d
o

e
j
b
C
r
e
a
t
e
:
.


C
o
n
t
e
x
t

c
t
x
;

/
/
J
N
D
I

c
o
n
t
e
x
t


p
u
b
l
i
c

v
o
i
d

e
j
b
C
r
e
a
t
e
(
)









t
h
r
o
w
s

C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
,

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{




H
a
s
h
t
a
b
l
e

e
n
v

=

n
e
w

H
a
s
h
t
a
b
l
e
(
)
;




e
n
v
.
p
u
t
(
C
o
n
t
e
x
t
.
I
N
I
T
I
A
L
_
C
O
N
T
E
X
T
_
F
A
C
T
O
R
Y
,






"
w
e
b
l
o
g
i
c
.
j
n
d
i
.
T
e
n
g
a
h
I
n
i
t
i
a
l
C
o
n
t
e
x
t
F
a
c
t
o
r
y
"
)
;




t
r
y
{





c
t
x

=

n
e
w

I
n
i
t
i
a
l
C
o
n
t
e
x
t
(
e
n
v
)
;




}
c
a
t
c
h
(
E
x
c
e
p
t
i
o
n

e
)

{





S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
c
r
e
a
t
e

e
x
c
e
p
t
i
o
n
:

"
+
e
)
;




}


}
U
n
a

v
e
z

c
r
e
a
d
o
,

e
l

c
o
n
t
e
x
t
o

J
N
D
I

s
e

u
s
a

p
a
r
a

b
u
s
c
a
r

l
o
s

i
n
t
e
r
f
a
c
e
s

p
r
i
n
c
i
p
a
l
e
s

d
e

l
o
s

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e
.

E
n

e
s
t
e

e
j
e
m
p
l
o
,

s
e

r
e
c
u
p
e
r
a

u
n
a

r
e
f
e
r
e
n
c
i
a

a

u
n

B
e
a
n

E
n
t
e
r
p
r
i
s
e

u
i
n
d
a

a
l
n
o
m
b
r
e
r
e
g
i
s
t
r
a
t
i
o
n

y

s
e

u
s
a

p
a
r
a

o
p
e
r
a
c
i
o
n
e
s

p
o
s
t
e
r
i
o
r
e
s
:


R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
h
o
m
e

=








(
R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
)

c
t
x
.
l
o
o
k
u
p
(
"
r
e
g
i
s
t
r
a
t
i
o
n
"
)
;


R
e
g
i
s
t
r
a
t
i
o
n
P
K

r
p
k
=
n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
P
K
(
)
;


r
p
k
.
t
h
e
u
s
e
r
=
b
u
y
e
r
;


R
e
g
i
s
t
r
a
t
i
o
n

n
e
w
b
i
d
d
e
r

=








r
h
o
m
e
.
f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(
r
p
k
)
;
E
n

e
l

l
a
d
o

d
e
l

s
e
r
v
i
d
o
r
,

e
l

d
e
s
c
r
i
p
t
o
r

d
e

d
e
s
a
r
r
o
l
l
o

p
a
r
a

e
l

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

t
i
e
n
e

s
u

v
a
l
o
r

b
e
a
n
h
o
m
e
n
a
m
e

c
o
m
o

r
e
g
i
s
t
r
a
t
i
o
n
.

L
a
s

h
e
r
r
a
m
i
e
n
t
a
s

d
e

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e
g
e
n
e
r
a
n

e
l

r
e
s
t
o

d
e
l

c

d
i
g
o

d
e

n
o
m
b
r
e
s

p
a
r
a

e
l

s
e
r
v
i
d
o
r
.
E
l

s
e
r
v
i
d
o
r

l
l
a
m
a

a

c
t
x
.
b
i
n
d

p
a
r
a

u
n
i
r

e
l

n
o
m
b
r
e

r
e
g
i
s
t
r
a
t
i
o
n

a
l

c
o
n
t
e
x
t
o

J
N
D
I
.

E
l

p
a
r

m
e
t
r
o

t
h
i
s

r
e
f
e
r
e
n
c
i
a

a

l
a

c
l
a
s
e

_
s
t
u
b

q
u
e

r
e
p
r
e
s
e
n
t
a

e
l

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
.


c
t
x
.
b
i
n
d
(
"
r
e
g
i
s
t
r
a
t
i
o
n
"
,

t
h
i
s
)
;
J
N
D
I

n
o

e
s

l
a

n
i
c
a

f
o
r
m
a

d
e

l
o
c
a
l
i
z
a
r

o
b
j
e
t
o
s

r
e
m
o
t
o
s
.

L
o
s

s
e
r
v
i
c
i
o
s

d
e

b

s
q
u
e
d
a

t
a
m
b
i

n

e
s
t

n

d
i
s
p
o
n
i
b
l
e
s

e
n

l
a
s

p
l
a
t
a
f
o
r
m
a
s

R
M
I
,

J
N
I

y

C
O
R
B
A
.

P
o
d
e
m
o
s

u
s
a
r

d
i
r
e
c
t
a
m
e
n
t
e

l
o
s
s
e
r
v
i
c
i
o
s

d
e

b

s
q
u
e
d
a

d
e

e
s
t
a
s

p
l
a
t
a
f
o
r
m
a
s

d
i
r
e
c
t
a
m
e
n
t
e

d
e
s
d
e

e
l

A
P
I

d
e
l

J
N
D
I
.

J
N
D
I

p
e
r
m
i
t
e

a

l
a
s

a
p
l
i
c
a
c
i
o
n
e
s

c
a
m
b
i
a
r

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

c
o
n

p
o
c
o

e
s
f
u
e
r
z
o
.

P
o
r

e
j
e
m
p
l
o
,

a
q
u

e
s
t


e
l

c

d
i
g
o

q
u
e

h
a
c
e

q
u
e

e
l

m

t
o
d
o

B
i
d
d
e
r
B
e
a
n
.
e
j
b
C
r
e
a
t
e

u
s
e

e
l

s
e
r
v
i
c
i
o

d
e

b

s
q
u
e
d
a

d
e

o
r
g
.
o
m
b
.
C
O
R
B
A

e
n

v
e
z

d
e
l

s
e
r
v
i
c
i
o

d
e

b

s
q
u
e
d
a

p
o
r

d
e
f
e
c
t
o

d
e

B
E
A

W
e
b
l
o
g
i
c
.


H
a
s
h
t
a
b
l
e

e
n
v

=

n
e
w

H
a
s
h
t
a
b
l
e
(
)
;


e
n
v
.
p
u
t
(
"
j
a
v
a
.
n
a
m
i
n
g
.
f
a
c
t
o
r
y
.
i
n
i
t
i
a
l
"
,









"
c
o
m
.
s
u
n
.
j
n
d
i
.
c
o
s
n
a
m
i
n
g
.
C
N
C
t
x
F
a
c
t
o
r
y
"
)
;


C
o
n
t
e
x
t

i
c

=

n
e
w

I
n
i
t
i
a
l
C
o
n
t
e
x
t
(
e
n
v
)
;
S
e
r
v
i
c
o

d
e

N
o
m
b
r
e
s

C
O
R
B
A
E
l

"
C
o
m
m
o
n

O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r

A
r
c
h
i
t
e
c
t
u
r
e
"

(
C
O
R
B
A
)

d
e
f
i
n
e

u
n
a

e
s
p
e
c
i
f
i
c
a
c
i

n

p
a
r
a

q
u
e

l
o
s

o
b
j
e
t
o
s

d
e

u
n

s
i
s
t
e
m
a

d
i
s
t
r
i
b
u
i
d
o

s
e

c
o
m
u
n
i
q
u
e
n

u
n
o
s

c
o
n

o
t
r
o
s
.

L
o
s

o
b
j
e
t
o
s

q
u
e

u
s
a
n
l
a

e
s
p
e
c
i
f
i
c
a
c
i

n

C
O
R
B
A

p
a
r
a

c
o
m
u
n
i
c
a
r
s
e

s
e

l
l
a
m
a
n

o
b
j
e
t
o
s

C
O
R
B
A
,

y

c
o
n
s
i
s
t
e
n

e
n

o
b
j
e
t
o
s

c
l
i
e
n
t
e

y

s
e
r
v
i
d
o
r
.
L
o
s

o
b
j
e
t
o
s

C
O
R
B
A

p
u
e
d
e

e
s
t
a
r

e
s
c
r
i
t
o
s

e
n

c
u
a
l
q
u
i
e
r

l
e
n
g
u
a
j
e

c
o
n

e
l

m
a
p
e
o

"
I
n
t
e
r
f
a
c
e

D
e
f
i
n
i
t
i
o
n

L
a
n
g
u
a
g
e
"

(
I
D
L
)
.

E
s
t
o
s

l
e
n
g
u
a
j
e
s

i
n
c
l
u
y
e
n

l
e
n
g
u
a
j
e
s

d
e

p
r
o
g
r
a
m
a
c
i

n

c
o
m
o

J
a
v
a
,
C
+
+
,

y

m
u
c
h
o
s

o
t
r
o
s

l
e
n
g
u
a
j
e
s

t
r
a
d
i
c
i
o
n
a
l
e
s

n
o

o
r
i
e
n
t
a
d
o
s

a

o
b
j
e
t
o
s
.
E
l

s
e
r
v
i
c
i
o

d
e

b

s
q
u
e
d
a

d
e

n
o
m
b
r
e
s
,

a
l

i
g
u
a
l

q
u
e

o
t
r
a
s

e
s
p
e
c
i
f
i
c
a
c
i
o
n
e
s

C
O
R
B
A
,

e
s
t


d
e
f
i
n
i
d
o

e
n

t

r
m
i
n
o
s

d
e

I
D
L
.

E
l

m

d
u
l
o

I
D
L

p
a
r
a

e
l

s
e
r
v
i
c
i
o

d
e

b

s
q
u
e
d
a

C
O
R
B
A

s
e

l
l
a
m
a
C
o
s
N
a
m
i
n
g
.

C
u
a
l
q
u
i
e
r

p
l
a
t
a
f
o
r
m
a

c
o
n

u
n

m
a
p
e
o

I
D
L
,

c
o
m
o

l
a

h
e
r
r
a
m
i
e
n
t
a

i
d
l
t
o
j
a
v
a
,

p
u
e
d
e

u
s
a
r

e
s
t
e

s
e
r
v
i
c
i
o

p
a
r
a

d
e
s
c
u
b
r
i
r

o
b
j
e
t
o
s

C
O
R
B
A
.

E
l

m

d
u
l
o

I
D
L

p
a
r
a

e
s
t
e

s
e
r
v
i
c
i
o

d
e
b

s
q
u
e
d
a

C
O
R
B
A

e
s
t


d
i
s
p
o
n
i
b
l
e

e
n

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

2

e
n

e
l

p
a
q
u
e
t
e

o
r
g
.
o
m
g
.
C
o
s
N
a
m
i
n
g
.
E
l

i
n
t
e
r
f
a
c
e

c
l
a
v
e

e
n

e
l

m

d
u
l
o

C
o
s
N
a
m
i
n
g

e
s

N
a
m
i
n
g
C
o
n
t
e
x
t
.

E
s
t
e

i
n
t
e
r
f
a
c
e

d
e
f
i
n
e

m

t
o
d
o
s

p
a
r
a

u
n
i
r

o
b
j
e
t
o
s

a

u
n

n
o
m
b
r
e
,

l
i
s
t
a
r

e
s
t
a
s

u
n
i
o
n
e
s
,

y

r
e
c
u
p
e
r
a
r

r
e
f
e
r
e
n
c
i
a
s

a

d
i
c
h
o
s
o
b
j
e
t
o
s
.
A
d
e
m

s

d
e

e
s
t
o
s

i
n
t
e
r
f
a
c
e
s

p

b
l
i
c
o
s

h
a
y

c
l
a
s
e
s

d
e

a
y
u
d
a
.

L
a

c
l
a
s
e

N
a
m
e
C
o
m
p
o
n
e
n
t

s
e

u
s
a

e
n

p
r
o
g
r
a
m
a
s

c
l
i
e
n
t
e

y

s
e
r
v
i
d
o
r

C
O
R
B
A

p
a
r
a

c
o
n
s
t
r
u
i
r

e
l

n
o
m
b
r
e

c
o
m
p
l
e
t
o

p
a
r
a

e
l

n
o
m
b
r
e
d
e
l

o
b
j
e
t
o

r
e
f
e
r
e
n
c
i
a
.

E
l

n
o
m
b
r
e

c
o
m
p
l
e
t
o

e
s

u
n

a
r
r
a
y

d
e

u
n
o

o

m

s

N
a
m
e
C
o
m
p
o
n
e
n
t
s

q
u
e

i
n
d
i
c
a

d
o
n
d
e

e
n
c
o
n
t
r
a
r

l
o
s

o
b
j
e
t
o
s
.

E
l

e
s
q
u
e
m
a

d
e

n
o
m
b
r
a
d
o

p
u
e
d
e

s
e
r

e
s
p
e
c

f
i
c
o

d
e

l
a
a
p
l
i
c
a
c
i

n
.
P
o
r

e
j
m
p
l
o

e
n

l
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a
s
,

e
l

n
o
m
b
r
e

c
o
m
p
l
e
t
o

p
u
e
d
e

s
e
r

d
e
f
i
n
i
d
o

p
a
r
a

u
s
a
r

a
u
c
t
i
o
n

c
o
m
o

l
a

r
a

z

d
e
l

c
o
n
t
e
x
t
o

d
e

n
o
m
b
r
e
s

y

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

y

A
u
c
t
i
o
n
I
t
e
m
B
e
a
n
c
o
m
o

h
i
j
o
s

d
e
l

c
o
n
t
e
x
t
o

r
a

z
.

E
s
t
o

e
n

e
f
e
c
t
o

u
t
i
l
i
z
a

u
n

e
s
q
u
e
m
a

d
e

n
o
m
b
r
e
s

s
i
m
i
l
a
r

a
l

u
s
a
d
o

a

l
o
s

p
a
q
u
e
t
e
s

d
e

c
l
a
s
e
s
.
E
n

e
s
t
e

e
j
e
m
p
l
o
,

l
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a
s

a

a
d
a
p
t
a
d
o

S
e
l
l
e
r
B
e
a
n

a

u
n

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

C
O
R
B
A

p
a
r
a

b
u
s
c
a
r

e
l

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

C
O
R
B
A
.

E
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

s
e

h
a

e
x
t
r
a

d
o

d
e
S
e
l
l
e
r
B
e
a
n
,

y

a
c
t

a

c
o
m
o

u
n

c
l
i
e
n
t
e

C
O
R
B
A
,

y

e
l

s
e
r
v
i
d
o
r

C
O
R
B
A

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
C
O
R
B
A

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
E
s
t
e

c

d
i
g
o

d
e
l

p
r
o
g
r
a
m
a

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

c
r
e
a

u
n

o
b
j
e
t
o

N
a
m
e
C
o
m
p
o
n
e
n
t

q
u
e

i
n
d
i
c
a

d

n
d
e

e
s
t


l
o
c
a
l
i
z
a
d
o

e
l

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

u
s
a
n
d
o

a
u
c
t
i
o
n

y

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

c
o
m
o

e
l
n
o
m
b
r
e

c
o
m
p
l
e
t
o
:


N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

f
u
l
l
n
a
m
e

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
2
]
;


f
u
l
l
n
a
m
e
[
0
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
"
a
u
c
t
i
o
n
"
,

"
"
)
;


f
u
l
l
n
a
m
e
[
1
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(






















"
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
"
,

"
"
)
;
E
l

s
i
g
u
i
e
n
t
e

c

d
i
d
o

u
n
e

e
l

f
u
l
l
n
a
m
e

c
o
m
o

u
n

n
u
e
v
o

c
o
n
t
e
x
t
o
.

L
o
s

p
r
i
m
e
r
o
s

e
l
e
m
e
n
t
o
s

e
n

e
l

n
o
m
b
r
e

c
o
m
p
l
e
t
o

(
a
u
c
t
i
o
n

e
n

e
s
t
e

e
j
e
m
p
l
o
)

s
o
n

h
u
e
c
o
s

p
a
r
a

c
o
n
s
t
r
u
i
r

e
l

r
b
o
l

d
e
l

c
o
n
t
e
x
t
o
d
e

n
o
m
b
r
a
d
o
.

E
l

l
t
i
m
o

e
l
e
m
e
n
t
o

d
e
l

n
o
m
b
r
e

c
o
m
p
l
e
t
o

(
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

e
n

e
s
t
e

e
j
e
m
p
l
o
)

e
s

e
l

n
o
m
b
r
e

e
n
v
i
a
d
o

p
a
r
a

u
n
i
r
l
o

a
l

o
b
j
e
t
o
:


S
t
r
i
n
g
[
]

o
r
b
a
r
g
s

=

{

"
-
O
R
B
I
n
i
t
i
a
l
P
o
r
t

1
0
5
0
"
}
;


O
R
B

o
r
b

=

O
R
B
.
i
n
i
t
(
o
r
b
a
r
g
s
,

n
u
l
l
)

;


R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

r
s
=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
(
)
;


o
r
b
.
c
o
n
n
e
c
t
(
r
s
)
;


t
r
y
{




o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
b
j
e
c
t

n
a
m
e
S
e
r
v
i
c
e
O
b
j

=









o
r
b
.
r
e
s
o
l
v
e
_
i
n
i
t
i
a
l
_
r
e
f
e
r
e
n
c
e
s
(
"
N
a
m
e
S
e
r
v
i
c
e
"
)
;




N
a
m
i
n
g
C
o
n
t
e
x
t

n
c
t
x

=









N
a
m
i
n
g
C
o
n
t
e
x
t
H
e
l
p
e
r
.
n
a
r
r
o
w
(
n
a
m
e
S
e
r
v
i
c
e
O
b
j
)
;




N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

f
u
l
l
n
a
m
e

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
2
]
;




f
u
l
l
n
a
m
e
[
0
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
"
a
u
c
t
i
o
n
"
,

"
"
)
;




f
u
l
l
n
a
m
e
[
1
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
























"
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
"
,

"
"
)
;




N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

t
e
m
p
C
o
m
p
o
n
e
n
t

=























n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
1
]
;




f
o
r
(
i
n
t

i
=
0
;

i

<

f
u
l
l
n
a
m
e
.
l
e
n
g
t
h
-
1
;

i
+
+

)

{







t
e
m
p
C
o
m
p
o
n
e
n
t
[
0
]
=

f
u
l
l
n
a
m
e
[
i
]
;







t
r
y
{










n
c
t
x
=
n
c
t
x
.
b
i
n
d
_
n
e
w
_
c
o
n
t
e
x
t
(
t
e
m
p
C
o
m
p
o
n
e
n
t
)
;







}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)
{
}




}




t
e
m
p
C
o
m
p
o
n
e
n
t
[
0
]
=
f
u
l
l
n
a
m
e
[
f
u
l
l
n
a
m
e
.
l
e
n
g
t
h
-
1
]
;




/
/

f
i
n
a
l
l
y

b
i
n
d

t
h
e

o
b
j
e
c
t

t
o

t
h
e

f
u
l
l

c
o
n
t
e
x
t

p
a
t
h




n
c
t
x
.
b
i
n
d
(
t
e
m
p
C
o
m
p
o
n
e
n
t
,

r
s
)
;
U
n
a

v
e
z

q
u
e

s
e

h
a

u
n
i
d
o

e
l

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
,

p
u
e
d
e

s
e
r

l
o
c
a
l
i
z
a
d
o

c
o
n

u
n
a

b

s
q
u
e
d
a

J
N
D
I

u
s
a
n
d
o

e
l

p
r
o
v
e
e
d
o
r

d
e

s
e
r
v
i
c
i
o

C
o
s
N
a
m
i
n
g

c
o
m
o

s
e

d
e
s
c
r
i
b
e

a
l

f
i
n
a
l

d
e

l
a
s
e
c
c
i

n

J
N
D
I
,

o

u
s
a
n
d
o

e
l

s
e
r
v
i
c
i
o

d
e

b

s
q
u
e
d
a
s

d
e

n
o
m
b
r
e
s

C
O
R
B
A
.

D
e

c
u
a
l
q
u
i
e
r

f
o
r
m
a
,

e
l

s
e
r
v
i
d
o
r

d
e

n
o
m
b
r
e
s

C
O
R
B
A

d
e
b
e

a
r
r
a
n
c
a
r
s
e

a
n
t
e
s

d
e

q
u
e

p
u
e
d
a

s
u
c
e
d
e
r

c
u
a
l
q
u
i
e
r
b

s
q
u
e
d
a
.

E
n

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

2
,

e
l

n
a
m
e
s
e
r
v
e
r

C
O
R
B
A

s
e

a
r
r
a
n
c
a

c
o
n

e
s
t
e

c
o
m
a
n
d
o
:


t
n
a
m
e
s
e
r
v
E
s
t
o

a
r
r
a
n
c
a

e
l

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

C
O
R
B
A

e
n

e
l

p
u
e
r
t
o

T
C
P

p
o
r

d
e
f
e
c
t
o

9
0
0
.

S
i

n
e
c
e
s
i
t
a
m
o
s

u
s
a
r

o
t
r
o

p
u
e
r
t
o

d
i
f
e
r
e
n
t
e
,

p
o
d
e
m
o
s

a
r
r
a
n
c
a
r

e
l

s
e
r
v
i
d
o
r

d
e

e
s
t
a

f
o
r
m
a
.

E
n

s
i
s
t
e
m
a
s

U
n
i
x
,
s

l
o

e
l

a
d
m
i
n
i
s
t
r
a
d
o
r

p
u
e
d
e

a
c
c
e
d
e
r

a

l
o
s

n

m
e
r
o
s

d
e

p
u
e
r
t
o

i
n
f
e
r
i
o
r
e
s

a

1
0
2
5
,


t
n
a
m
e
s
e
r
v

-
O
R
B
I
n
i
t
i
a
l
P
o
r
t

1
0
9
1
C
O
R
B
A

S
e
l
l
e
r
B
e
a
n
E
n

e
l

l
a
d
o

d
e
l

c
l
i
e
n
t
e
,

l
a

b

s
q
u
e
d
a

C
O
R
B
A

u
s
a

e
l

o
b
j
e
t
o

N
a
m
e
C
o
m
p
o
n
e
n
t

p
a
r
a

c
o
n
s
t
r
u
i
r

e
l

n
o
m
b
r
e
.

A
r
r
a
n
c
a
m
o
s

e
l

s
e
r
v
i
d
o
r

d
e

o
b
j
e
t
o
s

d
e

e
s
t
a

f
o
r
m
a
:
j
a
v
a

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
L
a

d
i
f
e
r
e
n
c
i
a

e
n

e
l

c
l
i
e
n
t
e

e
s

q
u
e

e
s
t
e

n
o
m
b
r
e

s
e

p
a
s
a

a
l

m

t
o
d
o

r
e
s
o
l
v
e

q
u
e

d
e
v
u
e
l
v
e

e
l

o
b
j
e
t
o

C
O
R
B
A
.

E
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

d
e
l

o
b
j
e
t
o

S
e
l
l
e
r
B
e
a
n

i
l
u
s
t
r
a

e
s
t
e

p
u
n
t
o
:


S
t
r
i
n
g
[
]

a
r
g
s

=

{

"
-
O
R
B
I
n
i
t
i
a
l
P
o
r
t

1
0
5
0
"
}
;


o
r
b

=

O
R
B
.
i
n
i
t
(
a
r
g
s
,

n
u
l
l
)

;


o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
b
j
e
c
t

n
a
m
e
S
e
r
v
i
c
e
O
b
j

=









o
r
b
.
r
e
s
o
l
v
e
_
i
n
i
t
i
a
l
_
r
e
f
e
r
e
n
c
e
s
(
"
N
a
m
e
S
e
r
v
i
c
e
"
)

;


n
c
t
x
=

N
a
m
i
n
g
C
o
n
t
e
x
t
H
e
l
p
e
r
.
n
a
r
r
o
w
(
n
a
m
e
S
e
r
v
i
c
e
O
b
j
)
;


N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

f
u
l
l
n
a
m
e

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
2
]
;


f
u
l
l
n
a
m
e
[
0
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
"
a
u
c
t
i
o
n
"
,

"
"
)
;


f
u
l
l
n
a
m
e
[
1
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(






















"
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
"
,

"
"
)
;


o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
b
j
e
c
t

c
o
b
j
e
c
t
=

n
c
t
x
.
r
e
s
o
l
v
e
(
f
u
l
l
n
a
m
e
)
;
E
l

m

t
o
d
o

n
a
r
r
o
w
,

d
e
s
d
e

e
l

m

t
o
d
o

H
e
l
p
e
r
,

e
s

g
e
n
e
r
a
d
o

p
o
r

e
l

c
o
m
p
i
l
a
d
o
r

I
D
L
,

q
u
e

p
r
o
p
o
r
c
i
o
n
a

u
n
a

m
a
p
e
o

d
e
t
a
l
l
a
d
o

p
a
r
a

t
r
a
d
u
c
i
r

c
a
d
a

c
a
m
p
o

C
O
R
B
A

e
n

s
u

r
e
s
p
e
c
t
i
v
o

c
a
m
p
o

d
e
l
l
e
n
g
u
a
j
e

J
a
v
a
.

P
o
r

e
j
e
m
p
l
o
,

e
l

m

t
o
d
o

S
e
l
l
e
r
B
e
a
n
.
i
n
s
e
r
t
I
t
e
m

b
u
s
c
a

u
n

o
b
j
e
t
o

C
O
R
B
A

r
e
g
i
s
t
r
a
d
o

u
s
a
n
d
o

e
l

n
o
m
b
r
e

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
,

y

d
e
v
u
e
l
v
e

u
n

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
C
o
n

e
l

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

p
o
d
e
m
o
s

d
e
v
o
l
v
e
r

u
n

r
e
g
i
s
t
r
o

R
e
g
i
s
t
r
a
t
i
o
n

l
l
a
m
a
n
d
o

a

s
u

m

t
o
d
o

f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
.


o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
b
j
e
c
t

c
o
b
j
e
c
t
=

n
c
t
x
.
r
e
s
o
l
v
e
(
f
u
l
l
n
a
m
e
)
;


R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
H
o
m
e
=


R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
H
e
l
p
e
r
.
n
a
r
r
o
w
(
c
o
b
j
e
c
t
)
;


R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
R
e
f

=









R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
H
e
l
p
e
r
.
n
a
r
r
o
w
(










n
c
t
x
.
r
e
s
o
l
v
e
(
f
u
l
l
n
a
m
e
)
)
;


R
e
g
i
s
t
r
a
t
i
o
n
P
K
I
m
p
l

r
p
k
=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
P
K
I
m
p
l
(
)
;


r
p
k
.
t
h
e
u
s
e
r
(
s
e
l
l
e
r
)
;


R
e
g
i
s
t
r
a
t
i
o
n

n
e
w
s
e
l
l
e
r

=









R
e
g
i
s
t
r
a
t
i
o
n
H
e
l
p
e
r
.
n
a
r
r
o
w
(










r
e
g
R
e
f
.
f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(
r
p
k
)
)
;


i
f
(
(
n
e
w
s
e
l
l
e
r

=
=

n
u
l
l
)
|
|









(
!
n
e
w
s
e
l
l
e
r
.
v
e
r
i
f
y
P
a
s
s
w
o
r
d
(
p
a
s
s
w
o
r
d
)
)
)

{




r
e
t
u
r
n
(
A
u
c
t
i
o
n
.
I
N
V
A
L
I
D
_
U
S
E
R
)
;


}
I
n
t
e
r
o
p
e
r
a
b
l
e

O
b
j
e
c
t

R
e
f
e
r
e
n
c
e
s

(
I
O
R
)
U
s
a
r

u
n

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

C
O
R
B
A

f
u
n
c
i
o
n
a

p
a
r
a

l
a

m
a
y
o
r

a

d
e

l
a
s

a
p
l
i
c
a
c
i
o
n
e
s

C
O
R
B
A
,

e
s
p
e
c
i
a
l
m
e
n
t
e

c
u
a
n
d
o

e
l

(
O
R
B
)

e
s
t


s
u
m
i
n
i
s
t
r
a
d
o

p
o
r

u
n

v
e
n
d
e
d
o
r
.

S
i
n

e
m
b
a
r
g
o
,

p
o
d
r

a
m
o
s
e
n
c
o
n
t
r
a
r

q
u
e

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

n
o

e
s

t
o
t
a
l
m
e
n
t
e

c
o
m
p
a
t
i
b
l
e

c
o
n

t
o
d
o
s

l
o
s

O
R
B
s
,

y

p
o
d
r

a
m
o
s

o
b
t
e
n
e
r

e
l

f
r
u
s
t
a
n
t
e

m
e
n
s
a
j
e

C
O
M
M
_
F
A
I
L
U
R
E

c
u
a
n
d
o

e
l

c
l
i
e
n
t
e

C
O
R
B
A

i
n
t
e
n
t
e
c
o
n
e
c
t
a
r
s
e

c
o
n

e
l

s
e
r
v
i
d
o
r

C
O
R
B
A
.
L
a

s
o
l
u
c
i

n

e
s

u
s
a
r

u
n

"
I
n
t
e
r
o
p
e
r
a
b
l
e

O
b
j
e
c
t

R
e
f
e
r
e
n
c
e
"

(
I
O
R
)

e
n

s
u

l
u
g
a
r
.

E
s
t
e

e
s
t


d
i
s
p
o
n
i
b
l
e

e
n

l
o
s

O
R
B
s

q
u
e

s
o
p
o
r
t
a
n

e
l

p
r
o
t
o
c
o
l
o

"
I
n
t
e
r
n
e
t

I
n
t
e
r
-
O
R
B

P
r
o
t
o
c
o
l
"

(
I
I
O
P
)
.

C
o
n
t
e
i
n
e

l
a
i
n
f
o
r
m
a
c
i

n

q
u
e

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

p
o
d
r

a

m
a
n
t
e
n
e
r

p
a
r
a

c
a
d
a

o
b
j
e
t
o

c
o
m
o

e
l

h
o
s
t

y

e
l

p
u
e
r
t
o

d
o
n
d
e

r
e
s
i
d
e

e
l

o
b
j
e
t
o
,

u
n
a

n
i
c
a

c
l
a
v
e

d
e

b

s
q
u
e
d
a

p
a
r
a

e
l

o
b
j
e
t
o

e
n

e
s
e

h
o
s
t
,

y
q
u


v
e
r
s
i
o
n

d
e

I
I
O
P

s
o
p
o
r
t
a
.
S
e
r
v
i
d
o
r

I
O
R
P
a
r
a

c
r
e
a
r

u
n

I
O
R

t
o
d
o

l
o

q
u
e

t
e
n
e
m
o
s

q
u
e

h
a
c
e
r

e
s

l
l
a
m
a
r

a
l

m

t
o
d
o

o
b
j
e
c
t
_
t
o
_
s
t
r
i
n
g

d
e
s
d
e

l
a

c
l
a
s
e

O
R
B

y

p
a
s
a
r
l
e

u
n

e
j
e
m
p
l
a
r

d
e
l

o
b
j
e
t
o
.

P
o
r

e
j
e
m
p
l
o
,

p
a
r
a

c
o
n
v
e
r
t
i
r

e
l

o
b
j
e
t
o
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

e
n

u
n

I
O
R
,

n
e
c
e
s
i
t
a
m
o
s

a

a
d
i
r

l
a

l

n
e
a

S
t
r
i
n
g

r
e
f

=

o
r
b
.
o
b
j
e
c
t
_
t
o
_
s
t
r
i
n
g
(
r
s
)
;

d
e
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

e
n

e
l

p
r
o
g
r
a
m
a

p
r
i
n
c
i
p
a
l
:


S
t
r
i
n
g
[
]

o
r
b
a
r
g
s
=


{
"
-
O
R
B
I
n
i
t
i
a
l
P
o
r
t

1
0
5
0
"
}
;


O
R
B

o
r
b

=

O
R
B
.
i
n
i
t
(
o
r
b
a
r
g
s
,

n
u
l
l
)
;


R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

r
s

=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
(
)
;
/
/
A
d
d

t
h
i
s

l
i
n
e


S
t
r
i
n
g

r
e
f

=

o
r
b
.
o
b
j
e
c
t
_
t
o
_
s
t
r
i
n
g
(
r
s
)
;
P
o
r

e
s
o
,

e
n

l
u
g
a
r

d
e

r
e
c
u
p
e
r
a
r

l
a

i
n
f
o
r
m
a
c
i

n

d
e

e
s
t
e

o
b
j
e
t
o

d
e
s
d
e

u
n

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s
,

h
a
y

o
t
r
a

f
o
r
m
a

p
a
r
a

q
u
e

e
l

s
e
r
v
i
d
o
r

e
n
v

e

e
s
t
a

i
n
f
o
r
m
a
c
i

n

a

u
n

c
l
i
e
n
t
e
.

P
o
d
e
m
o
s

r
e
g
i
s
t
r
a
r

e
l
s
t
r
i
n
g

d
e
v
u
e
l
t
o

c
o
n

u
n

n
o
m
b
r
e

s
u
s
t
i
t
u
t
i
v
o

d
e
l

s
e
r
v
i
d
o
r
,

q
u
e

p
u
e
d
e

s
e
r

u
n

s
e
n
c
i
l
l
o

s
e
r
v
i
d
o
r

w
e
b

H
T
T
P

p
o
r
q
u
e

e
l

o
b
j
e
t
o

y
a

e
s
t


e
n

u
n

f
o
r
m
a
t
o

t
r
a
n
s
m
i
t
i
b
l
e
.
C
l
i
e
n
t
e

I
O
R
E
s
t
e

e
j
e
m
p
l
o

u
s
a

u
n
a

c
o
n
e
x
i

n

H
T
T
P

p
a
r
a

c
o
n
v
e
r
t
i
r

e
l

s
t
r
i
n
g

I
O
R

d
e

n
u
e
v
o

e
n

u
n

o
b
j
e
t
o
.

P
o
d
e
m
o
s

l
l
a
m
a
r

a
l

m

t
o
d
o

s
t
r
i
n
g
_
t
o
_
o
b
j
e
c
t

d
e
s
d
e

l
a

c
l
a
s
e

O
R
B
.

E
s
t
e

m

t
o
d
o

l
l
a
m
a

a
l

I
O
R
d
e
s
d
e

e
l

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

y

d
e
v
u
e
l
v
e

e
l

s
t
r
i
n
g

O
R
B
.

E
s
t
e

s
t
r
i
n
g

s
e

p
a
s
a

a
l

O
R
B

u
s
a
n
d
o

e
l

m

t
o
d
o

O
R
B
.
s
t
r
i
n
g
_
t
o
_
o
b
j
e
c
t
,

y

e
l

O
R
B

d
e
v
u
e
l
v
e

l
a

r
e
f
e
r
e
n
c
i
a

a
l

o
b
j
e
t
o

r
e
m
o
t
o
:


U
R
L

i
o
r
s
e
r
v
e
r

=

n
e
w

U
R
L
(








"
h
t
t
p
:
/
/
s
e
r
v
e
r
.
c
o
m
/
s
e
r
v
l
e
t
?
o
b
j
e
c
t
=
r
e
g
i
s
t
r
a
t
i
o
n
"
)
;


U
R
L
C
o
n
n
e
c
t
i
o
n

c
o
n

=

i
o
s
e
r
v
e
r
.
o
p
e
n
C
o
n
n
e
c
t
i
o
n
(
)
;


B
u
f
f
e
r
e
d
R
e
a
d
e
r

b
r

=

n
e
w

B
u
f
f
e
r
R
e
a
d
e
r
(








n
e
w

I
n
p
u
t
S
t
r
e
a
m
R
e
a
d
e
r
(
c
o
n
.
g
e
t
I
n
p
u
t
S
t
r
e
a
m
)
)
;


S
t
r
i
n
g

r
e
f

=

b
r
.
r
e
a
d
L
i
n
e
(
)
;


o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
b
j
e
c
t

c
o
b
j

=

o
r
b
.
s
t
r
i
n
g
_
t
o
_
o
b
j
e
c
t
(
r
e
f
)
;


R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
H
o
m
e

=








R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
H
e
l
p
e
r
.
n
a
r
r
o
w
(
c
o
b
j
)
;
E
l

n
o
m
b
r
e

s
u
s
t
i
t
u
t
o

d
e
l

s
e
r
v
i
d
o
r

p
u
e
d
e

m
a
n
t
e
n
e
r

r
e
g
i
s
t
r
o
s

p
e
r
s
i
s
t
e
n
t
e
s

I
O
R

q
u
e

p
u
e
d
e
n

s
o
b
r
e
v
i
v
i
r

a

p
a
r
a
d
a
s

s
i

e
s

n
e
c
e
s
a
r
i
o
.
R
e
m
o
t
e

M
e
t
h
o
d

I
n
v
o
c
a
t
i
o
n

(
R
M
I
)
E
l

A
P
I

"
R
e
m
o
t
e

M
e
t
h
o
d

I
n
v
o
c
a
t
i
o
n
"

(
R
M
I
)

o
r
i
g
i
n
a
l
m
e
n
t
e

u
s
a
b
a

s
u

p
r
o
p
i
o

p
r
o
t
o
c
o
l
o

d
e

c
o
m
u
n
i
c
a
c
i

n

l
l
a
m
a
d
o

"
J
a
v
a

R
e
m
o
t
e

M
e
t
h
o
d

P
r
o
t
o
c
o
l
"

(
J
R
M
P
)
,

q
u
e

r
e
s
u
l
t
a
b
a

e
n

t
e
n
e
r

s
u

p
r
o
p
i
o
s
e
r
v
i
c
i
o

d
e

b

s
q
u
e
d
a
.

L
a
s

n
u
e
v
a
s

v
e
r
s
i
o
n
e
s

d
e

R
M
I

p
u
e
d
e
n

u
s
a
r

e
l

p
r
o
t
o
c
o
l
o

I
I
O
P
,

a
d
e
m

s

d
e

J
R
M
P
,

R
M
I
-
I
I
O
P

s
e

c
u
b
r
e

e
n

l
a

s
i
g
u
i
e
n
t
e

s
e
c
c
i

n
.
E
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
a
d
o

d
e
l

J
R
M
P

R
M
I

e
s

s
i
m
i
l
a
r

a

o
t
r
o
s

s
e
r
v
i
c
i
o
s

d
e

b

s
q
u
e
d
a

y

n
o
m
b
r
a
d
o
.

L
a

b

s
q
u
e
d
a

r
e
a
l

s
e

c
o
n
s
i
g
u
e

l
l
a
m
a
n
d
o

a

N
a
m
i
n
g
.
l
o
o
k
u
p

y

p
a
s

n
d
o
l
e

u
n

p
a
r

m
e
t
r
o

U
R
L

a
e
s
t
e

m

t
o
d
o
.

L
a

U
R
L

e
s
p
e
c
i
f
i
c
a

e
l

n
o
m
b
r
e

d
e

l
a

m

q
u
i
n
a
,

y

o
p
c
i
o
n
a
l
m
e
n
t
e

e
l

p
u
e
r
t
o

d
o
n
d
e

e
s
t


e
l

s
e
r
v
i
d
o
r

d
e

n
o
m
b
r
e
s
,

r
m
i
r
e
g
i
s
t
r
y
,

q
u
e

s
a
b
e

q
u
e

o
b
j
e
t
o

s
e

e
s
t


e
j
e
c
u
t
a
n
d
o
,

y

e
l
o
b
j
e
t
o

r
e
m
o
t
o

q
u
e

q
u
e
r
e
m
o
s

r
e
f
e
r
e
n
c
i
a
r

p
a
r
a

l
l
a
m
a
r

a

s
u
s

m

t
o
d
o
s
.
P
o
r

e
j
e
m
p
l
o
:


S
e
l
l
e
r
H
o
m
e

s
h
o
m
e

=




(
S
e
l
l
e
r
H
o
m
e
)
N
a
m
i
n
g
.
l
o
o
k
u
p
(




"
r
m
i
:
/
/
a
p
p
s
e
r
v
e
r
:
1
0
9
0
/
s
e
l
l
e
r
"
)
;
E
s
t
e

c

d
i
g
o

d
e
v
u
e
l
v
e

l
a

r
e
f
e
r
e
n
c
i
a

r
e
m
o
t
a

d
e

S
e
l
l
e
r
H
o
m
e

d
e
s
d
e

e
l

o
b
j
e
t
o

u
n
i
d
o

a
l

n
o
m
b
r
e

s
e
l
l
e
r

e
n

l
a

m

q
u
i
n
a

l
l
a
m
a
d
a

a
p
p
s
e
r
v
e
r
.

L
a

p
a
r
t
e

r
m
i

d
e

l
a

U
R
L

e
s

o
p
c
i
o
n
a
l

y

p
o
d
r

a
m
o
s
h
a
b
e
r

v
i
s
t
o

U
R
L
s

R
M
I

s
i
n

e
l
l
a
,

p
e
r
o

s
i

e
s
t

m
o
s

u
s
a
n
d
o

J
N
D
I

o

R
M
I
-
I
I
O
P
,

i
n
c
l
u
i
r

r
m
i

e
n

l
a

U
R
L

n
o
s

a
h
o
r
r
a

c
o
n
f
u
s
i
o
n
e
s

p
o
s
t
e
r
i
o
r
e
s
.

U
n
a

v
e
z

q
u
e

t
e
n
e
m
o
s

l
a

r
e
f
e
r
e
n
c
i
a

a

S
e
l
l
e
r
H
o
m
e
,
p
o
d
e
m
o
s

l
l
a
m
a
r

a

s
u
s

m

t
o
d
o
s
.
E
n

c
o
n
t
r
a
s
t
e

c
o
n

l
a

b

s
q
u
e
d
a

J
N
D
I

r
e
a
l
i
z
a
d
a

p
o
r

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
j
a
v
a
,

q
u
e

r
e
q
u
i
e
r
e

u
n
a

b

s
q
u
e
d
a

d
e

d
o
s

e
s
t
a
d
o
s

p
a
r
a

c
r
e
a
r

u
n

c
o
n
t
e
x
t
o

y

l
u
e
g
o

l
a

b

s
q
u
e
d
a

r
e
a
l
,

R
M
I

i
n
i
c
i
a
l
i
z
a

l
a
c
o
n
e
x
i

n

c
o
n

s
e
r
v
i
d
o
r

d
e

n
o
m
b
r
e
s

R
M
I
,

r
m
i
r
e
g
i
s
t
r
y
,

y

t
a
m
b
i

n

o
b
t
i
e
n
e

l
a

r
e
f
e
r
e
n
c
i
a

r
e
m
o
t
a

c
o
n

u
n
a

l
l
a
m
a
d
a
.
E
s
t
a

r
e
f
e
r
e
n
c
i
a

r
e
m
o
t
a

s
e
r


e
l

c
l
i
e
n
t
e

i
n
q
u
i
l
i
n
o

d
e

r
m
i
r
e
g
i
s
t
r
y
.

I
n
q
u
i
l
i
n
o

s
i
g
n
i
f
i
c
a

q
u
e

a

m
e
n
o
s

q
u
e

e
l

c
l
i
e
n
t
e

i
n
f
o
r
m
e

a
l

s
e
r
v
i
d
o
r

d
e

q
u
e

t
o
d
a
v

a

n
e
c
e
s
i
t
a

u
n
a

r
e
f
e
r
e
n
c
i
a

a
l

o
b
j
e
t
o
,

e
l
a
l
q
u
i
l
e
r

e
x
p
i
r
a

y

l
a

m
e
m
o
r
i
a

e
s

l
i
b
e
r
a
d
a
.

E
s
t
a

o
p
e
r
a
c
i

n

d
e

a
l
q
u
i
l
e
r

e
s

t
r
a
n
s
p
a
r
e
n
t
e

p
a
r
a

e
l

u
s
u
a
r
i
o
,

p
e
r
o

p
u
e
d
e

s
e
r

a
j
u
s
t
a
d
a

s
e
l
e
c
c
i
o
n
a
n
d
o

e
l

v
a
l
o
r

d
e

l
a

p
r
o
p
i
e
d
a
d
j
a
v
a
.
r
m
i
.
d
g
c
.
l
e
a
s
e
V
a
l
u
e

e
n

e
l

s
e
r
v
i
d
o
r
,

e
n

m
i
l
i
s
e
g
u
n
d
o
s

c
u
a
n
d
o

s
e

a
r
r
a
n
c
a

e
l

s
e
r
v
i
d
o
r

d
e

e
s
t
a

f
o
r
m
a
:


j
a
v
a

-
D
j
a
v
a
.
r
m
i
.
d
g
c
.
l
e
a
s
e
V
a
l
u
e
=
1
2
0
0
0
0

m
y
A
p
p
S
e
r
v
e
r
R
M
I

s
o
b
r
e

I
n
t
e
r
n
e
t

I
n
t
e
r
-
O
R
B

P
r
o
t
o
c
o
l

(
I
I
O
P
)
L
a

v
e
n
t
a
j
a

d
e

R
M
I

s
o
b
r
e

"
I
n
t
e
r
n
e
t

I
n
t
e
r
-
O
R
B

P
r
o
t
o
c
o
l

"

(
I
I
O
P
)
,

s
i
g
n
i
f
i
c
a

q
u
e

e
l

c

d
i
g
o

R
M
I

e
x
i
s
t
e
n
t
e

p
u
e
d
e

r
e
f
e
r
e
n
c
i
a
r

y

b
u
s
c
a
r

u
n

o
b
j
e
t
o

c
o
n

e
l

s
e
r
v
i
c
i
o

C
o
s
N
a
m
i
n
g

d
e

C
O
R
B
A
.

E
s
t
o
n
o
s

o
f
r
e
c
e

u
n
a

g
r
a
n

i
n
t
e
r
o
p
e
r
a
t
i
v
i
d
a
d

e
n
t
r
e

a
r
q
u
i
t
e
c
t
u
r
a
s

c
o
n

u
n

p
e
q
u
e

o

c
a
m
b
i
o

e
n

n
u
e
s
t
r
o

c

d
i
g
o

R
M
I

e
x
i
s
t
e
n
t
e
.
N
o
t
a
:

E
l

c
o
m
p
i
l
a
d
o
r

r
m
i
c

p
r
o
p
o
r
c
i
o
n
a

l
a

o
p
c
i

n

-
i
i
o
p

p
a
r
a

g
e
n
e
r
a
r

e
l

s
t
u
b

y

l
a
s

c
l
a
s
e
s

t
i
e

n
e
c
e
s
a
r
i
a
s

p
a
r
a

R
M
I
-
I
I
O
P
.
S
e
r
v
i
d
o
r

I
I
O
P
E
l

p
r
o
t
o
c
o
l
o

R
M
I
-
I
I
O
P

s
e

i
m
p
l
e
m
e
n
t
a

c
o
m
o

u
n

p
l
u
g
-
i
n

J
N
D
I
,

p
o
r

l
o

q
u
e

c
o
m
o

a
n
t
e
s
,

n
e
c
e
s
i
t
a
m
o
s

c
r
e
a
r

u
n

I
n
i
t
i
a
l
C
o
n
t
e
x
t
:

H
a
s
h
t
a
b
l
e

e
n
v

=

n
e
w

H
a
s
h
t
a
b
l
e
(
)
;

e
n
v
.
p
u
t
(
"
j
a
v
a
.
n
a
m
i
n
g
.
f
a
c
t
o
r
y
.
i
n
i
t
i
a
l
"
,







"
c
o
m
.
s
u
n
.
j
n
d
i
.
c
o
s
n
a
m
i
n
g
.
C
N
C
t
x
F
a
c
t
o
r
y
"
)
;

e
n
v
.
p
u
t
(
"
j
a
v
a
.
n
a
m
i
n
g
.
p
r
o
v
i
d
e
r
.
u
r
l
"
,







"
i
i
o
p
:
/
/
l
o
c
a
l
h
o
s
t
:
1
0
9
1
"
)
;

C
o
n
t
e
x
t

i
c

=

n
e
w

I
n
i
t
i
a
l
C
o
n
t
e
x
t
(
e
n
v
)
;
L
a

f
a
c
t
o
r

a

d
e

n
o
m
b
r
e
s

d
e
b
e
r

a

p
a
r
e
c
e
r

f
a
m
i
l
i
a
r

c
o
m
o

e
l

m
i
s
m
o

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

u
s
a
d
o

e
n

l
a

s
e
c
c
i

n

C
O
R
B
A
.

L
a

p
r
i
n
c
i
p
a
l

d
i
f
e
r
e
n
c
i
a

e
s

l
a

a
d
i
c
c
i

n

d
e

u
n

v
a
l
o
r

U
R
L

e
s
p
e
c
i
f
i
c
a
n
d
o

e
l
s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

a
l

q
u
e

c
o
n
e
c
t
a
r
s
e
.

E
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

u
s
a
d
o

a
q
u


e
s

e
l

p
r
o
g
r
a
m
a

t
n
a
m
e
s
e
r
v

a
r
r
a
n
c
a
d
o

e
n

e
l

p
u
e
r
t
o

1
0
9
1
:


t
n
a
m
e
s
e
r
v

-
O
R
B
I
n
i
t
i
a
l
P
o
r
t

1
0
9
1
E
l

o
t
r
o

c
a
m
b
i
o

p
r
i
n
c
i
p
a
l

e
n

e
l

l
a
d
o

d
e
l

s
e
r
v
i
d
o
r

e
s

r
e
e
m
p
l
a
z
a
r

l
a
s

l
l
a
m
a
d
a
s

a

N
a
m
i
n
g
.
r
e
b
i
n
d

p
a
r
a

u
s
a
r

e
l

m

t
o
d
o

r
e
b
i
n
d

d
e

J
N
D
I

e
n

e
l

e
j
e
m
p
l
a
r

I
n
i
t
i
a
l
C
o
n
t
e
x
t
.

P
o
r

e
j
e
m
p
l
o
:
V
i
e
j
o

c

d
i
g
o

R
M
I
:
S
e
l
l
e
r
H
o
m
e

s
h
o
m
e
=
(
S
e
l
l
e
r
H
o
m
e
)
N
a
m
i
n
g
.
l
o
o
k
u
p
(

"
r
m
i
:
/
/
a
p
p
s
e
r
v
e
r
:
1
0
9
0
/
s
e
l
l
e
r
"
)
;
N
u
e
v
o

c

d
i
g
o

R
M
I
:
H
a
s
h
t
a
b
l
e

e
n
v

=

n
e
w

H
a
s
h
t
a
b
l
e
(
)
;

e
n
v
.
p
u
t
(
"
j
a
v
a
.
n
a
m
i
n
g
.
f
a
c
t
o
r
y
.
i
n
i
t
i
a
l
"
,

"
c
o
m
.
s
u
n
.
j
n
d
i
.
c
o
s
n
a
m
i
n
g
.
C
N
C
t
x
F
a
c
t
o
r
y
"
)
;

e
n
v
.
p
u
t
(
"
j
a
v
a
.
n
a
m
i
n
g
.
p
r
o
v
i
d
e
r
.
u
r
l
"
,
"
i
i
o
p
:
/
/
l
o
c
a
l
h
o
s
t
:
1
0
9
1
"
)
;

C
o
n
t
e
x
t

i
c

=

n
e
w

I
n
i
t
i
a
l
C
o
n
t
e
x
t
(
e
n
v
)
;

S
e
l
l
e
r
H
o
m
e

s
h
o
m
e
=

(
S
e
l
l
e
r
H
o
m
e
)
P
o
r
t
a
b
l
e
R
e
m
o
t
e
O
b
j
e
c
t
.
n
a
r
r
o
w
(

i
c
.
l
o
o
k
u
p
(
"
s
e
l
l
e
r
"
)
,

S
e
l
l
e
r
H
o
m
e
)
C
i
e
n
t
e

I
I
O
P
E
n

e
l

l
a
d
o

d
e
l

c
l
i
e
n
t
e
,

l
a

b

s
q
u
e
d
a

R
M
I

s
e

c
a
m
b
i
a

p
a
r
a

u
s
a
r

u
n

e
j
e
m
p
l
a
r

d
e
l

I
n
i
t
i
a
l
C
o
n
t
e
x
t

e
n

l
u
g
a
r

d
e
l

N
a
m
i
n
g
.
l
o
o
k
u
p

d
e

R
M
I
.

E
l

o
b
j
e
t
o

d
e
v
u
e
l
t
o

e
s

m
a
p
e
a
d
o

a
l

o
b
j
e
t
o

r
e
q
u
e
r
i
d
o
u
s
a
n
d
o

e
l

m

t
o
d
o

n
a
r
r
o
w

d
e

l
a

c
l
a
s
e

j
a
v
a
x
.
r
m
i
.
P
o
r
t
a
b
l
e
R
e
m
o
t
e
O
b
j
e
c
t
.
P
o
r
t
a
b
l
e
R
e
m
o
t
e
O
b
j
e
c
t

r
e
e
m
p
l
a
z
a

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t

q
u
e

e
s
t
a
b
a

d
i
s
p
o
n
i
b
l
e

a
n
t
e
r
i
o
r
m
e
n
t
e

e
n

c

d
i
g
o
d
e

s
e
r
v
i
d
o
r

R
M
I
.
V
i
e
j
o

c

d
i
g
o

d
e

b

s
q
u
e
d
a

R
M
I
:


S
e
l
l
e
r
H
o
m
e

s
h
o
m
e
=

n
e
w

S
e
l
l
e
r
H
o
m
e
(
"
s
e
l
l
e
r
"
)
;


N
a
m
i
n
g
.
r
e
b
i
n
d
(
"
s
e
l
l
e
r
"
,

s
h
o
m
e
)
;
N
u
e
v
o

c

d
i
g
o

R
M
I
:



H
a
s
h
t
a
b
l
e

e
n
v

=

n
e
w

H
a
s
h
t
a
b
l
e
(
)
;



e
n
v
.
p
u
t
(
"
j
a
v
a
.
n
a
m
i
n
g
.
f
a
c
t
o
r
y
.
i
n
i
t
i
a
l
"
,








"
c
o
m
.
s
u
n
.
j
n
d
i
.
c
o
s
n
a
m
i
n
g
.
C
N
C
t
x
F
a
c
t
o
r
y
"
)
;



e
n
v
.
p
u
t
(
"
j
a
v
a
.
n
a
m
i
n
g
.
p
r
o
v
i
d
e
r
.
u
r
l
"
,









"
i
i
o
p
:
/
/
l
o
c
a
l
h
o
s
t
:
1
0
9
1
"
)
;



C
o
n
t
e
x
t

i
c

=

n
e
w

I
n
i
t
i
a
l
C
o
n
t
e
x
t
(
e
n
v
)
;



S
e
l
l
e
r
H
o
m
e

s
h
o
m
e
=

n
e
w

S
e
l
l
e
r
H
o
m
e
(
"
s
e
l
l
e
r
"
)
;



i
c
.
r
e
b
i
n
d
(
"
s
e
l
l
e
r
"
,

s
h
o
m
e
)
;
E
l
P
o
r
t
a
b
l
e
R
e
m
o
t
e
O
b
j
e
c
t

r
e
e
m
p
l
a
z
a

a
l

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t

d
i
s
p
o
n
i
b
l
e

a
n
t
e
r
i
o
r
m
e
n
t
e

e
n

e
l

c

d
i
g
o

d
e
l

s
e
r
v
i
d
o
r

R
M
I
.

E
l

c

d
i
g
o

R
M
I

d
e
b
e
r

a

e
x
t
e
n
d
e
r

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t

o
l
l
a
m
a
r

a
l

m

t
o
d
o

e
x
p
o
r
t
O
b
j
e
c
t

d
e

l
a

c
l
a
s
e

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
.
P
o
r
t
a
b
l
e
R
e
m
o
t
e
O
b
j
e
c
t

T
a
m
b
i

n

c
o
n
t
i
e
n
e

u
n

m

t
o
d
o

e
x
p
o
r
t
O
b
j
e
c
t

e
q
u
i
v
a
l
e
n
t
e
.

E
n

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

a
c
t
u
a
l
,

e
s
m
e
j
o
r

e
l
i
m
i
n
a
r

e
x
p
l

c
i
t
a
m
e
n
t
e

l
o
s

o
b
j
e
t
o
s

n
o

u
t
i
l
i
z
a
d
o
s

m
e
d
i
a
n
t
e

l
l
a
m
a
d
a
s

a

P
o
r
t
a
b
l
e
R
e
m
o
t
e
O
b
j
e
c
t
.
u
n
e
x
p
o
r
t
O
b
j
e
c
t
(
)
.
S
e
r
v
i
c
i
o
s

d
e

B

s
q
u
e
d
a

J
I
N
I
(
P
a
r
a

h
a
c
e
r
l
o

m

s

t
a
r
d
e
)
A
u
m
e
n
t
a
r

e
l

R
e
n
d
i
m
i
e
n
t
o

d
e

l
a

B

s
q
u
e
d
a
C
u
a
n
d
o

e
j
e
c
u
t
e
m
o
s

n
u
e
s
t
r
a

a
p
l
i
c
a
c
i

n
,

s
i

e
n
c
o
n
t
r
a
m
o
s

q
u
e

l
l
e
v
a
r

e
l

o
b
j
e
t
o

a

o
t
r
o

o
r
d
e
n
a
d
o
r

a

t
r
a
v

s

d
e

u
n

d
i
s
k
e
t
t
e

s
e
r

s

r

p
i
d
o
,

e
s

q
u
e

t
e
n
e
m
o
s

u
n

p
r
o
b
l
e
m
a

d
e

c
o
n
f
i
g
u
r
a
c
i

n

d
e
l
a

r
e
d
.

L
a

f
u
e
n
t
e

d
e
l

p
r
o
b
l
e
m
a

e
s

c

m
o

s
e

r
e
s
u
e
l
v
e
n

l
o
s

n
o
m
b
r
e
s

d
e

h
o
s
t

y

l
a
s

d
i
r
e
c
c
i
o
n
e
s

I
P
,

y

a
q
u


t
e
n
e
m
o
s

u
n

a
t
a
j
o
.
R
M
I

y

o
t
r
o
s

s
e
r
v
i
c
i
o
s

d
e

n
o
m
b
r
e
s

u
s
a
n

l
a

c
l
a
s
e

I
n
e
t
A
d
d
r
e
s
s

p
a
r
a

r
e
s
o
l
v
e
r

l
o
s

n
o
m
b
r
e
s

d
e

h
o
s
t

y

d
i
r
e
c
c
i
o
n
e
s

I
P
.

I
n
e
t
A
d
d
r
e
s
s

a
l
m
a
c
e
n
a

l
o
s

r
e
s
u
l
t
a
d
o
s

p
a
r
a

m
e
j
o
r
a
r

l
a
s

l
l
a
m
a
d
a
s
s
u
b
s
e
c
u
e
n
t
e
s
,

p
e
r
o

c
u
a
n
d
o

s
e

l
e

p
a
s
a

u
n
a

n
u
e
v
a

d
i
r
e
c
c
i

n

I
P

o

u
n

n
o
m
b
r
e

d
e

s
e
r
v
i
d
o
r
,

r
e
a
l
i
z
a

u
n
a

r
e
f
e
r
e
n
c
i
a

c
r
u
z
a
d
a

e
n
t
r
e

l
a

d
i
r
e
c
c
i

n

I
P

y

e
l

n
o
m
b
r
e

d
e
l

h
o
s
t
.

S
i

s
u
m
i
n
i
s
t
r
a
m
o
s

e
l
n
o
m
b
r
e

d
e
l

h
o
s
t

c
o
m
o

u
n
a

d
i
r
e
c
c
i

n

I
P
,

I
n
e
t
A
d
d
r
e
s
s

t
o
d
a
v

a

i
n
t
e
n
t
a
r


v
e
r
i
f
i
c
a
r

e
l

n
o
m
b
r
e

d
e
l

h
o
s
t
.
P
a
r
a

e
v
i
t
a
r

e
s
t
e

p
r
o
b
l
e
m
a
,

i
n
c
l
u
i
m
o
s

e
l

n
o
m
b
r
e

d
e
l

h
o
s
t

y

l
a

d
i
r
e
c
c
i

n

I
P

e
n

u
n

f
i
c
h
e
r
o

h
o
s
t

e
n

e
l

c
l
i
e
n
t
e
.
S
i
s
t
e
m
a
s

U
n
i
x
:

E
n

U
n
i
x
,

e
l

f
i
c
h
e
r
o

h
o
s
t

n
o
r
m
a
l
m
e
n
t
e

e
s

/
e
t
c
/
h
o
s
t
s
.
W
i
n
d
o
w
s
:

E
n

w
i
n
d
o
w
s

9
5


9
8
,

e
l

f
i
c
h
e
r
o

h
o
s
t

e
s

c
:
\
w
i
n
d
o
w
s
\
h
o
s
t
s
,

(
e
l

f
i
c
h
e
r
o

h
o
s
t
s
.
s
a
m

e
s

u
n

f
i
c
h
e
r
o

d
e

e
j
e
m
p
l
o
)
.

E
n

w
i
n
d
o
w
s

N
T
,

e
l

f
i
c
h
e
r
o

h
o
s
t

e
s
c
:
\
w
i
n
n
t
\
s
y
s
t
e
m
3
2
\
d
r
i
v
e
r
s
\
e
t
c
\
h
o
s
t
s
.
T
o
d
o

l
o

q
u
e

n
e
c
e
s
i
t
a
m
o
s

h
a
c
e
r

e
s

p
o
n
e
r

e
s
t
a
s

l

n
e
a
s

e
n

n
u
e
s
t
r
o

f
i
c
h
e
o

h
o
s
t
.

L
a
s

e
n
t
r
a
d
a
s

m
y
s
e
r
v
e
r
1

y

m
y
s
e
r
v
e
r
2

s
o
n

l
o
s

h
o
s
t

d
o
n
d
e

s
e

e
j
e
c
u
t
a
n

e
l

s
e
r
v
i
d
o
r

r
e
m
o
t
o

y

r
m
i
r
e
g
i
s
t
r
y
1
2
7
.
0
.
0
.
1


l
o
c
a
l
h
o
s
t
1
2
9
.
1
.
1
.
1


m
y
s
e
r
v
e
r
1
1
2
9
.
1
.
1
.
2


m
y
s
e
r
v
e
r
2
O
z
i
t
o
I
n
v
o
c
a
c
i

n

R
e
m
o
t
a

d
e

M

t
o
d
o
s
E
l

A
P
I

d
e

I
n
v
o
c
a
c
i

n

R
e
m
o
t
a

d
e

M

t
o
d
o
s

(
R
M
I
)

p
e
r
m
i
t
e

l
a
s

c
o
m
u
n
i
c
a
c
i
o
n
e
s

e
n
t
r
e

c
l
i
e
n
t
e

y

s
e
r
v
i
d
o
r

a

t
r
a
v

s

d
e

l
a

r
e
d

e
n
t
r
e

p
r
o
g
r
a
m
a
s

e
s
c
r
i
t
o
s

e
n

J
a
v
a
.

E
l

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s
E
n
t
e
r
p
r
i
s
e

i
m
p
l
e
m
e
n
t
a

d
e

f
o
r
m
a

t
r
a
n
s
p
a
r
e
n
t
e

e
l

c

d
i
g
o

R
M
I

n
e
c
e
s
a
r
i
o

p
a
r
a

q
u
e

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

p
u
e
d
a

r
e
f
e
r
e
n
c
i
a
r

a

l
o
s

B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

q
u
e

s
e

e
j
e
c
u
t
a
n

e
n

e
l

s
e
r
v
i
d
o
r

y

a
c
c
e
d
e
r

a
e
l
l
o
s

c
o
m
o

s
i

s
e

e
s
t
u
v
i
e
r
a
n

e
j
e
c
u
t
a
n
d
o

l
o
c
a
l
m
e
n
t
e

e
n

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e
.
E
l

t
e
n
e
r

e
l

R
M
i

i
n
c
l
u
i
d
o

i
n
t
e
r
n
a
m
e
n
t
e

e
l

s
e
r
v
i
d
o
r

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

e
s

m
u
y

c
o
n
v
e
n
i
e
n
t
e

y

n
o
s

a
h
o
r
r
a

t
i
e
m
p
o

d
e

c
o
d
i
f
i
c
a
c
i

n
,

p
e
r
o

s
i

n
e
c
e
s
i
t
a
m
o
s

u
s
a
r

c
a
r
a
c
t
e
r

s
t
i
c
a
s

a
v
a
n
z
a
d
a
s
d
e

R
M
I

o

i
n
t
e
g
r
a
r

R
M
I

c
o
n

u
n
a

a
p
l
i
c
a
c
i

n

e
x
i
s
t
e
n
t
e
,

n
e
c
e
s
i
t
a
m
o
s

s
o
b
r
e
e
s
c
r
i
b
i
r

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

p
o
r

d
e
f
e
c
t
o

R
M
I

y

e
s
c
r
i
b
i
r

n
u
e
s
t
r
o

p
r
o
p
i
o

c

d
i
g
o

R
M
I
.
E
l

c
a
p

t
u
l
o

r
e
e
m
p
l
a
z
a

e
l

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

m
a
n
e
j
a
d
o

p
o
r

c
o
n
t
e
n
e
d
o
r

d
e
l

C
a
p

t
u
l
o

2
:

B
e
a
n
s

d
e

E
n
t
i
d
a
d

y

d
e

S
e
s
i

n

c
o
n

u
n

s
e
r
v
i
d
o
r

d
e

r
e
g
i
s
t
r
o

b
a
s
a
d
o

e
n

R
M
I
.

E
l

B
e
a
n

S
e
l
l
e
r
B
e
a
n

d
e
l
c
a
p

t
u
l
o

2
,

t
a
m
b
i

n

s
e

m
o
d
i
f
i
c
a

p
a
r
a

l
l
a
m
a
r

a
l

n
u
e
v
o

s
e
r
v
i
d
o
r

d
e

r
e
g
i
s
t
r
o

R
M
I

u
s
a
n
d
o

u
n
a

l
l
a
m
a
d
a

a

l
o
o
k
u
p

d
e

J
a
v
a

2

R
M
I
.
S
o
b
r
e

R
M
I




R
M
I

e
n

l
a

a
p
l
i
c
a
c
i

n

S
u
b
a
s
t
a
I
n
t
r
o
d
u
c
c
i

n

a

l
a
s

C
L
a
s
e
s




S
u
m
a
r
i
o

d
e

F
i
c
h
e
r
o
s




C
o
m
p
i
l
a
r

e
l

E
j
e
m
p
l
o




A
r
r
a
n
c
a
r

e
l

R
e
g
i
s
t
r
o

R
M
I




A
r
r
a
n
c
a
r

e
l

S
e
r
v
i
d
o
r

R
e
m
o
t
o




E
s
t
a
b
l
e
c
e
r

C
o
m
u
n
i
c
a
c
i
o
n
e
s

R
e
m
o
t
a
s




L
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
E
x
p
o
r
t
a
r

u
n

O
b
j
e
t
o

R
e
m
o
t
o




P
a
s
a
r

p
o
r

V
a
l
o
r

y

p
o
r

R
e
f
e
r
e
n
c
i
a




R
e
c
o
l
e
c
c
i

n

d
e

B
a
s
u
r
a

D
i
s
t
r
i
b
u
i
d
a




I
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n




I
n
t
e
r
f
a
c
e

R
e
t
u
r
n
R
e
s
u
l
t
s




C
l
a
s
e

S
e
l
l
e
r
B
e
a
n




S
o
b
r
e

R
M
I
E
l

A
P
I

R
M
I

n
o
s

p
e
r
m
i
t
e

a
c
c
e
d
e

a

u
n

s
e
r
v
i
d
o
r

d
e

o
b
j
e
t
o
s

r
e
m
o
t
o

d
e
s
d
e

u
n

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

h
a
c
i
e
n
d
o

s
e
n
c
i
l
l
a
s

l
l
a
m
a
d
a
s

a

m

t
o
d
o
s

d
e
l

s
e
r
v
i
d
o
r

d
e

o
b
j
e
t
o
s
.

M
i
e
n
t
r
a
s

q
u
e

o
t
r
a
s
a
r
q
u
i
t
e
c
t
u
r
a
s

d
i
s
t
r
i
b
u
i
d
a
s

p
a
r
a

a
c
c
e
d
e
r

a

s
e
r
v
i
d
o
r
e
s

d
e

o
b
j
e
t
o
s

r
e
m
o
t
o
s

c
o
m
o

"
D
i
s
t
r
i
b
u
t
e
d

C
o
m
p
o
n
e
n
t

O
b
j
e
c
t

M
o
d
e
l
"

(
D
C
O
M
)

y

"
C
o
m
m
o
n

O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r

A
r
c
h
i
t
e
c
t
u
r
e
"

(
C
O
R
B
A
)
d
e
v
u
e
l
v
e
n

r
e
f
e
r
e
n
c
i
a
s

a
l

o
b
j
e
t
o

r
e
m
o
t
o
,

e
l

A
P
I

R
M
I

n
o

s

l
o

d
e
v
u
e
l
v
e

r
e
f
e
r
e
n
c
i
a
s
,

s
i

n
o

q
u
e

p
r
o
p
o
r
c
i
o
n
a

b
e
n
e
f
i
c
i
o
s

a
d
i
c
i
o
n
a
l
e
s
.
E
l

A
P
I

R
M
I

m
a
n
e
j
a

r
e
f
e
r
e
n
c
i
a
s

a

o
b
j
e
t
o
s

r
e
m
o
t
o
s

(
l
l
a
m
a
d
a
s

p
o
r

r
e
f
e
r
e
n
c
i
a
)

y

t
a
m
b
i

n

d
e
v
u
e
l
v
e

u
n
a

c
o
p
i
a

d
e
l

o
b
j
e
t
o

(
l
l
a
m
a
d
a

p
o
r

v
a
l
o
r
)
.




S
i

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

n
o

t
i
e
n
e

a
c
c
e
s
o

l
o
c
a
l

a

l
a

c
l
a
s
e

p
a
r
a

l
a

q
u
e

s
e

e
j
e
m
p
l
a
r
i
z


u
n

o
b
j
e
t
o

r
e
m
o
t
o
,

l
o
s

s
e
r
v
i
c
i
o
s

R
M
I

p
u
e
d
e
n

d
e
s
c
a
r
g
a
r

e
l

f
i
c
h
e
r
o

c
l
a
s
s
.




S
e
r
i
a
l
i
z
a
c
i

n

y

c
o
l
o
c
a
c
i

n

d
e

D
a
t
o
s
P
a
r
a

t
r
a
n
s
f
e
r
i
r

o
j
b
j
e
t
o
s
,

e
l

A
P
I

R
M
I

u
s
a

e
l

A
P
I

S
e
r
i
a
l
i
z
a
t
i
o
n

p
a
r
a

e
m
p
a
q
u
e
t
a
r

(
c
o
l
o
c
a
r
)

y

d
e
s
e
m
p
a
q
u
e
t
a
r

(
d
e
s
c
o
l
o
c
a
r
)

l
o
s

o
b
j
e
t
o
s
.

P
a
r
a

c
o
l
o
c
a
r

u
n

o
b
j
e
t
o
,

e
l

A
P
I

S
e
r
i
a
l
i
z
a
t
i
o
n

c
o
n
v
i
e
r
t
e

e
l
o
b
j
e
t
o

a

u
n

S
t
r
e
a
m

d
e

b
y
t
e
s
,

y

p
a
r
a

d
e
s
c
o
l
o
c
a
r

e
l

o
b
j
e
t
o
,

e
l

A
P
I

S
e
r
i
a
l
i
z
a
t
i
o
n

c
o
n
v
i
e
r
t
e

u
n

s
t
r
e
a
m

d
e

b
y
t
e
s

e
n

u
n

o
b
j
e
t
o
.
R
M
I

s
o
b
r
e

I
I
O
P
U
n
a

d
e

l
a
s

d
e
s
v
e
n
t
a
j
a
s

i
n
i
c
i
a
l
e
s

d
e
l

R
M
I

e
r
a

q
u
e

l
a

n
i
c
a

r
e
l
a
c
i

n

c
o
n

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

p
a
r
a

e
s
c
r
i
b
i
r

i
n
t
e
r
f
a
c
e
s

h
a
c
e
n

d

f
i
c
i
l

l
a

i
n
t
r
e
g
r
a
c
i

n

c
o
n

s
i
s
t
e
m
a
s

l
e
g
a
l
e
s

e
x
i
s
t
e
n
t
e
s
.

S
i
n
e
m
b
a
r
g
o
,

R
M
I

s
o
b
r
e

"
I
n
t
e
r
n
e
t

I
n
t
e
r
-
O
R
B

P
r
o
t
o
c
o
l
"

(
I
I
O
P
)

e
x
p
l
i
c
a
d
o

e
n

e
l

C
a
p

t
u
l
o

4
:

S
e
r
v
i
c
i
o
s

d
e

B

s
q
u
e
d
a

p
e
r
m
i
t
e

a

R
M
I

c
o
m
u
n
i
c
a
r
s
e

c
o
n

c
u
a
l
q
u
i
e
r

s
i
s
t
e
m
a

o

l
e
n
g
u
a
j
e

q
u
e

s
o
p
o
r
t
e
C
O
R
B
A
.
S
i

c
o
m
b
i
n
a
m
o
s

l
a

i
n
t
e
g
r
a
c
i

n

m
e
j
o
r
a
d
a

c
o
n

l
a

h
a
b
i
l
i
d
a
d

d
e

R
M
I

p
a
r
a

t
r
a
b
a
j
a
r

a

t
r
a
v

s

d
e

f
i
r
e
w
a
l
l
s

u
s
a
n
d
o

p
r
o
x
i
e
s

H
T
T
P
,

p
o
d
r

a
m
o
s

e
n
c
o
n
t
r
a
r

d
i
s
t
r
i
b
u
c
i
o
n
e
s

p
a
r
a

l
a

l

g
i
c
a

d
e

n
u
e
s
t
r
o
n
e
g
o
c
i
o

u
s
a
n
d
o

R
M
I

m

s

f

c
i
l
e
s

q
u
e

u
n
a

s
o
l
u
c
i

n

b
a
s
a
d
a

e
n

s
o
c
k
e
t
s
.
N
o
t
a
:

L
a

t
r
a
n
s
f
e
r
e
n
c
i
a

d
e

c

d
i
g
o

y

d
a
t
o
s

s
o
n

p
a
r
t
e
s

c
l
a
v
e

d
e

l
a

e
s
p
e
c
i
f
i
c
a
c
i

n

J
I
N
I
.

D
e

h
e
c
h
o
,

s
i

a

a
d
i
e
r
a
m
o
s

u
n

s
e
r
v
i
c
i
o

d
e

u
n
i
o
n
e
s

a

l
o
s

s
e
r
v
i
c
i
o
s

R
M
I

c
r
e
a
r

a
m
o
s

a
l
g
o

m
u
y
s
i
m
i
l
a
r

a

l
o
s

q
u
e

o
b
t
e
n
e
m
o
s

c
o
n

l
a

a
r
q
u
i
t
e
c
t
u
r
a

J
I
N
I
.
R
M
I

e
n

l
a

a
p
l
i
c
a
c
i

n

d
e

S
u
b
a
s
t
a
s
E
l
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

b
a
s
a
d
o

e
n

R
M
I

t
i
e
n
e

l
o
s

s
i
g
u
i
e
n
t
e
s

m

t
o
d
o
s

n
u
e
v
o
s
:
U
n

n
u
e
v
o

m

t
o
d
o

c
r
e
a
t
e

p
a
r
a

c
r
e
a
r

u
n

n
u
e
v
o

u
s
u
a
r
i
o
.




U
n

n
u
e
v
o

m

t
o
d
o

f
i
n
d

p
a
r
a

b
u
s
c
a
r

u
n

u
s
u
a
r
i
o
.




U
n

n
u
e
v
o

m

t
o
d
o

s
e
a
r
c
h

p
a
r
a

l
a

b

s
q
u
e
d
a

p
e
r
s
o
n
a
l
i
z
a
d
a

d
e

u
s
u
a
r
i
o
s

e
n

l
a

b
a
s
e

d
e

d
a
t
o
s
.




L
a

n
u
e
v
a

b

s
q
u
e
d
a

p
e
r
s
o
n
a
l
i
z
a
d
a

s
e
v
u
e
l
v
e

l
o
s

r
e
s
u
l
t
a
d
o
s

a
l

c
l
i
e
n
t
e

l
l
a
m
a
n
t
e

m
e
d
i
a
n
t
e

u
n
a

l
l
a
m
a
d
a

a

u
n

C
a
l
l
b
a
k

R
M
I
.

E
s
t

s
q
u
e
d
a

e
s

s
i
m
i
l
a
r

a

l
o
s

m

t
o
d
o
s

f
i
n
d
e
r

u
s
a
d
o
s

e
n

l
o
s
B
e
a
n
s

d
e

e
j
e
m
p
l
o
s

u
s
a
d
o
s

e
n

l
o
s

c
a
p

t
u
l
o
s

2

y

3
,

e
x
c
e
p
t
o

e
n

q
u
e

l
a

v
e
r
s
i

n

R
M
I
,

p
u
e
d
e

t
a
r
d
a
r

m

s

t
i
e
m
p
o

e
n

g
e
n
e
r
a
r

l
o
s

r
e
s
u
l
t
a
d
o
s

p
o
r
q
u
e

e
l

s
e
v
i
d
o
r

d
e

r
e
g
i
s
t
r
o
s

r
e
m
o
t
o

l
l
a
m
a

a
l
m

t
o
d
o

r
e
m
o
t
o

e
x
p
o
r
t
a
d
o

p
o
r

e
l

c
l
i
e
n
t
e

S
e
l
l
e
r
B
e
a
n

b
a
s
a
d
o

e
n

R
M
I
.
S
i

e
l

c
l
i
e
n
t
e

l
l
a
m
a
n
t
e

e
s
t


e
s
c
r
i
t
o

e
n

J
a
v
a
,

y

n
o

e
s
,

p
o
r

e
j
e
m
p
l
o
,

u
n
a

p

g
i
n
a

w
e
b
,

e
l

s
e
r
v
i
d
o
r

p
u
e
d
e

a
c
t
u
a
l
i
z
a
r

e
l

c
l
i
e
n
t
e

t
a
n

p
r
o
n
t
o

c
o
m
o

l
o
s

r
e
s
u
l
t
a
d
o
s

e
s
t
u
v
i
e
r
a
n

l
i
s
t
o
s
.

P
e
r
o
,

e
l
p
r
o
t
o
c
o
l
o

H
T
T
P

u
s
a
d
o

e
n

l
a

m
a
y
o
r

a

d
e

l
o
s

n
a
v
e
g
a
d
o
r
e
s

n
o

p
e
r
m
i
t
e

q
u
e

l
o
s

r
e
s
u
l
t
a
d
o
s

s
e
a
n

e
n
v
i
a
d
o
s

s
i
n

q
u
e

h
a
y
a

u
n
a

p
e
t
i
c
i

n
.

E
s
t
o

s
i
g
n
i
f
i
c
a

q
u
e

e
l

r
e
s
u
l
t
a
d
o

d
e

u
n
a

p

g
i
n
a

w
e
b

n
o

s
e
c
r
e
a

h
a
s
t
a

q
u
e

l
o
s

r
e
s
u
l
t
a
d
o
s

e
s
t

n

l
i
s
t
o
s
,

l
o

q
u
e

a

a
d
e

u
n

p
e
q
u
e

o

r
e
t
r
a
s
o
.
I
n
t
r
o
d
u
c
c
i

n

a

l
a
s

C
l
a
s
e
s
L
a
s

d
o
s

c
l
a
s
e
s

p
r
i
n
c
i
p
a
l
e
s

e
n

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e

l
a

s
u
b
a
s
t
a

b
a
s
a
d
a

e
n

R
M
I

s
o
n

S
e
l
l
e
r
B
e
a
n

y

e
l

r
e
m
o
t
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
S
e
l
l
e
r
B
e
a
n

e
s

l
l
a
m
a
d
o

d
e
s
d
e

A
u
c
t
i
o
n
S
e
r
v
l
e
t

p
a
r
a

i
n
s
e
r
t
a
r
u
n

t
e
m

p
a
r
a

l
a

s
u
b
a
s
t
a

e
n

l
a

b
a
s
e

d
e

d
a
t
o
s
,

y

c
h
e
q
u
e
a
r

b
a
l
a
n
c
e
s

n
e
g
a
t
i
v
o
s

e
n

l
a
s

c
u
e
n
t
a
s
.
L
o
s

m
o
d
e
l
o
s

d
e

e
j
e
m
p
l
o

d
e

l
a

a
r
q
u
i
t
e
c
t
u
r
a

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

e
n

l
o
s

q
u
e

l
o
s

d
e
t
a
l
l
e
s

d
e

r
e
g
i
s
t
r
o

d
e
l

u
s
u
a
r
i
o

s
e

h
a
n

s
e
p
a
r
a
d
o

d
e
l

c

d
i
g
o

p
a
r
a

c
r
e
a
r

y

e
n
c
o
n
t
r
a
r

d
e
t
a
l
l
e
s

d
e

r
e
g
i
s
t
r
o
.

E
s
d
e
c
i
r
,

l
o
s

d
e
t
a
l
l
e
s

d
e

r
e
g
i
s
t
r
o

d
e

u
s
u
a
r
i
o

p
r
o
p
o
r
c
i
o
n
a
d
o
s

p
o
r

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
.
j
a
v
a

s
e

s
e
p
a
r
a
n

d
e
l

c

d
i
g
o

p
a
r
a

c
r
e
a
r

y

e
n
c
o
n
t
r
a
r

u
n

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
,

q
u
e

e
s
t


e
n

l
a

c
l
a
s
e
R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
j
a
v
a
.
L
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o

d
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
j
a
v
a

e
s
t


u
n
i
d
a

a
l

r
m
i
r
e
g
i
s
t
r
y
.

C
u
a
n
d
o

u
n

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

q
u
i
e
r
e

m
a
n
i
p
u
l
a
r

d
e
t
a
l
l
e
s

d
e
l

r
e
g
i
s
t
r
o

d
e
l

u
s
u
a
r
i
o
,

p
r
i
m
e
r
o
t
i
e
n
e

q
u
e

b
u
s
c
a
r

l
a

r
e
f
e
r
e
n
c
i
a

a
l

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
j
a
v
a

e
n

e
l

r
m
i
r
e
g
i
s
t
r
y
.
S
u
m
a
r
i
o

d
e

F
i
c
h
e
r
o
s
T
o
d
o

l
o
s

f
c
i
h
e
r
o
s

d
e

c

d
i
g
o

f
u
e
n
t
e

p
a
r
a

e
l

e
j
e
m
p
l
o

b
a
s
a
d
o

e
n

R
M
I

s
e

d
e
s
c
r
i
b
e
n

e
n

l
a

s
i
g
u
i
e
n
t
e

l
i
s
t
a
.
S
e
l
l
e
r
B
e
a
n
.
j
a
v
a
:

P
r
o
g
r
a
m
a

c
l
i
e
n
t
e

q
u
e

l
l
a
m
a

a

l
o
s

m

t
o
d
o
s

r
e
m
o
t
o
s

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
v
e
r
i
f
y
p
a
s
s
w
d

y

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
.
S
e
l
l
e
r
B
e
a
n

t
a
m
b
i

n
e
x
p
o
r
t
a

s
u

m

t
o
d
o

u
p
d
a
t
e
R
e
s
u
l
t
s

q
u
e

l
l
a
m
a

a

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

c
u
a
n
d
o

c
o
m
p
l
e
t
a

s
u

b

s
q
u
e
d
a

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
.




R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a
:

S
e
r
v
i
d
o
r

d
e

o
b
j
e
t
o
s

r
e
m
o
t
o
s

q
u
e

i
m
p
l
e
m
e
n
t
a

l
o
s

i
n
t
e
r
f
a
c
e
s

r
e
m
o
t
o
s

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

y

R
e
g
i
s
t
r
a
t
i
o
n
.




R
e
g
i
s
t
r
a
t
i
o
n
.
j
a
v
a
:

I
n
t
e
r
f
a
c
e

r
e
m
o
t
o

q
u
e

d
e
c
l
a
r
a

l
o
s

m

t
o
d
o
s

r
e
m
o
t
o
s

g
e
t
U
s
e
r
,
v
e
r
i
f
y
p
a
s
s
w
d
,

y

o
t
r
o
s

m

t
o
d
o
s

p
a
r
a

e
l

m
a
n
e
j
o

d
e

l
o
s

d
e
t
a
l
l
e
s

d
e

r
e
g
i
s
t
r
o

d
e
l

u
s
u
a
r
i
o
.




R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
j
a
v
a
:

I
n
t
e
r
f
a
c
e

r
e
m
o
t
o

q
u
e

d
e
c
l
a
r
a

l
o
s

m

t
o
d
o
s

r
e
m
o
t
o
s

c
r
e
a
t
e
,
f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
,

y

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s

q
u
e

c
r
e
a
n

o

d
e
v
u
e
l
v
e
n

e
j
e
m
p
l
a
r
e
s

d
e

d
e
t
a
l
l
e
s
d
e

r
e
g
i
s
t
r
o
.




R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
.
j
a
v
a
:

E
l

f
i
c
h
e
r
o

f
u
e
n
t
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a

i
n
c
l
u
y
e

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

p
a
r
a

e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o

R
e
g
i
s
t
r
a
t
i
o
n

c
o
m
o

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
.




R
e
g
i
s
t
r
a
t
i
o
n
P
K
.
j
a
v
a
:

C
l
a
s
e

q
u
e

r
e
p
r
e
s
e
n
t
a

l
o
s

d
e
t
a
l
l
e
s

d
e

r
e
g
i
s
t
r
o

d
e

u
s
u
a
r
i
o

u
s
a
n
d
o

s

l
o

l
a

c
l
a
v
e

p
r
i
m
a
r
i
a

d
e
l

r
e
g
i
s
t
r
o

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s
.




R
e
t
u
r
n
R
e
s
u
l
t
s
.
j
a
v
a
:

I
n
t
e
r
f
a
c
e

r
e
m
o
t
o

q
u
e

d
e
c
l
a
r
a

e
l

m

t
o
d
o

u
p
d
a
t
e
R
e
s
u
l
t
s

l
a

c
l
a
s
e

S
e
l
l
e
r
B
e
a
n

l
o

i
m
p
l
e
m
e
n
t
a

c
o
m
o

c
a
l
l
b
a
c
k
.




A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
j
a
v
a
:

V
e
r
s
i

n

m
o
d
i
f
i
c
a
d
a

d
e

l
a

c
l
a
s
e

o
r
i
g
i
n
a
l

A
u
c
t
i
o
n
S
e
r
v
l
e
t

c
o
n
d
e

l
a
s

c
u
e
n
t
a
s

d
e

r
e
g
i
s
t
r
o

s
e

c
r
e
a
n

m
e
d
i
a
n
t
e

l
l
a
m
a
d
a
s

d
i
r
e
c
t
a
s

a
l

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

d
e

R
M
I
.

E
l
s
e
r
v
e
l
t

d
e

s
u
b
a
s
t
a

t
a
m
b
i

n

l
l
a
m
a

a
l

m

t
o
d
o

S
e
l
l
e
r
B
e
a
n
.
a
u
d
i
t
A
c
c
o
u
n
t
s
,

q
u
e

d
e
v
u
e
l
v
e

u
n
a

l
i
s
t
a

d
e

l
o
s

u
s
u
a
r
i
o
s

c
o
n

u
n

b
a
j
o

b
a
l
a
n
c
e

e
n

l
a

c
u
e
n
t
a
.
E
l

m

t
o
d
o

a
u
d
i
t
A
c
c
o
u
n
t
s

e
s

l
l
a
m
a
d
o

c
o
n

l
a

s
i
g
u
i
e
n
t
e

U
R
L
,

d
o
n
d
e

h
a
c
e

u
n

s
i
m
p
l
e

c
h
e
q
u
e
o

p
a
r
a

v
e
r
i
f
i
c
a
r

q
u
e

l
a

p
e
t
i
c
i

n

v
i
e
n
e

d
e
l

h
o
s
t

l
o
c
a
l
.
h
t
t
p
:
/
/
p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m
:
7
0
0
1
/








A
u
c
t
i
o
n
S
e
r
v
l
e
t
?
a
c
t
i
o
n
=
a
u
d
i
t
A
c
c
o
u
n
t
s




T
a
m
b
i

n

n
e
c
e
s
i
t
a
r
e
m
o
s

u
n

f
i
c
h
e
r
o

d
e

p
o
l
i
c

a

j
a
v
a
.
p
o
l
i
c
y

p
a
r
a

c
o
n
c
e
d
e
r

l
o
s

p
e
r
m
i
s
o
s

n
e
c
e
s
a
r
i
o
s

p
a
r
a

e
j
e
c
u
t
a
r

e
l

e
j
e
m
p
l
o

e
n

p
l
a
t
a
f
o
r
m
a
s

J
a
v
a

2
.
L
a

m
a
y
o
r

a

d
e

l
a
s

a
p
l
i
c
a
c
i
o
n
e
s

R
M
I

n
e
c
e
s
i
t
a
n

d
o
s

p
e
r
m
i
s
o
s

s
o
c
k
e
t
,

p
a
r
a

a
c
c
e
s
o
s

a

l
o
s

s
o
c
k
e
t

y

a

H
T
T
P

p
a
r
a

e
s
p
e
c
i
f
i
c
a
r

l
o
s

p
u
e
r
t
o
s
.

L
o
s

d
o
s

p
e
r
m
i
s
o
s

d
e

t
h
r
e
a
d
s

f
u
e
r
o
n

l
i
s
t
a
d
o
s

e
n

u
n
a
p
i
l
a

c
u
a
n
d
o

s
e
a

n
e
c
e
s
a
r
i
o

p
o
r

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

p
a
r
a

c
r
e
a
r

u
n

t
h
r
e
a
d

i
n
t
e
r
n
o
.
E
n

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

2
,

c
u
a
n
d
o

u
n

p
r
o
g
r
a
m
a

n
o

t
i
e
n
e

t
o
d
o
s

l
o
s

p
e
r
m
i
s
o
s

q
u
e

n
e
c
e
s
i
t
a
,

l
a

"
M

q
u
i
n
a

V
i
r
t
u
a
l

J
a
v
a
"

g
e
n
e
r
a

u
n
a

p
i
l
a

d
e

s
e
g
u
i
m
i
e
n
t
o

q
u
e

l
i
s
t
a

l
o
s

p
e
r
m
i
s
o
s

q
u
e

n
e
c
e
s
i
t
a
n
s
e
r

a

a
d
i
d
o
s

a
l

f
i
c
h
e
r
o

d
e

p
o
l
i
c

a

d
e

s
e
g
u
r
i
d
a
d
.
g
r
a
n
t

{


p
e
r
m
i
s
s
i
o
n

j
a
v
a
.
n
e
t
.
S
o
c
k
e
t
P
e
r
m
i
s
s
i
o
n






"
*
:
1
0
2
4
-
6
5
5
3
5
"
,

"
c
o
n
n
e
c
t
,
a
c
c
e
p
t
,
r
e
s
o
l
v
e
"
;


p
e
r
m
i
s
s
i
o
n

j
a
v
a
.
n
e
t
.
S
o
c
k
e
t
P
e
r
m
i
s
s
i
o
n

"
*
:
8
0
"
,

























"
c
o
n
n
e
c
t
"
;


p
e
r
m
i
s
s
i
o
n

j
a
v
a
.
l
a
n
g
.
R
u
n
t
i
m
e
P
e
r
m
i
s
s
i
o
n


























"
m
o
d
i
f
y
T
h
r
e
a
d
G
r
o
u
p
"
;


p
e
r
m
i
s
s
i
o
n

j
a
v
a
.
l
a
n
g
.
R
u
n
t
i
m
e
P
e
r
m
i
s
s
i
o
n


























"
m
o
d
i
f
y
T
h
r
e
a
d
"
;
}
;
C
o
m
p
i
l
a
r

e
l

E
j
e
m
p
l
o
A
n
t
e
s

d
e

d
e
s
c
r
i
b
i
r

e
l

c

d
i
g
o

b
a
s
a
d
o

e
n

R
M
I

d
e

l
a
s

c
l
a
s
e
s

a
n
t
e
r
i
o
r
e
s
,

a
q
u


e
s
t


l
a

s
e
c
u
e
n
c
i
a

d
e

c
o
m
a
n
d
o
s

p
a
r
a

c
o
m
p
i
l
a
r

e
l

e
j
e
m
p
l
o

e
n

l
a
s

p
l
a
t
a
f
o
r
m
a
s

U
n
i
x

y

W
i
n
3
2
:
U
n
i
x
:
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
/
R
e
g
i
s
t
r
a
t
i
o
n
.
j
a
v
a
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
/
R
e
g
i
s
t
r
a
t
i
o
n
P
K
.
j
a
v
a
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
/
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
/
R
e
t
u
r
n
R
e
s
u
l
t
s
.
j
a
v
a
j
a
v
a
c

s
e
l
l
e
r
/
S
e
l
l
e
r
B
e
a
n
.
j
a
v
a
r
m
i
c

-
d

.

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
r
m
i
c

-
d

.

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
r
m
i
c

-
d

.

s
e
l
l
e
r
.
S
e
l
l
e
r
B
e
a
n
W
i
n
3
2
:
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
\
R
e
g
i
s
t
r
a
t
i
o
n
.
j
a
v
a
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
\
R
e
g
i
s
t
r
a
t
i
o
n
P
K
.
j
a
v
a
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
\
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a
j
a
v
a
c

r
e
g
i
s
t
r
a
t
i
o
n
\
R
e
t
u
r
n
R
e
s
u
l
t
s
.
j
a
v
a
j
a
v
a
c

s
e
l
l
e
r
\
S
e
l
l
e
r
B
e
a
n
.
j
a
v
a
r
m
i
c

-
d

.

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
r
m
i
c

-
d

.

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
r
m
i
c

-
d

.

s
e
l
l
e
r
.
S
e
l
l
e
r
B
e
a
n
A
r
r
a
n
c
a
r

e
l

R
e
g
i
s
t
r
o

R
M
I
C
o
m
o

e
s
t
a
m
o
s

u
s
a
n
d
o

n
u
e
s
t
r
o

p
r
o
p
i
o

c

d
i
g
o

R
M
I
,

t
e
n
e
m
o
s

q
u
e

a
r
r
a
n
c
a
r

e
x
p
l

c
i
t
a
m
e
n
t
e

e
l

R
M
I

R
e
g
i
s
t
r
y

p
a
r
a

q
u
e

e
l

o
b
j
e
t
o

S
e
l
l
e
r
B
e
a
n

p
u
e
d
a

e
n
c
o
n
t
r
a
r

l
o
s

B
e
a
n
s

r
e
m
o
t
o
s

d
e
E
n
t
e
r
p
r
i
s
e
.

E
l

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

u
s
a

e
l

r
e
g
i
s
t
r
o

R
M
I

p
a
r
a

r
e
g
i
s
t
r
a
r

o

u
n
i
r

l
o
s

B
e
a
n
s

e
n
t
e
r
p
r
i
s
e

q
u
e

p
u
e
d
e
n

s
e
r

l
l
a
m
a
d
o
s

d
e

f
o
r
m
a

r
e
m
o
t
a
.

E
l

c
l
i
e
n
t
e

S
e
l
l
e
r
B
e
a
n

c
o
n
t
a
c
t
a

c
o
n

e
l
r
e
g
i
s
t
r
o

p
a
r
a

b
u
s
c
a
r

y

o
b
t
e
n
e
r

l
a
s

r
e
f
e
r
e
n
c
i
a
s

a

l
o
s

B
e
a
n
s

A
u
c
t
i
o
n
I
t
e
m

y

R
e
g
i
s
t
r
a
t
i
o
n
.
C
o
m
o

R
M
I

p
e
r
m
i
t
e

q
u
e

e
l

c

d
i
g
o

y

l
o
s

d
a
t
o
s

s
e
a
n

t
r
a
n
s
f
e
r
i
d
o
s
,

d
e
b
e
m
o
s

a
s
e
g
u
r
a
r
n
o
s

q
u
e

e
l

s
i
s
t
e
m
a

c
l
a
s
s
l
o
a
d
e
r

n
o

c
a
r
g
a

c
l
a
s
e
s

e
x
t
r
a
s

q
u
e

p
u
e
d
a
n

s
e
r

e
n
v
i
a
d
a
s

e
r
r

n
e
a
m
e
n
t
e

a
l
c
l
i
e
n
t
e
.

E
n

e
s
t
e

e
j
e
m
p
l
o
,

l
a
s

c
l
a
s
e
s

e
x
t
r
a
s

p
o
d
r

a
n

s
e
r

l
a
s

c
l
a
s
e
s

S
t
u
b

y

S
k
e
l
,

y

l
a
s

c
l
a
s
e
s

R
e
g
i
s
t
r
a
t
i
o
n
S
e
v
e
r

y

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
,

y

p
a
r
a

e
v
i
t
a
r

q
u
e

l
o

s
e
a
n

c
u
a
n
d
o

a
r
r
a
n
c
a
m
o
s

e
l
r
e
g
i
s
t
r
o

R
M
I
.

C
o
m
o

e
l

p
a
t
h

a
c
t
u
a
l

p
o
d
r

a

s
e
r

i
n
c
l
u
i
d
o

a
u
t
o
m

t
i
c
a
m
e
n
t
e
,

n
e
c
e
s
i
t
a
m
o
s

a
r
r
a
n
c
a
r

e
l

R
M
I

R
e
g
i
s
t
r
y

d
e
s
d
e

f
u
e
r
a

d
e
l

e
s
p
a
c
i
o

d
e

t
r
a
b
a
j
o
.
L
o
s

s
i
g
u
e
i
n
t
e
s

c
o
m
a
n
d
o
s

e
v
i
t
a
n

e
l

e
n
v

o

d
e

c
l
a
s
e
s

e
x
t
r
a
s
,

d
e
s
c
o
n
f
i
g
u
r
a
n
d
o

l
a

v
a
r
i
a
b
l
e

C
L
A
S
S
P
A
T
H

a
n
t
e
s

d
e

a
r
r
a
n
c
a
r

e
l

R
e
g
i
s
t
r
o

R
M
I

e
n

e
l

p
u
e
r
t
o

1
0
9
9
.

P
o
d
e
m
o
s

e
s
p
e
c
i
f
i
c
a
r

u
n

p
u
e
r
t
o
d
i
f
e
r
e
n
t
e

a

a
d
i
e
n
d
o

e
l

n

m
e
r
o

d
e

p
u
e
r
t
o

d
e

e
s
t
a

f
o
r
m
a
:

r
m
i
r
e
g
i
s
t
r
y

4
3
2
1

&
.

S
i

c
a
m
b
i
a
m
o
s

e
l

n

m
e
r
o

d
e

p
u
e
r
t
o

d
e
b
e
m
o
s

p
o
n
e
r

e
l

m
i
s
m
o

n

m
e
r
o

e
n

l
a
s

l
l
a
m
a
d
a
s

a
l

c
l
i
e
n
t
e

<
l
o
o
k
u
p
y

a
l

s
e
r
v
i
d
o
r

r
e
b
i
n
d
.
U
n
i
x
:
e
x
p
o
r
t

C
L
A
S
S
P
A
T
H
=
"
"
r
m
i
r
e
g
i
s
t
r
y

&
W
i
n
3
2
:
u
n
s
e
t

C
L
A
S
S
P
A
T
H
s
t
a
r
t

r
m
i
r
e
g
i
s
t
r
y
A
r
r
a
n
c
a
r

e
l

S
e
r
v
i
d
o
r

R
e
m
o
t
o
U
n
a

v
e
z

q
u
e

r
m
i
r
e
g
i
s
t
r
y

s
e

e
s
t


e
j
e
c
u
t
a
n
d
o
,

p
o
d
e
m
o
s

a
r
r
a
n
c
a
r

e
l

s
e
r
v
i
d
o
r

r
e
m
o
t
o
,

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.

E
l

p
r
o
g
r
a
m
a

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

r
e
g
i
s
t
r
a

e
l

n
o
m
b
r
e

r
e
g
i
s
t
r
a
t
i
o
n
2

c
o
n

e
l
s
e
r
v
i
d
o
r

d
e

n
o
m
b
r
e
s

r
m
i
r
e
g
i
s
t
r
y
,

y

c
u
a
l
q
u
i
e
r

c
l
i
e
n
t
e

p
u
e
d
e

u
s
a
r

e
s
t
e

n
o
m
b
r
e

p
a
r
a

r
e
c
u
p
e
r
a
r

u
n
a

r
e
f
e
r
e
n
c
i
a

a
l

o
b
j
e
t
o

r
e
m
o
t
o
,

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
P
a
r
a

e
j
e
c
u
t
a
r

e
l

e
j
e
m
p
l
o
,

c
o
p
i
a
m
o
s

l
a
s

c
l
a
s
e
s
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

y

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

y

l
a
s

c
l
a
s
e
s

s
t
u
b

a
s
o
c
i
a
d
a
s

a

u
n

r
e
a

a
c
c
e
s
i
b
l
e

d
e

f
o
r
m
a

r
e
m
o
t
a

y

a
r
r
a
n
c
a
m
o
s

e
l

p
r
o
g
r
a
m
a
s
e
r
v
i
d
o
r
.
U
n
i
x
:
c
p

*
_
S
t
u
b
.
c
l
a
s
s









/
h
o
m
e
/
z
e
l
d
a
/
p
u
b
l
i
c
_
h
t
m
l
/
r
e
g
i
s
t
r
a
t
i
o
n
c
p

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
.
c
l
a
s
s

/
h
o
m
e
/
z
e
l
d
a
/
p
u
b
l
i
c
_
h
t
m
l
/
r
e
g
i
s
t
r
a
t
i
o
n
c
d

/
h
o
m
e
/
z
e
l
d
a
/
p
u
b
l
i
c
_
h
t
m
l
/
r
e
g
i
s
t
r
a
t
i
o
n
j
a
v
a

-
D
j
a
v
a
.
s
e
r
v
e
r
.
h
o
s
t
n
a
m
e
=








p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
W
i
n
d
o
w
s
:
c
o
p
y

*
_
S
t
u
b
.
c
l
a
s
s









\
h
o
m
e
\
z
e
l
d
a
\
p
u
b
l
i
c
_
h
t
m
l
\
r
e
g
i
s
t
r
a
t
i
o
n
c
o
p
y

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
.
c
l
a
s
s









\
h
o
m
e
\
z
e
l
d
a
\
p
u
b
l
i
c
_
h
t
m
l
\
r
e
g
i
s
t
r
a
t
i
o
n
c
d

\
h
o
m
e
\
z
e
l
d
a
\
p
u
b
l
i
c
_
h
t
m
l
\
r
e
g
i
s
t
r
a
t
i
o
n
j
a
v
a

-
D
j
a
v
a
.
s
e
r
v
e
r
.
h
o
s
t
n
a
m
e
=








p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
L
a
s

s
i
g
u
i
e
n
t
e
s

p
r
o
p
i
e
d
a
d
e
s

s
e

u
s
a
n

p
a
r
a

c
o
n
f
i
g
u
r
a
r

l
o
s

c
l
i
e
n
t
e
s

y

s
e
r
v
i
d
o
r
e
s

R
M
I
.

E
s
t
a
s

p
r
o
p
i
e
d
a
d
e
s

p
u
e
d
e
n

s
e
l
e
c
c
i
o
n
a
r
s
e

d
e
n
t
r
o

d
e
l

p
r
o
g
r
a
m
a

o

s
u
m
i
n
i
s
t
r
a
r
l
a
s

c
o
m
o

p
r
o
p
i
e
d
a
d
e
s

e
n

l
a
l

n
e
a

d
e

c
o
m
a
n
d
o
s

p
a
r
a

l
a

J
V
M
.
L
a

p
r
o
p
i
e
d
a
d

j
a
v
a
.
r
m
i
.
s
e
r
v
e
r
.
c
o
d
e
b
a
s
e

e
s
p
e
c
i
f
i
c
a

d

n
d
e

s
e

l
o
c
a
l
i
z
a
n

l
a
s

c
l
a
s
e
s

a
c
c
e
s
i
b
l
e
s

p

b
l
i
c
a
m
e
n
t
e
.

E
n

e
l

s
e
r
v
i
d
o
r

e
s
t
o

p
u
e
d
e

s
e
r

u
n

s
i
m
p
l
e

f
i
c
h
e
r
o

U
R
L

p
a
r
a

a
p
u
n
t
a
r

a
l
d
i
r
e
c
t
o
r
i
o

o

f
i
c
h
e
r
o

J
A
R

q
u
e

c
o
n
t
i
e
n
e

l
a
s

c
l
a
s
e
s
.

S
i

e
l

U
R
L

a
p
u
n
t
a

a

u
n

d
i
r
e
c
t
o
r
i
o
,

d
e
b
e

t
e
r
m
i
n
a
r

c
o
n

u
n

c
a
r

c
t
e
r

s
e
p
a
r
a
d
o
r

d
e

f
i
c
h
e
r
o
s

,

"
/
"
.
S
i

n
o

u
s
a
m
o
s

u
n

f
i
c
h
e
r
o

U
R
L
,

t
a
m
p
o
c
o

n
e
c
e
s
i
t
a
r
e
m
o
s

u
n

s
e
r
v
i
d
o
r

H
T
T
P

p
a
r
a

d
e
s
c
a
r
g
a
r

l
a
s

c
l
a
s
e
s

r
e
m
o
t
a
s

o

t
e
n
e
r

q
u
e

e
n
v
i
a
r

m
a
n
u
a
l
m
e
n
t
e

e
l

s
t
u
b

d
e
l

c
l
i
e
n
t
e

y

l
a
s

c
l
a
s
e
s

d
e
i
n
t
e
r
f
a
c
e
s

r
e
m
o
t
o
s
,

p
o
r

e
j
e
m
p
l
o
,

u
n

f
i
c
h
e
r
o

J
A
R
.




L
a

p
r
o
p
i
e
d
a
d

j
a
v
a
.
r
m
i
.
s
e
r
v
e
r
.
h
o
s
t
n
a
m
e

e
s

e
l

n
o
m
b
r
e

c
o
m
p
l
e
t
o

d
e
l

h
o
s
t

d
e
l

s
e
r
v
i
d
o
r

d
o
n
d
e

r
e
s
i
d
e
n

l
a
s

c
l
a
s
e
s

c
o
n

a
c
c
e
s
o

p

b
l
i
c
o
.

E
s
t
o

e
s

s

l
o

n
e
c
e
s
a
r
i
o

s
i

e
l

s
e
r
v
i
d
o
r

t
i
e
n
e
p
r
o
b
l
e
m
a
s

p
a
r
a

g
e
n
e
r
a
r

p
o
r

s


m
i
s
m
o

u
n

n
o
m
b
r
e

t
o
t
a
l
m
e
n
t
e

c
u
a
l
i
f
i
c
a
d
o
.




L
a

p
r
o
p
i
e
d
a
d

j
a
v
a
.
r
m
i
.
s
e
c
u
r
i
t
y
.
p
o
l
i
c
y

e
s
p
e
c
i
f
i
c
a

e
l

p
o
l
i
c
y

f
i
l
e

c
o
n

l
o
s

p
e
r
m
i
s
o
s

n
e
c
e
s
a
r
i
o
s

p
a
r
a

e
j
e
c
u
t
a
r

e
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

r
e
m
o
t
o

y

p
a
r
a

a
c
c
e
d
e
r

a

l
a

d
e
s
c
a
r
g
a

d
e

l
a
s

c
l
a
s
e
s

d
e
l
s
e
r
v
i
d
o
r

r
e
m
o
t
o
.




E
s
t
a
b
l
e
c
e
r

C
o
m
u
n
i
c
a
c
i
o
n
e
s

R
e
m
o
t
a
s
L
o
s

p
r
o
g
r
a
m
a
s

c
l
i
e
n
t
e
s

s
e

c
o
m
u
n
i
c
a
n

u
n
o
s

c
o
n

o
t
r
o
s

a

t
r
a
v

s

d
e
l

s
e
r
v
i
d
o
r
.

E
l

p
r
o
g
r
a
m
a

s
e
r
v
i
d
o
r

c
o
n
s
i
s
t
e

e
n

t
r
e
s

f
i
c
h
e
r
o
s
.

L
o
s

f
i
c
h
e
r
o
s

d
e

i
n
t
e
r
f
a
c
e
s

r
e
m
o
t
o
s

R
e
g
i
s
t
r
a
t
i
o
n
.
j
a
v
a

y
R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
j
a
v
a

d
e
f
i
n
e
n

l
o
s

m

t
o
d
o
s

q
u
e

p
u
e
d
e
n

s
e
r

l
l
a
m
a
d
o
s

d
e

f
o
r
m
a

r
e
m
o
t
a
,

y

e
l

f
i
c
h
e
r
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a

d
e

c
l
a
s
e

d
e
f
i
n
e

l
a
s

c
l
a
s
e
s

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

y
R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

q
u
e

i
m
p
l
e
m
e
n
t
a
n

l
o
s

m

t
o
d
o
s
.
P
a
r
a

e
s
t
a
b
l
e
c
e
r

c
o
m
u
n
i
c
a
c
i
o
n
e
s

r
e
m
o
t
a
s
,

t
a
n
t
o

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e

c
o
m
o

e
l

s
e
r
v
i
d
o
r

n
e
c
e
s
i
t
a
n

a
c
c
e
d
e
r

a

l
a
s

c
l
a
s
e
s

d
e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o
.

E
l

s
e
r
v
i
d
o
r

n
e
c
e
s
i
t
a

l
a
s

c
l
a
s
e
s

d
e
l

i
n
t
e
r
f
a
c
e

p
a
r
a
g
e
n
e
r
a
r

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e
l

i
n
t
e
r
f
a
c
e
,

y

e
l

c
l
i
e
n
t
e

u
s
a

e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o

p
a
r
a

l
l
a
m
a
r

a

l
a
s

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

d
e

l
o
s

m

t
o
d
o
s

d
e
l

s
e
r
v
i
d
o
r

r
e
m
o
t
o
.
P
o
r

e
j
e
m
p
l
o
,

S
e
l
l
e
r
B
e
a
n

c
r
e
a

u
n
a

r
e
f
e
r
e
n
c
i
a

a

e
l

i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
,

y

n
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
,

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n
,

c
u
a
n
d
o

n
e
c
e
s
i
t
a

c
r
e
a
r

u
n

r
e
g
i
s
r
o

d
e

u
s
u
a
r
i
o
.
J
u
n
t
o

c
o
n

l
o
s

i
n
t
e
r
f
a
c
e
s

d
e
l

s
e
r
v
i
d
o
r

y

l
a
s

c
l
a
s
e
s
,

n
e
c
e
s
i
t
a
m
o
s

l
a
s

c
l
a
s
e
s

S
t
u
b

y

S
k
e
l

p
a
r
a

e
s
t
a
b
l
e
c
e
r

c
o
m
u
n
i
c
a
c
i
o
n
e
s

r
e
m
o
t
a
s
.

E
s
t
a
s

c
l
a
s
e
s

s
e

g
e
n
e
r
a
n

c
u
a
n
d
o

e
j
e
c
u
t
a
m
o
s

e
l

c
o
m
a
n
d
o
d
e
l

c
o
m
p
i
l
a
d
o
r

r
m
i
c

s
o
b
r
e

l
a
s

c
l
a
s
e
s

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

y

S
e
l
l
e
r
B
e
a
n
.
L
a
s

c
l
a
s
e
s

S
e
l
l
e
r
B
e
a
n
,
S
e
l
l
e
r
B
e
a
n
_
S
t
u
b
.
c
l
a
s
s

y

S
e
l
l
e
r
B
e
a
n
_
S
k
e
l
.
c
l
a
s
s

g
e
n
e
r
a
d
a
s

s
o
n

n
e
c
e
s
a
r
i
a
s

p
a
r
a

l
a

l
l
a
m
a
d
a

d
e
s
d
e

e
l

s
e
r
v
i
d
o
r

h
a
s
t
a

e
l

c
l
i
e
n
t
e

S
e
l
l
e
r
B
e
a
n
.

E
s

e
l

f
i
c
h
e
r
o
_
S
t
u
b
.
c
l
a
s
s

e
n

e
l

c
l
i
e
n
t
e

q
u
e

c
o
l
o
c
a

y

d
e
s
c
o
l
o
c
a

l
o
s

d
a
t
o
s

d
e
s
d
e

e
l

s
e
r
v
i
d
o
r
,

m
i
e
n
t
r
a
s

q
u
e

l
a

c
l
a
s
e

_
S
k
e
l
.
c
l
a
s
s

h
a
c
e

l
o
s

m
i
s
m
o

e
n

e
l

s
e
r
v
i
d
o
r
.
N
o
t
a
:

E
n

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

2
,

e
l

f
i
c
h
e
r
o

d
e
l

l
a
d
o

d
e
l
s
e
r
v
i
d
o
r
,

_
S
k
e
l
.
c
l
a
s
s

y
a

n
o

e
s

n
e
c
e
s
a
r
i
o

p
o
r
q
u
e

s
u
s

f
u
n
c
i
o
n
e
s

h
a
n

s
i
d
o

r
e
e
m
p
l
a
z
a
d
a
s

p
o
r

l
a
s

c
l
a
s
e
s

d
e

l
a

"
J
a
v
a

V
i
r
t
u
a
l
M
a
c
h
i
n
e
"
.
C
o
l
o
c
a
r

D
a
t
o
s
C
o
l
o
c
a
r

y

d
e
s
c
o
l
o
c
a
r

l
o
s

d
a
t
o
s

s
i
g
n
i
f
i
c
a

q
u
e

c
u
a
n
d
o

l
l
a
m
a
m
o
s

a
l

m

t
o
d
o

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
c
r
e
a
t
e

d
e
s
d
e

S
e
l
l
e
r
B
e
a
n
,

e
s
t
a

l
l
a
m
a
d
a

e
s

r
e
e
n
v
i
a
d
a

a
l

m

t
o
d
o
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
_
S
t
u
b
.
c
r
e
a
t
e
.

E
l

m

t
o
d
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
_
S
t
u
b
.
c
r
e
a
t
e

e
n
v
u
e
l
v
e

l
o
s

a
r
g
u
m
e
n
t
o
s

d
e
l

m

t
o
d
o

y

l
o
s

e
n
v

a

a

u
n

s
t
r
e
a
m

s
e
r
i
a
l
i
z
a
d
o

d
e

b
y
t
e
s

p
a
r
a

e
l

m

t
o
d
o
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
_
S
k
e
l
.
c
r
e
a
t
e
.
m

t
o
d
o
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
_
S
k
e
l
.
c
r
e
a
t
e

d
e
s
e
n
v
u
e
l
v
e

e
l

s
t
r
e
a
m

d
e

b
y
t
e
s

s
e
r
i
a
l
i
z
a
d
o
,

r
e
-
c
r
e
a

l
o
s

a
r
g
u
m
e
n
t
o
s

d
e

l
a

l
l
a
m
a
d
a

o
r
i
g
i
n
a
l

a

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
c
r
e
a
t
e
,

y

d
e
v
u
e
l
v
e

e
l
r
e
s
u
l
t
a
d
o

d
e

l
a

l
l
a
m
a
d
a

r
e
a
l

R
e
g
i
s
t
r
a
i
o
n
S
e
r
v
e
r
.
c
r
e
a
t
e

d
e

v
u
e
l
t
a
,

j
u
n
t
o

c
o
n

l
a

m
i
s
m
a

r
u
t
a
,

p
e
r
o

e
s
t
a

v
e
z
,

s
e

e
m
p
a
q
u
e
t
a
n

l
o
s

d
a
t
o
s

e
n

e
l

l
a
d
o

d
e
l

s
e
r
v
i
d
o
r
.
C
o
l
o
c
a
r

y

d
e
s
c
o
l
o
c
a
r

l
o
s

d
a
t
o
s

t
i
e
n
e

s
u
s

c
o
m
p
l
i
c
a
c
i
o
n
e
s
.

E
l

p
r
i
m
e
r

p
r
o
b
l
e
m
a

s
o
n

l
o
s

o
b
j
e
t
o
s

s
e
r
i
a
l
i
z
a
d
o
s

q
u
e

p
o
d
r

a
n

s
e
r

i
n
c
o
m
p
a
t
i
l
e
s

e
n
t
r
e

v
e
r
s
i
o
n
e
s

d
e
l

J
D
K
.

U
n

o
b
j
e
t
o

s
e
r
i
a
l
i
z
a
d
o
t
i
e
n
e

u
n

i
d
e
n
t
i
f
i
c
a
d
o
r

a
l
m
a
c
e
n
a
d
o

c
o
n

e
l

o
b
j
e
t
o

q
u
e

e
n
l
a
z
a

e
l

o
b
j
e
t
o

s
e
r
i
a
l
i
z
a
d
o

c
o
n

s
u

v
e
r
s
i

n
.

S
i

e
l

c
l
i
e
n
t
e

R
M
I

y

e
l

s
e
r
v
i
d
o
r

s
o
n

i
n
c
o
m
p
a
t
i
v
l
e
s

c
o
n

s
u

I
D

d
e

s
e
r
i
e
,

p
o
d
r

a
m
o
s

n
e
c
e
s
i
t
a
r
g
e
n
e
r
a
r

S
t
u
b
s

y

S
k
e
l
s

c
o
m
p
a
t
i
b
l
e
s

u
s
a
n
d
o

l
a

o
p
c
i

n

-
v
c
o
m
p
a
t

d
e
l

c
o
m
p
i
l
a
d
o
r

r
m
i
c
.
O
t
r
o

p
r
o
b
l
e
m
a

e
s

q
u
e

n
o

t
o
d
o
s

l
o
s

o
b
j
e
t
o
s

s
o
n

s
e
r
i
a
l
i
z
a
b
l
e
s

p
o
r

d
e
f
e
c
t
o
.

E
l

o
b
j
e
t
o

i
n
i
c
i
a
l

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

e
s
t


b
a
s
a
d
o

e
n

l
a

d
e
v
o
l
u
c
i

n

d
e

u
n

o
b
j
e
t
o

E
n
u
m
e
r
a
t
i
o
n

q
u
e

c
o
n
t
i
e
n
e
e
l
e
m
e
n
t
o
s
R
e
g
i
s
t
r
a
t
i
o
n

e
n

u
n

V
e
c
t
o
r
.

D
e
v
o
l
v
e
r

l
a

l
i
s
t
a

d
e
s
d
e

e
l

m

t
o
d
o

r
e
m
o
t
o
,

f
u
n
c
i
o
n
a

b
i
e
n
,

p
e
r
o

c
u
a
n
d
o

i
n
t
e
n
t
a
m
o
s

e
n
v

a
r

u
n

v
e
c
t
o
r

c
o
m
o

u
n

p
a
r

m
e
t
r
o

a

u
n

o
b
j
e
t
o

r
e
m
o
t
o
,
o
b
t
e
n
d
r
e
m
o
s

u
n
a

e
x
c
e
p
c
i

n

e
n

t
i
e
m
p
o

d
e

e
j
e
c
u
c
i

n

e
n

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

2
.
A
f
o
r
t
u
n
a
d
a
m
e
n
t
e
,

e
n

e
l

A
P
I

C
o
l
l
e
c
t
i
o
n
s
,

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

o
f
r
e
c
e

a
l
t
e
r
n
a
t
i
v
a
s

a

l
a

d
e
s
c
o
l
o
c
a
c
i

n

d
e

o
b
j
e
t
o
s

a
n
t
e
r
i
o
r
.

E
n

e
s
t
e

e
j
e
m
p
l
o
,

u
n

A
r
r
a
y
L
i
s
t

d
e
l

A
P
I

C
o
l
l
e
c
t
i
o
n
s

r
e
e
m
p
l
a
z
a

e
l
V
e
c
t
o
r
.

S
i

e
l

A
P
I

C
o
l
l
e
c
t
i
o
n
s

n
o

e
s

u
n
a

o
p
c
i

n
,

p
o
d
e
m
o
s

c
r
e
a
r

u
n
a

c
l
a
s
e

e
n
v
o
l
t
u
r
a

q
u
e

e
x
t
i
e
n
d
a

S
e
r
i
a
l
i
z
a
b
l
e

y

p
r
o
p
o
r
c
i
o
n
e

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

p
a
r
a

l
o
s

m

t
o
d
o
s

r
e
a
d
O
b
j
e
c
t

y
w
r
i
t
e
O
b
j
e
c
t

p
a
r
a

c
o
n
v
e
r
t
i
r

e
l

o
b
j
e
t
o

e
n

u
n

s
t
r
e
a
m

d
e

b
y
t
e
s
.
L
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
L
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

e
x
t
i
e
n
d
e

j
a
v
a
.
r
m
i
.
s
e
r
v
e
r
.
U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t

e

i
m
p
l
e
m
e
n
t
a

l
o
s

m

t
o
d
o
s

c
r
e
a
t
e
,
f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y

y

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s

d
e
c
l
a
r
a
d
o
s

e
n

e
l
i
n
t
e
r
f
a
c
e
R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.

E
l

f
i
c
h
e
r
o

f
u
e
n
t
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a

t
a
m
b
i

n

i
n
c
l
u
y
e

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o

R
e
g
i
s
t
r
a
t
i
o
n

c
o
m
o

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
.
R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

t
a
m
b
i

n

e
x
t
i
e
n
d
e

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
.
E
x
p
o
r
t
a
r

u
n

O
b
j
e
t
o

R
e
m
o
t
o
C
u
a
l
q
u
i
e
r

o
b
j
e
t
o

q
u
e

q
u
e
r
r
a
m
o
s

q
u
e

s
e

a
c
c
e
s
i
b
l
e

r
e
m
o
t
a
m
e
n
t
e

n
e
c
e
s
i
t
a

e
x
t
e
n
d
e
r

e
l

i
n
t
e
r
f
a
c
e

j
a
v
a
.
r
m
i
.
s
e
r
v
e
r
.
U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t

o

u
s
a
r

e
l

m

t
o
d
o

e
x
p
o
r
t
O
b
j
e
c
t

d
e

l
a

c
l
a
s
e
U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
.

S
i

e
x
t
e
n
d
e
m
o
s

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
,

t
a
m
b
i

n

o
b
t
e
n
d
r
e
m
o
s

l
o
s

m

t
o
d
o
s

e
q
u
a
l
s
,
t
o
S
t
r
i
n
g

y

h
a
s
h
C
o
d
e

p
a
r
a

e
l

o
b
j
e
t
o

e
x
p
o
r
t
a
d
o
.
P
a
s
a
r

p
o
r

V
a
l
o
r

y

p
o
r

R
e
f
e
r
e
n
c
i
a
A
u
n
q
u
e

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

n
o

e
s
t


u
n
i
d
a

a
l

r
e
g
i
s
t
r
o
,

t
o
d
a
v

a

e
s
t


r
e
f
e
r
e
n
c
i
a
d
a

r
e
m
o
t
a
m
e
n
t
e

p
o
r
q
u
e

e
s
t


a
s
o
c
i
a
d
a

c
o
n

l
o
s

r
e
s
u
l
t
a
d
o
s

d
e
v
u
e
l
t
o
s

p
o
r

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

e
x
t
i
e
n
d
e

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
,

s
u
s

r
e
s
u
l
t
a
d
o
s

s
o
n

p
a
s
a
d
o
s

p
o
r

r
e
f
e
r
e
n
c
i
a
,

y

s

l
o

u
n
a

c
o
p
i
a

d
e
l

B
e
a
n

d
e

r
e
g
i
s
t
r
o

d
e
l

u
s
u
a
r
i
o

e
x
i
s
t
e
n
t
e

e
n

l
a

J
a
v
a

V
M

a

l
a

v
e
z
.
E
n

e
l

c
a
s
o

d
e

r
e
p
o
r
t
a
r

r
e
s
u
l
t
a
d
o
s

c
o
m
o

e
n

e
l

m

t
o
d
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
,

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

s
e

p
u
e
d
e

u
s
a
r

u
n
a

c
o
p
i
a

d
e
l

o
b
j
e
t
o

r
e
m
o
t
o
.

S
i

n
o
e
x
t
e
n
d
e
m
o
s

l
a

c
l
a
s
e

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t

e
n

l
a

d
e
f
i
n
i
c
i

n

d
e

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
,

s
e

d
e
v
o
l
v
e
r


u
n

n
u
e
v
o

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n

e
n

c
a
d
a

p
e
t
i
c
i

n
.

E
n

e
f
e
c
t
o

l
o
s

v
a
l
o
r
e
s

s
o
n
p
a
s
a
d
o
s

p
e
r
o

n
o

l
a

r
e
f
e
r
e
n
c
i
a

a
l

o
b
j
e
t
o

e
n

e
l

s
e
r
v
i
d
o
r
.
R
e
c
o
l
e
c
c
i

n

d
e

B
a
s
u
r
a

D
i
s
t
r
i
b
u
i
d
a
A
l

u
s
a
r

r
e
f
e
r
e
n
c
i
a
s

r
e
m
o
t
a
s

a

o
b
j
e
t
o
s

e
n

e
l

s
e
r
v
i
d
o
r

d
e
s
d
e

f
u
e
r
a

d
e
l

c
l
i
e
n
t
e

e
l

r
e
c
o
l
e
c
t
o
r

d
e

b
a
s
u
r
a

d
e
l

s
e
r
v
i
d
o
r

i
n
t
r
o
d
u
c
e

a
l
g
u
n
o
s

p
r
o
b
l
e
m
a
s

p
o
t
e
n
c
i
a
l
e
s

c
o
n

l
a

m
e
m
o
r
i
a
.

m
o

c
o
n
o
c
e
e
l

s
e
r
v
i
d
o
r

c
u
a
n
d
o

s
e

m
a
n
t
i
e
n
e

u
n
a

r
e
f
e
r
e
n
c
i
a

a

u
n

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n

q
u
e

n
o

e
s
t


s
i
e
n
d
o

u
s
a
d
o

p
o
r

n
i
n
g

n

c
l
i
e
n
t
e

p
o
r
q
u
e

a
b
o
r
t


o

s
e

c
a
y


l
a

c
o
n
e
x
i

n

d
e

r
e
d
?
P
a
r
a

e
v
i
t
a
r

b
l
o
q
u
e
o
s

d
e

m
e
m
o
r
i
a

e
n

e
l

s
e
r
v
i
d
o
r

d
e
s
d
e

l
o
s

c
l
i
e
n
t
e
s
,

R
M
I

u
s
a

u
n

m
e
c
a
n
i
s
m
o

d
e

a
l
q
u
i
l
e
r

c
u
a
n
d
o

o
f
r
e
c
e
n

l
a
s

r
e
f
e
r
e
n
c
i
a
s

a

l
o
s

o
b
j
e
t
o
s

e
x
p
o
r
t
a
d
o
s
.

C
u
a
n
d
o

s
e

e
x
p
o
r
t
a

u
n
o
b
j
e
t
o
,

l
a

J
V
M

i
n
c
r
e
m
e
n
t
a

l
a

c
u
e
n
t
a

d
e
l

n

m
e
r
o

d
e

r
e
f
e
r
e
n
c
i
a
s

a

e
s
t
e

o
b
j
e
t
o

y

c
o
n
f
i
g
u
r
a

e
l

t
i
e
m
p
o

d
e

e
x
p
i
r
a
c
i

n
,

o

t
i
e
m
p
o

d
e

p
r

s
t
a
m
o
,

p
o
r

e
l

n

m
e
r
o

d
e

r
e
f
e
r
e
n
c
i
a
s

d
e
l

o
b
j
e
t
o
.
C
u
a
n
d
o

e
l

a
l
q
u
i
l
e
r

e
x
p
i
r
a
,

l
a

c
u
e
n
t
a

d
e

r
e
f
e
r
e
n
c
i
a
s

d
e

e
s
t
e

o
b
j
e
t
o

s
e

d
e
c
r
e
m
e
n
t
a

y

s
i

a
l
c
a
n
z
a

0
,

e
l

o
b
j
e
t
o

e
s

s
e
l
e
c
c
i
o
n
a
d
o

p
a
r
a

l
a

r
e
c
o
l
e
c
c
i

n

d
e

b
a
s
u
r
a

p
o
r

l
a

J
V
M
.

H
a
y

q
u
e

c
o
n
f
i
g
u
r
a
r

e
l
c
l
i
e
n
t
e

q
u
e

m
a
n
t
i
e
n
e

u
n

p
i
c
o

d
e

r
e
f
e
r
e
n
c
i
a

a
l

o
b
j
e
t
o

r
e
m
o
t
o

a

q
u
e

r
e
n
u
e
v
e

e
l

a
l
q
u
i
l
e
r

s
i

n
e
c
e
s
i
t
a

e
l

o
b
j
e
t
o

m

s

a
l
l
a

d
e
l

t
i
e
m
p
o

d
e

a
l
q
u
i
l
e
r
.

E
s
t
e

p
i
c
o

d
e

r
e
f
e
r
e
n
c
i
a

e
s

u
n
a

f
o
r
m
a

d
e
r
e
f
e
r
i
r
s
e

a

u
n

o
b
j
e
t
o

e
n

l
a

m
e
m
o
r
i
a

s
i
n

m
a
n
t
e
n
e
r
l
o

l
e
j
o
s

d
e
l

r
e
c
o
l
e
c
t
o
r

d
e

b
a
s
u
r
a
.
E
s
t
e

t
i
e
m
p
o

d
e

a
l
q
u
i
l
e
r

e
s

u
n
a

p
r
o
p
i
e
d
a
d

c
o
n
f
i
g
u
r
a
b
l
e

m
e
d
i
d
a

e
n

s
e
g
u
n
d
o
s
.

S
i

t
e
n
e
m
o
s

u
n
a

r
e
d

r

p
i
d
a
,

p
o
d
r

a
m
o
s

a
c
o
r
t
a
r

e
l

v
a
l
o
r

p
o
r

d
e
f
e
c
t
o
,

y

c
r
e
a
r

u
n

g
r
a
n

n

m
e
r
o

d
e

r
e
f
e
r
e
n
c
i
a
s

a
o
b
j
e
t
o
s

t
r
a
n
s
i
t
o
r
i
a
s
.
E
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

s
e
l
e
c
c
i
o
n
a

e
l

t
i
e
m
p
o

d
e

a
l
q
u
i
l
e
r

a

2

m
i
n
u
t
o
s
.




P
r
o
p
e
r
t
y

p
r
o
p

=

S
y
s
t
e
m
.
g
e
t
P
r
o
p
e
r
t
i
e
s
(
)
;




p
r
o
p
.
p
u
t
(
"
j
a
v
a
.
r
m
i
.
d
g
c
.
l
e
a
s
e
V
a
l
u
e
"
,

1
2
0
0
0
0
)
;
L
o
s

m

t
o
d
o
s

c
r
e
a
t
e

y

f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y

s
o
n

p
r

c
t
i
c
a
m
e
n
t
e

i
d

n
t
i
c
o
s

a

l
a
s

o
t
r
a
s

v
e
r
s
i
o
n
e
s

d
e
l

s
e
r
v
i
d
o
r

R
e
g
i
s
t
r
a
t
i
o
n
.

L
a

p
r
i
n
c
i
p
a
l

d
i
f
e
r
e
c
i
a

e
s

q
u
e

e
n

e
l

l
a
d
o

d
e
l

s
e
r
v
i
d
o
r
,

e
l

r
e
g
i
s
t
r
o
r
e
g
i
s
t
r
a
t
i
o
n

e
s

r
e
f
e
r
e
n
c
i
a
d
o

c
o
m
o

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
,

q
u
e

e
s

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e

R
e
g
i
s
t
r
a
t
i
o
n
.

E
n

e
l

l
a
d
o

d
e
l

c
l
i
e
n
t
e
,

s
e

u
s
a

R
e
g
i
s
t
r
a
t
i
o
n

e
n

s
u

l
u
g
a
r
.
E
l

m

t
o
d
o

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s

c
o
s
n
t
r
u
y
e

u
n

A
r
r
a
y
L
i
s
t

d
e

o
b
j
e
t
o
s

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

s
e
r
i
a
l
i
z
a
b
l
e
s

y

l
l
a
m
a

a
l

m

t
o
d
o

r
e
m
o
t
o

e
n

l
a

c
l
a
s
e

S
e
l
l
e
r
B
e
a
n

p
a
r
a

p
a
s
a
r

e
l

r
e
s
u
l
t
a
d
o

d
e
v
u
e
l
t
a
.

L
o
s

r
e
s
u
l
t
a
d
o
s

o
n

g
e
n
e
r
a
d
o

p
o
r

u
n
a

c
l
a
s
e

T
h
r
e
a
d

i
n
t
e
r
n
a

p
o
r
q
u
e

e
l

m

t
o
d
o

r
e
t
o
r
n
a

a
n
t
e
s

d
e

q
u
e

e
l

r
e
s
u
l
t
a
d
o

e
s
t


c
o
m
p
l
e
t
o
.

E
l

o
b
j
e
t
o

S
e
l
l
e
r
B
e
a
n

e
s
p
e
r
a

a

q
u
e

s
e
a

l
l
a
m
a
d
o

e
l
m

t
o
d
o
u
p
d
a
t
e
A
c
c
o
u
n
t
s

a
n
t
e
s

d
e

m
o
s
t
r
a
r

l
a

p

g
i
n
a

H
T
M
L
.

E
n

u
n

c
l
i
e
n
t
e

e
s
c
r
i
t
o

e
n

J
a
v
a
,

n
o

s
e
r

a

n
e
c
e
s
a
r
i
o

e
s
p
e
r
a
r
,

p
o
d
r

a
m
o
s

m
o
s
t
r
a
r

l
a

a
c
t
u
a
l
i
z
a
c
i

n

e
n

t
i
e
m
p
o

r
e
a
l
.
p
u
b
l
i
c

c
l
a
s
s

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r









e
x
t
e
n
d
s

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t









i
m
p
l
e
m
e
n
t
s

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

{


p
u
b
l
i
c

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
P
K





c
r
e
a
t
e
(
S
t
r
i
n
g

t
h
e
u
s
e
r
,









S
t
r
i
n
g

p
a
s
s
w
o
r
d
,









S
t
r
i
n
g

e
m
a
i
l
a
d
d
r
e
s
s
,









S
t
r
i
n
g

c
r
e
d
i
t
c
a
r
d
)











t
h
r
o
w
s

r
e
g
i
s
t
r
a
t
i
o
n
.
C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
{




/
/

c
o
d
e

t
o

i
n
s
e
r
t

d
a
t
a
b
a
s
e

r
e
c
o
r
d


}


p
u
b
l
i
c

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n





f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(
r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
P
K

p
k
)









t
h
r
o
w
s

r
e
g
i
s
t
r
a
t
i
o
n
.
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

{






i
f

(
(
p
k

=
=

n
u
l
l
)

|
|

(
p
k
.
g
e
t
U
s
e
r
(
)

=
=

n
u
l
l
)
)

{












t
h
r
o
w

n
e
w

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

(
)
;






}






r
e
t
u
r
n
(
r
e
f
r
e
s
h
(
p
k
)
)
;


}


p
r
i
v
a
t
e

R
e
g
i
s
t
r
a
t
i
o
n

r
e
f
r
e
s
h
(
R
e
g
i
s
t
r
a
t
i
o
n
P
K

p
k
)








t
h
r
o
w
s

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

{




i
f
(
p
k

=
=

n
u
l
l
)

{






t
h
r
o
w

n
e
w

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

(
)
;




}




C
o
n
n
e
c
t
i
o
n

c
o
n

=

n
u
l
l
;




P
r
e
p
a
r
e
d
S
t
a
t
e
m
e
n
t

p
s

=

n
u
l
l
;




t
r
y
{






c
o
n
=
g
e
t
C
o
n
n
e
c
t
i
o
n
(
)
;






p
s
=
c
o
n
.
p
r
e
p
a
r
e
S
t
a
t
e
m
e
n
t
(
"
s
e
l
e
c
t

p
a
s
s
w
o
r
d
,









e
m
a
i
l
a
d
d
r
e
s
s
,









c
r
e
d
i
t
c
a
r
d
,









b
a
l
a
n
c
e

f
r
o
m

r
e
g
i
s
t
r
a
t
i
o
n

w
h
e
r
e

t
h
e
u
s
e
r

=

?
"
)
;






p
s
.
s
e
t
S
t
r
i
n
g
(
1
,

p
k
.
g
e
t
U
s
e
r
(
)
)
;






p
s
.
e
x
e
c
u
t
e
Q
u
e
r
y
(
)
;






R
e
s
u
l
t
S
e
t

r
s

=

p
s
.
g
e
t
R
e
s
u
l
t
S
e
t
(
)
;






i
f
(
r
s
.
n
e
x
t
(
)
)

{








R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

r
e
g
=
n
u
l
l
;








t
r
y
{










r
e
g
=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
(
)
;








}
c
a
t
c
h

(
R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

e
)

{
}










r
e
g
.
t
h
e
u
s
e
r

=

p
k
.
g
e
t
U
s
e
r
(
)
;










r
e
g
.
p
a
s
s
w
o
r
d

=

r
s
.
g
e
t
S
t
r
i
n
g
(
1
)
;










r
e
g
.
e
m
a
i
l
a
d
d
r
e
s
s

=

r
s
.
g
e
t
S
t
r
i
n
g
(
2
)
;










r
e
g
.
c
r
e
d
i
t
c
a
r
d

=

r
s
.
g
e
t
S
t
r
i
n
g
(
3
)
;










r
e
g
.
b
a
l
a
n
c
e

=

r
s
.
g
e
t
D
o
u
b
l
e
(
4
)
;










r
e
t
u
r
n

r
e
g
;






}
e
l
s
e
{










t
h
r
o
w

n
e
w

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

(
)
;






}




}
c
a
t
c
h

(
S
Q
L
E
x
c
e
p
t
i
o
n

s
q
e
)

{











t
h
r
o
w

n
e
w

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
(
)
;




}
f
i
n
a
l
l
y

{






t
r
y
{








p
s
.
c
l
o
s
e
(
)
;








c
o
n
.
c
l
o
s
e
(
)
;






}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

i
g
n
o
r
e
)

{
}






}


}


p
u
b
l
i
c

v
o
i
d

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
(
















f
i
n
a
l

R
e
t
u
r
n
R
e
s
u
l
t
s

c
l
i
e
n
t
)








t
h
r
o
w
s

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

{




R
u
n
n
a
b
l
e

b
g
t
h
r
e
a
d

=

n
e
w

R
u
n
n
a
b
l
e
(
)

{






p
u
b
l
i
c

v
o
i
d

r
u
n
(
)

{








C
o
n
n
e
c
t
i
o
n

c
o
n

=

n
u
l
l
;








R
e
s
u
l
t
S
e
t

r
s

=

n
u
l
l
;








P
r
e
p
a
r
e
d
S
t
a
t
e
m
e
n
t

p
s

=

n
u
l
l
;








A
r
r
a
y
L
i
s
t

a
r

=

n
e
w

A
r
r
a
y
L
i
s
t
(
)
;








t
r
y
{










c
o
n
=
g
e
t
C
o
n
n
e
c
t
i
o
n
(
)
;










p
s
=
c
o
n
.
p
r
e
p
a
r
e
S
t
a
t
e
m
e
n
t
(
"
s
e
l
e
c
t

t
h
e
u
s
e
r
,














b
a
l
a
n
c
e

f
r
o
m

r
e
g
i
s
t
r
a
t
i
o
n














w
h
e
r
e

b
a
l
a
n
c
e

<

?
"
)
;










p
s
.
s
e
t
D
o
u
b
l
e
(
1
,

3
.
0
0
)
;










p
s
.
e
x
e
c
u
t
e
Q
u
e
r
y
(
)
;










r
s

=

p
s
.
g
e
t
R
e
s
u
l
t
S
e
t
(
)
;










R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

r
e
g
=
n
u
l
l
;










w
h
i
l
e

(
r
s
.
n
e
x
t
(
)
)

{












t
r
y
{














r
e
g
=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
(
)
;












}
c
a
t
c
h

(
R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

e
)

{
}














r
e
g
.
t
h
e
u
s
e
r

=

r
s
.
g
e
t
S
t
r
i
n
g
(
1
)
;














r
e
g
.
b
a
l
a
n
c
e

=

r
s
.
g
e
t
D
o
u
b
l
e
(
2
)
;














a
r
.
a
d
d
(
r
e
g
)
;












}










r
s
.
c
l
o
s
e
(
)
;










c
l
i
e
n
t
.
u
p
d
a
t
e
R
e
s
u
l
t
s
(
a
r
)
;










}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{












S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
:

"
+
e
)
;












r
e
t
u
r
n
;










}










f
i
n
a
l
l
y

{












t
r
y
{














i
f
(
r
s

!
=

n
u
l
l
)

{
















r
s
.
c
l
o
s
e
(
)
;














}














i
f
(
p
s

!
=

n
u
l
l
)

{
















p
s
.
c
l
o
s
e
(
)
;























}














i
f
(
c
o
n

!
=

n
u
l
l
)

{
















c
o
n
.
c
l
o
s
e
(
)
;














}










}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

i
g
n
o
r
e
)

{
}








}






}

/
/
r
u
n




}
;




T
h
r
e
a
d

t

=

n
e
w

T
h
r
e
a
d
(
b
g
t
h
r
e
a
d
)
;




t
.
s
t
a
r
t
(
)
;


}
}
E
l

m

t
o
d
o

m
a
i
n

c
a
r
g
a

e
l

d
r
i
v
e
r

J
D
B
C
.

E
s
t
a

v
e
r
s
i

n

u
s
a

l
a

b
a
s
e

d
e

d
a
t
o
s

P
o
s
t
g
r
e
s
,

i
n
s
t
a
l
a

e
l

R
M
I
S
e
c
u
r
i
t
y
M
a
n
a
g
e
r
,

y

c
o
n
t
a
c
t
a

c
o
n

e
l

r
e
g
i
s
t
r
o

R
M
I

p
a
r
a

u
n
i
r

e
l

o
b
j
e
t
o

r
e
m
o
t
o
R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

a
l

n
o
m
b
r
e

r
e
g
i
s
t
r
a
t
i
o
n
2
.

N
o

n
e
c
e
s
i
t
a

u
n
i
r

e
l

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o
,

R
e
g
i
s
t
r
a
t
i
o
n

p
o
r
q
u
e

l
a

c
l
a
s
e

e
s

c
a
r
g
a
d
a

c
u
a
n
d
o

e
s

r
e
f
e
r
e
n
c
i
a
d
a

p
o
r

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
P
o
r

d
e
f
e
c
t
o
,

e
l

s
e
r
v
i
d
o
r

d
e

n
o
m
b
r
e
s

u
s
a

e
l

p
u
e
r
t
o

1
0
9
9
.

S
i

q
u
e
r
e
m
o
s

u
s
a
r

u
n

n

m
e
r
o

d
e

p
u
e
r
t
o

d
i
f
e
r
e
n
t
e
,

p
o
d
e
m
o
s

a

a
d
i
r
l
o

c
o
n

d
o
s

p
u
n
t
o
s

d
e

e
s
t
a

f
o
r
m
a
:

k
q
6
p
y
:
4
3
2
1
.

S
i

c
a
m
b
i
a
m
o
s
a
q
u


e
l

n

m
e
r
o

d
e

p
u
e
r
t
o
,

d
e
b
e
m
o
s

a
r
r
a
n
c
a
r

e
l

R
M
I

R
e
g
i
s
t
r
y

c
o
n

e
l

m
i
s
m
o

n

m
e
r
o

d
e

p
u
e
r
t
o
.
E
l

m

t
o
d
o

m
a
i
n

t
a
m
b
i

n

i
n
s
t
a
l
a

u
n

R
M
I
F
a
i
l
u
r
e
H
a
n
d
l
e
r
.

S
i

e
l

s
e
r
v
i
d
o
r

f
a
l
l
a

a
l

c
r
e
a
r

e
l

s
o
c
k
e
t

s
e
r
v
i
d
o
r
,

e
l

m
a
n
e
j
a
d
o
r

d
e

f
a
l
l
o
s

d
e
v
u
e
l
v
e

t
r
u
e

q
u
e

i
n
s
t
r
u
y
e

a
l

s
e
r
v
i
d
o
r

R
M
I

p
a
r
a

q
u
e
r
e
i
n
t
e
n
t
e

l
a

o
p
e
r
a
c
i

n
.


p
u
b
l
i
c

s
t
a
t
i
c

v
o
i
d

m
a
i
n
(
S
t
r
i
n
g
[
]

a
r
g
s
)
{





t
r
y

{








n
e
w

p
o
o
l
.
J
D
C
C
o
n
n
e
c
t
i
o
n
D
r
i
v
e
r
(
















"
p
o
s
t
g
r
e
s
q
l
.
D
r
i
v
e
r
"
,

















"
j
d
b
c
:
p
o
s
t
g
r
e
s
q
l
:
e
j
b
d
e
m
o
"
,
















"
p
o
s
t
g
r
e
s
"
,

"
p
a
s
s
"
)
;








}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)
{












S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(













"
e
r
r
o
r

i
n

l
o
a
d
i
n
g

J
D
B
C

d
r
i
v
e
r
"
)
;











S
y
s
t
e
m
.
e
x
i
t
(
1
)
;








}








t
r
y

{











P
r
o
p
e
r
t
i
e
s

e
n
v
=
S
y
s
t
e
m
.
g
e
t
P
r
o
p
e
r
t
i
e
s
(
)
;











e
n
v
.
p
u
t
(
"
j
a
v
a
.
r
m
i
.
s
e
r
v
e
r
.
c
o
d
e
b
a
s
e
"
,














"
h
t
t
p
:
/
/
p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m
/
r
e
g
i
s
t
r
a
t
i
o
n
"
)
;











R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

r
s
=














n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
(
)
;











i
f

(
S
y
s
t
e
m
.
g
e
t
S
e
c
u
r
i
t
y
M
a
n
a
g
e
r
(
)

=
=

n
u
l
l

)


{















S
y
s
t
e
m
.
s
e
t
S
e
c
u
r
i
t
y
M
a
n
a
g
e
r
(
















n
e
w

R
M
I
S
e
c
u
r
i
t
y
M
a
n
a
g
e
r
(
)
)
;











}











R
M
I
S
o
c
k
e
t
F
a
c
t
o
r
y
.
s
e
t
F
a
i
l
u
r
e
H
a
n
d
l
e
r
(
















n
e
w

R
M
I
F
a
i
l
u
r
e
H
a
n
d
l
e
r
I
m
p
l
(
)
)
;











N
a
m
i
n
g
.
r
e
b
i
n
d
(
"
















/
/
p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m
/
r
e
g
i
s
t
r
a
t
i
o
n
2
"
,
r
s
)
;








}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{











S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
E
x
c
e
p
t
i
o
n

t
h
r
o
w
n

"
+
e
)
;








}



}
}c
l
a
s
s

R
M
I
F
a
i
l
u
r
e
H
a
n
d
l
e
r
I
m
p
l









i
m
p
l
e
m
e
n
t
s

R
M
I
F
a
i
l
u
r
e
H
a
n
d
l
e
r

{



p
u
b
l
i
c

b
o
o
l
e
a
n

f
a
i
l
u
r
e
(
E
x
c
e
p
t
i
o
n

e
x

)
{






S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
e
x
c
e
p
t
i
o
n

"
+
e
x
+
"

c
a
u
g
h
t
"
)
;






r
e
t
u
r
n

t
r
u
e
;



}
}
I
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
E
l

i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n

d
e
c
l
a
r
a

l
o
s

m

t
o
d
o
s

i
m
p
l
e
m
e
n
t
a
d
o
s

p
o
r

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

e
n

e
l

f
i
c
h
e
r
o

f
u
e
n
t
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a
.
p
a
c
k
a
g
e

r
e
g
i
s
t
r
a
t
i
o
n
;
i
m
p
o
r
t

j
a
v
a
.
r
m
i
.
*
;
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
p
u
b
l
i
c

i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n

e
x
t
e
n
d
s

R
e
m
o
t
e

{


b
o
o
l
e
a
n

v
e
r
i
f
y
P
a
s
s
w
o
r
d
(
S
t
r
i
n
g

p
a
s
s
w
o
r
d
)
















t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;


S
t
r
i
n
g

g
e
t
E
m
a
i
l
A
d
d
r
e
s
s
(
)

t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;


S
t
r
i
n
g

g
e
t
U
s
e
r
(
)

t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;


i
n
t

a
d
j
u
s
t
A
c
c
o
u
n
t
(
d
o
u
b
l
e

a
m
o
u
n
t
)









t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;


d
o
u
b
l
e

g
e
t
B
a
l
a
n
c
e
(
)

t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;
}I
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
E
l

i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

d
e
c
l
a
r
a

l
o
s

m

t
o
d
o
s

i
m
p
l
e
m
e
n
t
a
d
o
s

p
o
r

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.

E
s
t
o
s

m

t
o
d
o
s

r
e
f
l
e
j
a
n

e
l

i
n
t
e
r
f
a
c
e

H
o
m
e

d
e
f
i
n
i
d
o

e
n

e
l

e
j
e
m
p
l
o

J
a
v
a
B
e
a
n
s

d
e
E
n
t
e
r
p
r
i
s
e
.

E
l

m

t
o
d
o

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s

t
o
m
a

u
n

i
n
t
e
r
f
a
c
e

r
e
m
o
t
o

c
o
m
o

s
u

n
i
c
o

p
a
r

m
e
t
r
o
.
p
a
c
k
a
g
e

r
e
g
i
s
t
r
a
t
i
o
n
;
i
m
p
o
r
t

j
a
v
a
.
r
m
i
.
*
;
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
p
u
b
l
i
c

i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

e
x
t
e
n
d
s

R
e
m
o
t
e

{


R
e
g
i
s
t
r
a
t
i
o
n
P
K

c
r
e
a
t
e
(
S
t
r
i
n
g

t
h
e
u
s
e
r
,









S
t
r
i
n
g

p
a
s
s
w
o
r
d
,









S
t
r
i
n
g

e
m
a
i
l
a
d
d
r
e
s
s
,









S
t
r
i
n
g

c
r
e
d
i
t
c
a
r
d
)

















t
h
r
o
w
s

C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
,

















R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;


R
e
g
i
s
t
r
a
t
i
o
n

f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(
R
e
g
i
s
t
r
a
t
i
o
n
P
K

t
h
e
u
s
e
r
)

















t
h
r
o
w
s

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
,

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;


p
u
b
l
i
c

v
o
i
d

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
(
R
e
t
u
r
n
R
e
s
u
l
t
s

r
r
)

















t
h
r
o
w
s

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
,

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;
}
I
n
t
e
r
f
a
c
e

R
e
t
u
r
n
R
e
s
u
l
t
s
E
l

i
n
t
e
r
f
a
c
e

R
e
t
u
r
n
R
e
s
u
l
t
s

d
e
c
l
a
r
a

e
l

m

t
o
d
o

i
m
p
l
e
m
e
n
t
a
d
o

p
o
r

l
a

c
l
a
s
e

S
e
l
l
e
r
B
e
a
n
.

E
l

m

t
o
d
o

u
p
d
a
t
e
R
e
s
u
l
t
s

e
s

l
l
a
m
a
d
o

d
e
s
d
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
p
a
c
k
a
g
e

r
e
g
i
s
t
r
a
t
i
o
n
;
i
m
p
o
r
t

j
a
v
a
.
r
m
i
.
*
;
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
p
u
b
l
i
c

i
n
t
e
r
f
a
c
e

R
e
t
u
r
n
R
e
s
u
l
t
s

e
x
t
e
n
d
s

R
e
m
o
t
e

{




p
u
b
l
i
c

v
o
i
d

u
p
d
a
t
e
R
e
s
u
l
t
s
(
A
r
r
a
y
L
i
s
t

r
e
s
u
l
t
s
)









t
h
r
o
w
s

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
,

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;
}
L
a

C
l
a
s
e

S
e
l
l
e
r
B
e
a
n
L
a

c
l
a
s
e

S
e
l
l
e
r
B
e
a
n

i
n
c
l
u
y
e

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e
l

m

t
o
d
o

c
a
l
l
b
a
c
k

y

l
l
a
m
a

a
l

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

u
s
a
n
d
o

R
M
I
.

E
l

m

t
o
d
o

u
p
d
a
t
e
A
c
c
o
u
n
t
s

s
e

h
a
c
e

a
c
c
e
s
i
b
l
e

m
e
d
i
a
n
t
e

u
n
a
l
l
a
m
a
d
a

a

U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
.
e
x
p
o
r
t
O
b
j
e
c
t
(
t
h
i
s
)
;
.

E
l

m

t
o
d
o

a
u
d
i
t
A
c
c
o
u
n
t
s

e
s
p
e
r
a

u
n

o
b
j
e
t
o

m
e
t
h
o
d

B
o
o
l
e
a
n
.
E
l

m

t
o
d
o

u
p
d
a
t
e
A
c
c
o
u
n
t
s

e
n
v

a

u
n
a

n
o
t
i
f
i
c
a
c
i

n

a

t
o
d
o
s

l
o
s

m

t
o
d
o
s

q
u
e

e
s
p
e
r
a
n

e
l

o
b
j
e
t
o

B
o
o
l
e
a
n

c
u
a
n
d
o

h
a

s
i
d
o

l
l
a
m
a
d
o

d
e
s
d
e

e
l

s
e
r
v
i
d
o
r

y

r
e
c
i
b
e

l
o
s

r
e
s
u
l
t
a
d
o
s
.
p
a
c
k
a
g
e

s
e
l
l
e
r
;
i
m
p
o
r
t

j
a
v
a
.
r
m
i
.
R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
;
i
m
p
o
r
t

j
a
v
a
.
r
m
i
.
*
;
i
m
p
o
r
t

j
a
v
a
x
.
e
j
b
.
*
;
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
i
m
p
o
r
t

j
a
v
a
.
t
e
x
t
.
N
u
m
b
e
r
F
o
r
m
a
t
;
i
m
p
o
r
t

j
a
v
a
.
i
o
.
S
e
r
i
a
l
i
z
a
b
l
e
;
i
m
p
o
r
t

j
a
v
a
x
.
n
a
m
i
n
g
.
*
;
i
m
p
o
r
t

a
u
c
t
i
o
n
.
*
;
i
m
p
o
r
t

r
e
g
i
s
t
r
a
t
i
o
n
.
*
;
i
m
p
o
r
t

j
a
v
a
.
r
m
i
.
s
e
r
v
e
r
.
U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
;
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
A
r
r
a
y
L
i
s
t
;
p
u
b
l
i
c

c
l
a
s
s

S
e
l
l
e
r
B
e
a
n









i
m
p
l
e
m
e
n
t
s

S
e
s
s
i
o
n
B
e
a
n
,

R
e
t
u
r
n
R
e
s
u
l
t
s

{




p
r
o
t
e
c
t
e
d

S
e
s
s
i
o
n
C
o
n
t
e
x
t

c
t
x
;




j
a
v
a
x
.
n
a
m
i
n
g
.
C
o
n
t
e
x
t

e
c
t
x
;




H
a
s
h
t
a
b
l
e

e
n
v

=

n
e
w

H
a
s
h
t
a
b
l
e
(
)
;




A
u
c
t
i
o
n
S
e
r
v
l
e
t

c
a
l
l
e
e
=
n
u
l
l
;




B
o
o
l
e
a
n

r
e
a
d
y
=
n
e
w

B
o
o
l
e
a
n
(
"
f
a
l
s
e
"
)
;




A
r
r
a
y
L
i
s
t

r
e
t
u
r
n
e
d
;




p
u
b
l
i
c

i
n
t

i
n
s
e
r
t
I
t
e
m
(
S
t
r
i
n
g

s
e
l
l
e
r
,









S
t
r
i
n
g

p
a
s
s
w
o
r
d
,









S
t
r
i
n
g

d
e
s
c
r
i
p
t
i
o
n
,









i
n
t

a
u
c
t
i
o
n
d
a
y
s
,









d
o
u
b
l
e

s
t
a
r
t
p
r
i
c
e
,









S
t
r
i
n
g

s
u
m
m
a
r
y
)

















t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{







t
r
y
{








R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
R
e
f

=

(
















R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
)
N
a
m
i
n
g
.
l
o
o
k
u
p
(
















"
/
/
p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m
/
r
e
g
i
s
t
r
a
t
i
o
n
2
"
)
;








R
e
g
i
s
t
r
a
t
i
o
n
P
K

r
p
k
=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
P
K
(
)
;








r
p
k
.
s
e
t
U
s
e
r
(
s
e
l
l
e
r
)
;








R
e
g
i
s
t
r
a
t
i
o
n

n
e
w
s
e
l
l
e
r

=

(














R
e
g
i
s
t
r
a
t
i
o
n
)
r
e
g
R
e
f
.
f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(
r
p
k
)
;








i
f
(
(
n
e
w
s
e
l
l
e
r

=
=

n
u
l
l
)

|
|















(
!
n
e
w
s
e
l
l
e
r
.
v
e
r
i
f
y
P
a
s
s
w
o
r
d
(
p
a
s
s
w
o
r
d
)
)
)

{












r
e
t
u
r
n
(
A
u
c
t
i
o
n
.
I
N
V
A
L
I
D
_
U
S
E
R
)
;








}








A
u
c
t
i
o
n
I
t
e
m
H
o
m
e

h
o
m
e

=

(
















A
u
c
t
i
o
n
I
t
e
m
H
o
m
e
)

e
c
t
x
.
l
o
o
k
u
p
(



































"
a
u
c
t
i
o
n
i
t
e
m
s
"
)
;








A
u
c
t
i
o
n
I
t
e
m

a
i
=

h
o
m
e
.
c
r
e
a
t
e
(
s
e
l
l
e
r
,

















d
e
s
c
r
i
p
t
i
o
n
,

















a
u
c
t
i
o
n
d
a
y
s
,

















s
t
a
r
t
p
r
i
c
e
,

















s
u
m
m
a
r
y
)
;








i
f
(
a
i

=
=

n
u
l
l
)

{










r
e
t
u
r
n

A
u
c
t
i
o
n
.
I
N
V
A
L
I
D
_
I
T
E
M
;








}
e
l
s
e
{










r
e
t
u
r
n
(
a
i
.
g
e
t
I
d
(
)
)
;









}








}
c
a
t
c
h
(
E
x
c
e
p
t
i
o
n

e
)
{











S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
i
n
s
e
r
t

p
r
o
b
l
e
m
=
"
+
e
)
;










r
e
t
u
r
n

A
u
c
t
i
o
n
.
I
N
V
A
L
I
D
_
I
T
E
M
;








}




}




p
u
b
l
i
c

v
o
i
d

u
p
d
a
t
e
R
e
s
u
l
t
s
(
j
a
v
a
.
u
t
i
l
.
A
r
r
a
y
L
i
s
t

a
r
)

















t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{







r
e
t
u
r
n
e
d
=
a
r
;








s
y
n
c
h
r
o
n
i
z
e
d
(
r
e
a
d
y
)

{










r
e
a
d
y
.
n
o
t
i
f
y
A
l
l
(
)
;







}




}




p
u
b
l
i
c

A
r
r
a
y
L
i
s
t

a
u
d
i
t
A
c
c
o
u
n
t
s
(
)

{








t
h
i
s
.
c
a
l
l
e
e
=
c
a
l
l
e
e
;








t
r
y

{











R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
R
e
f

=

(
















R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
)
N
a
m
i
n
g
.
l
o
o
k
u
p
(
















"
/
/
p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m
/
r
e
g
i
s
t
r
a
t
i
o
n
2
"
)
;











r
e
g
R
e
f
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
(
t
h
i
s
)
;











s
y
n
c
h
r
o
n
i
z
e
d
(
r
e
a
d
y
)

{














t
r
y

{

















r
e
a
d
y
.
w
a
i
t
(
)
;














}

c
a
t
c
h

(
I
n
t
e
r
r
u
p
t
e
d
E
x
c
e
p
t
i
o
n

e
)
{
}











}








r
e
t
u
r
n

(
r
e
t
u
r
n
e
d
)
;







}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{










S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
e
r
r
o
r

i
n

c
r
e
d
i
t
A
u
d
i
t

"
+
e
)
;







}






r
e
t
u
r
n

n
u
l
l
;




}




p
u
b
l
i
c

v
o
i
d

e
j
b
C
r
e
a
t
e
(
)

















t
h
r
o
w
s

j
a
v
a
x
.
e
j
b
.
C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
,

















R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{






e
n
v
.
p
u
t
(








j
a
v
a
x
.
n
a
m
i
n
g
.
C
o
n
t
e
x
t
.
I
N
I
T
I
A
L
_
C
O
N
T
E
X
T
_
F
A
C
T
O
R
Y
,









"
w
e
b
l
o
g
i
c
.
j
n
d
i
.
T
e
n
g
a
h
I
n
i
t
i
a
l
C
o
n
t
e
x
t
F
a
c
t
o
r
y
"
)
;






t
r
y
{








e
c
t
x

=

n
e
w

I
n
i
t
i
a
l
C
o
n
t
e
x
t
(
e
n
v
)
;






}

c
a
t
c
h

(
N
a
m
i
n
g
E
x
c
e
p
t
i
o
n

e
)

{








S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(










"
p
r
o
b
l
e
m

c
o
n
t
a
c
t
i
n
g

E
J
B

s
e
r
v
e
r
"
)
;








t
h
r
o
w

n
e
w

j
a
v
a
x
.
e
j
b
.
C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
(
)
;






}








P
r
o
p
e
r
t
i
e
s

e
n
v
=
S
y
s
t
e
m
.
g
e
t
P
r
o
p
e
r
t
i
e
s
(
)
;








e
n
v
.
p
u
t
(
"
j
a
v
a
.
r
m
i
.
s
e
r
v
e
r
.
c
o
d
e
b
a
s
e
"
,











"
h
t
t
p
:
/
/
p
h
o
e
n
i
x
.
e
n
g
.
s
u
n
.
c
o
m
/
r
e
g
i
s
t
r
a
t
i
o
n
"
)
;








e
n
v
.
p
u
t
(
"
j
a
v
a
.
s
e
c
u
r
i
t
y
.
p
o
l
i
c
y
"
,
"
j
a
v
a
.
p
o
l
i
c
y
"
)
;








U
n
i
c
a
s
t
R
e
m
o
t
e
O
b
j
e
c
t
.
e
x
p
o
r
t
O
b
j
e
c
t
(
t
h
i
s
)
;




}




p
u
b
l
i
c

v
o
i
d

s
e
t
S
e
s
s
i
o
n
C
o
n
t
e
x
t
(
S
e
s
s
i
o
n
C
o
n
t
e
x
t

c
t
x
)

















t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{






t
h
i
s
.
c
t
x

=

c
t
x
;




}




p
u
b
l
i
c

v
o
i
d

u
n
s
e
t
S
e
s
s
i
o
n
C
o
n
t
e
x
t
(
)

















t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{








c
t
x

=

n
u
l
l
;




}





p
u
b
l
i
c

v
o
i
d

e
j
b
R
e
m
o
v
e
(
)

{
}




p
u
b
l
i
c

v
o
i
d

e
j
b
A
c
t
i
v
a
t
e
(
)

t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{








S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
a
c
t
i
v
a
t
i
n
g

s
e
l
l
e
r

b
e
a
n
"
)
;




}




p
u
b
l
i
c

v
o
i
d

e
j
b
P
a
s
s
i
v
a
t
e
(
)

t
h
r
o
w
s

R
e
m
o
t
e
E
x
c
e
p
t
i
o
n

{









S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
p
a
s
s
i
v
a
t
i
n
g

s
e
l
l
e
r

b
e
a
n
"
)
;




}
}
_
_
_
_
_
_
_
1

C
u
a
n
d
o

s
e

u
s
a
n

e
n

t
o
d
a

e
s
t
a

s
i
t
e
,

l
o
s

t

r
m
i
n
o
s
,

"
J
a
v
a

v
i
r
t
u
a
l

m
a
c
h
i
n
e
"

o

"
J
V
M
"

s
i
g
n
i
f
i
c
a
n

u
n
a

m

q
u
i
n
a

v
i
r
t
u
a
l

d
e

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a
.
O
z
i
t
o
C
o
m
m
o
n

O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r

A
r
c
h
i
t
e
c
t
u
r
e

(
C
O
R
B
A
)
L
a
s

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

d
e

R
M
I

y

d
e

J
a
v
a
B
e
a
n
s

E
n
t
e
r
p
r
i
s
e

d
e

l
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a

u
s
a
n

e
l

l
e
n
g
u
a
j
e

J
a
v
a

p
a
r
a

i
m
p
l
e
m
e
n
t
a
r

l
o
s

d
i
s
t
i
n
t
o
s

s
e
r
v
i
c
i
o
s

d
e

l
a

s
u
b
a
s
t
a
.

S
i
n

e
m
b
a
r
g
o
,
p
o
d
r

a
m
o
s

n
e
c
e
s
i
t
a
r

i
n
t
e
r
g
r
a
r
l
o

c
o
n

a
p
l
i
c
a
c
i
o
n
e
s

e
s
c
r
i
t
a
s

e
n

C
,

C
+
+

u

o
t
r
o
s

l
e
n
g
u
a
j
e
s

y

e
j
e
c
u
t
a
r
l
o

e
n

u
n

m
i
l
l
a
r

d
e

s
i
s
t
e
m
a
s

o
p
e
r
a
t
i
v
o
s

y

m

q
u
i
n
a
s

d
i
s
t
i
n
t
a
s
.
U
n
a

f
o
r
m
a

d
e

i
n
t
e
g
r
a
c
i

n

c
o
n

o
t
r
a
s

a
p
l
i
c
c
i
o
n
e
s

e
s

t
r
a
n
s
m
i
t
i
r

d
a
t
o
s

e
n

u
n

f
o
r
m
a
t
o

c
o
m

n

c
o
m
o

c
a
r
a
c
t
e
r
e
s

d
e

8

b
i
t
s

s
o
b
r
e

s
o
c
k
e
t
s

T
C
P
/
I
P
.

L
a

d
e
s
v
e
n
t
a
j
a

e
s

t
e
n
e
r

q
u
e

g
a
s
t
a
r

m
u
c
h
o
t
i
e
m
p
o

e
n

d
e
r
i
v
a
r

u
n

m
e
n
s
a
j
e

d
e

p
r
o
t
o
c
o
l
o

y

m
a
p
e
a
d
o

d
e

v
a
r
i
a
s

e
s
t
r
u
c
t
u
r
a
s

d
e

d
a
t
o
s

h
a
c
i
a

y

d
e
s
d
e

e
l

f
o
r
m
a
t
o

d
e

t
r
a
n
s
m
i
s
i

n

c
o
m

n

p
a
r
a

q
u
e

l
o
s

d
a
t
o
s

p
u
e
d
a
n

s
e
r

e
n
v
i
a
d
o
s

y
r
e
c
i
b
i
d
o
s

s
o
b
r
e

l
a

c
o
n
e
x
i

n

T
C
P
/
I
P
.
A
q
u


e
s

d
o
n
d
e

p
u
e
d
e
n

a
y
u
d
a
r

e
l

"
C
o
m
m
o
n

O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r

A
r
c
h
i
t
e
c
t
u
r
e
"

(
C
O
R
B
A
)

y

s
u

"
I
n
t
e
r
f
a
c
e

D
e
f
i
n
i
t
i
o
n

L
a
n
g
u
a
g
e
"

(
I
D
L
)
.

I
D
L

p
r
o
p
o
r
c
i
o
n
a

u
n

f
o
r
m
a
t
o

c
o
m

n

p
a
r
a
r
e
p
r
e
s
e
n
t
a
r

u
n

o
b
j
e
t
o

q
u
e

p
u
e
d
e

s
e
r

d
i
s
t
r
i
b
u
i
d
o

a

o
t
r
a
s

a
p
l
i
c
a
c
i
o
n
e
s
.

L
a
s

o
t
r
a
s

a
p
l
i
c
a
c
i
o
n
e
s

p
o
d
r

a
n

i
n
c
l
u
s
o

n
o

e
n
t
e
n
d
e
r

d
e

o
b
j
e
t
o
s
,

p
e
r
o

m
i
e
n
t
r
a
s

p
u
e
d
a
n

p
r
o
p
o
r
c
i
o
n
a
r

u
n

m
a
p
e
a
d
o
e
n
t
r
e

e
l

f
o
r
m
a
t
o

c
o
m

n

I
D
L

y

s
u
s

p
r
o
p
i
a

r
e
p
r
e
s
e
n
t
a
c
i

n

d
e

d
a
t
o
s
,

l
a

a
p
l
i
c
a
c
i

n

p
o
d
r


c
o
m
p
a
r
t
i
r

l
o
s

d
a
t
o
s
.
E
s
t
e

c
a
p

t
u
l
o

d
e
s
c
r
i
b
e

e
l

e
s
q
u
e
m
a

d
e

m
a
p
e
o

d
e

I
D
L

a

l
e
n
g
u
a
j
e

J
a
v
a
,

y

c

m
o

r
e
e
m
p
l
a
z
a
r

e
l

o
r
i
g
i
n
a
l

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

b
a
s
a
d
o

e
n

c
o
n
t
e
n
e
d
o
r

c
o
n
t
r
o
l
a
d
o
r

p
o
r

s
u

e
q
u
i
v
a
l
e
n
t
e

s
e
r
v
i
d
o
r
C
O
R
B
A
.

L
o
s

p
r
o
g
r
a
m
a
s

S
e
l
l
e
r
B
e
a
n
.
j
a
v
a

y

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
j
a
v
a

t
a
m
b
i

n

s
e

m
o
d
i
f
i
c
a
n

p
a
r
a

i
n
t
e
r
o
p
e
r
a
r

c
o
n

e
l

p
r
o
g
r
a
m
a

C
O
R
B
A

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
E
s
q
u
e
m
a

d
e

M
a
p
e
o

I
D
L
R
e
f
e
r
e
n
c
i
a

R

p
i
d
a




C
o
n
f
i
g
u
r
a
r

M
a
p
e
o
s

I
D
L




O
t
r
o
s

T
i
p
o
s

I
D
L




C
O
R
B
A

e
n

l
a

A
p
l
i
c
a
c
i

n

S
u
b
a
s
t
a
C
O
R
B
A

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r




F
i
c
h
e
r
o

d
e

M
a
p
e
o
s

I
D
L




C
o
m
p
i
l
a
r

e
l

F
i
c
h
e
r
o

d
e

M
a
p
e
o
s

I
D
L




F
i
c
h
e
r
o
s

S
t
u
b

y

S
k
e
l
e
t
o
n




O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r

(
O
R
B
)
P
o
n
e
r

D
i
s
p
o
n
i
b
l
e

e
l

S
e
r
v
i
d
o
r

C
O
R
B
A




C
o
n
e
c
t
a
r

u
n

N
u
e
v
o

O
R
B




A
c
c
e
s
o

a
l

S
e
r
v
i
c
i
o

d
e

N
o
m
b
r
e
s

p
o
r

C
l
i
e
n
t
e
s

C
O
R
B
A




C
l
a
s
e
s

H
e
l
p
e
r

y

H
o
l
d
e
r




R
e
c
o
l
e
c
c
i

n

d
e

B
a
s
u
r
a




C
O
R
B
A

C
a
l
l
b
a
c
k
s




U
s
a
r

e
l

T
i
p
o

A
n
y




C
o
n
c
l
u
s
i




E
s
q
u
e
m
a

d
e

M
a
p
e
o

I
D
L
M
u
c
h
o
s

l
e
n
g
u
a
j
e
s

d
e

p
r
o
g
r
a
m
a
c
i

n

p
r
o
p
o
r
c
i
o
n
a
n

u
n

m
a
p
e
o

e
n
t
r
e

s
u
s

t
i
p
o
s

d
e

d
a
t
o
s

y

e
l

f
o
r
m
a
t
o

c
o
m

n

d
e
n
o
m
i
n
a
d
o

I
D
L
,

y

e
l

l
e
n
g
u
a
j
e

J
a
v
a

n
o

e
s

u
n
a

e
x
c
e
p
c
i

n
.

E
l

l
e
n
g
u
a
j
e

J
a
v
a
p
u
e
d
e

e
n
v
i
a
r

o
b
j
e
t
o
s

d
e
f
i
n
i
d
o
s

p
o
r

I
D
L

a

o
t
r
a
s

a
p
l
i
c
a
c
i
o
n
e
s

d
i
s
t
r
i
b
u
i
d
a
s

C
O
R
B
A

y

r
e
c
i
b
i
r

o
b
j
e
t
o
s

d
e
f
i
n
i
d
o
s

m
e
d
i
a
n
t
e

I
D
L

d
e
s
d
e

o
t
r
a
s

a
p
l
i
c
a
c
i
o
n
e
s

d
i
s
t
r
i
b
u
i
d
a
s

C
O
R
B
A
.
E
s
t
a

s
e
c
c
i

n

d
e
s
c
r
b
i
e

e
l

e
s
q
u
e
m
a

d
e

m
a
p
e
d
o

d
e

J
a
v
a

a

I
D
L

y
,

c
u
a
n
d
o

s
e
a

n
e
c
e
s
a
r
i
o
,

p
r
e
s
e
n
t
a

p
r
o
b
l
e
m
a
s

q
u
e

d
e
b
e
m
o
s

t
e
n
e
r

e
n

c
o
n
s
i
d
e
r
a
c
i

n
.
R
e
f
e
r
e
n
c
i
a

R

p
i
d
a
A
q
u


t
e
n
e
m
o
s

u
n
a

t
a
b
l
a

d
e

r
e
f
e
r
e
n
c
i
a

r

p
i
d
a

d
e

l
o
s

t
i
p
o
s

d
e

d
a
t
o
s

d
e
l

l
e
n
g
u
a
j
e

J
a
v
a

y

l
o
s

d
e

I
D
L

C
O
R
B
A
,

y

l
a
s

e
x
c
e
p
c
i
o
n
e
s

d
e

t
i
e
m
p
o

d
e

e
j
e
c
u
c
i

n

q
u
e

s
e

p
u
e
d
e
n

l
a
n
z
a
r

c
u
a
n
d
o

l
a
c
o
n
v
e
r
s
i

n

f
a
l
l
a
.

L
o
s

t
i
p
o
s

d
e

d
a
t
o
s

d
e

e
s
t
a

t
a
b
l
a

q
u
e

n
e
c
e
s
i
t
a
n

e
x
p
l
i
c
a
c
i

n

s
e

c
u
b
r
e
n

m

s

a
b
a
j
o
.
T
i
p
o

d
e

D
a
t
o

J
a
v
a
F
o
r
m
a
t
o

I
D
L
E
x
c
e
p
t
i
o
n
b
y
t
e
o
c
t
e
t
b
o
o
l
e
a
n
b
o
o
l
e
a
n
c
h
a
r
c
h
a
r
D
A
T
A
_
C
O
N
V
E
R
S
I
O
N
c
h
a
r
w
c
h
a
r
d
o
u
b
l
e
d
o
u
b
l
e
f
l
o
a
t
f
l
o
a
t
i
n
t
l
o
n
g
i
n
t
u
n
s
i
g
n
e
d

l
o
n
g
l
o
n
g
l
o
n
g

l
o
n
g
l
o
n
g
u
n
s
i
g
n
e
d

l
o
n
g

l
o
n
g
s
h
o
r
t
s
h
o
r
t
s
h
o
r
t
u
n
s
i
g
n
e
d

s
h
o
r
t
j
a
v
a
.
l
a
n
g
.
S
t
r
i
n
g
s
t
r
i
n
g
D
A
T
A
_
C
O
N
V
E
R
S
I
O
N
j
a
v
a
.
l
a
n
g
.
S
t
r
i
n
g
w
s
t
r
i
n
g
M
A
R
S
H
A
L
V
a
l
o
r
e
s

s
i
n

S
i
g
n
o
:

L
o
s

t
i
p
o
s

d
e

d
a
t
o
s

J
a
v
a
:

b
y
t
e
,
s
h
o
r
t
,
i
n
t
,

y

l
o
n
g

e
s
t

n

r
e
p
r
e
s
e
n
t
a
d
o
s

p
o
r

e
n
t
e
r
e
r
o
s

d
e

c
o
m
p
l
e
m
e
n
t
o

a

d
o
s

d
e

8
,

1
6
,

3
2

y

6
4

b
i
t
s
.

E
s
t
o

s
i
g
n
i
f
i
c
a

q
u
e

u
n

v
a
l
o
r

s
h
o
r
t
J
a
v
a

r
e
p
r
e
s
e
n
t
a

u
n

r
a
n
g
o

d
e
s
d
e

-
2
1
5

h
a
s
t
a

2
1
5

-

1


d
e
s
d
e

-
3
2
7
6
8

h
a
s
t
a

3
2
7
6
7

i
n
c
l
u
s
i
v
e
s
.

E
l

t
i
p
o

c
o
n

s
i
g
n
o

e
q
u
i
v
a
l
e
n
t
e

I
D
L

p
a
r
a

u
n

s
h
o
r
t
,

s
h
o
r
t
,

e
s

i
g
u
a
l

e
n

e
l

r
a
n
g
o
,

p
e
r
o

e
l

t
i
p
o
s
h
o
r
t

I
D
L

s
i
n

s
i
g
n
o

u
s
a

e
l

r
a
n
g
o

d
e
s
d
e

0

h
a
t
a

2
1
5


d
e
s
d
e

0

h
a
s
t
a

6
5
5
3
5
.
E
s
t
o

s
i
g
n
i
f
i
c
a

q
u
e

e
n

e
l

c
a
s
o

d
e

s
h
o
r
t
,

s
i

u
n

v
a
l
o
r

s
h
o
r
t

s
i
n

s
i
g
n
o

m
a
y
o
r

d
e

3
2
7
6
7

e
s

p
a
s
a
d
o

a

u
n

p
r
o
g
r
a
m
a

e
s
c
r
i
t
o

e
n

J
a
v
a
,

e
l

v
a
l
o
r

s
h
o
r
t

s
e
r


r
e
p
r
e
s
e
n
t
a
d
o

c
o
m
o

u
n

n

m
e
r
o
n
e
g
a
t
i
v
o
.

E
s
t
o

p
u
e
d
e

c
a
u
s
a
r

c
o
n
f
u
s
i

n

e
n

l
o
s

l

m
i
t
e
s

d
e

t
e
s
t

p
a
r
a

v
a
l
o
r
e
s

m
a
y
o
r
e
s

q
u
e

3
2
7
6
7

o

m
e
n
o
r
e
s

q
u
e

0
.
T
i
p
o
s

c
h
a
r

I
D
L
:

E
l

l
e
n
g
u
a
j
e

J
a
v
a

u
s
a

u
n

u
n
i
c
o
d
e

d
e

1
6

B
i
t
s
,

p
e
r
o

l
o
s

t
i
p
o
s

c
h
a
r

y

s
t
r
i
n
g

d
e

I
D
L

s
o
n

c
a
r
c
a
t
e
r
e
s

d
e

8

b
i
t
s
.

P
o
d
e
m
o
s

m
a
p
e
a
r

u
n

c
h
a
r

J
a
v
a

a

u
n

c
h
a
r

I
D
L

d
e

8

b
i
t
s

p
a
r
a
t
r
a
n
s
m
i
t
i
r

c
a
r
a
c
t
e
r
e
s

m
u
l
t
i
-
b
y
t
e

s
i

u
s
a
m
o
s

u
n

a
r
r
a
y

p
a
r
a

h
a
c
e
r
l
o
.

S
i
n

e
m
b
a
r
g
o
,

e
l

t
i
p
o

d
e

c
a
r
a
c
t
e
r

a
n
c
h
o

d
e

I
D
L

w
c
h
a
r

e
s
t


e
s
p
e
c
i
a
l
m
e
n
t
e

d
i
s
e

a
d
o

p
a
r
a

l
e
n
g
u
a
j
e
s

c
o
n

c
a
r
a
c
t
e
r
e
s
m
u
l
t
i
-
b
y
t
e
s

y

a
l
o
j
a

e
l

n

m
e
r
o

f
i
j
o

d
e

b
y
t
e
s

q
u
e

s
e
a

n
e
c
e
s
a
r
i
o

p
a
r
a

c
o
n
t
e
n
e
r

e
l

c
o
n
j
u
n
t
o

d
e
l

l
e
n
g
u
a
j
e

p
a
r
a

c
a
d
a

u
n
a

d
e

l
a
s

l
e
t
r
a
s
.
C
u
a
n
d
o

s
e

m
a
p
e
a

d
e
s
d
e

e
l

t
i
p
o

c
h
a
r

d
e

J
a
v
a

a
l

t
i
p
o

c
h
a
r

d
e

I
D
L
,

s
e

p
u
e
d
e

l
a
n
z
a
r

l
a

e
x
c
e
p
c
i

n

D
A
T
A
_
C
O
N
V
E
R
S
I
O
N

s
i

e
l

c
a
r
a
c
t
e
r

n
o

e
n
t
r
a

e
n

l
o
s

8

b
i
t
s
.
T
i
p
o
s

s
t
r
i
n
g

I
D
L
:

E
l

t
i
p
o

s
t
r
i
n
g

I
D
L

p
u
e
d
e

s
e
r

l
a
n
z
a
d
o

c
o
m
o

u
n
a

s
e
c
u
e
n
c
i
a

d
e

t
i
p
o
s

c
h
a
r

I
D
L
,

t
a
m
b
i

n

l
a
n
z
a

l
a

e
x
c
e
p
c
i

n

D
A
T
A
_
C
O
N
V
E
R
S
I
O
N
.

E
l

t
i
p
o

w
s
t
r
i
n
g

I
D
L

e
s

e
q
u
i
v
a
l
e
n
t
e

a
u
n
a

s
e
c
u
e
n
c
u
a

d
e

w
c
h
a
r
s

t
e
r
m
i
n
a
d
a

p
o
r

u
n

w
c
h
a
r

N
U
L
L
.
U
n

t
i
p
o

s
t
r
i
n
g

y

u
n

t
i
p
o

w
s
t
r
i
n
g

d
e

I
D
L

p
u
e
d
e
n

t
e
n
e
r

u
n

t
a
m
a

o

f
i
j
o

o

s
i
n

m

x
i
m
o

d
e
f
i
n
i
d
o
.

S
i

i
n
t
e
n
t
a
m
o
s

m
a
p
e
a
r

u
n

j
a
v
a
.
l
a
n
g
.
S
t
r
i
n
g

a

u
n

s
t
r
i
n
g

I
D
L

d
e

t
a
m
a

o

f
i
j
o

y

e
l
j
a
v
a
.
l
a
n
g
.
S
t
r
i
n
g

e
s

d
e
m
a
s
i
d
a
d
o

l
a
r
g
o
,

s
e

l
a
n
z
a
r


u
n
a

e
x
c
e
p
c
i

n

M
A
R
S
H
A
L
.
C
o
n
f
i
g
u
r
a
r

e
l

M
a
p
e
o

I
D
L
E
l

m
a
p
e
o

d
e
l

l
e
n
g
u
a
j
e

J
a
v
a

a

I
D
L

s
e

s
i
t

a

e
n

u
n

f
i
c
h
e
r
o

c
o
n

e
x
t
e
n
s
i

n

.
i
d
l
.

E
l

f
i
c
h
e
r
o

e
s

c
o
m
p
i
l
a
d
o

p
a
r
a

q
u
e

p
u
e
d
a

s
e
r

a
c
c
e
d
i
d
o

p
o
r

l
o
s

p
r
o
g
r
a
m
a
s

C
O
R
B
A

q
u
e

n
e
c
e
s
i
t
a
n

e
n
v
i
a
r

y

r
e
c
i
b
i
r
d
a
t
o
s
.

E
s
t
a

s
e
c
c
i

n

e
x
p
l
i
c
a

c

m
o

c
o
n
s
t
r
u
i
r

l
o
s

m
a
p
e
o
s

p
a
r
a

l
a
s

s
e
n
t
e
n
c
i
a
s

d
e

p
a
q
u
e
t
e

y

l
o
s

t
i
p
o
s

d
e

d
a
t
o
s

J
a
v
a
.

L
a

s
i
g
u
i
e
n
t
e

s
e
c
c
i

n

e
n

I
m
p
l
e
m
e
n
t
a
c
i

n

C
O
R
B
A

d
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
d
e
s
c
r
i
b
e

c

m
o

u
s
a
r

e
s
t
a

i
n
f
o
r
m
a
c
i

n

p
a
r
a

c
o
n
f
i
g
u
r
a
r

e
l

f
i
c
h
e
r
o

d
e

m
a
p
e
o

I
D
L

p
a
r
a

e
l

s
e
r
v
i
d
o
r

R
e
g
i
s
t
r
a
t
i
o
n

C
O
R
B
A
.
P
a
q
u
e
t
e
s

e

I
n
t
e
r
f
a
c
e
s

J
a
v
a
:

L
a
s

s
e
n
t
e
n
c
i
a
s

d
e

p
a
q
u
e
t
e

J
a
v
a

s
o
n

e
q
u
i
v
a
l
e
n
t
e
s

a
l

t
i
p
o

m
o
d
u
l
e

d
e

I
D
L
.

E
s
t
e

t
i
p
o

p
u
e
d
e

s
e
r

a
n
i
d
a
d
o
,

l
o

q
u
e

r
e
s
u
l
t
a

e
n

q
u
e

l
a
s

c
l
a
s
e
s

J
a
v
a

g
e
n
e
r
a
d
a
s

s
e
c
r
e
a
n

e
n

s
u
b
d
i
r
e
c
t
o
r
i
o
s

a
n
i
d
a
d
o
s
.
P
o
r

e
j
e
m
p
l
o
,

s
i

u
n

p
r
o
g
r
a
m
a

C
O
R
B
A

c
o
n
t
i
e
n
e

e
s
t
a

s
e
n
t
e
n
c
i
a

d
e

p
a
q
u
e
t
e
:


p
a
c
k
a
g
e

r
e
g
i
s
t
r
a
t
i
o
n
;
e
l

f
i
c
h
e
r
o

d
e

m
a
p
e
o

d
e
b
e
r

a

t
e
n
e
r

e
s
t
e

m
a
p
e
o

a

m

d
u
l
o

I
D
L

p
a
r
a

e
l
l
a
:


m
o
d
u
l
e

r
e
g
i
s
t
r
a
t
i
o
n

{


}
;
S
i

u
n

p
r
o
g
r
a
m
a

C
O
R
B
A

c
o
n
t
i
e
n
e

u
n
a

h
e
r
e
n
c
i
a

d
e

p
a
q
u
e
t
e

c
o
m
o

e
s
t
a
:


p
a
c
k
a
g
e

r
e
g
i
s
t
r
a
t
i
o
n
.
c
o
r
b
a
;
s
u

m
a
p
e
o

I
D
L

d
e

m

d
u
l
o

s
e
r


e
s
t
e
:


m
o
d
u
l
e

r
e
g
i
s
t
r
a
t
i
o
n

{




m
o
d
u
l
e

c
o
r
b
a

{




}
;


}
;
L
a
s

c
l
a
s
e
s

d
i
s
t
r
i
b
u
i
d
a
s

e
s
t

n

d
e
f
i
n
i
d
a
s

c
o
m
o

i
n
t
e
r
f
a
c
e
s

J
a
v
a

y

s
e

m
a
p
e
a
n

a
l

t
i
p
o

i
n
t
e
r
f
a
c
e

d
e

I
D
L
.

I
D
L

n
o

d
e
f
i
n
e

a
c
c
e
s
o
s

c
o
m
o

p
u
b
l
i
c

o

p
r
i
v
a
t
e

q
u
e

p
o
d
r

a
m
o
s

e
n
c
o
n
t
r
a
r

e
n

e
l

l
e
n
g
u
a
j
e
J
a
v
a
,

p
e
r
o

p
e
r
m
i
t
e

d
e
s
c
e
n
d
e
r

d
e
s
d
e

o
t
r
o
s

i
n
t
e
r
f
a
c
e
s
.
E
s
t
e

e
j
e
m
p
l
o

a

a
d
e

e
l

i
n
t
e
r
f
a
c
e

J
a
v
a

R
e
g
i
s
t
r
a
t
i
o
n

a

u
n

r
e
g
i
s
t
r
a
t
i
o
n

m
o
d
u
l
e

I
D
L
.


m
o
d
u
l
e

r
e
g
i
s
t
r
a
t
i
o
n

{





i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n

{





}
;


}
E
s
t
e

e
j
e
m
p
l
o

a

a
d
e

e
l

i
n
t
e
r
f
a
c
e

J
a
v
a

R
e
g
i
s
t
r
a
t
i
o
n

a

u
n

r
e
g
i
s
t
r
a
t
i
o
n

m
o
d
u
l
e

I
D
L
,

e

i
n
d
i
c
a

q
u
e

e
l

i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n

d
e
s
c
i
e
n
d
e

d
e
l

i
n
t
e
r
f
a
c
e

U
s
e
r
.


m
o
d
u
l
e

r
e
g
i
s
t
r
a
t
i
o
n

{





i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
:

U
s
e
r

{





}
;


}
M

t
o
d
o
s

J
a
v
a
:

L
o
s

m

t
o
d
o
s

J
a
v
a

s
e

m
a
p
e
a
n

a

o
p
e
r
a
c
i
o
n
e
s

I
D
L
.

L
a
s

o
p
e
r
a
c
i
o
n
e
s

I
D
L

s
o
n

s
i
m
i
l
a
r
e
s

a

l
o
s

m

t
o
d
o
s

J
a
v
a

e
x
c
e
p
t
o

e
n

q
u
e

n
o

h
a
y

e
l

c
o
n
c
e
p
t
o

d
e

c
o
n
t
r
o
l

d
e

a
c
c
e
s
o
.
T
a
m
b
i

n

t
e
n
e
m
o
s

q
u
e

a
y
u
d
a
r

a
l

c
o
m
p
i
l
a
d
o
r

I
D
L

e
s
p
e
c
i
f
i
c
a
n
d
o

q
u


p
a
r

m
e
t
r
o
s

s
o
n

d
e

e
n
t
r
a
d
a

i
n
,

d
e

e
n
t
r
a
d
a
/
s
a
l
i
d
a

i
n
o
u
t

o

d
e

s
a
l
i
d
a

o
u
t
,

d
e
f
i
n
i
d
o
s

d
e

e
s
t
a

f
o
r
m
a
:
i
n

-

E
l

p
a
r

m
e
t
r
o

s
e

p
a
s
a

d
e
n
t
r
o

d
e
l

m

t
o
d
o

p
e
r
o

n
o

s
e

m
o
d
i
f
i
c
a
.




i
n
o
u
t

-

E
l

p
a
r

m
e
t
r
o

s
e

p
a
s
a

a
l

m

t
o
d
o

y

s
e

p
o
d
r

a

d
e
v
o
l
v
e
r

m
o
d
i
f
i
c
a
d
o
.




o
u
t

-

E
l

p
a
r

m
e
t
r
o

s
e

p
o
d
r

a

d
e
v
o
l
v
e
r

m
o
d
i
f
i
c
a
d
o
.




E
s
t
e

m
a
p
e
o

I
D
L

i
n
c
l
u
y
e

l
o
s

m

t
o
d
o
s

d
e

l
o
s

i
n
t
e
r
f
a
c
e
s

R
e
g
i
s
t
r
a
t
i
o
n

y

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

a

o
p
e
r
a
c
i
o
n
e
s

I
D
L

u
s
a
n
d
o

u
n

t
i
p
o

m

d
u
l
o

I
D
L
.
m
o
d
u
l
e

r
e
g
i
s
t
r
a
t
i
o
n

{


i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n

{




b
o
o
l
e
a
n

v
e
r
i
f
y
P
a
s
s
w
o
r
d
(
i
n

s
t
r
i
n
g

p
a
s
s
w
o
r
d
)
;




s
t
r
i
n
g

g
e
t
E
m
a
i
l
A
d
d
r
e
s
s
(
)
;




s
t
r
i
n
g

g
e
t
U
s
e
r
(
)
;




l
o
n
g

a
d
j
u
s
t
A
c
c
o
u
n
t
(
i
n

d
o
u
b
l
e

a
m
o
u
n
t
)
;




d
o
u
b
l
e

g
e
t
B
a
l
a
n
c
e
(
)
;


}
;


i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

{




R
e
g
i
s
t
r
a
t
i
o
n

f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(



















i
n

R
e
g
i
s
t
r
a
t
i
o
n
P
K

t
h
e
u
s
e
r
)




















r
a
i
s
e
s

(
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
)
;


}
}
A
r
r
a
y
s

J
a
v
a
:

L
o
s

A
r
r
a
y
s

J
a
v
a

s
o
n

m
a
p
e
a
d
o
s

a

l
o
s

t
i
p
o
s

a
r
r
a
y

o

s
e
q
u
e
n
c
e

I
D
L

u
s
a
n
d
o

u
n
a

d
e
f
i
n
i
c
i

n

d
e

t
i
p
o
.
E
s
t
e

e
j
e
m
p
l
o

m
a
p
e
a

e
l

a
r
r
a
y

J
a
v
a

d
o
u
b
l
e

b
a
l
a
n
c
e
s
[
1
0
]

a

u
n

t
i
p
o

a
r
r
a
y

I
D
L

d
e
l

m
i
s
m
o

t
a
m
a

o
.
t
y
p
e
d
e
f

d
o
u
b
l
e

b
a
l
a
n
c
e
s
[
1
0
]
;
E
s
t
o
s

e
j
e
m
p
l
o

m
a
p
e
a
n

e
l

a
r
r
a
y

J
a
v
a

d
o
u
b
l
e

b
a
l
a
n
c
e
s
[
1
0
]

a

u
n

t
i
p
o

s
e
q
u
e
n
c
e

I
D
L
.

E
l

p
r
i
m
e
r

t
y
p
e
d
e
f

s
e
q
u
e
n
c
e

e
s

u
n

e
j
e
m
p
l
o

d
e

s
e
c
u
e
n
c
i
a

s
i
n

l

m
i
t
e
,

y

e
l

s
e
g
u
n
d
o

t
i
e
n
e

e
l

m
i
s
m
o
t
a
m
a

o

q
u
e

e
l

a
r
r
a
y
.
t
y
p
e
d
e
f

s
e
q
u
e
n
c
e
<
d
o
u
b
l
e
>

b
a
l
a
n
c
e
s
;
t
y
p
e
d
e
f

s
e
q
u
e
n
c
e
<
d
o
u
b
l
e
,
1
0
>

b
a
l
a
n
c
e
s
;
E
x
c
e
p
c
i
o
n
e
s

J
a
v
a
:

L
a
s

e
x
c
e
p
c
i
o
n
e
s

J
a
v
a

s
o
n

m
a
p
e
a
d
a
s

a

e
x
c
e
p
c
i
o
n
e
s

I
D
L
.

L
a
s

o
p
e
r
a
c
i
o
n
e
s

u
s
a
n

e
x
c
e
p
t
i
o
n
s

I
D
L

e
s
p
e
c
i
f
i
c

n
d
o
l
a
s

c
o
m
o

d
e
l

t
i
p
o

r
a
i
s
e
s
.
E
s
t
e

e
j
e
m
p
l
o

m
a
p
e
a

l
a

C
r
e
a
t
e
E
x
c
e
p
t
i
o
n

d
e
s
d
e

l
a

a
p
l
i
c
a
c
i

n

s
u
b
a
s
t
a
s

a
l

t
i
p
o

e
x
c
e
p
t
i
o
n

I
D
L
,

y

l
e

a

a
d
e

e
l

t
i
p
o

r
a
i
s
e
s

a

l
a

o
p
e
r
a
c
i

n
.

L
a
s

e
x
c
e
p
c
i
o
n
e
s

I
D
L

s
i
g
u
e
n

l
a
s

s
i
n
t
a
x
i
s

C
+
+
,

p
o
r
e
s
o

e
n

l
u
g
a
r

d
e

l
a
n
z
a
r

u
n
a

e
x
c
e
p
c
i

n

(
c
o
m
o

s
e

h
a
r

a

e
n

l
e
n
g
u
a
j
e

J
a
v
a
)
,

l
a

o
p
e
r
a
c
i

n

a
l
c
a
n
z
a

(
r
a
i
s
e
)

u
n
a

e
x
c
e
p
c
i

n
.
e
x
c
e
p
t
i
o
n

C
r
e
a
t
e
E
x
c
e
p
t
i
o
n

{
}
;
i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

{


R
e
g
i
s
t
r
a
t
i
o
n
P
K

c
r
e
a
t
e
(



















i
n

s
t
r
i
n
g

t
h
e
u
s
e
r
,




















i
n

s
t
r
i
n
g

p
a
s
s
w
o
r
d
,




















i
n

s
t
r
i
n
g

e
m
a
i
l
a
d
d
r
e
s
s
,




















i
n

s
t
r
i
n
g

c
r
e
d
i
t
c
a
r
d
)




















r
a
i
s
e
s

(
C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
)
;
}
O
t
r
o
s

T
i
p
o
s

I
D
L
E
s
t
o
s

o
t
r
o
s

t
i
p
o
s

b

s
i
c
o
s

I
D
L

n
o

t
i
e
n
e
n

u
n

e
q
u
i
v
a
l
e
n
t
e

e
x
a
c
t
o

e
n

e
l

l
e
n
g
u
a
j
e

J
a
v
a
.

M
u
c
h
o
s

d
e

e
s
t
o
s

d
e
b
e
r

a
n

s
e
r
n
o
s

f
a
m
i
l
i
a
r
e
s

s
i

h
e
m
o
s

u
s
a
d
o

C


C
+
+
.

E
l

l
e
n
g
u
a
j
e

J
a
v
a

p
r
o
p
o
r
c
i
o
n
a
m
a
p
e
o

p
a
r
a

e
s
t
o
s

t
i
p
o
s

p
o
r
q
u
e

l
o
s

p
r
o
g
r
a
m
a
s

e
s
c
r
i
t
o
s

e
n

J
a
v
a

p
u
e
d
e
n

r
e
c
i
b
i
r

d
a
t
o
s

d
e
s
d
e

p
r
o
g
r
a
m
a
s

e
s
c
r
i
t
o
s

e
n

C


C
+
+
.
a
t
t
r
i
b
u
t
e

I
D
L




e
n
u
m

I
D
L




s
t
r
u
c
t

I
D
L




u
n
i
o
n

I
D
L




A
n
y

I
D
L




P
r
i
n
c
i
p
a
l

I
D
L




O
b
j
e
c
t

I
D
L




a
t
r
i
b
u
t
o

I
D
L
:

E
l

t
i
p
o

a
t
t
r
i
b
u
t
e

I
D
L

e
s

s
i
m
i
l
i
a
r

a

l
o
s

m

t
o
d
o
s

g
e
t

y

s
e
t

u
s
a
d
o
s

p
a
r
a

a
c
c
e
d
e
r

a

l
o
s

c
a
m
p
o
s

e
n

e
l

s
o
f
t
w
a
r
e

d
e

J
a
v
a
B
e
a
n
s
.
E
n

e
l

c
a
s
o

d
e

u
n

v
a
l
o
r

d
e
c
l
a
r
a
d
o

c
o
m
o

u
n

a
t
r
i
b
u
t
o

I
D
L
,

e
l

c
o
m
p
i
l
a
d
o
r

I
D
L

g
e
n
e
r
a

d
o
s

m

t
o
d
o
s

c
o
n

e
l

m
i
s
m
o

n
o
m
b
r
e

q
u
e

e
l

a
t
r
i
b
u
t
o

I
D
L
.

U
n

m

t
o
d
o

d
e
v
u
e
l
v
e

e
l

c
a
m
p
o

y

o
t
r
o

l
o
s
e
l
e
c
c
i
o
n
a
.

P
o
r

e
j
e
m
p
l
o
,

e
s
t
e

t
i
p
o

a
t
t
r
i
b
u
t
e
:
i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
P
K

{


a
t
t
r
i
b
u
t
e

s
t
r
i
n
g

t
h
e
u
s
e
r
;
}
;
d
e
f
i
n
e

e
s
t
o
s

m

t
o
d
o
s
:
/
/
r
e
t
u
r
n

u
s
e
r


S
t
r
i
n
g

t
h
e
u
s
e
r
(
)
;

/
/
s
e
t

u
s
e
r


v
o
i
d

t
h
e
u
s
e
r
(
S
t
r
i
n
g

a
r
g
)
;

e
n
u
m

I
D
L
:

E
l

l
e
n
g
u
a
j
e

J
a
v
a

t
i
e
n
e

u
n
a

c
l
a
s
e

E
n
u
m
e
r
a
t
i
o
n

p
a
r
a

r
e
p
r
e
s
e
n
t
a
r

u
n
a

c
o
l
e
c
c
i

n

d
e

d
a
t
o
s
.

E
l

t
i
p
o

e
n
u
m

I
D
L

e
s

d
i
f
e
r
e
n
t
e

p
o
r
q
u
e

e
s

d
e
c
l
a
r
a
d
o

c
o
m
o

u
n

t
i
p
o

d
e

d
a
t
o

y

n
o

u
n
a
c
o
l
e
c
c
i

n

d
e

d
a
t
o
s
.
E
l

t
i
p
o

e
n
u
m

I
D
L

e
s

u
n
a

l
i
s
t
a

d
e

v
a
l
o
r
e
s

q
u
e

p
u
e
d
e
n

s
e

r
e
f
e
r
e
n
c
i
a
d
o
s

p
o
r

u
n

n
o
m
b
r
e

e
n

v
e
z

d
e

p
o
r

s
u

p
o
s
i
c
i

n

e
n

l
a

l
i
s
t
a
.

E
n

e
l

e
j
e
m
p
l
o
,

p
o
d
e
m
o
s

v
e
r

q
u
e

r
e
f
e
r
i
r
n
o
s

a
l

c

d
i
g
o

d
e
e
s
t
a
d
o

d
e

u
n

e
n
u
m

I
D
L

p
o
r

u
n

n
o
m
b
r
e

e
s

m
u
c
h
o

m

s

l
e
g
i
b
l
e

q
u
e

h
a
c
e
r
l
o

p
o
r

s
u

n

m
e
r
o
.

E
s
t
a

l

n
e
a

m
a
p
e
a

l
o
s

v
a
l
o
r
e
s

s
t
a
t
i
c

f
i
n
a
l

i
n
t

d
e

l
a

c
l
a
s
e

f
i
n
a
l
L
o
g
i
n
E
r
r
o
r
.

P
o
d
e
m
o
s
r
e
f
e
r
i
r
n
o
s

a

e
s
t
o
s

v
a
l
o
r
e
s

c
o
m
o

l
o

h
a
r

a
m
o
s

c
o
n

u
n

c
a
m
p
o

e
s
t

t
i
c
o
:
L
o
g
i
n
E
r
r
o
r
.
I
N
V
A
L
I
D
_
U
S
E
R
.
e
n
u
m

L
o
g
i
n
E
r
r
o
r

{


I
N
V
A
L
I
D
_
U
S
E
R
,

W
R
O
N
G
_
P
A
S
S
W
O
R
D
,

T
I
M
E
O
U
T
}
;
A
q
u


h
a
y

u
n
a

v
e
r
s
i

n

d
e
l

t
i
p
o

e
n
u
m

q
u
e

i
n
c
l
u
y
e

u
n

s
u
b
r
a
y
a
d
o

a
n
t
e
r
i
o
r

p
a
r
a

q
u
e

p
u
e
d
a

s
e
r

u
s
a
d
o

e
n

s
e
n
t
e
n
c
i
a
s

s
w
i
t
c
h
:
s
w
i
t
c
h

(
p
r
o
b
l
e
m
)

{


c
a
s
e

L
o
g
i
n
E
r
r
o
r
.
_
I
N
V
A
L
I
D
_
U
S
E
R
:




S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
p
l
e
a
s
e

l
o
g
i
n

a
g
a
i
n
"
)
;




b
r
e
a
k
;
}
s
t
r
u
c
t

I
D
L
:

U
n

t
i
p
o

s
t
r
u
c
t

I
D
L

p
u
e
d
e

s
e
r

c
o
m
p
a
r
a
d
o

c
o
n

u
n
a

c
l
a
s
e

J
a
v
a

q
u
e

s

l
o

t
i
e
n
e

c
a
m
p
o
s
,

q
u
e

e
s

c

m
o

l
o

m
a
p
e
a

e
l

c
o
m
p
i
l
a
d
o
r

I
D
L
.
E
s
t
e

e
j
e
m
p
l
o

d
e
c
l
a
r
a

u
n
a

s
t
r
u
c
t

I
D
L
.

O
b
s
e
r
v
a
m
o
s

q
u
e

l
o
s

t
i
p
o
s

I
D
L

p
u
e
d
e
n

r
e
f
e
r
e
n
c
i
a
r

o
t
r
o
s

t
i
p
o
s

I
D
L
.

E
n

e
s
t
e

e
j
e
m
p
l
o

L
o
g
i
n
E
r
r
o
r

v
i
e
n
e

d
e
l

t
i
p
o

e
n
u
m

d
e
c
l
a
r
a
d
o

a
r
r
i
b
a
.
s
t
r
u
c
t

E
r
r
o
r
H
a
n
d
l
e
r

{


L
o
g
i
n
E
r
r
o
r

e
r
r
o
r
t
y
p
e
;


s
h
o
r
t

r
e
t
r
i
e
s
;
}
;
u
n
i
o
n

I
D
L
:

U
n
a

u
n
i
o
n

I
D
L

p
u
e
d
e

r
e
p
r
e
s
e
n
t
a
r

u
n

t
i
p
o

d
e

u
n
a

l
i
s
t
a

d
e

t
i
p
o
s

d
e
f
i
n
i
d
o
s

p
a
r
a

e
s
a

u
n
i

n
.

L
a

u
n
i
o
n

m
a
p
e
a

a

u
n
a

c
l
a
s
e

J
a
v
a

d
e
l

m
i
s
m
o

n
o
m
b
r
e

c
o
n

u
n

m

t
o
d
o
d
i
s
c
r
i
m
i
n
a
t
o
r

u
s
a
d
o

p
a
r
a

d
e
t
e
r
m
i
n
a
r

e
l

t
i
p
o

d
e

e
s
a

u
n
i

n
.
E
s
t
e

e
j
e
m
p
l
o

m
a
p
e
a

l
a

u
n
i

n

G
l
o
b
a
l
E
r
r
o
r
s

a

u
n
a

c
l
a
s
e

J
a
v
a

c
o
n

e
l

n
o
m
b
r
e

G
l
o
b
a
l
E
r
r
o
r
s
.

S
e

p
o
d
r

a

a

a
d
i
r

u
n

c
a
s
e

p
o
r

d
e
f
e
c
t
o

c
a
s
e
:

D
E
F
A
U
L
T

p
a
r
a

m
a
n
e
j
a
r

c
u
a
l
q
u
i
e
r

e
l
e
m
e
n
t
o

q
u
e
p
o
d
r

a

e
s
t
a
r

e
n

e
l

t
i
p
o

L
o
g
i
n
E
r
r
o
r
s

e
n
u
m
,

y

n
o

e
s
t


e
s
p
e
c
i
f
i
c
a
d
o

c
o
n

u
n
a

s
e
n
t
e
n
c
i
a

c
a
s
e

a
q
u

.


u
n
i
o
n

G
l
o
b
a
l
E
r
r
o
r
s

s
w
i
t
c
h

(
L
o
g
i
n
E
r
r
o
r
s
)

{





c
a
s
e
:

I
N
V
A
L
I
D
_
U
S
E
R
:

s
t
r
i
n
g

m
e
s
s
a
g
e
;





c
a
s
e
:

W
R
O
N
G
_
P
A
S
S
W
O
R
D
:

l
o
n
g

a
t
t
e
m
p
t
s
;





c
a
s
e
:

T
I
M
E
O
U
T
:

l
o
n
g

t
i
m
e
o
u
t
;


}
;
E
n

u
n

p
r
o
g
r
a
m
a

e
s
c
r
i
t
o

e
n

l
e
n
g
u
a
j
e

J
a
v
a
,

l
a

c
l
a
s
e

u
n
i

n

G
l
o
b
a
l
E
r
r
o
r
s

s
e

c
r
e
a

d
e

e
s
t
a

f
o
r
m
a
:


G
l
o
b
a
l
E
r
r
o
r
s

g
e

=

n
e
w

G
l
o
b
a
l
E
r
r
o
r
s
(
)
;


g
e
.
m
e
s
s
a
g
e
(
"
p
l
e
a
s
e

l
o
g
i
n

a
g
a
i
n
"
)
;
E
l

v
a
l
o
r

I
N
V
A
L
I
D
_
U
S
E
R

s
e

r
e
c
u
p
e
r
a

d
e

e
s
t
a

f
o
r
m
a
:


s
w
i
t
c
h

(
g
e
.
d
i
s
c
r
i
m
i
n
a
t
o
r
(
)
.
v
a
l
u
e
(
)
)

{




c
a
s
e
:

L
o
g
i
n
E
r
r
o
r
.
_
I
N
V
A
L
I
D
_
U
S
E
R
:






S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
g
e
.
m
e
s
s
a
g
e
)
;






b
r
e
a
k
;


}
T
i
p
o

A
n
y
:

s
i

n
o

s
a
b
e
m
o
s

q
u
e

t
i
p
o

e
s
t


s
i
e
n
t
o

p
a
s
a
d
o

o

d
e
v
u
e
l
t
o

d
e
s
d
e

u
n
a

o
p
e
r
a
c
i

n
,

p
o
d
e
m
o
s

u
s
a
r

e
l

t
i
p
o

A
n
y
,

q
u
e

r
e
p
r
e
s
e
n
t
a

c
u
a
l
q
u
i
e
r

t
i
p
o

I
D
L
.

L
a

s
i
g
u
i
e
n
t
e

o
p
e
r
a
c
i

n

r
e
t
o
r
n
a

y
p
a
s
a

u
n

t
i
p
o

d
e
s
c
o
n
o
c
i
d
o
:


i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

{




A
n
y

c
u
s
t
o
m
S
e
a
r
c
h
(
A
n
y

s
e
a
r
c
h
F
i
e
l
d
,

o
u
t

c
o
u
n
t
)
;


}
;
P
a
r
a

c
r
e
a
r

u
n

t
i
p
o

A
n
y
,

s
e

p
i
d
e

e
l

t
i
p
o

a
l

"
O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r
"

(
O
R
B
)
.

P
a
r
a

s
e
l
e
c
c
i
o
n
a
r

u
n

v
a
l
o
r

d
e

u
n

t
i
p
o

A
n
y
,

u
s
a
m
o
s

u
n

m

t
o
d
o

i
n
s
e
r
t
_
<
t
y
p
e
>
.

P
a
r
a

r
e
c
u
p
e
r
a
r

u
n

v
a
l
o
r
,
u
s
a
m
o
s

e
l

m

t
o
d
o

e
x
t
r
a
c
t
_
<
t
y
p
e
>
.
E
s
t
e

e
j
e
m
p
l
o

p
i
d
e

u
n

o
b
j
e
t
o

d
e
l

t
i
p
o

A
n
y
,

y

u
s
a

e
l

m

t
o
d
o

i
n
s
e
r
t
_
t
y
p
e

p
a
r
a

s
e
l
e
c
c
i
o
n
a
r

u
n

v
a
l
o
r
.


A
n
y

s
f
i
e
l
d

=

o
r
b
.
c
r
e
a
t
e
_
a
n
y
(
)
;


s
f
i
e
l
d
.
i
n
s
e
r
t
_
l
o
n
g
(
3
4
)
;
E
l

t
i
p
o

A
n
y

t
i
e
n
e

u
n

v
a
l
o
r

T
y
p
e
C
o
d
e

a
s
i
g
n
a
d
o

q
u
e

p
u
e
d
e

c
o
n
s
u
l
t
a
r
s
e

u
s
a
n
d
o

t
y
p
e
(
)
.
k
i
n
d
(
)
.
v
a
l
u
e
(
)

s
o
b
r
e

e
l

o
b
j
e
t
o
.

E
l

s
i
g
u
i
e
n
t
e

e
j
e
m
p
l
o

m
u
e
s
t
r
a

u
n
a

p
r
u
e
b
a

d
e
l

T
y
p
e
C
o
d
e

d
o
u
b
l
e
.
E
s
t
e

e
j
e
m
p
l
o

i
n
c
l
u
y
e

u
n
a

r
e
f
e
r
e
n
c
i
a

a
l

T
y
p
e
C
o
d
e

I
D
L

e
n
c
o
n
t
r
a
d
o

q
u
e

c
o
n
t
i
e
n
e

e
l

o
b
j
e
t
o

A
n
y
.

E
l

T
y
p
e
C
o
d
e

s
e

u
s
a

p
a
r
a

t
o
d
o
s

l
o
s

o
b
j
e
t
o
s
.

P
o
d
e
m
o
s

a
n
a
l
i
z
a
r

e
l

t
i
p
o

d
e

u
n

o
b
j
e
t
o

C
O
R
B
A
u
s
a
n
d
o

l
o
s

m

t
o
d
o
s

_
t
y
p
e
(
)

o

t
y
p
e
(
)
.
p
u
b
l
i
c

A
n
y

c
u
s
t
o
m
S
e
a
r
c
h
(
A
n
y

s
e
a
r
c
h
F
i
e
l
d
,

I
n
t
H
o
l
d
e
r

c
o
u
n
t
)
{


i
f
(
s
e
a
r
c
h
F
i
e
l
d
.
t
y
p
e
(
)
.
k
i
n
d
(
)
.
v
a
l
u
e
(
)

=
=

T
C
K
i
n
d
.
_
t
k
_
d
o
u
b
l
e
)
{
/
/

r
e
t
u
r
n

n
u
m
b
e
r

o
f

b
a
l
a
n
c
e
s

g
r
e
a
t
e
r

t
h
a
n

s
u
p
p
l
i
e
d

a
m
o
u
n
t





d
o
u
b
l
e

f
i
n
d
B
a
l
a
n
c
e
=
s
e
a
r
c
h
F
i
e
l
d
.
e
x
t
r
a
c
t
_
d
o
u
b
l
e
(
)
;
P
r
i
n
c
i
p
a
l
:

E
l

t
i
p
o

P
r
i
n
c
i
p
a
l

i
d
e
n
t
i
f
i
c
a

a
l

p
r
o
p
i
e
t
a
r
i
o

d
e

u
n

o
b
j
e
t
o

C
O
R
B
A
,

p
o
r

e
j
e
m
p
l
o
,

u
n

n
o
m
b
r
e

d
e

u
s
u
a
r
i
o
.

E
l

v
a
l
o
r

p
u
e
d
e

c
o
n
s
u
l
t
a
r
s
e

d
e
s
d
e

e
l

c
a
m
p
o

r
e
q
u
e
s
t
_
p
r
i
n
c
i
p
a
l

d
e

l
a

c
l
a
s
e
R
e
q
u
e
s
t
H
e
a
d
e
r

p
a
r
a

h
a
c
e
r

l
a

i
d
e
n
t
i
f
i
c
a
c
i

n
.

O
b
j
e
c
t
:

E
l

t
i
p
o

O
b
j
e
c
t

e
s

u
n

o
b
j
e
t
o

C
O
R
B
A
.

S
i

n
e
c
e
s
i
t
a
m
o
s

e
n
v
i
a
r

o
b
j
e
t
o
s

J
a
v
a
,

t
e
n
e
m
o
s

q
u
e

t
r
a
d
u
c
i
r
l
o
s

a

u
n

t
i
p
o

I
D
L

o

u
s
a
r

u
n
m
e
c
a
n
i
s
m
o

p
a
r
a

s
e
r
i
a
l
i
z
a
r
l
o
s

c
u
a
n
d
o

s
e
a
n

t
r
a
n
s
f
e
r
i
d
o
s
.
C
O
R
B
A

e
n

l
a

A
p
l
i
c
a
c
i

n

d
e

S
u
b
a
s
t
a
E
l
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

c
o
n
t
r
o
l
a
d
o

p
o
r

c
o
n
t
e
n
e
d
o
r

d
e

l
a

a
p
l
i
c
a
c
i

n

s
u
b
a
s
t
a

e
s

t
o
t
a
l
m
e
n
t
e

r
e
e
m
p
l
a
z
a
d
o

c
o
n

u
n

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

s
o
l
i
t
a
r
i
o

C
O
R
B
A

q
u
e

i
m
p
l
e
m
e
n
t
a

e
l

s
e
r
v
i
c
i
o

d
e

r
e
g
i
s
t
r
o
.

E
l
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

C
O
R
B
A

e
s
t


c
o
n
s
t
r
u
i
d
o

c
r
e
a
n
d
o

y

c
o
m
p
i
l
a
n
d
o

f
i
c
h
e
r
o
s

d
e

m
a
p
e
o

I
D
L

p
a
r
a

q
u
e

l
o
s

p
r
o
g
r
a
m
a
s

c
l
i
e
n
t
e
s

s
e

p
u
e
d
a
n

c
o
m
u
n
i
c
a
r

c
o
n

e
l

s
e
r
v
i
d
o
r

d
e

r
e
g
i
s
t
r
o
s
.
L
o
s

f
i
c
h
e
r
o
s

S
e
l
l
e
r
B
e
a
n
.
j
a
v
a

y

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
j
a
v
a

s
e

h
a
n

a
c
t
u
a
l
i
z
a
d
o

p
a
r
a

q
u
e

b
u
s
q
u
e
n

e
l

s
e
r
v
i
d
o
r

d
e

r
e
g
i
s
t
r
o

C
O
R
B
A
.
I
m
p
l
e
m
e
n
t
a
c
i

n

d
e
l

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

C
O
R
B
A
E
s
t
a

s
e
c
c
i

n

d
e
s
c
r
i
b
e

e
l

f
i
c
h
e
r
o

R
e
g
i
s
t
r
a
t
i
o
n
.
i
d
l
,

q
u
e

m
a
p
e
a

l
o
s

i
n
t
e
r
f
a
c
e
s

r
e
m
o
t
o
s

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

y

R
e
g
i
s
t
r
a
t
i
o
n

d
e
s
d
e

l
a

a
p
l
i
c
a
c
i

n

d
e

s
u
b
a
s
t
a
s

d
e

J
a
v
a
B
e
a
n
s

d
e

E
n
t
e
r
p
r
i
s
e

a

s
u
s
e
q
u
i
v
a
l
e
n
t
e
s

I
D
L

y

m
u
e
s
t
r
a

c
o
m
o

c
o
m
p
i
l
a
r

e
l

f
i
c
h
e
r
o

R
e
g
i
s
t
r
a
t
i
o
n
.
i
d
l

e
n

l
a
s

c
l
a
s
e
s

d
e
l

s
e
r
v
i
d
o
r

d
e

r
e
g
i
s
t
o
s

C
O
R
B
A
.
E
l

s
e
r
v
i
d
o
r

d
e

r
e
g
i
s
t
r
o
s

C
O
R
B
A

i
m
p
l
e
m
e
n
t
a

l
o
s

m

t
o
d
o
s

c
r
e
a
t
e

y

f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y

d
e
s
d
e
l

e
l

f
i
c
h
e
r
o

R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
.
j
a
v
a

o
r
i
g
i
n
a
l
,

y

l
o

a
m
p
l

a

c
o
n

l
o
s

d
o
s

m

t
o
d
o
s

s
i
g
u
i
e
n
t
e
s
p
a
r
a

i
l
u
s
t
r
a
r

l
a
s

r
e
t
r
o
l
l
a
m
a
d
a
s

C
O
R
B
A
,

y

c
o
m
o

u
s
a
r

e
l

t
i
p
o

A
n
y
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
(
i
n

R
e
t
u
r
n
R
e
s
u
l
t
s

r
r
)
,

q
u
e

u
s
a

u
n
a

c
a
l
l
b
a
c
k

p
a
r
a

d
e
v
o
l
v
e
r

u
n
a

l
i
s
t
a

d
e

c
u
e
n
t
a
s

c
o
n

b
a
j
o

s
a
l
d
o
.




a
n
y

c
u
s
t
o
m
S
e
a
r
c
h
(
i
n

a
n
y

s
e
a
r
c
h
f
i
e
l
d
,

o
u
t

l
o
n
g

c
o
u
n
t
)
,

q
u
e

d
e
v
u
e
l
v
e

u
n

r
e
s
u
l
t
a
d
o

d
e

b

s
q
u
e
d
a

d
i
f
e
r
e
n
t
e

d
e
p
e
n
d
i
e
n
d
o

d
e
l

t
i
p
o

d
e

c
a
m
p
o

e
n
v
i
a
d
o
.




F
i
c
h
e
r
o

d
e

M
a
p
e
o
s

I
D
L
A
q
u


e
s
t


e
l

f
i
c
h
e
r
o

R
e
g
i
s
t
r
a
t
i
o
n
.
i
d
l

q
u
e

m
a
p
e
a

l
o
s

t
i
p
o
s

d
e

d
a
t
o
s

y

m

t
o
d
o
s

u
s
a
d
o
s

e
n

l
o
s

p
r
o
g
r
a
m
a
s

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

y

R
e
g
i
s
t
r
a
t
i
o
n

a

s
u
s

e
q
u
i
v
a
l
e
n
t
e
s

I
D
L
.
m
o
d
u
l
e

r
e
g
i
s
t
r
a
t
i
o
n

{
i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n

{



b
o
o
l
e
a
n

v
e
r
i
f
y
P
a
s
s
w
o
r
d
(
i
n

s
t
r
i
n
g

p
a
s
s
w
o
r
d
)
;



s
t
r
i
n
g

g
e
t
E
m
a
i
l
A
d
d
r
e
s
s
(
)
;



s
t
r
i
n
g

g
e
t
U
s
e
r
(
)
;



l
o
n
g

a
d
j
u
s
t
A
c
c
o
u
n
t
(
i
n

d
o
u
b
l
e

a
m
o
u
n
t
)
;



d
o
u
b
l
e

g
e
t
B
a
l
a
n
c
e
(
)
;
}
;
i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
P
K

{



a
t
t
r
i
b
u
t
e

s
t
r
i
n
g

t
h
e
u
s
e
r
;
}
;
e
n
u
m

L
o
g
i
n
E
r
r
o
r

{
I
N
V
A
L
I
D
U
S
E
R
,

W
R
O
N
G
P
A
S
S
W
O
R
D
,

T
I
M
E
O
U
T
}
;
e
x
c
e
p
t
i
o
n

C
r
e
a
t
e
E
x
c
e
p
t
i
o
n

{
}
;
e
x
c
e
p
t
i
o
n

F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

{
}
;
t
y
p
e
d
e
f

s
e
q
u
e
n
c
e
<
R
e
g
i
s
t
r
a
t
i
o
n
>

I
D
L
A
r
r
a
y
L
i
s
t
;
i
n
t
e
r
f
a
c
e

R
e
t
u
r
n
R
e
s
u
l
t
s


{


v
o
i
d

u
p
d
a
t
e
R
e
s
u
l
t
s
(
i
n

I
D
L
A
r
r
a
y
L
i
s
t

r
e
s
u
l
t
s
)









r
a
i
s
e
s

(
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
)
;
}
;
i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

{


R
e
g
i
s
t
r
a
t
i
o
n
P
K

c
r
e
a
t
e
(
i
n

s
t
r
i
n
g

t
h
e
u
s
e
r
,

























i
n

s
t
r
i
n
g

p
a
s
s
w
o
r
d
,

























i
n

s
t
r
i
n
g

e
m
a
i
l
a
d
d
r
e
s
s
,

























i
n

s
t
r
i
n
g

c
r
e
d
i
t
c
a
r
d
)




























r
a
i
s
e
s

(
C
r
e
a
t
e
E
x
c
e
p
t
i
o
n
)
;


R
e
g
i
s
t
r
a
t
i
o
n

f
i
n
d
B
y
P
r
i
m
a
r
y
K
e
y
(

















i
n

R
e
g
i
s
t
r
a
t
i
o
n
P
K

t
h
e
u
s
e
r
)


















r
a
i
s
e
s

(
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
)
;


v
o
i
d

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
(
i
n

R
e
t
u
r
n
R
e
s
u
l
t
s

r
r
)


















r
a
i
s
e
s

(
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
)
;


a
n
y

c
u
s
t
o
m
S
e
a
r
c
h
(
i
n

a
n
y

s
e
a
r
c
h
f
i
e
l
d
,

o
u
t

l
o
n
g

c
o
u
n
t
)
;
}
;
}
;
C
o
m
p
i
l
a
r

e
l

F
i
c
h
e
r
o

d
e

M
a
p
e
o
s

I
D
L
E
l

f
i
c
h
e
r
o

I
D
L

t
i
e
n
e

q
u
e

s
e
r

c
o
n
v
e
r
t
i
d
o

e
n

c
l
a
s
e
s

J
a
v
a

q
u
e

p
u
e
d
a
n

s
e
r

u
s
a
d
a
s

e
n

u
n
a

r
e
d

d
i
s
t
r
i
b
u
i
d
a

C
O
R
B
A
.

L
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

2

c
o
m
p
i
l
a

l
o
s

f
i
c
h
e
r
o
s

.
i
d
l

u
s
a
n
d
o

e
l

p
r
o
g
r
a
m
a
i
d
l
t
o
j
a
v
a
.

E
s
t
e

p
r
o
g
r
a
m
a

s
e
r


r
e
e
m
p
l
a
z
a
d
o

e
v
e
n
t
u
a
l
m
e
n
t
e

c
o
n

e
l

c
o
m
a
n
d
o

i
d
l
j
.
L
o
s

a
r
g
u
m
e
n
t
o
s

-
f
n
o
-
c
p
p

i
n
d
i
c
a
n

q
u
e

n
o

h
a
y

c
o
m
p
i
l
a
d
o
r

C
+
+

i
n
s
t
a
l
a
d
o
.


i
d
l
t
o
j
a
v
a

-
f
n
o
-
c
p
p

R
e
g
i
s
t
r
a
t
i
o
n
.
i
d
l
O
t
r
o
s

c
o
m
p
i
l
a
d
o
r
e
s

J
a
v
a

I
D
L

t
a
m
b
i

n

d
e
b
e
r

a
n

f
u
n
c
i
o
n
a
r
,

p
o
r

e
j
e
m
p
l
o
,

j
i
d
l

d
e

O
R
B
a
c
u
s

p
u
e
d
e

g
e
n
e
r
a
r

c
l
a
s
e
s

q
u
e

p
u
e
d
e
n

s
e
r

u
s
a
d
a
s

p
o
r

e
l

O
R
B

d
e

J
a
v
a

2
.
S
t
u
b
s

y

S
k
e
l
e
t
o
n
s
C
o
r
b
a

y

R
M
I

s
o
n

s
i
m
i
l
a
r
e
s

e
n

q
u
e

l
a

c
o
m
p
i
l
a
c
i

n

g
e
n
e
r
a

u
n

f
i
c
h
e
r
o

s
t
u
b

p
a
r
a

e
l

c
l
i
e
n
t
e

y

u
n

f
i
c
h
e
r
o

s
k
e
l
e
t
o
n

p
a
r
a

e
l

s
e
r
v
i
d
o
r
.

E
l

s
t
u
b

(
o

p
r
o
x
y
)
,

y

e
l

s
k
e
l
e
t
o
n

(
o

s
i
r
v
i
e
n
t
e
)

s
e

u
s
a
n

p
a
r
a
e
n
v
o
l
v
e
r

o

d
e
s
e
n
v
o
l
v
e
r

d
a
t
o
s

e
n
t
r
e

e
l

c
l
i
e
n
t
e

y

e
l

s
e
r
v
i
d
o
r
.

E
l

s
k
e
l
e
t
o
n

(
o

s
i
r
v
i
e
n
t
e
)

e
s
t


i
m
p
l
e
m
e
n
t
a
d
o

m
e
d
i
a
n
t
e

e
l

s
e
r
v
i
d
o
r
.

E
n

e
s
t
e

e
j
e
m
p
l
o
,

e
l

i
n
t
e
r
f
a
c
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

g
e
n
e
r
a
u
n
a

c
l
a
s
e

_
R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
I
m
p
l
B
a
s
e

(
l
a

c
l
a
s
e

s
k
e
l
e
t
o
n

o

s
i
r
v
i
e
n
t
e
)

q
u
e

e
x
t
i
e
n
d
e

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

g
e
n
e
r
a
d
a
.
C
u
a
n
d
o

s
e

s
o
l
i
c
i
t
a

u
n

o
b
j
e
t
o

C
O
R
B
A

r
e
m
o
t
o

o

s
e

l
l
a
m
a

a

u
n

m

t
o
d
o

r
e
m
o
t
o
,

l
a

l
l
a
m
a
d
a

d
e
l

c
l
i
e
n
t
e

p
a
s
a

a

t
r
a
v

s

d
e

l
a

c
l
a
s
e

s
t
u
b

a
n
t
e
s

d
e

a
l
c
a
n
z
a
r

e
l

s
e
r
v
i
d
o
r
.

E
s
t
e

c
l
a
s
e

p
r
o
x
y

i
n
v
o
c
a

l
a
p
e
t
i
c
i

n

C
O
R
B
A

p
a
r
a

e
l

p
r
o
g
r
a
m
a

c
l
i
e
n
t
e
.

E
l

s
i
g
u
i
e
n
t
e

e
j
e
m
p
l
o

e
s

e
l

c

d
i
g
o

g
e
n
e
r
a
d
o

a
u
t
o
m

t
i
c
a
m
e
n
t
e

p
o
r

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
S
t
u
b
.
j
a
v
a
.


o
r
g
.
o
m
g
.
C
O
R
B
A
.
R
e
q
u
e
s
t

r

=

_
r
e
q
u
e
s
t
(
"
c
r
e
a
t
e
"
)
;


r
.
s
e
t
_
r
e
t
u
r
n
_
t
y
p
e
(








r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
P
K
H
e
l
p
e
r
.
t
y
p
e
(
)
)
;


o
r
g
.
o
m
g
.
C
O
R
B
A
.
A
n
y

_
t
h
e
u
s
e
r

=

r
.
a
d
d
_
i
n
_
a
r
g
(
)
;
O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r
E
l

c
e
n
t
r
o

d
e

u
n
a

r
e
d

d
i
s
t
r
i
b
u
i
d
a

C
O
R
B
A

e
s

e
l

"
O
b
j
e
c
t

R
e
q
u
e
s
t

B
r
o
k
e
r
"

o

O
R
B
.

E
l

O
R
B

s
e

e
n
c
a
r
g
a

d
e

e
m
p
a
q
u
e
t
a
r

y

d
e
s
e
m
p
a
q
u
e
t
a
r

l
o
s

o
b
j
e
t
o
s

e
n
t
r
e

e
l

c
l
i
e
n
t
e

y

e
l

s
e
r
v
i
d
o
r
.

O
t
r
o
s
s
e
r
v
i
c
i
o
s

c
o
m
o

S
e
r
v
i
c
i
o
s

d
e

N
o
m
b
r
e
s

y

S
e
r
v
i
c
i
o
s

d
e

E
v
e
n
t
o
s

f
u
n
c
i
o
n
a
n

c
o
n

e
l

O
R
B
.
L
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

2

i
n
c
l
u
y
e

u
n

O
R
B

e
n

l
a

d
i
s
t
r
i
b
u
c
i

n

l
l
a
m
a
d
o

e
l

I
D
L

O
R
B
.

E
s
t
e

O
R
B

e
s

d
i
f
e
r
e
n
t
e

d
e

o
t
r
o
s

m
u
c
h
o
s

O
R
B
s

p
o
r
q
u
e

n
o

i
n
c
l
u
y
e

u
n

d
i
s
t
i
n
t
i
v
o

d
e

"
B
a
s
i
c

O
b
j
e
c
t

A
d
a
p
t
e
r
"
(
B
O
A
)

o

"
P
o
r
t
a
b
l
e

O
b
j
e
c
t

A
d
a
p
t
e
r
"

(
P
O
A
)
.
U
n
a

a
d
a
p
t
a
d
o
r

d
e

o
b
j
e
t
o
s

m
a
n
e
j
a

l
a

c
r
e
a
c
c
i

n

y

c
i
c
l
o

d
e

v
i
d
a

d
e

l
o
s

o
b
j
e
t
o
s

e
n

u
n

e
s
p
a
c
i
o

d
i
s
t
r
i
b
u
i
d
o

C
O
R
B
A
.

E
s
t
o

p
u
e
d
e

s
e
r

c
o
m
p
a
r
a
d
o

c
o
n

e
l

c
o
n
t
e
n
e
d
o
r

d
e
l

s
e
r
v
i
d
o
r

d
e

J
a
v
a
B
e
a
n
s
E
n
t
e
r
p
r
i
s
e

q
u
e

m
a
n
e
j
a

e
l

c
i
c
l
o

d
e

v
i
d
a

d
e

l
o
s

b
e
a
n
s

d
e

e
n
t
i
d
a
d

y

d
e

s
e
s
i

n
.
L
o
s

p
r
o
g
r
a
m
a
s

A
u
c
t
i
o
n
S
e
r
v
l
e
t

y

S
e
l
l
e
r
B
e
a
n

c
r
e
a
n

e

i
n
i
c
i
a
l
i
z
a
n

u
n

O
R
B

d
e

J
a
v
a

2

d
e

e
s
t
a

f
o
r
m
a
:


O
R
B

o
r
b

=

O
R
B
.
i
n
i
t
(
a
r
g
s
,

n
u
l
l
)
;
E
n

e
l

p
r
o
g
r
a
m
a

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
,

e
l

o
b
j
e
t
o

s
e
r
v
i
d
o
r

p
u
e
d
e

s
e
r

d
i
s
t
r
i
b
u
i
d
o

e
n

u
n
i

n

c
o
n

e
l

O
R
B

u
s
a
n
d
o

e
l

m

t
o
d
o

c
o
n
n
e
c
t
:


R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

r
s

=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
(
)
;


o
r
b
.
c
o
n
n
e
c
t
(
r
s
)
;
U
n

o
b
j
e
t
o

c
o
n
e
c
t
a
d
o

a

u
n

O
R
B

p
u
e
d
e

s
e
r

e
l
e
m
i
n
a
d
o

c
o
n

e
l

m

t
o
d
o

d
i
s
c
o
n
n
e
c
t
:


o
r
b
.
d
i
s
c
o
n
n
e
c
t
(
r
s
)
;
U
n
a

v
e
z

c
o
n
e
c
t
a
d
o

a

u
n

o
b
j
e
t
o

s
e
r
v
i
d
o
r

C
O
R
B
A
,

e
l

O
R
B

J
a
v
a
2

m
a
n
t
i
e
n
e

v
i
v
o

e
l

s
e
r
v
i
d
o
r

y

e
s
p
e
r
a

p
e
t
i
c
i
o
n
e
s

d
e
l

c
l
i
e
n
t
e

p
a
r
a

e
l

s
e
r
v
i
d
o
r

C
O
R
B
A
.


j
a
v
a
.
l
a
n
g
.
O
b
j
e
c
t

s
y
n
c

=

n
e
w

j
a
v
a
.
l
a
n
g
.
O
b
j
e
c
t
(
)
;


s
y
n
c
h
r
o
n
i
z
e
d
(
s
y
n
c
)

{




s
y
n
c
.
w
a
i
t
(
)
;


}
P
o
n
e
r

D
i
s
p
o
n
i
b
l
e

e
l

S
e
r
v
i
d
o
r

C
O
R
B
A
A
u
n
q
u
e

e
s
t
e

o
b
j
e
t
o

e
s
t


a
h
o
r
a

s
i
e
n
d
o

m
a
p
e
a
d
o

p
o
r

e
l

O
R
B
,

l
o
s

c
l
i
e
n
t
e
s

t
o
d
a
v

a

n
o

t
i
e
n
e
n

e
l

m
e
c
a
n
i
s
m
o

p
a
r
a

e
n
c
o
n
t
r
a
r

e
l

o
b
j
e
t
o

r
e
m
o
t
o
.

E
s
t
o

p
u
e
d
e

r
e
s
o
l
v
e
r
s
e

u
n
i
e
n
d
o

e
l

o
b
j
e
t
o
s
e
r
v
i
d
o
r

C
O
R
B
A

a

u
n

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s
.
E
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

J
a
v
a

2

l
l
a
m
a
d
o

t
n
a
m
e
s
e
r
v
,

p
o
r

d
e
f
e
c
t
o

u
s
a

e
l

p
u
e
r
t
o

9
0
0
;

s
i
n

e
m
b
a
r
g
o
,

e
s
t
e

v
a
l
o
r

p
u
e
d
e

m
o
d
i
f
i
c
a
r
s
e

s
e
l
e
c
c
i
o
n
a
d
o

e
l

a
r
g
u
m
e
n
t
o

-
O
R
B
I
n
i
t
i
a
l
P
o
r
t

p
o
r
t
n
u
m
b
e
r
c
u
a
n
d
o

s
e

a
r
r
a
n
c
a

t
n
a
m
e
s
e
r
v

o

s
e
l
e
c
c
i
o
n
a
n
d
o

l
a

p
r
o
p
i
e
d
a
d

o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
R
B
I
n
i
t
i
a
l
P
o
r
t

c
u
a
n
d
o

a
r
r
a
n
c
a
m
o
s

l
o
s

p
r
o
c
e
s
o
s

c
l
i
e
n
t
e

y

s
e
r
v
i
d
o
r
.
L
a
s

s
i
g
u
i
e
n
t
e
s

s
e
c
c
i
o
n
e
s

d
e
s
c
r
i
b
e
n

e
l

m

t
o
d
o

m
a
i
n

d
e

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.


j
a
v
a
.
u
t
i
l
.
P
r
o
p
e
r
t
i
e
s

p
r
o
p
s
=
S
y
s
t
e
m
.
g
e
t
P
r
o
p
e
r
t
i
e
s
(
)
;


p
r
o
p
s
.
p
u
t
(
"
o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
R
B
I
n
i
t
i
a
l
P
o
r
t
"
,

"
1
0
5
0
"
)
;


S
y
s
t
e
m
.
s
e
t
P
r
o
p
e
r
t
i
e
s
(
p
r
o
p
s
)
;


O
R
B

o
r
b

=

O
R
B
.
i
n
i
t
(
a
r
g
s
,

p
r
o
p
s
)
;
L
a
s

s
i
g
u
i
e
n
t
e
s

l

n
e
a
s

m
u
e
s
t
r
a
n

q
u
e

l
a

r
e
f
e
r
e
n
c
i
a

i
n
i
c
i
a
l

d
e

n
o
m
b
r
e
s

e
s

i
n
i
c
i
a
l
i
z
a
d
a

p
o
r

l
a

p
e
t
i
c
i

n

d
e
l

s
e
r
v
i
c
i
o

l
l
a
m
a
d
o

N
a
m
e
S
e
r
v
i
c
e
.

E
l

N
a
m
i
n
g
C
o
n
t
e
x
t

e
s

r
e
c
u
p
e
r
a
d
o

y

e
l

n
o
m
b
r
e
c
o
n
s
t
r
u
i
d
o

y

u
n
i
d
o

a
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

c
o
m
o

e
l
e
m
e
n
t
o
s

N
a
m
e
C
o
m
p
o
n
e
n
t
.

E
l

n
o
m
b
r
e

d
e

e
s
t
e

e
j
e
m
p
l
o

t
i
e
n
e

u
n
a

r
a

z

l
l
a
m
a
d
a

a
u
c
t
i
o
n

q
u
e

e
s

e
s
t
e

o
b
j
e
t
o

q
u
e

s
e

e
s
t


u
n
i
e
n
d
o

c
o
m
o
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n

d
e
s
d
e

l
a

r
a

z

a
u
c
t
i
o
n
.

E
l

n
o
m
b
r
e

p
o
d
r

a

s
e
r

c
o
m
p
a
r
a
d
o

p
o
r

u
n
a

c
l
a
s
e

m
e
d
i
a
n
t
e

e
l

n
o
m
b
r
e

d
e

a
u
c
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
.


o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
b
j
e
c
t

n
a
m
e
S
e
r
v
i
c
e
O
b
j

=









o
r
b
.
r
e
s
o
l
v
e
_
i
n
i
t
i
a
l
_
r
e
f
e
r
e
n
c
e
s
(
"
N
a
m
e
S
e
r
v
i
c
e
"
)

;


N
a
m
i
n
g
C
o
n
t
e
x
t

n
c
t
x

=









N
a
m
i
n
g
C
o
n
t
e
x
t
H
e
l
p
e
r
.
n
a
r
r
o
w
(
n
a
m
e
S
e
r
v
i
c
e
O
b
j
)
;


N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

f
u
l
l
n
a
m
e

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
2
]
;


f
u
l
l
n
a
m
e
[
0
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
"
a
u
c
t
i
o
n
"
,

"
"
)
;


f
u
l
l
n
a
m
e
[
1
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(






















"
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
"
,

"
"
)
;


N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

t
e
m
p
C
o
m
p
o
n
e
n
t

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
1
]
;


f
o
r
(
i
n
t

i
=
0
;

i

<

f
u
l
l
n
a
m
e
.
l
e
n
g
t
h
-
1
;

i
+
+

)

{






t
e
m
p
C
o
m
p
o
n
e
n
t
[
0
]
=

f
u
l
l
n
a
m
e
[
i
]
;






t
r
y
{







n
c
t
x
=
n
c
t
x
.
b
i
n
d
_
n
e
w
_
c
o
n
t
e
x
t
(
t
e
m
p
C
o
m
p
o
n
e
n
t
)
;






}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)
{









S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
b
i
n
d

n
e
w
"
+
e
)
;
}


}


t
e
m
p
C
o
m
p
o
n
e
n
t
[
0
]
=
f
u
l
l
n
a
m
e
[
f
u
l
l
n
a
m
e
.
l
e
n
g
t
h
-
1
]
;


t
r
y
{



n
c
t
x
.
r
e
b
i
n
d
(
t
e
m
p
C
o
m
p
o
n
e
n
t
,

r
s
)
;


}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)
{



S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
r
e
b
i
n
d
"
+
e
)
;


}
C
o
n
e
c
t
a
r

u
n

n
u
e
v
o

O
R
B
E
l

O
R
B

I
D
L

d
e

J
a
v
a

2

r
e
a
l
m
e
n
t
e

n
o

i
n
c
l
u
y
e

n
i
n
g
u
n
o

d
e

l
o
s

s
e
r
v
i
c
i
o
s

d
i
s
p
o
n
i
b
l
e
s

e
n

m
u
c
h
o
s

o
t
r
o
s

O
R
B
s

c
o
m
e
r
c
i
a
l
e
s

c
o
m
o

l
o
s

s
e
r
v
i
c
i
o
s

d
e

s
e
g
u
r
i
d
a
d

o

e
v
e
n
t
o
s

(
n
o
t
i
f
i
c
a
c
i

n
)
.

P
o
d
e
m
o
s
u
s
a
r

o
t
r
o

O
R
B

e
n

e
l

r
u
n
t
i
m
e

d
e

J
a
v
a

2

c
o
n
f
i
g
u
r
a
n
d
o

d
o
s

p
r
o
p
i
e
d
a
d
e
s

e

i
n
c
l
u
y
e
n
d
o

c
u
a
l
q
u
i
e
r

c
o
d
i
g
o

d
e

o
b
j
e
t
o

a
d
a
p
t
a
d
o
r

q
u
e

s
e
a

n
e
c
e
s
a
r
i
o
.
U
s
a
r

u
n

n
u
e
v
o

O
R
B

e
n

e
l

s
e
r
v
i
d
o
r

d
e

r
e
g
i
s
t
r
o
s

r
e
q
u
i
e
r
e

q
u
e

l
a
s

p
r
o
p
i
e
d
a
d
e
s

o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
R
B
C
l
a
s
s

y

o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
R
B
S
i
n
g
l
e
t
o
n
C
l
a
s
s

a
p
u
n
t
e
n

a

l
a
s

c
l
a
s
e
s

O
R
B
a
p
r
o
p
i
a
d
a
s
.

E
n

e
s
t
e

e
j
e
m
p
l
o

s
e

u
s
a

e
l

O
R
B

O
R
B
a
c
u
s

e
n

l
u
g
a
r

d
e
l

O
R
B

I
D
L

d
e

J
a
v
a

2
.

P
a
r
a

u
s
a
r

o
t
r
o

O
R
B
,

e
l

c

d
i
g
o

d
e

a
b
a
j
o

d
e
b
e
r

a

c
o
n
e
c
t
a
r
s
e

d
e
n
t
r
o

d
e
l

m

t
o
d
o
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
m
a
i
n
.
E
n

e
l

c

d
i
g
o

d
e

e
j
e
m
p
l
o
,

s
e

u
s
a

u
n

O
R
B

S
i
n
g
l
e
t
o
n
C
l
a
s
s
.

E
s
t
e

O
R
B

n
o

e
s

u
n

O
R
B

c
o
m
p
l
e
t
o
,

y

s
u

u
s
o

p
r
i
m
a
r
i
o

e
s

c
o
m
o

f
a
c
t
o
r

a

p
a
r
a

T
y
p
e
C
o
d
e
s
.

L
a

l
l
a
m
a
d
a

a

O
R
B
.
i
n
i
t
(
)

e
n

l
a

l
t
i
m
a
l

n
e
a

c
r
e
a

e
l

O
R
B

S
i
n
g
l
e
t
o
n
.


P
r
o
p
e
r
t
i
e
s

p
r
o
p
s
=

S
y
s
t
e
m
.
g
e
t
P
r
o
p
e
r
t
i
e
s
(
)
;


p
r
o
p
s
.
p
u
t
(
"
o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
R
B
C
l
a
s
s
"
,













"
c
o
m
.
o
o
c
.
C
O
R
B
A
.
O
R
B
"
)
;


p
r
o
p
s
.
p
u
t
(
"
o
r
g
.
o
m
g
.
C
O
R
B
A
.
O
R
B
S
i
n
g
l
e
t
o
n
C
l
a
s
s
"
,








"
c
o
m
.
o
o
c
.
C
O
R
B
A
.
O
R
B
S
i
n
g
l
e
t
o
n
"
)
;


S
y
s
t
e
m
.
s
e
t
P
r
o
p
e
r
t
i
e
s
(
p
r
o
p
s
)
;


O
R
B

o
r
b

=

O
R
B
.
i
n
i
t
(
a
r
g
s
,

p
r
o
p
s
)

;
E
n

e
l

I
D
L

d
e

J
a
v
a

2
,

n
o

h
a
y

u
n

o
b
j
e
t
o

a
d
a
p
t
a
d
o
r

d
i
s
t
i
n
t
o
.

C
o
m
o

s
e

m
u
e
s
t
r
a

e
n

e
l

s
e
g
m
e
n
t
o

d
e

c

d
i
g
o

i
n
f
e
r
i
o
r
,

u
s
a
r

e
l

"
B
a
s
i
c

O
b
j
e
c
t

A
d
a
p
t
e
r
"

d
e
s
d
e

O
R
B
a
c
u
s

r
e
q
u
i
e
r
e

u
n

c
o
n
v
e
r
s
i

n
e
x
p
l

c
i
t
a

a
l

O
R
B

O
R
B
a
c
u
s
,

E
l

"
B
r
o
k
e
r

O
b
j
e
c
t

A
r
c
h
i
t
e
c
t
u
r
e
"

(
B
O
A
)

e
s

n
o
t
i
f
i
c
a
d
o

d
e

q
u
e

e
l

o
b
j
e
t
o

y
a

e
s
t


d
i
s
t
r
i
b
u
i
d
o

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

i
m
p
l
_
i
s
_
r
e
a
d
y
(
n
u
l
l
)
.


B
O
A

b
o
a

=

(
(
c
o
m
.
o
o
c
.
C
O
R
B
A
.
O
R
B
)
o
r
b
)
.
B
O
A
_
i
n
i
t
(







































a
r
g
s
,

p
r
o
p
s
)
;

.
.
.


b
o
a
.
i
m
p
l
_
i
s
_
r
e
a
d
y
(
n
u
l
l
)
;
A
u
n
q
u
e

l
o
s

d
o
s

O
R
B
s

O
R
B
S
i
n
g
l
e
t
o
n
C
l
a
s
s

y

O
R
B
C
l
a
s
s

c
o
n
s
t
r
u
y
e
n

e
l

n
o
m
b
r
e

d
e
l

o
b
j
e
t
o

u
s
a
n
d
o

N
a
m
e
C
o
m
p
o
n
e
n
t
,

t
e
n
e
m
o
s

q
u
e

u
s
a
r

u
n

d
i
f
e
r
e
n
t
e

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

O
R
B
a
c
u
s
.

E
l
s
e
r
v
i
c
i
o
C
o
s
N
a
m
i
n
g
.
S
e
r
v
e
r

s
e

a
r
r
a
n
c
a

d
e

l
a

s
i
g
u
i
e
n
t
e

f
o
r
m
a
,

d
o
n
d
e

e
l

p
a
r

m
e
t
r
o

-
O
A
h
o
s
t

e
s

o
p
c
i
o
n
a
l
:


j
a
v
a

c
o
m
.
o
o
c
.
C
o
s
N
a
m
i
n
g
.
S
e
r
v
e
r

-
O
A
h
o
s
t

l
o
c
a
l
h
o
s
t

-
O
A
p
o
r
t

1
0
6
0
U
n
a

v
e
z

a
r
r
a
n
c
a
d
o

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s
,

l
o
s

p
r
o
g
r
a
m
a
s

c
l
i
e
n
t
e

y

s
e
r
v
i
d
o
r

p
u
e
d
e
n

e
n
c
o
n
t
r
a
r

e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

u
s
a
n
d
o

e
l

p
r
o
t
o
c
o
l
o

I
I
O
P

h
a
c
i
a

e
l

h
o
s
t

y

e
l

p
u
e
r
t
o

n
o
m
b
r
a
d
o
s
c
u
a
n
d
o

s
e

a
r
r
a
n
c


e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
a
d
o
:


j
a
v
a

r
e
g
i
s
t
r
a
t
i
o
n
.
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r









-
O
R
B
s
e
r
v
i
c
e

N
a
m
e
S
e
r
v
i
c
e









i
i
o
p
:
/
/
l
o
c
a
l
h
o
s
t
:
1
0
6
0
/
D
e
f
a
u
l
t
N
a
m
i
n
g
C
o
n
t
e
x
t
A
c
c
e
s
o

a
l

S
e
r
v
i
c
i
o

d
e

N
o
m
b
r
e
s

p
o
r

l
o
s

C
l
i
e
n
t
e
s

C
O
R
B
A
L
o
s

c
l
i
e
n
t
e

C
O
R
B
A

a
c
c
e
d
e
n

a
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s

d
e

u
n
a

f
o
r
m
a

s
i
m
i
l
a
r

a

c
o
m
o

l
o

h
a
c
e

e
l

s
e
r
v
i
d
o
r
,

e
x
c
e
p
t
o

q
u
e

e
n

l
u
g
a
r

d
e

u
n
i
r

u
n

n
o
m
b
r
e
,

e
l

c
l
i
e
n
t
e

r
e
s
u
e
l
v
e

e
l

n
o
m
b
r
e

c
o
n
s
t
r
u
i
d
o
d
e
s
d
e

e
l

N
a
m
e
C
o
m
p
o
n
e
n
t
s
.
L
a
s

c
l
a
s
e
s

A
u
c
t
i
o
n
S
e
r
v
l
e
t

y

S
e
l
l
e
r
B
e
a
n

u
s
a
n

e
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

p
a
r
a

b
u
s
c
a
r

e
l

s
e
r
v
i
d
o
r

C
O
R
B
A
:


N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

f
u
l
l
n
a
m
e

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
2
]
;


f
u
l
l
n
a
m
e
[
0
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
"
a
u
c
t
i
o
n
"
,

"
"
)
;


f
u
l
l
n
a
m
e
[
1
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(






















"
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
"
,

"
"
)
;


R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
R
e
f

=









R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
H
e
l
p
e
r
.
n
a
r
r
o
w
(


























n
c
t
x
.
r
e
s
o
l
v
e
(
f
u
l
l
n
a
m
e
)
)
;
E
n

e
l

c
a
s
o

d
e
l

O
R
B

O
R
B
a
c
u
s
,

l
o
s

c
l
i
e
n
t
e
s

t
a
m
b
i

n

n
e
c
e
s
i
t
a
n

u
n

"
B
a
s
i
c

O
b
j
e
c
t

A
d
a
p
t
e
r
"

s
i

s
e

u
s
a
n

r
e
t
r
o
l
l
a
m
a
d
a
s

e
n

e
l

m

t
o
d
o

S
e
l
l
e
r
B
e
a
n
.
a
u
d
i
t
A
c
c
o
u
n
t
s
.

E
l

c
o
n
t
e
x
t
o

d
e

n
o
m
b
r
a
d
o
t
a
m
b
i

n

s
e

c
o
n
f
i
g
u
r
a

d
e

f
o
r
m
a

d
i
f
e
r
e
n
t
e

p
a
r
a

e
l

s
e
r
v
i
d
o
r

O
R
B
a
c
u
s

a
r
r
a
n
c
a
d
o

a
n
t
e
r
i
o
r
m
e
n
t
e
:


O
b
j
e
c
t

o
b
j

=









(
(
c
o
m
.
o
o
c
.
C
O
R
B
A
.
O
R
B
)
o
r
b
)
.
g
e
t
_
i
n
e
t
_
o
b
j
e
c
t

(
















"
l
o
c
a
l
h
o
s
t
"
,

















1
0
6
0
,

















"
D
e
f
a
u
l
t
N
a
m
i
n
g
C
o
n
t
e
x
t
"
)
;



N
a
m
i
n
g
C
o
n
t
e
x
t

n
c
t
x

=

N
a
m
i
n
g
C
o
n
t
e
x
t
H
e
l
p
e
r
.
n
a
r
r
o
w
(
o
b
j
)
;
C
l
a
s
e
s

H
e
l
p
e
r

y

H
o
l
d
e
r
L
a
s

r
e
f
e
r
e
n
c
i
a
s

a

o
b
j
e
t
o
s

r
e
m
o
t
o
s

e
n

C
O
R
B
A

u
s
a
n

u
n
a

c
l
a
s
e

H
e
l
p
e
r

p
a
r
a

r
e
c
u
p
e
r
a
r

u
n

v
a
l
o
r

d
e
s
d
e

e
s
e

o
b
j
e
t
o
.

U
n

m

t
o
d
o

u
s
a
d
o

c
o
m
u
n
m
e
n
t
e

e
s

e
l

m

t
o
d
o

H
e
l
p
e
r
,

q
u
e

a
s
e
g
u
r
a

q
u
e

e
l
o
b
j
e
t
o

e
s
t


e
n
c
a
s
t
a
d
o

c
o
r
r
e
c
t
a
m
e
n
t
e
.
L
a
s

c
l
a
s
e
s

H
o
l
d
e
r

c
o
n
t
i
e
n
e
n

v
a
l
o
r
e
s

d
e
v
u
e
l
t
o
s

c
u
a
n
d
o

s
e

u
s
a
n

p
a
r

m
e
t
r
o
s

i
n
o
u
t

o

o
u
t

e
n

u
n

m

t
o
d
o
.

E
l

l
l
a
m
a
d
o
r

p
r
i
m
e
r
o

e
j
e
m
p
l
a
r
i
z
a

l
a

c
l
a
s
e

H
o
l
d
e
r

a
p
r
o
p
i
a
d
a

p
a
r
a

e
s
e

t
i
p
o

y
r
e
c
u
p
e
r
a

e
l

v
a
l
o
r

d
e
s
d
e

l
a

c
l
a
s
e

c
u
a
n
d
o

l
a

l
l
a
m
a
d
a

r
e
t
o
r
n
a
.

E
n

e
l

s
i
g
u
i
e
n
t
e

e
j
e
m
p
l
o
,

e
l

v
a
l
o
r

d
e
l

c
o
n
t
a
d
o
r

c
u
s
t
o
m
S
e
a
r
c
h

s
e

c
o
n
f
i
g
u
r
a

y

r
e
c
u
p
e
r
a

d
e
s
p
u

s

d
e

q
u
e

s
e

h
a
y
a

l
l
a
m
a
d
o

a
c
u
s
t
o
m
S
e
a
r
c
h
.

E
n

e
l

l
a
d
o

d
e
l

s
e
r
v
i
d
o
r

e
l

v
a
l
o
r

d
e
l

c
o
n
t
a
d
o
r

s
e

s
e
l
e
c
c
i
o
n
a

l
l
a
m
a
n
d
o

a

c
o
u
n
t
.
v
a
l
u
e
=
n
e
w
v
a
l
u
e
.


I
n
t
H
o
l
d
e
r

c
o
u
n
t
=

n
e
w

I
n
t
H
o
l
d
e
r
(
)
;


s
f
i
e
l
d
=
r
e
g
R
e
f
.
c
u
s
t
o
m
S
e
a
r
c
h
(
s
f
i
e
l
d
,
c
o
u
n
t
)
;


S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
c
o
u
n
t

n
o
w

s
e
t

t
o

"
+
c
o
u
n
t
.
v
a
l
u
e
)
;
R
e
c
o
l
e
c
c
i

n

d
e

B
a
s
u
r
a
A
l

c
o
n
t
r
a
r
i
o

q
u
e

R
M
I
,

C
O
R
B
A

n
o

t
i
e
n
e

u
n

m
e
c
a
n
i
s
m
o

d
e

r
e
c
o
l
e
c
c
i

n

d
e

b
a
s
u
r
a

d
i
s
t
r
i
b
u
i
d
o
.

L
a
s

r
e
f
e
r
e
n
c
i
a
s

a

u
n

o
b
j
e
t
o

s
o
n

l
o
c
a
l
e
s

a
l

p
r
o
x
y

d
e
l

c
l
i
e
n
t
e

y

a
l

s
i
r
v
i
e
n
t
e

d
e
l

s
e
r
v
i
d
o
r
.

E
s
t
o
s
i
g
n
i
f
i
c
a

q
u
e

c
a
d
a

M

q
u
i
n
a

V
i
r
t
u
a
l

J
a
v
a
1

(
J
V
M
)

e
s

l
i
b
r
e

d
e

r
e
c
l
a
m
a
r

u
n

o
b
j
e
t
o

y

r
e
c
o
g
e
r

l
a

b
a
s
u
r
a

s
i

n
o

t
i
e
n
e

m

s

r
e
f
e
r
e
n
c
i
a
s

s
o
b
r
e

l
.

S
i

u
n

o
b
j
e
t
o

n
o

e
s

n
e
c
e
s
a
r
i
o

e
n

e
l

s
e
r
v
i
d
o
r
,
n
e
c
e
s
i
t
a
m
o
s

l
l
a
m
a
r

a

o
r
b
.
d
i
s
c
o
n
n
e
c
t
(
o
b
j
e
c
t
)

p
a
r
a

p
e
r
m
i
t
i
r

q
u
e

e
l

o
b
j
e
t
o

s
e
a

r
e
c
o
l
e
c
t
a
d
o
.
R
e
t
r
o
l
l
a
m
a
d
a
s

(
C
a
l
l
b
a
c
k
s
)

C
O
R
B
A
E
l

n
u
e
v
o

m

t
o
d
o

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s

e
s

l
l
a
m
a
d
o

d
e
s
d
e

e
l

A
u
c
t
i
o
n
S
e
r
v
l
e
t

u
s
a
n
d
o

l
a

U
R
L

h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
7
0
0
1
/
A
u
c
t
i
o
n
S
e
r
v
l
e
t
?
a
c
t
i
o
n
=
a
u
d
i
t
A
c
c
o
u
n
t
s
.
E
l

m

t
o
d
o

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
a
u
d
i
t
A
c
c
o
u
n
t
s

l
l
a
m
a

a
l

m

t
o
d
o

S
e
l
l
e
r
B
e
a
n
.
a
u
d
i
t
A
c
c
o
u
n
t
s
,

q
u
e

d
e
v
u
e
l
v
e

u
n

A
r
r
a
y
L
i
s
t

d
e

r
e
g
i
s
t
r
o
s

d
e

R
e
g
i
s
t
r
a
t
i
o
n
.
/
/
A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
j
a
v
a


p
r
i
v
a
t
e

v
o
i
d

a
u
d
i
t
A
c
c
o
u
n
t
s
(
S
e
r
v
l
e
t
O
u
t
p
u
t
S
t
r
e
a
m

o
u
t
,




H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t

r
e
q
u
e
s
t
)

t
h
r
o
w
s

I
O
E
x
c
e
p
t
i
o
n
{
/
/



.
.
.



S
e
l
l
e
r
H
o
m
e

h
o
m
e

=

(
S
e
l
l
e
r
H
o
m
e
)

c
t
x
.
l
o
o
k
u
p
(
"
s
e
l
l
e
r
"
)
;



S
e
l
l
e
r

s
i
=

h
o
m
e
.
c
r
e
a
t
e
(
)
;



i
f
(
s
i

!
=

n
u
l
l
)

{





A
r
r
a
y
L
i
s
t

a
r
=
s
i
.
a
u
d
i
t
A
c
c
o
u
n
t
s
(
)
;





f
o
r
(
I
t
e
r
a
t
o
r

i
=
a
r
.
i
t
e
r
a
t
o
r
(
)
;

i
.
h
a
s
N
e
x
t
(
)
;
)

{







R
e
g
i
s
t
r
a
t
i
o
n

u
s
e
r
=
(
R
e
g
i
s
t
r
a
t
i
o
n
)
(
i
.
n
e
x
t
(
)
)
;







a
d
d
L
i
n
e
(
"
<
T
D
>
"
+
u
s
e
r
.
g
e
t
U
s
e
r
(
)

+









"
<
T
D
>
<
T
D
>
"
+
u
s
e
r
.
g
e
t
B
a
l
a
n
c
e
(
)
+









"
<
T
D
>
<
T
R
>
"
,

o
u
t
)
;





}










a
d
d
L
i
n
e
(
"
<
T
A
B
L
E
>
"
,

o
u
t
)
;




}
E
l

o
b
j
e
t
o

S
e
l
l
e
r
B
e
a
n

l
l
a
m
a

a
l

m

t
o
d
o

C
O
R
B
A

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s

i
m
p
l
e
m
e
n
t
a
d
o

e
n

e
l

f
i
c
h
e
r
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a
,

y

s
e

p
a
s
a

u
n
a

r
e
f
e
r
e
n
c
i
a

a

s

m
i
s
m
o
.

L
a

r
e
f
e
r
e
n
c
i
a

e
s

p
a
s
a
d
a

s
i
e
m
p
r
e

q
u
e

l
a

c
l
a
s
e

S
e
l
l
e
r
B
e
a
n

i
m
p
l
e
m
e
n
t
e

e
l

i
n
t
e
r
f
a
c
e

R
e
t
u
r
n
R
e
s
u
l
t
s

d
e
c
l
a
r
a
d
o

e
n

e
l

R
e
g
i
s
t
r
a
t
i
o
n
.
i
d
l
.
/
/
S
e
l
l
e
r
B
e
a
n
.
j
a
v
a


p
u
b
l
i
c

A
r
r
a
y
L
i
s
t

a
u
d
i
t
A
c
c
o
u
n
t
s
(
)

{




t
r
y
{






N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

f
u
l
l
n
a
m
e

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
2
]
;






f
u
l
l
n
a
m
e
[
0
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
"
a
u
c
t
i
o
n
"
,

"
"
)
;






f
u
l
l
n
a
m
e
[
1
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(


























"
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
"
,

"
"
)
;






R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
R
e
f

=











R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
H
e
l
p
e
r
.
n
a
r
r
o
w
(





























n
c
t
x
.
r
e
s
o
l
v
e
(
f
u
l
l
n
a
m
e
)
)
;








r
e
g
R
e
f
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
(
t
h
i
s
)
;








s
y
n
c
h
r
o
n
i
z
e
d
(
r
e
a
d
y
)

{










t
r
y
{











r
e
a
d
y
.
w
a
i
t
(
)
;










}
c
a
t
c
h

(
I
n
t
e
r
r
u
p
t
e
d
E
x
c
e
p
t
i
o
n

e
)
{
}








}








r
e
t
u
r
n

(
r
e
t
u
r
n
e
d
)
;






}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{







S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
e
r
r
o
r

i
n

a
u
d
i
t
A
c
c
o
u
n
t
s

"
+
e
)
;






}






r
e
t
u
r
n

n
u
l
l
;


}
E
l

m

t
o
d
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s

r
e
c
u
p
e
r
a

l
o
s

r
e
g
i
s
t
r
o
s

d
e

u
s
u
a
r
i
o

d
e
s
d
e

l
a

t
a
b
l
a

R
e
g
i
s
t
r
a
t
i
o
n

d
e

l
a

b
a
s
e

d
e

d
a
t
o
s

q
u
e

t
e
n
g
a
n

u
n

v
a
l
o
r

d
e

c
r

d
i
t
o

m
e
n
o
r

d
e
t
r
e
s
.

E
n
t
o
n
c
e
s

d
e
v
u
e
l
v
e

l
a

l
i
s
t
a

d
e

r
e
g
i
s
t
r
o
s

R
e
g
i
s
t
r
a
t
i
o
n

e
n

u
n

A
r
r
a
y
L
i
s
t

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

S
e
l
l
e
r
B
e
a
n
.
u
p
d
a
t
e
R
e
s
u
l
t
s

q
u
e

t
i
e
n
e

u
n
a

r
e
f
e
r
e
n
c
i
a

a

e
l
l
a
.
/
/
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a


p
u
b
l
i
c

v
o
i
d

f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
(
















f
i
n
a
l

R
e
t
u
r
n
R
e
s
u
l
t
s

c
l
i
e
n
t
)
















t
h
r
o
w
s

F
i
n
d
e
r

E
x
c
e
p
t
i
o
n

{




R
u
n
n
a
b
l
e

b
g
t
h
r
e
a
d

=

n
e
w

R
u
n
n
a
b
l
e
(
)

{






p
u
b
l
i
c

v
o
i
d

r
u
n
(
)

{








C
o
n
n
e
c
t
i
o
n

c
o
n

=

n
u
l
l
;








R
e
s
u
l
t
S
e
t

r
s

=

n
u
l
l
;








P
r
e
p
a
r
e
d
S
t
a
t
e
m
e
n
t

p
s

=

n
u
l
l
;








A
r
r
a
y
L
i
s
t

a
r

=

n
e
w

A
r
r
a
y
L
i
s
t
(
)
;








t
r
y
{










c
o
n
=
g
e
t
C
o
n
n
e
c
t
i
o
n
(
)
;










p
s
=
c
o
n
.
p
r
e
p
a
r
e
S
t
a
t
e
m
e
n
t
(
















"
s
e
l
e
c
t

t
h
e
u
s
e
r
,

















b
a
l
a
n
c
e

f
r
o
m

r
e
g
i
s
t
r
a
t
i
o
n

















w
h
e
r
e

b
a
l
a
n
c
e

<

?
"
)
;










p
s
.
s
e
t
D
o
u
b
l
e
(
1
,

3
.
0
0
)
;










p
s
.
e
x
e
c
u
t
e
Q
u
e
r
y
(
)
;










r
s

=

p
s
.
g
e
t
R
e
s
u
l
t
S
e
t
(
)
;










R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

r
e
g
=
n
u
l
l
;










w
h
i
l
e

(
r
s
.
n
e
x
t
(
)
)

{












t
r
y
{













r
e
g
=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
(
)
;












}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{













S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
c
r
e
a
t
i
n
g

r
e
g
"
+
e
)
;












}












r
e
g
.
t
h
e
u
s
e
r

=

r
s
.
g
e
t
S
t
r
i
n
g
(
1
)
;












r
e
g
.
b
a
l
a
n
c
e

=

r
s
.
g
e
t
D
o
u
b
l
e
(
2
)
;












a
r
.
a
d
d
(
r
e
g
)
;










}










r
s
.
c
l
o
s
e
(
)
;










R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
[
]

r
e
g
a
r
r
a
y

=

















(
R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

[
]
)
a
r
.
t
o
A
r
r
a
y
(
















n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
[
0
]
)
;










c
l
i
e
n
t
.
u
p
d
a
t
e
R
e
s
u
l
t
s
(
r
e
g
a
r
r
a
y
)
;








}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{









S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(






















"
f
i
n
d
L
o
w
C
r
e
d
i
t
A
c
c
o
u
n
t
s
:

"
+
e
)
;










r
e
t
u
r
n
;








}








f
i
n
a
l
l
y

{








t
r
y
{












i
f
(
r
s

!
=

n
u
l
l
)

{














r
s
.
c
l
o
s
e
(
)
;












}












i
f
(
p
s

!
=

n
u
l
l
)

{













p
s
.
c
l
o
s
e
(
)
;












}












i
f
(
c
o
n

!
=

n
u
l
l
)

{














c
o
n
.
c
l
o
s
e
(
)
;












}










}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

i
g
n
o
r
e
)

{
}








}






}
/
/
r
u
n




}
;


T
h
r
e
a
d

t

=

n
e
w

T
h
r
e
a
d
(
b
g
t
h
r
e
a
d
)
;


t
.
s
t
a
r
t
(
)
;


}
E
l

m

t
o
d
o

S
e
l
l
e
r
B
e
a
n
.
u
p
d
a
t
e
R
e
s
u
l
t
s

a
c
t
u
a
l
i
z
a

e
l

A
r
r
a
y
L
i
s
t

g
l
o
b
a
l

d
e

r
e
g
i
s
t
r
o
s

d
e

R
e
g
i
s
t
r
a
t
i
o
n

d
e
v
u
e
l
t
o

p
o
r

e
l

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r

y

n
o
t
i
f
i
c
a

a
l

m

t
o
d
o
S
e
l
l
e
r
B
e
a
n
/
a
u
d
i
t
A
c
c
o
u
n
t
s

q
u
e

p
u
e
d
e

d
e
v
o
l
v
e
r

e
s
t
e

A
r
r
a
y
L
i
s
t

d
e

r
e
g
i
s
t
r
o
s

R
e
g
i
s
t
r
a
t
i
o
n

a
l

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.


p
u
b
l
i
c

v
o
i
d

u
p
d
a
t
e
R
e
s
u
l
t
s
(
R
e
g
i
s
t
r
a
t
i
o
n
[
]

a
r
)









t
h
r
o
w
s

r
e
g
i
s
t
r
a
t
i
o
n
.
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n

{




i
f
(
a
r

=
=

n
u
l
l
)

{










t
h
r
o
w

n
e
w

r
e
g
i
s
t
r
a
t
i
o
n
.
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
(
)
;




}




t
r
y
{






f
o
r
(
i
n
t

i
=
0
;

i
<

a
r
.
l
e
n
g
t
h
;

i
+
+
)

{








r
e
t
u
r
n
e
d
.
a
d
d
(
a
r
[
i
]
)
;






}




}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{





S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
u
p
d
a
t
e
R
e
s
u
l
t
s
=
"
+
e
)
;





t
h
r
o
w

n
e
w

r
e
g
i
s
t
r
a
t
i
o
n
.
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
(
)
;




}





s
y
n
c
h
r
o
n
i
z
e
d
(
r
e
a
d
y
)

{





r
e
a
d
y
.
n
o
t
i
f
y
A
l
l
(
)
;




}


}
U
s
a
r

e
l

T
i
p
o

A
n
y
E
l

m

t
o
d
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
c
u
s
t
o
m
S
e
a
r
c
h

u
s
a

e
l

t
i
p
o

A
n
y

d
e

I
D
L

p
a
r
a

p
a
s
a
r

y

d
e
v
o
l
v
e
r

r
e
s
u
l
t
a
d
o
s
.

E
l

c
u
s
t
o
m
S
e
a
r
c
h

e
s

l
l
a
m
a
d
o

p
o
r

e
l

A
u
c
t
i
o
n
S
e
r
v
l
e
t

d
e

e
s
t
a

f
o
r
m
a
:


h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
.
e
n
g
.
s
u
n
.
c
o
m
:
7
0
0
1
/





A
u
c
t
i
o
n
S
e
r
v
l
e
t
?
a
c
t
i
o
n
=
c
u
s
t
o
m
S
e
a
r
c
h
&
s
e
a
r
c
h
f
i
e
l
d
=
2
E
l

p
a
r

m
e
t
r
o

s
e
a
r
c
h
f
i
e
l
d

p
u
e
d
e

s
e
r

s
e
l
e
c
c
i
o
n
a
d
o

c
o
m
o

u
n

n

m
e
r
o

o

u
n

s
t
r
i
n
g
.

E
l

m

t
o
d
o

A
u
c
t
i
o
n
S
e
r
v
l
e
t
.
c
u
s
t
o
m
F
i
n
d

p
a
s
a

e
l

c
a
m
p
o

d
e

b

s
q
u
e
d
a

d
i
r
e
c
t
a
m
e
n
t
e

a
l

m

t
o
d
o
S
e
l
l
e
r
B
e
a
n
.
c
u
s
t
o
m
F
i
n
d

q
u
e

r
e
c
u
p
e
r
a

u
n

S
t
r
i
n
g

q
u
e

l
u
e
g
o

e
s

m
o
s
t
r
a
d
o

a
l

u
s
u
a
r
i
o
:


p
r
i
v
a
t
e

v
o
i
d

c
u
s
t
o
m
S
e
a
r
c
h
(
S
e
r
v
l
e
t
O
u
t
p
u
t
S
t
r
e
a
m

o
u
t
,















H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t

r
e
q
u
e
s
t
)
















t
h
r
o
w
s

I
O
E
x
c
e
p
t
i
o
n
{




S
t
r
i
n
g

t
e
x
t

=

"
C
u
s
t
o
m

S
e
a
r
c
h
"
;




S
t
r
i
n
g

s
e
a
r
c
h
F
i
e
l
d
=
r
e
q
u
e
s
t
.
g
e
t
P
a
r
a
m
e
t
e
r
(

































"
s
e
a
r
c
h
f
i
e
l
d
"
)
;




s
e
t
T
i
t
l
e
(
o
u
t
,

"
C
u
s
t
o
m

S
e
a
r
c
h
"
)
;




i
f
(
s
e
a
r
c
h
F
i
e
l
d

=
=

n
u
l
l

)

{






a
d
d
L
i
n
e
(
"
E
r
r
o
r
:

S
e
a
r
c
h
F
i
e
l
d

w
a
s

e
m
p
t
y
"
,

o
u
t
)
;






o
u
t
.
f
l
u
s
h
(
)
;






r
e
t
u
r
n
;




}




t
r
y
{






a
d
d
L
i
n
e
(
"
<
B
R
>
"
+
t
e
x
t
,

o
u
t
)
;






S
e
l
l
e
r
H
o
m
e

h
o
m
e

=

(
S
e
l
l
e
r
H
o
m
e
)




























c
t
x
.
l
o
o
k
u
p
(
"
s
e
l
l
e
r
"
)
;






S
e
l
l
e
r

s
i
=

h
o
m
e
.
c
r
e
a
t
e
(
)
;






i
f
(
s
i

!
=

n
u
l
l
)

{








S
t
r
i
n
g

d
i
s
p
l
a
y
M
e
s
s
a
g
e
=
s
i
.
c
u
s
t
o
m
F
i
n
d
(



































s
e
a
r
c
h
F
i
e
l
d
)
;








i
f
(
d
i
s
p
l
a
y
M
e
s
s
a
g
e

!
=

n
u
l
l

)

{










a
d
d
L
i
n
e
(
d
i
s
p
l
a
y
M
e
s
s
a
g
e
+
"
<
B
R
>
"
,

o
u
t
)
;








}






}




}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{





a
d
d
L
i
n
e
(
"
A
u
c
t
i
o
n
S
e
r
v
l
e
t

c
u
s
t
o
m
F
i
n
d

e
r
r
o
r
"
,
o
u
t
)
;





S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
A
u
c
t
i
o
n
S
e
r
v
l
e
t

"

+

























"
<
c
u
s
t
o
m
F
i
n
d
>
:
"
+
e
)
;




}




o
u
t
.
f
l
u
s
h
(
)
;


}
E
l

m

t
o
d
o

S
e
l
l
e
r
B
e
a
n
.
c
u
s
t
o
m
F
i
n
d

l
l
a
m
a

a
l

o
b
j
e
t
o

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

i
m
p
l
e
m
e
n
t
a
d
o

e
n

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a
,

y

d
e
p
e
n
d
i
e
n
d
o

d
e

s
i

e
l

s
e
a
r
c
h
F
i
e
l
d

p
u
e
d
e

s
e
r

c
o
n
v
e
r
t
i
d
o
a

u
n

d
o
u
b
l
e

o

a

u
n

s
t
r
i
n
g
,

i
n
s
e
r
t
a

e
s
t
e

v
a
l
o
r

d
e
n
t
r
o

d
e

u
n

o
b
j
e
t
o

d
e
l

t
i
p
o

A
n
y
.

E
l

o
b
j
e
t
o

A
n
y

s
e

c
r
e
a

m
e
d
i
a
n
t
e

u
n
a

l
l
a
m
a
d
a

a
l

O
R
B
,

o
r
b
.
c
r
e
a
t
e
_
a
n
y
(
)
;
E
l

m

t
o
d
o

c
u
s
t
o
m
F
i
n
d

t
a
m
b
i

n

u
s
a

u
n

p
a
r

m
e
t
r
o

o
u
t
,
c
o
u
n
t
,

d
e
l

t
i
p
o

i
n
t

q
u
e

d
e
v
u
e
l
v
e

e
l

n

m
e
r
o

d
e

r
e
g
i
s
t
r
o
s

e
n
c
o
n
t
r
a
d
o
s
.

E
l

v
a
l
o
r

d
e

c
o
u
n
t

s
e

r
e
c
u
p
e
r
a

u
s
a
n
d
o

c
o
u
n
t
.
v
a
l
u
e
c
u
a
n
d
o

l
a

l
l
a
m
a
d
a

r
e
t
o
r
n
a
:
/
/
S
e
l
l
e
r
B
e
a
n
.
j
a
v
a


p
u
b
l
i
c

S
t
r
i
n
g

c
u
s
t
o
m
F
i
n
d
(
S
t
r
i
n
g

s
e
a
r
c
h
F
i
e
l
d
)












t
h
r
o
w
s

j
a
v
a
x
.
e
j
b
.
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
,












R
e
m
o
t
e
E
x
c
e
p
t
i
o
n
{


i
n
t

t
o
t
a
l
=
-
1
;


I
n
t
H
o
l
d
e
r

c
o
u
n
t
=

n
e
w

I
n
t
H
o
l
d
e
r
(
)
;


t
r
y
{






N
a
m
e
C
o
m
p
o
n
e
n
t
[
]

f
u
l
l
n
a
m
e

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
[
2
]
;






f
u
l
l
n
a
m
e
[
0
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(
"
a
u
c
t
i
o
n
"
,

"
"
)
;






f
u
l
l
n
a
m
e
[
1
]

=

n
e
w

N
a
m
e
C
o
m
p
o
n
e
n
t
(


























"
R
e
g
i
s
t
r
a
t
i
o
n
B
e
a
n
"
,

"
"
)
;






R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e

r
e
g
R
e
f

=









R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
H
e
l
p
e
r
.
n
a
r
r
o
w
(




























n
c
t
x
.
r
e
s
o
l
v
e
(
f
u
l
l
n
a
m
e
)
)
;






i
f
(
r
e
g
R
e
f

=
=

n
u
l
l

)

{








S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(





















"
c
a
n
n
o
t

c
o
n
t
a
c
t

R
e
g
i
s
t
r
a
t
i
o
n
H
o
m
e
"
)
;








t
h
r
o
w

n
e
w

j
a
v
a
x
.
e
j
b
.
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
(
)
;






}






A
n
y

s
f
i
e
l
d
=
o
r
b
.
c
r
e
a
t
e
_
a
n
y
(
)
;






D
o
u
b
l
e

b
a
l
a
n
c
e
;






t
r
y
{








b
a
l
a
n
c
e
=
D
o
u
b
l
e
.
v
a
l
u
e
O
f
(
s
e
a
r
c
h
F
i
e
l
d
)
;








t
r
y

{












s
f
i
e
l
d
.
i
n
s
e
r
t
_
d
o
u
b
l
e
(
b
a
l
a
n
c
e
.
d
o
u
b
l
e
V
a
l
u
e
(
)
)
;








}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{









r
e
t
u
r
n
(
"
P
r
o
b
l
e
m

w
i
t
h

s
e
a
r
c
h

v
a
l
u
e
"
+
b
a
l
a
n
c
e
)
;








}







s
f
i
e
l
d
=
r
e
g
R
e
f
.
c
u
s
t
o
m
S
e
a
r
c
h
(
s
f
i
e
l
d
,
c
o
u
n
t
)
;







i
f
(
s
f
i
e
l
d

!
=

n
u
l
l

)

{









t
o
t
a
l
=
s
f
i
e
l
d
.
e
x
t
r
a
c
t
_
l
o
n
g
(
)
;







}







r
e
t
u
r
n
(
t
o
t
a
l
+
"









a
c
c
o
u
n
t
s

a
r
e

b
e
l
o
w

o
p
t
i
m
a
l

l
e
v
e
l

f
r
o
m
"

+








c
o
u
n
t
.
v
a
l
u
e
+
"

r
e
c
o
r
d
s
"
)
;





}
c
a
t
c
h

(
N
u
m
b
e
r
F
o
r
m
a
t
E
x
c
e
p
t
i
o
n

e
)

{






s
f
i
e
l
d
.
i
n
s
e
r
t
_
s
t
r
i
n
g
(
s
e
a
r
c
h
F
i
e
l
d
)
;






R
e
g
i
s
t
r
a
t
i
o
n

r
e
g
;






i
f
(
(
r
e
g
=
R
e
g
i
s
t
r
a
t
i
o
n
H
e
l
p
e
r
.
e
x
t
r
a
c
t
(
















r
e
g
R
e
f
.
c
u
s
t
o
m
S
e
a
r
c
h
(

























s
f
i
e
l
d
,
c
o
u
n
t
)
)
)


























!
=

n
u
l
l

)

{








r
e
t
u
r
n
(
"
F
o
u
n
d

u
s
e
r

"
+
r
e
g
.
g
e
t
U
s
e
r
(
)

+
"

















w
h
o

h
a
s

e
m
a
i
l

a
d
d
r
e
s
s

"
+
















r
e
g
.
g
e
t
E
m
a
i
l
A
d
d
r
e
s
s
(
)
)
;






}
e
l
s
e

{







r
e
t
u
r
n
(
"
N
o

u
s
e
r
s

f
o
u
n
d

w
h
o

h
a
v
e

e
m
a
i
l

a
d
d
r
e
s
s

"

+
















s
e
a
r
c
h
F
i
e
l
d
)
;






}





}




}
c
a
t
c
h
(
E
x
c
e
p
t
i
o
n

e
)
{








S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
c
u
s
t
o
m
F
i
n
d

p
r
o
b
l
e
m
=
"
+
e
)
;








t
h
r
o
w

n
e
w

j
a
v
a
x
.
e
j
b
.
F
i
n
d
e
r
E
x
c
e
p
t
i
o
n
(
)
;




}


}
E
l

v
a
l
o
r

d
e
v
u
e
l
t
o

d
e
s
d
e

l
a

l
l
a
m
a
d
a

a

c
u
s
t
o
m
F
i
n
d

s
e

e
x
t
r
a
e

d
e
n
t
r
o

d
e

u
n

o
b
j
e
t
o

d
e
l

t
i
p
o

A
n
y

y

s
e

c
o
n
s
t
r
u
y
e

u
n

S
t
r
i
n
g

c
o
n

l
a

s
a
l
i
d
a

m
o
s
t
r
a
d
a

a
l

u
s
u
a
r
i
o
.

P
a
r
a

l
o
s

t
i
p
o
s

s
e
n
c
i
l
l
o
s

s
e
p
u
e
d
e

u
s
a
r

e
l

m

t
o
d
o

e
x
t
r
a
c
t
_
<
t
y
p
e
>

d
e

A
n
y
.

S
i
n

e
m
b
a
r
g
o
,

p
a
r
a

e
l

t
i
p
o

R
e
g
i
s
t
r
a
t
i
o
n
,

s
e

u
s
a

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
H
e
l
p
e
r
.


R
e
g
i
s
t
r
a
t
i
o
n

r
e
g

=




R
e
g
i
s
t
r
a
t
i
o
n
H
e
l
p
e
r
.
e
x
t
r
a
c
t
(

















r
e
g
R
e
f
.
c
u
s
t
o
m
S
e
a
r
c
h
(
s
f
i
e
l
d
,
c
o
u
n
t
)
)
E
l

m

t
o
d
o

R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
c
u
s
t
o
m
S
e
a
r
c
h

d
e
t
e
r
m
i
n
a

e
l

t
i
p
o

d
e
l

o
b
j
e
t
o

q
u
e

e
s
t


s
i
e
n
d
o

p
a
s
a
d
o

e
n

e
l

p
a
r

m
e
t
r
o

s
e
a
r
c
h
F
i
e
l
d

c
h
e
q
u
e
a
n
d
o

e
l

.
t
y
p
e
(
)
.
k
i
n
d
(
)
.
v
a
l
u
e
(
)

d
e
l

o
b
j
e
t
o
A
n
y
.

i
f
(
s
e
a
r
c
h
F
i
e
l
d
.
t
y
p
e
(
)
.
k
i
n
d
(
)
.
v
a
l
u
e
(
)

=
=


























T
C
K
i
n
d
.
_
t
k
_
d
o
u
b
l
e
)
F
i
n
a
l
m
e
n
t
e
,

c
o
m
o

e
l

m

t
o
d
o

c
u
s
t
o
m
S
e
a
r
c
h

d
e
v
u
e
l
v
e

u
n

o
b
j
e
t
o

d
e
l

t
i
p
o

A
n
y
,

s
e

r
e
q
u
i
e
r
e

u
n
a

l
l
a
m
a
d
a

a

o
r
b
.
c
r
e
a
t
e
_
a
n
y
(
)
.

P
a
r
a

t
i
p
o
s

s
e
n
c
i
l
l
o
s

c
o
m
o

d
o
u
b
l
e
,

s
e

u
s
a

e
l

m

t
o
d
o
i
n
s
e
r
t
_
<
t
y
p
e
>
.

P
a
r
a

e
l

t
i
p
o

R
e
g
i
s
t
r
a
t
i
o
n

,

s
e

u
s
a

l
a

c
l
a
s
e

R
e
g
i
s
t
r
a
t
i
o
n
H
e
l
p
e
r
:
R
e
g
i
s
t
r
a
t
i
o
n
H
e
l
p
e
r
.
i
n
s
e
r
t
(
r
e
t
u
r
n
R
e
s
u
l
t
s
,

r
e
g
a
r
r
a
y
[
0
]
)
.
/
/
R
e
g
i
s
t
r
a
t
i
o
n
S
e
r
v
e
r
.
j
a
v
a


p
u
b
l
i
c

A
n
y

c
u
s
t
o
m
S
e
a
r
c
h
(
A
n
y

s
e
a
r
c
h
F
i
e
l
d
,



























I
n
t
H
o
l
d
e
r

c
o
u
n
t
)
{




A
n
y

r
e
t
u
r
n
R
e
s
u
l
t
s
=

o
r
b
.
c
r
e
a
t
e
_
a
n
y
(
)
;




i
n
t

t
m
p
c
o
u
n
t
=
c
o
u
n
t
.
v
a
l
u
e
;




i
f
(
s
e
a
r
c
h
F
i
e
l
d
.
t
y
p
e
(
)
.
k
i
n
d
(
)
.
v
a
l
u
e
(
)

=
=



























T
C
K
i
n
d
.
_
t
k
_
d
o
u
b
l
e
)
{
/
/

r
e
t
u
r
n

n
u
m
b
e
r

o
f

b
a
l
a
n
c
e
s

g
r
e
a
t
e
r

/
/

t
h
a
n

s
u
p
p
l
i
e
d

a
m
o
u
n
t






d
o
u
b
l
e

f
i
n
d
B
a
l
a
n
c
e
=
s
e
a
r
c
h
F
i
e
l
d
.
e
x
t
r
a
c
t
_
d
o
u
b
l
e
(
)
;






C
o
n
n
e
c
t
i
o
n

c
o
n

=

n
u
l
l
;






R
e
s
u
l
t
S
e
t

r
s

=

n
u
l
l
;






P
r
e
p
a
r
e
d
S
t
a
t
e
m
e
n
t

p
s

=

n
u
l
l
;






t
r
y
{








c
o
n
=
g
e
t
C
o
n
n
e
c
t
i
o
n
(
)
;








p
s
=
c
o
n
.
p
r
e
p
a
r
e
S
t
a
t
e
m
e
n
t
(
"
s
e
l
e
c
t

c
o
u
n
t
(
*
)

f
r
o
m























r
e
g
i
s
t
r
a
t
i
o
n

w
h
e
r
e

b
a
l
a
n
c
e

<

?
"
)
;








p
s
.
s
e
t
D
o
u
b
l
e
(
1
,

f
i
n
d
B
a
l
a
n
c
e
)
;








p
s
.
e
x
e
c
u
t
e
Q
u
e
r
y
(
)
;








r
s

=

p
s
.
g
e
t
R
e
s
u
l
t
S
e
t
(
)
;








i
f
(
r
s
.
n
e
x
t
(
)
)

{










t
m
p
c
o
u
n
t

=

r
s
.
g
e
t
I
n
t
(
1
)
;








}








c
o
u
n
t
.
v
a
l
u
e
=
t
m
p
c
o
u
n
t
;








r
s
.
c
l
o
s
e
(
)
;







}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{

















S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
c
u
s
t
o
m

s
e
a
r
c
h
:

"
+
e
)
;

















r
e
t
u
r
n
R
e
s
u
l
t
s
.
i
n
s
e
r
t
_
l
o
n
g
(
-
1
)
;

















r
e
t
u
r
n
(
r
e
t
u
r
n
R
e
s
u
l
t
s
)
;







}







f
i
n
a
l
l
y

{









t
r
y
{











i
f
(
r
s

!
=

n
u
l
l
)

{

r
s
.
c
l
o
s
e
(
)
;

}











i
f
(
p
s

!
=

n
u
l
l
)

{

p
s
.
c
l
o
s
e
(
)
;

}











i
f
(
c
o
n

!
=

n
u
l
l
)

{

c
o
n
.
c
l
o
s
e
(
)
;

}









}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

i
g
n
o
r
e
)

{
}







}









r
e
t
u
r
n
R
e
s
u
l
t
s
.
i
n
s
e
r
t
_
l
o
n
g
(
t
m
p
c
o
u
n
t
)
;









r
e
t
u
r
n
(
r
e
t
u
r
n
R
e
s
u
l
t
s
)
;





}
e
l
s
e

i
f
(
s
e
a
r
c
h
F
i
e
l
d
.
t
y
p
e
(
)
.
k
i
n
d
(
)
.
v
a
l
u
e
(
)

=
=

















T
C
K
i
n
d
.
_
t
k
_
s
t
r
i
n
g
)

{






/
/

r
e
t
u
r
n

e
m
a
i
l

a
d
d
r
e
s
s
e
s

t
h
a
t

m
a
t
c
h

s
u
p
p
l
i
e
d

a
d
d
r
e
s
s






S
t
r
i
n
g

f
i
n
d
E
m
a
i
l
=
s
e
a
r
c
h
F
i
e
l
d
.
e
x
t
r
a
c
t
_
s
t
r
i
n
g
(
)
;






C
o
n
n
e
c
t
i
o
n

c
o
n

=

n
u
l
l
;






R
e
s
u
l
t
S
e
t

r
s

=

n
u
l
l
;






P
r
e
p
a
r
e
d
S
t
a
t
e
m
e
n
t

p
s

=

n
u
l
l
;






A
r
r
a
y
L
i
s
t

a
r

=

n
e
w

A
r
r
a
y
L
i
s
t
(
)
;






R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

r
e
g
=
n
u
l
l
;






t
r
y
{








c
o
n
=
g
e
t
C
o
n
n
e
c
t
i
o
n
(
)
;








p
s
=
c
o
n
.
p
r
e
p
a
r
e
S
t
a
t
e
m
e
n
t
(
"
s
e
l
e
c
t

t
h
e
u
s
e
r
,












e
m
a
i
l
a
d
d
r
e
s
s

f
r
o
m

r
e
g
i
s
t
r
a
t
i
o
n












w
h
e
r
e

e
m
a
i
l
a
d
d
r
e
s
s

l
i
k
e

?
"
)
;








p
s
.
s
e
t
S
t
r
i
n
g
(
1
,

f
i
n
d
E
m
a
i
l
)
;








p
s
.
e
x
e
c
u
t
e
Q
u
e
r
y
(
)
;








r
s

=

p
s
.
g
e
t
R
e
s
u
l
t
S
e
t
(
)
;








w
h
i
l
e

(
r
s
.
n
e
x
t
(
)
)

{










r
e
g
=

n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
(
)
;










r
e
g
.
t
h
e
u
s
e
r

=

r
s
.
g
e
t
S
t
r
i
n
g
(
1
)
;










r
e
g
.
e
m
a
i
l
a
d
d
r
e
s
s

=

r
s
.
g
e
t
S
t
r
i
n
g
(
2
)
;










a
r
.
a
d
d
(
r
e
g
)
;








}








r
s
.
c
l
o
s
e
(
)
;








R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
[
]

r
e
g
a
r
r
a
y

=














(
R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l

[
]
)
a
r
.
t
o
A
r
r
a
y
(













n
e
w

R
e
g
i
s
t
r
a
t
i
o
n
I
m
p
l
[
0
]
)
;










R
e
g
i
s
t
r
a
t
i
o
n
H
e
l
p
e
r
.
i
n
s
e
r
t
(































r
e
t
u
r
n
R
e
s
u
l
t
s
,
































r
e
g
a
r
r
a
y
[
0
]
)
;










r
e
t
u
r
n
(
r
e
t
u
r
n
R
e
s
u
l
t
s
)
;







}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{








S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
c
u
s
t
o
m

s
e
a
r
c
h
:

"
+
e
)
;








r
e
t
u
r
n
(
r
e
t
u
r
n
R
e
s
u
l
t
s
)
;







}







f
i
n
a
l
l
y

{








t
r
y
{










i
f
(
r
s

!
=

n
u
l
l
)

{

r
s
.
c
l
o
s
e
(
)
;

}










i
f
(
p
s

!
=

n
u
l
l
)

{

p
s
.
c
l
o
s
e
(
)
;

}










i
f
(
c
o
n

!
=

n
u
l
l
)

{

c
o
n
.
c
l
o
s
e
(
)
;

}








}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

i
g
n
o
r
e
)

{
}






}




}




r
e
t
u
r
n
(
r
e
t
u
r
n
R
e
s
u
l
t
s
)
;


}
C
o
n
c
l
u
s
i

n
C
o
m
o

h
e
m
o
s

p
o
d
i
d
o

v
e
r
,

c
o
n
v
e
r
t
i
r

u
n
a

a
p
l
i
c
a
c
i

n

p
a
r
a

q
u
e

u
s
e

R
M
I

o

C
O
R
B
A

r
e
q
u
i
e
r
e

m
u
y

p
o
c
o
s

c
a
m
b
i
o
s

e
n

e
l

c
o
r
a
z

n

d
e
l

p
r
o
g
r
a
m
a
.

L
a

p
r
i
n
c
i
p
a
l

d
i
f
e
r
e
n
c
i
a

h
a

s
i
d
o

l
a

i
n
i
c
i
a
l
i
z
a
c
i

n

y
e
l

s
e
r
v
i
c
i
o

d
e

n
o
m
b
r
e
s
.

M
e
d
i
a
n
t
e

l
a

a
b
s
t
r
a
c
c
i

n

d
e

e
s
t
a
s

d
o
s

r
e
a
s

e
n

n
u
e
s
t
r
a

a
p
l
i
c
a
c
i

n

f
u
e
r
a

d
e

l
a

l

g
i
c
a

d
e
l

n
e
g
o
c
i
o

p
o
d
e
m
o
s

m
i
g
r
a
r

f

c
i
l
m
e
n
t
e

e
n
t
r
e

d
i
f
e
r
e
n
t
e
s

a
r
q
u
i
t
e
c
t
u
r
a
s

d
e
o
b
j
e
t
o
s

d
i
s
t
r
i
b
u
i
d
o
s
.
_
_
_
_
_
_
_
1

C
u
a
n
d
o

s
e

u
s
a
n

e
n

t
o
d
a

e
s
t
a

s
i
t
e
,

l
o
s

t

r
m
i
n
o
s
,

"
J
a
v
a

v
i
r
t
u
a
l

m
a
c
h
i
n
e
"

o

"
J
V
M
"

s
i
g
n
i
f
i
c
a

u
n
a

m

q
u
i
n
a

v
i
r
t
u
a
l

d
e

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a
.
O
z
i
t
o
JDBC
La aplicacin de subasta con JavaBeans Enterpise y con sus dos variantes de
"Remote Method Invocation" (RMI) y "Common Object Request Broker" (CORBA)
han usado llamadas sencillas de JDBC JDBC
TM
para actualizar y consultar
informacin desde una base de datps usando una conexin JDBC. Por defecto, el
acceso a bases de datos JDBC implica abrir una conexin con la base de datos,
ejecutar comandos SQL en un sentencia, procesar los datos devueltos y cerrar la
conexin con la base de datos.
En conjunto, la aproximacin por defecto funciona bien para bajos volmenes de
acceso a la base de datos, pero cmo podemos manejar un gran nmero de
peticiones que actualizan muchas tablas relacionadas a la vez y an as asegurar la
integridad de los datos? Esta seccin explica cmo hacerlo con los siguientes
tpicos:
Drivers JDBC
Conexiones a Bases de Datos
Sentencias
Sentencias Callable
Sentencias
Sentencias Prepared

Cachear los Resultados de la Base de Datos
Hoja de Resultados
Hoja de Resultados Escrollable
Controlar Transaciones
Caracteres de Escape
Tipos de Mapeo de Bases de Datos
Mapear Tipos de Datos
Drivers JDBC
La conexin con la base de datos est manejada por la clase Driver JDBC. El SDK
de Java contiene slo un driver JDBC, un puente jdbc-odbc que comunica con un
driver "Open DataBase Conectivity" (ODBC) existente. Otras bases de datos
necesitan un driver JDBC espcifico para esa base de datos.
Para obtener un idea general de lo que hacer un driver JDBC, podemos examinar el
fichero JDCConnectionDriver.java. La clase JDCConnectionDriver implemta la
clase java.sql.Driver y acta como un driver "pass-through" re-enviando
peticiones JDBC al driver JDBC real de la base de datos. La clase driver JDBC se
carga con un llamada a Class.forName(drivername).
Estas lneas de cdigo muestran cmo cargar tres clases diferentes de drivers
JDBC:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Class.forName("postgresql.Driver");
Class.forName("oracle.jdbc.driver.OracleDriver");
Cada driver JDBC est configurado para entender una URL especfica, por eso se
pueden cargar varios drivers JDBC a la vez. Cuando especificamos una URL en el
momento de la conexin, se selecciona el primer driver JDBC que corresponda.
El puente jdbc-odbc acepta URLS que empiecen con jdbc:odbc: y usa el siguiente
campo de esa URL para especificar el nombre de la fuente de los datos. Este
nombre identifica el esquema de la base de datos particular a la que queremos
acceder. La URL tambin puede incluir ms detalles sobre cmo contactyar con la
base de datos e introducir la cuenta.
//access the ejbdemo tables
String url = "jdbc:odbc:ejbdemo";
El siguiente ejemplo contiene la informacin de Oracle SQL*net sobre una base de
datos particular llamada ejbdemo en la mquina dbmachine:
String url = "jdbc:oracle:thin:user/password@(
description=(address_list=(
address=(protocol=tcp)
(host=dbmachine)(port=1521)))(source_route=yes)
(connect_data=(sid=ejbdemo)))";
Este siguiente ejemplo usa mysql para conectar con la base de datos ejbdemo en
la mquina local. Tambin se incluyen los detalles del nombre de usuario y la
password para el login.
String url =
"jdbc:mysql://localhost/ejbdemo?user=user;
password=pass";
Los drivers JDBC se dividen en cuatro tipos. Tambin se pueden categorizar como
puro java o drivers pequeos para indicar si son usados por aplicaciones clientes
(drivers puro java) o por applets (drivers pequeos).
Drivers del Tipo 1
Los drivers JDBC del tipo 1 son drivers puente como el puente jdbc.odbc. Estos
drivers utilizan un intermediario como el ODBC para transferir las llamadas SQL a
la base de datos. Los drivers puente cuentan con cdigo nativo, aunque la librera
de cdigo nativo del puente jdbc-odbc forma parte de la Mquina Virtual Java 2
1
.
Drivers del Tipo 2
Los drivers del tipo 2 usan el API existente de la base de datos para comunicarla
con el cliente. Aunque los drivers del tipo 2 son ms rpidos que los del tipo 1, los
del tipo 2 usan cdigo nativo y requieren permisos adicionales para funcionar en un
applet.
Un driver del tipo 2 podra necesitar cdigo de base de datos en el lado del cliente
para conectar a travs de la red.
Drivers del Tipo 3
Los Drivers del tipo 3 llaman al API de la base de datos en el servidor. Las
peticiones JDBC desde el cliente son primero comprobadas por el Driver JDBC en el
servidor para ejecutarse. Los drivers del tipo 3 y 4 pueden usarse en clientes
applets ya que no necesitan cdigo nativo.
Driveres del Tipo 4
El nivel ms alto de drivers reimplementa el API de red para base de datos en el
lenguaje Java. Los Drivers del tipo 4 tambin pueden usarse en clientes applets
porque no necesitan cdigo nativo.
Conexiones a Bases de Datos
Una conexin con una base de datso puede establecerese con un llamada al
mtodo DriverManager.getConnection. La llamada toma una URL que identifica
la base de datos, y opcionalmente el nombre de usuario y la password para la base
de datos.
Connection con = DriverManager.getConnection(url);
Connection con = DriverManager.getConnection(url,
"user", "password");
Despus de establecer la conexin, se puede ejecutar una sentencia contra la base
de datos. Los resultados de la sentencias pueden recuperarse y cerrarse la
conexin.
Una caractersticas til de la clase DriverManager es el mtodo setLogStream.
Podemos usar este mtodo para generar informacin de seguimiento para
ayudarnos a dignosticar problemas de conexin que normalmente no seran
visibles. Para generar la informacin de seguimiento, slo tenemos que llamar al
mtodo de esta forma:
DriverManager.setLogStream(System.out);
La seccin Connection Pooling en el captulo 8 muestra cmo podemos mejorar las
conexin JDBC sin cerrrar la conexin una vez completada la sentencia. Cada
conexin JDBC a una base de datos provoca una sobrecarga al abrir un nuevo
socket y usar el nombre de usuario y la password para login en la base de datos.
La reutilizacin de las conexiones reduce la sobrecarga. Las colas de Conexiones
mantienen una lista de conexiones abiertas y limpia cualquier conexin que no
pueda ser reutilizada.
Sentencias
Hay tres tipos bsicos de sentencias SQL usadas en el API JDBC:
CallabelStatement, Statement, y PreparedStatement. Cuando se enva una
sentencias Statement o PreparedStatement a la base de datos, el driver la
traduce a un formato que la base de datos pueda reconocer.
Sentencias Callable
Una vez que hemos establecido una conexin con una base de datos, podemos
usar el mtodo Connection.prepareCall para crear una sentencia callable. Estas
sentencias nos permite ejecutar prodecimientos almacenados SQL.
El siguiente ejemplo crea un objeto CallableStatement con tres parmetros para
almacenar informacin de la cuenta de login:
CallableStatement cs =
con.prepareCall("{call accountlogin(?,?,?)}");
cs.setString(1,theuser);
cs.setString(2,password);
cs.registerOutParameter(3,Types.DATE);
cs.executeQuery();
Date lastLogin = cs.getDate(3);
Statements
El interface Statement nos permite ejecutar una simple sentencias SQL sin
parmetros. Las instrucciones SQL son insertadas dentro del objeto Statement
cuando se llama al mtodo Statement.executeXXX method.
Sentencias Query: Este segmento de cdigo crea un objeto Statement y llama
al mtodo Statement.executeQuery para seleccionar texto desde la base de
datos dba. El resultado de la consulta se devuelve en un objeto ResultSet. Cmo
recuperar los resultados desde este objeto ResultSet se explica ms abajo en
Hoja de Resultados.
Statement stmt = con.createStatement();
ResultSet results = stmt.executeQuery(
"SELECT TEXT FROM dba ");
Sentencias Update: Este segmento de cdigo crea un objeto Statement y llama
al mtodo Statement.executeUpdate para aadir una direccin de email a una
tabla de la base de datos dba:
String updateString =
"INSERT INTO dba VALUES (some text)";
int count = stmt.executeUpdate(updateString);
Setencias Prepared
El interface PreparedStatement desciende del interface Statement y usa una
plantilla para crear peticiones SQL. Se usa una PreparedStatement para enviar
sentencias SQL precompiladas con uno o ms parmetros.
Query PreparedStatement: Creamos un objeto PreparedStatement
especificando la definicin de plantilla y la situacin de los parmetros. Los datos
de los parmetros se insertan dentro del objeto PreparedStatement llamando a
sus mtodos setXXX y especificando el parmetro y su dato. Las instrucciones SQL
y los parmetros son enviados a la base de datos cuando se llama al mtodo
executeXXX.
Este segmento de cdigo crea un objeto PreparedStatement para seleccionar
datos de usuarios basados en la direccin email del usuario. El interrogante ("?")
indica que este sentencia tiene un parmetro:
PreparedStatement pstmt = con.prepareStatement("
select theuser from
registration where
emailaddress like ?");
//Initialize first parameter with email address
pstmt.setString(1, emailAddress);
ResultSet results = ps.executeQuery();
Una vez que se ha inicializado la plantilla PreparedStatement slo se insertan los
valores modificados para cada llamadas:
pstmt.setString(1, anotherEmailAddress);
Nota: No todos los drivers de bases de datos compilan sentencias
preparadas.
Update PreparedStatement: Este segmento de cdigo crea un objeto
PreparedStatement para actualizar el registro de un vendedor. La plantilla tiene
cinco parmetros, que se seleccionan con cinco llamadas a los mtodos
PreparedStatement.setXXX apropiados.
PreparedStatement ps = con.prepareStatement(
"insert into registration(theuser, password,
emailaddress, creditcard,
balance) values (
?, ?, ?, ?, ?)");
ps.setString(1, theuser);
ps.setString(2, password);
ps.setString(3, emailaddress);
ps.setString(4, creditcard);
ps.setDouble(5, balance);
ps.executeUpdate();
Cachear los Resultados de la Base de Datos
El concepto PreparedStatement de reutilizar peticiones puede extenderse al
cacheo de resultados de una llamada JDBC. Por ejemplo, una descripcin de un
tem de la subastas permanece igual hasta que el vendedor lo cambia. Si el tem
recibe cientos de peticiones, el resultado de la sentencia: query "select
description from auctionitems where item_id='4000343'" podra ser
almacenado de forma ms eficiente en un tabla hash.
Almacenar resultados en una tbal hash requiere que la llamada JDBC sea
interceptada antes de crear una sentencia real que devuelva los resultados
cacheados, y la entrada del cach debe limpiarse si hay una actualizacin
correspondiente con ese item_id.
Hoja de Resultados
El interface ResultSet maneja accesos a datos devueltos por una consulta. Los
datos devueltos son igual a una lnea de la base de la tabla de la base de datos.
Algunas consultas devuelven una lnea, mientras que muchas consultas devuelven
mltiples lneas de datos.
Se utilizan los mtodos getType para recuperar datos desde columnas especficas
para cada fila devuelta en la consulta. Este ejemplo recupera la columna TEXT de
todas las tablas con una columna TEXT en la base de datosdba. El mtodo
results.next mueve hasta la siguiente fila recuperada hasta que se hayan
procesado todas las filas devueltas:
Statement stmt = con.createStatement();
ResultSet results = stmt.executeQuery(
"SELECT TEXT FROM dba ");
while(results.next()){
String s = results.getString("TEXT");
displayText.append(s + "\n");
}
stmt.close();
Hoja de Resultados Scrollable
Antes del JDBC 2.0, los dirvers JDBC devolvan hojas de resultado de slo lectura
con cursores que slo se movan en una direccin, hacia adelante. Cada elemento
era recuperado mediante una llamada al mtodo next de la hoja de resultados.
JDBC 2.0 introduce las hojas de resultados scrollables cuyos valores pueden ser
ledos y actualizados si as lo permite la base de datos original. Con las hojas de
resultados scrollables, cualquier fila puede ser seleccionada de forma aleatorio, y
nos podemos mover por la hoja de resultados hacia adelante y hacia atrs.
Una ventaja de la nueva hoja de resultados es que podemos actualizar un conjunto
de filas correspondientes son tener que enviar una llamada adicional a
executeUpdate. Las actualizaciones se hacen llamando a JDBC y no se necesitan
comandos SQL personalinzados. Esto aumenta la portabilidad del cdigo de la base
de datos que creemos.
Tanto Statements como PreparedStatements tienen un constructor adicional
que acepta un parmetro tipo scroll y otro tipo update. El valor del tipo scroll
puede ser uno de los siguientes valores:
ResultSet.TYPE_FORWARD_ONLY
Comportamiento por defecto en JDBC 1.0, la aplicacin slo puede llamar a
next() sobre la hoja de resultados.

ResultSet.SCROLL_SENSITIVE
La hoja de resultados es totalmente navegable y las actualizaciones son
reflejadas en la hoja de resultados cuando ocurren.

ResultSet.SCROLL_INSENSITIVE
La hoja de resultados es totalmente navegable pero las actualizaciones son
slo visibles cuando se cierra la hoja de resultados. Necesitamos crear una
nueva hoja de resultados para verlos.

El parmetro del tipo update puede ser uno de estos dos valores:
ResultSet.CONCUR_READ_ONLY
La hoja de resultados es de slo lectura.

ResultSet.CONCUR_UPDATABLE
La hoja de resultados puede ser actualizada.

Podemos verificar que nuestra base de datos soporta estos tipos llamando al
mtodo con.getMetaData().supportsResultSetConcurrency() como se ve
aqu:
Connection con = getConnection();
if(con.getMetaData().supportsResultSetConcurrency(
ResultSet.SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE)) {
PreparedStatement pstmt = con.prepareStatement(
"select password, emailaddress,
creditcard, balance from
registration where theuser = ?",
ResultSet.SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
Navegar por la Hoja de Resultados
La hoja de resultados totalmente scrollable devuelve un cursor que puede moverse
usando comandos sencillos. Por defecto el cursor de la hoja de resultados apunta a
la fila antes de la primera fila en la hoja de resultados. Una llamada a next()
recupera la primera fila de la hoja de resultados. el cursor puede tambien moverse
llamando a uno de los siguientes mtodos de ResultSet:
beforeFirst(): Posicin por defecto. Pone el cursor antes de la primera fila de
la hoja de resultados.

first(): Pone el cursor en la primera fila de la hoja de resultados.
last(): Pone el cursor antes de la ltima fila de la hoja de resultados.
afterLast() Pone el cursor ms all de la ltima fila de la hoja de resultados.
Se llama a previous para movernos hacia atrs en la hoja de resultados.

absolute(pos): Pone el cursor en el nmero de fila indicado donde
absolute(1) es la primera fila y absolute(-1) es la ltima fila.

relative(pos): Pone el cursor en una lnea relativa a la posicin actual donde
relative(1) mueve el cursor una fila hacia adelante.

Actualizar la Hoja de Resultados
Podemos actualizar un valor en la hoja de resultados llamando al mtodo
ResultSet.update<type> sobre la fula donde est posicionado el cursor. El valor
del tipo aqu es el midmo usando cuando se recupera un valor de una hoja de
resultados, por ejemplo, updateString actualiza un valor String en la hoja de
resultados.
El siguiente cdigo actualiza el balance de un usuario desde la hoja de resultados
creada anteriormente. La actualizacin slo se aplica a la hoja de resultados hasta
que se llama a rs.updateRow(), que actualiza la base de datos original. Cerrando
la hoja de resultados antes de llamar a updateRow se perder cualquier edicin
aplicada en la hoja de resultados.
rs.first();
updateDouble("balance",
rs.getDouble("balance") - 5.00);
Insertar una nueva fila usa los mismos mtodos update<type>. La nica
diferencia es que se llama al mtodo rs.moveToInsertRow de que los datos
hayan sido inicializados y despus se llama a rs.insertRow(). Podemos borrar la
fila actual con una llamada a rs.deleteRow().
Trabajos Batch
Por defecto, cada sentencia JDBC se enva individualmente a la base de datos.
Aparte de las peticiones de red adicionales, este proceso provoca retrasos
adicionales si la transacin expande varias sentencias. JDBC 2.0 nos permite envar
varias sentencias a la vez con el mtodo addBatch.
El siguiente mtodo muestra cmo usar la sentencia addBatch. Las llamadas a
stmt.addBatch aaden sentencias a la Statement original, y la llamada a
executeBatch enva la sentencia completa con todos los apndices a la base de
datos.
Statement stmt = con.createStatement();
stmt.addBatch(
"update registration set balance=balance-5.00
where theuser="+theuser);
stmt.addBatch(
"insert into auctionitems(
description, startprice)
values("+description+","+startprice+")");
int[] results = stmt.executeBatch();
La hoja de resultados del mtodo addBatch es un array de cuentas de filas
afectadas por cada sentencia ejecutada en el trabajo batch. Si ocurre un problema
se lanzar una java.sql.BatchUpdateException. Se puede obteener un array
incompleto de contador de fila de BatchUpdateException llamando a su mtodo
getUpdateCounts.
Almacenar Clases, Imgenes y otros Objetos Grandes
Muchas bases de datos pueden almacenar datos binarios como parte de una fila si
el campo es asignado como long raw, longvarbinary, u otro tipo similar. Esto
campos pueden ocupar hasta 2 Gigabytes de datos. Esto significa que podemos
convertir los datos en un stram binario o un array de bytes, puede ser almacenado
o recuperado desde una base de datos como lo sera un string o un double.
Esta tcnica peude usarse para almacenar y recuperar imgenes y objetos Java.
Almacenar y recuperar una imagen: Es muy fcil almacenar un objeto que
puede ser serializado o convertido en un array de bytes. Desafortunadamente
java.awt.Image no es Serializable. Sin embargo, como se ve en el siguiente
ejemplo de cdigo, podemos almacenar los datos de la imagen en un fichero y
almacenar la informacin del fichero como bytes en un campo binario de la base de
datos.
int itemnumber=400456;
File file = new File(itemnumber+".jpg");
FileInputStream fis = new FileInputStream(file);
PreparedStatement pstmt = con.prepareStatement(
"update auctionitems
set theimage=? where id= ?");
pstmt.setBinaryStream(1, fis, (int)file.length()):
pstmt.setInt(2, itemnumber);
pstmt.executeUpdate();
pstmt.close();
fis.close();
Para recuperar esta imagen y crear un array de bytes que pueda ser pasado a
createImage, hacemos los siguiente:
int itemnumber=400456;
byte[] imageBytes;
PreparedStatement pstmt = con.prepareStatement(
"select theimage from auctionitems where id= ?");
pstmt.setInt(1, itemnumber);
ResultSet rs=pstmt.executeQuery();
if(rs.next()) {
imageBytes = rs.getBytes(1);
}
pstmt.close();
rs.close();
Image auctionimage =
Toolkit.getDefaultToolkit().createImage(
imageBytes);
Almacenar y Recuperar un Objeto: Una clase puede ser serializada a un campo
binario de la base de datos de la misma forma que se hizo con la imagen en el
ejemplo anterior. En este ejemplo, la clase RegistrationImpl se ha modificado
para soportar la serializacin por defecto aadiendole implements Serializable a
la declaracin de la clase.
Luego, se crea un array ByteArrayInputStream para pasarlo como un Stream
Binario a JDBC. Para crear el ByteArrayInputStream, RegistrationImpl primero
pasa a travs de un ObjectOutputStream hacia el ByteArrayInputStream con
una llamada a RegistrationImpl.writeObject. Luego el ByteArrayInputStream
es convertido a un array de bytes, que puede ser utilizado para crear el
ByteArrayInputStream. El mtodo create en RegistrationServer.java se ha
modificado de esta forma:
public registration.RegistrationPK create(
String theuser,
String password,
String emailaddress,
String creditcard)
throws registration.CreateException{
double balance=0;
Connection con = null;
PreparedStatement ps = null;;
try {
con=getConnection();
RegistrationImpl reg= new RegistrationImpl();
reg.theuser = theuser;
reg.password = password;
reg.emailaddress = emailaddress;
reg.creditcard = creditcard;
reg.balance = balance;
ByteArrayOutputStream regStore =
new ByteArrayOutputStream();
ObjectOutputStream regObjectStream =
new ObjectOutputStream(regStore);
regObjectStream.writeObject(reg);
byte[] regBytes=regStore.toByteArray();
regObjectStream.close();
regStore.close();
ByteArrayInputStream regArrayStream =
new ByteArrayInputStream(regBytes);
ps=con.prepareStatement(
"insert into registration (
theuser, theclass) values (?, ?)");
ps.setString(1, theuser);
ps.setBinaryStream(2, regArrayStream,
regBytes.length);
if (ps.executeUpdate() != 1) {
throw new CreateException ();
}
RegistrationPK primaryKey =
new RegistrationPKImpl();
primaryKey.theuser(theuser);
return primaryKey;
} catch (IOException ioe) {
throw new CreateException ();
} catch (CreateException ce) {
throw ce;
} catch (SQLException sqe) {
System.out.println("sqe="+sqe);
throw new CreateException ();
} finally {
try {
ps.close();
con.close();
} catch (Exception ignore) {
}
}
}
El objeto es recuperado y resconstruido extrayendo los bytes desde la base de
datos, creando un ByteArrayInputStream desde aquellos bytes ledos desde un
ObjectInputStream, y llamando a readObject para crear de nuevo el ejemplar.
El siguiente ejemplo muestra los cambios necesarios en el mtodo
RegistrationServer.refresh para recuperar el ejemplar Registration desde la
base de datos.
private Registration refresh(RegistrationPK pk)
throws FinderException {
if (pk == null) {
throw new FinderException ();
}
Connection con = null;
PreparedStatement ps = null;
try {
con=getConnection();
ps=con.prepareStatement("
select theclass from
registration where theuser = ?");
ps.setString(1, pk.theuser());
ps.executeQuery();
ResultSet rs = ps.getResultSet();
if(rs.next()){
byte[] regBytes = rs.getBytes(1);
ByteArrayInputStream regArrayStream =
new ByteArrayInputStream(regBytes);
ObjectInputStream regObjectStream =
new ObjectInputStream(
regArrayStream);
RegistrationImpl reg=
(RegistrationImpl)
regObjectStream.readObject();
return reg;
}
else {
throw new FinderException ();
}
} catch (Exception sqe) {
System.out.println("exception "+sqe);
throw new FinderException ();
}
finally {
try {
rs.close();
ps.close();
con.close();
}
catch (Exception ignore) {}
}
}
BLOBs y CLOBs: Almacenar grandes campos en un tabla con otros datos no es
necesariamente el lugar ptimo especialmente si los datos tienen un tamao
variable. una forma de manejar objetos de tamao grande y variable es con el tipo
"Large Objects" (LOBs). Este tipo usa un localizador, esencialmente un puntero, en
el registro de la base de datos que apunta al campo real en la base de datos.
Hay dos tipos de LOBs: "Binary Large Objects" (BLOBs) y "Character Large
Objects" (CLOBs). Cuando accedemos a BLOB o CLOB, los datos no se copian en el
cliente. Para recuperar los datos reales desde una hoja de resultados, tenemos que
recuperar el puntero con una llamada a BLOB blob=getBlob(1) o CLOB
clob=getClob(1), y luego recuperar los datos con una llamada a
blob.getBinaryStream() o clob.getBinaryStream().
Controlar Transaciones
Por defecto, las sentencias JDBC son procesadas en el modo full auto-commit. Este
modo funciona bien para una sola consulta a la base de datos, pero si la operacin
depende de varias sentencias de la base de datos que todas deben completarse
con xito o toda la operacin ser cancelada, se necesita una transacin ms
adecuada.
Una descripcin de los niveles de aislamiento en la transacinse cubre con ms
detalles en el Captulo 3: Manejao de Datos y Transaciones. Para usar control de
transaciones en la plataforma JDBC, primero necesitamos desactivar el moco "full
auto-commit" llamando a:
Connection con= getConnection();
con.setAutoCommit(false);
En este punto, podemos enviar cualquier siguiente sentencia JDBC o deshacer
cualquier actualizacin llamando al mtodo Connection.rollback. La llamada
rollback se sita normalmente en el manejador de excepciones, aunque puede
situarse en cualquier lugar en le flujo de la transacin.
El siguiente ejemplo inserta un tem en la subasta y decrementa el balance del
usuario. Si el balance es menor de cero, se deshace la transacin complera y el
tem de susbasta es eliminado.
public int insertItem(String seller,
String password,
String description,
int auctiondays,
double startprice,
String summary) {
Connection con = null;
int count=0;
double balance=0;
java.sql.Date enddate, startdate;
Statement stmt=null;
PreparedStatement ps = null;
try {
con=getConnection();
con.setAutoCommit(false);
stmt= con.createStatement();
stmt.executeQuery(
"select counter from auctionitems");
ResultSet rs = stmt.getResultSet();
if(rs.next()) {
count=rs.getInt(1);
}
Calendar currenttime=Calendar.getInstance();
java.util.Date currentdate=currenttime.getTime();
startdate=new java.sql.Date(
currentdate.getTime());
currenttime.add(Calendar.DATE, auctiondays);
enddate=new java.sql.Date((
currenttime.getTime()).getTime());
ps=con.prepareStatement(
"insert into auctionitems(
id, description, startdate, enddate,
startprice, summary)
values (?,?,?,?,?,?)");
ps.setInt(1, count);
ps.setString(2, description);
ps.setDate(3, startdate);
ps.setDate(4, enddate);
ps.setDouble(5, startprice);
ps.setString(6, summary);
ps.executeUpdate();
ps.close();
ps=con.prepareStatement(
"update registration
set balance=balance -0.50
where theuser= ?");
ps.setString(1, seller);
ps.close();
stmt= con.createStatement();
stmt.executeQuery(
"select balance from registration
where theuser='"+seller+"'");
rs = stmt.getResultSet();
if(rs.next()) {
balance=rs.getDouble(1);
}
stmt.close();
if(balance <0) {
con.rollback();
con.close();
return (-1);
}
stmt= con.createStatement();
stmt.executeUpdate(
"update auctionitems set
counter=counter+1");
stmt.close();
con.commit();
con.close();
return(0);
} catch(SQLException e) {
try {
con.rollback();
con.close();
stmt.close();
ps.close();
}catch (Exception ignore){}
}
return (0);
}
Caracteres de Escape
El API JDBC proporciona la palabr clave escape para que podamos especificar el
caracter que querramos usar como caracter de escape. Por ejemplo, si queremos
usar el signo de tanto por ciento (%) como el smbolo de tanto por ciento que que
no se interprete como un comodn SQL usando en consultas SQL LIKE, tenemos
que escaparlo con el caracter de escape que especifiquemos con la palabra clave
escape.
La siguiente sentencia muestra cmo podemos usar la palabra clave escape para
buscar por el valor 10%:
stmt.executeQuery(
"select tax from sales where tax like
'10\%' {escape '\'}");
Si nuestro programa almacena nombres y direcciones en la base de datos
introducidos desde la lnea de comandos o desde un interface de usuario, el
smbolo de comilla simple (') podra aparecer en los datos. Pasar una comilla
simple directamente a un string SQL causa problemas cuando la sentencia es
analizada porque SQL le da a este smbolo otro significado a menos que se le
escape.
Para resolver este problem, el siguiente mtodo escapa cualquier smbolo '
encontrado en la lnea de entrada. Este mtodo puede ser extendido para escapar
cualquier otro caracter como las comas , que la base de datos o su driver podran
interpretar de otra forma:
static public String escapeLine(String s) {
String retvalue = s;
if (s.indexOf ("'") != -1 ) {
StringBuffer hold = new StringBuffer();
char c;
for(int i=0; i < s.length(); i++ ) {
if ((c=s.charAt(i)) == '\'' ) {
hold.append ("''");
}else {
hold.append(c);
}
}
retvalue = hold.toString();
}
return retvalue;
}
Sin embargo, si usamos un PreparedStatement en lugar de una simple
Statement, muchos de estos problemas de escape desaparecen. Por ejemplo, en
lugar de esta lnea con la secuencia de escape:
stmt.executeQuery(
"select tax from sales where tax like
'10\%' {escape '\'}");
Podramos usar esta lnea:
preparedstmt = C.prepareStatement(
"update tax set tax = ?");
Mapear Tipos de Base de Datos
Aparte de unos pocos tipos como INTEGER que son representados como
INTEGER en las bases de datos ms populares, podramos encontrar que el tipo
JDBC de una columna de la tabla no corresponde con el tipo representado en la
base de datos. Esto significa que lllamar a ResultSet.getObject,
PreparedStatement.setObject y CallableStatement.getObject() fallar
bastantes veces.
Nuestro programa puede determinar los tipos de las columnas de la base de datos
desde los datos meta de la base de datos y usar esta informacin para chequear el
valor antes de recuperarlo. Este cdigo chequea que el valor es del tipo INTEGER
antes de recuperarlo.
int count=0;
Connection con=getConnection();
Statement stmt= con.createStatement();
stmt.executeQuery(
"select counter from auctionitems");
ResultSet rs = stmt.getResultSet();
if(rs.next()) {
if(rs.getMetaData().getColumnType(1) ==
Types.INTEGER) {
Integer i=(Integer)rs.getObject(1);
count=i.intValue();
}
}
rs.close();
Mapeo de Tipos Date
El tipo DATE es donde ocurren ms errores. Es porque la clase java.util.Date
representa tanto la Fecha como la Hora, pero SQL tiene estos tres tipos para
representar informacinde fecha y hora:
Un tipo DATE que representa slo fechas (03/23/99).
Un tipo TIME que especfica slo la hora (12:03:59).
Un tipo TIMESTAMP que representa el valor de la hora en nanosegundos.
Estos tres tipos adiciones los proporciona el paquete java.sql como
java.sql.Date, java.sql.Time y java.sql.Timestamp y son todos suclases de
java.util.Date. Esto significa que podemos usar valores java.util.Date
convertidos al tipo necesario para que sean compatibles con el tipo de la base de
datos.
Nota: la clase Timestamp pierde precisin cuando se convierte a
java.util.Date porque java.util.Date no contiene un campo de
nanosegundos, es mejro no convertir un ejemplar Timestamp si el valor
va a ser escrito de vuelta en la base de datos.
Este ejemplo usa la clase java.sql.Date para convertir el valor java.util.Date
devuelto por la llamada a Calendar.getTime hacia java.sql.Date.
Calendar currenttime=Calendar.getInstance();
java.sql.Date startdate=
new java.sql.Date((
currenttime.getTime()).getTime());
Tambin podemo usar la clase java.text.SimpleDateFormat para hacer la
conversin. Este ejemplo usa la clase java.text.SimpleDateFormat para
convertir un objeto java.util.Date a un objeto java.sql.Date:
SimpleDateFormat template =
new SimpleDateFormat("yyyy-MM-dd");
java.util.Date enddate =
new java.util.Date("10/31/99");
java.sql.Date sqlDate =
java.sql.Date.valueOf(
template.format(enddate));
Si encontramos que una representacin de fecha de una base de datos no puede
ser mapeada a un tipo Java con una llamada a getObject o getDate,
recuperamos el valor con una llamada a getString y formateamos el string como
un valor Date usando la clase SimpleDateFormat mostrada arriba.
_______
1
Cuando se usan en toda esta site, los trminos, "Java virtual machine" o "JVM"
significa una mquina virtual de la plataforma Java.
Ozito
Servlets
Un servelt es un programa del lado del servidor escrito en lenguaje Java que
interacta con clientes y que normalmente est unido a unservidor de "HyperText
Transfer Protocol" (HTTP). Uno uso comn para un servlet es ampliar un servidor
web proporcionando contenidos web dinmicos.
Los servelts tienen la ventaja sobre otras tecnologas que de estn compilados,
tienen capacidad de threads interna, y proporcionan un entorno de programacin
seguro. Incluso las sites web que antes no proporcionaban soporte para servlets,
pueden hacerlo ahora usando programas como JRun o el mdulo Java para el
servidor Web Apache.
La aplicacin subastas basada en web usa un servelt para aceptar y procesar
entradas del comprador y vendedor a travs del navegador y devuelve
dinmicamente informacin sobre el tem de la subasta hacia el navegador. El
programa AuctionServlet se creo extendiendo la clase HttpServlet. Esta clase
proporciona un marco de trabajo para manejar peticiones y respuestas HTTP.
Esta seccin examina el AuctionServlet e incluye informacin sobre cmo usar
objetos Cookie y Session en un servlet.
HttpServlet
El mtodo init
El mtodo destroy
El mtodo service
Peticiones HTTP
Usar Cookies en Servlets
Configurar una Cookie
Recuperar una Cookie
Generar Sesiones
Evitar el Cach Redireccionamiento

Cdigos de Error HTTP
Leer valores GET y POST
Threads
HTTPS
HttpServlet
La clase AuctionServlet extiende la clase HttpServlet, que es una clase
abastracta.
public class AuctionServlet extends HttpServlet {
Un servlet puede cargarse cuando se arranca el servidor web o cuando se solicita
una peticin HTTP a una URL que especifica el servlet. El servlet normalmente es
cargado mediante un cargador de clases separado en el sevidor web porque esto
permite que el servlet sea recargado descargando el cargador de clases que cargo
la clase servlet. Sin embargo, si el servlet depende de otras clases y una de estas
clases cambia, necesitaremos actualiza el sello de la fecha del servlet para
recargarlo.
Despus de cargar un servlet, el primer estado en su ciclo de vida es la llamada a
su mtodo init por parte del servidor web. Una vez cargado e inicializado, el
siguiente estado en el ciclo de vida del servlet es para servir peticiones. El servlet
sirve peticiones a travs de las implementaciones de su mtodos service, doGet,
o doPost.
El servlet puede opcionalmente implementar un mtodo destroy para realizar
operaciones de limpieza antes de que el servidor web descarge el servlet.
El mtodo init
El mtodo init slo se llama una vez por el servidor web cuando se arranca el
servlet por primera vez. A este mtodo se le pasa un objeto ServletConfig que
contiene la informacin de inicializacin perteniente al servidor web donde se est
ejecutando la aplicacin.
El objeto ServletConfig es usado para acceder a la informacin mantenida por el
servidor web incluyendo valores del parmetro initArgs en el fichero de
propiedades del servlet. El cdigo del mtodo init usa el objeto ServletConfig
para recuperar los valores de initArgs llamando al mtodo
config.getInitParameter("parameter").
El mtodo AuctionServlet.init tambin contacta con el servidor de JavaBeans
Enterprise para crear un objeto contexto (ctx). Este objeto e susado en el mtodo
service para establecer una conexin con el servidor de JavaBeans Enterprise.
Context ctx=null;
private String detailsTemplate;
public void init(ServletConfig config)
throws ServletException{
super.init(config);
try {
ctx = getInitialContext();
}catch (Exception e){
System.err.println(
"failed to contact EJB server"+e);
}
try {
detailsTemplate=readFile(
config.getInitParameter("detailstemplate"));
} catch(IOException e) {
System.err.println(
"Error in AuctionServlet <init>"+e);
}
}
El mtodo destroy
El mtodo destroy es un mtodo de ciclo de vida implementado por servlets que
necesitan grabar su estado entre cargas y descargas del servlet. Por ejemplo, el
mtodo destroy podra gabar el estado actual del servlet, y la siguiente vez que el
servlet sea cargado, el estado grabado podra ser recuperado por el mtodo init.
Deberamos tener cuidado con que no se podra haber llamado al mtodo destroy
si la mquina servidor se bloquea.
public void destroy() {
saveServletState();
}
El mtodo service
El AuctionServlet es un servlet HTTP que maneja peticiones de clientes y genera
respuestas a travs de su mtodo service. Acepta como parmetros los objetos de
peticin y respuesta HttpServletRequest y HttpServletResponse.
HttpServletRequest conteine las cabeceras y los streams de entrada desde
el cliente hacia el servidor.

HttpServletResponse es el stream de salida que se utiliza para enviar
informacin de vuelta desde el servidor hacia el cliente.

El mtodo service maneja peticiones HTTP estndars del cliente recibidas
mediante su parmetro HttpServletRequest y delengando la peticin a uno de los
siguientes mtodos designados para manejar peticiones. Los diferentes tipos de
peticiones se describen en la seccin Peticiones HTTP.
doGet para GET, GET condicional, y peticiones HEAD.
doPost para peticiones POST.
doPut para peticiones PUT.
doDelete para peticiones DELETE.
doOptions para peticiones OPTIONS.
doTrace para peticiones TRACE.
el programa AuctionServlet proporciona su propia implementacin del mtodo
service que llama a uno de los siguiente mtodos basndose en el valor devuelto
por la llamada a cmd=request.getParameter("action"). Estas
implementaciones de mtodos corresponden a las implementacione por defecto
proporcionadas por los mtodos doGet y doPost llamadas por el mtodo service,
pero aade algunas funcionalidades especficas de la aplicacin subasta para
buscar Beans Enterprise.
listAllItems(out)
listAllNewItems(out)
listClosingItems(out)
insertItem(out, request)
itemDetails(out, request)
itemBid(out, request)
registerUser(out, request)
public void service(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
String cmd;
response.setContentType("text/html");
ServletOutputStream out = response.getOutputStream();
if (ctx == null ) {
try {
ctx = getInitialContext();
}catch (Exception e){
System.err.println(
"failed to contact EJB server"+e);
}
}
cmd=request.getParameter("action");
if(cmd !=null) {
if(cmd.equals("list")) {
listAllItems(out);
}else
if(cmd.equals("newlist")) {
listAllNewItems(out);
}else if(cmd.equals("search")) {
searchItems(out, request);
}else if(cmd.equals("close")) {
listClosingItems(out);
}else if(cmd.equals("insert")) {
insertItem(out, request);
}else if (cmd.equals("details")) {
itemDetails(out, request );
}else if (cmd.equals("bid")) {
itemBid(out, request) ;
}else if (cmd.equals("register")) {
registerUser(out, request);
}
}else{
// no command set
setTitle(out, "error");
}
setFooter(out);
out.flush();
}
Peticiones HTTP
Una peticin es un mensaje enviado desde un programa cliente como un
navegador a un programa servidor. La primera lnea del mensaje de peticin
contiene un mtodo que indica la accin a realizar sobre la URL que viene despus.
Los dos mecanismos ms comunes para enviar informacin al servidor son POST y
GET.
Las peticiones GET podran pasar parmetros a una URL aadindolas a la
URL. Estas peticiones pueden ser guardadas en el bookmark o enviadas por
correro e incluyen la informacin de la URL de respuesta.

Las peticiones POST podran pasar datos adicionales a la URL envindolas
directamente al servidor de forma separada a la URL. Estas peticiones no
pueden ser almacenadas en el bookmark ni enviadas por email y no cambiar
la URL de la respuesta.

Las peticiones PUT son la inversa de la peticiones GET. En lugar de leer la pgina,
las peticiones PUT escriben (o almacenan) la pgina.
Las peticiones DELETE son para eliminar pginas Web.
Las peticiones OPTIONS son para obtener informacin sobre las opciones de
comunicacin disponibles en la cadena peticin/respuesta.
Las peticiones TRACE son para realizar pruebas de diagnstico porque permite que
el cliente vea lo que se est recibiendo al orto final de la cadena de peticin.
Usar Cookies en servlets
LAs cookies HTTP son exencialmente cabeceras HTTP personalizadas que son
pasadas entre el cliente y el servidor. Aunque las cookies no son muy populares,
permiten que el estado sea compartido entre dos mquinas. Por ejemplo, cuando
un usuario hace login en una site, una cookie puede mantener una referencia
verificando que el usuario ha pasado el chequeo de password y puede usar esta
referencia para identificar al mismo usuario en futuras visitas.
Las cookies normalmente estn asociadas con un servidor. Si configuramos el
dominio a .java.sun.com, entonces la cookies est asociada con ese dominio. Si
no se configura nignn dominio, la cookie slo est asociada con el servidor que
cre la cookie.
Configurar una Cookie
El API Servlet de Java incluye una clase Cookie que podemos usar para configurar
o recuperar la cookie desde la cabecera HTTP. Las cookies HTTP incluyen un
nombre y una pareja de valores.
El mtodo startSession mostrado aqu est en el programa LoginServlet. En este
mtodo, el nombre en la pareja nombre valor usado para crea el Cookie es
JDCAUCTION, y un identificador nico generado por el servidor es el valor.
protected Session startSession(String theuser,
String password,
HttpServletResponse response) {
Session session = null;
if ( verifyPassword(theuser, password) ) {
// Create a session
session = new Session (theuser);
session.setExpires (sessionTimeout + i
System.currentTimeMillis());
sessionCache.put (session);
// Create a client cookie
Cookie c = new Cookie("JDCAUCTION",
String.valueOf(session.getId()));
c.setPath ("/");
c.setMaxAge (-1);
c.setDomain (domain);
response.addCookie (c);
}
return session;
}
Versiones posteriores del API Servlet incluye un API Session, para crear una sesin
usando el API Servelt en el ejemplo anterior podemos usar el mtodo getSession.
HttpSession session = new Session (true);
El mtodo startSession es llamado mediante peticiones de accin login desde un
POST al LoginServlet de esta forma:
<FORM ACTION="/LoginServlet" METHOD="POST">
<TABLE>
<INPUT TYPE="HIDDEN" NAME="action" VALUE="login">
<TR>
<TD>Enter your user id:</TD>
<TD><INPUT TYPE="TEXT" SIZE=20
NAME="theuser"></TD>
</TR>
<TR>
<TD>Enter your password:<TD>
<TD><INPUT TYPE="PASSWORD" SIZE=20
NAME="password"></TD>
</TR>
</TABLE>
<INPUT TYPE="SUBMIT" VALUE="Login" NAME="Enter">
</FORM>
La cookie es creada con un edad mxima de -1, lo que significa que el cookie es
almacenado pero permanece vivo miesntras el navegador se est ejecutando. El
valor se selecciona en segunod, aunque cuando s eusan valores menores que unos
pocos segundos necesitamos tener cuidado con que los tiempos de las mquinas
pudieran estar ligeramente desincronizados.
El valor de path puede ser usado para especificar que el cookie slo se aplica a
directorios y ficheros bajo el path seleccionado en esa mquina. En este ejemplo,
el path raz / significa que el cookie es aplicable a todos los directorios.
El valor del dominio en este ejemplo es ledo desde los parmetros de inicializacin
del servlet. Si el dominio es null, el cookie es slo aplicado a esa mquina de
domino.
Recuperar un Cookie
El cookie es recuperado desde las cabeceras HTTP con una llamada al mtodo
getCookies para solicitarlo:
Cookie c[] = request.getCookies();
Posteriormente podemos recuperar la pareja de selecciones nombre y valor
llamando al mtodo Cookie.getName para recuperar el nombre y al mtodo
Cookie.getValue para recuperar el valor.
LoginServlet tiene un mtodo validateSession que chequea las cookies del
usuario para encontrar un cookie JDCAUCTION que fu enviada en este dominio:
private Session validateSession
(HttpServletRequest request,
HttpServletResponse response) {
Cookie c[] = request.getCookies();
Session session = null;
if( c != null ) {
Hashtable sessionTable = new Hashtable();
for (int i=0; i < c.length &&
session == null; i++ ) {
if(c[i].getName().equals("JDCAUCTION")) {
String key = String.valueOf (c[i].getValue());
session=sessionCache.get(key);
}
}
}
return session;
}
Si usamos el API Servlet podemos usar el siguiente mtodo, observamos que el
parmetro es false para especificar que el valor de sesin es devuelto y que no se
cree una nueva sesin:
HttpSession session = request.getSession(false);
Generar Sesiones
El mtodo LoginServlet.validateSession devuelve un objeto Session
representado por la clase Session. Esta clase usa un generado desde una secuencia
numrica. Esta identificador de sesin numerada es la parte del valor de la pareja
de nombe y valor almacenadas en el cookie.
La nica forma de referenciar el nombre del usuario en el servidor es con este
identificador de sesin, que est almacenado en un sencillo cach de memoria con
los otros identificadores de sesin. Cuando un usuario termina una sesin, se llama
a la accin LoginServlet de esta forma:
http://localhost:7001/LoginServlet?action=logout
El cach de sesin implementado en el programa SessionCache.java incluye un
thread para eliminar sesiones ms viejas que el tiempo preseleccionado. Este
tiempo podra medise en horas o das, dependiendo del trfico de la web site.
Evitar el Cach de Pginas
El mtodo LoginServlet.setNoCache selecciona los valores Cache-Control o
Pragma (dependiendo de la versin del protocolo HTTP que estemos usando) en la
cabecera de respuesta a no-cache. La cabecera de expiracin Expires tambin se
selecciona a 0, alternativamente podemos seleccionar la hora para que se la hora
actual del sistema. Incluso si el cliente no cachea la pgina, frecuentemente hay
servidores proxys en una red corporativa que si lo haran. Slo las pginas que
usan Secure Socket Layer (SSL) no son cacheadas por defecto.
private void setNoCache (HttpServletRequest request,
HttpServletResponse response) {
if(request.getProtocol().compareTo ("HTTP/1.0") == 0) {
response.setHeader ("Pragma", "no-cache");
} else if (request.getProtocol().compareTo
("HTTP/1.1") == 0) {
response.setHeader ("Cache-Control", "no-cache");
}
response.setDateHeader ("Expires", 0);
}
Restringir Accesos y Redireccionamientos
Si instalamos el LoginServlet como el servlet por defecto o el servler a ejecutar
cuando se sirva cualquier pgina bajo el documento raiz, odemos usar cookies para
restringir los usuarios a ciertas secciones de la site. Por ejemplo, podemos permitir
que los usuarios que tengan cookies con el estado de que han introducido su
passweord acceder a secciones de la site que requieren un login y mantener a los
otros fuera.
El programa LoginServlet chequea un directorio restringido en este mtodo init. El
mtodo init mostrado abajo configura la variable protectedDir a true si la
variable config pasada a l especifica un directorio protegido. El fichero de
configuracin del servidor Web proporciona las configuraciones pasadas a un
servlet en la variable config.
public void init(ServletConfig config)
throws ServletException {
super.init(config);
domain = config.getInitParameter("domain");
restricted = config.getInitParameter("restricted");
if(restricted != null) {
protectedDir=true;
}
Ms tarde en los mtodos validateSession y service, la variable protectedDir es
comprobada y se llama al mtodo HttpResponse.sendRedirect para viar al
usuario a la pgina correcta basndose en sus estados de login y sesin
if(protectedDir) {
response.sendRedirect (restricted+"/index.html");
}else{
response.sendRedirect (defaultPage);
}
El mtodo init tambin recupera el contexto del servlet para el servlet FileServlet
para que los mtodos puedan ser llamados sobre FileServlet en el mtodo
validateSession. La ventaja de llamar a los mtodos sobre el servlet FileServlet
para servir los ficheros desde dentro del servlet LoginServlet, es que obtenemos
todas las ventajas de la funcionalidades aadidas dentro del servlet FileServlet
como el mepeo de memoria o el chach de ficheros. La parte negativa es que el
cdigo podra no ser portable a otros servidores que no tengan un servlet
FileServlet. Este cdigo recupera el contexto FileServlet:
FileServlet fileServlet=(FileServlet)
config.getServletContext().getServlet("file");
El mtodo validateSession evita que los usuarios sin login de sesin accedan a
los directorios restringidos.
Cdigos de Error HTTP
Podemos devolver un cdigo de error HTTP usando el mtodo sendError. Por
ejemplo, el cdigo de error HTTP 500 indica un error interno en el seridor, y el
cdigo de error 404 indica pgina no encontrada. Este segmento de cdigo
devuelve el cdigo de error HTTP 500:
protected void service (HttpServletRequest request,
HttpServletResponse response)
throws ServletException {
response.sendError (500);
}
Leer Valores GET y POST
El API Servlet tiene un mtodo getParameter en la clase HttpServletRequest
que devuelve el valor GET o POST para el nombre suministrado.
La peticin HTTP GET maneja parejas de nombre/valor como parte de la URL.
El mtodo getParameter analiza la URL pasada, recupera las parejas
name=value determinadas por el caracter (&), y devuelve el valor.

La peticin HTTP POST lle el nombre de las parejas nombre/valor desde el
stream de entrada desde el cliente. El mtodo getParameter analiza en el
stream de entrada las parejas de nombre/valor.

El mtodo getParameter funciona vien para servlet sencillos, pero si necesitamos
recuperar los parmetros POST en el orden enque fueron situados en la pgina
wev o manejar posts multi-parte, podemos escribir nuestro propio para analizar el
stram de entrada.
El siguiente ejemplo devuelve los parmetros POST en el orden en que fueron
recibidos desde la pgina Web. Normalmento, los parmetros son almacenados en
un Hashtable que no mantiene el orden de secuencia de los elementos
almacenados. El ejemplo mantiene una referencia a cada pareja nombre/valoren
un vector que puede ser ser analizado para devolver valores en el orden en que
fueron recibidos por el servidor.
package auction;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PostServlet extends HttpServlet {
private Vector paramOrder;
private Hashtable parameters;
public void init(ServletConfig config)
throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
if(request.getMethod().equals("POST")
&& request.getContentType().equals(
"application/x-www-form-urlencoded")) {
parameters=parsePostData(
request.getContentLength(),
request.getInputStream());
}
for(int i=0;i<paramOrder.size();i++) {
String name=(String)paramOrder.elementAt(i);
String value=getParameter((
String)paramOrder.elementAt(i));
out.println("name="+name+" value="+value);
}
out.println("</body></html>");
out.close();
}
private Hashtable parsePostData(int length,
ServletInputStream instream) {
String valArray[] = null;
int inputLen, offset;
byte[] postedBytes = null;
boolean dataRemaining=true;
String postedBody;
Hashtable ht = new Hashtable();
paramOrder= new Vector(10);
StringBuffer sb = new StringBuffer();
if (length <=0) {
return null;
}
postedBytes = new byte[length];
try {
offset = 0;
while(dataRemaining) {
inputLen = instream.read (postedBytes,
offset,
length - offset);
if (inputLen <= 0) {
throw new IOException ("read error");
}
offset += inputLen;
if((length-offset) ==0) {
dataRemaining=false;
}
}
} catch (IOException e) {
System.out.println("Exception ="+e);
return null;
}
postedBody = new String (postedBytes);
StringTokenizer st =
new StringTokenizer(postedBody, "&");
String key=null;
String val=null;
while (st.hasMoreTokens()) {
String pair = (String)st.nextToken();
int pos = pair.indexOf('=');
if (pos == -1) {
throw new IllegalArgumentException();
}
try {
key = java.net.URLDecoder.decode(
pair.substring(0, pos));
val = java.net.URLDecoder.decode(
pair.substring(pos+1,
pair.length()));
} catch (Exception e) {
throw new IllegalArgumentException();
}
if (ht.containsKey(key)) {
String oldVals[] = (String []) ht.get(key);
valArray = new String[oldVals.length + 1];
for (int i = 0; i < oldVals.length; i++) {
valArray[i] = oldVals[i];
}
valArray[oldVals.length] = val;
} else {
valArray = new String[1];
valArray[0] = val;
}
ht.put(key, valArray);
paramOrder.addElement(key);
}
return ht;
}
public String getParameter(String name) {
String vals[] = (String []) parameters.get(name);
if (vals == null) {
return null;
}
String vallist = vals[0];
for (int i = 1; i < vals.length; i++) {
vallist = vallist + "," + vals[i];
}
return vallist;
}
}
Para saber si una peticin es POST o GET, llamados al mtodo getMethod de la
clase HttpServletRequest. Para determinar el formato de los datos que estn
siendo posteados, llamamos al mtodo getContentType de la clase
HttpServletRequest. Para sencillas pginas HTML, el tipo devuelto por est
llamada ser application/x-www-form-urlencoded.
Si necesitamos crear un post con ms de una parte como el creado por el siguiente
formulario HTML, el servler necesitar ller el stream de entrada desde el post para
alcanzar las secciones individuales. Cada seccin se dstingue por un lmite definido
en la cabecera post.
<FORM ACTION="/PostMultiServlet"
METHOD="POST" ENCTYPE="multipart/form-data">
<INPUT TYPE="TEXT" NAME="desc" value="">
<INPUT TYPE="FILE" NAME="filecontents" value="">
<INPUT TYPE="SUBMIT" VALUE="Submit" NAME="Submit">
</FORM>
El siguiente ejemplo extrae una descripcin y un fichero desde los navegadores del
cliente. Lee el stream de entrada buscando una lnea que corresponda con un
string de lmite, lee el contenido de la lnea y lueo lee los datos asociados con esa
parte. El fichero suvido se muestra simplemente, pero tambin puede ser escrito
en disco:
package auction;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PostMultiServlet extends HttpServlet {
public void init(ServletConfig config)
throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
if (request.getMethod().equals("POST")
&& request.getContentType().startsWith(
"multipart/form-data")) {
int index = request.getContentType().indexOf(
"boundary=");
if (index < 0) {
System.out.println("can't find boundary type");
return;
}
String boundary =
request.getContentType().substring(
index+9);
ServletInputStream instream =
request.getInputStream();
byte[] tmpbuffer = new byte[8192];
int length=0;
String inputLine=null;
boolean moreData=true;
//Skip until form data is reached
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
while(inputLine.indexOf(boundary)
>0 && moreData) {
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
if(inputLine !=null)
System.out.println("input="+inputLine);
if(length<0) {
moreData=false;
}
}
if(moreData) {
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
if(inputLine.indexOf("desc") >=0) {
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
System.out.println("desc="+inputLine);
}
}
while(inputLine.indexOf(boundary)
>0 && moreData) {
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
}
if(moreData) {
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
if(inputLine.indexOf("filename") >=0) {
int startindex=inputLine.indexOf(
"filename");
System.out.println("file name="+
inputLine.substring(
startindex+10,
inputLine.indexOf("\"",
startindex+10)));
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0,
length);
}
}
byte fileBytes[]=new byte[50000];
int offset=0;
if (moreData) {
while(inputLine.indexOf(boundary)
>0 && moreData) {
length = instream.readLine(
tmpbuffer,
0,
tmpbuffer.length);
inputLine = new String (tmpbuffer, 0, 0, length);
if(length>0 && (
inputLine.indexOf(boundary) <0)) {
System.arraycopy(
tmpbuffer,
0,
fileBytes,
offset,
length);
offset+=length;
} else {
moreData=false;
}
}
}
// trim last two newline/return characters
// before using data
for(int i=0;i<offset-2;i++) {
System.out.print((char)fileBytes[i]);
}
}
out.println("</body></html>");
out.close();
}
}
Threads
Un servlet debe ser capaz de manejar mltipels peticiones concurrentes. Cualquier
nmero de usuarios puede en un momento dado invocar al servlet, y mientras que
el mtodo init ejecuta siempre un nico trehad, el mtodo service es multi-thread
para manejar mltiples peticiones.
Esto significa que cualquier campo esttico o pblico accedido por el mtodo
service deberan estr restringidos a accesos de un thread. el ejemplo de abajo
usa la palabra clave synchronized para restringir el acceso a un contador para
que slo pueda ser actualizado por un thread a la vez:
int counter
Boolean lock = new Boolean(true);
synchronized(lock){
counter++;
}
HTTPS
Muchos servidores, navegadores, y el java Plug-In tiene la posibilidad de soportar
el protocolo HTTP seguro llamado HTTPS. Este similar al HTTP excepto en que los
datos on tramitidos a travs de una capa de socket seguro (SSL) en lugar de una
conexin de socket normal. Los navegadores web escuchan peticiones HTTP en un
puerto mientras escuchan las peticiones HTTPS en otro puerto.
Los datos encriptados que son enviados a travs de la red incluyen chequeos para
verificar si los dato se han modificado en el trnsito. SSL tambin autentifica el
servidor web a sus clientes proporcionando un certificado de clave pblica. en el
SSL 3.0 el cliente tambin puede autentificarse a s mismo con el servidor,
usxando de nuevo un certificado de clave pblica.
La clave pblica criptogrfica (tambin llamada clave de encriptacin asimtrerica)
usa una pareja de claves pblica y privada. Cualquier mensaje encriptado (hecho
ininteligible) con la clave privada de la pareja slo puede ser desencriptado con la
correspondiente clave pblica. Los certificados son sentencias firmadas
digitalmente generadas por un tercera parte conocidad como "Autoridad de
Certificacin" Certificate Authority. Esta Autorizar necesita asegurarse de que
nosotros somos quien decimos ser porque los clientes se creeran el certificado que
reciban. Si es as, este certificado puede contener la clave pblica de la pareja de
clave pblica/privada. El certificado est firmado por la clave privada de la
Autoridad de Certificacin, y muchos navegadores conocen las claves pblicas la
mayora de las Autoridades de Certificacin.
Mientras que la encriptacinde clavepblica es buena para propsitos de
autentificacin, no es tan rpida como la encriptacin asimtrica y por eso el
protocolo SSL usa ambos tipos de claves en el ciclo de vida de una conexin SSL.
El cliente y el servidor empiezan una transacin HTTPS con una inicializacin de
conexin o fase de estrechamiento de manos.
Es en ese momento en el que el servidor es autentificado usando el certificado que
el cliente ha recibido. El cliente usa la clave pblica del servidor para encriptar los
mensajes enviados al servidor. Despus de que el cliente haya sido autentificado y
el algoritmo de encriptacin se ha puesto de acuerdo entre las dos partes, se usan
unas nuevas claves de sesin simtrica para encriptar y desencriptar las
comunicaciones posteriores.
El algoritmo de encriptacin puede ser uno de los ms populares algoritmos como
"Rivest Shamir and Adleman" (RSA) o "Data Encryption Standard" (DES). Cuando
mayor sea el nmero de bits usados para crear la clave, mayores dificultades para
poder romper las claves mediante la fuerza bruta.
HTTPS usando criptografa de clave pblica y certificados nos permite proporcionar
una gran privacidad a las aplicacioens que necesitan transaciones seguras. Los
servidores, navegadores y Java Plug-In tienen sus propias configuraciones para
permitir usar Comunicaciones SSL. En general, estos pasos requieren:
Obtener una clave privada y un certificado firmado digitalmente con la clave
pblica correspondente.

Instalar el certificado en una localizacin especificada por el software que
estamos usando (servidor, navegador o Java Plug-In).

Activar las caractersticas SSL y especificar nuestros ficheros de certificado y
de clave privada como se explica en nuestra documentacin.

Siempre que activemos las caractersticas SSL de acuerdo con los requerimientos
de la aplicacin dependiendo del nivel de seguridad de necesitemos. Por ejemplo
no necesitamos verificar la autenticidad de los clientes para navegar por los tems
de la subasta, pero s querremos ecriptar la informacin de la tarjeta de crdido y
otras informaciones suministradas cuando los compradores y vendedores se
registran para participar.
HTTPS puede ser usado para cualquier dato, no slo ara pginas web HTTP. Los
programas escritos en lenguaje Java pueden ser descaradoa a trravs de
conexiones HTTPS, y podemos abrir una conexin con un servidor HTTPS en el
Java Plug-In. Para escribir un programa en Java que use SSL, este necesita una
librera SSL y un conecimiento detallado del proceso de negociacin HTTPS.
Nuestra librera SSL podra cubir los pasos necesarios ya que est informacin es
restringida por el control de exportacin de seguridad.
Ozito
Tecnologa JNI
La plataforma Java es relativamente nueva, lo que significa qie algunas veces
podramos necesitar integrar programas escritos en Java con servicios, programas
o APIs existentes escritos en lenguajes distintos en Java. La plataforma Java
proporciona el Interfa Nativo Java (JNI) para ayudarnos con este tipo de
integracin.
El JNI define una convencin de nombres y llamadas para que la Mquina Virtual
Java
1
pueda localizar e invocar a los mtodos nativos. De hecho, JNI est
construido dentro de la mquina virtual Java, por lo que sta puede llamar a
sistemas locales para realizar entrada/salida, graficos, trabajos de red y
operaciones de threads sobre el host del sistema operativo.
Este captulo explica como usar JNI en programas escritos en Java para llamar a
cualquier librera de la mquina local, llamar a mtodos del lenguaje Java desde
dentro del cdigo nativo, y cmo crear y ejecutar un ejemplar de la JVM. Para
mostrar cmo podemos hacer funcionar el JNI, los ejemplos de este captulo
incluyen integracin de JNI con el API de bases de datos Xbase de C++. y cmo
podemos llamar a una funcin matemtica. Xbase tiene fuentes que podemos
descargar.
Ejemplo JNI
Strings y Arrays
Otros Problemas de Programacin
Tienes Prisa?
Esta tabla cotiene enlaces a los tpicos especficos.
Tpico Seccin
Ejemplo JNI Sobre el Ejemplo
Generar el Fichero de Cabecera
Firma del Mtodo
Implementar el Mtodo Nativo
Compilar las Libreras Dinmicas o de Objetos
Compartidos

Ejecutar el Ejemplo
Strings, Arrays, y Fields Pasar Strings
Pasar Arrays
Pinning Array
Arrays de Objetos
Arrays Multi-Dimensionales
Acceder a Campos
Otros Problemas de
Programacin
Problemas de Lenguaje
Mtodos Llamantes
Acceder a Campos
Threads y Sincronizacin
Problemas de Memoria
Invocacin
Adjuntar Threads
_______
1
Cuando se usan en toda esta site, los trminos, "Java virtual machine" o "JVM"
significa una mquina virtual de la plataforma Java.
Ozito
Ejemplos JNI
Esta seccin presenta el programa de ejemplo ReadFile. Este ejemplo muestra
cmo podemos usar JNI para invocar un mtodo nativo que hace llamadas a
funciones C para mapear en fichero en la memoria.
Sobre el Ejemplo
Declaracin del Mtodo Nativo
Cargar la Librera
Compilar el Programa

Generar el Fichero de Cabecera
Firma del Mtodo
Implementar el Mtodo Nativo
Compilar la Librera dinmina o de Objetos compartidos
Ejecutar el ejemplo
Sobre el Ejemplo
Podemos llamar a cdigo escrito en cualquier lenguaje de programacin desde un
pograma escrito en leguaje Java declarando un mtodo nativo Java, cargando la
librera que contiene el cdigo nativo, y luego llamando al mtodo nativo. El cdigo
fuente de ReadFile que hay ms abajo hace exactamente esto.
Sin embargo, el exto en la ejecucin del programa requiere uno pocos pasos
adicionales ms all de la compilacin del fichero fuente Java. Despus de
compilar, pero antes de ejecutar el ejemplo, tenemos que generar un fichero de
cabecera. El cdigo nativo implementa las definiciones de funciones contenidas en
el fichero de cabecera generado y tambin implementa la lgica de negocio. Las
siguientes seccin pasan a travs de estos pasos:
import java.util.*;
class ReadFile {
//Native method declaration
native byte[] loadFile(String name);
//Load the library
static {
System.loadLibrary("nativelib");
}
public static void main(String args[]) {
byte buf[];
//Create class instance
ReadFile mappedFile=new ReadFile();
//Call native method to load ReadFile.java
buf=mappedFile.loadFile("ReadFile.java");
//Print contents of ReadFile.java
for(int i=0;i<buf.length;i++) {
System.out.print((char)buf[i]);
}
}
}
Declaracin del mtodo nativo
La declaracin native proporciona el puente para ejecutar la funcin nativa en una
JVM
1
. En este ejemplo, la funcin loadFile se mapea a un funcin C llamada
Java_ReadFile_loadFile. La implementacin de la funcin implementa un String
que representa un nombre de fichero y devuelve el contenido de ese fichero en un
array de bytes.
native byte[] loadFile(String name);
Cargar la Librera
La librera que contiene la implementacin del cdigo nativo se carga con una
llamada a System.loadLibrary(). Situando esta llamada en un inicializador
esttico nos aseguramos de que la librera slo se cargar una vez por cada clase.
La librera puede cargarse desde fuera del bloque esttico si la aplicacin as lo
requiere. Podramos necesitar configurar nuestro entorno para que el mtodo
loadLibrary pueda encontrar nuesta librera de cdigo nativo:
static {
System.loadLibrary("nativelib");
}
Compilar el Programa
Para compilar el program, slo ejecutamos el comando del compilador javac como
lo haramos normalmente:
javac ReadFile.java
Luego, necesitamos generar un fichero de cabecera con la declaracin del mtodo
nativo y la implementacin del mtodo nativo para llamar a funciones para la carga
y lectura de un fichero.
Generar el Fichero de Cabecera
Para generar un fichero de cabecera, ejecutamos el comando javah sobre la clase
ReadFile. En este ejemplo, el fichero de cabecera generadp se llama ReadFile.h.
Proporciona una firma de mtodo que debemos utilizar cuando implementemos la
funcin nativa loadfile.
javah -jni ReadFile
Firma del Mtodo
El fichero de cabecera ReadFile.h define el interface para mapear el mtodo en
lenguaje Java a la funcin nativa C. Utiliza una firma de mtodo para mapear los
argumentos y valor de retorno del mtodo mappedfile.loadFile java al mtodo
nativo loadFile de la librera nativelib. Aqu est la firma del mtodo nativo
loadFile:
/*
* Class: ReadFile
* Method: loadFile
* Signature: (Ljava/lang/String;)[B
*/
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv *, jobject, jstring);
Los parmetros de la firma de la funcin son los siguientes:
JNIEnv *: Un puntero al entorno JNI. Este puntero es un manejador del
thread actual en la mquina virtual Java y contiene mapeos y otra informacin
til.

jobject: Una referencia a un mtodo que llama a este cdigo nativo. Si el
mtodo llamante es esttico, esta parmetro podra ser del tipo jclass en
lugar de jobject.

jstring: El parmetro suministrado al mtodo nativo. En este ejemplo, es el
nombre del fichero a leer.

Implementar el Mtodo Nativo
En este fichero fuente nativo C, la definicin de loadFile es una copia de la
declaracin C contenida en el fichero ReadFile.h. La definicin es seguida por la
implementacin del mtodo nativo. JNI proporciona mapeo por defecto tanto para
C como para C++.
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv * env, jobject jobj, jstring name) {
caddr_t m;
jbyteArray jb;
jboolean iscopy;
struct stat finfo;
const char *mfile = (*env)->GetStringUTFChars(
env, name, &iscopy);
int fd = open(mfile, O_RDONLY);
if (fd == -1) {
printf("Could not open %s\n", mfile);
}
lstat(mfile, &finfo);
m = mmap((caddr_t) 0, finfo.st_size,
PROT_READ, MAP_PRIVATE, fd, 0);
if (m == (caddr_t)-1) {
printf("Could not mmap %s\n", mfile);
return(0);
}
jb=(*env)->NewByteArray(env, finfo.st_size);
(*env)->SetByteArrayRegion(env, jb, 0,
finfo.st_size, (jbyte *)m);
close(fd);
(*env)->ReleaseStringUTFChars(env, name, mfile);
return (jb);
}
Podemos aproximarnos a llamar a un funcin C existente enlugar de implementar
una, de alguna de estas formas:
Mapear el nombre generado por JNI a un nombre de funcin C ya existente.
La seccin Problemas de Lenguaje muestra como mapear entre funciones de
base de datos Xbase y cdigo Java.
1.
Usar el cdigo Stub compartido disponible desde la pgina JNI en la site de
java.sun.com.
2.
Compilar la Librera Dinmica o de Objetos Compartidos
La librera necesita ser compilada como una librera dinmica o de objetos
compartidos para que pueda ser cargada durante la ejecucin. Las libreras o
archivos estticos son compiladas dentro de un ejecutable y no pueden ser
cargadas en tiempo de ejecucin. La librera dinmica para el ejemplo loadFile se
compila de esta forma:
Gnu C/Linux:
gcc -o libnativelib.so -shared -Wl,-soname,libnative.so
-I/export/home/jdk1.2/
include -I/export/home/jdk1.2/include/linux nativelib.c
-static -lc
Gnu C++/Linux with Xbase
g++ -o libdbmaplib.so -shared -Wl,-soname,libdbmap.so
-I/export/home/jdk1.2/include
-I/export/home/jdk1.2/include/linux
dbmaplib.cc -static -lc -lxbase
Win32/WinNT/Win2000
cl -Ic:/jdk1.2/include
-Ic:/jdk1.2/include/win32
-LD nativelib.c -Felibnative.dll
Ejecutar el Ejemplo
Para ejecutar el ejemplo, la mquina virtual Java necesita poder encontrar la
librera nativa. Para hacer esto, configurarmos el path de libreras al path actual de
esta forma:
Unix or Linux:
LD_LIBRARY_PATH=`pwd`
export LD_LIBRARY_PATH
Windows NT/2000/95:
set PATH=%path%;.
Con el path de libreras especificado de forma apropiada a nuestra plataforma,
llamamos al programa como lo haramos normalmente con el intrprete de
comandos:
java ReadFile
_______
1
Cuando se usan en toda esta site, los trminos, "Java virtual machine" o "JVM"
significa una mquina virtual de la plataforma Java.
Ozito
Strings y Arrays
Esta seccin explica cmo pasar datos string y array entre un programa escrito en
Java y otros lenguajes.
Pasar Strings
Pasar Arrays
Pinning Array
Arrays de Objetos
Arrays Multi-Dimensionales
Pasar Strings
El objeto String en el lenguaje Java, que est representado como jstring en JNI,
es string unicode de 16 bits. En C un string por defecto est construido con
caracteres de 8 bits. Por eso, para acceder a objetos String Java pasados a un
funcin C C++ o devolver objetos un string C C++ a un mtodo Java,
necesitamos utilizar las funciones de conversin JNI en nuestra implementacin del
mtodo nativo.
La funcin GetStringUTFChar recupera caracteres de bits desde un jstring de 16
bits usando el Formato de Transformacin Unicode (UTF). UTF representa los
caracteres Unicode como un string de 8 16 bits sin perder ninguna informacin.
El terpcer parmetro GetStringUTFChar es el resultado JNI_TRUE si se hace una
copia olcar de jstring o JNI_FALSE si no se hace.
C Version:
(*env)->GetStringUTFChars(env, name, iscopy)
C++ Version:
env->GetStringUTFChars(name, iscopy)
La siguiente funcin C de JNI convierte un array de caracteres C en un jstring:
(*env)->NewStringUTF(env, lastfile)
El siguiente ejemplo convierte el array de caracteres C lastfile[80] en un jstring,
que es devuelto al mtodo Java que lo llam:
static char lastfile[80];
JNIEXPORT jstring JNICALL Java_ReadFile_lastFile
(JNIEnv *env, jobject jobj) {
return((*env)->NewStringUTF(env, lastfile));
}
Para permitir quela JVM
1
conozca como hemos terminado la representacin UTF,
llamamos a la funcin de conversin ReleaseStringUTFChars como se muestra
abajo. El segundo argumento es el valor del jstring original usado para construir
la representacin UTF, y el tercer argumento es la referencia a la representacin
local de ese String.
(*env)->ReleaseStringUTFChars(env, name, mfile);
Si nuestro cdigo nativo puede funcionar con Unicode, sin necesidar de
representaciones UTF intermedias, llamamos al funcin GetStringChars para
recuperar el string Unicode, y liberar la referencia con una llamada a
ReleaseStringChars:
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv * env, jobject jobj, jstring name) {
caddr_t m;
jbyteArray jb;
struct stat finfo;
jboolean iscopy;
const jchar *mfile = (*env)->GetStringChars(env,
name, &iscopy);
//...
(*env)->ReleaseStringChars(env, name, mfile);
Pasar Arrays
En el ejemplo presentado en la ltima seccin, el mtodo nativo loadFile devuelve
el contenido de un fichero en un array de bytes, que es un tipo primitivo del
lenguaje Java. Podemos recuperar y crear tipos primitivos java llamando a la
funcin TypeArray apropiada.
Por ejemplo, para crear un nuevo array de floats, llamamos a NewFloatArray, o
para crear un nuevo array de bytes, llamamos a NewByteArray. Este esquema de
nombres se extiende para la recuperacin de elementos, para aadir elementos, y
para modificar elementos del array. Para obtener un nuevo array de bytes,
llamamos a GetByteArrayElements. Para aadir o modificar elementos en el
array, llamamos a Set<type>ArrayElements.
La funcin GetByteArrayElements afecta a todo el array. Para trabajar con un
procin del array, llamamos a GetByteArrayRegion. Slo hay una funcin
Set<type>ArrayRegion para modificar elementos de un array. Sin embargo la
regin podra tener un tamao 1, lo que sera equivalente a la no-existente
Sete<type>ArrayElements.
Tipo de
Cdigo Nativo
Funciones usadas
jboolean NewBooleanArray
GetBooleanArrayElements
GetBooleanArrayRegion/SetBooleanArrayRegion
ReleaseBooleanArrayRegion
jbyte NewByteArray
GetByteArrayElements
GetByteArrayRegion/SetByteArrayRegion
ReleaseByteArrayRegion
jchar NewCharArray
GetCharArrayElements
GetCharArrayRegion/SetCharArrayRegion
ReleaseCharArrayRegion
jdouble NewDoubleArray
GetDoubleArrayElements
GetDoubleArrayRegion/SetDoubleArrayRegion
ReleaseDoubleArrayRegion
jfloat NewFloatArray
GetFloatArrayElements
GetFloatArrayRegion/SetFloatArrayRegion
ReleaseFloatArrayRegion
jint NewIntArray
GetIntArrayElements
GetIntArrayRegion/SetIntArrayRegion
ReleaseIntArrayRegion
jlong NewLongArray
GetLongArrayElements
GetLongArrayRegion/SetLongArrayRegion
ReleaseLongArrayRegion
jobject NewObjectArray
GetObjectArrayElement/SetObjectArrayElement
jshort NewShortArray
GetShortArrayElements
GetShortArrayRegion/SetShortArrayRegion
ReleaseShortArrayRegion
En el mtodo nativo loadFile del ejemplo de la seccin anterior, se actualiza el
array entero especificando una regin que tiene el tamo del fichero que est
siendo ledo:
jbyteArray jb;
jb=(*env)->NewByteArray(env, finfo.st_size);
(*env)->SetByteArrayRegion(env, jb, 0,
finfo.st_size, (jbyte *)m);
close(fd);
El array es devuelto al mtodo Java llamandte, que luego, enva al recolector de
basura la referencia del array cuando ya no es utilizado. El array puede ser
liberado explcitamente con la siguiente llamada:
(*env)-> ReleaseByteArrayElements(env, jb,
(jbyte *)m, 0);
El ltimo argumento de la funcin ReleaseByteArrayElements puede tener los
siguientes valores:
0: Las actualizaciones del array desde dentro del cdigo C sern reflejadas en
la copia Java.

JNI_COMMIT: La copia Java es actualizada, pero el jbyteArray local no es
liberado.

JNI_ABORT: Los Cambios no son copiados de vuelta, pero el jbyteArray es
liberado. El valor usado su el array se obtiene con el mode get de JNI_TRUE
significa que el array es una copia.

Pinning Array
Cuando recuperamos un array, podemos especificar si es una copia (JNI_TRUE) o
una referecia del array que reside en el programa Java (JNI_FALSE). Si usamos
una referencia al array, querremos que el array permanezca en la pila java y que
no sea eliminado por el recolector de basura cuando compacte la pila de memoria.
Para evitar que las referencias al array sean eliminadas, la Mquina Virtual Java
"clava" el array en la memoria. Clavar el array nos asegura que cuando el array
sea liberado, los elementos correctos sern actualziados en la JVM.
En el mtodo nativo loadfile del ejemplo de la pgina anterior, el array no se
liber explcitamente. Una forma de asegurarnos de que el array es recolectado por
el recolector de basura cuando ya no lo necesitamos, es llamar al mtodo Java,
pasarle el array de bytes y luego liberar la copia local del array. Esta tcnica se
muestra en la seccin Arrays Multi-Dimensionales.
Arrays de Objetos
Podemos almacenar cualquier objeto Java enun array con llamadas a las funciones
NewObjectArray y SetObjectArrayElement. La principal diferencia entre un
array de objetos y un array de tipos primitivos es que cuando se construyen se usa
una clase jobjectarray Java, como un parmetro.
El siguiente ejemplo C++ muestra cmo llamar a NewObjectArray para crear un
array deobjetos String. El tamao del array se configurar a cinco. la definicin de
la clase es devuelta desde una llamada a FindClass, y los elementos del array
sern inicializados con un cadena vaca. Los elementos del array se actualizarn
llamando a SetObjectArrayElement con la posici y el valor a poner en el array.
#include <jni.h>
#include "ArrayHandler.h"
JNIEXPORT jobjectArray JNICALL
Java_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
char *message[5]= {"first",
"second",
"third",
"fourth",
"fifth"};
ret= (jobjectArray)env->NewObjectArray(5,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
for(i=0;i<5;i++) {
env->SetObjectArrayElement(
ret,i,env->NewStringUTF(message[i]));
}
return(ret);
}
La clase java que llama a este mtodo nativo es la siguiente:
public class ArrayHandler {
public native String[] returnArray();
static{
System.loadLibrary("nativelib");
}
public static void main(String args[]) {
String ar[];
ArrayHandler ah= new ArrayHandler();
ar = ah.returnArray();
for (int i=0; i<5; i++) {
System.out.println("array element"+i+
"=" + ar[i]);
}
}
}
Arrays Multi-Dimensionales
Podramos necesitar llamar a liberas numricas y matemticas existentes como la
librera de lgebra lineal CLAPACK/LAPACK u otros programas de clculo de
matrices desde nuestro programa Java. Muchas de estas libreras y programas
usando arrays de dos o ms dimensiones.
En el lenguaje java, cualquier array que tenga ms de una dimensin es tratado
como un array de arrys. Por ejemplo, un array de enteros de dos dimensiones es
manejado como un array de arrays de enteros. El array se lee horizontalmente, o
tambin conocido como rden de fila.
Otros lenguajes como FORTRAN usan la ordenacin por columnas, por eso es
necesario un cuidado extra su nuestro programa maneja un array Java a una
funcin FORTRAN. Tambin, los elementos de un array de una aplicacin Java no
est garantizado que sean contiguos en la memoria. Algunas libreras usan el
conocimiento de que los elementos de un array se almacenan uno junto al otro en
la memoria para realizar optimizaciones de velocidad, por eso podramos necesitar
hacer una copia local del array para pasarselo a estas funciones.
El siguiente ejemplo pasad un array de dos dimensiones a un mtodo nativo que
extrae los elementos, realiza un clculo, y llama al mtodo Java para devolver los
resultados.
El array es pasado como un objeto array que contiene un array de jints. Los
elementos individuales se extraen primero recuperando un ejemplar de jintArray
desde el objeto array llamando a GetObjectArrayElement, y luego se extraen los
elementos desde la fila jintArray.
El ejemplo usa una matriz de tamao fijo. Su no conocemos el tamao del array
que se est utilizando, la funcin GetArrayLength(array) devuelve el tamao del
array ms exterior. Necesitaremos llamar a la funcin GetArrayLength(array)
sobre cada dimensin del array para descubrir su tamao total.
El nuevo array enviado de vuelta al programa Java est construido a la inversa.
Primero, se crea un ejemplar de jintArray y este ejemplar se pone en el objeto
array llamando a SetObjectArrayElement.
public class ArrayManipulation {
private int arrayResults[][];
Boolean lock=new Boolean(true);
int arraySize=-1;
public native void manipulateArray(
int[][] multiplier, Boolean lock);
static{
System.loadLibrary("nativelib");
}
public void sendArrayResults(int results[][]) {
arraySize=results.length;
arrayResults=new int[results.length][];
System.arraycopy(results,0,arrayResults,
0,arraySize);
}
public void displayArray() {
for (int i=0; i<arraySize; i++) {
for(int j=0; j <arrayResults[i].length;j++) {
System.out.println("array element "+i+","+j+
"= " + arrayResults[i][j]);
}
}
}
public static void main(String args[]) {
int[][] ar = new int[3][3];
int count=3;
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
ar[i][j]=count;
}
count++;
}
ArrayManipulation am= new ArrayManipulation();
am.manipulateArray(ar, am.lock);
am.displayArray();
}
}
#include <jni.h>
#include <iostream.h>
#include "ArrayManipulation.h"
JNIEXPORT void
JNICALL Java_ArrayManipulation_manipulateArray
(JNIEnv *env, jobject jobj, jobjectArray elements,
jobject lock){
jobjectArray ret;
int i,j;
jint arraysize;
int asize;
jclass cls;
jmethodID mid;
jfieldID fid;
long localArrayCopy[3][3];
long localMatrix[3]={4,4,4};
for(i=0; i<3; i++) {
jintArray oneDim=
(jintArray)env->GetObjectArrayElement(
elements, i);
jint *element=env->GetIntArrayElements(oneDim, 0);
for(j=0; j<3; j++) {
localArrayCopy[i][j]= element[j];
}
}
// With the C++ copy of the array,
// process the array with LAPACK, BLAS, etc.
for (i=0;i<3;i++) {
for (j=0; j<3 ; j++) {
localArrayCopy[i][j]=
localArrayCopy[i][j]*localMatrix[i];
}
}
// Create array to send back
jintArray row= (jintArray)env->NewIntArray(3);
ret=(jobjectArray)env->NewObjectArray(
3, env->GetObjectClass(row), 0);
for(i=0;i<3;i++) {
row= (jintArray)env->NewIntArray(3);
env->SetIntArrayRegion((jintArray)row,(
jsize)0,3,(jint *)localArrayCopy[i]);
env->SetObjectArrayElement(ret,i,row);
}
cls=env->GetObjectClass(jobj);
mid=env->GetMethodID(cls, "sendArrayResults",
"([[I)V");
if (mid == 0) {
cout <<"Can't find method sendArrayResults";
return;
}
env->ExceptionClear();
env->MonitorEnter(lock);
env->CallVoidMethod(jobj, mid, ret);
env->MonitorExit(lock);
if(env->ExceptionOccurred()) {
cout << "error occured copying array back" << endl;
env->ExceptionDescribe();
env->ExceptionClear();
}
fid=env->GetFieldID(cls, "arraySize", "I");
if (fid == 0) {
cout <<"Can't find field arraySize";
return;
}
asize=env->GetIntField(jobj,fid);
if(!env->ExceptionOccurred()) {
cout<< "Java array size=" << asize << endl;
} else {
env->ExceptionClear();
}
return;
}
_______
1
Cuando se usan en toda esta site, los trminos, "Java virtual machine" o "JVM"
significa una mquina virtual de la plataforma Java.
Ozito
Otros Problemas de Programacin
Esta seccin presenta informacin sobre acceso a clases, mtodos y campos, y cubre
los threads, la memoria y la JVM
1
.
Problemas de Lenguaje
Llamar a Mtodos
Acceder a Campos
Threads y Sincronizacin
Problemas de Memoria
Invocacin
Adjuntar Threads
Problemas de Lenguaje
Hasta ahora, los ejemplos de mtodos nativos han cuvierto llamadas solitarias a
funciones C y c++ que o devuelven un resultado o modifican los parmetro pasados a
la funcin. Sin embargo, C++ al igual que utiliza ejemplares de clases. si creamos una
clase en un mtodo nativo, la referencia a esta clase no tiene una clase equivalente en
el lenguaje Java, lo que hace dficil llamar a funciones de la clase C++ que se cre
primero.
Una forma de manejar esta situacin es mantener un registtro de las clases C++
referencias y pasadas de vuelta a un proxy o al programa llamante. Para asegurarnos
de que una clase C++ persiste a travs de llamadas a mtodo nativos, usamos el
operador new de C++ para crear una referencia al objeto C++ en la pila.
El siguiente cdigo proporciona un mapeo entre la base de datos Xbase y cdigo en
lenguaje Java. La base de datos Xbase tiene un API C++ y usa inicializacinde clases
para realizar operaciones subsecuentes en la base de datos. Cuando se crea el objeto
clase, se devuelve un puntero a este objeto como una valor int al lenguaje Java.
Podemos usar un valor long o mayor para mquinas mayores de 32 bits.
public class CallDB {
public native int initdb();
public native short opendb(String name, int ptr);
public native short GetFieldNo(
String fieldname, int ptr);
static {
System.loadLibrary("dbmaplib");
}
public static void main(String args[]) {
String prefix=null;
CallDB db=new CallDB();
int res=db.initdb();
if(args.length>=1) {
prefix=args[0];
}
System.out.println(db.opendb("MYFILE.DBF", res));
System.out.println(db.GetFieldNo("LASTNAME", res));
System.out.println(db.GetFieldNo("FIRSTNAME", res));
}
}
El valor del resultado devuelto desde la llamada al mtodo nativo initdb, se pasa a las
sigueintes llamadas al mtodo nativo. El cdigo nativo incluido en la librera
dbmaplib.cc des-referencia el objeto Java pasado como parmetro y recupera el
objeto puntero. La lnea xbDbf* Myfile=(xbDbf*)ptr; fuerza el valor del puntero
init a ser un punetro del tipo Xbase xbDbf.
#include <jni.h>
#include <xbase/xbase.h>
#include "CallDB.h"
JNIEXPORT jint JNICALL Java_CallDB_initdb(
JNIEnv *env, jobject jobj) {
xbXBase* x;
x= new xbXBase();
xbDbf* Myfile;
Myfile =new xbDbf(x);
return ((jint)Myfile);
}
JNIEXPORT jshort JNICALL Java_CallDB_opendb(
JNIEnv *env, jobject jobj,
jstring dbname, jint ptr) {
xbDbf* Myfile=(xbDbf*)ptr;
return((*Myfile).OpenDatabase( "MYFILE.DBF"));
}
JNIEXPORT jshort JNICALL Java_CallDB_GetFieldNo
(JNIEnv *env, jobject jobj,
jstring fieldname,
jint ptr) {
xbDbf* Myfile=(xbDbf*)ptr;
return((*Myfile).GetFieldNo(
env->GetStringUTFChars(fieldname,0)));
}
Llamar a Mtodos
La seccin sobre los arrays ilumin algunas razones por las que llamar a mtodo Java
desde dentro de cdigo nativo; por ejemplo, cuando necesitamos liberar el resultado
que intentamos devolver. Otros usos de las llamadas a mtodo java desde dentro de
cdigo nativo podra ser si necesitamos devolver ms de un resultado o simplemente
queremos modificar valores jaba desde dentro del cdigo nativo.
Llamar a mtodos Java desde dentro de cdigo nativo implica estos tres pasos:
Recuperar una Referencia a la Clase. 1.
Recuperar un identificador de mtodo. 2.
LLamar a los mtodos. 3.
Recuperar una Referencia de Clase
Es primer paso es recuperar una referencia a una clase que contenga los mtodos a
los que queremos acceder. Para recuperar una referencia, podemos usar el mtodo
FindClass o aceder a los argumentos jobject p jclass para el mtodo nativo:
Usa el mtodo FindClass:
JNIEXPORT void JNICALL Java_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj){
jclass cls = (*env)->FindClass(env, "ClassName");
}
Usa el argumento jobject:
JNIEXPORT void JNICALL Java_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj){
jclass cls=(*env)->GetObjectClass(env, jobj);
}
Usa el argumento jclass:
JNIEXPORT void JNICALL Java_ArrayHandler_returnArray
(JNIEnv *env, jclass jcls){
jclass cls=jcls;
}
Recuperar un identificador de Mtodo
Una vez que hemos obtenido la clase, el segundo paso es llamar a la funcin
GetMethodID para recuperar un identificador para un mtodo que seleccionemos de
la clase. El identificador es necesario cuando llamamos al mtodo de este ejemplar de
la clase. Como el lenguaje Java soporta sobrecarga de mtodo, tambin necesitamos
especficar la firma particular del mtodo al que queremos llamar. Para encontar qu
firma usa nuestro mtodo Java, ejecutamos el comando javap de esta forma:
javap -s Class
La firma del mtodo usasa se muestra como un comentario despus de cada
declaracin de mtodo como se ve aqu:
bash# javap -s ArrayHandler
Compiled from ArrayHandler.java
public class ArrayHandler extends java.lang.Object {
java.lang.String arrayResults[];
/* [Ljava/lang/String; */
static {};
/* ()V */
public ArrayHandler();
/* ()V */
public void displayArray();
/* ()V */
public static void main(java.lang.String[]);
/* ([Ljava/lang/String;)V */
public native void returnArray();
/* ()V */
public void sendArrayResults(java.lang.String[]);
/* ([Ljava/lang/String;)V */
}
Usamos la funcin GetMethodID para llamar a mtodos de ejemplar de un ejemplar
del objeto. o usamos la funcin GetStaticMethodID para llamar a un mtodo
esttico. Sus listas de argumentos son iguales.
Llamar a Mtodos
Tercero, se llama al mtodo de ejemplar correspndiente usando una funcin
Call<type>Method. El valor type puede ser Void, Object, Boolean, Byte, Char,
Short, Int, Long, Float, o Double.
Los paramtros para el mtodo pueden pasarse como una lista separada por coma, un
array de valores a la funcin Call<type>MethodA, o como una va_list. El va_list es
una construccun usada frecuentemente como lista de argumentos en C.
CallMethodV es la funcin usada para pasar un va_list ().
Los mtodos estticos son llamados de una forma similar excepto en que el nombre
del mtodo incluye un indenficador Satic adicional, CallStaticByteMethodA, y se usa
el valor jclass en lugar del valor jobject.
El siguiente ejemplo devuelve un objeto array llamando al mtodo sendArrayResults
desde la clase ArrayHandler.
// ArrayHandler.java
public class ArrayHandler {
private String arrayResults[];
int arraySize=-1;
public native void returnArray();
static{
System.loadLibrary("nativelib");
}
public void sendArrayResults(String results[]) {
arraySize=results.length;
arrayResults=new String[arraySize];
System.arraycopy(results,0,
arrayResults,0,arraySize);
}
public void displayArray() {
for (int i=0; i<arraySize; i++) {
System.out.println("array element "+i+ "= " + arrayResults[i]);
}
}
public static void main(String args[]) {
String ar[];
ArrayHandler ah= new ArrayHandler();
ah.returnArray();
ah.displayArray();
}
}
El cdigo nativo C++ se define de esta forma:
#include <jni.h>
#include <iostream.h>
#include "ArrayHandler.h"
JNIEXPORT void JNICALL Java_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
jclass cls;
jmethodID mid;
char *message[5]= {"first",
"second",
"third",
"fourth",
"fifth"};
ret=(jobjectArray)env->NewObjectArray(5,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
for(i=0;i<5;i++) {
env->SetObjectArrayElement(
ret,i,env->NewStringUTF(message[i]));
}
cls=env->GetObjectClass(jobj);
mid=env->GetMethodID(cls,
"sendArrayResults",
"([Ljava/lang/String;)V");
if (mid == 0) {
cout "<<Can't find method sendArrayResults";
return;
}
env->ExceptionClear();
env->CallVoidMethod(jobj, mid, ret);
if(env->ExceptionOccurred()) {
cout << "error occured copying array back" <<endl;
env->ExceptionDescribe();
env->ExceptionClear();
}
return;
}
Para construir esto sobre Linux, ejecutamos los siguientes comandos:
javac ArrayHandler.java
javah -jni ArrayHandler
g++ -o libnativelib.so
-shared -Wl,-soname,libnative.so
-I/export/home/jdk1.2/include
-I/export/home/jdk1.2/include/linux nativelib.cc
-lc
Si queremos especificar un mtodo de superclase, por ejemplo para llamar al
constructor de padre, podemos hacerlo llamando a las funciones
CallNonvirtual<type>Method.
Un punto importante cuando llamamos a mtodos Java o a campos desde dentro del
cdigo nativo es que necesitamos capturar las excepciones lanzadas. La funcin
ExceptionClear limpia cualquier excepcin pendiente miesntras que la funcin
ExceptionOccured chequea para ver si se ha lanzado alguna excepcin en la sesin
actual JNI.
Acceder a Campos
Acceder a campos Java desde dentro de cdigo nativo es similar a llamar a mtodos
Java. Sin emnargo, el campo es recuperado con un ID de campo en lugar de un ID de
mtodo.
Lo primero que necesitamos es recuperar el ID de un campo. Podemos usar la funcin
GetFieldID, especificando el nombre del campo y la firma en lugar del nombre y la
firma del mtodo. Una vez que tenemos el ID del campo, llamamos a una funcin
Get<type>Field. El <type> es el mismo tipo nativo que est siendo devuelto
excepto que se quita la j y la primera letra se pone en maysculas. Por ejemplo el
valor <type> es Int para el tipo nativo jint, y Byte para el tipo nativo jbyte.
El resultado de la funcin Get<type>Field es devuelto como el tipo nativo. Por
ejemplo, para recuperar el campo arraySize de la clase ArrayHandler, llamamos a
GetIntField como se ve en el siguiente ejemplo.
El campo puede ser seleccionado llamando a las funciones env->SetIntField(jobj,
fid, arraysize) . Los campos estticos pueden ser configurados llamando a
SetStaticIntField(jclass, fid, arraysize) y recuperados llamando a
GetStaticIntField(jobj, fid).
#include <jni.h>
#include <iostream.h>
#include "ArrayHandler.h"
JNIEXPORT void JNICALL Java_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
jint arraysize;
jclass cls;
jmethodID mid;
jfieldID fid;
char *message[5]= {"first",
"second",
"third",
"fourth",
"fifth"};
ret=(jobjectArray)env->NewObjectArray(5,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
for(i=0;i<5;i++) {
env->SetObjectArrayElement(
ret,i,env->NewStringUTF(message[i]));
}
cls=env->GetObjectClass(jobj);
mid=env->GetMethodID(cls,
"sendArrayResults",
"([Ljava/lang/String;)V");
if (mid == 0) {
cout <<Can't find method sendArrayResults";
return;
}
env->ExceptionClear();
env->CallVoidMethod(jobj, mid, ret);
if(env->ExceptionOccurred()) {
cout << "error occured copying
array back" << endl;
env->ExceptionDescribe();
env->ExceptionClear();
}
fid=env->GetFieldID(cls, "arraySize", "I");
if (fid == 0) {
cout <<Can't find field arraySize";
return;
}
arraysize=env->GetIntField(jobj, fid);
if(!env->ExceptionOccurred()) {
cout<< "size=" << arraysize << endl;
} else {
env->ExceptionClear();
}
return;
}
Threads y Sincronizacin
Aunque la librera nativa se carga una vez por cada clase, los threads individuales de
una aplicacin escrita en Java usan su propio puntero interface cuando llaman a un
mtodo nativo. Si necesitamos restringir el acceso a un objeto Java desde dentro del
cdigo nativo, podemos asegurarnos de los mtodos Java a los que llamamos tienen
sincronizacin explcita o podemos usar las funciones MonitorEnter y MonitorExit.
En el lenguaje Java, el cdigo est protegido por un monitor siempre que
especifiquemos la palabra clave synchronized. En Java el monitor que entra y sale de
las rutinas normalmente est oculto para el desarrollador de la aplicacin. En JNI,
necesitamos delinear explcitamente los puntos de la entrada y de salida del cdigo de
seguridad del thread.
El siguiente ejemplo usa un objeto Boolean para reestringir el acceso a la funcin
CallVoidMethod.
env->ExceptionClear();
env->MonitorEnter(lock);
env->CallVoidMethod(jobj, mid, ret);
env->MonitorExit(lock);
if(env->ExceptionOccurred()) {
cout << "error occured copying array back" << endl;
env->ExceptionDescribe();
env->ExceptionClear();
}
Podramos encontrar que en caso donde queremos accder a recursos locales del
sistema como un manejador MFC windows o una cola de mensajes, es mejor usar un
Thread Java y acceder a la cola de eventos nativa o al sistema de mensajes dentro
del cdigo nativo.
Problemas de Memoria
Por defecto, JNI usa referencias locales cuando crea objetos dentro de un mtodo
nativo. Esto significa que cuando el mtodo retorna, las referencias estn disponibles
para el recolector de basura. Si queremos que un objeto persista a travs de las
llamadas a un mtodo nativo, debemos usar una referencia golbal. Una referencia
global se crea desde una referencia local llamando a NewGlobalReference sobre la
referencia local.
Podemos marcar explctamente para el recolector de basura llamando a
DeleteGlobalRef sobre la referencia. Tambin podemos crear una referencia global al
estilo weak que sea accesible desde fuera del mtodo, pero puede ser recolectado por
el recolector de basura. Para crear una de estas referencias, llamamos a
NewWeakGlobalRef y DeleteWeakGlobalRef para marcar la referencia para la
recoleccin de basura.
Incluso podemos marcar explcitamente una referencia local para la recoleccin de
basura llamando al mtodo env->DeleteLocalRef(localobject). Esto es til si
estamo usando una gran cantidad de datos temporales:
static jobject stringarray=0;
JNIEXPORT void JNICALL Java_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj){
jobjectArray ret;
int i;
jint arraysize;
int asize;
jclass cls, tmpcls;
jmethodID mid;
jfieldID fid;
char *message[5]= {"first",
"second",
"third",
"fourth",
"fifth"};
ret=(jobjectArray)env->NewObjectArray(5,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
//Make the array available globally
stringarray=env->NewGlobalRef(ret);
//Process array
// ...
//clear local reference when finished..
env->DeleteLocalRef(ret);
}
Invocaciones
La seccin sobre llamadas a mtodos nos mostraba como llamar a un mtodo o campo
Java usando el interface JNI y una clase cargada usando la funcin FindClass. Con un
poco ms de cdigo, podemos crear un programa que invoque a la mquina virtual
Java e incluya su propio puntero al interface JNI que puede ser usado para crear
ejemplares de clases Java. En Java 2, el programa de ejecucin llamando java es una
pequea aplicacin JNI que hace exactamente esto.
Podemos crear una mquina virtual Java con una llamada a JNI_CreateJavaVM, y
desconectar la mquina virtual Java creada con una llamada a JNI_DestroyJavaVM.
Una JVM tambin podra necesitar algunas propiedades adicionales de entorno. Estas
propiedades podran pasarse a la funcin JNI_CreateJavaVM en un estructura
JavaVMInitArgs.
La estructura JavaVMInitArgs contiene un puntero a un valor JavaVMOption usado
para almacenar informacin del entorno como el classpath y la versin de la mquina
virtual Java, o propiedades del sistema que podran pasarse normalmente en la lnea
de comandos del programa.
Cuando retorna la funcin JNI_CreateJavaVM, podemos llamar a mtodo y crear
ejemplares de clases usando las funciones FindClass y NewObject de la misma
forma que lo haramos con cdigo nativo embebido.
Nota: La invocacin de la mquina virtual Java slo se usa para threads
nativos en mquinas virtuales Java. Algunas antiguas mquinas virtuales
Java tienen una opcin de threads verdes que es estable para el uso de
invocaciones, Sobre una plataforma Unix, podramos necesitar enlazar
explcitamente con -lthread o -lpthread.
El siguiente programa invoca una mquina virtual Java, carga la clase ArrayHandler
y recupera el campo arraySize que debera tener el valor menos uno. Las opciones de
la mquina virtual Java incluyen el path actual en el classpath y desactivar del
compilador Just-In_Time (JIT) -Djava.compiler=NONE.
#include <jni.h>
void main(int argc, char *argv[], char **envp) {
JavaVMOption options[2];
JavaVMInitArgs vm_args;
JavaVM *jvm;
JNIEnv *env;
long result;
jmethodID mid;
jfieldID fid;
jobject jobj;
jclass cls;
int i, asize;
options[0].optionString = ".";
options[1].optionString = "-Djava.compiler=NONE";
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 2;
vm_args.ignoreUnrecognized = JNI_FALSE;
result = JNI_CreateJavaVM(
&jvm,(void **)&env, &vm_args);
if(result == JNI_ERR ) {
printf("Error invoking the JVM");
exit (-1);
}
cls = (*env)->FindClass(env,"ArrayHandler");
if( cls == NULL ) {
printf("can't find class ArrayHandler\n");
exit (-1);
}
(*env)->ExceptionClear(env);
mid=(*env)->GetMethodID(env, cls, "<init>", "()V");
jobj=(*env)->NewObject(env, cls, mid);
fid=(*env)->GetFieldID(env, cls, "arraySize", "I");
asize=(*env)->GetIntField(env, jobj, fid);
printf("size of array is %d",asize);
(*jvm)->DestroyJavaVM(jvm);
}
Adjuntar Threads
Despus de invocar la mquina virtual Java, hay un thread local ejecutndose en ella.
Podemos crear ms threads en el sistema operativo local y adjuntar threads en la
mquina virtual Java para estos nuevos threads. Podriamos querer hacer esto su
nuestra aplicacin nativa es multi-threads.
Adjuntamos el thread local a la mquina virtual Java con una llamada a
AttachCurrentThread. Necesitamos suministrar punteros al ejemplar de la mquina
virtual Java y al entorno JNI. En la plataforma Java 2, podemos especficar en el tercer
parmetro el nombre del thread y/o el grupo bajo el que queremos que viva nuestro
thread. Es importante eliminar cualquier thread que haya sido prviamente adjuntado;
de otra forma, el programa no saldr cuando llamemos a DestroyJavaVM.
#include <jni.h>
#include <pthread.h>
JavaVM *jvm;
void *native_thread(void *arg) {
JNIEnv *env;
jclass cls;
jmethodID mid;
jfieldID fid;
jint result;
jobject jobj;
JavaVMAttachArgs args;
jint asize;
args.version= JNI_VERSION_1_2;
args.name="user";
args.group=NULL;
result=(*jvm)->AttachCurrentThread(
jvm, (void **)&env, &args);
cls = (*env)->FindClass(env,"ArrayHandler");
if( cls == NULL ) {
printf("can't find class ArrayHandler\n");
exit (-1);
}
(*env)->ExceptionClear(env);
mid=(*env)->GetMethodID(env, cls, "<init>", "()V");
jobj=(*env)->NewObject(env, cls, mid);
fid=(*env)->GetFieldID(env, cls, "arraySize", "I");
asize=(*env)->GetIntField(env, jobj, fid);
printf("size of array is %d\n",asize);
(*jvm)->DetachCurrentThread(jvm);
}
void main(int argc, char *argv[], char **envp) {
JavaVMOption *options;
JavaVMInitArgs vm_args;
JNIEnv *env;
jint result;
pthread_t tid;
int thr_id;
int i;
options = (void *)malloc(3 * sizeof(JavaVMOption));
options[0].optionString = "-Djava.class.path=.";
options[1].optionString = "-Djava.compiler=NONE";
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 2;
vm_args.ignoreUnrecognized = JNI_FALSE;
result = JNI_CreateJavaVM(&jvm,(void **)&env, &vm_args);
if(result == JNI_ERR ) {
printf("Error invoking the JVM");
exit (-1);
}
thr_id=pthread_create(&tid, NULL, native_thread, NULL);
// If you don't have join, sleep instead
//sleep(1000);
pthread_join(tid, NULL);
(*jvm)->DestroyJavaVM(jvm);
exit(0);
}
_______
1
Cuando se usan en toda esta site, los trminos, "Java virtual machine" o "JVM"
significa una mquina virtual de la plataforma Java.
Ozito
Proyecto Swing: Construir un Interface
de Usuario
Las arquitecturas Java Foundation Classes (JFC) y JavaBeans Enterprise comparten
un elemento de diseo clave: la separacin de los datos de su aspecto en pantalla
o la manipulacin de los datos. En las aplicaciones JavaBeans Enterprise, el beande
entidad proporciona una vista de los datos. El mecanismo de los datos oculto
puede ser solapado y modificado sin modificar la vista del bean de entidad o
recompilar cualquier cdigo que use la vista.
El proyecto Swing separa la vista y control de un componente visual de sus
contenidos, o medelo de datos. Sin embargo, aqunque el Proyecto Swing tiene los
componentes que crean la arquitectura Modelo-Vista-Controlador (MVC), es ms
seguro describirlo como una arquitectura de modelo-delegado. Esteo eso por la
parte controlador de un interface Swing, frecuentemente usa el eventos del ratn y
de teclado para responder al componente, es combinada con la vista fsica en un
objeto "User Interface delegate" (UI delegate).
Cada componente, por ejemplo un JButton o un JScrollBar, tiene una clase UI
delegate separada que desciende desde la clase ComponentUI y est bajo el
control de un controlador UI separado. Mientras que cada componente tiene un UI
delgate bsico, no est ms unido con los datos ocultos por lo que se pueden
intercambiar mientras que la aplicacin todava se est ejecutando. La posibilidad
de cambiar el aspecto y comportamiento refleja la caracterstica del aspecto y
comportamiento conectable (PLAF) disponible en Swing.
Este captulo describe componentes de usuario Swing en trminos de la aplicacin
AuctionClient.
Componentes y Modelo de Datos
El API de Impresin
Impresin Avanzada
Tienes Prisa?
Esta tabla contiene enlaces directos a los tpicos especficos.
Tpicos Seccin
Componentes y Modelos de Datos Componentes de Peso Ligero
Ordenacin de Componentes
Modelos de Datos
Dibujado Personalizado de Celdas
Edicin de Celdas Personalizadas
Manejo de Eventos Especializado
Direcciones del Proyecto Swing
Ozito
C
o
m
p
o
n
e
n
t
e
s

y

M
o
d
e
l
o
s

d
e

D
a
t
o
s
E
l

p
r
o
g
r
a
m
a

A
u
c
t
i
o
n
C
l
i
e
n
t

e
s

u
n
a

s
e
n
c
i
l
l
a

a
p
l
i
c
a
c
i
o
n

G
U
I

q
u
e

p
e
r
m
i
t
e

a

l
o
s

a
d
m
i
n
i
s
t
r
a
d
o
r
e
s

d
e

l
a

c
a
s
a

d
e

s
u
b
a
s
t
a
s

l
i
s
t
a
r

y

n
a
v
e
g
a
r

p
o
r

l
o
s

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a
,

e

i
m
p
r
i
m
e

i
n
f
o
r
m
e
s

s
o
b
r
e
e
s
t
o
s

t
e
m
s
.

E
s
t
a

s
e
c
c
i

n

d
e
s
c
r
i
b
e

e
l

c

d
i
g
o

S
w
i
n
g

d
e

l
a

a
p
l
i
c
a
c
i

n

q
u
e

u
t
i
l
i
z
a

c
o
m
p
o
n
e
n
t
e
s

d
e

p
e
s
o

l
i
g
e
r
o

y

o
t
r
a
s

c
a
r
a
c
t
e
r

s
t
i
c
a
s

S
w
i
n
g
:
C
o
m
p
o
n
e
n
t
e
s

d
e

P
e
s
o

L
i
g
e
r
o




O
r
d
e
n
a
r

C
o
m
p
o
n
e
n
t
e
s




M
o
d
e
l
o
s

d
e

D
a
t
o
s




D
i
b
u
j
o

d
e

C
e
l
d
a
s

P
e
r
s
o
n
a
l
i
z
a
d
a
s




E
d
i
c
i

n

e
n

C
e
l
d
a
s

P
e
r
s
o
n
a
l
i
z
a
d
a
s




M
a
n
e
j
o

d
e

E
v
e
n
t
o
s

P
e
r
s
o
n
a
l
i
z
a
d
o
s




D
i
r
e
c
c
i
o
n
e
s

S
w
i
n
g




C
o
m
p
o
n
e
n
t
e
s

d
e

P
e
s
o

L
i
g
e
r
o
T
o
d
o
s

l
o
s

c
o
m
p
o
n
e
n
t
e
s

S
w
i
n
g
,

e
x
c
e
p
t
o

J
A
p
p
l
e
t
,
J
D
i
a
l
o
g
,
J
F
r
a
m
e

y

J
W
i
n
d
o
w

s
o
n

c
o
m
p
o
n
e
n
t
e
s

d
e

p
e
s
o

l
i
g
e
r
o
.

L
o
s

c
o
m
p
o
n
e
n
t
e
s

d
e

p
e
s
o

l
i
g
e
r
o
,

a
l

c
o
n
t
r
a
r
i
o

q
u
e

s
u
s

c
o
n
t
r
a
p
a
r
t
e

d
e
l
A
W
T
,

n
o

d
e
p
e
n
d
e
n

d
e
l

t
o
o
l
k
i
t

l
o
c
a
l

d
e
l

s
i
s
t
e
m
a
.
P
o
r

e
j
e
m
p
l
o
,

u
n

c
o
m
p
o
n
e
n
t
e

p
e
s
a
d
o

j
a
v
a
.
a
w
t
.
B
u
t
t
o
n

e
j
e
c
u
t

n
d
o
s
e

s
o
b
r
e

l
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

p
a
r
a

U
n
i
x

m
a
p
e
a

e
l

b
o
t

n

M
o
t
i
f

r
e
a
l
.

E
n

e
s
t
a

r
e
l
a
c
i

n

e
s

b
o
t

n

M
o
t
i
f

e
s

l
l
a
m
a
d
o

"
p
a
r
"

d
e
l
j
a
v
a
.
a
w
t
.
B
u
t
t
o
n
.

S
i

h
e
m
o
s

c
r
e
a
d
o

d
o
s

j
a
v
a
.
a
w
t
.
B
u
t
t
o
n

e
n

u
n
a

a
p
l
i
c
a
c
i

n
,

t
a
m
b
i

n

s
e

c
r
e
a
r

n

d
o
s

"
p
a
r
e
s
"

y

d
o
s

b
o
t
o
n
e
s

M
o
t
i
f
.

L
a

p
l
a
t
a
f
o
r
m
a

J
a
v
a

c
o
m
u
n
i
c
a
c

c
o
n

l
o
s

b
o
t
o
n
e
s

M
o
t
i
f
u
s
a
n
d
o

e
l

J
N
I
.

P
a
r
a

c
a
d
a

c
o
m
p
o
n
e
n
t
e

a

a
d
i
d
o

a

l
a

a
p
l
i
c
a
c
i

n
,

h
a
y

u
n
a

p
i
l
a

a
d
i
c
i
o
n
a
l

u
n
i
d
a

a
l

s
i
s
t
e
m
a

d
e

v
e
n
t
a
n
a
s

l
o
c
a
l
,

q
u
e

e
s

p
o
r

l
o

q
u
e

e
s
t
o
s

c
o
m
p
o
n
e
n
t
e
s

s
e

l
l
a
m
a
n

d
e

p
e
s
o

p
e
s
a
d
o
.
L
o
s

c
o
m
p
o
n
e
n
t
e
s

d
e

p
e
s
o

l
i
g
e
r
o

n
o

t
i
e
n
e

"
p
a
r
e
s
"

y

e
m
u
l
a
n

a

l
o
s

c
o
m
p
o
n
e
n
t
e
s

d
e
l

s
i
s
t
e
m
a

l
o
c
a
l

d
e

v
e
n
t
a
n
a
s
.

U
n

b
o
t

n

d
e

p
e
s
o

l
i
g
e
r
o

e
s
t


r
e
p
r
e
s
e
n
t
a
d
o

p
o
r

u
n

r
e
c
t

n
g
u
l
o

c
o
n

u
n
a

e
t
i
q
u
e
t
a
d
e
n
t
r
o

q
u
e

a
c
e
p
t
a

e
v
e
n
t
o
s

d
e
l

r
a
t

n
.

A

a
d
i
r

m

s

b
o
t
o
n
e
s

s
i
g
n
i
f
i
c
a

d
i
b
u
j
a
r

m

s

r
e
c
t

n
g
u
l
o
s
.
U
n

c
o
m
p
o
n
e
n
t
e

d
e

p
e
s
o

l
i
g
e
r
o

n
e
c
e
s
i
t
a

d
i
b
u
j
a
r
s
e

o
b
r
e

a
l
g
o
,

y

u
n
a

a
p
l
i
c
a
c
i

n

e
s
c
r
i
t
a

e
n

J
a
v
a

n
e
c
e
s
i
t
a

i
n
t
e
r
a
c
t
u
a
r

c
o
n

e
l

c
o
n
t
r
o
l
a
d
o
r

d
e

v
e
n
t
a
n
a
s

l
o
c
a
l

p
a
r
a

q
u
e

l
a

v
e
n
t
a
n
a

p
r
i
n
c
i
p
a
l

d
e

l
a
a
p
l
i
c
a
c
i

n

p
u
e
d
a

s
e
r

c
e
r
r
a
d
a

o

m
i
n
i
m
i
z
a
d
a
.

E
s
t
o

e
s

p
o
r
q
u
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

p
a
d
r
e
s

d
e

n
i
v
e
l

s
u
p
e
r
i
o
r

m
e
n
c
i
o
n
a
d
o
s

a
r
r
i
b
a

(
J
F
r
a
m
e
,
J
A
p
p
l
e
t
,

y

o
t
r
o
s
)

e
s
t

n

i
m
p
l
e
m
e
n
t
a
d
o

c
o
m
o
c
o
m
p
o
n
e
n
t
e
s

d
e

p
e
s
o

p
e
s
a
d
o

-
-

n
e
c
e
s
i
t
a
n

s
e
r

m
a
p
e
a
d
o
s

s
o
b
r
e

u
n

c
o
m
p
o
n
e
n
t
e

e
n

e
l

s
i
s
t
e
m
a

l
o
c
a
l

d
e

v
e
n
t
a
n
a
s
.
U
n
J
B
u
t
t
o
n

e
s

u
n
a

f
o
r
m
a

m
u
y

s
e
n
c
i
l
l
a

d
e

d
i
b
u
j
a
r
.

P
a
r
a

c
o
m
p
o
n
e
n
t
e
s

m

s

c
o
m
p
l
e
j
o
s
,

c
o
m
o

J
L
i
s
t

o

J
T
a
b
l
e
,

l
o
s

e
l
e
m
e
n
t
o
s

o

c
e
l
d
a
s

d
e

l
a

l
i
s
t
a

o

l
a

t
a
b
l
a

s
o
n

d
i
b
u
j
a
d
a
s

p
o
r

u
n

o
b
j
e
t
o
C
e
l
l
R
e
n
d
e
r
e
r
.

U
n

o
b
j
e
t
o

C
e
l
l
R
e
n
d
e
r
e
r

p
r
o
p
o
r
c
i
o
n
a

f
l
e
x
i
b
i
l
i
d
a
d

p
o
r
q
u
e

h
a
c
e

p
o
s
i
b
l
e

q
u
e

c
u
a
l
q
u
i
e
r

t
i
p
o

d
e

o
b
j
e
t
o

p
u
e
d
a

s
e
r

m
o
s
t
r
a
d
o

e
n

c
u
a
l
q
u
i
e
r

f
i
l
a

o

c
o
l
u
m
n
a
.
P
o
r

e
j
e
m
p
l
o
,

u
n

J
T
a
b
l
e

p
u
e
d
e

u
s
a
r

u
n

C
e
l
l
R
e
n
d
e
r
e
r

d
i
f
e
r
e
n
t
e

p
a
r
a

c
a
d
a

c
o
l
u
m
n
a
.

E
s
t
e

s
e
g
m
e
n
t
o

d
e

c

d
i
g
o

s
e
l
s
c
c
i
o
n
a

l
a

s
e
g
u
n
d
a

c
o
l
u
m
n
a
,

q
u
e

e
s
t


r
e
f
e
r
e
n
c
i
a
d
a

c
o
m
o

n
d
i
c
e

1
,

p
a
r
a
u
s
a
r

u
n

o
b
j
e
t
o

C
u
s
t
o
m
R
e
n
d
e
r
e
r

p
a
r
a

c
r
e
a
r

l
a
s

c
e
l
d
a
s

d
e

e
s
a

c
o
l
u
m
n
a
.


J
T
a
b
l
e

s
c
r
o
l
l
T
a
b
l
e
=
n
e
w

J
T
a
b
l
e
(
r
m
)
;


T
a
b
l
e
C
o
l
u
m
n
M
o
d
e
l

s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l

=

















s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
C
o
l
u
m
n
M
o
d
e
l
(
)
;


C
u
s
t
o
m
R
e
n
d
e
r
e
r

c
u
s
t
o
m

=

n
e
w

C
u
s
t
o
m
R
e
n
d
e
r
e
r
(
)
;


s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
1
)
.
s
e
t
C
e
l
l
R
e
n
d
e
r
e
r
(
c
u
s
t
o
m
)
;
O
r
d
e
n
a
r

C
o
m
p
o
n
e
n
t
e
C
a
d
a

a
p
l
i
c
a
c
i

n

o

a
p
p
l
e
t

S
w
i
n
g

n
e
c
e
s
i
t
a

a
l

m
e
n
o
s

u
n

c
o
m
p
o
n
e
n
t
e

c
o
n
t
e
n
e
d
o
r

d
e

p
e
s
o

p
e
s
a
d
o

(
u
n

J
F
r
a
m
e
,
J
W
i
n
d
o
w
,
J
A
p
p
l
e
t
,

o

J
D
i
a
l
o
g
)
.

C
a
d
a

u
n
o

d
e

e
s
t
o
s

c
o
m
p
o
n
e
n
t
e
s

c
o
n

l
a
c
o
n
t
r
a
p
a
r
t
e

d
e

J
F
r
a
m
e
:
J
I
n
t
e
r
n
a
l
F
r
a
m
e
,

c
o
n
t
i
e
n
e

u
n

c
o
m
p
o
n
e
n
t
e

l
l
a
m
a
d
o

R
o
o
t
P
a
n
e
.

E
l

J
R
o
o
t
P
a
n
e

c
o
n
t
r
o
l
a

l
a

a
d
i
c
i

n

d
e

c
a
p
a
s

a
d
i
c
i
o
n
a
l
e
s

u
s
a
d
a
s

e
n

d
i
c
h
o

c
o
n
t
e
n
e
d
o
r

c
o
m
o
J
L
a
y
e
r
e
d
P
a
n
e
,
J
C
o
n
t
e
n
t
P
a
n
e
,
G
l
a
s
s
P
a
n
e

y

l
a

o
p
c
i
o
n
a
l
J
M
e
n
u
B
a
r
.

T
a
m
b
i

n

l
e
s

p
e
r
m
i
t
e

a

t
o
d
o
s

l
o
s

c
o
m
p
o
n
e
n
t
e
s

e
m
u
l
a
d
o
s

(
d
e

p
e
s
o

l
i
g
e
r
o
)

i
n
t
e
r
a
c
t
u
a
r

c
o
n

l
a

c
o
l
a

d
e

e
v
e
n
t
o
s

A
W
T

p
a
r
a
e
n
v
i
a
r

y

r
e
c
i
b
i
r

e
v
e
n
t
o
s
.

A
l

i
n
t
e
r
a
c
t
u
a
r

c
o
n

l
a

c
o
l
a

d
e

e
v
e
n
t
o
s
,

t
o
d
o
s

l
o
s

c
o
m
p
o
n
e
n
t
e
s

e
m
u
l
a
d
o
s

o
b
t
e
i
n
e
n

u
n
a

i
n
t
e
r
a
c
c
i

n

i
n
d
i
r
e
c
t
a

c
o
n

e
l

c
o
n
t
r
o
l
a
d
o
r

d
e

v
e
n
t
a
n
a
s

l
o
c
a
l
.
J
L
a
y
e
r
e
d
P
a
n
e
E
l
J
L
a
y
e
r
e
d
P
a
n
e

s
e

s
i
t

a

s
o
b
r
e

e
l

J
R
o
o
t
P
a
n
e
,

y

c
o
m
o

s
u

n
o
m
b
r
e

i
n
d
i
c
a
,

c
o
n
t
r
o
l
a

l
a
s

c
a
p
a
s

d
e
l

c
o
m
p
o
n
e
n
t
e

c
o
n
t
e
n
i
d
a
s

d
e
n
t
r
o

d
e

l
o
s

l

m
i
t
e
s

d
e
l

c
o
n
t
e
n
e
d
o
r

d
e

p
e
s
o

p
e
s
a
d
o
.

L
o
s
c
o
m
p
o
n
e
n
t
e
s

n
o

s
o
n

a

a
d
i
d
o
s

a
l

J
L
a
y
e
r
e
d
P
a
n
e
,

s
i
n
o

a
l

J
C
o
n
t
e
n
t
P
a
n
e
.

E
l

J
L
a
y
e
r
e
d
P
a
n
e

d
e
t
e
r
m
i
n
a

e
l

o
r
d
e
n

Z

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s

d
e
l

J
R
o
o
t
P
a
n
e
.

S
e

p
u
e
d
e

p
e
n
s
a
r

e
n

e
l

o
r
d
e
n

Z
c
o
m
o

e
l

o
r
d
e
n

d
e

s
o
l
a
p
a
m
i
e
n
t
o

d
e

v
a
r
i
o
s

c
o
m
p
o
n
e
n
t
e
s
.

S
i

a
r
r
a
s
t
r
a
m
o
s

y

s
o
l
t
a
m
o
s

u
n

c
o
m
p
o
n
e
n
t
e

o

s
o
l
i
c
i
t
a
m
o
s

u
n

d
i

l
o
g
o

d
e
s
p
l
e
g
a
b
l
e
,

q
u
e
r
e
m
o
s

q
u
e

e
l

c
o
m
p
o
n
e
n
t
e

a
p
a
r
e
z
c
a

e
n
c
i
m
a

d
e
t
o
d
a
s

l
a
s

o
t
r
a
s

v
e
n
t
a
n
a

d
e

l
a

a
p
l
i
c
a
c
i

n
.

E
l

J
L
a
y
e
r
e
d
P
a
n
e

n
o
s

p
e
r
m
i
t
e

p
o
n
e
r

l
o
s

c
o
m
p
o
n
e
n
t
e
s

e
n

c
a
p
a
s
.
E
l
J
L
a
y
e
r
e
d
P
a
n
e

d
i
v
i
d
e

l
a

p
r
o
f
u
n
d
i
d
a
d

d
e
l

c
o
n
t
e
n
e
d
o
r

e
n

d
i
f
e
r
e
n
t
e
s

b
a
n
d
a
s

q
u
e

p
u
e
d
e
n

u
s
a
r
s
r

p
a
r
a

a
s
i
g
n
a
r
l
e

a

u
n

c
o
m
p
o
n
e
n
t
e

u
n

t
i
p
o

d
e

n
i
v
e
l

a
p
r
o
p
i
a
d
o
.

L
a

b
a
n
d
a

D
R
A
G
_
L
A
Y
E
R

,
v
a
l
o
r

4
0
0
,

a
p
a
r
e
c
e

s
o
b
r
e

t
o
d
a
s

l
a
s

d
e
m

s

c
a
p
a
s
.

E
l

n
i
v
e
l

m

s

i
n
g
e
r
i
o
r

d
e

J
L
a
y
e
r
e
d
p
a
n
e
,

l
a

b
a
n
d
a

D
E
F
A
U
L
T
_
F
R
A
M
E
_
L
A
Y
E
R
,

t
i
e
n
e

v
a
l
o
r

-
3
0
0
0

y

y

e
s

e
l

n
i
v
e
l

d
e

l
o
s

c
o
n
t
e
n
e
d
o
r
e
s

d
e
p
e
s
o

p
e
s
a
d
o
,

i
n
c
l
u
y
e
n
d
o

e
l

M
e
n
u
B
a
r
.

L
a
s

b
a
n
d
a
s

s
o
n

l
a
s

s
i
g
u
i
e
n
t
e
s
:
V
a
l
o
r
N
o
m
b
r
e

d
e

B
a
n
d
a
T
i
p
o
s

d
e

C
o
m
p
o
n
e
n
t
e
s
-
3
0
0
0
D
E
F
A
U
L
T
_
F
R
A
M
E
_
L
A
Y
E
R
J
M
e
n
u
b
a
r
0
D
E
F
A
U
L
T
_
L
A
Y
E
R
J
B
u
t
t
o
n
,

J
T
a
b
l
e
,

.
.
P
A
L
E
T
T
E
_
L
A
Y
E
R
C
o
m
p
o
n
e
n
t
e
s

f
l
o
t
a
n
t
e
s
c
o
m
o

u
n

J
T
o
o
l
B
a
r
M
O
D
A
L
_
L
A
Y
E
R
D
i

l
o
g
o
s

M
o
d
a
l
e
s
4
0
0
D
R
A
G
_
L
A
Y
E
R
F
O
N
T

F
A
C
E
=
"
V
e
r
d
a
n
a
,

A
r
i
a
l
,

H
e
l
v
e
t
i
c
a
,

s
a
n
s
-
s
e
r
i
f
"
>
A
r
r
a
s
t
r
a
r

y

S
o
l
t
a
r
s
o
b
r
e

t
o
d
a
s

l
a
s

c
a
p
a
s
d
e

e
s
t
a
s

b
a
n
d
a
s

d
e

p
r
o
f
u
n
d
i
d
a
d

g
e
n
e
r
a
l
e
s
,

l
o
s

c
o
m
p
o
n
e
n
t
e
s

p
e
u
d
e
n

e
s
t

r

o
r
g
a
n
i
z
a
d
o
s

c
o
n

u
n

s
i
s
t
e
m
a

d
e

o
r
d
e
n
a
c
i

n

p
a
r
a

o
r
d
e
n
a
r

l
o
s

c
o
m
p
o
n
e
n
t
e
s

d
e
n
t
r
o

d
e

u
n
a

b
a
n
d
a

p
a
r
t
i
c
u
l
a
r
,

p
e
r
o
e
s
t
e

s
i
s
t
e
m
a

i
n
v
i
e
r
t
e

l
a

p
r
i
o
r
i
d
a
d

d
e

l
o
s

n

m
e
r
o
s
.

P
o
r

e
j
e
m
p
l
o
,

e
n

u
n
a

b
a
n
d
a

e
s
p
e
c
i
f
i
c
a
d
a

c
o
m
o

D
E
F
A
U
L
T
_
L
A
Y
E
R
,

l
o
s

c
o
m
p
o
n
e
n
t
e
s

c
o
n

u
n

v
a
l
o
r
,

a
p
a
r
e
c
e
n

d
e
l
a
n
t
e

d
e

l
o
s

o
t
r
o
s
c
o
m
p
o
n
e
n
t
e
s

d
e

l
a

b
a
n
d
a
;

m
i
e
n
t
r
a
s
,

c
o
m
p
o
n
e
n
t
e
s

c
o
n

u
n

n

m
e
r
o

m
a
y
o
r

o

-
1

a
p
a
r
e
c
e
n

p
o
r

d
e
t
r

s

d
e

l
.

E
l

n

m
e
r
o

m

s

a
l
t
o

e
n

e
s

e
s
q
u
e

d
e

n
u
m
e
r
a
c
i

n

e
s

.
1
,

p
o
r

e
s
o

u
n
a

f
o
r
m
a

d
e
v
i
s
u
a
l
i
z
a
r
l
o

e
s

u
n

v
e
c
t
o
r

d
e

c
o
m
p
o
n
e
n
t
e
s

q
u
e

p
a
s
a

a

t
r
a
v

s

d
e

d
i
b
u
j
a
r

p
r
i
m
e
r
o

l
o
s

c
o
m
p
o
n
e
n
t
e
s

c
o
n

u
n

n

m
e
r
o

m
a
y
o
r

t
e
r
m
i
n
a
n
d
o

c
o
n

e
l

c
o
m
p
o
n
e
n
t
e

e
n

l
a

p
o
s
i
c
i

n

0
.
P
o
r

e
j
e
m
p
l
o
,

e
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

a

a
d
e

u
n

J
B
u
t
t
o
n

a

l
a

c
a
p
a

p
o
r

d
e
f
e
c
t
o

y

e
s
p
e
c
i
f
i
c
a

q
u
e

a
p
a
r
e
z
c
a

e
n
c
i
m
a

d
e

l
o
s

o
t
r
o
s

c
o
m
p
o
n
e
n
t
e
s

d
e

e
s
a

m
i
s
m
a

c
a
p
a
:


J
B
u
t
t
o
n

e
n
t
e
r
B
u
t
t
o
n

=

n
e
w

J
B
u
t
t
o
n
(
"
E
n
t
e
r
"
)
;


l
a
y
e
r
e
d
P
a
n
e
.
a
d
d
(
e
n
t
e
r
B
u
t
t
o
n
,



















J
L
a
y
e
r
e
d
P
a
n
e
.
D
e
f
a
u
l
t
_
L
a
y
e
r
,

0
)
;
P
o
d
e
m
o
s

c
o
n
s
e
g
u
i
r

e
l

m
i
s
m
o

e
f
e
c
t
o

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

L
a
y
e
r
e
d
P
a
n
e
.
m
o
v
e
T
o
F
o
n
t

d
e
n
t
r
o

d
e

u
n
a

c
a
p
a

o

u
s
a
n
d
o

e
l

m

t
o
d
o

L
a
y
e
r
e
d
P
a
n
e
.
s
e
t
L
a
y
e
r

m

t
o
d
o

p
a
r
a

m
o
v
e
r
l
o

a

u
n
a

c
a
p
a
d
i
f
e
r
e
n
t
e
.
J
C
o
n
t
e
n
t
P
a
n
e
E
l
J
C
o
n
t
e
n
t
P
a
n
e

c
o
n
t
r
o
l
a

l
a

a
d
i
c
i

n

d
e

c
o
m
p
o
n
e
n
t
e
s

a

l
o
s

c
o
n
t
e
n
e
d
o
r
e
s

d
e

p
e
s
o

p
e
s
a
d
o
.

P
o
r

e
s
o
,

t
e
n
e
m
o
s

q
u
e

l
l
a
m
a
r

a
l

m

t
o
d
o

g
e
t
C
o
n
t
e
n
t
P
a
n
e

p
a
r
a

a

a
d
i
r

u
n

c
o
m
p
o
n
e
n
t
e

a
l
C
o
n
t
e
n
t
P
a
n
e

d
e
l

R
o
o
t
P
a
n
e
.

P
o
r

d
e
f
e
c
t
o
,

u
n

C
o
n
t
e
n
t
P
a
n
e

s
e

i
n
i
c
i
a
l
i
z
a

c
o
n

u
n

c
o
n
t
r
o
l
a
d
o
r

d
e

d
i
s
t
r
i
b
u
c
i

n

B
o
r
d
e
r
L
a
y
o
u
t
.

H
a
y

d
o
s

f
o
r
m
a
s

d
e

c
a
m
b
i
a
r

e
l

c
o
n
t
r
o
l
a
d
o
r

d
e

d
i
s
t
r
i
b
u
c
i

n
.
P
o
d
e
m
o
s

l
l
a
m
a
r

a
l

m

t
o
d
o

s
e
t
L
a
y
o
u
t

d
e

e
s
t
a

f
o
r
m
a
:


g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
)
.
s
e
t
L
a
y
o
u
t
(
n
e
w

B
o
x
L
a
y
o
u
t
(
)
)
O

p
o
d
e
m
o
s

r
e
e
m
p
l
a
z
a
r

e
l

C
o
n
t
e
n
t
P
a
n
e

p
o
r

d
e
f
e
c
t
o

c
o
n

n
u
e
s
t
r
o

p
r
o
p
i
o

C
o
n
t
e
n
t
P
a
n
e
,

c
o
m
o

u
n

J
P
a
n
e
l
,

c
o
m
o

e
s
t
e
:


J
P
a
n
e
l

p
a
n
e
=

n
e
w

J
P
a
n
e
l
(
)
;


p
a
n
e
.
s
e
t
L
a
y
o
u
t
(
n
e
w

B
o
x
L
a
y
o
u
t
(
)
)
;


s
e
t
C
o
n
t
e
n
t
P
a
n
e
(
p
a
n
e
)
;
G
l
a
s
s
P
a
n
e
E
l
G
l
a
s
s
P
a
n
e

n
o
r
m
a
l
m
e
n
t
e

e
s

c
o
m
p
l
e
t
a
m
e
n
t
e

t
r
a
n
s
p
a
r
e
n
t
e

y

s
o
l
o

a
c
t

a

c
o
m
o

u
n
a

h
o
j
a

d
e

c
r
i
s
t
a
l

d
e
l
a
n
t
e

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e
s
.

P
o
d
e
m
o
s

i
m
p
l
e
m
e
n
t
a
r

n
u
e
s
t
r
o

p
r
o
p
i
o

G
l
a
s
s
P
a
n
e

u
s
a
n
d
o
u
n

c
o
m
p
o
n
e
n
t
e

c
o
m
o

J
P
a
n
e
l

e

i
n
s
t
a
l

n
d
o
l
o

c
o
m
o

e
l

G
l
a
s
s
P
a
n
e

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

s
e
t
G
l
a
s
s
P
a
n
e
.

E
l

R
o
o
t
P
a
n
e

s
e

c
o
n
f
i
g
u
r
a

c
o
n

u
n

G
l
a
s
s
P
a
n
e

q
u
e

p
u
e
d
e

s
e
r

r
e
c
u
p
e
r
a
d
o

l
l
a
m
a
n
d
o

a
g
e
t
G
l
a
s
s
P
a
n
e
.
U
n
a

f
o
r
m
a

d
e

u
s
a
r

u
n

G
l
a
s
s
P
a
n
e

e
s

p
a
r
a

i
m
p
l
e
m
e
n
t
a
r

u
n

c
o
m
p
o
n
e
n
t
e

q
u
e

d
e

f
o
r
m
a

i
n
v
i
s
b
l
e

m
a
n
e
j
e

t
o
d
o
s

l
o
s

e
v
e
n
t
o
s

d
e

t
e
c
l
a
d
o

y

d
e

r
a
t

n
,

b
l
o
q
u
e
a
n
d
o

e
f
e
c
t
i
v
a
m
e
n
t
e

l
a

e
n
t
r
a
d
a

d
e
l
u
s
u
a
r
i
o

h
a
s
t
a

q
u
e

s
e

c
o
m
p
l
e
t
e

u
n

e
v
e
n
t
o
.

E
l

G
l
a
s
s
P
a
n
e

p
u
e
d
e

b
l
o
q
u
e
a
r

l
o
s

e
v
e
n
t
o
s
,

p
e
r
o

r
e
a
l
m
e
n
t
e

e
l

c
u
r
s
o
r

n
o

v
o
l
v
e
r


a

s
u

e
s
t
a
d
o

p
o
r

d
e
f
e
c
t
o

s
i

t
e
n
e
r
m
o
s

s
e
l
e
c
c
i
o
n
a
r

e
l

c
u
r
s
o
r

p
a
r
a
q
u
e

s
e
a

u
n

c
u
r
s
o
r

o
c
u
p
a
d
o

e
n

e
l

G
l
a
s
s
P
a
n
e
.

S
e

r
e
q
u
i
e
r
e

u
n

e
v
e
n
t
o

d
e

r
a
t

n

a
d
i
c
i
o
n
a
l

p
a
r
a

e
l

r
e
f
r
e
s
c
o
:


M
y
G
l
a
s
s
P
a
n
e


g
l
a
s
s
P
a
n
e

=

n
e
w

M
y
G
l
a
s
s
P
a
n
e
(
)
;


s
e
t
G
l
a
s
s
P
a
n
e
(
g
l
a
s
s
P
a
n
e
)
;


s
e
t
G
l
a
s
s
P
a
n
e
.
s
e
t
V
i
s
i
b
l
e
(
t
r
u
e
)
;

/
/
b
e
f
o
r
e

w
o
r
k
e
r

t
h
r
e
a
d


.
.


s
e
t
G
l
a
s
s
P
a
n
e
.
s
e
t
V
i
s
i
b
l
e
(
f
a
l
s
e
)
;

/
/
a
f
t
e
r

w
o
r
k
e
r

t
h
r
e
a
d


p
r
i
v
a
t
e

c
l
a
s
s

M
y
G
l
a
s
s
P
a
n
e

e
x
t
e
n
d
s

J
P
a
n
e
l

{




p
u
b
l
i
c

M
y
G
l
a
s
s
P
a
n
e
(
)

{






a
d
d
K
e
y
L
i
s
t
e
n
e
r
(
n
e
w

K
e
y
A
d
a
p
t
e
r
(
)

{

}
)
;






a
d
d
M
o
u
s
e
L
i
s
t
e
n
e
r
(
n
e
w

M
o
u
s
e
A
d
a
p
t
e
r
(
)

{

}
)
;






s
u
p
e
r
.
s
e
t
C
u
r
s
o
r
(








C
u
r
s
o
r
.
g
e
t
P
r
e
d
e
f
i
n
e
d
C
u
r
s
o
r
(
C
u
r
s
o
r
.
W
A
I
T
_
C
U
R
S
O
R
)
)
;




}


}
M
o
d
e
l
o
s

d
e

D
a
t
o
s
S
e

h
a
n

c
o
m
b
i
n
a
d
o

n
u
m
e
r
o
s
o
s

m
o
d
e
l
o
s

d
e

c
a
p
a
s

p
a
r
a

f
o
r
m
a
r

l
a
s

t
a
b
l
a
s

d
e
l

G
U
I

A
u
c
t
i
o
n
C
l
i
e
n
t
.

A

u
n

n
i
v
e
l

f
u
n
d
a
c
i
o
n
a
l
,

e
l

i
n
t
e
r
f
a
c
e

T
a
b
l
e
M
o
d
e
l

y

s
u
s

d
o
s

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s
A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l

y

D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l

p
r
o
p
o
c
i
o
n
a
n

l
a
s

o
p
c
i
o
n
e
s

m

s

b

s
i
c
a
s

p
a
r
a

a
l
m
a
c
e
n
a
r
,

r
e
c
u
p
e
a
r

y

m
o
d
i
f
i
c
a
r

l
o
s

d
a
t
o
s

b

s
i
c
o
s
.
E
l
T
a
b
l
e
M
o
d
e
l

e
s

r
e
s
p
o
n
s
a
b
l
e

d
e

d
e
f
i
n
i
r

y

c
a
t
e
g
o
r
i
z
a
r

l
o
s

d
a
t
o
s

p
o
r

s
u
s

c
l
a
s
e
s
.

T
a
m
b
i

n

d
e
t
e
r
m
i
n
a

s
i

e
l

d
a
t
o

p
u
e
d
e

s
e
r

e
d
i
t
a
d
o

y

c

m
o

s
e

a
g
r
u
p
a
n

l
o
s

d
a
t
o
s

e
n

c
o
l
u
m
n
a
s

y

f
i
l
a
s
.

S
i
n
e
m
b
a
r
g
o
,

e
s

i
m
p
o
r
t
a
n
t
e

o
b
s
e
r
v
a
r

q
u
e

m
i
e
n
t
r
a
s

e
l

i
n
t
e
r
f
a
c
e

T
a
b
l
e
M
o
d
e
l

s
e

u
s
a

m

s

f
r
e
c
u
e
n
t
e
m
e
n
t
e

e
n

l
a

c
o
n
s
t
r
u
c
c
i

n

d
e

u
n

J
T
a
b
l
e
,

n
o

e
s
t


u
n
i
d
o

f
u
n
d
a
m
e
n
t
a
l
m
e
n
t
e

a

s
u

a
p
a
r
i
e
n
c
i
a

e
n
p
a
n
t
a
l
l
a
.

L
a
s

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

p
o
d
r

a

f

c
i
l
m
e
n
t
e

f
o
r
m
a
r

l
a

p
a
r
t
e

b

s
i
c
a

d
e

l
a

h
o
j
a

d
e

c

l
c
u
l
o
,

o

i
n
c
l
u
i
s
o

u
n
a

c
l
a
s
e

n
o
-
G
U
I

q
u
e

p
i
d
a

l
a

o
r
g
a
n
i
z
a
c
i

n

d
e

l
o
s

d
a
t
o
s

d
e

u
n
a

f
o
r
m
a

t
a
b
u
l
a
r
.
L
a

c
l
a
s
e

R
e
s
u
l
t
s
M
o
d
e
l

e
s

e
l

c
o
r
a
z

n

d
e

l
a
s

t
a
b
l
a
s

A
u
c
t
i
o
n
C
l
i
e
n
t
.

D
e
f
i
n
e

u
n
a

h
o
j
a

d
e

d
a
t
o
s

d
i
m

m
i
c
a
,

d
i
c
t
a

q
u


u
s
u
a
r
i
o
s

d
e

l
a

c
l
a
s
e

p
u
e
d
e
n

e
d
i
t
a
r

l
o
s

d
a
t
o
s

a

t
r
a
v

s

d
e
l

m

t
o
d
o
R
e
s
u
l
t
s
M
o
d
e
l
.
i
s
C
e
l
l
E
d
i
t
a
b
l
e
,

y

p
r
o
p
o
r
c
i
o
n
a

e
l

m

t
o
d
o

u
p
d
a
t
e

p
a
r
a

m
a
n
t
e
n
e
r

l
o
s

d
a
t
o
s

a
c
t
u
a
l
i
z
a
d
o
s
.

E
l

m
o
d
e
l
o

e
s

l
a

b
a
s
e

d
e

l
a

t
a
b
l
a
s

f
i
j
a
s

y

e
s
c
r
o
l
l
a
b
l
e
s
,

y

d
e
j
a

q
u
e

l
a
s

m
o
d
i
f
i
c
a
c
i
o
n
e
s
s
e

r
e
f
l
e
j
e
n

e
n

c
a
d
a

v
i
s
t
a
.
A

u
n

a
l
t
o

n
i
v
e
l
,

y

r
e
p
r
e
s
e
n
t
a
d
o

u
n
c
a

c
a
p
a

i
n
t
e
r
m
e
d
i
a

e
n
t
r
e

l
o
s

d
a
t
o
s

y

s
u

r
e
p
r
e
s
e
n
t
a
c
i

n

g
r

f
i
c
a

e
s
t
a

e
l

T
a
b
l
e
C
o
l
u
m
n
M
o
d
e
l
.

E
n

e
s
t
e

n
i
v
e
l

l
o
s

d
a
t
o
s

s
o
n

a
g
r
u
p
a
d
o
s

p
o
r

c
o
l
u
m
n
a
s

e
n
a
n
t
i
c
i
p
a
c
i

n

d
e

s
u

a
p
a
r
i
c
i

n

g
r

f
i
c
a

e
n

l
a

t
a
b
l
a
.

L
a

v
i
s
i
b
i
l
i
d
a
d

y

t
a
m
a

o

d
e

l
a
s

c
o
l
u
m
n
a
s
,

s
u
s

c
a
b
e
c
e
r
a
s
,

y

l
o
s

t
i
p
o
s

d
e

c
o
m
p
o
n
e
n
t
e
s

d
e

s
u
s

r
e
n
d
e
r
i
z
a
d
o
r
e
s

d
e

c
e
l
d
a
s

y

e
d
i
t
o
r
e
s

s
o
n

t
o
d
o
s
m
a
n
e
j
a
d
o
s

p
o
r

l
a

c
l
a
s
e

T
a
b
l
e
C
o
l
u
m
n
M
o
d
e
l
.
P
o
r

e
j
e
m
p
l
o
,

c
o
n
g
e
l
a
r

l
a

c
o
l
u
m
n
a

m

s

a
l
a

i
z
q
u
i
e
r
d
a

d
e
l

G
U
I

A
u
c
t
i
o
n
C
l
i
e
n
t

e
s

p
o
s
i
b
l
e

p
o
r
q
u
e

l
o
s

d
a
t
o
s

d
e

l
a

c
o
l
u
m
n
a

s
i
n

f

c
i
l
m
e
n
t
e

i
n
t
e
r
c
a
m
b
i
a
b
l
e
s

e
n
t
r
e

m

l
t
i
p
l
e
s

o
b
j
e
t
o
s
T
a
b
l
e
C
o
l
u
m
n
M
o
d
e
l

y

J
T
a
b
l
e
.

E
s
t
o

t
r
a
d
u
c
e

l
o
s

o
b
j
e
t
o
s

f
i
x
e
d
T
a
b
l
e

y

s
c
r
o
l
l
T
a
b
l
e

d
e
l

p
r
o
g
r
a
m
a

A
u
c
t
i
o
n
C
l
i
e
n
t
.
M

s

a
l
t
o

t
a
d
a
v

a

s
e

u
n
e
n

l
o
s

d
i
s
t
i
n
t
o
s

r
e
d
e
r
i
z
a
d
o
r
e
s
,

e
d
i
t
o
r
e
s

y

c
o
m
p
o
n
e
n
t
e
s

d
e

c
a
b
e
c
e
r
a

c
u
y
a

c
o
m
b
i
n
a
c
i

n

d
e
f
i
n
e

e
l

a
s
p
e
c
t
o

y

o
r
g
a
n
i
z
a
c
i

n

d
e
l

c
o
m
p
o
n
e
n
t
e

J
T
a
b
l
e
.

E
s
t
e

n
i
v
e
l

e
s

o
n
d
e

s
e
t
o
m
a
s

l
a
s

d
e
c
i
s
i
o
n
e
s

f
u
n
d
a
m
e
n
t
a
l
e
s

s
o
b
r
e

l
a

d
i
s
t
r
i
b
u
c
i

n

d
e
l

J
T
a
b
l
e
.
L
a

c
r
e
a
c
c
i

n

d
e

l
a
s

c
l
a
s
e
s

i
n
t
e
r
n
a
s

C
u
s
t
o
m
R
e
n
d
e
r
e
r

y

C
u
s
t
o
m
B
u
t
t
o
n
R
e
n
d
e
r
e
r

d
e
n
t
r
o

d
e

l
a

a
p
l
i
c
a
c
i

n

A
u
c
t
i
o
n
C
l
i
e
n
t

p
e
r
m
i
t
e

a

l
o
s

u
s
u
a
r
i
o
s

d
e

e
s
a
s

c
l
a
s
e
s

r
e
d
e
f
i
n
i
r

l
o
s

c
o
m
p
o
n
e
n
t
e
s
s
o
b
r
e

l
o
s

q
u
e

s
e

b
a
s
a

l
a

a
p
a
r
i
e
n
c
i
a

d
e

l
a
s

c
e
l
d
a
s

d
e

l
a

t
a
b
l
a
.

D
e

i
g
u
a
l

f
o
r
m
a
,

l
a

c
l
a
s
e

C
u
s
t
o
m
B
u
t
t
o
n
E
d
i
t
o
r

t
o
m
a

e
l

l
u
g
a
r

d
e
l

e
d
i
t
o
r

p
o
r

d
e
f
e
c
t
o

d
e

l
a

t
a
b
l
a
.

D
e

u
n
a

f
o
r
m
a

v
e
r
d
a
d
e
r
a
m
e
n
t
e
o
r
i
e
n
t
a
d
a

a

o
j
e
t
o
s
,

l
o
s

e
d
i
t
o
r
e
s

p
o
r

d
e
f
e
c
t
o

y

r
e
n
d
e
r
i
z
a
d
o
r
e
s

s
o
n

f

c
i
l
m
e
n
t
e

r
e
e
m
p
l
a
z
a
d
o
s

s
i

a
f
e
c
t
a
r

a

l
o
s

d
a
t
o
s

q
u
e

e
l
l
o
s

r
e
p
r
e
s
e
n
t
a
n

n
i

l
a

f
u
n
c
i

n

d
e
l

c
o
m
p
o
n
e
n
t
e

e
n

e
l

q
u
e

r
e
s
i
d
e
n
.
F
i
n
a
l
m
e
n
t
e
,

l
o
s

d
i
s
t
i
n
t
o
s

i
n
t
e
r
f
a
c
e
s

d
e

l
o
s

c
o
m
p
o
n
e
n
t
e

d
e

u
s
u
a
r
i
o

s
o
n

r
e
s
p
o
n
s
a
v
l
e
s

d
e

l
a

a
p
a
r
i
e
n
c
i
a

l
t
i
m
a

d
e

l
a

J
T
a
b
l
e
.

E
s
t
a

e
s

l
a

r
e
p
r
e
s
e
n
t
a
c
i

n

e
s
p
e
c

f
i
c
a

d
e
l

a
s
p
e
c
t
o

y

c
o
m
p
o
r
t
a
m
i
e
n
t
o
d
e

l
a
s

t
a
b
l
a
s

A
u
c
t
i
o
n
C
l
i
e
n
t

y

s
u
s

d
a
t
o
s

d
e

u
n
a

f
o
r
m
a

f
i
n
a
l
.

E
l

r
e
s
u
l
t
a
d
o

f
i
n
a
l

e
s

q
u
e

a

a
d
i
r

u
n
a

p
a
r
t
e

f
i
n
a
l

S
w
i
n
g

a

u
n
o
s

s
e
r
v
i
c
i
o
s

e
x
i
s
t
e
n
t
e
s

r
e
q
u
i
e
r
e

m
u
y

c

d
i
g
o

a
d
i
c
i
o
n
a
l
.

D
e

h
e
c
h
o
,

l
a
c
o
d
i
f
i
c
a
c
i

n

d
e
l

m
o
d
e
l
o

e
s

u
n
a

d
e

l
a
s

t
a
r
e
a
s

m

s

s
e
n
c
i
l
l
a
s

a
l

c
o
n
s
t
r
u
i
r

u
n
a

a
p
l
i
c
a
c
i

n

S
w
i
n
g
.
M
o
d
e
l
o

d
e

l
a

T
a
b
l
a
L
a

c
l
a
s
e

J
T
a
b
l
e

t
i
e
n
e

a
s
o
c
i
a
d
a

u
n
a

c
l
a
s
e

D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l

q
u
e

i
n
t
e
r
n
a
m
e
n
t
e

u
s
a

u
n

v
e
c
t
o
r

p
a
r
a

a
l
m
a
c
e
n
a
r

d
a
t
o
s
.

L
o
s

d
a
t
o
s

d
e

c
a
d
a

f
i
l
a

s
o
n

a
l
m
a
c
e
n
a
d
o
s

e
n

u
n

o
b
j
e
t
o

V
e
c
t
o
r

s
i
n
g
l
m
i
e
n
t
r
a
s

q
u
e

o
t
r
o

o
b
j
e
t
o

V
e
c
t
o
r

a
l
m
a
c
e
n
a

c
a
d
a

u
n
a

d
e

e
s
a
s

c
o
l
u
m
n
a
s

y

l
o
s

e
l
e
m
e
n
t
o
s

q
u
e

l
a
s

c
o
n
s
t
i
t
u
y
e
n
.

E
l

o
b
j
e
t
o

D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l

p
u
e
d
e

s
e
r

i
n
i
c
i
a
l
i
z
a
d
o

c
o
n

d
a
t
o
s

d
e

v
a
r
i
a
s
f
o
r
m
a
s

d
i
f
e
r
e
n
t
e
s
.

E
s
t
e

c

d
i
g
o

m
u
e
s
t
a

e
l

D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l

c
r
e
a
d
o

c
o
n

u
n

a
r
r
a
y

d
e

d
o
s

d
i
m
e
n
s
i
o
n
e
s

y

u
n

s
e
g
u
n
d
o

a
r
r
a
y

q
u
e

r
e
p
r
e
s
e
n
t
a

l
a
s

c
a
b
e
c
e
r
a
s

d
e

c
o
l
u
m
n
a
s
.

E
l
D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l

c
o
n
v
i
e
r
t
e

e
l

a
r
r
a
y

d
e

O
b
j
e
c
t

e
n

l
o
s

o
b
j
e
t
o
s

V
e
c
t
o
r

a
p
r
o
p
i
d
o
s
:


O
b
j
e
c
t
[
]
[
]

d
a
t
a

=

n
e
w

O
b
j
e
c
t
[
]
[
]
{

{
"
r
o
w

1

c
o
l
1
"
,





































"
R
o
w

1

c
o
l
2
"

}
,




































{
"
r
o
w

2

c
o
l

1
"
,





































"
r
o
w

2

c
o
l

2
"
}



































}
;


O
b
j
e
c
t
[
]

h
e
a
d
e
r
s

=

n
e
w

O
b
j
e
c
t
[
]

{
"
f
i
r
s
t

h
e
a
d
e
r
"
,



































"
s
e
c
o
n
d

h
e
a
d
e
r
"
}
;


D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l

m
o
d
e
l

=

n
e
w

D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l
(
d
a
t
a
,



































h
e
a
d
e
r
s
)
;


t
a
b
l
e

=

n
e
w

J
T
a
b
l
e
(
m
o
d
e
l
)
;


t
a
b
l
e
.
s
e
t
A
u
t
o
R
e
s
i
z
e
M
o
d
e
(
J
T
a
b
l
e
.
A
U
T
O
_
R
E
S
I
Z
E
_
O
F
F
)
;
C
r
e
a
r

u
n

m
o
d
e
l
o

d
e

t
a
b
l
a

p
e
r
s
o
n
a
l
i
z
a
d
o

e
s

t
a
n

c
e
r
c
a
n
o

y

s
e
n
c
i
l
l
o

c
o
m
o

u
s
a
r

D
e
f
a
u
l
t
T
a
b
l
e
M
o
d
e
l
,

y

r
e
q
u
i
e
r
e

m
u
y

p
o
c
a

c
o
d
i
f
i
c
a
c
i

n

a
d
i
c
i
o
n
a
l
.

P
o
d
e
m
o
s

i
m
p
l
e
m
e
n
t
a
r

u
n

m
o
d
e
l
o

d
e

t
a
b
l
a
i
m
p
l
e
m
e
n
t
a
n
d
o

u
n

m

t
o
d
o

q
u
e

d
e
v
u
e
l
v
a

e
l

n

m
e
r
o

d
e

e
n
t
r
a
d
a
s

d
e
l

m
o
d
e
l
o
,

y

u
n

m

t
o
d
o

q
u
e

r
e
c
u
p
e
r
e

u
n

e
l
e
m
e
n
t
o

e
n

u
n

p
o
s
i
c
i

n

e
s
p
e
c

f
i
c
a

d
e

e
s
e

m
o
d
e
l
o
.

P
o
r

e
j
e
m
p
l
o
,

e
l

m
o
d
e
l
o
J
T
a
b
l
e

p
u
e
d
e

s
e
r

i
m
p
l
e
m
e
n
t
a
d
o

d
e
s
d
e

j
a
v
a
x
.
s
w
i
n
g
.
t
a
b
l
e
.
A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l

m
e
d
i
a
n
t
e

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e

l
o
s

m

t
o
d
o
s

g
e
t
C
o
l
u
m
n
C
o
u
n
t
,
g
e
t
R
o
w
C
o
u
n
t

y

g
e
t
V
a
l
u
e
A
t

c
o
m
o

s
e
v
e

a
q
u

:


f
i
n
a
l

O
b
j
e
c
t
[
]
[
]

d
a
t
a

=

n
e
w

O
b
j
e
c
t
[
]
[
]
{

{
























"
r
o
w

1

c
o
l
1
"
,
























"
r
o
w

1

c
o
l
2
"

}
,
























{
"
r
o
w

2

c
o
l

1
"
,
























"
r
o
w

2

c
o
l

2
"
}

}
;


f
i
n
a
l

O
b
j
e
c
t
[
]

h
e
a
d
e
r
s

=

n
e
w

O
b
j
e
c
t
[
]

{
























"
f
i
r
s
t

h
e
a
d
e
r
"
,
























"
s
e
c
o
n
d

h
e
a
d
e
r
"
}
;


T
a
b
l
e
M
o
d
e
l

m
o
d
e
l

=

n
e
w

A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l
(
)
{




p
u
b
l
i
c

i
n
t

g
e
t
C
o
l
u
m
n
C
o
u
n
t
(
)

{






r
e
t
u
r
n

d
a
t
a
[
0
]
.
l
e
n
g
t
h
;




}




p
u
b
l
i
c

i
n
t

g
e
t
R
o
w
C
o
u
n
t
(
)

{






r
e
t
u
r
n

d
a
t
a
.
l
e
n
g
t
h
;




}




p
u
b
l
i
c

S
t
r
i
n
g

g
e
t
C
o
l
u
m
n
N
a
m
e
(
i
n
t

c
o
l
)

{






r
e
t
u
r
n

(
S
t
r
i
n
g
)
h
e
a
d
e
r
s
[
c
o
l
]
;




}




p
u
b
l
i
c

O
b
j
e
c
t

g
e
t
V
a
l
u
e
A
t
(
i
n
t

r
o
w
,
i
n
t

c
o
l
)

{






r
e
t
u
r
n

d
a
t
a
[
r
o
w
]
[
c
o
l
]
;




}


}
;


t
a
b
l
e

=

n
e
w

J
T
a
b
l
e
(
m
o
d
e
l
)
;


t
a
b
l
e
.
s
e
t
A
u
t
o
R
e
s
i
z
e
M
o
d
e
(








J
T
a
b
l
e
.
A
U
T
O
_
R
E
S
I
Z
E
_
O
F
F
)
;
E
s
t
a

t
a
b
l
a

e
s

d
e

s

l
o

l
e
c
t
u
r
a

y

l
o
s

v
a
l
o
r
e
s

d
e

s
u
s

d
a
t
o
s

y
a

s
o
n

c
o
n
o
c
i
d
o
s
.

D
e

h
e
c
h
o
,

i
n
c
l
u
s
o

l
o
s

d
a
t
o
s

s
o
n

d
e
c
l
a
r
a
d
o
s

f
i
n
a
l

p
a
r
a

q
u
e

p
e
u
d
a
n

s
e
r

r
e
c
u
p
e
r
a
d
o
s

p
o
r

l
a

c
l
a
s
e

i
n
t
e
r
n
a
T
a
b
l
e
M
o
d
e
l
.

E
s
t
a

n
o

e
s

l
a

s
i
t
u
a
c
i

n

n
o
r
m
a
l

c
u
a
n
d
o

t
r
a
b
a
j
a
m
o
s

c
o
n

d
a
t
o
s

v
i
v
o
s
.
P
o
d
e
m
o
s

c
r
e
a
r

u
n
a

t
a
b
l
a

e
d
i
t
a
b
l
e

a

a
d
i
e
n
d
o

e
l

m

t
o
d
o

d
e

v
e
r
i
f
i
c
a
c
i

n

i
s
C
e
l
l
E
d
i
t
a
b
l
e
,

q
u
e

e
s

u
s
a
d
o

p
o
r

e
l

e
d
i
t
o
r

d
e

c
e
l
d
a

p
o
r

d
e
f
e
c
t
o
,

y

e
l

m

t
o
d
o

A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l

p
a
r
a

c
o
n
f
i
g
u
r
a
r
u
n

v
a
l
o
r

e
n

u
n
a

p
o
s
i
c
i

n
.

H
a
s
t
a

e
s
t
e

c
a
m
b
i
o
,

e
l

A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l

h
a

e
s
t
a
d
o

m
a
n
e
j
a
n
d
o

e
l

r
e
d
i
b
u
j
a
d
o

y

e
l

r
e
d
i
m
e
n
s
i
o
n
a
d
o

d
e

l
a

t
a
b
l
a

d
i
s
p
a
r
a
n
d
o

d
i
s
t
i
n
t
o
s

e
v
e
n
t
o
s

d
e

c
a
m
b
i
o

d
e

t
a
b
l
a
.
c
o
m
o

e
l

A
b
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l

n
o

c
o
n
o
c
e

n
a
d
a

d
e

l
o

o
c
u
r
r
i
d
o

a

l
o
s

d
a
t
o
s

d
e

l
a

t
a
b
l
a
,

n
e
c
e
s
i
t
a
m
o
s

i
n
f
o
r
m
a
r
l
e

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

f
i
r
e
T
a
b
l
e
C
e
l
l
U
p
d
a
t
e
d
.

L
a
s

s
i
g
u
i
e
n
t
e
s

l

n
e
a
s

h
a
n

a

a
d
i
d
o
l
a

c
l
a
s
e

i
n
t
e
r
n
a

A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l

p
a
r
a

p
e
r
m
i
t
i
r

l
a

e
d
i
c
i

n

d
e

l
o
s

d
a
t
o
s
:


p
u
b
l
i
c

v
o
i
d

s
e
t
V
a
l
u
e
A
t

(
O
b
j
e
c
t

v
a
l
u
e
,

























i
n
t

r
o
w
,

i
n
t

c
o
l
)

{




d
a
t
a
[
r
o
w
]
[
c
o
l
]

=

v
a
l
u
e
;




f
i
r
e
T
a
b
l
e
C
e
l
l
U
p
d
a
t
e
d

(
r
o
w
,

c
o
l
)
;


}


p
u
b
l
i
c

b
o
o
l
e
a
n

i
s
C
e
l
l
E
d
i
t
a
b
l
e
(
i
n
t

r
o
w
,

























i
n
t

c
o
l
)

{




r
e
t
u
r
n

t
r
u
e
;


}
M

s

M
o
d
e
l
o
s

d
e

T
a
b
l
a
s
U
n

r
e
q
u
e
r
i
m
i
e
n
t
o

c
o
m

n

p
a
r
a

m
o
s
t
r
a
r

d
a
t
o
s

t
a
b
u
l
a
r
e
s

e
s

l
a

i
n
c
l
u
s
i

n

d
e

u
n

c
o
l
u
m
n
a

n
o

d
e
s
p
l
a
z
a
b
l
e
.

E
s
t
e

c
o
l
u
m
n
a

p
r
o
p
o
r
c
i
n
a

u
n
a

c
o
n
j
u
n
t
o

d
e

d
a
t
o
s

a
n
c
l
a
d
o
s

q
u
e

p
e
r
m
a
n
e
c
e
n
e
s
t
a
c
i
o
n
a
r
i
o
s

y

v
i
s
i
b
l
e
s

m
i
e
n
t
r
a
s

q
u
e

s
u
s

c
o
l
u
m
n
a
s

v
e
c
i
n
a
s

s
o
n

d
e
s
p
l
a
z
a
d
a
s

h
o
r
i
z
o
n
t
a
l
m
e
n
t
e

(
y

f
r
e
c
u
e
n
t
e
m
e
n
t
e

f
u
e
r
a

d
e

l
a

v
i
s
t
a
)
.

E
s
t
o

e
s

i
m
p
o
r
t
a
n
t
e

e
n

c
a
s
o
s

d
o
n
d
e

l
a

f
i
l
a

d
e

d
a
t
o
s
p
u
e
d
e

s
e
r

i
d
e
n
t
i
f
i
c
a
d
a

p
o
r

u
n

n
i
c
o

v
a
l
o
r

e
n

l
a

c
o
l
u
m
n
a

f
i
j
a
d
a
,

c
o
m
o

u
n

n
o
m
b
r
e

o

n

m
e
r
o

i
d
e
n
t
i
f
i
c
a
d
o
r
.

e
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

d
e

e
j
e
m
p
l
o

u
s
a

u
n
a

c
o
l
u
m
n
a

d
e

t
a
b
l
a

f
i
j
a
d
a

p
a
r
a

m
o
s
t
r
a
r

u
n
a
l
i
s
t
a

d
e

t
e
m
s

d
e

l
a

s
u
b
a
s
t
a
.
E
l

m
o
d
e
l
o

d
e

t
a
b
l
a

b
a
s
e

d
e

e
s
t
e

e
j
e
m
p
l
o

i
m
p
l
e
m
e
n
t
a

l
a

c
l
a
s
e

A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l
.

S
u

m

t
o
d
o

u
p
d
a
t
e

r
e
l
l
e
n
a

d
i
n

m
i
c
a
m
e
n
t
e

l
o
s

d
a
t
o
s

d
e

l
a

t
a
b
l
a

d
e
s
d
e

u
n
a

l
l
a
m
a
d
a

a

l
a

b
a
s
e

d
e

d
a
t
o
s
.
E
n
v

a
n

u
n

e
v
e
n
t
o

d
e

l
a

t
a
b
l
a

h
a

s
i
d
o

a
c
t
u
a
l
i
z
a
d
a

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

f
i
r
e
T
a
b
l
e
S
t
r
u
c
t
u
r
e
C
h
a
n
g
e
d

p
a
r
a

i
n
d
i
c
a
r

e
l

n

m
e
r
o

d
e

f
i
l
a
s

o

c
o
l
u
m
n
a
s

d
e

l
a

t
a
b
l
a

q
u
e

s
e

h
a
n

m
o
d
i
f
i
c
a
d
o
.
p
a
c
k
a
g
e

a
u
c
t
i
o
n
;
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
t
a
b
l
e
.
A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l
;
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
e
v
e
n
t
.
T
a
b
l
e
M
o
d
e
l
E
v
e
n
t
;
i
m
p
o
r
t

j
a
v
a
.
t
e
x
t
.
N
u
m
b
e
r
F
o
r
m
a
t
;

i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
*
;
p
u
b
l
i
c

c
l
a
s
s

R
e
s
u
l
t
s
M
o
d
e
l

e
x
t
e
n
d
s

A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l
{


S
t
r
i
n
g
[
]


c
o
l
u
m
n
N
a
m
e
s
=
{
}
;


V
e
c
t
o
r

r
o
w
s

=

n
e
w

V
e
c
t
o
r
(
)
;


p
u
b
l
i
c

S
t
r
i
n
g

g
e
t
C
o
l
u
m
n
N
a
m
e
(
i
n
t

c
o
l
u
m
n
)

{




i
f

(
c
o
l
u
m
n
N
a
m
e
s
[
c
o
l
u
m
n
]

!
=

n
u
l
l
)

{






r
e
t
u
r
n

c
o
l
u
m
n
N
a
m
e
s
[
c
o
l
u
m
n
]
;




}

e
l
s
e

{






r
e
t
u
r
n

"
"
;




}


}


p
u
b
l
i
c

b
o
o
l
e
a
n

i
s
C
e
l
l
E
d
i
t
a
b
l
e
(
i
n
t

r
o
w
,

i
n
t

c
o
l
u
m
n
)
{




r
e
t
u
r
n

f
a
l
s
e
;


}


p
u
b
l
i
c

i
n
t

g
e
t
C
o
l
u
m
n
C
o
u
n
t
(
)

{




r
e
t
u
r
n

c
o
l
u
m
n
N
a
m
e
s
.
l
e
n
g
t
h
;


}


p
u
b
l
i
c

i
n
t

g
e
t
R
o
w
C
o
u
n
t
(
)

{




r
e
t
u
r
n

r
o
w
s
.
s
i
z
e
(
)
;


}


p
u
b
l
i
c

O
b
j
e
c
t

g
e
t
V
a
l
u
e
A
t
(
i
n
t

r
o
w
,

i
n
t

c
o
l
u
m
n
)
{




V
e
c
t
o
r

t
m
p
r
o
w

=

(
V
e
c
t
o
r
)
r
o
w
s
.
e
l
e
m
e
n
t
A
t
(
r
o
w
)
;




r
e
t
u
r
n

t
m
p
r
o
w
.
e
l
e
m
e
n
t
A
t
(
c
o
l
u
m
n
)
;


}


p
u
b
l
i
c


v
o
i
d

u
p
d
a
t
e
(
E
n
u
m
e
r
a
t
i
o
n

e
n
u
m
)

{




t
r
y

{






c
o
l
u
m
n
N
a
m
e
s

=

n
e
w

S
t
r
i
n
g
[
5
]
;






c
o
l
u
m
n
N
a
m
e
s
[
0
]
=
n
e
w

S
t
r
i
n
g
(
"
A
u
c
t
i
o
n

I
d

#
"
)
;






c
o
l
u
m
n
N
a
m
e
s
[
1
]
=
n
e
w

S
t
r
i
n
g
(
"
D
e
s
c
r
i
p
t
i
o
n
"
)
;






c
o
l
u
m
n
N
a
m
e
s
[
2
]
=
n
e
w

S
t
r
i
n
g
(
"
H
i
g
h

B
i
d
"
)
;






c
o
l
u
m
n
N
a
m
e
s
[
3
]
=
n
e
w

S
t
r
i
n
g
(
"
#

o
f

b
i
d
s
"
)
;






c
o
l
u
m
n
N
a
m
e
s
[
4
]
=
n
e
w

S
t
r
i
n
g
(
"
E
n
d

D
a
t
e
"
)
;






w
h
i
l
e
(
(
e
n
u
m

!
=
n
u
l
l
)

&
&

















(
e
n
u
m
.
h
a
s
M
o
r
e
E
l
e
m
e
n
t
s
(
)
)
)

{








w
h
i
l
e
(
e
n
u
m
.
h
a
s
M
o
r
e
E
l
e
m
e
n
t
s
(
)
)

{










A
u
c
t
i
o
n
I
t
e
m

a
u
c
t
i
o
n
I
t
e
m
=
(
















A
u
c
t
i
o
n
I
t
e
m
)
e
n
u
m
.
n
e
x
t
E
l
e
m
e
n
t
(
)
;










V
e
c
t
o
r

i
t
e
m
s
=
n
e
w

V
e
c
t
o
r
(
)
;











i
t
e
m
s
.
a
d
d
E
l
e
m
e
n
t
(
n
e
w

I
n
t
e
g
e
r
(
















a
u
c
t
i
o
n
I
t
e
m
.
g
e
t
I
d
(
)
)
)
;










i
t
e
m
s
.
a
d
d
E
l
e
m
e
n
t
(
















a
u
c
t
i
o
n
I
t
e
m
.
g
e
t
S
u
m
m
a
r
y
(
)
)
;











i
n
t

b
i
d
c
o
u
n
t
=

a
u
c
t
i
o
n
I
t
e
m
.
g
e
t
B
i
d
C
o
u
n
t
(
)
;










i
f
(
b
i
d
c
o
u
n
t

>
0
)

{












i
t
e
m
s
.
a
d
d
E
l
e
m
e
n
t
(
















N
u
m
b
e
r
F
o
r
m
a
t
.
g
e
t
C
u
r
r
e
n
c
y
I
n
s
t
a
n
c
e
(
)
.
















f
o
r
m
a
t
(
a
u
c
t
i
o
n
I
t
e
m
.
g
e
t
H
i
g
h
B
i
d
(
)
)
)
;










}

e
l
s
e

{












i
t
e
m
s
.
a
d
d
E
l
e
m
e
n
t
(
"
-
"
)
;










}










i
t
e
m
s
.
a
d
d
E
l
e
m
e
n
t
(
n
e
w

I
n
t
e
g
e
r
(
b
i
d
c
o
u
n
t
)
)
;










i
t
e
m
s
.
a
d
d
E
l
e
m
e
n
t
(
a
u
c
t
i
o
n
I
t
e
m
.
g
e
t
E
n
d
D
a
t
e
(
)
)
;










r
o
w
s
.
a
d
d
E
l
e
m
e
n
t
(
i
t
e
m
s
)
;








}






}






f
i
r
e
T
a
b
l
e
S
t
r
u
c
t
u
r
e
C
h
a
n
g
e
d
(
)
;




}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{






S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
E
x
c
e
p
t
i
o
n

e
"
+
e
)
;




}


}
}
L
a

t
a
b
l
a

e
s

c
r
e
a
d
a

d
e
s
d
e

e
l

m
o
d
e
l
o

R
e
s
u
l
t
s
M
o
d
e
l
,

L
u
e
g
o

s
e

e
l
i
m
i
n
a

l
a

p
r
i
m
e
r
a

c
o
l
u
m
n
a

d
e

l
a

t
a
b
l
a

y

s
e

a

a
d
e

a

u
n
a

n
u
e
v
a

t
a
b
l
a
.

C
o
m
o

a
h
o
r
a

t
e
n
e
m
o
s

d
o
s

t
a
b
l
a
s
,

l
a

n
i
c
a

f
o
r
m
a

d
e

q
u
e
l
a
s

s
e
l
e
c
c
i
o
n
e
s

e
s
t

n

s
i
n
c
r
o
n
i
z
a
d
a
s

e
s

u
s
a
r

u
n

o
b
j
e
t
o

L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l

p
a
r
a

c
o
n
f
i
g
u
r
a
r

l
a

s
e
l
e
c
c
i

n

s
o
b
r
e

l
a

f
i
l
a

d
e

l
a

t
a
b
l
a

e
n

l
a

s
o
t
r
a
s

t
a
b
l
a
s

q
u
e

n
o

f
u
e
r
o
n

s
e
l
e
c
c
i
o
n
a
d
a
s

l
l
a
m
a
n
d
o

a
l
m

t
o
d
o
s
e
t
R
o
w
S
e
l
e
c
t
i
o
n
I
n
t
e
r
v
a
l
.
E
l

e
j
e
m
p
l
o

c
o
m
p
l
e
t
o

l
o

p
o
d
e
m
o
s

e
n
c
o
n
t
r
a
r

e
n

e
l

f
i
c
h
e
o

f
u
e
n
t
e

A
u
c
t
i
o
n
C
l
i
e
n
t
.
j
a
v
a
:


p
r
i
v
a
t
e

v
o
i
d

l
i
s
t
A
l
l
I
t
e
m
s
(
)

t
h
r
o
w
s

I
O
E
x
c
e
p
t
i
o
n
{




R
e
s
u
l
t
s
M
o
d
e
l

r
m
=
n
e
w

R
e
s
u
l
t
s
M
o
d
e
l
(
)
;




i
f

(
!
s
t
a
n
d
a
l
o
n
e
M
o
d
e
)

{






t
r
y

{









B
i
d
d
e
r
H
o
m
e

b
h
o
m
e
=
(
B
i
d
d
e
r
H
o
m
e
)

















c
t
x
.
l
o
o
k
u
p
(
"
b
i
d
d
e
r
"
)
;









B
i
d
d
e
r

b
i
d
=
b
h
o
m
e
.
c
r
e
a
t
e
(
)
;









E
n
u
m
e
r
a
t
i
o
n

e
n
u
m
=
















(
E
n
u
m
e
r
a
t
i
o
n
)
b
i
d
.
g
e
t
I
t
e
m
L
i
s
t
(
)
;









i
f

(
e
n
u
m

!
=

n
u
l
l
)

{











r
m
.
u
p
d
a
t
e
(
e
n
u
m
)
;









}







}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)

{









S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
















"
A
u
c
t
i
o
n
S
e
r
v
l
e
t

<
l
i
s
t
>
:
"
+
e
)
;







}




}

e
l
s
e

{






T
e
s
t
D
a
t
a

t
d
=

n
e
w

T
e
s
t
D
a
t
a
(
)
;






r
m
.
u
p
d
a
t
e
(
t
d
.
r
e
s
u
l
t
s
(
)
)
;




}




s
c
r
o
l
l
T
a
b
l
e
=
n
e
w

J
T
a
b
l
e
(
r
m
)
;




a
d
j
u
s
t
C
o
l
u
m
n
W
i
d
t
h
(
s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
C
o
l
u
m
n
(








"
E
n
d

D
a
t
e
"
)
,

1
5
0
)
;




a
d
j
u
s
t
C
o
l
u
m
n
W
i
d
t
h
(
s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
C
o
l
u
m
n
(








"
D
e
s
c
r
i
p
t
i
o
n
"
)
,

1
2
0
)
;




s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l

=

s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
C
o
l
u
m
n
M
o
d
e
l
(
)
;




f
i
x
e
d
C
o
l
u
m
n
M
o
d
e
l

=

n
e
w

D
e
f
a
u
l
t
T
a
b
l
e
C
o
l
u
m
n
M
o
d
e
l
(
)
;




T
a
b
l
e
C
o
l
u
m
n

c
o
l

=

s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
0
)
;




s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
r
e
m
o
v
e
C
o
l
u
m
n
(
c
o
l
)
;




f
i
x
e
d
C
o
l
u
m
n
M
o
d
e
l
.
a
d
d
C
o
l
u
m
n
(
c
o
l
)
;




f
i
x
e
d
T
a
b
l
e

=

n
e
w

J
T
a
b
l
e
(
r
m
,
f
i
x
e
d
C
o
l
u
m
n
M
o
d
e
l
)
;




f
i
x
e
d
T
a
b
l
e
.
s
e
t
R
o
w
H
e
i
g
h
t
(
s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
R
o
w
H
e
i
g
h
t
(
)
)
;




h
e
a
d
e
r
s

=

n
e
w

J
V
i
e
w
p
o
r
t
(
)
;




L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l

f
i
x
e
d
S
e
l
e
c
t
i
o
n

=

















f
i
x
e
d
T
a
b
l
e
.
g
e
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l
(
)
;




f
i
x
e
d
S
e
l
e
c
t
i
o
n
.
a
d
d
L
i
s
t
S
e
l
e
c
t
i
o
n
L
i
s
t
e
n
e
r
(
















n
e
w

L
i
s
t
S
e
l
e
c
t
i
o
n
L
i
s
t
e
n
e
r
(
)

{






p
u
b
l
i
c

v
o
i
d

v
a
l
u
e
C
h
a
n
g
e
d
(
L
i
s
t
S
e
l
e
c
t
i
o
n
E
v
e
n
t

e
)

{








L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l

l
s
m

=

(











L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l
)
e
.
g
e
t
S
o
u
r
c
e
(
)
;








i
f

(
!
l
s
m
.
i
s
S
e
l
e
c
t
i
o
n
E
m
p
t
y
(
)
)


{











s
e
t
S
c
r
o
l
l
a
b
l
e
R
o
w
(
)
;








}






}





}
)
;





L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l

s
c
r
o
l
l
S
e
l
e
c
t
i
o
n

=

















s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l
(
)
;





s
c
r
o
l
l
S
e
l
e
c
t
i
o
n
.
a
d
d
L
i
s
t
S
e
l
e
c
t
i
o
n
L
i
s
t
e
n
e
r
(
















n
e
w

L
i
s
t
S
e
l
e
c
t
i
o
n
L
i
s
t
e
n
e
r
(
)

{







p
u
b
l
i
c

v
o
i
d

v
a
l
u
e
C
h
a
n
g
e
d
(
L
i
s
t
S
e
l
e
c
t
i
o
n
E
v
e
n
t

e
)

{









L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l

l
s
m

=

















(
L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l
)
e
.
g
e
t
S
o
u
r
c
e
(
)
;









i
f

(
!
l
s
m
.
i
s
S
e
l
e
c
t
i
o
n
E
m
p
t
y
(
)
)


{











s
e
t
F
i
x
e
d
R
o
w
(
)
;









}







}





}
)
;





C
u
s
t
o
m
R
e
n
d
e
r
e
r

c
u
s
t
o
m

=

n
e
w

C
u
s
t
o
m
R
e
n
d
e
r
e
r
(
)
;





c
u
s
t
o
m
.
s
e
t
H
o
r
i
z
o
n
t
a
l
A
l
i
g
n
m
e
n
t
(
J
L
a
b
e
l
.
C
E
N
T
E
R
)
;





s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
2
)
.
s
e
t
C
e
l
l
R
e
n
d
e
r
e
r
(
















c
u
s
t
o
m
)
;





s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
3
)
.
s
e
t
C
e
l
l
R
e
n
d
e
r
e
r
(
















n
e
w

C
u
s
t
o
m
B
u
t
t
o
n
R
e
n
d
e
r
e
r
(
)
)
;





C
u
s
t
o
m
B
u
t
t
o
n
E
d
i
t
o
r

c
u
s
t
o
m
E
d
i
t
=
n
e
w

























C
u
s
t
o
m
B
u
t
t
o
n
E
d
i
t
o
r
(
f
r
a
m
e
)
;





s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
3
)
.
s
e
t
C
e
l
l
E
d
i
t
o
r
(
















c
u
s
t
o
m
E
d
i
t
)
;






h
e
a
d
e
r
s
.
a
d
d
(
s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
T
a
b
l
e
H
e
a
d
e
r
(
)
)
;





J
P
a
n
e
l

t
o
p
P
a
n
e
l

=

n
e
w

J
P
a
n
e
l
(
)
;





t
o
p
P
a
n
e
l
.
s
e
t
L
a
y
o
u
t
(
n
e
w

B
o
x
L
a
y
o
u
t
(
t
o
p
P
a
n
e
l
,

















B
o
x
L
a
y
o
u
t
.
X
_
A
X
I
S
)
)
;





a
d
j
u
s
t
C
o
l
u
m
n
W
i
d
t
h
(
















f
i
x
e
d
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
0
)
,

1
0
0
)
;





J
T
a
b
l
e
H
e
a
d
e
r

f
i
x
e
d
H
e
a
d
e
r
=




















f
i
x
e
d
T
a
b
l
e
.
g
e
t
T
a
b
l
e
H
e
a
d
e
r
(
)
;





f
i
x
e
d
H
e
a
d
e
r
.
s
e
t
A
l
i
g
n
m
e
n
t
Y
(
C
o
m
p
o
n
e
n
t
.
T
O
P
_
A
L
I
G
N
M
E
N
T
)
;





t
o
p
P
a
n
e
l
.
a
d
d
(
f
i
x
e
d
H
e
a
d
e
r
)
;





t
o
p
P
a
n
e
l
.
a
d
d
(
B
o
x
.
c
r
e
a
t
e
R
i
g
i
d
A
r
e
a
(
























n
e
w

D
i
m
e
n
s
i
o
n
(
2
,

0
)
)
)
;





t
o
p
P
a
n
e
l
.
s
e
t
P
r
e
f
e
r
r
e
d
S
i
z
e
(
n
e
w

D
i
m
e
n
s
i
o
n
(
4
0
0
,

4
0
)
)
;





J
P
a
n
e
l

h
e
a
d
e
r
P
a
n
e
l

=

n
e
w

J
P
a
n
e
l
(
)
;





h
e
a
d
e
r
P
a
n
e
l
.
s
e
t
A
l
i
g
n
m
e
n
t
Y
(
C
o
m
p
o
n
e
n
t
.
T
O
P
_
A
L
I
G
N
M
E
N
T
)
;





h
e
a
d
e
r
P
a
n
e
l
.
s
e
t
L
a
y
o
u
t
(
n
e
w

B
o
r
d
e
r
L
a
y
o
u
t
(
)
)
;





J
S
c
r
o
l
l
P
a
n
e

s
c
r
o
l
l
p
a
n
e

=

n
e
w

J
S
c
r
o
l
l
P
a
n
e
(
)
;





s
c
r
o
l
l
B
a
r

=

s
c
r
o
l
l
p
a
n
e
.
g
e
t
H
o
r
i
z
o
n
t
a
l
S
c
r
o
l
l
B
a
r
(
)
;





h
e
a
d
e
r
P
a
n
e
l
.
a
d
d
(
h
e
a
d
e
r
s
,

"
N
o
r
t
h
"
)
;





h
e
a
d
e
r
P
a
n
e
l
.
a
d
d
(
s
c
r
o
l
l
B
a
r
,

"
S
o
u
t
h
"
)
;





t
o
p
P
a
n
e
l
.
a
d
d
(
h
e
a
d
e
r
P
a
n
e
l
)
;





s
c
r
o
l
l
T
a
b
l
e
.
s
e
t
P
r
e
f
e
r
r
e
d
S
c
r
o
l
l
a
b
l
e
V
i
e
w
p
o
r
t
S
i
z
e
(

















n
e
w

D
i
m
e
n
s
i
o
n
(
3
0
0
,
1
8
0
)
)
;





f
i
x
e
d
T
a
b
l
e
.
s
e
t
P
r
e
f
e
r
r
e
d
S
c
r
o
l
l
a
b
l
e
V
i
e
w
p
o
r
t
S
i
z
e
(

















n
e
w

D
i
m
e
n
s
i
o
n
(
1
0
0
,
1
8
0
)
)
;





f
i
x
e
d
T
a
b
l
e
.
s
e
t
P
r
e
f
e
r
r
e
d
S
i
z
e
(

















n
e
w

D
i
m
e
n
s
i
o
n
(
1
0
0
,
1
8
0
)
)
;





i
n
n
e
r
P
o
r
t

=

n
e
w

J
V
i
e
w
p
o
r
t
(
)
;





i
n
n
e
r
P
o
r
t
.
s
e
t
V
i
e
w
(
s
c
r
o
l
l
T
a
b
l
e
)
;





s
c
r
o
l
l
p
a
n
e
.
s
e
t
V
i
e
w
p
o
r
t
(
i
n
n
e
r
P
o
r
t
)
;





s
c
r
o
l
l
B
a
r
.
g
e
t
M
o
d
e
l
(
)
.
a
d
d
C
h
a
n
g
e
L
i
s
t
e
n
e
r
(
















n
e
w

C
h
a
n
g
e
L
i
s
t
e
n
e
r
(
)


{







p
u
b
l
i
c

v
o
i
d

s
t
a
t
e
C
h
a
n
g
e
d
(
C
h
a
n
g
e
E
v
e
n
t

e
)

{









P
o
i
n
t

q

=

h
e
a
d
e
r
s
.
g
e
t
V
i
e
w
P
o
s
i
t
i
o
n
(
)
;









P
o
i
n
t

p

=

i
n
n
e
r
P
o
r
t
.
g
e
t
V
i
e
w
P
o
s
i
t
i
o
n
(
)
;









i
n
t

v
a
l

=

s
c
r
o
l
l
B
a
r
.
g
e
t
M
o
d
e
l
(
)
.
g
e
t
V
a
l
u
e
(
)
;









p
.
x

=

v
a
l
;









q
.
x

=

v
a
l
;









h
e
a
d
e
r
s
.
s
e
t
V
i
e
w
P
o
s
i
t
i
o
n
(
p
)
;









h
e
a
d
e
r
s
.
r
e
p
a
i
n
t
(
h
e
a
d
e
r
s
.
g
e
t
V
i
e
w
R
e
c
t
(
)
)
;









i
n
n
e
r
P
o
r
t
.
s
e
t
V
i
e
w
P
o
s
i
t
i
o
n
(
p
)
;









i
n
n
e
r
P
o
r
t
.
r
e
p
a
i
n
t
(
i
n
n
e
r
P
o
r
t
.
g
e
t
V
i
e
w
R
e
c
t
(
)
)
;







}





}
)
;





s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
T
a
b
l
e
H
e
a
d
e
r
(



















)
.
s
e
t
U
p
d
a
t
e
T
a
b
l
e
I
n
R
e
a
l
T
i
m
e
(



















f
a
l
s
e
)
;





J
P
a
n
e
l

b
o
t
t
o
m
P
a
n
e
l

=

n
e
w

J
P
a
n
e
l
(
)
;





b
o
t
t
o
m
P
a
n
e
l
.
s
e
t
L
a
y
o
u
t
(
n
e
w

B
o
x
L
a
y
o
u
t
(
















b
o
t
t
o
m
P
a
n
e
l
,

B
o
x
L
a
y
o
u
t
.
X
_
A
X
I
S
)
)
;





f
i
x
e
d
T
a
b
l
e
.
s
e
t
A
l
i
g
n
m
e
n
t
Y
(
C
o
m
p
o
n
e
n
t
.
T
O
P
_
A
L
I
G
N
M
E
N
T
)
;





b
o
t
t
o
m
P
a
n
e
l
.
a
d
d
(
f
i
x
e
d
T
a
b
l
e
)
;





b
o
t
t
o
m
P
a
n
e
l
.
a
d
d
(
B
o
x
.
c
r
e
a
t
e
R
i
g
i
d
A
r
e
a
(



























n
e
w

D
i
m
e
n
s
i
o
n
(
2
,

0
)
)
)
;





i
n
n
e
r
P
o
r
t
.
s
e
t
A
l
i
g
n
m
e
n
t
Y
(
C
o
m
p
o
n
e
n
t
.
T
O
P
_
A
L
I
G
N
M
E
N
T
)
;





b
o
t
t
o
m
P
a
n
e
l
.
a
d
d
(
i
n
n
e
r
P
o
r
t
)
;





b
o
t
t
o
m
P
a
n
e
l
.
a
d
d
(
B
o
x
.
c
r
e
a
t
e
R
i
g
i
d
A
r
e
a
(



























n
e
w

D
i
m
e
n
s
i
o
n
(
2
,

0
)
)
)
;





s
c
r
o
l
l
P
a
n
e
=

n
e
w

J
S
c
r
o
l
l
P
a
n
e
(
b
o
t
t
o
m
P
a
n
e
l
,















J
S
c
r
o
l
l
P
a
n
e
.
V
E
R
T
I
C
A
L
_
S
C
R
O
L
L
B
A
R
_
A
L
W
A
Y
S
,















J
S
c
r
o
l
l
P
a
n
e
.
H
O
R
I
Z
O
N
T
A
L
_
S
C
R
O
L
L
B
A
R
_
N
E
V
E
R
)
;





J
V
i
e
w
p
o
r
t

o
u
t
e
r
P
o
r
t

=

n
e
w

J
V
i
e
w
p
o
r
t
(
)
;





o
u
t
e
r
P
o
r
t
.
a
d
d
(
b
o
t
t
o
m
P
a
n
e
l
)
;





s
c
r
o
l
l
P
a
n
e
.
s
e
t
C
o
l
u
m
n
H
e
a
d
e
r
V
i
e
w
(
t
o
p
P
a
n
e
l
)
;





s
c
r
o
l
l
P
a
n
e
.
s
e
t
V
i
e
w
p
o
r
t
(
o
u
t
e
r
P
o
r
t
)
;





s
c
r
o
l
l
T
a
b
l
e
.
s
e
t
A
u
t
o
R
e
s
i
z
e
M
o
d
e
(



















J
T
a
b
l
e
.
A
U
T
O
_
R
E
S
I
Z
E
_
O
F
F
)
;





f
r
a
m
e
.
g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(
s
c
r
o
l
l
P
a
n
e
)
;





s
c
r
o
l
l
T
a
b
l
e
.
v
a
l
i
d
a
t
e
(
)
;





f
r
a
m
e
.
s
e
t
S
i
z
e
(
4
5
0
,
2
0
0
)
;


}


v
o
i
d

s
e
t
F
i
x
e
d
R
o
w
(
)

{




i
n
t

i
n
d
e
x
=
s
c
r
o
l
l
T
a
b
l
e
.
g
e
t
S
e
l
e
c
t
e
d
R
o
w
(
)
;




f
i
x
e
d
T
a
b
l
e
.
s
e
t
R
o
w
S
e
l
e
c
t
i
o
n
I
n
t
e
r
v
a
l
(
i
n
d
e
x
,

i
n
d
e
x
)
;


}


v
o
i
d

s
e
t
S
c
r
o
l
l
a
b
l
e
R
o
w
(
)

{




i
n
t

i
n
d
e
x
=
f
i
x
e
d
T
a
b
l
e
.
g
e
t
S
e
l
e
c
t
e
d
R
o
w
(
)
;




s
c
r
o
l
l
T
a
b
l
e
.
s
e
t
R
o
w
S
e
l
e
c
t
i
o
n
I
n
t
e
r
v
a
l
(
i
n
d
e
x
,

i
n
d
e
x
)
;


}


v
o
i
d

a
d
j
u
s
t
C
o
l
u
m
n
W
i
d
t
h
(
T
a
b
l
e
C
o
l
u
m
n

c
,

i
n
t

s
i
z
e
)

{




c
.
s
e
t
P
r
e
f
e
r
r
e
d
W
i
d
t
h
(
s
i
z
e
)
;




c
.
s
e
t
M
a
x
W
i
d
t
h
(
s
i
z
e
)
;




c
.
s
e
t
M
i
n
W
i
d
t
h
(
s
i
z
e
)
;


}
M
o
d
e
l
o

J
L
i
s
t
E
l

c
o
m
p
o
n
e
n
t
e

J
L
i
s
t

m
u
e
s
t
r
a

u
n
a

l
i
s
t
a

v
e
r
t
i
c
l
a

d
e

d
a
t
o
s

y

u
s
a

u
n

L
i
s
t
M
o
d
e
l

p
a
r
a

c
o
n
t
e
n
e
r

y

m
a
n
i
p
u
l
a
r

l
o
s

d
a
t
o
s
.

T
a
m
b
i

n

u
s
a

u
n

o
b
j
e
t
o

L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l

p
a
r
a

p
e
r
m
i
t
i
r

l
a

s
e
l
e
c
c
i

n

y
s
u
b
s
e
c
u
e
n
t
e

r
e
c
u
p
e
r
a
c
i

n

d
e

e
l
e
m
e
n
t
o
s

d
e

l
a

l
i
s
t
a
.
L
a
s

i
m
p
l
e
m
e
n
t
a
c
i
o
n
e
s

p
o
r

d
e
f
e
c
t
o

d
e

l
a
s

c
l
a
s
e
s

A
b
s
t
r
a
c
t
L
i
s
t
M
o
d
e
l

y

A
b
s
t
r
a
c
t
L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l

l
a
s

p
r
o
p
o
r
c
i
o
n
a

e
l

A
P
I

S
w
i
n
g

d
e
s
d
e

l
a
s

c
l
a
s
e
s

D
e
f
a
u
l
t
L
i
s
t
M
o
d
e
l

y
D
e
f
a
u
l
t
L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l
.

S
i

u
s
a
m
o
s

e
s
t
o
s

d
o
s

m
o
d
e
l
o
s

p
o
r

d
e
f
e
c
t
o

y

e
l

r
e
n
d
e
r
i
z
a
d
o
r

d
e

c
e
l
d
a
s

p
o
r

d
e
f
e
c
t
o
,

o
b
t
e
n
d
r
e
m
o
s

u
n
a

l
i
s
t
a

q
u
e

m
u
e
s
t
r
a

e
l
e
m
e
n
t
o
s

m
o
d
e
l
o

l
l
a
m
a
d
o

a
l

m

t
o
d
o
t
o
S
t
r
i
n
g

s
o
b
r
e

c
a
d
a

o
b
j
e
t
o
.

L
a

l
i
s
t
a

u
s
a

e
l

m
o
d
e
l
o

M
U
L
T
I
P
L
E
_
I
N
T
E
R
V
A
L
_
S
E
L
E
C
T
I
O
N

d
e

s
e
l
e
c
c
i

n

d
e

l
i
s
t
a

p
a
r
a

s
e
l
e
c
c
i
o
n
a
r

c
a
d
a

e
l
e
m
e
n
t
o

d
e

l
a

l
i
s
t
a
.
H
a
y

d
i
s
p
o
n
i
b
l
e
s

t
r
e
s

m
o
d
o
s

d
e

s
e
l
e
c
c
i

n

p
a
r
a

D
e
f
a
u
l
t
L
i
s
t
S
e
l
e
c
t
i
o
n
M
o
d
e
l
:
S
I
N
G
L
E
_
S
E
L
E
C
T
I
O
N
,

d
o
n
d
e

s

l
o

s
e

p
u
e
d
e

s
e
l
e
c
c
i
o
n
a
r

u
n

t
e
m

a

l
a

v
e
z
;

S
I
N
G
L
E
_
I
N
T
E
R
V
A
L
_
S
E
L
E
C
T
I
O
N
e
n

e
l

q
u
e

s
e

p
u
e
d
e

s
e
l
e
c
c
i
o
n
a
r

u
n

r
a
n
g
o

d
e

i
t
e
m
s

s
e
c
u
e
n
c
i
a
l
e
s
;

y

M
U
L
T
I
P
L
E
_
I
N
T
E
R
V
A
L
_
S
E
L
E
C
T
I
O
N
,

e
n

e
l

q
u
e

s
e

p
e
r
m
i
t
e

q
u
e

c
u
a
l
q
u
i
r

o

t
o
d
o
s

l
o
s

e
l
e
m
e
n
t
o
s

s
e
a
n

s
e
l
e
c
c
i
o
n
a
d
o
s
.

E
l
m
o
d
o

d
e

s
e
l
e
c
c
i

n

p
u
e
d
e

c
a
m
b
i
a
r
s
e

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

s
e
t
S
e
l
e
c
t
i
o
n
M
o
d
e

d
e

c
l
a
s
e

J
L
i
s
t
.




p
u
b
l
i
c

S
i
m
p
l
e
L
i
s
t
(
)

{







J
L
i
s
t

l
i
s
t
;







D
e
f
a
u
l
t
L
i
s
t
M
o
d
e
l

d
e
f
l
i
s
t
;







d
e
f
l
i
s
t
=

n
e
w

D
e
f
a
u
l
t
L
i
s
t
M
o
d
e
l
(
)
;







d
e
f
l
i
s
t
.
a
d
d
E
l
e
m
e
n
t
(
"
e
l
e
m
e
n
t

1
"
)
;







d
e
f
l
i
s
t
.
a
d
d
E
l
e
m
e
n
t
(
"
e
l
e
m
e
n
t

2
"
)
;







l
i
s
t

=

n
e
w

J
L
i
s
t
(
d
e
f
l
i
s
t
)
;







J
S
c
r
o
l
l
P
a
n
e

s
c
r
o
l
l

=

n
e
w

J
S
c
r
o
l
l
P
a
n
e
(
l
i
s
t
)
;







g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(
s
c
r
o
l
l
,

B
o
r
d
e
r
L
a
y
o
u
t
.
C
E
N
T
E
R
)
;





}
M
o
d
e
l
o

J
T
r
e
e
L
a

c
l
a
s
e

J
T
r
e
e

m
o
d
e
l
a

y

m
u
e
s
t
r
a

u
n
a

l
i
s
t
a

v
e
r
t
i
c
a
l

d
e

e
l
e
m
e
n
t
o
s

o

n
o
d
o
s

o
r
d
e
n
a
d
o
s

e
n

u
n
a

f
o
r
m
a

d
e

r
b
o
l

d
e

h
e
r
e
n
c
i
a
.
U
n

o
b
j
e
t
o

J
T
r
e
e

t
e
i
n
e

u
n

n
o
d
o

r
a

z

y

u
n
o

o

m

s

n
o
d
o
s

h
i
j
o
s
,

q
u
e

p
u
e
d
e
n

c
o
n
t
e
n
e
r

m

s

n
o
d
o
s

h
i
j
o
s
.

C
a
d
a

n
o
d
o

p
a
d
r
e

p
u
e
d
e

e
x
p
a
n
d
i
r
s
e

p
a
r
a

m
o
s
t
r
a
r
s
u
s

h
i
j
o
s

d
e

f
o
r
m
a

s
i
m
i
l
a
r

a

l
o
s

f
a
m
i
l
i
a
r
e
s

r
b
o
l
e
s

d
e

d
i
r
e
c
t
o
r
i
o
s

d
e

l
o
s

u
s
u
a
r
i
o
s

d
e

W
i
n
d
o
w
s
.
C
o
m
o

l
o
s

c
o
m
p
o
n
e
n
t
e
s

J
L
i
s
t

y

J
T
a
b
l
e
,

e
l

J
T
r
e
e

c
o
n
s
t
a

d
e

m

s

d
e

u
n

m
o
d
e
l
o
.

E
l

m
o
d
o

d
e

s
e
l
e
c
c
i

n

e
s

s
i
m
i
l
a
r

a
l

d
e
t
a
l
l
a
d
o

p
a
r
a

e
l

m
o
d
e
l
o

J
L
i
s
t
.

E
l
m
o
d
o

d
e

s
e
l
e
c
c
i

n

t
i
e
n
e

e
s
t

s

l
i
g
e
r
a
s

d
i
f
e
r
e
n
c
i
a
s

e
n

l
o
s

n
o
m
b
r
e
s
:

S
I
N
G
L
E
_
T
R
E
E
_
S
E
L
E
C
T
I
O
N
,
D
I
S
C
O
N
T
I
G
U
O
U
S
_
T
R
E
E
_
S
E
L
E
C
T
I
O
N
,

y
C
O
N
T
I
G
U
O
U
S
_
T
R
E
E
_
S
E
L
E
C
T
I
O
N
.
M
i
e
n
t
r
a
s

q
u
e

D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l

m
a
n
t
i
e
n
e

l
o
s

d
a
t
o
s

e
n

u
n

r
b
o
l

y

e
s

r
e
s
p
o
n
s
a
b
l
e

d
e

a

a
d
i
r

y

e
l
i
m
i
n
a
r

n
o
d
o
s
,

e
s

l
a

c
l
a
s
e
D
e
f
a
u
l
t
T
r
e
e
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e

l
a

q
u
e

d
e
f
i
n
e

l
o
s

m

t
o
d
o
s

u
s
a
d
o
s

p
a
r
a

m
o
v
e
r
s
e

p
o
r

l
o
s

n
o
d
o
s
.

E
l

D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l

s
e

u
s
a

f
r
e
c
u
e
n
t
e
m
e
n
t
e

p
a
r
a
i
m
p
l
e
m
e
n
t
a
r

m
o
d
e
l
o
s

p
e
r
s
o
n
a
l
o
i
z
a
d
o
s

p
o
r
q
u
e

n
o

h
a
y

u
n

A
b
s
t
r
a
c
t
T
r
e
e
M
o
d
e
l

e
n

e
l

p
a
q
u
e
t
e

J
T
r
e
e
.

S
i
n

e
m
b
a
r
g
o
,

s
i

u
s
a
m
o
s

o
b
j
e
t
o
s

p
e
r
s
o
n
a
l
i
z
a
d
o
s
,
d
e
b
e
m
o
s

i
m
p
l
e
m
e
n
t
a
r

T
r
e
e
M
o
d
e
l
.

E
s
t
e

c

d
i
g
o

d
e

e
j
e
m
p
l
o

c
r
e
a

u
n

J
T
r
e
e

u
s
a
n
d
o

e
l

D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l
.
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
e
v
e
n
t
.
*
;
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
*
;
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
t
r
e
e
.
*
;
p
u
b
l
i
c

c
l
a
s
s

S
i
m
p
l
e
T
r
e
e

e
x
t
e
n
d
s

J
F
r
a
m
e

{


p
u
b
l
i
c

S
i
m
p
l
e
T
r
e
e
(
)

{




S
t
r
i
n
g
[
]

t
r
e
e
l
a
b
e
l
s

=



{






























"
A
l
l

A
u
c
t
i
o
n
s
"
,






























"
C
l
o
s
e
d

A
u
c
t
i
o
n
"
,






























"
O
p
e
n

A
u
c
t
i
o
n
s
"
}
;




I
n
t
e
g
e
r
[
]

c
l
o
s
e
d
I
t
e
m
s

=

{

n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
4
)
,































n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
6
)
,































n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
7
)
}
;




I
n
t
e
g
e
r
[
]

o
p
e
n
I
t
e
m
s

=

{

n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
8
)
,





























n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
9
)
}
;




D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
]

n
o
d
e
s

=

n
e
w









D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
t
r
e
e
l
a
b
e
l
s
.
l
e
n
g
t
h
]
;




D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
]

c
l
o
s
e
d
n
o
d
e
s

=

n
e
w









D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
c
l
o
s
e
d
I
t
e
m
s
.
l
e
n
g
t
h
]
;




D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
]

o
p
e
n
n
o
d
e
s

=

n
e
w









D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
o
p
e
n
I
t
e
m
s
.
l
e
n
g
t
h
]
;




f
o
r

(
i
n
t

i
=
0
;

i

<

t
r
e
e
l
a
b
e
l
s
.
l
e
n
g
t
h
;

i
+
+
)

{






n
o
d
e
s
[
i
]

=

n
e
w









D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
(
t
r
e
e
l
a
b
e
l
s
[
i
]
)
;





}




n
o
d
e
s
[
0
]
.
a
d
d
(
n
o
d
e
s
[
1
]
)
;




n
o
d
e
s
[
0
]
.
a
d
d
(
n
o
d
e
s
[
2
]
)
;




f
o
r

(
i
n
t

i
=
0
;

i

<

c
l
o
s
e
d
I
t
e
m
s
.
l
e
n
g
t
h
;

i
+
+
)

{







c
l
o
s
e
d
n
o
d
e
s
[
i
]

=

n
e
w

















D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
(
c
l
o
s
e
d
I
t
e
m
s
[
i
]
)
;








n
o
d
e
s
[
1
]
.
a
d
d
(
c
l
o
s
e
d
n
o
d
e
s
[
i
]
)
;




}




f
o
r

(
i
n
t

i
=
0
;

i

<

o
p
e
n
I
t
e
m
s
.
l
e
n
g
t
h
;

i
+
+
)

{







o
p
e
n
n
o
d
e
s
[
i
]

=

n
e
w

















D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
(
o
p
e
n
I
t
e
m
s
[
i
]
)
;








n
o
d
e
s
[
2
]
.
a
d
d
(
o
p
e
n
n
o
d
e
s
[
i
]
)
;




}




D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l

m
o
d
e
l
=
n
e
w

















D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l
(
n
o
d
e
s
[
0
]
)
;




J
T
r
e
e

t
r
e
e

=

n
e
w

J
T
r
e
e
(
m
o
d
e
l
)
;




J
S
c
r
o
l
l
P
a
n
e

s
c
r
o
l
l

=

n
e
w

J
S
c
r
o
l
l
P
a
n
e
(
t
r
e
e
)
;




g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(
s
c
r
o
l
l
,

B
o
r
d
e
r
L
a
y
o
u
t
.
C
E
N
T
E
R
)
;


}


p
u
b
l
i
c

s
t
a
t
i
c

v
o
i
d

m
a
i
n
(
S
t
r
i
n
g
[
]

a
r
g
s
)

{




S
i
m
p
l
e
T
r
e
e

f
r
a
m
e

=

n
e
w

S
i
m
p
l
e
T
r
e
e
(
)
;




f
r
a
m
e
.
a
d
d
W
i
n
d
o
w
L
i
s
t
e
n
e
r
(

n
e
w

W
i
n
d
o
w
A
d
a
p
t
e
r
(
)

{






p
u
b
l
i
c

v
o
i
d

w
i
n
d
o
w
C
l
o
s
i
n
g
(

W
i
n
d
o
w
E
v
e
n
t

e

)

{








S
y
s
t
e
m
.
e
x
i
t
(
0
)
;






}




}
)
;




f
r
a
m
e
.
s
e
t
V
i
s
i
b
l
e
(
t
r
u
e
)
;




f
r
a
m
e
.
p
a
c
k
(
)
;




f
r
a
m
e
.
s
e
t
S
i
z
e
(
1
5
0
,
1
5
0
)
;


}
}
E
l

m

t
o
d
o

t
o
S
t
r
i
n
g

s
e

u
s
a

p
a
r
a

r
e
c
u
p
e
r
a
r

e
l

v
a
l
o
r

d
e

l
o
s

o
b
j
e
t
o
s

I
n
t
e
g
e
r

e
n

e
k

r
b
o
l
.

Y

a
u
n
q
u
e

s
e

u
s
a

D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l

p
a
r
a

m
a
n
t
e
n
e
r

l
o
s

d
a
t
o
s

e
n

e
l

r
b
o
l

y

p
a
r
a

a

a
d
i
r

y

e
l
i
m
i
n
a
r
n
o
d
o
s
,

l
a

c
l
a
s
e

D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e

d
e
f

n
e

l
o
s

m

t
o
d
o
s

u
s
a
d
o
s

p
a
r
a

m
o
v
e
r
s
e

a

t
r
a
v

s

d
e

l
o
s

n
o
d
o
s

d
e

u
n

r
b
o
l
.
c
o
n

e
l

m

t
o
d
o

d
e
p
t
h
F
i
r
s
t
E
n
u
m
e
r
a
t
i
o
n

s
e

c
o
n
s
i
g
u
e

u
n
a

b

s
q
u
e
d
a

d
e

n
o
d
o
s

d
e
n
t
r
o

d
e

u
n

J
T
r
e
e
,

q
u
e

e
s

e
l

m
i
s
m
o

q
u
e

e
l

m

t
o
d
o

p
o
s
t
o
r
d
e
r
E
n
u
m
e
r
a
t
i
o
n

d
e
s
d
e

e
l

p
u
n
t
o

f
i
n
a
l

h
a
s
t
a

e
l
p
r
i
m
e
r

r
b
o
l
.

O

p
o
d
e
m
o
s

l
l
a
m
a
r

a
l

m

t
o
d
o

p
r
e
o
r
d
e
r
E
n
u
m
e
r
a
t
i
o
n
,

e
l

i
n
v
e
r
s
o

d
e
l

m

t
o
d
o

p
o
s
t
o
r
d
e
r
E
n
u
m
e
r
a
t
i
o
n
,

q
u
e

e
m
p
i
e
z
a

d
e
s
d
e

l
a

r
a

z

y

d
e
s
c
i
e
n
d
e

c
a
d
a

r
a
m
a

p
o
r

o
r
d
e
n
.

O
p
o
d
e
m
o
s

l
l
a
m
a
r

a
l

m

t
o
d
o

b
r
e
a
d
t
h
F
i
r
s
t
E
n
u
m
e
r
a
t
i
o
n
,

q
u
e

e
m
p
i
e
z
a

e
n

l
a

r
a

x

y

v
i
s
i
t
a

t
o
d
o
s

l
o
s

n
o
d
o
s

h
i
j
o
s

e
n

u
n

n
i
v
e
l

n
a
t
e
s

d
e

v
i
s
i
t
a
r

l
o
s

n
o
d
o
s

h
i
j
o
s

d
e

u
n
a

p
r
o
f
u
n
d
i
d
a
d

i
n
f
e
r
i
o
r
.
E
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

d
e

e
j
e
m
p
l
o

e
x
p
a
n
d
e

e
l

n
o
d
o

p
a
d
r
e

s
i

c
o
n
t
e
i
n
e

u
n

n
o
d
o

h
i
j
o

q
u
e

c
o
r
r
e
s
p
o
n
d
a

c
o
n

e
l

c
a
m
p
o

d
e

b

s
q
u
e
d
a

i
n
t
r
o
d
u
c
i
d
o
.

U
s
a

u
n
a

l
l
a
m
a
d
a

a

E
n
u
m
e
r
a
t
i
o
n

e

=
n
o
d
e
s
[
0
]
.
d
e
p
t
h
F
i
r
s
t
E
n
u
m
e
r
a
t
i
o
n
(
)
;

p
a
r
a

d
e
v
o
l
v
e
r

l
a

l
i
s
t
a

d
e

t
o
d
o
s

l
o
s

n
o
d
o
s

d
e
l

r
b
o
l
.

U
n
a

v
e
z

q
u
e

h
a

e
n
c
o
n
t
r
a
d
o

u
n
a

c
o
r
r
e
s
p
o
n
d
e
n
c
i
a
,

c
o
n
s
t
r
u
y
e

e
l

T
r
e
e
P
a
t
h

d
e
s
d
e

e
l

n
o
d
o

r
a

z
h
a
c
i
a

e
l

n
o
d
o

q
u
e

c
o
n
c
u
e
r
d
a

c
o
n

l
a

c
a
d
e
n
a

b

s
q
u
e
d
a

p
a
s
a
d
a

a

m
a
k
e
V
i
s
i
b
l
e

d
e

l
a

c
l
a
s
e

J
T
r
e
e

q
u
e

s
e

a
s
e
g
u
r
a

d
e

q
u
e

n
o
d
o

s
e

e
x
p
a
n
d
i
r


e
n

e
l

r
b
o
l
.
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
*
;
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
e
v
e
n
t
.
*
;
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
*
;
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
t
r
e
e
.
*
;
p
u
b
l
i
c

c
l
a
s
s

S
i
m
p
l
e
S
e
a
r
c
h
T
r
e
e

e
x
t
e
n
d
s

J
F
r
a
m
e

{


J
P
a
n
e
l

f
i
n
d
P
a
n
e
l
;


J
T
e
x
t
F
i
e
l
d

f
i
n
d
F
i
e
l
d
;


J
T
r
e
e

t
r
e
e
;


J
B
u
t
t
o
n

f
i
n
d
B
u
t
t
o
n
;


D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
]

n
o
d
e
s
;


p
u
b
l
i
c

S
i
m
p
l
e
S
e
a
r
c
h
T
r
e
e
(
)

{




S
t
r
i
n
g
[
]

t
r
e
e
l
a
b
e
l
s

=


{

"
A
l
l

A
u
c
t
i
o
n
s
"
,






























"
C
l
o
s
e
d

A
u
c
t
i
o
n
"
,






























"
O
p
e
n

A
u
c
t
i
o
n
s
"

}
;




I
n
t
e
g
e
r
[
]

c
l
o
s
e
d
I
t
e
m
s

=

{

n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
4
)
,































n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
6
)
,































n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
7
)

}
;




I
n
t
e
g
e
r
[
]

o
p
e
n
I
t
e
m
s

=
{

n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
8
)
,




























n
e
w

I
n
t
e
g
e
r
(
5
0
0
1
4
9
)
}
;




n
o
d
e
s

=

n
e
w







D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
t
r
e
e
l
a
b
e
l
s
.
l
e
n
g
t
h
]
;




D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
]

c
l
o
s
e
d
n
o
d
e
s

=

n
e
w













D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
c
l
o
s
e
d
I
t
e
m
s
.
l
e
n
g
t
h
]
;




D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
]

o
p
e
n
n
o
d
e
s

=

n
e
w













D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
[
o
p
e
n
I
t
e
m
s
.
l
e
n
g
t
h
]
;




f
o
r

(
i
n
t

i
=
0
;

i

<

t
r
e
e
l
a
b
e
l
s
.
l
e
n
g
t
h
;

i
+
+
)

{







n
o
d
e
s
[
i
]

=

n
e
w










D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
(
t
r
e
e
l
a
b
e
l
s
[
i
]
)
;





}




n
o
d
e
s
[
0
]
.
a
d
d
(
n
o
d
e
s
[
1
]
)
;




n
o
d
e
s
[
0
]
.
a
d
d
(
n
o
d
e
s
[
2
]
)
;




f
o
r

(
i
n
t

i
=
0
;

i

<

c
l
o
s
e
d
I
t
e
m
s
.
l
e
n
g
t
h
;

i
+
+
)

{







c
l
o
s
e
d
n
o
d
e
s
[
i
]

=

n
e
w

















D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
(
c
l
o
s
e
d
I
t
e
m
s
[
i
]
)
;








n
o
d
e
s
[
1
]
.
a
d
d
(
c
l
o
s
e
d
n
o
d
e
s
[
i
]
)
;




}




f
o
r

(
i
n
t

i
=
0
;

i

<

o
p
e
n
I
t
e
m
s
.
l
e
n
g
t
h
;

i
+
+
)

{







o
p
e
n
n
o
d
e
s
[
i
]

=

n
e
w

D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
(




























o
p
e
n
I
t
e
m
s
[
i
]
)
;








n
o
d
e
s
[
2
]
.
a
d
d
(
o
p
e
n
n
o
d
e
s
[
i
]
)
;




}




D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l

m
o
d
e
l
=
n
e
w
























D
e
f
a
u
l
t
T
r
e
e
M
o
d
e
l
(
n
o
d
e
s
[
0
]
)
;




t
r
e
e

=

n
e
w

J
T
r
e
e
(
m
o
d
e
l
)
;




J
S
c
r
o
l
l
P
a
n
e

s
c
r
o
l
l

=

n
e
w

J
S
c
r
o
l
l
P
a
n
e
(
t
r
e
e
)
;




g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(
s
c
r
o
l
l
,

B
o
r
d
e
r
L
a
y
o
u
t
.
C
E
N
T
E
R
)
;




f
i
n
d
P
a
n
e
l
=

n
e
w

J
P
a
n
e
l
(
)
;




f
i
n
d
F
i
e
l
d
=

n
e
w

J
T
e
x
t
F
i
e
l
d
(
1
0
)
;




f
i
n
d
B
u
t
t
o
n
=

n
e
w

J
B
u
t
t
o
n
(
"
f
i
n
d
"
)
;




f
i
n
d
B
u
t
t
o
n
.
a
d
d
A
c
t
i
o
n
L
i
s
t
e
n
e
r

(
n
e
w

A
c
t
i
o
n
L
i
s
t
e
n
e
r
(
)

{






p
u
b
l
i
c

v
o
i
d

a
c
t
i
o
n
P
e
r
f
o
r
m
e
d

(
A
c
t
i
o
n
E
v
e
n
t

e
)

{








S
t
r
i
n
g

f
i
e
l
d
=
f
i
n
d
F
i
e
l
d
.
g
e
t
T
e
x
t
(
)
;









i
f

(
f
i
e
l
d

!
=

n
u
l
l
)

{










f
i
n
d
N
o
d
e
(
f
i
n
d
F
i
e
l
d
.
g
e
t
T
e
x
t
(
)
)
;








}

e
l
s
e

{










r
e
t
u
r
n
;








}







}




}
)
;




f
i
n
d
P
a
n
e
l
.
a
d
d
(
f
i
n
d
F
i
e
l
d
)
;




f
i
n
d
P
a
n
e
l
.
a
d
d
(
f
i
n
d
B
u
t
t
o
n
)
;




g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(
f
i
n
d
P
a
n
e
l
,

B
o
r
d
e
r
L
a
y
o
u
t
.
S
O
U
T
H
)
;


}


p
u
b
l
i
c

v
o
i
d

f
i
n
d
N
o
d
e
(
S
t
r
i
n
g

f
i
e
l
d
)

{




E
n
u
m
e
r
a
t
i
o
n

e

=

n
o
d
e
s
[
0
]
.
d
e
p
t
h
F
i
r
s
t
E
n
u
m
e
r
a
t
i
o
n
(
)
;





O
b
j
e
c
t

c
u
r
r
N
o
d
e
;





w
h
i
l
e

(
e
.
h
a
s
M
o
r
e
E
l
e
m
e
n
t
s
(
)
)

{






c
u
r
r
N
o
d
e

=

e
.
n
e
x
t
E
l
e
m
e
n
t
(
)
;







i
f

(
c
u
r
r
N
o
d
e
.
t
o
S
t
r
i
n
g
(
)
.
e
q
u
a
l
s
(
f
i
e
l
d
)
)

{









T
r
e
e
P
a
t
h

p
a
t
h
=
n
e
w

T
r
e
e
P
a
t
h
(
(
(













D
e
f
a
u
l
t
M
u
t
a
b
l
e
T
r
e
e
N
o
d
e
)
c
u
r
r
N
o
d
e
)
.
g
e
t
P
a
t
h
(
)
)
;








t
r
e
e
.
m
a
k
e
V
i
s
i
b
l
e
(
p
a
t
h
)
;








t
r
e
e
.
s
e
t
S
e
l
e
c
t
i
o
n
R
o
w
(
t
r
e
e
.
g
e
t
R
o
w
F
o
r
P
a
t
h
(
p
a
t
h
)
)
;








r
e
t
u
r
n
;






}





}



}


p
u
b
l
i
c

s
t
a
t
i
c

v
o
i
d

m
a
i
n
(
S
t
r
i
n
g
[
]

a
r
g
s
)

{




S
i
m
p
l
e
S
e
a
r
c
h
T
r
e
e

f
r
a
m
e

=

n
e
w

S
i
m
p
l
e
S
e
a
r
c
h
T
r
e
e
(
)
;




f
r
a
m
e
.
a
d
d
W
i
n
d
o
w
L
i
s
t
e
n
e
r
(

n
e
w

W
i
n
d
o
w
A
d
a
p
t
e
r
(
)

{






p
u
b
l
i
c

v
o
i
d

w
i
n
d
o
w
C
l
o
s
i
n
g
(

W
i
n
d
o
w
E
v
e
n
t

e

)

{








S
y
s
t
e
m
.
e
x
i
t
(
0
)
;






}




}
)
;




f
r
a
m
e
.
s
e
t
V
i
s
i
b
l
e
(
t
r
u
e
)
;




f
r
a
m
e
.
p
a
c
k
(
)
;




f
r
a
m
e
.
s
e
t
S
i
z
e
(
3
0
0
,
1
5
0
)
;


}
}
J
T
r
e
e
,
J
T
a
b
l
e

y

J
L
i
s
t

p
r
o
b
a
b
l
e
m
e
n
t
e

s
o
n

l
o
s

m
o
d
e
l
o
s

m

s

c
o
m
u
n
e
s

q
u
e

q
u
e
r
r
e
m
o
s

p
e
r
s
o
n
a
l
i
z
a
r
.

P
e
r
o

p
o
d
e
m
o
s

u
s
a
r

m
o
d
e
l
o
s

c
o
m
o

S
i
n
g
l
e
S
e
l
e
c
t
i
o
n
M
o
d
e
l

p
a
r
a

m
a
n
i
p
u
l
a
c
i

n

d
e

d
a
t
o
s
e
n

g
e
n
e
r
a
l
.

E
s
t
a

c
l
a
s
e

n
o
s

p
e
r
m
i
t
e

e
s
p
e
c
i
f
i
c
a
r

c
o
m
o

s
e

s
e
l
e
c
c
i
o
n
a
n

l
o
s

d
a
t
o
s

e
n

u
n

c
o
m
p
o
n
e
n
t
e
.
D
i
b
u
j
o

d
e

C
e
l
d
a
s

P
e
r
s
o
n
a
l
i
z
a
d
o
C
o
m
o

h
e
m
o
s

a
p
r
e
n
d
i
d
o

a
r
r
i
b
a
,

m
u
c
h
o
s

c
o
m
p
o
n
e
n
t
e
s

t
i
e
n
e
n

u
n

r
e
n
d
e
r
i
z
a
d
o
r

d
e

c
e
l
d
a
s

p
o
r

d
e
f
e
c
t
o

p
a
r
a

d
i
b
u
j
a
r

c
a
d
a

e
l
e
m
e
n
t
o

d
e

l
a

t
a
b
l
a
,

r
b
o
l

o

l
i
s
t
a
.

E
l

r
e
n
d
e
r
i
z
a
d
o
r

d
e

c
e
l
d
a
s

p
o
r
d
e
f
e
c
t
o

n
o
r
m
a
l
m
e
n
t
e

e
s

u
n

J
L
a
b
e
l

y

m
u
e
s
t
r
a

u
n
a

r
e
p
r
e
s
e
n
t
a
c
i

n

S
t
r
i
n
g

d
e

l
o
s

d
a
t
o
s

d
e
l

e
l
e
m
e
n
t
o
.
U
n

s
e
n
c
i
l
l
o

r
e
n
d
e
r
i
z
a
d
o
r

d
e

c
e
l
d
a

p
e
r
s
o
n
a
l
i
z
a
d
o

p
u
e
d
e

e
x
t
e
n
d
e
r

l
a

c
l
a
s
e

D
e
f
a
u
l
t
X
X
X
C
e
l
l
R
e
n
d
e
r
e
r

p
a
r
a

p
r
o
p
o
r
c
i
o
n
a
r

p
e
r
s
o
n
a
l
i
z
a
c
i

n

a
d
i
c
i
o
n
a
l

e
n

e
l

g
e
t
X
X
X
C
e
l
l
R
e
n
d
e
r
e
r
.

L
o
s
c
o
m
p
o
n
e
n
t
e
s
D
e
f
a
u
l
t
T
a
b
l
e
C
e
l
l
R
e
n
d
e
r
e
r

y

D
e
f
a
u
l
t
T
r
e
e
C
e
l
l
R
e
n
d
e
r
e
r

u
s
a
n

u
n

J
L
a
b
e
l

p
a
r
a

d
i
b
u
j
a
r

l
a

c
e
l
d
a
.

E
s
t
o

s
i
g
n
i
f
i
c
a

q
u
e

c
u
a
l
q
u
i
e
r

p
e
r
s
o
n
a
l
i
z
a
c
i

n

q
u
e

p
u
e
d
a

s
e
r

a
p
l
i
c
a
d
a

a

u
n
J
L
a
b
e
l

t
a
m
b
i

n

p
u
e
d
e

s
e
r

u
s
a
d
a

e
n

u
n
a

c
e
l
d
a

d
e

J
T
a
b
l
e

o

d
e

J
T
r
e
e
.
P
o
r

e
j
e
m
p
l
o
,

e
l

s
i
g
u
i
e
n
t
e

r
e
n
d
e
r
i
z
a
d
o
r

s
e
l
e
c
c
i
o
n
a

e
l

c
o
l
o
r

d
e
l

f
o
n
d
o

d
e
l

c
o
m
p
o
n
e
n
t
e

s
i

e
l

t
e
m

d
e

l
a

s
u
b
a
s
t
a

h
a

r
e
c
i
b
i
d
o

u
n

a
l
t
o

n

m
e
r
o

d
e

p
u
j
a
s
:
c
l
a
s
s

C
u
s
t
o
m
R
e
n
d
e
r
e
r

e
x
t
e
n
d
s

D
e
f
a
u
l
t
T
a
b
l
e
C
e
l
l
R
e
n
d
e
r
e
r

{


p
u
b
l
i
c

C
o
m
p
o
n
e
n
t

g
e
t
T
a
b
l
e
C
e
l
l
R
e
n
d
e
r
e
r
C
o
m
p
o
n
e
n
t
(





















J
T
a
b
l
e

t
a
b
l
e
,
O
b
j
e
c
t

v
a
l
u
e
,






















b
o
o
l
e
a
n

i
s
S
e
l
e
c
t
e
d
,






















b
o
o
l
e
a
n

h
a
s
F
o
c
u
s
,






















i
n
t

r
o
w
,

i
n
t

c
o
l
u
m
n
)

{







C
o
m
p
o
n
e
n
t

c
o
m
p

=




















s
u
p
e
r
.
g
e
t
T
a
b
l
e
C
e
l
l
R
e
n
d
e
r
e
r
C
o
m
p
o
n
e
n
t
(





















t
a
b
l
e
,
v
a
l
u
e
,
i
s
S
e
l
e
c
t
e
d
,
h
a
s
F
o
c
u
s
,





















r
o
w
,
c
o
l
u
m
n
)
;







J
L
a
b
e
l

l
a
b
e
l

=

(
J
L
a
b
e
l
)
c
o
m
p
;







i
f
(
(
(
I
n
t
e
g
e
r
)
v
a
l
u
e
)
.
i
n
t
V
a
l
u
e
(
)

>
=

3
0
)

{











l
a
b
e
l
.
s
e
t
I
c
o
n
(
n
e
w

I
m
a
g
e
I
c
o
n
(
"
H
o
t
.
g
i
f
"
)
)
;







}

e
l
s
e

{











l
a
b
e
l
.
s
e
t
I
c
o
n
(
n
e
w

I
m
a
g
e
I
c
o
n
(
"
N
o
r
m
a
l
.
g
i
f
"
)
)
;







}







r
e
t
u
r
n

l
a
b
e
l
;



}
}
E
l

r
e
n
d
e
r
i
z
a
d
o
r

s
e

s
e
l
e
c
c
i
o
n
a

s
o
b
r
e

u
n
a

c
o
l
u
m
n
a

d
e

e
s
t
a

f
o
r
m
a
:


C
u
s
t
o
m
R
e
n
d
e
r
e
r

c
u
s
t
o
m

=

n
e
w

C
u
s
t
o
m
R
e
n
d
e
r
e
r
(
)
;


c
u
s
t
o
m
.
s
e
t
H
o
r
i
z
o
n
t
a
l
A
l
i
g
n
m
e
n
t
(
J
L
a
b
e
l
.
C
E
N
T
E
R
)
;


s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
2
)
.
s
e
t
C
e
l
l
R
e
n
d
e
r
e
r
(










































c
u
s
t
o
m
)
;
S
i

e
l

c
o
m
p
o
n
e
n
t
e

q
u
e

e
s
t


s
i
e
n
d
o

m
o
s
t
r
a
d
o

d
e
n
t
r
o

d
e

l
a

c
o
l
u
m
n
a

J
T
a
b
l
e

r
e
q
u
i
e
r
e

m

s

f
u
n
c
i
o
n
a
l
i
d
a
d

q
u
e

l
a

d
i
s
p
o
n
i
b
l
e

u
s
a
n
d
o

u
n

J
L
a
b
e
l
,

p
o
d
e
m
o
s

c
r
e
a
r

n
u
e
s
t
r
o

p
r
o
p
i
o
T
a
b
l
e
C
e
l
l
R
e
n
d
e
r
e
r
.

E
s
t
e

c

d
i
g
o

d
e

e
j
e
m
p
l
o

u
s
a

u
n

J
B
u
t
t
o
n

c
o
m
o

r
e
n
d
e
r
i
z
a
d
o
r

d
e

c
e
l
d
a
s
:
c
l
a
s
s

C
u
s
t
o
m
B
u
t
t
o
n
R
e
n
d
e
r
e
r

e
x
t
e
n
d
s

J
B
u
t
t
o
n

















i
m
p
l
e
m
e
n
t
s

T
a
b
l
e
C
e
l
l
R
e
n
d
e
r
e
r

{



p
u
b
l
i
c

C
u
s
t
o
m
B
u
t
t
o
n
R
e
n
d
e
r
e
r
(
)

{





s
e
t
O
p
a
q
u
e
(
t
r
u
e
)
;



}



p
u
b
l
i
c

C
o
m
p
o
n
e
n
t

g
e
t
T
a
b
l
e
C
e
l
l
R
e
n
d
e
r
e
r
C
o
m
p
o
n
e
n
t
(






















J
T
a
b
l
e

t
a
b
l
e
,

O
b
j
e
c
t

v
a
l
u
e
,























b
o
o
l
e
a
n

i
s
S
e
l
e
c
t
e
d
,























b
o
o
l
e
a
n

h
a
s
F
o
c
u
s
,

i
n
t

r
o
w
,























i
n
t

c
o
l
u
m
n
)

{






i
f

(
i
s
S
e
l
e
c
t
e
d
)

{









(
(
J
B
u
t
t
o
n
)
v
a
l
u
e
)
.
s
e
t
F
o
r
e
g
r
o
u
n
d
(
















t
a
b
l
e
.
g
e
t
S
e
l
e
c
t
i
o
n
F
o
r
e
g
r
o
u
n
d
(
)
)
;









(
(
J
B
u
t
t
o
n
)
v
a
l
u
e
)
.
s
e
t
B
a
c
k
g
r
o
u
n
d
(
















t
a
b
l
e
.
g
e
t
S
e
l
e
c
t
i
o
n
B
a
c
k
g
r
o
u
n
d
(
)
)
;






}

e
l
s
e

{









(
(
J
B
u
t
t
o
n
)
v
a
l
u
e
)
.
s
e
t
F
o
r
e
g
r
o
u
n
d
(
t
a
b
l
e
.
g
e
t
F
o
r
e
g
r
o
u
n
d
(
)
)
;









(
(
J
B
u
t
t
o
n
)
v
a
l
u
e
)
.
s
e
t
B
a
c
k
g
r
o
u
n
d
(
t
a
b
l
e
.
g
e
t
B
a
c
k
g
r
o
u
n
d
(
)
)
;






}






r
e
t
u
r
n

(
J
B
u
t
t
o
n
)
v
a
l
u
e
;




}
}
A
l

i
g
u
a
l

q
u
e

e
l

r
e
n
d
e
r
i
z
a
d
o
r

d
e

c
e
l
d
a
s

p
o
r

d
e
f
e
c
t
o

J
L
a
b
e
l
,

e
s
t
a

c
l
a
s
e

t
r
a
t
a

c
o
n

e
l

c
o
m
p
o
n
e
n
t
e

p
r
i
n
c
i
p
a
l

(
e
n

e
s
t
e

c
a
s
o

J
B
u
t
t
o
n
)

p
a
r
a

h
a
c
e
r

e
l

d
i
b
u
j
a
d
o
.

L
a

s
e
l
e
c
c
i

n

d
e

l
a

c
e
l
d
a

c
a
m
b
i
a

l
o
s
c
o
l
o
r
e
s

d
e
l

b
o
t

n
.

C
o
m
o

a
n
t
e
s
,

e
l

r
e
n
d
e
r
i
z
a
d
o
r

d
e

c
e
l
d
a
s

e
s
t


s
e
g
u
r
o

s
o
b
r
e

l
a

c
o
l
u
m
n
a

a
p
r
o
p
i
a
d
a

d
e

l
a

t
a
b
l
a

d
e

s
u
b
a
s
t
a
s

c
o
n

e
l

m

t
o
d
o

s
e
t
C
e
l
l
R
e
n
d
e
r
e
r
:



s
c
r
o
l
l
C
o
l
u
m
n
M
o
d
e
l
.
g
e
t
C
o
l
u
m
n
(
3
)
.
s
e
t
C
e
l
l
R
e
n
d
e
r
e
r
(








n
e
w

C
u
s
t
o
m
B
u
t
t
o
n
R
e
n
d
e
r
e
r
(
)
)
;

D
e

f
o
r
m
a

a
l
t
e
r
n
a
t
i
v
a
,

t
o
d
o
s

l
o
s

c
o
m
p
o
n
e
n
t
e
s

J
B
u
t
t
o
n

p
u
e
d
e
n

c
o
n
f
i
g
u
r
a
r
s
e

p
a
r
a

u
s
a
r

e
l

C
u
s
t
o
m
B
u
t
t
o
n
R
e
n
d
e
r
e
r

e
n

l
a

t
a
b
l
a

c
o
n

u
n
a

l
l
a
m
a
d
a

a

s
e
t
D
e
f
a
u
l
t
R
e
n
d
e
r
e
r

d
e

e
s
t
a

f
o
r
m
a
:


t
a
b
l
e
.
s
e
t
D
e
f
a
u
l
t
R
e
n
d
e
r
e
r
(








J
B
u
t
t
o
n
.
c
l
a
s
s
,

n
e
w

C
u
s
t
o
m
B
u
t
t
o
n
R
e
n
d
e
r
e
r
(
)
)
;
E
d
i
t
o
r

d
e

C
e
l
d
a
s

P
e
r
s
o
n
a
l
i
z
a
d
o
D
e

l
a

m
i
s
m
a

f
o
r
m
a

q
u
e

p
o
d
e
m
o
s

c
o
n
f
i
g
u
r
a
r

c
o
m
o

s
e

d
i
b
u
j
a
n

l
a
s

c
e
l
d
a
s

e
n

u
n
a

J
T
a
b
l
e

o

e
n

u
n

J
T
r
e
e
,

t
a
m
b
i

n

p
o
d
e
m
o
s

c
o
n
f
i
g
u
r
a
r

c
o
m
o

u
n
a

c
e
l
d
a

e
d
i
t
a
b
l
e

r
e
s
p
o
n
d
e

a

l
a

e
d
i
c
i
o
n
e
s
.

U
n
a
d
i
f
e
r
e
n
c
i
a

e
n
t
r
e

u
s
a
r

e
d
i
t
o
r
e
s

y

r
e
n
d
e
r
i
z
a
d
o
r
e
s

d
e

c
l
e
d
a
s

e
s

q
u
e

h
a
y

u
n

D
e
f
a
u
l
t
C
e
l
l
E
d
i
t
o
r

p
a
r
a

t
o
d
o
s

l
o
s

c
o
m
p
o
n
e
n
t
e
s
,

p
e
r
o

n
o

h
a
y

u
n

D
e
f
a
u
l
t
T
a
b
l
e
C
e
l
l
E
d
i
t
o
r

p
a
r
a

c
e
l
d
a
s

d
e

t
a
b
l
a
s
.
M
i
e
n
t
r
a
s

e
x
i
s
t
e
n

r
e
n
d
e
r
i
z
a
d
o
r
e
s

s
e
p
a
r
a
d
o
s

p
a
r
a

J
T
r
e
e

y

J
T
a
b
l
e
,

u
n
a

s

l
a

c
l
a
s
e

D
e
f
a
u
l
t
C
e
l
l
E
d
i
t
o
r

i
m
p
l
e
m
e
n
t
a

l
o
s

d
o
s

i
n
t
e
r
f
a
c
e
s

T
a
b
l
e
C
e
l
l
E
d
i
t
o
r

y

T
r
e
e
C
e
l
l
E
d
i
t
o
r
.

S
i
n

e
m
b
a
r
g
o
,

l
a
c
l
a
s
e
D
e
f
a
u
l
t
C
e
l
l
E
d
i
t
o
r

s

l
o

t
i
e
n
e

c
o
n
s
t
r
u
c
t
o
r
e
s

p
a
r
a

l
o
s

c
o
m
p
o
n
e
n
t
e
s

J
C
o
m
b
o
B
o
x
,
J
C
h
e
c
k
B
o
x
,

y

J
T
e
x
t
F
i
e
l
d
.

L
a

c
l
a
s
e

J
B
u
t
t
o
n

n
o

s
e

m
a
p
e
a

c
o
n

t
i
n
g
u
n
o

d
e

e
s
t
o
s

c
o
n
s
t
r
u
c
t
o
r
e
s

p
o
r
e
s
o

s
e

c
r
e
a

u
n

J
C
h
e
c
k
B
o
x

i
n

t
i
l

p
a
r
a

s
a
t
i
s
f
a
c
e
r

l
o
s

r
e
q
u
e
r
i
m
i
e
n
t
o
s

d
e

l
a

c
l
a
s
e

D
e
f
a
u
l
t
C
e
l
l
E
d
i
t
o
r
.
E
l

s
i
g
u
i
e
n
t
e

e
j
e
m
p
l
o

u
s
a

u
n

e
d
i
t
o
r

d
e

b
o
t

n

p
e
r
s
o
n
a
l
i
z
a
d
o

q
u
e

m
u
e
s
t
r
a

e
l

n

m
e
r
o

d
e

d

a
s

q
u
e

q
u
e
d
a
n

d
e

s
u
b
a
s
t
a

c
u
a
n
d
o

s
e

h
a
c
e
r

d
o
b
l
e

c
l
i
c
k

s
o
b
r
e

l
.

E
l

d
o
b
l
e

c
l
i
c
k

p
a
r
a

d
i
s
p
a
r
a
r

l
a

a
c
c
i

n
s
e

e
s
p
e
c
i
f
i
c
a

s
e
l
e
c
c
i
o
n
a
n
d
o

e
l

v
a
l
o
r

c
l
i
c
k
C
o
u
n
t
T
o
S
t
a
r
t

a

d
o
s
.

U
n
a

c
o
p
i
a

e
x
a
c
t
a

d
e
l

m

t
o
d
o

g
e
t
T
a
b
l
e
C
e
l
l
E
d
i
t
o
r
C
o
m
p
o
n
e
n
t

d
i
b
u
j
a

e
l

b
o
t

n

e
n

m
o
d
o

e
d
i
c
i

n
.

U
n

c
o
m
p
o
n
e
n
t
e

J
D
i
a
l
o
g
q
u
e

m
u
e
s
t
r
a

e
l

n

m
e
r
o

d
e

d

a
s

q
u
e

q
u
e
d
a
n

a
p
a
r
e
c
e
r


c
u
a
n
d
o

s
e

l
l
a
m
e

a
l

m

t
o
d
o

g
e
t
C
e
l
l
E
d
i
t
o
r
V
a
l
u
e
.

E
l

v
a
l
o
r

d
e
l

n

m
e
r
o

d
e

d

a
s

q
u
e

q
u
e
d
a
n

s
e

c
a
l
c
u
l
a

m
o
v
i
e
n
d
o

l
a

f
e
c
h
a

d
e
l

c
a
l
e
n
d
a
r
i
o
a
c
t
u
a
l

h
a
s
t
a

l
a

f
e
c
h
a

f
i
n
a
l
.

L
a

c
l
a
s
e

C
a
l
e
n
d
a
r

n
o

t
i
e
n
e

u
n

m

t
o
d
o

q
u
e

e
x
p
r
e
s
e

u
n
a

d
i
f
e
r
e
n
c
i
a

e
n
t
r
e

d
o
s

f
e
c
h
a
s

d
i
s
t
i
n
t
o

a

l
o
s

m
i
l
i
s
e
g
u
n
d
o
s

q
u
e

h
a
y
a

e
n
t
r
e

e
s
a
s

d
o
s

f
e
c
h
a
s
.
c
l
a
s
s

C
u
s
t
o
m
B
u
t
t
o
n
E
d
i
t
o
r

e
x
t
e
n
d
s

D
e
f
a
u
l
t
C
e
l
l
E
d
i
t
o
r

{


f
i
n
a
l

J
B
u
t
t
o
n

m
y
b
u
t
t
o
n
;


J
F
r
a
m
e

f
r
a
m
e
;


C
u
s
t
o
m
B
u
t
t
o
n
E
d
i
t
o
r
(
J
F
r
a
m
e

f
r
a
m
e
)

{




s
u
p
e
r
(
n
e
w

J
C
h
e
c
k
B
o
x
(
)
)
;




m
y
b
u
t
t
o
n

=

n
e
w

J
B
u
t
t
o
n
(
)
;




t
h
i
s
.
e
d
i
t
o
r
C
o
m
p
o
n
e
n
t

=

m
y
b
u
t
t
o
n
;




t
h
i
s
.
c
l
i
c
k
C
o
u
n
t
T
o
S
t
a
r
t

=

2
;




t
h
i
s
.
f
r
a
m
e
=
f
r
a
m
e
;




m
y
b
u
t
t
o
n
.
s
e
t
O
p
a
q
u
e
(
t
r
u
e
)
;




m
y
b
u
t
t
o
n
.
a
d
d
A
c
t
i
o
n
L
i
s
t
e
n
e
r
(
n
e
w

A
c
t
i
o
n
L
i
s
t
e
n
e
r
(
)

{






p
u
b
l
i
c

v
o
i
d

a
c
t
i
o
n
P
e
r
f
o
r
m
e
d
(
A
c
t
i
o
n
E
v
e
n
t

e
)

{








f
i
r
e
E
d
i
t
i
n
g
S
t
o
p
p
e
d
(
)
;






}




}
)
;


}


p
r
o
t
e
c
t
e
d

v
o
i
d

f
i
r
e
E
d
i
t
i
n
g
S
t
o
p
p
e
d
(
)

{




s
u
p
e
r
.
f
i
r
e
E
d
i
t
i
n
g
S
t
o
p
p
e
d
(
)
;


}


p
u
b
l
i
c

O
b
j
e
c
t

g
e
t
C
e
l
l
E
d
i
t
o
r
V
a
l
u
e
(
)

{




J
D
i
a
l
o
g

j
d
=

n
e
w

J
D
i
a
l
o
g
(
f
r
a
m
e
,

"
T
i
m
e

l
e
f
t
"
)
;




C
a
l
e
n
d
a
r

t
o
d
a
y
=
C
a
l
e
n
d
a
r
.
g
e
t
I
n
s
t
a
n
c
e
(
)
;




C
a
l
e
n
d
a
r

e
n
d
=
C
a
l
e
n
d
a
r
.
g
e
t
I
n
s
t
a
n
c
e
(
)
;




S
i
m
p
l
e
D
a
t
e
F
o
r
m
a
t

i
n
=
n
e
w

S
i
m
p
l
e
D
a
t
e
F
o
r
m
a
t
(
"
y
y
y
y
-
M
M
-
d
d
"
)
;




t
r
y

{






e
n
d
.
s
e
t
T
i
m
e
(
i
n
.
p
a
r
s
e
(
m
y
b
u
t
t
o
n
.
g
e
t
T
e
x
t
(
)
)
)
;




}

c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

e
)
{






S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
E
r
r
o
r

i
n

d
a
t
e
"
+
m
y
b
u
t
t
o
n
.
g
e
t
T
e
x
t
(
)
+
e
)
;




}




i
n
t

d
a
y
s

=

0
;




w
h
i
l
e
(
t
o
d
a
y
.
b
e
f
o
r
e
(
e
n
d
)
)

{




t
o
d
a
y
.
r
o
l
l
(
C
a
l
e
n
d
a
r
.
D
A
T
E
,
t
r
u
e
)
;




d
a
y
s
+
+
;




}




j
d
.
s
e
t
S
i
z
e
(
2
0
0
,
1
0
0
)
;




i
f

(
t
o
d
a
y
.
a
f
t
e
r
(
e
n
d
)
)

{







j
d
.
g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(
n
e
w

J
L
a
b
e
l
(
"
A
u
c
t
i
o
n

c
o
m
p
l
e
t
e
d
"
)
)
;




}

e
l
s
e

{






j
d
.
g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(
n
e
w

J
L
a
b
e
l
(
"
D
a
y
s

l
e
f
t
=
"
+
d
a
y
s
)
)
;




}




j
d
.
s
e
t
V
i
s
i
b
l
e
(
t
r
u
e
)
;





r
e
t
u
r
n

n
e
w

S
t
r
i
n
g
(
m
y
b
u
t
t
o
n
.
g
e
t
T
e
x
t
(
)
)
;


}


p
u
b
l
i
c

C
o
m
p
o
n
e
n
t

g
e
t
T
a
b
l
e
C
e
l
l
E
d
i
t
o
r
C
o
m
p
o
n
e
n
t
(
J
T
a
b
l
e

t
a
b
l
e
,

















O
b
j
e
c
t

v
a
l
u
e
,

b
o
o
l
e
a
n

i
s
S
e
l
e
c
t
e
d
,

















i
n
t

r
o
w
,

i
n
t

c
o
l
u
m
n
)

{




(
(
J
B
u
t
t
o
n
)

e
d
i
t
o
r
C
o
m
p
o
n
e
n
t
)
.
s
e
t
T
e
x
t
(
(
(
















J
B
u
t
t
o
n
)
v
a
l
u
e
)
.
g
e
t
T
e
x
t
(
)
)
;




i
f

(
i
s
S
e
l
e
c
t
e
d
)

{






(
(
J
B
u
t
t
o
n
)

e
d
i
t
o
r
C
o
m
p
o
n
e
n
t
)
.
s
e
t
F
o
r
e
g
r
o
u
n
d
(
















t
a
b
l
e
.
g
e
t
S
e
l
e
c
t
i
o
n
F
o
r
e
g
r
o
u
n
d
(
)
)
;






(
(
J
B
u
t
t
o
n
)

e
d
i
t
o
r
C
o
m
p
o
n
e
n
t
)
.
s
e
t
B
a
c
k
g
r
o
u
n
d
(
















t
a
b
l
e
.
g
e
t
S
e
l
e
c
t
i
o
n
B
a
c
k
g
r
o
u
n
d
(
)
)
;




}

e
l
s
e

{






(
(
J
B
u
t
t
o
n
)

e
d
i
t
o
r
C
o
m
p
o
n
e
n
t
)
.
s
e
t
F
o
r
e
g
r
o
u
n
d
(
















t
a
b
l
e
.
g
e
t
F
o
r
e
g
r
o
u
n
d
(
)
)
;






(
(
J
B
u
t
t
o
n
)

e
d
i
t
o
r
C
o
m
p
o
n
e
n
t
)
.
s
e
t
B
a
c
k
g
r
o
u
n
d
(
















t
a
b
l
e
.
g
e
t
B
a
c
k
g
r
o
u
n
d
(
)
)
;




}




r
e
t
u
r
n

e
d
i
t
o
r
C
o
m
p
o
n
e
n
t
;




}

}
M
a
n
e
j
o

d
e

E
v
e
n
t
o
s

E
s
p
e
c
i
a
l
i
z
a
d
o
s
S
w
i
n
g

u
s
a

l
a
s

c
l
a
s
e
s

d
e

m
a
n
e
j
o

d
e

e
v
e
n
t
o
s

d
i
s
p
o
n
i
b
l
e
s

e
n

e
l

A
P
I

A
W
T

d
e
s
d
e

e
l

J
D
K

1
.
1
.

S
i
n

e
m
b
a
r
g
o
,

a
l
g
u
n
o
s

A
P
I
s

n
u
e
v
o
s

e
s
t

n

d
i
s
p
o
n
i
b
l
e
s

e
n

l
a

c
l
a
s
e

S
w
i
n
g
U
t
i
l
i
t
i
e
s

q
u
e

s
e

u
s
a
n

p
a
r
a
a

a
d
i
r

m

s

c
o
n
t
r
o
l

s
o
b
r
e

l
a

c
o
l
a

d
e

e
v
e
n
t
o
s
.

L
o
s

d
o
s

n
u
e
v
o
s

m

t
o
d
o
s

m
a
n
e
j
a
d
o
r
e
s

d
e

e
v
e
n
t
o
s

s
o
n

i
n
v
o
k
e
L
a
t
e
r

y

i
n
v
o
k
e
A
n
d
W
a
i
t
.

E
s
t
e

l
t
i
m
o

e
s
p
e
r
a

a

q
u
e

e
l

e
v
e
n
t
o

s
e
a

p
r
o
c
e
s
a
d
o
r

e
n
l
a

c
o
l
a

d
e

e
v
e
n
t
o
s
.
E
s
t
o
s

m

t
o
d
o
s

s
e

u
s
a
n

f
r
e
c
u
e
n
t
e
m
e
n
t
e

p
a
r
a

s
o
l
i
c
i
t
a
r

e
l

f
o
c
o

s
o
b
r
e

u
n

c
o
m
p
o
n
e
n
t
e

d
e
s
p
u

s

d
e

q
u
e

o
t
r
o

e
v
e
n
t
o

h
a
y
a

o
c
u
r
r
i
d
o

y

q
u
e

p
o
d
r

a

a
f
e
c
t
a
r

a
l

f
o
c
o

d
e

c
o
m
p
o
n
e
n
t
e
s
.

P
o
d
e
m
o
s
d
e
v
o
l
v
e
r

e
l

f
o
c
o

l
l
a
m
a
n
d
o

a
l

m

t
o
d
o

i
n
v
o
k
e
L
a
t
e
r

y

p
a
s
a
n
d
o

u
n

T
h
r
e
a
d
:


J
B
u
t
t
o
n

b
u
t
t
o
n

=
n
e
w

J
B
u
t
t
o
n
(
)
;


S
w
i
n
g
U
t
i
l
i
t
i
e
s
.
i
n
v
o
k
e
L
a
t
e
r
(
n
e
w

R
u
n
n
a
b
l
e
(
)

{





p
u
b
l
i
c

v
o
i
d

r
u
n
(
)

{







b
u
t
t
o
n
.
r
e
q
u
e
s
t
F
o
c
u
s
(
)
;




}


}
)
;

D
i
r
e
c
c
i
o
n
e
s

S
w
i
n
g
M
i
e
n
t
r
a
s

q
u
e

l
a

a
r
q
u
i
t
e
c
t
u
r
a

b

s
i
c
a

S
w
i
n
g

h
a

p
e
r
m
a
n
e
c
i
d
o

e
s
t
a
b
l
e

a

s
u

d
i
s
e

o

o
r
i
g
i
n
a
l
,

s
e

h
a
n

r
e
a
l
i
z
a
d
o

m
u
c
h
a
s

m
e
j
o
r
a
s

y

o
p
t
i
m
i
z
a
c
i
o
n
e
s

s
o
b
r
e

c
o
m
p
o
n
e
n
t
e
s

c
o
m
o

J
T
a
b
l
e

y

e
n

r
e
a
s
d
e
s
p
l
a
z
a
b
l
e
s
.
S
i
n

e
m
b
a
r
g
o
,

c
o
m
o

v
e
r
e
m
o
s

e
n

l
a

s
e
c
c
i

n

A
n
a
l
i
z
a
r

u
n

P
r
o
g
r
a
m
a
,

u
n
a

s
i
m
p
l
e

t
a
b
l
a

d
e

7
0
0
x
3
0
0

r
e
q
u
i
e
r
e

c
a
s
i

m
e
d
i
o

m
e
g
a
b
y
t
e

d
e

m
e
m
o
r
i
a

c
u
a
n
d
o

s
e

u
s
a

d
o
b
l
e

b
u
f
f
e
r
.

L
a

c
r
e
a
c
c
i

n

d
e

1
0
t
a
b
l
a
s

p
r
o
b
a
b
l
e
m
e
n
t
e

n
e
c
e
s
i
t
a
r

a

e
l

i
n
t
e
r
c
a
m
b
i
o

d
e

m
e
m
o
r
i
a

a

d
i
s
c
o
,

a
f
e
c
t
a
n
d
o

s
e
v
e
r
a
m
e
n
t
a

a
l

r
e
n
d
i
m
i
e
n
t
o

e
n

m

q
u
i
n
a
s

d
e

b
a
j
o

n
i
v
e
l
.
O
z
i
t
o
El API de Impresin
El paquete java.awt.print de la plataforma Java 2 nos permite imprimir cualquier
cosa que pueda ser renderizada a un contexto Graphics o Graphics2D
incluyendo componentes AWT, componentes Swing y grficos 2D. El API de
impresin es fcil de usar. Nuestra aplicacin le dice al sistema de impresin qu
imprimir, y el sistema de impresin determina cuando se renderiza cada pgina.
Este modelo de impresin por retrollamada permite soporte de impresin en un
amplio rango de impresoras y sistemas. El modelo de retrollamada tambin
permite al usuario imprimir a una impresora de mapa de bits desde un ordenador
que no tiene suficiente memoria o espacio en disc para contener el bitmap de una
pgina completa.
Un contexto grfico permite a un programa dibujar en un dispositivo de
renderizacin como una pantalla, una impresora o una imagen fuera de pantalla.
Como los componentes Swing se renderizan a travs de un objeto Graphics
usando el soporte de grficos AWT, es fcil imprimir componentes Swing con el
nuevo API de impresin. Sin embargo, los componentes AWT no se renderizan a un
dispositivo grfico, debemos extender la clase del componente AWT e implementar
el mtodo de dibujo del componente AWT.
Qu hay en el Paquete?
Imprimir un Componente AWT
Imprimir un Componente Swing
Imprimir Grficos en Swing
Dilogo de Impresin
Dilogo de Configuracin de Pgina
Imprimir una coleccin de pginas
Qu hay en el Paquete?
El java.awt.print contiene los siguientes interfaces, clases y excepciones. Aqu
podrs encontrar la Especificacin del API.
Interfaces
Pageable
Printable
PrinterGraphics

Clases
Book
PageFormat
Paper

PrinterJob
Excepciones
PrinterAbortException
PrinterException
PrinterIOException

Imprimir un Componente AWT
La aplicacin printbutton.java muestra un panel con un
MyButton sobre l. Cuando se pulsa el botn, la aplicacin
imprime el componente MyButton.
En el cdigo, la clase Button se extiende para implementar Printable e incluye los
mtodo paint y print. Este ltimo es necesario porque la clase implementa
Printable, y el mtodo paint es necesario porque describe como aparecen la
forma del botn y la etiqueta de texto cuando se imprimen.
Para ver el botn, la contexto grfico de impresin es trasladado a un rea
imaginable de la impresora, y para ver la etiqueta de texto, se selecciona una
fuente en el contexto grfico de impresin.
En este ejemplo, el botn se imprime a 164/72 pulgadas dentro del margen
imaginable (hay 72 pixels por pulgada) y a 5/72 pulgadas del margen superior
imaginado. Aqu es donde el botn es posicionado por el controlador de distribucin
y estos mismo nmero son devultos por las siguientes llamadas:
int X = (int)this.getLocation().getX();
int Y = (int)this.getLocation().getY();
Y aqu est el cdigo de la clase MyButton:
class MyButton extends Button
implements Printable {
public MyButton() {
super("MyButton");
}
public void paint(Graphics g) {
//To see the label text, you must specify a font for
//the printer graphics context
Font f = new Font("Monospaced", Font.PLAIN,12);
g2.setFont (f);
//Using "g" render anything you want.
//Get the button's location, width, and height
int X = (int)this.getLocation().getX();
int Y = (int)this.getLocation().getY();
int W = (int)this.getSize().getWidth();
int H = (int)this.getSize().getHeight();
//Draw the button shape
g.drawRect(X, Y, W, H);
//Draw the button label
//For simplicity code to center the label inside the
//button shape is replaced by integer offset values
g.drawString(this.getLabel(), X+10, Y+15);
}
public int print(Graphics g,
PageFormat pf, int pi)
throws PrinterException {
if (pi >= 1) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g2 = (Graphics2D) g;
//To see the button on the printed page, you
//must translate the printer graphics context
//into the imageable area
g2.translate(pf.getImageableX(), pf.getImageableY());
g2.setColor(Color.black);
paint(g2);
return Printable.PAGE_EXISTS;
}
Nota: La impresin Graphics2D est basada en la clase BufferedImage
y algunas plataformas no permiten un color de fondo negro por defecto.
Si este es nuestro caso tenemos que aadir g2.setColor(Color.black)
al mtodo print antes de la invocacin a paint.
Imprimir un Componente Swing
Imprimir un componente Swing es casi lo mismo que imprimir
un componente AWT, excepto que la clase MyButton no
necesita una implementacin del mtodo paint. Sin embargo,
si teine un mtodo print que llama al mtodo paint del componente. La
implementacin del mtodo paint no es necesaria porque los componentes Swing
saben como dibujarse a s mismos.
Aqu est el cdigo fuente completo para la versin Swing de printbutton.java.
class MyButton extends JButton implements Printable {
public MyButton() {
super("MyButton");
}
public int print(Graphics g,
PageFormat pf, int pi)
throws PrinterException {
if (pi >= 1) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g2 = (Graphics2D) g;
g2.translate(pf.getImageableX(),
pf.getImageableY());
Font f = new Font("Monospaced", Font.PLAIN,12);
g2.setFont (f);
paint(g2);
return Printable.PAGE_EXISTS;
}
Si extendemos un JPanel e implementamos Printable, podemos imprimir un
componente panel y todos sus componentes.
public class printpanel extends JPanel
implements ActionListener,
Printable {
Aqu est el cdigo de printpanel.java que imprime un objeto JPanel y el JButton
que contiene, y el cdigo de ComponentPrinterFrame.java que imprime un ojeto
JFrame y los componentes JButton, JList, JCheckBox, y JComboBox que
contiene.
Imprimir Grficos en Swing
De la misma forma que el ejemplo AWT extiende un componente Button e
implementa el mtodo paint para dibujar un botn, podemos subclasificar
componentes AWT y Swing e implementar el mtodo paint para renderizar
grficos 2D en la pantalla o en la impresora. La aplicacin Swing ShapesPrint.java
muestra como se hace esto.
El mtodo paintComponent llama al mtodo drawShapes para renderizar
grficos 2D en la pantalla cuando arranca la aplicacin. Cuando pulsamos sobre el
botn, Print, se crea un contexto grfico de impresin y es pasado al mtodo
drawShapes para el dibujado.
Dilogo de Impresin
Es fcil mostrar el Dilogo de Impresin para que el usuario final pueda
intercambiar las propiedades del rabajo de impresin. El mtodo
actionPerformed del ejemplo Swing anterior modificado aqu hace justo esto:
public void actionPerformed(ActionEvent e) {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable((MyButton) e.getSource());
if(printJob.printDialog()){
try { printJob.print(); }
catch (Exception PrinterExeption) { }
}
}
Nota: En Swing, la sentencia printJob.setPageable((MyButton)
e.getSource()); puede escribirse como
printJob.setPrintable((MyButton) e.getSource());. La diferencia es
que setPrintable es para aplicaciones que no conocen el nmero de
pginas que estn imprimiendo. Si usamos setPrintable, necesitamos
aadir if(pi >= 1){ return Printable.NO_SUCH_PAGE: } al principio
del mtodo print.
Dilogo de configuracin de Pgina
Podemos aadir una lnea de cdigo que le dice al objeto PrinterJob que mueste
el Dilogo de Configuracin de Pgina para que el usuario final pueda modificar
interactivamente el formato de la pgina para imprimir en vertical u horizontal, etc.
El mtodo actionPerformed ejemplo Swing acnterior est mostrado aqu para que
muestre los dilogos de Impresin y Configuracin de Pgina:
Nota: Algunas plataformas no soportan el dilogo de configuracin de
pgina. En estas plataformas, la llamada a pageDialog simplemente
devuelven el objeto PageFormat que se les pas y no muestran ningn
dilogo.
public void actionPerformed(ActionEvent e) {
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable((MyButton) e.getSource());
PageFormat pf = printJob.pageDialog(
printJob.defaultPage());
if(printJob.printDialog()){
try { printJob.print(); } catch (Exception ex) { }
}
}
Imprimir una Coleccin de Pginas
Podemos usar la clase Book para imprimir una coleccin de pginas que aadimos
al libro. Esta pginas pueden estr en cualquier orden y tener diferentes formatos.
El ejemplo print2button.java pone
los botones Print y Print 2 del tipo
MyButton en un panel. Crea un
libro que contiene las pginas para
imprimir. Cuando pulsamos algun
botn, el libro imprime una copia
del botn Print en modo horizontal
y dos copias del botn Print 2 en
modo vertical, como se especifica
en la implementacin del mtodo
actionPerformed mostrada aqu:
Nota: Actualmente un Bug restringe a la plataforma Solaris a imprimir
slo en vertical.
public void actionPerformed(ActionEvent e) {
PrinterJob printJob = PrinterJob.getPrinterJob();
/* Set up Book */
PageFormat landscape = printJob.defaultPage();
PageFormat portrait = printJob.defaultPage();
landscape.setOrientation(PageFormat.LANDSCAPE);
portrait.setOrientation(PageFormat.PORTRAIT);
Book bk = new Book();
bk.append((Printable)b, landscape);
bk.append((Printable)b2, portrait, 2);
printJob.setPageable(bk);
try { printJob.print(); } catch (Exception ex) { }
}
Ozito
I
m
p
r
e
s
i

n

A
v
a
n
z
a
d
a
L
a

s
e
c
c
i

n

a
n
t
e
r
i
o
r

e
x
p
l
i
c

m
o

i
m
p
r
i
m
i
r

c
o
m
p
o
n
e
n
t
e
s

s
e
n
c
i
l
l
o
s

y

c
u
b
r

a

l
a
s

t

c
n
i
c
a
s

q
u
e

s
e

p
u
e
d
e
n

u
s
a
r

p
a
r
a

i
m
p
r
i
m
i
r

c
a
p
t
u
r
a
s

d
e

p
a
n
t
a
l
l
a
.

S
i
n

e
m
b
a
r
g
o
,

s
i

q
u
e
r
e
m
o
s

i
m
p
r
i
m
i
r
m

s

q
u
e

u
n

c
o
m
p
o
n
e
n
t
e

p
o
r

c
a
d
a

p

g
i
n
a
,

o

s
u

n
u
e
s
t
r
o

c
o
m
p
o
n
e
n
t
e
s

e
s

m
a
y
o
r

q
u
e

e
l

t
a
m
a

o

d
e

u
n
a

p

g
i
n
a
,

n
e
c
e
s
i
t
a
m
o
s

h
a
c
e
r

a
l
g

n

t
r
a
b
a
j
o

a
d
i
c
i
o
n
a
l

d
e
n
t
r
o

d
e
l

m

t
o
d
o

p
r
i
n
t
.
E
s
t
a

s
e
c
c
i

n

e
x
p
l
i
c
a

q
u


n
e
c
e
s
i
t
a
m
o
s

h
a
c
e
r

y

c
o
n
c
l
u
y
e

c
o
n

u
n

e
j
e
m
p
l
o

d
e

c

m
o

i
m
p
r
i
m
i
r

l
o
s

c
o
n
t
e
n
i
d
o
s

d
e

u
n

c
o
m
p
o
n
e
n
t
e

J
T
a
b
l
e
.
V
a
r
i
o
s

C
o
m
p
o
n
e
n
t
e
s

p
o
r

P

g
i
n
a




C
o
m
p
o
n
e
t
e
s

M
a
y
o
r
e
s

q
u
e

u
n
a

P

g
i
n
a




I
m
p
r
i
m
i
r

u
n

C
o
m
p
o
n
e
n
t
e

J
T
a
b
l
e




I
m
p
r
i
m
i
r

u
n

I
n
f
o
r
m
e

d
e

V
e
n
t
a
s




V
a
r
i
o
s

C
o
m
p
o
n
e
n
t
e
s

p
o
r

P

g
i
n
a
H
a
y

v
e
c
e
s

c
u
a
n
d
o

i
m
p
r
i
m
i
m
o
s

u
n

c
o
m
p
o
n
e
n
t
e

e
n

u
n
a

p

g
i
n
a

q
u
e

n
o

s
e

c
u
b
r
e

l
a
s

n
e
c
e
s
i
d
a
d
e
s

d
e

i
m
p
r
e
s
i

n

q
u
e

q
u
e
r
e
m
o
s
.

P
o
r

e
j
e
m
p
l
o
,

p
o
d
r

a
m
o
s

q
u
e
r
e
n

i
n
c
l
u
i
r

u
n
a

c
a
b
e
c
e
r
a

o
u
n

p
i
e

e
n

c
a
d
a

p

g
i
n
a

d
e

i
m
p
r
e
s
i

n

c
o
n

u
n

n

m
e
r
o

d
e

p

g
i
n
a

-
-

a
l
g
o

q
u
e

n
o

e
s

n
e
c
e
s
a
r
i
o

m
o
s
t
r
a
r

e
n

l
a

p
a
n
t
a
l
l
a
.
D
e
s
a
f
o
r
t
u
n
a
d
a
m
e
n
t
e
,

i
m
p
r
i
m
i
r

m

l
t
i
p
l
e
s

c
o
m
p
o
n
e
n
t
e
s

s
o
b
r
e

u
n
a

p

g
i
n
a

n
o

e
s

t

n

s
e
n
c
i
l
l
o

c
o
m
o

a

a
d
i
r

l
l
a
m
a
d
a
s

a

p
a
i
n
t

p
o
r
q
u
e

c
a
d
a

l
l
a
m
a
d
a

s
o
b
r
e
e
s
c
r
i
b
e

l
a

s
a
l
i
d
a

d
e

l
a

l
l
a
m
a
d
a
a
n
t
e
r
i
o
r
.
L
a

c
l
a
v
e

p
a
r
a

i
m
p
r
i
m
i
r

m

s

d
e

u
n

c
o
m
p
o
n
e
n
t
e

e
n

u
n

p

g
i
n
a
,

e
s

u
s
a
r

l
o
s

m

t
o
d
o
s

t
r
a
n
s
l
a
t
e
(
d
o
u
b
l
e
,

d
o
u
b
l
e
)

y

s
e
t
C
l
i
p

d
e

l
a

c
l
a
s
e

G
r
a
p
h
i
c
s
2
D
.
E
l

m

t
o
d
o

t
r
a
n
s
l
a
t
e

m
u
e
v
e

u
n

l

p
i
z

i
m
a
g
i
n
a
r
i
o

a

l
a

s
i
g
u
i
e
n
t
e

p
o
s
i
c
i

n

d
e

l
a

s
a
l
i
d
a

d
e

i
m
p
r
e
s
i

n

d
o
n
d
e

e
l

c
o
m
p
o
n
e
n
t
e

p
u
e
d
e

s
e
r

d
i
b
u
j
a
d
o

y

l
u
e
g
o

i
m
p
r
i
m
i
d
o
.

H
a
y

d
o
s

m

t
o
d
o
s
t
r
a
n
s
l
a
t
e

e
n

l
a

c
l
a
s
e

G
r
a
p
h
i
c
s
2
D
.

P
a
r
a

i
m
p
r
i
m
i
r

m

l
t
i
p
l
e
s

c
o
m
p
o
n
e
n
t
e
s

n
e
c
e
s
i
t
a
m
o
s

e
l

q
u
e

t
o
m
a

d
o
s

a
r
g
u
m
e
n
t
o
s

d
o
u
b
l
e

p
o
r
q
u
e

e
s
t
e

m

t
o
d
o

p
e
r
m
i
t
e

p
o
s
i
c
o
n
a
m
i
e
n
t
o

r
e
l
a
t
i
v
o
.
D
e
b
e
m
o
s

a
s
e
g
u
r
a
r
n
o
s

d
e

f
o
r
z
a
r

c
u
a
l
q
u
i
e
r

v
a
l
o
r

e
n
t
e
r
o

a

d
o
u
b
l
e

o

f
l
o
a
t
.

E
l

p
o
s
i
c
i
o
n
a
m
i
e
n
t
o

r
e
l
a
t
i
v
o

e
n

e
s
t
e

c
o
n
t
e
x
t
o

s
i
g
n
i
f
i
c
a

q
u
e

l
a
s

l
l
a
m
a
d
a
s

a
n
t
e
r
i
o
r
e
s

a

t
r
a
n
s
l
a
t
e

s
o
n

t
e
n
i
d
a
s

e
n
c
u
e
n
t
a

c
u
a
n
d
o

s
e

c
a
l
q
u
l
a

e
l

n
u
e
v
o

p
u
n
t
o

d
e

t
r
a
s
l
a
d
o
.
E
l

m

t
o
d
o

s
e
t
C
l
i
p

s
e

u
s
a

p
a
r
a

r
e
s
t
r
i
n
g
i
r

q
u
e

e
l

c
o
m
p
o
n
e
n
t
e

s
e
a

p
i
n
t
a
d
o
,

y

p
o
r

l
o

t
a
n
t
o
,

i
m
p
r
i
m
i
d
o
,

e
n

e
l

r
e
a

e
s
p
e
c
i
f
i
c
a
d
a
.

E
s
t
o

n
o
s

p
e
r
m
i
t
e

i
m
p
r
i
m
i
r

m

l
t
i
p
l
e
s

c
o
m
p
o
n
e
n
t
e
s

e
n
u
n
a

p

g
i
n
a

m
o
v
i
e
n
d
o

e
l

l

p
i
z

i
m
a
g
i
n
a
r
i
o

a

d
i
f
e
r
e
n
t
e
s

p
u
n
t
o
s

d
e

l
a

p

g
i
n
a

y

l
u
e
g
o

p
i
n
t

n
d
o

c
a
d
a

c
o
m
p
o
n
e
n
t
e

e
n

e
l

r
e
a

r
e
c
o
r
t
a
d
a
.
E
j
e
m
p
l
o
P
o
d
e
m
o
s

r
e
e
m
p
l
a
z
a
r

e
l

m

t
o
d
o

p
r
i
n
t

d
e

l
o
s

e
j
e
m
p
l
o
s

p
r
i
n
t
b
u
t
t
o
n
.
j
a
v
a
A
b
s
t
r
a
c
t

W
i
n
d
o
w

T
o
o
l
k
i
t

(
A
W
T
)

y

S
w
i
n
g

c
o
n

e
l

s
i
g
u
i
e
n
t
e

c

d
i
g
o

p
a
r
a

a

a
d
i
r

u
n

m
e
n
s
a
j
e

e
n

e
l

p
i
e

d
e

p

g
i
n
a
d
e
C
o
m
p
a
n
y

C
o
n
f
i
d
e
n
t
i
a
l
.
p
u
b
l
i
c

i
n
t

p
r
i
n
t
(
G
r
a
p
h
i
c
s

g
,

P
a
g
e
F
o
r
m
a
t

p
f
,

i
n
t

p
i
)

















t
h
r
o
w
s

P
r
i
n
t
e
r
E
x
c
e
p
t
i
o
n

{




i
f

(
p
i

>
=

1
)

{







r
e
t
u
r
n

P
r
i
n
t
a
b
l
e
.
N
O
_
S
U
C
H
_
P
A
G
E
;




}




G
r
a
p
h
i
c
s
2
D

g
2

=

(
G
r
a
p
h
i
c
s
2
D
)

g
;




F
o
n
t

f
=

F
o
n
t
.
g
e
t
F
o
n
t
(
"
C
o
u
r
i
e
r
"
)
;




d
o
u
b
l
e

h
e
i
g
h
t
=
p
f
.
g
e
t
I
m
a
g
e
a
b
l
e
H
e
i
g
h
t
(
)
;




d
o
u
b
l
e

w
i
d
t
h
=
p
f
.
g
e
t
I
m
a
g
e
a
b
l
e
W
i
d
t
h
(
)
;




g
2
.
t
r
a
n
s
l
a
t
e
(
p
f
.
g
e
t
I
m
a
g
e
a
b
l
e
X
(
)
,


















p
f
.
g
e
t
I
m
a
g
e
a
b
l
e
Y
(
)
)
;




g
2
.
s
e
t
C
o
l
o
r
(
C
o
l
o
r
.
b
l
a
c
k
)
;




g
2
.
d
r
a
w
S
t
r
i
n
g
(
"
C
o
m
p
a
n
y

C
o
n
f
i
d
e
n
t
i
a
l
"
,

(
i
n
t
)
w
i
d
t
h
/
2
,









(
i
n
t
)
h
e
i
g
h
t
-
g
2
.
g
e
t
F
o
n
t
M
e
t
r
i
c
s
(
)
.
g
e
t
H
e
i
g
h
t
(
)
)
;




g
2
.
t
r
a
n
s
l
a
t
e
(
0
f
,
0
f
)
;




g
2
.
s
e
t
C
l
i
p
(
0
,
0
,
(
i
n
t
)
w
i
d
t
h
,









(
i
n
t
)
(
h
e
i
g
h
t
-
g
2
.
g
e
t
F
o
n
t
M
e
t
r
i
c
s
(
)
.
g
e
t
H
e
i
g
h
t
(
)
*
2
)
)
;




p
a
i
n
t

(
g
2
)
;




r
e
t
u
r
n

P
r
i
n
t
a
b
l
e
.
P
A
G
E
_
E
X
I
S
T
S
;
}
E
n

e
l

n
u
e
v
o

m

t
o
d
o

p
r
i
n
t
,

e
l

c
o
n
t
e
x
t
o

G
r
a
p
h
i
c
s
2
D

e
s

r
e
c
o
r
t
a
d
o

a
n
t
e
s

d
e

l
l
a
m
a
r

a
l

m

t
o
d
o

p
a
i
n
t

d
e
l

p
a
d
r
e

J
B
u
t
t
o
n
.

E
s
t
o

e
v
i
t
a

q
u
e

e
l

m

t
o
d
o

J
B
u
t
t
o
n

p
a
i
n
t

s
o
b
r
e
e
s
c
r
i
b
a

e
l
b
o
t

n

d
e

l
a

p

g
i
n
a
.

E
l

m

t
o
d
o

t
r
a
n
s
l
a
t
e

s
e

u
s
a

p
a
r
a

a
p
u
n
t
a
n

e
l

m

t
o
d
o

J
B
u
t
t
o
n

p
a
i
n
t

a

q
u
e

e
m
p
i
e
z
a

e
l

p
a
i
n
t

c
o
n

u
n

d
e
s
p
l
a
z
a
m
i
e
n
t
o

d
e

0
,
0

d
e
s
d
e

l
a

p
a
r
t
e

v
i
s
i
b
l
e

d
e

l
a

p

g
i
n
a
.

e
l

r
e
a

v
i
s
i
b
l
e

y
a

e
s
t


c
a
l
c
u
l
a
d
a

m
e
d
i
a
n
t
e

u
n
a

l
l
a
m
a
d
a

a
n
t
e
r
i
o
r

a

t
r
a
n
s
l
a
t
e
:


g
2
.
t
r
a
n
s
l
a
t
e
(
p
f
.
g
e
t
I
m
a
g
e
a
b
l
e
X
(
)
,

p
f
.
g
e
t
I
m
a
g
e
a
b
l
e
Y
(
)
)
;
P
a
r
a

m

s

c
o
m
p
o
n
e
n
t
e
s
,

p
o
d
r

a
m
o
s

n
e
c
e
s
i
t
a
r

c
o
n
f
i
g
u
r
a
r

e
l

c
o
l
o
r

d
e

f
o
n
d
o

p
a
r
a

v
e
r

l
o
s

r
e
s
u
l
t
a
d
o
s
.

E
n

e
s
t
e

e
j
e
m
p
l
o

e
l

c
o
l
o
r

d
e

t
e
x
t
o

s
e

i
m
p
r
i
m
i


e
n

n
e
g
r
o
.
M

t
o
d
o
s

t
i
l
e
s

p
a
r
a

L
l
a
m
a
r

e
n

e
l

M

t
o
d
o

p
r
i
n
t
L
o
s

s
i
g
u
i
e
n
t
e
s

m

t
o
d
o
s

s
o
n

t
i
l
e
s

p
a
r
a

c
a
l
c
u
l
a
r

e
l

n

m
e
r
o

d
e

p

g
i
n
a
s

r
e
q
u
e
r
i
d
a
s

y

p
a
r
a

h
a
c
e
r

q
u
e

u
n

c
o
m
p
o
n
e
n
t
e

s
e

r
e
d
u
z
c
a

h
a
s
t
a

e
n
t
r
a
r

e
n

u
n
a

p

g
i
n
a
:
M

t
o
d
o
s

P
a
g
e
F
o
r
m
a
t
:
g
e
t
I
m
a
g
e
a
b
l
e
H
e
i
g
h
t
(
)
d
e
v
u
e
l
v
e

l
a

a
l
t
u
r
a

d
e

l
a

p

g
i
n
a

q
u
e

p
o
d
e
m
o
s

u
s
a
r

p
a
r
a

i
m
p
r
i
m
i
r

l
a

s
a
l
i
d
a
.
g
e
t
I
m
a
g
e
a
b
l
e
W
i
d
t
h
(
)
d
e
v
u
e
l
v
e

l
a

a
n
c
h
u
r
a

d
e

l
a

p

g
i
n
a

q
u
e

p
o
d
e
m
o
s

u
s
a
r

p
a
r
a

i
m
p
r
i
m
i
r

l
a

s
a
l
i
d
a
.
M

t
o
d
o

G
r
a
p
h
i
c
s
2
D
:
s
c
a
l
e
(
x
r
a
t
i
o
,

y
r
a
t
i
o
)
e
s
c
a
l
a

e
l

c
o
n
e
x
t
o

g
r

f
i
c
o

2
D

a

e
s
t
e

t
a
m
a

o
.

U
n

r
a
t

o

d
e

u
n
o

m
a
n
t
i
e
n
e

e
l

t
a
m
a

o
,

m
e
n
o
s

d
e

u
n
o

r
e
d
u
c
e

e
l

t
a
m
a

o

d
e
l

c
o
n
t
e
x
t
o

g
r

f
i
c
o
.
C
o
m
p
o
n
e
n
t
e
s

M
a
y
o
r
e
s

d
e

u
n
a

P

g
i
n
a
E
l

A
P
I

d
e

i
m
p
r
e
s
i

n

d
e

J
a
v
a

"

t
i
e
n
e

u
n

A
P
I

B
o
o
k

q
u
e

p
r
o
p
o
r
c
i
o
n
a

e
l

c
o
n
c
e
p
t
o

d
e

p

g
i
n
a
s
.

S
i
n

e
m
b
a
r
g
o
,

e
s
t
e

A
P
I

s

l
o

a

a
d
e

o
b
j
e
t
o
s

p
r
i
n
t
a
b
l
e
s

a

u
n
a

c
o
l
e
c
c
i

n
d
e

o
b
j
e
t
o
s

p
r
i
n
t
a
b
l
e
s
.
N
o

c
a
l
c
u
l
a

l
a
s

r
u
p
t
u
r
a
s

d
e

p

g
i
n
a

n
i

e
x
p
a
n
d
e

c
o
m
p
o
n
e
n
t
e
s

s
o
b
r
e

m

l
t
i
p
l
e
s

p

g
i
n
a
s
C
u
a
n
d
o

i
m
p
r
i
m
i
m
o
s

u
n

s

l
o

c
o
m
p
o
n
e
n
t
e

e
n

u
n
a

p

g
i
n
a
,

s

l
o

t
e
n
e
m
o
s

q
u
e

c
h
e
q
u
e
a
r

q
u
e

e
l

v
a
l
o
r

d
e
l

n
d
i
c
e

e
s

m
a
y
o
r

o

i
g
u
a
l

q
u
e

u
n
o

y

d
e
v
o
l
v
e
r

N
O
_
S
U
C
H
_
P
A
G
E

c
u
a
n
d
o

s
e
a
l
c
a
n
z
a

e
s
t
e

v
a
l
o
r
.
P
a
r
a

i
m
p
r
i
m
i
r

m
u
l
t
i
p
l
e
s

p

g
i
n
a
s
,

t
e
n
e
m
o
s

q
u
e

c
a
l
c
u
l
a
r

e
l

n

m
e
r
o

d
e

p

g
i
n
a
s

n
e
c
e
s
a
r
i
a
s

p
a
r
a

c
o
n
t
e
n
e
r

e
l

c
o
m
p
o
n
e
n
t
e
.

P
o
d
e
m
o
s

c
a
l
c
u
l
a
r

e
l

n

m
e
r
o

t
o
t
a
l

d
e

p

g
i
n
a
s

n
e
c
e
s
a
r
i
a
s
d
i
v
i
d
i
e
n
d
o

e
l

e
s
p
a
c
i
o

o
c
u
p
a
d
o

p
o
r

e
l

c
o
m
p
o
n
e
n
t
e

p
o
r

e
l

v
a
l
o
r

d
e
v
u
e
l
t
o

p
o
r

e
l

m

t
o
d
o

g
e
t
I
m
a
g
e
a
b
l
e
H
e
i
g
h
t
.

U
n
a

v
e
z

c
a
l
c
u
l
a
d
o

e
l

n

m
e
r
o

t
o
t
a
l

d
e

p

g
i
n
a
s
,

p
o
d
e
m
o
s

e
j
e
c
u
t
a
r

e
l
s
i
g
u
i
e
n
t
e

c
h
e
q
u
e
o

d
e
n
t
r
o

d
e
l

m

t
o
d
o

p
r
i
n
t
:


i
f

(
p
a
g
e
I
n
d
e
x

>
=
T
o
t
a
l
P
a
g
e
s
)

{








r
e
t
u
r
n

N
O
_
S
U
C
H
_
P
A
G
E
;


}
E
l

m
a
r
c
o

d
e

t
r
a
b
a
j
o

d
e

i
m
p
r
e
s
i

n

l
l
a
m
a

a
l

m

t
o
d
o

p
r
i
n
t

m
u
l
t
i
p
l
e
s

v
e
c
e
s

h
a
s
t
a

q
u
e

p
a
g
e
I
n
d
e
x

s
e
a

m
e
n
o
r

o

i
g
u
a
l

q
u
e

T
o
t
a
l
P
a
g
e
s
.

T
o
d
o

l
o

q
u
e

n
e
c
e
s
i
t
a
m
o
s

h
a
c
e
r

e
s

c
r
e
a
r

u
n
a
n
u
e
v
a

p

g
i
n
a

p
a
r
a

d
e
l

m
i
s
m
o

c
o
m
p
o
n
e
n
t
e

e
n
c
a
d
a

b
u
c
l
e

p
r
i
n
t
.

E
s
t
o

s
e

p
u
e
d
e

h
a
c
e
r

t
r
a
t
a
n
d
o

l
a

p

g
i
n
a

i
m
p
r
e
s
a

c
o
m
o

u
n
a

v
e
n
t
a
n
a

d
e
s
l
i
z
a
n
t
e

s
o
b
r
e

e
l

c
o
m
p
o
n
e
n
t
e
.

L
a

p
a
r
t
e

d
e
l
c
o
m
p
o
n
e
n
t
e

q
u
e

s
e

e
s
t


i
m
p
r
i
m
i
e
n
d
o

e
s

s
e
l
e
c
c
i
o
n
a
d
a

p
o
r

u
n
a

l
l
a
m
a
d
a

a

t
r
a
n
s
l
a
t
e

p
a
r
a

m
a
r
c
a
r

l
a

p
a
r
t
e

s
u
p
e
r
i
o
r

d
e

l
a

p

g
i
n
a

y

u
n
a

l
l
a
m
a

a

s
e
t
C
l
i
p

p
a
r
a

m
a
r
c
a
r

l
a

p
a
r
t
e

i
n
f
e
r
i
o
r

d
e
l
a

p

g
i
n
a
.

e
l

s
i
g
u
i
e
n
t
e

d
i
a
g
r
a
m
a

i
l
u
s
t
r
a

e
s
t
e

p
r
o
c
e
s
o
.
E
l

l
a
d
o

i
z
q
u
i
e
r
d
o

d
e
l

d
i
a
g
r
a
m
a

r
e
p
r
e
s
e
n
t
a

l
a

p

g
i
n
a

e
n
v
i
a
d
a

a

l
a

i
m
p
r
e
s
o
r
a
.

E
l

l
a
d
o

L
E
F
T

c
o
n
t
i
e
n
e

l
a

l
o
n
g
i
t
u
d

d
e
l

c
o
m
p
o
n
e
n
t
e

q
u
e

e
s
t


s
i
e
n
d
o

i
m
p
r
i
m
i
d
o

e
n

e
l

m

t
o
d
o

p
r
i
n
t
.

L
a
p
r
i
m
e
r
a

p

g
i
n
a

p
u
e
d
e

s
e
r

r
e
p
r
e
s
e
n
t
a
d
a

d
e

e
s
t
a

f
o
r
m
a
:
L
u
e
g
o

l
a

v
e
n
t
a
n
a

d
e

l
a

p

g
i
n
a

i
m
p
r
e
s
a

s
e

d
e
s
l
i
z
a

a

l
o

l
a
r
g
o

d
e
l

c
o
m
p
o
n
e
n
t
e

p
a
r
a

i
m
p
r
i
m
i
r

l
a

s
e
g
u
n
d
a

p

g
i
n
a
,

c
o
n

e
l

n
d
i
c
e

u
n
o
.
E
s
t
e

p
r
o
c
e
s
o

c
o
n
t
i
n

a

h
a
s
t
a

q
u
e

s
e

a
l
c
a
n
z
a

l
a

l
t
i
m
a

p

g
i
n
a
.
I
m
p
r
i
m
i
r

u
n

C
o
m
p
o
n
e
n
t
e

J
T
a
b
l
e
L
a

c
l
a
s
e

R
e
p
o
r
t
.
j
a
v
a

u
s
a

m
u
c
h
o
s

d
e

t

c
n
i
c
a
s

a
v
a
n
z
a
d
a
s

c
u
b
i
e
r
t
a
s

e
n

e
s
t
a

s
e
c
c
i

n

p
a
r
a

i
m
p
r
i
m
i
r

l
o
s

d
a
t
o
s

y

l
a

c
a
b
e
c
e
r
a

d
e

u
n

c
o
m
p
o
n
e
n
t
e

J
T
a
b
l
e

q
u
e

e
x
p
a
n
d
e

m
u
c
h
a
s

p

g
i
n
a
s
.

L
a
s
a
l
i
d
a

d
e

i
m
p
r
e
s
i

n

t
a
m
b
i

n

i
n
l
c
u
y
e

u
n

p
i


d
e

p

g
i
n
a

c
o
n

e
l

n

m
e
r
o

d
e

s
t
a
.
E
s
t
e

d
i
a
g
r
a
m
a

m
u
e
s
t
r
a

c
o
m
o

s
e
r

a

l
a

i
m
p
r
e
s
i

n
:
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
*
;
i
m
p
o
r
t

j
a
v
a
x
.
s
w
i
n
g
.
t
a
b
l
e
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
p
r
i
n
t
.
*
;
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
e
v
e
n
t
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
g
e
o
m
.
*
;
i
m
p
o
r
t

j
a
v
a
.
a
w
t
.
D
i
m
e
n
s
i
o
n
;
p
u
b
l
i
c

c
l
a
s
s

R
e
p
o
r
t

i
m
p
l
e
m
e
n
t
s

P
r
i
n
t
a
b
l
e
{


J
F
r
a
m
e

f
r
a
m
e
;


J
T
a
b
l
e

t
a
b
l
e
V
i
e
w
;


p
u
b
l
i
c

R
e
p
o
r
t
(
)

{




f
r
a
m
e

=

n
e
w

J
F
r
a
m
e
(
"
S
a
l
e
s

R
e
p
o
r
t
"
)
;




f
r
a
m
e
.
a
d
d
W
i
n
d
o
w
L
i
s
t
e
n
e
r
(
n
e
w

W
i
n
d
o
w
A
d
a
p
t
e
r
(
)

{




p
u
b
l
i
c

v
o
i
d

w
i
n
d
o
w
C
l
o
s
i
n
g
(
W
i
n
d
o
w
E
v
e
n
t

e
)

{






S
y
s
t
e
m
.
e
x
i
t
(
0
)
;
}
}
)
;




f
i
n
a
l

S
t
r
i
n
g
[
]

h
e
a
d
e
r
s

=

{
"
D
e
s
c
r
i
p
t
i
o
n
"
,

"
o
p
e
n

p
r
i
c
e
"
,









"
l
a
t
e
s
t

p
r
i
c
e
"
,

"
E
n
d

D
a
t
e
"
,

"
Q
u
a
n
t
i
t
y
"
}
;




f
i
n
a
l

O
b
j
e
c
t
[
]
[
]

d
a
t
a

=

{








{
"
B
o
x

o
f

B
i
r
o
s
"
,

"
1
.
0
0
"
,

"
4
.
9
9
"
,

n
e
w

D
a
t
e
(
)
,











n
e
w

I
n
t
e
g
e
r
(
2
)
}
,








{
"
B
l
u
e

B
i
r
o
"
,

"
0
.
1
0
"
,

"
0
.
1
4
"
,

n
e
w

D
a
t
e
(
)
,











n
e
w

I
n
t
e
g
e
r
(
1
)
}
,








{
"
l
e
g
a
l

p
a
d
"
,

"
1
.
0
0
"
,

"
2
.
4
9
"
,

n
e
w

D
a
t
e
(
)
,











n
e
w

I
n
t
e
g
e
r
(
1
)
}
,








{
"
t
a
p
e
"
,

"
1
.
0
0
"
,

"
1
.
4
9
"
,

n
e
w

D
a
t
e
(
)
,











n
e
w

I
n
t
e
g
e
r
(
1
)
}
,








{
"
s
t
a
p
l
e
r
"
,

"
4
.
0
0
"
,

"
4
.
4
9
"
,

n
e
w

D
a
t
e
(
)
,











n
e
w

I
n
t
e
g
e
r
(
1
)
}
,








{
"
l
e
g
a
l

p
a
d
"
,

"
1
.
0
0
"
,

"
2
.
2
9
"
,

n
e
w

D
a
t
e
(
)
,











n
e
w

I
n
t
e
g
e
r
(
5
)
}




}
;




T
a
b
l
e
M
o
d
e
l

d
a
t
a
M
o
d
e
l

=

n
e
w

A
b
s
t
r
a
c
t
T
a
b
l
e
M
o
d
e
l
(
)

{








p
u
b
l
i
c

i
n
t

g
e
t
C
o
l
u
m
n
C
o
u
n
t
(
)

{











r
e
t
u
r
n

h
e
a
d
e
r
s
.
l
e
n
g
t
h
;

}








p
u
b
l
i
c

i
n
t

g
e
t
R
o
w
C
o
u
n
t
(
)

{

r
e
t
u
r
n

d
a
t
a
.
l
e
n
g
t
h
;
}








p
u
b
l
i
c

O
b
j
e
c
t

g
e
t
V
a
l
u
e
A
t
(
i
n
t

r
o
w
,

i
n
t

c
o
l
)

{
















r
e
t
u
r
n

d
a
t
a
[
r
o
w
]
[
c
o
l
]
;
}








p
u
b
l
i
c

S
t
r
i
n
g

g
e
t
C
o
l
u
m
n
N
a
m
e
(
i
n
t

c
o
l
u
m
n
)

{
















r
e
t
u
r
n

h
e
a
d
e
r
s
[
c
o
l
u
m
n
]
;
}








p
u
b
l
i
c

C
l
a
s
s

g
e
t
C
o
l
u
m
n
C
l
a
s
s
(
i
n
t

c
o
l
)

{
















r
e
t
u
r
n

g
e
t
V
a
l
u
e
A
t
(
0
,
c
o
l
)
.
g
e
t
C
l
a
s
s
(
)
;
}








p
u
b
l
i
c

b
o
o
l
e
a
n

i
s
C
e
l
l
E
d
i
t
a
b
l
e
(
i
n
t

r
o
w
,

i
n
t

c
o
l
)

{
















r
e
t
u
r
n

(
c
o
l
=
=
1
)
;
}








p
u
b
l
i
c

v
o
i
d

s
e
t
V
a
l
u
e
A
t
(
O
b
j
e
c
t

a
V
a
l
u
e
,

i
n
t

r
o
w
,























i
n
t

c
o
l
u
m
n
)

{
















d
a
t
a
[
r
o
w
]
[
c
o
l
u
m
n
]

=

a
V
a
l
u
e
;







}





}
;





t
a
b
l
e
V
i
e
w

=

n
e
w

J
T
a
b
l
e
(
d
a
t
a
M
o
d
e
l
)
;





J
S
c
r
o
l
l
P
a
n
e

s
c
r
o
l
l
p
a
n
e

=

n
e
w

J
S
c
r
o
l
l
P
a
n
e
(
t
a
b
l
e
V
i
e
w
)
;





s
c
r
o
l
l
p
a
n
e
.
s
e
t
P
r
e
f
e
r
r
e
d
S
i
z
e
(
n
e
w

D
i
m
e
n
s
i
o
n
(
5
0
0
,

8
0
)
)
;





f
r
a
m
e
.
g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
s
e
t
L
a
y
o
u
t
(















n
e
w

B
o
r
d
e
r
L
a
y
o
u
t
(
)
)
;





f
r
a
m
e
.
g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(















B
o
r
d
e
r
L
a
y
o
u
t
.
C
E
N
T
E
R
,
s
c
r
o
l
l
p
a
n
e
)
;





f
r
a
m
e
.
p
a
c
k
(
)
;





J
B
u
t
t
o
n

p
r
i
n
t
B
u
t
t
o
n
=

n
e
w

J
B
u
t
t
o
n
(
)
;





p
r
i
n
t
B
u
t
t
o
n
.
s
e
t
T
e
x
t
(
"
p
r
i
n
t

m
e
!
"
)
;





f
r
a
m
e
.
g
e
t
C
o
n
t
e
n
t
P
a
n
e
(
)
.
a
d
d
(















B
o
r
d
e
r
L
a
y
o
u
t
.
S
O
U
T
H
,
p
r
i
n
t
B
u
t
t
o
n
)
;





/
/

f
o
r

f
a
s
t
e
r

p
r
i
n
t
i
n
g

t
u
r
n

d
o
u
b
l
e

b
u
f
f
e
r
i
n
g

o
f
f





R
e
p
a
i
n
t
M
a
n
a
g
e
r
.
c
u
r
r
e
n
t
M
a
n
a
g
e
r
(








f
r
a
m
e
)
.
s
e
t
D
o
u
b
l
e
B
u
f
f
e
r
i
n
g
E
n
a
b
l
e
d
(
f
a
l
s
e
)
;





p
r
i
n
t
B
u
t
t
o
n
.
a
d
d
A
c
t
i
o
n
L
i
s
t
e
n
e
r
(

n
e
w

A
c
t
i
o
n
L
i
s
t
e
n
e
r
(
)
{








p
u
b
l
i
c

v
o
i
d

a
c
t
i
o
n
P
e
r
f
o
r
m
e
d
(
A
c
t
i
o
n
E
v
e
n
t

e
v
t
)

{










P
r
i
n
t
e
r
J
o
b

p
j
=
P
r
i
n
t
e
r
J
o
b
.
g
e
t
P
r
i
n
t
e
r
J
o
b
(
)
;










p
j
.
s
e
t
P
r
i
n
t
a
b
l
e
(
R
e
p
o
r
t
.
t
h
i
s
)
;










p
j
.
p
r
i
n
t
D
i
a
l
o
g
(
)
;










t
r
y
{













p
j
.
p
r
i
n
t
(
)
;










}
c
a
t
c
h

(
E
x
c
e
p
t
i
o
n

P
r
i
n
t
E
x
c
e
p
t
i
o
n
)

{
}










}








}
)
;








f
r
a
m
e
.
s
e
t
V
i
s
i
b
l
e
(
t
r
u
e
)
;





}





p
u
b
l
i
c

i
n
t

p
r
i
n
t
(
G
r
a
p
h
i
c
s

g
,

P
a
g
e
F
o
r
m
a
t

p
a
g
e
F
o
r
m
a
t
,









i
n
t

p
a
g
e
I
n
d
e
x
)

t
h
r
o
w
s

P
r
i
n
t
e
r
E
x
c
e
p
t
i
o
n

{








G
r
a
p
h
i
c
s
2
D


g
2

=

(
G
r
a
p
h
i
c
s
2
D
)

g
;








g
2
.
s
e
t
C
o
l
o
r
(
C
o
l
o
r
.
b
l
a
c
k
)
;








i
n
t

f
o
n
t
H
e
i
g
h
t
=
g
2
.
g
e
t
F
o
n
t
M
e
t
r
i
c
s
(
)
.
g
e
t
H
e
i
g
h
t
(
)
;








i
n
t

f
o
n
t
D
e
s
e
n
t
=
g
2
.
g
e
t
F
o
n
t
M
e
t
r
i
c
s
(
)
.
g
e
t
D
e
s
c
e
n
t
(
)
;








/
/
l
e
a
v
e

r
o
o
m

f
o
r

p
a
g
e

n
u
m
b
e
r








d
o
u
b
l
e

p
a
g
e
H
e
i
g
h
t

=











p
a
g
e
F
o
r
m
a
t
.
g
e
t
I
m
a
g
e
a
b
l
e
H
e
i
g
h
t
(
)
-
f
o
n
t
H
e
i
g
h
t
;








d
o
u
b
l
e

p
a
g
e
W
i
d
t
h

=











p
a
g
e
F
o
r
m
a
t
.
g
e
t
I
m
a
g
e
a
b
l
e
W
i
d
t
h
(
)
;








d
o
u
b
l
e

t
a
b
l
e
W
i
d
t
h

=

(
d
o
u
b
l
e
)











t
a
b
l
e
V
i
e
w
.
g
e
t
C
o
l
u
m
n
M
o
d
e
l
(










)
.
g
e
t
T
o
t
a
l
C
o
l
u
m
n
W
i
d
t
h
(
)
;








d
o
u
b
l
e

s
c
a
l
e

=

1
;









i
f

(
t
a
b
l
e
W
i
d
t
h

>
=

p
a
g
e
W
i
d
t
h
)

{
















s
c
a
l
e

=


p
a
g
e
W
i
d
t
h

/

t
a
b
l
e
W
i
d
t
h
;








}








d
o
u
b
l
e

h
e
a
d
e
r
H
e
i
g
h
t
O
n
P
a
g
e
=

















t
a
b
l
e
V
i
e
w
.
g
e
t
T
a
b
l
e
H
e
a
d
e
r
(

















)
.
g
e
t
H
e
i
g
h
t
(
)
*
s
c
a
l
e
;








d
o
u
b
l
e

t
a
b
l
e
W
i
d
t
h
O
n
P
a
g
e
=
t
a
b
l
e
W
i
d
t
h
*
s
c
a
l
e
;








d
o
u
b
l
e

o
n
e
R
o
w
H
e
i
g
h
t
=
(
t
a
b
l
e
V
i
e
w
.
g
e
t
R
o
w
H
e
i
g
h
t
(
)
+






















t
a
b
l
e
V
i
e
w
.
g
e
t
R
o
w
M
a
r
g
i
n
(
)
)
*
s
c
a
l
e
;








i
n
t

n
u
m
R
o
w
s
O
n
A
P
a
g
e
=














(
i
n
t
)
(
(
p
a
g
e
H
e
i
g
h
t
-
h
e
a
d
e
r
H
e
i
g
h
t
O
n
P
a
g
e
)
/


































o
n
e
R
o
w
H
e
i
g
h
t
)
;








d
o
u
b
l
e

p
a
g
e
H
e
i
g
h
t
F
o
r
T
a
b
l
e
=
o
n
e
R
o
w
H
e
i
g
h
t
*




































n
u
m
R
o
w
s
O
n
A
P
a
g
e
;








i
n
t

t
o
t
a
l
N
u
m
P
a
g
e
s
=















(
i
n
t
)
M
a
t
h
.
c
e
i
l
(
(
















(
d
o
u
b
l
e
)
t
a
b
l
e
V
i
e
w
.
g
e
t
R
o
w
C
o
u
n
t
(
)
)
/




































n
u
m
R
o
w
s
O
n
A
P
a
g
e
)
;








i
f
(
p
a
g
e
I
n
d
e
x
>
=
t
o
t
a
l
N
u
m
P
a
g
e
s
)

{






















r
e
t
u
r
n

N
O
_
S
U
C
H
_
P
A
G
E
;








}








g
2
.
t
r
a
n
s
l
a
t
e
(
p
a
g
e
F
o
r
m
a
t
.
g
e
t
I
m
a
g
e
a
b
l
e
X
(
)
,
























p
a
g
e
F
o
r
m
a
t
.
g
e
t
I
m
a
g
e
a
b
l
e
Y
(
)
)
;
/
/
b
o
t
t
o
m

c
e
n
t
e
r








g
2
.
d
r
a
w
S
t
r
i
n
g
(
"
P
a
g
e
:

"
+
(
p
a
g
e
I
n
d
e
x
+
1
)
,












(
i
n
t
)
p
a
g
e
W
i
d
t
h
/
2
-
3
5
,

(
i
n
t
)
(
p
a
g
e
H
e
i
g
h
t












+
f
o
n
t
H
e
i
g
h
t
-
f
o
n
t
D
e
s
e
n
t
)
)
;








g
2
.
t
r
a
n
s
l
a
t
e
(
0
f
,
h
e
a
d
e
r
H
e
i
g
h
t
O
n
P
a
g
e
)
;








g
2
.
t
r
a
n
s
l
a
t
e
(
0
f
,
-
p
a
g
e
I
n
d
e
x
*
p
a
g
e
H
e
i
g
h
t
F
o
r
T
a
b
l
e
)
;








/
/
I
f

t
h
i
s

p
i
e
c
e

o
f

t
h
e

t
a
b
l
e

i
s

s
m
a
l
l
e
r









/
/
t
h
a
n

t
h
e

s
i
z
e

a
v
a
i
l
a
b
l
e
,








/
/
c
l
i
p

t
o

t
h
e

a
p
p
r
o
p
r
i
a
t
e

b
o
u
n
d
s
.








i
f

(
p
a
g
e
I
n
d
e
x

+

1

=
=

t
o
t
a
l
N
u
m
P
a
g
e
s
)

{











i
n
t

l
a
s
t
R
o
w
P
r
i
n
t
e
d

=


















n
u
m
R
o
w
s
O
n
A
P
a
g
e

*

p
a
g
e
I
n
d
e
x
;











i
n
t

n
u
m
R
o
w
s
L
e
f
t

=


















t
a
b
l
e
V
i
e
w
.
g
e
t
R
o
w
C
o
u
n
t
(
)


















-

l
a
s
t
R
o
w
P
r
i
n
t
e
d
;











g
2
.
s
e
t
C
l
i
p
(
0
,














(
i
n
t
)
(
p
a
g
e
H
e
i
g
h
t
F
o
r
T
a
b
l
e

*

p
a
g
e
I
n
d
e
x
)
,













(
i
n
t
)

M
a
t
h
.
c
e
i
l
(
t
a
b
l
e
W
i
d
t
h
O
n
P
a
g
e
)
,













(
i
n
t
)

M
a
t
h
.
c
e
i
l
(
o
n
e
R
o
w
H
e
i
g
h
t

*
































n
u
m
R
o
w
s
L
e
f
t
)
)
;








}








/
/
e
l
s
e

c
l
i
p

t
o

t
h
e

e
n
t
i
r
e

a
r
e
a

a
v
a
i
l
a
b
l
e
.








e
l
s
e
{













g
2
.
s
e
t
C
l
i
p
(
0
,














(
i
n
t
)
(
p
a
g
e
H
e
i
g
h
t
F
o
r
T
a
b
l
e
*
p
a
g
e
I
n
d
e
x
)
,














(
i
n
t
)

M
a
t
h
.
c
e
i
l
(
t
a
b
l
e
W
i
d
t
h
O
n
P
a
g
e
)
,













(
i
n
t
)

M
a
t
h
.
c
e
i
l
(
p
a
g
e
H
e
i
g
h
t
F
o
r
T
a
b
l
e
)
)
;








}








g
2
.
s
c
a
l
e
(
s
c
a
l
e
,
s
c
a
l
e
)
;








t
a
b
l
e
V
i
e
w
.
p
a
i
n
t
(
g
2
)
;








g
2
.
s
c
a
l
e
(
1
/
s
c
a
l
e
,
1
/
s
c
a
l
e
)
;








g
2
.
t
r
a
n
s
l
a
t
e
(
0
f
,
p
a
g
e
I
n
d
e
x
*
p
a
g
e
H
e
i
g
h
t
F
o
r
T
a
b
l
e
)
;








g
2
.
t
r
a
n
s
l
a
t
e
(
0
f
,

-
h
e
a
d
e
r
H
e
i
g
h
t
O
n
P
a
g
e
)
;








g
2
.
s
e
t
C
l
i
p
(
0
,

0
,










(
i
n
t
)

M
a
t
h
.
c
e
i
l
(
t
a
b
l
e
W
i
d
t
h
O
n
P
a
g
e
)
,











(
i
n
t
)
M
a
t
h
.
c
e
i
l
(
h
e
a
d
e
r
H
e
i
g
h
t
O
n
P
a
g
e
)
)
;








g
2
.
s
c
a
l
e
(
s
c
a
l
e
,
s
c
a
l
e
)
;








t
a
b
l
e
V
i
e
w
.
g
e
t
T
a
b
l
e
H
e
a
d
e
r
(
)
.
p
a
i
n
t
(
g
2
)
;








/
/
p
a
i
n
t

h
e
a
d
e
r

a
t

t
o
p








r
e
t
u
r
n

P
r
i
n
t
a
b
l
e
.
P
A
G
E
_
E
X
I
S
T
S
;



}



p
u
b
l
i
c

s
t
a
t
i
c

v
o
i
d

m
a
i
n
(
S
t
r
i
n
g
[
]

a
r
g
s
)

{








n
e
w

R
e
p
o
r
t
(
)
;



}
}
I
m
p
r
i
m
i
r

u
n

I
n
f
o
r
m
e

d
e

V
e
n
t
a
s
L
a

c
l
a
s
e

A
p
p
l
e
t
S
a
l
e
s
R
e
p
o
r
t
.
j
a
v
a

i
m
p
r
i
m
e

u
n

i
n
f
o
r
m
e

d
e

v
e
n
t
a
s

c
o
n

f
i
l
a
s

q
u
e

e
x
p

n
d
e
n

s
o
b
r
e

m

l
t
i
p
l
e
s

p

g
i
n
a
s

c
o
n

n

m
e
r
o
s

e
n

l
a

p
a
r
t
e

i
n
f
e
r
i
o
r

d
e

c
a
d
a

p

g
i
n
a
.

A
q
u


s
e

v


l
a
a
p
l
i
c
a
c
i

n

c
u
a
n
d
o

s
e

l
a
n
z
a
:
N
e
c
e
s
i
t
a
m
o
s

e
s
t
e

f
i
c
h
e
r
o

d
e

p
o
l
i
c

a

p
a
r
a

l
a
n
z
a
r

e
l

a
p
p
l
e
t
:
g
r
a
n
t

{


p
e
r
m
i
s
s
i
o
n

j
a
v
a
.
l
a
n
g
.
R
u
n
t
i
m
e
P
e
r
m
i
s
s
i
o
n


























"
q
u
e
u
e
P
r
i
n
t
J
o
b
"
;
}
;
P
a
r
a

l
a
n
z
a
r

e
l

a
p
p
l
e
t

a
s
u
m
i
e
n
d
o

u
n

f
i
c
h
e
r
o

d
e

p
o
l
i
c

a

l
l
a
m
a
d
o

p
r
i
n
t
p
o
l

y

u
n
a

p

g
i
n
a

H
T
M
L

l
l
a
m
a
d
a

S
a
l
e
s
R
e
p
o
r
t
.
h
t
m
l
,

t
e
c
l
e
a
r
e
m
o
s
:


a
p
p
l
e
t
v
i
e
w
e
r

-
J
-
D
j
a
v
a
.
s
e
c
u
r
i
t
y
.
p
o
l
i
c
y
=

















p
r
i
n
t
p
o
l

S
a
l
e
s
R
e
p
o
r
t
.
h
t
m
l
E
l

d
i
a
g
r
a
m
a

m
u
e
s
t
r
a

c

m
o

s
e

v
e
r


l
a

i
m
p
r
e
s
i

n

d
e
l

i
n
f
o
r
m
e
:
O
z
i
t
o
Depurar Applets, Aplicaciones y Servlets
Una ley no escrita de la programacin sentencia que gastatemos el 10 por cien de
nuestro tiempo en el primer 90 por ciento de un proyecto, y el otro 90 por ciento
de nuestro tiempo en el 10 por cierto restante. Esto suena igual que cualquiera de
nuestros proyectos, probablemente estamosgastando el ltimo 10 por ciento en
depuracin e integracin. Mientras que hay cantidad de libros y de gente
ayudndonos a empezar un progyecto, hay muy pocos recursor disponibles para
ayudarnos a finalizarlo.
La buena noticia es que este captulo se enfoca completamente en la depuracin, y
en evitar que nuestro proyecto se pase de tiempo. Usa ejemplos del mundo real
para pasear a travs de pasos sencillos para depurar y fijar nuestros programas.
Cuando terminemos, deberemos ser unos expertos en el seguimiento de problemas
en programas escritos en Java -- applets, aplicaciones y servlets -- de todas las
formas y tamaos.
Recolectar Evidencias
Ejecutar Tests y Anlizarlos
Depuracin de Servlet
Depuracin de Eventos AWT
Anlisis y Seguimiento de Pila
Problemas de Versiones
Tienes Prisa?
Si tienes un problema que te presiona y necesitas una respuesta ahora mismo,
esta tabla podra ayudarte. Nos dice dnde encontrar las respuestas a los
problemas ms comunes a las que podemos acudir directamente.
Problema Seccin
El programa se cuelga o bloquea Anlisis y Seguimiento de Pila
Problemas en la ejecucin del programa Ir detrs de la silla con jdb
Problemas con Java Web Server
TM
Depurador de Servlets y
Analizar y seguir Pistas
Ozito
Recoleccin de Evidencias
El primer paso para intentar resolver cualquier problema es obtener tanta
informacin como sea posible. Si podemos imagninarnos la escena de un
crimen,sabemos que todo est chequeado, catalogado y analizado antes de
alcanzar cualquier conclusin. Cuando se depura un programa, no tenemos armas,
muestras de pelo, ni huellas dactilares, pero existen cantidad de evidencias que
podemos obtener y que podran contener o apuntar a la solucin ltima. Esta
seccin explca como recoger esas evidencias.
Instalacin y Entorno
El Path de Clases
Carga de Clases
Incluir Cdigo de Depurado
Instalacin y Entorno
La plataforma Java
TM
es una tecnologa cambiante y de rpido movimiento.
Podramos tener ms de una versin instalada en nuestro sistema, y esas
versiones podran haber sido instaladas como parte de la instalacin de otros
productos. En un entorno con versiones mezcladas, un programa puede
experimentar problemas debido a los cambios de la plataforma en las nuevas
versiones.
Por ejemplo, si las clases, las libreras, o las entradas de registro de Window de
instalaciones anteriores permanecen en nuenstro sistema despus de una
actualizacin, hay una oportunidad de que la mezcla del nuevl software sea la
causante de nuestros problemas y necesita ser investigada y eliminada. Las
oportunidades para los problemas relacionados con la mezcla de versiones de
software se ha incrementado con el uso de diferentes versiones de herramientas
para desarrollar software de la plataforma Java.
La seccin sobre Problemas con Versiones al final de este captulo proporciona una
lista completa de las principales versiones de la plataforma Java para ayudarnos a
resolver nuestros problemas con versiones de software.
Path de Clases
En la plataforma Java 2, la variable de entorno CLASSPATH es necesaria para
especificar a la propia aplicacin dnde estn sus clases, y no las clases de la
plataforma Java como en versiones anteriores. Por eso es posible que nuestro
CLASSPATH apunte a las clases de la plataforma Java desde versiones anteriores
y nos cause problemas.
Para examinar el CLASSPATH, tecleamos esto en la lnea de comando:
Windows 95/98/NT:
echo %CLASSPATH%
Unix:
echo $CLASSPATH
Las clases Java se cargan en primer lugar, primera forma bsica de la lista
CLASSPATH. Si la variable CLASSPATH contiene una referencia a un fichero
lib/classes.zip, que apunta a una instalacin diferente de la plataforma Java, esto
peude causar que se cargen clases incomplatibles.
Nota: En la plataforma Java 2, las clases del sistema se eligen antes de
cualquier clases de la lista CLASSPATH para minimizar de que se
caeguen clases Java anteriores a la clase Java 2 del mismo nombre.
La variable CLASSPATH puede obtener su configuracin desde la lnea de
comandos o desde las selecciones de configuracin como aquellas especificadas en
el Entorno de Usuario sobre Windows NT, un fichero autoexec.bat, o un fichero de
arranque del shell .cshrc sobre Unix.
Podemos controlar las clases de la Mquina Virtual Java usadas para compilar
nuestros programas con una opcin especial de la lnea de comandos que nos
permite suministrar el CLASSPATH que querramos. La opcin y parmetro de la
plataforma Java 2 -Xbootclasspath classpath, y las versiones anteriores usan
-classpath classpath y -sysclasspath classpath. Sin importar la versin que
estamos ejecutando, el parmetro classpath especifica el classpath del sistema y
del usuario, y los ficheros zip o JAR a usar en la compilacin.
Para compilar y ejecutar el programa Myapp.java con un CLASSPATH
suministrado en la lnea de comandos, usamos las siguientes instrucciones:
Windows 95/98/NT:
En este ejemplo, la plataforma Java est instalada en el directorio C:\java.
Tecleamos los siguiente en una sla lnea:
javac -J-Xbootclasspath:c\java\lib\tools.jar;c:
\java\jre\lib\rt.jar;c:\java\jre\lib\i18n.jar;.
Myapp.java
No necesitamos la bandera -J para ejecutar el programa Myapp compilado, slo
tecleamos esto en una sla lnea:
java -Xbootclasspath:c:\java\jre\lib\rt.jar;c:
\java\jre\lib\i18n.jar;. Myapp
Sistemas Unix:
En este ejemplo, la plataforma Java est instalada en el directorio
/usr/local/java. Tecleamos todo en una sla lnea:
javac -J-Xbootclasspath:/usr/local/java/lib/tools.jar:
/usr/local/java/jre/lib/rt.jar:
/usr/local/java/jre/lib/i18n.jar:. Myapp.java
No necesitamos la bandera -J para ejecutar el programa Myapp compilado, slo
tecleamos esto en un sla lnea:
java -Xbootclasspath:/usr/local/java/jre/lib/rt.jar:
/usr/local/java/jre/lib/i18n.jar:. Myapp
Carga de Clases
Otra forma de analizar problemas con el CLASSPATH es localizar desde dnde
est cargando las clases nuestra aplicacin. La opcin -verbose del comando java
muestra de donde vienen los ficheros .zip o .jar cuando se carga. De esta forma,
podremos decir si vienen del fichero zip de la plataforma Java o desde algn
fichero JAR de la aplicacin.
Por ejemplo, una aplicacin podra estar usando la clase Password que escribimos
para ella o podra estar cargando la clase Password desde la herramienta IDE
instalado.
Deberasmos ver cada nombre de fichero zip o Jar como se v aqu:
$ java -verbose SalesReport
[Opened /usr/local/java/jdk1.2/solaris/jre/lib/rt.jar
in 498 ms]
[Opened /usr/local/java/jdk1.2/solaris/jre/lib/i18n.jar
in 60 ms]
[Loaded java.lang.NoClassDefFoundError from
/usr/local/java/jdk1.2/solaris/jre/lib/rt.jar]
[Loaded java.lang.Class from
/usr/local/java/jdk1.2/solaris/jre/lib/rt.jar]
[Loaded java.lang.Object from
/usr/local/java/jdk1.2/solaris/jre/lib/rt.jar]
Incluir Cdigo de Depurado
Una forma comn de aadir cdigo de diagnstico a una aplicacin es usa
sentencias System.out.println en posiciones estratgicas de la aplicacin. Esta
tcnica est bien durante el desarrollo, pero debemos acordarnos de eliminarlas
todas antes de liberar nuestro producto. Sin embargo hay otras aproximaciones
que son tan sencillas y que no afectan al rendimiento de nuestra aplicacin, y no
muestra mensajes que no queremos que vea el cliente.
Activar la Informacin de Depuracin en Tiempo de Ejecucin
La primera alternativa a las clsicas sentencias de depuracin println es activar la
informacin de depuracin en el momento de la ejecucin. Una ventaja de esto es
que no necesitamos recompilar ningn cdigo si aparecen problemas mientras
hacemos pruebase en la oficina del cliente.
Otra ventaja es que algunas veces los problemas de software pueden ser atribuidos
a condiciones de carrera donde el mismo segmento de cdigo se convierte en
impredecible debido al tiempo entre cada iteraccin del programa. Si controlamos
el cdigo de operacin desde la lnea de comandos en lugar de aadir sentencias
de depuracin println, podemos arreglar la secuencia de problemas que causa las
condiciones de carrera que vienen desde el cdigo println. Esta tcnica tambin
nos evita tener que aadir y eliminar las sentencias println y tener que recompilar
nuestro cdigo.
Esta tcnica requiere que usemos una propiedad del sistema como bandera de
depurado y que incluyamos cdigo en la aplicacin para comprobar que el valor de
esta propiedad del sistema. Para activar la informacin de depuracin desde la
lnea de comandos en el momento de la ejecucin, arrancamos la aplicacin y
seleccionamos la propiedad del sistema debug a true de esta forma:
java -Ddebug=true TestRuntime
El cdigo fuente que necesita la clase TestRuntime para examinar esta propiedad
y configurar la bandera booleana debug de es el siguiente:
public class TestRuntime {
boolean debugmode; //global flag that we test
public TestRuntime () {
String dprop=System.getProperty("debug");
if ((dprop !=null) && (dprop.equals("yes"))){
debugmode=true;
}
if (debugmode) {
System.err.println("debug mode!");
}
}
}
Crear Versiones de Depuracin y Produccin en Tiempo de
Compilacin
Como se mencion antes, un problem con la adicin de sentencias
System.out.println para depurar nuesto cdigo es que debemos eliminarlas antes
de liberar nuestro producto. Adems de aadir cdigo innecesario, las sentecias de
depuracin println pueden contener informacin que no queremos que vea el
cliente.
Una forma de eliminar las sentencias de depuracin System.out.println de
nuestro cdigo es usar la siguiente optimizacin del compilador para eleminar los
corchetes pre-determinados de nuestos cdigo en el momento de la compilazin y
activar alguna algo similar a un depurador pre-procesador.
Este ejemplo usa una bandera booleana esttica dmode que cuando se selecciona
a false resulta en la eliminacin el cdigo de depuracin y de las sentencias de
depuracin. Cuando el valor de dmode se selecciona a true, el cdigo es incluido
en el fichero class compilado y est disponible en la aplicacin para propsitos de
depuracin.
class Debug {
//set dmode to false to compile out debug code
public static final boolean dmode=true;
}
public class TestCompiletime {
if (Debug.dmode) { // These
System.err.println("Debug message"); // are
} // removed
}
Usar Mtodos de Diagnsticos
Podemos usar mtodos de diagnstico para solicitar informacin de depuracin
desde la mquina virtual Java (JVM). Los dos siguientes mtodos de la clase
Runtime siguel las llamadas a mtodos y los bytes codes de la JVM que usa
nuestra aplicacin. Como estos dos mtodos producen cantidad de informacine s
mejor seguir pequeas cantidades de cdigo, incluso tan pequeas como una lnea
a la vez.
Para permitie seguir las llamadas, tenemos que arrancan la JVM con los comandos
del intrprete java_g o java -Xdebug.
Para listar cada mtodo cuando es invocado durante la ejecucin, aadimos la
siguiente lnea antes del cdigo donde queremos empezar a seguir la pista y
aadimos la correspondiente lnea traceMethodCalls con el argumento
seleccionado a false para desactivar el seguimiento. La informacin de seguimiento
se muestra en la salida estndard.
// set boolean argument to false to disable
Runtime.getRuntime().traceMethodCalls(true);
callMyCode();
Runtime.getRuntime().traceMethodCalls(false);
Para ver cada lnea en bytecodes cuando se ejecutan, aadimos la siguiente lnea
al cdigo de nuestra aplicacin:
// set boolean argument to false to disable
Runtime.getRuntime().traceInstructions(true);
callMyCode();
Runtime.getRuntime().traceInstructions(false);
Tambin podemos aadir la siguiente lnea para que nuestra aplicacin vuelque la
pila usando el mtodo dumpStack de la clase Thread. La salida de este volcado
de pila se explica en Anlisis y Seguimiento de la Pila, pero ahora podemos pensar
en la pila como un apunte de los threads que se estn ejecutando en la JVM.
Thread.currentThread().dumpStack();
Aadir Informacin de Depurado
La informacin de variables locales no est incluida en el corazn de las clases del
sistema de la plataforma Java. Por eso, si usamos una herramienta de depuracin
para listar variables lcoales para clases del sistema donde coloquemos comandos
stop , obtendremos la siguiente salida, incluso cuando compilemos con la bandera
-g como sugiere la salida. Esta salida es de una sesin jdb:
main[1] locals
No local variables: try compiling with -g
Para obtener acceso a la informacin de variables lcoales, tenemos que obtener el
fuente (src.zip o src.jar) y recompilarlo con una bandera debug. Podemos
obtener el fuente de la mayora de las clases java.* classes con la descarga de los
binarios desde java.sun.com.
Una vez hayamos descargado el fichero src.zip o src.jar, extraemos slo los
ficheros que necesitamos. Por ejemplo, para extraer la clase String, tecleamos
esto en la lnea de comandos:
unzip /tmp/src.zip src/java/lang/String.java
o
jar -xf /tmp/src.jar src/java/lang/String.java
Recompilamos la clase o clases extraidas con la opcin -g. Tambin podemos
aadir nuestros propios diagnsticos adicionales sobre el fichero fuente en este
momento.
javac -g src/java/lang/String.java
El compilador Java 2 javac ofrece ms opciones que slo la opcin
original -g para cdigo de depuracin, y podemos reducir el tamao de
nuestras clases usando -g:none, que nos ofrece una reduccin de un
10% del tamao.
Para ejecutar la aplicacin con las nuevas clases compiladas, necesitamos usar la
opcion bootclasspath para que esas clases se utilicen en primer lugar.
Tecleamos lo siguiente en una sla lnea con espacio antes de myapp.
Plataforma Java 2 Win95/NT:
Este ejemplo asume que la plataforma Java est instalada en c:\java, y los
ficheros fuente estn en c:\java\src:
jdb -Xbootclasspath:c:\java\src;c:\java\jre\lib\rt.jar;c:
\java\jre\i18n.jar;. myapp
Sistemas Unix:
Este ejemplo asume que la plataforma Java est instalada en /usr/local/java, y
los ficheros fuente estn en /usr/local/java/src.
jdb -Xbootclasspath:/usr/java/src;
/usr/java/jre/lib/rt.jar;
/usr/java/jre/i18n.jar;. myapp
La siguiente vez que ejecutemos el comando locals veremos los campos internos
de la clase que deseamos analizar.
Ozito
Ejecutar Tests y Analizar
Si todava tenemos problemas incluso despus de haber revisado los problemas de
instalacin y de entorno y haber incluido cdigo de depuracin, es el momento de
usar herramientas para probar y analizar nuestro programa.
Trabajar Detrs de la Silla con jdb
Prueba Sencilla con jdb
Depuracin Remota
Usar Piloto Automtico
Crear un Diario de Sesin
Trabajar Detrs de la Silla con jdb
Aunque hay algunas muy buenas herramientas IDE en el mercado, la herramienta
de depuracin Java
TM
, jdb y sus sucesores tienen un papel importante que jugar en
la prueba y depuracin de programa. algunas ventajas de jdb sobre los IDE es que
es gratis, es independiente de la plataforma (algunos IDE no lo son), y se ejecuta
como un proceso separado al programa que est depurando. El beneficio de
ejecutar jdb como un proceso separado es que podemos aadir una sesin de
depurado a un programa que est ejecutndose.
El lado negativo de usar jdb es que slo hay un interface de lnea de comandos, y
trata con el mismo cdigo que estmos tratando de depurar. Esto significa que si
hay un bug enla mquina virtual Java, jdb se podra equivocar al intentar
diagnisticar el mismo bug!
La nueva arquitectura JBUG se cre para resolver estos problemas en el jdb.
JBUG, entre otras cosas, proporciona un API de ayuda de depuracin en la
mquina virtual Java llamado "Java VM Debug Interface" (JVMDI). Este ayudante
se comunica con el depurador desde el final usando el "Java Debug Wire Protocol"
(JDWP). La depuracin desde el final usa el interface remoto "Java Debug
Interface" (JDI) para enviar y recibir comando sobre el protocolo JDWP. JBug est
disponible para la plataforma Java 2, y tiene un estilo jdb que aprenderemos ms
adelante.
Prueba Sencilla con jdb
De vuelta a la clsica herramienta jdb. Aqu tenemos uno sencillos pasos para
analizar un programa usando jdb. Este primer ejemplo depura un programa de la
aplicacin startup. El ejemplo Depuracin Remota muestra como conectarlo con
una aplicacin que se est ejecutando.
Arrancar la Sesin
Para empezar una sesin de depurado, compilamos el programa
SimpleJdbTest.java con informacin completa de depurado usando javac y la
bandera -g. En este ejemplo, el programa SimpleJdbTest.java es una aplicacin
pero tambin podra ser un applet. Los procedimientos para depurar aplicaciones
son iguales que para depurar applets una que se ha empezado la sesin de
depurado.
javac -g SimpleJdbTest.java
Luego arrancamos la herramienta jdb con el nombre de la clase del programa
como parmetro:
jdb SimpleJdbTest
Initializing jdb...
0xad:class(SimpleJdbTest)
Para depurar un applet en el appletviewer usamos el parmetro -debug como en
este ejemplo:
$ appletviewer -debug MyApplet.html
Initializing jdb...
0xee2f9808:class(sun.applet.AppletViewer)
>
Seleccionar un mtodo de ruptura y mtodos de listado
En este punto, slo se ha cargado la clase SimpleJdbTest; no se ha llamado al
constructor de la clase. Para hacer que el jdb se pare cuando el programa se
inicializa por primera vez, ponemos un stop, o punto de ruptura, en el constructor
usando el comando stop in. Cuando se seleccionan puntos de ruptura, instuirmos
al jdb a ejecutar nuestro programa usando el comando run de esta forma:
stop in SimpleJdbTest.<init>
Breakpoint set in SimpleJdbTest.<init>
run
run SimpleJdbTest
running ...
main[1]
Breakpoint hit: SimpleJdbTest.<init>
(SimpleJdbTest:10)
La herramienta jdb se para en la primera lnea del constructor. Para listar los
mtodo que fueron llamados hasta llegar a este punto de ruptura, introducimos el
comando where:
main[1] where
[1] SimpleJdbTest.<init> (SimpleJdbTest:10)
[2] SimpleJdbTest.main (SimpleJdbTest:29)
Los mtodos numerados de la lista es el ltimo marco de pila que ha alcanzado la
JVM. En este caso el ltimo marco de pula es el constructor SimpleJdbTest que
fue llamado desde el SimpleJdbTest main.
Siempre que se llama a un nuevo mtodo, se sita en esta lista de pila. La
tecnologa Hotspot consigue alguna de sus ganancias de velocidad elimando un
nuevo marco de pila cuando se llama a un nuevo mtodo. Para obtener una
apreciacin general de dnde se par el cdigo, introducimos el comando list.
main[1] list
6 Panel p;
7 Button b;
8 int counter=0;
9
10 SimpleJdbTest() {
11 setSize(100,200);
12 setup();
13 }
14 void setup (){
Localizar la Fuente
Si el fuente del fichero class parado no est disponible en el path actual, podemos
decirle a jdb donde encontrar el fuente con el comando use dndole el directorio
fuente como un parmetro. En el siguiente ejemplo el fuente est un subdirectorio
o carpeta llamado book.
main[1] list
Unable to find SimpleJdbTest.java
main[1] use book
main[1] list
6 Panel p;
7 Button b[];
8 int counter=0;
9
10 => SimpleJdbTest() {
Buscar un Mtodo
Para ver que sucede en el mtodo setup de SimpleJdbText, usamos el comando
step para pasar a travs de sus 4 lneas y ver lo que pasa.
main[1] step
main[1]
Breakpoint hit: java.awt.Frame.<init> (Frame:222)
Pero espera un minuto! Este es ahora el constructor de la clase Frame! Si lo
seguimos pasaremos a travs del constructor de la clase Frame y no el de la clase
SimpleJdbText. Porque SimpleJdbTest desciende de la clase Frame, el
constructor padre, que en este caso es Frame, es llamado sin avisarnos.
El comando step up
Podramos continuar pasando y eventualmente volveramos al constructor de
SimpleJdbTest, pero para retornar inmediatamente podemos usar el comando
step up para volver al constructor de SimpleJdbTest.
main[1] step up
main[1]
Breakpoint hit: SimpleJdbTest.<init>
(SimpleJdbTest:8)
El comando next
Tambin podemos usar el comando next para obtener el mtodo setup. En este
siguiente ejemplo, la herramienta jdb ha aproximado que el fichero fuente est
fuera del constructor cuando proces el ltimo comando step up. Para volver al
constructor, usamos otro comando step, y para obtener el mtodo setup, usamos
un comando next. Para depurar el mtodo setup, podemos step (pasar) a travs
del mtodo setup.
main[1] step
Breakpoint hit: SimpleJdbTest.<init>
(SimpleJdbTest:11)
main[1] list
7 Button b[]=new Button[2];
8 int counter=0;
9
10 SimpleJdbTest() {
11 setSize(100,200);<
12 setup();
13 }
14 void setup (){
15 p=new Panel();
16 }
main[1] next
Breakpoint hit: SimpleJdbTest.<init>
(SimpleJdbTest:12)
main[1] step
Breakpoint hit: SimpleJdbTest.setup (SimpleJdbTest:15)
El comando stop in
Otra forma de obtener el mtodo setup es usar el comando stop in
SimpleJdbTest.setup. Podemos listar el fuente de nuevo para saber donde
estamos:
main[1] list
11 setSize(100,200);
12 setup();
13 }
14 void setup (){
15 => p=new Panel();
16 b[0]= new Button("press");
17 p.add(b[0]);
18 add(p);
19
El comando print
Lo primero que hace el mtodo setup es crear un Panel p. Si intentamos mostrar
el valor de p con el comando print p, veremos que este valor es null.
main[1] print p
p = null
Esto ocurre porque la lnea an no se ha ejecutado y por lo tanto al campo p no se
le ha asignado ningn valor. Necesitamos pasar sobre la sentencia de asignacin
con el comando next y luego usar de nuevo el comando print p.
main[1] next
Breakpoint hit: SimpleJdbTest.setup (SimpleJdbTest:16)
main[1] print p
p = java.awt.Panel[panel0,0,0,0x0,invalid,
layout=java.awt.FlowLayout]
Seleccionar Puntos de Ruptura en Mtodos Sobrecargado
Aunque pasar a travs de clases pequeas es rpido, como regla general en
grandes aplicaciones, es ms rpido usar puntos de ruptura. Esto es as porque jdb
tiene un conjunto de comandos muy simples y no teine atajos, por eso cada
comando teine que ser pegado o tecleado por completo.
Para seleccionar un punto de ruptura en la clase Button, usamos stop in
java.awt.Button.<init>
main[1] stop in java.awt.Button.<init>
java.awt.Button.<init> is overloaded,
use one of the following:
void <init>
void <init>java.lang.String)
El mensaje explica porque jdb no puede parar en este mtodo sin ms
informacin, pero el mensaje nos explica que slo necesitamos ser explcitos en el
tipo de retorno para los mtodos sobrecargados en los que queremos parar. Para
parar en el constructor de Button que crea este Button, usamos stop in
java.awt.Button.<init>java.lang.String).
El comando cont
Para continuar la sesin jdb, usamos el comando cont . La siguiente vez que el
programa cree un Button con un constructor String, jdb se parar para que
podamos examinar la salida.
main[1] cont
main[1]
Breakpoint hit: java.awt.Button.<init>
(Button:130)
Si la clase Button no ha sido compilada con informacin de depurado como se
describi antes, no veremos los campos internos desde el comando print.
Limpiar Puntos de Ruptura
Para limpiar este punto de ruptura y que no pare cada vez que se cree un Button
se usa el comando clear. Este ejemplo usa el comando clear sin argumentos para
mostrar la lista de puntos de ruptura actuales, y el comando clear con el
argumento java.awt.Button:130. para borrar el punto de ruptura
java.awt.Button:130..
main[1] clear
Current breakpoints set:
SimpleJdbTest:10
java.awt.Button:130
main[1] clear java.awt.Button:130
Breakpoint cleared at java.awt.Button: 130
Mostrar Detalles del Objeto
Para mostrar los detalles de un objeto, usamos el comando print para llamar al
mtodo toString del objeto, o usar el comando dump para mostrar los campos y
valores del objeto.
Este ejemplo pone un punto de ruptura en la lnea 17 y usa los comandos print y
dump para imprimir y volcar el primer objeto Button del array de objetos Button.
La salica del comando The dump ha sido abreviada.
main[1] stop at SimpleJdbTest:17
Breakpoint set at SimpleJdbTest:17
main[1] cont
main[1]
Breakpoint hit: SimpleJdbTest.setup (SimpleJdbTest:17)
main[1] print b[0]
b[0] = java.awt.Button[button1,0,0,0x0,invalid,
label=press]
main[1] dump b[0]
b[0] = (java.awt.Button)0x163 {
private int componentSerializedDataVersion = 2
boolean isPacked = false
private java.beans.PropertyChangeSupport
changeSupport = null
long eventMask = 4096
transient java.awt.event.InputMethodListener
inputMethodListener = null
....
java.lang.String actionCommand = null
java.lang.String label = press
}
Finalizar la Sesin
Esto finaliza el sencillo ejemplo jdb. Para terminar una sesin jdb, se usa el
comando quit:
0xee2f9820:class(SimpleJdbTest)
> quit
Depuracin Remota
El jdb es un proceso de depuracin externo, lo que significa que depura el
programa envindole mensajes hacia y desde el ayudante de la mquina virtual
Java. Esto hacer muy fcil la depuracin de un programa en ejecucin, y nos ayuda
a depurar un programa que interactua con el usuario final. Una sesin de
depuracin remota desde la lnea de comandos no interfiere con la operacin
normal de la aplicacin.
Arrancar la Sesin
Antes de la versin Java 2, lo nico que se requera para permitir la depuracin
remota era arrancar el programa con la bandera -debug como primer argumento,
y si la aplicacin usa libreras nativas, terminanos el nombre de la librera con una
_g. Por ejemplo, necesitaramos una copia de la librera nativelib.dll como
nativelib_g.dll para depurar con esta librera.
En Java 2, las cosas son un poco ms complicada. Necesitamos decirla a la JVM
dnde est el ficheo tools.jar usando la variable CLASSPATH. El fichero tools.jar
normalmente se encuentra en el directorio lib de la instalacin de la plataforma
Java.
Tambin necesitamos desactivar el compilador "Just In Time" (JIT) si existe. Este
compilador se desactiva seleccionado la propiedad java.compiler a NONE o a una
cadena vaca. Finalmente, como la opcin -classpath sobreescribe cualquier
classpath seleccionado por el usuario, tambin necesitamos aadir el CLASSPATH
necesario para nuestra aplicacin.
Ponindo todo esto junto, aqu est lnea de comandos necesaria para arrancar un
programa en modo de depuracin remoto. Se pone todo en una sla lnea e
incluimos todas las clases necesarias en la lnea de comandos.
Windows:
$ java -debug -classpath C:\java\lib\tools.jar;.
-Djava.compiler=NONE SimpleJdbTest
Agent password=4gk5hm
Unix:
$ java -debug -classpath /usr/java/lib/tools.jar:.
-Djava.compiler=NONE SimpleJdbTest
Agent password=5ufhic
La salida es el password del agente (en este caso, 4gk5hm) si el programa se
arranca de forma satisfactoria. La password de agente se suministra cuando se
arranca jdb para que ste peuda encontrar la aplicacin arrancada correspondiente
en modo depuracin en esa mquina.
Para arrancar jdb en modo depuracin remoto, suministramos un nombre de host,
que puede ser la misma mquina donde se est ejecutando el programa o
localhost si estmos depurando en la misma mquina que el programa remoto, y
la password de agente.
jdb -host localhost -password 4gk5hm
Listar Threads
Una vez dentro de la sesin jdb, podemos listar los threads activos actualmente,
con el comando threads, y usar el comando thread <threadnumber>, por
ejemplo, thread 7 para seleccionar un thread para analizarlo. Una vez
seleccionado un thread, usamos el comando where para ver los mtodos que han
sido llamados por este thread.
$ jdb -host arsenal -password 5ufhic
Initializing jdb...
> threads
Group system:
1. (java.lang.Thread)0x9 Signal dispatcher
cond. waiting
2. (java.lang.ref.Reference 0xb Reference Handler
$ReferenceHandler) cond. waiting
3. (java.lang.ref. Finalizer
Finalizer cond. waiting
$FinalizerThread)0xd
4. (java.lang.Thread)0xe Debugger agent
running
5. (sun.tools.agent. Breakpoint handler
Handler)0x10 cond. waiting
6. (sun.tools.agent. Step handler
StepHandler)0x12 cond. waiting
Group main:
7. (java.awt. AWT-EventQueue-0
EventDispatchThread) cond. waiting
0x19
8. (sun.awt. PostEventQueue-0
PostEventQueue)0x1b cond. waiting
9. (java.lang.Thread)0x1c AWT-Motif
running
10. (java.lang.Thread)0x1d TimerQueue
cond. waiting
11. (sun.awt. Screen Updater
ScreenUpdater)0x1f cond. waiting
12. (java.lang.Thread)0x20 Thread-0
cond. waiting
> thread 7
AWT-EventQueue-0[1] where
[1] java.lang.Object.wait (native method)
[2] java.lang.Object.wait (Object:424)
[3] java.awt.EventQueue.getNextEvent
(EventQueue:179)
[4] java.awt.EventDispatchThread.run
(EventDispatchThread:67)
Listar el Fuente
Para listar el fuente, el thread necesita ser suspendido usando el comando
suspend. Para permitir que un thread contine usamos el comando resume. El
ejemplo usa resume 7.
AWT-EventQueue-0[1] suspend 7
AWT-EventQueue-0[1] list
Current method is native
AWT-EventQueue-0[1] where
[1] java.lang.Object.wait (native method)
[2] java.lang.Object.wait (Object:424)
[3] java.awt.EventQueue.getNextEvent
(EventQueue:179)
[4] java.awt.EventDispatchThread.run
(EventDispatchThread:67)
AWT-EventQueue-0[1] resume 7
Finalizar la Sesin
Cuando finalizamos de depurar remotamente este programa, eliminamos cualquier
punto de ruptura restante antes de salir de la sesin de depuracin. Para obtener
una lista de estos puntos de ruptura usamos el comando clear, y para eliminarlos
introducimos el comando clear class:linenumber de esta forma:
main[1] clear
Current breakpoints set:
SimpleJdbTest:10
main[1] clear SimpleJdbTest:10
main[1] quit
Usar el Piloto Automtico
Un truco poco conocido del jdb es el fichero de arranque jdb. jdb
automticamente busca un fichero llamado jdb.ini en el directorio user.home. Si
tenemos varios proyecto, es una buena idea seleccionar una propiedad user.home
diferente para cada proyecto cuando arranquemos jdb. Para arrancar jdb con un
fichero jdb.ini en el directorio actual, tecleamos esto:
jdb -J-Duser.home=.
El fichero jdb.ini nos permite seleccionar los comandos de configuracin de jdb,
como use, sin tener que introducir los detalles cada vez que ejecutamos jdb. El
siguiente fichero de ejemplo jdb.ini empieza una sesin jdb para la clase FacTest.
Incluye los fuentes de la plataforma Java en el path de fuentes y le pasa el
parmetro nmero 6 al programa. Se ejecuta y para en la lnea 13, muestra la
memoria libre, y espera una entrada posterior.
load FacTest
stop at FacTest:13
use /home/calvin/java:/home/calvin/jdk/src/
run FacTest 6
memory
Aqu est salida de la ejecucin del fichero jdb.ini:
$ jdb -J-Duser.home=/home/calvin/java
Initializing jdb...
0xad:class(FacTest)
Breakpoint set at FacTest:13
running ...
Free: 662384, total: 1048568
main[1]
Breakpoint hit: FacTest.compute (FacTest:13)
main[1]
Podramos peguntarnos si los ficheros jdb.ini pueden usarse para controlar una
sesin jdb completa. Desafortunadamente, los comandos en un fichero jdb.ini se
ejecutan de forma sncrona, y jdb no espera hasta que se llegue a un punto de
ruptuira para ejecutar el siguiente comando. Podemos aadir retardos artificiales
con comandos help repetidos, pero no hay garanta de que el thread se suspenda
cuando necesitamos que lo haga.
Crear un Dilogo de Sesin
Podemos usar una caracterstica poco conocida de jdb para obtener un registro de
nuestra sesin de depuracin. La salida es similar a la que veramos si
ejecutramos jdb -dbgtrace.
Para permitir el diario jdb, creamos un fichero llamado .agentLog en el directorio
donde estmos ejecutando jdb o java -debug. En el fichero .agentLog, ponemos
el nombre del fichero en el que se escriba la informacin de la sesin en la primera
lnea.Por ejemplo, un fichero .agentLog podra tener estos contenidos:
jdblog
Cuando luego ejecutamos jdb o java -debug, veremos que la informacin de
sesin jdb se muestra de esta forma. Podemos usar esta informacin para
recuperar los puntos de ruptura y los comandos introducidos por si necesitamos
reproducir esta sesin de depuracin.
---- debug agent message log ----
[debug agent: adding Debugger agent to
system thread list]
[debug agent: adding Breakpoint handler
to system thread list]
[debug agent: adding Step handler to
system thread list]
[debug agent: adding Finalizer to
system thread list]
[debug agent: adding Reference Handler to
system thread list]
[debug agent: adding Signal dispatcher to
system thread list]
[debug agent: Awaiting new step request]
[debug agent: cmd socket:
Socket[addr=localhost/127.0.0.1,
port=38986,localport=3 8985]]
[debug agent: connection accepted]
[debug agent: dumpClasses()]
[debug agent: no such class: HelloWorldApp.main]
[debug agent: Adding breakpoint bkpt:main(0)]
[debug agent: no last suspended to resume]
[debug agent: Getting threads for HelloWorldApp.main]
Ozito
Depurar Servlets
Podemo depurar servlets con los mismos comandos jdb usados para depurar un
applet o una aplicacin. JSDK "Java
TM
Servlet Development Kit" proporciona una
programa llamado servletrunner que nos permite ejecutar un servlet sin un
navegador web. En la mayora de los sistemas, este programa simplemente
ejecuta el comando java sun.servlet.http.HttpServer. Por lo tanto, podemos
arrancar la sesin jdb con la clase HttpServer.
Un punto importante a recordar cuando depuramos servlets es que el servidor Web
Java y servletrunner realizan la carga y descargas de servlets, pero no incluyen
el directorio servlets en el CLASSPATH. Esto significa que los servlets se cargan
usando un cargador de clases personalizado y no por el cargador de clases por
defecto del sistema.
Ejecutar servletrunner en Modo Depuracin
Ejecutar el Java Web Server
TM
en modo Depuracin
Ejecutar servletrunner en Modo Depuracin
En este ejemplo, se incluye el directorio de ejemplos servlets en el CLASSPATH.
Configuramos el CLASSPATH en modo depuracin de esta forma:
Unix
$ export CLASSPATH=./lib/jsdk.jar:./examples:$CLASSPATH
Windows
$ set CLASSPATH=lib\jsdk.jar;examples;%classpath%
Para arrancar el programa servletrunner, podemos ejecutar el script de arranque
suministrado llamado servletrunner o simplemente suministramos las clases
servletrunner como parmetros de jdb. Este ejemplo usa el parmetro
servletrunner.
$ jdb sun.servlet.http.HttpServer
Initializing jdb...
0xee2fa2f8:class(sun.servlet.http.HttpServer)
> stop in SnoopServlet.doGet
Breakpoint set in SnoopServlet.doGet
> run
run sun.servlet.http.HttpServer
running ...
main[1] servletrunner starting with settings:
port = 8080
backlog = 50
max handlers = 100
timeout = 5000
servlet dir = ./examples
document dir = ./examples
servlet propfile = ./examples/servlet.properties
Para ejecutar SnoopServlet en modo depuracin, introducimos la siguiente URL
donde yourmachine es la mquina donde arrancamos el servletrunner y 8080 es
el nmero d puerto mostrado en las selecciones de salida.
http://yourmachine:8080/servlet/SnoopServlet
En este ejemplo jdb para en la primera lnea del mtodo doGet del servlet. El
navegador espera una respuesta de nuestro servlet hasta que se pase el timeout.
main[1] SnoopServlet: init
Breakpoint hit: SnoopServlet.doGet (SnoopServlet:45)
Thread-105[1]
Podemo usar el comando list para saber dnde se ha parado jdb en el fuente.
Thread-105[1] list
41 throws ServletException, IOException
42 {
43 PrintWriter out;
44
45 => res.setContentType("text/html");
46 out = res.getWriter ();
47
48 out.println("<html>");
49 out.println("<head>
<title>Snoop Servlet
</title></head>");
Thread-105[1]
El servlet puede continuar usando el comando cont.
Thread-105[1] cont
Ejecutar el Java Web Server en Modo Depuracin
La versin JSDK no contiena las clases disponibles en el Java Web Server y
tambin tiene su propia configuracin servlet especial. Si no podemos ejecutar
nuestro servlet desde servletrunner, otra opcin puede ser ejecutar el servidor
web Java en modo depuracin.
Para hacer esto aadimos la bandera -debug como el primer parmetro despus
del programa java. Por ejemplo en el script bin/js cambiamos la lnea Java para
que se parezca a esto. En versiones anteriores de la plataforma java 2, tambin
tendremos que cambiar el puntero del programa a la variable $JAVA a java_g en
vez de a java.
Antes:
exec $JAVA $THREADS $JITCOMPILER $COMPILER $MS $MX \
Depus:
exec $JAVA -debug $THREADS $JITCOMPILER
$COMPILER $MS $MX \
Aqu est como conectar remotamente con el Java Web Server. La password de
agente es generada sobre la slaida estandard desde el Java Web Server pero
puede ser redirigida a un fichero en cualquier lugar. Podemos encontrar dnde
chequeando los scripts de arranque del Java Web Server.
jdb -host localhost -password <the agent password>
Los servlets se cargan por un cargador de clases separado si estn contenidos en
el directorio servlets, que no est en el CLASSPATH usado cuando se arranc el
Java Web server. Desafortunadamente, cuando depuramos en modo remoto con
jdb, no podemos controlar el cargador de clases personalizado y solicitarle que
cargue el servlet, por eso tenemos que incluir el directorio servlets en el
CLASSPATH para depurar o cargar el servlet requirindolo a travs de un
navegador y luego situando un punto de ruptura una vez que el servlet est
ejecutando.
En este siguiente ejemplo, se incluye el jdc.WebServer.PasswordServlet en el
CLASSPATH cuando se arranca el Java Web server. El ejemplo selecciona un
punto de ruptura para parar el mtodo service de este servlet, que es el mtodo
de proceso principal.
La salida estndard del Java Web Server standard produce este mensaje, que nos
permite seguir con la sesin remota de jdb:
Agent password=3yg23k
$ jdb -host localhost -password 3yg23k
Initializing jdb...
> stop in jdc.WebServer.PasswordServlet:service
Breakpoint set in jdc.WebServer.PasswordServlet.service
> stop
Current breakpoints set:
jdc.WebServer.PasswordServlet:111
El segundo stop lista los puntos de ruptura actuales en esta sesin y muestra el
nmero de lnea donde se encuentan. Ahora podemos llamar al servlet a travs de
nuestra pgina HTML. En este ejemplo, el servlet est ejecutando una operacin
POST:
<FORM METHOD="post" action="/servlet/PasswordServlet">
<INPUT TYPE=TEXT SIZE=15 Name="user" Value="">
<INPUT TYPE=SUBMIT Name="Submit" Value="Submit">
</FORM>
Obtenemos el control del thread del Java Web Server cuando se alcanza el punto
de ruptura, y podemos continuar depurando usando las mismas tcnicas que se
usarn en la seccin Depuracin Remota.
Breakpoint hit: jdc.WebServer.PasswordServlet.service
(PasswordServlet:111) webpageservice Handler[1] where
[1] jdc.WebServer.PasswordServlet.service
(PasswordServlet:111)
[2] javax.servlet.http.HttpServlet.service
(HttpServlet:588)
[3] com.sun.server.ServletState.callService
(ServletState:204)
[4] com.sun.server.ServletManager.callServletService
(ServletManager:940)
[5] com.sun.server.http.InvokerServlet.service
(InvokerServlet:101)
Un problema comn cuando se usan el Java WebServer y otros entornos de
servlets es que se lanzan excepiones pero son capturadas y manejadas desde fuera
del mbito del servlet. El comando catch nos permite atrapar todas estas
excepciones.
webpageservice Handler[1] catch java.io.IOException
webpageservice Handler[1]
Exception: java.io.FileNotFoundException
at com.sun.server.http.FileServlet.sendResponse(
FileServlet.java:153)
at com.sun.server.http.FileServlet.service(
FileServlet.java:114)
at com.sun.server.webserver.FileServlet.service(
FileServlet.java:202)
at javax.servlet.http.HttpServlet.service(
HttpServlet.java:588)
at com.sun.server.ServletManager.callServletService(
ServletManager.java:936)
at com.sun.server.webserver.HttpServiceHandler
.handleRequest(HttpServiceHandler.java:416)
at com.sun.server.webserver.HttpServiceHandler
.handleRequest(HttpServiceHandler.java:246)
at com.sun.server.HandlerThread.run(
HandlerThread.java:154)
Este sencillo ejemplo fue generado cuando los ficheros no se encontraban pero
esta tcnica puede usarse para problemas con datos posteados. Recordamos usar
cont para permitir que el servidor web contine. Para limpiar est trampa usamos
el comando ignore.
webpageservice Handler[1] ignore java.io.IOException
webpageservice Handler[1] catch
webpageservice Handler[1]
Ozito
Depurar Eventos AWT
Antes del nuevo mecanismo de eventos del SWT presentado en el JDK 1.1 los
eventos eran recibidos por un componente como un TextField, y propagado hacia
arriba a sus componentes padre. Esto significa que podra simplemente aadir
algn cdigo de diagnstico a los mtodo handleEvent o action del componente
para monitorizar los eventos que le han llegado.
Con la presentacin del JDK 1.1 y el nuevo sistema de la cola de eventos, los
eventos son enviados a una cola de eventos en lugar de al propio componente. Los
eventos son despachados desde la cola de Eventos del Sistema a los oyentes de
eventos que se han registrado para ser notificados cuando se despache un evento
para ese objeto.
Usar AWTEventListener
Podemo suar un AWTEventListener para monitorizar los eventos AWT desde la
cola de eventos del sistema. Este oyente toma una mscada de evento construida
desde una operacin OR de los AWTEvent que queremos monitorizar. Para
obtener una simple lista de los eventos AWTEvent, usamos el comando javap
-public java.awt.AWTEvent. Este ejemplo sigue la pista a los eventos de foco y
del ratn.
Nota: No se debe utilizar AWTEventListener en un producto para la
venta, ya que degrada el rendimiento del sistema.
//EventTest.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class EventTest extends JFrame {
public EventTest() {
JButton jb1=new JButton("hello");
getContentPane().add(jb1);
//AWTEventListener
getToolkit().addAWTEventListener(
new AWTEventListener() {
public void eventDispatched(AWTEvent e) {
System.out.println(e+"\n");
}
}, AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.FOCUS_EVENT_MASK
);
}
public static void main (String args[]) {
EventTest et=new EventTest();
et.setSize(300,300);
et.pack();
et.show();
}
}
Ozito
Analizar la Pila
Los desarrolladores siempre han considerado un misterio el seguimiento de pila.
Hay muy poca o ninguna documentacin disponible, y cuando obtenenos una, o
necesitamos generar una, el tiempo lo prohibe. La siguiente seccin descubre los
secretos de la depuracin con seguimiento de la pila, y al final, podremos
considerar el seguimiento de pila como una herramienta til para analizar otros
programas -- no slo los que no funcionan!
Qu es un seguimiento de pila producido por la plataforma
TM
? Es una imagen
amigable para el usuario de los threads y monitores en la mquina virtual Java.
Dependiendo de lo compleja que sea nuestra aplicacin o applet, un seguimiento
de pila puede tener un rango desde las cincuenta lneas hasta los cientos de lneas
de diagnstico.
Sin importar el tamao del seguimiento de pila, hay unas pocas cosas importantes
que nos pueden ayudar a diagnosticar la mayora de los problemas de software sin
importar si somos expertos o nuevos en la plataforma Java.
Hay tres formas populares para generar un seguimiento de pila: enviar una seal a
la Mquina Virtual Java (JVM); la mquina virtual java genera un seguimiento de
pila por nosotros; o usar herramientas de depuracin o llamadas al API.
Enviar una Seal a la JVM
La JVM Genera un Seguimiento de Pila
Usar Herramientas de Depuracin o Llamadas al API
Qu buscar primero?
Qu versin genera el Seguimiento de Pila?
Qu Plataforma genera el Seguimiento de Pila?
Qu paquete Thread fue utilizado?
Qu son los Estados del Thread?
Examinar Monitores
Poner los Pasos en Prctica
Checklist del Experto
Enviar una Seal a la JVM
En plataformas UNIX podemos enviar una seal al programa con el comando kill.
Est es la seal de salida, que es manejada por la mquina virtual Java.
Sistemas Unix:
Por ejemplo, en la plataforma Solaris
TM
, podemos usar el comando kill -QUIT
process_id, donde process_id es el nmero de proceso de nuestro programa.
De forma alternativa podemos introducir la secuencia clave <ctrl>\ en la ventana
donde se arranc el programa.
El envo de esta seal instruye a un manejador de seal de la JVM a que imprima
recursivamente toda la informacin de los threads y monitores que hay dentro de
la JVM.
Windows 95/NT:
Para generar un seguimiento de pila en plataformas Windows 95 o Windows NT,
introducimos esta secuencia <ctrl><break> en la ventana donde se est
ejecutando el programa.
La JVM genera un Seguimiento de Pila
Si la JVM experiment un error intermo como una violacin de segmento o una
fallo de pgina ilegal, llama a su propio manejador de seales para imprimir
informacin sobre los threads y monitores.
Usar Herramientas de Depuracin o Llamadas al API
Podemos generar un seguimiento parcial de la pila, (que en este caso es slo
informacin de los threads) usando el mtodo Thread.dumpStack, o el mtodo
printStackTrace de la clase Throwable.
Tambin podemos obtener informacin similar introduciendo el comando where
dentro del depurador Java.
Si tenemos xito al generar un seguimiento de pila, podremos ver algo similar a
esto seguimiento de pila.
strings core | grep JAVA_HOME
En la versiones Java 2, los threads que llaman a mtodos que resultan en una
llamada a cdigo nativo son indicados en el seguimiento de pila.
Qu Versin Genera el Seguimiento de Pila?
En la versin Java 2 el seguimiento de pila contiene la versin del JVM, la misma
informaci que verimos usando el parmetro-version.
Sin embargo si no hay string de versin, podemos obtener una idea sobre de qu
versin proviene este seguimiento de pila. Obviamente, si nosotros mismos hemos
generado este seguimiento de pila no debe ser un problema, pero podramos estar
viendo un seguimiento de pila posteado en un grupo de noticias o en un artculo
por e-mail.
Primero identificaremos donde est la seccin "Registered Monitor Dump" en el
seguimiento de pila:
Si vemos un utf8 hash table lock en el "Registered Monitor Dump", esto es
un seguimiento de pila de la plataforma Java 2. La versin final de la
plataforma Java 2 tambin contiene un string de versin, por eso si no hay
string de versin podra tratarse de una versin Beta de Java 2.

Si vemos un JNI pinning lock y no vemos utf8 hash lock, esto es una
versin JDK 1.1+.

Si no aparece ninguna de las cosas anteriores en el "Registered Monitor Dump",
probablemente ser una versin JDK 1.0.2.
Qu Plataforma Genera el Seguimiento de Pila?
Tambin podemos saber si el seguimiento de pila viene de una mquina Windows
95, una NT, o UNIX buscando los threads que est esperadno. En una mquina
Unix los threads que estn esperando se llaman explcitamente. En una mquina
Windows 95, o NT slo se muestra un contador de los threads que estn
esperando:
Windows 95/NT: Finalize me queue lock: <unowned> Writer: 1
UNIX: Finalize me queue lock: <unowned>
waiting to be notified "Finalizer Thread"

Qu Paquete Thread fue Utilizado?
Las JVMs de Windows 95 y Windows NT son por defecto threadas nativos del JVM.
En UNIX las JVMs son por defectos, threads verdes de la JVM, usan una
pseudo-implementacin thread. Para hacer que la JVM use threads nativos
necesitamos suministrar el parmetro -native, por ejemplo, java -native
MyClass.
Verificando la existencia de un Alarm monitor en la salida del seguimiento de pila
podemos identificar que este seguimiento de pila viene de un thread verde la JVM.
Qu son los Estados de Threads?
Veremos muchos threads diferentes en muy diferentes estados en una imagen del
seguimiento de pila de JVM. Esta tabla descfribe varias claves y sus significados.
Clave Significado
R Thread runnable o ejecutndose
S Thread suspendido
CW Thread esperando en un condicin variable
MW Thread esperando un bloqueo de monitor
MS Thread suspendido esperando un bloqueo de monitor
Normalmente, slo los threadas en estados R, S, CW o MW deberan aparecer en
el seguimiento de pila.
Los monitores se usan para controlar el acceso a cdigo que slo debera ser
ejecutado por un slo thread a la vez. Monitores se cubren en ms detalles en la
siguiente seccin. Los otros dos estados de threads comunes que podramos ver
son R, threads ejecutables y CW, threads en una condicin de estado de espera.
Los threadas ejecutables son por definicin threads que podran ser ejecutados o
estar ejecutndose en ese momento. En una mquina multi-procesador ejecutndo
un sistema operativo realmente multi-procesador es posible que todos los threads
ejecutables se estn ejecutando en el mismo momento. Sin embargo es ms
probable que otros threads ejecutables estn esperando un programador de
threads para tener su turno de ejecucin.
Podramos pensar en los threads en una condicin de estado de espera como
esperando a que ocurra un evento. Frecuentemente un thread aparecer en el
estado CW si est en un Thread.sleep o en una espera sincronizada. En nuestro
anterior seguimiento de pila el mtodo main estaba esperando a que un thread se
completara y se notificara su finalizacin. En el seguimiento de pila esto aparecer
como:
"main" (TID:0xebc981e0, sys_thread_t:0x26bb0,
state:CW) prio=5
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:424)
at HangingProgram.main(HangingProgram.java:33)
El cdigo que cre este seguimiento de fila es este:
synchronized(t1) {
try {
t1.wait(); //line 33
}catch (InterruptedException e){}
}
En la versin Java 2 las operaciones de monitores, incluyendo nuestra espera aqu,
son manejadas por la mquina virtual Java a travs de una llamada JNI a
sysMonitor. La condicin de espera de un thread se mantiene en una cola de
espera de monitor especial del objeto que est esperando. Esto explica porqu
aunque seamos los nicos esperando por un objeto el cdigo todava necesita estar
sincronizado con el objeto como si estuviera utilizano de hecho el monitor de ese
objeto.
Examinar Monitores
Esto nos trae la otra parte del seguimiento de pila: el volcado de monitores. Si
consideramos que la seccin de threads de un seguimiento de pila identifica la
parte multi-thread de nuestra aplicacin, entonces la seccin de monitores
representa las partes de nuestra aplicacin que usan un slo thread.
Podra ser sencillo imaginar un monitor como un lavadero de coches. En muchos
lavaderos de coches, slo se puede lavar un coche a la vez. En nuestro cdigo Java
slo un thread a la vez puede tener el bloqueo sobre una pieza sincronizada de
cdigo. Todos los dems threads esperan en la cola para entrar al cdigo
sincronizado como lo hacen los coches para entrar en el lavadero de coches.
Se puede pensar en un monitor como un bloqueo para un objeto, y cada objeto
tiene un monitor. Cuando generamos un seguimiento de pila, los monitores se
listan como registrados o no registrados. En la mayora de los casos estos
monitores registrados, o monitores del sistema, no deberan ser la causa de
nuestro problema de software, pero nos ayudarn a entenderlos y reconocerlos. La
siguiente tabla describe los monitores registrados mas comunes:
Monitor Descripcin
utf8 hash table
Bloquea el hashtable de Strings i18N
definidos que fueron cargados desde la clase
constant pool.
JNI pinning lock
Protege las copias de bloques de array a cdigo
de mtodos nativos.
JNI global reference lock
Bloquea la tabla de referencias globales que
contiene los valores que necesitan ser liberado
explcitamete, y sobrevivir al tiempo de vida de
la llamada del mtodo nativo.
BinClass lock
Bloquea el acceso a la lista de clases cargadas y
resueltas. La tabla global de lista de clases.
Class linking lock
Protege datos de clases cuando se cargan
libreras nativas para resolver referencias
simblicas
System class loader lock
Asegura que slo un thread se carga en una
clase del sistema a la vez.
Code rewrite lock
Protege el cdigo cuando se intenta una
optimizacin.
Heap lock
Protege la pila Java durante el manejo de
memoria de la pila.
Monitor cache lock
Slo un thread puede tener acceso al monitor
cache a la vez este bloqueo asegura la
integridad del monitor cache.
Dynamic loading lock
Protege los threads verdes de la JVM Unix de la
carga de librera compartida stub libdl.so ms de
uno a la vez.
Monitor IO lock Protege I/O fsica por ejemplo, abrir y leer.
User signal monitor
Controla el acceso al controlador de seal si hay
una seal de usuario en un thread verde de la
JVM.
Child death monitor
Controla accesos al proceso de informacin de
espera cuando usamos llamadas al sistema de
ejecucin para ejecutar comandos locales en un
thread verde de la JVM.
I/O Monitor
Controla accesos al fichero descriptor de
threadas para eventos poll/select.
Alarm Monitor
Controla accesos a un controlador de reloj usado
en threads verdes de la JVM para manejar
timeouts
Thread queue lock Protege la cola de threads activos.
Monitor registry
Slo un thread puede tener acceso al registro de
monitores al mismo tiempo que este bloqueo
asegura la integridad de este registro.
Has finalization queue lock *
Protege la lista de objetos bloqueados que han
sido recolectadas para la basura, y considera la
finalizacin necesaria. Son copiados a la cola
Finalize.
Finalize me queue lock *
Protege una lista de objetos que pueden ser
finalizados por desocupados.
Name and type hash table lock *
Protege las tablas de constantes de las JVMs y
sus tipos.
String intern lock *
Bloquea la hashtable de Strings definidos que
fueron cargadas desde la clase constant pool
Class loading lock *
Asegura que slo un thread carga una clase a la
vez.
Java stack lock * Protege la lista de segmentos libres de la pila
Nota: * bloqueo aparecidos slo en los seguimientos de pre-Java 2.
El propio registro de monitores est protegido por un monitor. Esto significa que el
thread al que pertenece un bloqueo es el ltimo thread en usar un monitor. Es
como decir que este thread es el thread actual. Como slo un thread pueden entrar
en un bloque sincronizado a la vez, otros threads se ponen a la cola para entrar en
el cdigo sincronizado y aparecen con el estado MW. En el volcado del cach de
monitores, se denotan como threads "esperando para entrar". En el cdigo de
usuario un monitor es llamado a accin siempre que se usa un bloque o mtodo
sincronizado.
Cualquier cdigo que espere un objeto o un evento (mtodo que espera) tambin
tiene que estar dentro de un bloque sincronizado. Sin emabrgo, una vez que se
llama a este mtodo, se entrega el bloqueo sobre el objeto sincronizado.
Cuando el thread en estado de espera es notificado de un evento hacia el objeto,
teine la competencia del acceso exclusivo a ese objeto, y tiene que obtener el
monitor. Incluso cuando un thread a enviado un "notify event" a los threads que
estn esperando, ninguno de estos threads puede obtener realmente le control del
monitor bloqueado hasta que el thread notificado haya abandonado el bloque de
cdigo sincronizado
Poner los Pasos en Prctica
Ejemplo 1
Consideremos un problema de la vida real como por ejemplo el Bug ID 4098756.
Podemos encontrar ms detalles sobre este bus en el JDC Bug Parade. Este bug
documenta un problema que ocurre cuando usamos un componente Choice sobre
Windows 95.
Cuando el usuario selecciona una de las opciones desde el componente Choice
usando el ratn, todo va bien. Sin embargo, cuando el usuario intenta usar una
tecla de fleca paramover la lista de opciones, la aplicacin Java se congela.
Afortunadamente, este problema es reproducible y haba un seguimiento de pila
Java para ayudar a corregir el problem. El seguimiento de pila completo est en la
pgina del bug, pero slo necesitamos enfocarnos en estos dos threads claves:
"AWT-Windows" (TID:0xf54b70,
sys_thread_t:0x875a80,Win32ID:0x67,
state:MW) prio=5
java.awt.Choice.select(Choice.java:293)
sun.awt.windows.WChoicePeer.handleAction(
WChoicePeer.java:86)
"AWT-EventQueue-0" (TID:0xf54a98,sys_thread_t:0x875c20,
Win32ID:0x8f, state:R) prio=5
java.awt.Choice.remove(Choice.java:228)
java.awt.Choice.removeAll(Choice.java:246)
El thread AWT-EventQueue-0 est en estado ejecutable dentro del mtodo
remove. Remove est sincronizado, lo que explca por qu el thread
AWT-Windows no puede entrar al mtodo select. El thread AWT-Windows est
en estado MW (monitor wait); sin embargo, sin embargo si seguimos el
seguimiento de pila, esta situacin no cambia aunque el interface grfico de
usuario (GUI) parezca estr congelado.
Esto indica que la llamada a remove nunca retorn. Siguiendo el camino del
cdigo hacia la clase ChoicePeer, podemos ver que se est haciendo a un llamada
al MFC nativo que no retorna, Es aqu donde est el problema real y es un bug de
las clases corazn Java. El cdigo del usuario esta bien.
Ejemplo 2
En este segundo ejemplo investigaremos un bug que al principio parece ser un fallo
de Swing pero descubriremos que es debido al hecho que Swing no es seguro ante
los threads.
El informa de bug tambin est disponible en la site JDCm el nmero del bug es
4098525.
Aqu tenemos un ejemplo del cdigo usado para reproducir este problem. El
dalogo modal se crea desde dentro del mtodo JPanel paint.
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
class MyDialog extends Dialog
implements ActionListener {
MyDialog(Frame parent) {
super(parent, "My Dialog", true);
Button okButton = new Button("OK");
okButton.addActionListener(this);
add(okButton);
pack();
}
public void actionPerformed(ActionEvent event) {
dispose();
}
}
public class Tester extends JPanel {
MyDialog myDialog;
boolean firstTime = true;
public Tester (JFrame frame) throws Exception {
super();
myDialog = new MyDialog(frame);
}
void showDialogs() {
myDialog.show();
}
public void paint(Graphics g) {
super.paint(g);
if (firstTime) {
firstTime = false;
showDialogs();
}
}
public static void main(String args[])
throws Exception {
JFrame frame = new JFrame ("Test");
Tester gui = new Tester(frame);
frame.getContentPane().add(gui);
frame.setSize(800, 600);
frame.pack();
frame.setVisible(true);
}
}
Cuando ejecutamos este programa encontramos que se bloquea al principio.
Haciendo un seguimiento de pila podremos ver estos threads claves.
El seguimiento de pista que tenemos aqu es ligeramente diferente al que aparece
en el informe del bug, pero tienen el mismo efecto. Tambin usamos la versin
Java 2 para generar el seguimiento y suministrar la opcin
-Djava.compiler=NONE cuando ejecutamos el programa para que podams ver
los nmeros de lnea del fuent. El thread a buscar es el que tiene el estado MW,
monitor de espaera que en este caso es el threadAWT-EventQueue-1
"AWT-EventQueue-1" (
TID:0xebca8c20, sys_thread_t:0x376660,
state:MW) prio=6
at java.awt.Component.invalidate(Component.java:1664)
at java.awt.Container.invalidate(Container.java:507)
t java.awt.Window.dispatchEventImpl(Window.java:696)
at java.awt.Component.dispatchEvent(
Component.java:2289)
at java.awt.EventQueue.dispatchEvent(
EventQueue.java:258)
at java.awt.EventDispatchThread.run(
EventDispatchThread.java:68)
Si buscamos est lnea en el fichero java/awt/Component.java que est
contenido en el archivo src.jar, veremos esto:
public void invalidate() {
synchronized (getTreeLock()) { //line 1664
Es aquo donde nuestra aplicacinse bloquea, est esperando a que el monitor
getTreeLock se libere. La siguiente tarea es encontrar elthread que tiene
bloqueado este monitos.
Para ver quin est bloqueando este monitor buscamos en el volcado del cache de
Monitores y en este ejemplo podemos ver lo siguiente:
Monitor Cache Dump:
java.awt.Component$AWTTreeLock@EBC9C228/EBCF2408:
owner "AWT-EventQueue-0" ( 0x263850) 3 entries
Waiting to enter:
"AWT-EventQueue-1" (0x376660)
El monitor getTreeLock est actualmente bloqueado en un objeto de una clase
interna creada especialmente AWTTreeLock. Este es el cdigo para crear ese
bloqueo en el fichero Component.java.
static final Object LOCK = new AWTTreeLock();
static class AWTTreeLock {}
El propietario actual es AWT-EventQueue-0. El thread llam a nuestro mtodo
paint para crear nuesto Dialog modal mediante una llamada a paintComponent.
El propio paintComponent fue llamado desde una llamada a update del JFrame.
Pero dnde se origin el bloqueo? Bien, ni hay una forma sencilla de encontrar
qu parte del marco tiene el bloqueo pero una simple bsqueda de
javax.swing.JComponent podremos ver que getTreeLock es llamado dentro del
mtodo paintChildren que dejamos en la lnea 388.
at Tester.paint(Tester.java:39)
at javax.swing.JComponent.paintChildren(
JComponent.java:388)
El resto del puzzle se coloca junto analizando el mtodo MDialogPeer show. El
cdigo del dilogo crea un nuevo ModalThread que es por lo que hemos visto un
thread AWT-Modal en la salida del seguimiento de pila, este thread es usado para
postear el dilogo. Es cuando el evento de despacha usando AWT-EventQueue-1
que es usado para ser el proxy de despacho de eventos de AWT y es necesario un
acceso al monitor getTreeLock y es aqu donde tenemos el bloqueo.
Desafortunadamente el cdigo Swing no est diseado para ser seguro con los
threads por eso la solucin en este ejemplo es no crear dilogos modales desde
dentro de mtodo paint de Swing. Ya que Swing tiene que hacer cantidad de
bloqueos y clculos; que las partes de un componente ligero que necesitan ser
dibujadas deben estar fuertemente advertidas de que no incluyan cdigo
sincronizado o cdigo que puede resultar en una llamada sincronizadac como en un
dilogo modal, dentro del mtodo paint.
Esto completa la teoria del seguimiento de pila Java, y ahora deberamos saber qu
busar la siguiente vez que veamos un seguimiento de pila. Para ahorrar tiempo,
deberamos hacer uso de la bsqueda de Bugs del JDC para ver si nuestro
problema ha sido reportado por alguien ms.
Lista de chequeo del Experto
Para sumarizar, estos son los pasos a tomar la proxima vez que nos crucemos con
un problema en un programa Java:
Programas Colgados, bloqueados o congelados: Si pensamos que
nuestro programa est colgado, generamos un seguimiento de pila.
Examinamos los threads en estados MW o CW. Si el programa est
bloqueado, algunos threads del sistema se nos mostrarn como el thread
actual porque la JVM no tendr nada ms que hacer

Programas Cascados o Abortados: Sobre Unix buscaremos por un fichero
corazn. Podemos analizar este fichero en una herramienta de depuracin
nativa como gdb o dbx. Buscamos los threads que hayan sido llamados por
mtodo nativos. Como la tecnologa Java usa un modelo de memoria seguro,
cualquier posible corrupcin habr ocurrido en el mtodo nativo. Recordamos
que la JVM tambin usa cdigo nativo por lo que bien podra no ser un bug de
nuestra aplicacin.

Programas ocupados: El mejor curso de accin que podemos tomar para los
programas ocupados es generar frecuentes seguimientos de pila. Esto nos
apuntar hacia el cdigo que est causando los errores, y podrmos empezar
nuestra investigacin desde aqu.

Ozito
Problemas de Versiones
Esta seccin proporciona una tabla que sumariza los problemas y soluciones
relacionados con la tenencia de distintas versiones de la plataforma Java
TM
instalados en nuesto sistema.
Producto Desarrollo
JDK 1.0.2 Utiliza CLASSPATH para encontrar y cargar las clases corazn del
sistema.
En Windows 95:
CLASSPATH=/usr/java/lib/classes.zip:.
En Unix:
CLASSPATH=c:\java\lib\classes.zip
Las libreras dinmicas Unix, los ficheros .dll, los objetos
compartidos y fichero .so estn localizados en la variable PATH.
Efectos laterales:
El fichero Autoexec.bat de Win95 contiene una variable
CLASSPATH caducada seleccionad por el usuario o la instalacinde
otras aplicaciones.
El Entorno de usuario de WinNt contiene un vieja variable
CLASSPATH.
Los scripts Unix .cshrc, .profile, o .login contiene un
CLASSPATH errneo.
La varible de entorno JAVA_HOME tambin es usada por
programas para comprobar si no est seleccionada. Podemos
borrar este campo en el shel Bourne (sh) de esta forma: unset
JAVA_HOME
Diagnsticos:
Usamos la opcin -classpath para forzar a la mquina virtual Java
a que use slo la lnea de comandos. Slo CLASSPATH: java
-classpath c:\java\lib\classes.zip;. myapp
Producto Desarrollo
JDK 1.1 Usa paths relativos para encontrar el fichero classes.zip desde la
instalacin de la plataforma Java. La variable de entorno
CLASSPATH se usa para cargar las clases de la aplicacin.
Efectos laterales:
Otras versiones Java encontradad en el path de la aplicacin
podran ser cargadas si el directorio bin del JDK no se selecciona
expltamente delante de la variable de entorno PATH.
Diagnsticos:
Usamos la opcin -classpath para forzar a la mquina virtual Java
a que use slo la lnea de comandos. Slo CLASSPATH: java
-classpath c:\java\lib\classes.zip;. myapp
Producto Desarrollo
Plataforma
Java 2
La plataforma est dividida en un Entorno de Ejecucin Java (JRE)
y un compilador Java. El JRE est incluido como un subdirectorio
de la versin, y los tradiciones programas java y javac del
directorio bin llaman directamente el programa real en el
directorio jre/bin.
Los archivos JAR que contienen las clases del sistema de la
plataforma Java, rt.jar y i18.jar, estn localizados en el
directorio jre/lib con un path de bsqueda relativo.
Efectos Laterales:
Si las aplicaciones anteriores usaban el fichero classes.zip para
cargar las clases del sistema de la plataforma Java, podra
intentar cargar errneamente un conjunto de clases adicionales.
Diagnsticos:
Usamos la opcin -Xbootclasspath para forzar al mquina virtual
Java a usar el CLASSPATH sumnistrado en la lnea de
comandos:java -Xbootclasspath:c:\java\jre\lib\rt.jar;
c:\java\jre\lib\i18n.jar;. myapp
Podramos necesitar suministrar esto como una opcin de la lnea
de comandos de esta forma:
javac -J-Xbootclasspath:c\java\lib\tools.jar;c:
\java\jre\lib\rt.jar;c:\java\jre\lib\i18n.jar;. myapp.java
Producto Desarrollo
Java
Plug-In
Sobre Windows 95 y Windows NT usamos el registro para
encontrar plug-in de la plataforma Java instalados.
Efectos Laterales:
El registro podra estar corrompido, o el plug-in eliminado
fsicamente pero no del registro.
Diagnsticos:
Mostrar las propiedades java.version y java.class.path en
nuesto cdigo y verlo en la Consola del Java Plug-in Console
System.out.println("version="+System.getProperty(
"java.version"
));
System.out.println("class path="+System.getProperty(
"java.class.path"
));
Si hay un conflicto, chequeamos el registro con el comando
regedit, buscamos la palabra VM, y si existe la borramos y
reinstalamos el plug-in.
Producto Desarrollo
Netscape usa ficheros .jar como java40.jar del directorio netscape.
Efectos Laterales:
No todas las versiones de Netscape son totalmente compatibles
con JDK 1.1. Podemos obtener actualizaciones en
http://www.netscape.com.
Diagnsticos:
Arrancamos el navegador desde la lnea de comandos con la opcin
-classes.
Producto Desarrollo
Internet
Explorer
Usa ficheros .cab para contener las clases del sistema. Tambin
usa el registro del sistema sobre Windows 95/NT.
Efectos Laterales:
Usamos el comando regedit para buscar la palabra VM. Esa es la
entrada CLASSPATH donde podemos aadir nuestras propias
clases.
Diagnsticos:
El registro puede corromperse. Buscamos CLASSPATH usando el
programa regedit y editamos el valor al que apunta CLASSPATH.
Ozito
Mejorar el Rendimiento por Diseo
Las restricciones del ancho de banda en las redes alrededor del mundo hacen de
las operaciones basadas en red potenciales cuellos de botella que pueden tener un
importante impacto en el rendimiento de las aplicaciones. Muchas aplicaciones de
red estn disaadas para usar almacenes de conexiones y por ello pueden
reutilizar conexiones de red existentes y ahorrar el tiempo y la sobrecarga que
conllevan el abrir y cerrar conexiones de red.
Junto con el almacen de conexiones, hay otras caractersticas que podemos disear
dentro de nuestros programas para mejorar el rendimiento. Este captulo explica
cmo podemos disear un applet para que descargue ficheros y recursos de forma
ms eficiente, o disear un programa basado en threads para usar un almacen de
threads para ahorrarnos el costoso proceso de arrancar threads.
Mejorar la Descarga de un Applet
Almacen de Threads
Mejorar la Velocidad de Descarga de un Applet
El rendimiento de descarga de un applet se refiere al tiempo que tarda el
navegador en descargar todos los ficheros y recursos que necesita para arrancar el
applet. Un factor importante que afecta al rendimiento de la descarga del applet es
el nmero de veces que tiene que solicitar datos al servidor. Podemos reducir el
nmero de peticiones empaquetando las imagenes del applet en un fichero class, o
usando un archivo JAR.
Empaquetar Imgenes en un Clase
Normalmente, si un applet tiene seis imgenes de botones se traducen en seis
solicitudes adicionales al servidor para cargar esos ficheros de imgenes. Seis
solicitudes adicionales podran no parecer demasiadas en una red interna, pero en
las conexiones de baja velocidad y eficiencia, esas solicitudes adicionales pueden
tener un impacto muy negativo en el rendimiento. Por eso, nuestro ltimo objetivo
ser cargar el applet tan rpido como sea posible.
Una forma de almacenar imgenes en un fichero class es usar un esquema de
codificacin ASCII como X-PixMap (XPM). De esta forma, en vez de mantener la
imgenes en ficheros GIF en el servidor, los ficheros son codificados como un
Strings y son almacenados en un slo fichero class.
Este cdigo de ejemplo usa pquetes del ganador de la JavaCup del JavaOne 1996,
que contena las clases XImageSource y XpmParser. Estas clases proporciona
todo los necesario para leer un fichero XPM. Podemos ver esto ficheros en
SunSite.
Para el proceso inicial de codificacin, hay un nmero de herramientas grficas que
podemos usar para crear fichero XPM. En Solaris podemos usar ImageTool o una
variedad de otros GNU image packages. Podemos ir a la web site Download.com
para obtener software de codificacin para las plataformas Windows.
El siguiente cdigo extraido del ejemplo de cdigo MyApplet que carga imgenes.
Podemos ver el String codificado en la definicin XPM de imgenes.
La clase Toolkit crea un objeto Image para cada imagen desde el objeto fuente
XPM Image.
Toolkit kit = Toolkit.getDefaultToolkit();
Image image;
image = kit.createImage (new XImageSource (_reply));
image = kit.createImage (new XImageSource (_post));
image = kit.createImage (new XImageSource (_reload));
image = kit.createImage (new XImageSource (_catchup));
image = kit.createImage (new XImageSource (_back10));
image = kit.createImage (new XImageSource (_reset));
image = kit.createImage (new XImageSource (_faq));
La alternativa tcnica de abajo usa ficheros GIF. Requiere una peticin al servidor
para cada imagen cargada.
Image image;
image = getImage ("reply.gif");
image = getImage ("post.gif");
image = getImage ("reload.gif");
image = getImage ("catchup.gif");
image = getImage ("back10.gif");
image = getImage ("reset.gif");
image = getImage ("faq.gif");
Esta tcnica reduce el trafico de la red porque todas las imgenes estn disponibles
en un slo fichero class.
Usar imgenes XPM codificadas hace ms grande el fichero de la clase, pero el
nmero de peticiones de red es menor.

Al hacer que las definiciones de imgenes XPM formen parte del fichero class,
hacemos que el proceso de carga de imgenes sea parte de la carga normal
del fichero class del applet sin clases extras.

Una vez cargado, podemos usar las imgenes para crear botones u otros
componentes del interface de usuario. El siguiente segmento de cdigo muestra
cmo usar la imgenes con la clase javax.swing.JButton.
ImageIcon icon = new ImageIcon (
kit.createImage (
new XImageSource (_reply)));
JButton button = new JButton (icon, "Reply");
Usar Ficheros JAR
Cuando un applet consta de ms de un fichero, podemos mejorar el rendimiento de
la descarga con ficheros JAR. Un fichero JAR contiene todos los ficheros del applet
en un slo fichero ms rpido de dsacargar. Mucha parte del tiempo ahorrado
viene de la reduccin del nmero de conexiones HTTP que el navegador tiene que
hacer.
El captulo: Desarrollar Nuestra Aplicacin tiene informacin sobre cmo crear y
firmar ficheros JAR.
El cdigo HTML de abajo usa la etiqueta CODE para especificar el ejecutable del
applet MyApplet, y la etiqueta ARCHIVE especifica el fichero JAR que contiene
todos los ficheros relacionados con MyApplet. El ejecutable especificado por la
etiqueta CODE algunas veces es llamado code base.
Por razones de seguridas los ficheros JAR listados por el parmetro archive deben
estar en el mismo directorio o subdirectorio que el codebase del applet. Si no se
suministra el parmetro codebase el directorio de donde se carg el applet se usa
como el codebase.
El siguiente ejemplo especifica jarfile como el fichero JAR que contiene todos los
ficheros relacionados para el ejecutable MyApplet.class.
<APPLET CODE="MyApplet.class" ARCHIVE="jarfile" WIDTH="100"
HEIGHT="200"> </APPLET>
Si la descarga del applet usa mltiples ficheros JAR como se muestra en el
siguiente segmento HTML, el ClassLoader carga cada fichero JAR cuando el applet
arranca. Por eso, si nuestro applet usa algunos ficheros de recursos de forma
infrecuente, el fichero JAR que contiene esos ficheros es descargado sin importar si
los recursos van a ser usados durante la sesin o no.
<APPLET CODE="MyApplet.class" ARCHIVE="jarfile1, jarfile2" WIDTH="100"
HEIGHT="200"> </APPLET>
Para mejorar el rendimiento cuando se descargan fichero no usados de forma
frecuente, ponemos los ficheros usados ms frecuentemente dentro de un fichero
JAR y los ficheros menos usados en el directorio de la clase del applet. Los ficheros
usados poco frecuentemente son localizados y descargados slo cuando el
navegador los necesita.
Almacen de Threads
El servidor de applets Java Developer Connection
SM
(JDC) y el Java Web Server
TM
hacen un uso extensivo del almacen de threads para mejorar el rendimiento. El
almacen de threads es crear un suministro de threads durmientes al principio de la
ejecucin. Como el proceso de arranque de un thread es muy caro en trminos de
recursos del sistema, el almacen de threads hace el proceso de arrancada un poco
ms lento, pero aumenta el rendimiento en tiempo de ejecucin porque los threads
durmientes (o suspendidos) slo se despiertan cuando cuando son necesarios para
realizar nuevas tareas.
Este cdigo de ejemplo tomado de la clase Pool.java muestra una forma de
implementar la fusin de threads, En el constructor de la fusin (mostrado abajo),
se inicializan y arrancan los WorkerThreads. La llamada al mtodo start ejecuta
el mtodo run del WorkerThread, y la llamada a wait suspende el Thread
mientras el Thread espera a que llegue un trabajo. La ltima lnea del constructor
empuja el Thread durmiente hacia la pila.
public Pool (int max, Class workerClass)
throws Exception {
_max = max;
_waiting = new Stack();
_workerClass = workerClass;
Worker worker;
WorkerThread w;
for ( int i = 0; i < _max; i++ ) {
worker = (Worker)_workerClass.newInstance();
w = new WorkerThread ("Worker#"+i, worker);
w.start();
_waiting.push (w);
}
}
Junto al mtodo run, la clase WorkerThread tiene un mtodo wake. Cuando
viene el trabajo, se llama al mtodo wake, que asigna los datos y notifica al
WorkerThread durmiente (el inicializado por el Pool) para recuperar la ejecucin.
El mtodo wake llama a notify hace que el WorkerThread bloqueado salga del
estado de espera, y se ejecuta el mtodo run de la clase HttpServerWorker. Una
vez realizado el trabajo, el WorkerThread se pone de nuevo en el Stack
(asumiento que el Pool de threads no est lleno) o termina.
synchronized void wake (Object data) {
_data = data;
notify();
}
synchronized public void run(){
boolean stop = false;
while (!stop){
if ( _data == null ){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
continue;
}
}
if ( _data != null ){
_worker.run(_data);
}
_data = null;
stop = !(_push (this));
}
}
En este alto nivel, el trabajo entrante es manejado por el mtodo performWork
en la clase Pool. Cuando viene el trabajo, se saca de la pila un WorkerThread
existente (o se crea uno nuevo si el Pool est vaco). El WorkerThread durmiente
es activado mendiate una llamada a su mtodo wake.
public void performWork (Object data)
throws InstantiationException{
WorkerThread w = null;
synchronized (_waiting){
if ( _waiting.empty() ){
try{
w = new WorkerThread ("additional worker",
(Worker)_workerClass.newInstance());
w.start();
}catch (Exception e){
throw new InstantiationException (
"Problem creating
instance of Worker.class: "
+ e.getMessage());
}
}else{
w = (WorkerThread)_waiting.pop();
}
}
w.wake (data);
}
El constructor de la clase HttpServer.java crea un nuevo ejemplar Pool para servir
ejemplares de la clase HttpServerWorker. Los ejemplares HttpServerWorker se
crean y almacenan como parte de los datos WorkerThread. Cuando se activa un
WorkerThread mediante una llamada a su mtodo wake, el ejemplar
HttpServerWorker es invocado mediante su mtodo run.
try{
_pool = new Pool (poolSize,
HttpServerWorker.class);
}catch (Exception e){
e.printStackTrace();
throw new InternalError (e.getMessage());
}
Este cdigo est en el mtodo run de la clase HttpServer.java. Cada vec que viene
una peticin, el dato es inicializado y el Thread empieza el trabajo.
Nota: Si creamos un nuevo Hashtable por cada WorkerThread
provocamos demasiada sobrecarga, slo modificamos el cdigo para que
no use la abstracin Worker.
try{
Socket s = _serverSocket.accept();
Hashtable data = new Hashtable();
data.put ("Socket", s);
data.put ("HttpServer", this);
_pool.performWork (data);
}catch (Exception e){
e.printStackTrace();
}
El almacen de threads es una tcnica efectiva de ajuste de rendimiento que coloca
el caro proceso de arranque de threads en la arrancada de la aplicacin. De esta
forma, el impacto negativo en el rendimiento ocurre slo una vez durante el
arrancada del programa donde se nota menos.
Ozito
Almacen de Conexiones
Si hemos usado SQL u otra herramienta similar para conectarnos con una base de
datos y actar sobre los datos, probablemente habremos notado que la obtenecin
de la conexin y el login es la parte que tarda ms tiempo. Una aplicacin puede
fcilmente tardar varios segundos cada vez que necesita establecer una conexin.
El varsiones anteriores a JDBC
TM
2.0 cada sesin de base de datos requera una
nueva conexin y un login incluso si la conexin anterior usaba la misma tabla y
cuenta de usuario. Si estmos usando versioens anteriores al JDBC 2.0 y queremos
mejorar el rendimiento, podemos cachear las conexiones JDBC.
Las conexiones cacheadas se mantienen un objeto pool en tiempo de ejecucin y
pueden ser utilizadas y reutilizadas cuando las necesite la aplicacin. Una forma de
implementar un objeto pool es hacer una una simple hashtable de objetos
conection. Sin embargo, una forma ms sencilla de hacerlo es escribir un driver
JDBC envuelto que es un intermediario entre la aplicacin y la base de datos.
La envoltura trabaja particulamente en los Beans de Enterprise que san
persistencia manejada por el Bean por dos razones: 1) Slo se carga una clase
Driver por cada Bean, y 2) los detalles especficos de la conexin se manejan
fuera del Bea.
Esta seccin explica cmo escribir una clase Driver JDBC envuelta
Clases Wrapper
Driver de Conexin
Almacen de Conexiones
Bloqueos y Cuelgues
Cerrar Conexiones
Aplicacin de Ejemplo
Clases Wrapper
El Driver JDBC envuelto creado para estos ejemplos consta de las siguientes
clases:
JDCConnectionDriver
JDCConnectionPool
JDCConnection
Driver de Conexin
La clase JDCConnectionDriver.java implementa el interface java.sql.Driver, que
proporciona mtodo para cargar drivers y crear nuevas conexiones a bases de
datos.
Un objeto JDCConnectionManager es creado por una aplicacin que pretende
una conexin con una base de datos. La aplicacin proprociona el ULR para la base
de datos, el ID del usuario y la password.
El constructor JDCConnectionManager hace esto:
Registra el objeto JDCConnectionManager con DriverManager.
Carga la clase Driver pasada al constructor por el programa llamante.
Inicializa un objeto JDCConnectionPool para las conexiones con la URL de la
base de datos, el ID y el password del usuario pasados al constructor por el
programa llamante.

public JDCConnectionDriver(String driver,
String url,
String user,
String password)
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException,
SQLException {
DriverManager.registerDriver(this);
Class.forName(driver).newInstance();
pool = new JDCConnectionPool(url, user, password);
}
Cuando el programa llamante necesita una conexin con la base de datos, llama al
mtodo JDCConnectionDriver.connect, que a su vez, llama al mtodo
JDCConnectionPool.getConnection.
Almacen de Conexiones
La clase JDCConnectionPool.java tiene conexiones disponibles para el programa
llamando en su mtodo getConnection. Este mtodo busca una conexin
disponible en el almacen de conexiones. Si no hay ninguna disponible, crea una
nueva conexin. Si hay una conexin disponible en el almacen, el mtodo
getConnection alquila la conexin y la devuelve al programa llamante.
public synchronized Connection getConnection()
throws SQLException {
JDCConnection c;
for(int i = 0; i < connections.size(); i++) {
c = (JDCConnection)connections.elementAt(i);
if (c.lease()) {
return c;
}
}
Connection conn = DriverManager.getConnection(
url, user, password);
c = new JDCConnection(conn, this);
c.lease();
connections.addElement(c);
return c;
}
La clase JDCConnection.java representa una conexin JDBC en el almacen de
conexiones, y esencialmente es una envoltura alrededor de un conexin real JDBC.
El objeto JDCConnection mantiene una bandera de estado para indicar si la
conexin est en uso y el momento en que la conexin se sac del almacen. Este
tiempo es usado por la clase ConnectionReaper.java para identificar las
conexiones colgadas.
Bloqueos y Cuelgues
Mientras que muchos clientes y servidores de bases de datos tiene formas de
manejar los bloqueos y los cuelgues y no tenemos que preocuparnos de escribir
cdigo para manejar estas situaciones, muchos de los nuevos modelos de base de
datos ligeros distribuidos no estn tan bien equipados. La clase conection pool
proporciona una cosechador de conexiones muerta para manejar dichas
situacciones.
La clase ConnectionReaper decide que una clase est muerta cuando se cumplen
las siguientes condiciones:
La conexin est marcada como que est en uso.
La conexin es ms vieja que tiempo de timeout preseleccionado.
La conexin falla en un chequeo de validacin.
El chequeo de validacin ejecuta una simple consulta SQL sobre la conexin para
ver si lanza una excepcin. En este ejemplo, el mtodo de validacin solicita una
descripcin de alto nivel de las tablas de la base de datos. Si una conexin falla el
test de validacin, se cierra, se inicia una nueva conexin con la base de datos y se
aade al almacen de conexiones.
public boolean validate() {
try {
conn.getMetaData();
}catch (Exception e) {
return false;
}
return true;
}
Cerrar Conexiones
La conexines devuelta al almacen de conexiones cuando el programa llamante
llama al mtodo JDCConnection.close en su clasulafinally.
public void close() throws SQLException {
pool.returnConnection(this);
}
Aplicacin de Ejemplo
Usamos un almacen de conexiones en una aplicacin de forma similar a como
usaramos cualquiere otro driver JDBC. Aqu est el cdigo de un RegistrationBean
controlado por el Bean. Este RegistrationBean se ha adaptado desde la casa de
subastas de JavaBeans enterprise descrito en los coatulo 1 -3.
Cuando se crea el primer objeto RegistrationBean, crea un ejemplar esttico de
la clase JDCConnectionDriver. Este objeto driver esttico se registra a s mismo
con el DriverManager en el constructor JDCConnectionDriver poniendo
disponibles la solicitudes de conexiones para todos los objetos RegistrationBean
creados por la aplicacin cliente.
Pasar la URL como jdbc:jdc:jdcpool en el mtodo getConnection permite que el
DriverManager corresponda la getConnection solicitada al driver registrado. El
DriverManager usa un sencillo String para encontrar un driver disponible que
pueda manejar URLs en ese formato.
public class RegistrationBean implements EntityBean{
private transient EntityContext ctx;
public String theuser, password;
public String creditcard, emailaddress;
public double balance;
//Static class instantiation
static {
try{
new pool.JDCConnectionDriver(
"COM.cloudscape.core.JDBCDriver",
"jdbc:cloudscape:ejbdemo",
"none", "none");
}catch(Exception e){}
}
public Connection getConnection()
throws SQLException{
return DriverManager.getConnection(
"jdbc:jdc:jdcpool");
}
}
Ozito
Caractersticas y Herramientas de Rendimiento
La nueva Mquina Virtual Java
TM
(JVM) tiene caractersticas para mejorar el
rendimiento, y podemos usar un nmero de herramientas para incrementar el
rendimiento de la aplicacin o reducir el tamao de los ficheros Class generados.
Por eso las caractersticas y herramientas mejoran el rendimiento de nuestra
aplicacin con muy pocos o casi ningn cambio en en nuestra aplicacin.
Caractersticas de la Mquina Virtual Java
Compiladores Just-In-Time
Herramientas de Terceras Partes
Caractersitcas de la Mquina Virtual Java (JVM)
La plataforma Java 2 ha presentamo muchas mejoras de rendimiento sobre
versiones anteriores, incluyendo asignacin ms rpida de memoria, reduccin del
tamao de las clases, mejorar la recoleccin de basura, monitores lineales y un JIT
interno como estndard. Cuando usamo la nueva JVM de Java 2 nada ms sacarla
de la caja veremos una mejora, sin embargo para entendiendo como funciona el
aumento de velocidad podemos ajustar nuestra aplicacin para exprimir hasta el
ltimo bit de rendimiento.
Mtodos en Lnea
La versin Java 2 de la JVM automticamente alinea mtodos sencillo en el
momento de la ejecucin. En una JVM sin optimizar, cada vez que se llama a un
mtodo, se crea un nuevo marco de pila. La creaccin de un nuevo marco de pila
requiere recursos adicionales as como algn re-mapeo de la pila, el resultado final
crear nuevos marcos de pila incurre en una pequea sobrecarga.
Los mtodos en lnea aumenta el rendimiento reduciendo el nmero de llamadas a
mtodos que hace nuestro programa. La JVM alnea mtodos que devuelven
constantes o slo acceden a campos internos. Para tomar ventaja de los mtodos
en lnea podemos hacer una de estas dos cosas. Podemos hacer que un mtodo
aparezca atractivo para que la JVM lo ponga en lnea o ponerlo manualmente en
lnea si no rompe nuestro modelo de objetos. La alineacin manual en este
contexto slo significa poner el cdigo de un mtodo dentro del mtodo que lo ha
llamado.
El alineamiento automtico de la JVM se ilustra con este pequeo ejemplo:
public class InlineMe {
int counter=0;
public void method1() {
for(int i=0;i<1000;i++)
addCount();
System.out.println("counter="+counter);
}
public int addCount() {
counter=counter+1;
return counter;
}
public static void main(String args[]) {
InlineMe im=new InlineMe();
im.method1();
}
}
En el estado actual, el mtodo addCount no parece muy atractivo para el detector
en lnea de la JVM porque el mtodo addCount devuelve un valor. Para ver si ste
mtodo est en lnea compilamos el ejemplo con este perfil activado:
java -Xrunhprof:cpu=times InlineMe
Esto genera un fichero de salida java.hprof.txt. Los 10 primeros mtodos se
parecern a esto:
CPU TIME (ms) BEGIN (total = 510)
Thu Jan 28 16:56:15 1999
rank self accum count trace method
1 5.88% 5.88% 1 25 java/lang/Character.
<clinit>
2 3.92% 9.80% 5808 13 java/lang/String.charAt
3 3.92% 13.73% 1 33 sun/misc/
Launcher$AppClassLoader.
getPermissions
4 3.92% 17.65% 3 31 sun/misc/
URLClassPath.getLoader
5 1.96% 19.61% 1 39 java/net/
URLClassLoader.access$1
6 1.96% 21.57% 1000 46 InlineMe.addCount
7 1.96% 23.53% 1 21 sun/io/
Converters.newConverter
8 1.96% 25.49% 1 17 sun/misc/
Launcher$ExtClassLoader.
getExtDirs
9 1.96% 27.45% 1 49 java/util/Stack.peek
10 1.96% 29.41% 1 24 sun/misc/Launcher.<init>
Si cambiamos el mtodo addCount para que no devuelva ningn valor, la JVM lo
pondr en lnea durante la ejecucin. Para amigable el cdigo en lnea
reemplazamos el mtodo addCount con esto:
public void addCount() {
counter=counter+1;
}
Y ejecutamos el perfil de nuevo:
java -Xrunhprof:cpu=times InlineMe
Esta vez el fichero de salida java.hprof.txt debera parecer diferente. El mtodo
addCount se ha ido. Ha sido puesto en lnea!
CPU TIME (ms) BEGIN (total = 560)
Thu Jan 28 16:57:02 1999
rank self accum count trace method
1 5.36% 5.36% 1 27 java/lang/
Character.<clinit>
2 3.57% 8.93% 1 23 java/lang/
System.initializeSystemClass
3 3.57% 12.50% 2 47 java/io/PrintStream.<init>
4 3.57% 16.07% 5808 15 java/lang/String.charAt
5 3.57% 19.64% 1 42 sun/net/www/protocol/file/
Handler.openConnection
6 1.79% 21.43% 2 21 java/io/InputStreamReader.fill
7 1.79% 23.21% 1 54 java/lang/Thread.<init>
8 1.79% 25.00% 1 39 java/io/PrintStream.write
9 1.79% 26.79% 1 40 java/util/jar/
JarFile.getJarEntry
10 1.79% 28.57% 1 38 java/lang/Class.forName0
Sincronizacin
Los mtodos y objetos sincronizados en Java han tenido un punto de rendimiento
adicional como el mecanismo utilizado para implementar el bloqueo de este cdigo
usando un registro de monitor glogal que slo fue enhebrado en algunas reas
como la bsqueda de monitores existentes. En la versin Java 2, cada thread tiene
un registro de monitor y por eso se han eliminado mucho de esos cuellos de
botellas.
Si hemos usado prviamente otros mecanimos de bloqueos porque el punto de
rendimiento con los mtodos sincronizados merece la pena re-visitar ese cdigo y
incorporarle los bloqueos en lnea de Java 2.
En el siguiente ejemplo que est creando monitores para el bloque sincronizado
podemos alcanzar un 40% de aumento de velocidad. El tiempo empleado fue 14ms
usando JDK 1.1.7 y slo 10ms con Java 2 en una mquina Sun Ultra 1.
class MyLock {
static Integer count=new Integer(5);
int test=0;
public void letslock() {
synchronized(count) {
test++;
}
}
}
public class LockTest {
public static void main(String args[]) {
MyLock ml=new MyLock();
long time = System.currentTimeMillis();
for(int i=0;i<5000;i++ ) {
ml.letslock();
}
System.out.println("Time taken="+
(System.currentTimeMillis()-time));
}
}
Java Hotspot
La mquina virtual Java HotSpot
TM
es la siguiente generacin de implementaciones
de la mquina virtual de Sun Microsystem. La Java HotSpot VM se adhiere a la
misma especificacin que la JVM de Java 2, y ejecuta los mismos bytecodes, pero
ha sido rediseada para lanzar nuevas tecnologas como los modelos de la
optimizacin adaptativa y de recoleccin de basura mejorada para mejorar
dramticamente la velocidad del JVM.
Optimizacin Adaptativa
El Java Hotspot no incluye un compilador interno JIT pero en su lugar compila y
pone mtodos en lnea que parecen ser los ms utilizados en la aplicacin. Esto
significa que en el primer paso por los bytescodes Java son interpretados como si
ni tubieramos un compilador JIT. Si el cdigo aparece como un punto caliente de
nuestra aplicacin el compilador Hotspot compilar los bytecodes a cdigo nativo
que es almacenado en un cach y los mtodos en lnea al mismo tiempo.
Una ventaja de la compilazin selectiva sobre un compilador JIT es que el
compilador de bytes puede gastar ms tiempo en generar alta optimizacin para
reas que podran provocar la mayor optimizacin. el compilador tambin puede
compiladr cdigo que podra ejecutarse mejor en modo intrprete.
En el versiones anteriores de la Java HotSpot VM donde no era posible optimizar
cdigo que no estba actualmente en uso. El lado negativo de esto es que la
aplicacin estaba en una enorme bucle y el optimizador no poda compilar el cdigo
del rea hasta que el bucle finalizara. Posteriores versiones de la Java Hotspot VM,
usa un reemplazamiento en la pila, significando que el cdigo puede ser compilado
en cdigo nativo incluso si est siendo utilizado por el intrprete.
Recoleccin de Basura Mejorada
El recolector de basura usado en el la Java HotSpot VM presenta varias mejoras
sobre los recolectores de basura existentes. El primero es que el recolector se ha
convertido en un recolector de basura totalmente seguro. Lo que esto significa es
que el recoelcto sabe exactamente qu es una referencia y qu son slo datos. El
uso de referencias directas a objetos en el heap en una Java HotSpot VM en lugar
de usar manejadores de objetos. Este incremento del conocimiento significa que la
fragmentacin de memoria puede reducirse con un resultado de una huella de
memoria ms compacta.
La segunda mejora es el uso de cpiado generacional. Java crea un gran nmero
de objetos en la pila y frecuentemente estos objetos tenan una vida muy corta.
Reemplazado los objetos creados recientemente por un cubo de memoria,
esperando a que el cubo se lene y luego slo copiando los objetos vivos restantes a
una nuevo rea del bloque de memoria que el cubo puede liberar en un bloque.
Esto significa que la JVM no tiene que buscar un hueco para colocar cada nuevo
objeto en la pila y significa que se necesita manejar secciones de memoria ms
pequeas de una vez.
Para objetos viejos el recolector de basura hace un barrido a travs del hepa y
compacta los huecos de los objetos muertos directamente, eliminando la necesidad
de una lista libre usada en algoritmos de recoleccin de basura anteriores.
El tercer rea de mejora es eliminar la percepcin de pausar en la recoleccin de
basura escalonando la compactacinde grandes objetos liberados en pequeos
grupos y compactndolos de forma incremental.
Sincronizacin Rpida de Threads
La Java HotSpot VM also mejora el cdigo de sincronizacin existente. Los bloques
y mtodos sincronizados siempren representan una sobrecarga cuando se ejecutan
en una JVM. El Java HotSpot implementa los propios puntos de entrada y salida del
monitor de sincroniacin y no dependen del Sistema Operativo local para
proporcionar esta sincronizacin. Este resultado es un gran aumento de la
velocidad especialmente en las frecuentes aplicaciones GUI sincronizadas.
Compiladores Just-In-Time
La herramienta ms sencilla para mejorar el rendimiento de nuestra aplicacin el
compilador Just-In-Time (JIT). Un JIT es un generador de cdigo que convierte los
bytecodes Java en cdigo nativo de la mquina. Los programas Java invocados con
un JIT generalmente se ejecutan ms rpidos que cuando se ejecutan en
bytecodes por el intrprete. La Java Hotspot VM elimina la necesidad de un
compilador JIT en muchos casos, sin embargo podran utilizar el compilador JIT en
versiones anteriores.
El compilador JIT se puso disponible como una actualizacin de rendimiento en la
versin Java Development Kit (JDK
TM
) 1.1.6 y ahora es una herramienta estndard
invocada siempre qu eusamos el intrprete java en la versin de la plataforma
Java 2. Podemos desactivar el uso del compilador JIT usando la opcin
-Djava.compiler=NONE en la JVM.
Cmo Funcionan los Compiladores JIT?
Los compiladores JIT se suministran como libreras nativas dependientes de la
plataforma. Si xiste la librera del compilador JIT, la JVM inicializa el JNI (Java
Native Interface) para llamar a las funciones JIT disponibles en la librera en lugar
de su funcin equivalente del intrprete.
Se usa la clase java.lang.Compiler para cargar la librera nativa y empezar la
inicializacin dentro del compilador JIT.
Cuando la JVM llama a un mtodo Java, usa un mtodo llamante como especificado
en el bloque mtodo del objeto class cargado. La JVM tiene varios mtodos
llamantes, por ejemplo, se utiliza un llamante diferente si el mtodo es
sincronizado o si es un mtodo nativo.
El compilador JIT usa su propio llamante. Las versin de Sun chequean el bit de
aceso al mtodo por un valor ACC_MACHINE_COMPILED para notificarle al
intrprete que el cdigo de est mtodo ya est compilado y almacenado en las
clases cargadas.
Cuando el se compilado el cdigo JIT?
Cuando se llama a un mtodo por primera vez el compilador JIT compilad el bloque
del mtodo a cdigo nativo y lo almacena en un bloque de cdigo.
Una vez que el cdigo ha sido compilado se activa el bit
ACC_MACHINE_COMPILED, que es usado en la plataforma Sun.
Cmo puedo ver lo que est haciendo el compilador JIT?
La variable de entorno JIT_ARGS permite un control sencillo sobre el compilador
JIT en Sun Solaris. Hay dos valores tiles trace y exclude(list). Para excluir los
mtodos del ejemplo InlineMe un mostrar un seguimiennto seleccionamos
JIT_ARGS de esta forma:
Unix:
export JIT_ARGS="trace exclude(InlineMe.addCount
InlineMe.method1)"
$ java InlineMe
Initializing the JIT library ...
DYNAMICALLY COMPILING java/lang/System.getProperty
mb=0x63e74
DYNAMICALLY COMPILING java/util/Properties.getProperty
mb=0x6de74
DYNAMICALLY COMPILING java/util/Hashtable.get
mb=0x714ec
DYNAMICALLY COMPILING java/lang/String.hashCode
mb=0x44aec
DYNAMICALLY COMPILING java/lang/String.equals
mb=0x447f8
DYNAMICALLY COMPILING java/lang/String.valueOf
mb=0x454c4
DYNAMICALLY COMPILING java/lang/String.toString
mb=0x451d0
DYNAMICALLY COMPILING java/lang/StringBuffer.<init>
mb=0x7d690
<<<< Inlined java/lang/String.length (4)
Observa que los mtodos en lnea como String.length est exentos. El metodo
String.length tambin es un mtodo especial y es normalmente compilado en un
atajo de bytecodes interno para el intrprete java. Cuando usamos el compilador
JIT ests optimizaciones proporcionadas por el intrprete Java son desactivadas
para activar el compilador JIT para entender qu mtodo est siendo llamado.
Cmo Aprovechar la Ventaja del Compilador JIT?
Lo primero a recordar es que el compilador JIT consigue la mayora del aumento de
velocidad la segunda vez que llama a un mtodo. El compilador JIT compila el
mtodo completo en lugar de intrpretarlo lnea por lnea que tambin puede ser
una ganancia de rendimiento cuando se ejecuta una aplicacin el JIT activado. Esto
significa que si el cdigo slo se llama una vez no veremos una ganancia de
rendimiento significante. El compilador JIT tambin ignora los constructores de las
clases por eso si es posible debemos mantener al mnimo el cdigo en los
constructores.
El compilador JIT tambin consigue una ganancias menores de rendimiento al no
prechequear ciertas condiciones Java como punteros Null o excepciones de array
fuera de lmites. La nica forma de que el compilador JIT conozca una excepcin de
puntero null es mediante una seal lanzada por el sistema operativo. Como la
seal viene del sistema operativo y no de la JVM, nuestro programa mejora su
rendimiento. Para asegurarnos el mejor rendimiento cuando se ejecuta una
aplicacin con el JIT, debemos asegurarnos de que nuestro cdigo est muy limpio
y sin errores como excepciones de punteros null o arrays fuera de lmites.
Podramos querer desactivar el compilador JIT su estmos ejecutando la JVM en
modo de depuracin remoto, o si queremos ver los nmeros de lneas en vez de la
etiqueta (Compiled Code) en nuestos seguimientos de pila. Para desactivar el
compilador JIT, suministramos un nombre no vlido o un nombre en blanco para el
compilador JIT cuando invoquemos al intrprete. Los siguientes ejemplos muestran
el comando javac para compilar el cdigo fuente en bytecodes, y dos formas del
comando java para invocar al intrprete sin el compilador JIT:
javac MyClass.java
java -Djava.compiler=NONE MyClass
o
javac MyClass.java
java -Djava.compiler="" MyClass
Herramientas de Terceras Partes
Hay otras herramientas disponibles incluidas aquellas que reducen el tamao de los
ficheros class generados. El fichero class Java contiene un rea llamada almacen
de constantes. Este almacen de constantes mantiene una lista de strings y otra
informacin del fichero class para referencias. Unas de las piezas de informacin
disponibles en el almacen de constantes son los nombres de los mtodos y
campos.
El fichero class se refiere a un campo de la clase como a una referencia a un
entrada en el almacen de constantes. Esto significa que mientras las referencias
permanezcan iguales no importa los valores almacenados en el almacen de
constantes. Este conocimiento es explotado por varias herramientas que reescriben
los nombres de los campos y de los mtodos en el almacen de constantes con
nombres recortardos. Esta tcnica puede reducir el tamao del fichero class en un
porcentaje significante con el beneficio de que un fichero class ms pequeo
significa un tiempo de descarga menor.
Ozito
Anlisis de Rendimiento
Otra forma de aumentar el rendimiento es con nalisis de rendimiento. Los anlisis
de rendimientos buscan las ejecucin del programa apuntar donde podran estar
los cuellos de botella y otros problemas de rendimiento como los picos de
memoria. Una vez que sables donde estn los puntos de problemas potenciales
podemos cambiar nuestro cdigo para eliminar o reducir su impacto.
Perfilado
Analizar un Programa
Herramientas de Rendimiento del Sistema Operativo
Perfiles
Las Mquinas Vituales Java
TM
(JVMs) han tenido la habilidad de proporcionar
sencillos informes de perfiles desde Java Development Kit (JDK
TM
) 1.0.2. Sin
embargo, la informacin que ellos proporcionaban estaban limitadas a una lista de
los mtodos que un programa haba llamado.
La plataforma Java 2 proporciona muchas ms capacidades de perfilado que las
anteriormente disponibles y el anlisis de estos datos generado se ha hecho ms
fcil por la emergencia de un "Heap Analysis Tool" (HAT). Esta herramienta, como
implica su nombre, nos permite analizar los informes de perfiles del heap. El heap
es un bloque de memoria que la JVM usa cuando se est ejecutando. La
herramienta de anlisis de heap nos permite generar informes de objetos que
fueron usado al ejecutar nuestra aplicacin. No slo podemos obtener un listado de
los mtodos llamados ms frecuentemente y la memoria usada en llamar a esos
mtodos, pero tambin podemos seguir los picos de memeoria. Los picos de
memoria pueden tener un significante impacto en el rendimiento.
Analizar un Programa
Para analizar el programa TableExample3 incluido en el directorio
demo/jfc/Table de la plataforma Java 2, necesitamos generar un informe de
perfil. El informa ms sencillo de generar es un perfil de texto. Para generarlo,
ejecutamos la aplicacin el parmetro -Xhprof. En la versin final de la plataforma
Java 2, esta opcin fue renombrada como -Xrunhprof. Para ver una lista de
opciones actualmente disponibles ejecutamos el comando:
java -Xrunhprof:help
Hprof usage: -Xrunhprof[:help]|[<option>=<value>, ...]
Nombre de Opcin y Valor Descripcin Por Defecto
-------------------------- --------------- ---------------
heap=dump|sites|all heap profiling all
cpu=samples|times|old CPU usage off
monitor=y|n monitor contention n
format=a|b ascii or binary output a
file=<file> write data to file java.hprof(.txt for ascii)
net=<host>:<port>
send data over a
socket
write to file
depth=<size> stack trace depth 4
cutoff=<value> output cutoff point 0.0001
lineno=y|n line number in traces y
thread=y|n thread in traces? n
doe=y|n dump on exit? y
Example: java -Xrunhprof:cpu=samples,file=log.txt,
depth=3 FooClass
La siguiente invocacin crea una fichero de texto que podemos ver sin la
herramienta de anlisis de heap llamado java.hprof.txt cuando el programa
genera un seguimiento de pila o sale. Se utiliza una invocacin diferente para crear
un fichero binario para usarlo con la herramienta de anlisis de heap:
java -Xrunhprof TableExample3
d:\jdk12\demo\jfc\Table> java -Xrunhprof TableExample3
Dumping Java heap ... allocation sites ... done.
La opcin de perfil literalmente hace un diario de cada objeto creado en el heap,
por incluso cuando arrancamos y paramos el pequeo progeama TableExample3
resulta un ficheo de informe de cuatro megabytes. Aunque la herramienta de
anlisis de heap usa una versin binaria de este fichero y proporciona un sumario,
hay algunas cosas rpidas y fciles que podemos aprender desde el fichero de
texto sin usar la herramienta de anlisis de heap.
Nota: Para listar todas las opciones disponibles, usamos
java -Xrunhprof:help
Ver el Fichero de Texto
Elegimos un fichero que pueda manejar grandes ficheros y vamos hasta el final del
fichero. Podra haber cientos o miles de lneas, por eso un atajo es buscar las
palabras SITES BEGIN. Veramos una lista de lnea que empezaran un tango
creciente de nmeros seguido por dos nmeros de porcentaje. La primera entrada
en la lista sera similar a este ejemplo:
SITES BEGIN (ordered by live bytes)
Sun Dec 20 16:33:28 1998
percent live alloc'ed stackclass
rankself accum bytes objsbytes objstrace name
1 55.86%55.86%8265165 8265165 3981 [S
La notacin [S al final de la ltima lnea indica que es la primera entrada de un
array de short, un tipo primitivo. Esto es lo esperado con aplicaciones (AWT). Los
primeros cinco contadores bajo la cabecera objs significa que actualmente hay
cinco de esos arrays, y slo ha habido cinco durante el tiempo de vida de esta
aplicacin, y han ocupado 826516 bytes. La referencia clase de este objeto es el
valor listado bajp stack trace. Para encontrar donde se creo est objeto en este
ejmplo, buscamos TRACE 3981. Veremos esto:
TRACE 3981:
java/awt/image/DataBufferUShort.<init>(
DataBufferUShort.java:50)
java/awt/image/Raster.createPackedRaster(
Raster.java:400)
java/awt/image/DirectColorModel.
createCompatibleWritableRaster(
DirectColorModel.java:641)
sun/awt/windows/WComponentPeer.createImage(
WComponentPeer.java:186)
El cdigo TableExample3 selecciona un scrollpane de 700 por 300. Cuando
miramos el fuente de Raster.java, qu est en el fichero src.jar, encontraremos
estas sentencias en la lnea 400:
case DataBuffer.TYPE_USHORT:
d = new DataBufferUShort(w*h);
break;
Los valores w y h son la anchura y altura de la llamada a createImage que
arranca en TRACE 3981. El constructor DataBufferUShort crea un array de
shorts:
data = new short[size];
donde size es w*h. Por eso, en teora debera hacer una entrada en el array para
210000 elementos. Buscamos una enteada por cada ejemplarizacin de esta clase
buscando por trace=3981. Una de las cinco entradas se parecer a esto:
OBJ 5ca1fc0 (sz=28, trace=3979,
class=java/awt/image/DataBufferUShort@9a2570)
data 5ca1670
bankdata 5ca1f90
offsets 5ca1340
ARR 5ca1340 (sz=4, trace=3980, nelems=1,
elem type=int)
ARR 5ca1670 (sz=420004, trace=3981, nelems=210000,
elem type=short)
ARR 5ca1f90 (sz=12, trace=3982, nelems=1,
elem type=[S@9a2d90)
[0] 5ca1670
Podemos ver que los valores de los datos de estas referencias de imagen en un
array 5ca1670 que devuelve un alista de 210000 elementos short de tamao 2.
Esto significa qu este array usa 420004 bytes de memoria.
De este dato podemos concluir que el programa TableExample3 usa cerca de
0.5Mb para mapear cada tabal. Si la aplicacin de ejemplo se ejecuta en una
mquina con poca memoria, debemos asegurarnos de que no mantenemos
referencias a objetos geandes o a imgenes que fueron construidas con el mtodo
createImage.
La Herramienta de Anlisis de Heap
Esta herramienta puede analizar los mismos datos que nosotros, pero requere un
fichero de informe binario como entrada. Podemos generar un fichero de informa
binario de esta forma:
java -Xrunhprof:file=TableExample3.hprof,format=b
TableExample3
Para generar el informe binario, cerramos la ventana TableExample3. El fichero
de informe binario TableExample3.hprof se crea al salir del programa. La
Herramienta de Anlisis de Heap arranca un servidor HTTP que analiza el fichero de
perfil binario y muestra el resultado en un HTML que podemos ver en un
navegador.
Podemos obtener una copia de la Herramienta de Anlisis de Heap de la site
java.sun.com. Una vez instalado, ejecutamos los scripts shell y batch en el
directorio bin instalado para poder ejecutar el servidor de la Herramienta de
Anlisis de Heap de esta forma:
>hat TableExample3.hprof
Started HCODEP server on port 7000
Reading from /tmp/TableExample3.hprof...
Dump file created Tue Jan 05 13:28:59 PST 1999
Snapshot read, resolving...
Resolving 17854 objects...
Chasing references,
expect 35 dots.......................
Eliminating duplicate
references.........................
Snapshot resolved.
Server is ready.
La salida de arriba nos dice que nuestro servidor HTTP se ha arrancado en el
puerto 7000. Para ver este informe introducimos la URL http://localhost:7000 o
http://your_machine_name:7000 en nuestro navegador Web. Si tenemos
problema en arrancar el servidor usando el script, podemos alternativamente
ejecutar la aplicacin incluyendo el fichero de clases hat.zip en nuestro
CLASSPATH y usar el siguiente comando:
java hat.Main TableExample3.hprof
La vista del informe por defecto contiene una lista de todas las clases. En la parte
de abajo de est pgina inicial estn las dos opciones bsicas de informes:
Show all members of the rootset
Show instance counts for all classes
Si seleccionamos el enlace Show all members of the rootset, veremos un alista
de las siguientes referencias porque estas referencias apuntan a picos potenciales
de memoria.
Java Static References
Busy Monitor References
JNI Global References
JNI Local References
System Class References
Lo que vemos aqu son ejemplares en la aplicacin que tienen referencias a objetos
que tienen un riesgo de no se recolectados para la basura. Esto puede ocurrir
algunas veces en el caso del JNI su se asigna memoria para un objeto, la memoria
se deja para que la libere el recolector de basura, y el recolector de basura no
teine la informacin que necesita para hacerlo. En esta lista de referencias,
estamos principalmente interesados en un gran nmero de referencias a objetos o
a objetos de gran tamao.
El otro informe clave es el Show instance counts for all classes. Este lista los
nmeros de llamadas a un mtodo particular. Los objetos array String y
Character, [S y [C, estn siempre en la parte superior de esta lista, pero algunos
objetos son un poco ms intrigantes. Por qu hay 323 ejemplares de
java.util.SimpleTimeZone, por ejemplo?
5109 instances of class java.lang.String
5095 instances of class [C
2210 instances of class java.util.Hashtable$Entry
968 instances of class java.lang.Class
407 instances of class [Ljava.lang.String;
323 instances of class java.util.SimpleTimeZone
305 instances of class
sun.java2d.loops.GraphicsPrimitiveProxy
304 instances of class java.util.HashMap$Entry
269 instances of class [I
182 instances of class [Ljava.util.Hashtable$Entry;
170 instances of class java.util.Hashtable
138 instances of class java.util.jar.Attributes$Name
131 instances of class java.util.HashMap
131 instances of class [Ljava.util.HashMap$Entry;
130 instances of class [Ljava.lang.Object;
105 instances of class java.util.jar.Attributes
Para obtener ms informacin sobre los ejemplares SimpleTimeZone, pulsamos
sobre el enlace (la lnea que empieza por 323). Esto listar las 323 referencias y
calcular cunta memoria ha sido utilizada. en este ejemplo, se han utilizado
21964 bytes.
Instances of java.util.SimpleTimeZone
class java.util.SimpleTimeZone
java.util.SimpleTimeZone@0x004f48c0 (68 bytes)
java.util.SimpleTimeZone@0x003d5ad8 (68 bytes)
java.util.SimpleTimeZone@0x004fae88 (68 bytes)
.....
Total of 323 instances occupying 21964 bytes.
Si pulsamos sobre uno de estos ejemplares SimpleTimeZone, veremos donde fue
asignado este objeto.
Object allocated from:
java.util.TimeZoneData.<clinit>(()V) :
TimeZone.java line 1222
java.util.TimeZone.getTimeZone((Ljava/lang/String;)
Ljava/util/TimeZone;) :
TimeZone.java line (compiled method)
java.util.TimeZone.getDefault(
()Ljava/util/TimeZone;) :
TimeZone.java line (compiled method)
java.text.SimpleDateFormat.initialize(
(Ljava/util/Locale;)V) :
SimpleDateFormat.java line (compiled method)
En este ejemplo el objeto fue asignado desde TimeZone.java. El fichero fuente de
este fichero estn el fichero estndard src.jar, y examinando este fichero,
podemos ver que de hehco hay cerca de 300 de estos objetos en memoria.
static SimpleTimeZone zones[] = {
// The following data is current as of 1998.
// Total Unix zones: 343
// Total Java zones: 289
// Not all Unix zones become Java zones due to
// duplication and overlap.
//-------------------------------------------
new SimpleTimeZone(-11*ONE_HOUR,
"Pacific/Niue" /*NUT*/),
Desafortunadamente, no tenemos control sobre la memoria usada en este ejemplo,
porque es asignada cuando el programa hizo la primera solicitud al timezone por
defecto. Sin embargo, esta misma tcnica puede aplicarse para analizar nuestra
propia aplicacin donde probablemente podramos hacer algunas mejoras.
Dnde Gasta el Tiempo la Aplicaci?
De nuevo, podemos usar el parmetro -Xrunhprof para obtener informacin sobre
el tiempo que gasta la aplicacin procesando un mtodo particular.
Podemos usar una o dos opciones de perfil de CPU para conseguir esto. La primera
opcin es cpu=samples. Esta opcin devuelve el resultado de un muestreo de
ejecucin de threads de la Mquina Virtual Java con un conteo estadstico de la
frecuencia de ocurrencia con que se usa un mtodo particular para encontrar
secciones ocupadas de la aplicacin. La segunda opcin es cpu=times, que mide
el tiempo que tardan los mtodos individuales y genera un ranking del porcentaje
total del tiempo de CPU ocupado por la aplicacin.
Usando la opcin cpu=times, deberamos ver algo como esto al final del fichero
de salida:
CPU TIME (ms) BEGIN (total = 11080)
Fri Jan 8 16:40:59 1999
rank self accum count trace method
1 13.81% 13.81% 1 437 sun/
awt/X11GraphicsEnvironment.initDisplay
2 2.35% 16.16% 4 456 java/
lang/ClassLoader$NativeLibrary.load
3 0.99% 17.15% 46 401 java/
lang/ClassLoader.findBootstrapClass
Si constrastamos esto con la salida de cpu=samples, veremos la diferencia entre
la frecuencia de ejecucinde un mtodo durante la ejecucin de la aplicacin
comparada con el tiempo que tarda ese mtodo.
CPU SAMPLES BEGIN (total = 14520)
Sat Jan 09 17:14:47 1999
rank self accum count trace method
1 2.93% 2.93% 425 2532 sun/
awt/windows/WGraphics.W32LockViewResources
2 1.63% 4.56% 237 763 sun/
awt/windows/WToolkit.eventLoop
3 1.35% 5.91% 196 1347 java/
text/DecimalFormat.<init>
El mtodo W32LockView, que llama a una rutina de bloqueo de ventana nativa,
se llama 425 veces. Por eso cuando aparecen en los threads activos porque
tambin toman tiempo para completarse. En contraste, el mtodo initDisplay slo
se le llama una vez, pero es el mtodo que tarda ms tiempo en completarse en
tiempo real.
Herramientas de Rendimiento de Sistema Operativo
Algunas veces los cuellos de botella del rendimiento ocurren al nivel del sistema
operativo. Esto es porque la JVM depende en muchas operacioens de las libreras
del sistema operativo para funcionalidades como el acceso a disco o el trabajo en
red. Sin embargo, lo que ocurre despus de que la JVM haya llamado a estas
libreras va ms alla de las herramientas de perfilado de la plataforma Java.
Aqu hay una lista de herramietnas que podemos usar para analizar problemas de
rendimiento en algunos sistemas operativos ms comunies.
Plataforma Solaris
System Accounting Reports, sar, informa de la actividad del sistema en trminos
de I/O de disco, actividad del programa de usuario, y actividad a nivel del sistema.
Si nuestra aplicacin usa una cantidad de memoria excesiva, podra requerir
espacio de intercambio en disco, por lo que veriamos grandes porcentajes en la
columna WIO. Los programas de usuario que se quedan en un bucle ocupado
muestran un alto porcentaje en la columna user:
developer$ sar 1 10
SunOS developer 5.6 Generic_105181-09 sun4u
02/05/99
11:20:29 %usr %sys %wio %idle
11:20:30 30 6 9 55
11:20:31 27 0 3 70
11:20:32 25 1 1 73
11:20:33 25 1 0 74
11:20:34 27 0 1 72
El comando truss sigue y guarda los detalles de cada llamada al sistema por la
JVM al kernel Solaris. Un forma comn de usar truss es:
truss -f -o /tmp/output -p <process id>
El parmetro -f sigue cualquier proceso hijo que haya creado, el parmetro -o
escribe la salida en el fichero nombrado, y el parmetro -p sigue un programa en
ejecucin desde sis ID de proceso. De forma alternativa podemos reemplazar -p
<process id> con la JVM, por ejemplo:
truss -f -o /tmp/output java MyDaemon
El /tmp/output es usado para almacenar la salida de truss, lo que se debera
parecer a esto:
15573: execve("/usr/local/java/jdk1.2/solaris/
bin/java", 0xEFFFF2DC,
0xEFFFF2E8) argc = 4
15573: open("/dev/zero", O_RDONLY) = 3
15573: mmap(0x00000000, 8192,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE, 3, 0) = 0xEF7C0000
15573: open("/home/calvin/java/native4/libsocket.so.1",
O_RDONLY) Err#2 ENOENT
15573: open("/usr/lib/libsocket.so.1",
O_RDONLY) = 4
15573: fstat(4, 0xEFFFEF6C) = 0
15573: mmap(0x00000000, 8192, PROT_READ|PROT_EXEC,
MAP_SHARED, 4, 0) = 0xEF7B00 00
15573: mmap(0x00000000, 122880, PROT_READ|PROT_EXEC,
MAP_PRIVATE, 4, 0) = 0xEF7 80000
15573: munmap(0xEF78E000, 57344) = 0
15573: mmap(0xEF79C000, 5393,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_FIXED, 4, 49152)
= 0xEF79C000
15573: close(4) = 0
En la salida de truss, buscamos los ficheros que fallaran al abrirlos debido a
problemas de acceso, como un error ENOPERM, o un error de fichero
desaparecido ENOENT. Tambin podemos seguir los datos leidos o escrito con los
parmetros de truss: -rall para seguir todos los datos ledos, o -wall para seguir
todos los datos escritos por el programa. Con estos parmetros, es posible analizar
datos enviados a travs de la red o a un disco local.
Plataforma Linux
Linux tiene un comando trace llamado strace. Sigue las llamadas del sistema al
kernel Linux. Este ejemplo sigue el ejemplo SpreadSheet del directorio demo del
JDK:
$ strace -f -o /tmp/output
java sun.applet.AppletViewer
example1.html
$ cat /tmp/output
639 execve("/root/java/jdk117_v1at/java/
jdk117_v1a/bin/java", ["java",
"sun.applet.AppletViewer ",
"example1.html"], [/* 21 vars */]) = 0
639 brk(0) = 0x809355c
639 open("/etc/ld.so.preload", O_RDONLY) = -1
ENOENT (No such file or directory)
639 open("/etc/ld.so.cache", O_RDONLY) = 4
639 fstat(4, {st_mode=0, st_size=0, ...}) = 0
639 mmap(0, 14773, PROT_READ, MAP_PRIVATE,
4, 0) = 0x4000b000
639 close(4) = 0
639 open("/lib/libtermcap.so.2", O_RDONLY) = 4
639 mmap(0, 4096, PROT_READ, MAP_PRIVATE,
4, 0) = 0x4000f000
Para obtener informacin del sistema similar al comando sar de Solaris, lee los
contenidos del fichero /proc/stat. El formato de este fichero se describe en las
pginas del manual proc. Miramos la lnea cpu para obtener la hora del sistema de
usuario:
cpu 4827 4 1636 168329
En el ejemplo anterior, la salida cpu indica 48.27 segundos de espacio de usuario,
0.04 de prioridad mxima, 16.36 segundos procesando llamadas al sistema, y 168
segundos libre. Esta es una ejecucin total, las entradas para cada proceso estn
disponibles en /proc/<process_id>/stat.
Plataforma Windows95/98/NT
No hay herramientas de anlisis de rendimiento estndard incluidas en estas
plataformas, pero si hay herramientas de seguimiento disponibles mediante
recursos freeware o shareware como http://www.download.com .
Anlisis de memoria: Memory meter
Anlisis de Red: Traceplus
Ozito
C
a
c
h


e
n

A
p
l
i
c
a
c
i
o
n
e
s

C
l
i
e
n
t
e
/
S
e
r
v
i
d
o
r
E
l

c
a
c
h


e
s

u
n
a

d
e

l
a
s

p
r
i
m
e
r
a

t

c
n
i
c
a
s

u
s
a
d
a
s

p
a
r
a

a
u
m
e
t
n
a
r

e
l

r
e
n
d
i
m
i
e
n
t
o

d
e

n
a
v
e
g
a
d
o
r
e
s

y

s
e
r
v
i
d
o
r
e
s

w
e
b
.

E
l

c
a
c
h


d
e
l

n
a
v
e
g
a
d
o
r

h
a
c
e

i
n
n
e
c
e
s
a
r
i
o
s

l
o
s

b
l
o
q
u
e
o
s

d
e

r
e
d
p
o
r
q
u
e

u
n
a

c
o
p
i
a

r
e
c
i
e
n
t
e

d
e
l

f
i
c
h
e
r
o

s
e

m
a
n
t
i
e
n
e

e
n

e
l

c
a
c
h


l
o
c
a
l
,

y

e
l

c
a
c
h


d
e
l

s
e
r
v
i
d
o
r

r
e
d
u
c
e

e
l

c
o
s
t
e

d
e

l
a

c
a
r
g
a

d
e

f
i
c
h
e
r
o
s

d
e
s
d
e

d
i
s
c
o

p
a
r
a

c
a
d
a

p
e
t
i
c
i

n
.

E
s
t
a

s
e
c
c
i

n
e
x
p
l
i
c
a

c

m
o

p
o
d
e
s

u
s
a
r

e
l

c
a
c
h


d
e

f
o
r
m
a

s
i
m
i
l
a
r

p
a
r
a

m
e
j
o
r
a
r

e
l

r
e
n
d
i
m
i
e
n
t
o

e
n

m
u
c
h
a
s

a
p
l
i
c
a
c
i
o
n
e
s

c
l
i
e
n
t
e
/
s
e
r
v
i
d
o
r

e
s
c
r
i
t
a
s

e
n

l
e
n
g
u
a
j
e

J
a
v
a
T
M
.
E
l

A
P
I

j
a
v
a
.
u
t
i
l
.
C
o
l
l
e
c
t
i
o
n
s

d
i
s
p
o
n
i
b
l
e

e
n

e
l

S
D
K

J
a
v
a


2

h
a
c
e

s
e
n
c
i
l
l
a

l
a

i
m
p
l
e
m
e
n
t
a
c
i

n

d
e
l

c
a
c
h

.

E
s
t
e

A
P
I

p
r
o
p
o
r
c
i
o
n
a

l
a

c
l
a
s
e

H
a
s
h
M
a
p
,

q
u
e

f
u
n
c
i
o
n
a

b
i
e
n

p
a
r
a

c
a
c
h
e
a
r

u
n
o
b
j
e
t
o
,

y

l
a

c
l
a
s
e

L
i
n
k
e
d
L
i
s
t
,

q
u
e

f
u
n
c
i
o
n
a

b
i
e
n

e
n

c
o
m
b
i
n
a
c
i
o
n
e
s

c
o
n

l
a

c
l
a
s
e

H
a
s
h
M
a
p

p
a
r
a

c
a
c
h
e
a
r

m
u
c
h
o
s

o
b
j
e
t
o
s
.
C
a
c
h


d
e

u
n

O
b
j
e
t
o




C
a
c
h


d
e

M
u
c
h
o
s

O
b
j
e
t
o
s




C
a
c
h


d
e

u
n

O
b
j
e
t
o
U
n

o
b
j
e
t
o

H
a
s
h
M
a
p

a
l
m
a
c
e
n
a

o
b
j
e
t
o
s

e
n

u
n
a

p
a
r
e
j
a

c
l
a
v
e

v
a
l
o
r
.

c
u
a
n
d
o

p
o
n
e
m
o
s

u
n

d
a
t
p

e
n

u
n

H
a
s
h
M
a
p
,

l
e

a
s
i
g
n
a
m
o
s

u
n
a

c
l
a
v
e

y

l
u
e
g
o

u
s
a
m
o
s

e
s
a

c
l
a
v
e

p
a
r
a

r
e
c
u
p
e
r
a
r

e
l
d
a
t
o
.
U
n

o
b
j
e
t
o

H
a
s
h
M
a
p

e
s

m
u
y

s
i
m
i
l
a
r

a

u
n

H
a
s
h
t
a
b
l
e

y

p
u
e
d
e

s
e
r

u
s
a
d
o

p
a
r
a

m
a
n
t
e
n
e
r

u
n
a

c
o
p
i
a

t
e
m
p
o
r
a
l

d
e

r
e
s
u
l
t
a
d
o
s

g
e
n
e
r
a
d
o
s

p
r

v
i
a
m
e
n
t
e
.

L
o
s

o
b
j
e
t
o
s

m
a
n
t
e
n
i
d
o
s

e
n

e
l
c
a
c
h

H
a
s
h
M
a
p

p
o
d
r

a
,

p
o
r

e
j
e
m
p
l
o
,

s
e
r

u
n
a

l
i
s
t
a

d
e

s
u
b
a
s
t
a
s

c
o
m
p
l
e
t
a
d
a
s
.
E
n

e
s
t
e

c
a
s
o
,

l
o
s

r
e
s
u
l
t
a
d
o
s

d
e

u
n
a

c
o
n
s
u
l
t
a

J
D
B
C

p
o
d
r

a
n

s
o
l
i
c
i
t
a
r
s
e

c
i
e
n
t
o
s

d
e

v
e
c
e
s

e
n

u
n

s
e
g
u
n
d
o

p
o
r

p
e
r
s
o
n
a
s

q
u
e

e
s
t

n

e
s
p
e
r
a
n
d
o

c
o
n
o
c
e
r

l
a

p
u
j
a

m

s

a
l
t
a
,

p
e
r
o

l
a

l
i
s
t
a

d
e
r
e
s
u
l
t
a
d
o
s

c
o
m
p
l
e
t
a

s

l
o

c
a
m
b
i
a

u
n
a

v
e
z

p
o
r

m
i
n
u
t
o

c
u
a
n
d
o

s
e

o
m
p
l
e
t
a

u
n
a

s
u
b
a
s
t
a
.

P
o
d
e
m
o
s

e
s
c
r
i
b
i
r

n
u
e
s
t
r
o

p
r
o
g
r
a
m
a

p
a
r
a

r
e
c
u
p
e
r
a
r

l
o
s

o
b
j
e
t
o
s

q
u
e

n
o

h
a
n

c
a
m
b
i
a
d
o

d
e
s
d
e

e
l
c
a
c
h


d
e

r
e
s
u
l
t
a
d
o
s

e
n

v
e
z

d
e

s
o
l
i
c
i
t
a
r

a

l
a

b
a
s
e

d
e

d
a
t
o
s

c
a
d
a

v
e
z

y

o
b
t
e
n
e
r

u
n

s
i
g
n
i
f
i
c
a
n
t
e

a
u
m
e
n
t
o

d
e

r
e
n
d
i
m
i
e
n
t
o
.
E
s
t
e
e
j
e
m
p
l
o

d
e

c

d
i
g
o

e
j
e
c
u
t
a

u
n
a

c
o
n
s
u
l
t
a

a

l
a

b
a
s
e

d
e

d
a
t
o
s

p
o
r

c
a
d
a

m
i
n
u
t
o
,

y

d
e
v
u
e
l
v
e

c
o
p
i
a
s

c
a
c
h
e
a
d
a
s

p
a
r
a

l
a
s

s
o
l
i
c
i
t
u
d
e
s

q
u
e

v
i
e
n
e
n

e
n
t
r
e

c
o
n
s
u
l
t
a
s
.
i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
i
m
p
o
r
t

j
a
v
a
.
i
o
.
*
;
c
l
a
s
s

D
B
C
a
c
h
e
R
e
c
o
r
d

{


O
b
j
e
c
t

d
a
t
a
;


l
o
n
g

t
i
m
e
;


p
u
b
l
i
c

D
B
C
a
c
h
e
R
e
c
o
r
d
(
O
b
j
e
c
t

r
e
s
u
l
t
s
,

l
o
n
g

w
h
e
n
)

{




t
i
m
e
=
w
h
e
n
;




d
a
t
a
=
r
e
s
u
l
t
s
;


}


p
u
b
l
i
c

O
b
j
e
c
t

g
e
t
R
e
s
u
l
t
s
(
)

{








r
e
t
u
r
n

d
a
t
a
;


}


p
u
b
l
i
c

l
o
n
g

g
e
t
L
a
s
t
M
o
d
i
f
i
e
d
(
)

{








r
e
t
u
r
n

t
i
m
e
;


}
}p
u
b
l
i
c

c
l
a
s
s

D
B
C
a
c
h
e

{


M
a
p

c
a
c
h
e
;


p
u
b
l
i
c

D
B
C
a
c
h
e
(
)

{




c
a
c
h
e

=

n
e
w

H
a
s
h
M
a
p
(
)
;


}


p
u
b
l
i
c

O
b
j
e
c
t

g
e
t
D
B
D
a
t
a
(
S
t
r
i
n
g

d
b
c
o
m
m
a
n
d
)

{




i
f
(
!
c
a
c
h
e
.
c
o
n
t
a
i
n
s
K
e
y
(
d
b
c
o
m
m
a
n
d
)
)

{








s
y
n
c
h
r
o
n
i
z
e
d
(
c
a
c
h
e
)

{










c
a
c
h
e
.
p
u
t
(
d
b
c
o
m
m
a
n
d
,

r
e
a
d
D
B
D
a
t
a
(
d
b
c
o
m
m
a
n
d
)
)
;









}





}

e
l
s
e

{







i
f
(
(
n
e
w

D
a
t
e
(
)
.
g
e
t
T
i
m
e
(
)

)

-









(
(
D
B
C
a
c
h
e
R
e
c
o
r
d
)
c
a
c
h
e
.
g
e
t
(
















d
b
c
o
m
m
a
n
d
)
)
.
g
e
t
L
a
s
t
M
o
d
i
f
i
e
d
(
)
>
=
1
0
0
0
)

{









s
y
n
c
h
r
o
n
i
z
e
d
(
c
a
c
h
e
)

{











c
a
c
h
e
.
p
u
t
(
d
b
c
o
m
m
a
n
d
,

r
e
a
d
D
B
D
a
t
a
(
d
b
c
o
m
m
a
n
d
)
)
;










}







}





}





r
e
t
u
r
n

(
(
D
B
C
a
c
h
e
R
e
c
o
r
d
)
c
a
c
h
e
.
g
e
t
(








d
b
c
o
m
m
a
n
d
)
)
.
g
e
t
R
e
s
u
l
t
s
(
)
;


}


p
u
b
l
i
c

O
b
j
e
c
t

r
e
a
d
D
B
D
a
t
a
(
S
t
r
i
n
g

d
b
c
o
m
m
a
n
d
)

{
/
*
I
n
s
e
r
t

y
o
u
r

J
D
B
C

c
o
d
e

h
e
r
e

F
o
r

E
x
a
m
p
l
e
:


R
e
s
u
l
t
S
e
t

r
e
s
u
l
t
s
=
s
t
m
t
.
e
x
e
c
u
t
e
Q
u
e
r
y
(
d
b
c
o
m
m
a
n
d
)
;
*
/




S
t
r
i
n
g

r
e
s
u
l
t
s
=
"
e
x
a
m
p
l
e

r
e
s
u
l
t
s
"
;




r
e
t
u
r
n
(
n
e
w

D
B
C
a
c
h
e
R
e
c
o
r
d
(
r
e
s
u
l
t
s
,
n
e
w






























D
a
t
e
(
)
.
g
e
t
T
i
m
e
(
)
)
)
;


}


p
u
b
l
i
c

s
t
a
t
i
c

v
o
i
d

m
a
i
n
(
S
t
r
i
n
g

a
r
g
s
[
]
)

{




D
B
C
a
c
h
e

d
1
=
n
e
w

D
B
C
a
c
h
e
(
)
;




f
o
r
(
i
n
t

i
=
1
;
i
<
=
2
0
;
i
+
+
)

{








d
1
.
g
e
t
D
B
D
a
t
a
(










"
s
e
l
e
c
t

c
o
u
n
t
(
*
)

f
r
o
m

r
e
s
u
l
t
s

w
h
e
r
e











T
O
_
D
A
T
E
(
r
e
s
u
l
t
s
.
c
o
m
p
l
e
t
e
d
)

<
=
S
Y
S
D
A
T
E
"
)
;




}


}
}
C
a
c
h
e

d
e

M
u
c
h
o
s

O
b
j
e
t
o
s
A
l
g
u
n
a
s

v
e
c
e
s

q
u
e
r
e
m
o
s

c
a
c
h
e
a
r

m

s

d
e

u
n

o
b
j
e
t
o
.

P
o
r

e
j
e
m
p
l
o
,

p
o
d
r

a
m
o
s

q
u
e
r
e
r

m
a
n
t
e
n
e
r

l
o
s

f
i
c
h
e
r
o
s

a
c
c
e
d
i
d
o
s

m

s

r
e
c
i
e
n
t
e
m
e
n
t
e

e
n

e
l

c
a
c
h


d
e

u
n

s
e
r
v
i
d
o
r

w
e
b
.

S
i

u
s
a
m
o
s
u
n

o
b
j
e
t
o

H
a
s
h
M
a
p

p
a
r
a

u
n

p
r
o
p

s
i
t
o

c
o
m
o

e
s
t
e
,

c
o
n
t
i
n
u
a
r


c
r
e
c
i
e
n
d
o

y

u
s
a
n
d
o

m
u
c
h
a

m
e
m
o
r
i
a
.
S
i

n
u
e
s
t
r
a

m

q
u
i
n
a

t
i
e
n
e

u
n
a

g
r
a
n

c
a
n
t
i
d
a
d

d
e

m
e
m
o
r
i
a

y

s

l
o

u
n

p
e
q
u
e

o

n

m
e
r
o

d
e

o
b
j
e
t
o
s

q
u
e

c
a
c
h
e
a
r

e
n
t
o
n
c
e
s

u
n

c
r
e
c
i
e
n
t
e

H
a
s
h
M
a
p

p
o
d
r

a

n
o

s
e
r

u
n

p
r
o
b
l
e
m
a
.

S
i
n
e
m
b
a
r
g
o
,

s
i

e
s
t
a
m
o
s

i
n
t
e
n
t
a
r

c
a
c
h
e
a
r

m
u
c
h
o
s

o
b
j
e
t
o
s

e
n
t
o
n
c
e
s

p
o
d
r

a
m
o
s

q
u
e
r
e
s

s

l
o

m
a
n
t
e
n
e
r

l
o
s

o
b
j
e
t
o
s

m

s

r
e
c
i
e
n
t
e
s

e
n

e
l

c
a
c
h


p
r
o
p
o
r
c
i
o
n
a
n
d
o

e
l

m
e
j
o
r

u
s
o

d
e

l
a

m

m
o
r
i
a
d
e

l
a

m

q
u
i
n
a
.

P
o
d
e
m
o
s

c
o
m
b
i
n
a
r

u
n

o
b
j
e
t
o

H
a
s
h
M
a
p

c
o
n

u
n

L
i
n
k
e
d
L
i
s
t

p
a
r
a

c
r
e
a
r

u
n

c
a
c
h


l
l
a
m
a
d
o

"
M
o
s
t

R
e
c
e
n
t
l
y

U
s
e
d
"

(
M
R
U
)
.
C
o
n

u
n

c
a
c
h


M
R
U
,

p
o
d
e
m
o
s

s
i
t
u
a
r

u
n
a

r
e
s
t
r
i
c
c
i

n

s
o
b
r
e

l
o
s

o
b
j
e
t
o
s

q
u
e

p
e
r
m
a
n
e
c
e
n

e
n

e
l

c
a
c
h

,

y

p
o
r

l
o

t
a
n
t
o
,

c
o
n
t
r
o
l

s
o
b
r
e

e
l

t
a
m
a

o

d
e
l

c
a
c
h

.

H
a
y

t
r
e
s

o
p
e
r
a
c
i
o
n
e
s
p
r
i
n
c
i
p
a
l
e
s

q
u
e

p
u
e
d
e

r
e
a
l
i
z
a
r

u
n

c
a
c
h


M
R
U
:
S
i

e
l

c
a
c
h


n
o

e
s
t


l
l
e
n
o
,

l
o
s

n
u
e
v
o
s

o
b
j
e
t
o
s

q
u
e

n
o

e
s
t

n

e
n

e
l

c
a
c
h


s
e

i
n
s
e
r
t
a
n

e
n

l
a

p
a
r
t
e

s
u
p
e
r
i
o
r

d
e

l
a

l
i
s
t
a
.




S
i

e
l

c
a
c
h


n
o

e
s
t


l
l
e
n
o

y

e
l

o
b
j
e
t
o

a

i
n
s
e
r
t
a

y
a

e
s
t


e
n

e
l

c
a
c
h

,

s
e

m
u
e
v
e

a

l
a

p
a
r
t
e

s
u
p
e
r
i
o
r

d
e
l

c
a
c
h




S
i

e
l

c
a
c
h


e
s
t


l
l
e
n
o

y

s
e

i
n
s
e
r
t
a

u
n

n
u
e
v
o

o
b
j
e
t
o
,

e
l

l
t
i
m
o

o
b
j
e
t
o

d
e
l

c
a
c
h


e
s

e
l
i
m
i
n
a
d
o

y

e
l

n
u
e
v
o

o
b
j
e
t
o

s
e

p
o
n
e

e
n

l
a

p
a
r
t
e

s
u
p
e
r
i
o
r

d
e

l
a

l
i
s
t
a
.




E
s
t
e

d
i
a
g
r
a
m
a

m
u
e
s
t
r
a

c

m
o

t
r
a
b
a
j
a
n

j
u
n
t
o
s

L
i
n
k
e
d
L
i
s
t

y

H
a
s
h
M
a
p

p
a
r
a

i
m
p
l
e
m
e
n
t
a
r

l
a
s

o
p
e
r
a
c
i
o
n
e
s

d
e
s
c
r
i
t
a
s

a
r
r
i
b
a
.
C
a
c
h


M
R
U

c
o
n

L
i
n
k
e
d
L
i
s
t

y

H
a
s
h
M
a
p
E
l
L
i
n
k
e
d
L
i
s
t

p
r
o
p
o
r
c
i
o
n
a

e
l

m
e
c
a
n
i
s
m
o

d
e

c
o
l
a
,

y

l
a
s

e
n
t
r
a
d
a
s

d
e

l
a

L
i
n
k
e
d
L
i
s
t

c
o
n
t
i
e
n
e
n

l
a

c
l
a
v
e

d
e

l
o
s

d
a
t
o
s

e
n

e
l

H
a
s
h
M
a
p
.

P
a
r
a

a

a
d
i
r

u
n
a

n
u
e
v
a

e
n
t
r
a
d
a

e
n

l
a

p
a
r
t
e
s
u
p
e
r
i
o
r

d
e

l
a

l
i
s
t
a
,

s
e

l
l
a
m
a

a
l

m

t
o
d
o

a
d
d
F
i
r
s
t
.
S
i

l
a

l
i
s
t
a

y
a

e
s
t


l
l
e
n
a
,

s
e

l
l
a
m
a

a
l

m

t
o
d
o

r
e
m
o
v
e
L
a
s
t

y

a

e
n
t
r
a
d
a

d
e

d
a
t
o
s

t
a
m
b
i

n

s
e

e
l
i
m
i
n
a

d
e
l

H
a
s
h
M
a
p
.




S
i

u
n
a

e
n
t
r
a
d
a

y
a

e
x
i
s
t
e

e
n

l
a

l
i
s
t
a
,

s
e

e
l
i
m
i
n
a

c
o
n

u
n
a

l
l
a
m
a
d
a

a
l

m

t
o
d
o

r
e
m
o
v
e

y

s
e

i
n
s
e
r
t
a

e
n

l
a

p
a
r
t
e

s
u
p
e
r
i
o
r

d
e

l
a

l
i
s
t
a

c
o
n

u
n
a

l
l
a
m
a
d
a

a
l

m

t
o
d
o

a
d
d
F
i
r
s
t
.




E
l

A
P
I

C
o
l
l
e
c
t
i
o
s

n
o

i
m
p
l
e
m
e
n
t
a

b
l
o
q
u
e
o
s
,

p
o
r

e
s
o

s
i

e
l
i
m
i
n
a
d
o
s

o

a

a
d
i
m
o
s

e
n
t
r
a
d
a
s

a

o
b
j
e
t
o
s

L
i
n
k
e
d
L
i
s
t

o

H
a
s
h
M
a
p
,

n
e
c
e
s
i
t
a
m
o
s

b
l
o
q
u
e
a
r

l
o
s

a
c
c
e
s
o
s

a

e
s
o
s

o
b
j
e
t
o
s
.

T
a
m
b
i

n
p
o
d
e
m
o
s

u
s
a
r

u
n

V
e
c
t
o
r

o

A
r
r
a
y
L
i
s
t

p
a
r
a

o
b
t
e
n
e
r

e
l

m
i
s
m
o

r
e
s
u
l
t
a
d
o

m
o
s
t
r
a
d
o

e
n

e
l

c

d
i
d
o

d
e

a
b
a
j
o

d
e
l

L
i
n
k
e
d
L
i
s
t
.
E
s
t
e
e
j
e
m
p
l
o

d
e

c

d
i
g
o

u
s
a

u
n

c
a
c
h


M
R
U

p
a
r
a

m
a
n
t
e
n
e
r

u
n

c
a
c
h


d
e

f
i
c
h
e
r
o
s

c
a
r
g
a
d
o
s

d
e
s
d
e

d
i
s
c
o
.

C
u
a
n
d
o

s
e

s
o
l
i
c
i
t
a

u
n

f
i
c
h
e
r
o
,

e
l

p
r
o
g
r
a
m
a

c
h
e
q
u
e
a

p
a
r
a

v
e
r

s
i

e
l

f
i
c
h
e
r
o

e
s
t

e
n

e
l

c
a
c
h

.

S
i

e
l

f
i
c
h
e
r
o

n
o

e
s
t


e
n

e
l

c
a
c
h

,

e
l

p
r
o
g
r
a
m
a

l
e
e

e
l

f
i
c
h
e
r
o

d
e
s
d
e

e
l

d
i
s
c
o

y

s
i
t

a

u
n
a

c
o
p
i
a

e
n

e
l

c
a
c
h


a
l

p
r
i
n
c
i
p
i
o

d
e

l
a

l
i
s
t
a
.
S
i

e
l

f
i
c
h
e
r
o

e
s
t


e
n

e
l

c
a
c
h

,

e
l

p
r
o
g
r
a
m
a

c
o
m
p
a
r
a

l
a

f
e
c
h
a

d
e

m
o
d
i
f
i
c
a
c
i

n

d
e
l

f
i
c
h
e
r
o

y

l
a

e
n
t
r
a
d
a

d
e
l

c
a
c
h

.
S
i

l
a

e
n
t
r
a
d
a

d
e
l

c
a
c
h


e
s

m

s

v
i
e
j
a
,

e
l

p
r
o
g
r
a
m
a

l
e
e

e
l

f
i
c
h
e
r
o

d
e
l

d
i
s
c
o
,

e
l
i
m
i
n
a

l
a

c
o
p
i
a

d
e
l

c
a
c
h

,

y

s
i
t

a

u
n
a

n
u
e
v
a

c
o
p
i
a

e
n

e
l

c
a
c
h


e
n

l
a

p
a
r
t
e

s
u
p
e
r
i
o
r

d
e
l

L
i
n
k
e
d
L
i
s
t
.




S
i

e
l

f
i
c
h
e
r
o

e
s

m

s

v
i
e
j
o

q
u
e

e
l

c
a
c
h

,

e
l

p
r
o
g
r
a
m
a

o
b
t
i
e
n
e

e
l

f
i
c
h
e
r
o

d
e
l

c
a
c
h


y

m
u
e
v
e

l
a

c
o
p
i
a

d
e
l

c
a
c
h


a

l
a

p
a
r
t
e

s
u
p
e
r
i
o
r

d
e

l
a

l
i
s
t
a
.




i
m
p
o
r
t

j
a
v
a
.
u
t
i
l
.
*
;
i
m
p
o
r
t

j
a
v
a
.
i
o
.
*
;
c
l
a
s
s

m
y
F
i
l
e

{


l
o
n
g

l
a
s
t
m
o
d
i
f
i
e
d
;


S
t
r
i
n
g

c
o
n
t
e
n
t
s
;


p
u
b
l
i
c

m
y
F
i
l
e
(
l
o
n
g

l
a
s
t
,

S
t
r
i
n
g

d
a
t
a
)

{




l
a
s
t
m
o
d
i
f
i
e
d
=
l
a
s
t
;




c
o
n
t
e
n
t
s
=
d
a
t
a
;


}


p
u
b
l
i
c

l
o
n
g

g
e
t
L
a
s
t
M
o
d
i
f
i
e
d
(
)

{




r
e
t
u
r
n

l
a
s
t
m
o
d
i
f
i
e
d
;


}


p
u
b
l
i
c

S
t
r
i
n
g

g
e
t
C
o
n
t
e
n
t
s
(
)

{




r
e
t
u
r
n

c
o
n
t
e
n
t
s
;


}
}p
u
b
l
i
c

c
l
a
s
s

M
R
U
C
a
c
h
e

{


M
a
p

c
a
c
h
e
;


L
i
n
k
e
d
L
i
s
t

m
r
u
l
i
s
t
;


i
n
t

c
a
c
h
e
s
i
z
e
;


p
u
b
l
i
c

M
R
U
C
a
c
h
e
(
i
n
t

m
a
x
)

{




c
a
c
h
e

=

n
e
w

H
a
s
h
M
a
p
(
)
;




m
r
u
l
i
s
t
=

n
e
w

L
i
n
k
e
d
L
i
s
t
(
)
;




c
a
c
h
e
s
i
z
e
=
m
a
x
;


}


p
u
b
l
i
c

S
t
r
i
n
g

g
e
t
F
i
l
e
(
S
t
r
i
n
g

f
n
a
m
e
)

{




i
f
(
!
c
a
c
h
e
.
c
o
n
t
a
i
n
s
K
e
y
(
f
n
a
m
e
)
)

{






s
y
n
c
h
r
o
n
i
z
e
d
(
c
a
c
h
e
)

{








i
f
(
m
r
u
l
i
s
t
.
s
i
z
e
(
)

>
=
c
a
c
h
e
s
i
z
e
)

{










c
a
c
h
e
.
r
e
m
o
v
e
(
m
r
u
l
i
s
t
.
g
e
t
L
a
s
t
(
)
)
;










m
r
u
l
i
s
t
.
r
e
m
o
v
e
L
a
s
t
(
)
;








}








c
a
c
h
e
.
p
u
t
(
f
n
a
m
e
,

r
e
a
d
F
i
l
e
(
f
n
a
m
e
)
)
;









m
r
u
l
i
s
t
.
a
d
d
F
i
r
s
t
(
f
n
a
m
e
)
;






}




}

e
l
s
e

{






i
f
(
(
n
e
w

F
i
l
e
(
f
n
a
m
e
)
.
l
a
s
t
M
o
d
i
f
i
e
d
(
)
)
>









(
(
m
y
F
i
l
e
)
c
a
c
h
e
.
g
e
t
(
f
n
a
m
e
)
)
.
g
e
t
L
a
s
t
M
o
d
i
f
i
e
d
(
)
)

{










s
y
n
c
h
r
o
n
i
z
e
d
(
c
a
c
h
e
)

{













c
a
c
h
e
.
p
u
t
(
f
n
a
m
e
,

r
e
a
d
F
i
l
e
(
f
n
a
m
e
)
)
;











}







}







s
y
n
c
h
r
o
n
i
z
e
d
(
c
a
c
h
e
)

{









m
r
u
l
i
s
t
.
r
e
m
o
v
e
(
f
n
a
m
e
)
;









m
r
u
l
i
s
t
.
a
d
d
F
i
r
s
t
(
f
n
a
m
e
)
;







}




}







r
e
t
u
r
n

(
(
m
y
F
i
l
e
)
c
a
c
h
e
.
g
e
t
(
f
n
a
m
e
)
)
.
g
e
t
C
o
n
t
e
n
t
s
(
)
;


}


p
u
b
l
i
c

m
y
F
i
l
e

r
e
a
d
F
i
l
e
(
S
t
r
i
n
g

n
a
m
e
)

{




F
i
l
e

f

=

n
e
w

F
i
l
e
(
n
a
m
e
)
;




S
t
r
i
n
g
B
u
f
f
e
r

f
i
l
e
c
o
n
t
e
n
t
s
=

n
e
w

S
t
r
i
n
g
B
u
f
f
e
r
(
)
;




t
r
y

{






B
u
f
f
e
r
e
d
R
e
a
d
e
r

b
r
=
n
e
w

B
u
f
f
e
r
e
d
R
e
a
d
e
r
(






























n
e
w

F
i
l
e
R
e
a
d
e
r
(
f
)
)
;






S
t
r
i
n
g

l
i
n
e
;






w
h
i
l
e
(
(
l
i
n
e

=
b
r
.
r
e
a
d
L
i
n
e
(
)
)

!
=

n
u
l
l
)

{








f
i
l
e
c
o
n
t
e
n
t
s
.
a
p
p
e
n
d
(
l
i
n
e
)
;






}





}

c
a
t
c
h

(
F
i
l
e
N
o
t
F
o
u
n
d
E
x
c
e
p
t
i
o
n

f
n
f
e
)
{






r
e
t
u
r
n

(
n
u
l
l
)
;




}

c
a
t
c
h

(

I
O
E
x
c
e
p
t
i
o
n

i
o
e
)

{
















r
e
t
u
r
n

(
n
u
l
l
)
;




}






r
e
t
u
r
n

(
n
e
w

m
y
F
i
l
e
(
f
.
l
a
s
t
M
o
d
i
f
i
e
d
(
)
,

















f
i
l
e
c
o
n
t
e
n
t
s
.
t
o
S
t
r
i
n
g
(
)
)
)
;


}


p
u
b
l
i
c

v
o
i
d

p
r
i
n
t
L
i
s
t
(
)

{




f
o
r
(
i
n
t

i
=
0
;
i
<
m
r
u
l
i
s
t
.
s
i
z
e
(
)
;
i
+
+
)

{






S
y
s
t
e
m
.
o
u
t
.
p
r
i
n
t
l
n
(
"
i
t
e
m

"
+
i
+
"
=
"
+
m
r
u
l
i
s
t
.
g
e
t
(
i
)
)
;




}


}


p
u
b
l
i
c

s
t
a
t
i
c

v
o
i
d

m
a
i
n
(
S
t
r
i
n
g

a
r
g
s
[
]
)

{




/
/

N
u
m
b
e
r

o
f

e
n
t
r
i
e
s

i
n

M
R
U

c
a
c
h
e

i
s

s
e
t

t
o

1
0





M
R
U
C
a
c
h
e

h
1
=
n
e
w

M
R
U
C
a
c
h
e
(
1
0
)
;




f
o
r
(
i
n
t

i
=
1
;
i
<
=
2
0
;
i
+
+
)

{






/
/

f
i
l
e
s

a
r
e

s
t
o
r
e
d

i
n

a

s
u
b
d
i
r
e
c
t
o
r
y

c
a
l
l
e
d

d
a
t
a






h
1
.
g
e
t
F
i
l
e
(
"
d
a
t
a
"
+
F
i
l
e
.
s
e
p
a
r
a
t
o
r
C
h
a
r
+
i
)
;




}






h
1
.
p
r
i
n
t
L
i
s
t
(
)
;


}
}
O
z
i
t
o
Desplegar la Aplicacin Subasta
Con la aplicacin subasta testeada, depurada y ajustada, estamos listos para
desplegarla. Desplegarla implica unir todos los ficheros de la aplicacin, moverlos a
sus localizaciones, instalar el Java Plug-In para que los administradores de la
subasta puedan ejecutar el applet Administration desde sus navegadores, e instalar
el fichero de polica del applet Administration. El Java Plug-In es necesario porque
el applet Administration est escrito con el Java Development Kit (JDK
TM
) 1.2, pero
los navegadores de los administradores podran ejecutar versiones anteriores del
software Java Runtime Environment
TM
(JRE).
Este captulo explica como usar el formato de ficheros Java Archive (JAR) para unir
los ficheros de la aplicacin, y cmo instalar el Java Plug-In y un fichero de policia
de seguridad para las plataformas Solaris
TM
y Win32 para ejecutar el applet
Administration.
Formato de Ficheros Java Archive (JAR)
Plataforma Solaris
Plataforma Win32
Tienes Prisa?
Esta tabla contiene enlaces directos a los tpicos especficos.
Tpico Seccin
Formato de Ficheros JAR Unir y Desplegar Ficheros HTML
Unir y Desplegar los Beans Enterprise
Unir y Desplegar el Applet Administration
Plataforma Solaris Obtener las Descargas
Extraer los Ficheros Descargados
Instalar Java Plug-In
Instalar las Mejoras del Java Plug-In
Instalar Netscape Communicator
Chequear la Instalacin
Convertir Ficheros HTML
Fichero de Polica de Seguridad
Ejecutar el Applet Administration
Plataforma Win32 Descargar e Instalar
Convertir Ficheros HTML
Ficheros de Polica de Seguridad
Ejecutar el Applet Administration
Ozito
Formato de Ficheros JAR
El formato de ficheros Java JAR es un formato de compresin y empaquetado de
ficheros y una herramienta para unir ficheros ejecutables con otros ficheros
relacionados con la aplicacin por eso pueden desplegarse en una sla unidad. La
aplicacin de subasta, tiene tres unidades o ficheros para desplegar en tres
diferentes localizaciones.
Los ficheros HTML que crean el interface de usuario de la aplilcacin
desplegado en una localizacin accesible bajo el servidor web.
1.
Los Beans Enterprise desplegado en una localizacin interna accesible a
nuestro servidor de JavaBeans Enterprise
TM
.
2.
El Applet Administration desplegado a una localizacin interna accesible para
los administradores de la subasta donde es ejecutado por sus navegadores
3.
Esta seccin nos muestra cmo usar la herramienta jar unir y desplegar los
ficheros de la aplicacin.bundle and deploy the application files.
Unir y Desplegar los Ficheros HTML
Unir y Desplegar los Beans Enterprise
Unir y Desplegar el Applet Administration
Unir y Desplegar los Ficheros HTML
Aqu hay una lista de ficheros HTML que crean el interface de usuario de la
aplicacin subasta:
all.html
close.html
details.html
index.html
juggler.med.gif
new.html
registration.html
search.html
sell.html
Aqu est el comando jar que los une. Todo va en un slo fichero. Este comando se
ejecuta en el mismo directorio que los ficheros. Si lo ejecutamos desde otro
directorio distinto tenemos que especificar el path completo o relativo segn
corresponda.
jar cvf HTML.jar all.html close.html details.html
index.html juggler.med.gif new.html
registration.html search.html sell.html
jar es el comando jar. Si tecleamos jar sin opciones, optenemos la siguiente
pantalla de ayuda. Podemos ver de esta pantalla que las opciones cf del comando
jar crean un nuevo fichero JAR llamando HTML.jar y pone la siguiente lista de
ficheros en l. El nuevo fichero JAR se sita en el directorio actual.
kq6py% jar
Usage: jar {ctxu}[vfm0M] [jar-file] [manifest-file]
[-C dir] files ...
Options:
-c create new archive
-t list table of contents for archive
-x extract named (or all) files from archive
-u update existing archive
-v generate verbose output on standard output
-f specify archive file name
-m include manifest information from specified
manifest file
-0 store only; use no ZIP compression
-M Do not create a manifest file for the entries
-C change to the specified directory and include
the following file
If any file is a directory then it is processed
recursively. The manifest file name and the archive
file name needs to be specified in the same order
the 'm' and 'f' flags are specified.
Example 1: to archive two class files into an archive
called classes.jar:
jar cvf classes.jar Foo.class Bar.class
Example 2: use an existing manifest file 'mymanifest'
and archive all the files in the foo/ director
into 'classes.jar':
jar cvfm classes.jar mymanifest -C foo/ .
Para desplegar los ficheros HTML, todo lo que tenemos que hacer es mover el
fichero HTML.jar a un directorio pblicamente accesible bajo el servidor web y
descomprimirlo:
jar xf HTML.jar
Nota: Si hemos incluido un path completo o relativo cuando hemos
aadido los ficheros al fichero JAR, los ficheros se situarn en la misma
estructura de directorio cuando los desempaquetemos.
Unir y Desplegar los Beans Enterprise
Algunoes servidores JavaBeans Enterprise pueden crear el fichero JAR por
nosotros. Sin embargo, si el nuestro no lo hace o si que slo queremos aprender a
hacerlo, esta seccin describe los pasos.
Aqu estn los ficheros del lado del servidor que necesitamos para desplegar los
Beans de Enterprise. Esta lista est tomanda de la aplicacin de subasta original
descrita en el Captulo 2: Cdigo de la Aplicacin Subasta antes de cualquier
modificacin hecha para hacer los Beans Enterprise controlados por contenedor.
Observa la inclusin del descriptor de desarrollo, y de las clases stub y skel del
contenedor-generado.
Paquete auction
Aqu estn los ficheros de aplicacin del paquete auction que crean el servlet
AuctionServlet y el Bean Enterprise AuctionItemBean. Como todos ellos van a
ser instalados en un directorio auction accesible del servidor de produccin
JavaBeans Enterprise, los unimos todos juntos para que puedanser
desempaquetados en un paso en el directorio destino y situados en el subdirectorio
acution.
auction.AuctionServlet.class
auction.AuctionItem.class
auction.AuctionItemBean.class
auction.AuctionItemHome.class
auction.AuctionItemPK.class
auction.DeploymentDescriptor.txt
AuctionItemBeanHomeImpl_ServiceStub.class
WLStub1h1153e3h2r4x3t5w6e82e6jd412c.class
WLStub364c363d622h2j1j422a4oo2gm5o.class
WLSkel1h1153e3h2r4x3t5w6e82e6jd412c.class
WLSkel364c363d622h2j1j422a4oo2gm5o.class
Aqu est cmo unirlos. Toda va en una lnea lnea, y el comando se ejecuta un
directorio por encima de donde se encuentran los ficheros class.
Unix:
jar cvf auction.jar auction/*.class
Win32:
jar cvf auction.jar auction\*.class
Una vez que el fichero JAR se ha copiado en el directorio de destino para los Beans
Enterprise, lo desempaquetamos de esta forma. La extraccincrea un directorio
auction con los ficheros class denrtro.
jar xv auction.jar
Paquete registration
Aqu estn los ficheros de la aplicacin en el paquete registration que crea el
Bean Enterprise Registration.
registration.Registration.class
registration.RegistrationBean.class
registration.RegistrationHome.class
registration.RegistrationPK.class
auction.DeploymentDescriptor.txt
RegistrationBeanHomeImpl_ServiceStub.class
WLStub183w4u1f4e70p6j1r4k6z1x3f6yc21.class
WLStub4z67s6n4k3sx131y4fi6w4x616p28.class
WLSkel183w4u1f4e70p6j1r4k6z1x3f6yc21.class
WLSkel4z67s6n4k3sx131y4fi6w4x616p28.class
Aqu est como unirlo. Todo va en una lnea y el comando se ejecuta un directorio
por encima de donde se encuentran los ficheros class.
Unix:
jar cvf registration.jar registration/*.class
Win32:
jar cvf registration.jar registration\*.class
Una vez que el fichero JAR seha copiado al directorio de destino para los Beans
Enterprise, los desempaquetamos de esta forma. La extraccin crea un directorio
registration con los fichero class dentro de l.
jar xv registration.jar
Paquete bidder
Aqu estn los ficheros de la aplicacin en el paquete bidder que crean el Bean
Enterprise Bidder.
bidder.Bidder.class
bidder.BidderHome.class
bidder.BidderBean.class
auction.DeploymentDescriptor.txt
BidderBeanEOImpl_ServiceStub.class
BidderBeanHomeImpl_ServiceStub.class
WLStub1z35502726376oa1m4m395m4w5j1j5t.class
WLStub5g4v1dm3m271tr4i5s4b4k6p376d5x.class
WLSkel1z35502726376oa1m4m395m4w5j1j5t.class
WLSkel5g4v1dm3m271tr4i5s4b4k6p376d5x.class
Aqu est cmo unirlos. Todo va en un lnea y el comando se ejecuta un directorio
por encima de donde se encuentran los ficheros class.
Unix:
jar cvf bidder.jar bidder/*.class
Win32:
jar cvf bidder.jar bidder\*.class
Una vez que el fichero JAR se ha copiado en el directorio de destino para los Beans
Enterprise, lo desempaquetamos de esta forma. La extraccin crea un directorio
bidder con los ficheros class dentro de l.
jar xv bidder.jar
Paquete seller
Aqu estn los ficheros de la aplicacin en el paquete seller que crea el Bean
Enterprise Seller.
seller.Seller.class
seller.SellerHome.class
seller.SellerBean.class
auction.DeploymentDescriptor.txt
SellerBeanEOImpl_ServiceStub.class
SellerBeanHomeImpl_ServiceStub.class
WLStub3xr4e731e6d2x3b3w5b693833v304q.class
WLStub86w3x4p2x6m4b696q4kjp4p4p3b33.class
WLSkel3xr4e731e6d2x3b3w5b693833v304q.class
WLSkel86w3x4p2x6m4b696q4kjp4p4p3b33.class
Aqu est cmo unirlos. Todo va en un lnea y el comando se ejecuta un directorio
por encima de donde se encuentran los ficheros class.
Unix:
jar cvf seller.jar seller/*.class
Win32:
jar cvf seller.jar seller\*.class
Una vez que el fichero JAR se ha copiado en el directorio de destino para los Beans
Enterprise, lo desempaquetamos de esta forma. La extraccin crea un directorio
seller con los ficheros class dentro de l.
jar xv seller.jar
Unir y Desplegar el Applet Administration
La familia de ficheros del applet Administration consta de los ficheros
AdminApplet.java y polfile.java.
Aque est el comando jar para unirlos. Todo va en una lnea, y el comando se
ejecuta dnde est el fichero de policia que es una directorio por encima de donde
estn los ficheros class.
Unix:
jar cvf applet.jar admin/*.class polfile.java
Win32:
jar cvf applet.jar admin\*.class polfile.java
Para desplegar el applet, copiamos el fichero applet.jar en el directorio de destino
del applet y los extraemos de esta forma. La extraccin crea un directorio admin
con los ficheros del applet Administration dentro de l.
jar xf applet.jar
Nota: El applet usa los APIs JDK 1.2. Necesita un fichero de polica para
acceder a la impresora y Java Plug-In para ejecutarse en un navegador
pre-JDK 1.2 . Puedes encontrar informacin sobre cmo ejecutar el
applet con Java Plug-In y un fichero de polica en las siguientes pginas
Plataforma Solaris y Plataforma Win32.
Ozito
Plataforma Solaris
El software Plug-In de Java
TM
nos permite dirigir applets o componentes JavaBeans
TM
en
pginas de una intranet para que se ejecuten usando el Java Runtime Environment
(JRE) en lugar de la mquina virtual por defecto del navegador. El Java Plug-In funciona
con Netscape Communicator y Microsoft Internet Explorer.
Descarga todo el software que necesites instalar y usa el Java Plug-In que est
disponible desde la pgina de download.
Obtener las Descargar
Extraer los Ficheros Descargados
Instalar el Java Plug-In
Instalar la Mejoras del Java Plug-In
Instalar Netscape Communicator
Chequear la Instalacin
Convertir Ficheros HTML
Ficheros de Polica de Seguridad
Tipos de Ficheros de Polica
Instalar el Fichero de Polica
Cambiar el Nombre o la Posicin

Ejecutar el Applet Administration
Get Downloads
Para istalar y usar el Java Plug-In en Solaris
TM
2.6 o Solaris 7, necesitamos las
siguientes descargar. Ponemos las descargar en cualquier directorio que querramos.
Java Plug-In para Sistemas Operativos Solaris. Esta disponible para plataformas
Intel o Sparc.

Patches Java Plug-In para Solaris 2.6 o Solaris 7, dependiendo de la que
tengamos.

Netscape Communicator 4.5.1 (versn webstart).
Java Plug-In HTML Converter
Estas instrucciones se probarn sobre una Sun Microsystems Ultra 2 ejecutando Solaris
2.6 con Netscape Communicator 4.5.1.
Extraer los Ficheros Descargados
Vamos al directorio dnde descargamos los ficheros y extraemos cada uno.
Extraer los ficheros Java Plug-In:
zcat plugin-12-webstart-sparc.tar.Z | tar -xf -
Extraer los Ficheros del Patch Solaris 2.6:
zcat JPI1.2-Patches-Solaris2.6-sparc.tar.Z | tar -xf -
Extraer Netscape Navigator 4.5.1:
zcat NSCPcom_webstart_sparc.tar.Z | tar -xf -
Instalar el Java Plug-In
La descarga del Java Plug-In incluye una guia de usuario que podemos ver en nuestro
navegador desde el siguiente directorio:
plugin-12-webstart-sparc/Java_Plug-in_1.2.2/
common/Docs/en/Users_Guide_Java_Plug-in.html
La gua de usuario explica cmo instalar el Java Plug-In. Hay varias formas sencillas de
hacerlo, y la secuencia de comandos de abajo es una forma rpida de instalar Java
Plug-In en el directorio por defecto /opt/NSCPcom usando el comando pkgadd:
su
<root password>
cd ~/plugin-12-webstart-sparc
pkgadd -d ./Java_Plug-in_1.2.2/sparc/Product
Instalar las Mejoras Java Plug-In
Antes de poder ejecuar el Java Plug-In, tenemos que instalar las mejoras. Las
instalamos una a una como raz. La siguiente secuencia de comandos va al directorio de
mejoras, lista los ficheros y enva el comando para instalar la primera mejora:
cd ~/JPI1.2-Patches-Solaris2.6-sparC
su
<password>
kq6py#ls
105210-19 105490-07 105568-13
kq6py#./105210-19/installpatch 105210-19
Veremos esta salida cuando la mejora se haya instalado satisfactoriamente:
Patch number 105210-19 has beenZ successfully
installed.
See /var/sadm/patch/105210-19/log for details
Patch packages installed:
SUNWarc
SUNWcsu
Continuamos instalando las mejoraa una por una hasta instalarlas todas. La gua del
usuario proporciona una lista de las mejoras necesarias y sugeridas y enlaces a sitios
donde poder descargar las mejoras sugeridas adicionales si queremos instalarlas.
Instalar Netscape Communicator
Los ficheros extraidos de Netscape Communicator 4.5.1 proporcionan una gua de
usuario en el directorio
/home/monicap/NETSCAPE/Netscape_Communicator_4.51/common/Docs/en
que explica la instalacin. LA siguiente secuencia de comandos es una forma fcil de
hacerlo con el comando pkgadd. Por defecto, la instacin pone Netscape Communicator
en el directorio /opt/NSCPcom donde tambin se instalaron Java Plug-In y las
mejoras.
Cuando extraemos la descarga NSCPcom_webstart_sparc.tar.Z. sita los ficheros en
un directorio NETSCAPE. Desde este directorio ejecutamos la siguientes secuencia de
comandos:
cd ~/NETSCAPE/Netscape_Communicator_4.51/sparc/Product
su
<password>
pkgadd -d .
Chequear la Instalacin
Hay dos formas de chequear nuestra instalacin del Java Plug-In, las mejoras y
Netscape Communicator.
Abrir el men de ayuda de Netscape y seleccin About Plug_Ins. Veremos una lista
de los tipos Mime. Chequeamos esta lista contra la lista presente en la gua de
usuario. Si nuestros tipos mime son correctos, la instalacin est correcta y
completa.
1.
Arrancamos el applet del panel de control, cargando el fichero
/opt/NSCPcom/j2pi/ControlPanel.html. Si el applet arranca la instalacin es
correcta y completa.
2.
El applet de control nos permite cambiar valores por defecto usado en el arranque del
Java Plug-In. Todos los applets ejecutados dentro del Java Plug-In usan esos valores.
cd /opt/NSCPcom/j2pi
ControlPanel &
Instalar el Conversor HTML
Nuestro navegador no usar automaticamente el Java Plug-In cuando carguemos un
fichero HTML con un applet. Tenemos que descargar y ejcutar el Java Plug-In HTML
Converter sobre la pgina HTML que invica al applet para ejecutarlo directamente
usando el Plug-In en lugar de hacerlo en el entorno de ejecucin por defecto del
navegador.
Descomprimimos el fichero de descarga de Plug-In HTML Converter:
unzip htmlconv12.zip
Aadimos el programa HTMLConverter.java o su directorio a nuestro CLASSPATH.
Fichero de Polica de Seguridad
La aplicacin de subasta usa un applet ejecutndose en un navegador para operaciones
administrativas. En la plataforma Java
TM
2, los applets estn restringidos a un entorno
tipo caja sellada y necesitan permisos para acceder a recursos del sistema fuera de ese
entorno restrictivo. Los applets estn restringidos a operaciones de lectura en su
directorio local. Todos las dems operaciones de acceso requieren permisos.
Tipos de Ficheros de Polica
Necesitamos un fichero de polica que conceda permisos al applet Administration. Si el
applet se ejecuta enun disco distinto al del navegador, el applet tambin necesitar
estar firmado. Puedes ver la pgina Applets firmados para ms informacin sobre firmar
y desplegar applets.
Hay tres clases de ficheros de polica: sistema, usuario y programa. El fichero de polica
del sistema est localizado en jdk1.2/jre/lib/security/java.policy o
jre1.2/lib/security/java.policy y contiene permisos para cada uno en el sistema.
El fichero de polica de usuario est en directorio home del usuario. Este fichero
proporciona una forma de dar ciertos permisos de usuario adicioanles a aquellos
concedidos a todos en el sistems. Los permisos del fichero del sistema se combinan con
los permisos del fichero de usuario.
Un fichero de polica de programa puede situarse en cualquier parte. Se le nombra
especficamente cuando se invoca una aplicacin con el comando java o cuando se
invoca un applet con el appletviewer. Cuando una aplicacin o un applet se invocan con
un fichero de polica especfico, los permisos de este fichero ocupan el lugar de (no son
combinados con) los permisos especficados en los ficheros del sistema o de usuario.
Los ficheros de polica de programa se usan para probar programas o para desplegar en
una intraner applets y aplicaciones.
Instalar el Fichero de Polica
Situamos el fichero de polica en nuestro directorio home y lo llamamos .java.policy.
Cuando el applet intente realizar una accin que requiera un fichero de polica con un
permiso, se carga el fichero de polica desde este directorio y permanece en efecto
hasta que salgamos del navegador y lo arranquemos de nuevo.
Si un applet intenta realizar una operacin sin los permisos correctos, sal
discretamente sin lanzar ningn error del applet o del navegador.
Cambiar la Posicin o el Nombre
podemos cambiar el nombre y/o la localizacin de los ficheros de polica del sistema o
de usuario por defecto. Editamos los ficheros jdk1.2/jre/lib/security/java.security
o jre1.2/lib/security/java.security y le aadimos una tercera entrada especificando
el nombre y la localizacin del fichero de polica alternativo.
policy.url.1=
file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
policy.url.3=file:/<mypolicyfile path and name>
Ejecutar el Applet Administration
Copiamos el archivo JAR con el applet Administration y el fichero de polica a su
localizacin final. en este ejemplo la localizacin es el directorio
/home/zelda/public_html. Luego, extraemos el fichero class del applet y el fichero
de polica del fichero JAR:
cp admin.jar /home/zelda/public_html
jar xf applet.jar
La extraccin sita el fichero de polica bajo public_html y crea un directorio admin
bajo el directorio public_html con el fichero class del applet dentro. Renombramos el
fichero de polica del directorio public_html como .java.policy y lo copiamos en
nuestro directorio home.
En el directorio public_html, creamos un fichero HTML que invoque al applet
Administration. Nos debemos asegurar de incluir el directorio admin cuando
especifiquemos la opcin CODE del applet. Observamos que cuando usamos Java
Plug-In, no podemos hacer que el navegador carge el fichero class desde el fichero JAR.
<HTML>
<BODY>
<APPLET CODE=admin/AdminApplet.class
WIDTH=550
HEIGHT=150>
</APPLET>
</BODY>
</HTML>
Arrancamos el HTML Converter.
java HTMLConverter
En el interface grfico de usuario del HTML Converter graphical, seleccionamos One
File:, especificando el path al fichero admin.html, y pulsamos el botn Convert.
Despus de completar la conversin, cargamos el fichero admin.html en nuestro
navegador.
Ozito
Plataformas Win32
En plataformas Win32, el software Java
TM
est unido con el Java 2 Runtime
Environment (JRE). Java Plug-In permite a los navegadores usar el JRE de Java 2
para ejecutar applets basados en 1.2 y componentes JavaBeans
TM
en lugar de la
mquina virtual por defecto de los navegadores. El Java Plug-In funciona con
Netscape Communicator y Microsoft Internet Explorer.
Obtener las Descargas
Instalar JRE con Java Plug-In
Instalar el HTML Converter
Instalar el Fichero de Polica de Seguridad
Tipos de Ficheros de Polica
Instalar el Fichero de Polica
Cambiar el Nombre o la Localizacin

Ejecutar el Applet Administration
Cmo Funciona?
Obtener las Descargas
Para instalar y utiliar el Java Runtime Environment con Java Plug-In, necesitamos
las siguientes descargar. Ponemos las descargas en un directorio temporal.
Java Runtime Environment com Java Plug-In para Plataformas Win32.
Java Plug-In HTML Converter
Instalar JRE con Java Plug-In
Una versin opcionalmente instalable de la JRE de Java 2 con Java Plug-In est
concluida en la descarga de Java 2 SDK. Tambin podrmos descargar e instalar el
Java 2 Runtime Environment com Java Plug-In separadamente.
De cualquier forma, instalamos el Java 2 Runtime Environment con Java Plug-In
haciendo doble click sobre su icono y siguiendo las instrucciones de instalacin.
Cuando la instalacin se complete, veremos el panel de control del Java Plug-In en
nuestro men Start de Windows bajo Programs.
Instalar el HTML Converter
Nuestro navegador no usar automaticamente el Java Plug-In cuando carguemos
un fichero HTML con un applet. Tenemos que descargar y ejcutar el Java Plug-In
HTML Converter sobre la pgina HTML que invica al applet para ejecutarlo
directamente usando el Plug-In en lugar de hacerlo en el entorno de ejecucin por
defecto del navegador.
Descomprimimos el fichero de desacarga del Java Plug-In HTML Converter:
unzip htmlconv12.zip
Aadimos el programa HTMLConverter.java o su directorio a nuestro
CLASSPATH.
Fichero de Polica de Seguridad
La aplicacin de subasta usa un applet ejecutndose en un navegador para
operaciones administrativas. En la plataforma Java
TM
2, los applets estn
restringidos a un entorno tipo caja sellada y necesitan permisos para acceder a
recursos del sistema fuera de ese entorno restrictivo. Los applets estn
restringidos a operaciones de lectura en su directorio local. Todos las dems
operaciones de acceso requieren permisos.
Tipos de Ficheros de Polica
Necesitamos un fichero de polica que conceda permisos al applet Administration.
Si el applet se ejecuta enun disco distinto al del navegador, el applet tambin
necesitar estar firmado. Puedes ver la pgina Applets firmados para ms
informacin sobre firmar y desplegar applets.
Hay tres clases de ficheros de polica: sistema, usuario y programa. El fichero de
polica del sistema est localizado en jdk1.2\jre\lib\security\java.policy o
jre1.2\lib\security/java.policy y contiene permisos para cada uno en el
sistema.
El fichero de polica de usuario est en el directorio home del usuario. Este fichero
proporciona una forma de dar ciertos permisos de usuario adicioanles a aquellos
concedidos a todos en el sistems. Los permisos del fichero del sistema se combinan
con los permisos del fichero de usuario.
Un fichero de polica de programa puede situarse en cualquier parte. Se le nombra
especficamente cuando se invoca una aplicacin con el comando java o cuando se
invoca un applet con el appletviewer. Cuando una aplicacin o un applet se invocan
con un fichero de polica especfico, los permisos de este fichero ocupan el lugar de
(no son combinados con) los permisos especficados en los ficheros del sistema o
de usuario. Los ficheros de polica de programa se usan para probar programas o
para desplegar en una intraner applets y aplicaciones.
Instalar el Fichero de Polica
Situamos el fichero de polica en nuestro directorio home y lo llamamos
java.policy. Cuando el applet intente realizar una accin que requiera un fichero
de polica con un permiso, se carga el fichero de polica desde este directorio y
permanece en efecto hasta que salgamos del navegador y lo arranquemos de
nuevo.
Si un applet intenta realizar una operacin sin los permisos correctos, sal
discretamente sin lanzar ningn error del applet o del navegador.
Cambiar la Posicin o el Nombre
Podemos cambiar el nombre o la localizacin del fichero de polica de usuario o del
sistema por dedecto. Editamos los ficheros
jdk1.2\jre\lib\security\java.security o jre1.2\lib\security\java.security y
aadimos una tercera entrada especificando el nombre y la localizacin del fichero
de polica alternativo.
policy.url.1=file:${java.home}\lib\security\java.policy
policy.url.2=file:${user.home}\java.policy
policy.url.3=file:\<mypolicyfile path and name>
Nota: En mquinas Windows/NT, podramos situar el fichero de polica
en el directorio C:\Winnt\Profiles\<userid>\java.policy.
Ejecutar el Applet Administration
Copiamos el archivo JAR con el applet Administration y el fichero de polica a su
localizacin final. En este ejemplo, esta localizacin es el diretorio
\home\zelda\public_html. Luego extraemos el fichero class del applet y el
fichero de polica del fichero JAR:
cp admin.jar \home\zelda\public_html
jar xf applet.jar
La extraccin sita el fichero de polica bajo public_html y crea un directorio
admin bajo el directorio public_html con el fichero class del applet dentro.
Renombramos el fichero de polica del directorio public_html como .java.policy y
lo copiamos en nuestro directorio home.
En el directorio public_html, creamos un fichero HTML que invoque al applet
Administration. Nos debemos asegurar de incluir el directorio admin cuando
especifiquemos la opcin CODE del applet. Observamos que cuando usamos Java
Plug-In, no podemos hacer que el navegador carge el fichero class desde el fichero
JAR.
<HTML>
<BODY>
<APPLET CODE=admin/AdminApplet.class
WIDTH=550
HEIGHT=150>
</APPLET>
</BODY>
</HTML>
Arrancamos el HTML Converter.
java HTMLConverter
En el interface grfico de usuario del HTML Converter graphical, seleccionamos
One File:, especificando el path al fichero admin.html, y pulsamos el botn
Convert.
Cmo Funciona?
En mquinas Windows, el Java Plug-In encuentra el Java Runtime Environment
(JRE) ejecutando el fichero de control OLE personalizado beans.ocx instalado por
defecto en el directorio del navegador web \Program Files\JavaSoft\1.2\bin.
El control OLE examina el registro de Windows para buscar la clave del Java
Plug-In y usa el valor asociado con esa clave para encontrar el JRE instalado.
Si encontramos que se carga un JRE errneo, usamos regedit para chequear el
valor del registtro de Java Plug-In para el usuario actual. Si el JRE no est
instalado, el control chequea los valores Java Plug-in para la
HKEY_LOCAL_MACHINE. Deberamos ver un valor para Java Runtime
Environment bajo Software\JavaSoft.
Despus de completar la conversin, cargamos el fichero admin.html en nuestro
navegaor Web.
Ozito
Ms Tpicos de Seguridad
Este captulo presenta dos tpicos de seguridades adicionales que podramos
encontrar interesantes.
Applets Firmados
Escribir un Control de Seguridad
Tienes Prisa?
Esta tabla tiene enlaces directos a los tpicos especficos.
Tpico Seccin
Applets Firmados Ejemplo de Applet Firmado
Desarrollador de Intranet
Usuario Final
Ejecutar una Aplicacin con un Fichero de Polica
Applets Firmados en JDK 1.1
Escribir un Controlador de
Seguridad
El Programa FileIO
El Programa PasswordSecurityManager
Ejecutar el Programa FileIO
Informacin de Referencia
Ozito
Applets Firmados
Se peude definir un fichero de polica para requerir una firma de todos los applets o
aplicaciones que intenten ejecutarse con el fichero de polica. La firma es una
forma de verificar que el applet o la aplicacin vienen de una fuente fiable y que
puede ser creada para ejecutarse con los permisos concedidos por el fichero de
polica.
Si un fichero de polica requiere una firma, un applet o una aplicacin pueden
obtener el acceso concedido por el fichero de polica slo si tienen la firma correcta.
Si el applet o la aplicacin tienen una firma errnea o no tienen firma, no
obtendrn el acceso al fichero.
Esta seccin muestra un ejemplo de firma de una applet, verificacin de esa firma,
y ejecucin del applet con un fichero de polica.
Ejemplo Applet Firmado
Desarrollador de Intranet
Usuario Final
Ejecutar la Aplicacin con un Fichero de Polica
Applets Firmados en JDK 1.1
Ejemplo del Applet Firmado
El fichero de polica para conceder accesos puede configurarse para que requiera o
no una firma. Si se requiere una firma, el applet tiene que estr envuelto en un
fichero JAR antes de poder ser firmado. Este ejemplo muestra cmo firmar y
conceder los permisos a un applet para que pueda crear un fichero demo.ini en el
directorio Home del usuario cuando se ejecuta en el AppletViewer.
Estos ficheros son los usados en el ejemplo. Podemos copiarlos o crearlos en
nuestro directorio de trabajo.
El fichero SignedAppletDemo.java que contiene el cdigo del applet.
Write.jp fichero de polica que concede los accesos al directorio home del
usuario.

Una etiqueta Applet embebida en un fichero SignedApplet.html:
<applet code="SignedAppletDemo.class"
archive="SSignedApplet.jar"
width=400 height=400>
<param name=file value="/etc/inet/hosts">
</applet>

Normalmente un applet se envulve y se firma mediante un desarrollador de
intranet y es manejado por el usuario final que verifica la firma y ejecuta el applet.
En este ejemplo, el desarrollador de intranet performa los pasos 1 al 5, y el usuario
final realiza lo pasos del 6 al 8. Para mantener las cosas sencillas todos los pasos
ocurren en el mismo directorio.
Compilar el Applet. 1.
Crear el Fichero JAR. 2.
Generar las Claves. 3.
Firmar el Fichero JAR. 4.
Exportar el Certificado de Clave Pblica. 5.
Importar el Certificado como Certificado Verdadero. 6.
Crear el Fichero de Polica. 7.
Ejecutar el Applet. 8.
Desarrollador de Intranet
El desarrollador de intranet, envuelve el ejecutable del applet en un fichero JAR, lo
firma y exporta el certificado de la clave pblica.
1: Compilar el Applet
En su directorio de trabajo el desarrollador de intranet, usa el comando javac para
compilar la clase SignedAppletDemo.java. La salida del comando javac es el
SignedAppletDemo.class.
javac SignedAppletDemo.java
2: Crear el Fichero JAR
El desarrollador de intranet almacena el fichero SignedAppletDemo.class
compilado en un fichero JAR. La opcin -cvf del comando jar crea un nuevo
archivo (c), usando modo verboso (v), y especifica el nombre del fichero archivado
(f). El nombre del fichero es SignedApplet.jar.
jar cvf SignedApplet.jar SignedAppletDemo.class
3: Generar las Claves
Un fichero JAR se firma con la clave privada del creador del fichero JAR y la firma
es verificada por el receptor del fichero JAR con el clave pblica de la pareja. El
certificado es una sentencia del propietario de la clave privada indicando que la
clave pblica de la pareja tiene una valor particular para que la persona que la est
usando puede estar segura de que es autntica. Las claves pblica y privada deben
existir en el almacen de calves antes de que se puede usar jarsigner para firmar o
verificar la firma de un fichero JAR.
El desarrollador crea un base de datos keystore llamada compstore que tiene
una entrada para cada pareja de claves recientemente generadas con la clave
pblica en un certificado usando el comando keytool.
En su directorio de trabajo, el desarrollador crea una base de datos keystore y
genera las claves:
keytool -genkey -alias signFiles -keystore compstore
-keypass kpi135 -dname "cn=jones"
-storepass ab987c
Este comando keytool -genkey invoca una pareja de claves que estn
identificadas con el Alias signFiles. Subsecuentes llamadas al comando keytool que
usarn este alias y la password (-keypass kpi135) para acceder a la clave privada
en el par generado.
La pareja de claves generadas se almacena en un base de datos keystore llamada
compstore (-keystore compstore) en el directorio actual y accedida con la
password del compstore (-storepass ab987c).
La opcin -dname "cn=jones" especifica un nombre distinguido X.500 con un
valor de nombre comn (cn). X.500 Distinguished Names identifica entidades para
certificados X.509. En este ejemplo, el desarrollador usa su ltimo nombre, Jones,
para el nombre comn. Podra haber usado cualquier otro nombre para este
propsito.
Podemos ver todos las opciones y parmetros de ketool tecleando:
keytool -help
4: Firmar el Fichero JAR
JAR Signer es una herramienta de la lnea de comandos para firmar y verificar la
firma de ficheros JAR. En su directorio de trabajo, el desarrollado usa jarsigner
para firmar una copia del fichero SignedApplet.jar.
jarsigner -keystore compstore -storepass ab987c
-keypass kpi135
-signedjar
SSignedApplet.jar SignedApplet.jar signFiles
Las opciones -storepass ab987c y -keystore compstore especifican la base de
datos keystore y password donde se almacena la clave privada pra firmar el fichero
JAR. La opcin -keypass kpi135 es la password de la clave privada,
SSignedApplet.jar es el nombre del fichero JAR firmado, y signFiles es el alias
de la clave privada. jarsigner extrae el certificado desde la base de datos cuya
entrada es signFiles y lo adjunta a la firma del fichero JAR firmado.
5: Exportar el Certificado de la Clave Pblica
El certificado de la clave pblica se enva con el fichero JAR al usuario final que
usar el applet. Esta persona usa el certificado para autentificar la firma del fichero
JAR. Un certificado se enva exportandolo desde la base de datos compstore.
En su directorio de trabajo, el desarrollador usa keytool para copiar el certificado
desde compstore a un fichero llamado CompanyCer.cer de esta forma:
keytool -export -keystore compstore -storepass ab987c
-alias signFiles -file CompanyCer.cer
Como el ltimo paso, el desarrollador coloca el fichero JAR y el certificado en un
directorio de distribucin o en una pgina web.
Usuario Final
El usuario final descarga el fichero JAR desde el directorio de distribucin, importa
el certificado, crea un fichero de polica concediendo los accesos al applet, y
ejecuta el applet.
6: Importar el Certificado como Certificado Verdadero
El usuario descarga SSignedApplet.jar y CompanyCer.cer a su directorio home.
Ahora debe crear un abase de datos keystore (raystore) e importar el certificado
en ella usando el aplias company. El usuario usa keytool en su directorio home
para hacer esto:
keytool -import -alias company -file
CompanyCer.cer -keystore
raystore -storepass abcdefgh
7: Crear el Fichero de Polica
El fichero de polica concede al fichero SSignedApplet.jar firmado por el alias
company permiso para crear demo.ini (y no otro fichero) en el directorio home
del usuario.
El usuario crea el fichero de polica en su directorio home usando policytool o un
editor ASCII.
keystore "/home/ray/raystore";
// A sample policy file that lets a program
// create demo.ini in user's home directory
// Satya N Dodda
grant SignedBy "company" {
permission java.util.PropertyPermission
"user.home", "read";
permission java.io.FilePermission
"${user.home}/demo.ini", "write";
};
8: Ejecutar el Applet en el AppletViewer
AppletViewer conecta con documentos HTML y los recursos especificados en la
llamada a appletviewer, y muestra el applet en su propia ventana. Para ejecutar
el ejemplo, el usuario copia el fichero JAR firmado y el fichero HTML en
/home/aURL/public_html y llama al Appletviewer desde su directorio raz de
esta forma:
appletviewer -J-Djava.security.policy=Write.jp
http://aURL.com/SignedApplet.html
Nota: Se teclea todo en una lnea y se pone un espacio en blanco
despus de Write.jp
La opcin -J-Djava.security.policy=Write.jp le dice al AppletViewer que ejecute
el applet referenciado en el fichero SignedApplet.html con el fichero de polica
Write.jp.
Nota: El fichero de polica puede almacenarse en el servidor y
especificarse en la invocacin al appletviewer como una URL.
Ejecutar una Aplicacin con un Fichero de Polica
Esta invocacin de aplicacin restringe MyProgram a un entorno cerado de la
misma forma en que se restringen los applet, pero permite los accesos
especificados en el fichero de polica polfile.
java -Djava.security.manager
-Djava.security.policy=polfile MyProgram
Applets Firmados en JDK 1.1
Los applets firmados del JDK 1.1 pueden acceser a recursos del sistema local si
ste est configurado para permitirlo. Puedes ver la pginas ejemplos de Applets
Firmados del JDK 1.1 para ms detalles.
Ozito
Escribir un Controlador de Seguridad
Un controlador de seguridad es un objeto de la Mquina Virtual Java
TM
(JVM) que
implementa un polica de seguridad. Por defecto, la plataforma Java 2
proporciona un controlador de seguridad que desactiva todos los accesos a los
recursos del sistema local menos los accesos de lectura al directorio y sus
subdirectorios dnde es invocado el programa.
Podemos extender el controlador de seguridad por defecto para implementar
verificaciones y aprovaciones personalizadas para applets y aplicaciones, pero la
implementacin debe incluir cdigo de verificacin de accesos apropiado para cada
mtodo checkXXX que sobreescribamos. Si no incluimos este cdigo, no suceder
ningun chequeo de verificacin, y nuestro programa escindir el fichero de polica
del sistema.
Esta seccin usa una aplicacin de ejemplo para explicar cmo escribir un
controlador de seguridad personalizado antes de leer y escribir los ficheros
especificados. La implementacin incluye cdigo de verificacin de accesos por eso
una vez que el usuario pasa el chequeo de password, todava necesita que el
fichero tenga permisos de lectura y escritua en su fichero de polica.
El ejemplo consiste en la aplicacin FileIO, y el programa
PasswordSecurityManager que proporciona la implementacin del controlador
de seguridad personalizado.
El programa FileIO
El programa PasswordSecurityManager
Ejecutar el programa FileIO
Informacin de Referencia
El programa FileIO
El programa FileIO muestra un sencillo interface de usuario que pide al usuario que
introduzca algn texto. Cuando el usario pulsa el botn Click Me, el texto se graba
en un fichero en el directorio home del usuario, y se abre y se lee un segundo
fichero. El texto ledo del segundo fichero se muestra al usuario.
Antes de Pulsar el botn Despus de Pulsar el botn
El controlador de seguridad personalizado para este programa le pude al usuario
final que introduzca una password antes de permitir que FileIO escriba o lea texto
desde un fichero. El mtodo main de FileIO crea un controlador de seguridad
personalizado llamando PasswordSecurityManager.
public static void main(String[] args){
BufferedReader buffy = new BufferedReader(
new InputStreamReader(System.in));
try {
System.setSecurityManager(
new PasswordSecurityManager("pwd", buffy));
} catch (SecurityException se) {
System.err.println("SecurityManager already set!");
}
La Clases PasswordSecurityManager
La clase PasswordSecurityManager declara dos variables de ejemplar privadas, que
son inicializadas por el constructor cuando se instala el controlador de seguridad
personalziado. La variable de ejemplar password contiene el password real, y la
variable de ejemplar buffy es un buffer de entrada que almacena la password de
entrada del usuario final.
public class PasswordSecurityManager
extends SecurityManager{
private String password;
private BufferedReader buffy;
public PasswordSecurityManager(String p,
BufferedReader b){
super();
this.password = p;
this.buffy = b;
}
El mtodo accessOK le pide una password al usuario final, verifica la password, y
devuelve true si el password es correcto y false si no lo es.
private boolean accessOK() {
int c;
String response;
System.out.println("Password, please:");
try {
response = buffy.readLine();
if (response.equals(password))
return true;
else
return false;
} catch (IOException e) {
return false;
}
}
Verificar Accesos
La clase padre SecurityManager proporciona mtodos para verificar accesos de
lectura y escritura a ficheros del sistema. Los mtodo checkRead y checkWrite
tienen una versin que acepta un String y otra versin que acepta un descriptor
de ficero.
Este ejemplo slo sobreescrie las versiones String para mantener el ejemplo
sencillo, y como el programa FileIO usa accesos a directorios y ficheros como
Strings.
public void checkRead(String filename) {
if((filename.equals(File.separatorChar + "home" +
File.separatorChar + "monicap" +
File.separatorChar + "text2.txt"))){
if(!accessOK()){
super.checkRead(filename);
throw new SecurityException("No Way!");
} else {
FilePermission perm = new FilePermission(
File.separatorChar + "home" +
File.separatorChar + "monicap" +
File.separatorChar + "text2.txt", "read");
checkPermission(perm);
}
}
}
public void checkWrite(String filename) {
if((filename.equals(File.separatorChar + "home" +
File.separatorChar + "monicap" +
File.separatorChar + "text.txt"))){
if(!accessOK()){
super.checkWrite(filename);
throw new SecurityException("No Way!");
} else {
FilePermission perm = new FilePermission(
File.separatorChar + "home" +
File.separatorChar + "monicap" +
File.separatorChar + "text.txt" ,
"write");
checkPermission(perm);
}
}
}
}
El mrtodo checkWrite es llamado antes de escribir la entrada del usuario en el
fichero de salida. Esto es porque la clase FileOutputStream llama primero a
SecurityManager.checkWrite.
La implementacin personalizadapara SecurityManager.checkWrite chequea el
pathname /home/monicap/text.txt, si es true le pide al usuario una password.
Si la password es correcta, el mtodo checkWriterealiza el chequeo del acceso
creando un ejemplar del permiso requerido y pasandolo al mtodo
SecurityManager.checkPermission. Este chequeo suceder si el controlador de
seguirdad encuentra un fichero de seguridad de sistemam de usuario o de
programa con el permiso especificado.
Una vez completada la operacin de escritura, al usuario final se le pide la
password dos veces ms. La primera vez para leer el directorio /home/monicap,
y la segunda vez para leer el fichero text2.txt. Se realiza un chequeo de acceso
antes de que tenga lugar la operacin de lectura.
Fichero de Polica
Aqui esta el fichero de polica que necesita el programa FileIO para las
operaciones de lectura y escritura. Tambin conceder permiso al controlador de
seguridad personalizado para acceder a la cola de eventos en representacin de la
aplicacin y mostrar la ventana de la aplicacin si ningn aviso.
grant {
permission java.io.FilePermission
"${user.home}/text.txt", "write";
permission java.util.PropertyPermission
"user.home", "read";
permission java.io.FilePermission
"${user.home}/text2.txt", "read";
permission java.awt.AWTPermission
"accessEventQueue";
permission java.awt.AWTPermission
"showWindowWithoutWarningBanner";
};
Ejecutar el programa FileIO
Aqu est cmo ejecutar el programa FileIO con el fichero de polica:
java -Djava.security.policy=polfile FileIO
Informacin de Referencia
El Apndice A: Seguridad y Permisos describe los permisos disponibles y explica las
consecuencias de conceder permisos. Una forma de usar esta es informacin es
para ayudarnos a limitar los permisos concedidos a un applet o aplciacin podran
necesitar ser ejecutados satisfactoriamente. Otra forma de usar esta informacin
es educarnos en la forma en un permiso particular puede ser explotado por cdigo
mailicioso.
El Apndice B: Clases, Mtodos y Permisos proporciona lista de mtodos de la
plataforma Java 2 que estn implementados para chequeos de seguridad, los
permisos que cada uno requiere, y el mtodo java.security.SecurityManager
llamado para realizar el chequeo de accesos.
Podemos usar esta referencia para escribir implementaciones de nuestro propio
controlador de seguridad o cundo implementamos mtodos abstactos que realizan
tareas relacionadas con la seguridad.
El Apndide C: Mtodos del SecurityManager lista los chequeos de permisos para
los mtodo de SecurityManager.
Ozito
Apndice A: Seguridad y Permisos
Todos los applets y cualquier aplicacion invocada con un controlador de seguridad
debe conceder permisos explcitos para acceder los recursos locales del sistema
apaerte del acceso de lectura en el directorio y subdirectorios desde donde se
invoc el programa. La plataforma Java
TM
proporciona permisos para permitir
varios niveles de accesos a diferentes tiposde informacin local.
Como los permisos permiten a un applet o una aplicacin sobreescribir el polica de
seguridad por defecto, deberamos ser muy cuidadosos cuando asignemos
permisos para no crear una antrada al cdigo malicioso para que ataque nuestro
sistema.
Este apndice describe los permisos disponibles y explica cmo cada permiso
puede crear una entrada para un ataque de cdigo malicioso. Una forma de usar
esta informacin es ayudarnos a limitar los permisos dados a un applet o una
aplicacin a slo los necesarios para su ejecucin. Otra forma de usar esta
informacin es para aprender nosotros mismos las formas en que un permisi
particular puede ser explotado por cdigo malicioso.
Como consejo, nunca creas en un applet o una aplicacin desconocidos. Siempre
chequea el cdigo cuidadosamente con la informacin de este apndice para
asegurarte de que no ofreces permisos a codigo malicios que cause serios
problemas en el sistema local.
Introduccin
Conocer qu Permisos
AllPermission
AWTPermission
FilePermission
NetPermission
PropertyPermission
ReflectPermission
RuntimePermission
SecurityPermission
SerializablePermission
SocketPermission
Introduccin
Los permisos se le conceden a un programa con un ficheo de polica. Un fichero de
polica conteine permisos para accesos especficos. Un permiso consta de un
nombre de permiso, una fuente, y en algunos casos, una lista de acciones
separadas por comas.
Por ejemplo, la siguiente entrada de fichero de polica especifica un permiso
java.io.FilePermission que concede acceso de read (la accin) a la fuente
${user.home}/text2.txt.
grant {
permission java.io.FilePermission
"${user.home}/text2.txt", "read";
};
Hay un fichero de polica de la instalacin de la plataforma Java (Sistema) y
opcionalmente un fichero de polica por cada usuario. El fichero de polica del
sistema est en {java.home}/lib/security/java.policy, y el fichero de polica
de usuario est en cada directorio home de los usuarios. Los ficheros de polica de
sistema y de usuario se combinan. Por eso por ejemplo, podra haber un fichero de
polica con muy pocos permisos concedidos a todos los usuarios del sistema, y un
fichero de polica individual concediendo permisos adicionales a ciertos usuarios.
Para ejecutar una aplicacin con el controlador de seguridad y un fichero de polica
llamado polfile en el directorio home del usuario, tecleamos:
java -Djava.security.main
-DJava.security.policy=polfile FileIO
Para ejecutar un applet en el aplletviewer con un fichero de polica llamando
polfile en el directorio home del usuario, tecleamos:
appletviewer
-J-Djava.security.policy=polfile fileIO.html
Cuando ejecutamos un applet en un navegador, este busca los ficheros de polica
de usuario y del sistema para encontrar los permisos que necesita el applet para
acceder a los recursos del sistema local en representacin del usuario que descarg
el applet.
Conocer qu Permisos
Cuando ejecutamos un applet o invocamos una aplicacin con un controlador de
seguridad que necesita permisos, obtendremos un seguimiento de pila si no hemos
proporcionado un fichero de polica con todos los permisos necesarios. El
seguimiento de pila contiene la informacin que necesitamos para aadir los
permisos al fichero de polica que caus el seguimiento de pila. Si el programa
necesita permisos adicionales, seguiremos obteniendo el seguimiento d epila hasta
que se aadan todos los permisos requeridos al fichero de polica. El nico
inconveniente de esta aproximacin es que tenemos que probar cada posbiel path
de cdigo de nuestra aplicacin.
Otra forma de determinar qu permisos necesita nuestro programa es visitar
Apndice B: Mtodos y Permisos. Este apndice nos cuenta qu mtodos de la
plataforma Java 2 tienen impedida la ejecucin sin los permisos listados. La
informacin del Apndice B tambin es til para los desarrolladores que quieran
escribir su propio controlador de seguridad para personalizar las verificaciones y
aprovaciones necesarias en un programa.
Aqu tenemos un pequeo ejemplo que nos muestra como traducir el primer par de
lneas del seguimiento de pila en una entrada del fichero de polic. La primera lnea
nos dice que el acceso est denegado. Esto significa que el seguimiento de pila fue
generado porque el programa intent acceder a recursos del sistema sin el permiso
apropiado. La segunda lnea significa que necesitamos un
java.net.SocketPermission que le de programa permiso para connect y para
resolveel nombre de host para la direccin (IP) 129.144.176.176, puerto 1521.
java.security.AccessControlException: access denied
(java.net.SocketPermission
129.144.176.176:1521 connect,resolve)
Para volver esto en una entrada del fichero de polica, listamos el nombre del
permiso, una fuente, u una lista de acciones donde java.net.SocketPermission
es el nombre del permiso, 129.144.176.176:1521 es la fuente, y
connect,resolve es la lista de acciones:
grant {
permission java.net.SocketPermission
"129.144.176.176:1521", "connect,resolve";
};
AllPermission
java.security.AllPermission especifica todos los permisos en el sistema para
todos los posibles fuentes y acciones. Este permiso slo debera usarse para
pruebas ya que concede permiso para ejecutar con todas las restricciones de
seguridad desactivadas, como si no hubiera controlador de seguridad.
grant {
permission java.security.AllPermission;
};
AWTPermission
java.awt.AWTPermission concede permisos a las siguientes fuentes AWT. Las
posibles fuentes se listan por nombre sin lista de acciones.
grant {
permission java.awt.AWTPermission
"accessClipboard";
permission java.awt.AWTPermission
"accessEventQueue";
permission java.awt.AWTPermission
"showWindowWithoutWarningBanner";
};
accessClipboard: Esta fuente concede permiso para poner informacin y para
recuperarla desde el portapapeles del AWT. Conceder este permiso puede permitir
a cdigo malicioso que comparta informacion potencialmente sensible o
confidencial.
accessEventQueue: Esta fuente concede permiso para acceder a la cola de
eventos del AWT. Conceder este permiso podra permitir a cdigo mailicioso que
observe y elimine eventos del sistema, y ponga eventos falsos que podran causar
que la aplicacin o el appler realizarn acciones maliciosas.
listenToAllAWTEvents: Esta fuente concede permiso para escuvhar todos los
eventos AWT a travs del sistema. Conceder este permiso podra permitir a cdigo
malicios lea y explote entradas confidenciales del usuario como las passwords.
Cada oyente de evento AWT es llamado desde dentro del contexto
EventDispatchThread de la cola de eventos, por eso si tambin est activado el
permiso accessEventQueue, cdigo malicioso podra modificar el contenido de la
cola de eventos del AWT a travs del sistema, lo que podra causar que el applet o
la aplicacin realizarn acciones maliciosas.
readDisplayPixels: Esta fuente concede permiso para leer pixels desde la
pantalla. Condeder este permiso podra permitir a interfaces como
java.awt.Composite permitan examinar los pixels de la pantalla y fisgonee las
actividades del usuario.
showWindowWithoutWarningBanner: Esta fuene concede permiso para
mostrar una ventana sin mostrar el aviso de que la ventana fue creada por un
applet. Sin este aviso, un applet podra mostrar ventanas si que el usuario supiera
que pertenecen al applet. Esto podra ser un problema en entornos dnde el
usuario toma decisiones sensibles de seguridad bsandose en a quin pertenece la
ventana si a un applet o a una aplicacin. Por ejemplo, desactivar este aviso podra
significar que el usuario introdujeta informacin sensile como el nombre de usuario
y la password.
FilePermission
java.io.FilePermission concede permiso para acceder a un fichero o directorior.
La fuentes consisten en el pathname y una lista de acciones separadas por comas.
Este fichero de polica concede permisos de lectura, escritura, borrado y ejecucin
para todos los ficheros.
grant {
permission java.io.FilePermission
"<<ALL FILES>>", "read, write, delete, execute";
};
Este fichero de polica concede permiso de lectura y escritura sobre text.txt en el
directorio home del usuario.
grant {
permission java.io.FilePermission
"${user.home}/text.txt", "read, write";
};
Podemos usar los siguiente comodines para especificar al pathname de la fuente:
Un pathname que termine en /*, donde /* es el carcter separador de
ficheros significa un directorio y todos los ficheros contenidos en ese
directorio.

Un pathname que termine con /- indica un directorio, y recursivamente,
todos los ficheros y subdirectorios incluidos en ese directorio

Un pathname que consista en un slo asterisco (*) indica todos los ficheros
del directorio actual.

Un pathname que consista en un slo guin (-) indica todos los ficheros del
directorio actual, y recursivamente, todos los ficheros y subdirectorios
contenidos en el directorio actual.

Las acciones son especificadas en una lista de palabras clave separadas por comas
que tienen el siguiente significado:
read: Permiso para leer un fichero o directorio.
write: Permiso para escribir o crear un fichero o directorio.
execute: Permiso para ejecutar o ficheo o buscar un directorio.
delete: Permiso para borrar un fichero o directorio.
Cuando concedamos permisos de ficheros, siempre debemos pensar en las
implicaciones de conceder permisos de lectura y especialmente de escritura a
varios ficheros y directorios. El permiso <<ALL FILES>> con accin de escritura
es especialmente peligroso porque concede permiso para escribir en todo el
sistema de ficheros. Esto significa que el sistema binario puede ser reemplazado, lo
que incluye el entorno de ejecucin de la mquina virtual Java.
NetPermission
java.net.NetPermission concede permisos a varias fuentes de red. Las posible
fuentes se listan por el nombre sin lista de acciones.
grant {
permission java.net.NetPermission
"setDefaultAuthenticator";
permission java.net.NetPermission
"requestPasswordAuthentication";
};
setDefaultAuthenticator: Esta fuente concede permiso para seleccionar la forma
en que informacin de autentificacin es recuperad cuando un proxy o un servidor
HTTP piden autentificacin. Concedere ste permiso podra significar que cdigo
mailicioso puede seleccinar un autentificador que monitorice y robe la entrada de
autentificacin del usuario como si recuperar la informacin desde el usuario.
requestPasswordAuthentication: Esta fuente concede permiso para pedir al
autentificador registrado con el sistema una password. Conceder este permiso
podra significar que cdigo preciado podra robar la password.
specifyStreamHandler: Esta fuente concede permiso para especificar un
manejador de stram cuando se construye una URL. Conceder este permiso podra
significar que cdigo malicioso podra crear una URLK con recursos a los que
normalmente no tendra acceso, o especificar un controlador de stream para
obtener los bytes reales desde algun real al que tenga acceso. Esto significa que el
cdigo malicios podra embaucar al sistema para crear una clase
ProtectionDomain/CodeSource incluso aunque la clase realmente no venga de esa
localizacin.
PropertyPermission
java.util.PropertyPermission concede acceso a las propiedades del sistema. La
clase java.util.Properties represetna selecciones persistentes como la localizacin
del directorio de instalacin, el nombre de usuario o el directorio home del usuario.
grant {
permission java.util.PropertyPermission
"java.home", "read";
permission java.util.PropertyPermission
"os.name", "write";
permission java.util.PropertyPermission
"user.name", "read, write";
};
La lista de fuentes contiene el nombre de la propiedad, por ejemplo, java.home o
os.name. La convencin de nombres para propiedades sigue la convencin de
nombres hereditarios, e incluye comodines. Un asterisco al final del nombre de
propiedad, despus de un punto (.), o en solitario, significa un comodin. Por
ejemplo, java.* o * son vlidos, pero *java o a*b no lo son.
Las acciones se especifican en una listra de palabras claves separadas por comas,
que tienen este significado:
read: Permiso para leer (obtener) una propiedad.
write: Permiso para escribir (seleccionar) una propiedad.
Conceder permisos a propiedades puede dejar nuestro sistema abierto a la
intrusin. Por ejemplo, conceder permiso para acceder a la propiedad java.home
hace vulnerable a ataques el directorio de la instalacin, y conceder permiso de
acceso a las propiedades user.name y user.home podra revelar el nombre de
cuenta del usuario y el directorio home.
ReflectPermission
java.lang.reflect.ReflectPermission concede permiso para varias operaciones
reflectivas. Las posibles fuentes se listan por el nombre sin lista de acciones.
grant {
permission java.lang.reflect.ReflectPermission
"suppressAccessChecks";
};
suppressAccessChecks: Esta fuente concede permiso para acceder a los campos
e invocar mtodos de una clase. Esto incluye campos y mtodos pblicos,
protegidos y privados. Conceder este permiso pidra revelar informacin
confidencial y poner mtodos importantes al alcance del cdigo malicioso.
RuntimePermission
java.lang.RuntimePermission concede permiso a varias fuentes del entorno de
ejecucin, como el cargador de clases, la mquina virtual Java y los threads. Las
posibles fuentes se listan por el nombre sin lista de acciones.
grant {
permission java.lang.RuntimePermission
"createClassLoader";
permission java.lang.RuntimePermission
"getClassLoader";
permission java.lang.RuntimePermission
"exitVM";
permission java.lang.RuntimePermission
"setFactory";
permission java.lang.RuntimePermission
"setIO";
permission java.lang.RuntimePermission
"modifyThread";
permission java.lang.RuntimePermission
"modifyThreadGroup";
permission java.lang.RuntimePermission
"getProtectionDomain";
permission java.lang.RuntimePermission
"setProtectionDomain";
permission java.lang.RuntimePermission
"readFileDescriptor";
permission java.lang.RuntimePermission
"writeFileDescriptor";
permission java.lang.RuntimePermission
"loadLibrary.<library name>";
permission java.lang.RuntimePermission
"accessClassInPackage.<package name>";
permission java.lang.RuntimePermission
"defineClassInPackage.<package name>";
permission java.lang.RuntimePermission
"accessDeclaredMembers.<class name>";
permission java.lang.RuntimePermission
"queuePrintJob";
};
Las convenciones de nombrado para la fuente sigue la convencin de nombres
hereditarios, e incluye comodines. Un asterisco al final del nombre de propiedad,
despus de un punto (.), o en solitario, significa un comodin. Por ejemplo,
loadLibrary.* o * son vlidos, pero *loadLibrary o a*b no lo son.
createClassLoader: Esta fuente concede permiso para crear un cargador de
clases. Conceder este permiso podra permitir a una aplicacin maliciosa que
ejemplarize su propio cargador de clases y carge clases peligrosas en el sistema.
Una vez cargado, el cargador de clases podra situar esas clases bajo cualquier
dominio proegido dndoles total control sobre ese dominio.
getClassLoader: Esta fuene concede permiso para recuperar el cargador de
clases para la clase llamante. Conceder este permiso podra permitir que cdigo
malicioso obtuviere el cargador de clases para una clase particular y cargar clases
adicionales.
setContextClassLoader: Esta fuente concede permiso para seleccionar el
contexto del cargador de clases usado por un thread. El cdigo del sistema y las
extensione susan este contexto para buscar recursos que podran no existir en el
cargador de clases del sistema. Conceder este permiso permite cambiar el contexto
del cargador de clases usado para un thread particular, incluyendo los threads del
sistema. Esto podra causar problemas si el contexto del cargador de clases tiene
cdigo malicioso.
setSecurityManager: Esta fuente concede permiso para seleccionar o reemplazar
el controlador de seguridad. El controlador de seguridad es una clase que permite a
la aplicaciones implementar un polica de seguridad. Conceder este permiso podra
permitir al cdigo mailicioso instalar un controlador menos restrictivo, y por lo
tanto, evitar los chequeos a los que se forzado el controlador de seguridad original.
createSecurityManager: Esta fuente concede permiso para crear un nuevo
controlador de seguridad. Conceder este permiso podra darle al cdigo malicioso
acceso a mtodo protegidos qie podran revelar informacin sobre otras clases o la
pila de ejecucin.
exitVM: Esta fuente concede permiso para parar la mquina virtual Java.
Conceder este permiso podra permitir que cdigo malicioso a montar un ataque de
denegacin de servicio forzando automticamente a que se pare la JVM.
setFactory: Esta fuente concede permiso para seleccioanr una fbrica de socket
usada por las clases ServerSocket o Socket, o la fbrica de manejadores de
streams usada por la clase URL. Conceder este permiso permite al cdigo
seleccionar la implementacin actual para la factora de socket, server socket,
stream handler, o Remote Method Invocation (RMI). Un atacante podra
seleccionar una implementacin que manejara los streams de datos.
setIO: Esta fuente concede permiso para cambiar los valores de los streams
System.out, System.in, System.err. Conceder este permiso podra pemritir a un
atancante cambiar el System.in para robar la entrada del usuario, o seleccionar
System.err a un stream de salida null, lo que podra ocultar cualquier error
enviado a System.err.
modifyThread: Esta fuente concede permiso para modicar los threads mediante
llamadas a los mtodos stop, suspend, resume, setPriority, y setName de la
clase Thread. Conceder este permiso podra permitir a un atancante arrancar o
suspender cualquier tread e el sistema.
stopThread: Esta fuente concede permiso para parar threads. Conceder este
permisos permtie al cdigo que pare cualquier thread en el sistema proporcionando
el cdigo que ya tiene permiso para acceder a ese thread, EL cdigo malicioso
podra corromper el sistema eliminado threads existentes.
modifyThreadGroup: Esta fuente concede permiso para modificar threads
mediante llamadas a los mtodos destroy, resume, setDaemon,
setmaxPriority, stop, y suspend de la clase ThreadGroup. Conceder este
permiso podra permitir al atancante que cree un grupo de threadas y seleccionar
su prioridad de ejecucin.
getProtectionDomain Esta fuente concede permiso para recuperar el ejemplar
ProtectionDomain para una clase. Conceder este permiso pemite al cdigo
obtener informacin de polica para ese cdigo fuente. Mientras que la obtencin
de la informacin de polica no compromete la seguridad del sistema, si que le
ofrece informacin adicional al atacante como los nombres de ficheros locales, por
ejemplo.
readFileDescriptor: Esta fuente concede permiso para leer descriptores de
ficheros. Conceder este permiso permite al cdigo leer el fichero particular
asociado con el descriptor de fichero, que es peligroso si el fichero contiene datos
confidenciales.
writeFileDescriptor: Esta fuente concede permiso para escribir descriptores de
ficheros. Conceder este permiso permite al cdigo escribir el fichero asociado con
el descriptor de fichero, lo que es peligroso si el descriptor apunta a un fichero
local.
loadLibrary.{library name}: Este fichero concede permiso para enlazar
dinmicamente la librera especificada. Conceder este permiso podra ser peligroso
porque la arquitectura de seguridad no est diseada y no se extiende para las
clases nativas cargadas mediante el mtodo java.lang.System.loadLibrary.
accessClassInPackage.{package name} Esta fuente concede permiso para
acceder al paquete especificado mediante el mtodo loadClass del cargador de la
clase cuando el cargador de la clase llama al mtodo
SecurityManager.checkPackageAcesss. Conceder este permiso le da al cdigo
acceso a las clases de paquetes a los que normalmente no tiene acceso. El cdigo
mailicioso podra usar estas clases para ayudarse en su intento de comprometer la
seguridad del sistema.
defineClassInPackage.{package name}: Esta fuente concede permiso para
definir las clases del paquete especificado mediante un mtodo defineClass del
cargador de clases cuando el cargador llama al mtodo
SecurityManager.checkPackageDefinition. Conceder este permiso permite al
cdigo definir una clase en un paquete particular, lo que podra ser peligroso
porque el cdigo malicioso con este permiso podra definir clases peligrosas en
paquetes verdaderos como java.security o java.lang, por ejemplo.
accessDeclaredMembers: Esta fuente concede permiso para acceder a miembros
declarados de una clase. Conceder este permiso permite al cdigo solicitar una
clase por sus campos y mtodos pblicos, protegidos, por defecto (paquete) y
privados. Aunque el cdigo podra tener acceso a los nombres de los campos y
mtodos privados y protegidos, no podr acceder a sus datos y no podr invocar
ningn mtodo privado. A pesar de esto, el cdigo malicioso podra usar esta
informacin para mejorar su ataque. Adems, el cdigo malicios podra invocar
mtodos pblicos o acceder a campos pblicos de la clase, lo que podra ser
peligroso.
queuePrintJob: Esta fuente concede permiso para inicializar una peticin de
trabajo de impresin. Conceder este permiso podra permitir al cdigo qe imprima
informacin sensible en una impresora o que gaste papel maliciosamente.
SecurityPermission
java.security.SecurityPermission conceder permiso ha varios parmetros de
configuracin de seguridad. Las fuentes posibles se listan por el nombre sin lista de
acciones. Los permisos de seguridad actualmente se aplican a mtodo llamados
sobre los siguientes objetos:
java.security.Policy, que representa la polica de seguridad del sistema para
aplicaciones.

java.security.Security, que centraliza todas las propiedades de seguridad y
mtodos comunes. Maneja proveedores.

java.security.Provider, que repesenta una implementacin de cosas como
algoritmos de seguridad (DSA, RSA, MD5, or SHA-1) y generacin de claves.

java.security.Signer, que maneja claves privadas. Aunque, Signer est
obsoleto, los permisos relacionados estn disponibles por razones de
compatibilidad.

java.security.Identity, que maneja objetos del mundo real como son
personas, compaias, y organizaciones, cuyas identidades pueden ser
autentificadas usando sus claves pblicas.

grant {
permission java.security.SecurityPermission
"getPolicy";
permission java.security.SecurityPermission
"setPolicy";
permission java.security.SecurityPermission
"getProperty.os.name";
permission java.security.SecurityPermission
"setProperty.os.name";
permission java.security.SecurityPermission
"insertProvider.SUN";
permission java.security.SecurityPermission
"removeProvider.SUN";
permission java.security.SecurityPermission
"setSystemScope";
permission java.security.SecurityPermission
"setIdentityPublicKey";
permission java.security.SecurityPermission
"setIdentityInfo";
permission java.security.SecurityPermission
"addIdentityCertificate";
permission java.security.SecurityPermission
"removeIdentityCertificate";
permission java.security.SecurityPermission
"clearProviderProperties.SUN";
permission java.security.SecurityPermission
"putProviderProperty.<provider name>";
permission java.security.SecurityPermission
"removeProviderProperty.SUN";
permission java.security.SecurityPermission
"getSignerPrivateKey";
permission java.security.SecurityPermission
"setSignerKeyPair";
};
getPolicy: Esta fuente concede permiso para recuperar el polica de seguridad del
sistema. Conceder estep permiso revela qu permisis seberan concederse a una
aplicacin o un applet dados. Mientras que la revelacin del polica no compromete
la seguridad del sistema, proporciona al cdigo malicios informacin adicional que
podra usar para un mejor ataque.
setPolicy: Esta fuente concede permiso para seleccionar el polica de seguridad
del sistema. Conceder este permiso podra permitir al cdigo malicioso que se
conceda a s mismo todos los permiso para montar un ataque al sistema.
getProperty.{key}: Esta fuente concede permiso para recuperar la propiedad de
seguridad especificada mediante {key}. Dependiendo de la clave particular para el
que se concede el acceso, el cdigo podra tener accedo a una lista de proveedores
de seguridad y la localizacin de las policas de seguridad del sistema y de usuario.
Mientras que la revelacin de esta informacin no compromete la seguridad del
sistema, si proporciona informacin adicional que podra usar para un mejor
ataque.
setProperty.{key}: Esta fuente concede permiso para seleccionar la propiedad
de seguridad especificada por {key}. Esto podra incluir la seleccin de un
proveedor de seguridad o definir la localizacin del polica de seguridad del
sistema. El cdigo malicioso podra usar un proveedor maligno que robar
informacin confidencial como las claves privadas. Adems, el cdigo malicioso
podra seleccionar con los permisos seleccionar la localizacin del polica de
seguridad del sistema que podra apuntar a un polica de seguridad que conceda al
atancante todos los permisos necesarios que requiera para montar el ataque al
sistema.
insertProvider.{provider name}: Esta fuente concede permiso para aadir un
nuevo proveedor de seguridad especificado por {provider name}. Conceder este
permiso permite la introduccin un proveedor posiblemente malicioso que podra
desubrir cosas como las claves provadas que se les pasa. Esto es posible porque el
objeto Security, que maneja todos los proveedores instaladore, no cheque
realmente la integridad o la autenticidad de un proveedor antes de adjuntarlo.
removeProvider.{provider name}: Esta fuente concede permiso para eliminar
un proveedor de seguridad especificado por {provider name}. Conceder este
permiso podra cambiar el comportamietno o desactivar la ejecucinde partes del
programa. Si un proveedor solicitado por el programa ha sido eliminado, la
ejecucin podra fallar.
setSystemScope: Esta fuente concede permiso para seleccionar el mbito de
identidad del sistema. Conceder este permiso podra permitir al atacante configurar
el mbito de seguridad del sistema con certificados que no deberan ser creidos.
Esto podra conceder al cdigo firmado cuyos privilegios certificados podran ser
denegados por el mbito de identidad original.
setIdentityPublicKey: Esta fuente concede permiso para seleccionar la clave
pblica de un objeto Identity. Si la identidad se marca como trusted, permite al
atacante introducir su propia clave pblica que no es verdadera mediante el mbito
de identidad del sistema. Esto podra conceder al cdigo firmado privilegios de
clave pblica que de otra forma seran denegados.
SetIdentityInfo: Esta fuente concede permiso para seleccionar un string de
informacin general para un objeto Identity. Conceder este permiso permite al
atancate seleccionar una descripcin general para una identidad. Hacindolo
podramos embaucar a las aplicaciones a usar una identidad diferente que evite a
las aplicacioens encontrar una identidas particular.
addIdentityCertificate: Esta fuente concede permiso para aadir un certificado
para un objeto Identity. Conceder este permiso permite a los atacantes
seleccionar un certificado para una clave pblica de identidad haciendo que la clave
pblica sea verdadera a una audiencia mayor de la original.
removeIdentityCertificate: Esta fuente concede permiso para eliminar un
certificado de un objeto Identity. Conceder este permiso permite al atacante
eliminar un certificado para la clave pblica de una identidad. Esto podra ser
peligroso porque una clave pblica podra ser considerada como menos verdadera
de lo que podra ser.
printIdentity: Esta fuente concede permiso para imprimir el nombre de un
prinicpal el mbito en que se usa el principal, y cuando el principal es considerado
como verdadero en este mbito. El mbito impreso podra ser un nombre de
fichero, en cuyo caso podra robar informacin del sistema local. Por ejemplo, aqu
hay un ejemplo de impresin de un nombre de identidad carol, que est marcado
como verdadero en la base de datos de identidad del usario:
carol[/home/luehe/identitydb.obj][not trusted].
clearProviderProperties.{provider name} Esta fuente concede permiso para
borrar un objeto Provider para que no contenga ms propiedades usadas para
buscar servicios implementados por el proveedor. Conceder este permiso desactiva
los servicios de bsqueda implementados por el proveedor. Esto podra cambiar el
comportamiento o desactivar la ejecucinde otras partes del programa que
normalmente utiliar el Provider, como se describe bajo el permiso
removeProvider.{provider name} de arriba.
putProviderProperty.{provider name}: Esta fuente concede permiso para
seleccionar propiedades del proveedor seleccionado. Cada propiedad del proveedor
especifica el nombre y la localizacin de un servicio particular implementado por el
proveedor. Conceder este permiso permite al cdigo reemplazar la especificacin
de servicio con otro con una diferente implementacin y podra ser peligroso si la
nueva implementacin tiene cdigo malicioso.
removeProviderProperty.{provider name}: Esta fuente concede permiso para
eliminar propiedades del proveedor especificado. Conceder este permiso desactiva
la bsqueda de servicios implementada por el proveedor hacindola inaccesible.
Conceder este permiso a cdigo malicioso podra permitirle cambiar el
comportamiento o desactivar la ejecucin de otras partes del programa que
normalmente podran utilizar el objeto Provider, como se describe el permiso bajo
removeProvider.{provider name}.
getSignerPrivateKey: Esta fuente concede permiso para recuperar la clave
privada de un objeto Signer. Las calves privadas deberan ser siempre secretas.
Conceder este permiso podra permtir a cdigo malicioso utilizar la clave privada
para firmar ficheros y reclamar que la firma venga del objeto Signer.
setSignerKeyPair: Esta fuente concede permiso para seleccionar la pareja de
claves pblica y privada para un objeto Signer. Conceder este pemriso podra
permitir al atacante reemplazar la pareja de claves con una posible y pequea
pareja de claves. Esto tambin podra permitir a un atacante escuchar una
comunicacin encriptada entre la fuente y sus pares. Los pares de la fuente
podran envolver la sesin de encriptacin bajo la clave pblica new, que podra el
atacante (que posee la clave privada correspondiente) para desempaquetar la
clave de sesin y desencriptar la comunicacin.
SerializablePermission
java.io.SerializablePermission concede acceso a operaciones de serializacin.
La fuentes posibles se listan por el nombre y no hay lista de acciones.
grant {
permission java.io.SerializablePermission
"enableSubclassImplementation";
permission java.io.SerializablePermission
"enableSubstitution";
};
enableSubclassImplementation: Esta fuente concede permiso para
implementar una subclase de ObjectOutputStream o ObjectInputStream para
sobreescribir la serializacin o deserializacin por defecto de objetos. Conceder
este permiso podra permitir al cdigo usar esto para serializar o deserializar clases
de una forma maliciosa. Por ejemplo, durante la serializacin, el cdigo malicioso
podra almacenar campos privados confidenciales de una forma fcilmente
accesible para los atacantes; o durante la deserializacin el cdigo malicioso podra
deserializar una clase con todos sus campos privados puestos a cero.
enableSubstitution: Esta fuente concede permiso para sustituir un objeto por
otro durante la serializacin deserializacin. Conceder este permiso podra permitir
a cdigo malicioso reemplazar el objeto real con otro que tenga datos incorrectos o
malignos.
SocketPermission
El permiso java.net.SocketPermission concede acceso a una red mediante
sockets. La fuente es un nombre de host y la direccin del puerto, y la accines
una lista que especifica las formas de conexin con ese host. Las coneciones
posibles son accept, connect, listen, y resolve.
Esta entrada de fichero de polica permite que una conexin acepte conexiones al
puerto 7777 en el host puffin.eng.sun.com.
grant {
permission java.net.SocketPermission
"puffin.eng.sun.com:7777",
"connect, accept";
};
Esta entrada de fichero de policia permite a la conexin, aceptar conexiones para
escuchar cualquier puerto entre el 1024 y el 65535 en el host local.
grant {
permission java.net.SocketPermission
"localhost:1024-",
"accept, connect, listen";
};
El host se expresa con la siguiente sintaxis como un nombre DNS, una direccin IP
numrica, o como localhost (para la mquina local). El comodin asterisco (*) se
puede incluir una vez en una especificacin de nombre DNS. Si se incluye dene
estr en la posicin ms a la izquierda, como en *.sun.com.
host = (hostname | IPaddress)[:portrange]
portrange = portnumber | -portnumber |
portnumber-[portnumber]
El puerto o rango de puertos es opcional. Una especificacin de puerto de la forma
N-, donde N es un nmero de puerto, significa todos los puertos numerados N y
superiores, mientras que una especificacin de la forma -N indica todos los puertos
numerados N e inferiores.
La accin listen es slo importante cuando se usa con el localhost, y resolve
(resuelve la direccin del servicio host/ip) cuando cualquiera de las otras opcioones
est presente.
Conceder permiso al cdigo para aceptar o crear conexiones sobre host remotos
podra ser peligroso porque cdigo malevolente podra ms fcilmente transferir y
compartir datos confidenciales.
Nota: En plataformas Unix, slo el raz tiene permiso para acceder a los
puertos inferiores a 1024.
Ozito
Apndice B: Clases, Mtodos y Permisos
Un gran nmero de mtodos de la plataforma Java
TM
2 estan implementados para
verificar permisos de acceso. Esto significa que antes de ejecutarse, verifican si ay
un fichero de policia de sistema, usuario o programa con los permisos requeridos
para que continue la ejecucin. Si no se encuentran dichos permisos, la ejecucin
se detiene con una condicin de error.
El cdigo de verificacin de acceso pasa los permisos requeridos al controlador de
seguridad, y el controlador de seguridad comprueba estos permisos contra los
permisos del fichero de polica para determinar los accesos. Esto significa que los
mtodos de la plataforma Java 2 estn asociados con permisos especficos, y los
permisos especfcios estn asociados con mtodos especficos del
java.security.SecurityManager.
Este apndide lista los mtodos de la plataforma Java 2, los permisos asociados
con cada mtodo, y el mtodo java.security.SecurityManager llamado para
verificar la existencia de este permiso. Necesitamos esta informacin cuando
implementamos ciertos mtodos abstractos o creamos nuestro propio controlador
de seguridad para que podamos incluir cdigo de verificacin de acceso para
mantener nuestras implementaciones en lnea con la poltica de seguridad de la
plataforma Java 2. Si no incluimos cdigo de verificacin de acceso, nuestras
implementaciones no pasarn los chequeos de seguridad internos de la plataforma
Java 2.
java.awt.Graphics2D
java.awt.ToolKit
java.awt.Window
java.beans.Beans
java.beans.Introspector
java.beans.PropertyEditorManager
java.io.File
java.io.FileOutputStream
java.io.ObjectInputStream
java.io.ObjectOutputStream
java.io.RandomAccessFile
java.lang.Class
java.lang.ClassLoader
java.lang.Runtime
java.lang.SecurityManager
java.lang.System
java.lang.Thread
java.lang.ThreadGroup
java.lang.reflect.AccessibleObject
java.net.Authenticator
java.net.DatagramSocket
java.net.HttpURLConnection
java.net.InetAddress
java.net.MulticastSocket
java.net.ServerSocket
java.net.Socket
java.net.URL
java.net.URLConnection
java.net.URLClassLoader
java.rmi.activation.ActivationGroup
java.rmi.server.RMISocketFactory
java.security.Identity
java.security.IdentityScope
java.security.Permission
java.security.Policy
java.security.Provider
java.security.SecureClassLoader
java.security.Security
java.security.Signer
java.util.Locale
java.util.Zip
java.awt.Graphics2D
public abstract void setComposite(Composite comp)
java.Security.SecurityManager.checkPermission
java.awt.AWTPermission "readDisplayPixels"
El cdigo de verificacinde acceso para setComposite debera llamar a
java.Security.SecurityManager.checkPermission y pasarle java.awt.AWTPermission
"readDisplayPixels" cuando el contexto Graphics2D dibuje un componente en la
pantalla y el compuesto es un objeto personalizado en vez de un objeto
AlphaComposite.
java.awt.Toolkit
public void addAWTEventListener(
AWTEventListener listener,
long eventMask)
public void removeAWTEventListener(
AWTEventListener listener)
checkPermission
java.awt.AWTPermission "listenToAllAWTEvents"
~~~~~~~~~
public abstract PrintJob getPrintJob(
Frame frame, String jobtitle,
Properties props)
checkPrintJobAccess
java.lang.RuntimePermission "queuePrintJob"
~~~~~~~~~
public abstract Clipboard
getSystemClipboard()
checkSystemClipboardAccess
java.awt.AWTPermission "accessClipboard"
~~~~~~~~~
public final EventQueue
getSystemEventQueue()
checkAwtEventQueueAccess
java.awt.AWTPermission "accessEventQueue"
java.awt.Window
Window()
checkTopLevelWindow
java.awt.AWTPermission
"showWindowWithoutWarningBanner"
java.beans.Beans
public static void setDesignTime(
boolean isDesignTime)
public static void setGuiAvailable(
boolean isGuiAvailable)
checkPropertiesAccess
java.util.PropertyPermissions "*", "read,write"
java.beans.Introspector
public static synchronized void
setBeanInfoSearchPath(String path[])
checkPropertiesAccess
java.util.PropertyPermissions "*", "read,write"
java.beans.PropertyEditorManager
public static void registerEditor(
Class targetType,
Class editorClass)
public static synchronized void
setEditorSearchPath(String path[])
checkPropertiesAccess
java.util.PropertyPermissions "*", "read,write"
java.io.File
public boolean delete()
public void deleteOnExit()
checkDelete(String)
java.io.FilePermission "{name}", "delete"
~~~~~~~~~
public boolean exists()
public boolean canRead()
public boolean isFile()
public boolean isDirectory()
public boolean isHidden()
public long lastModified()
public long length()
public String[] list()
public String[] list(FilenameFilter filter)
public File[] listFiles()
public File[] listFiles(FilenameFilter filter)
public File[] listFiles(FileFilter filter)
checkRead(String)
java.io.FilePermission "{name}", "read"
~~~~~~~~~
public boolean canWrite()
public boolean createNewFile()
public static File createTempFile(
String prefix, String suffix)
public static File createTempFile(
String prefix, String suffix,
File directory)
public boolean mkdir()
public boolean mkdirs()
public boolean renameTo(File dest)
public boolean setLastModified(long time)
public boolean setReadOnly()
checkWrite(String)
java.io.FilePermission "{name}", "write"
java.io.FileInputStream
FileInputStream(FileDescriptor fdObj)
checkRead(FileDescriptor)
java.lang.RuntimePermission "readFileDescriptor"
~~~~~~~~~
FileInputStream(String name)
FileInputStream(File file)
checkRead(String)
java.io.FilePermission "{name}", "read"
java.io.FileOutputStream
FileOutputStream(FileDescriptor fdObj)
checkWrite(FileDescriptor)
java.lang.RuntimePermission "writeFileDescriptor"
~~~~~~~~~
FileOutputStream(File file)
FileOutputStream(String name)
FileOutputStream(String name, boolean append)
checkWrite(String)
java.io.FilePermission "{name}", "write"
java.io.ObjectInputStream
protected final boolean
enableResolveObject(boolean enable);
checkPermission
java.io.SerializablePermission
"enableSubstitution"
~~~~~~~~~
protected ObjectInputStream()
protected ObjectOutputStream()
checkPermission
java.io.SerializablePermission
"enableSubclassImplementation"
java.io.ObjectOutputStream
protected final boolean
enableReplaceObject(boolean enable)
checkPermission
java.io.SerializablePermission
"enableSubstitution"
java.io.RandomAccessFile
RandomAccessFile(String name, String mode)
RandomAccessFile(File file, String mode)
checkRead(String)
java.io.FilePermission "{name}", "read"
En ambos mtodos el modo es r.
~~~~~~~~~
RandomAccessFile(String name, String mode)
checkRead(String) and checkWrite(String)
java.io.FilePermission "{name}", "read,write"
En este mtodo el modo es rw.
~~~~~~~~~
java.lang.Class
public static Class forName(
String name, boolean initialize,
ClassLoader loader)
checkPermission
java.lang.RuntimePermission("getClassLoader")
El cdigo de verificacin de acceso para este mtodo llama a checkPermission y
lo pasa a java.lang.RuntimePermission("getClassLoader") cuando loader es
null y el cargador de la clase llamante no es null.
~~~~~~~~~
public Class[] getClasses()
checkMemberAccess(this, Member.DECLARED)
java.lang.RuntimePermission
"accessDeclaredMembers"
java.lang.RuntimePermission
"accessClassInPackage.{pkgName}"
El cdigo de verificacin de acceso para esta clase y cada una de sus superclases
llama a checkMemberAccess(this, Member.DECLARED). Si la clase est en un
paquete, checkPackageAccess({pkgName}) tambin se llama. Por defecto,
checkMemberAccess no requiere permiso si el cargador de clase de esta clase es
el mismo que el de la otra. De otra forma requiere
java.lang.RuntimePermission "accessDeclaredMembers". Si la clase est en
un paquete, tambin se requiere java.lang.RuntimePermission
"accessClassInPackage.{pkgName}".
~~~~~~~~~
public ClassLoader getClassLoader()
checkPermission
java.lang.RuntimePermission "getClassLoader"
Si el llamador de la clase llamante es null, o si el si es el mismo que el del
ancestro del cargador de la clase para la clase cuyo cargador de clase est siendo
solicitado, no se necesita permiso. De otra forma, se necesita
java.lang.RuntimePermission "getClassLoader".
~~~~~~~~~
public Class[] getDeclaredClasses()
public Field[] getDeclaredFields()
public Method[] getDeclaredMethods()
public Constructor[]
getDeclaredConstructors()
public Field getDeclaredField(
String name)
public Method getDeclaredMethod(...)
public Constructor
getDeclaredConstructor(...)
checkMemberAccess(this, Member.DECLARED)
checkPackageAccess({pkgName})
java.lang.RuntimePermission
"accessDeclaredMembers
java.lang.RuntimePermission
"accessClassInPackage.{pkgName}
Si la clase est en un paquete, el cdigo de verificacin de acceso debera llamar a
checkPackageAccess({pkgName}) y pasarlo a java.lang.RuntimePermission
"accessClassInPackage.{pkgName}".
Si la clase no est en un paquete, el cdigo de verificacin de acceso para estos
mtodos debera llamar a checkMemberAccess(this, Member.DECLARED) y
pasarlo a java.lang.RuntimePermission
"accessClassInPackage.{pkgName}".
~~~~~~~~~
public Field[] getFields()
public Method[] getMethods()
public Constructor[] getConstructors()
public Field getField(String name)
public Method getMethod(...)
public Constructor getConstructor(...)
checkMemberAccess(this, Member.PUBLIC)
checkPackageAccess({pkgName})
java.lang.RuntimePermission
"accessClassInPackage.{pkgName}"
Si la clase no est en un paquete, el cdigo de verificacin de acceso para estos
mtodos llama a checkMemberAccess(this, Member.PUBLIC), pero no se pasa
ningn permiso.
Si la clase est en un paquete, el cdigo de verificacin de acceso para estos
mtodos debera llamar a checkPackageAccess({pkgName}) y pasarle
checkPackageAccess({pkgName}).
~~~~~~~~~
public ProtectionDomain
getProtectionDomain()
checkPermission
java.lang.RuntimePermission "getProtectionDomain"
java.lang.ClassLoader
ClassLoader()
ClassLoader(ClassLoader parent)
checkCreateClassLoader
java.lang.RuntimePermission "createClassLoader"
~~~~~~~~~
public static ClassLoader
getSystemClassLoader()
public ClassLoader getParent()
checkPermission
java.lang.RuntimePermission "getClassLoader"
Si el cargador de clases del llamante es null o es el mismo que el del ancestro del
cargador de clases para la clase cuyo cargador est siendo solicitado, no se
necesita permiso. De otra forma, se requiere java.lang.RuntimePermission
"getClassLoader" .
java.lang.Runtime
public Process exec(String command)
public Process exec(String command,
String envp[])
public Process exec(String cmdarray[])
public Process exec(String cmdarray[],
String envp[])
checkExec
java.io.FilePermission "{command}", "execute"
~~~~~~~~~
public void exit(int status)
public static void
runFinalizersOnExit(boolean value)
checkExit(status) where status is 0 for
runFinalizersOnExit
java.lang.RuntimePermission "exitVM"
~~~~~~~~~
public void load(String lib)
public void loadLibrary(String lib)
checkLink({libName})
java.lang.RuntimePermission
"loadLibrary.{libName}"
En estos mtodos {libName} es el argumento lib, filename o libname.
java.lang.SecurityManager
<all methods>
checkPermission
See Security Manager Methods.
java.lang.System
public static void exit(int status)
public static void
runFinalizersOnExit(boolean value)
checkExit(status) where status is 0 for
runFinalizersOnExit
java.lang.RuntimePermission "exitVM"
~~~~~~~~~
public static void load(String filename)
public static void loadLibrary(
String libname)
checkLink({libName})
java.lang.RuntimePermission
"loadLibrary.{libName}"
En estos mtodos {libName} es el argumento lib, filename o libname.
~~~~~~~~~
public static Properties getProperties()
public static void setProperties(Properties props)
checkPropertiesAccess
java.util.PropertyPermission "*", "read,write"
~~~~~~~~~
public static String getProperty(String key)
public static String getProperty(String key,
String def)
checkPropertyAccess
java.util.PropertyPermission "{key}", "read"
~~~~~~~~~
public static void setIn(InputStream in)
public static void setOut(PrintStream out)
public static void setErr(PrintStream err)
checkPermission
java.lang.RuntimePermission "setIO"
~~~~~~~~~
public static String setProperty(String key,
String value)
checkPermission
java.util.PropertyPermission "{key}", "write"
~~~~~~~~~
public static synchronized void
setSecurityManager(SecurityManager s)
checkPermission
java.lang.RuntimePermission "setSecurityManager"
java.lang.Thread
public ClassLoader getContextClassLoader()
checkPermission
java.lang.RuntimePermission "getClassLoader"
Si el cargador de clases del llamante es null o es el mismo que el del ancestro del
cargador de clases para la clase cuyo cargador est siendo solicitado, no se
necesita permiso. De otra forma, se requiere java.lang.RuntimePermission
"getClassLoader".
~~~~~~~~~
public void setContextClassLoader
(ClassLoader cl)
checkPermission
java.lang.RuntimePermission
"setContextClassLoader"
~~~~~~~~~
public final void checkAccess()
public void interrupt()
public final void suspend()
public final void resume()
public final void setPriority
(int newPriority)
public final void setName(String name)
public final void setDaemon(boolean on)
checkAccess(this)
java.lang.RuntimePermission "modifyThread"
~~~~~~~~~
public static int
enumerate(Thread tarray[])
checkAccess({threadGroup})
java.lang.RuntimePermission "modifyThreadGroup"
~~~~~~~~~
public final void stop()
checkAccess(this).
checkPermission
java.lang.RuntimePermission "modifyThread"
java.lang.RuntimePermission "stopThread"
El cdigo de verificacin de accesos debera llamar a checkAccess y pasarlo a
java.lang.RuntimePermission "modifyThread", a menos que thread actul
intente parar otro thread distinto a s mismo. En este caso, el cdigo de verificacin
de acceso debera llamat a checkPermission y pasarlo a
java.lang.RuntimePermission "stopThread".
~~~~~~~~~
public final synchronized void
stop(Throwable obj)
checkAccess(this).
checkPermission
java.lang.RuntimePermission "modifyThread"
java.lang.RuntimePermission "stopThread"
El cdigo de verificacin de accesos debera llamar a checkAccess y pasarlo a
java.lang.RuntimePermission "modifyThread", a menos que thread actul
intente parar otro thread distinto a s mismo. En este caso, el cdigo de verificacin
de acceso debera llamat a checkPermission y pasarlo a
java.lang.RuntimePermission "stopThread".
~~~~~~~~~
Thread()
Thread(Runnable target)
Thread(String name)
Thread(Runnable target, String name)
checkAccess({parentThreadGroup})
java.lang.RuntimePermission "modifyThreadGroup"
~~~~~~~~~
Thread(ThreadGroup group, ...)
checkAccess(this) for ThreadGroup methods, or
checkAccess(group) for Thread methods
java.lang.RuntimePermission "modifyThreadGroup"
java.lang.ThreadGroup
public final void checkAccess()
public int enumerate(Thread list[])
public int enumerate(Thread list[],
boolean recurse)
public int enumerate(ThreadGroup list[])
public int enumerate(ThreadGroup list[],
boolean recurse)
public final ThreadGroup getParent()
public final void
setDaemon(boolean daemon)
public final void setMaxPriority(int pri)
public final void suspend()
public final void resume()
public final void destroy()
checkAccess(this) for ThreadGroup methods, or
checkAccess(group) for Thread methods
java.lang.RuntimePermission "modifyThreadGroup"
~~~~~~~~~
ThreadGroup(String name)
ThreadGroup(ThreadGroup parent,
String name)
checkAccess({parentThreadGroup})
java.lang.RuntimePermission "modifyThreadGroup"
~~~~~~~~~
public final void interrupt()
checkAccess(this)
java.lang.RuntimePermission "modifyThreadGroup"
java.lang.RuntimePermission "modifyThread"
El cdigo de verificacin de accesos para este mtodo tambin requiere
java.lang.RuntimePermission "modifyThread" porque el mtodo
java.lang.Thread interrupt() se llama para cada thread en el grupo de threads y
todos sus subgrupos.
~~~~~~~~~
public final void stop()
checkAccess(this)
java.lang.RuntimePermission "modifyThreadGroup"
java.lang.RuntimePermission "modifyThread"
java.lang.RuntimePermission "stopThread"
El cdigo de verificacin de accesos para este mtodo tambin requiere
java.lang.RuntimePermission "modifyThread" porque el mtodo
java.lang.Thread interrupt() se llama para cada thread en el grupo de threads y
todos sus subgrupos.
java.lang.reflect.AccessibleObject
public static void setAccessible(...)
public void setAccessible(...)
checkPermission
java.lang.reflect.ReflectPermission
"suppressAccessChecks"
java.net.Authenticator
public static PasswordAuthentication
requestPasswordAuthentication(InetAddress addr,
int port,
String protocol,
String prompt,
String scheme)
checkPermission
java.net.NetPermission
"requestPasswordAuthentication"
~~~~~~~~~
public static void
setDefault(Authenticator a)
checkPermission
java.net.NetPermission "setDefaultAuthenticator"
java.net.DatagramSocket
public void send(DatagramPacket p)
checkMulticast(p.getAddress())
checkConnect(p.getAddress().getHostAddress(),
p.getPort())
java.net.SocketPermission((
p.getAddress()).getHostAddress(),
"accept,connect")
java.net.SocketPermission "{host}","resolve"
El cdigo de verificacin de acceso para send llama a checkMulticast en los
siguientes casos:
if (p.getAddress().isMulticastAddress()) {
java.net.SocketPermission(
(p.getAddress()).getHostAddress(),
"accept,connect")
}
El cdigo de verificacin de acceso para send llama a checkConnect en los
siguientes casos:
else {
port = p.getPort();
host = p.getAddress().getHostAddress();
if (port == -1) java.net.SocketPermission
"{host}","resolve";
else java.net.SocketPermission
"{host}:{port}","connect"
}
~~~~~~~~~
public InetAddress getLocalAddress()
checkConnect({host}, -1)
java.net.SocketPermission "{host}", "resolve"
~~~~~~~~~
DatagramSocket(...)
checkListen({port})
El cdigo de verificacin de acceso para este mtodo llama a checkListen y le
pasa permisos de sockets de esta forma:
if (port == 0)
java.net.SocketPermission "localhost:1024-",
"listen";
else
java.net.SocketPermission "localhost:{port}",
"listen"
~~~~~~~~~
public synchronized void receive(DatagramPacket p)
checkAccept({host}, {port})
java.net.SocketPermission "{host}:{port}",
"accept"
java.net.HttpURLConnection
public static void setFollowRedirects(boolean set)
checkSetFactory
java.lang.RuntimePermission "setFactory"
java.net.InetAddress
public String getHostName()
public static InetAddress[]
getAllByName(String host)
public static InetAddress getLocalHost()
checkConnect({host}, -1)
java.net.SocketPermission "{host}", "resolve"
java.net.MulticastSocket
public void joinGroup(InetAddress mcastaddr)
public void leaveGroup(InetAddress mcastaddr)
checkMulticast(InetAddress)
java.net.SocketPermission(
mcastaddr.getHostAddress(),
"accept,connect")
~~~~~~~~~
public synchronized void
send(DatagramPacket p, byte ttl)
checkMulticast(p.getAddress(), ttl)
checkConnect(p.getAddress().getHostAddress(),
p.getPort())
java.net.SocketPermission((
p.getAddress()).getHostAddress(),
"accept,connect")
java.net.SocketPermission "{host}","resolve"
El cdigo de verificacin de acceso para send llama a checkMulticast en los
siguientes casos:
if (p.getAddress().isMulticastAddress()) {
java.net.SocketPermission(
(p.getAddress()).getHostAddress(),
"accept,connect")
}
El cdigo de verificacin de acceso para este mtodo llama a checkConnect en los
siguientes casos:
else {
port = p.getPort();
host = p.getAddress().getHostAddress();
if (port == -1) java.net.SocketPermission
"{host}","resolve"
else java.net.SocketPermission
"{host}:{port}","connect"
}
~~~~~~~~~
MulticastSocket(...)
checkListen({port})
El cdigo de verificacin de acceso para este mtodo llama a checkListen en los
siguientes casos:
if (port == 0)
java.net.SocketPermission
"localhost:1024-", "listen";
else
java.net.SocketPermission
"localhost:{port}","listen"
java.net.ServerSocket
ServerSocket(...)
checkListen({port})
El cdigo de verificacin de acceso para este mtodo llama a checkListen en los
siguientes casos:
if (port == 0)
java.net.SocketPermission
"localhost:1024-","listen";
else
java.net.SocketPermission
"localhost:{port}","listen"
~~~~~~~~~
public Socket accept()
protected final void implAccept(Socket s)
checkAccept({host}, {port})
java.net.SocketPermission
"{host}:{port}", "accept"
~~~~~~~~~
public static synchronized void
setSocketFactory(...)
checkSetFactory
java.lang.RuntimePermission "setFactory"
java.net.Socket
public static synchronized void
setSocketImplFactory(...)
checkSetFactory
java.lang.RuntimePermission "setFactory"
~~~~~~~~~
Socket(...)
checkConnect({host}, {port})
java.net.SocketPermission
"{host}:{port}", "connect"
java.net.URL
public static synchronized void
setURLStreamHandlerFactory(...)
checkSetFactory
java.lang.RuntimePermission "setFactory"
~~~~~~~~~
URL(...)
checkPermission
java.net.NetPermission "specifyStreamHandler"
java.net.URLConnection
public static synchronized void
setContentHandlerFactory(...)
public static void setFileNameMap(
FileNameMap map)
checkSetFactory
java.lang.RuntimePermission "setFactory"
java.net.URLClassLoader
URLClassLoader(...)
checkCreateClassLoader
java.lang.RuntimePermission "createClassLoader"
java.rmi.activation.ActivationGroup
public static synchronized ActivationGroup
createGroup(...)
public static synchronized void setSystem(
ActivationSystem system)
checkSetFactory
java.lang.RuntimePermission "setFactory"
java.rmi.server.RMISocketFactory
public synchronized static void setSocketFactory(...)
checkSetFactory
java.lang.RuntimePermission "setFactory"
java.security.Identity
public void addCertificate(...)
checkSecurityAccess("addIdentityCertificate")
java.security.SecurityPermission
"addIdentityCertificate"
~~~~~~~~~
public void removeCertificate(...)
checkSecurityAccess("removeIdentityCertificate")
java.security.SecurityPermission
"removeIdentityCertificate"
~~~~~~~~~
public void setInfo(String info)
checkSecurityAccess("setIdentityInfo")
java.security.SecurityPermission
"setIdentityInfo"
~~~~~~~~~
public void setPublicKey(PublicKey key)
checkSecurityAccess("setIdentityPublicKey")
java.security.SecurityPermission
"setIdentityPublicKey"
~~~~~~~~~
public String toString(...)
checkSecurityAccess("printIdentity")
java.security.SecurityPermission
"printIdentity"
java.security.IdentityScope
protected static void setSystemScope()
checkSecurityAccess("setSystemScope")
java.security.SecurityPermission
"setSystemScope"
java.security.Permission
public void checkGuard(Object object)
checkPermission(this)
Este objeto Permission es el permiso chequeado.
java.security.Policy
public static Policy getPolicy()
checkPermission
java.security.SecurityPermission "getPolicy"
~~~~~~~~~
public static void setPolicy(Policy policy);
checkPermission
java.security.SecurityPermission "setPolicy"
~~~~~~~~~
java.security.Provider
public synchronized void clear()
checkSecurityAccess("clearProviderProperties."
+{name})
java.security.SecurityPermission
"clearProviderProperties.{name}"
En este mtodo name es el nombre del proveedor.
~~~~~~~~~
public synchronized Object put(Object key,
Object value)
checkSecurityAccess("putProviderProperty."
+{name})
java.security.SecurityPermission
"putProviderProperty.{name}"
En este mtodo name es el nombre del proveedor.
~~~~~~~~~
public synchronized Object remove(Object key)
checkSecurityAccess("removeProviderProperty."
+{name})
java.security.SecurityPermission
"removeProviderProperty.{name}"
En este mtodo name es el nombre del proveedor.
java.security.SecureClassLoader
SecureClassLoader(...)
checkCreateClassLoader
java.lang.RuntimePermission "createClassLoader"
java.security.Security
public static void getProperty(String key)
checkPermission
java.security.SecurityPermission "getProperty.{key}"
~~~~~~~~~
public static int addProvider(Provider provider)
public static int insertProviderAt(
Provider provider,
int position);
checkSecurityAccess("insertProvider."
+provider.getName())
java.security.SecurityPermission
"insertProvider.{name}"
~~~~~~~~~
public static void removeProvider(String name)
checkSecurityAccess("removeProvider."+name)
java.security.SecurityPermission "removeProvider.{name}"
~~~~~~~~~
public static void setProperty( String key,
String datum)
checkSecurityAccess("setProperty."+key)
java.security.SecurityPermission
"setProperty.{key}"
java.security.Signer
public PrivateKey getPrivateKey()
checkSecurityAccess("getSignerPrivateKey")
java.security.SecurityPermission
"getSignerPrivateKey"
~~~~~~~~~
public final void setKeyPair(KeyPair pair)
checkSecurityAccess("setSignerKeypair")
java.security.SecurityPermission
"setSignerKeypair"
java.util.Locale
public static synchronized void setDefault(
Locale newLocale)
checkPermission
java.util.PropertyPermission
"user.language","write"
java.util.zip.ZipFile
ZipFile(String name)
checkRead
java.io.FilePermission "{name}","read"
Ozito
Apndice C: Mtodos del Controlador de Seguridad
Esta tabla lista los permisos chequeados mediante las implementaciones de los
mtodos de java.lang.SecurityManager. Cada mtodo de chequeo llama al
mtodo SecurityManager.checkPermission con el permiso indicado, excepto
para los permisos checkConnect y checkRead que toman un argumento de
contexto. Los mtodos checkConnect y checkRead esperan que el contexto sea
un AccessControlContext y llaman al mtodo checkPermission del permiso con
el permiso especificado.
public void checkAccept(String host, int port);
java.net.SocketPermission "{host}:{port}", "accept";
public void checkAccess(Thread g);
java.lang.RuntimePermission "modifyThread");
public void checkAccess(ThreadGroup g);
java.lang.RuntimePermission "modifyThreadGroup");
public void checkAwtEventQueueAccess();
java.awt.AWTPermission "accessEventQueue";
public void checkConnect(String host, int port);
if (port == -1)
java.net.SocketPermission "{host}","resolve";
else
java.net.SocketPermission "{host}:{port}","connect";
public void checkConnect(String host, int port,
Object context);
if (port == -1)
java.net.SocketPermission "{host}","resolve";
else
java.net.SocketPermission "{host}:{port}","connect";
public void checkCreateClassLoader();
java.lang.RuntimePermission "createClassLoader";
public void checkDelete(String file);
java.io.FilePermission "{file}", "delete";
public void checkExec(String cmd);
if (cmd is an absolute path)
java.io.FilePermission "{cmd}", "execute";
else
java.io.FilePermission "-", "execute";
public void checkExit(int status);
java.lang.RuntimePermission "exitVM");
public void checkLink(String lib);
java.lang.RuntimePermission "loadLibrary.{lib}";
public void checkListen(int port);
if (port == 0)
java.net.SocketPermission "localhost:1024-","listen";
else
java.net.SocketPermission "localhost:{port}","listen";
public void checkMemberAccess(Class clazz, int which);
if (which != Member.PUBLIC) {
if (currentClassLoader() != clazz.getClassLoader()) {
checkPermission(
new java.lang.RuntimePermission(
"accessDeclaredMembers"));
}
}
public void checkMulticast(InetAddress maddr);
java.net.SocketPermission(
maddr.getHostAddress(),"accept,connect");
public void checkMulticast(InetAddress maddr, byte ttl);
java.net.SocketPermission(
maddr.getHostAddress(),"accept,connect");
public void checkPackageAccess(String pkg);
java.lang.RuntimePermission
"accessClassInPackage.{pkg}";
public void checkPackageDefinition(String pkg);
java.lang.RuntimePermission
"defineClassInPackage.{pkg}";
public void checkPrintJobAccess();
java.lang.RuntimePermission "queuePrintJob";
public void checkPropertiesAccess();
java.util.PropertyPermission "*", "read,write";
public void checkPropertyAccess(String key);
java.util.PropertyPermission "{key}", "read,write";
public void checkRead(FileDescriptor fd);
java.lang.RuntimePermission "readFileDescriptor";
public void checkRead(String file);
java.io.FilePermission "{file}", "read";
public void checkRead(String file, Object context);
java.io.FilePermission "{file}", "read";
public void checkSecurityAccess(String action);
java.security.SecurityPermission "{action}";
public void checkSetFactory();
java.lang.RuntimePermission "setFactory";
public void checkSystemClipboardAccess();
java.awt.AWTPermission "accessClipboard";
public boolean checkTopLevelWindow(Object window);
java.awt.AWTPermission "showWindowWithoutWarningBanner";
public void checkWrite(FileDescriptor fd);
java.lang.RuntimePermission "writeFileDescriptor";
public void checkWrite(String file);
java.io.FilePermission "{file}", "write";
public SecurityManager();
java.lang.RuntimePermission "createSecurityManager";
Ozito
Eplogo...
Esta seccin no forma parte del tutor original de
Sun.
Podes encontrar la versin original en Ingls de este "Curso sobre
Programacin Avanzada en Java 2" en las pginas de Trainings OnLine de la
propia Sun MicroSystem.
Los nombres de los autores de la versin original son:
Calvin Austin
Monica Pawlan
Tony Squier como autor invitado.
Ozito

También podría gustarte